Python Keyphrase extraction (pke) というモジュールがあります。TextRank等著名なキーフレーズ抽出手法をサポートしているPython用パッケージです。 GiNZAの登場により、内部でspacyを使っているソフトウェアが日本語でも使えるようになったケースが増えてきているのですが、pkeも最近の更新で完全に無改造で日本語を扱えるようになりました。 それ以前にpkeを日本語で使うための記事がいくつかあります。 はじめての自然言語処理 第5回 pke によるキーフレーズ抽出 2021年版PKEライブラリーによる日本語キーフレーズ処理のサンプル・PKEをアップデートしたら動かなくなってしまった方へ pkeはここのところ頻繁に更新があり、ストップワード以外は無改造で動くようになっていました。ストップワードに関しても先の記事のようなハックをしないで済むようなPRを出したところ、もうちょっと洗練されたコードに置き換わってくれました。ともあれ上記の記事の方法と使い方がちょっと変わってしまったのでここに記録しておきます。サンプルはオージス総研の記事に倣います。 language=’ja’とした場合、spacyの利用可能なモデルから’ja’で始まる最初のモデルを利用します。したがって、ginzaが入っていればja_ginzaモデルが自動的に利用されます。
Author: knok
I am a Debian Developer and a board member of Free Software Initiative (FSIJ).
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)
“Adversarial Policies: Attacking Deep Reinforcement Learning”をざっと読んだ
機械学習で画像分類器をだますAdversarial Exampleは広く知られていますが、強化学習でも同じ問題があるそうです。observation対して摂動を与えることで意図しない挙動をさせることができるそうです。 observationは第三者が直接介在できるものではないのですが、環境を共有するゼロサムゲームにおいて、自身の挙動を介して相手のobservationに狙った摂動を与える、blackbox, model-freeな手法が提案されている( https://adversarialpolicies.github.io/ )とのことでちょっと論文を読んでみました。 さすがに状況は限定されているようで、環境が高次元であること、デプロイされたエージェントの重みが固定されているという状況で、無制限に相手のポリシーがサンプリングできることが条件のようです。 見た感じ、人間同士のゲームプレイにおけるフェイントに似ているなあという印象を受けました。生成されたadversarial policyに対してfine-tuningはできるものの、それに対してさらなるadvaersarial policyを生成することができるそうで、それを交互に繰り返すことでロバストなポリシーにできるとのことです。 adversarial policyの学習は相手agentのself-playによる学習にかかる時間の3%程度でできてしまうとのことで、adversarial exampleの世界でも攻撃者有利なのは相変わらずのようです。
バーチャル背景を任意のサービスで利用する
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のリポジトリ追加コマンドを記載しました。
転職活動についての総括
今日から仕事なのでタイマーストップ。完走した感想はあらためてblog記事書きます — NOKUBI Takatsugu野首貴嗣 (@knok) 2018年4月16日 以前退職予定エントリーを書きましたが、退職・無職・就職という過程を経てひと段落ついたので、総括をしてみようと思います。 いつから転職活動を行っていたか 実のところ、3年ぐらい前(2015年頃)から転職活動を始めていました。なかなか思うような結果が出なかったのですが、2017年度になって早期退職制度の対象者となり、良い機会だったので応募し、受理されて無事円満退職となりました。 一応、転職以外の道として単純に給与あるいはそれ以外の何かで収入を増やす手段も検討し、そういったことを当時の上長にも相談したりということは行いましたが、会社の給与体系から逸脱するようなことはできませんでした。 どのような手段を用いたか 先の退職エントリーをSNSで広める以外に、以下の手段を用いました。 エージェントの利用 転職サイトの利用 エージェントについて 転職を考え始めた時期に、転職エージェントのほうから声がかかりました。いくつかのアドバイスを得ることができ、個人的には有用でした。特に職務経歴書の書き方は非常に参考になりました。 転職サイトの利用 転職ドラフトに登録し、何度かドラフトに参加しました。登録した理由は、たまたま見かけたPR記事が知人だったからです。 いくつかの指名を得ることはできましたが、最終的にマッチングがうまくいかなかったかなあ、という感じです。一つ残念だったのは、「提示した年俸の最低90%を指名企業は提示する」というルールが守られていなかったことです。この点については運営に直接伝えてはいます。 LinkedIn かなり前からLinkedInのアカウントは持っていました。特に外資企業からの連絡はLinkedIn経由でそこそこありましたが、resumeを送ってその後音沙汰なし、ということも多かったです。 SNSでの退職エントリー公開について 自分が予想していたよりは大きな反響がありました。10社ぐらいはコンタクトがありました。それでもやはりマッチングには苦労し、最終的に今の会社に雇用されました。 エントリーはblogで、発信は主にTwitterで行いましたが、連絡手段としてはFacebook経由が最も多く、次いでメール、Twitterという感じでした。転職活動をするにあたってFacebookアカウントはあったほうが良いのかなと思います。 前職を辞めるにあたって 早期退職制度の申請に関しては非常にスムーズでした。上司たちも「会社が用意した正当な手段であり行使は自由だ」といって下さり、実際に円満退社できたことには感謝しています。 転職支援制度の利用 早期退職制度の一環として、転職コンサルティング会社の1年間分の提供があり、一応使ってはみました。 私を担当したコンサルタントの方はあまり自分の関心のある分野には明るくなかったようでしたが、それでもいくつか見繕ってはくれました。私の職務経歴書を見たうえで「これぐらいの年収が適切だろう」というものを提示してくれたので、客観的な市場価値を知ることができた(そしてやはり前職の給与は安かった)のはよかったと思います。 新しい職場について 最初の方では軽く触れましたが、2018年4月16日付けでロボット投信株式会社に入社し、働いております。 現状は主にR&Dを担当しており、自然言語処理を中心としています。投資、ファイナンスに関する研究発表は人工知能学会、言語処理学会でも割となされており、それらの再現実験や、機械学習の実サービスへの応用の模索といったことを行っています。 その兼ね合いもあり、6月に鹿児島で開催された人工知能学会全国大会にも業務として参加しました。FLOSS活動にも理解が深く、7月~8月に開催されたDebConf18も業務扱いで参加させてもらうことができました。 ロボット投信株式会社ではエンジニアも募集しています。Wantedlyに募集ページがありますが、私個人へのコンタクトも受け付けております。もし興味のある方がいらっしゃいましたらご一報ください。
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など、エイプリルフールネタはありました。
退職予定エントリ
「俺は仕事をやめるぞー!ジョジョーーッ!」 一度は書いてみたかったセリフなのですが、まだ確定ではありません。オリジナルは荒木飛呂彦作の「ジョジョの奇妙な冒険」第一部、ディオのセリフです。 経歴について 職務経歴書を公開します。 https://docs.google.com/document/d/1LJRGztFILXGH94YQHuQvz_eEODE3lBg1B-R9AW-QTNI/edit?usp=sharing 2017/12現在の状況 今年から早期退職制度 の対象者となったので、周囲に相談しつつ申請をしたという状況です。承認されれば今年度一杯をもって退職となります。 理由 一言でいえば「待遇に不満がある」のが理由です。調査会社による年齢ごとの年収調査によると、残業を含めた上での額面での現在の年収に対し、平均から-200、最低値と比較しても-100という状態です。 残業に関しては正直なところ「生活残業」状態であり、限度いっぱい働いているような状況です。2年ほど前から私生活上どうしても収入が必要になってしまったのですが、貯蓄もできずぎりぎりの状態を続けています。一方で心身の健康上今の生活を継続するのも厳しい、このままで健康を取り戻すことはできそうにない、ということで申請の決意をしました。 これまでの経験 1990年台後半当初は名古屋で働いていました。当時はインターネットの商業展開が始まった時期で、基本的にDebianでサーバを立てたり、CGIベースでプログラムを組んだりといったことを行っていました。全文検索システムにfreeWAISやNamazuを使うこともありました。当時はFLOSS活動が業務と直結していて、この時代は業務時間内のコミットも自由にできていました。この頃はDebian Projectは2000年問題に対して積極的な取り組みをしており、私自身も2000年をむかえる時にサーバーが無事年を越せるか現場待機していました。一人で。業務で日をまたいだことは、生涯を通してこの日だけです。仕事で徹夜などをしたことはありません。 21世紀に入ったところで、東京へ転勤になりました。東京での仕事はこれまでとは大きく変わりました。当初は電子ペーパー上にレンダリングする組版システムの担当ということだったのですが、2年ほどしてまったく違うプロジェクトにかわり、それ以後半年から2年程度という短いスパンで大きく違うプロジェクトに回される、というサイクルを繰り返しています。 直近では、機械学習を主題とした課題に取り組んでいます。画像処理・自然言語処理が中心です。ここ2年ぐらいは学生の頃よりたくさん論文を読んでいます。オープンアクセス万歳。 現職の良いところ 2000年代前半まではかなり自由にやらせてもらえました。Linux協会の活動も業務の一環として行っていましたし、FLOSS活動にも特に制限はありませんでした。 会社も安定はしています。これまでに働いていて、赤字だった年度は1回だけでした。ただ、主力である印刷に関しては斜陽であり、いかに新しい事業に活路を見出すかというのは常に課題です。 私が携わった範囲では、新しい技術に触れることができていました。これは個人的に環境として恵まれていたと思っています。必ずしも全社的にそういう傾向があるわけではありません。基本的にはオールドファッションな社風です。 労働環境も世間的に見ればかなりよい方でしょう。もっとも、事業部によっては激務であるとは聞いています。その代わりに残業代はきちんと出ます。 自己アピール ソフトウェアについて、幅広い範囲を取り組んできました。半年から2年で内容が変わりながらもなんとか追いついてそれなりの成果を出すことができていたと自分では思っています。 一方で長年取り組んできたのはDebian ProjectをはじめとするFLOSS活動です。アクティブでない年もありましたが、なんとか今も継続してやっています。最近ではuim回りでいろいろお手伝いをしています。このブログをホスティングしているマシンも20年以上Debian hammあたりからアップグレードを重ねてきています。さすがにいい加減i386は厳しいなという状況で、amd64への移行をいずれどこかでやる必要があるなと感じつつ数年経過しています。 私の職務経歴書、このブログ、GitHub, Qiita等を見て人材として興味のある方がいれば、ぜひメール、SNS(Twitter, Facebook) 等でご連絡ください。