2月2009

Social IM 1.01 バグ修正

さっそく致命的なバグを見つけてしまったので、修正しました。致命的ですが、ケアレスミスだったので良かったです。ローマ字からかなへ変換するテーブルに「ぴゃ」〜「ぴょ」が含まれていなかったために、それらの変換が行えませんでした。この修正のついでに、変換テーブルを.plistから読み出す使用に変更しました。今までは、コードに直接書いて300行近く…

あとは、サーバーへ接続できなかったときの対処を何もしていなかったので、エラー表示を出すようにしました。対処してなかったのは、対処しなくても問題がなかったからです。

エラー
とりあえず、上に小さなパネルを出して表示することにしました。

ダウンロードはこちらから

Social IM(仮) ver 1.00 公開

Mac OS X 用 Social IME のクライアントソフトウェアを公開します。

Social IM – Mac OS X 用 Social IME クライアント

ローマ字入力でSocialIMEを使ったかな漢字変換ができます。かな入力と予測変換はまだ搭載していません。

アプリケーション名が思いつかなかったので、暫定的に Social IM という名前にしています。

Social IM 1.00

クライアントソフトウェアの開発に夢中で、Social IME について何も触れていなかったので、ここで簡単に。

言葉というのは流動性のあるものなので、このような集合知を利用して変換を行うというのは、至極もっともな感じがします。内蔵辞書で変換する方式では、新しい言葉を共有する事ができません。もともと言葉というものは、共有してこそ意味のあるものであるので、Social IME によって入力メソッドも一歩人間近づいたんじゃないかと思っています。

ところで、変換の精度ですが、十分に実用に耐えます。変換する度にサーバーのレスポンスを待つわけですが、今のところほとんど気にならない速さです。

ひとつ残念なところがあるとすれば、変換候補の順番です。たまに変な物がトップに来ていたり、自分で頻繁に選ぶ候補は、やはりトップに来ていてほしいものです。このあたりは、ユーザー名のメタデータに期待でしょうかね。まあ、クライアントでどうにかすることもできなくはないですが。。。

というわけで、おもしろいシステムを見せてくださった Social IME の開発者であるnokunoさんに感謝致します。

普通に使えるようになりました

一週間くらいで作れれば、作ってしまおうと思っていた Mac OS X 用の Social IME クライアント。幸い今週は、かなりの時間をプログラミングに回せたこともあって、Social IME を使った変換プログラムがほぼ完成しました。あとは、これに直接入力方式とかな入力、簡単な設定パネルで設定を行えるようにすれば、公開できそうな感じです。

変換

それで、前回問題だった IMKCandidates は、自作のウインドウにしました。といっても、NSPanel に NSTableView を乗っけて、データをバインディングした簡易的なものです。

また、分節ごとのアンダーラインについてですが、NSMutableAttributedString を使用すれば、普通にできました。setMarkedString には、NSMutableAttributedString を渡したほうが良さそうです。ちょっと工夫が必要な点としては、アンダーラインの太さが同じだと、別々にマークしてもアンダーラインが繋がってしまうので、分節ごとにアンダーラインを引きたい場合は、隣の分節と違う太さのアンダーラインを引きます。0.1ポイントの差でもいいので、微妙に太さを変えて、アンダーラインに区切りをいれます。

さて、こうして今実際に使ってこの文章を打っているわけですが、候補の順番が若干気になるくらいで、そこそこに使えています。特に、変な挙動も見受けられないので、あとはしばらく使って、メモリリークがないか気にするだけです。

IMKCandidates では物足りない

Social IME が話題になってから、Input Method Kit を実際に使いながらいろいろと試したところ、二つの問題が出てきました。

  1. IMKCandidates では、スペースキーで次の候補に選択されない
  2. setMarkedText:selectionRange:replacementRange で、selectionRange に設定した範囲が、見た目に変化ない

まず1点目は、変換候補のポップアップウインドウを出してくれるIMKCandidates に不足を感じしました。見た目的には問題ないのですが、残念なことに、候補の選択が矢印キーでしか行えません。スペースキーで次の候補へ移動しないと、話にならないと思うので、IMKCandidates の使用は諦めることにしました。

IMKCandidates を使用しないということは、変換候補のポップアップウインドウを自作するということですが、入力している文字の位置を firstRectForCharacterRange: で取得できるので、なんとか適切な場所にウインドウを表示することができそうです。ただ、このメソッドがIMKTextInput プロトコルに含まれていないのが気になります。

2点目は、選択した範囲の見た目が変化しないことです。また、setMarkedText: に渡す値はNSString か NSAttributedString となっていますが、NSString を渡すと、なぜかカーソルが表示されなかったり、NSAttributedString でテキストを修飾しようとしても、それが反映されないなど、よくわからない現象が多発しています。実用上それほど問題になるところではないかもしれませんが、文節ごとにアンダーラインが見えないと、多少見づらいことでしょう。

こんなところではありますが、予測変換くらいは簡単だったので試作しました。

予測変換

上の画像に出てるのが、使えないと噂した IMKCandidates です。

最後に、いろいろ調べて出てきたページのリンクを貼っておきます。

Social IME が気になって

Social IME と呼ばれる、かな漢字変換が昨日話題になっていましたが、やはりクライアントはWindows版しか用意されておらず。しかし、真っ先に思い浮かぶのは、Mac OS X Leopard の新機能についてのドキュメントを読んでいた時に目に入った、Input Method Kit

簡単に Input Method を作成できると、どこかで噂を聞いた気がしたので、とりあえずサンプルコードの把握に取りかかること数時間。幸い、Cocoa Break!さんのところに翻訳記事があったので、Input Method Kit の仕組みをすぐに把握することができました。

細かいところはまだ不明な点が多々あるものの、これは普通のCocoaプログラマでも十分Socail IMEのクライアントを作れるだろうと思いました。

と思ったのもつかの間、info.plistで嵌ります。CFBundleIdentifier のところは、com.yourcompany.inputmethod.im と言った感じに、inputmethod ってのが入っていないと、Input Method としてOSが認識してくれないようです。

また、デバッグするたびに、/Library/Input Methods/ にインストールしたアプリケーションを上書きするわけですが、一度 Input Method を使用すると、アプリケーションが立ち上がったままなので、上書きすることができません。したがって、一度ログアウトする必要があります。つまり、デバッグするごとにログアウトしなければならないという、特殊な事情がつきまといます。

というわけで、あるプロジェクトの息抜きにクライアントを作ろうとしましたが、全然息抜きになりませんね。余裕かつ気が向いたら、また手を着けてみることにします。

最近、Windows 離れがかなり深刻です。

FireflyでiTunesサーバー

iTunesには、ライブラリ共有の機能があり、同一ネットワーク内のコンピュータ間で、互いのライブラリの曲をブラウズしたり、再生したりすることができます。

この共有機能のプロトコルを解析して作られた、Firefly と呼ばれるソフトウェアがあります。もともとはdaapdと呼ばれたソフトウェアで、最近名前がFireflyになりました。

Fireflyは、iTunesなしで共有機能を提供するソフトウェアであり、このソフトウェアをインストールすることで、他のコンピュータにライブラリを公開することができます。

私の場合、メインのiBookのHDDが40GBしかないので、iTunesにほとんど曲をためておくことができません。そういうわけで、最近立てた自宅サーバーにFireflyをインストールして、そちらに曲をためようと思い、FreeBSDにFireflyをインストールしました。

Fireflyは、Portsなどのパッケージにあるので、簡単にインストールすることができます。日本語の曲名が含まれた曲でも、特に問題なく文字化けせずに表示することができましたが、MacのiTunesでしか見てないので、Windowsではどうなるかわかりません。

今のところの問題としては、なぜかrc.confの自動起動では、正しく動作しないことです。ストリーミングが始まってくれないのです。一度手動でrestartをかければ大丈夫なのですが、よくわからない現象です。

http://www.fireflymediaserver.org/

Visual C++ 2008 で作成したプログラムの配布

てっきり、Visual Studio C++ 2008 で作成したプログラムは、Windowsなら動いてくれるものかと思っていましたが、Visual Studio C++ 2008 がインストールされていないコンピュータで動かすためには、いくつかのdllが必要なこともあるようです。

それらをまとめたパッケージがMicrosoftのダウンロードページから手に入ります。
Microsoft Visual C++ 2008 再頒布可能パッケージ (x86)

自分で試す環境に、常にVisual Studioが入っていたので、まったく気づきませんでした。

FreeBSDインストールまとめメモ

結局自宅サーバー用PCには、FreeBSDをインストールしました。そのメモとかまとめとかを書いておきます。主にハマった部分を中心に。FreeBSDのバージョンは、7.1 Releaseを使いました。

主にFreeBSD Memoというサイトを参考に環境を構築しました。

1. インストール

FreeBSDのインストール
これに従ってやれば、特に問題はありません。

2. SSHの設定

http://serverfan.dip.jp/freebsd/ssh.html
だいたいの設定はこれで大丈夫です。

http://nekhet.ddo.jp/item/771
パスワード認証を禁止して、公開鍵方式の認証のみにするときの設定は、PasswordAuthenticationをnoだけでは全然足りません。ChallengeResponseAuthenticationもnoにします。上のリンク先に詳しい設定のしかたが載っています。

3. Portsのアップグレード

Portsを最新にする

4. Portupgrade

http://iris.homeunix.net/yayoi/freebsd/inst/portupgrade.asp
Perlが入っていないと、データベースを更新する時にエラーが出るので、先にPerlをインストールしましょう。

5. OSのアップデート。kernelのカスタマイズ

http://www.satoshiabe.jp/freebsd-upgrading_freebsd.html
http://iris.homeunix.net/yayoi/freebsd/inst/cvsuprelease.asp

6. DDNS

http://iris.homeunix.net/yayoi/freebsd/setting/ddclient.asp
最後のddclient.sh.sampleは既にddclientとしてインストールされているので、何もする必要はありません。OS起動時に立ち上げるには、/etc/rc.confでenableする必要があります。

7. WEBサーバー, Apahce

http://www.crimson-snow.net/hmsvr/bsd/httpd/apache.html
/etc/rc.confではapache22_enable=”YES”に加え、apache22_http_accept_enable=”YES”をした方がいいです。

うまく起動しない場合は、apacheがホスト名を解決できていない場合があるので、/etc/hostsに自分のホスト名を加える。
http://www.manami.st/clog/2006-11-17-2.html

8. データベース, MySQL

http://www.peach.ne.jp/freebsd/mysql.html

9. Subversion, Trac

http://blog.perl.tv/2007/01/freebsd_60subversion_trac.html
svnserveで動かす場合、svnserveに設定されている、subversionのルートディレクトリを見て、svnから始まるURLの判断しましょう。

Tracの日本語版もPortsに入ってるので、それにインストールを任せましょう。

10. Samba

http://www.crimson-snow.net/hmsvr/bsd/file_srv/samba.html
Samba用のユーザーを追加しなければ接続できないことに注意。Mac OS Xからファイルの無い共有フォルダにファイルをコピーしようとすると、なぜかうまくいかない、不具合なのか、よくわからない現象が起こる。

おまけ

UTF-8環境

http://www.crimson-snow.net/hmsvr/bsd/memo/utf-8.html

時刻合わせ

http://x68000.q-e-d.net/~68user/unix/pickup?ntpdate

Portsでパッケージ検索

/usr/ports/でmake search key=”キーワード” | grep Port:

ビルドオプションを変更

Portsで一度インストールすると、再インストールのときにも、前のオプションが適用される。前のオプションを消すには、make rmconfig。ちなみに、オプションを見る時は、make showconfig。

OSのインストールとアップデート以外の工程は、すべてSSHから可能です。接続切れたとき、どうすればいいかわかりませんが。

自宅サーバー用PC

ついに自宅サーバー用PCが家に来ました。自作PCなのですが、結局自作PCに詳しい友人に丸投げして作っていただきました。詳細なスペック表を貰い忘れたのですが、マザーボードがD945GCLF2というだけで十分かと。CPU:Aton330, HDD:320, メモリ:1G, 手頃な光学ドライブがなかったので、ケースが小さいのでスリムドライブ。こんなものです。

ちなみに、今日こんな記事を発見。私のメインのiBook。Atomといい勝負です。

http://japanese.engadget.com/2009/02/03/os-x-ibook-g4/

2月4日に書いた記事です。投稿し忘れてました。

Lua:テーブルから文字列に変換

間違ってデータを消去する前に、WEBに載せておきます。

Luaでテーブルから文字列へ変換する関数です。テーブルの値は、文字列、数値、論理、テーブルを扱うことができます。それ以外の値がテーブルに入っていた場合、エラーを発生させるようにしました。

function tableToString( t )
	if t[1] then
		return arryaToString( t )
	else
		return dictionaryToString( t )
	end
end

function arryaToString( t )
	local s = { "{" }
	local i = 2
	for j = 1, #t do
		s[i] = valueToString( t[j] )
		s[i+1] = ","
		i = i + 2
	end
	s[i-1] = "}"
	return table.concat( s )
end

function dictionaryToString( t )
	local s = { "{" }
	local i = 2
	for key, val in pairs( t ) do
		s[i] = key
		s[i+1] = "="
		s[i+2] = valueToString( val )
		s[i+3] = ","
		i = i + 4
	end
	s[i-1] = "}"
	return table.concat( s )
end

function valueToString( val )
	if type( val ) == "string" then
		return [["]] .. val .. [["]]
	elseif type( val ) == "table" then
		return tableToString( val )
	elseif type( val ) == "number" or type(val) == "boolean" then
		return tostring( val )
	else
		error( "the table contains thread, function or userdata value." )
	end
end

文字列を結合する時に、..演算子ではなくわざわざtable.concatを使っているのは、こっちのが早いという噂を耳にしたからです。確認はしていませんが。

あと、関数名のセンスがまだLua的じゃなさそうなので、そのへんをどうにかしたいですね。

既知のバグとして、1つのテーブルを配列と連想配列両方にして使ってしまっていると、配列の方しか文字列になりません。普通はそんな使い方しないと思うので、手抜きしてます。