2014年7月31日木曜日

WiiUとsuica

WiUのファームウェアが5.1.0Jにアップデートされました。
そして前々から予告されていたsuica決済が可能となりました。

アップデートの詳細はこちらにあり、
suicaだけでなく多数の交通系電子マネーへの対応を果たしてはいますが、
このうち私が持っているのはsuicaだけです。
というわけでとりあえず滅多に使うことのないsuicaを引っ張り出してきて
ニンテンドーポイントをチャージしてみます。
幸いなことにsuicaには400円ほど残高がありました。
近くにsuicaをチャージできるところがないので、これが尽きればとりあえず終わりです。

suicaからのチャージは普通にeショップでできるようですが、
8月31日までの期間限定で遊べるダウンロードゲーム[ブタメダル]のゲーム中でもチャージでき、
そちら経由だとおまけでブタメダルが30枚/100円もらえます。
今まで使うことがなかったWiiUゲームパッドの
NFCリーダー/ライターの動作チェックがようやくできました。
なお、支払ったときsuicaの残高も表示されますが、
できれば残高を確認できる単機能のアプリケーションをWiiUにリリースしてほしいですね。
今はPCにカードリーダーPaSoRiをつないで残高確認しており、
この面倒がなくなるのは歓迎です。

予定外だったのが、この[ブタメダル]なるゲームが結構面白いこと。
内容は大昔のゲームセンターで見たことがあるような
メダルをはじいて穴に落とす単純なもので、
なんとなくやめ時がなくてずるずるメダルを消費してしまいます。
suicaの残高が心もとないので全面クリアは無理そうですが、
これがおまけのメダルでなく現金同等物のニンテンドーポイントを
消費しながら遊ぶようになるといろいろと問題がありそうなので。

ところで今回suicaポイントなる制度があるのを初めて知りました。
よくあるポイントサービスで、一瞬登録しようかなと思ったのですがやめました。
確かに羽田から都内を移動するだけでも気がつけば結構な金額を使っているのですが、
最近そっち方面はご無沙汰で、ここ数年でsuica使ったの5000円に満たないので。
JR東日本圏内でなくても、関西等でsuicaは使えますしチャージもできますが、
生活圏内で使えないとポイントは貯まらないですからね。
その少ないポイントと引き換えに個人情報を渡すのには抵抗があります。

2014年7月30日水曜日

syslogでカーネルログが見える訳

Linuxを運用していてお世話になるのが動作ログが取れるsyslogです。
一般的にはsyslogdが用いられますが、
実は互換性を持ったパッケージはいろいろあり、
Gentoo Linuxではシステムのインストール時に好きなのを入れます。
私は昔metalogを使ってましたね。

さて、ログをとってもらうには各アプリケーションが
syslog()関数(Cの場合)を呼び出すわけで、
プロセス間通信を担っているのが"/dev/log"です。

ところでkernelのログはどうやってsyslogが受け取っているのか疑問が浮かびます。
実はカーネルではklogdスレッドが動いていて、
カーネル内の各部からはこのklogdにログを残すよう依頼します。
klogdは__LOG_BUF_LENで定義されるサイズのリングバッファを持っていて
これに依頼されたログを格納しておきます。

klogdでは"/proc/kmsg"を外部インターフェイスとして持っていて、
この仮想ファイルからリードすることでカーネルログがユーザ空間に読み出せ、
読み出しているのがsyslogdというわけです。
つまり、syslogdがカーネルログを読み出す頻度と
バッファサイズのバランスが取れていないと、
バッファからあふれてしまったログは消えてなくなります。
なお__LOG_BUF_LENの増量は
カーネルコンフィグレーションCONFIG_LOG_BUF_SHIFTの調整で可能です。
詳しく知りたければ"kernel/printk.c"あたりを見るのがいいでしょう。

2014年7月29日火曜日

JavaScriptとcanvas

HTML5にはcanvasというコンポーネントが導入されています。
textareaがテキストターミナルなら
canvasはグラフィック仮想スクリーンですね。
ネイティブのWindowsでいうならPictureBoxに該当します。
しかも最近はGPUアクセラレーションして高速描画が実現し、
ゲームだってちゃんと遊べるぐらいになっています。

canvasの使い方はそう難しくなく、
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
var c1;
window.onload=function(){
 c1=document.getElementById("c1").getContext('2d');
};
</script>
</head>
<body>
<canvas id="c1" width="320" height="240" style="background-color:white;" />
</body>
のようなHTMLファイルを作れば動きます。

canvasに白い四角を書きたければ以下を実行します。
 c1.beginPath();
 c1.fillStyle="#ffffff";
 c1.fillRect(100,100,20,20);

canvasに表示されている画像は
 var img=c1.getImageData(0,0,100,100);
のようにバッファにコピーでき、
 c1.putImageData(img,0,100);
で、それをcanvasにまたコピーできるので、
うまく使えば背景上のキャラクターをスプライトのように移動できますし、
座標をうまくすればスクロールも可能です。

2014年7月28日月曜日

Twilioで着呼

先日Twilioから発呼したので、 今回はTwilioで着呼したときの処理を書いてみます。

例えば"http://<サーバのFQDN>/cgi-bin/recv.py"にあたるファイルの
スクリプトの内容が以下のようになるようにします。
なお1行目のpythonへのフルパスは環境に合わせて変更してください。
#!/usr/local/bin/python
# coding:utf-8
import cgi

form = cgi.FieldStorage()
if form.has_key("Digits"):
 d=1
 digits=form["Digits"].value
else:
 d=0

print "Content-Type: text/xml; charset=utf-8\n"
print '<?xml version="1.0" encoding="UTF-8"?>'
print "<Response>"
if d==0:
 print '<Gather timeout="10" numDigits="1">'
 print '<Say language="ja-jp" voice="woman">営業課につなぎます。課の番号1から3を押してください。</Say>'
 print '</Gather>'
else:
 if digits=="1":
  print '<Say language="ja-jp" voice="woman">営業1課につなぎます。</Say>'
 elif digits=="2":
  print '<Say language="ja-jp" voice="woman">営業2課につなぎます。</Say>'
        elif digits=="3":
  print '<Say language="ja-jp" voice="woman">営業3課につなぎます。</Say>'
        else:
  print '<Gather timeout="10" numDigits="1">'
  print '<Say language="ja-jp" voice="woman">営業課につなぎます。課の番号1から3を押してください。</Say>'
  print '</Gather>'
print "</Response>"

次いでTwilioにログインし、
メニューの[電話番号]から着信時の動作を設定したい電話番号をクリックし、
その[音声通話]の[Request URL]に
"http://<サーバのFQDN>/cgi-bin/recv.py"を設定して[保存]をクリックします。

実際に電話をかけてみるとメッセージが流れ、
押すダイヤルボタンによって処理が分岐されるのが体験できます。
これを応用して呼び出すスクリプトファイルを変えたり、XMLファイルを適宜生成することで
複雑な処理をさせることができます。
このXMLはTwiMLと呼ばれているらしく、
リファレンスを見ながら試行錯誤すればいろいろできそうです。
通話料の無駄ですが、電話によるミュージックストリーミングだって可能です。

ところで前述の[Request URL]のデフォルト値は
http://twimlets.com/echo?Twiml=%3CResponse%3E%3CSay+language%3D%22ja-jp%22+voice%3D%22woman%22%3E%E3%82%82%E3%81%97%E3%82%82%E3%81%97%E3%81%AA%E3%82%93%E3%81%A8%E3%81%8B%E3%81%95%E3%82%93%E3%81%A7%E3%81%99%E3%81%8B%E3%80%82%3C%2FSay%3E%3C%2FResponse%3E
のようになっています。
つまり、外部ウェブサーバを持っていなくても
http://twimlets.com/echo?Twiml=<XML文字列>
としておけば固定動作はさせられます。
自分のウェブサーバの負担軽減のために飛ばし先として使うのもありですね。

2014年7月24日木曜日

Nexus7等のための周辺機器をisaiで使ってみる

以前Nexus7(2013)のために周辺機器をいくつか買いましたが、
予想通り大して使っていません。
このままではもったいないのでisaiで使いまわせることを確認してみました。

USBホスト変換アダプタはしっかり使えます。
その辺にあったキーボードマウス、それにゲームパッドについては動作確認できました。
SDカードリーダー/ライターも使えるには使えるのですが、
本体に直接挿すと供給電力の問題があるので、
ACアダプタで電力供給できるタイプのUSBハブを挟む必要があったりします。
他には有線LANアダプタやらRS-232CアダプタやらVGAアダプタやら
手元にあるものを適当に挿してみましたがどれも無反応でした。

SlimPort-HDMIアダプタで本体LCDの表示をHDMI入力の付いたテレビにミラーリングできます。
端末横向きだと全画面表示になりますが、普通のテレビだと上下左右が少しずつ切れてます。
縦だと画面中央に縦をいっぱいに使って表示されます。
テレビの左右に広大な未使用黒領域が広がります。
このあたりはNexus7(2013)と同様です。

ポケモンタイピングDSについてきたBluetoothキーボードは
記号入力がキートップと異なります。
このキーボードはJIS配列でNexus7(2013)では正常動作していたのに。
逆にiPhone用の特殊仕様なTK-FBP047EBKだと
記号がキートップ通りに入力できます。なんで?

bluetoothヘッドセットBT-A1SSも使えます。
FUSION IP-Phone SMARTの純正アプリケーションで通話に利用できます。
このアプリケーションでは通話開始後に[スピーカー]アイコンをタップすると、
[音声出力方法の選択]なるダイアログが現れて、
"標準出力","スピーカー","Bluetooth"から切り替えられるようになっています。
Bluetoothヘッドセットが接続されている状態ではデフォルトで"Bluetooth"になるようです。

おまけでQi充電器です。
そもそもisaiはワイヤレス給電規格Qiに対応してはいませんが、
その兄弟機であるNexus5は対応しているので、
じつはisaiもこっそり対応してたりして、
などとよくわからない妄想を抱きつつ充電台に載せてみましたが…やっぱり無反応です。
本当は防水なisaiこそQi対応すべきなんですが、
防水にすることで何か対応できない事情があったのかもしれません。

最後になりますが、100円ショップで買った超強力な磁石を
isaiにを近づけてもNexus7のようにスリープにはなりませんでした。

2014年7月23日水曜日

ディスクキャッシュ

コンピュータシステムのメモリ構成は大昔から階層化されていて、
高速で小さく高価なメモリを助けるように、
より遅くてより大きくより安いメモリが配置されていました。
最近ではCPU内部に1次キャッシュ、2次キャッシュ、3次キャッシュ、
内部メモリ(SRAM/DRAM)があって、
CPU外にDRAM、NAND Flash ROM、HDD(swap領域)なんて
すごい構成のシステムもあったりします。

そのメモリの階層構造とちょっと違うラインにあるのがディスクキャッシュです。
HDD上にあるファイルの内容を直接操作するより、
データをメモリに持ってきておいてそっちで操作した方が
高速にアクセスできるというアイディアです。
ただしメモリ上でいじくったデータは最終的にHDDに書き戻す必要があり、
このライトバックのタイミングこそが高速化の肝となります。
なるべく暇なときにやれば節約になりますから。

さてLinuxのディスクキャッシュではpdflushスレッドがライトバックを担当しますが、
そのタイミングを外部から調整することができます。
"/proc/sys/vm/dirty_background_ratio"では
バックグランドでライトバック処理を開始する条件
(物理メモリに占めるライトバック対象データの割合)を指定できます。
"/proc/sys/vm/dirty_ratio"では
フォアグランドでライトバック処理を開始する条件を指定できます。
"/proc/sys/vm/dirty_writeback_centisecs"(×10ms)は
pdflushスレッド起動間隔で、この周期でライトバック開始判定しているようです。
"/proc/sys/vm/dirty_expire_centisecs"(×10ms)は
強制的にライトバックを発動する周期のようです。
もしかしたら私の認識違いがあるかもしれませんが、そこはご容赦を。

ところで、長く続いてきたこのメモリ構成が
今後数年のうちに劇的に変わっていく可能性があります。
近年NAND Flash ROMの大容量化によりHDDからSSDへの趨勢が見られますが、
ソフトウェアをそれぞれに最適化してそれぞれの長所を生かす試みも続いていますし、
DRAMの行き詰まりも近いことから、
ソフトウェア的部分も含めDRAMの使い方に変化が起きそうで、
さらにはその代替メモリについても大々的に利用される時代が訪れそうな気配です。

まあコンピュータシステムの構成が大きく変わろうとも、
最後のところで付加価値を生み出すのはアプリケーションソフトウェアだったりしますから、
1ユーザとして興味があるのはgoogleの次の一手だったりするんですけど、
パーソナルコンピュータに黎明期から縁のある1エンジニアとしては
この手のことに今後も注目していきたいと思っています。

2014年7月22日火曜日

JavaScriptのタイマ

JavaScriptはイベントドリブン型のプログラム言語です。
Cのように固定的にmain()関数から順に実行されるということはなく、
コンテンツのロードイベントによって最初の関数が実行され、
その後はさまざまなイベントに応じていろいろな関数が呼ばれていきます。
こういうシステムがあることを Visual Basic 2.0 で初めて知ったときには衝撃を受け、
そこからオブジェクト指向とかそっちに突っ走った記憶があります。
ただし私自身はコンパイル後のマシンコードを想像しながらCで書くのが一番好きです。
抽象度が高い言語はやりたいことをさっさと実現する手段として便利なのですが、
BASIC→アセンブラ→Cな私はやっぱり低抽象度が好き。

ところでJavaScriptで最初の関数をC風にぐるぐる回して
イベントの発動と関係ない処理をやってしまうのはひとつの手なんですが、
通常はタイマーを使って一定間隔でイベントが発行されるようにします。
var t1;
window.onload=function(){
 t1=setInterval("t1event()",1000);
};
function t1event(){
 // run once per 1 sec.
}
などとすれば1秒ごとにt1event()が自動的に呼ばれます。
もしタイマーイベントを1回だけ起こしたいとき(ワンショット)は
setInterval()の代わりにsetTimeout()を実行します。
なお、タイマーを止めるには
clearInterval(t1);
を実行します。

ちなみにJavaScriptは基本的に1スレッドで実行されるようですが、
先のonloadイベントとt1event()は別コンテキストで動作するようです。
普通に使っている分には意識する必要はありません。
しかし低抽象度が好きな私はこういうの結構気になるんですよね。

2014年7月21日月曜日

Twilioで発呼

先日予告したように
ウェブアプリケーションからTwilioを使って自分の電話に向かって発呼してみます。

最初に"http://<サーバのFQDN>/mc1.xml"の内容が以下のようになるよう
ウェブサーバとコンテンツを調整します。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-jp" voice="woman">おはようございます</Say>
</Response>
また"http://<サーバのFQDN>/mc2.xml"の内容が以下のようになるようにします。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-jp" voice="woman">おやすみなさい</Say>
</Response>

次に"http://<サーバのFQDN>/cgi-bin/mc1.py"にあたるファイルの
スクリプトの内容が以下のようになるようにします。
なお1行目のpythonへのフルパスは環境に合わせて変更してください。
#!/usr/local/bin/python
# coding:utf-8
print "Content-Type: text/html; charset=utf-8\n\n"

from twilio.rest import TwilioRestClient

ACCOUNT_SID = "<ACCOUNT SID>"
AUTH_TOKEN = "<AUTH TOKEN>"

client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN)

call = client.calls.create(
        from_="<発呼元の電話番号>",
        to="<発呼先の電話番号>",
        url="http://<サーバのFQDN>/mc1.xml",
        method="GET",
        fallback_method="GET",
        status_callback_method="GET",
        record="false"
)

print "<html>"
print "<head>"
print "<title>make call</title>"
print "</head>"
print "<body>"
print "call sid is"
print call.sid
print "</body>"
print "</html>"
また"http://<サーバのFQDN>/cgi-bin/mc2.py"にあたるファイルの
スクリプトの内容は上記の"mc1.py"と同じにしますが、
            url="http://<サーバのFQDN>/mc1.xml",
の行だけは
            url="http://<サーバのFQDN>/mc2.xml",
に変更します。
参考にしたのはダッシュボードから見られるAPI EXPLORERのです。
ここで<ACCOUNT SID>と<AUTH TOKEN>は
Twilioのサイトにログインしたときにダッシュボードに表示されている文字列で、
洩れて悪用されると金銭的被害を受ける可能性があるので注意しましょう。
<AUTH TOKEN>については鍵アイコンを押したときにだけ表示されます。
"**************"ではありませんので。
<発呼元の電話番号>、<発呼先の電話番号>の形式は
国際電話をかけるときのものにせなばならず、
日本の電話番号なら"+81"に続けて市外局番から指定します。
ただし、市外局番の最初の"0"は省く必要があります。
携帯電話(090/080/070)やIP電話(050)の電話番号についても
最初の"0"を除いて書く必要があります。
ちなみに<発呼元の電話番号>はTwilioからもらった電話番号になります。

それからサーバのセキュリティに関しては気を使いましょう。
上記は単なるテストのための一時的なコンテンツなのでその辺り無頓着ですが、
ファイルのパーミッションを適切にしたり、httpsで通信経路を暗号化したり、
誰かに勝手に発信されて課金されないようにウェブページに認証をかけたりすべきでしょう。

さて、前置きが長かったですがとにかく発呼してみます。
適当なウェブブラウザ(PCでもスマートフォンでもなんでも)から
"http://<サーバのFQDN>/cgi-bin/mc1.py"にアクセスすると、
<発呼先の電話番号>で指定した電話に着信が起こります。
通話状態にするとトモダチコレクションっぽい声で"おはようございます"と聞こえます。
同様に"http://<サーバのFQDN>/cgi-bin/mc2.py"にアクセスすると、
"おやすみなさい"と聞こえます。
これらの言葉は先に作成したXMLファイルに指定したものです。

つまり、Pythonのスクリプトをいろいろ変えるのはもちろん、呼ぶタイミングを変えたり、
XMLファイルを動的に生成することでいろいろと便利なサービスが実現できます。
必要なのは自由に使えるインターネット上のウェブサーバとその上で動くアプリケーション、
それにTwilioへ支払う料金だけです。
上記を単純に応用すればモーニングコールや
カレンダーに連動したイベント通知なんかに利用できそうです。
料金が基本従量制で携帯電話宛の音声発信は結構高いので、
個人用途で高頻度に使う気は起きませんが、
こんなに簡単に電話関係のサービスが使えるのはとってもうれしいですね。

今後Twilioをヘビーに使うかどうかはわかりませんが、
トライアルの無料期間中にいろいろ遊んでみたいと思います。

2014年7月17日木曜日

isaiをしばらく使ってみて

auのisai LGL22使い始めてから1ヶ月ほど経ちましたので、
感想など書いてみることにします。

外観はやはりでかすぎです。
厚さ以外はNintendo3DSと同じってかなりのものです。
持ち運びは楽ではありません。やっぱりP-01Dぐらいの小ささが私好みです。
まあLCDが大きいので見やすく、使いやすいのは確かで、
通常時Nexus7を持ち歩く必要もなくなりそうですが、
電子書籍を快適に読むにはNexus7ぐらいの大きさはほしいですね。
結論を言えば、複数持ちを厭わない私のような人間にはisaiは大きさが中途半端です。
TPOで持ち替えるにしてもSIMカードの入ったスマートフォンは基本セットにせざるを得ず、
ランニングコスト低減を優先すればなおさらです。

ソフトウェアはそもそも第一印象がそうだったのですが、
設定アプリケーションが独自で非常に使いにくい。
よく使う項目についてはだいぶ慣れてはきましたが、
正直ここはカスタマイズしてほしくないです。
同じくランチャーについても使いやすいとは思えません。
アプリケーション一覧画面でどこに何があるか分かりにくくて。
やっぱり素のAndroidのままにしてほしいです。

バッテリーのもちについては、予想通りというか、期待はずれというか、
無線LAN/Bluetoothオフでほぼ使用しない状況で
フル充電から空になるまでほぼ丸2日はがんばってくれます。
無線LANはオンでほぼ常にアクセスポイントにつながりっぱなしで、
ほぼ使用しない状況でだと1日はもつものの1日半には届きません。
ただ普通に使うとバッテリーが半日持たないので話になりません。
総合すると毎日充電は当然のこととして、充電できる環境にいるときは充電し、
充電できない環境に長時間いるのならモバイルバッテリーを持ち歩く、
という運用にせざるを得ないようです。
私のように普通の携帯電話との2台持ちなら
スマートフォンを使わないときは電源を切っておくという運用がいいでしょう。
電源のオン/オフはNexus7(2013)より遅いような気がしますが、
P-01Dに比べれば激早です。
あとは使っていると本体が熱を持つのが気になりますし、充電中もかなりあったかいです。
これはいたしかたないでしょう。

isaiを持って大都市を移動(電車、徒歩)する機会があり、
そのときWi-FiをONにしていると特に断りもなく
SSIDが"Wi2premium"や"au_Wi-Fi2"なアクセスポイントにつながって利用できました。
都会は便利ですね。私の住む地方都市ではWi-Fiなど何も期待できません。
それから高速バスに乗りながら山奥の高速道路走行時の電波状況を見る機会もあったのですが、
"LTE"の他に"3G"や"1X"と表示されていることが多々ありました。
auのMVNOであるmineoがLTEでしかデータ通信できないというのはこういうのを見ると不安になります。

isaiには思っても見なかったボーナスがあります。
KitKatことAndroid 4.4へのアップデートが決まっています
そして昨日アップデートが着ました。
よもやアップデートしてくれるとはまったく期待してなかったのですが素直にうれしいです。
過去日本メーカーのAndroidでアップデートがなかった寂しい経験もしておりますが、
スマートフォンはやっぱりグローバルメーカーに限りますね。

私の使っている範囲ではAndroid 4.2でも特に不都合もないのですが、
せっかく作ってくれたので4.4にアップデートです。
通知バーで確認すると"V20c-JUL-01-2014(691.32MB)"と記述があり、
ファイルが巨大なのでWi-Fi経由でダウンロードし、インストールしました。
各種バージョンは下表のように変わりました。
 アップデート前アップデート後
Androidバージョン4.2.24.4.2
ベースバンドバージョン M8974A-AAAANAZM-1.0.190061 M8974A-AAAANAZM-1.0.190099
カーネルバージョン3.4.03.4.0
ビルド番号JDQ39BKOT49I.LGL2220c
ソフトウェアバージョンLGL2210bLGL2220c
4.4は軽くなっているとは言われますが、
そもそも重い使い方はしていないので私には体感できていません。
ロック解除にノックコードが加わったのも私には響きません。
そのほか4.2と4.4の違いで実感できたのは、
ステータスバーのアイコンがすべて白くなったことぐらいでしょうか。前はカラフルだったんですけどね。
ところで4.4になって初めてロック画面の立ち上がったとき
isaiがびっしょり濡れてしまっていてかなりあせりました。
まあ単に壁紙が水滴の滴るライブ壁紙になっているだけなのですが。
isaiが防水であることをアピールしたいのは分かるものの、
何度見てもドキッとしてちょっと心臓に悪いです。

2014年7月16日水曜日

Linux kernel内で起動からの時間を知る

Linuxで起動してからの時間を知りたいとき迷わず
$ uptime
を実行するのですが、
カーネル内部で知りたいときはどうするのでしょうか?

シェルスクリプトならuptimeコマンドの結果を加工すればいいですし、
プログラムからなら"/proc/uptime"から読み出すことができますが、
カーネルからだと
struct timespec uptime;
do_posix_clock_monotonic_gettime(&uptime);
monotonic_to_bootbased(&uptime);
printk("uptime=%lu\n",(unsigned long)uptime.tv_sec);
とすればいいんですね。
いやまあ、カーネルの"fs/proc/uptime.c"のuptime_read_proc()から切り取っただけですが。

2014年7月15日火曜日

JavaScriptの配列と関数ポインタ

Javaの配列はCの配列に近いのですが、
JavaScriptの配列PHPやPythonのような感じで連装配列も使えたりします。
基本的には配列aを
var a=new Array(3);
のように宣言し、
a[0]=1;
a[1]=a[0]+1;
a[2]=a[1]+1;
のように各要素にアクセスできます。
なお宣言時に
var a=[0,1,2];
のように各要素を初期化することも可能です。

配列には関数も代入でき、
var a=[b0,b1,b2];
function b0(){}
function b1(){}
function b2(){}
と定義しておけば
var i=1;
b[i]();
のようにb1()を間接的に呼び出せます。Cで言うところの関数ポインタですね。
これを利用すればJavaScriptでもswitch~caseを使わずに状態遷移表を実装できます。

2014年7月14日月曜日

Twilioとpython

先日加入したTwilioで遊ぶには自由に使えるウェブサーバを持っていて、
そこでいろいろスクリプトを書くのがいいみたいです。
ウェブサーバはインターネット上のTwilioのサーバから
アクセスできるようになってないとだめです。
すでに契約しているVPSがあるのでそっちはいいとして、
スクリプト言語は選択肢がいくつかあって迷います。
もっとも慣れ親しんでいるのはPHPだったりするのですが、
この際今まで実用的な使い方をしたことがないpythonを利用することにしました。

pythonから使うためのドキュメントを参考にしながらServersman@VPS(debian32)で使えるようにセットアップします。
なお入っているpythonが2.5.2とかなり古く、
さらにpipが2.7以上を要求するのでpython自体をバージョンアップすることにしました。
事情があってapt-getできないので以下を実行してソースからビルドします。
# cd /usr/local/src
# wget --no-check-certificate https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
# tar zxf Python-2.7.6.tgz
# cd Python-2.7.6
# ./configure
# make
# make install
続いて以下を実行してpipをインストールします。
# curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
今度はpipを使ってtwilioのライブラリをインストールします。以下を実行します。
# pip install twilio
これで使えるはずです。
次回は動作チェックをかねてウェブアプリケーションから自分の携帯電話に発呼してみます。

2014年7月10日木曜日

auのテザリング

auのスマートフォンではテザリングができます。
が、しかし[設定]アプリケーションからテザリングしようとすると
テザリングのご利用にはオプション
加入が必要です。ご加入済みの方
は「OK」を押してください。未加
入の方はauお客様サポートよりお
申し込みください。
と注意されます。
そのままONにしようとしても、すぐに自動でOFFに戻ってしまいます。

auショップに行くついでがあったので店員さんに訊いてみると、
テザリングオプションが契約されていないとのことでした。オプションなのね…
オプション費用は月額500円ですが2年間は無料ということで即契約です。
契約後、わりとすぐにテザリングしてみると見事にできました。
私の場合はそのままでいけましたが、
できないときはスマートフォンの電源を入れなおせばいいそうです。

2014年7月9日水曜日

Linux kernel内のリブートの取り扱い

Linux kernel内のリブートの取り扱いについて、
そもそもカーネル内部でリブートを発動するのは
void machine_restart(char * __unused)
で、"arch/*/kernel/"のどこかのファイルにあります。
x86なら"arch/x86/kernel/reboot.c"ですし、
ARMなら"arch/arm/kernel/process.c"となります。
とりあえずカーネルの適当な場所でmachine_restart()を呼べば、
基本的にはリブートされることになるはずです。

ARMでいくと、machine_restart()から最終的に
void arch_reset(char mode)
が呼び出されてリブートするのですが、
このarch_reset()は"arch/arm/mach-*/"のどこかのファイルに実装されています。
引数modeによる動作の違いはarch_reset()の実装しだいということにはなりますが、
通常は'h'になっていて、ハードウェアリセットに流すような処理になっていることが多いようです。
多くはwatchdogリセットに流すような感じでしょうか。
チップ(ボード)毎に最適な方法をとることになります。

2014年7月8日火曜日

HTML5でテトリス

セガのアーケード版を初めて見たときの衝撃は今後も忘れることはないだろうテトリス。
そんなテトリスをHTML5で作ってみようと思い立ちました。
JavaScriptやcanvasをゲーム作成を通して学習するのがその趣旨です。
これからのアプリケーションプラットフォームはHTML5だとかこのあたりで叫びつつも、
実はあまり有用に使ったことがなかったのですが、ちゃんと実行もしておこうかと。

ところでテトリスを作るのはこれが2度目です。
大昔にMSX BASIC(インタープリタ)で作ったことがあるのですが、
Z80 3.58MHzは非力で、遅くてゲームになりませんでした。
これをきっかけにZ80アセンブラを学び、現在へと連綿と続いてきたことを考えると、
その体験は私のエンジニアとしての原点だったのかもしれません。
ハンドアセンブラしていたので今でもRETが0xC9なのは覚えていますね。
そういえばハンドアセンブラが辛くなったので、
BASICでアセンブラ、ディスアセンブラを自作したりもしました。
そのときついでにマシンコードを体系的に理解することができ、
論理回路的にどうすればCPUが作れるのかも想像できるようになって、
当時は効率的なCPUのアーキテクチャについても考えたりしていました。
今思い返せば、発想がRISCにかなり近かったような。
さすが俺様。センスがあります。

まあ冗談はおいといて、いろいろとググりながら3日ほど(実働10時間ぐらい)で
一応ゲームとして遊べるものができました。
ファイルサイズは21127バイト、1504行のHTMLファイルです。
まあ細かく検証してないのでバグはあるかもしれません。
物理キー(方向キーとスペースキー/Enterキー)を使うので
スマートフォンやタブレットでは無理ですが、
Windows+Chromeブラウザ、Mac+Chromeブラウザでしっかり遊べますし、
ウェブサーバにファイルを置けばNintendo3DSWiiUでも遊べます。
いい世の中になりました。

ところで今回の成果物は版権等も考えると公開はできませんのであしからず。

2014年7月7日月曜日

Twilio

その昔、電話で高度で複雑なことをやろうすると、
PBXを含んだ高価なソリューションをうまいこと設定する必要がありました。
その後はサーバ+PSTN抜け装置+IP電話機(or PC+IP電話ソフト)を組み合わせて
いろいろプログラミングできるようなソリューションが登場し、
サーバをクラウド側で持つ(セントレックス型)ようなサービスも出てきたりもしました。
Twilioはそれをさらにインターネットに溶かし込んだようなサービスと私は認識しています。

登場当初からTwilioに若干興味はあったものの、
個人で利用するにはあんまり面白い使い道が思い浮かばなかったのと、
料金がそんなに安くなかったので加入することはなかったのですが、
先ごろの価格改定でお手ごろになったので利用してみようと思い立ち、
まずは無料サインアップしてみました。
なお電話番号をもらうためには携帯電話にSMSで認証用コードを送ってもらう必要があります。
"+81"の後に自分の携帯電話の番号の最初の"0"を抜いたものを入力しましょう。
私はauの番号を入れて成功しました。
その後この携帯電話番号は無料のトライアルアカウントでの唯一の通話相手テスト通話に利用されます。
テスト通話が終了するとダッシュボードにログインできるようになり、ここからいろいろできます。

なおダッシュボードの[使用状況]を見ると、
無料トライアル中でも料金がしっかり発生しているように見えビビりますが、
FAQに請求されない旨が書かれています。
ここの請求額が閾値(非公開)を超えるまではタダで試せるのでいろいろ遊んでみましょう。

遊ぶに当たって、Twilioではじめるクラウド電話開発
Androidアプリちょい足し開発レシピ(2)(3)あたりは一読をお勧めします。
あとはリファレンスを地味に見ていくぐらいでしょうか。

2014年7月3日木曜日

Android 'L'

先日Nexus7に4.4.4がきたけど5.0と思われる'L'は来ないなあみたいなことを書きましたが、
実は私のNexus7(2013/WiFiモデル)には'L'が来てました。
正確にはプレビューサイトからダウンロードして書き込めるということですが、
さすがにメインで使っている機器にプレビューとか入れたくはないので、
正式にアップデートが来るまで素直に待つことにします。

さて、先のGoogle I/O 2014で次期Andoridの'L'についていろいろ明らかになっていますが、
いよいよ来るべきときが来たのではないかと危惧しています。
というのも、発表されている事柄から想像を膨らませると、
未来にはもはや自由はないのではないかと思えるからです。
AndroidがWindowsのようになるのではないかと。

Googleとしては各デバイスメーカーが勝手にカスタマイズすることを
もはやよしとはしていない節があります。
そして各デバイスメーカーのアップデート(セキュリティパッチ含む)提供の
しなさにも業を煮やしているように見えます。
もしかすると'L'からはGoogleがOSとしてのAndroidをバイナリ提供し、
端末メーカーはブートローダとデバイスドライバのカーネルモジュール、
それに独自アプリケーションをつくる以外に触りようがなくなるかもしれません。
このことはエンドユーザやアプリケーション開発者には歓迎すべきことかもしれませんが、
デバイスメーカーにとってはWindows PCのように、
もはや差別化するすべを失う危険をはらんでいます。
GoogleがNexusをやめるなんてうわさもありますが、
もし私の予想があっているなら、自らリファレンス機を出す必要はなくなり、
納得のいく話ではあります。
デバイスメーカーであるMotorolaを売り払ったことも考え合わせると、
Googleは純粋なAndroidの提供元になろうとしているのかもしれません。

そもそもAndroidが発表されたとき、
私としては組み込みLinuxに標準GUIを与えてくれる救世主になることを期待したのですが、
いろいろと明らかになるにつれ期待したのと方向が違うことに愕然としたものです。
スマートフォンもタブレットも、今や組み込み機器ではなくなっている現状では、
Googleが私が予想したのと同様に行動したとしてもかえって合理的なのですが、
私のような組み込み機器のエンジニアからすれば残念です。
心配が杞憂に終わることを願うばかりです。

2014年7月2日水曜日

楽天SIMカード解約

auにMNPして通信環境が変わるのを見越して、
利用中の楽天のSIMカードを解約しました。
月初めから15日までに解約を申し込むと月末に解約となります。
16日以降だと翌月末の解約となりますので決断はすばやくしましょう。
今回のケースでは、実際に通信できなくなったのは翌月1日の午後6時半頃でした。

さて、解約方法はここに少々書いてありますが、
楽天ブロードバンドカスタマーセンターに書かれている
[加入済みのお客様]の0080-600-0222に電話をかけ、
オペレータにお願いしなくてはなりません。
いまどきめんどくさすぎます。

で、使い終わったSIMカードは普通郵便で送り返す必要があります。
これはIIJmioとかと同じですね。
なお私が電話で教えてもらった宛先は
〒102-0074
東京都千代田区九段南2-3-1
青葉第1ビル6F
フュージョン・コミュニケーションズ(株)
楽天ブロードバンドLTE解約受付係
でしたが、もしかすると変わるかもしれないので参考程度に。

2014年7月1日火曜日

au IDの複数所有

先日からauの複数台持ちをしていますが、
auショップでスマートフォンを契約したときに
スマートフォンの初期設定の一環としてau IDを登録させられました。
そのau IDのポイントを確認するとすでに結構たまっていて、
メインの携帯電話のau IDと合算にできないかなと
改めてauショップに行って訊いてみました。

いろいろ訊いて、auの回線1つにつき1つのau IDが割り当てられ、
複数のau IDを1つにまとめてポイントも1つにまとめることはできるものの、
一旦合算してしまうともう分割できないことを教えてもらいました。
そして提案されたのが、それぞれのau IDで別にau Walletカードを作り、
まったく別にポイントを使っていくことです。
au Walletカードを複数持ち歩くのは邪魔ですが、
幸いにも6月末までの1000円プレゼントキャンペーンが適用されてお得ということです。
au Walletカードはプリペイド型で審査もないということもあり、
同じ名義で複数枚作ってかまわないようです。
じぶん銀行からの初回チャージで+15%キャンペーンが使えるようなのでさらにお得です。