tana_ash's diary

プログラミングや電子工作など。やってみたこと、わかったことをまとめておく場所。

Explorer Touch Mouseの感想

安く売っているお店を見つけて翌日直行。
念願のExplorer Touch Mouseを手に入れた!
Explorer Touch MouseはMicrosoftのワイヤレスマウスです…が、
このマウスはただのマウスではありません。なんと、ホイールの代わりにタッチセンサーがついています。
しかし、使い方は普通のマウスと変わりません。ホイールを回すようにタッチセンサの上で指を動かすだけです。
実はいままで使った多くのマウスが壊れてしまった私。その多くはホイールが壊れています。
しかし、このマウスは違います。ホイールは回りません。これで二度と壊さない。

感想

Ubuntuでも普通のマウスとして使えます。ホイールの横スクロールも使えます。
ホイールのカクカク感を再現した振動も嬉しいです。
ただし、普通の3ボタンマウスとして使えるだけで、5ボタンとしては使えません。
タッチセンサーは、汗をかいているためか、若干反応が悪いことがたまにある気がしますが、そこまで支障があるわけでもありません。
また、これまで使っていた普通のマウスではうまく動かなかった、キーボードの箱の写真の上でも使えます。
斬新さも含めて、結構いいマウスではないでしょうか。

AndroidテザリングとIPアドレスの謎

現在使用しているAndroid端末にはテザリング機能が搭載されています。
ふと思いついたアプリを実装するため、テザリング時のIPアドレスについて調べています。
今回は、その動作について書いていくことにしました。
使用した端末はOptimus LTE(L-01D)、キャリアはdocomoです。
ネットワークについては詳しくないので、勘違いがあるかもしれません。また、機種によって違った動作をする可能性もあります。
他の端末については確認ができないので、現在情報を求めている状況です。

はじめに

ここで書いている「テザリング」とは、全てWiFiテザリングのことです。
今回は、「ネットワークインターフェースを列挙し、出てきたものの中からループバック(localhost)でないものを出し、インターフェース名とIPアドレスを表示」という動作を行うアプリを作成しました。
まず、Androidのテザリングの動作について気づいたことをいくつか書いておきます。
Androidはテザリング中、WiFiが切断されます。そのため、携帯回線が必須になります。
また、テザリングでAndroidを通して接続した端末(PCや他スマホ等)は、IPアドレスの3つめの部分まで(aaa.bbb.ccc.dddのaaaからcccの部分まで)が端末と同じIPアドレスが割り振られます。

通常時のIPアドレス

テザリングが動作せず、普通に携帯回線に接続されている時は、
「rmnet_sdio0」という名前で、キャリアから割り振られたキャリアのNATの中のプライベートIPアドレスが割り振られます。
ここまでは想像した通りでした。

テザリング時のIPアドレス

ここからが本番です。これから動作が若干よくわからない状態になります。
テザリングを動作させている間は、通常時は存在した「rmnet_sdio0」が消滅します。
そして、「wl0.1」という名前で、「はじめに」でも書いた、3つめの部分までが接続されたPCなどと同じになったIPアドレスが出現します。
「wl0.1」は、「192.168.43.1」というIPを持っていて、PCは「192.168.43.何とか」というIPを持っています。

この動作は他の端末でも同じなのでしょうか。誰か知っている方がいらっしゃいましたら情報をお願いします。

小さなHTTPサーバーNanoHTTPDを使う&改造する

今年の4月ごろからAndroid開発を始めたのです。
だからJavaもやってるのです。
そして、突然新しいアプリのネタを思いついてしまったのです。
というわけで、今日は、Javaソースコード1ファイルだけの小さなHTTPサーバー、NanoHTTPDというものを見つけたので動かして、それを改造するのですよー!
NanoHTTPDは http://elonen.iki.fi/code/nanohttpd/ ここからダウンロードできるのですよ。

改造後のNanoHTTPDと自分で書いたコードはgistにアップロードしてあります。
https://gist.github.com/3436665

そのまま動かしてみる

まずNanoHTTPDのソースコードをダウンロードし、それをjavacでコンパイルします。
普通に

javac NanoHTTPD.java

でコンパイルして

java NanoHTTPD -p 44444

と起動します。-pの後に数字を入れてポートを指定するとサーバーを起動でき、起動したディレクトリにあるファイルにアクセスできます。

組み込んでみる

ここは後付けで書いたため短く薄いです。
NanoHTTPDのサンプルコードにHelloServer.javaというのがあったのでそれ参考です。
ただし、superの引数が違っていたと思います。バージョンの違いでしょうか。
NanoHTTPDを継承したクラスを作り、コンストラクタでは適当に初期化します。
superの引数はポート番号とFileですが、ファイルを使わないのならnullで大丈夫です。
実際の処理はserveメソッドです。ここでは、最初の引数がファイルパスなのでこれで分岐して処理します。

改造しちゃう

ここで思いっきり改造します。
まず、コンパイルする時に警告が出ないようにしました。
修正箇所は、HashtableやVectorVectorのように型を指定せずに使っている場所に、型を書いたり、「Java 1.4ではこっちを使って」と書かれているところを使うようにしたようなところです。
また、「リアルタイムでクライアントにデータを通知したい!」と思ったのでchunkedなレスポンスを返せるようにしました。
chunkedについては http://d.hatena.ne.jp/kiririmode/20100606/p1 ここを参考にしています。
ただし、ここで大きなミスにはまってしまいました。
NanoHTTPDではデータを読み込んでクライアントに送るところでInputStreamを使っているのですが、ほとんどそのままやってみた場合、
InputStreamをreadしているところで、InputStreamにデータを送り込む側のPipedOutputStreamをcloseしても止まりませんでした。無限ループです。
実は大きな落とし穴がありました。
InputStreamのreadメソッドは、3つの引数を与えた場合は読み込んだバイト数を返しますが、
ストリームが終わっている場合は-1を返します。
しかし3つめの引数(たぶん読み込むバイト数か終わりの位置)が0の場合、ストリームが終わっていても-1ではなく0を返すようです。
それが、一旦残りが無くなっても本当に終わる、つまり-1を返すまで終了しないという改造部分に引っかかり無限ループしていたのでした。
これで、serveの戻り値でResponseを作るところでPipedInputStreamを渡せば、少しずつデータが送られてくるプログラムが作れます。

まとめ

ここまでHTTPサーバーが小さければ、Androidや家電やアレなアレにサーバーを組み込んだり夢が広がりますね!
(ちなみに、最後に自慢。HSPでHTTPサーバーを書いた頃の自分は何かに取り憑かれていた。HSPの精霊とか。)

mrubyのメモとか。

mrubyについていろいろ調べながらプログラムを書いてます。
その中で調べたことについて書いておきます。
主に、C言語からmrubyにメソッドを追加したり呼び出したりすることについてです。
http://avr.paslog.jp/article/2492088.htmlhttp://akasata.hatenablog.com/entry/2012/05/30/202432 を参考にしています。

// メソッドを定義します。
// 二つ目の引数では定義する先のモジュールを指定するようですが、
// ここはKernelにしたので関数のように使えます。
// mrbはmrb_stateで、多くのの関数で引数になっています。
mrb_state *mrb = mrb_open();
// のようにして生成します。
mrb_define_method(mrb, mrb->kernel_module, "メソッド名", &中身の関数, 引数の数);

// 中身の関数はこうなっています。
mrb_value hoge(mrb_state *s, mrb_value self) {
  mrb_int a, b;
  // この関数で渡された引数を取得できます。
  // "ii"のところで、引数がどんな型なのかを指定するようです。
  // "i"はintのことで、それを二つ並べるとintが2つになります。
  // オブジェクトなら"o"を使います。
  mrb_get_args(s, "ii", &a, &b);
  // これはnilを生成して返します。
  return mrb_nil_value();
}

// オブジェクト場合はこうです。(これはオブジェクトを2つ引数に取る場合)
mrb_value a;
mrb_value b;
mrb_get_args(s, "oo", &a, &b);

// オブジェクトのメソッドを呼び出すにはこうします。
// 今回は、引数の数が0の場合です。
// sはmrb_stateです。
result = mrb_fixnum(mrb_funcall(s, オブジェクト, "メソッド名", 引数の数));
// mrb_funcallでメソッドを呼び出しますが、その結果はRubyの値(mrb_value)なので、
// intが欲しい場合はmrb_fixnumを使ってintを取り出します。

// クラスをインスタンス化してオブジェクトを生成する方法です。
// オブジェクトを表す値が返ってきます。
// sはmrb_stateです。
// 二つ目の引数の2は引数の数、三つ目のarrは引数の配列で、Rubyの値を表すmrb_valueの配列です。
// mrb_valueの配列なのでintはそのまま入りません。
// なので、mrb_fixnum_valueでint型の値をmrb_valueに変換します。
// mrb_class_get(s, "クラス名")は、クラスを取得しています。
mrb_value arr[2];
arr[0] = mrb_fixnum_value(x);
arr[1] = mrb_fixnum_value(y);
mrb_class_new_instance(s, 2, arr, mrb_class_get(s, "クラス名"));

ちなみに、SDLとmrubyを組み合わせてゲームでも作れたらと思っていろいろやってます。

mrubyをビルドしたり、使ったり。

RubyLuaのようにプログラムに組み込んだりできるmrubyというものがあります。
githubで公開されています。https://github.com/mruby/mruby/
今回はふと思いつきこれを試してみることにしました。
メモも兼ねて手順を書いておきます。
ビルドは簡単です。時間もあまりかかりません。

ビルドするよ!

まず、このコマンドでソースコードをgithubから取ってきまます。

git clone https://github.com/mruby/mruby.git

次に、mrubyディレクトリに入ってビルドします。makeだけです。本当に簡単です。
ただし、bisonのインストールが必要です。

cd mruby
make

これでビルドは終わりです。本当にこれだけです。
irbのようなmirbでコードを試してみることもできるようです。

./bin/mirb

っと、ここで普通のRubyとの違いが一つありました。

1 / 0

の結果が「inf」になり、エラーが出ません。

自作プログラムに組み込んでみる

最初に、mrubyディレクトリから「cd ../」で元のディレクトリに戻っておきます。
「sample.c」という名前でこんなC言語のプログラムを用意します。

#include <mruby.h>
#include <mruby/compile.h>
#include <stdio.h>

int main() {
  mrb_state *mrb;
  mrbc_context *ctx;
  mrb = mrb_open();
  if (mrb == NULL) {
    printf("Error\n");
  }
  ctx = mrbc_context_new(mrb);
  mrb_load_string_cxt(mrb, "puts \"Hello, world\"", ctx);
  mrbc_context_free(mrb, ctx);
  mrb_close(mrb);
  return 0;
}

このプログラムでmrubyを呼び出します。
mrb_load_string_cxtという関数がRubyソースコードを実行するものだと思います。
コンパイルする時は「-lm」が必要そうです。

gcc sample.c -o sample -I./mruby/include -L./mruby/lib -lmruby -lm

実行。

./sample

「Hello, world!」と表示されます。

まとめ

これでゲームとか作れたら楽しそうです。夢が広がりますね!

超小型USB LEDライト

記念すべき最初のネタがこれだよ!!!
今回は、調子に乗って作った意味があるのか全くわからない、おそらく意味がないであろう謎の物体について書くことにします。

事の発端

そもそも一番最初に遡ると、学校で友人から銀色と白の謎の物体を受け取ったことから始まります。
何かと思うと、それはUSBコネクタでした。
といっても、コネクタについているはずのカバーがなく、導線もついていないものでした。
しばらくカバンのすみに隠れていたコネクタですが、それを見つけた僕はこんなツイートをします。



こんなことを思いついてしまったがために、工作用の作業台に置かれていたLEDは無駄遣いされることになったのである。

結果


モバブと接続した状態がこちら。
暗い中で電源を入れると、かなり明るく光ります。

さすが超高輝度白色LED
「肝試しだ!でもモバブしか持ってない!」
「旅行先で停電だ!でもノートPCしか持ってない!」
そんなあなたにおすすめ…… そんな状況あるか!

作り方

黄色いテープをはがすと中はこうなっています。

コネクタと100Ωの抵抗とLEDを単にハンダ付けしただけですが、一つポイントがあります。
それは、普通の抵抗よりも小さい小型抵抗です。
間違って購入してしまい使われていなかったものを有効(なわけがない)利用することができました。
この抵抗は千石電商で購入できます。

以上。この意味のわからないネタに最後までお付き合いいただきありがとうございます。

ブログ始めました

数々の黒歴史を残して消えていったtana_ashさんがついに本気でブログを始め、やりなおします。
主にプログラミング、時々電子工作について書くことが多いと思いますが、関係ないネタもあると思います。
痛いところ、変なところ、いろいろあると思いますが、チョコレートが溶けない程度に暖かく見守っていただけると嬉しいです。