月別アーカイブ: 2015年6月

秋葉原でREVIVE USBを組み立てた

以前からやってみたいことの一つとして、PCから操作可能なUSB HIDデバイスを使って何かしらの操作をする、ということがありました。

実現する手段はいくつか考えられます。一つはBadUSBと呼ばれるデバイスの応用です。これは一般的に販売されているUSBデバイスの一部に一般ユーザーが書き換え可能なファームウェアが搭載されていて、任意のUSBデバイスとして動作させることができるものです。キーロガーなど悪用される可能性があるということで広く問題になりました。この方法で利用可能なデバイスが現在でも手に入るかどうかわからなかったので、この方法はあきらめました。

電子工作界隈では、V-USBというマイコンで動作するUSBターゲット用のオープンソースなファームウェアがあります。オリジナルのV-USBはAVR用となっていますが、Arduinoで動くArduino USBというものもあります。

今回はHIDデバイスという明確にターゲットが決まっていたので、REVIVE USBというキットを使いました。Amazonや秋葉原の三月兎などで購入できます。私ははキットの方を三月兎で購入しました。ほかに配線済みの完成品も販売されているのですが、千円ぐらい値段が違います。

REVIVE USB 表
REVIVE USB 表

自力で組み立てる必要があるわけですが、自宅は狭いうえに整理がなされていなくてあまりはんだ付けなどの作業には向いていない環境です。たまたま秋葉原のガード下を見ていたところ、Assemblageという電子工作スペースがあることに気付いたので、そちらを利用してみました。休日は1時間200円ほどで利用できます。

秋葉原 ASSEMBLAGE
秋葉原 ASSEMBLAGE

はんだ付け作業は10年ぶりぐらいでしたが、45分ほどかけてなんとか完成しました。

REVIVE USB 裏
REVIVE USB 裏

できあがったデバイスをLinuxマシンに差すと、USB ID 22ea:0006とでます。linux-usb/usb.idsには該当するデータがないようです。ともあれ無事認識したので、これで何かしら作ってみたいと思います。

PetitModem 1.2.2をプチコン3号3.2.0で動かす

任天堂3DSで動くBASIC処理系プチコン3号というものがあります。

基本的にタッチパネルでのソフトウェアキーボードしか入力手段がないのですが、音声経由でデータをやりとりするPetitModemというソフトウェアをれいさんという方が公開されています。

しかし最近のプチコン3号のアップデート(3.2.0)で動かなくなってしまったので、暫定的な対応策を行いました。作者のれいさんには連絡済なので、いずれ修正版がリリースされるはずですが、取り急ぎ修正方法を記録しておきます。対象バージョンはPetitModem 1.2.2です。

  1. 771行目、DEF FILLをDEF FILL2等に変更する
  2. 1035行目、A=1/0となっている箇所をA=A/0に変更する

3.2.0になって、FILLという命令が新設されたため、DEF FILLは多重定義エラーになります。FILLはプログラム中で実際には使っていないようなので、適当な名前に変えるか消すかでこの問題は解決できます。

もう一つの変更点として、それまで実行時に演算していたと思われる定数の数式が、初回バイトコードコンパイル時に行われるように変わったようです。1035行目のコードは、エラー処理コードであり、わざと0除算を発生させて強制終了させるために書かれていたコードなのですが、これが新しい仕様では実行前に評価されてしまうため動かなくなっています。なので変数を0除算させるように書き換えることで対応できます。

いずれにせよ、公式な修正はそのうち出ると思われますが、今すぐどうにかしたいという方はこれで対処してみてください。

gensimのLdaModelバグ

gensimのLdaModelでtop_topic()を使おうとしたらいろいろバグが残っていたので、とりあえず手元で動くようにしてみました。詳細はMLに報告しましたが、これが正しい解法かは自信がありません。

問題は複数ありますが、まずは名前空間に不備があります。”np”と”ifilter”という2つの関数をglobalで利用しようとして失敗します。これは以下のように無理やり定義してやれば問題を回避できます。

import gensim
gensim.models.ldamodel.np = gensim.models.ldamodel.numpy
import itertools
gensim.models.ldamodel.ifilter = itertools.ifilter # for python2.x
#gensim.models.ldamodel.ifilter = itertools.filter # for python3

これ以外に、LdaModel.top_topics()に与えたcorpusによってはKeyErrorが発生する問題があります。これはMLにも書いたようなパッチで回避できました。

--- ldamodel.py.old     2015-06-01 22:40:03.484170877 +0900
+++ ldamodel.py 2015-06-01 22:42:06.016170862 +0900
@@ -776,9 +776,14 @@
         for topic in xrange(len(topics)):
             topic_coherence_sum = 0.0
             for word_m in topics[topic][1:]:
-                doc_frequency_m = len(doc_word_list[word_m])
-                m_set = set(doc_word_list[word_m])
+               x = doc_word_list.get(word_m, None)
+               if x is None:
+                       continue
+                doc_frequency_m = len(x)
+                m_set = set(x)
                 for word_l in topics[topic][:-1]:
+                   if doc_word_list.get(word_l, None) is None:
+                       continue
                     l_set = set(doc_word_list[word_l])
                     co_doc_frequency = len(m_set.intersection(l_set))
                     topic_coherence_sum += numpy.log(

私の環境では、これでgensim 0.11.1においてtop_topicsが機能するようになりました。