0

Nexus SのNFCでFelicaのIDを読む(2)

Nexus SのNFCでFelicaのIDを読む – 橋本詳解の時に、Android 2.3 GingerBread NFCをやってみる – TOPGATE Google関連技術サイトのTagWrapper.javaを使わせてもらってたんだけど先日のNexus Sのandroid2.3.4へのアップデートで動かなくなったので少しやり方変えた。
TagWrapper.javaの中でやってる事を参考にさせてもらった。


ただFelicaのユニークなIDだけが必要だったらこれでいい
(先に橋本詳解の方に書いたManifestとかguavaとかを設定しておく必要はある)

import java.lang.reflect.*;
import java.util.*;

import com.google.common.primitives.UnsignedBytes;

import android.app.Activity;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.*;
たくさんのimportが必要。


    public void onCreate(Bundle savedInstanceState) {        
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
resolveIntent(this.getIntent());
}

void resolveIntent(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
try{
Parcelable tag = intent.getParcelableExtra("android.nfc.extra.TAG");
Field f = tag.getClass().getDeclaredField("mId");
f.setAccessible(true);
byte[] mId = (byte[]) f.get(tag);
StringBuilder sb = new StringBuilder();
for (byte id : mId) {
String hexString = Integer.toHexString(UnsignedBytes.toInt(id));
if (hexString.length() == 1) sb.append("0");
sb.append(hexString);
}
String id = sb.toString();
Log.v("TAG", id);
}
catch(Exception e){
e.printStackTrace();
}
}
}

0

湘南台の男のらーめん500円の営業状態を調べるrubygems作った

昨日、男の店主がメルマガで、「急に三田二郎を食べたくなったから昼の営業は休みます」「今神保町で二郎食べたけど、これから用心棒も食べるから夜は19時からになります」と言っていて面白かったから作った。


■インストール

gem install otokonoramen500yen


■使う
gem installすると、otokonoramen500yenというコマンドが使えるようになる。
otokonoramen500yen
実行すると、最新のメルマガの日時と本文が表示される。


これでterminalで作業している時に、ブラウザを開かなくても今日営業しているかパッと調べられるので便利です。


■開発者向け情報
一応gemなので、本文と発行日時を取得できるようにしておいた。
例えば、センサーで取得した自身の健康状態と、男のらーめんの営業状態とを連動させた健康促進システムの開発などへの応用が期待できる。
require 'rubygems'
require 'otokonoramen500yen'
o = Otokonoramen500yen.get
puts o.date
puts o.body
puts o.url

0

glitchtweet.com作った

2ヶ月ぐらい前に作った。blog書くのめんどくさくて放置してた。

http://glitchtweet.com


俺がやっているような素敵な装飾がついたツイートがだれでもできるwebサービスです。しかも気に入ったのがでるまで何度でもやりなおせる。
iPhoneやAndroidから使うことを想定している。



ライブラリ以外のコードを数えたら、286行しかなかった。
その他は以前作ったテキストに文字装飾を行うglitchtext.jsが500行ぐらい。sinatra、haml、jqueryのおかげでシンプルに書けた。

ソースはここにある
shokai/glitchtweet-web-app – GitHub



以下細かいことなどを書く

■ファイルサイズ
でかい。glitchtext.jsが辞書が巨大すぎて300kb以上ある。けどしょうがないし、まあキャッシュ効くからいいか


■サーバー
さくらVPSのdev.shokai.orgに、virtualhostでglitchtweet.com割り当てて使ってる。


■開発環境
まずglitchtext.jsはv8とRakeで単体でテストをしている。前に書いた
glitchtweet.comのwebアプリ自体はローカルでwebrickで起動して、chromeの開発パネルでjsなどのデバッグをした。あとはiPhoneとAndroidのsafariのブラウザで開いて、見た目を調整した。


■なるべく画面遷移しない
jquery mobileやjQTouchを使うとネイティブアプリ風に外見で、横にスライドして表示を切り替えるwebアプリを作れるけど
面倒だったので使わなかった。visibleをon/offしてtweetボタンを表示したりしなかったり等している。
なのでviewのテンプレートは1つしかない。


■twitterログイン
生成したglitchテキストはoAuthでログインしてtweetされるが、ユーザ情報管理にDBは使っていない。
cookieにtwitterのoauth tokenとsecretを保存している。
最初の画面でログイン済みかどうかは、haml template上でtokenとsecretがあるかどうかだけで表示を分岐しているので、実際glitchtweet.com側では誰がどんなtweetをしているかは把握していない(しようと思えばできる)


■cookieでsession
sinatraでcookieベースのsessionを使うようにしている。
Rack::Session::Cookieを使う – 橋本詳解に書いた。
glitchtweet.comでは2週間cookieで保存するようにしている。
use Rack::Sessioin::Cookieしたらsinatraのsession関数がcookieを使うようになってくれた。
(これで大丈夫ですよね?)


■ホーム画面アイコン

<link href='http://glitchtweet.com/img/icon.png' rel='apple-touch-icon' />
これをheadに書いておくと、iPhoneのホーム画面にブックマーク保存するとアイコンが付く。
Android2.3でもホーム画面にブックマークショートカットを作ったらアイコンが出るようになった。しかも角丸化される。apple-touch-iconって名前なのに処理してくれるAndroidえらい。


■テスト環境にwebrick使うようにした
開発中にSinatra1.2.1が出たのでupdateしたら、thinを使うとhttpリクエスト送った瞬間に問答無用で強制終了するようになった。
webrick使うようにした。
Sinatra1.2.1とthin1.2.10を同時に使うと死ぬ – 橋本詳解


■viewport
@hitoriblogさんに教えてもらった。
適当なhtml/cssを書いていてもiPhoneではそれなりに正しいサイズで表示されるんだけど、Androidではテキストエリアをクリックした瞬間にものすごいズームをされてしまう。
これはviewportをheadに指定しておくとなんとかなる。Androidはデバイスがたくさんあるので、画面サイズが微妙に違うのでwebサービス作ってる人は大変そう。
<meta content='width=device-width, user-scalable=no' name='viewport' /> 
このへんも参考になる。


■shakeイベント
ネイティブアプリではshakeのイベント、つまりiPhone本体を振ったイベントを取得して、undoに使われている。
全く、操作と実行内容の関連付けが最も意味不明な機能だと思う。

でもiOS4.2からsafariでも加速度センサーが使えるようになったので、せっかくだからshakeイベントを取れるjsライブラリを作った。
shokai/js-iphone-shake-event – GitHub

glitchtweet.comでも使っている。tweet後に、もう一度同じソースからglitchしたい時にshakeすると消えた文字が復元される。

これについてはあとで書く。


■iphone-js-console
shokai/iphone-js-console – GitHub
iphone-shake-event.jsを作っている時に、iPhone実機でのデバッグをする為に作った。
パソコンのterminal上でjsを書くと、iPhone上で実行されたり、パソコン上でiPhoneのブラウザ上のjsの値を読み出したりできて便利。

これについてもあとで書く。

0

Rubyでシリアルポートを使う(最新版)

■先にまとめ

gem install serialport
でインストールして、
require 'rubygems'
gem 'serialport','>=1.0.4'
require 'serialport'
必ずバージョン1.0.4以上をロードするように指定して使いましょう。


基本的なserialportの読み書きはこうやる。
実運用ではgetsは改行がくるまでブロックされるのでloopで回して待てばいい。
sp = SerialPort.new('/dev/tty.usb-serialdevice', 9600, 8, 1, 0) # 9600bps, 8bit, stopbit 1, parity none

line = sp.gets # read
sp.puts "echo:#{line}" # write



■詳しいこと
rubyでserialportを使う場合、/dev/ttyのデバイスファイルを直接読むか、それともruby-serialportというのを使うかの2通りの方法がある。
serialportのインストール方法は以前書いた。


で、この頃(2010年初頭)まではserialportのバージョン0.6を使うのが良かった。0.7が最新だったけど関数のインタフェースが変わったのにドキュメントが追いついてなくて使い方がわからなかった為。

でもこのserialport 0.6はrubygemsからインストールができなくて、適当にzipで拾ってきてインストールするしかなかった。


最近はserialport 1.0.4がrubygemsからインストールできて、MacとUbuntuで普通に使えるようになった。Windowsでもちゃんと動くらしい。
インタフェースも0.6と同じものになっている。

ただし、古いserialport 0.6がインストールされている環境では注意が必要で、なぜかgemをバージョン指定してrequireしないと0.6の方が読み込まれる。
しかも0.6のアンインストール方法がよくわからないので、
ぜひ皆様プログラムはこのように
require 'rubygems'
gem 'serialport','>=1.0.4'
require 'serialport'
書いてくれるといちいち修正して使う手間が省けるのでよろしくお願いします。


**********
こないだかず助に行ったときに、2ヶ月ぐらいめんどくさくてこのblog書いてなくてネタたまりすぎてヤバイという話をしたら、@ykfに毎日テーマを送って、書かなかったら怒られて消化していこうという事になったのでしばらく毎日書くことになった。毎日書けば1週間ぐらいで全部書ききれる。

0

SFCが使えるか確かめる

SFCが計画停電グループ1なのでしょっちゅう停電している。
ほぼ1日1回停電するし、停電するとサーバーで長い処理をしている人や3Dプリンタを使っている人はレジュームができなくて大変らしいので簡単にSFCの状況を調べられるツール作った。

gem install sfc_ikiteru
して(適宜sudoつける)

sfc_ikiteru

すると

というふうにどれぐらい生きてるかわかる。
物理的に離れてそうなサーバーがいくつか入っているので、これでどの建物が停電しているかもなんとなく察しがつくはず。


もちろん、gemなのでmoduleとしても使える。返り値はtupleで受け取る
require 'rubygems'
require 'sfc_ikiteru'
per, details = SfcIkiteru.ikiteru
p per
p details
perは1.0〜0.0の少数が返ってくる。生きているサーバーの割合。
detailsはhashで、詳細な値が入っている。


ソースはここにある https://github.com/shokai/sfc_ikiteru

作るうえでいくつか学んだこと

■binフォルダ
rubygemにbinというフォルダを作っておくと、gem installした時に適当にパスを通してくれる。
bin/sfc_ikiteru作ってchmod +xしておいた。


■terminal出力に色をつける
rainbow使った。
require 'rainbow'
puts "正常です".color(:green)
puts "応答なし".color(:red)
のように使う


■ping
rubyの標準ライブラリでpingがうてる
require 'ping'
Ping.pingecho('shokai.org', 5, 'echo') # timeout5秒
Ping.pingecho('shokai.org', 5, 'http') # timeout5秒、httpで

第三引数はechoを返さないサーバーならhttpとか適当な外向きに動いてるportを使うといい
でも1.9.2ではpingそのものが無くなってた。jrubyでは動くけどエラーがたくさんでる。


■newgemのエラー
newgemでgemの雛形を作っているんだけど、newgemはactive_support2系を使っている。
newgemもactivesupport2系も地味アップデートされていて、しかしactive_support3系が既に俺のマシンに入っているのでgem updateでも2系がアップデートされずよく依存のエラーがでる。よくある。


いつも適当に新しいバージョンのactivesupport2系を入れるとなんとかなる。
gem install activesupport --version=2.3.11