フリーの日本語用ocrソフトNHocrを使ってみる

まずおんなじ作者さんのO2-tools-2.00の準備から。

http://www.imglab.org/p/O2/index.html
からtarをダウンロードしてきてどっかに適当に開ける。
configure.inを開いて上の方の

test "x$CFLAGS" = "x" && CFLAGS="-O3 --unroll-loops"
test "x$CXXFLAGS" = "x" && CXXFLAGS="-O3 --unroll-loops"

の--unroll-loopsを削除(OSXなのでこのオプション使えないんで。多分最適化の奴だからなくて平気)
automakeして./configure --prefix=(どっか適当な所)してmake && make install。
このどっか適当な所は後に使うので要記憶。

つぎに
https://code.google.com/p/nhocr/
からNHocrのソースをダウンロード。
さっきと同様にconfigure.in開いて、同じく--unroll-loops消して、今度は更にその消したところに

-I/usr/local/Cellar/freetype/2.5.2/include/freetype2

を追加。
これはhomebrewでfreetypeが入ってる場合なので、他の入れ方だと違う場所かもしれないし、そもそも要らないかもしれない。
したらまたautomakeして./configure --with-O2tools=(さっきのどっかの適当な所)してmake。

NHOCR_DICDIR=dic nhocr/nhocr -block -o /dev/stdout test/fs.pgm

てやってみてファイルシステム、って出るようなら多分成功。

対応してる画像はPBM/PGM/PPMっていうよく知らない形式なので、ImageMagickのconvertが便利。
Tesseract OCRっていう別のOCR実装もあるんだけど日本語に関してはNHocrのがよさげ。

Ankiの解答を表示ボタンをでっかくする

AnkiのUIのテキストの設定は各国ごとの

/Applications/Anki.app/Contents/Resources/locale/ja/LC_MESSAGES/anki.mo

って言うファイルで定義される。

このアンキモはGNU message catalogっていう形式で、これを扱うmsgfmt、msgunfmtってツールgettextに同梱されてる。ただhomebrewでgettextをインストールした場合、これらにパスは通ってないので直で使う。アンキモはバイナリなのでまずこれをデコンパイルするmsgunfmtにかける。

/usr/local/Cellar/gettext/0.18.3.2/bin/msgunfmt > anki.po

アンキポはふつーにテキストファイルなのでエディターで開いて、"解答を表示"の左右にスペースをつめてあげる。"    解答を表示    "みたいに。んで再度コンパイル

/usr/local/Cellar/gettext/0.18.3.2/bin/msgfmt anki.po -o anki.mo

新しいアンキモを最初に書いた場所の古いアンキモと取り替えておしまい。

tmux上でlaunchctl、pbpaste、pbcopyが動くようにする

OS Xでtmuxを使ってるとlaunchctl、pbpaste、pbcopyなどがうまく動かない。またパッチしてないscreenなんかもダメらしい。英語では解決策が見つかったんだけど、日本語では見つからなかったので書いておく。

tmux上でlaunchctlを使おうとすると、

launch_msg(): Socket is not connected

なんてエラーが出る。またpbcopyなんかは何も言わずコピーも起こらない。これを解決するツールがあるのでそれを入れる。

brew install reattach-to-user-namespace

次に.tmux.confに以下を追加。

set-option -g default-command "reattach-to-user-namespace -l zsh"

最後zshの部分はそれぞれのshellに合わせる感じで。
これでtmuxを再起動すれば、launchctl等が動くようになるはず。

今回入れたツールのサイトには、この問題についての丁寧な説明があるのでそちらも参照されたし。

ChrisJohnsen/tmux-MacOSX-pasteboard · GitHub

JavaScriptのfor文のスコープ

JavaScriptのfor文の変数宣言部分の変数は、そのfor文と同レベル、for文の外と同じスコープに所属する。そしてJavaScriptはブロック文で新しくスコープを作らない。以上!

と分かってればそれで終わる話なんだけど、普段あんまりJavaScript書かないもので、思い出したように引っかかるのでもう少し書いておく。

var a = [];
for (var i = 0; i < 3; i++){
    a.push(function(){console.log(i);});
}

for (var j = 0; j < 3; j++){
    a[j]();
}

ってコードを書いて、表示としては0,1,2ってなるのを期待するんだけど、実際は3,3,3ってなる。
なぜなら冒頭書いたように、2行目のvar i = 0;はfor文の外で宣言したと同じで、その上のaと同じスコープに所属する。そしてその下のfunctionがバインドするスコープも同じく、そのa,iのあるスコープ。なのでここで作ったfunctionは結局おんなじiを見ていることになる。
1個目のfor文抜けたところでiは3になってるので、結果、作ったfunctionを呼んでもどれも同じく3を表示する。

うーんわかりやすく書こうと思ったけどあんまりだったわ。

ローカルストレージを読み書く

SafariChromeだとローカルストレージの実体はSQLiteのDBファイル。WebKit由来なのか今のところ、両ブラウザでこのファイルは互換してる。Macだとそれぞれ

~/Library/Safari/LocalStorage
~/Library/Application Chrome/Default/Local Storage

にファイルがある。これを読み書きするRubyスクリプトが以下。


ローカルストレージのDBの構造はいたってシンプルで、ItemTableっていうテーブルにkeyカラム, valueカラムがあるだけ。これがLocalStorage.setItem(key, value)に対応する。ただ一点、注意点があって(SafariChromeの)consoleでLocalStorage.setItem("あ", "い")ってやると、keyはUTF-8、valueはUTF-16LEになる。keyはUTF-8と言うか入れたデータそのままなのかなーと思うけど、valueはUTF-16LEになる。なので読み書きするときはそこを意識する必要がある。

以上!

ふっかつのじゅもんがちがいます

なんか不意に、ふっかつのじゅもんってどういう仕組みなのだろう、と思って調べてました。そうしたら流石はインターネット、調べたらちゃんとあって、じゅもんを読み書きするコードまで公開されていました。ありがとうございます。
Diary of DQ1-PASSWORD.

CとPerlで書かれたコードがあって、Perlはすげー苦手なのでCのコードを読んでると、これは今どきあんまり見ないビットフィールドの出番では、と思ったので書き換えてみました。

ふっかつのじゅもんの仕組みは、分かってしまえばやっていることは簡単です。まず経験値だとかお金だとかアイテムだとかイベントのフラグだとかの、みんなの血と汗のつまったデータ、今で言う冒険の書があるわけです。これが驚くべきことにドラクエ1においては、わずか14バイトしかないのですが。この14バイトに対してチェックサムCRCっぽいもの?を算出します。そして14バイトとCRC?の1バイトをくっつけましょう。できた15バイトを、ふっかつのじゅもんで使える64種類の文字、すなわち6bit単位にデータを分割。最後に簡単な暗号化をすれば皆様おなじみの20文字からなるふっかつのじゅもん形式になるわけです。

仕組みはまあ簡単なのですが、それよりもドラクエ1の冒険情報は14バイトであるということに感動しますね。仕様を見ると本当に1ビットを惜しむ作りになっていることがわかります。そしてそんなデータ構造を記しやすいビットフィールド(とユニオン)があるC言語。そんなあたりになんとも不思議な感慨があるなあと思ったのでした。