$30 off During Our Annual Pro Sale. View Details »

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. Rustで エンジニアは絶対に使えない「TypoIME」を作ろう @toshi00 / とし デジタル創作同好会traP 2022.03.27 IME⾃作のすすめ traP LT

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

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

    Rust で TypoIME を作ろう(for macOS) • Xcode を使うのは⽢え • Rust で InputMethodKit を使おう • 実⾏ファイルを App形式 にしよう • 感想 / まとめ traP LT 2022 #traP_LT
  4. 4 @toshi00_p エンジニアは使えないIME 『TypoIME』 ってなんだ? traP LT 2022 #traP_LT

  5. IMEって? インプット メソッド エディタ(英: input method editor、IME) = ⼊⼒⽅法編集プログラム ローマ字⼊⼒で漢字とかに変換してくれるやつ

    • Microsoft ⽇本語 IME • Google⽇本語⼊⼒ • ATOK などなど…… 5 @toshi00_p traP LT 2022 #traP_LT
  6. 我々は強くなりすぎてしまった…… 6 @toshi00_p HeIIo. | am toshiOOɽ よくある挨拶 traP LT

    2022 #traP_LT
  7. 我々は強くなりすぎてしまった…… 7 @toshi00_p HeIIo. | am toshiOOɽ HeIIo. | am

    toshiOOɽ 游ゴシック Menlo iの⼤⽂字 パイプ⽂字 全⾓スペース 0じゃなくてO 正解はtoshi00 traP LT 2022 #traP_LT
  8. 我々は強くなりすぎてしまった…… 8 @toshi00_p プログラミングの過程で 数々のコンパイルエラーを乗り越え ⽂字を⾒分ける能⼒を⼿に⼊れてしまった…… traP LT 2022 #traP_LT

  9. エンジニア以外は使えるIME 9 @toshi00_p traP LT 2022 #traP_LT TypoIME • 英数字⼊⼒を⽀援する

    macOS 向け IME • アルファベットがこっそり変換される → 英数字⼊⼒を楽しむことができます! (実体は,全く使えないお邪魔ソフトウェア) https://github.com/toshi-pono/TypoIME
  10. デモ 10 @toshi00_p • インストールして動かしてみよう • キーボード環境設定から追加できる • VSCodeのスクリーンキャストでデモします (次ページ)

    traP LT 2022 #traP_LT
  11. デモ 11 @toshi00_p traP LT 2022 #traP_LT

  12. 12 @toshi00_p Rustで TypoIME を作ろう(for macOS) 〜Xcode使うのは⽢え〜 traP LT 2022

    #traP_LT
  13. 今回の方針 • Xcode(IDE)は使わない縛り • Xcode = ⼀般に macOS向けアプリを作るときはこれ(諸説あり) • 縛りの理由:なんかつまらないので

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

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

    に決定!!!! ちなみに,今の所あまりおすすめできる選択肢ではないです(後述) traP LT 2022 #traP_LT
  16. 16 @toshi00_p Rustで TypoIME を作ろう(for macOS) 〜 InputMethodKitって? 〜 traP

    LT 2022 #traP_LT
  17. Cocoaを使おう • Cocoa • macOS⽤のアプリケーションを構築するため のフレームワーク • コア⾔語はObjective-C • 新型コロナウイルス接触確認アプリ

    17 @toshi00_p traP LT 2022 #traP_LT macOSのアーキテクチャ https://en.wikipedia.org/wiki/Architecture_of_macOS
  18. InputMethodKitを使おう • InputMethodKit • Cocoaの中にあるフレームワーク • IMEを作る・⽂字⼊⼒でクライアントと通信するために使う • IMEに関する主な内容(Class) •

    IMKServer …… ユーザー操作と⼊⼒操作を仲介 • IMKInputController …… ⼊⼒プログラムの処理本体 • IMKCandidates …… 候補選択のUI周り 18 @toshi00_p traP LT 2022 #traP_LT
  19. 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]
  20. IMEを実装 • IMKServer の設定と接続 • 変換の実装 • IMKInputController を継承して TypoInputController

    を実装 • IMEの実装⽅法は3種類くらいある • キーバインディング ←今回はこれ • ⼊⼒⽂字 + 修飾キーを解釈 • イベントを利⽤ 20 @toshi00_p traP LT 2022 #traP_LT 具体的な実装は https://github.com/toshi-pono/TypoIME を参照
  21. 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)];
  22. 22 @toshi00_p Rustで TypoIME を作ろう(for macOS) 〜App形式への変換とインストール 〜 traP LT

    2022 #traP_LT
  23. 実行ファイルを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
  24. 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 設定項⽬(抜粋)
  25. Appを配置しよう • /Library/Input Methods に IME を配置する • ログアウト →

    再ログイン(または再起動) 25 @toshi00_p traP LT 2022 #traP_LT • キーボード環境設定 > ⼊⼒⽅式 > 英語 • やったね!
  26. 26 @toshi00_p 感想 / まとめ Rust で IME 作るのは渋い……? traP

    LT 2022 #traP_LT
  27. IME開発の渋いところ • Rust使う必要ある? Objective-C とか Swift で良くない? • Rust 上で

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

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

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