2011-12-31 (土)
今日も寝る.
実家へ.
この日記はフィクションです.登場する人名・団体名・地名・職業などはぜんぶ架空のものです. なので実際のものとは何も関係がありません. それから,写真のように見える画像はCGもしくは念写によるものです.
寝る.
28日に書いたTextViewの再描がおかしくなるのは,setBackgroundDrawable(null);とかしていたのが原因だった.invalidate()しても,古い表示内容が消えないので困ってたのですが,BackgroundDrawableが表示の消去に必要っぽい.
setBackgroundDrawableResource(android.R.color.transparent);
として解決.
Android4.0のViewRootから処理をたどってみたけど,2.3以前とかなり変わってますね.GLオブジェクトに対するCanvasのインスタンス作れるのは便利そうだけど,SDKのリファレンスには無いな.
鍋.
saishinjiがコミケでゆるゆりブランケットとうどんを買ってきてくれたので駅まで受け取りにいく.うどんとか頼んでなかったのだけど,見たら欲しくなったので結局…….
あと,PSVita買った.どうせゲームやらないし買うの我慢してたのだけど,結局買ってきてしまった.秋葉原のヨドバシでWiFiモデルが売り切れてたので3G版.
「ニコニコ」と「みんなでいっしょ」をダウンロード.Vitaはボタン多くて,使い方難しいですね.ゲームもPS Storeでダウンロードできるので,やる気になったら何か買おう.ゲーム機だからと割り切るべきなのかもだけど,Webブラウザの出来はいまいち.
しかし,3G通信できてGPS載っててカメラやらタッチパネルやら,これはスマートフォンですね.
せっかく買ったので,PlayStation Suite SDKとかで何か作りたいな.本当は,Vitaのハードウェアにフルにアクセスできる開発環境欲しいのだけど.
アニメ鑑賞会.最近の遊戯王は凄いことになっていることを知った.
遊戯王→なのは→トライガン
Android4.0にしたらWebView内のFlashが上手く動かなくなった.ログ見たらOpenGLがどうとかエラーが出ていたので調べてみると
http://stackoverflow.com/questions/8328596/problems-with-loading-flash-files-into-webview
ということらしい.
とりあえず,Android3.0追加されたViewのハードウェアアクセラレーションをONにしたら動くようになった.
android:hardwareAccelerated="true"
Activityにこの属性を追加.
ただ,Surfaceに重なってるTextViewの再描がおかしくなったので,どうにかしないと.本当ならTextView使わず,Bitmapに変換しておいてかくべき箇所なのだけど.
仕事納め.
寝る日.
クリスマス会.神田でオムライス食べて秋葉原散策して,shimobayashi邸でケーキとビザ食べてコーディングしたりする日.
神田のルー・ド・メール というお店のオムライスが美味しいらしいので行く.ビーフオムライス.醤油風味.おいしかった.次は普通のチキンのオムライスも食べよう.
ケーキ.途中,買い物に行ってケーキとか買ってきたのだけど,どうしてかこのケーキは酷い扱いだった.美味しかったのに何かいけなかったんだろうか?
ピザ.
ピザ食べた後は,各々コーディングなどしていたら,終電が無くなってしまったので歩いて帰る.
帰って寝る.
店の場所とか覚えておくためにGoogle Latitude確認したら,履歴に通った経路の線が引かれるようになってるな.
そのうち作ろうと思っていたもののひとつに,広さが無限のライフゲームがあったのを,会社の某IRCチャンネル見て思い出した.
無限のメモリを用意することは物理的に不可能だけれど,開始時点で生きているセルの数を制限してメモリに載せることはできる.
もちろん,動かしていくと必要なセルが増えていくのでいつかメモリが溢れそうだけど,PCに搭載されているメモリも年々増えていくことを考えると,必ず溢れるとは限らない.
ライフゲームのセル数の増加は,時間の自乗より多くなり得ないので,メモリがムーアの法則かそれに近い形で指数関数的に容量の増加を続けるならば,近いうちに,実メモリの増加が,必要な量の増加より多くなるはず.
18年前に15*15のセルのライフゲームを1fpsで動かしたことがあったけれど,もしそのまま動かしていれば,1セル1ビットで表しても,最大で40PBになっている可能性がある.
たとえ理論上最大の速度で大きくなっても,実際は,かなり疎な構造になっているはずなので,圧縮すると数百分の1とかにできるかも.
それでもまだメモリに載りそうもないですが,今同じプログラムを走らせ始めたとして,18年後に数PBのメモリを何らかの形で使えるか考えると,実現する気がする.
ただ,グラフ描いてみると分かるけど,まだ必要なメモリが上回ってしまう期間がかなりありそうなので,やるなら10年後とかかなあ.上手く圧縮できればどうにかなるか微妙なところ.
実際はライフゲームじゃなくても何でも良いのだけど.
PCのメモリの容量の増加は今は秒間あたりだと数百バイトだけど,40年後には数MB/sになってるはずだし,できることがかなり広がりそう.問題は,アプリケーションが消費するメモリの量も今のところ指数関数的に増えてることですが….
メールの返事ができない.
メールを書くと人間力とかそういうものが消費されるので,回復するまで次のメールを書くことができない.仕事のメールはまだマシなんだけど.
会社の忘年会だった.おなかいっぱい.今年は桃井はるこ来てました.声優あまり詳しくないのだけど,聞いたことある声の人が歌ってると何か凄い.ビンゴ大会は今年も何もまた当たらず…….別にテレビとかPCとかでなくて良いので,何か当たって欲しい.
忘年会終わったけど,明日も通常営業.
UDXで研修という名のハッカソンのようなものがあるので秋葉原へ行く.ネットの調子が悪かった.
root無いAndroid開発はたまに面倒っぽい.アプリが内部で使ってるSQLiteのデータとかをダンプしたいときとかに,アプリの方でデバッグ用に読める場所に出力するようにしておくしか無いんだろうか.
adbにアプリの秘密鍵を渡すとそのアプリのデータ領域にアクセスできるとかそういう機能が欲しいな.
アニメ見る日.
先週,不具合修正のついでにやったUIの修正が中途半端だったのでもう少しいじっておく.
Android標準のままのボタンやシークバーをそのまま使っていたのがひどかったので,ちゃんとスタイル定義する続きです.
まだ色々気になるけど,時間かかりそうなので妥協.コメント入力とかもダイアログ表示するだけだったのをちゃんと画面に入れる.ついでにコマンドも使えるように.
Android4.0でもシークバーは何もスタイル指定しないとオレンジ色の太いやつになってしまうんですね.Ice Cream Sandwichで標準っぽく使われている青いシークバーのスタイルはデフォルトじゃないのか….
あとは,マイリストとランキングの表示周りももう少し頑張っておきたい.
ヨドバシ行って,vitaに並んでいる人を眺めてからGalaxy Nexus買いに行ったけど,こっちも混んでいた.
なんで機種変更の手続きってあんなに面倒なんでしょう?とりあえず,spモードもパケホーダイも契約せず.simは今まで通りガラケーに挿して,Galaxy Nexusにはb-mobileのsimを挿すことに.
flashがまだ見れないって書いてあったけど,前回のアップデートで対応してたよなーと思ってマーケット見たら普通にFlashPlayerあったのでインストールできた.
大体は良い感じ.Android4.0になって色々変わったのは,まぁそのうち慣れそう.
ただ,カメラとかディスプレイは思ったほど良くない.HTC Desireのディスプレイに慣れてるとGalaxy Nexusのザラザラした感じが気になる.
あとでかい.ちゃんと握ってないと落としそうだな.
b-mobileはアンテナ表示駄目なような気がする.とりあえずネギアンテナ入れておこう….
root無いと色々不便なのだけどどうしようかな.しばらく標準な状態で使おうと思ったのだけど,root取るとデータが初期化されるようなこと書いてあるし悩む.
Google日本語入力のAndroid版が出ていたので使ってみる.
https://market.android.com/details?id=com.google.android.inputmethod.japanese
肉食った.
しかし,肉が一人一枚しか来ないと争いが起きなくて平和に食べることができる.高い焼肉店だけあってよく考えられていると思います.
最近エンゲル係数とても高いな.
なんか今週も引き続き調子悪いな.鼻水が止まらない.風邪は週末には治ってたと思ったのだけど.
ヒッグス粒子本当に見つかるんだろうか…….今回ので確定してしまうと,意外とあっけなかったと感じてしまう.
そういえば,今年も新卒採用の要項が出てますね.
http://info.dwango.co.jp/recruit/graduate/
100人採るのか…….ちゃんと良い感じの人集まるかなぁ.2009年に入社したときより初任給かなり上がったのでお得です.寮に住めば最初の2年でお金たくさん貯まりそう.
なので,僕の後輩とかがここ見てたらエントリーするといいです.社内を見学したいとかあったら声かけてください.
Androidでボタンなどのコンポーネントの見た目をカスタマイズしたい場合,background等の属性にdrawable以下にある画像ファイルやxmlを指定すると思います.ここで画像を使うと画面の解像度ごとに用意しないと綺麗に表示できないし,サイズが変わるボタンなどは9-Patch等で引き伸ばし方を調整しないといけないので面倒です.
なので簡単なボタンくらいならxmlだけで作った方が楽です.画像を使わずに作っておくといくつか利点があります.
ただ,あまりdrawableの使い方詳しく説明されてる情報が見つからないし,リファレンス見ても???な部分があるので,実際に書いて試行錯誤したりよく分からないところはAndroidのソース読んで確認する必要がありました.
説明書くつもりだったけど,面倒になったので細かい使い方はAndroidのリファレンスとコードを参照してください.
四角形,楕円,線分,リング("rectangle" | "oval" | "line" | "ring")の4種類だけです.四角形は角を丸くできます.ringはlevelの値を使って弧にすることもできる気がします.
colorとかsizeとかを要素として持てます.sizeを指定しても,drawableのサイズに合わせて引き伸ばされてしまうので,item等に入れて,top,bottom,left,rightを指定する必要があるみたいです(?).
複数のdrawableを重ねて1つのdrawableにすることができます.
layer-listの子は複数のitemで,このitem1つにshapeなどのdrawableを入れられます.
なぜかリファレンスには載ってませんが角度を指定して回転できます.アニメーション時に使うものですが,静的なdrawable内にあっても大丈夫なようです.
ただ動作が怪しくて,回転の中心が上手く指定できずに,結果を見ながら試行錯誤しないと使えません.けっこう不便です.
……と思っていたら,Android4.0や最新のADTだと普通になった.もしかしてバグだったのか.ただ,2.3とかの実機だと今までどおり変な動作する.
アニメーション以外では使わないほうが良さそうです.
こんな感じのボタンが欲しかった.
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true"> <shape> <corners android:radius="4dip" /> <padding android:left="8dp" android:right="8dp" android:top="2dp" android:bottom="2dp"/> <solid android:color="#7799ff" /> </shape> </item> <item android:state_selected="true"> <shape> <corners android:radius="4dip" /> <padding android:left="8dp" android:right="8dp" android:top="2dp" android:bottom="2dp"/> <solid android:color="#7799aa" /> </shape> </item> <item android:state_focused="true"> <shape> <corners android:radius="4dip" /> <padding android:left="8dp" android:right="8dp" android:top="2dp" android:bottom="2dp"/> <solid android:color="#7799aa" /> </shape> <color android:color="#00ffffff" /> </item> <item> <shape> <corners android:radius="4dip" /> <padding android:left="8dp" android:right="8dp" android:top="2dp" android:bottom="2dp"/> <gradient android:centerY="0.4" android:startColor="#88ffffff" android:centerColor="#66aaaabb" android:endColor="#44888899" android:angle="270" /> <stroke android:width="1px" android:color="#aa888888"/> </shape> </item> </selector>
グラデーションかけて縁取りするだけで済ませました.光沢とか影を表現したければ,layer-listで重ねれば良い感じにできると思います.
SeekBarの見た目をカスタマイズするためには,progressDrawableとthumbを指定します.progressDrawableがプログレスバー部分で,thumbはつまみです.
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@android:id/background"> <layer-list> <item> <shape> <corners android:radius="1dip" /> <gradient android:startColor="#80666666" android:centerColor="#86999999" android:centerY="0.75" android:endColor="#a0666666" android:angle="270" /> </shape> </item> <item> <shape android:shape="line"> <stroke android:width="4dp" android:color="#dd444444" /> </shape> </item> </layer-list> </item> <item android:id="@android:id/secondaryProgress"> <clip> <shape android:shape="line"> <stroke android:width="4dp" android:color="#ffffffff" /> </shape> </clip> </item> <item android:id="@android:id/progress"> <clip> <shape android:shape="line"> <stroke android:width="4dp" android:color="#ffffbb33" /> </shape> </clip> </item> </layer-list>
background,progress,secondaryProgressをidで指定するだけです.どうやってバーの長さを変えてるのかと思っていたのですが,clipを使って部分的に表示していたようです.
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <size android:width="20dp" android:height="32dp" /> <corners android:radius="2dip" /> <padding android:left="8dp" android:right="8dp" android:top="2dp" android:bottom="2dp"/> <gradient android:centerY="0.4" android:startColor="#88ffffff" android:centerColor="#66aaaabb" android:endColor="#44888899" android:angle="270" /> <stroke android:width="1px" android:color="#aa888888"/> </shape> </item> </selector>
つまみの方はボタンと同じように複数のステートがありますが,今回は常に同じ表示にしてしまいました.気をつけないといけないのはsizeを明示的に指定しないと大きさが0になってしまうためか,何も表示されません.
Androidなのでドロイド君を描いてみます.
厄介なのがドロイド君の頭です.半円形の図形が欲しい.
普通にovalをclipすれば良いと思ってたのですが,表示する割合を決めるlevelという値は,xmlから指定できませんでした.
まぁ,ここまでは想定内です.
Shapeを継承しているArcShapeがあるのでこれを使うのが正攻法かな.しかし,リファレンスでshapeに指定できるものを見ても
"rectangle" | "oval" | "line" | "ring"
の4種類しかありません.
/graphics/java/android/graphics/drawable/Drawable.java
ソース見てがっかり.上手く書けば,任意のDrawableオブジェクトを作れるのかと思ったら,生成されるオブジェクトはif ~ else if ~でハードコーディングされていた.
そもそもshapeはShapeDrawableではなくGradientDrawableを生成している…….リファレンスで言ってること違います.
とりあえず諦めて,グラデーションでごまかす.
ここまで書いておいてなんですが,あまり凝ったことはやらない方が吉です.
svgのサブセットとかにして欲しかった.もしくは,cssでデザインできればもっと良い気がする.
昨日寝る前に最新版を公開.修正は,チャンネル一覧が読み込めなくなっていたのと,見た目をところどころ調整しただけです.
ニコニコ動画のhtmlをアプリ内で解析してるので,htmlが変わると結構アップデート面倒くさい.
http://developer.android.com/guide/topics/resources/drawable-resource.html
半透明のボタンとかシークバーが欲しかったのだけど,画像は色々面倒なので全部xmlで書いてみる.
shapeとlayer-listとclipだけでも割と自由にデザインできますね.
シークバーは,作りかけだったので今回のニコニコPlayerには入れなかった.
ysaotomeの家で8時とかに起きた.眠い….秋葉原まで行って,昼ごはん食べて帰る.
イノシシ食べる日.
X220に開発環境整える.せっかくなので色々最新版に.
最近VisualStudioよりEclipseの方が使ってる時間が長い….
とりあえず新宿へ.ysaotome,safii,kmuroi,gazyu,sangoが来る.sangoはこのときに一緒だった人と一緒に東京来ていた.
途中でshunaも呼ぶ.eldeshは呼んだけど来なかった.
ysaotomeの家に行って,ぼたん鍋.肉たくさん食べました.
材料を煮込む.ysaotome提供の猪肉.ここにあるだけで2kgあります.
完成(白菜しか見えていない……).炊き込みご飯も美味い.
...IKEA照明.なんでこれ買ったのか理解できない.
月食見たり.
そのまま泊まる.
昨日も帰って何もせずに寝てしまったので12時間睡眠….
体調は大分マシになった.
気づいたら,Google+のAndroidアプリのアイコンが赤くなっていた.
会社の同期で忘年会.色々ひどい感じで終わった.
ニコニコPlayer(仮)の問題を直しておきたいのだけど,なかなか時間が取れない.
iPhone4sとの関係とか.
Androidのバージョンは順調に上がっている.1.6のユーザはどの機種使ってるのかなぁ.
…….これはとてもひどい.REGZAフォン….
Android端末は外れが多い感じだなぁ.だんだん良くなっては行くんだろうけど.
今週はずっと体調が悪い.1日12時間くらい寝てるのだけど眠くて仕方が無い.
https://market.android.com/details?id=apps_timed_promotion
Androidアプリ10円….
そういえば,QRARって商標とられちゃったのか.
3年くらい前に作ってたこれのプロジェクト名がまんまQRARで,もし公開するようなことがあれば使おうと思ってたのだけど,まぁ商標とられちゃったなら仕方ない.
しかし,QRコードにARToolkitみたいな枠をつけてるのどうにかならなかったのかな?QRコード読んだ時点でARのための変換行列作るためのデータも作れてしまう気がするのだけど.
逆に,枠を使ってQRコードの読み取り性能を向上させてるのも考えられるけど,いまどきのスマートフォンのカメラは高画質なので,あまり必要性を感じないなあ.
ARとQRコードの画像処理に別々のライブラリ使ってるだけというオチはありそう.
月曜なので眠い.あとなんだか頭痛い.
そろそろ,mp4とかH.264とかを読めるようになっておきたい.
規格書見ないとちゃんと分からない気もするけど,ぐぐってみる.
mp4は track(音声,映像)のストリームが,chunkというものに分割されていて,chunk内に複数のsampleが入っているということまでは理解.sampleが何の単位なのかまだいまいち分からない.映像の場合はフレームと1対1と考えていいのかな.aviのRIFFより少し面倒だけど難しくはなさそう.
せめてH.264のNAL構造が見えるところまでたどり着きたい.
http://up-cat.net/H%252E264%252FAVC%2528NAL%2529.html
http://d.hatena.ne.jp/SofiyaCat/20080430
機種やAndroidのバージョンによっては,カメラで撮った動画をH.264+AACなmp4(m4v)で保存できるけど,ついでなので色々見てみる.
眠いのでコード追うのは諦めてしまった.あと,動画ファイルとかの知識がほとんど無いので意味不明なこと書いてるかも.なので,これ読んでも何かの参考にはしないほうが良いです.
アプリによって,moovがmdatより前にくるものと,後にくるものがあるっぽい.3gpファイルは後みたいなので,MediaRecorderに渡すOutputFormatの違いかな.挙動を観察していると,m4v形式でも撮影中はmoovがある位置はfreeになっていて,あとからmoovを書き込むっぽい.まぁ,stblを事前に作るのは無理なので仕方ない.ことのき400KBくらいのfree atomを作るみたいなので,mdat atomは毎回62E20h付近になる.でも,3gpでも謎の3KBくらいのfree atomが存在している.
AndroidアプリでMediaRecorderからストリームを横取りして,ファイルを介さずにmp4をごにょごにょしたい場合,moovの情報は入って無いわけか.ここは自分で設定したパラメータが分かってれば問題ないのかな.
このあたりからは必ずそうなのかかなり怪しいけど,オーディオトラックのstszを見る限りsampleあたり768バイト固定っぽい.1つのオーディオchunk内に固定長のsampleが並ぶので,バイナリエディタで眺めたときにmdatのところどころに縞模様が見える.で,その間にあるでかい塊がビデオストリームの1チャンク分のデータ.stcoのテーブルを見る限り大体それであってそう.
chunkのoffsetは,mp4ファイル内での絶対位置っぽい.mdatの特定の場所を指していて,いかにもそこから意味のあるデータが始まってますって感じのバイト列.
ビデオトラックのchunkはぱっと見は一様なランダムなビット列に見えてしまうけど,よく見ると,一定間隔で 00 00 があるように見えるような気がする.この間隔がstszに書かれたsampleのサイズと一致しているのが分かる.さらによく見ると,00 00 を含めた 32ビット が stszのサンプルサイズ-4バイトなので,sample自体が サイズ+データの構造になってるわけか.数えてみると,sample数はフレーム数にかなり正確に一致している気がする.あといくつかデータが大きいsampleがあるけどこれがIフレームかな.
ずっとバイナリエディタはBzを愛用してるのだけど,扱うデータは大きくなる一方なので,自分用のを作っておきたい.
あと,前にも書いた気がするけどWindows7についてる電卓はひどい.「プログラマ」を選ぶと16進や2進表記で計算できるのだけど,ほとんどの関数が使えないどころか,整数しか使えない.プログラマは離散世界に住む生物なので実数は不要だと思われたんでしょうか.そして関数電卓に切り替えると入力中の数値や式が消えるので,途中で実数や関数が必要になった場合はクリップボードを経由するしかない.ペイントはちゃんと進化してるのになぁ.残念.
あれ…何の話だっけか.
洗濯とか掃除とかする日.
eldeshが寿司食ってるというので,品川へ.たまには奢ってあげようと思ったのだけど,財布に2千円しか入ってなかったので,とりあえず立て替えておいてもらう.