giantneco’s blog

技術メモ

新宿 Geek Lounge 第1回に参加してきた

7 月 6 日に新宿で行われた新宿 Geek Lounge に参加してきた。 新宿 Geek Lounge はセプテーニオリジナルさん主催のイベントで、今回が最初の開催になる。 Scala を使っている会社なだけあって、今回のテーマも Scala だった。

開始時間が割りと遅めだったので、夕飯をがっつり食べてきてしまった。

Akka の話

OE_uia さんの VoIPScala + Akka で作った話 資料はここ https://www.slideshare.net/TaisukeOe/real-world-android-akka-77574727

  • Scala + Akka を Android 上で使用して、ステートフルな非同期ストリームである VoIP にうまく対処した
    • Akka で状態を Actor 内に隔離したり、Actor ヒエラルキーで子の監視をしたり
  • ScalaAndroid で使うにはビルドなどで工夫が必要になるが、いろいろツールは用意されている
    • ただやはり 64K 制限の対策が必要だったり、AndroidJava バージョンに起因する問題などもある

個人的には Android ではもう Kotlin でいいんじゃないかとも思うが、確かに Actor を使えるのは便利かも。

Scala Colletion Method 入門

parallelto さんによるコレクションメソッドの話。 資料はここ https://speakerdeck.com/parallelto/scalakorekusiyonmesotudoru-men

内容てしては、コレクションメソッドを使う上での注意点や、あまり使われていないが便利なコレクションメソッドの紹介がされていた。

コレクションメソッドはやはり便利だが注意すべき点もあるので、ここら辺ハマる人は多そうだな。

プログラミング言語雑感

3,4 月あたりに仕事で複数の言語を触る機会があったので、その時に得た知見を書き留めておく。 ちなみに作業自体はコードの静的解析に関するもので、 各言語のリントやパーサ周りについて調査して、ほしいメトリクスがなかったら実装するというものだった。

Go

社内で Go 言語勉強会を開いていたのもあり、コードを書き始めるのにそれほど手間取らなかった。 型を書かずに初期化できる:=記法と、型を後置する記法は慣れてくるとと非常に使い勝手がよかった。 逆に公開する関数・構造体の頭文字を大文字にするのは最後まで慣れなかった…。

パーサも言語組み込みで用意されていてかなり扱いやすい。 静的解析ツールも数多くあったので CI に組み込めると開発が捗るはず。

Python

しょっちゅう触っている言語。今回触った言語の中では一番使っている。

関数のステップ数を測るリンターがないかと探していたのだがなんとこれがなかった。 どうも PEP にもステップ数に関する規約がないので、おそらく PEP に取り入れられない限りは静的解析ツールでの対応もないはず。

パーサは言語組み込みのastモジュールがありこれを使って作業したが、ASTノードの終了行がずれるというバグがあって結構苦労した。

Clojure

「七つの言語、七つの世界」を読んだときに Clojure は少し触っている。

emacsparedit-mode はかなりよく、コードの変形が非常に直観的に出来た。 paredit-mode もそうだが、cider-mode などあり emacs との相性が非常によい。 ここら辺はさすが Lisp という感じで、他の言語ではなかなかできないじゃなかろうか。 関数型言語として書いている楽にかけていたものの、オブジェクト指向で副作用を入れ始めるとつらくなってくる。正直あまりうまく書けてなかったと思う。

静的解析ツールはそれほどない。試した中ではeastwoodがよさそうだった(ツール名は何かのダジャレらしいがわからず)。

パーサはtools.analyzerというものが公式に用意されていて最初はこれを使おうと思っていたのだが、 マクロを展開してしまうため元のコードのメトリクスを測るという目的には使えなかった。 代わりにrewrite.cljというサードパーティのライブラリを使ってなんとか解決できたが、最初の想定より苦した。

TypeScript

TypeScript にはこの作業時に初めて触った。とはいえ javascript と npm には触ったことあったので、導入までさほど苦労はしなかった。 やはりこういう環境を楽に作れる仕組みは、新しく出てきた言語が受け入れられるには必要な条件なんじゃないかと思う。 触った範囲だと javascript に型が付いたぐらいだが言語としての出来は非常に良かったと思う。 一方でビルド周りは今一つ。結局何でビルドするのが良いのかその時はわからず、Makefile で書いてやろうかとも一瞬思ったり。今ドキュメント見たら gulp を使った場合が書かれていた。そうなの?

新しい言語だけあってメトリクス測定は少ししかない。tslintというのがあるくらい。

パーサは typescript が提供する API を使えば楽に利用できるので、静的解析ツールは割と楽に作れると思う。

Swift

Swift もこの作業時に初めて触った。 残念ながら、がっつり実装するところまでは進まず、ほぼ調査だけで終わった。 すこし見た印象だが、すごい驚きがあるような言語でなかったと思う。 あと驚いたことにセルフホスティングされた言語ではなかった。

静的解析ツールはswiftlinttailorというのがあるくらい。

またパーサは提供されていない。 代わりに SourceKit を利用すると、ある程度ソースコードを解析した情報が取れる。 ただこのライブラリは SourceKitService というデーモンに問い合わせをしているもので、 これを利用して独自に静的解析ツールを作るのは厳しいんじゃないかと思う。 もしやるのであればtailorが ANTLOR を使ってやっているように、外部のパーサジェネレータを使って作ることになるかと。

その他

メトリクス測定ツールを探すさいには次のページを参考にした。

wikipediaにも静的コード解析ツールのリストがあったが、こちらは最近の言語についてはあまり紹介されていないようだった

DDD 本第3部

DDD の第3部を読んだ。 詳細は社内勉強会向けの発表資料でまたまとめる予定。

第3部はモデル及び実装のリファクタリングについての話である。

実装でなく、モデルをどうリファクタリングするかの話もあって、この部分は DDD っぽい。 ドメインエキスパートとの会話で、どこに気を付けるとリファクタリングのきっかけを見つけやすいか?というのは覚えておいて良さそうだ。

他には実装向けのリファクタリングの際に有用なパターンの実例に加え、アナリシスパターンデザインパターンの紹介が出てきた。モデルのリファクタリングに比べると目立って変わった手法は紹介されていない。

DDD のプレゼンでよく出る第2部、第4部あたりに比べて第3部の話を聞かないのは、 DDD 独自のリファクタリング手法というのがあまりないからなんだろう。 IDDD本でもこの部に対応する話はなかったような気がする。

ジェネリクス勉強会

ジェネリクス勉強会(https://connpass.com/event/56773/)に参加してきた。 会のテーマはジェネリクスで、その話を含めればおおよそ何でもよい感じの話。 テーマがテーマなので Java に言及することが多かった。一方で関数型言語の話は控えめ (最後のセッションが Scala だったが、その前に時間切れで途中で帰ってしまった…これはかなり残念)

ジェネリクス ディスパッチ 表裏 by κeen さん

Java と Rust、ときどき Scala で見るジェネリクス実装方法の違いの話。 実装面まで踏み込んで調べたことはないので興味深かった。Rust も楽しいそう。

また存在型についての話もあった。 存在型については一度調べたことがあるはずなのに、全然覚えていなかった。TaPL を読もう。 ただ存在型があった方がいい場面というのがいまいちイメージできず理解できてない。

ジェネリクスの概論とか by なぎせさん

ジェネリックスとはなんぞやという話。 Java8 で型推論が強化されたらしいが、最近も最近の Java を使えてないのでどうも恩恵を受けれてない。 あとこの発表を聞いて、リスコフ置換原則は若干間違えて覚えていたことがわかった。あぶない。

拡張可能レコードの恩恵 by fumieval さん

Haskell.Generic に関連していると思われる話。正直ついていけてなかった。

Generics on Xamarin products by atsushieno さん

https://speakerdeck.com/atsushieno/generics-on-xamarin-products

Xamarin でのジェネリクスの話。Xamarin、というか Mono は C で書かれていて、 その上でジェネリクスを実装するのはかなり大変だったらしい。 プリミティブがジェネリクスの引数に来てしまうとアドレスがずれてしまうとのこと。 解決策としては昔は多めに引数の領域をとるようにしていたが、現在はスタック上に 引数を置いて、後で CPU 側のトランポリンでメモリアドレスを構成しなおしている。

Xamarin についてはくわしくないが、低レイヤの話もあったので、かえって自分にはわかりやすかった。

Fluent Design のすすめ by haochenxie さん

Java で Fluent Design を構築するために、ジェネリクスをうまく使いましょうという話。 特に入れ子構造になる Fluent Design を実現するにはジェネリクスを使う必要があって、 かつその使い方がかなり工夫されていた。

どうせ Java でしょ?と思っていたが思いのほか楽しかった。 とくに Javaジェネリクスの文脈で継続が出てくるとはまったく思っていなかった。

あと、Java の型システムは実はチューリング完全で、また安全でもないという話は結構驚いた

2017 年 6 月の文化活動

  • 行ってきた美術館・博物館展
    • 大英自然史博物館
    • マーベル展
  • 観た映画
    • ローガン
    • メッセージ
  • 読んだ本
    • バッタを倒しにアフリカに

ううむ。それほど文化的な感じがしない。映画見逃したのがある気がするし、読書に時間を使えていないのもよろしくない

システムプログラミング会

システムプログラミング会に参加してきました

7/2のシステムプログラミング会に参加してきました。

募集期間が非常に短かったのですが、たまたま TL を覗いた時に見つけたのでなんとか参加申込することができてラッキーでした。

時間切れのため途中で帰ってしまったのですが、懇親会を含めると結構長い時間やっていたようです。

以下メモ。

New LLD Linker for ELF by Rui Ueyama (@rui314)

  • windows 上でもリンクできるようにしたい
    • もともとのモチベーション
  • コンパイラとかデバッガとか移植しないといけない
    • 作ってみたら意外とうまくいって、オープンソースなのでUNIXに移植しようということになった
  • 現在 GNU でないといけないのはリンカぐらいしかない
    • BSDGNU LD から移行したい
    • 現時点で BUILD WORLD とかは動く
  • MIPSに対応
  • icf オプション
    • identify content folding
      • ふつうは名前でまとめるが、このオプションをつけるとコンテンツをま とめてフォールディングする
      • 基本的にはグループ分けして内容が違ったら分割、リロケーションがさしている先が同じだったらまとめる
      • 平衡に達したらマージ可能なグループになる
  • LLD の設計としては、余計なことをしないことを主眼においている
  • GNU LD のシンボル解決
    • 引数の順序によってリンクのされ方が異なるという問題があった
    • LLDではかなり変えていて、ファイル渡す順序によらずシンボルを解決している
  • ファイルサイズはかなり小さくできている。
    • C++ で10,000行ぐらい。
  • リンク時の名前解決
    • ハッシュ使用
      • 少なくとも1回はハッシュを使う 名前解決のため ハッシュに名前を入れるのも結構時間がかかる
      • C++だと関数が 50 バイトくらいなっていたり 名前の変更がポインタの変更になっている
    • 別のファイルを読んだときに、すでにハッシュキーがあったらその先を書き換えて内容を変えたことにする
    • wrapの利用
      • ld で wrap オプションを渡すと、malloc__wrap_mallock にリンカされる。
        • もとのmalloc__real_malloc で参照可能になる
  • LLVM
    • Link Time Optimization (LTO)
      • グローバルなビューをリンカはもっている。
      • LLVMバイトコードをもっているので、リンカが名前解決をするときに そのバイトコードを使ってネイティブコードに落とす (よくわからん)
  • 今後の目標。 FreeBSDで普通に使う。カーネルのビルド。
  • ハッシュ関数
    • 早くするために何かしているか?
      • 普通のハッシュ関数を使っている
      • はやくしたらというアイディアはある
      • キーはヌル終端なものなので、strlen で結構時間を食っている
        • 長さを渡してあげれば?あるいは sha1 でできないかなど

          感想

          GNU LD についても知っているようで知らなかった話が結構聞けてよかった。

現状の GNU LD のことを考えると、案外あっさり置き換えられたりするのかも。

Kati @shinh

LLVMC++コンパイラフロントエンドつくった @Lind_pp

感想

LLVM 使うとやっぱりこういう風になりそうな気はする。

質問タイムであったように最適化とかをやりたいというような用途には向いていないっぽい。

なんかトレースする話 @nalsh

Programming TCP for responsiveness by Kazuho Oku (@kazuho)

  • http://www.slideshare.net/kazuho/programming-tcp-for-responsiveness
  • H2O HTTPサーバ
  • レスポンスのために、データが CWND を超えてTCPパケットを送信できるようになったらすぐ送信できるようにしたい
  • データは TCP send buffer と BIO buffer にためられる
  • BIO buffer は TCP send buffer からあふれた分
    • poll して SOCKET_IS_READY になった段階で書、残り 6 bit をき込むことで BIOとしてめずに済む
    • それでもまだ poll が SOCKET_IS_READY になる閾値は CWND より大きい
    • socket オプションの TCP_NOTSENT_LOWAT を 1 に設定
      • 0 だといろいろ問題が起きてしまう
    • これで CWND + 1 になったときにデータを送れるようになった
  • ただし send buffer が小さくなったことでの弊害もあり

感想

実をいうと、最初聞いたときはあんまりよくわからなかった。

あと HTTP2 もよくわかっていない。つらい。

Fron IA-32 to AVX-512

感想

ここら辺はトイレに行っていて半分くらい聞けてなかった。

ASTをXMLで表現する、というのは仕事でやったことがあるが、あんまりやらないほうがいいのかも。

L1キャッシュ @kumagi

  • Radix Sort
  • SoftWare Write Combining
    • CPU の書き込み先メモリアドレスを絞り、L1キャッシュに乗せられるよう にする
    • Intel のマニュアルに書いてある

      感想

      この話は面白かったが、あまりついていけてない。資料が公開されいたら読みたかったがなさそう。 とりあえず Intel のマニュアルと、Radix ソートについては調べておきたい

      StackExchangeでみたシステムプログラミング案件 by @hogegashi

  • https://docs.google.com/presentation/d/1Y62OO574mcnaKItgAFIO49jCkZ4lOnUY0sMyUgAwQMs/edit#slide=id.p
  • StackExchange は面白い
  • 実行中にシステムコールを全く行わないUNIXコマンドはあるか?
  • システムコールなしでシグナルをどれだけ呼び出せるか?

    感想

    ここも案外知っているつもりで知らないことが多かった。 普通のコマンドではかならずexit()が呼ばれる、というのも、言われてみればそうだがあんまり意識したことはなかったし、結構盲点を突かれた感じ。

俺々OS用スケジューラの設計と実装 by @yitabashi

  • オレオレOSスケジューラをつくったという話

REMarks by @mkasahara

  • 実行したコマンドを自動的に記録して、再度コマンドを実行する Makefile? を生成する
  • LD_PRELOAD を使用して open を入れ替えて、開いたファイルを記録
  • LD_PRELOAD でライブラリを読み込んだときに、ライブラリが procfs を open をしていたので、/proc 下を無視する必要があった

    Out-of-thin-air by @yamasa

  • メモリモデル作成の歴史
    • Double-checked loading の記事が発端
    • data race で undefined な挙動になるなら、そもそもそれを考えずに最適化してもいい(C,C++)の場合