舎路(シアトル)日記

シアトルで働く日本人プログラマの日記です。

運転むずかしい

Jan 17, 2019

アメリカでも街の方に住んでいるのをいいことに、車の運転から逃げつづけてきたけれど、さすがに観念して自動車学校に通っている。

筆記試験は去年にクリアして、今週は会社に行く前に自動車学校に通っていた。正直いって、車を運転するのは難しい。みんなよくできるなと感心する。当初の予定では5回の講習をうけたあとに実技試験を受けるつもりで予約を入れていたんだけど、どうにも無理そうなので試験は一度キャンセルすることにした。同じ教習所でまた追加で5回レッスンをうけるか、他の教習所でうけるか、何か他のことをするかは考え中。

一方で、車を運転して今日で3日目、時間にしてまだ3時間にも満たないわけで、あまり悲観的にならないほうがいいだろうとも思う。「プログラミングを初めて3時間たつんですが、全く上達しなくて、私は才能がないんでしょうか?」なんて相談されたら困るだろう。

そんなことを自分に言い聞かせながら、しばらくは練習を続ける予定。

Acting the Part: Examining Information Operations With in #BlackLivesMatter Discourse を読んだ。著者らが、アメリカの銃乱射事件のソーシャルネットワーク上での広がりについて調べるべく集めていたデータセットから、Twitter が公開したロシアの企業 Internet Research Agency (IRA) のなりすましアカウント群のツイートを集めて、後者について論じている。

ただし、Twitter の公開した IRA アカウントが2,752個、そこから著者のデータセットに含まれていたものを選ぶと96アカウント、さらにそれを、題名のとおり Black Lives Matter 関係のハッシュタグを使っていて、リツイートでのクラスタリングでもってリベラル/保守の大きいクラスタに含まれているものを、とフィルタして29アカウントに絞っているので、IRA の活動全体を論じるというよりは、その一角だけに迫るような内容になっている。

これらのアカウントは完全に自動化されているわけではなく、中にちゃんと人がいるらしく、普通にツイートしたり、アカウント同士でやりとりしていたり、BlackMattersUS.com なんて外部のウェブサイトやポッドキャストがあったり、普通に見ているぶんには、どう考えてもバレそうにない。

また、リベラル側に混じっているアカウントはリベラル側の極端な、保守側に混じっているアカウントは保守側の極端な主張をツイートしたりリツイートする一方、両クラスタに共通して、既存のメディアへの不信感をツイートしてもしていたらしい。

Together with the high-level dynamics revealed in the network graph, this observation suggests that RU-IRA operated-accounts were enacting harsh caricatures of political partisans that may have functioned both to pull like-minded accounts closer and to push accounts from the other “side” even further away.

著者らが指摘する、IRA によって (ロシア政府によって) 操作されているアカウントが政治的な左右の両極として振る舞い、その分断を促進している、という指摘は、だいぶ不気味な話だと思う。

去年に The Pragmatic Bookshelf から出ている “Software Design X-Rays” という本を読んだけど、そこで紹介されていた論文の一つ、Reading Beside the Lines: Indentation as a Proxy for Complexity Metrics を読んだ。

ソースコードの複雑さを示す指標には McCabe’s Cyclomatic Complexity (循環的複雑度) や Halstead’s complexity metrics (こちらは定訳が無い?) があるけれど、かわりにインデントの深さをみるのはどうでしょう、という論文。著者らは SourceForge から色々な CVS レポジトリをダウンロードしてきて、リビジョンごとの diff に既存の複雑さを示す指標と、提案しているインデントベースの指標を計算して、それらの相関について議論している。

結論からいうと、インデントの総量 (SUM) と、標準偏差 (STD) は比較的高い相関係数を示したとのこと。一方で単純に行数を数えただけ (LOC) でも複雑さを示す指標にそれなりに相関があるのはすこし拍子抜け。

著者の Abram Hindle, Michael W. Godfrey, Ric Holt は、その後もソフトウェアの開発プロセスに関する論文を色々と書いているので、読んでみるのも面白そう。

去年に Twitter で Kentaro Hara さんが紹介していた

Googleの2億行のソースコードを解析した結果、関数に渡す引数の順番を間違える系のバグは、引数の個数が6個以上になったときに著しく増えるので、引数の個数は5個以下が望ましいことがわかったという話。

Andrew et al. の Detecting Argument Selection Defects を読んだ。

題名の通り「引数の渡し間違いによるバグを見つける」ことに挑んだ論文で、著者らは提案しているアルゴリズムを Error Prone のパターンとして実装し、Google 社内のみならず、オープンソースソフトウェアにもバグを報告、実際に修正させている。ここでの「オープンソースソフトウェア」には、なんと OpenJDK の ConcurrentHashMap も含まれている

アルゴリズムはわかりやすい。引数の宣言に使われている名前と、そこに渡されている変数やメソッドの名前とを比較して、文字列同士の編集距離をもって、元々の引数の渡しかたと、静的型的にありえる別の渡しかたについて、どちらが「もっともらしい」かを計算している。

宣言されている引数の名前群を一つの集合、実際に渡されているものの名前群をもう一つの集合として、bipartite graph (二部グラフ) を構築して、Hungarian algorithm (ハンガリアン法) で解いているのが、私にはちょっと新鮮だった。ナップザックに何かをつめるなんて面接でしか解かないのでは、なんて思っていてはいけない。

ちなみに、単純なアルゴリズムだけでは false positive が多いらしく、色々とヒューリスティックも実装されている。例えばメソッドやクラスの名前が backwardsFooBar だったら、引数をひっくりかえして渡しているのは意図的かもしれない。論文では「正規表現でそういう名前を見つけます」なんて漢らしいことが書いてあったけれど、Error Prone の Java コード側を見ると、EnclosedByReverseHeuristic に単語のブラックリストがあった。どちらにしても涙ぐましい。

冒頭で引用した「引数の個数が6個以上」というくだりは、後半の “API DESIGN IMPLICATIONS” に登場する。一方で Error Prone の Java コード側、ArgumentSelectionDefectChecker を見ると、早速引数を6つ渡していたりする。名前つき引数が無い言語は辛い。

去年のこと

Jan 3, 2019

2018年末には steps to phantasien が更新されることはなかったらしく、ちょっと残念。インターネットから人々が消えていくのは悲しい、と一瞬だけ思ったけれど、moritta さんは Misreading Chat というポッドキャストを一年近くやっているわけで、むしろ私よりずっとがんばっているのだった (よく聞いてます)。

そういえば以前に、

steps to phantasien の文体やスタイルにやられてブログがパスティーシュめいてくる現象を、ぼくはこの数年間でいくつも目撃してきた。これをひそかにモリタ・シンドロームと呼んでいる。

なんて書いていた mooz さんとは、去年に、Twitter 経由で一緒にご飯を食べる機会があった。普段はソーシャルメディアから距離をおくようにしているのだけど、こうやってインターネットで文章を読んだことがある人に気軽にあったりできるのは良い。逆に、2018 Advent Calendar 2018参加しそこねたのは、その距離のとりかたが裏目に出た出来事だった。