hitode909の日記

趣味はマリンスポーツですの日記です

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があるので、なんかすごい行列計算とかをしたくなったら会社でやればよいという話がある。

https://www.instagram.com/p/Bp9QBXIANwk/
近所のアップルストアで買ってきた

シェルが消えて悲しかったのでどこかに保存しておこうと思い、定時後にちょっと練習していた。まだ動いてない。
指定されたコマンドを実行するところはできて、次にどこかに保存する、というところで、手元のnodeからAWSのストレージを直接叩くよりは、API Gatewayとかでやったほうがいいんだろうな、というところで終わり。家に帰って筑前煮を作った。
NoSQL大好き派としてDynamoDB使ってみようとしていていて、私のアカウントなら動きますっていうのも変な話なのでCloudFormationでも使ってみようとしている。が、登場する概念が多い気がする。
遊びのコード、RubyやPerlで書くことが多かったけど、TypeScriptでnodeで動く形で作れると良いと思っていて、型が付いてて補完が効くのでAPIを覚えてなくても試せるのと、ふだんブラウザを1日に18時間くらい見てるのでJavaScriptのreplが一番身近な存在。