先日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なのでこのあたり全然使えないのが残念です。
NAS生存確認
VGAが映らないと思っていたhp microserverは生きていました。単にディスプレイ側のVGAケーブルが緩んでいるというくだらないオチでした。 hpのマニュアルに「接触不良の確認」という項目が複数あったので、もしやと試したら見事にそれがヒットしました。基本的なところをきちんと確認しようと改めて思いました。 もしかするとルーターマシンもマザーボードはまだ生きている可能性が出てきたので、確認したいところです。
PCルーターとNAS死亡
自宅で使っているPCルーターのHDDがは、1か月ぐらい前からSMARTが警告を発するようになったので、入れ替えようとしたら死んでしまいました。ついでにNASも使えなくなりました。 ルーターの中身は普通のmicro ATX、Haswell世代のマシンだったのですが、ファンは回れどBIOS画面まで到達しない状態になってしまいました。PCルーターはいろいろなアプリケーションサーバーを兼ねていたので、死なれてしまうと非常に困ります。 そこでNASとして稼働していたhp microserver(初代)を代理として利用することを考えたのですが、こちらはこちらでVGAからの出力が出なくなってしまいました。電源は入るしヘルスLEDは正しく青が点灯するのですが… 今のところ、HDDをUSB経由で余っていたノートPCに接続してその場をしのいでいます。ごく普通にUSB起動させ、内蔵NICのfirmware+kernel moduleを使うことでなんとかなっています。 マザーボード自体、電源、ケースなど怪しいところが多いので、この機会に新しいパーツをそろえようと思います。特にケースは10年ぐらい使っていると思うので寿命だと思った方がよさそうです。 microserverの方は…一度ばらして各部の接触不良をチェックしつつサポートに連絡して、いざとなったらリモートアクセスカードを追加することを考えています。あるいは単純にケースだけをHDDのエンクロージャ代わりにするのもありかもしれません。
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に落ちる)でした。
rep2の更新
周りにある大半のDebian環境をwheezyからjessieにアップグレードしたのですが、先日ようやく自宅のPCルーターマシンもアップグレードしました。 合わせていろいろなものが更新されたのですが、phpの変更が大きかったようで、それまで使っていたrep2exがきちんと動作しなくなりました。もともと使っていたのは相当前のコードベースであり、いまどきはgithubで管理されているコード(https://github.com/2ch774/p2-php)があるので、この機会にそちらに移行しました。 基本的にはまっさらな状態でセットアップを行い、一部のデータをコピーすることで、未読情報や画像DBも含めて移行できました。やったことは以下の通りです。 old-rep2/data/2channel ->p2-php/data/dat/2hcannel へコピー old-rep2/data/db -> p2-php/data/db ic2のdsnをp2-php/conf/conf_ic2_inc.phpに記述 幸いic2のデータはMySQLに保存していたので、特に移行上の問題はありませんでした。未読情報もdata/dbにあるSQLite3のデータをコピーするだけでいけました。 ユーザーの設定に関しては新規にやりました。これも頑張れば移行できたのでしょうが、ちょっと面倒に感じたのと設定すべき項目がそれほどないことからやりませんでした。 ユーザー設定の中に、「データ転送量を抑えるためにカタカナを半角にする」というオプションが標準でONなあたり、このソフトウェアの歴史を感じます。思い返せばWillcomの京ポン2あたりから使っていました。 iPhoneが出たぐらいの頃にスマホ用のUIも整備されたので、今使っても悪くありません。
DoCoMo L-02C購入
思うところがあって、USBのLTEモデムDoCoMo L-02Cを購入しました。 現在個人でIIJmioのファミリーシェアプランを使っています。SIMが3枚使えるのですが、今までNexus 5とF-05Eと2つの端末でしか使っていませんでした。 F-05EのrootをとってIIJmioでテザリングできるようにしたのですが、先の年末年始帰省の道中、新幹線で端末経由のUSBテザリングに不満をもったのがきっかけです。USBドングルで通信できればもっとバッテリーが持つのではないかと。 昨日届いたのでファームウェアのアップグレードを試みたのですが、どうもWindows10上だと途中で必ずこけるようで、結局Windows7マシン上でやる羽目になりました。 Linuxからは、usb-modeswitchを使えばごく普通のUSB serialとして認識できるようなので、そこまで使えるようセットアップを進めていきたいところです。
TensorFlowでのjpeg読み込みについて(Qiita)
Qiitaに記事を書きました。TensorFlow自身が持つjpegデコーダを使いたかったのですが、あまり実例を見かけなかったのと、「説明があまりない」という趣旨のことが書かれた記事があったので、理解できたことを形として残すことにしました。 TensorFlowのReaderクラスを使ってみる 同じものをこちらに掲載することも考えたのですが、とりあえず記事そのものは個人的にバックアップを保持しておくだけにとどめておきました。 ウェブサービスへの依存については難しいところです。そう思いつつたくさんのサービスを既に使ってしまっているのですが…ある程度は最悪の事態に備えておきたいところです。