カテゴリー
ツール

go-license-detector – オープンソースのライセンスを判定してくれるツール

go-license-detector は、プロジェクトのドキュメントファイルをスキャンして、そのプロジェクトがどんなライセンスかを推定するというツールです。SPDX で400種類近くに分類されている多種多様なライセンスの分類名(identifier)の形でライセンス情報を返します。

従来のツール

Ruby製のLicenseeでは、ライセンスファイルの存在や、既知のライセンスファイルとの一致度を見て、オープンソースのライセンスが何かを判定しています。GitHub 自身も、各リポジトリのライセンスを判定するのに利用しているそうです。

他にもいくつか、Google の licenseclassifier などライセンスを推定するツールはあるのですが、go-license-detector は以下の特徴があるそうです。

  1. 誤判定があっても、「不明」という結果を少なくする方向の検出
  2. Golang による高速な処理
  3. GitHub の人気トップ1000リポジトリ(手動でライセンスが判定されている)をできるだけ当てられることを目指す
  4. SPDX の分類に従う

精度比較

ブログ記事では、既存の各ツールとの判定精度の比較をしています。902のソースコードを判定し、ライセンスがあるものに関して99%という高率の判定結果、また、判定の速度もとても優秀ということ。

現在は LICENSE や READEME など、一定の種類の名前でライセンス情報を探そうとしていますが、それらのファイルについて既存のライセンス文書との一致をみるにしても、単なる一致ではなく単語のゆらぎやミススペルなどまでケアしているようです。

何か一つオープンソースのプロジェクトが有ったとして、そのライセンスが何であるかを当て、それを信じて利用するというよりは、多数のリポジトリをまとめて分析するような用途に向いているのかなと思いました。

via Detecting licenses in code with Go and ML · source{d} blog

カテゴリー
情報共有ツール

Aileen – 周囲のWiFiデバイスをカウントしてその場の人数を記録するツール

Aileen は、WiFi の電波から周囲にあるスマートフォンなどのデバイスを数え、記録するためのツールです。

WiFi がオンになっているデバイスのMACアドレスを使って、周囲にあるデバイスの数を記録し、時系列データなどをダッシュボードでまとめて表示します。(MACアドレスはハッシュ値のみ保存されます)

Aileen は、利用者として NGO による人道的な活動を想定しているということ。たとえば、難民キャンプでの人の出入りや活動を見守る、といった使い方です。キャンプの中にいる難民の数の変化をより正確に計ることで、サービス提供側の人員計画などを立てやすくすることができるのだとか。

先月にはコードがオープンソースで公開されており、WiFi 情報を収集して利用するというセンシティブな目的に対し、正体不明の第三者のツールに頼らずに済むのが利点だということです。

また、難民キャンプなどでは常に安定したインターネット接続が使えるとは限りません。そのような利用シーンを考え、Aileen を動かすPC自体はインターネット接続が無くても動けるようになっています。複数台を設置してデータ収集している場合は、ネットに接続した時点で情報を送信するそうです。(ハッシュ化された個々のMACアドレスを送信するのではなく、集計した結果のみを送るそうです)

今月には、ギリシアのレスボス島にある実際の難民キャンプで、2セットが試験運用を開始しているそう。

難民といえども、今は普通にスマートフォンを持っているのだろうと思います。むしろ情報収集等のために無いと困るぐらいかもしれません。デバイスを持たない人もいますが、スマートフォンの存在から人数を計るというのは、人手を掛けずにすむ効率的な方法なのかもしれないですね。

日本に今難民キャンプはありませんが、プライバシーへの配慮がされていることや、オープンソースとして動作の仕組みが公開されていることから、NGO などで他の人道的な運営に転用したりすることもできるかもしれません。

カテゴリー
ネットのサービス

invaderz – 遺伝的アルゴリズムで動きを変えるインベーダー風ゲーム

victorqribeiro/invaderzは、上から襲い掛かるインベーダーを砲台で撃ち落とす JavaScript のゲームです。

一回に6匹降りてくるインベーダーを、地上に近づけないように撃ち落とす必要があります。合計で5匹が地上にたどり着いたら、ゲームオーバーとなります。また、6匹の攻撃が終わると、新たに次の6匹が登場します。

攻めてくるインベーダーの形はランダムに打たれたドットのパターンなのですが、このドットの形に応じて、どのように動くのかが表されています。

設定によると、撃ち落とされた瞬間のインベーダーは、母船に対して「どこまで侵攻できたか」の情報をアップロードし、次の世代では、優秀な結果を残したインベーダーの形を掛け合わせた攻撃隊が編成されます。

この次の世代を生産する時に、優秀だった個体からランダムに上下半分ずつや左右半分ずつの形をコピーしたりして新しい世代を作ることで、これまで良い結果を出したインベーダーの特徴を併せ持つ世代が作られる、ということになります。(この際に、10%の割合で突然変異も起こります) この当たりはソースコードの Genetics.js を見るとなんとなくわかります。

動くデモも公開されていますが、今はアクセスしづらくなっているようです。ソースコードを持ってくれば手元で簡単に動かすことはできました。

30世代ほど遊んでみましたが、後半になると確かにインベーダーの動きが左右に大きくなり、狙った弾を避けている(避けているように見える、だけですが)ことは増えます。ただ、進化の度合いはかなりゆっくりかなと。何百世代とやるととても優秀になるかもしれませんが、5回失敗すると終わりなのでそこまでもっていくのは大変そうです。

いろんな人が育てた結果が共有されたりすると、面白い避け方をするインベーダーがたくさん作られるかもしれないですね。

シューティングゲームなんて、結局のところコンピューターはいくらでも反応速度を上げられるため、本気でやられたら人間が勝てるものではないのですけど、こちらの打った手を学習して相手の攻撃が変わる、というギミックで、プレイするユーザー毎に違うゲーム体験を作ったりできるということはあるのかも、と思いました。

via Hacker News