2019/10/20

DefaultKeyBinding.dict を編集して ^; を入力しても beep が鳴らないようにする

私が作業する時は Terminal.app + tmux + neovim の時が多いです。
beep 音はあまり鳴って欲しくないので neovim と Terminal の beep setting は全て off 。
それでも稀に beep 音が鳴ってしまう。しかし、稀すぎて再現できず。
が、最近再現できたので、それに対処したログを残しておきます。


環境

  • OS: macOS Mojave 10.14.6


beep が鳴る原因

『^;(control + ';')』を入力した際に beep が鳴ることを見付けました。
Terminal.app に限らず Safari といった他の Application でも鳴るので、macOS 側の設定のようです。


対応: DefaultKeybinding.dict

OSX 時代から DefaultKeybinding.dict という物があって、それで keymap を設定できるようです。
参考のリンクで一番古いのは2010年とか。そのくらい前から存在しているらしい。
最終的には ~/Library/KeyBindings/DefaultKeyBinding.dict に

だけ記述。
一度 Application を落として ^; を入力しても何も鳴らない。よし。


寄り道

  • 'noop:' を設定してはダメなのか
    • 設定してみたこともあります。が、どうも『noop: だから beep が鳴る』みたいです。
    • DefaultKeyBinding.dict 自体始めて触るので、まず map ができているか怪しかった。
    • 一度「特定の文字を insert する」ように map して、DefaultKeyBinding.dict が有効な事を確認。
    • それから「空の文字列を insert する」ことで beep を抑えている状態です。
  • 他の組み合せでは beep は鳴らないのか
    • 'noop:' の物は基本鳴ります。
    • なので control + 記号 とかは beep 祭りです。
    • 全組み合せを設定しても良いのですが、特に鳴りまくる物を見付けたら設定していこうかと。
    • Keyboard 側の Setting でそもそも beep が鳴らないようにするのがベストな気がします。
      • が、Input Method "ASCII" には 設定項目が存在せず、 AquaSKK にも無い。
    • ので keymap でアドホックに回避してる状態です。
  • macOS 側の KeyBinding と衝突した場合はどうなるのか
    • macOS 側の設定が優先されました。
  • system-wide の key binding とか参考にならなかったのか
    • /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict ですね。
    • Property List Editor で開けると記述されているが、そんな Application は存在せず。
    • .plist を開ける XCode で開こうと試す。
    • 追加コンポーネントをダウンロードし始めたので、開けるかも、と期待。
    • で、ダウンロードしても開けず。えー。
  • 最終的に私自身の dot_files に入れることにしました。
    • .config/nvim/init.vim といったファイルは symlink で設定を配置しています。
    • が、DefaultKeyBinding.dict は symlink を follow してくれない。
    • ので cp することで対応しています。


参考

2019/10/12

.dockerignore を記述して Docker の image build を高速化する

docker image の build が作業をする毎に重くなる時があります。
今回のケースはカレントディレクトリのサイズが作業ごとに大きくなっていく場合。
その場合は .dockerignore を記述することで解決できます。


環境

  • OS: macOS Mojave 10.14.6
  • Docker: version 19.03.2, build 6a30dfc


具体例

例えば、以下のように image の build を実行したとします。
  • $ docker build -t hoge .
その際、`Sending build context to Docker daemon ...` と長く表示されることがあります。

Docker は image の build 時、指定された directory (今回は ".") のファイルを serialize して daemon に送ります。
このコマンドだと . のサイズが大きいと送信に時間がかかってしまいます。

確かこの時の curerent directory のサイズは2GB程度で、ビルド時間は 100 秒ほどでした。


.dockerignore を記述する

.gitignore のように .dockerignore を directory に配置します。
そして build に関係無いファイルを .dockerignore に記述すると、daemon に送る context から外すことが可能です。
例えば .git など、 docker image に含めることは無さそうなファイルやディレクトリを記述します。
また、git clean などで不要なファイルを消してしまうのも選択肢に入ります。

私の例では.dokerignore を記述した結果 context のサイズが 100MB 以下になり、ビルド時間も20秒以下になりました。
めでたしめでたし。



参考

2019/10/06

q を使って CSV ファイルに SQL を発行する

"q" という、CSV や TSV に SQL をに発行できるコマンドがあります。
便利なのですが、名前がググりづらいことこの上無い感じですね。


環境

  • OS: macOS Mojave 10.14.6
  • Homebrew: 2.1.12-8-gfd9a09e
    • homebrew-core: (git revision 5b99; last commit 2019-10-05)
  • q: 1.7.4


インストール方法

  • $ brew install q
でインストールできます。


実行例

例えば、以下のような "servant.csv" があったとして


以下のように SQL が発行できます。
  • select
    • $ q -d, -H 'select * from servant.csv ;'
      • 1,Altria Pendragon,saver,5
      • 2,Altria Pendragon (alter),saver,4
      • 3,Altria Pendragon,archer,5
      • 4,Altria Pendragon,lancer,5
      • 5,Altria Pendragon (alter),lancer,4
  • count
    • $ q -d, -H 'select count(*) from servant.csv ;'
      • 5
  • limit
    • $ q -d, -H 'select * from servant.csv limit 2;'
      •  1,Altria Pendragon,saver,5
      •  2,Altria Pendragon (alter),saver,4
  • distinct
    • $ q -d, -H 'select distinct(name) from servant.csv ;'
      •  Altria Pendragon
      •  Altria Pendragon (alter)
  • where
    •  $ q -d, -H 'select id,name,class from servant.csv where rarity = 5;'
      •  1,Altria Pendragon,saver
      •  3,Altria Pendragon,archer
      •  4,Altria Pendragon,lancer
  • order 
    • $ q -d, -H 'select * from servant.csv order by rarity;'
      •  2,Altria Pendragon (alter),saver,4
      •  5,Altria Pendragon (alter),lancer,4
      •  1,Altria Pendragon,saver,5
      •  3,Altria Pendragon,archer,5
      •  4,Altria Pendragon,lancer,5
  • distinct + count
    •  $ q -d, -H 'select count(distinct(name)) from servant.csv ;'
      •  2
なお、付けているオプションは
  • -d (--delimiter) 今回は csv なので  ','  が delimiter です。
  • -H (--skip-header) 今回は一行目に header があるので、それは値としてみなしません。
    • と、いうことは header が無い場合も想定していると思われます(やったこと無し)。
です。--help は貴重な情報源。


まとめ

と、いう感じで、"q" を使うと CSV を色々いじったりできて便利です。
ちなみに、 Office で開くと重かったり止まったりするサイズの csv でも捌いてくれます。つよい。


参考