$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Karabinar-Elementsを使って特定のアプリケーションの時だけキーを入れ替える

IntelliJ IDEAを使っていて、バックスラッシュを入力したいのに円マークになって困っていた。また対応方法として、

あたりの記事も参考にしてみたが、これを有効にすると他のアプリケーションにまで波及してしまって、今度はEmacsでバックスラッシュが入力できなくなったりして困っていた*1


そんな時Karabinar-Elementsは特定のアプリケーションを起動時だけキーマップを変えられるという機能があることを発見した。これを使って解決してみたのでメモ。

Karabinar-Elements用のComplex Modifications用のjsonファイルを作成する

Karabinar-ElementsのComplex Modificationsを設定するには、定義を書いたjsonファイルを作成し、~/.config/karabiner/assets/complex_modifications/以下に配置すると良い。どのようにjsonファイルを書くかについてはhttps://pqrs.org/osx/karabiner/json.html が参考になる。また、https://github.com/pqrs-org/KE-complex_modifications/tree/master/docs/json あたりを参考にすると、いろんな参考例を探せて便利だった。

このjsonの設定でconditionsのfrontmost_application_ifという機能を利用することで、特定アプリケーションのときのみの変換ルールなどを書くことが出来る。

今回の場合IntelliJ IDEAでのみ円マークとバックスラッシュの入力を交換したかったので以下のような設定となった。


~/.config/karabiner/assets/complex_modifications/intellij-yen-mark.json

{
  "title": "Swap ¥ and \\ in IntelliJ IDEA on JIS Keyboards",
  "rules": [
    {
      "description": "Change ¥ to Alt+¥ in IntelliJ IDEA",
      "manipulators": [
        {
          "from": {
            "key_code": "international3"
          },
          "to": [
            {
              "key_code": "international3",
              "modifiers": [
                "option"
              ]
            }
          ],
          "type": "basic",
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.jetbrains\\.intellij\\.ce$"
              ]
            }
          ]
        }
      ]
    },
    {
      "description": "Change Alt+¥ to ¥ in IntelliJ IDEA",
      "manipulators": [
        {
          "from": {
            "key_code": "international3",
            "modifiers": {
              "mandatory": [
                "option"
              ]
            }
          },
          "to": [
            {
              "key_code": "international3"
            }
          ],
          "type": "basic",
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.jetbrains\\.intellij\\.ce$"
              ]
            }
          ]
        }
      ]
    }
  ]
}

Karabinar-Elementsで設定を有効にする

このようなjsonを正しく配置するとKarabinar-ElementsのComplex ModificationsのAdd rule内で定義したルールを使うことが出来るようになる。

f:id:shiba_yu36:20181212170147p:plain

あとはこの二つのルールをenableすればOK。これでIntelliJ IDEAでのみ円マークとバックスラッシュマークを入れ替えることが出来た。

より良い解決方法

やってみた後で気づいたのだけど、

  • 円マークとバックスラッシュの入れ替えはIME側で設定があり、それが有効になっていた
  • IntelliJ IDEAなどJetbrainのIDEでは、その設定が効かない

という話だったので、IME側の設定をオフにしKarabinarで全体を入れ替えで良いだけだった。まあKarabinar-Elementsで特定アプリケーションのみのキーバインド変更というテクニックが身についたので良いとする。

技術的Tips: 利用しているアプリケーションのBundle Identifierを調べるには

【OSX】利用しているアプリケーションのBundle Identifierを調べる - Qiita が参考になった。

まとめ

今回はKarabinar-Elementsを使って特定のアプリケーションの時だけキーを入れ替える方法についてメモをしてみた。最近のKarabinar-Elementsには他にもいろいろなカスタマイズ方法があるみたいなので試してみたい。

*1:いろいろ試した後になぜそうなっていたか気づき、より良い解決策はわかったけどその時は気づいてなかった

sbtでjava.lang.OutOfMemoryError: Metaspaceで死んだ時は

自分用の雑なメモ。正確性は不明。

原因

sbt -helpしてみると、sbtは-memのデフォルトが以下のように設定されている。

-mem    <integer>  set memory options (default: 1024, which is -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m)

ので、プロジェクトが大きくなってきてデフォルトの256mを超えるだけMetaspaceを使うと、死んでしまう様子。

対処

対応としては

  • 1. sbtの起動時にsbt -memオプション付きで起動する
  • 2. globalなsbtoptsに-memオプションを記述しておく
  • 3. プロジェクトルートに.sbtoptsファイルを置いて、そこで設定する

などの手がありそう。1や2の方法だと同じチームの人も困るだろうし、3の方法で設定するのが良さそうだ。

例えばこんな感じで.sbtoptsは設定しておくと良さそう。

.sbtopts

-J-Xms1024m
-J-Xmx4096m
-J-XX:ReservedCodeCacheSize=512m
-J-XX:MaxMetaspaceSize=1024m

意思決定の精度を上げるプロセスを知る - 「決定力!」を読んだ

最近いろんな種類の意思決定をする機会が増えてきた。そういう状況の中で精度の高い意思決定をするための良いプロセスがあるのか気になったので、「決定力!」という本を読んだ。

[asin:4152094036:detail]

この本は意思決定を行うためのプロセスと、それぞれの手順でどのような罠があるか、そしてその罠に打ち勝つためにどのようなテクニックがあるかについて教えてくれる。意思決定の「型」を知るために非常に参考になったので、どうすればより良い決断が出来るのかについて悩んでいるなら参考になると思う。自分にとっては非常に参考になった。


意思決定のプロセス、それぞれの罠、罠を回避するための考え方を簡単にまとめると

  • 選択肢を洗い出す、選択肢を分析する、選択する、選択の結果を受け入れるの順で決定していく。各段階での罠に注意。WRAPプロセスを使って回避する。
    • 選択肢を洗い出す: 「視野の狭窄」によって選択肢を見逃してしまう -> W 選択肢を広げる
    • 選択肢を分析する: 「確証バイアス」によって都合の良い情報ばかり集めてしまう -> R 仮説の現実性を確かめる
    • 選択する: 「一時的な感情」によって間違った選択をしがちになる -> A 決断の前に距離を置く
    • 選択の結果を受け入れる: 未来の出来事について「自信過剰」に陥りやすい -> P 誤りに備える

罠を回避する考え方である「選択肢を広げる」「仮説の現実性を確かめる」「決断の前に距離を置く」「誤りに備える」の具体的なテクニックについては書籍に様々なものが書いてあるので、興味がある人は読んでみると良いと思う。


そのほか印象に残ったことは以下の二点があった。

  • 正しい意思決定をするには反対意見を求める勇気が必要
    • 実際に意思決定のプロセスを開示して他の人に建設的な批判をもらうことで意思決定が洗練された経験があるので納得
    • 反対意見をいろいろ聞いていくのダメージはあるけど頑張ろう
  • 意思決定のときは「公正に決められた」と周りに感じさせるのが大事
    • そのためのテクニックとしては、相手の見解を相手より的確に言い直す、意思決定を擁護するのに自身の決定の欠点をあえて指摘するなどがある


この本で意思決定の「型」を知ることができたので、ひとまずその型に従って選択をしていきたいと思う。

読書ノート

* 意思決定は選択に直面する(選択肢を洗い出す)、選択肢を分析する、選択する、選択の結果を受け入れるの四段階で進められる。それぞれの段階で罠がある 459
    * 選択肢を洗い出す: 「視野の狭窄」によって選択肢を見逃してしまう
    * 選択肢を分析する: 「確証バイアス」によって都合の良い情報ばかり集めてしまう
    * 選択する: 「一時的な感情」によって間違った選択をしがちになる
    * 選択の結果を受け入れる: 未来の出来事について「自信過剰」に陥りやすい
* WRAPプロセスを使い、これらの罠を回避していく 548
    * 選択肢を洗い出す(視野の狭窄) -> W 選択肢を広げる
    * 選択肢を分析する(確証バイアス) -> R 仮説の現実性を確かめる
    * 選択する(一時的な感情) -> A 決断の前に距離を置く
    * 選択の結果を受け入れる(自信過剰) -> P 誤りに備える
* W: べきか否か形式の意思決定は失敗しやすい。これをアラームにする 835
* W: 意思決定のたびに「この選択をしたら何を諦める必要があるか」「同じ時間とお金で何ができるか」を自問し、費用を意識する 1007
* W: 今考えている選択肢がどれも選べないとすると他に何ができるかと自問する 1013
* W: いくつかの選択肢を同時に考慮する(マルチトラッキング) 1246
    * 例えば制度設計を一案ではなく二案出すだけでも違う
    * 順繰りに検討するのではなく並行に検討することに注意
* マルチトラッキングで意思決定の選択肢を一つ増やすと、3つの理由で意思決定の質があがる 1222、1255、1447
    * 風景理解、政治的いざこざ抑え、いざというときの代替案
* アイデアを順繰りに検討するのはマルチトラッキングではない 1434
* W: 自分で選択肢を思いつかなければ自分と同じ問題を解決した人を見つける。外部や組織の内部で探す 1496, 1590
* W: 問うべき疑問、参照すべき原則、検討すべきアイデアのように選択肢を広げる質問を持っておく 1652
    * 既存の支出を抑えるのではなく、予定していた支出を先送りにして、予算を削減できないか?予算を削減する代わりに未開拓の収入源を発掘できないか?など
* W: 今の分野で選択肢が広げられなければ、似たような別の分野に選択肢を求める 1778
* 選択肢の広げ方まとめ 1881
    * 選択肢の消去テスト
    * マルチトラッキング
    * 自分と同じ問題を解決している人を見つける(組織の内部、競合やベストプラクティス、類似の分野)
* R: 正しい意思決定をするには、反対意見を求める勇気が必要 1963 ☆
* R: その選択肢が駄目な理由ではなく、その選択肢が有効である条件は?という質問で仮説検証する 2090
* R: 同僚の言動がどんなに不愉快でも、善意でそうしていると仮定して意見を受け止め、耳を傾ける 2268
* R: 外部の視点を参考にする。自分と同じ状況では一般的にどのようなことが起こっているかを参考にする。レビュー、平均値、確率など基準値を考える。専門家に過去のことを聞く。 2776
    * R: それだけでなく現場に言って一次情報を受け取りニュアンスを知る
* R: 大きな決断をする前にはちょっとだけやってみる、ウーチングする。プロトタイピング的なもの 2837
    * 小さく始める、プロトタイピングする、実験する
* 確証バイアスに打ち勝つ3つの方法まとめ 3144
* A: この決断を10分後、10ヶ月後、10年後にそれぞれどう思うか考える 3281
* 単純接触効果と損失回避が紐付くと強力な現状維持バイアスがかかり、意思決定を阻害する。これにより現状をそのままにしてしまう 3410
* A: 親友が同じ状況にいるとしたらなんとアドバイスするか、で行き詰まりを回避 3523
* A: 核となる優先事項、つまり価値観を明らかにして、それに従うかを問い続ける。優先度以外を諦める 3915
* P: 未来を幅で捉え、最高の結果と最悪の結果の両方を考えておくことで、予測精度が上がる 4424
* P: 「次の条件を満たしたら行動を取る」のようなアラームで意思決定のタイミングにきづくきっかけを 4597
    * 一般の人々の10%が〇〇に不満を持っているというデータが出た時
* 集団の意思決定の改善まとめ 4859
    * 選択肢をもう一つ探す
    * 同じ問題を解決した人を探す
    * この選択肢が正解である条件はと問う
    * 小さく始める
    * 優先事項を明確化する
    * アラームをセットする
* 手続き的公正は意思決定に納得感を強める 4937 ☆
* 手続き的構成を感じさせるには、相手の見解を相手より的確に言い直す、意思決定を擁護するのに欠点を指摘する 4953
* マネジャーの自己批判は、不安よりも安心を生む 4970
* 集団の意思決定は公正と思われてなければならない。意見に耳を傾け話し合いをすることは時間はかかるが、実行はスムーズになる 5139