続・Cannaをフォークしてみた 
はしもとまさ@東海道らぐ 
In KANSAI OPEN FORUM 2014 
2014/11/8
自己紹介 
● 東海道らぐ元名古屋案内人、ちびぎーこ保護者会所属 
● 某大学日本文学文化学科卒 
– …という理由から、最近日本語入力の研究に目覚めました。
今回のお話。 
● Cannaをフォークしてみました! 
● Cannaとは・・・? 
– 元はNECが作成していた日本語変換システム。 
– その後、Canna Projectが開発を引き継いだ。 
– …が、2004/5/20を最後にリリースされていない。 
– サーバー&クライアント型。MITライセンス。 
● OSC東京で前半をお話ししたので、今日はその続き。
CannaからIzumoへ 
● 日本語変換システム「Izumo」 
– https://github.com/hashimom/Izumo 
– よく聞かれるのが、「なぜいずも?」 
● とりあえず、Cannaを漢字にしてみよう! 
余談)島根県では神無月ではなく神在月と呼ばれるらしい 
● 主な変更点: 現状、特になし!(おいっ) 
– クライアントライブラリ、ツール群をざくっと削除してシンプルに 
– ビルド方法を変更(完了) 
– 辞書ファイルの見直し ←失敗中! 
● uim-canna が利用できることを確認しています
Canna で使っている imake 
● 「xmkmf」ってコマンドを叩くと、 
Imakefileの記述から、Makefileを作成します。 
● X Window SystemのX11R6.9(2005年)までは 
imakeを利用してビルドされていました。 
– なので、imakeのことを調べるとそっち系のものばかり引っかかります。 
● 例) Cannaのビルド方法: 
$ xmkmf 
$ make canna
imakeの欠点 
「解説書: 
非常に広く使用されているツールとしては、 
imakeはいまだに異常なほど文章化されていません。 
 (中略) 
多くのプログラマがimakeのさまざまな部分と 
取り組んできましたが、X Windowシステムの配布のために 
用意している風変わりな機能から汎用的な部分を抜き出して 
ツールとして分割することは誰もできませんでした。」 
オライリー「make 改訂版」(2005年)より 
いろいろダメぽい・・・^^;
Cannaのディレクトリ構造 
※各ディレクトリにImakefileが存在します。 
(ROOT) lib 
server 
cmd 
canna 
include 
dic 
misc 
クライアントやサーバーが使用する 
ライブラリ群 
Cannaサーバー 
Canna停止や辞書作成時に 
使用するコマンド群 
注:コマンド毎にディレクトリは別 
makeすると作成される! 
各ディレクトリ内にある 
ヘッダファイルのシンボリックリンクが 
make実行時に「include」内に貼られる。 
(ROOT) にあるCanna.confの内容と 
Imakefileの記述から 
Cannaconf.hを作成して、 
include内に置かれる 
共通ヘッダファイル置き場 
辞書 
設定ファイル等
Izumo では 
これをまるっと Cmake に置き換えます! 
Cmakeでのビルド方法: 
$ mkdir build && cd build 
$ cmake .. 
$ make 
$ sudo make install
現在のIzumoのディレクトリ構成 
(ROOT) lib 
server 
include 
dic 
(ROOT) 一箇所にのみ 
CMakeLists.txtを配置する。 
クライアントやサーバーが使用する 
ライブラリ群 
Izumoサーバー 
辞書と 
辞書を作成するツール群 
いっそヘッダーファイルは 
全てここに置いてしまってもいい 
シンボリックリンクも不要 
廃止ディレクトリ: 
● cmd: コマンド廃止 & dicへ移動 
● canna: includeへ移動 
めっちゃすっきり! ● misc: server へ(一部)移動
それでは・・・ 
Izumo の CmakeLists.txt の中を 
覗いてみましょう!
Izumo CMakelists.txt のヘッダー部 
# Izumoが使用できる cmake のバージョン 
cmake_minimum_required(VERSION 2.8) 
# Izumoのプロジェクト設定(C言語) 
PROJECT(izumo C) 
# 1. 以下の設定を〜 
SET(IZUMO_ACCESS_FILE "${CMAKE_INSTALL_PREFIX}/share/izumo/hosts.izumo") 
SET(IZUMO_DICHOME "${CMAKE_INSTALL_PREFIX}/share/izumo/dic") 
SET(IZUMO_ERRDIR "/var/log") 
SET(IR_UNIX_DIR "/tmp/.iroha_unix") 
SET(IR_UNIX_SOCKNAME "IROHA") 
# 2. ヘッダーファイル(include/config.h)に書いて出力します 
CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/include/config.h.in 
${PROJECT_SOURCE_DIR}/include/config.h) 
# インクルードファイルのディレクトリ設定 
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include) 
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include/RK)
Izumo のサーバーライブラリ 
● 対象: 
– RK 
– Rkindep 
# RKindep のビルド 
# →静的(=STATIC)ライブラリのビルド(=ADD_LIBRARY)を実行 
ADD_LIBRARY(rkindep STATIC 
lib/RKindep/basename.c 
〜中略〜 
lib/Rkindep/strops.c) 
# RK のビルド 
# →静的(=STATIC)ライブラリのビルド(=ADD_LIBRARY)を実行 
ADD_LIBRARY(rk STATIC 
lib/RK/bits.c 
〜中略〜 
lib/RK/util.c) 
# 実行ファイル(izumooyashiro)とリンク 
# →リンク(=TARGET_LINK_LIBRARIES)を実行 
TARGET_LINK_LIBRARIES(izumooyashiro rkindep) 
TARGET_LINK_LIBRARIES(izumooyashiro rk) 
どちらもインストールしない 
静的ライブラリ
Izumo サーバー本体 
● 対象: 
– izumooyashiro 
# izumooyashiro のビルド 
# →実行ファイルのビルド(=ADD_EXECUTABLE)を実行 
ADD_EXECUTABLE(izumooyashiro 
server/comm.c 
〜中略〜 
server/wconvert.c) 
# インストール先の設定 
# →実行ファイルのインストール先(=bin)へインストール(=INSTALL)を実行 
INSTALL(TARGETS izumooyashiro DESTINATION bin) 
# →設定ファイルのインストール先(=share/izumo)へファイル(=FILES)をインストール 
INSTALL(FILES ${PROJECT_SOURCE_DIR}/server/hosts.izumo 
DESTINATION share/izumo)
Cmake って・・・ 
ほら、簡単でしょ?
だがしかし! 
甘かった!!!
Cannaの辞書ファイルのビルド 
まずは imake版(Imakefile)の場合を 
ご確認ください。 
CANNAROOT = ../../.. 
CANNACMDDIR = $(CANNAROOT)/cmd 
MERGE = $(CANNACMDDIR)/mergewd/mergeword 
IINCLUDES = -I$(CANNAROOT)/include 
TARGETS = iroha.t 
PUBDICS = a.p k.p s.p t.p n.p h.p m.p y.p r.p w.p x.p 
iroha.t: $(PUBDICS) ProgramTargetName(pod) 
cat $(PUBDICS) | ./pod - -p -i -2 > iroha.spl 
$(MERGE) < iroha.spl > iroha.t 
$(RM) iroha.spl もはやコマンドの羅列(>_<) 
これをCmakeで書こうとすると・・・
Izumoの辞書ファイルのビルド 
Izumo の CMakeLists.txt はこうなった・・・orz 
https://github.com/hashimom/Izumo をご覧ください。 
ADD_CUSTOM_TARGET(iroha 
COMMAND cat ${PROJECT_SOURCE_DIR}/dic/ideo/pubdic/pubdic.p |(〜後略) 
COMMAND ${PROJECT_BINARY_DIR}/mergewd <${PROJECT_BINARY_DIR}/ir(〜後略) 
COMMAND rm ${PROJECT_BINARY_DIR}/iroha.spl 
COMMAND ${PROJECT_BINARY_DIR}/crxdic -D (〜後略) 
COMMAND ${PROJECT_BINARY_DIR}/crfreq -div 512 -o iroha.cld iroha.cbd iroha.mwd 
COMMAND cat ${PROJECT_BINARY_DIR}/bushu.cbd >> (〜後略) 
) 
ADD_DEPENDENCIES(izumooyashiro iroha) この中は改行できへん・・・ 
こんなのが2箇所ほどあったりします・・・
恐らく正解は・・・ 
辞書を作成するスクリプトを 
書いた方がよさそうですね(^^;
今後のIzumoの予定 
● 11月: 〜関西オープンフォーラム 
– cmake対応 
– 辞書ファイルの拡張 ←遅れ。 
● 大きめの辞書を作成しようとしたら「too long line」と怒られてます(笑) 
そういやぁ夏も似たような話(=FreeWnn)をしましたよね??? 
● 12月: 〜東海道らぐ名古屋オフ? 
– クライアントライブラリの作成 
– ibus-izumo fcitx-izumo の作成 
● 来年以降: 
– サーバー・クライアント間の通信プロトコル追加(今はまだヒミツ!) 
– 形態素解析部の修正(←これいつたどり着ける???)
ご清聴、ありがとうございました!

続・Cannaをフォークしてみた

  • 1.
  • 2.
    自己紹介 ● 東海道らぐ元名古屋案内人、ちびぎーこ保護者会所属 ● 某大学日本文学文化学科卒 – …という理由から、最近日本語入力の研究に目覚めました。
  • 3.
    今回のお話。 ● Cannaをフォークしてみました! ● Cannaとは・・・? – 元はNECが作成していた日本語変換システム。 – その後、Canna Projectが開発を引き継いだ。 – …が、2004/5/20を最後にリリースされていない。 – サーバー&クライアント型。MITライセンス。 ● OSC東京で前半をお話ししたので、今日はその続き。
  • 4.
    CannaからIzumoへ ● 日本語変換システム「Izumo」 – https://github.com/hashimom/Izumo – よく聞かれるのが、「なぜいずも?」 ● とりあえず、Cannaを漢字にしてみよう! 余談)島根県では神無月ではなく神在月と呼ばれるらしい ● 主な変更点: 現状、特になし!(おいっ) – クライアントライブラリ、ツール群をざくっと削除してシンプルに – ビルド方法を変更(完了) – 辞書ファイルの見直し ←失敗中! ● uim-canna が利用できることを確認しています
  • 5.
    Canna で使っている imake ● 「xmkmf」ってコマンドを叩くと、 Imakefileの記述から、Makefileを作成します。 ● X Window SystemのX11R6.9(2005年)までは imakeを利用してビルドされていました。 – なので、imakeのことを調べるとそっち系のものばかり引っかかります。 ● 例) Cannaのビルド方法: $ xmkmf $ make canna
  • 6.
    imakeの欠点 「解説書: 非常に広く使用されているツールとしては、 imakeはいまだに異常なほど文章化されていません。  (中略) 多くのプログラマがimakeのさまざまな部分と 取り組んできましたが、X Windowシステムの配布のために 用意している風変わりな機能から汎用的な部分を抜き出して ツールとして分割することは誰もできませんでした。」 オライリー「make 改訂版」(2005年)より いろいろダメぽい・・・^^;
  • 7.
    Cannaのディレクトリ構造 ※各ディレクトリにImakefileが存在します。 (ROOT)lib server cmd canna include dic misc クライアントやサーバーが使用する ライブラリ群 Cannaサーバー Canna停止や辞書作成時に 使用するコマンド群 注:コマンド毎にディレクトリは別 makeすると作成される! 各ディレクトリ内にある ヘッダファイルのシンボリックリンクが make実行時に「include」内に貼られる。 (ROOT) にあるCanna.confの内容と Imakefileの記述から Cannaconf.hを作成して、 include内に置かれる 共通ヘッダファイル置き場 辞書 設定ファイル等
  • 8.
    Izumo では これをまるっとCmake に置き換えます! Cmakeでのビルド方法: $ mkdir build && cd build $ cmake .. $ make $ sudo make install
  • 9.
    現在のIzumoのディレクトリ構成 (ROOT) lib server include dic (ROOT) 一箇所にのみ CMakeLists.txtを配置する。 クライアントやサーバーが使用する ライブラリ群 Izumoサーバー 辞書と 辞書を作成するツール群 いっそヘッダーファイルは 全てここに置いてしまってもいい シンボリックリンクも不要 廃止ディレクトリ: ● cmd: コマンド廃止 & dicへ移動 ● canna: includeへ移動 めっちゃすっきり! ● misc: server へ(一部)移動
  • 10.
    それでは・・・ Izumo のCmakeLists.txt の中を 覗いてみましょう!
  • 11.
    Izumo CMakelists.txt のヘッダー部 # Izumoが使用できる cmake のバージョン cmake_minimum_required(VERSION 2.8) # Izumoのプロジェクト設定(C言語) PROJECT(izumo C) # 1. 以下の設定を〜 SET(IZUMO_ACCESS_FILE "${CMAKE_INSTALL_PREFIX}/share/izumo/hosts.izumo") SET(IZUMO_DICHOME "${CMAKE_INSTALL_PREFIX}/share/izumo/dic") SET(IZUMO_ERRDIR "/var/log") SET(IR_UNIX_DIR "/tmp/.iroha_unix") SET(IR_UNIX_SOCKNAME "IROHA") # 2. ヘッダーファイル(include/config.h)に書いて出力します CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/include/config.h.in ${PROJECT_SOURCE_DIR}/include/config.h) # インクルードファイルのディレクトリ設定 INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include) INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include/RK)
  • 12.
    Izumo のサーバーライブラリ ●対象: – RK – Rkindep # RKindep のビルド # →静的(=STATIC)ライブラリのビルド(=ADD_LIBRARY)を実行 ADD_LIBRARY(rkindep STATIC lib/RKindep/basename.c 〜中略〜 lib/Rkindep/strops.c) # RK のビルド # →静的(=STATIC)ライブラリのビルド(=ADD_LIBRARY)を実行 ADD_LIBRARY(rk STATIC lib/RK/bits.c 〜中略〜 lib/RK/util.c) # 実行ファイル(izumooyashiro)とリンク # →リンク(=TARGET_LINK_LIBRARIES)を実行 TARGET_LINK_LIBRARIES(izumooyashiro rkindep) TARGET_LINK_LIBRARIES(izumooyashiro rk) どちらもインストールしない 静的ライブラリ
  • 13.
    Izumo サーバー本体 ●対象: – izumooyashiro # izumooyashiro のビルド # →実行ファイルのビルド(=ADD_EXECUTABLE)を実行 ADD_EXECUTABLE(izumooyashiro server/comm.c 〜中略〜 server/wconvert.c) # インストール先の設定 # →実行ファイルのインストール先(=bin)へインストール(=INSTALL)を実行 INSTALL(TARGETS izumooyashiro DESTINATION bin) # →設定ファイルのインストール先(=share/izumo)へファイル(=FILES)をインストール INSTALL(FILES ${PROJECT_SOURCE_DIR}/server/hosts.izumo DESTINATION share/izumo)
  • 14.
  • 15.
  • 16.
    Cannaの辞書ファイルのビルド まずは imake版(Imakefile)の場合を ご確認ください。 CANNAROOT = ../../.. CANNACMDDIR = $(CANNAROOT)/cmd MERGE = $(CANNACMDDIR)/mergewd/mergeword IINCLUDES = -I$(CANNAROOT)/include TARGETS = iroha.t PUBDICS = a.p k.p s.p t.p n.p h.p m.p y.p r.p w.p x.p iroha.t: $(PUBDICS) ProgramTargetName(pod) cat $(PUBDICS) | ./pod - -p -i -2 > iroha.spl $(MERGE) < iroha.spl > iroha.t $(RM) iroha.spl もはやコマンドの羅列(>_<) これをCmakeで書こうとすると・・・
  • 17.
    Izumoの辞書ファイルのビルド Izumo のCMakeLists.txt はこうなった・・・orz https://github.com/hashimom/Izumo をご覧ください。 ADD_CUSTOM_TARGET(iroha COMMAND cat ${PROJECT_SOURCE_DIR}/dic/ideo/pubdic/pubdic.p |(〜後略) COMMAND ${PROJECT_BINARY_DIR}/mergewd <${PROJECT_BINARY_DIR}/ir(〜後略) COMMAND rm ${PROJECT_BINARY_DIR}/iroha.spl COMMAND ${PROJECT_BINARY_DIR}/crxdic -D (〜後略) COMMAND ${PROJECT_BINARY_DIR}/crfreq -div 512 -o iroha.cld iroha.cbd iroha.mwd COMMAND cat ${PROJECT_BINARY_DIR}/bushu.cbd >> (〜後略) ) ADD_DEPENDENCIES(izumooyashiro iroha) この中は改行できへん・・・ こんなのが2箇所ほどあったりします・・・
  • 18.
  • 19.
    今後のIzumoの予定 ● 11月: 〜関西オープンフォーラム – cmake対応 – 辞書ファイルの拡張 ←遅れ。 ● 大きめの辞書を作成しようとしたら「too long line」と怒られてます(笑) そういやぁ夏も似たような話(=FreeWnn)をしましたよね??? ● 12月: 〜東海道らぐ名古屋オフ? – クライアントライブラリの作成 – ibus-izumo fcitx-izumo の作成 ● 来年以降: – サーバー・クライアント間の通信プロトコル追加(今はまだヒミツ!) – 形態素解析部の修正(←これいつたどり着ける???)
  • 20.