Comments
Description
Transcript
多言語入力プラットフォーム SCIMについて
多言語入力プラットフォーム SCIMについて 2005年9月23日 SEA & FSIJ合同フォーラム 足永拓郎 本日の話題 • • • • • • • • • 自己紹介 背景 SCIM概観 日本語IMEngineの現状 デモ SCIMの構造 IMEngineの作り方 SCIMの今後 まとめ 自己紹介 • 元機械屋 – 自称Bolt & Nut Guy: 切ったり貼ったりは得意 – 小難しい理論は苦手 • 現オープンソースプログラマ • 作っている物 / 関わっている物 – – – – – GImageView: 画像ビューア 風博士: GeckoベースWEBブラウザ sylpheed-gtk2: Gtk+2版Sylpheedの実験的実装 (終了) imime: Windows版Gtk+2用の多言語入力モジュール SCIM用日本語入力モジュール OSS IMフレームワークを取り巻く現状 • 中国内でのIMの乱立 – フレームワーク統一化の必要性 • IMフレームワークの自由競争時代 - 3つの要因 – Gtk+ / Qt の2強時代の到来 – Gtk+2のimmodule機構 • XIM互換性が不要に • 特定の実装に縛られない構造 • Qtへの影響 (おそらくSCIMへも) – IIIMFの立ち遅れ • 実用的OSS IMの不在 • 複数の実装 – IIIMF、SCIM、uim、etc… • 複雑なネスト関係 – scim-uim、uim-scim、uim-iiimf、scim-openvanilla-uim、etc… • 採用実績は2極化 – 商用プロダクトはIIIMFを好む傾向 – OSSプロダクトはSCIMを好む傾向 IMサポートレイヤの分断 • GUIツールキットレベルでのIM抽象化 – IMフレームワークの自由競争が可能となったとい う点においては、利点でもある • IMフレームワークの乱立 • IMフレームワーク間を繋ぐブリッジの存在 – SCIM • ツールキット層を抽象化したマルチプラット フォーム型アプリケーションの存在 – Mozilla – OpenOffice.org OSSのIMサポート概観 主に4つのパスが存在 アプリケーション 例: Emacs GUIツールキット (Gtk+, Qt...) 例: mlterm 例: gtkimuim 例:gtkimprime IMフレームワーク (uim, scim, IIIMF...) 各種インプットメソッド、変換エンジン レイヤ分断:OpenOffice.org 2.0 with scim-uimの場合 VCL (Visual Class Library) SAL (System Abstraction Layer) UNIX Xlib Windows hoge-system VCL plugin Qt/KDE Gtk+/GNOME uim SCIM hoge-im Gtk+ immodule scim-chinese scim-uim scim-hoge SCIM IMEngine uim-anthy uim-prime uim-hoge uim バックエンド SCIMとは • http://www.scim-im.org/ • Smart Common Input Method platform • XIM(X Input Method)を置き換える、新たな 多言語入力フレームワーク • Microsoft WindowsのIMM(Input Method Manager)に相当 • 特定の実装への依存を回避する、徹底したプ ラグイン機構 • プラグイン機構により対応言語を拡充可能 • マルチプラットフォーム化を指向 主な言語モジュール(IMEngine) • 中国語入力モジュール – scim-pinyin、scim-fcitx、scim-ccinput: – scim-chewing: • 日本語入力モジュール – SCIM IMEngineプロジェクトにて開発中 – 詳細は後ほど • ハングル入力モジュール – scim-hangle • その他の言語 – scim-m17n-lib – scim-tables • 他のIMフレームワークへのブリッジ – scim-uim – scim-kmfl – scim-openvanilla 簡体字中国語 繁体字中国語 SKIMとは • SCIMのKDE親和性を向上させるパッケージ • コアはSCIMを利用(SCIMにリンク) • 以下のモジュールのセット – KConfigモジュール – KDEベースのPanelプログラム – KDEベースの設定用GUIプログラム • KDEのセッション管理に組み込まれる – ~/.xsession等で手動起動する必要無し SCIMを標準で採用する ディストリビューション • Fedora Core – Fedora Core5よりCore入り – デフォルトのIMフレームワークになるかどうかは不明 • • • • SUSE Linux Mandriva Linux KNOPPIX日本語版 その他いくつかのローカルディストリビューシ ョン パッケージが存在する ディストリビューション • Debian GNU/Linux • Ubuntu – 標準IMフレームワークとしてプッシュ中 • • • • • Gentoo Linux FreeBSD Vine Linux Momonga Linux etc etc… なぜSCIMが選ばれるのか? • (比較的)実用性が高く、Microsoft Windowsと操作 感が似た日本語・中国語・ハングル用IMEngineが 存在 • m17n-libによる多言語化 • (比較的)見栄えの良いGUI • (比較的)設定が容易 • (比較的)安定性が高い • IMEngnineの開発コストが低い – 反面、FrontEndの開発は真面目にやると大変 • ユーザ・OSSディストリビュータにとって必要な物が ひと揃い揃っている SCIMの欠点 • 他と比較すると、本質的問題の数は少ない • ただし、一つ一つの問題は根が深い • 開発言語としてC++を採用 – ABIが壊れやすい • 最近の不具合報告のほとんどがこの問題 • gccの影響を受けやすい・ユーザーの目につきやすい • 商用IMの互換性維持が困難 – 開発者がやや絞られる • 実質的に開発者が一人 – 良くも悪くも James Su さんが全てを握っている – 現在のところはうまく機能している • 柔軟過ぎる – 構成がやや複雑 • 実装上の細かい不具合 – 時間が解決 SCIM IMEngineプロジェクト • http://scim-imengine.sourceforge.jp/ • 2004年11月に発足 • 日本語専用の IMEngine / Helper を開発するプロ ジェクト • SCIM本家とは関係のない、勝手プロジェクト – – – – 意外と混同されがち Bootstrap時のフットワークの軽さを重視 IMEngineがpluggableである利点 SCIM本体に問題があれば、バグフィックス等も行う • アクティブな開発者は3~4人前後 – 各々が好きなIMを勝手に開発 SCIM IMEngineプロジェクトのプロダクト • • • • • • • • scim-anthy: scim-skk: scim-prime: scim-canna: scim-wnn: ほのかたん: scim-tomoe: scim-sinhala: Anthyを利用した日本語IMEngine SKKライクな日本語IMEngine PRIMEを利用した日本語IMEngine Cannaを利用したIMEngine FreeWnn、Wnn6~Wnn8 罰ゲームですか? (TOT > TAMさん 手書き入力パッドHelper シンハラ語IMEngine scim-anthy • 日本語連文節かな漢字変換エンジンAnthyのSCIM用モジュ ール • 他のOSS IMよりはリッチなGUI – 比較的豊富な設定項目 – 辞書管理はkasumiに依存 • 既存の商用IMに似た挙動 – 各種IM風キーバインド – F6~F10によるカタカナ/ローマ字直接変換 • 大文字・小文字の入れ替え – Shift + Spaceでの別幅空白入力 – テンキー入力時の半角/全角制御 • JISかな配列・NICOLA配列をサポート – 細かな問題あり • ほのかたん由来の逐次変換機能 • 単漢字検索機能が欠如 scim-skk • SKKの基本機能は実装済み • uim-skk、ddskkと比較すると、機能は少ない らしい • SKKユーザーでは無いので詳細不明 • 優先度の高い機能はどれか、教えて下さい • その他アイデア等があれば、教えて下さい scim-prime • 予測入力システムPRIMEのSCIM用モジュー ル • 日本語予測/英語予測 • インライン予測 • 用例の色分け表示 • PRIMEプロセスは1プロセス/1ユーザ – SCIMがper user daemonであるため • 足永のまわりでは1番人気 scim-canna • 現在はCannaの高レベルAPIのみをサポート • 高レベルAPIの制限による、機能制限 – 候補を縦に表示する事ができない (ただし、隠しAPIを利用することにより対応可能) – GUIでのキー設定が困難 • scim-cannaには3つの存在意義 – SCIMのCannaプロトコルサポート – .cannaファイルのリサイクル – 単漢字検索 • Cannaプロトコルの応用例 – えせCannaの利用 – IME Proxyによる、Windows(Cygwin)上でのIMEの利用 scim-wnn & ほのかたん • 元は scim-wnn – 複数変換エンジンへの対応を期に名称変更 • • 現在は実験的IM の色が強い 独自のプラグイン機構による複数変換エンジンへの対応 – Wnn、Anthy、Canna、PRIME、SKKに対応 – 複数変換エンジンの同時使用 – 予測と通常変換で別々のエンジンを使用可能 • 独自のプラグイン機構による様々な入力方式への対応 – 現在はローマ字入力、かな入力、T-Codeのみ • • • • 独自の設定用UI自動生成機構 その他、謎な機能が盛り沢山 名称は変更したが、scim-wnn とほのかたんの共存は今のところ不可 日本人は「ほのかたん」と呼称すべし – Honoka、scim-honoka 等は不可 – 名前の由来は聞いてはいけません scim-tomoe • SCIM用手書き入力パッド • 2005年8月末に最初のリリースをしたばかり – 現在は最低限の機能に留まる – 今のところ日本語専用 • Tomoeライブラリを手書き文字認識エンジンとして 使用 • そこそこの認識精度 • インクリメンタル検索 • 基本的なソフトウェアキーを装備 – Enter、Space、Back Space • 辞書は現在のところ第一水準漢字まで リリースは毎月29日 • 肉の日 • 日本語IMEngineのどれは一つは必ず肉の日 にリリースされる...はず • 14日にリリースされることも – 石の日 – 肉を食べすぎると石ができます – 肉の日から丁度半月 • ネタだがネタだけにあらず – リリースエンジニアリングが楽になる – みんなで肉を食いながら楽しくリリース デモ SCIMの基本構造 • • コアはシンプルなC++クラスライブラリ 徹底したオブジェクト指向/プラグイン構造による柔軟な構成 – – – – – – プラグインの組合せによって柔軟な対応が可能 FrontEndモジュール: 各種GUIツールキットとのキー入力の橋渡し IMEngineモジュール: 言語モジュール Configモジュール: 設定保存機構の抽象化 Helperモジュール: 補助ツール (設定ツール/入力パッド等) IMEngine設定用GUIインターフェースモジュール: • マルチプラットフォーム化のため、IMEngineからは分離 • 個々のIMEngine毎に各種GUIツールキット向けの実装が必要 • 現在はGtk+用 / KDE用の2種 • 2つの粒度 – ローダブルモジュール – プロセス • Per user daemon / Unix Domain Socketによる通信が基本 – ただし接続方法はアプリケーション & デーモンの組み方次第 – 実際は scim-launcher デーモンを核とする SCIMの基本構造: 各プロセスの役割 • scim-launcher – メインとなるデーモン – 名前は同じでも単なるブリッジであることも: XIMブリッジ • scim-panel-gtk、skim – パネル、プリエディットウィンドウ、候補ウィンドウ、システムトレイを 提供するデーモン • scim-helper-manager – Helperを一元管理するデーモン • scim-helper-launcher – Helperモジュールを読み込み、Helperを起動 – 読み込むモジュールによって様々な姿に変化 – 設定ウィンドウ、記号入力パッド、手書き入力パッド、... SCIMの基本構造: 4つのプロトコル • SocketFrontEnd - SocketIMEngine – メインデーモンとアプリケーションとの通信 – 主にキーイベントと結果文字列の送受信 • SocketFrontEnd - SocketConfig – メインデーモンとアプリケーションとの通信 – 設定値の同期 • Panel - FrontEnd – GUIツールバープロセスとメインデーモンとの通信 – パネル側がサーバ • Panel - Helper – GUIツールバーとHelperとの通信 – Helper – FrontEnd及びHelper - IMEngine通信の仲介 SCIMの典型的な構成例 (キーイベントの流れ) ユーザー入力(出発点) Gtk+2アプリ Qtアプリ 仮想 キーイベント Socket IMEngine X Window System アプリ Helper (入力パッド) 仮想キーイベント Anthy IMEngine (終着点) Socket FrontEnd scim-launcher 1 (メインデーモン) Socket IMEngine XIMプロトコル X11 FrontEnd scim-launcher 2 (XIMブリッジ) SCIMの特殊な構成例 (キーイベントの流れ) ユーザー入力 (出発点) Anthy IMEngine (終着点) Gtk+2アプリ • アプリケーション内で直接IMEngineに接続 • 以下のような環境変数をセット – GTK_IM_SCIM_IMENGINE_MODULES=anthy – QT_IM_SCIM_IMENGINE_MODULES=anthy • IMEngineのデバッグに便利 FrontEndモジュール • キー入力元アプリケーションとの通信を抽象化する モジュール • デーモンのメインループをドライブ • 現在は2種存在 – X11フロントエンド (XIMプロトコル) – Socketフロントエンド (独自プロトコル) • 通常は2つのデーモンが立ち上がる – Socket モジュール を FrontEnd とする scim-launcher – X11 モジュールを FrontEnd とする scim-launcher • 他プラットフォームへの移植が比較的容易 – 新たなモジュールを作成すれば良い アプリケーション側の実装 • XIMを介さない通信を行うためには、アプリケーション側の実 装も必要 • 現在は主に2種存在: 現代的なUNIXアプリケーションは網羅 – Gtk+2モジュール – Qt用モジュール – mlterm、uimにも実装あり • 通常は SocketIMEngine で キーイベントを scim-launcher デーモンへフォワード • IMとのプロセス内直接接続も可能 – 環境変数 GTK_IM_SCIM_IMENGINE_MODULES 等 – FrontEndを介さず、直接IMEngineを読み込みキーイベントを送付 • 仮想キーイベントの発行も担当 – ソフトウェアキーボードの実現 – システムネイティブ (X Window System) のイベントではないため、 稀に動作しないキーイベントもある IMEngineモジュール • キー入力を実際に制御するモジュール – キー入力を各国語の文字に変換 – Canna等の変換エンジンとの通信 – GUIツールキット非依存 • 設定用UIは別モジュールとして提供 • 個々のGUIツールキットに対するモジュールが必要 • SocketIMEngine – 特殊なIMEngine: SocketFrontEndへのブリッジ • 4つの出力文字列 – – – – プリエディット文字列 候補文字列群 (LookupTable) AUX文字列: サーバ接続エラー等をユーザーに通知 確定文字列 • フォーカス移動時の処理も担当 • Helperとの高度な連携も可能 SCIMの典型的な構成例 (設定値変更通知の流れ) Gtk2アプリ Qtアプリ scim-helper 1 (設定ツール) scim-helper 2 (入力パッド等) Scoket Config Socket Config Socket Config Socket Config Socket FrontEnd scim-launcher 2 (XIMブリッジ) scim-launcher 1 (メインデーモン) Socket Config scim-panel-gtk Simple Config 設定ファイル SCIMの特殊な構成例 (設定値変更通知の流れ with KConfig) Gtk2アプリ Qtアプリ scim-helper 1 (設定ツール) scim-helper 2 (入力パッド等) Socket Config Scoket Config Socket Config Socket Config Socket FrontEnd Socket Config scim-launcher 2 (XIMブリッジ) scim-launcher 1 (メインデーモン) scim-panel-gtk KConfig Config KDE 設定ファイル KDEアプリ Configモジュール • SCIMの設定保存機構 • ストレージはモジュールにより抽象化 – SimpleConfig (SCIMに同梱) • 独自のファイル形式 (/etc/scim/* 及び ~/.scim/*) – SocketConfig (SCIMに同梱) • ソケット通信による設定値の同期 – GConfConfig • GNOMEの設定機構であるGConfを利用 • 現在は「意味がない」として廃止されている – KConfigConfig (SKIMに同梱) • KDEの設定機構であるKConfigを利用 – モジュールを開発すればWindowsのレジストリ等にも対応可能 • プロセス内への変更通知は独自のシグナル/スロット機構 • コマンドライン用操作ツールが付属 – scim-config-agent – get ・ set ・ del ・ reloadが可能 SCIMの典型的な構成例 (GUI関連イベントの流れ) 仮想キーボード 押下 マウスによる候補選択 ツールバーボタン押下 XIMブリッジ X11 FrontEnd パネル HelperAgent PanelAgent Socket IMEngine scim-helper (入力パッド) PanelClient Gtk+2アプリ Qtアプリ Socket IMEngine Socket FrontEnd Anthy IMEngine メインデーモン Panelプロセス • ツールバー、プリエディットウィンドウ、候補ウィンドウ、システム トレイを提供するデーモン • 現在は scim-panel-gtk と skim の2種 • 依存性分離のため、scim-launcher とは別プロセス • IMEngineやHelperからの制御はProperty経由で • Helper(入力パッド等)と メインデモーンとの通信を仲介 • Helper と IMEngine の通信を仲介 – プロトコルは双方を繋ぐ開発者が定義 • 独自Panelへの差し替えも可能 – PanelAgentクラスを利用 Helperモジュール • 設定用ウィンドウ、手書き入力パッド等の補助ツール を提供するモジュール • Helperプロセスのメインループをドライブ • 実装者の好みのツールキットを利用可能 • 以下の処理が可能 – – – – – 仮想キーイベントの発行 文字列のコミット ツールバーへのボタン追加 設定再読み込み指令の発行 IMEngine との高度な連携 IMEngineの開発 (1) • 前提知識 – – – – C++ オブジェクト指向 Autotools gettext • scim.h を include • モジュールインターフェースを実装 – 初期化と終了、Factoryの生成 • 2つの抽象クラスを実装 – IMEngineFactoryBase – IMEngineInstanceBase • 内部文字コードはUNICODEで正規化 IMEngineの開発 (2) • IMEngineInstance生成までの流れ – Factoryの生成 – FactoryでのIM情報の提供 – FactoryでのIMEngineインスタンス生成 • IMEngineFactoryBaseの以下の関数を実装 – – – – – get_name (): IM名 (Anthy、PRIME等) get_uuid (): uuid は uuidgenコマンドで生成 get_icon_file () get_authors (), get_credit, get_help () create_instance (): IMEngineInstanceを生成 IMEngineの開発 (3) IMEngineInstanceの実装 • 基本はキーイベントハンドル用関数 – process_key_event – キーイベントの詳細は scim_event.h – 以下の関数で出力文字列を制御 • commit_string • update_preedit_string • update_preedit_caret – reset でプリエディット文字列をクリア • フォーカス制御 – focus_in (), focust_out () – 挙動はIMEngineの実装者次第 • 詳細は scim_imengine.h IMEngineの開発 (4) 必要に応じて使用するクラス • scim::Attribute クラス – 文字列の装飾を制御 – プリエディット文字列、AUX文字列、候補文字列に適用可能 • scim::CommonLookupTable クラス – 候補ウィンドウの制御 • scim::Property クラス – 主にパネルの制御 • scim::IConvert クラス – 文字コード変換 – String → WideString: 内部エンコード(UCS-4)への変換 – WideString → String: 指定エンコードへの変換 脱線 - surrounding textの是非 • IMEngineからカーソル周辺文字列を取得するAPI • タイ語等のサポートに必要とされている – タイ語は一文字が子音記号・母音記号・声調記号の3つの記号の組み合わせ によって構成される – 一回のキー入力に対して一個の記号が入力される – キー入力毎に逐次コミットし、後置で文字を置き換える実装 • 実際はプリエディットでも対応可能 – コミット後の修正はユーザーが手動削除 – 日本語の濁点・半濁点も同様の扱い • カーソル周辺文字列の取得は – フロントエンド側にAPIが存在するとは限らない – APIが存在しても、バギーな場合もある • その様な現状で、無理にsurrounding textを使用する必要があるの か?という議論がある • 日本語の再変換に利用可能? – 取得できる情報が足りないため、現在は非実用的 – 選択範囲の情報が、SCIMによる抽象化の結果として欠如している SCIMの今後: Jamesさんの計画 • 大枠の機能はほぼ実装済み • 設定用UI及びHelper用のGUIフレームワーク – 一本のコードで全てのGUIツールキットへ対応 – 柔軟性と開発効率の両立が課題 • モジュールのオンデマンドローディング (起動の高速化) • マルチユーザー • C言語インターフェース (?) – 最新の開発計画では挙げられていない • • • • コンソール用フロントエンド IIIMFとの接続 (scim-iiimf? iiimf-scim?) 仮想キーボード、各種情報表示用Helper 他プラットフォームへの移植 – Windows – Mac OS X SCIMの今後: 足永の妄想 • Emacs用フロントエンド • GNOMEインテグレーションの強化 – GNOMEパネルへの収容(KDEでは実現済み) – 基本GUIパーツのクラスライブラリ化 • GNOME用パネルプログラムとの共用 • 独自パネルプログラム開発の効率化 – GNOMEのセッション管理に収容 • ハードウェアキーコードのハンドリング – 厳密なかな入力の実現に必要 • システム非依存なタイマー – NICOLA配列での厳密な同時押し判定に必要 – AUX文字列(エラー表示等)の表示時間制御 • 選択範囲を取得するAPI – 再変換機能に必要 scim-anthyの今後 • 基本的な機能は実装済み • インライン単語登録 • インライン単漢字検索機能はTomoeライブラ リで実装 • GUIでの単漢字検索はscim-tomoeに集約 • 細かな機能整理・バグフィックス • 2006年4月頃に1.0リリース予定 scim-skkの今後 • 基本的な機能は実装済み • タブキーによる補完 • 辞書管理の拡張 – 複数辞書への対応 – 他の形式の辞書への対応 – 辞書サーバとの通信 • • • • 接頭辞、接尾辞変換 送り仮名の厳密マッチ/優先マッチ 日付出力 AZIK対応 scim-primeの今後 • • • • • • 基本的な機能は実装済み パイプ通信の例外処理強化 パイプ通信の汎化/他のIMへの利用 コード整理 2005年内に1.0をリリース予定 以降はPRIMEの修正と連動した実験的機能 の実装 • 例: scim-tomoeとの連携 scim-cannaの今後 • 基本的な機能は実装済み • 低レベルAPIへの対応 – 現代的GUIの実装 – 設定で互換モード/リッチモードの切り替え – 得るものはそれほど大きくない → 対応しない可能性も • scim-anthyその他とのプリエディット制御の 共通化? scim-wnn & ほのかたんの今後 • 基本的な機能は実装済み • 全ては開発者のTAMさん次第 – 手書き入力との連携? – ひょっとして音声入力との連携? – 何者にも予測不可能 • scim-wnnとほのかたんの共存 scim-tomoeの今後 • 国際化 • Tomoe 及び scim-tomoe を汎用的な単漢字データベース & 検索エンジンとして進化させる • 当面、最も開発リソースが投入されるべきモジュール – 現代的OSS入力メソッドにおいて決定的に欠落している機能 – 現在エンドユーザーから最も要求の多い機能 • 手書きデータの収集が課題 – 第2水準、第3水準、第4水準漢字 – 精度を上げるためには複数のデータが必要 – nnmnd: 手書きデータをインターネットで収集するシステム http://www.sikigami.com/~fuku/nnmnd/ – Ajaxを使った手書き文字認識 http://chasen.org/~taku/software/ajax/hwr/ IMフレームワークに対する私見 • 多様な価値観に対する包容力が決め手 – – – – 各種自然言語・プログラミング言語への対応 オープンソース・クローズドソース双方への配慮 投入可能な開発リソースに見合った開発スタイル GUI環境、非GUI環境双方への十分な配慮 • プリエディット制御は別ライブラリ化 – IM HUBとの分離 • 開発責任の分離/明確化 • API/ABI安定性の問題 – SCIM と uim or m17n-lib の関係が一つの解答 • デスクトップインテグレーションの重要性 – コアは徹底的に依存性を排除した上で、逆に末端機能は徹底 的なデスクトップ環境への依存が必要 – ユーザーインターフェースの統一感 – モジュール間通信の統一感 – プログラミングインターフェースの統一感 SCIMを育てる意義 • 実質的な日中韓の協力体制確立 • 商用IM / OSS IM同居の可能性 – 現状では困難 – しかし、IIIMF、uimでは更に困難 • IMフレームワーク自由競争時代の顕在化 – どのようなフレームワークも、メンテナンスを怠れば置き換 えられる可能性あり – OSS日本語入力メソッド開発の重要性 • 既に普及している – にもかかわらず日本人が開発に参加していない まとめ • 基本機能は実装済み – 成熟期間への移行段階 • SCIMは柔軟であり、またデスクトップとの統一感も 高い • IMEngineの開発コストは低いが、FrontEndの開発 は大変 • 単漢字検索機能の実装が急務 • 開発者は常に募集中 • 日中韓の実務レベルでの協力体制の確立が必要 – SCIMにはこだわらないが、SCIMが最も現実的