Python Keyphrase extraction (pke) というモジュールがあります。TextRank等著名なキーフレーズ抽出手法をサポートしているPython用パッケージです。 GiNZAの登場により、内部でspacyを使っているソフトウェアが日本語でも使えるようになったケースが増えてきているのですが、pkeも最近の更新で完全に無改造で日本語を扱えるようになりました。 それ以前にpkeを日本語で使うための記事がいくつかあります。 はじめての自然言語処理 第5回 pke によるキーフレーズ抽出 2021年版PKEライブラリーによる日本語キーフレーズ処理のサンプル・PKEをアップデートしたら動かなくなってしまった方へ pkeはここのところ頻繁に更新があり、ストップワード以外は無改造で動くようになっていました。ストップワードに関しても先の記事のようなハックをしないで済むようなPRを出したところ、もうちょっと洗練されたコードに置き換わってくれました。ともあれ上記の記事の方法と使い方がちょっと変わってしまったのでここに記録しておきます。サンプルはオージス総研の記事に倣います。 language=’ja’とした場合、spacyの利用可能なモデルから’ja’で始まる最初のモデルを利用します。したがって、ginzaが入っていればja_ginzaモデルが自動的に利用されます。
Category: 開発
Debianにおけるmailman2.1 -> 3への移行
mailman2はpython2で書かれており、Debian bullseye(11)ではもうmailman3しかパッケージがありません。かつ、パッケージ側でデータまわりのハンドリングは特になされないので、手動で移行作業を行う必要があります。意外とはまりどころが多かったので記録しておきます。 公式のドキュメント https://docs.mailman3.org/en/latest/migration.html mailman3のインストール mailman3上でのML作成 MLの一時停止 (一時的に新規メールを受け付けないため) 自分の場合postfixだったのでmain.cfからmailmanの設定を削除した。 import21の実行 (subscriber等設定のコピー) 場合によってはimport21が失敗する。自分の場合はその原因が bounce_infoが空でなかったのが原因(参考: https://lists.mailman3.org/archives/list/mailman-users@mailman3.org/thread/JEPMB3HW4FI57EUMOST4L7BD2ILIIS3P/)だったので、手動で削除した。 アーカイブの移行 (pipermail -> hyperkitty) web設定の修正 (apacheの場合) hyperkittyの設定変更 (API key設定) Django管理UIからドメイン名の修正 (デフォルトはexample.com) http://${site}/mailman3/admin/ にアクセス サイト (http://${site}/mailman3/admin/sites/site/) の「変更」を選択 example.com があるのでそれを自サイトに変更 mailman3の有効化 (postfix) ACCOUNT_DEFAULT_HTTP_PROTOCOLの設定 (optional) Debianのmailman3-webはデフォルトでweb UIはhttpsを想定しているので、httpしかない場合 /etc/mailman3/mailman-web.py の ACCOUNT_DEFAULT_HTTP_PROTOCOL を http にする。 UI/アーカイブの確認 http://${site}/mailman3/ にアクセスする。debconfで入力した管理者情報を入れてログインしようとすると、一度確認メールが送られるので注意。 検索インデックスの更新 漏れなどがあればご指摘ください。 2021-10-14: ACCOUNT_DEFAULT_HTTP_PROTOCOLと検索インデックスについて追記。
GnukのEmulation mode
2021/3/10 FSIJセミナーで解説されたのでメモ これでできること: 実物のGnukを使わない動作テスト 鍵生成などは失敗すると最悪なにもできなくなるので練習ができる 事前に必要なもの scdaemon usbip python3-cffi, python3-pytest ソースコードの準備とビルド手順、起動まで 別のターミナルを開き、vhci, usbipを用いてUSBデバイスとして扱えるようにする テストの動作 gpgでカードとして扱う PINはadmin: 12345678, 通常 123456 初期化 (factory-reset) 新規鍵生成 (generate) 内容は ~/.gnuk-flash-image に保存される 作成した鍵で暗号化 (gpg -e) 追記(2020-03-12) Facebookでg新部さんよりいくつかご指摘いただきました encryptでは秘密鍵を使わない(のでここはテストになっていない) Debian 10 (Buster)のGnuPG 2.2.12では復号化に失敗する。2.2.27では問題ないとのこと Gnuk 1.2.17時点で鍵生成にバグがある。今は修正がpushされている
Nuro光のルーター(HG8045Q)でDMZからglobal側のIPアドレスを取得する(UPnP)
最近、自宅の回線をNuro光にしました。今までLinuxマシンにPPPoEルーターをやらせていたのですが、それと同等の環境を得るためにDMZへLinuxマシンを置いて処理をやらせるようにしました。 ここで一つ問題なのが、いかにして外部サービスに頼らすglobal IPのアドレスを調べるかです。ルーターはISPから貸与されたHG8045Qであり、管理画面は今どきのJavaScript必須なwebインターフェースです。httpで管理画面をたたいてアドレスを取得するのは面倒そうでした。できれば外部サービスには頼りたくありません。 UPnPのNAT越えについて調べてみた – いろいろな何か :こちらの記事を参考に、UPnPでアドレスを取得する方法を行いました。 まずは記事に習ってM-SEARCHを投げます。Python3用コードに書き直しました。 #!/usr/bin/python3import socketM_SEARCH = ‘M-SEARCH * HTTP/1.1\r\n’M_SEARCH += ‘MX: 3\r\n’M_SEARCH += ‘HOST: 239.255.255.250:1900\r\n’M_SEARCH += ‘MAN: “ssdp:discover”\r\n’M_SEARCH += ‘ST: upnp:rootdevice\r\n’M_SEARCH += ‘\r\n’M_SEARCH = bytes(M_SEARCH, ‘ascii’)s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)s.settimeout(5) # 5秒でタイムアウトs.bind((”, 1900))# M-SEARCHをマルチキャストするs.sendto(M_SEARCH, (‘239.255.255.250’, 1900))while True: try: response, address = s.recvfrom(8192) print(‘from’, address) print(response.decode(‘ascii’)) print(‘=’ *… Continue reading Nuro光のルーター(HG8045Q)でDMZからglobal側のIPアドレスを取得する(UPnP)
バーチャル背景を任意のサービスで利用する
webcamにアクセスして、人体を検出し背景画像と合成をするページ https://knok.github.io/virtbg/ を作りました。TensorFlow.js, BodyPixを使っています。 ページそのものは単にカメラへのアクセスと画像合成だけを行うので、これをオンラインミーティングサービス等で使うためには何かしらの手段で出力をカメラに見せる必要があります。Qiitaの記事として、OBS studioとプラグインを組み焦る方法を書きました。 Windows, Linux, Macそれぞれに対応するプラグインがあるので、それらのプラットフォームで利用できます。Linuxならv4l2loopbackを使います。 ブラウザ->OBS->プラグインという処理パイプラインになるので、これでも若干のオーバーヘッドがあります。Google Meetでカメラを差し替えるChrome拡張として実装した人がいるので、この方法ならオーバーヘッドはより少なく済んでいそうです。私は面倒だったのでOBSに機種依存部分を丸投げしてしまいましたが…その代わり任意のサービスに利用ができます。Jistiでも使えるので次のオンラインセミナーではこれを使うつもりです。
Debian buster上でflatpakのSteamとProtonを動かす
前々からsnap/flatpak, wine on dockerなど色々な方法でWindows用のゲームをDebianから動かそうと時々試していたのですが、環境をそこそこ汚さずに動作できるようになりました。 flatpak + Steam flatpakはコンテナを利用したソフトウェア配布ツールです。同様のものにsnapがありますが、flatpakはデスクトップアプリ向けらしいです。flatpak自体はaptでインストールできます。 Steamのインストール、実行は以下のようなコマンドで行います。 Protonの有効化 以下の記事を参考にしました。 Days of Speed Debian StretchにSteamをインストールしてSteam Play(Proton)でWindowsゲームを遊ぶ flatpakで入れた場合i386ランタイム等も一緒に入れてくれるので、add-architectureなどをする必要はありません。単純にSteamの設定でベータに参加しProtonを有効化するだけです。 ゲームをインストール 一般的なSteamの操作でWindows向けゲームをインストールします。初回はProtonのダウンロードとインストールが行われます。ゲームによって必要なVC runtime等も必要な場合はゲームの初回起動時に行われます。 簡単に手元で動いたものを列挙しておきます カプコンベルトスクロールアクションコレクション Frostpunk Fallout4 起動時の動画は音声が流れたがゲーム音声が聞こえなかった ファイルの実体が置かれる場所 ~/.var/app/com.valvesoftware.Steam 以下に配置されます。mod等を入れるならここを直接いじることになるでしょう。flatpakでSteamを消してもここは残るので不要なら直接rmしましょう。 ToDo/課題 ジョイスティックの利用 Intel Graphics以外のGPUでの動作確認 さらなるゲームの動作確認 追記(2019/9/10) flathubのリポジトリ追加コマンドを記載しました。
2018年のエイプリルフール
自分の観測範囲で見かけたものをまとめてみます。ほかにFLOSS関連でこんなのがあった、という話があれば追加します。 Free Software Foundation announces crowdfunding campaign to buy Facebook — Free Software Foundation FSFがFacebookを買収するためにクラウドファンディングを始めた、というネタ。ところでFacebookはGnuPGに寄付をしています。 Bug#894551: ITP: fascism — Exhaustive exploration of Fascist theory and practice ファシズムをDebianパッケージ化する提案です。過去にもrootkitのITPなど、エイプリルフールネタはありました。
uim 1:1.8.6+gh20161003.0.d63dadd-6
unstableのuimを更新しました。以下の2つのRC bugを修正してあります。 #877476 – libuim-dev: copyright file missing after upgrade (policy 12.5) #877632 – uim: /var/lib/uim/ directory has been deleted after apt-get upgrade with –purge option 前者の問題は、いくつかのパッケージ統合作業を行った時に、libuim-devのドキュメントをsymlinkに変えたことがトリガで発生した問題です。postinstで以下の処理を追加しました。これにより、symlinkが必要に応じて生成されます。 後者の問題は 、uimバイナリパッケージに/var/lib/uimのみを所属させていたのがトリガです。パッケージ統合作業の時にlibuim-dataを廃止したのですが、このパッケージのpostrmではpurge時に”rmdir –ignore-fail-on-non-empty”を呼び出して/var/lib/uimを削除しようとします。uimパッケージに所属しているのはディレクトリのみなので、ここで削除されてしまうというわけです。 こちらの対処としては、/var/lib/uim/READMEを用意してディレクトリを空にしないという方向で解決しました。同様の処置をしているパッケージは他にもあるので、対処としては間違ってないと思います。多分。
pdnsdからdnsmasqに移行
最近自宅の光回線が非常に遅い状況だったので、改善を試みました。そのついでに、ローカルのキャッシュDNSサーバーをpdnsdからdnsmasqに変更しました。 単にIPoEでnative IPv6を導入し、DS-Liteの設定をしただけなのですが、ローカルのDNSキャッシュサーバーのフォワード先をIPv6にしたかったのです。それでいてなおかつ、/etc/hostsの内容もみてくれるものを、ということでdnsmasqにしました。 apt-getでパッケージを入れて、/etc/dnsmasq.d/local.confというファイルを新規作成して、内容を以下のようにしました。 localhostとローカル側のIPでlistenするようにし、フォワード先の設定が書かれたファイルを記述しているだけです。 自分が使っているISPはv4のDNSキャッシュサーバーだとAAAAフィルタがかかっているので、それをv6に変えたことでnative v6も扱えるようになりました。 一点注意が必要だったのは、apt-get install dnsmasqだけしても他のdnsサーバーパッケージはremoveされないというところです。おかげでport 53を他のサーバーが掴んだままでdnsmasqが起動できない、という状態に陥りました。 一応今はPPPoEも併用して、IPv4側のglobal addressから接続できる状態を意地できるよう、ポリシールーティングを設定しています。DS-Liteだけだとv4で繋げるすべがないので… DS-Liteのおかげで、通信速度は17Mbps前後だったものが70Mbps程度でるようになりました。
gnu.org日本語翻訳ミーティング参加
先日、「www.gnu.orgの日本語訳について」のミーティングに参加してきました。最近のFSIJ月例会はMumbleを用いたリモート開催を増やしているので、リアルミーティングは久しぶりです。 当日の配布資料はhttp://git.savannah.gnu.org/cgit/www-ja.git/tree/doc/meeting-2017-01.txtにあります。そちらにもgnu.org翻訳作業への参加方法が書かれていますが、興味のある方はSavannahのwww-jaプロジェクトのメーリングリスト(閲覧は要登録)や、gitリポジトリの参照(こちらはanonymous clone可能 git://git.savannah.gnu.org/www-ja.git)も見てみてください。 個人的な活動 – 機械翻訳 私はこの1年ろくな活動ができていなくて申し訳なかったのですが、以前から考えていた「www-jaをコーパスとして機械学習による翻訳モデルを構築する」という活動に手をつけ始めました。TensorFlowのseq2seqサンプルを若干修正してWMTの代わりに任意のテキストファイルを与えられるようにしたコードは以前作成した(https://github.com/knok/tf-seq2seq-mod)ので、あとはデータセットを作成するだけです。 まずは以下のようなPython scriptを作ってみました。Python2, polib, natto-pyで動きます。 以下のような感じで実行しています。 残念ながら利用可能なGPUを持っていないので、CPU演算のみで処理しています。今のところDebianで深層学習フレームワークがtesting(stretch)入りしているのはCaffe, Theanoの2つだけで、TensorFlowや自分がよく使っているChainerは入っていません。まあこのあたりはupstreamの更新も頻繁なので、あえてパッケージを使わなくともvirtualenv+pipで適時入れるほうが良い気もします。 とはいえ、GPUを使って深層学習を行うということは、ほとんどの場合プロプライエタリなソフトウェアに依存することと等価なので、「gnu.orgの翻訳」ということに限ればむしろCPUのみでの処理の方が望ましいのかもしれません。 自由なコンピューティング 実際、ミーティング当日も自由なコンピューティング環境がより一層損なわれているという話がありました。gniibeさんはChromebookにLibrebootを苦労して入れているようです。 自分もここ数日いろいろとひどい目にあいました。Xbox 360のSmartGlassを使ってみようとしたのですが、Windows 8.1の場合Xbox 360で利用しているLiveアカウントとの関連付けをWindows自身のログインアカウントと紐付けないと利用できないのです。Windows 8以降、Microsoftは極力Liveアカウントでのログインをさせるよう誘導しているのですが、8.1(とおそらく8)でそれが強制されるというのは厳しく、利用を諦めました。ただ、Windows 10ではこの点は改善されているようで、SmartGlassを含むストアアプリはアプリ単位で個別に利用するLiveアカウントを設定したり、そもそもLiveアカウントの必要ないアプリは普通にローカルアカウントのまま利用できるようになっていました。なので、Windows 10マシンでSmartGlassを利用しています。 iPhone, Android端末なども実質iCloud, googleアカウントが必須に近い状態ですが、Windowsも同様の仕組みに倒しているわけで、自由からより通い方向に進んでいるなあと痛感しました。 メンテナ不在問題 現在メンテナが不在なGNU Projectのソフトウェアについていくつか名前が挙げられました。 一つはGNU bisonです。これは割と致命的な気がしたのですが、GCCは4以降独自パーサ(gniibeさんによると、そもそもC++が自由文脈文法でないため)を採用しているとのことなので、案外問題は少ないのかもしれません。メジャーな言語処理系でもbison(yacc)必須なものがぱっと浮かびませんし。 もうひとつはGNUbikだそうです。うーん、これは重要でもないですかね。