2016/12/10に開催されたMini Debian Conference Japan 2016に参加してきました。場所は日本橋のサイボウズオフィス内で、LibreOffice Kaigi 2016と同時開催でした。自分も一応両方に参加するつもりで申し込みも両方にしたのですが、結果としてDebian側の話ばかり聞いていました。 その時の様子はハッシュタグ#debianjpでツイッターを検索するとある程度様子が伺えると思います。自分が参加しているセッションについてはある程度ツイートしています。せっかくなのでMomentsを使ってみようかと思ったのですが、全部のツイートが出てこない上に時系列に並んでいない、並び替えはすべて手動という使い勝手の悪いインターフェースで断念しました。 個人的には音響モデルを含めて自由ソフトウェア実装として作ったバーチャルシンガー徵音梅林(ちおんメイリン)に最もインパクトを受けました。発表は台湾の張正一(Chou Shouichi)さんでした。 発表資料の中でも触れられていましたが、クリプトン・フィーチャーの商用ソフトウェアであるVOCALOIDは作成できる内容に制限があります。初音ミクのEULA(PDF)にありますが、公序良俗に反するなどの歌詞を含めることを禁止しています。現実にはそういった内容のものが作成、公開されているのですが、規約レベルではアウトです。張さんは、ギターを燃やすパフォーマンスの写真などを交えて「音楽活動は自由であるべきだ」と主張されていました。これには強く同意します。 ソフトウェアのベースはWORLD(修正BSDライセンス)というパテントフリーなものを使っているとのことでした。音響モデルもマスコットキャラクターもCC-BY 3.0で配布しています。 残念ながら、まだフロントエンドについては実装がこなれていないようです。デモではWineでVOCALOIDのエディタを利用されていました。まだ日本で利用している例はほとんどなさそうですが、頑張って欲しいと思います。
Category: 開発
自作辞書のブートストラップを考える
かな漢字変換や形態素解析といった処理を行うにあたって、辞書は必要不可欠な存在です。これを一から自作することを考えています。 適切な単語のリストの作成 単語に対する読み、品詞の追加 単語に対するコスト値の算出 データソースはWikipediaを使う こんな感じでおそらくはできるでしょう。時間はかかると思うので、ゆっくり考えていくつもりです。 今はまず教師なし機械学習による単語分割を使って、単語リストを作ることを試みています。これについては階層Pitman-Yor過程に基づく可変長n-gram言語モデル(VPYLM)の実装が複数あり、それを使うことである程度下処理ができます。 latticelm C++/OpenFSTによる実装 vpylml-python C++/Pythonによる実装 (解説記事) Wikipediaの記事はhttps://dumps.wikimedia.org/jawiki/からダウンロードできます。本文のダンプはjawiki-latest-pages-articles.xml.bz2というファイル名です。これをWikipedia ExtractorというPythonスクリプトでプレーンテキストに変換できます。変換時に警告が出ますが、それはたいてい自己参照に関するものなので、放っておいても大丈夫そうです。 さしあたって、展開ディレクトリ/AA/wiki_00を対象にlatticelmをデフォルトパラメータで実施したところ、以下のような感じになりました。 ちょっと分割されすぎですね…ハイパーパラメータはいろいろとあるので、チューニングはいろいろと必要そうではあります。他に試された人の解説によると、初期状態がすべて分割されている点が大きいとのことです。 以前の記事で紹介した「続・わかりやすいパターン認識 教師なし学習入門」には通常のPitman-Yor過程までは解説されており、VPYMLに関してはなんとなくでしか理解出来ていません。もう少し自分の理解も深めたいところです。 単語分割自体は系列ラベル問題とみなしてRecurrent Neural Networkベースで処理することも出来るそうですが、教師あり学習なのできちんとしたデータセットを作る必要があります。そこにたどり着くまでのところを、教師なし学習との組み合わせでなんとか実現したいところです。
2016年9〜10月の活動
ここ2ヶ月ぐらいの活動を記録しておきます。 Debian関係 Namazuのbuild-arch/build-arch-indep対応 ChaSen symbolsの主要arch対応 qemu-debootstrapの利用 porterboxの利用 ChaSenに関しては前回の投稿とも関係があるのですが、とりあえずは主要(公式リリース)アーキテクチャのみ、一通りlibchasen2.symbolsの更新を行いました。 恥ずかしながら今回はじめてporterboxを使いました。これまでporterboxにログインしたことはあっても結局使い方がよくわからなくて諦めたりしていたのですが、たまたまログインしたホストのmotd(ログイン時に表示されるメッセージ)にschrootの使い方へのリンクhttps://dsa.debian.org/doc/schroot/が掲載されていて、それではじめて使い方を理解した次第です。 しかし、qemu-debootstrapでどうにかなる範囲についてはそちらで対応しました。 第12回 カーネル/VM探検隊参加 qemu-debootstrapについてそれなりに理解を深めたので、その紹介という形で発表をしてきました。 Qiitaへの投稿 MySQL 5.5でのCVE-2016-6662対応について 写経で使うツール symlinkを使わずにホームディレクトリの設定ファイル(dotfile)を管理する 写経に関する記事のストック数が多いのが以外です。 FSIJ月例会(予定) 今月10月の28日に、いつもの場所(東京体育館)、いつもの時間(18:30〜19:30)で勉強会が開催予定です。 10月の技術講座 テーマ: 特別じゃないGnuPG GnuPG 2.1のお話だそうで、期待できます。今の時点でのDebian stable(8.x/Jessie)ではまだ標準のGnuPGが1.4系なのですが、次のリリースには2.1が標準になる予定なので、大いに参考になることでしょう。
C++ template instanceのシンボルを隠す
ここ数日、C++がらみで苦労しています。自分がC++を覚えたのが学生の頃、20年以上前になるので、今時のC++についていけていません。 ChaSenのライブラリをビルドしていると、基本的にABIとしてはC言語の範囲でしか定義していないのに、一部のC++シンボルがexportされてしまいます。ざっと調べてみたところ、どうやらtemplateのインスタンスを定義した場合には有無をいわさず外部参照できてしまうようです。 GCC拡張であればvisibilityの制御でこの挙動を変えられるようなので、pragmaを使ってdartsのインスタンスシンボルを隠すことはできるようになりました(参考: Visibility – GCC Wiki)。 そもそもなぜこんなことをする必要があるかいうと、Debian packageのsymbolsの仕組みに引っかかるからです。C++のsymbol name mangling ruleはgccのメジャーバージョンが上がると微妙に変わることがあって、現在stable標準のgcc 5.xとunstable標準のgcc 6.xでまさにこれが影響しています。これまでビルドしていたライブラリのシンボル情報をdebian/<package-name>.symbols.<arch>という名前で保存していて、ビルド結果のバイナリーに含まれるシンボルがこのファイルと異なった場合、ビルドエラーとなるようになっています。これはABI互換性が壊れないことを保証するための仕組みです。 そもそも内部で使っているだけのC++シンボルが見えてしまっているのを回避して、この問題を根本から対応したかったのでした。 しかしまだ一部の標準ライブラリのC++ template instance symbol(std::ctype<char>とか)が残ってしまっているので、それをどうしたものかと苦慮しているところです。
GNU screen tips
「普段使っているGNU screenのtips」という記事をQiitaに投稿しました。簡単にまとめると multi attach (-xオプション) fit コマンドによる画面のリサイズ -Xオプションの応用 C-a ” (windowlist -b)カーソルキーでのウィンドウ選択 number コマンドでウィンドウ番号入れ替え title, setenv という感じです。 これ以外に、screen上のすべてのウィンドウでgpg-agentにパスワードをキャッシュさせるpinentry-cursesを特定のウィンドウで待機させる、ということをやっているのですが、使っているスクリプトがgniibeさん作なので書きませんでした。というかあのスクリプトはそこそこ問題なく動いている感じなので公開してもらえたらなあ、と思っています。
2016年4月FSIJ月例会 BBG-SWD
先日FSIJ月例会がありました。タイトルは「SWDプログラマの決定版 BBG-SWD」です。 一口でまとめると、ARMによるSWD(Serial Wire Debug)をBeagleBone Green上で使えるようにしたという話でした。 そもそもの背景には、gniibeさんが販売しているハードウェアFST-01やFSM-55の製造過程があります。実際にハードウェアの製造を行うSeeed Studioでは、ファームウェアの書き込みにST-Link/V2というJTAGデバッガを、Windows上で動作するST Micro提供のソフトウェアで使っているという問題があります。ファームウェア書き込み部分も自由ソフトウェア、ハードウェアで置き換えることを目的としているそうです。これによって、”Respects Your Freedom Hardware product“の認証を取得する資格が得られるようです。ST Microのプロプライエタリなソフトウェアを介さないので、その部分でマルウェアを仕込まれるような可能性も低減できます。 ソフトウェアのリポジトリはhttp://git.gniibe.org/gitweb/?p=bbg-swd.gitにあります。この中には、BeagleBone Greenのbone-kernelと呼ばれる種類のLinux kernelに含まれるPRUSS(Programmable Realtime Unit SubSystem)のドライバ(uio_pruss)を介して動作するプログラムと、それをOpenOCDで利用可能にするためのOpenOCDへのパッチから構成されています。 gniibeさんはこの成果をhackster.ioのIoTコンテストに応募したそうですが、ファイナリストまでは選出されたものの受賞には至らなかったとのことでした。 Raspberry PIを筆頭としたワンチップマイコンは広く流行っていますが、こういった低レイヤーまで自由なコンピューティング環境を提供しているものはなかなか無いようです。 有志によるリバースエンジニアリングの成果でそれなりに自由なOrange PIシリーズは、熱に弱いという問題があるそうです。自分も購入したのにここ数ヶ月使っていなかったので知りませんでした… 今の時期暖かくなってきましたが、そんな環境でも動作するというgniibeさんのおすすめはWandboardだそうです。
自由なデータの重要性
先日、NEologd Casual Talksというイベントに参加してきました。mecab-ipadicに新しいエントリーを追加するmecab-ipadic-neologdに関するイベントでした(Togetterまとめ)。 その中で改めて感じたのは、自由なデータの重要性です。イベントでは「言語資源」という観点でのデータの重要性が語られていました。形態素解析器の辞書として、継続的に更新・リリースがなされているのはNEologd以外ほとんどないという指摘がありました。 自分も2012年にSoftware Freedom Dayの国内イベントで「自由なデータ」という題で発表をしました。 自由なデータ from Takatsugu Nokubi 今になって改めてこの資料を見ると、現在は若干状況が変化している部分もあります。NEologdの出現は、まさしくその一つです。 また、日本語の文章チェッカーとしてtextlintという実装の日本語ルールを作成・公開している人がいます。これまでLanguageToolに若干のルールをコミットしてきましたが、textlintのほうがかなり充実している感じです。 最近は機械学習をやってみたりしているのですが、これもまさにデータの質がかなり重要な領域です。変なデータを元に学習すると、そもそも学習が収束しなかったり、期待しない結果を返すモデルができてしまったりします。この領域でも、チュートリアルに使われる定番のデータセットが公開されています(MNIST, CIFAR-10等)。 最近、自分も画像分類タスクのテストのために作ったデータセットはあるので、なんとか公開できる形にできないかと考えています。実データはInstagramにあるもので、個々の画像のライセンスを確認しないまま集めて分類したのですが、画像URLの一覧という形なら問題なく配布できると思います。オライリー「実践 機械学習システム」でも感情分析用のツイートデータを人力で分類したもののID一覧から実データを取得する、という方法が取られていました。 実際に自分でデータの分類をやってみると、「どこまでをこの分類に含めるべきか」という根源的な問題を実感できます。実際、単純に検索しただけだと「明らかにおかしい」というものから「これはどうなんだろう」というものも出てきます。 この点について、先日の発表の中で印象的だったのが片山さんの「ファッションが大好きなので無限に洋服の文字列データを眺めるのが楽しかった」という部分でした。特定のドメインのテキストでも、きっと同じような感覚があるのだろうとなんとなく感じています。 ともあれ、公開できる形になったら、改めて告知したいと思います。
Chainerでデータのwhitening(Qiita)
Qiitaに記事を書きました。Chainerのimagenetサンプルで、画像のwhiteningを含むデータ拡張を行うようにした、という内容です。 Chainerのimagenetサンプルで学習データの拡張/whitening いろいろあって、TensorFlowよりもChainerを当面使っていこうという気分になったので、TFでできていたことをChainerでやらせようという試みです。 TFのCIFAR-10デモをCPUとGPUで動かしてみると、思ったほど速度が出ないんですよね…TFが分散ありきのアーキテクチャで、それなりにCPU-GPU間のコピーが発生してるようで、それがボトルネックなのかなあという気がしています。 ちょうど昨日になってTensorFlow 0.7.0が出たようです。そこでパフォーマンスがどう変わったのかは確認したいところです。また、Distributed TensorFlowが出るという発表もあったようです。 今個人で使えるGPUつきマシンがMac miniしかなくて、GPUがATIなのでこのあたり全然使えないのが残念です。
sshの設定をホスト名prefixで分ける
一時期、「最強のSSH踏み台設定」という記事が話題になりました。.ssh/configのHost設定でスラッシュを区切り文字とすることで、動的な踏み段設定ができるというものです。 この手法を応用して、基本的にProxyCommandが必要な環境下で動的に変わるIP相手に対し、アドレスにprefixを付けることで常にあるProxyCommandを実行させるような設定を行ってみました。 ssh aws-u_xxx.yyy.zzz.wwwとすれば常に特定のユーザー、鍵、Proxy経由で接続するようになります。区切り文字にアンダースコアを使っているのは、スラッシュを使った場合にscpでホスト名と判断されない場合があったからです。ssh, sftpコマンドではスラッシュでも特に問題ありません。
USB 3.0フラッシュメモリにGPT/UEFIブートできるDebianのインストールを試みた
USB 3.0ポートを持つ機器が手元に増えてきたので、そのようなマシンで起動できるUSBメモリ上のDebian環境を作ろうと頑張ってみました。最終的には一応できたのですが、手作業がちょっと必要でした。 そもそも、USB 2.0のフラッシュメモリ上にUEFI bootable Debianを作るのはまったく問題ありません。しかし3.0だとjessie/stretchのインストーラーで起動できる状態に持っていけませんでした。jessieで作った場合には”no bootable os”と言われたり、stretchで作った場合ではgrubは入るもののrescue consoleが立ち上がるだけ、という妙な状態です。2.0と3.0で何か扱いが違うのでしょうか… ともかく、対応としてはstretchからインストールしたメディアを一度外して、他のDebian環境からそのメディアをマウントしてEFIパーティションの/EFI/BOOT/以下にルートパーティションの/boot/grub/grub.cfgをコピーしてやることで動くようになりました。 頑張ればjessie(現stable)でも設定できそうな気がしますが、stretch環境は手元になかったのでとりあえずこいつで運用してみようと思っています。 参考:USB HDDにMBR/EFI両ブート可能なUbuntuイメージを作る方法 – bellbind USB 2.0と3.0で違いが出るのはなぜなのか、原因を知っている人がいたらぜひ教えてください。ベンダーのファームウェア依存なのかもしれませんが…(今回はVAIO Duo11を使用) 起動できないのはUSB 3.0フラッシュメモリにインストールしたDebian環境だけでなく、rufusで作成したインストールメディアでも同様の状況(grub rescue consoleに落ちる)でした。