hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

友達の結婚式の二次会に行った。滋賀県で開催されていて、披露宴は船上でやると聞いたので、浜大津に帰ってくるに違いないと予想して待ち構えて湖畔で日本酒飲んでいたところ、船は浜大津には帰ってこず、ただ異常な場所で飲酒しただけの結果になってしまった。1カップの日本酒とじゃがりこというメニューで、日本酒とじゃがりこが全然合わない。

TRANS BOOKSでVR夢日記と豆本夢日記を出店します

来週東京で行われるTRANS BOOKSで、VR空間で僕の夢日記をチマチマ読める「VR夢日記」の展示と、スマホより小さい豆本で僕の夢日記をチマチマ読める「豆本夢日記」の販売をおこないます。
VR夢日記はきのう会社でデモ展示したところ好評でした。ダンボールとAndroidだとFPSがちょっと足りなかったのでOculus Go置いとこうかと考えてます。
豆本は今日家に届いて、今日はおまけのしおりを作ったりしていました。会場に送りつけて搬入するつもりだったけど何も考えずに家に送ってしまった。
僕はBCCKSで本を作ったり、VRのコードを書いたりして、表紙のデザインとイラストやしおりの印刷所への入稿などはid:corinyouにやってもらっています。家にデザイナがいると便利。


f:id:hitode909:20181117132731j:plain
f:id:hitode909:20181117132740j:plain
f:id:hitode909:20181117132727j:plain

シェルのhistoryをクラウドに保存する取り組み

ある日zshの履歴が消えた悲しみからいくつか課題感を持っていた。

  • 巨大な1ファイルにどんどん書いていくので、壊れたときの影響が大きい
  • 追記方式なので、複数の端末で共有するためGitやDropboxなどに入れるとコンフリクトしやすい
  • 履歴から取り出すときにどのディレクトリで実行したコマンドなのかわからない

シェル履歴をファイルに書いて終わりという暮らしは数十年変わっていない。

履歴はクラウドサーバーに保存して、補完したいときにAPI経由で問い合わせるというアーキテクチャが良いと思ったので、作ってみた。
github.com

コマンドの実行時

  • zshのフックを使って、コマンドの実行時に、実行したコマンドと$pwdをAPIにPOSTする
  • Cloud Functionsが立っていて、送られたコマンドをCloud Datastoreに保存する

Cloud FunctionsはGoogle製のAWS Lambdaみたいなやつで、Cloud DatastoreはGoogle製のAmazon DynamoDBみたいなやつ。
普通に暮らしてると、こんなかんじにDatastoreで履歴を見れる。見えるとまずい情報があったらポチポチやって消せる。
f:id:hitode909:20181116153104p:plain

履歴の補完

  • $pwdを指定してAPIをGETする
  • そのディレクトリでのコマンドに絞り込んでJSONを返す
  • pecoで選択して実行する

こんな感じのJSONが出てくる。pwdを保存してるのが新規性がある。

[
  {
    "timestamp": "2018-11-16T07:09:28.066Z",
    "command": "curl --silent \"$POST_SHELL_HISTORY_APIROOT/accept?apikey=${POST_SHELL_HISTORY_APIKEY}&pwd=${PWD}\" | jq . | less",
    "pwd": "/Users/hitode909/co/github.com/hitode909/post-shell-history"
  },
  {
    "timestamp": "2018-11-16T07:09:22.482Z",
    "command": "curl --silent \"$POST_SHELL_HISTORY_APIROOT/accept?apikey=${POST_SHELL_HISTORY_APIKEY}&pwd=${PWD}\"",
    "pwd": "/Users/hitode909/co/github.com/hitode909/post-shell-history"
  },
  {
    "command": "make deploy",
    "pwd": "/Users/hitode909/co/github.com/hitode909/post-shell-history",
    "timestamp": "2018-11-16T02:45:08.860Z"
  },
]

やってみたところ、候補をディレクトリで絞り込めるのがたいへん便利。こっちのプロジェクトはnpm run buildだけどこっちではmake js、とかこれまでは覚えておくしかなかったのが、履歴から選べば正解が出る。
初めて触るディレクトリなどのとき用に、ディレクトリを指定せず全履歴から選ぶモードも作った。
これからデータが増えると事情が変わってきそうだけど、実行時間も気にならず動いているので、もともとあったCtrl-rでファイルからヒストリを絞り込むのを消して、クラウドから引っ張ってくる版だけで暮らしている。

困り

作り始めたところなのでいろいろ困り事はある。

  • オフラインで動かない
    • バッファリングしてないのでオフラインでの作業はロストしてしまう。バッファリングする仕組みを作ると良いけどやってない
  • 作りが荒い
    • precmdでcurl &してるだけなので[1] 87143[1] + done curl --silent --data-urlencode "command=${command}" --data-urlencode >&というのが1コマンド打つたびに出てくる
  • 認証をちゃんとやってない
    • APIキーでの認証を手作りしたけどGoogleのアカウントと連携してOAuthで使い始められるとよさそう。いまは1人1個GCPのプロジェクトを作るということにしている。

手元のファイルを大切にする時代は終わったと信じて、未来に進んでいきたい。

MacBook Airが発売されたのでMacBook買った

家では2015年に買った11インチのMacBook Airを使っていて、メモリが4GBしかなくて、そろそろ動作が遅くなっていた。ディスクはチェックアウトしたコードくらいしか置いてないので余裕あった。
MacBook Airが発売されるのを待って、アップルストアに行って、MacBookとAirと持ち上げ比べてみると、重さが全然違う。MacBookはびっくりするくらい軽くて、Airはその見た目からすると想定通りくらいの重さで、驚きが少なかった。
ということがあって、一番安いモデルのUS配列のを買ってきた。物理的に軽いのは正義だと思って、家では膝に乗せて使っていて、ゴロゴロ回転しながら使うので、一番軽いものを買うのがよいと思う。
重いグラフィックの編集やIDEを開いたりはしなくて、ちょっとJSを書いてブラウザで動くものを作るくらいだったら持ち運ぶ障壁を下げられる方がメリットあると思う。あとは、会社にはProがあるので、なんかすごい行列計算とかをしたくなったら会社でやればよいという話がある。

www.instagram.com