2014年12月28日日曜日

Node.jsでGoogleのSTUNサーバを利用する

NAT内のIPアドレスやポート番号を知るために、最近だとWebRTCとかで利用されるSTUNサーバ。
GoogleもパブリックなSTUNサーバを用意している。

stun.l.google.com:19302

Node.jsだと
npm install stun
でインストールできる。(githubページ
ただgithubのexamplesフォルダ内のclient.jsを実行しても失敗する。
...client.js:31
    peer.push(packet.attrs[stun.attributes.MAPPED_ADDRESS]);
                                          ^
TypeError: Cannot read property 'MAPPED_ADDRESS' of undefined
 
原因は(いつからかわからないが)STUNサーバがMAPPED_ADDRESSではなくて、XOR_MAPPED_ADDRESSを返すようになっているから。
client.jsを実行すると、エラーメッセージの前に
Sending STUN packet
Received STUN packet: { class: 1,
  method: 256,
  attrs: { '32': <Buffer 00 01 bf 11 5c d3 78 5e> },
  tid: 769776767 }
という出力があり、attrsの32というのが、githubのlibディレクトリ内のpacket.jsに定義されているXOR_MAPPED_ADDRESS。

そもそもgithubの更新が2013年で止まっている。
こちら(https://github.com/orbitbot/node-stun )の方がXOR_MAPPED_ADDRESS対応版を作ってくれている。

cloneして動作を確かめる。



ちゃんと返ってくる。

2014年12月9日火曜日

MacでOpenCVをHomebrewでインストールしてJavaから使う

WEB+DB PRESS Vol.83 を画像認識の特集まで読み進めた。

流れとしてはOpenCVをインストール→Javaから使うというものだったのだが、OpenCVをインストールする時点で「ソースコードからコンパイルします」という修行僧のようなストイックな方法だった。

ゆとりのマカーなのでHomebrewでインストールしたい。

まず初めに
brew tap homebrew/science
と打ち込んで、OpenCVが見えるようにする。

ここから単純に
brew install opencv
とやってしまうと、.jarファイルや.dylibファイルが生成されずJavaで使えない。
なのでオプション-with-javaをつけて
brew install opencv -with-java
とする。
ビルドに時間がかかるが、完了すると
/usr/local/Cellar/opencv/バージョン/share/OpenCV/java
 にlibopencv_javaバージョン.dylibとopencv-バージョン.jarがあるので、これを使う。

2014年12月7日日曜日

オープンソースのChromiumを使う

プロプライエタリなんぞ使ってられるか!OSSが欲しいんや!
というロックな人はGoogle ChromeよりもChromiumを使いましょう。

ほぼ毎日ナイトリービルドが更新されるので時代の先頭に立っている感じが味わえます。

ダウンロードはこちらから。
ただすごく縦に長くて最新版がどこにあるかわかりづらいので最新版を取得するスクリプトをRubyで組んだ。


# coding: utf-8
require 'openssl'
require 'open-uri'
latest_ver = 0
# 最新バージョンの取得
open("https://storage.googleapis.com/chromium-browser-continuous/Win/LAST_CHANGE") { |f|
  latest_ver = f.read
}
# 最新バージョンの表示
puts latest_ver
file_size = 0
# 保存ファイルの指定
open("Win-"+latest_ver+"-chromium-win32_.zip", "wb") {|saved_file|
  # ダウンロードアドレスの指定
  open("https://storage.googleapis.com/chromium-browser-continuous/Win/"+latest_ver+"/chrome-win32.zip",
       # ファイルサイズ取得オプション
       :content_length_proc => lambda {|content_length|
         file_size = content_length
       },
       # ダウンロードしたブロックごとのサイズ取得オプション
       :progress_proc => lambda {|size|
         print "downloaded: "+(size*100/file_size).to_s+"%\t"+size.to_s+"/"+file_size.to_s+"\r"
       }
      ) {|download_file|
    puts "Download"
    # ファイルを保存
    saved_file.write(download_file.read)
  }
}

SSLを使うので、こちらのような準備が必要かもしれない。

2014年12月3日水曜日

GoPro HEROを安く買う

急に伊東家の食卓っぽくなったが気にしない。

日本の総代理店だと21060円。



 





Amazonだとビックカメラが販売(同額)。



価格.comを見るとヨドバシが最安値。20860円。(ポイントを計算に入れれば実質18774円)




 Amazon.comを使う。アカウントを作ってカートに入れ、日本の住所に発送する手続きをしていくと値段が出る。
 (Place your orderを押すと注文が確定する)


「Change card currency from JPY」を押してもメッセージの通り日本円で計算してくれない。(品切れのせい?)

前に買った時は為替に少し上乗せされて計算されていたので、 $1=120円とすると17670円

赤字にしたものの、ヨドバシの値下げと円安の進行で大差が無くなってしまっている。


何で?
単にドルの値段設定が安いというのと、GoPro HEROはWi-FiやBluetoothなどの無線機能が無いので、そのあたりの輸出関係費用がほぼない。
Wi-Fi機能があるGoPro HERO3とかだと、費用が上乗せされ日本で買うほうが安くなる。

つまり日本の価格設定よりドル価格のほうが安く、無線機能のないものならAmazon.comから買えばかなり安くつく場合がある。
椅子とか掃除機とか。