🐟日本語入力の落とし穴 #burikaigi
BuriKaigi2018で発表した。 入力メソッドについてのテキストを書いてる途中なので、それを流用する目論見だったが、まったく別のものになった。
🎤原稿
あいさつ
このセッションはJava+αだと聞いてるので、+α部分の寛容さに賭けて日本語入力の話をする。
日本語を受け取るアプリケーションがおちいりがちな落とし穴についての話をするので、テキスト入力を受けつけるアプリケーションを作るときとかに役に立つと嬉しく思う。
会社の紹介
ボクはMisocaという請求書を管理するWebサービスを作っている会社に勤めている。
日本語入力の重要性
Misocaの開発には、様々なサービス・ソフトウェアを使っている。Ruby、RailsやSlack、Githubなどは使っている会社も多いと思う。
この図には記載されていないが日本語入力の使用頻度も極めて高い。
アンケート
さて、ここでちょっとアンケートを取りたいと思う。使っている日本語入力を教えてほしい。
(補足)1〜3は同数くらい、その他は2人くらいSKKユーザーが居た。
SKK
ボクは「その他」に属するSKKという日本語入力を使っている。
ニコニコ大百科の記事が詳しいので引用します。「この慣れると他のが使えなくなる」「様々なプラットフォームに移植されている」が特徴的である。
移植作業はボクも行なっており、Mac版のAquaSKKは180+スター、iOS版のFlickSKKは3000個くらいインストールされてるので、需要はそれなりにある。
日本語入力の特殊性
作っていてつくづく感じるが日本語入力は特殊なソフトウェアである。
- すべてのキー入力を受け取る。 パスワード入力欄を含めてすべてのキー入力を取得できる。
- メインウインドウのような固有のウインドウは持たないがアプリケーションと強調して画面表示を行なう。デーモンに近いソフトウェアである。
- 日本では圧倒的なシェアを誇る。
日本語以外の入力方法
では日本語以外の入力方法を紹介する。 このために、5ヶ国語くらいで「こんにちは」と書けるようになった。
キーボードによる入力
英語は専用のキーボードがあるので、入力メソッドが必要ない。 その他にも( ゚д゚)の口でおなじみのキリル文字が入力できるキーボードもある。
韓国語入力メソッド
韓国語やヒンディー語でも入力メソッドが用いられるが、これも日本語入力とはちょっと違う。
例えば、韓国語の表記に使われるハングルは、複数の字母の組み合わせで文字を構成する。例えば아というハングルは、ㅇとㅏという2つの記号の組み合わせで構成する。
それぞれが字母がキーと対応している。ㅇはDキーとㅏはKキーに対応しているので、DKと打つことで아が入力できる。
注目すべきは日本語入力における「変換候補の表示」に相当する動作がない点である。文字の数が漢字に比べて圧倒的に少ないのが原因だと推察している。
中国語入力メソッド
中国語入力は日本語入力と類似点が多い。
中国語の入力にもいくつかの種類があるが、ピンイン入力を取り上げる。この入力方式では、ni-haoといれたのち、スペースをおして漢字を選択することで入力する。
顔文字がでてくるのがかわいい。
発音記号の入力、候補の選択という流れは日本語入力と類似している。
漢字入力の特殊性
なので
- 発音記号を入力する
- 候補を表示して、そこから入力する文字も選択する
という二段階の変換は漢字を持つ日本語・中国語のための仕組みであると言える。歴史的には韓国語・ベトナム語も漢字を持つが、現代では日常的には使われていないため入力メソッドではサポートされていない。
(補足)懇親会でトンパ文字の話はしたが、こちらは入力メソッドをもたないため今回の対象外である。
つらい話
このように日本語入力は特殊な存在であるため、日本語入力と相性がよくないアプリケーションが存在する。 そのようなアプリケーションを作ってしまわないために、つらかった話を紹介する。
日本語入力の仕組み
最初に日本語入力の基本的な仕組みについて説明する。これはmacOSの例だが、おそらく他のプラットフォームでもそれほど大きな違いはないはずである。
日本語入力は、キーボード入力とアプリケーションの間に入りテキストを変換する。
そして日本語入力は「漢字変換エンジン」と「入力メソッド用API」の2つで構成されている。 「漢字変換エンジン」は入力されたひながななどを漢字に変換するエンジンである。これは、「日本語入力を支える技術」で詳しく解説さている。
「入力メソッド用API」は漢字変換エンジンとアプリケーションをつなぐためのAPIである。 これを使うことで、アプリケーションに渡されたキー入力をうけとり、なんらかの形で漢字に変換した上で、アプリケーションに返すことができる。
平和な世界の崩壊
この仕組みにより、キーを押すとその文字が入力される素朴で穏かな世界が失なわれる。
具体的には
- 「確定する前の文字列」という概念が導入される。
- 「入力メソッド用のキー」という概念が導入される。
といった変化がある
未確定文字列の導入による問題
入力メソッドにより「確定する前の文字列」という概念が導入される。 これは、下線つきで表示されることが多い。 入力されてるとも入力されてないとも言えない微妙な存在である。
Ulysses IIIの実例
Ulysses IIIで起きた問題について説明する。
Ulysses IIIにはMarkdownの文法をハイライトする機能がある。 例えば **
で囲まれてる部分がボールドになる。
しかし、この機能は未確定文字列に対しても有効なので、未確定文字に *
が含まれていると、それ以降の文字がボールドに変換される。 さらにその副作用で、未確定文字が確定されてしまう。
余談ですが、これはバグレポメールを送ったら「…よくわかんないんだが、押したキーに対応した文字が入力されないんだったら、君たちはどうやってアルファベットを入力するんだ?」という返事が返ってきて大変だった。
VisualStudioCodeの実例
次はVisualStudioCodeの実例を紹介する。 すでに修正ずみだが、初期のバージョンは未確定文字列のハンドリングがうまくいっておらず、未確定文字列が消失していた。つまり事実上、日本語の入力ができなかった。
バグレポートを送るために、メニューから "report issue" を選択したら、メーラーが起動してびっくりした。 さらに、メールを送ったら、エラーメールが返ってきてさらにびっくりした。 「How to fix」のとこに受信するグループの管理者にインスタンメッセンジャーか電話をして許可を貰えとか書いてあって無茶すぎると思った。
宛先がmonacotoolsになってて、「なぜモナコ????」と不思議だったが、これはVisualStudioCodeのエンジンの開発コードらしい。
ちなみに2~3週間後に「バグレポありがとう。韓国語の入力メソッドでも同様の問題がレポートされてたので、修正したよ」って返ってきた。よかった。
PowerPointの実例
続いてパワーポイントの実例について紹介する。
日本語は未確定文字列を経由して入力されることが多い。
しかし、入力メソッドの仕様上、この流れは必須ではなく、直接確定文字列を挿入しても問題ない。例えばaを押すと確定文字としての「あ」が挿入される入力メソッドは仕様に対して妥当である。 事実、SKKはそれを行なっている。
しかしパワーポイントは未確定文字列を経由せずにテキストを挿入すると取りこぼしが発生する。 たぶん、未確定文字列をいれたあと確定するという流れを仮定した処理が入っているのだと思う。
パワーポイントでは必ず未確定文字列をいれたのちに確定文字列をいれることで回避している。
「入力メソッド用キー」による問題
「A」キーが打たれたら「あ」になる、「半角・全角」キーが押されたらIMEの状態がかわる、「Ctrl-S」はIMEが処理しないので自前で処理する、といったように入力メソッドと協調してキー入力の扱いを決める必要がある。
iTerm2の実例
iTerm2という端末エミュレータにおける例を紹介する。
これのキー入力時の処理は以下のようになっている。
- キー入力のイベントハンドラが起動する
- 入力メソッドにキー入力イベントを渡す
- 入力メソッドがテキスト入力をした場合は、なにもしない
- 入力メソッドがテキスト入力をしなかった場合は、独自に処理をする
一見問題なさそうだが、実は4に問題がある。 テキスト入力がないと、入力メソッドが処理していないは等価ではない。
たとえば「かな」キーを押したときの処理を考えてみる。
まずは入力メソッドが受け取り、入力モードが変更される。テキスト入力が発生しないため、その後iTerm2が処理する。しかしかなキーには機能が割り当てられていないため、なにも起きない。
次にかなキーではなくLキーで、入力モードが切りかわる入力メソッドを考えてみる。SKKがそれに該当する。
同じく入力メソッドが最初に受け取り、入力モードが変更される。テキスト入力が発生しないためiTerm2は処理する。そしてLが入力される。
1度しか入力していないのに、入力メソッドとiTerm2の二重でキー処理されてしまう。 これはSKK界隈で「Lを押したらLが入力された」問題として知られている。
正しく処理するにはテキスト入力が発生したかどうかではなく、入力メソッドがイベントを処理したかどうかで分岐する必要がある。
余談ですが、このパッチの説明は大変だった。
キー入力のイベントハンドラが激戦区で
- Ctrl-Cのような割り込みキーの処理をしたい
- ドイツ語のようなアクセント記号つきの文字をいれたい
- 日中韓の入力メソッドに対応したい
のように、さまざまな要求に対応するために変更が繰替えされていた。blameするとすごいことになっている。
また、入力メソッドの処理のドキュメントがあまりなくて、なぜこの処理が正しいのかを説明するが難しかった。文書の解釈についてディスカッシャンすることが多かった。
今は、パッチがマージされたので「Lを押したらLが入力されてしまう」問題は解決している。
InteliJ IDEAの実例
JetBrains社のIDEにも同様の問題がある。 コードは公開されてないので原因はわからないですが、おそらく原因も同様だと思う。
レポートはあげてあり、人もAssignされているが、ここ2年ほど動きがない。
ので、回避策が必要である。
先程の処理の流れをみてみると、4に行くと問題のある動きが生じる。 なので、常にテキストが入力されるようにすれば、この問題を回避できる。
そのためにNUL文字(\0)を使う。 これは通常のテキストエリアにいれる文字としては不正なのでIDEが無視する。 しかしテキストは入力されていると認識されるので4に行くことはない。
これ、AquaSKKではかなり前から利用されている回避策である。
Qt5の実例
Qtも同様の問題がある。
作るときの苦労
最後に、作るときの苦労の話も少し紹介する。
資料不足
macOSの入力メソッド作るためのライブラリはInputMethodKitという名前で用意されている。しかし、InputMethodKitのドキュメントはほとんどない。
例えば、Qiitaで検索しても0件である。
存在する資料
Appleのドキュメントも特に説明が記載されていない。
参考になるのはヘッダファイルにコメントや、公式サイトから消えたミラーのWebArchiveが文書などである。
孤独
ドキュメントが少ないのと関連するが、弄ってる人はほとんどいない。
動かないメソッド
一部のメソッドがうまく動作しない。
これは変換候補を選択するためのメソッドをディスアセンブルしたコードだが、スタックにpushしてpopしているだけで何もしていない。
radarにレポートしたら「既知のバグ(duplicated)」と帰ってきた。直してほしい。
まとめ
最後にまとめる。
- 日本語入力は特殊なソフトウェアなので落とし穴がある -「未確定文字列」「入力メソッド用のキー」が特につらい
- みんな入力メソッドで遊ぼう
🎍正月休み
🍛ファイナルカツカレー
めしにしましょう 4巻に影響されて、@keita44_f4家でファイナルカレー会をした。
新年にファイナルになったのが気にいってる。
ストロングゼロを飲んだせいか、最初と最後の写真しか残ってない。 記憶もそんなに残っていない。
🤖Android開発
新年なので、Android開発の勉強を始めた。Android端末を使ったことがないのでだいぶ苦労してる。一昨日、日本語入力の方法を覚えた。
KotlinスタートブックとAndroid開発の教科書を読んだ。 Material Designのガイドラインも目を通した。
題材はMastodonクライアントにした(http://github.com/mzp/android-playground)。 それなりに形になってきたと思う。
作りはじめた直後
今
🎨UIトレース
TwitterのUIトレースをして気がついた事|Masaki|note でUIトレースという言葉を知ったので、やってみた。 UIデザインができるようになりたい。
学んだこと * TwitterのUIをトレースしながら研究しよう!(初心者向け) - NOGA BLOGを見ながら、おおまなか流れを覚えた。 * SF Pro DisplayとTextの使い分けがあることを知った: https://qiita.com/motokiee/items/e16d93ef78ff5e0ffbac
気付いたこと
- 名前と時刻をMIDDLE DOTで区切られている。 境目を分かりやすくするためかな?
- 左のアラインはちゃんとそろってる。 右はそうでもない。

🎍2017年
年末なので2017年を振り替える。 ライブに初めて参加したり、Rubyに初めて貢献したりと初めてやることが多い年だった。
🎤ライブ
アイマス
id:banjunに「(シンデレラ 5thライブの)静岡公演のチケットがあるので、行きませんか?」と誘われたので参加した。 その時の体験が想像以上によかったので、福岡公演、SSA公演も参加してしまった。
ペンライトを振りながら曲を聞くのはいいぞ、と学習したので、4th ライブのBDが発売された後、カラオケルームにいって鑑賞会を2回ほどやった。
その後、アイマスハッカソンにも参加した。ライブ中の心拍数変化の記録を活用するアプリを作った。(💎アイマスハッカソン #imas_hack - みずぴー日記)
KOTOKO
ライブはいいものだ、と学習したのでKOTOKOのライブに参加した。
MCで2000年ごろの話がされたり、昔聞いていた曲を生で聞いたりして、だいぶエモい感じになった。
あのころはこんな未来を想像していただろうか、いい未来なんだろうか悪い未来なんだろうか、といったことを考えながらペンライトを振っていた。 走馬灯のようなものだと思う。
KOTOKOが「最近はYouTubeでゲームのOPが見れる」「最近はパソコンを一人一台もってるし、みんなインターネットやってる」とかいう話をしてて、感情が高まりすぎた
— mzp (@mzp) 2017年9月2日
「掲示板を建てて、曲の宣伝をしてくれてた人たちがいる。2000年ごろに」というのもヤバかった
— mzp (@mzp) 2017年9月2日
涙の誓いを聞きながら、こんな人生になるとは思ってただろうか、あのころはどういう未来を思い描いてたんだろうか、とか考えてた
— mzp (@mzp) 2017年9月2日
🛠開発
作ったもの
必要だったので作ったもの。
技術検証を目的に作ったもの。 EmojiIMは作る過程でいろいろ分かったので、ブログ記事にした。
Rubyへのコントリビューション
とうとうRubyにコントリビュートできた(ruby/fileutils #9)。 うれしい。
macOSアプリを対象としたFastlaneがうまく動かないので、原因を調べてたらRubyの標準ライブラリの問題だと分かったのでプルリクエストを送ってマージされた。
その他のコントリビューション
- 🍣寿司、パーサー、Scala.jsに書いたようにscala-js-ts-importerにいくつかのプルリクエストを送った。
- デレステフォトスタジオのリアルタイム透過プレイヤーをつくった - ツバメになったバリスタのPhotoStudioPlayerにもいくつかプルリクエストを送った。
発表
演芸場で話したり、アニクライベントで話したり、いろいろな場所で話をした。
- 名古屋Ruby会議03: ぺろぺろ - Github pull request bot framework -
- Anime Confernce Nagoya vol2(愛知・名古屋)club JB’S 2017年4月9日(日) #アニカンナゴヤ – AniEveZ
- ML勉強会 #2: 📝The reason for using reason #ML_study
- NGK2017B: 📈入力メソッドの魅力とつらさ - みずぴー日記
🛒買ったもの
iPhone Xとかのガジェット系以外はあんまり買ってない。
総数
期間限定で無料になっているKindle本とかを読んでたせいで、異常な件数になった。
炭酸水
炭酸水はペリエの缶に落ち着いた。 缶に入った炭酸水にノスタルジーのようなものを感じるので気にいってる。
ピンクユニコーン
買ったやつではなくてwishlist経由でもらった。
Githubが落ちたときに持ち出して遊んでいる。 最近は、ラバーダックデバッグの相方としても使われている。
github is down!! pic.twitter.com/RWOqJeBO2k
— mzp (@mzp) 2017年1月12日
ドメイン
🍣.gqという絵文字ドメインを購入した。 10ドル/年くらい。
使い道は考えてないが、とりあえず寿司画像を集めるTumblrサイトに割り当てた。
🏢仕事
やったこと
前半はあまり対外的には見えない仕事をしていたが、後半はiPhoneアプリへの機能追加をやった。iPhoneアプリ開発たのしい。
去年からモニタが一台増えて、3台になった。 自席の写真を探したら、掃除中のやつしかなかった。 普段はもう少しきれいで、椅子には座れる。
リゾートワーク
オキナワーク - UIUにあるような観光しつつリモートワークする生活に憧れがあったので、実践した。 (✈️北海道ワーク)
だいぶいい体験だったので、来年もやるつもり。
✈️旅行
京都(1月)
雪が降ったので、雪の金閣寺を見るために日帰りで京都にいった。
各種公共交通機関が遅延してた上、途中でバスが故障したため、金閣寺には到着できなかった。 市内観光をした後、伏見で日本酒を飲んだ。
飛騨・高山(1月)
白川郷のライトアップを見る予定だったが、雪が強すぎて断念した。 市内観光と氷菓と君の名はの舞台訪問をした。
古い町並みと雪の組み合わせは最高だった。 旅行のあと、風邪を引いた。
大阪(2月)
出張で大阪に行ったので、翌日観光した。
Kanonの舞台となった守口駅を見にいった。 せっかくだし、ここで2時間くらい待つか、と思ってベンチに座ってたら「あの...大丈夫ですか?」と声を掛けられてびっくりした。 平日の昼間に一人でずっと座っているのは不審な行動だと気がついた。
沼津(4月)
インターネットの闇の人に会いに沼津に行った。
街中にあるラブライブ! サンシャイン!!の舞台を巡ったあと寿司を食べた。一泊してさわやかも食べた。
沖縄(5月)
初夏は花粉症がひどいので、沖縄に逃げると改善するかどうかを試してみた。 特に改善しなかった。
本島はなんどか観光したことあるので、今回は離島に行ってみた。 レンタカーを借り損ねて移動もできず、ずっと海を眺めていた。
北海道・旭川(6月)
仕事をしながら1週間くらい滞在した。 食べるものすべてがおいしくて最高の体験だった。 イオンで1パック1500円のうにが売ってて、めちゃくちゃおいしかった。
福岡(7月)
シンデレラライブ 5thのために福岡に行った。めちゃくちゃ暑かった。
博多うどんはざるうどんにも「やわ」がある - デイリーポータルZが気になっていたので、うどんを食べ続けてた。 あと鳥皮がうまかった。
広島・尾道 (9月)
RubyKaigiのために広島に行った。 台風が直撃して、大変だった。
早めにいって尾道にも寄って坂と猫を堪能した。
今回のRubyKaigiは市街地だったので、お昼にお好み焼きを食べたりしてた。
終わってから風邪を引いて、3日間くらい寝込んだ。ここで有給を使い切った。
島根(11月)
RubyWorld Conference 2017に参加するために島根に行った。 ついでに、🔥カンバンを完了させるということ - Misoca開発ブログに書いたように出雲大社にカンバンを納めた。
基本的にそばを食べていた。まんぷく遊々記で紹介されてて前々から食べたかった平和そばのカツ丼をとうとう食べた。
秋葉原(通年)
出張だったりイベント参加だったりとなんどか秋葉原にいった。
アトレ秋葉原のコラボイベントの画像がだいぶたまった。 来年は、定位置で取ってつなげれるよにしようと思う。
✨その他の出来事
ICカード破損
新幹線に乗ろうとしたら、EX-ICカードが不調で自動改札を通れなかった。その後、復活することはなく、2週間くらいかけて再発行してもらった。
ほぼ同時期にキャッシュカードも壊れたので、いろいろ大変だった。
こういう悲しいものをもらった。 pic.twitter.com/MIHNyYJn0F
— mzp (@mzp) 2017年8月8日
すたみな太郎
すたみな太郎に行け。友達と濃いハイボールで乾杯して一日の疲れを労え。地に足をつけろ。#地に足会
— 絵麻さんを養って幸せな家庭を築く (@izm) 2017年8月4日
すたみな太郎オフが東京大阪名古屋同時開催…わからん…なんで…
— 絵麻さんを養って幸せな家庭を築く (@izm) 2017年7月25日
地に足会という謎イベントが東京で開催されていたので、@keita44_f4をそそのかして名古屋でも開催した。 すたみな太郎、たのしかった。
💓心拍数
BDでライブ映像を再生しながら自分の心拍数を見たかったので、作った。
📦ソースコード
https://github.com/mzp/HeartVoice
🚀目標: 心拍数とBDの同時再生
💎アイマスハッカソンに書いた心拍の再現と動機は同じ。
再生時刻との同期には技術的困難がいくつかあるので、まずは現在の心拍数を表示するようにした。
🛠仕組み
- AppleWatchを使って心拍数を取得する。 ここはcoolioxlr/watchOS-3-heartrateが参考になった。
- 測定した心拍数をiPhoneに送信する。 ここはアイマスハッカソンのときと同様にWatch Connectivityを使った。
- iPhoneからmacOSに心拍数を転送する。 ここはP2P通信を実現するMultipeer Connectivityを使った。
🚧開発中の様子
妄想で書いたデザイン。 ペンライトを振る数も出したいなーとか考えてた。
AppleWatchで心拍数が取れるようになった。絵文字を使うと、画面が華やかになってよい。
表示の仕方を気にせずにmacOS上に心拍数を表示するようにした。
心拍数を扱うのが初なので、いろいろ悩んだ。
心拍数、自分の意思で変化させれないので、もろもろの動作確認がダルいです
— mzp (@mzp) 2017年12月27日
心拍数管理クラス、singletonになった。心臓一個しかないし。
— mzp (@mzp) 2017年12月28日
ウインドウを透過したり、文字色を変更した。
💖所感
いくつかの要因でデバッグが大変だった。
- watchKitアプリの転送は時間がかかる
- 心拍数の計測にはある程度の時間がかかる
- 心臓の速度は自分の意思では変化させれない
- 3つのアプリが連動しているので、原因特定が難しい。
アプリとしての課題もいくつかあった。
- BD再生をフルスクリーンで行なった上で、さらにその上に心拍数を表示するのは難しそう。
- 接続がうまくいかなかったときのハンドリングが大変そう。
💎アイマスハッカソン #imas_hack
この記事はMisoca Advent Calendar 2017の21日目として書いた。 なお、ボクはこのあと仕事納めをする。
先日、アイマスハッカソン2017に@banjunと共に参加した。
💓成果物
最終的に以下のものを作った。
🐾やったこと
移動
新幹線の重大インシデントの影響で、ダイヤがふんわりなってるなか東京に向った。 朝の恵比寿は人がいなかった。
スポンサートーク
弥生の人がやよいの画像を出しながらスポンサートークをしていたので聞いた。
今回スポンサー頂きました、弥生株式会社さま、やよいの青色会計ζ*'ヮ')ζ#imas_hack pic.twitter.com/vr47brvG0Y
— フサギコ@喪中につき新年のご挨拶は(ry (@fusagiko) 2017年12月16日
弥生スポンサーのハッカソンにきた pic.twitter.com/yoCXHvffHa
— mzp (@mzp) 2017年12月16日
アプリデザイン
事前にbanjunと「ライブのときの心拍を再現したいよね」という話をしていたので、それを作ることにした。
banjunのもってきた12インチiPad Proになんとなくのイメージを落書きした。これ以降、iPad Proの出番はなかった。
AppleWatch APIの調査
心拍を再現するためにAppleWatchを振動(haptic)させる方法の調査から始めた。
振動させるにはWKInterfaceDeviceのplay(_:)を呼べばいいのはすぐに分かったが、どれくらいの間隔で振動させれるかは不明だった。 振動時の音を録音して測定しようとしたが、Logicの表示が秒単位でなかったりしてうまくいかなかった。
パラメータを変えて実験したところ、AppleWatchで測定できる心拍数の上限*1以上の速度であることが確認できたので、限界値の探索はあきらめた。
このあたりでお昼を食べた。
watchOSアプリの実装
午後はbanjunがiPhoneアプリの実装をはじめたので、自分はwatchOSアプリの実装を始めた。
機能はスライドに書いたが
- WatchConnectivityを使ったiOSとの通信
- Workoutを使ったバックグラウンドでのHaptic再生(参考: watchOS-Background-Haptics)
などを行なう。
落書き
watchOSアプリの転送は時間がかかるので、ところどころヒマだったので、SketchでiPhoneアプリの画面を考えてた。 来年はこの方面のスキルをつけたい。
iPhoneアプリ
ボクがwatchOSアプリを書く横で、banjunがiPhoneで動く心拍数表示アプリを書いていた。
アプリを作りながら「公演名と日時と心拍数をながめてるだけで、なんともいえない気持ちになりますね」と言ってて、エモかった。ツアー後半にいくにつれどんどん心拍数があがっていくことも明らかになった。
資料作成
終了時間が近づいてきたので、資料作成をはじめた。
事前の練習ができる状況ではなかったので、言いたいことを先にいって、後半はいつ時間切れになってもいい構成にした。 結局、5分ちょうどにおさまった。
LT大会
LT大会兼成果物発表会で作ったものの紹介をした。 はずかしくて見てないが、たぶんYouTube Liveに写ってると思う。
発表が前のほうだったので、後半は安心してピザとかビールを楽しんでた。
終了
恵比寿のイルミネーションを見てはしゃぎながら、打ち上げ会場に移動した。
🌟所感
- ハッカソン中に等身大のアイドルをARで映し出してみたのチームが記念撮影を繰り返してて楽しそうだった。
- 弥生の人に「アイマスにやよいちゃんってアイドルがでるんでスポンサーしましょうよー」という話をしたが、まさか本当にするとは思っていなかった。
- 本当にやりたいのはブルーレイとの同期なので、今後もがんばっていきたい。
- 隣にすわりながら開発すると、conflict解決とかを雑にやれるので楽。
*1:215拍/分以上を測定できたという実績がないのでこれが上限だと予想している
📈入力メソッドの魅力とつらさ
NGK2017Bで発表した。Misoca Advent Calendar 2017 - Qiitaの5日目でもある。
スライド
原稿
イントロ
今日は漢字入力がつらいという話をする。
このなかに入力メソッド、IME、FEPなどと呼ばれるソフトウェアを日常的に使っているひとはいますか? MS-IMEとかATOKとかGoogle日本語入力などが該当する。
おそらく、ほぼ全員が使っていると思う。
入力メソッドの特殊性
日常的に使っているが、入力メソッドはとても特殊なソフトウェアである。
- すべてのキー入力を受け取る。 パスワード入力欄を含めてすべてのキー入力を取得できる。
- アプリケーションと協調して変換候補ウインドウなどを表示はするが、メインウインドウのような固有のウインドウは持たない
- (日本では)ほぼ全員の人が使っている
世界の入力方法
日本語以外の入力には入力メソッドをあまり使わない。例えば、英語の入力に入力メソッドが不要である。
英語以外にもロシア語用にキリル文字が入力できるキーボードもある。キリル文字とは ( ゚д゚) の口のことである。
ハングルの入力
韓国語でも入力メソッドが用いられているが、これも日本語入力とは異なる。
韓国語の表記に使われるハングルは、複数の字母の組み合わせで文字を構成している。 例えば아というハングルは、ㅇとㅏという2つの記号の組み合わせで構成されている。 このそれぞれの記号を文字の元になっているもの、字母と呼ぶ。
それぞれがDキーとKキーに対応しているので、DKと打つことで아が入力できる。
そのため日本語入力の際に使う「変換候補の表示」という動作はない。
漢字入力の特殊性
- 発音記号を入力する
- 候補を表示して、そこから入力する文字も選択する
という二段階の変換が必要な文字体系は漢字だけである。正確に言うと、macOSに標準でインストールされている入力メソッドでは、漢字入力だけが変換候補を表示してる。
ので、これは漢字を持つ日本語と中国語の入力で使われている機能である。
入力メソッドを持たない文字体系
一方ではUnicodeには196種類もの大量の文字体系が含まれている。そしてそれには入力方法を持たない文字もいくつかある。
例えば絵文字。
例えば楔形文字。
例えばヒエログリフ。
入力メソッドの魅力
これらの入力メソッドを作るのはとても魅力的だと思う。使うのは古代エジプトの神官だと思う。
InputMethodKit
macOSの入力メソッド作るためのライブラリはInputMethodKitという名前である。 Appleのライブラリは末尾にkitと付く。
これを使えばヒエログリフ入力メソッドを作れる。作るべきである。
資料不足
InputMethodKitの資料はあまりない。Qiitaで検索してもでてこない。
Appleのドキュメントも「No overview available」と書いてある。無である。 そのためヘッダファイルのコメントや公式サイトから消えたミラーのWebArchiveなどが参考になる。
利用者不足
ドキュメントが少ないのと関連するが使っている人もほとんどいない。 みんな使ってほしい。
動作しないメソッド
一部のメソッドがうまく動作しない。
変換候補を選択するためのメソッドをディスアセンブルしたものを示す。 アセンブリを読むの大変だがよく読むと、スタックにpushしたあとpopしているだけである。無である。
「なぜ???」と思いながらバグレポをしたら「既知のバグ(duplicated)」と返ってきた。直してほしい。
まとめ
まとめると以下のようになる。
- 漢字入力は実は特殊
- でもいろんな使い道がありそうだしInputMethodKitみんな使ったほうがよい
- つらい
その他
https://github.com/mzp/EmojiIM でいろいろやっている。見てね。
🍣寿司、パーサー、Scala.js
@smogamiに誘われたので、scala-js-ts-importerハッカソンに参加した。
🐾経緯
NGK2017Bに行ったら、パーサを書くとピザか寿司がもらえるハッカソンが告知されていた。 寿司もパーサーも好きなので、@bleisと参加することにした。
✨成果
準備する時間はなかったので、scala-js-ts-importerをダウンロードしただけで向かった。当日はScala.jsとかTypeScriptの話を他の人に聞きながらプルリクエストをいくつか出した。
その後、多少の修正が必要だったもののすべてマージされた。 🎉🎉🎉
- Add supports for index type query and indexed access type by mzp · Pull Request #52
- Prevent abnormal exit while running test by mzp · Pull Request #53
- Improve nested object literal by mzp · Pull Request #57
- Add object type support by mzp · Pull Request #58
パーサーいじるのたのしかったし、いろいろと直すべき箇所があってscala-js-ts-importerはいい題材だった。
🍣寿司
昼の出前寿司はうまかった。
ピザは冷めると残念になるが寿司のうまはは変わらない、という意見により宅配寿司になりました #ScalaTokai
— mogami (@smogami) 2017年12月3日