もやもやの正体

最近、ちょくちょくもやもやとしたものを感じることがある。
詳細は書かないけれど、もやもやした感覚を覚えることがある(どっちかといえばプライベートで)。
つい先日もそういうもやもやを感じたので、適当に書き残しておこうかなと思った。

思考を鈍らせるもの

ぼくらが「何か」をしようとしたとき、その「何か」を実現するまでには大なり小なり何らかのパワーが必要で、
それは例えば、肉体を駆動するための美味しいごはんだったり、健康を維持するための体力であったり、
「何か」に向かう渇望であったり、もっと単純な見栄や意地やプライドだったりするかもしれない。
そういう「パワーの源」を誰しも自分の内外に持っているはずだ。
この「パワーの源」自体には良いも悪いも無くて、それが人間を動かすエネルギーを供給してくれさえすれば良い。
だけれども、時々僕らはこの「パワーの源」によって生み出された結果に、「善悪」とか「妥当性」とか「合理性」とかそういうものを重ねて見てしまうことがある。
これも、そう「見てしまう」こと自体には良いも悪いもないのだけれど、ただ、「パワーの源」が何であるのかを観るための目を濁らせてしまうことがある。
濁った目で見た世界は、ぼくらの思考を鈍らせてゆく。
そうやってどんどん鈍った思考の中で、もやもやを募らせるのはつまらない。

ねがてぃぶなこころ

鈍った思考の中で、受け取った言葉を咀嚼していると、苦かったり酸っぱかったり、オエッマズッ!ってなることがある。
そう感じてしまう自分にも問題は当然あるのだけれど、なるべくならオエッマズッ!とはなりたくない。
どうすれば良いのだろうか、最近までもやもやしたものを感じていた。
このもやもやが、最近になってどうもネガティブな部分に反応してオエッマズッ!となる傾向があるらしいということに気がついた。
あぁこれは同類嫌悪なのかもしれない。
逃避のための理由を探して、だらだらと何もしないでいる自分を見ているような、そんな嫌悪感を感じるのかな。
本当のところは判らないけれど、きっとそういうことなんだと思う。
原因はなんとなく判った。よし、じゃぁどうしようか?
ネガティブな発言を封殺すれば良い?そんなことできっこないよ。そうだよね。
じゃぁ、我慢する?うん、今はそうしようか。もうちょっと年をとるまで、待とう。


今だって十分におっさんだけど、
今よりもっと良いおっさんになりたい。

mruby-sdl2作ってます

前々からちょっとした理由でSDL2.0をmrubyから使いたいなーと思っていました。
で、今回ちょっと本格的に使いたくなってきたので、mruby-sdl2を作ることにしました。

SDL自体はすごく大きくて、周辺のいろんなライブラリも含めると、とてもじゃないけどそう簡単には作りきれません。
なので、まずは基本的な機能だけをうすーくラップしたクラスライブラリを作ります。
ということで、作ってみたソースはいつもどおりGitHubに公開しています。

https://github.com/crimsonwoods/mruby-sdl2

あまりちゃんとREADME書いてないのですが、サンプルコードはいくつかあげてあるので、
動かすだけならそんなに難しいこと無いんじゃないかなーと思っています。

サンプルコードは↓においてあります。

https://github.com/crimsonwoods/mruby-sdl2/tree/master/samples


一応OpenGLも動作するようになっていると思います。
OpenGLの使い方ですが、下記からmruby-glesを引っ張ってmrbgemに加えてください。

https://github.com/crimsonwoods/mruby-gles/tree/fix_for_compile_on_Ubuntu

基本的にはこんな感じです。

conf.gem :github => 'crimsonwoods/mruby-gles', :branch => 'fix_for_compile_on_Ubuntu'

あとはこれにOpenGL ESのライブラリのコンパイルやリンクに必要な設定をして、サンプルコードを動かしてみてください。


Audio用のサンプルでは、動作させるのに別途サンプル音源が必要になります。
音源については現状こちらでは用意していないので、動作を試される方はご自身で用意頂く必要があります。


それでは。

mrubyからLeapMotionを使えるようにするmrbgemを作りました

つい先日LeapMotionが手元に届いたので、
思わず嬉しくてLeapMotionのSDKを見ながらmrubyからLeapMotionを使うためのmrbgemを作ってしまいました。
まだすべての機能が実装できたわけではありませんが、とりあえず認識している手の数とか、
指の本数とか、指先の座標っぽいものとかはとれるようになりました。

というわけでGithubでソースコードは公開しています。
まだ全然READMEにまともな情報を書けていません。ごめんね!
あとUbuntuでしか動作確認してないから、他の環境ではそもそもコンパイル通るかしら怪しいです。


https://github.com/crimsonwoods/mruby-leapmotion


基本的にはLeapSDKの各クラスがほぼそのままmruby側に出ています。
違うのは名前空間代わりに使っているmoduleの名前がLeapじゃなくてLeapMotionなことくらいかな。

Githubにも上げてあるけど、基本的にはこんな感じで使います。

class MyListener < LeapMotion::Listener
  def on_frame(controller)
    puts "frame: " + controller.frame.to_s
  end
end

controller = LeapMotion::Controller.new
listener = MyListener.new

controller.add_litener(listener)

# ここは適当に待ちを入れてね!
# 待っている間にMyListener.on_frameがばしばし呼ばれるよ!

controller.remove_listener(listener)

ということでLeapMotionとmrubyで遊んでみましょう!

高専カンファレンス5周年記念パーティーに参加しました

2013/06/15に開催された高専カンファレンス5周年記念パーティーに参加してきました。

高専カンファレンス5周年おめでとうございます!
運営にご尽力くださった@june29さんと@igaiga555さん本当に有難う御座いました。
そてお疲れ様でした。

私と高専カンファレンスの出会いは、2010/04/24に開催された高専カンファレンス in サレジオ(kosenconf-013salesio)でした。
この時から気づけば3年以上経っているんですね。
いやぁあっという間だなぁ。高専カンファレンスとの出会いはついこの間みたいな気がしますね。
せっかくなので、私にとっての高専カンファレンスを振り返ってみたいと思います。

高専カンファレンスと出会ってから3年、いろいろなことがありました。
私が参加したカンファレンスは、

  1. 高専カンファレンス in サレジオ - 高専カンファレンス Wiki
  2. 高専カンファレンス in 奈良 - 高専カンファレンス Wiki
  3. 高専カンファレンス 2010秋 in 東京 - 高専カンファレンス Wiki
  4. 高専カンファレンス in 京都 - 高専カンファレンス Wiki
  5. 高専カンファレンス in 沼津 - 高専カンファレンス Wiki
  6. 高専カンファレンス in サレジオ2 - 高専カンファレンス Wiki
  7. 高専カンファレンス in 三重 - 高専カンファレンス Wiki
  8. 高専カンファレンス in 仙台 - 高専カンファレンス Wiki
  9. 高専カンファレンス in 長岡 - 高専カンファレンス Wiki
  10. 新春・高専カンファレンス2012 in 東京 - 高専カンファレンス Wiki
  11. 高専カンファレンス in 東京 - 高専カンファレンス Wiki
  12. NSEG勉強会 feat. 高専カンファレンス - 高専カンファレンス Wiki
  13. 高専カンファレンス in 沼津2 - 高専カンファレンス Wiki

割とちょくちょく参加していますねぇ。

2010年は母校である沼津高専での開催を目指して各地の開催に顔を出しては、
実行委員をやっていた人にお話を聴くなんてことをしていました。
そして2010年の年末には、念願だった母校での高専カンファレンス開催にこぎつけることができました。
高専カンファレンスの開催にあたって、多大なるご協力を頂いた沼津高専制御情報工学科の鈴木先生には
感謝してもしきれません。
私が学生の時からお世話になっていた教官の方で、高専カンファレンスのことをご相談させていただいた時も、
ご理解と多くのご助言を頂き大変感謝しております。ありがとうございました。
参加者として、各地よりアクセスの良くない沼津まで足を運んで頂いた方にも大変感謝しております。
沼津での開催が成功し、次につながったのは、ひとえに参加してくださった皆様と、
運営のために尽力した若いスタッフたちのおかげです。
改めて御礼申し上げます。

2011年は募金活動をやったり、仙台や長岡などの東北方面に遠征したりしていました。
やっぱりこの年は3.11のことを思い出さずにいられません。
遠く離れた東京にいた私でさえ、命の危険を感じるような地震を体感しました。
被災地の方々の恐怖は、私が感じたものよりもずっとずっと大きなものだったでしょう。
いろいろな苦しみや悲しみに負けずに、高専カンファレンスを開催した各地の実行委員の芯の強さには感服します。
また、多くの方に募金にご協力頂き、大変有り難うございました。

2012年は東京開催のスタッフに混ぜていただき、多くのことを学ばせて頂いた年でした。
あまり外部に向けた活動はしていなかったのですが、NSEGではmrubyネタでお話をさせて頂きました。
長野ではお酒を飲み過ぎて潰れたのが悔やまれます。

2013年には沼津高専での開催2回目となるカンファレンスが開催されました。
運営にはほとんどノータッチで、学生が自分で考え、自分で運営した会でした。
2010年に撒いた種が芽を吹き、顔を出し始めたことを感じました。
沼津の後輩たちのこれからの活躍に期待しています。


高専カンファレンスと出会ってから3年間、いろいろなことがありましたが、
その高専カンファレンスとの出会いで、今でも強く印象に残っていることがあります。
それは、1回めの「高専カンファレンス in サレジオ」の前夜でした。
最近はあまり見かけなくなった気がしますが、当時は前夜祭ラジオなるイベントが開催されており、
その場で当時運営側にいたid:june29に沼津での開催をしたい旨をお話した時でした。
彼は私に、それは素晴らしいことで、是非カンファレンスに参加して当日話をしたいと言ってくれたのでした。
それまでカンファレンスに参加したことすらない人間が、いとも簡単に受け入れられた、そんな瞬間でした。
今でも高専カンファレンスと、そこに参加する多くの人は、新しい参加者を受け入れる準備があります。
いつだって、どこだって、参加したいと少しでも思ったのなら、是非会場までお越しください。
開催してみたいと思ったのなら、是非開催してください。
もしご希望と荒れば、私を始め、いい年をした大人もお手伝いさせて頂きます。


こうして振り返ってみるといろいろと思い出すことはあるのだけれど、文字にするととてもとても多くて、
とりとめのない言葉ばかりになってしまいそうなので、このあたりで良しとしておこうと思います。
今後は若い人のサポートに尽力できたら良いななんて思っています。
まぁ実際どうするかはその場になってみないと判らないものではありますが。


出会ってからの3年間、たくさんの思い出と、刺激的な出会いに巡りあわせてくれた高専カンファレンス、ありがとう!
そしてこれからも宜しくお願いします。

文鎮化したWZR-1750DHPの修理

文鎮化したWZR-1750DHP(Buffaloの802.11ac対応WiFiルータ)が手に入ったので修理してみました。

なぜ文鎮化したかですが、直接私が何かしたわけではないので詳しくはわからないのですが、
DD-WRTというCFW(Custom Firm-Ware)上でNVRAMいぢったりとかしたら文鎮化したらしいです。

簡単に手順を書いておくと、

  1. 殻割り(外装をバラして基板に直接アクセスできるようにします)
  2. UARTを探す(大抵デバッグとか修理用にUARTでconsole接続できるようになっている)
  3. UARTをつないでconsole出力を眺める(どんなブートローダーかなーとか)
  4. NVRAMをクリアする
  5. 再起動→NVRAMが修復される
  6. 再起動→DD-WRTが復活するやったー!

という感じです。

殻割り

殻割りの手順としてはこんな感じです。

  1. 裏面のシール(USBとか書いてあるやつ)を剥がします。
  2. トルクスドライバ(T6)でネジをはずします。
  3. LANのポートを見ると、隙間から基板が見えるので、基板が見える側を下にした状態にします。
  4. シルバーグレイの枠が、裏面の本体側と爪で固定されているので、爪を浮かして、下側(基板側)に少しずらしておきます(上側だと後で蓋をあけるときに邪魔になるので)。
  5. シルバーグレイの枠が外れると、蓋と外装の間に隙間ができるので、そこにマイナスドライバを差し込んで、外装内側の爪を浮かせながら蓋を外していきます。
  6. すべての爪がはずれると、あとは冷却用の金属板が両面テープで固定されているだけの状態になるので、両面テープをぺりぺり剥がします。

http://instagram.com/p/aLuNtsv60J/
裏面のシールをはがすとネジが見えています。

f:id:crimsonwoods:20130608195651j:plain
判りづらいですが、バーコードのシールの角のあたりにシルバーグレイの枠から本体内側に向かって爪が出ているのが見えます。
これをはずすときは、枠と外装の間にマイナスドライバを差し込み、蓋を上に浮かせながら枠を外に向かって押し出します。

f:id:crimsonwoods:20130608195746j:plain
本体外装の内側についている爪です。
これを蓋からはずすときは、外装と蓋の隙間にマイナスドライバを差し込み、外装部分を外側に引っ張りながら蓋を浮かせるように押し上げます。

f:id:crimsonwoods:20130608200046j:plain
最後に冷却用金属板の両面テープを剥がします。

UART接続

UARTの接続は下記のような手順で行います。

  1. 基板が露出したら、4本のピンが立っているところを探します。シルクには「J14」とあり、ファクトリーリセットボタンの比較的近くにあります。
  2. 4本のピンは▽マークがある場所から純にVCC,GND,TX,RX(TXとRXは逆かも)と並んでいるので、これをレベル変換基板やUSB-UARTを挟んで(私はCPUを抜いたArduinoをよく使います)PCに接続します。
  3. TeraTermなどのTerminal Emulatorで「115200bps, 8bit, パリティ無し, 1ストップビット」に設定します。

f:id:crimsonwoods:20130608202309j:plain
画像中央辺りにある4本のピンがUART用のピンになります。

NVRAMの消去

NVRAMの消去はBootloaderから行います。

  1. 本体に電源を投入します。
  2. UARTにBootloaderのログが出力されます。
  3. Flashからの起動に失敗したら、「Ctrl+C」を押して、対話モードに移行します。
  4. 「nvram erase」と入力して、NVRAMを消去します。
  5. 電源を切って再起動します(私の場合はここでなぜか一度起動に失敗したのでさらに再起動をしています)。
  6. NVRAMが修復されて、DD-WRTが起動すれば成功です。

https://pbs.twimg.com/media/BMPAhwvCEAA4plO.png
起動時のBootloaderはこんな感じの出力を行います。

f:id:crimsonwoods:20130608234813p:plain
何かを修復しているような感じの出力が出ました。

おまけ

WZR-1750DHPは、電源投入直後にAOSSボタンを暫く押しっぱなしにすることで、tftpによるfirmware更新モードで動作します。
NVRAMが壊れていなければ、通常はこのtftpによるfirmware updateでファームウェアが書き換えられるのではないかと思います。

https://pbs.twimg.com/media/BMPDoZqCUAEeLEC.png
192.168.11.2からfirmware.ramというファイルをtftpで取得しようとしているのが判ります。

https://pbs.twimg.com/media/BMPay_hCEAEFdEc.png
WZR-1750DHPで使用されているCFEというBootloaderで使用出来るコマンドの一覧です。

mruby-backtraceというmrbgemを作った

mruby用にbacktraceを吐くためのクラスとメソッドを追加してくれるmrbgemを作りました。

https://github.com/crimsonwoods/mruby-backtrace

このgemを有効にした状態でmrubyをビルドすると、
Backtraceというクラスと、「put_vm」、「put_rb」というクラスメソッドを使用できるようになります。

適当なところで、

Backtrace.put_rb

とかしてみると、Rubyのコールスタックが標準出力に吐き出されると思います。

ちなみに「put_vm」の方は、
VMの中のC言語で実装されている部分のコールスタックを吐き出してくれます。
libunwindを使ってちょー適当に実装しているので、問題があったらpull-requestとか送ってもらえるとありがたいです。

こんなコードを書いてbacktraceを吐かせると、

def factorial(n)
  if (n != 0) && ((n % 4) == 0) then
    Backtrace.put_rb
  end
  if n == 0 then
    1
  else
    n * factorial(n-1)
  end
end

factorial 10

こんな感じのトレースを出力してくれます。

backtrace:
	test.rb:3:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:12
backtrace:
	test.rb:3:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:8:in Object.factorial
	test.rb:12

ちなみに「put_vm」するとこんな感じです。

---- [backtrace] ---------------
0x458e73 <mrb_bt_put_vm + 0x4c>
0x41143a <mrb_run + 0x194b>
0x43ea08 <load_exec + 0x469>
0x43eb03 <mrb_load_file_cxt + 0x41>
0x402af9 <main + 0x3bc>
0x7f0e3895876d <__libc_start_main + 0xed>
0x401d39 <_start + 0x29>
--------------------------------

mrubyのビルドシステムにAndroid用のビルドを対応させました

mrubyをAndroid用にビルドする方法として、以前は下記のような方法がありました。

  1. 自分でARM用のtoolchain (CodeSourceryとか) を持ってきてARM用にstaticビルド
  2. Androidリポジトリをごっそりもってきて、その中のtoolchainでビルド
  3. Android NDKをもってきて、その中のtoolchainでビルド

最近のmrubyでは、Rubyのスクリプト(Minirakeと呼んでいるのかな?)を利用して、
ビルド時のtoolchainをカスタマイズできるようになっています。
この仕組を利用して、Android NDKだけでmrubyをAndroid用にビルドできるようにしました。

既にmruby本体の方に取り込まれている(commit ad11d3144efc34e6fdc6deb24fb073f1ccd99fdb)ので、
最新のAndroid NDKさえ手元にあればmrubyをgit cloneしたらすぐにAndroid用のビルドができます。

下記にビルドの仕方の詳細を記述します。
方法は大きく2つあり、一つはSTANDALONE_TOOLCHAINを利用する方法、
もうひとつはNDKのホームディレクトリを指定する方法です。

ANDROID_STANDALONE_TOOLCHAIN」を使う方法

手順は以下のとおりです。

  1. Android NDKをDownloadして展開
  2. Android NDKの「build/tools/make-standalone-toolchain.sh」を使用してツールチェインをセットアップします。
  3. mrubyをgit clone
  4. ANDROID_STANDALONE_TOOLCHAINという環境変数に、"2"でセットアップしたツールチェインのパスを設定
  5. makeを実行

コマンドでいうと下記のような感じです。

$ cd /path/to/android-ndk-rxx/
$ cd build/tools/
$ ./make-standalone-toolchain.sh --platform=android-14 --toolchain=arm-linux-androideabi-4.6 --install-dir=/tmp/android-14-arm-gcc4.6 --ndk-dir=/path/to/android-ndk-rxx/
$ cd /path/to/mruby_dev
$ git clone git://github.com/mruby/mruby.git
$ cd mruby
$ ANDROID_STANDALONE_TOOLCHAIN=/tmp/android-14-arm-gcc4.6 make

「make-standalone-toolchain.sh」に渡すパラメータはビルド対象のプラットフォームやアーキテクチャに合わせて適宜変更してください。

ANDROID_NDK_HOME」を使う方法

手順は以下のとおりです。

  1. Android NDKをDownloadして展開
  2. mrubyをgit clone
  3. ANDROID_NDK_HOMEという環境変数に、"1"で展開したNDKのパスを設定
  4. makeを実行

コマンドでいうと下記のような感じです。

$ cd /path/to/mruby_dev
$ git clone git://github.com/mruby/mruby.git
$ cd mruby
$ ANDROID_NDK_HOME=/path/to/android-ndk-rxx/ make

この時、ビルド対象になるAndroidプラットフォームのバージョンやアーキテクチャは、
別途環境変数で指定できるようになっています。

指定可能な環境変数は下記のようになっています。

ANDROID_TARGET_ARCH
ビルド対象のアーキテクチャで、'arm', 'x86', 'mips'のどれかを指定します。デフォルトは'arm'です。
ANDROID_TARGET_ARCH_ABI
ビルド対象のABIで、ANDROID_TARGET_ARCHが'arm'の時だけ使用します。指定できるのは'armeabi-v7a'だけで、指定しないか異なる値の場合はarmv5teとしてビルドします。
ANDROID_TOOLCHAIN
使用するツールチェインの種類で、'gcc', 'clang', 'clang31'のどれかを指定します。現在は'gcc'のみをサポートしており、'clang'や'clang31'は使用出来ません。
ANDROID_TARGET_PLATFORM
ビルド対象のAndroidプラットフォームバージョンで、'android-14', 'android-9', 'android-8', 'android-5', 'android-4', 'android-3'を指定出来ます。


今はまだサポートしていないフラグとかがあるので、今後きちんとサポートしたいのと、
そのうちclangもサポートできたら良いなーと思っています。
いつになるかわかりませんが。