2017年4月12日
最近ブログ書いてなかったから適当につらつら書く
pero
最近よく使うやつ。上の記事ではリリースされてない感じですがもう brew から入る peco にも入ってます。
用途としてはざっと該当箇所のコードを読みたいときに適当に検索してる。
インクリメンタルサーチなのでファイル構成とかクラス構成を把握してないようなときに便利。あと Ruby で include, extend してるけど結局実装どこだよというときにもよい。
ラッパーは微妙に変えてる。 less じゃなくて vim のほうがいろいろなれてるので。うっかり編集しちゃうのはご愛嬌。
#! /bin/sh exec ack "$@" . | peco --exec 'awk -F : '"'"'{print "+" $2 " " $1}'"'"' | xargs -o vim '
これの何がいいって、「メソッドAしらべる」→「どうも実際の処理はメソッドBっぽいな」っていうときにすぐ検索対象を変えられるとこ。めっちゃ便利。たぶん他の人はctagsとかつかってジャンプしてるのかしら
ack つかってるけど ack のオプション全然覚えてないから変えようか迷ってる。
とりあえず pero --ruby '.*' lib
みたいな感じでつかってることが多いです。
hkdnet.netのアレ
go 部分と js 部分を完全に分割した。あと go から html とかサーブしてたのを nginx に変えた。そしたら go のバイナリと public ディレクトリ内をまるっと更新すればいいだけになったので ansible で置いて適当に supervisor を restart すればデプロイが完了する。楽。
api サーバとして動くコードと1日1回バッチ処理を行うコードがあったんだけどそれも完全に分割して2バイナリ生成するようにした。管理がめっちゃ楽になってよかった。
ただなんとなく ansible が好きになれないので mitamae とか使いたい感じがある。
技術書典2
湊川さんのところで店番してた。なかなかない経験で楽しかった。本もいくつか買ったけど積んでます。すみません
Rust
書いてる。これを読んでテンションがあがったあとに Rebuild.fm で typester さんが言及してたので。
六本木ではたらくソフトウェアエンジニアへのよくある質問とその答え (FAQ) (2015 - 2017) — hayato.io
なんか書くかーと思って自分で tcp コネクションを張って自分で http のプロトコル書いて読むやつ書いてる。まあ curl ですね。
適当に実装して HTTP はしゃべれてるっぽい気がするんだけど https は handshake とかあってめんどくさ!!!ってなって投げてる。
これのあとに GitHub の API 叩くコード書いてるあたりでエラーの扱い方をようやく学んだ。面白い。
Rust 自体の感想としては、オブジェクトがメモリ上でどういう風になってるのかを意識させられる感じがある。そこがつらくておもしろい。
「全然わからない。俺達は雰囲気で C++ を書いている」という感じがあったけど Rust は 「雰囲気ですら書けていない」という感じ。コンパイル通らんし。
コンパイラが出すメッセージがかなり親切で「もしかしてこうじゃない?」って言ってくるあたりほんと賢い。
コンパイラに叱ってもらって関係ありそうな節を Rust book で読んでというトライアンドエラーをしている。叱責駆動の勉強。
ほんとに親切なんだけど一方でわかってんならよしなにやってくれという気持ちもあってそういうところは人間が機械に傅いている感じがあって趣がある。また数年後にはこのあたりが解決される新言語あるいは新バージョンが出るのだろうか。
curl 代替を書いているときにヘッダーも書いて1行あけてボディなくて、でなんか読み出しできねぇ!みたいなことがあってなんでだろーって感じだったんだけどボディが空のときに空行が必要だからでした。てへぺろ
あと RFC 読んでてはじめて HTTP は改行コードが CRLF なことを知った
Rust に対する不満は VSCode の拡張でフォーマットかけると Vim モードが解除されるとこ。Rust の不満じゃなくて VSCode の不満ですね。
Rubocop
0.48の変更がめんどくてあげたくないという気持ちがある
ますとどん
酔った。たぶんもうやりません。
追記
JSON Schema
2システム間においてやりとりするデータをJSON Schemaで定義しているものとして、JSON Schemaにはarrayのorder定義がない(と思う)のだから送信側がsortするかどうかに関係なく受信側は自身でsortする責務がある
— はくどー (@HKDnet) 2017年4月6日
のだろうか
@HKDnet Arrayはもともと、というかこの文脈だとJSON specか、で明確に順序付けされたものとして定義されているので本来はarrayを作る側 (送信側) の責務でソートするのが基本とは思います。で、値の内容までvalidateするJSON Schemaなんだからそこにチェックを依存
— WAKASUGI 5T111111 (@5t111111) 2017年4月6日
@HKDnet できればいいなと思うのはPropertyOrderの提案が出てることからもわかるんですが、JSON Schemaに限らずソート順はバリデーションでやることじゃないだろというのもあるんですよね。これあんま言葉にできないけど。コールバック関数いるだろうしどう実装するの都合もありそう
— WAKASUGI 5T111111 (@5t111111) 2017年4月6日
@HKDnet その上で、送信側と受信側がソート順という関心事を共有する手段を用意するのはそれはそれでめんどいので、相手のことを知らなくても少なくとも自分でソートできるならやっちゃってもいいのでは、というのが自分の意見ですね。これは責任の所在を曖昧にするけど現実問題都合良さそうってくらいの感覚で
— WAKASUGI 5T111111 (@5t111111) 2017年4月6日
@5t111111 うーん、たしかにJSON Schemaの範囲じゃないから、ってのはわかるんですが、2システム間の約束を文書化し明示し共有しテストしたいからJSON Schemaを使ってるわけで。すると約束の範囲外は未定義だと思って実装するほうが重複してるけど頑健なのかなあ、という迷いがあります。
— はくどー (@HKDnet) 2017年4月6日
@5t111111 似たような結論になりましたねw
— はくどー (@HKDnet) 2017年4月6日
という感じ。
2017年3月振り返り
記録
total: 13720 minutes Rank Name Minutes 1 Ruby 5424 2 YAML 1567 3 JavaScript 1319 4 JSX 461 5 PHP 460
minutesがやたら増えてんなと思った方はこちらの記事をご参照ください
雑感
記録から
えーと、Rubyistっぽいですね。はい。
YAMLとjsがなー。JavaScriptとJSXを合わせりゃ勝ってるんだけど。vimだとfiletypeみているのでこういうことがおきる。
wakaitime側の設定でfileytpeとかをサーバに送られた後に変換できるのでやってもいいかも。
今回の場合 language = JSX の場合に language = JavaScript とすればよさそう
えーと記録にないですがjupyter notebookでPython書いてます。
ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践
- 作者: Joel Grus,菊池彰
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/01/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
これwakatimeで記録できないんで結構めんどい……。
えーと曜日別で表示してみたんですけど曜日別のプログラミング時間がこちら。
金土日が少ないですね。金曜日はなんで少ないんでしょうか。どう考えても飲み過ぎですね。もっと進捗しろ
phpはjson-schemaでリクエストを検証するあたりをちょろちょろ書いてた。たのしい
記憶から
- SQLアンチパターン読了した
- 言語のしくみ読了した
- hkdnet.netで
- gomodoroつくった
- マイクロサービス群の結合テスト実施するためのなんやかんやをした
- 特定レポジトリになんかイベントがあると、その時点での該当レポジトリ群をとってきてdocker imageつくってデプロイしてDB叩く感じの
- 仕事でやったので非公開です……
- 週報はじめた
- 後述
- はじめてでかめのp-rをレビューしてる
- でかいと疲れるのでなんかいい方法ないかなーとすごく悩んでいる
- electronアプリに手を出し始めた
- これ↓に出る予定です
友人がpodcastをはじめた。↓
メインパーソナリティのガミさんってほうが友人です。
僕が言い始めた週報の話がしがないラジオep.3aで言及されてます。よければどーぞ。
fish移行した
おさかなさん pic.twitter.com/5r2vYcyHoD
— はくどー (@HKDnet) 2017年3月22日
以下雑な手順
- brew install fish
- cp ~/.zshrc ~/.config/fish/fish.config
- ひたすらfish化する
- このへんでfishにはいる
- fishermanをinstall
- 適当にfisher installする
/etc/shells
に追記chsh -s fish_path
ひたすらfish化でやったのででかめのトピックは以下。
export FOO=BAR
-> set -x FOO BAR
anyenvがなんかダメだったのでがんばった。
anyenv init -
は実は後ろに引数としてshell名をとれる。なければ$SHELL
を見る。そのためfish移行時にはfishと明記しておかないとエラーがでまくる。せっかくなのでzshrcにも書くことにしたanyenv init - fish | source
でいいはずなのだがなんかうまくいかなかったのでanyenv自体をupdate- それでもダメだったので、
anyenv init - fish
の出力をなんとなく目で見る。ndenvのpath設定あたりで文字列内展開の書き方が間違ってたっぽい。いろいろめんどくさくなってanyenv uninstall ndenv
しとく。dockerもあるし、ローカルのnodeのバージョンがちゃんと管理できなくて困ることはあるまい……
プロンプト変えた。fishなのでさかな。right_promptは最初gitブランチを設定してたんだけど、右端まで空白入るのがウザくて切った。手癖で git s(= git status)
打つようになってるから見えなくても特に問題ない
pecoは下に入力欄がくるようにした。そっちのほうが目線移動が少ない、というのを誰かの設定でみた。確かに。
hubのaliasは別にいらないかなって思って切ったままにしている。hub browseくらいしか使ってないしhub browseって打つようにしている。
移行した感想としては、特に変わらなかった。ターミナルでその場でシェルスクリプティングをすることがあまりなく、あってもfor文程度なので特に利点がない。逆にREADMEとかにあるスクリプトをコピペで動かすことができないのでいまのところ不満度のほうが高い。あっさりまた乗り換えるかもしれない。次にやるとしてもzshではなくbashにしようと思っている
懺悔
えー、最近の振り返りで使ってたツールですが集計ミスが発覚しました。
各レコードに対してminutesっていうカラムがあるんでそれで集計してたんですけど、minutesってのが実は「経過分数」じゃなくて「時刻表示の分」だったんですよね。
60 seconds -> 1 minute 3660seconds -> 1hour 1minute ( not 61 minutes )
2月末に発覚したデータロストとかじゃないからまだよかった……(よくはない)
1月の振り返りの時点で「コーディング時間おもったより少ないですね。もっと頑張らなきゃなあ」みたいな感想もってるのが笑える。ちゃんと気づけよw
3000分で少ないなって思ってましたが8000分になりました。はい。
2月は12000分弱なので実際1月は少ないみたいです。データ何日分かロストしてるけど
データの整合性については、えー、恥ずかしながらSQLで全件抜いたあとにgoogle spreadsheetに頼りました。エクセルで育ったもんで……。
実際値を見ながら仮説をたててなんかするってときにSQLはちょっとやりにくくて集計データがのこるスプレッドシートのほうが断然楽ですね。
データロストの対応については、昨日の分のレコードが0件だったらslackで教えてくれるスクリプトを書いてます。
というわけで過去記事を書き直しておきました。
yet another pomodoro
つくりました
いつもどおり英語は適当です。
モチベーション
- ポモドーロテクニックがやりたかった
- tmuxのバーに表示したかった
- ターミナルを全画面で使ってる事が多いのでmacのステータスバーに表示するのは微妙
- tmuxのバーが一番いいかな?っていう感じで決まった
- 終わったら通知が欲しかった
- macユーザーなので右上にピコンと出る系のやつがよかった
対抗馬は?
- hughbien/thyme: Console Pomodoro timer
- 使おうとしたんだけど依存関係がちゃんと定義されてなくて普通にやると動かなかった
- たしかgem installしてレポジトリをとってきてbundle installしてその後bundle exec rakeしてテストを通すとようやく動くようになった
- 最後の1ステップがマジで謎すぎる
- ほかはしらない
作ったもの
1秒sleepして、ってやるとどんどんズレるよなー、どうやってんのかなーと悩んでた。悩みながら実装は見ないでthyme使ってた。
あるときgoでループ回しながら指定期間過ぎたら「過ぎたよ」っていうのをchannel経由で送ってくれるやつがいたらそれでよくね?と思いついたので作ってみた。
まだthymeの実装みてないのでどうやってるのかはしらない。
tmuxに出すのはthymeの設定ファイルから察したやり方で。$HOME配下にファイル出してtmuxのステータスバー側でcatで読んでる。
終わったら通知というのは設定ファイルにスクリプトのテキスト書いてそれをexecする感じにした。これもthymeの設定ファイルを参考にしている。スクリプトの中身はterminal-notifierというのを使っている。
julienXX/terminal-notifier: Send User Notifications on Mac OS X 10.8 from the command-line.
直したいところ
- -dとかでdaemon化したい
- goでdaemon化するのちょっとめんどくさそうで止まってる
- 適当にやる分にはできそうだけどどういう問題があるのかよく把握してない
- 実運用的には
gomodoro &
でバックグラウンドに飛ばしてる
- goでdaemon化するのちょっとめんどくさそうで止まってる
- SIGNAL対応
- SIGINTくらいしか対応してない
- まあ実用上困らんか……
- tmux用のファイルは開きっぱなしのほうが効率がいい気がする?
- 日別のpomodoroカウントとりたい気がする
実は作ったのは結構前で3commitしかないけど1commit目でmain.goは全部できてます。
2017年2月振り返り
記録
2017年2月 コーディング時間: 3378分 言語比率 1〜5位
Ruby 859 YAML 625 ERB 291 Docker 163 JavaScript 143
訂正版 total: 4517 minutes Rank Lang Minutes 1 Ruby 1090 2 YAML 747 3 ERB 291 4 JavaScript 277 5 C++ 208
2017-03-13追記: 2/11と2/16のデータがないけど仕方ないのでこれで確定版
再訂正版 total: 11230 minutes Rank Name Minutes 1 Ruby 4350 2 YAML 1418 3 JavaScript 702 4 Markdown 680 5 C++ 571
2017-03-15追記: 普通に計算ミスってました。 -> 懺悔 - Smoky God Express
ただしデータの信憑性があやうい
雑感
記録から
時間すくねーなって思ったんだけどこれはまた後で。
Rubyは主にCLIツール作ってた時間かな。いろいろ作った。使うかあやしいけど。
あとrubotyのプラグインとlambda(nodejs4.3)も書いてた。公開できないけど。流れとしてはこんな感じ
githubの通知 → lambda → ruboty → AWS CloudFormation
PRに対してChange SetのURL貼ったりマージしたらexecuteしたりexecuteしたらステータスが完了になるまでまって教えてくれたりって感じ。
Dockerfileは、うーん、なんでこんなに長いんだろう。そんなに書いてないと思うが。謎。herokuのdocker対応番作ろうとして挫折した記憶はある。
JavaScriptはwakatimeのviewerの構成を変えたからかなー。HTML直書きのVueだったのをcomponent分割してwebpackするようにした。
Go側はほぼいじってない。
wakatimeのviewerについて
viewerのバグ直した。これは結構大事なバグで、なにかっていうと0分だとそもそも折れ線グラフに点が打たれないからスキップされちゃうってバグ。初歩的すぎる……。もしかしてバカなんだろうか。真面目にデータみてないからわかってなかったけど……。
そして0分をいれて折れ線グラフを見ると1月にやる気ないどころかマジでなにもしてない1週間があってちゃんと値とれてるのか不安になってきた。っていうか2月のこの日おれ絶対コード書いてるんだけどってのが抜けてるのでたぶん取れてない。
2017-03-13追記: このあとすぐにサーバにログインしてその時点からでもとれるデータはとった
エラー通知なんもいれてないけどさすがにいれてretryさせる形がいいのかなー。エラー通知はslackに投げときゃいいかな
2017-03-13追記: エラー検知してリトライはめんどかったので昨日の分がとれてなかったらslackに投げるようにした
これからの振り返り
施策を打てるような分析をやりたいなーと思ってる
- 曜日単位での集計
- タブの分け方の変更
- 年次、月次、週次の種別をかんたんにかえたい
- 書いてる時間の集計
- 集中してる時間とかわかるかも?
最近のコーディングネタ
Ruby
- テスタビリティのために引数をとりたい
- 普通にプロパティアクセスするような気楽さでアクセスしたい
この2つの気持ちがあわさってこういうことをよくしている
class Foo attr_reader :baz, :qux def bar @bar ||= build_bar(baz, qux) end def build_bar(baz, qux) # baz, quxは結局 @baz, @quxなのだがとっておくとテストがしやすい # なんか適当な処理 end end # test subject = Foo.new assert(foo.build_bar(1, 2) == 3) # こういう感じで内部状態@baz, @quxを意識しなくてよくなる
#build_bar
がもう少し重い処理ならFactoryを使うべきだとは思うけど全部につくるのはめんどくさくてこういう妥協をしている
JavaScript
webpack
webpack入門した。自分で調べながらかいたらこの程度で済んでいる。
https://github.com/hkdnet/wakatime-viewer/blob/master/webpack.config.js
- cssはもともと書いてないからsassとかの設定がない
- 画像サーブもしてないからそのへんもない
- htmlサーブはやるけどまだ書いてない
このへんが短くなってる理由だろうか。どんどん育てていきたい
underscore
標準JavaScriptのArrayで微妙にたりなくて使ってるがunderscoreに渡す関数内で普通にArray.prototype.reduceとか呼んでてどうなんだろうという感じがある。
fetch
fetch APIをつかってHTTPリクエストを送ろうとしている。自分のAPIエンドポイントのためにClientクラスも作っている。
そうするとテストのためにはfetchをDIで使えるようにしておくとよい、気がする。
class Client { constructor(opts) { this.fetch = opts.fetch || fetch; } getFoo() { return this.fetch('/foo'); } }
一方でfetchは呼び出しコンテキスト(っていう言い方であってますか?Rubyでいうレシーバみたいな)がwindowであることを期待しているので、結局bindして渡す必要がある。
const client = new Cleint(fetch.bind(window));
いやー、微妙にダサい。どうしたもんか。
C++
先日書いたけど競プロっぽいのにC++使ってる。
そして関数内で int[n]
を確保したらセグフォって「は???」という気持ちだったのだけどそういうこともあるらしかった。
そのあとぼでさんにunique_ptrとか使うといいんですよーと聞いたのでつかってみている
@HKDnet YES さらにいうならば今でいうならばRAIIが重んじられているので、生ポインタですらwrapされたスマートポインタ(std::unique_ptr)等を使うのが良いとされていますぞ https://t.co/etx1ZHBtHX
— ぼでー (@bode_mmk) 2017年2月22日
ツイートのリンク先を見ればわかるが、モダンさを感じて結構よさげ。
一方で困っていることもある。
いままで適当に配列つくって渡してーとやっていたがスタック領域以外のところにメモリを確保するようになったのでそのメモリを使うオブジェクトの生存区間とかを意識することになった。
というか意識しなきゃいけないなってことに気づいて結局グローバルにint配列確保するようにしてごまかしている。せっかく教えてもらってるのにすみません……。