Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rustで エンジニアは絶対に使えない「TypoIME」を作ろう

toshi00
March 27, 2022

Rustで エンジニアは絶対に使えない「TypoIME」を作ろう

IME自作のすすめ
Rustで エンジニアは絶対に使えない「TypoIME」を作ろう
#traP_LT 2022

制作物『TypoIME』:https://github.com/toshi-pono/TypoIME

toshi00

March 27, 2022
Tweet

More Decks by toshi00

Other Decks in Programming

Transcript

  1. • @toshi00 / とし • 20B(春から3年)東京⼯業⼤学 情報⼯学系 • traP SysAd班

    など • 好きなもの p 電⼦⼯作 / メタモン / VTuber • 最近やってること p Webフロントエンド / Arduino とか p Rust は今回初めて触った @toshi00 / とし 自己紹介 デジタル創作同好会 traP toshi-pono @toshi00_p
  2. 目次 3 @toshi00_p • エンジニアは使えないIME 『TypoIME』 ってなんだ? • 我々は強くなりすぎてしまった…… •

    Rust で TypoIME を作ろう(for macOS) • Xcode を使うのは⽢え • Rust で InputMethodKit を使おう • 実⾏ファイルを App形式 にしよう • 感想 / まとめ traP LT 2022 #traP_LT
  3. 我々は強くなりすぎてしまった…… 7 @toshi00_p HeIIo. | am toshiOOɽ HeIIo. | am

    toshiOOɽ 游ゴシック Menlo iの⼤⽂字 パイプ⽂字 全⾓スペース 0じゃなくてO 正解はtoshi00 traP LT 2022 #traP_LT
  4. エンジニア以外は使えるIME 9 @toshi00_p traP LT 2022 #traP_LT TypoIME • 英数字⼊⼒を⽀援する

    macOS 向け IME • アルファベットがこっそり変換される → 英数字⼊⼒を楽しむことができます! (実体は,全く使えないお邪魔ソフトウェア) https://github.com/toshi-pono/TypoIME
  5. 今回の方針 • Xcode(IDE)は使わない縛り • Xcode = ⼀般に macOS向けアプリを作るときはこれ(諸説あり) • 縛りの理由:なんかつまらないので

    使ったことないから 13 @toshi00_p • 制作物はかなりシンプル • アルファベットをランダムに出⼒するだけ → 変換候補の探索は不要 • IMEの通信周りの情報が少ない traP LT 2022 #traP_LT
  6. IMEどうやって作る? • Objectice-C …… Mozc(Google⽇本語翻訳のオープンソース版)など • Swift …… macOS のアプリ開発でよく使われてる

    • Ruby …… RubyMotion を使って作られた Gyaim という IME がある • Rust …… IME について情報なし.アプリ開発で Tauri とかはある 14 @toshi00_p traP LT 2022 #traP_LT
  7. IMEどうやって作る? 15 @toshi00_p よくわかんないけど,Rustってすごいんでしょ? Rust 使ってみたいなー toshi00 (Rust 経験ゼロ) Rust

    に決定!!!! ちなみに,今の所あまりおすすめできる選択肢ではないです(後述) traP LT 2022 #traP_LT
  8. InputMethodKitを使おう • InputMethodKit • Cocoaの中にあるフレームワーク • IMEを作る・⽂字⼊⼒でクライアントと通信するために使う • IMEに関する主な内容(Class) •

    IMKServer …… ユーザー操作と⼊⼒操作を仲介 • IMKInputController …… ⼊⼒プログラムの処理本体 • IMKCandidates …… 候補選択のUI周り 18 @toshi00_p traP LT 2022 #traP_LT
  9. RustからCocoaの使い方 • objcクレート https://crates.io/crates/objc • objcクレート+ Rustのlinkアトリビュート 19 @toshi00_p traP

    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]
  10. IMEを実装 • IMKServer の設定と接続 • 変換の実装 • IMKInputController を継承して TypoInputController

    を実装 • IMEの実装⽅法は3種類くらいある • キーバインディング ←今回はこれ • ⼊⼒⽂字 + 修飾キーを解釈 • イベントを利⽤ 20 @toshi00_p traP LT 2022 #traP_LT 具体的な実装は https://github.com/toshi-pono/TypoIME を参照
  11. IMEを実装 • キーバインディング • IMKInputController を継承したクラスを実装→登録 • inputText:client: に⼊⼒⽂字列が⾶んでくる •

    → 受け取って置き換えて client.insetText を呼び出す 21 @toshi00_p traP LT 2022 #traP_LT 具体的な実装は https://github.com/toshi-pono/TypoIME を参照 let _: () = msg_send![sender, insertText: NSString::alloc(nil).init_str(&insert_text)];
  12. 実行ファイルを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
  13. Info.plist • XML形式の設定ファイル 24 @toshi00_p traP LT 2022 #traP_LT •

    CFBundleExecutable …… 実⾏ファイル名 • CFBundleIdentifier …… ⽂字列 .inputmethod. を含んだ id を指定 • LSBackgroundOnly …… 1(=True)と設定.IMEはバックグラウンドのみで実⾏されるため • InputMethodConnectionName …… 他のIMEと競合しないコネクション名を指定 • InputMethodServerControllerClass …… InputControllerを継承して実装したサブクラス名 • tsInputMethodIconFileKey …… キーボード環境設定に表⽰されるアイコン画像 • tsInputMethodCharacterRepertoireKey …… 今回は英数字⽤なので Latn 設定項⽬(抜粋)
  14. Appを配置しよう • /Library/Input Methods に IME を配置する • ログアウト →

    再ログイン(または再起動) 25 @toshi00_p traP LT 2022 #traP_LT • キーボード環境設定 > ⼊⼒⽅式 > 英語 • やったね!
  15. IME開発の渋いところ • Rust使う必要ある? Objective-C とか Swift で良くない? • Rust 上で

    Objective-C を書くみたいなことをする必要がある • あまり Rust の嬉しさが感じられない • ログ出⼒ (CocoaのNSLog) に失敗していてデバッグが厳しい • 動作検証に ログアウト→再ログイン が必要 • 開発⽅法によらず必要 • 開発機の他に動作検証⽤のPCを⽤意すると良さそう 27 @toshi00_p traP LT 2022 #traP_LT
  16. いま試していること • 複数⽂字の変換 • だいたいできた • 変換候補の提⽰ • 未調査.頑張りたい •

    Objective-Cのサンプルコードがあるからこれを調べるのが良さそう • https://github.com/pkamb/NumberInput_IMKit_Sample 28 @toshi00_p traP LT 2022 #traP_LT • Rust なんもわからん……
  17. まとめ・感想 • Rust で InputMethodKit を呼んで シンプルなIMEを作った • アルファベットを変換する『TypoIME』 https://github.com/toshi-pono/TypoIME

    • 実際にIMEが動くと感動する • IME⾃作は事例と情報が少なめ • 特に Rust なんもわからん,でもそれがいい? 29 @toshi00_p あなたも(Rustで)⾃作IMEを始めませんか? traP LT 2022 #traP_LT
  18. 参考 • 制作物:『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 > InputMethodKit https://developer.apple.com/documentation/inputmethodkit?language=objc • objc crate https://crates.io/crates/objc 30 @toshi00_p traP LT 2022 #traP_LT