人生シーケンスブレイク

シーケンスブレイク(Sequence breaking、シークエンスブレイクとも)とは、テレビゲームにおいて開発が想定している攻略ルートを逸脱し、ショートカットする行為のことである。

HHKBのキーマップ変更機能が残念だった #hhkb

はじめに

2019/12/10に発売されたHappy Hacking Keyboard HYBRID Type-S / 無刻印を発売日に購入しました。

f:id:ShineSpark:20191227034049j:plain

自分は過去に

  • HHKB Lite2
  • HHKB Lite2 for Mac
  • HHKB Professional2
  • HHKB Professional Type-S

を購入したのでこの度で5枚目の購入です。最近はHHKBを2枚配置して疑似分割キーボードとして使っていました。

Dvorakユーザーの私は発売当日のプレスリリースを見てキーマップ変更ができると知り、その日に開催された HHKBユーザーミートアップ vol.3 | Peatix に参加した折にHYBRID Type-Sを早速購入しました。

世のレビュー記事では概ね高評価ですし、私も打鍵感やUSB Type-C対応には満足しています。

しかしながらキーマップ変更機能で非常に残念だった点がありました。この記事がPFUの担当者の方の目に止まり、いつかファームウェアアップデートで対応してもらえることを期待して敢えてこの記事を書きます。

何が残念か

Dvorak配列では右Shiftの左隣のキーがZなので、このキーをZに割り当てようとすると、

f:id:ShineSpark:20200508221955p:plain

Zキーは"特殊な動作を行うために予約されている"というポップアップが出て、

f:id:ShineSpark:20200508222217p:plain

FnレイヤーまでZにされてしまい、長年HHKBで打鍵してきた が従来のキーで打てなくなる。

f:id:ShineSpark:20200508222722p:plain

これは Q, X, Z, 左Ctrl, 右Shift キーをリマップした際にはFnレイヤーも同キーで強制的に上書きするという仕様に起因する為、Dvorak配列に限らずそれらのキーをリマップした際にも同様の問題が発生します。

どうしてもを入力したい場合には、長年HHKBで打鍵してきたキーマップとは異なる位置にをリマップするしかありません。

とはいえ、他のカーソルキー配置との兼ね合いや、使い慣れたキー配置を変更するのは難しく、結果としてハードウェアでのキーマップを諦め、今まで通りOS/ソフトウェア上でのリマップに頼ることになります。

これではキーマップ変更機能は全く使い物になりません。

キーマップ変更機能について

キーマップ変更機能について、PFUではこのように紹介されています。

プレスリリース

制御キーの割り当てを変更できるDIPスイッチに加えて、キーマップ全般をカスタマイズできる(注3)「キーマップ変更機能」を装備しました。 専用ソフトウェア(Windowsで動作)による操作は直感的でわかりやすく、設定内容はHHKB本体に保存するため、接続するPCやスマホを変えても、同じキーマップで使用できます。[HYBRID Type-S/HYBRIDのみ]
(注3)キーマップ変更は、特別な機能を割り当てられた一部のキーを除きます。 PRESS RELEASE | 高性能コンパクトキーボード「Happy Hacking Keyboard」ラインナップ一新 | 株式会社PFU

f:id:ShineSpark:20191227014056p:plain

HHKB公式サイト

制御キーの割り当てを変更できるDIPスイッチに加えて、「HYBRID Type-S」「HYBRID」は制御キーと文字キー全般(※)のキーマップをカスタマイズできる「キーマップ変更機能」を装備。 ソフトウェア(Windowsで動作)によるキーマップ変更は直感的で扱いやすく、設定はHHKB本体に保存されるため、他のデバイスでも同じキーマップで使用できます。 好みの反映、最速追求、タイピング競技やeスポーツのための最適化など、よりプロフェッショナルな“マイ・キーボード”の構築が可能です。 キーマップ変更ツールは無償でダウンロードいただけます。 ※特別な機能を割り当てられた一部のキーを除く。 Happy Hacking Keyboard | HHKB HYBRID Type-S | PFU

f:id:ShineSpark:20191227014341p:plain

「特別な機能を割り当てられた一部のキー」 とは

特別な機能を割り当てられた一部のキーを除くという表現がありましたが、modifireキーやSpace, Fnキーと私は読み違えてしまいました。

というか、QWERTYとはシェアは大きく差があるものの、DvorakWindowsmacOSUbuntuで標準サポートされている配列なので、新機能としてキーマップ変更機能をアピールするのであればDvorak配列ぐらいは考慮されているだろうと思っていました。

それでも、キーボード配列周りは何かとトラブルがありがちなので、念の為購入の際には確認しておこうと考え、ユーザーミートアップの際に直接スタップに確認することにしました。

HHKBユーザーミートアップ vol.3 にて

両サイトを一通り熟読の上で、発売日夜の HHKBユーザーミートアップ vol.3 | Peatix に参加しました。

HHKB HYBRIDの実機とキーマップツールが並んでおり、スタッフも常駐していたので、早速キーマップツールの仕様について「私はDvorak配列ユーザーなのですが、Fnレイヤーも含めて問題なくリマップできますか?具体的にリマップできないのはどのキーですか?」とスタッフに質問しました。

スタッフの方も具体的にどのキーがリマップできないかまでは把握していなかったようで、実際にツールをお試しくださいとデモPCがあるブースへ案内されました。
(Dvorak配列を普段使っていない方にとって私の質問に回答するのは難しいと思っているので、ここで具体的な回答がいただけなかったことは気にしていません。)

私はそこで幾つかのキーのリマップを試しました。
HHKB HYBRIDの実機が初めてお披露目された場なので、デモブースには沢山の人だかりがあったので、手早く気になるFnレイヤーのリマップの挙動だけ急いで確認しました。

30キーほどリマップすればこの問題に気付いたかもしれませんが、よもやDvorak時にリマップすることになるキーの内Q, X, Zキーに限りFnレイヤーをリマップできないとは知らなかったので、幾つかのキーでFnレイヤーも個別にリマップできることを確認したところですっかりすべてのキーでリマップできるだろうと思ってしまいました。

また、PFU公式のテキストではありませんが、発売日当日に公開されたITmediaのレビュー記事にはDvorak配列などを想定した機能だろうと書いてあったこともあり、まあリマップできるだろうと安心してしまいました。

www.itmedia.co.jp

購入後、いざ自宅ですべてのキーをリマップしようと試みた際にこの仕様に気付き、ハードウェアでDvorakに変更するデメリットが大きいので、あれこれ試行錯誤したものの今まで通りソフトウェア上でリマップするしかないとの結論に至りました。

元々Type Sを所有しており、ハードウェアでリマップする為に買い替えたようなものなので、この時の落胆は相当のものでした。

何故ハードウェアでキーマップ変更をしたいのか

キーマップを変更したいというユーザーは少数だと思うので、簡単に理由を述べてみようと思います。

QWERTY以外のキーマップ利用者にとっては、個人利用のPCは自分でキーマップを一度変更すればよいのですが、それ以外の環境ではOSやソフトウェアでキーマップを都度変更する必要があります。

それ以外の環境とは、私にとってはVirtualBoxAmazon WorkSpacesなどの仮想環境やiPadです。検証などで一時的に仮想環境を利用する際に環境単位でリマップするのが非常に手間です。
特にWindowsレジストリを書き換えるか何かしないとリマップできないので触ること自体が億劫だったり、ハードウェア上でリマップできるKinesisキーボードを利用したりしていました。

HHKBでもハードウェア上でキーマップ変更ができるようになることで、仮想環境でも同じ鞍を利用し続けられるようになるというのは非常に魅力的なアップデートだったのです。
それが実現できないと知ってしまった時の落胆は非常に大きいものでした。

PFUへ期待すること

個別にFnレイヤーをリマップできないキーを公式サイトにも明記して欲しい

「※特別な機能を割り当てられた一部のキーを除く。」 のような曖昧な表現でなく、最初からハッキリと

以下のキーも特殊な操作用に予約されているため、Fn押下時のキーの割り当てができません。
`Q`, `X`, `Z`, '左Ctrl', '右Shift'

と書いて欲しいです。

私はこの制限について、PFUのサポートセンターに問い合わせ回答を貰うまで知ることができませんでした。
サポートセンターの方からは、キーマップツールのヘルプ(ツールを起動し、右上の3つ点アイコンをクリックして表示されるメニュー内)にも記載があるとの案内もいただきましたが、

  • 公式サイト, 説明書にはリマップできないキーについて具体的な記述なし
  • 購入前にキーマップツールを起動してヘルプを読むという発想が困難
    • そもそも、キーマップツールはHHKB HYBRIDをUSB接続した状態でないとヘルプ画面に遷移できない

ので、購入前にこの制限に気付くということは不可能です。
HYBRID購入者で購入前にこの制限を知っていた方は居るのでしょうか?

もし購入前にこの情報を知っていたら、元々Type-Sを所有していたので私は購入を見送りました。
プロモーションとしては正しい表記かも知れませんが、買ってからリマップできないと気付いた時の落胆はユーザーの満足度を大きく損ねています。

ファームウェアアップデート、キーマップツールのアップデートでこれらのFn押下時のキーも任意にリマップできるようにして欲しい

一番求めているのはこれです。

キーボードへのこだわりが強いユーザーが多いことや、非常時にはUSB経由で初期化等ができれば充分だと思うので、制限を外して任意にリマップできるようにして欲しいです。

どうしても制御用のキーを配置する必要があるのであれば、ツール上で制御キーを必ず何かしらのキーにマッピングするまで書き込みできないUIにすればよいだけで、先述のキーにだけFn押下時もリマップできない制約をつける必要はないはずです。

過去にergodox-ezを利用していましたが、Layerごとに任意のキー配置ができるのが理想です。

Oryx: The ZSA Keyboard Configurator

キーマップ変更機能が不要なユーザーにとっては打鍵感もよく、ケーブルも無くなり、有事の際にはUSBハブなど無しで直接Type-CでMacBook Proと接続できるようになった最高のキーボードだと思います。

だからこそキーマップ変更だけ何とかしてください!お願いします!!

2019年にいっぱい買ったAnker製品のまとめとそのレビュー

今年になって在宅でリモートワークすることが増えて、それに伴ってパソコン周りの環境をAnker製品で買い揃えたので記録しておく。

Anker PowerPort

MagicTrackpad2, Kindle, iPadなどを充電したり、検証端末を充電したりに使う。

電源プラグでコンセントからの直給電のため、電力不足に悩まされることもない。

Anker 7-in-1 プレミアム USB-Cハブ

USB-CのみのMacBook Pro買い替えに伴い、USB-Cハブが必要だった為購入。

MacBook Pro用のUSBハブは乱立していてどれを買えばよいのか悩んだが、本体横に接続するタイプはどのメーカー製品も発熱が問題らしかった中、このUSB-Cハブは評判が良かったのでこれにした。

5-in-1や、3-in-1もあるが、値段がそれ程変わらないので7-in-1にした。

ほぼ1年利用したが、概ね満足している。

USB-Cポートx2が1つのみになる代わりに、有線イーサネットの別バージョンも販売されている模様。

Anker PowerWave 10 Stand

ワイヤレス充電器。3000円以下だったので試しに買ってみたら最高だった。

スマホを立て掛けるだけで充電されるので、ここ10数年間の毎日ケータイやスマホを有線で充電するという日課から解放された。 度々離席する際に、都度ケーブルを抜いて戻ってきたら挿し直すという手間が無くなることがこれ程便利とは使ってみるまで分からなかった。

これのお陰で出掛ける前に気付いたらバッテリーがきれそうで困った...みたいなことが一切なくなった。

Anker PowerCore 10000 Slim PD

以前持っていたモバイルバッテリーも殆ど使ってないのだが、大型台風が来るということで一応買ってみた。古いモバイルバッテリーはメルカリで1000円位で売れた。

以前のモバイルバッテリーよりは軽くて薄いのでカバンに常備して置いてもかさ張らない。

Anker Soundcore2

ふとPC用スピーカーが欲しくなり購入。
重低音がしっかり出るというレビュー通り、値段の割にはいい音が出る。

AUXは自動音量コントロールのせいか、うねるような音が流れると音量が変になるのでちょっと微妙。
Bluetooth接続は満足しているので、次があればよりスピーカーサイズの大きい上位機種を買ってもいいと思っているくらい。

Happy Hacking Keyboard をキーボードブリッジ無しでDIYで尊師スタイルにした

あらすじ

巷で尊師スタイルと呼ばれる、Macbook Proのキーボード上にHHKBを置いてトラックパッドはそのまま内蔵のものを利用する置き方でHHKBを使いたかった。

調べてみると、純正のキーボードブリッジがあるらしいのだが、クリア色は既に売り切れ・数倍の価格でマーケットプレイスで出回っている状況で、ホワイト色は多少在庫があるようだが、手元のMBPはスペースグレイなので色が合わない...

と悩んでいた所、ゴム板をHHKBの底に貼り付ける方法でDIYしている人が居たので自分も実践してみた。

sheklog.com

必要なもの

3×100×100mmのゴム板が売っているのでこれを購入。

光 ゴム板 100角×3mm KGR-3100

光 ゴム板 100角×3mm KGR-3100

  • メディア: Tools & Hardware

自分が買った時には61円。安すぎて申し訳なかったので他の商品も一緒に注文してしまった。

両面テープ

10mm幅が良い。

丸カッター

オルファ(OLFA) ロータリーカッターLL型 136B

オルファ(OLFA) ロータリーカッターLL型 136B

  • メディア: おもちゃ&ホビー

普通のカッターでも切れると思うけど、こっちの方がキレイに切れる。

カッターボード

カッターで切る時にテーブルを保護して傷つけないためのもの。
丸カッターとカッターボードは実は書籍を自炊する際に元々所有していたので、今回の経費は61円のみ。

DIY

あらかじめMacbook Proに HHKB を重ねて、どれくらいの幅のゴム板であればキーボードと重ならないか確認する。

自分が所有しているものはMacBook Pro (15-inch, 2018)だが、HHKBの両端に5mmずつゴム板を貼り付け、内蔵キーボードの上に載せたとしても内蔵キーボードのキーを押してしまうことがないことが確認できたので5mm幅のゴム板を両サイドに貼り付けることにした。

f:id:ShineSpark:20191015015426j:plain

10mm幅の両面テープを貼る。

f:id:ShineSpark:20191015015416j:plain

カッターでカットする。

f:id:ShineSpark:20191015015409j:plain

HHKBの裏に貼る。HHKBは110mmなので、100mmのゴム板で充分。誤って内蔵キーボードを打鍵しないように今回はできる限り端に貼り付けた。

f:id:ShineSpark:20191015015223p:plain

完成図。内蔵キーボードの真上に置いても内蔵キーボード側のキーが打鍵されることがなくなったので、これで出先でもMagic Trackpadを持ち歩くことなくHHKBを使うことができるようになった。

f:id:ShineSpark:20191015015846p:plain

接写したもの。3mmのゴム板によって内蔵キーボードのキーがHHKBの底面に触れることがないようになっていることが分かる。

当面これで使って見る予定。 ダメだったら両面テープを剥がせばいいだけなので気軽。

Vimでググったコマンド一覧

徐々に増える。

検索(ハイライト)した文字列をそのまま置換する

一度 /<search_word> または * でハイライトした状態で

:%s//<replace_word>/g

:%s/<search_word>/<replace_word>/g と同じ結果になる。

空行削除

:g/^$/d

3行以上の空行を2行空行に置換する

:%s/\n\{4,}/\r\r\r/ 

重複している行を削除

:sort u

検索文字列を含む行を削除

:g/search/d

または、一度 /search で検索して

:g//d

検索文字列を含まない行を削除

:v/search/d

または、一度 /search で検索して

:v//d

文字をn個挿入する

normalモードで 100i-
文字列も日本語も可能。

macOS で JMeter をインストールする 2019

あらすじ

macOS Mojave で JMeter をインストールしようと思ったが、インターネット上の情報は錯綜していたので最新のスムーズなインストール方法を残しておく。

現在の手軽な方法

$ brew cask install java
$ brew install jmeter

以下細かい記録

JMeterインストール

Homebrew に JMeter があるようだったのでそちらをインストールすることにした。

$ brew install jmeter
==> Downloading https://homebrew.bintray.com/bottles/jmeter-5.1.1.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/75/75fe29e4b60b96e881c3b64475d4f7fc268cd405e300b31f1aa3ce6cb26c4211?__gda__=exp=1570438461~hmac=9517ddefa9f0b663e575518e6da1acaf
######################################################################## 100.0%
==> Pouring jmeter-5.1.1.mojave.bottle.tar.gz
🍺  /usr/local/Cellar/jmeter/5.1.1: 2,492 files, 121.8MB

その後、 JMeter を起動しようとしたが、JAVA環境が必要だと怒られたので環境を構築することにした

$ jmeter
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

$ jmeter --request
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

JAVA環境構築

2019年現在、Oracle JDK 有償化に伴い、Oracle のサイトからダウンロードしようとすると Oracle のアカウント作成またはサインインを求められてしまうので、 Open JDK をインストールする。
Open JDKbrew cask でインストール可能。

$ brew cask install java
==> Satisfying dependencies
==> Downloading https://download.java.net/java/GA/jdk13/5b8a42f3905b406298b72d750b6919f6/33/GPL/openjdk-13_osx-x64_bin.tar.gz
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'java'.
==> Installing Cask java
==> Moving Generic Artifact 'jdk-13.jdk' to '/Library/Java/JavaVirtualMachines/openjdk-13.jdk'.
Password:
🍺  java was successfully installed!

これで JMeter が起動できるようになった。

$ jmeter
WARNING: package sun.awt.X11 not in java.desktop
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
   jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
   Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.bulenkov.darcula.DarculaLaf (file:/usr/local/Cellar/jmeter/5.1.1/libexec/lib/darcula.jar) to constructor com.apple.laf.AquaLookAndFeel()
WARNING: Please consider reporting this to the maintainers of com.bulenkov.darcula.DarculaLaf
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

f:id:ShineSpark:20191008003559p:plain
JMeterGUI

gitでググったコマンド一覧

これは何?

自分がgitであれをやりたい...と思ってググったコマンド一覧を備忘録として残した記事

ブランチ操作

今のブランチをmainに追従させる

$ git rebase -i origin/main

手元のブランチのHEAD, index, ワーキングツリーをremoteの状態で上書きする(手元のブランチの状態をリモートと同じ状態に戻す)

$ git reset --hard origin/main

コミット

直前のコミットに変更を追加する

$ git commit --amend --no-edit

1つ前のコミットに、特定の変更を追加できる。

add している状態で実行すれば、addされているものが追加されるし、

$ git commit --amend --no-edit <file>

とすれば、 を追加できる。

PR作成前の見直しで少しだけ修正が出てきた場合などに、知ってからはとてもよく使っている。

fixup!コメント付きでコミットする

$ git commit --fixup=@

このコマンドを実行すると、addしたものがfixup! コメント付けでコミットされる。

この状態で git rebase -i origin/main などを実行すると、最初から fixup 対象として扱われるので、fixupしたいコミットの次に並び替えるなどをしてfixupが実行できる。

用途としては、

  • 直前のコミットに組み込みたい場合
    • git commit --amend --no-edit
  • それ以前のコミットに組み込みたい場合
    • git commit --fixup=@ した後に git rebase -i origin/main

として使う。

コミットの修正

コミットした順序を入れ替える

$ git rebase -i @~5

並び替えて :wq

複数のコミットメッセージをまとめて修正する

$ git rebase -i @~5

編集したいコミットのpickをrにして:wq 個別に修正する

過去のコミットを分割する その1

分割したいcommitのidを <commit_id> とする

$ git rebase -i <commit_id>~

edit <commit_id> にして :wq で、修正対象のコミットまでHEADを戻す。
この時点では、作業ディレクトリは差分無しの状態だが、

$ git reset @~

をすると、分割したいコミットの差分対象のファイルがunstagingな状態に戻るので、個別にaddやcommitする。 分割コミットが終わったら

$ git rebase --continue

で完了。

過去のコミットを分割する その2

下記コマンドなどで分割したい対象のコミットを e して :wq

$ git rebase -i origin/main

すると、分割対象のコミットまでHEADが戻る。 この時点では、作業ディレクトリは差分無しの状態だが、

$ git reset @~

をすると、分割したいコミットの差分対象のファイルがunstagingな状態に戻るので、個別にaddやcommitする。 分割コミットが終わったら

$ git rebase --continue

で完了。

今のブランチのコミットをすべてコミットし直す

プルリクエストを作る際などに、コミットを綺麗に作り直したいケース。
コミットし直したいブランチをfeatureブランチとする。

まずmainブランチとの差分をすべてreset --softする

$ git reset --soft origin/main

すると、以下のようにfeatureブランチで加えたファイル差分がstageに上がったものの未コミットの状態に戻る。

一度すべてunstageに戻す。

$ git status
On branch feature
Your branch is behind 'origin/feature' by 4 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    new file:   ...
    modified:   ...
    modified:   ...
    modified:   ...

$ git restore --staged ./

すべてのファイルをunstageな状態に戻せば、そのブランチで行われたファイル差分はあるもののコミットはされていない状態に戻るので、改めて好きな粒度でコミットをしていけばOK.

$ git status
On branch feature
Your branch is behind 'origin/feature' by 4 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    new file:   ...
    modified:   ...
    modified:   ...
    modified:   ...

# 好きにコミットし直していく
$ git commit --message "..."

すべてコミットし直せたら、force pushする

$ git push --force

マージ

別ブランチのコミットの(無編集での)取り込み

dependabotのPRをまとめて取り込みたい時などに使う。

git merge --no-edit origin/branch-name

設定変更

単語単位でdiffを表示する

通常は行単位でしかdiffが表示されないが、単語単位でdiffを表示するには、.gitconfigにこう書く。

[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

lessのようにpager無しで標準出力したい場合には、 | less を外せばよい

git/contrib/diff-highlight at master · git/git · GitHub

branch をpagerとして出力するのを辞めたい

.gitconfigにこう書く。

[pager]
  branch = false

docker, docker-composeでググったコマンド一覧

これは何?

自分がdockerやdocker-composeであれをやりたい...と思ってググったコマンド一覧を備忘録として残した記事

docker

今起動しているコンテナをすべて止める

$ docker ps -q | xargs docker kill

以前restart=alwaysでdocker runしたコンテナを探す

$ docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always

以前restart=alwaysしたコンテナの自動再起動を止める

$ docker update --restart=no $CONTAINER_NAME

docker-compose

Docker実践ガイド 第2版 (impress top gear)

Docker実践ガイド 第2版 (impress top gear)