はてな記法のテスト

テス、テス、マイクのテスト中です(違)
hatenahelper-modeを拡張してURLをはてな記法に変換するelispを作ろうとしています。

search記法

><

antenna記法

a:id:rubikitch

diary記法

d:id:rubikitch
d:keyword:rubikitch

fotolife記法

f:id:rubikitch:rubikitch:image
f:id:rubikitch
f:id:rubikitch:favorite

rss記法

r:id:rubikitch

map記法

keyword記法

ruby
keyword:ruby

isbn/asin記法

jan/ean記法

はてな内自動リンクを入力するelisp(スケッチ)

とりあえずはてなダイアリーはてなグループ自動リンク記法には変換してほしいので。
他はやる必要あるのかな。

(require 'cl)
(defun hatena-url-unescape (string)
  (shell-command-to-string
   (format "ruby -rkconv -rcgi -e 'print CGI.unescape(ARGV.first).toeuc' %s"
           (shell-quote-argument string))))

;; (hatena-url-unescape "aa")
;; (hatena-url-unescape "%a4%cf%a4%c6%a4%ca")
(defun hatena-notation (url)
  "Returns URL's hatena notation."
  (block hatena-notation
    (dolist (entry *hatena-notation-table* url)
      (when (string-match (car entry) url)
        (setq url (replace-match (cadr entry) nil nil url))
        (when (memq :unescape entry) (setq url (hatena-url-unescape url)))
        (return-from hatena-notation url)))))

(defvar *hatena-notation-table*)
(defun define-hatena-notations (table)
  (setq *hatena-notation-table*
        (mapcar (lambda (pair)
                  (cons (hatena-url-convert-regexp (car pair)) (cdr pair)))
                table)))
(defun hatena-url-convert-regexp (re)
  (format "^%s/?$" (replace-regexp-in-string "\\." "\\\\." (replace-regexp-in-string "_" "\\\\([^/]+\\\\)" re))))

(define-hatena-notations
  '(("http://d.hatena.ne.jp/keyword/_" "[[\\1]]" :unescape)
    ("http://d.hatena.ne.jp/_/_" "d:id:\\1:\\2")
    ("http://d.hatena.ne.jp/_" "d:id:\\1")
    ("http://_.g.hatena.ne.jp/keyword/_" "g:\\1:keyword:\\2" :unescape)
    ("http://_.g.hatena.ne.jp/_/_" "g:\\1:id:\\2:\\3")
    ("http://_.g.hatena.ne.jp/_" "g:\\1:id:\\2")
    ))

;; (hatena-notation "http://hatena.g.hatena.ne.jp/keyword/%e3%81%af%e3%81%a6%e3%81%aa%e3%83%80%e3%82%a4%e3%82%a2%e3%83%aa%e3%83%bc%e5%88%a9%e7%94%a8%e5%8f%af%e8%83%bd%e3%82%bf%e3%82%b0")
;; (hatena-notation "http://d.hatena.ne.jp/rubikitch/")
;; (hatena-notation "http://d.hatena.ne.jp/rubikitch/archive")
;; (hatena-notation "http://d.hatena.ne.jp/rubikitch/about")
;; (hatena-notation "http://ruby.g.hatena.ne.jp/rubikitch/")
;; (hatena-notation "http://hatena.g.hatena.ne.jp/hatenadiary/20040501")
;; (hatena-notation "http://hatena.g.hatena.ne.jp/hatenadiary/")
;; (hatena-notation "http://d.hatena.ne.jp/keyword/%bc%ab%c6%b0%a5%ea%a5%f3%a5%af")

(defun hatena-notation-insert (url)
  "Insert hatena notation."
  (interactive "sURL: ")
  (insert (hatena-notation url)))

(define-key hatenahelper-mode-map "\C-c\C-u" 'hatena-notation-insert)

追記:hatena-notationじゃなくてhatena-autolinkのほうがいいか。

rcodetools 0.7.0リリース

http://eigenclass.org/hiki.rb?rcodetools

rcodetoolsは俺とmfpで共同開発しているソフトウェアです。

rcodetools 0.7.0をリリースしました。
前バージョンよりもツールが増えて大幅にパワーアップしています。

rcodetools は Ruby のコードを扱うツール群です。
rcodetools には xmpfilter とエディタに依存しない開発支援ツールが含まれています。
Emacs と Vim のインターフェースも用意しています。

* xmpfilter: Test::Unit assert* / RSpec should* 自動生成、コード注釈
* rct-complete: 高精度メソッド名・クラス名・定数名等補完
* rct-doc: ドキュメント参照・コードナビゲーター
* rct-meth-args: 高精度メソッド情報リスト、TAGS ファイル作成
* rct-fork: Rails 等重いライブラリを予めロードし、補完を高速化する(サーバ)
* rct-fork-client: rct-fork サーバが保持する状態から Ruby スクリプトを実行する
* ruby-toggle-file: テストスクリプトと実装スクリプトを切り換える
* rbtest: 小規模スクリプトのための埋め込み Test::Unit

今回の目玉はテスト駆動補完(TDC)です。
rcodetoolsの補完のやり方には大きな問題点がありました。それは、補完する時点まで全てのコードを実行してしまうことです。たとえば、補完する行の直前にファイルを削除するコードが含まれていた場合、補完時にはファイルが削除されてしまいます。Rubyの場合、高精度な補完をしたい場合は実際に実行してみる他はありません。「それが仕様だ!」と言ってしまえばそれまでですが、自分も含め多くのユーザがこの副作用問題に不満を持っています。
もうひとつの問題点は、実行されないメソッド内部での補完ができなかったことです。
そこでユニットテストに注目しました。ユニットテストは繰り返し実行できるよう後片付まできちんとしますね。ではユニットテストからメソッドを実行して補完情報を取れないかと考えました。
この工夫で副作用問題は解決し、メソッド内部での補完も可能になりました。しかも、通常のTDDのサイクルに簡単に組み込めます。そのためこの補完手法をTDCと名付けました。

ではどうやってユニットテストのテストメソッドを選択するかですが、通常TDDをやっているとテストメソッドと実装メソッドを行き来しますね。だから最後にエディタに表示したテストスクリプトの(エディタ上の)カーソル上にあるテストメソッドを自動的に選択します。この行き来をするツールがruby-toggle-fileです。これで以下のサイクルでTDD/TDCができます。

(1) テストスクリプトを閲覧・修正
(2) ruby-toggle-fileで実装スクリプトへバッファを切り換え
(3) 『補完つき』で実装メソッド書ける!
(4) テスト
(5) ruby-toggle-fileでテストスクリプトへバッファを切り換え
(6) 1へ

rbtestは以前ruby-listに投げたスクリプトを焼き直したものです。小規模スクリプトでTDCできるようにするために同梱しました。

rct-fork/rct-fork-clientはrailsなど重いライブラリを予めロードし、補完時間を短縮します。ZenTestに含まれるruby_fork/ruby_fork_clientのrcodetools版です。demo/fork-demo.shを実行すればデモが始まります。

エディタインターフェースではよきにはからってくれます。スクリプト内にrbtest形式を発見すればrbtestを使って補完しますし、rct-forkが起動中であればrct-fork-clientを使います。

それではHappy Hacking!

同じシ社製エレベーターでまた閉じ込め

http://www.nikkansports.com/general/f-gn-tp0-20070622-216572.html

 22日午前8時20分ごろ、新潟市が管理する福祉施設「新潟テルサ」(同市中央区鐘木)
のシンドラーエレベータ社製エレベーターで、施設利用者の男性が約5分間閉じ込められるト
ラブルがあった。5月29日にも同じエレベーターで閉じ込めトラブルがあり同社が修理、6
月5日に運転を再開していた。

怖っ…エレベーター乗りたくないな。なるべく階段にするか。

hatena-modeと「はてダラ」

hatena-modeと「はてダラ」と組み合わせて使えたらいいな。
あと、誰かが言ってたけど、C-c C-pはC-c C-cにすべきでしょw C-c C-cは送信とか完了とかの暗黙の意味合いがあるようで拙作含め多くのelispプログラムがそうしている。Mewだってnavi2chだって。

ん〜菱形継承…

http://d.hatena.ne.jp/ytakenaka/20070620/p1

菱形継承は慣れてないから頭が混乱する。多重継承の使い道っていまだMix-inしか知らない。
どうやって理解すればいいんだろ。

ドラクエ6の職業システムみたいなものかな。
たとえば僧侶と武闘家をマスターしたら上級職のパラディンに転職できる。パラディンは僧侶の呪文と武闘家の特技のどちらも使えパラディンの技も習得していくと。魔法使い+戦士→魔法戦士、戦士+武闘家→バトルマスターとか。

優れたもの…

d:id:ytakenaka:20070405

興味のあるソフトウェアのソースコードなんてのはどうだろう?興味がある分野だと断然読みやすいと思う。
俺の場合はelispが身近だけど、Lispらしく書いているソースが少ない気がする。

修学旅行中の2教師、セクハラで強制送還

http://www.nikkansports.com/general/p-gn-tp0-20070623-216759.html

 宇都宮市の市立中学校の修学旅行中に、男性教諭(32)が女子生徒の人気投票を聞き取り
調査していたとして、生徒からつるし上げられて、宿泊先の京都市から帰されていたことが2
2日、分かった。また、別の男性教諭(32)も過去に「巨乳探し」をしたとして一緒に宇都
宮市へ戻されてしまった。セクハラ発言をした2人の教諭は何度も謝罪したが、女子生徒の怒
りを抑えることはできなかった。

 宇都宮市教育委員会によると、市立中学校の3年生の修学旅行で、訪れた京都市内のホテル
の大広間に女子生徒51人が“招集”された。集めたのは学年主任の教諭。そしてうなだれた
表情の32歳の担任を持つ男性教諭が同席。男性教諭は女子生徒全員に「本当に申し訳ない」
と何度も頭を下げたが「先生とは一緒に旅行を続けられない」と突き放した言葉が浴びせられ
た。

 原因はセクハラ発言だった。3年生4クラスの修学旅行日程は今月17日から2泊3日。“
事件”は18日午後8時半に発生した。教諭は男子生徒(全55人)の宿泊階廊下で、生徒が
騒がないように監視する「巡回指導」の最中だった。1人で退屈だったのか、すれ違う男子生
徒十数人に「女子で誰がいい?」と女子生徒の人気投票を実施して時間をつぶしていた。

 ところが、教諭から聞き取りを受けた男子生徒が、女子生徒に内容を伝えてしまった。怒っ
た女子生徒らが学年主任に怒鳴りこんで大広間での“緊急集会”に発展した。

 さらに、その集会で今年2月に行われたスキー教室で、別の男性教諭が男子生徒に「胸のデ
カい女子は誰だ?」との話をしていたことも発覚。巨乳探しをした教諭も大広間に“追加招集
”され、素直に事実を認めて平謝りしたが、最後まで許してもらえなかった。約1時間、女子
生徒からつるし上げられた2人の教諭は、翌19日始発で宇都宮市に帰った。

理不尽要求をする親がいるかと思えば、腐ってる先生もいる。もうアホかと馬(以下略