テンキーを左手入力デバイスとして使う

左手入力デバイスを拡充しようと思い、Keypad SANWA SUPPLY NT-M18UHSV を購入した。 選んだ観点は

  • 00 キーがない。
    • 00 キーを持つテンキーは多いが、たいていは内部的に 0 キーを 2 回押しているだけである。しかもそれを混乱なく実現するために、出力前に同時押下中のキーを上げるコマンドを送出していたりする。その場合、モディファイアキー+00 に機能を割り当てられなかったりするので、左手入力デバイスとして使うには少々問題がある。
  • 極力キー数が多い。
    • キー配置はソフトウェア的に変更できるのでどうでもいい。たとえば 0 キーの幅が広かったり + キーが縦に長かったりするよりは、通常のテンキーとしてはちょっと使いづらい配列でもいいからキー数が多いほうが好ましい。
  • 最低でも 2 キーロールオーバーできる。
    • こればっかりは購入してみないとわからない。試してみた結果、このキーパッドではほとんどのキーの組み合わせで 2 キーまではロールオーバーできる(3 キーになると不具合が発生しはじめる)。
    • 唯一 2 キーロールオーバーできなかったキーが左下の 0 キーで、これは押下持続を全く認識せず押下時に KeyUp イベントも連続して送出してしまう。この挙動は、0 をモディファイアキーとして使わなければ大きな問題とはならない。

このテンキーは、20種類の別個のキーを送出できるという点において、左手入力デバイス用のテンキーとしてはほぼ理想的である。いくつか問題点があるとすれば

  • tab enter return が通常キーボードでの押下と区別されない。
  • 私が利用しているソフトが、テンキーの = キーを通常キーボードの = キーと同一視する(機器からはちゃんと NUMPAD_EQUAL が送出されている)。
  • 私が利用しているソフトが、テンキーの clear を割り当て可能キーとして認識しない。

これらを解決するために、tab clear enter return = の 5 つを別のキーに再割当てする。

  • 私の使用方法だと、テンキーの 1 4 7 をそれぞれ alt shift command (control if Windows) に変更するのでこれらのキーが余る。よってこれらを enter = clear へ再度割り当てることでテンキーとキーボードとを分離する。
  • 私の利用するソフトでは、return キーには単独で押された場合には space と同じ挙動・モディファイアと押された場合には 0 と同じ挙動をしてもらえるとありがたい。よってそのように設定する。
  • このテンキーでは tab キーは非常に押しづらい位置にある。よってこれは弄らない(もしくは nop としてもよい)。

以上を Karabiner を通して設定する。vendorid, productid は Karabiner 内のツールである EventViewer から取得する。

  <devicevendordef>
    <vendorname>SANWASUPPLY</vendorname>
    <vendorid>0xffff</vendorid>
  </devicevendordef>

  <deviceproductdef>
    <productname>NTM18UHSV</productname>
    <productid>0x0200</productid>
  </deviceproductdef>

...
    <item>
      <name>Place Modifiers to Numpad</name>
      <appendix>Numpad 1 to Option (KeyToKey)</appendix>
      <appendix>Numpad 4 to Shift (KeyToKey)</appendix>
      <appendix>Numpad 7 to Command (KeyToKey)</appendix>
      <identifier>private.remap.keypad_modifiers</identifier>
      <autogen>__KeyToKey__ KeyCode::KEYPAD_1, KeyCode::OPTION_L</autogen>
      <autogen>__KeyToKey__ KeyCode::KEYPAD_4, KeyCode::SHIFT_L</autogen>
      <autogen>__KeyToKey__ KeyCode::KEYPAD_7, KeyCode::COMMAND_L</autogen>
    </item>

    <item>
      <name>Change Keypad NT-M18UHSV keys to other keys.</name>
      <appendix>Numpad enter to KEYPAD_1 (KeyToKey)</appendix>
      <appendix>Numpad = to KEYPAD_4 (KeyToKey)</appendix>
      <appendix>Numpad clear to KEYPAD_7 (KeyToKey)</appendix>
      <appendix>Numpad return to space if pressed without modifier, else to 0 (to avoid return/enter key taken unnecessarily by VSTi and Ctrl/Cmd+Space by OS X). (KeyToKey)</appendix>
      <identifier>private.remap.change_tenkey_keys_ntm18uhsv</identifier>
      <device_only>DeviceVendor::SANWASUPPLY, DeviceProduct::NTM18UHSV</device_only>
      <!-- CLEAR can be set to CONTROL_L, and it will expand keypad functionallity, but I won't do so.-->
      <!-- Because it will lose consistency between Windows and Mac.-->
      <autogen> __KeyToKey__ KeyCode::ENTER, KeyCode::KEYPAD_1 </autogen>
      <autogen> __KeyToKey__ KeyCode::KEYPAD_EQUAL, KeyCode::KEYPAD_4 </autogen>
      <autogen> __KeyToKey__ KeyCode::KEYPAD_CLEAR,  KeyCode::KEYPAD_7 </autogen>
      <block>
        <modifier_only>ModifierFlag::NONE</modifier_only>
        <autogen>__KeyToKey__ KeyCode::RETURN, KeyCode::SPACE</autogen>
      </block>
      <autogen> __KeyToKey__ KeyCode::RETURN, KeyCode::0</autogen>
    </item>

00 キー (double 0 key, double O key) の活用方法

以前使っていた iBuffalo BSTK11 において、00 キーをどのように活用していたかをログとして残しておく。

軽く前述したが、00 キーの挙動を Karabiner の EventViewer で観察したところ、たとえば 2 を押しながら 1 を押すと 2↓ 1↓ 1↑ 2↑ という順番で送信されるのだが、00 だけは他の押してあったキーを勝手に離してから 0 を2回押すという挙動をする(2↓ 2↑ 0↓ 0↑ 0↓ 0↑)。これは、テンキーのキーをモディファイアに変えて使っているときに問題となる(モディファイアキー+00 キー を取れない)。 この問題は「前回送られたイベントがモディファイアキーで、かつそのイベントから次のイベントまでが人間には不可能なほど早い」みたいなフィルタをかければ一応は解決可能で、それを実現したのが次の private.xml である。0 を押せば 0 が・00 を押せば 1 が・command+0 を押せば command+0 が・command+00 を押せば(初回は)command+1 が、それぞれ出力される設定となっている。

      <item>
        <identifier>private.remap.double0to1</identifier>
        <name>00 to KEYPAD_1</name>
        <appendix>Change 00 key (quick 0 x2) to KEYPAD_1.</appendix>
        <!-- Filter elapsedtimesincelastreleased_lessthan cannot be used, because it also sends out the first KEYPAD_0. -->
        <!-- Following filter can catch single Mod+00 event, but not Mod+multiple 00 event. -->
        <block>
          <lastsentevent_only>KeyCode::COMMAND_L</lastsentevent_only>
          <elapsedtimesincelastreleased_lessthan>Millisecond::RawValue::10</elapsedtimesincelastreleased_lessthan>
          <autogen>
            __KeyToKey__
            KeyCode::KEYPAD_0,
            KeyCode::VK_NONE,

            Option::KEYTOKEY_DELAYED_ACTION,
            KeyCode::KEYPAD_0, ModifierFlag::COMMAND_L,

            Option::KEYTOKEY_DELAYED_ACTION_CANCELED_BY, KeyCode::KEYPAD_0,
            KeyCode::KEYPAD_1, ModifierFlag::COMMAND_L,
            KeyCode::VK_KEYTOKEY_DELAYED_ACTION_DROP_EVENT,
          </autogen>
        </block>
        <block>
          <autogen>
            __KeyToKey__
            KeyCode::KEYPAD_0,
            KeyCode::VK_NONE,

            Option::KEYTOKEY_DELAYED_ACTION,
            KeyCode::KEYPAD_0,

            Option::KEYTOKEY_DELAYED_ACTION_CANCELED_BY, KeyCode::KEYPAD_0,
            KeyCode::KEYPAD_1,
            KeyCode::VK_KEYTOKEY_DELAYED_ACTION_DROP_EVENT,

            <!-- In the next version, next Option will be added, so remove comment then. -->
            <!-- Option::KEYTOKEY_DELAYED_ACTION_MILLISECONDS, -->
            <!-- Millisecond::RawValue::10, -->
          </autogen>
        </block>
      </item>

しかしこのスクリプトを使っても、モディファイアキーを押しっぱなしにしたまま 00 を繰り返し押すという動作が拾えない。これはそもそもモディファイアキーに変更しているキーが 00 送出時に押し上げられてしまい、その後そのキーは送信されないのでどうやっても解決はできなさそうである。よって モディファイア+00 には、繰り返して実行することがない動作を割り当てるのが重要である(たとえば 拡大・縮小 などを割り当ててはいけない!)。

これと同様の操作を WindowsAutoHotKey で実現する場合は ここ とか参照なんだと思う。しかし設定するよりテンキーを買い換えてしまったほうが早いと思う。

Apple Magic Keyboard は多くの環境で有線 USB キーボードとしても使える

いつも MacBook Pro を使っている身としては、全く同じキーボード配列を自宅の Windows 機で使えたら嬉しい。ついでに、たとえば Raspberry Pi の初期設定をするときとかにも使えるのだとしたら家から古いキーボードを一掃できてさらに嬉しい。ネットを見ても、Magic Keyboard がたとえばブート時の操作に使えるのかどうかなどの情報がなかったので人柱になってみたところ、とりあえずいろいろな環境において標準の USB ドライバで使うことができるらしいことが判明した。以下、使えた機種を列挙する。

  • X201s + Windows7 で使用可能。
  • Raspberry Pi 1 Model B+ + Raspbian 8.0 で使用可能。

また、Bluetooth を用いて、

いつも使っている MacBook Pro と全く同じキー配列&かなり近い打鍵感で、iOS にも Win にも Linux にも特別なドライバをインストールせずに接続可能というのは、かなり便利である。HHKB を手放す準備ができた。HHKB, 矢印はないわ Delete の位置は狂ってるわで他との併用には適さなかったからなぁ。

(もちろん、使えると思ったのに使えなかった、みたいな場合でも僕は責任を取りませんのであしからず。)

Fabric の Python 3.x 対応について調べてみた

2015-03-29 時点での情報です。超絶意訳なので正確には原典をあたってください。

まとめ

Fabric 1.x から (Fabric 2.x + Invoke 1.x) の体制に近々移行する予定であり、その過程で Python 3.x 対応はする予定。

参考にした URL

  • Installing - Fabric
    • Fabric の開発では、print のかわりに print() を使ったりと、Python 3.x 対応に向かっている。依存しているモジュールが対応したら、「間違いなく (will definitely)」Python 3.x に移行する。
      • Fabric の依存先は setuptools, Paramiko(とその依存先)で、これらは現在すべて Python 3.x に対応している。
  • Python 3.3 support
    • Fabric 2.x 系で Python 3.x 対応をする、とのメインメンテナの言葉。
  • Split out non-ssh-dependent features into separate lib
    • たとえローカルでしか Fabric を使わないとしても ssh と PyCrypto を導入しなければならない現状はクソだから、Invoke ってプロジェクトを新しく作って ssh 以外のタスク実行はそっちにすべて任せたい(Fabric 2.x + Invoke 1.x でひとまとまりという構成で動くようにしたい)らしい。
    • Invoke がいまだに alpha なのは、Fabric 2 を作る過程で Fabric 1 から機能を移行しているのだが、その際に同時に Invoke のデザインも決定しているから。
    • 2015-01-29 現在、Fabric 2 はメインメンテナが private に作っている。alpha を PyCon 2015 (2015-04-08) に間に合わせたいっぽい。
  • Invoke
    • 新しいタスク実行モジュールとなるべき Invoke は既に Python 3.2+ に対応している。

おすすめの SCP-JP まとめ

以前 The SCP Foundation オススメ記事まとめ を書いたら、「SCP-JP にも面白い SCP が眠っているよ!」とのご意見をいただいたので、読んで好きなものをピックアップしてみました!

SCP についての説明は以前の記事を見ていただくとして、SCP-JP について念のために説明しておくと、これは SCP の日本版を作ろうという試みです(簡潔)。

日本でないとできないネタとかもあって、本家とは一味違った面白さがあります。

ということでオススメの紹介です!

Vim で Markdown 形式のハイパーリンクを Web サイトのタイトルも含め自動生成する

あけましておめでとうございます。今年もよろしくお願いいたします。

Vim に関する記事を読んでいるときに、Emmet.vim を使えば簡単なコマンドで Markdown 形式のリンクが作成でき、しかもタイトルまで自動で取得して入力してくれる、ということを知りました。しかしそのためだけに Emmet.vim をインストールするのはいささかオーバーキルの感があったので、自分が既に利用している Vim script を複数使って同様の機能を実装しました。

具体的な挙動は、カーソル下の URL を取得し(vim-textobj-user, vim-textobj-url に依存)、その URL から HTML の <title> タグを取得し(webapi-vim に依存)、括弧をいい感じに整える(vim-surround に依存)というものです。他人の褌で相撲をとっている感が満々ですが、まぁ車輪の再発明をしなくて済んでいるということにしておきましょう。

以下がその Vim script です。ご活用いただければ幸いです。ツッコミなども歓迎いたします。

Create Markdown hyperlink automatically. Usage: t ...

KainokiKaede Advent Calendar 2014 を振り返る

この記事は KainokiKaede Advent Calendar 2014 25日目の記事です(嘘から出たまこと)

最後は自分語りかよって言われるかもしれないけど振り返りもしたかったしまぁ多少はね?

なんでこんな誰も喜ばないようなアドベントカレンダーを始めたかというと、自分の最近の興味の方向性がわかるかなと思ったからです。でも結局雑食性であることがわかっただけっぽいですね。まぁとりあえず振り返ってみましょう。

KainokiKaede Advent Calendar 2014 記事リスト

Date Title
2014-12-25 KainokiKaede Advent Calendar 2014 を振り返る
2014-12-24 Cubase で TouchOSC を使う
2014-12-23 Markdown で書いた文書を LaTeX でリアルタイムでタイプセット(Pandoc と latexmk を利用)
2014-12-22 (MacBook Air + Traktor) + (iPad + TouchOSC) でモバイルワイヤレス DJ 行為
2014-12-21 国際キャッシュカードを作ろう
2014-12-20 静かな待降節ソング
2014-12-19 Git 初心者が詰まったところをメモ
2014-12-18 Google Calendar で複数のカレンダーにまたがる予定をウィジェットとして公開する
2014-12-17 Mac で Adobe Reader を用いて右綴じの本を見開きで表示する
2014-12-16 夜にメールを書いて朝に送る(Gmail を特定時刻に自動で送信する)
2014-12-15 Vim で Evernote を編集するために vim-geeknote を導入する
2014-12-14 Mac OS X Mavericks に Ureka1.4.1 を導入
2014-12-13 TrueCrypt の後継プロジェクトまとめ
2014-12-12 さくらの VPS でスワップが大量発生した原因と対処
2014-12-11 Xcode 6.1.1 に XVim を導入する
2014-12-10 さくらの VPS を使う - 7. CakePHP
2014-12-09 CentOS ログ・ステータスファイルまとめ
2014-12-08 Firefox で、マウスのみを用いて「ブックマークメニュー」にブックマークを登録。
2014-12-07 CentOS サーバー sensors 温度 知る
2014-12-06 Xcode の便利な機能(主にショートカットキー)
2014-12-05 日頃の感謝をこめて寄付したいウェブサイトなど7つ+α!
2014-12-04 flickr にブログ用のスクリーンショットをアップロードする
2014-12-03 冬コミの寒さ対策
2014-12-02 SONY RX100 の設定項目
2014-12-01 project.pbxproj のコンフリクトを解決するために mergepbx を利用する

ぱっとみた感じ Xcode 関係が3つぐらいあって最近 iOS 向けアプリの開発をしているさまが伺えます。

あと Gmail, Google CalendarGoogle のサービスについての記事が2つあって Google に心を売り渡していることが伺えます。

サーバー関係も4つぐらいあってアマチュア鯖管としての苦難が垣間見られます。

Vim 関係が2つしかないのは意外ですがまぁ個人的にはほとんど弄りつくしてしまったからなぁ。でも vim-geeknote は便利ですし(この記事もそれで書いている) XVim 無しで Xcode を使う気にはもうなれません。このへんのツールについてちゃんと調べて導入したという点はこの Advent Calendar をやってよかったと思っている点です。

DTM 関係がかろうじて2つあるかないかなのは問題な気がする。今年は去年よりもうちょっと楽曲制作できるはずだったのだが……。

結句

正直4日目あたりからすでに辛かったのですが書き溜めもけっこうあったせいでどうにか完走できてよかったです。来年はたぶんやりません。毎日ブログをいくつも書いている人は凄いなぁと思いました(小並感)それではみなさん良いお年を。

Cubase で TouchOSC を使う

この記事は KainokiKaede Advent Calendar 2014 24日目の記事です(大嘘)

TouchOSC は iOS 機器を MIDI コントローラとして使うことができるアプリです。これを Cubase で使う方法をまとめました。

セットアップ

まずは 公式 から TouchOSC Bridge をダウンロードし、Cubase を動かすのと同じ PC にインストール。インストールしたら起動。Windows なら右下のタスクバーにアイコンが表示されるはずです。

また、同じく 公式 から TouchOSC Editor をダウンロードしてインストール。自分で TouchOSC のコントローラを編集しない場合でも、レイアウトを iPad (iPhone) に送るために必要です。

これらのソフトが入っているパソコンは iPad (iPhone) と同じ LAN 内にある必要があります。上手くつながらない場合は LAN ルーターの設定を確認しましょう。

必要なファイルを取得

コントローラーのレイアウトを自分で自由に作成できるのが TouchOSC の良い点でもあり悪い点でもあります。位置から自分のレイアウトを作成するのは面倒すぎて発狂しうるので既存のものを使いましょう。次のようなものがあります。

拡張子 touchosc のファイルを iPad (iPhone) に送り、拡張子 xml のファイルを Cubase に読み込ませることになります。

Cubase 側の設定

Cubase 6 での設定方法です。自分のバージョンに適宜読み替えてください。

デバイス->デバイス設定 の左上の+マークをクリックして「一般リモートデバイス」を選択。右のほうにある「読み込み」から上記でダウンロードした xml ファイルを読み込みます。

TouchOSC 側の設定

まずはパソコン側で TouchOSC Editor を開きます。左上の Open で読み込ませたい touchosc ファイルを開き、右上の Sync を押します。ウィンドウが表示されるので表示したままにしておきます。この状態で iPad (iPhone) の TouchOSC から Layout -> Add を選択すると自分のパソコンが表示されているはずです。そこを押すとテンプレートが iPad に送信されます。

完了

あとは iPad (iPhone) 側で操作すれば Cubase の該当箇所が動くはずです。最初は若干の遅延があるかもしれませんが、そのうち良くなります。