バカンス駆動開発

この前バカンスって言ったら「古っ」って言われました

ErgoDoxEZはじめました

以前から分離キーボードが肩こり解消に良いと聞いていて試してみたかったところ、コロナ渦でずっと在宅で退屈なので買った。

ErgoDox EZ: An Incredible Mechanical Ergonomic Keyboard

f:id:egapool:20200724011626j:plain f:id:egapool:20200807000702p:plain

買うまで

最初何を買ったらいいのかわからなかったので遊舎工房で実物みたり、キーボードのイベントに行ったりして物色していた。元々macbookproの打ち心地は気に入っていたのでそれに近いものが良く、helix picoのようなロープロファイルと呼ばれる高さの低いキーに目をつけていた。ただロープロファイルかつ分離のタイプは市販ではあまりなく自作するかなさそうだった。いきなり自作はハードル高いなということでまずはお手軽に分離キーボードを初められるErgodoxEZを購入した。

買ったもの

f:id:egapool:20200807000014p:plain

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

キー配列

qmk_firmware/keymap.c at master · egapool/qmk_firmware

Basic Keycodes - QMK

初めの感想

  • 確かに肩は開くが肩こりが緩和されている感じはしない
    • むしろ慣れてないせいか、腕全体に緊張感がある気がする
  • キー配列カスタマイズは楽しい
  • キーキャップとか色々買いたくなる
  • タイピングが慣れない
    • キー配置が格子状になっているので、今までと少し指の運びの角度が変わる。ほとんどのキーで影響していないのだけど、自分の場合はC,V,Bあたりをめちゃくちゃ打ちそこねる。
    • (2週間後の感想)文章を打つタイピングはだいぶ慣れてきた。が、記号系がまだもたつく
  • 大きいから指を大きく伸ばさないと行けない。と思っていたが本当にそうか?と思い測ってみたら当然だけどキーの組み合わせによってmacbookproと変わらなものと変わるものがある。
    • JとUの距離はどちらもほぼ20mm
    • MBPに比べてNの行が左にずれてUの行が右ずれることで格子になっている。その結果例えば「に」を打つときの指の間隔が大きくなる
  • やはりロープロファイルがいいなぁという感想

静的ファイルのキャッシュコントロールについて ISUCON7

※以前掲載していたブログが消えたので再掲です。

@egapoolです。今回初めてISUCON7に参加させていただきました。(チーム名:元pyns)
当日やったこととこかはこちらにまとめています。
ISUCON7に参加して予選突破しませんでした。 – そろそろちゃんとやります

今回のお題の一つ目の壁は、いかに画像ファイル(アバターアイコン)をキャッシュさせてサーバーからデータを返さないようにするかでした。
8時間の大部分をこの対応に費やしましたが解決は出来ませんでした。
原因はきっちり304を返すための基礎知識が足りていなかったことです。
ですのでこれを機に勉強しなおしてみました。

304 (Not Modified)

大前提ですが、304ステータスコードは キャッシュの有効無効の確認付きリクエストに対して、有効である場合に返すステータスコード です。
この場合サーバーはリソースデータ(ペイロード)を送信しません。

すなわち,サーバは、[ クライアントに格納済みの その表現を 200 (OK) 応答のペイロードであったかのように,用立ててもらう ]べく,クライアントをリダイレクトしている。

RFC 7232 — HTTP/1.1: Conditional Requests(日本語訳)

訳が険しいですが意味は十分わかると思います。
静的ファイルをキャッシュさせようとする場合、適切に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を指定するとこの図の左下の状態になります。

f:id:egapool:20200404140553p:plain HTTP キャッシュ - HTTP | MDN から

今回の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最高でした! 運営の皆さんにはこんな貴重な機会を提供していただき感謝しております。

参考

vim × tmux環境を整える1

vim × tmux環境を整える1

この記事の結果

f:id:egapool:20190728183857g:plain

twitterでこの動画をみかけて以前からやってみたかったvim × tmux環境に移行チャレンジ
とりあえずできるだけコピーしてみて、そこから自分にあうようにアレンジしてみる

www.youtube.com

現在の環境

不満点

  • 複数エディタを行ったり来たりでスイッチングコストがめんどくさい
  • 今後新たな言語で開発するときにまたそのため適した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

リンク

ここまで最大の悩み

tmuxの同一ペインないでvimを縦スプリットしたら上下移動(jk)のレンダリングがめちゃくちゃ重い!使い物にならないレベル

次回以降

  • シェルをfishにしないとしまらない感
    • テーマをいれて雰囲気作り
  • リピートキーの発動制限時間が短すぎる?
  • クリップボードとヤンクを共有したい

#開発環境 #vim #tmux

MacOS MojaveでSequel Proのタブをテスト版を使わずに閉じる方法

macOSをMojaveにアップデートすると、Sequel Pro のタブを普通に閉じるとクラッシュして落ちてしまいます。

クラッシュさせずに閉じるには?

タブをドラッグして位置を移動させた後だと消してもクラッシュしません。

既知の解決策

「Sequel pro 落ちる」で検索すると同様の報告が見つかります。

f:id:egapool:20190612140208p:plain

言及されている解決策としては、既存のアプリをアンインストールしてからテスト版をビルドするとOKとのことですがめんどくさいですよね。

いずれアップデートされると思いますが、それまではタブ移動でしのごうと思います。

2018年振り返り

個人的備忘のために2018年のメモ

前半

  • 7月まで大阪で個人事業として仕事をしてた
  • 去年からの続きでウェブプログラミングの塾を運営していて対面&リモートで生徒を教えていた。今の日本で初心者がWebプログラマーになる道はほぼ確立されていると思っていて、やれば誰でもできるはずだったんだけど意外と誰にでもできることじゃないのかもしれないなぁと思った年でした。逆に勝手にできるやつはレア物の可能性があるので後輩として入ってきた場合は大事にせねばと思った次第。
  • 色んな現場で開発の仕事をした。去年までずっと一つのところで開発していたのでいろいろ見て回るのは勉強になった。最後の方は3社フルリモート掛け持ちだったけど、僕にとっては結構辛かった。曜日ごとのスイッチングコストが辛いのと、あらためて僕は一つのプロジェクトをじっくりやりたい派だということがわかった。

ブロックチェーン関連

仕事

  • 8月から株式会社AerialPartnersで働いている。仮想通貨と税が絡む問題の解決を得意としているチームで、今実際にみんなが抱えている問題を解決しにいっているところが良いなと思って入社した。
  • 主な仕事は仮想通貨売買損益計算ツールGtaxの開発・運用をしている。
  • スタートアップに加わるのは初めてなので自分がどこまで価値を発揮できるか楽しみ
  • この業界は、ベースのブロックチェーン技術も進化中だしそれに追随して法律も変わっていくし色んなことをやり始めるプレイヤーがどんどん増えていくしでかなりてんやわんやしている。

キャンプ

2018年は年間通してかなりキャンプにいった。ゆるキャンが発端。今年もめちゃくちゃ行くと思う。だいたい仕事もプライベートもPC漬けだからキャンプはいい気晴らしになる。

住居

7月末にまた大阪から東京に引越した。部屋のコンセプトはミーティングルーム。でっかいホワイトボードを買おうか迷っている。

台湾

家族旅行で台湾に行った。一部ほぼ日本と変わらないところはありつつも全体としてはまだ発展途上という感じでこれから都市が変わっていく体験は日本にいたら味わえないなと思った。日本はもう小奇麗になりすぎてしまった。食べ物も美味しいしかなり日本語通じるし時差も1時間なので台湾でリモートで日本の仕事やるものあり。

英語

12月に会社でTOIEC試験(IP)が行われて初めて受けた。445点。クリプト業界でこの英語力はクソ雑魚レベルなのでなんとかせねばという気持ち

牡蠣

体調悪い時に生はやばい