gitは使いこなせないので,svnに戻る.Google Codeも使い始めた.ちょっと重いかも.
Android2.2 + b-mobileでアンテナがちゃんと出ないのはSense UIの問題っぽいな.DeFroSTとかのROMだとちゃんとアンテナ出る.ホーム画面だけSence UIのランチャーにできないかな….
デスクトップ(?)を出しているのは,com.htc.launcherというプロセスで,実体は/system/bin/app_processっぽい.上の通知領域とかはもっと上のプロセスが出しているみたい.
*C++とJavaと
C++で書いたプログラムをJavaでも実装してたのですが,なんだかC++で書いたものとだいぶ違うものになってきてしまったので,C++のほうもJava版と同じように書き直す.C++で書いたサーバとJavaのクライアントで通信させるために,データ構造とかは同じにしたほう都合が良いので.
面倒なので,とりあえずjavaのメソッドをコピー&ペーストして少し修正.そしたら,案の定,かなり遅くなってしまった.最初に書いたやつと比べて5倍くらい遅い….
アルゴリズムは殆ど変わってないのだけど,一時的なオブジェクトを作りすぎなのが問題だよなぁ.スタック上にオブジェクトを置けないのと,オブジェクトの実体を配列上に確保せずにバラバラにnewしてるのが効いてるな.
C++とJavaの実行速度が変わらないというのも分かる気がする.JavaもJITがあるので,同じプログラムならコンパイラの最適化の勝負です.問題は,コンパイラにできない類の最適化をプログラマがどうにか解決するための機能がJavaに無いことだと思います.速度を意識してC++で書いたコードはそもそも同じものをJavaで書けない….
*いまどきのPHP
JavaとPHPは部分配列取得できないので酷すぎると思ってましたが,良く考えたらPHPは配列を自分で実装可能なので部分配列も作れました.
フィボナッチ数列を表す配列
ArrayAccessをimplementsすることで配列を作れます.実際にデータを格納しておく必要は無いので,無限長のデータも手軽に表現出来ますし,結構便利なので積極的に使いましょう.
class MyArray implements ArrayAccess{
public function __construct() {
}
public function offsetSet($offset, $value) {
}
public function offsetExists($offset) {
return true;
}
public function offsetUnset($offset) {
}
public function offsetGet($offset) {
return self::fib($offset);
}
private static function fib($n) {
if ($n<=0) return 0;
if ($n==1) return 1;
return self::fib($n-1) + self::fib($n-2);
}
}
$a = new MyArray();
echo $a[16];
他にも,SPL(Standard PHP Library)を使うと,PHPプログラミングも少しはマシになるのですが,ライブラリ類がSPL使わないことを前提に書かれていることが多いし,サンプルもSPL使ったものが少ないのがとても残念です.ただ,SplFileObjectを見ても分かりますが,必要な関数がまとまっただけで,とても便利になるという類のものでは無いんだよなぁ.
雨.
今更FedExから請求書が.なんだ,やっぱり関税かかったのか.2000円払わないと.
目が覚めたら15時だったとかではない.ちゃんとした社会人なので.
Webサービスの脆弱性を探すのって良い気分転換になるなぁ.
*通話できるb-mobile?
b-mobileのサイト見たら,Talking SIMというのが新しくサービス始まるみたい.b-mobileで通話もできるようになるのか.月額3,960円で,定額データ通信と音声通話はいいなぁ.ただ,個人的には無料通話25分とかいらないのでもっと安くしてほしい.
先日,普通のb-mobile sim買ったばかりですが,もう少し早ければ….あと,NMPとかで今の番号を引き継いだり出来るんだろうか….
b-mobileは2年縛りとか分けのわからないプランがたくさんあったりしないので,契約が面倒じゃないのが良いですね.
昨日の夜,プログラム書いていて,気づいたら寝ていた.
洗濯した洗濯物を洗濯機に入れっぱなしだったことを思い出して5時とかに目が覚めて洗濯物干したりする.眠い….
*Haskell
なんか,最近新しい言語触って無いので,ghcを入れてhaskell触ってみた.Hello, world的な簡単な計算をするプログラムは書いたことがあるけど,実はモナドも型クラスも良く分かってなかったので,今回は多少真面目に触りたい.
モナドの前に,純粋仮想関数言語が副作用をどう扱っているのかも気になったので,wikipediaを見たら,「コンピュータの現在の状態から次の状態を返す関数」なんていう恐ろしい記述があったのだけど,Haskellでは「>>=」を使って状態の中身を式の外に漏らすことなく,副作用を言語の外に追い出している…という理解でいいのかな?
関数型言語にはそんなに興味が無いのだけど,言語としては結構良いなぁ.色々なものが綺麗に書けるというのは良い.
ただ,BASICとかからプログラミングを始めたせいか,画面に何かが表示されたり,ネットワークにパケットを送出したり,時間が経過したりするという副作用こそがプログラミングの主体であって,それ以外は楽にコーディングするための付加機能だという感覚から抜け出せません.
逆に副作用だけを記述できるプログラミング言語とか無いのかな….最終的に副作用が無い計算はコンパイラに消されることが保障されて,同じ結果を出力するプログラムは同じコードにコンパイルされなければいけないような言語です.print命令くらいしか無い言語にすれば簡単ですが,まともに使える言語にするためにはコンパイラがかなりがんばらないとだな.具体的には,円周率を計算してある桁数printするプログラムは,print "3.1415926535..."と書いた場合と完全に等価であるべき.さらに,どんなに酷いアルゴリズムで実装しても,高速なアルゴリズムで実装した場合と同じ時間で処理されることが保障される.高速なアルゴリズムをわざと遅くするか,酷いアルゴリズムを高度に最適化してくれるのかは,コンパイラ依存.
というわけで,もう少しHaskell触ってみよう.
adbの動作が微妙に不安定で困るなあ.
*[Android] 一通り遊んでみたのでゲームでも作ろう
豆腐(?)に穴を開けて遊ぶゲームを作ってます.
なぜか,GPSとか必要.
次はマップとかをサーバからダウンロードできるようにしよう.
あと,都内にいないと難易度が高すぎて遊べないのをどうにかしないとなぁ.
そして,計算が遅すぎるので一部ネイティブに書き直すか….
32x32x32のボクセルをポリゴン化するために40,000頂点くらい座標を操作してるのですが,700msくらいかかる.少し重複した計算があったので,一時的なデータをHashMapにキャッシュするように改良.ただ,HashMap自体がそんなに速くないかも.あと,FloatBufferに細かいデータをたくさん書き込むのところで大半の時間が取られていたので,データ作るときは普通のfloat配列で済ますように.こっちの方が効果があった.それでも400msくらいにしかならない.Cとかでそれなりにチューニングすれば,一瞬で済むような処理なのでどうにかならないかなあ.
処理自体の感覚は長くもできるので,別スレッドで処理して,表示のほうはエフェクトとかで時間稼ぐか.
*DesireのディスプレイってAMOLEDじゃなかったっけ?
注文したときにAMOLEDとかいう文字を見た気が.偏光版が見当たらないので確かではないけど,私の目が確かならディスプレイが発する光が偏光されている.普通にハイディンガーのブラシが見える.
AMOLEDって原理上偏光版は不要なはずなのにどういうこと?有機ELとかってそんなに強い偏光があるんでしたっけ.
気になって調べたらTFT液晶を載せたDesireもあるらしい.えーそんな….
*[Android] Activityの状態遷移
ActivityでonResumeと対になるのはonPauseでした.普通に考えたらそうですよね….なので,onResumeでの処理はonPauseで後始末をしてあげないと二重に初期化してしまうかもです.
開始 → onCreate() → onStart() → onResume() → 実行中 → onPause() → onStop() → onDestroy() → 終了
の順番ですね.Pause状態から復帰するときはResumeに,Stop状態からStartするときはonRestartが呼ばれてからStartに来るようです.
*[Android] SensorManager.getRotationMatrix で得た回転行列の使い方
そのままOpenGLで使う場合と,getOrientation()でヨー,ピッチ,ロール角をそれぞれ求める方法があります.まずは,そのまま使ってみる.
getRotationMatrix で取得した回転行列はfloatの1次元配列に格納されます.常識的に考えれば行列型であるべきですが,Javaで行列型を作ってもまったく便利でないばかりか,面倒が増える上に負荷が増えるだけなのは目に見えているので単純なfloat配列なのは合理的な判断なんでしょう.
SDKを見ると,
M[ 0] M[ 1] M[ 2] M[ 3]
M[ 4] M[ 5] M[ 6] M[ 7]
M[ 8] M[ 9] M[10] M[11]
M[12] M[13] M[14] M[15]
という形で入る用です.OpenGLの行列を直に扱ったことのある人はこれ見ると,行と列を入れ替えないといけないのか…と少しがっかりしてしまいますが,そんなことはちゃんと考えられているようで,SDKに直接OpenGLで使って大丈夫だよと書いてあります.
行と列が入れ替わってしまっているのでOpenGLには転置行列として扱われます.良く考えれば,そもそもMは単なる回転行列なので,転置すると逆行列になります.そして,デバイスの回転の逆行列ということはOpenGLでそのまま使った場合物体を本来見える位置に移動するのに使えます.
そのとおりなんだけど…ちゃんと分かってないと危ないんじゃないかな.
さらに,なんでglMultMatrixfにoffsetあるの?と思ったけど,javaって複製せずに部分配列を渡す手段が無いのか.酷いな.
次に,getOrientationを使ってみます.
float[] inR = new float[16];
float[] outR = new float[16];
float[] I = new float[16];
float[] orientation = new float[3];
SensorManager.getRotationMatrix(inR, I, accel, magnet);
SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, orientation);
getRotationMatrixで取得した行列をremapCoordinateSystemで,画面の座標系に直します.このとき,画面上のXY軸を現実世界の座標にどう対応するか指定します.画面を横向きや逆さにしたりしている場合は,このままだと直感的でなくなるので,軸の向きを変えないといけません.
あとは,getOrientationで回転角が取得できます.
-
orientation[0] 方位(Z軸周り) 北向きが0
-
orientation[1] 仰角(X軸周り) 水平方向が0
-
orientation[2] ロール角(Y軸周り) 普通の状態が0
最初に使った行列もそうですが,空を向くベクトルがZ,方角の基準は北になっています.
*Java
PHPの次くらいに好きになれない言語です.偶然にも両方とも部分配列の参照を取れない言語だ.便利機能がたくさんあるのは嬉しいのだけど,根本的なものが言語設計から抜け落ちている気がする.PHPもJavaも用意されている機能から外れてしまうと途端に泥臭くなる.
あれ,そういえば今日って23日か….なぜか日付が感覚と1日ずれてる.
鰻を食べたかったのだけど食べれず.
眠い.
最近なんだか頭痛が続いている….夜になると痛くなるのはなんだろうなぁ.
*[Android] GPSで位置情報取得
GPSで位置情報を取得するのも簡単です.LocationManagerを取得して,LocationListenerを登録.
protected void onResume() {
LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);
}
センサーはregisterListenerでしたが,こちらはrequestLocationUpdatesです.上の例では1000ms間隔,もしくは1m以上移動すると通知してくれるように設定.ちなみに解除はremoveUpdatesです.統一しておいて欲しいけどこれくらいは我慢.
public void onLocationChanged(Location location) {
double lat = location.getLatitude();
double lon = location.getLongitude();
Toast.makeText(this, "la "+lat+"lo "+lon, Toast.LENGTH_LONG).show();
}
位置が更新されると,onLocationChangedにLocation が渡されるのであとは自由に.
protected void onPause()
{
super.onPause();
LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
locationManager.removeUpdates(this);
}
リスナーを登録したままだと,アプリケーションの画面を閉じてもGPSがONになったままなので,onStoponPause時に解除したほうが良いです.となると,必然的にonResumeで登録するのが良さそう.
GPS_PROVIDER以外にも,NETWORK_PROVIDERで基地局の位置が取れるので,GPSが使えない室内などでも大体の位置が分かります.
有効数字6桁以上の数値が外部から入力されることって他だとなかなかないですね.
Toastたくさん出しすぎるとなかなか消えないことに今気づいた.
*[Android] センサーとか
入力がタッチパネルだけなのは面白くないので,内蔵されているセンサーのうちいくつかを使ってみる.
どのセンサーも使い方は簡単で,SensorManagerで使いたいSensorを取得して,SensorEventListenerを実装したリスナーを登録すれば,値が更新されるたびにデータが飛んでくる.マニフェストファイルに何か追記しなければいけないのかと思ったけど,とりあえずそのままで使えました.
加速度と地磁気センサーから現在の姿勢を簡単に知る機能が用意されてないかと探したところ,TYPE_ORIENTATIONを見つけたのだけど,マニュアルには非推奨(deprecated)だと書かれているので,SensorManager.getRotationMatrixを使う.ただし,各センサーから自分で取ってきた値を入れてやらないといけないみたい.なんていうか,そのハードに搭載されているセンサーを自動的に組み合わせて可能な限り正確なデータを取得してくれる何かが欲しかったのだけど期待しすぎだったか.取得した行列はOpenGLでも使えるみたい.
些細なことだけど,ACCELEROMETERとGYROSCOPEだけ名前がセンサーを意味してるのが気になるな.他は,TEMPERATUREとかLIGHTとかMAGNETIC_FIELDのように計測対象を表す名前なのに….
とりあえず,加速度と地磁気から姿勢を得ることができました.
これだけでも色々作れそうですが,とりあえず次はGPSにしようかな.
2.2で開発してると,2.1でどれくらいの速度なのか心配になるな….
*JavaでOpenGLはかなり疲れる
Javaだと行列やベクトルがとても扱いにくい…
とりあえず,Octreeで表現したボクセルから必要な面を取り出した.で,ガタガタだと解像度低く感じるので適当に滑らかにした.前に似たようなの書いたときは,法線だけいじってごまかしたのですが,頂点を移動するのも計算量的にはほとんど同じなのでこっちの方がいいですね.ただ,あまり綺麗にかけなかった.
途中までマーチングキューブ法でやろうかと思ったのだけど,変な例外処理とかが入りそうでいやだったので,使いませんでした.
隙間はわざとあけてあります.
レンダリング自体は結構早いな.昨日試したときは,Javaのプログラムの方がネックだったみたい.ひとつの頂点配列に詰めてしまえば10万ポリゴンくらい表示しても大丈夫そうだった.
それでも不安なので,不要なところはボクセルを荒くするか….そのためには,解像度が違うボクセルモデルを滑らかに繋ぐ方法も考えないといけない.
???
内部で使っているFloatBufferに変な誤差(?)が入る原因不明のバグに悩まされた.しかも初回起動時は大丈夫で,アプリケーションを閉じたり開いたりしていると出てくる.
問題が起こっている関数は見つけたのだけど,引数に渡される値は同じなのに計算結果が違う….内部で参照しているのは,引数で渡された値と,スレッドが生成された後は書き換わるはずの無いデータだけ….その関数内にデバッグ用のコードを入れると,問題が再現しなくなるので,これ以上は分からない.
何が起こっているのかさっぱりわからないので,なんとなくsynchronizedにしたら問題が出なくなった.何か間違ってるんだろうか.気持ちが悪いなぁ.
なんだか,週末は体調が悪かったのだけど寝てたら良くなった…気がする.やたらと頭が重くて何も考える気にならなかったのだけど,もしかすると夏バテだったのかも.
*Androidの開発環境を整える&OpenGLを試す
SDKはダウンロードしてあったので,SDK Setup.exeでアップデートしたりする.あまり気が乗らないけど,Eclipseもインストール.
とりあえず,Hello, world的なものを試した後,OpenGLで遊ぶことにする.ただ,ネット上の多くのサンプルで使われている,android.graphics.OpenGLContext が最新のSDKでは消えてしまっている.EGLContext使えと書かれていたけど,かなり面倒くさい.
SDKに含まれるサンプルとかも見ていると,GLES20を使えば簡単にできることがわかるのだけど,これ使えるのAndroid2.2からなのか….まだ動作環境を2.2に限定するのはつらそうなので地道にがんばろう.
最低限動かせればいいやと探したら,kambayashiさんが公開してるサンプルがよさそうだったので参考に.
OpenGL ESだと3角形ポリゴンしか扱えないのか.GL_QUADSで描画するつもりで頂点配列作ってしまっていた.
Threadでループまわすとハングアップして何もできなくなったりするのだけど,そういうものなのかな.Thread.wait()で少し待ってやるといけるのでとりあえず気にしない.
なんとなくだけど,3万ポリゴンくらいまでは何とかなるかな….
せっかく,b-mobileでどこでもネットにつながるようになったのに,家か会社にいるので今のところまったく役に立っていない.あえてWiFiをOFFにしてどこかに繋いだときに,接続元がbmobile.ne.jpになっているのを見て喜ぶくらいです.
*DesireのAndroidを2.2Froyoにアップデートした
まだ書き途中….
rootになるのが思ったより面倒でした.実機なしで必要なSDのイメージ作ろうとすると面倒なので,素直にUSBで繋いで手順どおりにやったほうが楽かも.SDKが必要ですが.
ここが分かりやすいかな.http://www.potech.jp/pote/archives/2010/06/10-004010.php
xda-developers にROMのイメージが色々あるので,適当にダウンロードしてSDに入れる.update.zipとかにリネームして,rootedなイメージを書き込んだときと同じようにやってもsignatureが正しくないといわれてしまう.まぁ,rootが取れているのでどうにでもなるはず(というかそのためのroot)なので少し探してみると,ClockworkMod ROM Managerというツールを見つけたので,難なくFroyoにアップデート完了.
データをwipseするのをサボったら,ソフトウェアキーボードが使えなくなったりして焦ったので,説明に書かれているとおりに消したほうが良いみたい.
Nexus Oneは2.2にするとb-mobileでもアンテナ表示ができると聞いたんですが,Desireなぜかダメだった.別のROMだと大丈夫なのかなぁ.一応,Wirelessの設定画面ではConnectedになるので,確認は可能なのですが少し気になる.b-mobile用のアンテナ表示するアプリはあるようなので,
とりあえず,Hotspotの設定してテザリングできることは確認.
FlashPlayerが新しくなったのでニコニコ動画とかも再生できましたが,色々操作が難しくて実用的じゃないな.最初の再生開始はなんとかなるけど,その後はボタンが小さすぎる上に,押してもなかなか上手く反応しない.
というのが,今日見た夢です.
*Desire
AndroidのSDKをDLしてきたけど,まだ手付かず.
とりあえず日本語入力するために,OpenWnnをインストール.Wnnとか使うの何年ぶりだろう.
最初,「Starting downroad」と表示されたところから先に進まなくて,WiFiを疑ったのだけど,USBでPCからドライブをマウントしていたせいだった.カメラを起動したときにSDにアクセスできないというメッセージが出てたので,ふと気づいたのだけど分かりにくい….
WiFiだけなので,まだ家の中でしか使えない….会社も私のいる階はダメなんだよなぁ.
早くb-mobileのSIM買ってこよう.6ヶ月で14,900円か.
会社に着いたらこんなものが鞄の中に入っていた.家を出た時は入っていなかった気がするけど.
iモードメールも読むだけならドコモwebメールで可能っぽい.送信しようとすると,iモード.netの契約が必要か.一つのアプリで,ドコモwebメールで受信して,iモード.netで送信できるのは無いのかな.
あー,b-mobileのsimはヨドバシで買えば良かったな.ポイントがかなり溜まってるはずだったので失敗した.
*ケータイサイトで簡単ログイン+SSLって意味あるの?
もちろん,使わないよりは多少危険は減るのだけど.
ただ,所謂簡単ログインってSSL使うと使えなかったりするので,ユーザー認証時点ではSSLが使われてないサイトって結構ある気がする.
ケータイサイトは,そもそも経路上で通信内容が盗聴・改竄されないことを前提にセキュリティを保っている部分があるので,だとするとSSLの意味あるのかなあ.
*何か届いた
送料込みで,53,570円でした.関税は取られなかったみたい.http://www.expansys.jp/ で購入しました.
なんか,変換用のアダプタも一緒に袋に入っていた.USBから充電するつもりだったのですが勝手に入れてくれたようです.
microSDは4Gが最初から入っていたので,とりあえずこれで良さそう.とりあえず電池いれて起動.無線LANにも接続できました.タイムゾーンとかGoogleのアカウントとか聞かれたので,適当に入力.
SIMはどうするかなぁ.どうせ電話とかしない気がするので,b-mobileが有力.
という夢を見を見たので,会社に行こう.
早く目が覚めたのでプログラム書いたりしていたら,いつの間にか昼過ぎだった.とりあえず会社行く.
Androidアプリが作りたくなって,Desireを注文してたのですが,今日発送されたらしい.関税とかまで入れるとヤフオクより少し安いくらいかな.
スマートフォンまでSIMロックする日本のキャリアは早くどうにかならないのかな.思惑はどうあれ,総務省とdocomoはSIMロック解除しようとしてくれているので,応援しておきたい.
*irssi
adv_windowlist使ってみた.入っているチャンネルが多い時はirssi使って無かったのですが,これで大丈夫かな.
*DNS SEC
メモ.
結構普及してきたみたいなので,少し様子を見てみる.
手元のdigでsigchaseとかtopdownが使えないと思ったらコンパイルオプションにDDIG_SIGCHASEが必要なのか.
.govとかはさすがにRRSIGレコードちゃんとあるな.bizとorgもいけた.でも,.jpや.netはまだダメそうです.
dig +dnssec ns kstm.org. @b0.org.afilias-nst.org.
とかすると,TYPE50(NSEC3)のレコードが見えるので,kstm.orgがちゃんと存在することが確認できる.存在しないドメインを調べようとすると,辞書順で前後にあるドメインのNSEC3レコードを返してくれるので,そのドメインが存在しないことが確実に分かる.(NSEC3は名前をハッシュ化するので,前後のドメインが実際に何なのかまでは分からない).
RRSIGレコードを見ると,NSが署名されていないので,IPアドレスの正当性までは保障されない.
早くvalue domainとかが対応してくれないかな.
TLDのNSECはNSEC3では無いので,次のTLDの名前が分かる.なので,適当にたどってみると,初めて見るTLDが出てくる.
問い合わせるサーバを指定しないでTLDを辿ってみると,TLDで無いものがNSECに出てきたりする.あれ?と思ったが,よく考えてみれば当たり前だった.あるドメインのNSECは,そのドメイン内のゾーンファイルにも存在する.
たとえば,prのNSであるpr-dns.denic.de.とかに,prのNSECを尋ねると123.prだと言ってくる.
雨.
*Firefoxの再起動を繰り返す簡単なお仕事
FireMobileSimulatorを自分好みに改造するなどした.Firefoxのアドオンの開発の仕方が良く分からないので,ひたすらFirefoxを再起動を繰り返していた.誰かが前に開発の仕方を社内で発表してた気がするので,あとで調べよう.
*ルーズリーフ
学部時代に買った100枚入りのルーズリーフは,使っても減らない魔法がかかっているため6年近く使い続けても半分以上残っている.
まぁ,メモとかはその辺にある紙の裏とかに書いてすぐ捨ててしまうので,大学時代はノートとかほとんどとらなかった.稀にノートとるときも,PCでテキストファイルに書いてたし.
*何かiPadみたいなやつ欲しいな…iPad以外で
そういえば,1年前からiPadみたいなの欲しかったのだけど,結局まだ買ってないな.
厚さ1cmくらいで,A4サイズでXGA以上の解像度で,タッチパネルで,200ミリ秒以内に起動する,電子ノートが欲しい.
技術的には作れるだろうから,5万円くらいでどこか出してくれないかな
と書いていたけど,iPadを実際に見てみるとサイズ的にはB5で十分だな.iPadでほぼ条件を満たすのだけど,大きさの割に少し厚みがありすぎる.あとApple製品というのが最大の問題.
欲しいものはたくさんあるのだけど,実際に出てくると微妙な物が多くて困る.
*base64
base64用のヘッダファイルを発掘して自分で使うついでに,cppflに追加.何年も前に某所で書いたやつを少しいじっただけ.
#include <iostream>
#include <string>
#include "base64.h"
using namespace std;
int main()
{
std::string s = "ABCあああ" , s2,s3;
cout << "src: " << s << endl;
base64::encode(s2,s);
cout << "encode: " << s2 << endl;
base64::decode(s3,s2);
cout << "decode: " << s3 << endl;
return 0;
}
大きめのデータを扱うためにはストリームにも対応した方が良さげだな
マーチングキューブ法を調べ直す.穴が開くのを簡単に防げない?
暑い.雨.
そういえば,VC++のstd::vectorは1.5倍にサイズを拡張してた気がするな.
*Parallax Propellerマイコン
I/Oは全てのCogからいつでもアクセスできるようで,出力はORが取られるみたい.そのあたりのルールはマニュアルに書いてあった.ディレクションレジスタでCogごとに操作するピンを振り分けておくのが良いのかなあ.
Hubによってコントロールされてるのは,共通のメインメモリへのアクセス.2クロックごとにアクティブなCogが切り替えられるので,最大15クロック待たされることになる.さらにアクセスに7クロック必要なので最悪22クロック.パフォーマンスをフルに出そうと思うと考えて使わないとだめかも.
そして,使おうと思っていたSpinという言語は簡単なのだけど,これだけでやるのはちょっとつらいのでアセンブラで書かないといけないかも.本格的にいじるなら,Cコンパイラ買うか,簡易のコンパイラ書いて開発する方が良いかも.
とりあえず,SIMロックフリーのDesireをb-mobileで使うのが良いかなぁ.たぶん電話とかしないし.Droid Xも気になるなあ.
*Parallax Propellerマイコン
SafiiがParallaxのPropellerというマイコンを土産に買ってきてくれたので,まずは動かしてみる.マイコン単体しか無いけど,資料はネット上にあるようなので,なんとかなるはず.
-
32ビットCPU
-
8コア! (Cog)
-
12MHzクロック内部(外部クロックは80MHzまで)
-
RAM: 32KByte + 各Cogに512x32bits
-
32本のIO
今回のやつは40ピンのDIPです.
こういったマイコンにはめずらしく,ハーバードアーキテクチャではありません.プログラムは,ブートローダでシリアルポートから転送するか,外部にシリアルフラッシュメモリをつけることができるようです.
機能はそんなに多くなく,ペリフェラルもタイマカウンタとビデオ信号生成機能くらいの,シンプルなマイコンです.が,Cogと呼ばれるCPUコアが8個入っています.まだI/Oアクセス周りが良く分かりませんが,Hubと呼ばれるコントローラがアクティブなCogを切り替えるようです.
最初見たときはキワモノなマイコンかと思いましたが,調べてみると意外と情報が豊富.
64KBのメモリ空間のうち,32KBはROMになっていますが,フォントやらsinやlogのテーブルがROMに入っているようです.フォントにある記号が気になりますが.もう,ディスプレイを繋いでゲームとか作れと言われている気がしますし,サンプルもあるようです.
動かしてみる
まず,Parallaxのサイトから開発ツールとデータシートやらマニュアルやらをダウンロードしてくる.
Propeller Plugというライタで書き込むようですが,シリアルポート接続のものを簡単に作れるようです.データシートに回路の例が載っています.3.3Vにレベル変換して,リセット用のパルスを生成できるようにするだけの簡単なものです.とりあえず,ブレッドボード上に実装.
開発用には,Spinというオブジェクト指向(?)の言語とアセンブラがあると書かれています.商用のCコンパイラも45日間なら無料でフル機能使えるようですが,せっかくなのでこのSpinという謎言語で開発してみよう.サンプルが付いてくるので,とりあえず簡単そうなやつを見ながらスイッチとLEDを繋げてみる.定番ですね.付属のサンプルは外部クロック使うようになってますが,その辺を消してしまえば,内部クロックだけで動きました.
*秋葉原
safiiが無事に日本に帰って来たので,秋葉原に.meshiとGazyuとkmuroiとeldeshが来ていた.
お土産もらった.
とりあえず,秋葉原をふらふらしてから,焼肉.
私以外みんなAndroid端末を持っている….Desireがいいなぁ.
スタイルシートを調整.
*サンプル
ちょうど良いデータがあったので,json.hのサンプルコード書いてみた.
// ご結婚おめでとうございます
#include <iostream>
#include "json.h"
#include "http.h"
#include "encode.h"
using namespace std;
int main(int argc,int argv[])
{
Net::HttpClient http;
string json = http.get_content("http://keccon2010.appspot.com/script/api/entrant");
json::jsvalue list;
json::parse(list, json);
for (int i=0; i<list["result"].size();i++ ) {
cout << (string)list["result"][i]["username"] << " (" ;
cout << Encode::encode((string)list["result"][i]["name"],Encode::UTF8,Encode::SJIS) << ")" << endl;
}
cout << list["result"].size() << endl;
}
日記に付いている検索が全く機能を果たしていなかったので,Googleに飛ばすようにした.
登録されてるキーワード類は特別扱いする検索だったけど,そもそもキーワードファイルが無かった.いつ消してしまったんだろ.
*C++用の簡易JSONパーサ(json.h)
includeするだけで使える簡単なJSONライブラリを公開しました.
インクルードするだけという同じコンセプトでpicojsonをKazuho@Cybozu Labsさんが公開されているので,たぶんそっちの方がちゃんと使えます.
picojson少し使ったのですが,しっくりこないので,試しに自分で書いてみました.json.hは手軽さ重視で作ってます.
昨日のhttp.hと合わせると,数行でweb上のAPI叩くプログラムがC++で書けます.
#include <iostream>
#include "json.h"
using namespace std;
int main(int argc,int argv[])
{
string s = "[1,null,[31 , 32, \"asdfg\\\"hjk\" , {\"hoge\" : -123e6 },123 ],null,5,0]";
json::jsvalue v;
json::parse(v, s);
cout << (int)v[2][1] << endl;
cout << (string)v[2][2] << endl;
cout << (int)v[2][3]["hoge"] << endl;
cout << v[1].is_null() << endl;
}
こんな感じで[]演算子で参照できます.配列なら数値で,オブジェクトなら文字列を添字としてください.
jsvalueは(int)か(string)にキャストされると,その内容を返します.
存在しない要素を参照すると,nullを表すオブジェクトが返りますが,nullの要素と区別できないので,後でundefinedを追加する予定です.
あと,構文チェックまだ実装してないので,parse()は常にtrue返します.
そろそろCodeReposやgithubとか使うようにしようかなぁ.家のSubversionじゃなくて,公開リポジトリ上で開発した方が公開することまで考えると何かと便利なのかも.