Islands in the byte stream

Technical notes by a software engineer

h2ologにみるBPF toolsの構造と設計

最近はお仕事で h2olog を開発しています。これはC++で書いたBPF toolsで、H2Oに組み込まれたUSDTが出力するイベントをトレースするためのツールです。 具体的にはこんな感じで使ってH2OプロセスをトレースしてJSON-Linesにして出力します: # QUICを有効にし…

1年ほど視力障害を経験した

アデノウィルスによる流行性角結膜炎という病気があって、これに保育園〜子供経由で感染した*1結果、しばらく視力障害になりました。これは回復まで約1年半かかり、いまはほぼ回復しましたが、一時期はメガネをしていても両目ともに視力0.1程度といった様相…

git tips: git push $remote HEAD で現在のブランチを$remoteにpushできる

git tips: git push $remote HEAD で現在のブランチを$remoteにpushできて、コマンドラインでgitを使うときはよく使います。 ところで、この HEAD の実体はファイル(.git/HEAD)なので、ファイルシステムが大文字小文字を無視する(case-insensitive; e.g. …

BCCでBPF toolsの開発をするための基礎知識

最近仕事で h2olog を開発しています (H2O の QUIC 層をトレースしよう | Toru Maesaka) 。これはh2oのUSDT からデータを取り出すBPF toolです。その関係でBPFとかBCCをいろいろ触ったので、BPF toolsの開発に必要なことを書いておきます。 なおBCCまわりは…

Ubuntuで任意のバージョンのLinux Kernelにする

Ubuntuなどのディストリは、ディストリに同梱されたカーネルを別のバージョンに差し替えることができます。開発者の視点では、たとえばLinuxのBPFを使ったツールを開発しているときはカーネルのバージョンを本番に合わせたほうがよかったりします。 Ubuntu用…

フィルターバブル vs QoL至上主義

フィルターバブル (filter bubble) とは、「インターネットの検索サイトが提供するアルゴリズムが、各ユーザーが見たくないような情報を遮断する機能」(フィルター)のせいで、まるで「泡」(バブル)の中に包まれたように、自分が見たい情報しか見えなくな…

Google公式のLinux用Chromeバイナリのバージョンを調べる

UbuntuなどにむけたChromeバイナリのインストール方法をググると以下のようなコマンドを指示されるわけですが wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - sudo sh -c 'echo "deb https://dl.google.com/linu…

2019年はキャリアの方向性を大きく変えた年だった

2019年のまとめです。 前半3Qはウェブアプリのバックエンドやフロントエンドを開発し、最終1Qで転職してC言語でHTTPサーバーを開発するという感じに大きく方針を転換した年でした。 転職にあたっては「毎日楽しく開発をしたい」「生涯現役のプログラマーでい…

JSConf JP 2019で "How to Boost Your Code with WebAssembly" という話をしました

abstract: https://jsconf.jp/2019/talk/fuji-goro Wasmを触り始めるにはまだ少しはやくて、おそらく2020年にはリリースされるであろうSIMDなどがほしいところです。とはいえ、JSの最適化コンパイラ(スライドではV8のTurboFanにだけ触れていますがほかのJS…

Fastly に入社しました

2019年9月9日からFastlyに入社しています。勤務地は東京です。今後ともよろしくお願いいたします。 前職の Bit Journey, Inc. では3年ほどKibelaのサーバーサイドやフロントエンドアプリの開発に関わりました。Bit Journey在職中に子供がうまれ、現在も夫婦…

NodeJS v12.9.0 で writev(2) へのインターフェイスが追加された

writev(2) は バイト列の配列を1つのシステムコールでまとめて書き込めるやつです。 NodeJS的には、ArrayBufferView (典型的にはtyped array)の配列を fs.writev() (または fs.writevSync() や FileHandle#writev())に渡せるようなインターフェイスにな…

Emscripten & WebAssembly Night #8 で「AssemblyScriptでライブラリコードの高速化をしてみる」という発表をした

発表の機会をいただきありがとうございました。会場を提供していただいたメルカリさんにも感謝いたします。 「AsssemblyScriptはTypeScriptのサブセットだから実質TypeScriptを書くだけでパフォーマンスアップ!」みたいな言説をみるにつけ、「ええ〜ほんと…

webpack v4.35.3 の JSON loader は JSON.parse() を実行時に行うコードを生成する

ちょっとまえに The cost of JavaScript in 2019 · V8 というブログが話題になりました。 このなかで次のように説明している箇所があります: As long as the JSON string is only evaluated once, the JSON.parse approach is much faster compared to the J…

graphql-ruby で MessagePack の timestamp 型を使う

GraphQL APIのシリアライザとしてMessagePackを使うとGraphQLのcustom scalar typeを活用したくなりますね。ということで、graphql-rubyの ISO8601DateTypeを参考にMessagePackのtimestamp型にシリアライズ・デシリアライズできるようにします。 これまでの…

msgpack-ruby に timestamp型を実装した

timestamp型というのは2017年8月にMessagePackに追加された型です。 frsyuki.hatenablog.com しかし、おそらくMessagePack開発元がtimestamp型を使っていないためか、長らく msgpack-ruby には実装されていませんでしたし、msgpack-java の実装もpull-reques…

GraphQLとMessagePackは相性がよさそう

MessagePackはJSONのようなデータをシリアライズできるbinary formatで、JavaScript実装である msgpack-javascriptを基準で考えると次のような特徴があります: JSONよりencodeもdecodeも少し速い かつ、streaming decodeができるので fetch() のresponseのde…

JavaScript libraryのREADMEにブラウザ互換性表バッジを表示することについての諸々

ブラウザ互換性表 (a.k.a. browser matrix) とは、こういうやつです。 ブラウザ互換性表 powered by Sauce Labs TypeScriptで MessagePack encoder/decoder を実装した - Islands in the byte stream で作った msgpack/msgpack-javascript にこのバッジをつ…

TypeScriptで MessagePack encoder/decoder を実装した

npm install @msgpack/msgpack でインスコできます。NodeJS v12 でベンチマークしたかぎり、JSONと同程度の速度で、これまで最速といわれてきた msgpack-lite よりもさらに少しだけ高速です。 github.com もともとこのリポジトリには uupaaさんによる実装(t…

エンジニアHubにTypeScriptの記事を書きました

employment.en-japan.com 「GraphQL」徹底入門 ─ RESTとの比較、API・フロント双方の実装から学ぶ に引き続き、TypeScriptの記事を書きました。 TypeScriptに苦手意識を持っている人に向けて再び触るきっかけを作りたいと考えて書いたので、細かい言語仕様に…

TypeScriptの型情報を利用したCustom Transformerの現状確認

TypeScriptのコンパイラ・プラグインとして振る舞いASTの操作を行えるcustom transformer (AST preprocessor) が実装されたのは TypeScript 2.4 (2017年) でした。 そのときの様子は次のエントリに非常によくまとまっています。 [TypeScript 2.4] custom tra…

Rails.application.credentials.foo は fetch(:foo) にすべき

表題のとおりで、fetch(...) はエントリが存在しないと例外を投げるため、エントリが存在しないときに nil を返すアクセサよりもtypoに対して安全です。 こういうのは rubocop-rails でカバーできるといいなと思って起票して、良さそうというコメントはもら…

SafariにはMediaQueryList.prototype.addEventListenerがない

ないと困るので、 polyfillをつくりました。MediaQueryList すら実体がないので、やむをえず mathMedia() を上書きしています。 // MediaQueryList.prototype.addEventListener.ts if (typeof matchMedia !== "undefined" && !matchMedia("all").addEventLis…

なぜTypeScriptに失望してしまうのか

TypeScriptに対する失望は2パターンあって、その理由は理解できるのですが、いずれにせよそこでTypeScriptを捨てる判断をするのはもったいないと思っています。この2つの失望を感じたとしてもなお、TypeScriptには導入する価値があると思っています。 パター…

エンジニアHubに『「GraphQL」徹底入門』という記事を寄稿しました

書きました*1。 employment.en-japan.com GraphQLという規格そのものについての解説が前半で、後半はRailsアプリのWeb APIをRESTful APIからGraphQL APIに書き換えるというハンズオンです。 GraphQLの特徴やら Swagger, gRPC, etc との比較はわりとよく見か…

potatotips #56 で 「OSS開発のリテラシー / Android編」という発表をしました

追記: 加筆修正してGitHub projectにしました: https://github.com/gfx/android-oss-best-practices paper.dropbox.com (potatotips #56 (iOS/Android開発Tips共有会) - connpass) 久しぶりのpotatotipsでのLTでした。 「OSS開発のリテラシー」は他の言語版…

apollo-boost はサンプルコード専用と思ったほうがよい

追記: Apollo Boost は Apollo Client に統合される見込みのようです。Apollo Client 3.0 Roadmap · Issue #33 · apollographql/apollo-feature-requests · GitHub TypeScript用のGraphQL clientであるところの Apollo ですが、これのGet Startedなどのドキ…

Reactをv16にアップグレードしたらuglifyjsの秘孔をついてハマった件

追記: Terser v3.10.11 でこの問題が修正されていることを確認しました。現在は collapse_vars: false というワークアラウンドは不要になりました。 webpackのproduction buildの話です。 Reactが悪いわけではないんですが、たまたま秘孔をつくコードがReact…

Code Review Meetup #4 で「歴史的経緯の説明 as code」という発表をしました

Sider社の開発する Querly を使うと「歴史的経緯の説明」をコード化できるよという話です。 Querlyの話は以前も書いたことがあります: プロジェクト固有のルールを指定できるLinterであるところのQuerlyがめちゃ便利 - Islands in the byte stream Querlyは…

特定のファイルに対して一定のテストカバレッジを保証する

ある特定のファイルのテストカバレッジが、ある特定のテストファイル(群)を実行したときに一定のカバレッジ率であることを保証したいと思うことはありますか?私はあります。 そこで、 次のような spec/coverage_helper.rb を用意して、 spec/rails_helper…

cmake-js があれば node-gyp に依存せず NodeJS native addon を作れそう

github.com cmake-js という cmake のラッパーを使うと、 node-gyp を使わずに NodeJS native addon を作れるみたいです。 node-gyp は Python 2.x に依存しているのが嫌なので、 node-gyp 依存をなくせるというだけで個人的にはけっこう嬉しかったりします…