IME自作のすすめ Rustで エンジニアは絶対に使えない「TypoIME」を作ろう #traP_LT 2022
制作物『TypoIME』:https://github.com/toshi-pono/TypoIME
Rustで エンジニアは絶対に使えない「TypoIME」を作ろう@toshi00 / としデジタル創作同好会traP2022.03.27IME⾃作のすすめtraP LT 2022 #traP_LT
View Slide
• @toshi00 / とし• 20B(春から3年)東京⼯業⼤学 情報⼯学系• traP SysAd班 など• 好きなものp電⼦⼯作 / メタモン / VTuber• 最近やってることpWebフロントエンド / Arduino とかpRust は今回初めて触った@toshi00 / とし自己紹介デジタル創作同好会 traPtoshi-pono@toshi00_p
目次3 @toshi00_p• エンジニアは使えないIME 『TypoIME』 ってなんだ?• 我々は強くなりすぎてしまった……• Rust で TypoIME を作ろう(for macOS)• Xcode を使うのは⽢え• Rust で InputMethodKit を使おう• 実⾏ファイルを App形式 にしよう• 感想 / まとめtraP LT 2022 #traP_LT
4 @toshi00_pエンジニアは使えないIME 『TypoIME』ってなんだ?traP LT 2022 #traP_LT
IMEって?インプット メソッド エディタ(英: input method editor、IME)= ⼊⼒⽅法編集プログラムローマ字⼊⼒で漢字とかに変換してくれるやつ• Microsoft ⽇本語 IME• Google⽇本語⼊⼒• ATOKなどなど……5 @toshi00_ptraP LT 2022 #traP_LT
我々は強くなりすぎてしまった……6 @toshi00_pHeIIo. | am toshiOOɽよくある挨拶traP LT 2022 #traP_LT
我々は強くなりすぎてしまった……7 @toshi00_pHeIIo. | am toshiOOɽHeIIo. | am toshiOOɽ游ゴシックMenloiの⼤⽂字 パイプ⽂字 全⾓スペース0じゃなくてO正解はtoshi00traP LT 2022 #traP_LT
我々は強くなりすぎてしまった……8 @toshi00_pプログラミングの過程で数々のコンパイルエラーを乗り越え⽂字を⾒分ける能⼒を⼿に⼊れてしまった……traP LT 2022 #traP_LT
エンジニア以外は使えるIME9 @toshi00_ptraP LT 2022 #traP_LTTypoIME• 英数字⼊⼒を⽀援する macOS 向け IME• アルファベットがこっそり変換される→ 英数字⼊⼒を楽しむことができます!(実体は,全く使えないお邪魔ソフトウェア)https://github.com/toshi-pono/TypoIME
デモ10 @toshi00_p• インストールして動かしてみよう• キーボード環境設定から追加できる• VSCodeのスクリーンキャストでデモします(次ページ)traP LT 2022 #traP_LT
デモ11 @toshi00_ptraP LT 2022 #traP_LT
12 @toshi00_pRustで TypoIME を作ろう(for macOS)〜Xcode使うのは⽢え〜traP LT 2022 #traP_LT
今回の方針• Xcode(IDE)は使わない縛り• Xcode = ⼀般に macOS向けアプリを作るときはこれ(諸説あり)• 縛りの理由:なんかつまらないので 使ったことないから13 @toshi00_p• 制作物はかなりシンプル• アルファベットをランダムに出⼒するだけ→ 変換候補の探索は不要• IMEの通信周りの情報が少ないtraP LT 2022 #traP_LT
IMEどうやって作る?• Objectice-C…… Mozc(Google⽇本語翻訳のオープンソース版)など• Swift…… macOS のアプリ開発でよく使われてる• Ruby…… RubyMotion を使って作られた Gyaim という IME がある• Rust…… IME について情報なし.アプリ開発で Tauri とかはある14 @toshi00_ptraP LT 2022 #traP_LT
IMEどうやって作る?15 @toshi00_pよくわかんないけど,Rustってすごいんでしょ?Rust 使ってみたいなーtoshi00(Rust 経験ゼロ)Rust に決定!!!!ちなみに,今の所あまりおすすめできる選択肢ではないです(後述)traP LT 2022 #traP_LT
16 @toshi00_pRustで TypoIME を作ろう(for macOS)〜 InputMethodKitって? 〜traP LT 2022 #traP_LT
Cocoaを使おう• Cocoa• macOS⽤のアプリケーションを構築するためのフレームワーク• コア⾔語はObjective-C• 新型コロナウイルス接触確認アプリ17 @toshi00_ptraP LT 2022 #traP_LTmacOSのアーキテクチャhttps://en.wikipedia.org/wiki/Architecture_of_macOS
InputMethodKitを使おう• InputMethodKit• Cocoaの中にあるフレームワーク• IMEを作る・⽂字⼊⼒でクライアントと通信するために使う• IMEに関する主な内容(Class)• IMKServer …… ユーザー操作と⼊⼒操作を仲介• IMKInputController …… ⼊⼒プログラムの処理本体• IMKCandidates …… 候補選択のUI周り18 @toshi00_ptraP LT 2022 #traP_LT
RustからCocoaの使い方• objcクレートhttps://crates.io/crates/objc• objcクレート+ Rustのlinkアトリビュート19 @toshi00_ptraP LT 2022 #traP_LT具体的な実装は https://github.com/toshi-pono/TypoIME を参照#[link(name = "InputMethodKit", kind = "framework")]extern "C" {}• 頑張って objc のコードを Rust に置き換えるlet server_alloc: id = msg_send![class!(IMKServer), alloc];// [IMKServer alloc]
IMEを実装• IMKServer の設定と接続• 変換の実装• IMKInputController を継承して TypoInputController を実装• IMEの実装⽅法は3種類くらいある• キーバインディング ←今回はこれ• ⼊⼒⽂字 + 修飾キーを解釈• イベントを利⽤20 @toshi00_ptraP LT 2022 #traP_LT具体的な実装は https://github.com/toshi-pono/TypoIME を参照
IMEを実装• キーバインディング• IMKInputController を継承したクラスを実装→登録• inputText:client: に⼊⼒⽂字列が⾶んでくる• → 受け取って置き換えて client.insetText を呼び出す21 @toshi00_ptraP LT 2022 #traP_LT具体的な実装は https://github.com/toshi-pono/TypoIME を参照let _: () = msg_send![sender, insertText: NSString::alloc(nil).init_str(&insert_text)];
22 @toshi00_pRustで TypoIME を作ろう(for macOS)〜App形式への変換とインストール 〜traP LT 2022 #traP_LT
実行ファイルをApp形式に• Xcodeは使わない縛り→ ⼿作業でApp形式を作る23 @toshi00_p• macOSのApp形式= 実⾏ファイル + アイコン + 設定 などをパッケージにしたもの• 実体は.appの拡張⼦とディレクトリ構造typoIME.app└── Contents├── Info.plist├── MacOS│ └── typo_ime└── Resources実⾏ファイルXML形式の設定ファイルiconはここに配置するtraP LT 2022 #traP_LT
Info.plist• XML形式の設定ファイル24 @toshi00_ptraP LT 2022 #traP_LT• CFBundleExecutable …… 実⾏ファイル名• CFBundleIdentifier …… ⽂字列 .inputmethod. を含んだ id を指定• LSBackgroundOnly …… 1(=True)と設定.IMEはバックグラウンドのみで実⾏されるため• InputMethodConnectionName …… 他のIMEと競合しないコネクション名を指定• InputMethodServerControllerClass …… InputControllerを継承して実装したサブクラス名• tsInputMethodIconFileKey …… キーボード環境設定に表⽰されるアイコン画像• tsInputMethodCharacterRepertoireKey …… 今回は英数字⽤なので Latn設定項⽬(抜粋)
Appを配置しよう• /Library/Input Methods に IME を配置する• ログアウト → 再ログイン(または再起動)25 @toshi00_ptraP LT 2022 #traP_LT• キーボード環境設定 > ⼊⼒⽅式 > 英語• やったね!
26 @toshi00_p感想 / まとめRust で IME 作るのは渋い……?traP LT 2022 #traP_LT
IME開発の渋いところ• Rust使う必要ある? Objective-C とか Swift で良くない?• Rust 上で Objective-C を書くみたいなことをする必要がある• あまり Rust の嬉しさが感じられない• ログ出⼒ (CocoaのNSLog) に失敗していてデバッグが厳しい• 動作検証に ログアウト→再ログイン が必要• 開発⽅法によらず必要• 開発機の他に動作検証⽤のPCを⽤意すると良さそう27 @toshi00_ptraP LT 2022 #traP_LT
いま試していること• 複数⽂字の変換• だいたいできた• 変換候補の提⽰• 未調査.頑張りたい• Objective-Cのサンプルコードがあるからこれを調べるのが良さそう• https://github.com/pkamb/NumberInput_IMKit_Sample28 @toshi00_ptraP LT 2022 #traP_LT• Rust なんもわからん……
まとめ・感想• Rust で InputMethodKit を呼んで シンプルなIMEを作った• アルファベットを変換する『TypoIME』https://github.com/toshi-pono/TypoIME• 実際にIMEが動くと感動する• IME⾃作は事例と情報が少なめ• 特に Rust なんもわからん,でもそれがいい?29 @toshi00_pあなたも(Rustで)⾃作IMEを始めませんか?traP LT 2022 #traP_LT
参考• 制作物:『TypoIME』 https://github.com/toshi-pono/TypoIME• Objective-CのIMEサンプルコード https://github.com/pkamb/NumberInput_IMKit_Sample• InputMethodKit超⼊⾨https://www.slideshare.net/kimuraw/inputmethodkit-3193813• Google/mozc https://github.com/google/mozc• Apple Document > InputMethodKithttps://developer.apple.com/documentation/inputmethodkit?language=objc• objc crate https://crates.io/crates/objc30 @toshi00_ptraP LT 2022 #traP_LT