ErgoDoxEZはじめました
以前から分離キーボードが肩こり解消に良いと聞いていて試してみたかったところ、コロナ渦でずっと在宅で退屈なので買った。
きたきた。注文から2週間で到着。 pic.twitter.com/YfW1LpsA64
— 日向 徹 (@egapool) 2020年7月20日
ErgoDox EZ: An Incredible Mechanical Ergonomic Keyboard
買うまで
最初何を買ったらいいのかわからなかったので遊舎工房で実物みたり、キーボードのイベントに行ったりして物色していた。元々macbookproの打ち心地は気に入っていたのでそれに近いものが良く、helix picoのようなロープロファイルと呼ばれる高さの低いキーに目をつけていた。ただロープロファイルかつ分離のタイプは市販ではあまりなく自作するかなさそうだった。いきなり自作はハードル高いなということでまずはお手軽に分離キーボードを初められるErgodoxEZを購入した。
買ったもの
Customize your new keyboard | ErgoDox EZ
スペック
- 色:黒
- スイッチ:Cherry MX Silent Red
- Tilt kit:あり
- Wing rest:あり
- 背面グローあり
- かちゃかちゃうるさいのは好きじゃないので赤軸一択。さらに静かそうなSilent Redというのにした。
- helixとかで使われているロープロフィルが好みだけど、ErgodoxEZはCerry MX互換しか対応していない
- キートップを光らせたかったけど、MX Silent Redだと対応していないみたいなので諦めた
キースイッチの種類ごとの説明についてはこちら
メカニカルキースイッチの好みの話 - 自作キーボード温泉街の歩き方
セットアップ
まずはここを見ながら色々セットアップ
Getting Started With Your New ErgoDox EZ | ErgoDox EZ
- Live Trainingというページを用意してくれているのでこちらで、練習 Live Training: Your Layout, in Real Time | The Ergo
- 一般的なタイピングの練習
- Typing Test · Improve your WPM speed
- なにやら苦手なキーとかの傾向を分析してくれそうな雰囲気
- コードに特化したタイピングの練習
キー配列
qmk_firmware/keymap.c at master · egapool/qmk_firmware
- 基本はMBP SJIS配列に近いものからスタート
- まだレイヤーを使いこなせてない。
- キー配列参考
初めの感想
- 確かに肩は開くが肩こりが緩和されている感じはしない
- むしろ慣れてないせいか、腕全体に緊張感がある気がする
- キー配列カスタマイズは楽しい
- キーキャップとか色々買いたくなる
- タイピングが慣れない
- キー配置が格子状になっているので、今までと少し指の運びの角度が変わる。ほとんどのキーで影響していないのだけど、自分の場合はC,V,Bあたりをめちゃくちゃ打ちそこねる。
- (2週間後の感想)文章を打つタイピングはだいぶ慣れてきた。が、記号系がまだもたつく
- 大きいから指を大きく伸ばさないと行けない。と思っていたが本当にそうか?と思い測ってみたら当然だけどキーの組み合わせによってmacbookproと変わらなものと変わるものがある。
- JとUの距離はどちらもほぼ20mm
- MBPに比べてNの行が左にずれてUの行が右ずれることで格子になっている。その結果例えば「に」を打つときの指の間隔が大きくなる
- やはりロープロファイルがいいなぁという感想
静的ファイルのキャッシュコントロールについて ISUCON7
※以前掲載していたブログが消えたので再掲です。
今回初めてISUCON7に参加させていただきました。(チーム名:元pyns)
今回のお題の一つ目の壁は、いかに画像ファイル(アバターアイコン)をキャッシュさせてサーバーからデータを返さないようにするかでした。
8時間の大部分をこの対応に費やしましたが解決は出来ませんでした。
原因はきっちり304を返すための基礎知識が足りていなかったことです。
ですのでこれを機に勉強しなおしてみました。
304 (Not Modified)
大前提ですが、304ステータスコードは
キャッシュの有効無効の確認付きリクエストに対して、有効である場合に返すステータスコード
です。
この場合サーバーはリソースデータ(ペイロード)を送信しません。
すなわち,サーバは、[ クライアントに格納済みの その表現を 200 (OK) 応答のペイロードであったかのように,用立ててもらう ]べく,クライアントをリダイレクトしている。
訳が険しいですが意味は十分わかると思います。
静的ファイルをキャッシュさせようとする場合、適切に304を返すことが重要になります。(isucon開始前の自分に言ってます)
HTTPのキャッシュに関係するヘッダ
キャッシュの振る舞いを制御するためのレスポンスヘッダにはこれらがあります。
- Cache-Control
- Expires
- ETag
- Last-Modified
Cache-Control
Cache-Controlはレスポンス/リクエストに対してキャッシュのふるまいを制御するための指示を指定するために利用されます。
レスポンスのCache-Controlに指定できるディレクティブはこれらです。
ディレクティブ | 意味 |
---|---|
must-revalidate | 期限切れのキャッシュに対してオリジンサーバーで現在でも有効かどうか確認しなければキャッシュとして使用できないことを指示する |
no-cache | キャッシュはさせるが、オリジンサーバーに現在でも有効かどうか確認しなければキャッシュとして使用できないことを指示する。 確認方法にはIf-None-Match またはIf-Modified-Since を用います。いかにも「キャッシュするな」ぽいのがややこしい |
no-store | リクエストもレスポンスも一切キャッシュしてはいけないことを指示する |
no-transform | 中継者(CDN,プロキシなど)に対してメディアの形式変換を禁止する |
public | 共有キャッシュに保持して良いことを指示する |
private | 単独の利用者の使用が意図されているものであり、共有キャッシュに格納されてはならいことを指示する |
proxy-revalidate | must-revalidateの中間キャッシュに対するもの |
max-age | 指定した時間を過ぎるとfreshではないとみなすことを指示する1分キャッシュの例:Cache-Control: max-age=60 |
s-maxage | max-ageがクライアントに対しての有効期限であるのに対して、こちらは共有キャッシュに対しての有効期限。max-age,s-maxage両方セットされている場合は、共有キャッシュに関してはs-maxageを上書きする |
静的コンテンツをキャッシュさせる場合はmax-ageとpublicに着目
max-age
max-ageが1以上の場合、その秒数クライアントはリクエストを行いません。
public
共有キャッシュに保持しても良いということですが、共有キャッシュとは複数のユーザーが通る中間点のことで、例えばCDNやプロキシなどです。
publicを指定するとこの図の左下の状態になります。
今回のisucon7では、publicを指定すると点数が跳ね上がったみたいですのでチェッカークライアントとサーバーの間に何かしらキャッシュ機構があったということでしょうか。
でもこれはpublicにして点数が上がること以外にどうやって察知したら良かったのでしょうか・・💧
チェッカーから直接飛んで来ていない可能性については微塵も思いつきませんでした・・w
Expires
意味的にはCache-Control max-age
と同じです。
ヘッダの記載の例はこうなります。
Expires: Thu, 01 Dec 1994 16:00:00 GMT
時刻が無効なフォーマットの場合はゼロ、つまりキャッシュの有効期間切れと判断します。
Cache-Control max-age
と同時に指定されている場合、クライアントはExpiresヘッダを無視します。
HTTP1.0時代の名残のようです。
Etag
めずらしくwikiの説明がわかりやすいのでwikiを見ていただければ良いのですが
HTTP ETag – Wikipedia
かいつまむと、リソースに対してフィンガープリントのような識別子を生成し、それをサーバー・クライアント間で連絡し合うことでリソースが変更されたかどうか検知させます。
レスポンスヘッダにEtagが含まれているとクライアントは次回のリクエストからヘッダにIf-None-Match
をつけます。
If-None-Match
を受けたサーバーは識別子が同一であれば304を返します。
異なれば新しいリソースとともに新しいEtag
ヘッダを返します。
レスポンスヘッダの例
ETag: "686897696a7c876b7e"←識別子
リクエストヘッダの例
If-None-Match: "686897696a7c876b7e"←識別子
識別子の生成ルール
またHTTPにおいて、Etagの識別子の生成に決まりはありません。
nginxでは[mtime size]を使って生成します。
etag生成箇所のソースを貼っつけてくれている方がいました。
Algorithm behind nginx etag generation - Server Fault
apacheではデフォルトで[inode mtime size]を使って生成します。
#FileETag Apache HTTP サーバ バージョン 2.4
httpd.confで以下のように指定することで変更できます。
//最終更新時刻とファイルサイズでEtagを生成 FileETag MTime Size // 生成しない FileEtag None
配信サーバーが2台以上ある場合
同一のコンテンツを配信するサーバーが2台以上ある場合は、気をつけないとEtagによるキャッシュ制御が意図したものになりません。 apacheのデフォルトではinodeを用いているので仮にファイルのmtimeとsizeが同じでもサーバーが違えばinodeが異なります。 またinodeを無視しても、mtimeがずれていると異なるEtagになるのでそれぞれ別でキャッシュしてしまいます。
Last-Modified
このヘッダはリソースの更新時刻をクライアントに返し、次回アクセス時にクライアントからその更新時刻を送信させます。 一致していれば304を返し、一致していなければ新しい(バージョンの)リソースと更新時刻を返します。
レスポンスヘッダの例
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
リクエストヘッダの例
If-Modified-Since: Tue, 15 Nov 1994 12:45:26 GMT
配信サーバーが2台以上ある場合 こちらもEtag同様で同じファイルでもサーバー間で更新時刻がずれていると個別でキャッシュされて非効率になります。
まとめ
ISUCON最高でした! 運営の皆さんにはこんな貴重な機会を提供していただき感謝しております。
参考
- RFC 7234 — HTTP/1.1: Caching (日本語訳)
- HTTP キャッシュ - HTTP | MDN
- HTTPヘッダーフィールド2 – s-kitaの日記
- CDN切り替え作業における、Web版メルカリの個人情報流出の原因につきまして - Mercari Engineering Blog
- Cache-Control: no-transform で各種メディアの変換(再圧縮等)を防ぐ
- クラウド環境でのApacheの設定 | cloudrop
vim × tmux環境を整える1
vim × tmux環境を整える1
この記事の結果
twitterでこの動画をみかけて以前からやってみたかったvim × tmux環境に移行チャレンジ
とりあえずできるだけコピーしてみて、そこから自分にあうようにアレンジしてみる
現在の環境
不満点
- 複数エディタを行ったり来たりでスイッチングコストがめんどくさい
- キーバインディングを統一するのも限界がある
- 今後新たな言語で開発するときにまたそのため適したIDEの扱いを覚えるのが嫌
- エディタと同じウィンドウでターミナルを扱いたい
- PHPStormもVSCodeもできるけどパネルの位置、大きさをカスタムしにくいのが不満
tmux
tmuxインストール
macはかんたん
$ brew install tmux
触ってみる
さっそく~/bin/ide
としてコマンドを作成
#!/bin/bash tmux split-window -v -p 30 tmux split-window -h -p 66 tmux split-window -h -p 50
また、.tmux.conf
にキーバインド等を設定してペインを移動できるように
動画ではプレフィックスをTにしていたけど、僕には遠いような気がしてとりあえずQでやってみる
set-option -g prefix C-q unbinde C-b bind -r k select-pane -U bind -r j select-pane -D bind -r h select-pane -L bind -r l select-pane -R
.tmux.confの再読み込み
しかしキーバインドが全然かわらない。iTermごと再起動しても変わらない。何かconfigを読み込ますお作法があるのかと調べたらreloadする方法を見つけた
$ tmux source path/to/.tmux.conf
ターミナル起動時にtmuxも起動
# 初回シェル時のみ tmux実行 if [ $SHLVL = 1 ]; then tmux fi
vim
プラグイン
vim-pluginでunite,VimFilerをいれる。vimを起動して:PlugInstall
でインストール開始
"""""""""""""""""""""""""""""" " プラグインのセットアップ """""""""""""""""""""""""""""" call plug#begin('~/.vim/plugged') " ファイルオープンを便利に Plug 'Shougo/unite.vim' Plug 'Shougo/vimfiler' Plug 'Shougo/vimproc' " Unite.vimで最近使ったファイルを表示できるようにする Plug 'Shougo/neomru.vim' call plug#end() """"""""""""""""""""""""""""""
.vimrc.keymap
この設定でvim内で分割と移動がめちゃくちゃ楽になりました。
sf
でVimFilerを起動できようにした。
" Split window nmap ss :split<Return><C-w>w nmap sv :vsplit<Return><C-w>w " Move window nmap <Space> <C-w>w map s<left> <C-w>h map s<up> <C-w>k map s<down> <C-w>j map s<right> <C-w>l map sh <C-w>h map sk <C-w>k map sj <C-w>j map sl <C-w>l " Resize window nmap <C-w><left> <C-w>< nmap <C-w><right> <C-w>> nmap <C-w><up> <C-w>+ nmap <C-w><down> <C-w>- " VimFiler nmap sf :VimFilerBufferDir<Return> nmap sF :VimFilerExplorer -find<Return> nmap sb :Unite buffer<Return> let g:vimfiler_as_default_explorer = 1 let g:vimfiler_safe_mode_by_default = 0 let g:vimfiler_enable_auto_cd = 0 let g:vimfiler_tree_leaf_icon = '' let g:vimfiler_tree_opened_icon = '▾' let g:vimfiler_tree_closed_icon = '▸' let g:vimfiler_marked_file_icon = '✓'
vimのタブ
これでvim内でタブを開く
" Open current directory nmap te :tabedit " List tabs nmap tl :Unite tab
vimprocの導入
vimのプロセスを非同期で実行させられるプラグイン
vimproc - neovim/vim入門
pluginとしてinstallしたあと、コンパイルしないといけない
$ cd ~/.vim/plugged/vimproc $ make -f make_mac.mak
縦のカーソル移動が重い
調べたらカーソル行のハイライトが重いとあったので無効にしたらすこし軽くなった(ついでに行の相対表示も)
:set nocursorline :set norelativenumber
リンク
- vimfilerとUniteでVimをファイラとして使用する方法 – karakaram-blog
- vimfilerのコマンド集
ここまで最大の悩み
tmuxの同一ペインないでvimを縦スプリットしたら上下移動(jk)のレンダリングがめちゃくちゃ重い!使い物にならないレベル
次回以降
- シェルをfishにしないとしまらない感
- テーマをいれて雰囲気作り
- リピートキーの発動制限時間が短すぎる?
- クリップボードとヤンクを共有したい
MacOS MojaveでSequel Proのタブをテスト版を使わずに閉じる方法
macOSをMojaveにアップデートすると、Sequel Pro のタブを普通に閉じるとクラッシュして落ちてしまいます。
クラッシュさせずに閉じるには?
タブをドラッグして位置を移動させた後だと消してもクラッシュしません。
既知の解決策
「Sequel pro 落ちる」で検索すると同様の報告が見つかります。
言及されている解決策としては、既存のアプリをアンインストールしてからテスト版をビルドするとOKとのことですがめんどくさいですよね。
いずれアップデートされると思いますが、それまではタブ移動でしのごうと思います。
2018年振り返り
個人的備忘のために2018年のメモ
前半
- 7月まで大阪で個人事業として仕事をしてた
- 去年からの続きでウェブプログラミングの塾を運営していて対面&リモートで生徒を教えていた。今の日本で初心者がWebプログラマーになる道はほぼ確立されていると思っていて、やれば誰でもできるはずだったんだけど意外と誰にでもできることじゃないのかもしれないなぁと思った年でした。逆に勝手にできるやつはレア物の可能性があるので後輩として入ってきた場合は大事にせねばと思った次第。
- 色んな現場で開発の仕事をした。去年までずっと一つのところで開発していたのでいろいろ見て回るのは勉強になった。最後の方は3社フルリモート掛け持ちだったけど、僕にとっては結構辛かった。曜日ごとのスイッチングコストが辛いのと、あらためて僕は一つのプロジェクトをじっくりやりたい派だということがわかった。
ブロックチェーン関連
- @mazarimonoさん, @s_isssy, @niwatakoさんに誘われて京都でブロックチェーン技術に関する勉強会をやっていた
- 毎回座談会のような雰囲気で詳しい人もそうでない人も議論に参加できてとても良い雰囲気だった
- 一応主催の一人だったけど主催らしいことは何もせずとりあえず毎回発表してたくらいだった。
- @s_isssyとMasteringBitcoinの輪読会をやっていた。交代で1章ずつ要点をブログにまとめて説明しあうスタイル。blockchaiの基礎技術がわりと詳しめに身についたと思う
- yenomさん主催のbitcoinハッカソン#1 にソロ参加した。初めてのハッカソン参加でいろいろズタボロだった。コードを書き始めたのが成果発表2時間とかでなんかなめてた
- 今井さん主催のLightningNetworkハッカソンにソロ参加した。チームに僕以外エンジニアがいなくてうっひょ〜ってなったけどまぁギリギリ動くものが出来てよかった。
- ハッカソンはチーム参加できる場合は予めチーム組んで参加するのがよいなと思った。
- ビットコインとか勉強会で登壇した。テーマはオフチェーン入門。5〜60人くらい参加者がいてその規模を前に話すのは初めてだったのでかなり緊張した。最初10分くらい息吸えてなかった。吸えてないのなぜ喋れたのかよくわからない。
- 個人的にはbitcoinフルノード立てたり、LightningNetworkノード立てたりしていた。
- 2018年後半はブロックチェーン関連技術のインプットをあまりしなかったのが反省点。この業界は激流なので歩みを止めた時点で死んでいくところ。
仕事
- 8月から株式会社AerialPartnersで働いている。仮想通貨と税が絡む問題の解決を得意としているチームで、今実際にみんなが抱えている問題を解決しにいっているところが良いなと思って入社した。
- 主な仕事は仮想通貨売買損益計算ツールGtaxの開発・運用をしている。
- スタートアップに加わるのは初めてなので自分がどこまで価値を発揮できるか楽しみ
- この業界は、ベースのブロックチェーン技術も進化中だしそれに追随して法律も変わっていくし色んなことをやり始めるプレイヤーがどんどん増えていくしでかなりてんやわんやしている。
キャンプ
2018年は年間通してかなりキャンプにいった。ゆるキャンが発端。今年もめちゃくちゃ行くと思う。だいたい仕事もプライベートもPC漬けだからキャンプはいい気晴らしになる。
住居
7月末にまた大阪から東京に引越した。部屋のコンセプトはミーティングルーム。でっかいホワイトボードを買おうか迷っている。
台湾
家族旅行で台湾に行った。一部ほぼ日本と変わらないところはありつつも全体としてはまだ発展途上という感じでこれから都市が変わっていく体験は日本にいたら味わえないなと思った。日本はもう小奇麗になりすぎてしまった。食べ物も美味しいしかなり日本語通じるし時差も1時間なので台湾でリモートで日本の仕事やるものあり。
英語
12月に会社でTOIEC試験(IP)が行われて初めて受けた。445点。クリプト業界でこの英語力はクソ雑魚レベルなのでなんとかせねばという気持ち
牡蠣
体調悪い時に生はやばい