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

    View Slide

  2. • @toshi00 / とし
    • 20B(春から3年)東京⼯業⼤学 情報⼯学系
    • traP SysAd班 など
    • 好きなもの
    p
    電⼦⼯作 / メタモン / VTuber
    • 最近やってること
    p
    Webフロントエンド / Arduino とか
    p
    Rust は今回初めて触った
    @toshi00 / とし
    自己紹介
    デジタル創作同好会 traP
    toshi-pono
    @toshi00_p

    View Slide

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

    View Slide

  4. 4 @toshi00_p
    エンジニアは使えないIME 『TypoIME』
    ってなんだ?
    traP LT 2022 #traP_LT

    View Slide

  5. IMEって?
    インプット メソッド エディタ(英: input method editor、IME)
    = ⼊⼒⽅法編集プログラム
    ローマ字⼊⼒で漢字とかに変換してくれるやつ
    • Microsoft ⽇本語 IME
    • Google⽇本語⼊⼒
    • ATOK
    などなど……
    5 @toshi00_p
    traP LT 2022 #traP_LT

    View Slide

  6. 我々は強くなりすぎてしまった……
    6 @toshi00_p
    HeIIo. | am toshiOOɽ
    よくある挨拶
    traP LT 2022 #traP_LT

    View Slide

  7. 我々は強くなりすぎてしまった……
    7 @toshi00_p
    HeIIo. | am toshiOOɽ
    HeIIo. | am toshiOOɽ
    游ゴシック
    Menlo
    iの⼤⽂字 パイプ⽂字 全⾓スペース
    0じゃなくてO
    正解はtoshi00
    traP LT 2022 #traP_LT

    View Slide

  8. 我々は強くなりすぎてしまった……
    8 @toshi00_p
    プログラミングの過程で
    数々のコンパイルエラーを乗り越え
    ⽂字を⾒分ける能⼒を⼿に⼊れてしまった……
    traP LT 2022 #traP_LT

    View Slide

  9. エンジニア以外は使えるIME
    9 @toshi00_p
    traP LT 2022 #traP_LT
    TypoIME
    • 英数字⼊⼒を⽀援する macOS 向け IME
    • アルファベットがこっそり変換される
    → 英数字⼊⼒を楽しむことができます!
    (実体は,全く使えないお邪魔ソフトウェア)
    https://github.com/toshi-pono/TypoIME

    View Slide

  10. デモ
    10 @toshi00_p
    • インストールして動かしてみよう
    • キーボード環境設定から追加できる
    • VSCodeのスクリーンキャストでデモします
    (次ページ)
    traP LT 2022 #traP_LT

    View Slide

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

    View Slide

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

    View Slide

  13. 今回の方針
    • Xcode(IDE)は使わない縛り
    • Xcode = ⼀般に macOS向けアプリを作るときはこれ(諸説あり)
    • 縛りの理由:なんかつまらないので 使ったことないから
    13 @toshi00_p
    • 制作物はかなりシンプル
    • アルファベットをランダムに出⼒するだけ
    → 変換候補の探索は不要
    • IMEの通信周りの情報が少ない
    traP LT 2022 #traP_LT

    View Slide

  14. IMEどうやって作る?
    • Objectice-C
    …… Mozc(Google⽇本語翻訳のオープンソース版)など
    • Swift
    …… macOS のアプリ開発でよく使われてる
    • Ruby
    …… RubyMotion を使って作られた Gyaim という IME がある
    • Rust
    …… IME について情報なし.アプリ開発で Tauri とかはある
    14 @toshi00_p
    traP LT 2022 #traP_LT

    View Slide

  15. IMEどうやって作る?
    15 @toshi00_p
    よくわかんないけど,Rustってすごいんでしょ?
    Rust 使ってみたいなー
    toshi00
    (Rust 経験ゼロ)
    Rust に決定!!!!
    ちなみに,今の所あまりおすすめできる選択肢ではないです(後述)
    traP LT 2022 #traP_LT

    View Slide

  16. 16 @toshi00_p
    Rustで TypoIME を作ろう(for macOS)
    〜 InputMethodKitって? 〜
    traP LT 2022 #traP_LT

    View Slide

  17. Cocoaを使おう
    • Cocoa
    • macOS⽤のアプリケーションを構築するため
    のフレームワーク
    • コア⾔語はObjective-C
    • 新型コロナウイルス接触確認アプリ
    17 @toshi00_p
    traP LT 2022 #traP_LT
    macOSのアーキテクチャ
    https://en.wikipedia.org/wiki/Architecture_of_macOS

    View Slide

  18. InputMethodKitを使おう
    • InputMethodKit
    • Cocoaの中にあるフレームワーク
    • IMEを作る・⽂字⼊⼒でクライアントと通信するために使う
    • IMEに関する主な内容(Class)
    • IMKServer …… ユーザー操作と⼊⼒操作を仲介
    • IMKInputController …… ⼊⼒プログラムの処理本体
    • IMKCandidates …… 候補選択のUI周り
    18 @toshi00_p
    traP LT 2022 #traP_LT

    View Slide

  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]

    View Slide

  20. IMEを実装
    • IMKServer の設定と接続
    • 変換の実装
    • IMKInputController を継承して TypoInputController を実装
    • IMEの実装⽅法は3種類くらいある
    • キーバインディング ←今回はこれ
    • ⼊⼒⽂字 + 修飾キーを解釈
    • イベントを利⽤
    20 @toshi00_p
    traP LT 2022 #traP_LT
    具体的な実装は https://github.com/toshi-pono/TypoIME を参照

    View Slide

  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)];

    View Slide

  22. 22 @toshi00_p
    Rustで TypoIME を作ろう(for macOS)
    〜App形式への変換とインストール 〜
    traP LT 2022 #traP_LT

    View Slide

  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

    View Slide

  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
    設定項⽬(抜粋)

    View Slide

  25. Appを配置しよう
    • /Library/Input Methods に IME を配置する
    • ログアウト → 再ログイン(または再起動)
    25 @toshi00_p
    traP LT 2022 #traP_LT
    • キーボード環境設定 > ⼊⼒⽅式 > 英語
    • やったね!

    View Slide

  26. 26 @toshi00_p
    感想 / まとめ
    Rust で IME 作るのは渋い……?
    traP LT 2022 #traP_LT

    View Slide

  27. IME開発の渋いところ
    • Rust使う必要ある? Objective-C とか Swift で良くない?
    • Rust 上で Objective-C を書くみたいなことをする必要がある
    • あまり Rust の嬉しさが感じられない
    • ログ出⼒ (CocoaのNSLog) に失敗していてデバッグが厳しい
    • 動作検証に ログアウト→再ログイン が必要
    • 開発⽅法によらず必要
    • 開発機の他に動作検証⽤のPCを⽤意すると良さそう
    27 @toshi00_p
    traP LT 2022 #traP_LT

    View Slide

  28. いま試していること
    • 複数⽂字の変換
    • だいたいできた
    • 変換候補の提⽰
    • 未調査.頑張りたい
    • Objective-Cのサンプルコードがあるからこれを調べるのが良さそう
    • https://github.com/pkamb/NumberInput_IMKit_Sample
    28 @toshi00_p
    traP LT 2022 #traP_LT
    • Rust なんもわからん……

    View Slide

  29. まとめ・感想
    • Rust で InputMethodKit を呼んで シンプルなIMEを作った
    • アルファベットを変換する『TypoIME』
    https://github.com/toshi-pono/TypoIME
    • 実際にIMEが動くと感動する
    • IME⾃作は事例と情報が少なめ
    • 特に Rust なんもわからん,でもそれがいい?
    29 @toshi00_p
    あなたも(Rustで)⾃作IMEを始めませんか?
    traP LT 2022 #traP_LT

    View Slide

  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

    View Slide