tobe-tobe vol.3に参加してきた

kwappaさん主催の東京Basic Technology勉強会vol.3で再度スピーカーをしてきました。
今回はめずらしく(!?)ITネタです。

テーマは「Tcl/Tkによるハッシュリストの実装」。
以前に社内勉強会時代に出されていた宿題の発表です。

発表スライド


ハッシュなのに話題のkey-valueストアは一切触れず。だってわからないし(汗
スピーカー側としてはハッシュはどうでもいい!Tclの話がしたい!という状態でした。


実行プログラムはこんな感じ。
一応CRUDGUIでできる。
そしてボタンの配置に一番時間がかかった。


処理時間のグラフ表示も作った。
今回の発表の一番のサプライズのつもり。

ケブンッリジ書いた

一発ネタで書いたTclのケリンッブジ関数も披露してきました。


とりあえずzshで動作確認したワンライナー
とは言え、tclshは必須ですが。
bashだと「echo "aaa" | echo $_」って書き方ができないのよねぇ…

echo "こんにちは みなさん おげんき ですか? わたしは げんき です。 この ぶんしょう は いぎりす の ケンブリッジ だいがく の けんきゅう の けっか にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あっていれば じゅんばん は めちゃくちゃ でも ちゃんと よめる という けんきゅう に もとづいて わざと もじの じゅんばん を いれかえて あります。 どうです? ちゃんと よめちゃう でしょ? ちゃんと よめたら はんのう よろしく" | echo 'proc p {z x} {expr int(rand()*2)};set y {};foreach s [string map {{ } { }} {' $_ '}] {if {[regexp {^(\S)(\S{2,})(\S)$} $s a f c e]} {lappend y $f[join [lsort -command p [split $c {}]] {}]$e} else {lappend y $s}};puts $y;' | tclsh


実行結果

こちんには みさなん おげんき でかす? わたしは げんき です。 この ぶんしょう は いぎりす の ケブリンッジ だがいく の けきんゅう の けっか にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あいてれっば じんばゅん は めちちゃくゃ でも ちゃんと よめる という けんゅきう に もいとづて わざと もじの じばゅんん を いえれかて あすりま。 どですう? ちんゃと よちめゃう でょし? ちんゃと よめたら はんのう よろしく


ちなみにtclshそのままだとこんな感じ。

set data {
こんにちは みなさん おげんき ですか? わたしは げんき です。
この ぶんしょう は いぎりす の ケンブリッジ だいがく の けんきゅう の けっか
にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あっていれば
じゅんばん は めちゃくちゃ でも ちゃんと よめる という けんきゅう に もとづいて
わざと もじの じゅんばん を いれかえて あります。
どうです? ちゃんと よめちゃう でしょ?
ちゃんと よめたら はんのう よろしく
}
proc cmabrigde {str} {
proc p {z x} {expr int(rand()*2)}
set y {}
foreach s [string map {{ } { }} $str] {if {[regexp {^(\S)(\S{2,})(\S)$} $s a f c e]} {lappend y $f[join [lsort -command p [split $c {}]] {}]$e} else {lappend y $s}}
puts $y
}
cmabrigde $data

反省・感想ほか

  • よく考えたらソースの中身の説明が一切なかった!
  • スライドに書くと、スライドを見て説明してしまう!
    • とは言え、書かなかったら説明忘れる!時間の使い方で悩む!
  • Ustream人気なさすぎ!
    • Tclなんてマイナーな言語でごめんなさい。
  • あと、多分だけど"Tclワンライナー"なんてやった人は日本初?(世界なら居そう…)
ということでハッシュ関数説明補足

作りとしては「先頭1文字と中間文字と終端文字を数値化し、足した値をハッシュサイズで割った余りをハッシュ値とする」ということです。
精度はあまり高いものではないけど、まあ簡単なところでこんな感じにしました。

おまけ

よく考えてみたらvol.2のエントリ書いてなかった・・・。