たにしきんぐダム

プログラミングやったりアニメやゲーム見たり京都に住んだりしてます

2019年2月振り返り

Apex Legends

www.ea.com

今月はちょっと遅くまで仕事 → 夜ご飯 → Apex Legends → 寝る みたいな生活送ってた... レーティングが無い?のかめちゃくちゃ強い人と当たりまくって一瞬で死ぬのだけれど楽しい! コースティックで毒ガスをドアの前に仕掛けてロックするのがお気に入り。

映画/アニメ/ドラマ/ゲーム

へレディタリー/継承

hereditary-movie.jp

出町座 | 京都 出町桝形商店街にある映画×書店×カフェのカルチャー拠点 で上映されていたので観に行った、すごく面白かったんだけれど怖かったかというとうーん。

Naked

www.netflix.com

めちゃくちゃ面白かった。 結婚式当日の朝にエレベーターに全裸で閉じ込められていて、結婚成功するまで全裸エレベータまでタイムリープし続けるコメディなんだけれど、ずっと勢いがあってずっと笑ってた。

Homecoming

youtu.be

Mr. Robot の Sam Esmail 監督の作品、なんか撮影とか音楽とか雰囲気がそれっぽくてめちゃくちゃ良い。30分10話だから観てくれ!!!! Mr. Robot も観てくれ!!!

youtu.be

ベルベットバズソー血塗られたギャラリー

www.netflix.com

一応ホラー映画だけれど、怖さはそんなになくて、どちらかというと資本主義にまみれたアート業界の人間たちが成敗されてくみたいな内容だった。面白かった。

Second act

www.netflix.com

優秀なのに学歴がないせいで昇進に失敗してしまった主人公が、(甥による)レジュメ捏造でハーバード院卒ってことになって大企業のコンサルタントに就職してしまって...って話。

ほんとに超学歴社会なアメリカを愚痴る一方、偽の経歴を誤魔化すためにいろいろ工作するシーンはすごく面白かった。特に中国語喋れるふりして中国人獣医の発言を読み上げるシーンは面白すぎてので観てくれ。

youtu.be

どろろ

dororo-anime.com

良すぎる。今期は見てるのは

鋼の錬金術師

www.netflix.com

今月は何故かハガレン観ながらコード書いてた。見るの多分4回目くらいだけどおもろい

仕事

なんか今月はあまりうまく仕事できなかった。2月病か? あまりにうまくいかないので、月末あたりからタイムトラッキングし始めたけどなかなか良い。

やったこと(技術)

インフラとかのツールの知識つけたいなと思って勉強してた

OSS

その他

金かかる!!!!

英語

  • オンライン英会話一旦解約した
    • DMM英会話やってて、反射的に英文っぽいものを口から発する特訓にはなった気がするけど、なんかマンネリ化してきたので一旦やめて他のやつ試してみることにする。やったほうが良いのは確かなのだけどね...
  • HiNative Trek(ハイネイティブ トレック) | 実践英語を1日1題。英語を効率よく身につける。 こういうの試してみたけど、あんまり合わなかった
    • 簡単すぎる
    • IT英語ってことでコースとってみたけど今の所スタートアップビジネス向けっぽい課題が多くてミスマッチ感がある。
  • 4月にIELTS受けるので、ひとまずそれまではスコアメイキングに専念しようと思ってる。
  • podcast 運動したり歩いているときに耳が暇なのでpodcast聞いてる、全部 Google podcast で聞いてる

tech系youtuber

www.youtube.com

前まではJSの基礎を異常なテンションで話すみたいな内容が多かった気がするけど最近はソフトスキルの話が多い気がする。昔やってた異常なOPが好きだった。

www.youtube.com

こっちも面白い。

テックカンファレンスの動画はいつも観てるけど今月は特にこれが良かった

youtu.be

読書

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

今月はあんまり読んでない

その他

  • 給料上がった

2019年1月振り返り

なんか本をたくさん読んだ気がする

ゲーム

  • PUBG久しぶりにやったら新マップがでてて面白い。今月は3回ドン勝つした(仲間に異常に強い人がいたおかげで)
  • undertaleやってて楽しいんだけれどGルートは気が進まなくてやれてない。。。
  • スマブラ、インターネット対戦主にやってるけどみんな強すぎじゃない?世界戦闘力150~200万くらいをうろうろしてて進歩がない。

読書

Atomic Design

Atomic Design ~堅牢で使いやすいUIを効率良く設計する

Atomic Design ~堅牢で使いやすいUIを効率良く設計する

フロントエンドのビューのユニットテストCSSの変更に対する回帰テストを効率的に実装する方法論を探してインターネットを眺めていたらAtomic Designってやつが良さそうらしかったので読んでみた。 プロジェクトに合わせて程よい粒度でAtomicDesign取り入れましょうとか、チームメンバーの説得/教育の仕方みたいなのも書かれていて予想以上に良かった。

Soft Skills

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

昔買って運動と精神衛生の部分だけ読んでいたのだけれど、最近は自分の将来のキャリアに対してぼんやり不安を感じ始めたので読み直した。

超速! Webページ速度改善ガイド

超速!  Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)

超速! Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)

フロントエンドのパフォーマンス改善のまとまった知識が意外となかったので読んでみた、そこらへんの知識をまとめて得られたので良かった、実際に改善タスクに取り組むときにハンドブック的にまた読み直す気がする。

人を動かす

人を動かす 文庫版

人を動かす 文庫版

Soft Skills 読んでたらおすすめされてたので読んでみた。要するに本心から人に興味をもって褒めるんだ!っていうことなのだという理解。

早わかり! 知れば知るほど得する税金の本

人生で初めて源泉徴収票もらったけど書かれていることが何もわからなかったので勉強しようと思って読んだ。書かれていることとなんでこの数字になってるのかも分かってよかった。結婚とか相続とかはまだしばらく使わなそうな知識なのでそこらへんはまだ読んでない。 会社の同僚が読んでいたので読んでみたのであった。*1

ベイズ推論による機械学習入門

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

1月に読んだというよりも、(遠方の)友人2人と1年くらいかけてゆっくり輪読会をしていたのがついに完了したのでした。輪読会の内容はそれぞれが各式の導出とかをノートにまとめてきたり、関連するトピックを軽く調べておいて、勉強会当日はskypeで集まって誰かが適当に解説してそれを残り二人がうんうんと言ったりツッコミを入れたりする感じのゆるさで進めていた。 あんまりきっちりすると続かないと思ってゆるくやっていたけれど、ゆるすぎて結構間延びしてしまいモチベーション維持するほうが大変だった。

ソフトウェアテスト教科書 JSTQB Foundation 第3版

ソフトウェアテスト教科書 JSTQB Foundation 第3版

ソフトウェアテスト教科書 JSTQB Foundation 第3版

  • 作者: 大西建児,勝亦匡秀,佐々木方規,鈴木三紀夫,中野直樹,町田欣史,湯本剛,吉澤智美
  • 出版社/メーカー: 翔泳社
  • 発売日: 2011/11/12
  • メディア: 単行本(ソフトカバー)
  • 購入: 5人 クリック: 85回
  • この商品を含むブログ (12件) を見る

読んでる。最近ソフトウェアの保守とか品質に興味があって(多分もとからあったんだと思うけれど)まとまった教科書的な知識をインプットしたいと思って読み始めた。教科書的なので普通にわかりやすくて良い。受験料が高いので受けるかはわからない。 以前読もうとしたソフトウェアテストの本は内容は良いけど筆者のキャラクターが強くでている上に好きになれなかったけれど、この本は教科書なだけあり淡々としてて良い。

民主主義の死に方

民主主義の死に方:二極化する政治が招く独裁への道

民主主義の死に方:二極化する政治が招く独裁への道

こちらのnoteがすごく良かったのだけれど おもい|kengolaw|note その中で紹介されていたので読んでみている。ちなみに The Newsroom | HBO はちょうど観始めていたのでさらにタイミングが良かった。 社会人になっていろいろと経済や政治について関心を持ち始めたりした。学生時代の社会の成績は最悪だったのでこの本を読むための基礎知識が足りておらず逐一調べたりしていて大変だけど面白い。

英語

  • IELTSのacademic writing/GitHubのやりとりなどで論理的な文章を書くことの勉強に ネイティブの添削指導を e-learningで! 留学ライティング | 公益財団法人 日本英語検定協会 を受講していた。大学時代お世話になった先生が監修の一人だったので信頼して受講できた、多分こういうの大学の英語の授業でも開講されてたのだろうけれど当時は大学の仕組みをうまくいかせていなかったなあ。
  • DMM英会話は週2~3くらいでゆるゆるやってる、だいたいDMM daily newsを僕が早口で話して記事についてディカッションしている。先生が適宜質問を引き出してくれると良いんだけれど、たまにやる気が無いのか話すことがないのか相槌だけ売ってOK,goodみたいなこと言ってるだけの先生とあたるとつらい
  • 4月のIELTS申し込んだのでスコアメイキングに力いれたい(特に利用目的はない)

運動

  • 暖房の聞いた部屋でアニメ見ながらランニングしたくて近所に24時間制のジムに通い始めた、夜は人が少ないし施設も清潔で快適
  • アニメや海外ドラマ観ながらランニングや自重運動できて便利、冬も寒くない
  • ボルダリング最近いけてない

技術

映画/アニメ/ドラマなど

Molly's Game

mollysgame.jp

女神の見えざる手ってやつも面白かったです。

Black Mirror: Bandersnatch

www.netflix.com

The newsroom

www.hbo.com

観始めた

The Haunting of Hill House

www.netflix.com

これまで観た(幻想的な)ホラー作品の中でもトップクラスに良かった。見てくれ!

Fate/stay night [Heaven's Feel]

www.fate-sn.com

とにかく良かったしちょっと怖かった。上映2日目のレイトショーを観に行ったのだけれど隣の席に同僚がいておもしろい。

Aimer Hall Tour 18/19 "soleil et pluie"

Aimer Official Web Site | LIVE

大阪公演に行ってきた! 「ONE」から始まり「あなたに出会わなければ」みたいな懐かし目の曲から新曲や、アンコールで「I beg you」「花びらたちのマーチ」「絆」3曲のピアノ版が聴けたのも最高だった。マグカップ買った。

その他

moneytree使い始めた

良い感じに詰めて整形してくれる JSON pretty-printer「jpp」を作りました

jpp というJSON Pretty-Printer を作りました。

github.com

このコマンドはJSONを要素ごとに1つ1つ改行するのではなく、画面内(もしくは指定した幅)に収まる限りできるだけ改行を挟まずに要素を表示します。

そのため、例えばarrayの中身に大量の要素が入っているものや、objectの中身にfieldが大量にあるようなJSONを表示する際、改行をできる限り抑えて表示することによりJSONを見通しよく眺めることができます。

f:id:tanishiking24:20181028224432p:plain

背景

JSONを整形して表示することができるCLIツールとして、jqjsonppや、 python -m json.tool などがありますが(jq はpretty-printのためのツールではないが僕は普段jsonの整形のためによくjqを使っていた)、 これらの既存のJSON pretty-printerを用いて、先に述べたような要素数の多いnodeを含むJSONをpretty-printしようとすると、画面の中に収まらず、 less なりを使ってスクロールしないと全体を眺めることができない、全体を眺めることはできるが見通しが悪い。ということに悩みを感じていました。

ということで画面の横幅に収まる限りできるだけ改行を抑えつつpretty-printすることで見通しよくJSONを眺めることのできる jpp コマンドを作ってみたのでした。

このツールを実装するにあたってはつい先日作った、Wadler's "A Prettier Printer の Go 実装を部分的に用いました。(名前が思いつかず強気な名前になってしまった...)

github.com

このライブラリ(の背後にあるアルゴリズム)は GitHub - prettier/prettier: Prettier is an opinionated code formatter. にも使われているpretty-printerの実装を補助するライブラリです。基本的なアルゴリズムの方針は、与えられた幅に収まる限り一行に収め、幅のうちに収まらない場合は改行するというもので、単純ではあるものの非常に強力なライブラリです。 (scalaだと paiges、swiftだとDoctorPretty などの実装があるようです、prettier/prettier の場合はツールの中に実装が組み込まれています)

JSON以外のpretty-printerを実装するのにも活用できるので、godocや先ほどあげた論文を参考にして使ってみてください。

インストール

Homebrew

$ brew install tanishiking/jpp/jpp

Download binary from GitHub Releases

https://github.com/tanishiking/jpp/releases

Build from source

$ go get -u github.com/tanishiking/jpp/cmd/jpp

使い方

cat example.json | jpp のように標準入力に与えたJSONを整形して出力します。

オプションとして、現在 -w-i を提供しており

  • -w: 整形時に考慮する幅、jpp はできる限りこの幅のうちに収まるようにJSONを整形して出力します。
    • この値は必ずこの幅のうちに収めることを保証するものではないので注意
    • 指定しない場合はterminal widthが利用されます。
  • -i: インデント、デフォルトは2スペです。

https://user-images.githubusercontent.com/9353584/47613438-bb96a700-dad2-11e8-872c-4309d4330aef.png

また出力テキストの色を環境変数やシェル変数を使って変更することもできます。詳しくはREADMEを参照してください。https://github.com/tanishiking/jpp

デモ

f:id:tanishiking24:20181028224152g:plain

機会があれば、是非お試しください。

Instant scalafmt startup using SubstrateVM

github.com

scalafmtはscalametaを利用したscalaのコードフォーマッタです。intellij plugin・sbt plugin・climavenやgradle plugin といった様々な形で提供されており

と様々な方法で利用することができます。

scalafmtの課題の一つはscalafmtの実行にかかる時間です。機能が豊富で複雑なため、ただでさえそれなりに実行に時間がかかってしまうのですが、さらに悪いことにscalafmtの実行に当たってはjvm の起動がオーバーヘッドとなってきます。利用頻度が少ないのならば問題ないのですが、gofmtなどのような軽量なフォーマッタのように気軽に実行できないものだろうか。

このjvm起動のオーバーヘッドを解決する方法の一つがnailgunです。nailgunはJVMプロセス(サーバ)をあらかじめ起動しておいて、クライアント側からサーバー側にjavaプログラムの実行要求をし、サーバー上でプログラムを実行させることでjvmの起動によるオーバーヘッドを解決してくれます。scalafmtからの利用方法

github.com

他の解決方法としてはどうにかしてscalafmtをネイティブバイナリにAOTコンパイルしてしまうことですが、残念ながらv1.6.0-M4段階ではscalanativeサポートはされていません Support Scala Native · Issue #1172 · scalameta/scalafmt · GitHub

しかしGraalVMのツールチェーンの一つであるsubstratevm(とgraal)を使うことでscalafmtをAOTコンパイルしnailgunなしに爆速で実行することができるようになります。

SubstrateVM

  • graal/substratevm at master · oracle/graal · GitHub
  • javaで書かれた(生成されるネイティブイメージに)組み込み可能なVM(ランタイム?)、graalコンパイラによってjavaアプリケーションと一緒にネイティブコードに変換される
  • java(のサブセット)アプケーションの静的解析を行い、実行に必要なモジュールを検出(しそれ以外は捨てる)、これにより生成されるネイティブイメージのバイナリサイズを小さく抑えることができる。

ただしJavaアプリケーションをAOTコンパイルしてしまうので、(特にdynamic class loadingまわりなど)いくつかの制約がある graal/LIMITATIONS.md at master · oracle/graal · GitHub

scalafmtをAOTコンパイルする

先日scalafmtに上記の制約をパスさせAOTコンパイルを可能にするPRが来ていた!のでこれでscalafmtをネイティブイメージにコンパイルできるぞ!

github.com

ということでビルドしてみる

$ sbt cli/assembly
$ native-image -jar scalafmt-cli/target/scala-2.12/scalafmt.jar

いろいろオプションつけたりはできるけどこれでネイティブイメージがビルドできた。楽すぎる...

パフォーマンスの計測

実行環境

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

$ java -version
openjdk version "1.8.0_172"
OpenJDK Runtime Environment (build 1.8.0_172-20180625212755.graaluser.jdk8u-src-tar-g-b11)
GraalVM 1.0.0-rc5 (build 25.71-b01-internal-jvmci-0.46, mixed mode)


$ cat /proc/cpuinfo | grep "model name" | uniq
model name      : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz

$ cat /proc/cpuinfo | grep "physical id"  | uniq
physical id     : 0

$ cat /proc/cpuinfo | grep processor | wc -l
8

$ cat /proc/cpuinfo | grep "cpu cores" | uniq
cpu cores       : 4

パフォーマンスの計測には Merge pull request #1276 from scalameta/fix-quote · scalameta/scalafmt@5a5747f · GitHub でビルドした3種類のscalafmt-cliを利用しました。

  • scalafmt-jvm
    • coursier bootstrapで固めた普通のCLI
  • ng-nailgun scalafmt
    • この方法でビルドした nailgunを利用したscalafmt-cli
    • ただしnailgunサーバーを温めるために予め一度実行しておき、その後計測環境を同じくした上で二回目の実行にかかった時間を実測値とする
  • scalafmt-native
    • substratevmを利用して作ったscalafmtのネイティブイメージ

フォーマットの実行対象は2種類

scalafmtの設定は scalafmt/.scalafmt.conf at c92153e777984db6d69ec359dd1b1115bd2199d6 · scalameta/scalafmt · GitHub

scalameta/scalafmt全体

$ /usr/bin/time ./scalafmt-jvm
Reformatting...
  100.0% [##########] 142 source files formatted
37.98user 0.69system 0:06.11elapsed 632%CPU (0avgtext+0avgdata 1001288maxresident)k
0inputs+41984outputs (0major+250221minor)pagefaults 0swaps

$ /usr/bin/time ./scalafmt-native
Reformatting...
  100.0% [##########] 142 source files formatted
6.57user 0.17system 0:02.67elapsed 251%CPU (0avgtext+0avgdata 388632maxresident)k
0inputs+952outputs (0major+99109minor)pagefaults 0swaps

$ /usr/bin/time ng-nailgun scalafmt
Reformatting...
  100.0% [##########] 142 source files formatted
0.00user 0.00system 0:01.36elapsed 0%CPU (0avgtext+0avgdata 1796maxresident)k
0inputs+0outputs (0major+73minor)pagefaults 0swaps     

単一ファイル

$ /usr/bin/time ./scalafmt-jvm scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala
12.38user 0.33system 0:02.85elapsed 445%CPU (0avgtext+0avgdata 363232maxresident)k
0inputs+41064outputs (0major+89218minor)pagefaults 0swaps    

$ /usr/bin/time ./scalafmt-native scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala
0.13user 0.04system 0:00.17elapsed 100%CPU (0avgtext+0avgdata 181420maxresident)k       
0inputs+32outputs (0major+41286minor)pagefaults 0swaps 

$ /usr/bin/time ng-nailgun scalafmt scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala  
0.00user 0.00system 0:00.16elapsed 1%CPU (0avgtext+0avgdata 1716maxresident)k    
0inputs+0outputs (0major+70minor)pagefaults 0swaps  

やはりnailgunによる実行が早いのは当然ですが、普通にJVMを起動するCLIの実行と比べるとめちゃくちゃ早くなっていることがわかります:tada: 特に単一ファイルに対するフォーマットの実行のようなshort-live(プロジェクト全体のフォーマットと比べて)な実行の場合はnailgunを利用した場合の実行時間にかなり迫っています。

この実行速度(かつnailgun不要)ならエディタ保存時にscalafmt実行とかしても快適に過ごすことができるのではないでしょうか (もっともプロジェクトに関わる全員のscalafmtのバージョンを揃えないとフォーマット結果がバラバラになりうるのであまり推奨はできない気がする)

所感

scala-nativeが出たときにscala->llvm ir->nativeよりも、scala->jvm bytecode->nativeでネイティブイメージ作れたほうが、scala-nativeが頑張ってるような再実装の嵐を免れることができてお得だよなぁ、実際にはいろいろ制約あって難しいのかなぁと考えていたのですができてしまったよ...

サーバープログラムのようなlong-liveなプロセスに対してはHotSpotVMなどのJITの恩恵が大きそうですが、フォーマッタやlinterやその他CLIツールのようなshort-liveなプロセスにとっては非常に嬉しいツールですね、ありがとうoracle。仕組みがいまいち追いきれてない(論文もsubstratevmに関してはどれを読めばよいのか)なので頑張ってコード読むなりして勉強していきたい。

参考資料

東福寺 - 通天橋

三連休初日、あまりにも天気が良かったのでぶらっと自転車で東福寺に行ってきた、目当ては通天橋。上の写真は通天橋遠景で通天橋に入場するには東福寺境内から入場料400円支払う必要がある。

www.tofukuji.jp

なんで通天橋に行きたかったというと、最近リリースされた Clean Bandit - Solo feat. Demi Lovato [Japan Edition] の1シーンに通天橋の上でダンサーが踊っているシーンを見てハッとなったからであった。 1分56秒あたりから


Clean Bandit - Solo feat. Demi Lovato [Japan Edition]

https://sociorocketnewsen.files.wordpress.com/2018/09/clean-bandit3.jpg?w=1024&h=576

下記サイトより soranews24.com


この辺が橋の中心部、踊ってたところですね

続きを読む