Google が AI によってファイルを判別するプログラムMagika*1*2を公開していました*3。
通常、Linux で拡張子がない不明なファイルの詳細を知りたい場合には、ほとんどの人はfile
*4 コマンドを使うことが多いと思います。ただし、ファイルがどのアプリケーションによって作成されたものなのかを判定するための一般的な方法はないため、file
コマンドを使ったとしても内容が正しく判別されるとは限りません。file
コマンドの場合には、ファイルの判定はファイルシステムテスト(ファイルが空か?特殊ファイルか?)、マジックナンバーテスト(ファイルの先頭にマジックナンバーが記載されているか?)、言語テスト(ファイルがテキストである場合には、どのような文字コードで書かれているか)の 3 つの判定が順に行われるとされています。つまり基本的にはヒューリスティックなルールを一定の順序で試してみて、該当するものがあるかどうかを判定していることになります。
これに対して、Magika は人間が作ったルールではなく、これをディープラーニングによるモデルで代替しようという試みです。
Googleが高精度かつ高速にファイル形式を判別するツール「Magika」公開 - PC Watch
Magikaはディープラーニングの力を活用し、平均精度99%以上を実現しつつ、1つのCPUで実行しても1秒間に120種類以上/数百万ファイルのファイル形式を判別できるツール。判別時間はわずか数ミリ秒で、モデル自体も比較的小さく、コアモデルは1MB未満だ。
† インストールは pip で
イントールは Python 環境があればpip
で一撃なので簡単に試してみることができます。
EU のサイバーレジリエンス法 (Cyber Resilience Act)*1について、Python Software Foundation や Eclipse Foundation が懸念を表明していたのでメモ。
この EU のサイバーレジリエンス法というのはソフトウェアに対して製造物責任を負わせることになるものですが、これが営利企業であるかどうかに関わらず対象になることが議論の中心になっているようです。これまでソフトウェアは製造物責任の枠外に置かれていましたが、これが OSS やフリーソフトにまで及ぶことになると現状のエコシステムが壊れてしまうというのはあるので、なんとか妥協点を見つけて欲しいと思います。
「営利企業でなくボランティアに製造物責任負わす」Python 責任者異議 | ScanNetSecurity
欧州議会議員らは昨年、ソフトウェアのセキュリティおよび責任について定めた 2 つの法案を提出した。そしてその後、テック系のコミュニティは、これらの法案の規定が幅広すぎるとして反対の声を上げてきた。
そのうちの 1 つであるサイバーレジリエンス法案(CRA)は、デジタル製品のセキュリティ向上を目的として、製品を作る側に対して「製品のセキュリティの確認」「脆弱性回避策の実装」および「顧客へのセキュリティ関連情報の開示」を義務付けるものだ。
Python で書かれたプログラムを Windows で動かしていたら Symbolic Link を作成する部分で以下のエラーがでて困ってしまいました。
こんな感じの非常に単純なコードでもエラーになります。
Windows の 1314 というエラー*1を調べてみるとERROR_PRIVILEGE_NOT_HELD
と書かれているので、とりあえず管理者権限で起動してやると問題なく動作することは確認できました
とはいえ、python の作業を何でも管理者権限でやらないといけないのは危ないので、なんとか方法がないかと思ったら設定アプリから開発者モードを有効にするという非常に裏技的なものを発見。
いろいろと警告が出ますが一時的に ON にするだけであれば、常に管理者画面であれこれ動かすよりも安全かもしれません。
Python の入門書であるThink Python: How to Think Like a Computer Scientist 第2版 の日本語版がフリーで手に入ることが分かったのでメモ。
原著はオライリーなので内容は折り紙付きなので、適当な Python の入門書を探している場合にはこれはアリだと思います。
ちなみにライセンスは表示 3.0 非移植 (CC BY 3.0) です。
翻訳された方の情報は検索してもハッキリと出てこないのですが、東北学院大教養学部教授だった相川利樹先生でしょうかね。
GitHub に東工大情報理工学院の機械学習の講義で使われていると思われる Python の教材*1を見つけたのでメモ。
Python早見帳は、Pythonのプログラムと実行例をさっと確認(早見)できるJupyter Notebook(帳)です。
こういう公開されている良質なプログラミング教材が簡単に手に入る時代になったというのは良いことですね。
ますます学ぶ人のやる気が試される世の中になってきていると思います。
Bloomberg が Python 向けのプロファイラであるMemray を公開していたのでメモ。
この Bloomberg は経済ニュースで有名な Bloomberg です。
† install は pip で
インストールはpip
を使うと簡単にできます。
† 実際にプロファイルを取ってみる
基本的にはrun
で実行して.bin
を生成し、それをflamegraph
で HTML のレポートに変換します。
† 参考
Python で正規表現を構文解析だけした結果(内部表現)を得る方法がないかと思って調べてみたところ、sre_parseを使えばできることが分かったのでメモ。
例えば、メールアドレスにマッチする正規表現(^[a-zA-Z0-9_+-]+(.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$
)を parse すると[(AT, AT_BEGINNING), (MAX_REPEAT, (1, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57)), (LITERAL, 95), (LITERAL, 43), (LITERAL, 45)])])), (MAX_REPEAT, (0, MAXREPEAT, [(SUBPATTERN, (1, 0, 0, [(ANY, None), (MAX_REPEAT, (1, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57)), (LITERAL, 95), (LITERAL, 43), (LITERAL, 45)])]))]))])), (LITERAL, 64), (MAX_REPEAT, (1, MAXREPEAT, [(SUBPATTERN, (2, 0, 0, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57))]), (MAX_REPEAT, (0, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57)), (LITERAL, 45)])])), (MAX_REPEAT, (0, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90)), (RANGE, (48, 57))])])), (LITERAL, 46)]))])), (MAX_REPEAT, (2, MAXREPEAT, [(IN, [(RANGE, (97, 122)), (RANGE, (65, 90))])])), (AT, AT_END)]
という表現を得ることができます。
この表現を sre_compile でコンパイルすると実際に正規表現として利用できるようになるようです。
これを上手く使えば正規表現同士を自動的に合成するようなライブラリを作ったりすることができそうです。
Python で一定時間が経つと自動的に内容が消えるキャッシュとして使えるハッシュがないか探してみたらexpiringdict
というライブラリがありました。
† サンプルコード
試しに以下のようなサンプルコードを書いてみました。
expiringdict_example.py
max_age_seconds
を1秒に設定しているので、ちゃんと 5 秒後には key が見えなくなっています。
スクリプト言語のシンタックスチェックは、例えば PHP はphp -l
, Ruby と Perl はruby -cw
,perl -cw
という感じで実行できますが、考えたらPython のやり方を知らなかったので調べてみました。
結論から述べると以下のようなコマンドで実行できます。
コマンドラインオプション*1にあると思っていたのですが、Python はpy_compile*2 というモジュールを呼出す必要があるようです。
ちょっと面倒ですね。
最近、HTML で書かれたによるフィッシングメールが良く届くので、そのたびにフィッシング対策協議会やGoogle にフィッシング詐欺の URL を報告するようにしています。
ただ、フィッシング詐欺の URL は HTML にしか書かれていないことが多く、僕は普段メールをプレーンテキストで読んでいる関係で、いちいちメールの表示形式を切り替えなければフィッシング詐欺の URL を取り出すことができないので、その作業がちょっと面倒でした。
† .eml の URL を自動抽出してみる
というわけで、.eml ファイルに含まれる HTML パートから URL を抽出するスクリプトを Python で書いてみました。
Beautiful Soup を使っているのでpip install beautifulsoup4
という感じでインストールしておく必要があります。これ以外は OS 標準のモジュールで動作します。
distil_url.py
これをpython distil_url.py path/to/maildir/*.eml
のような感じで実行してやれば URL の一覧が出力されます。
今回はサーバ上の spam が入った Maildir を cron で1日1回なめて、メール通知するようにしてみました。