新宿 Geek Lounge 第1回に参加してきた
7 月 6 日に新宿で行われた新宿 Geek Lounge に参加してきた。 新宿 Geek Lounge はセプテーニオリジナルさん主催のイベントで、今回が最初の開催になる。 Scala を使っている会社なだけあって、今回のテーマも Scala だった。
開始時間が割りと遅めだったので、夕飯をがっつり食べてきてしまった。
Akka の話
OE_uia さんの VoIP を Scala + Akka で作った話 資料はここ https://www.slideshare.net/TaisukeOe/real-world-android-akka-77574727 。
- Scala + Akka を Android 上で使用して、ステートフルな非同期ストリームである VoIP にうまく対処した
- Akka で状態を Actor 内に隔離したり、Actor ヒエラルキーで子の監視をしたり
- Scala を Android で使うにはビルドなどで工夫が必要になるが、いろいろツールは用意されている
個人的には 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 は少し触っている。
emacs
の paredit-mode
はかなりよく、コードの変形が非常に直観的に出来た。
paredit-mode
もそうだが、cider-mode
などあり emacs
との相性が非常によい。
ここら辺はさすが Lisp という感じで、他の言語ではなかなかできないじゃなかろうか。
関数型言語として書いている楽にかけていたものの、オブジェクト指向で副作用を入れ始めるとつらくなってくる。正直あまりうまく書けてなかったと思う。
静的解析ツールはそれほどない。試した中ではeastwood
がよさそうだった(ツール名は何かのダジャレらしいがわからず)。
パーサはtools.analyzer
というものが公式に用意されていて最初はこれを使おうと思っていたのだが、
マクロを展開してしまうため元のコードのメトリクスを測るという目的には使えなかった。
代わりにrewrite.clj
というサードパーティのライブラリを使ってなんとか解決できたが、最初の想定より苦した。
TypeScript
TypeScript にはこの作業時に初めて触った。とはいえ javascript と npm には触ったことあったので、導入までさほど苦労はしなかった。
やはりこういう環境を楽に作れる仕組みは、新しく出てきた言語が受け入れられるには必要な条件なんじゃないかと思う。
触った範囲だと javascript に型が付いたぐらいだが言語としての出来は非常に良かったと思う。
一方でビルド周りは今一つ。結局何でビルドするのが良いのかその時はわからず、Makefile で書いてやろうかとも一瞬思ったり。今ドキュメント見たら gulp
を使った場合が書かれていた。そうなの?
新しい言語だけあってメトリクス測定は少ししかない。tslint
というのがあるくらい。
パーサは typescript が提供する API を使えば楽に利用できるので、静的解析ツールは割と楽に作れると思う。
Swift
Swift もこの作業時に初めて触った。 残念ながら、がっつり実装するところまでは進まず、ほぼ調査だけで終わった。 すこし見た印象だが、すごい驚きがあるような言語でなかったと思う。 あと驚いたことにセルフホスティングされた言語ではなかった。
静的解析ツールはswiftlint
とtailor
というのがあるくらい。
またパーサは提供されていない。
代わりに 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 のジェネリクスの文脈で継続が出てくるとはまったく思っていなかった。
2017 年 6 月の文化活動
- 行ってきた美術館・博物館展
- 大英自然史博物館
- マーベル展
- 観た映画
- ローガン
- メッセージ
- 読んだ本
- バッタを倒しにアフリカに
ううむ。それほど文化的な感じがしない。映画見逃したのがある気がするし、読書に時間を使えていないのもよろしくない
システムプログラミング会
システムプログラミング会に参加してきました
7/2のシステムプログラミング会に参加してきました。
募集期間が非常に短かったのですが、たまたま TL を覗いた時に見つけたのでなんとか参加申込することができてラッキーでした。
時間切れのため途中で帰ってしまったのですが、懇親会を含めると結構長い時間やっていたようです。
以下メモ。
New LLD Linker for ELF by Rui Ueyama (@rui314)
- windows 上でもリンクできるようにしたい
- もともとのモチベーション
- コンパイラとかデバッガとか移植しないといけない
- 現在 GNU でないといけないのはリンカぐらいしかない
- MIPSに対応
- icf オプション
- identify content folding
- ふつうは名前でまとめるが、このオプションをつけるとコンテンツをま とめてフォールディングする
- 基本的にはグループ分けして内容が違ったら分割、リロケーションがさしている先が同じだったらまとめる
- 平衡に達したらマージ可能なグループになる
- identify content folding
- LLD の設計としては、余計なことをしないことを主眼においている
- GNU LD のシンボル解決
- 引数の順序によってリンクのされ方が異なるという問題があった
- LLDではかなり変えていて、ファイル渡す順序によらずシンボルを解決している
- ファイルサイズはかなり小さくできている。
- C++ で10,000行ぐらい。
- リンク時の名前解決
- LLVM
- 今後の目標。 FreeBSDで普通に使う。カーネルのビルド。
- ハッシュ関数
現状の GNU LD のことを考えると、案外あっさり置き換えられたりするのかも。
Kati @shinh
- http://shinh.skr.jp/slide/kati_sp/031.html
- ビルドシステム
- Android Platform
- アプリ開発者というよりデバイス開発者向け
- 結構でかい
- 普通にmakeをつかっている
- Android.mk
- Kati で GNU Make より高速ビルド
- 最初は Go で書いていたが GC が遅いため C++ で書き直した
LLVM と C++ でコンパイラフロントエンドつくった @Lind_pp
- https://speakerdeck.com/rhysd/make-a-compiler-frontend-using-c-plus-plus-and-llvm
- プログラミング言語 Dachs
- Ruby like な緩い構文
- 強い型づけ+型チェック成
- パーサジェネレータの Boost.Spirit
- 意味解析と LLVM IR の生成は vistor パターンを使用
感想
LLVM 使うとやっぱりこういう風になりそうな気はする。
質問タイムであったように最適化とかをやりたいというような用途には向いていないっぽい。
なんかトレースする話 @nalsh
- https://speakerdeck.com/naruse/nankatoresusuruhanasi
- ps -elF
- perf top
- 楽しい
- 特権が必要
- procfs
/proc/<pid>/stat
- 実行中のアドレスがわかる
- バイナリと合わせて実行中の関数が推測できる
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 からあふれた分
- ただし send buffer が小さくなったことでの弊害もあり
感想
実をいうと、最初聞いたときはあんまりよくわからなかった。
あと HTTP2 もよくわかっていない。つらい。
Fron IA-32 to AVX-512
- http://www.slideshare.net/herumi/from-ia32-to-avx512
- i386
- 32bit汎用レジスタ eax,ebx,... 8つ
- eax 下位 16bit が ax, ax の下位 8bit が al
- modR/M
- パーシャルレジスタストール
- ax を操作した後に eax を操作するとペナルティ。遅くなる
- x64
- レジスタは 16 個に
- modR/M のために re プレフィクス
- 32bit 操作をすると上位 32 bitはクリアされる
- NOP命令が追加
- AVX
- コンパイラのバグでパーシャルレジスタストールが起きた事例
感想
のちのセッションでもあったが、Intel の Software Developer's Manual は目を通しておいたほうがよさそう。 この勉強会に来るまで存在も知らなかったので、またも不勉強が露呈した。Unix Domain Socket by 田中哲
- http://www.a-k-r.org/d/2016-07/2016-07-02-unix-socket-api-problem.pdf
- UnixDomainSocket ふるまいは多様()
- APIが腐っている
- sun_len
- ソケットアドレスの終端
- NULL終端で判断する
- 引数で渡されたサイズを使用する
- etc
- 表現方法が複数あるので混乱が起きる
- APIデザインは重要
コンパイラをつくった話 by 七誌 (@7shi)
- https://onedrive.live.com/view.aspx?resid=FB45E1F8CE8B532E!82121&ithint=file%2cpptx&app=PowerPoint
感想
ここら辺はトイレに行っていて半分くらい聞けてなかった。
ASTをXMLで表現する、というのは仕事でやったことがあるが、あんまりやらないほうがいいのかも。
L1キャッシュ @kumagi
- Radix Sort
- SoftWare Write Combining
- https://docs.google.com/presentation/d/1Y62OO574mcnaKItgAFIO49jCkZ4lOnUY0sMyUgAwQMs/edit#slide=id.p
- StackExchange は面白い
- 実行中にシステムコールを全く行わないUNIXコマンドはあるか?
- システムコールなしでシグナルをどれだけ呼び出せるか?
感想
ここも案外知っているつもりで知らないことが多かった。 普通のコマンドではかならず
exit()
が呼ばれる、というのも、言われてみればそうだがあんまり意識したことはなかったし、結構盲点を突かれた感じ。
俺々OS用スケジューラの設計と実装 by @yitabashi
- オレオレOSスケジューラをつくったという話
REMarks by @mkasahara
H1
H2
H3
int main () { return 0; }