2010-08-32 (水)
賞味期限から3週間ほど経過した卵に挑戦.
*暑いのでまだ8月です
8月32日未対応のRSSリーダーとかで上手く表示できないかもしれませんが知りません.
この日記はフィクションです.登場する人名・団体名・地名・職業などはぜんぶ架空のものです. なので実際のものとは何も関係がありません. それから,写真のように見える画像はCGもしくは念写によるものです.
なぜか,目が覚めたら16時を過ぎていました.起きたら上司から「寝坊か」というメールが来ていた.寝坊です.自分でも社会人としてどうかと思う.大学時代より生活リズムが崩れている気がするのは,昼寝が不足しているせいだと思う.
銀行でクレジットカードの再発行の手続きをする.とても面倒くさい.でも,住所もまともにかけない私に付き合ってくれる銀行の人も面倒だったと思う.
というか,どうせ機械に入力される情報なのに紙に手書きとかどういうことなの?
しかも住所とか名前とか何度も書いたけど,口座持ってるのだからデータベースに入っているでしょう.口座番号と本人確認用の印鑑以上の個人情報の必要性が分からないし,必要以上の個人情報を記入させるリスクとか考えないのかなあ.
今日は早く起きる.が,rubykaigiのysaotomeの発表はustで見れなかったので,録画されたものを見る.
7インチ液晶を積んだAndroid端末が色々な名前で売られてますが,イオシスでiopad4として売られているのが安くてよさそう.魅力は画面が大きいことと,HDMI出力とUSBポートがあることでしょうか.ただ,ちょっと遅いんだよなぁ.CPUはRockchipですが,怪しげな中国製ガジェットを分解すると,大抵このCPUが入っています.
アキハバラデパートがとうとうアキハバラパートではなくなっていた.
それにしても駅の機能を保ったまま建て替えるの凄いな.1Fは常に部分的にしか工事してなかったはずだけど,基礎とかどうなってるんだろうか.1Fと2Fの間に鉄骨をたくさん入れているのは見たけど,そういうので足りるのかなぁ.
帰ってきて寝る.
少し文字列入力周りを追いかけてみる.
TextView使わずに日本語を含めた入力を受け付けるのは意外と面倒ですね.変換中の表示とかも考慮しないとみたいですし.SDKのリファレンスも説明がほとんど無い.
TextView.addTextChangedListenerでテキストが変更されたときの処理を書けますが,IMEの変換中でもTextWatcher.onTextChangedが飛んでくるので,できれば変換中の中途半端な文字列は除きたい.
getText()で取得したCharSequenceからBaseInputConnection.getComposingSpanStartで変換中の範囲が取得できるので,変換中の範囲が分かるようです.
日本語入力モードを付けてみた.個人的に使うにはこれで十分かな.
simejiだと微妙に日本語入力できますが,キーを押しても即座に入力されないので,コマンド打つときは不便.何かのきっかけで,コンソールに直接入力できるようになったりしますが今度は漢字変換できない.実は自由に切り替えられたりするのかなぁ.
デベロッパー登録は$25なので今なら2200円くらいです.
登録するためには,apkを署名しなければいけないようです.jarsignerで署名しましたが,ADTが入ってるなら,署名つきapkをエクスポートできます.後から気づきました.
スクリーンショットのサイズが決まっていたり,色々地味に面倒ですがとりあえず登録して公開してみた.
すぐにMarketの検索結果に反映されたので正常にインストールできることを確認.
↓こんなの.前作ったアンテナの画像変えただけです.
Desireのカメラアプリってタップした場所にフォーカス合うけど,Javaから使えるAPIにはそれらしい機能無い気がするなぁ.
SIFTは特許も取られてるので個人的に遊ぶ以上のことがやりにくいので,今回はSURFで遊んでみる.と思ったら,SURFも特許あるのか.
この辺の技術は実用レベルになりつつあるのに製品があまり出てこないのは,権利周りの解決が面倒だからだったりするのかなあ.
日曜日にやろうと思っていたのだけど,どういうわけか起きたら夕方だったり,しりとり解いてたら眠くなってきたりしたので,時間的に厳しかった.
一応最低限の問題は解いたのでこれで大丈夫だといいなぁ.Super Hackers枠以外で点数取れる気がしなかったので他はスルーする.
ぐぐればOK.
rubyのOAuthの使い方が良く分からなかったのでPerlで.
1,2はPerlで一瞬.全探索して必勝条件を求める.もしかしたら,相手のミスが無いと勝てないのではないかと心配したけど,必ず勝てる問題だった.
3は時間かかりそうだったので,C++で書き直して駄目もとで走らせながら,スマートにとく方法を考える.けっこう悩んでも良い方法が出てこなかったのですが,辞書の中身を見ていたら簡単な問題だと気づいた.
手動で解くのは面白くないので避ける.
パックマン.これも1,2は最適解がすぐ出る.自機と敵機の状態を適当に配列に詰め込んでmapにメモ化しつつ,幅優先で書いた.
3色々考えたけど,最適解を求めようとしなければ,大丈夫だった.根本的な改善をするのは面倒なので,1と2を解いたプログラムに定期的に効率悪そうな経路をバッサリ切るコードを入れる.メモリが溢れてスワップするとWindowsごととても重くなってPCを再起動する羽目になるので慎重に調整.枝刈りが不十分なので,すぐに状態数が大変なことになってしまう.
少し心配.
…終わる直前で2が最適解じゃないことに気づいた.本来より長くなってしまう場合があったので,無理やり修正.少しよくなった.
↑結果
パックマンはまだかなり改善の余地がある.
明日締め切りっぽいのでやる.
rubyで書こうかと思ったのだけど, OAuth::Consumer の使い方が良く分からず,結局Perlで.前にmixiアプリ作ろうとしたときのコードをそのまま.
しりとり.なんか,Perlの気分になってしまったのでPerlで.3つ目は辞書が大きいのでC++で書くことにして,上手くいく方法を考える.けっこう悩んだが,辞書を良く見たら簡単だった.
パックマン.ゲームとか苦手なので手動でやるのは避けたい.これも3以外はそんなに状態数増えないな.
秋葉原でysaotomeとeldeshに合流.そういえば,リナカフェはじめて行った.
渋谷に行って,マクドナルドでsafiiを待った後,カニチャーハン食べる.その後,キリンシティで色々食べる.
なんか,休みの日に外出するとずっと何か食べ続けている気がする….
ハムを食べるのは再来週になった.来週は,ysaotomeがRuby会議の発表があるらしいのでダメっぽい.
プログラミンのプログラム編集しようと思ったが,良く考えたら会社のPCからじゃないとダメか.アカウントも作れるようにしてほしいな.小学校とかで教材として使うときも問題になりそうだ.
ここのところ自分の中で一番気になっていたことが解決した.
命令セットから証明するのはなんだか難しそうですが,チューリング完全な処理系をエミュレートできれば,その言語もチューリング完全であることが保障されるので,brainfuckを実装しました.
作りかけのbrainfuck: http://bit.ly/cpn2FL
これによって,一般的なコンピュータで処理できる問題ならばプログラミンでも処理が可能であることが分かりました.
今は最低限の実装です.あと,入出力を電卓と同じように実装したり,オーバーフロー処理も必要ですね.
最低限必要な命令は
くらいか.他はなくてもどうにかなることは分かっています.
他のプログラミング言語にはあって,プログラミンに欠けているのは,自由な条件分岐と記憶領域なので,それらは電卓を作ってみた時点でどうにかなると確証を持っていたのだけど,本当にチューリング完全であるというために念のため.
正式公開されました.http://www.mext.go.jp/programin/
要は,ScratchやSqueakみたいなものなのですが,使える命令が少ないのでパズルみたいで面白いのと,Flashなのでブラウザで開いてすぐ遊べるのが素晴らしい.こういうサービスもっとたくさん出てきて欲しいな.
作った電卓 http://bit.ly/9HlLAk
動きを見れるようにしました
追記:10000日目
■●猫犬馬
電卓作った.
ジャンプ命令らしきものは使えるけど数が限られてるし,全てのオブジェクトが対象なのでシグナル的な用途を想定しているっぽい.そうなるとオブジェクト間で情報をやり取りするには,衝突させるしかない.分岐命令も変数も無いので,特殊な法則に従う空間上にコンピュータを組み立てるイメージかもしれない.完全に本来の用途から外れていますが,制限が多いと逆に燃えます.
プログラミンのリリースは明日です.
文科省の策略によって,開発者のたくさんの時間が奪われている気がする
帰る前にちょっとプログラミンで遊ぼうかと思ったら,25時までかかってしまった.衝突を使った演算器を組み立てられるところまで確認.
全体で使えるハターンの数が決まっているので,条件分岐によってプログラムを制御するという考え方は捨てないとダメですね.
はやくリリースされないかなぁ.
あー,DevQuizやって無い.
明日は内定後面談のために早く会社行かないといけないのか.忘れないようにしないと.
おもしろい.一見,単純なことしかできない気もしてしまうけど,良く考えればかなり遊べる.本来のターゲットユーザはそんな遊び方しない気がするけれど.
電卓とか作ってみようとしたけど,かなり面倒そうだなあ
遊んでたら準備中になってしまった.作りかけのやつ,ちゃんと保存出来てるのかなぁ.
って,まだテスト公開だったみたいです.19日公開予定らしい.チューリング完全なのか気になるので正式公開されたらいじってみよう.
GPSで得られた座標を地図上の点にマッピングするのって意外と面倒だなあ.
多面体で近似するにしても要素が四角形だとつなぎ目の問題があるしどうするかな.面倒なので正四面体に近似してしまうとうのもありかな.どうせ日本の中だけ表現できれば良いと割り切って,適当な平面に変換してしまっても良いのだけど,なんか気持ち悪い.
子供の頃,工作しながら円周率を求めたのを思い出した.ちょうど手元にあったセロテープの直径と外周を測ったら,8cmと26cmだったのは覚えています.まだ割り算とかできなかったので,電卓で計算した結果の「3倍より少し大きめ」という値を学校で円周率を習うまでずっと使ってました.ちょうど3にならずに中途半端なのは何だかおかしい気がして,色々な物で測りなおして,時間を無駄に使ったのが懐かしい.
android意外と奥が深いな.まだわけが分からない.
気づいたらAndroidのソース読んでいた...なにやってんだろ.
リポジトリから落としても良いですが,Code Searchで探したら普通に見れました.
アンテナ表示とかされてるステータスバー周りは,com.android.server.status.StatusBarPolicy にあったけど,普通にPhoneStateListener使ってたので,もっと下のレイヤまで見ないとダメみたい.
PhoneFactoryを見ると,WCDMAはGSMで良いということが分かった.
SIMや無線モジュールへアクセスするところまで見たかったのだけど,間にあるRILとか勉強しないと意味分からない感じだったので今回はやめておく.
↑アンテナ描いた.
Inkscape便利.いままでは簡単な図はペイントで書いてたけど,Inkscapeは手軽にそこそこきれいな図が作れる.アルファチャンネル付きPNGで保存しておけば,特に何もしなくてもAndroid上でちゃんと透過される.
sangoが来た.gazyuとsafiiも.神田の居酒屋でeldeshも合流.
秋葉原→日本橋→神田→秋葉原
昼は秋葉で回転寿司.その後,日本橋の大塚家具で家具見て,高島屋のビアガーデンでウインナー食べて,神田の「みますや」というところで夕食.歩いて秋葉原行ってダーツしながらピザ食べて帰る.
起きて,Javaプログラミングして,会社でPHP書いて,帰宅してC++というのが最近の生活スタイル(?)になってます.
EclipseのADTは私にはあんまり使いこなせそうもないな.高機能なGUIツールが色々ありますが,どうせSDK見ながらやらないと分からないので,そうなるとXMLとか直接書いた方が効率良い.GUIは画面上で入力個所を探すという作業によって思考が中断されるのがプログラミングと相性が悪い原因だよなあ.
結局Froyoにアップデートしても,Sense UI使っている限りb-mobileでアンテナがまともに表示されないので,電波の強さを表示するウィジェット作った.
スクリーンショットです.圏外表示では無くなったけど,アンテナが立ちません.
少し見にくいですが,緑の「17」というのが今回作ったウィジェットで表示している電波強度です.0~31に変化します.
時間が無かったので数字表示するだけ.急いで書いて,スクリーンショット保存して会社に.会社まで歩きながら数値見てたけど,反映が遅いな….取得の仕方がまずいのかな.
アンテナ表示アプリは,modal.blueさん作の3Gアンテナ表示がお勧めです.上部の通知領域にアンテナを表示してくれるみたいです.
…なのでウィジェット作ってみたかっただけです.
作ってて気になったのは,PhoneStateListenerがinterfaceじゃないということです.他のlistenerと同じようにimplementsしたら怒られた.あと,onSignalStrengthChangedを使った例が多いですが,deprecatedなので,onSignalStrengthsChangedを使った方が良いです.
追記:昨日isGsmがtrueになってるとかさりげなく書いたけど,繋いでるの3Gなんですけど….なんで?
まず,実行速度.
今書いてるアプリでベンチマークしたら,2.1に比べてだいたい2倍弱の速度.アプリたくさん動かしている場合は実行効率が上がるので電池の持ちもよくなると期待してるけどどうかな.
テザリング.
普通につながる.最近,あまり外出してないのでまだまともに使ってないけど.
アンテナ
b-mobileで圏外表示ではなくなったけど,まともに表示しない.実際には繋がるし,Android SDK経由だとisGsmもtrueだし,getGsmSignalStrengthでもちゃんと取れる.どうもHTC Senseが何かをチェックしてるっぽい.
HTC Syncは普通にDLできた.というか,S/N入れるところ無いし….機種自体を間違って選択してたかな.
公式のアップデートが来たみたいですね.ただ,私のDesireは元のファームに戻してもアップデートできないんですが….HTCのサイトでHTC SyncをDLしようとシリアルナンバーを入れてもダウンロードさせてもらえない.なんでだ?
どうせroot取るつもりだったので,カスタムファームの新しい奴を入れなおす.
一番目を引くのはホーム画面の下部のボタンが半透明になったことでしょうか(これはカスタムロムの機能?).あと,b-mobileでもアンテナが出る(しかし強さは上手く表示されない?).
VC++でのコンパイル結果のコードを見る限り,速度的にもサイズ的にもオーバーヘッドは無いようです.
実データは内部に持たないでWin32APIを呼ぶプロパティが便利そうだなと思ったのですが,C++はサイズが0のクラスを作れないので無駄なメモリを消費してしまいます….unionで多少マシにするくらいしか思いつかないな.
かなり前にも書いたけど,Aeroが有効だと,ウインドウの色々なところが微妙に透けるのでスクリーンショットを撮る時は気をつけないといけません.
昨日はすっかり忘れていたけど,変なものが写りこんでなくて良かった.
なんでもかんでもgetX()やsetX()を定義するのは面倒ですが,メンバ変数を直に参照していると後で困りそうで心配です.多くの言語では心配しなくて良い仕組みが用意されていますが,残念ながらC++にはありません.
ただC++は何でも出来てしまう言語なので上手くすれば実現できるはず.
多分,みんな書いていると思ったのだけど,全部満たすものが見つからなかったので書いてみた.特に,プロパティ毎に親オブジェクトを持たせるとかは非効率的なので絶対に避けたい.最初はマクロで頑張ろうかと思ったけど,テンプレートだけでも結構いけます.
template<class CLASS,typename T> struct _property{ typedef T _type; typedef typename CLASS _type_parent; protected: friend CLASS; T value; _property() {} _property(T v) : value(v){} template<typename TT> inline _type_parent& parent(TT _type_parent::*mp) { return *(_type_parent*)((char*)this - (size_t)&(((_type_parent*)NULL)->*mp)); } public: inline T operator =(const T &v){return value=v;} inline operator const T&() const {return value;} }; // ついでに読み取り専用のやつも template<class CLASS,typename T> struct _property_r : _property<CLASS, T>{ friend CLASS; protected: _property_r() {} _property_r(T v) : _property(v){} inline T operator =(const T &v){return value=v;} }; #define _property_setter inline _type operator =(const _type &v) #define _property_getter inline operator const _type&() const
こんな感じ.
class Hoge{ public: _property<Hoge,long> foo; // 読み書き可(あまり意味無い) _property_r<Hoge,long> bar; // 読み取りだけ許可 struct : _property<Hoge,long>{ _property_setter { cout << "set hoe and bar" << endl; parent(&Hoge::hoe).bar = v*2; // ちょっと面倒… return value=v; } } hoe; Hoge(){ foo = bar = 123; // Hogeの中では普通にアクセス可能 } }; int main(int argc, char* argv[]) { Hoge hoge; // fooは読み書き可能 hoge.foo = 321; cout << hoge.foo << endl; hoge.hoe = 1; // barには2倍した値が入る cout << hoge.hoe << endl; //hoge.bar = 0; // エラー cout << hoge.bar << endl; // 読み取りは可能 cout << sizeof(hoge.foo) << "==" << sizeof(long) << endl; // 多分余計なメモリは食わない return 0; }
321 123 set hoe and bar 1 2 4==4
getX(),setX()を実装するより良い点は,コードの見栄えが良くなるだけでなく,メンバを持っているクラス内でも,普通に書く限りは必ずgetter,setterが呼ばれる事です.直接書き換えたい場合は,foo.valueを書き換えなければいけません.
コンパイル結果を真面目に見てないので速度的なオーバーヘッドがあるかもしれないけど,一応は条件を満たせました.親クラスを取得するためのparent()とかが酷いけど,綺麗に書く方法を思いつかなかったです.
やっぱり,今時の言語なら簡単に出来ることが,C++だと意外と面倒だ.
追記:
autoで受けた時の事を考えて無かったな…
C++のlambdaって自分自身を呼べないのかな….
std::function< void () > func ;
func = [&]{ func() ; } ;
http://cpplover.blogspot.com/2010/01/named-lambda.html
名前付けないと無理なようです.しかも末尾再帰最適化が効かないのか.funcをconstにしたら頑張ってくれそうなものだけど,ダメっぽい.
豆腐にものをぶつけて崩れる様子を見て遊ぶゲームを作ろうとしてるのですが,四角い豆腐ばかりではつまらないので,色々な豆腐を作ることにした.
そのために,簡易のエディタを作ったりした.
↑ただの豆腐ですよ.
ソリッドモデルを簡単に扱えるフリーのモデラって無いかな.ポリゴンモデラはたくさんあるので,いっそのことポリゴンから生成したほうが良いのかなぁ.