みずぴー日記

陽気なプログラマが世界を廻す

?絵文字キーの実現

f:id:mzp:20161224105605g:plain

要約

入力メソッドの拡張とキーボードのファームウェア変更により?キーを実現した。

ErgoDoxで実現できないキー

ErgoDox EZ等のキー配列を自由に変更できるキーボードがある。 ただし、通常のキーボードにないキーを作ることはできない。

例えば、絵文字を直接入力するキーを作ることはできない。

ファームウェアの制限

ErgoDox EZ等で利用できるファームウェアであるqmk_firmwareにはUnicodeサポート機能がある。しかし実現方法がOSごとに違うため、OSに依存した制限がある。

macOSではUnicode Hex Inputを利用しているが、Unicode Hex Inputは4桁のコードポイントしか受け付けない。そのため4桁を越えるU+1F363(?)を入力するキーは作れない。

f:id:mzp:20161224104248p:plain

絵文字キーの実現

入力メソッドの拡張

4桁を越えるコードポイントを入力できるようAquaSKKを拡張した。(codepoint_inputブランチ)

CtrlOption を押しながらコードポイントを入力し、最後に u を入力することで、任意のコードポイントを入力できるようにした。 例えば、 ?(U+1F363)を入力したい場合は、 CtrlOption を押しながら 1 F 3 6 3 U を押すと?が入力できる。

ErgoDoxでの入力

ErgoDox EZのファームウェアを変更し、拡張した入力方法を用いるマクロを作成する。 これにより絵文字キーを実現できる。

// M(1)とM(2)に絵文字を割り当てる
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
      switch(id) {
        case 1:   
        if (record->event.pressed) {
          // ?(U+1F363)
          return MACRO(
              D(LALT), D(LCTL),
              T(1), T(F), T(3), T(6), T(3), T(U),
              U(LCTL), U(LALT),
              END );
        }
        break;
        case 2:
        if (record->event.pressed) {
          // ?(U+1F374)
          return MACRO(
              D(LALT), D(LCTL),
              T(1), T(F), T(3), T(7), T(A), T(U),
              U(LCTL), U(LALT),
              END );
        }
        break;
      }
    return MACRO_NONE;
};

別解1: サロゲートペア

サロゲートペア使えばAquaSKKの改造いらなかったな。

別解2: TouchBar

TouchBarには絵文字入力補助があって便利!

f:id:mzp:20161224110754p:plain

?AquaSKK 4.4.5: 旧かな入力の対応・数値変換の不具合修正

いくつかのプルリクエストをもらったので、それらを取り込んだAquaSKK 4.4.5をリリースした。

ダウンロード

https://github.com/codefirst/aquaskk/releases/tag/4.4.5

変更内容

旧かな変換ルールの追加

f:id:mzp:20161224083618p:plain

「ゐ」「ゑ」に対応するローマ字が、AquaSKKとL辞書でずれていてうまく変換できなかったため、L辞書のほうに統一した。(#71)

さらに設定画面から有効・無効を切り替えれるようにしたり、「くゎ」や「ぐゎ」を入力できるようにした。(#73)

不具合修正

いくつかの不具合を修正した。

  • 数値変換で「100000000えん」が「一億万円」になる問題を修正(#74)
  • カタカナ・半角カナモード時に送りありの変換ができない問題を修正(#72)

Love?LivePhotos

NGK2016Bでライブフォトの話をしてきた。

資料

関連資料

原稿

自己紹介

f:id:mzp:20161219205727p:plain

仕事ではMisocaというWebサービスを作っているが、これはスポンサーセッションではないので、まったく関係ない話をする。

具体的にはiPhoneの話をする。

ライブフォトの紹介

f:id:mzp:20161219205731p:plain

最近のiPhoneにはライブフォトという機能が搭載されている。 普通に写真を撮ると、前後が動画として記録される。

ライブフォトはロック画面に設定することもできる。 そのため、「動くロック画面」が実現できる。

理想

f:id:mzp:20161219205735p:plain

ので、こういうロック画面を作りたい。

問題点

f:id:mzp:20161219205737p:plain

ライブフォトはiPhoneのカメラで撮影しないと作れない。

それでは困るので、任意の画像・動画からライブフォトを生成する方法を探さないといけない。

調査内容

f:id:mzp:20161219205739p:plain

いろいろ調べた結果、movファイルとjpegファイルのメタデータに同じUUIDを書き込んで、Photosアプリに取り込めばライブフォトになることがわかった。

LoveLiver

f:id:mzp:20161219205742p:plain

これをアプリにした。

アプリ名はライブフォトを愛するという意味でlove liverと名付けた。動画ファイルを取り込んで、指定した箇所をライブフォトに変換できる。

その後

f:id:mzp:20161219205745p:plain

以上が一年前の話です。そして、そのあとの一年に起きたことを順番に話す。

題材

f:id:mzp:20161219205749p:plain

iPhoneは縦長かつ高解像度のため、なかなか適した題材がない。

デレステ 縦MV

f:id:mzp:20161219205752p:plain

奇跡的にデレステの縦MVバグ(?)が見つかる。 これは発見直後のまとめで、みんなが大喜びしているのが分かる。

大量のライブフォト

f:id:mzp:20161219205756p:plain

これにより大量のかわいいライブフォトが生成できるようになった。

ちょいちょい寿司の画像がまざっているのは気にしないでほしい。

WWDC

f:id:mzp:20161219205801p:plain

WWDCにはラボと呼ばれるAppleのエンジニアと一対一で会話する機会がある。

そこにLoveLiverのもう一人の開発者がいって、APIの有無を聞いた。ついでに生成されたライブフォトを見せて、coolと言ってもらった。

Tumblr

f:id:mzp:20161219205806p:plain

長い間、ライブフォトの共有方法はなかったが、先日Tumblrが対応した。

タッチバー対応

f:id:mzp:20161219205812p:plain

最近は、新型MacBookProを買ったので、タッチバー対応をしている。 どこをライブフォトにするかを選択できる。

まとめ

f:id:mzp:20161219205819p:plain

きときと

ゆるゆりの舞台訪問のために富山に行った。

ゆるゆり舞台

ゆるゆりなちゅやちゅみの舞台をメインに回った。場所等は以下のサイトを参考にした。

砺波平野

なちゅやちゅみのラストシーンのキャンプ場。 スキー場の上に登らないと見えない風景なので、がんばって登った。

f:id:mzp:20161022170133j:plain

f:id:mzp:20161022170920j:plain

らんぶる

序盤にでてきた喫茶店。 せっかくだし、ということであかりちゃんたちが座ってた席を選んだら、すぐ近くにポスターが貼ってあって良さがあった。

ついでに、豆とドリッパーを購入して、滞在期間中に飲むコーヒーも確保した。

その他

その他に高岡市内やココスに寄って、舞台訪問の実績を解除した。

f:id:mzp:20161022131016j:plain

f:id:mzp:20161024150013j:plain

Netflixに加入しておくと舞台で該当のシーンをその場で確認できてよい、という知見を得た。

宿

直前まで予約をさぼっていたら、Jalanで予約できるホテルがすべて埋まっていた。 なので、始めてAirbnbを使ってみた。

そしたらなぜか5階建ての一軒家を貸しきることになって異常に豪華だった。

セミナールーム(?)でブルーレイが再生できたので、シンデレラガールズ 3rd LIVEのブルーレイをずっとみていた。

f:id:mzp:20161023112117j:plain

寿司

せっかく富山に来たので寿司を食べた。 海老がやたらうまくてびっくりした。

f:id:mzp:20161022200214j:plain

f:id:mzp:20161022200400j:plain

観光

高岡駅の近くに古い町並みが広がっていたので、普通に観光していた。 Wifi案内に大仏の絵が描いてあって徳が高そうだった?。

f:id:mzp:20161024114714j:plain

f:id:mzp:20161024125152j:plain

その他

ハロウィンガチャをひく人がいたので、タイムラプスで撮影したらだいぶ楽しい感じになった。

AquaSKK 4.4.[2-4]: JetBrains対応

要約

AquaSKKレベルでJetBrains製品に対応するのをあきらめた。C-j/l/q/L/Qを使用可能にするために、Karabinerを利用するようにした。

ダウンロード

https://github.com/codefirst/aquaskk/releases/tag/4.4.4

使い方

Karabinerのprivate.xmlに以下のように書く。

<?xml version="1.0"?>
<root>
    <include path="/Library/Input Methods/AquaSKK.app/Contents/Resources/karabiner.xml" />
</root>

するとKarabinerの設定画面にJetBrains用の設定が表われるので、それを有効にする。

f:id:mzp:20161009102928p:plain

さらにAquaSKKの互換性で com.jetbrains に対して「入力ソース同期」を有効にする。

f:id:mzp:20161104093413p:plain

制約

無理矢理やっているため、いくつかの制約がある。

  • AquaSKK統合では動作しない
  • 入力モードを切り替えたときにポップアップはでない

変更内容

JetBrains製品ではC-j/l/q/L/Qが使えないため、なんらかの回避策が必要となる。

これまでAquaSKK側でいくつかの回避策を取っていたが、JetBrains側の挙動に強く依存しているため、たまに動かなくなったりする。 これまでも何度か対応をしている。

そういった対応もそろそろツラつらくなってきたので、より低レベルな部分で対応できるKarabinerを使うようにした。

そのため、AquaSKK側に以下のような変更を加えた。

  • JetBrains用の回避コードをはずした。
  • Karabiner側の入力ソース変更にAquaSKKが反応するようにした。

Sierra

KarabinerはまだSierraでは動かないが、JetBrains製品も動かないらしいので、これでいいと思っている。

ちなみにAquaSKK自体はSierraでも動く。

ファミコン エミュレータ

f:id:mzp:20160904225208p:plain

エミュレータを作ってみたいなぁという漠然とした思いがずっとあったので、ファミコンエミュレータを書いている。スクリーンショットにあるような表示はできる。

ファミコンにした理由

エミュレータは作りたいが、よく知らない機械のエミュレータを作ってもつまらないので、多少は親しんだファミコンにした。

一番印象深いゲーム機はスーパーファミコンだが、スーパーがついてないほうが簡単かな、と思ってファミコンにした。

買ったもの

カートリッジからROMイメージを吸い出すために、吸い出し機をAmazonで購入した。

ゲーム自体は大須レトロゲームを取り扱ってる店に行って買った。1200円くらいした。

f:id:mzp:20160904230002p:plain

進捗の様子

Hello world

f:id:mzp:20160904230234p:plain

NES研究所にあるサンプル。

最初はこれを動かすのを目標にしていた。作ろうと思ってから、これを動かすまで2週間ほどかかっている。

ギコ猫

f:id:mzp:20160904230540p:plain

ギコ猫でもわかるファミコンプログラミングにあるサンプルを一個づつ動かしていった。ギコ猫なつかしい。

スーパーマリオブラザーズ

一番最初にスーパーマリオブラザーズを動かしたときの様子。 空の色がおかしい。 f:id:mzp:20160904230658p:plain

だいたいの背景色が正しくなったが、一部おかしい。

f:id:mzp:20160904230732p:plain

空の表示はできるようになった。

f:id:mzp:20160904230834p:plain

Sprite 0の当り判定(ヒットフラグ)を実装したら、タイトルがでるようになった。

f:id:mzp:20160904230859p:plain

VRAMの読み込みがおかしかったので修正した。

f:id:mzp:20160904231000p:plain

スプライトの表示をちゃんとしたらマリオっぽいのが表示された。 が体がバラバラになっている。

f:id:mzp:20160904231053p:plain

スプライトの反転処理を実装したら、体がくっついた。

f:id:mzp:20160904231134p:plain

スプライトの背景処理をちゃんとした。

f:id:mzp:20160904231202p:plain

他の画面もそこそこ動く。

f:id:mzp:20160904232335p:plain

f:id:mzp:20160904231230p:plain

実装してないこと

実装してない部分を列挙すると以下のようになる。ゲームとして遊ぶのは無理だと思う。

  • mapper 0以外のカートリッジの対応
  • タイミング制御。普通に画面がチラつく。
  • サウンド

つらさ

うまく動作しないときの原因の特定が、本当に大変だった。

エミュレータは任意のプログラムを入力とするので、許容する入力が圧倒的に多い。さらに、その内容は機械語で書かれているので意図を理解するのが難しい。 だいたいは、以下のような手順でデバッグしていた。

  1. ディスアセンブルしたコードを読んでなんとなくの動きを把握する。
  2. そして、その通りに動いてるかどうかをメモリを監視しながら確認する。
  3. 変な動きをしてるところがあったら命令のログもとって重点的に動きを追っていく。

Rubyで書かれたNESエミュレータであるoptcarrotと動きを比較してみることも多かった。

現状

さぼっていた部分がだんだんと致命的になってきてウワーとなっている。

  • 上から順に1ラインづつ画面を更新していく、
  • CPUとPPUのタイミング動機

がっつり直さないといけないけど、どうしようかな…。

レポジトリ

https://github.com/mzp/famicom/

そろそろGo言語を勉強するか、という気分だったのでGo言語で書いている。深い意図はない。

参考にしたページ

その他

f:id:mzp:20160904231928p:plain

f:id:mzp:20160904231448j:plain

f:id:mzp:20160904231506j:plain

AquaSKK 4.4.1

f:id:mzp:20160903090237p:plain

AquaSKK 4.4.1で設定画面で辞書を追加する際に file:// がついてしまう問題を修正した。詳細は、Issues #55に書いてある。 あとスクリーンショットの壁紙がかわいい。

ダウンロード

https://github.com/codefirst/aquaskk/releases/tag/4.4.1

経緯

デレステ辞書を作るのを手伝っている途中で指摘されたので、「すみません、すみません」と思いながら修正した。

この挙動はかなり前から認識していて、実際たまに困っていた。 ただ、たまになので手動で直して回避してしまっていた。

ちょうどいい機会なので、勢いで直した。

要約