カテゴリー
技術

Debian の perf を高速化するパッチと、そのGPL的な背景

Cargo の flamegraph ツールがDebian の perf のせいでとても遅いという話。

Cargo flamegraph sample

perf コマンドがプロファイルデータを解析する際に libbfd をリンクすればずっと高速になるのですが、Debian のポリシーでライセンスに違反するため libbfd をリンクすることはできないそうです。

[修正] コメントでの指摘を受け修正しました

perf のライセンスが GPL バージョン2、libbfd のライセンスが GPL バージョン3+ であり、これら二つのプロジェクトを合法的にリンクさせる方法がないそう。

Debian の Makefile では、わざわざ生成された perf コマンドが libbfd をリンクして「いない」ことをチェックするようになっているのですね。

そんな訳で、Debian の perf は dso 一つごとに addr2line コマンドをパイプで呼び出す(そして、毎回サブプロセスは終了する)方式となっています。

しかし、大量の perf 呼び出しを行う flamegraph を作ろうとした @leastfixedpoint さんは、いつまでも帰ってこない perf コマンドに業を煮やし、libbfd をリンクさせない範囲での高速化を考えました。

このパッチでは、addr2line を別プロセスとして起動させたままにしておき、dso をデータとして送り付け結果を受け取っても、addr2line プロセスを終了させないことで、とあるデータ量に対して68倍速く処理が終わるようにできたそうです。

対象のデータ量によっては気にならない程度の速度差なのかもしれませんが、同じようにここの処理速度で困ってる人もいるんじゃないでしょうかね。

via Hacker News

カテゴリー
fun

Spiteライセンス – 読んだら無効になるソフトウェアライセンス

Spite Licenseは新たに提案された(ジョーク)ライセンスです。

ソフトウェアに適用できるライセンスの種類不足を嘆く声にこたえて作られたこのSpite(悪意の)ライセンスは、開いて読んでしまう読まない限りと別の(今回の例では同梱されたMITライセンス)に切り替わる、というシンプルな文面になっています。

[訂正 2020-09-22] 読んでしまうと無効になるのにMITライセンスに落ちるのはおかしいですね。ご指摘ありがとうございます。

このファイルをまったく読まない場合に限り、このソフトウェアや関連物の利用には同梱の LICESNSE_MIT ファイルのMITライセンスが適用される。

このファイルをたとえその一部分であっても読んだ場合、このソフトウェアの利用は禁止する。これ以前に許可された権限は直ちに撤回される。

Permission is hereby granted to any person obtaining a copy of this software and associated materials to make use of the software and associated materials according to the terms of the MIT License (see included file `LICENSE_MIT`) IF AND ONLY IF they have not read any portion of this file.

Any person who has read any portion of this file may not make any use of the software and associated materials for any purpose whatsoever. Any permissions previously granted to any person to use this software and associated materials terminate and are revoked with immediate effect upon their reading of any portion of this file.

このライセンスを使う動機としては、

  • 面白いから
  • ネットのランダムな奴には使ってほしいけれど、エンジニアに使いたいソフトウェアのライセンスを読ませようとする法務が居るような大企業には使ってほしくない

などが考えられるそうです。

作者自身がジョークと書いてるので真面目に取る人はいないと思いますが、ソフトウェアのライセンスが誰向けに書かれているかや、大企業のオープンソースソフトウェア利用に対しての一般のエンジニアが持っている感覚みたいなものが出ているネタにも見えます。

実際にはライセンスをちゃんと確認する企業も緩い企業もあるし、個人のエンジニアでも人それぞれだろうと思いますけれど。

via Hacker News

カテゴリー
ツール

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