*ICFP(pc)2010 飲み
http://atnd.org/events/9071 参加した.
電車の中で場所を確認しようとして開始が18:30になってることに気づいた.六本木とか歩き回るのも怖いので,マクドナルドでハンバーガー食べながら待ちました.
以前から互いに名前は知っているけど,実際に会うのは初めてという方や,実はあの時のあのチームの人だった人とか,その界隈で有名な方々が集まってて,楽しい飲み会でした.
言語処理系の話から,ARMのバイトアライメントの話やら,バージョン管理に至るまでコアな話題で盛り上がれることって会社でもなかなか無いかもなぁ.とりあえず,バージョン管理はCVSとSubversionしか知らないことに危機感を覚えたので分散リポジトリな何かを使ってみよう.gitは少し使ってみて面倒に感じてしまったので,mercurialかなあ.
ICFPのコンテストの内容はほとんど忘れていたけど,やっぱり反省点は早いうちに自動化に手をつけなかったことでした.とりあえず全部意味が分かってから真面目に書こうと思っていたら,コンテスト終了直前になってようやく意味が分かって,試しに何台か車をsubmitした瞬間に,他のチームがその車に対して燃料をsubmitしてくる様子を見て絶望しました.
昨日,帰ってきてからの記憶が全く無い.着替えもせずにそのままベッドに倒れていた.
Android Marketのダウンロード数って何時更新されるんだろう.なんとなく毎日更新されてた気もしたけど,昨日は更新されてなかった.もうすぐニコニコPlayer(仮)がネギアンテナのDL数を抜くな.
*[Android] ニコニコPlayer(仮)
朝,Playerを少しいじろうかと思ったけど,良く考えたらメンテナンス中だった.早朝からお疲れ様でした.
ニコニコ動画ってメンテナンス中はちゃんと
503 Service Unavailable
で返すので素晴らしいのだけど,今作ってるプレーヤーはちゃんと実装してなくてただログイン失敗としか出してないのが悲しい.なので,いい加減だけど,ログイン失敗と接続エラーと503が帰ってきた時のメッセージを別のものにしてみた.Marketのコメント見たらログインできなくて困ってた人いたみたいなのでメンテナンス前にやれよと言われそう.
ついでに,原宿で検索結果のHTMLが変わりそうだったので見えなくしていた検索機能が問題無さそうだったので,使えるようにして公開.
更新が頻繁すぎる気がするので,そろそろ致命的な問題以外は週1くらいのペースでアップデートするようにする予定.
土日でランキング系の実装をもう少しするかなぁ.…と思ったのだけど,日曜はすでに予定が入っていて,土曜日はほぼ寝ていそうな気が.
というわけで,今日は少しだけ早めに出社.
眠い.あまりに眠いせいで,mp4じゃない動画もAndroidで再生できる夢を見てしまった.ただ,ググってもやり方あまり詳しく書いてないな.困る.うわさによるとiPhoneアプリは更新されたらしいのだけど,情報が少ない.
メモ:http://feather.cocolog-nifty.com/weblog/2009/09/iphoneipod-to-1.html
朝になんか目が覚めたついでに,少しプログラム書いたりする.
試しにAndroidでSQLiteを使ってみる
初めてSQLite使うこと自体,ほぼはじめてなので色々嵌るかと思ったけどすんなり実装できた.基本的には,SQLiteDatabaseのinsert()やupdate()みたいなメソッド使えということか.SQLiteStatementをそれらのメソッドにも渡せるかと思ったけどダメっぽいな.
ただ,思ったより遅いなぁちょっとした事でも0.1秒くらいかかったりする.AsnkTask必須か.
最初,
キャッシュから読む→とりあえずUIに古い情報を表示→バックグラウンドでデータ読み込み→UI更新→キャッシュ格納
という流れを想定していたのだけど,これはもう1つのAsyncTaskに全部入れてHandler経由でUIにデータ渡すのが良いかもなぁ.
というわけで,最近早朝にプログラム書いて,昼まで寝た後に会社に行くという生活になりつつある.
頭痛と鼻水が昨日から止まらず.風邪か.一応風邪薬飲んで会社に.
昨日は帰ってから調子悪くて何もできず,とりあえず目の前にあったapkファイルをmarketにアップロードしてみたりしたのだけど,ろくに確認してなかったので変なバグを増やしてしまった.
週末に直そう.
寝る.
KDDIのau one Marketって法人しか登録できないのか.さすがに,他社名義で売るといろいろ問題がありそうだし,うちの会社で登録してくれないものか….
*[Android] ニコニコプレーヤ(仮)
2日で1021ダウンロード.まだ,ネギアンテナの方がユーザー数多い.
今日は会社行く前に,ランキングのカテゴリ選択と,IntentでwatchページのURL受け取る部分を実装しました.週末までは次のバージョンを公開します.
http://www.taosoftware.co.jp/blog/2010/04/android_intent.html
まさしくこれが気になってたので,後で設定できるようにしよう.
寝る前にアップデートしておく.0.1.2.KARI
-
イレギュラーな操作で強制終了する箇所を減らす
-
未対応形式のときに0byteのキャッシュファイルができるのを防止
-
未対応形式ならコメントのロードを始めないように
-
再生中のエラーの場合に再度最初から再生できるように(仮)
-
高画質なmp4も再生対象にして,再生可能動画を増やした
-
インテントでwatchページのURLを受け取れるように(設定必要)
-
コメント投稿時にセッション切れてた場合再ログイン
-
ランキングでカテゴリ選べるように(仮)
-
再生中にドラッグ(?)で10秒ずつ移動できるように(仮)
-
あと色々バグ修正…忘れました
仮のやつは個人的な利便性のためにその場凌ぎの実装したので後でちゃんと見直す予定.
*[Android] ネギアンテナ
3本目のネギがいつも消えてるので少し調整.
ついでにネギアンテナを3G以外に対応してIS01とかで動くようにバージョンアップ.
Android Marketからダウンロードできます.
社内LTのために早く行く.月曜日は休みだったり色々で何か久しぶりだな.
*[Android] ニコニコPlayer(仮)
ニコニコPlayer(仮),1日で結構ダウンロードされてるな.1日目は555ダウンロード.
使ってくれる人いるみたいだし,もう少し頑張るか.まずは,マーケットのコメントに係れている問題からどうにかします.
TODO
-
イレギュラーな操作で強制終了する箇所を減らす(作業中)
-
未対応形式のときに0byteのキャッシュファイルができるのを防止(作業中)
-
mp4の高画質動画も再生候補に(作業中…しばらくはプレミアム専用になるかも)
-
ランキングやマイリストを毎回取ってるのでキャッシュする
-
ダウンロードが追いつかないor接続が切れたときの処理追加
-
フリーワード検索
-
ランキングのカテゴリと期間を選べるようにする
-
インテントでwatchページのURLを受け取れるように
-
コメントも一定期間キャッシュしたい
-
再生できる動画を増やす
-
最初のメニュー画面をちゃんと作る
上の方が個人的に優先度高いです.下の方は未定.
自分のマイリスト見たら,少し前の動画だとmp4でアップロードされててエコノミー用がflvに変換されているものが結構あったので,その場合はオリジナルのmp4を使うのをためし中.プレミアム会員じゃないと,時間帯によって参照するファイルが変わってキャッシュ周りが面倒なので見送るかも.デフォルトで高画質なmp4を使うのも考えたけど,端末スペックが心配なのでオプションにしようかなぁ.
VideoViewのgetCurrentPositionが不正確な値を返すことがある気がする….
メモ:mp4かflvかは,getthumbinfoで分かる.watchページの中を見るとか,ファイルURLのパラメータから一応判定は出来るけど,このAPI使うのが一番良いかなぁ.
けど,getthumbinfoはeco=1を受け付けないので,やっぱりgetflv頼みかな.
*[Android] ニコニコPlayer(仮)を公開
とりあえず,Android用のニコニコ動画プレーヤを公開しました.
そろそろ別のことに手をつけようと思ってるので,公開しておかないとお蔵入りしてしまう可能性が高かったので.あと,最低限自分にとって必要な機能はもうあるので,フィードバックがないと開発のモチベーションが保てないかも.
*[Android] ImageButton
ImageButtonはButtonじゃなくてImageViewのサブクラスなのか….せめてボタン的なinterfaceを用意しておいて欲しかった.まぁ,ちょっと気持ち悪いけどViewとして扱っておけばほとんど困らないか.
アンドロイドマーケットに登録するとき,アプリ名が日本語だと文字化けしてて,どうやって日本語にするのか分からなかったのだけど,文字化けしてるのはアップロード画面だけで,そのまま公開しても害が無いみたい.
Inkscapeで画像作成する日.
明日は前から作ろうと思ってた別のものに手をつけよう….
なぜ,今日が金曜日なのか?曜日を間違っていたせいでミーティングに遅刻してしまった.
phpDocumentorのカスタマイズ面倒なので,リフレクションを使ってドキュメントを生成するツールを作る.
リフレクションのためにrequireすると副作用がある可能性があるのが問題だよな.使い捨てのネームスペースとかに閉じ込める手段があれば良いのに.まぁ,今回はそのプロジェクト専用なのでその辺の汎用性は無視する.
*PHPのpreg_*系の正規表現
以下のコードをPHPで実行するととても時間がかかります.さらに,str_repeatの数を2000くらいにすると,PREG_RECURSION_LIMIT_ERRORになりnullが返ってきてしまいます(この時は一瞬).(PHP5.2.13と5.2.9で確認)
$str = str_repeat('abcdefghijklmnopqrstuvwxy',1000);
print strlen($str);
$str = preg_replace('/[a-y]+(z+)/','', $str);
print "preg_end\n";
print $str;
PHPのバグなのか,PCREの仕様なのか….もしかして,PCREってあんまり賢くないのかなぁ.よっぽど愚直な実装でない限り,この正規表現は線形時間で済むはずだけど….
ちなみに,Perlで同様のことをしても一瞬で正しい結果が得られます(あたりまえですが).
先週秋葉で買ったAndroid端末のシェルがなぜかrootなことに気づいたので,キーレイアウトを変えようと思ったのだけど,真ん中のボタンはもっと低レベルな所で電源に割り当てられているらしくダメだった.やっぱりハードウェアいじる方が早いか.
*bashを使う
今までずっとcshをメインに使っていたけど,そろそろbashにすることにする.cshは日本語入力のトラブルが少なかったのとFreeBSDから入ったので使っていたけど,さすがにもうbashでもいい気がする.
とりあえず,.inputrcを設定.
set convert-meta off
set output-meta on
set input-meta on
"\C-p": history-search-backward
"\C-n": history-search-forward
"\e[A": history-search-backward
"\e[B": history-search-forward
これで,cshみたいにコマンド履歴からも補完できるようになった.
3年前にも同じようなこと書いてるな…
*java…
まだjavaとか良く分からないのですが,プログラムの奥底でthrowされた例外を,浅いところでcatchしたいときってRuntimeException使っていいんだろうか.例外が追加される度に,間にあるメソッド全てのthrowsに例外を追加して回るとかおかしいし,特定のExceptionのサブクラスだけ使うようにするのも,場合によっては綺麗にまとまらない.
昨日買ったAndroid端末のUSBが初期不良っぽいので,あきばおーに持っていったら付属のケーブルが原因だったっぽい.換えてもらったら問題なくなった.
*秋葉原で安いAndroid端末買った
あきばおー覗いたらAndroid端末がたくさんあったので,つい買ってしまった.M701(たぶんE7002と同じもの)とかいう7インチの端末にした.ぱっと見は,前からあるiPadの偽者みたいなやつですが,Android2.1以上のやつはあんまり無くて,少し高くなってしまった.あと5000円出せば2.2のやつもあったけど,とりあえずこれで良いか.
既にDesireがあるので2万円出す価値は無かったかもなぁ.感圧式のタッチパネルなので,操作感はいまいち.画面も大きくなったけど解像度はDesireと大体同じだし,安い液晶特有の色合いが微妙.まぁDesireのディスプレイと比べるのはかわいそうですが.動作も軽快とは言えない.
何より我慢できないのが,iPadとかを意識してつけたと思われる真ん中のボタンが電源ボタンだということ….サイドに,メニューボタンと戻るボタンを兼ねたスイッチがあるけど,ちょっと使いにくい.これは後で物理的に改造してしまおう.
とりあえず,色々入れていじってみる.
adbのドライバが無くて困ったけど,デバイスマネージャでPIDとVID調べて,SDKと一緒にダウンロードしておいたドライバのandroid_winusb.infのGoogle.NTx86セクションに追記したらOKだった.
[Google.NTx86#1287304665]
; M701
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_DEED&MI_01
ニコニコ動画も見てみたけど,ビットレートが高い動画意外はなんとか見れるかな.
しかし,なぜかUSB繋いでると電源が落ちたり変な動作する.初期不良っぽいな.
最近明らかに仕事で書くコード量より趣味で書く量の方が多いので,趣味プログラマに逆戻りかもしれない.
*[Android] ニコニコ動画プレイヤー
一応,ue,shitaコマンドには対応.なんとなくマイリストから動画を削除する機能も付けた.
戀塚さんに見せたら,パッと見でコメントのアルゴリズムが少し違うと指摘されてしまったのでもう少し真面目に実装するか.
少し真面目にニコニコ動画の画面と見比べた感じだと,自分が思っていたよりは似たような結果になっていました.ただ,違う箇所もあったのでそこから直すか.
*gwt
GWTで生成されたjsを少し読んでたのだけど,読みにくいので読みやすく変換してくれるツール無いのかなぁ.
*java
クロージャーとまで言わないけど,無名関数くらい使えるようになって欲しい….匿名のインナークラスで代用するとか,気持ち悪すぎる.クラスってそういうものでしたっけ?
言語の学習コストを低く抑えるためには仕方ないのかもしれないですが,プログラミング言語の学習コストなんて,実際の開発コストに比べたら微々たるものだと思っているので必要な機能は入れて欲しいなぁ.
javaに比べてPHPは学習コストを上げずに色々な機能を盛り込んでてすばらしい言語ですね.
ただ,C++くらい色々詰め込んでしまうと,やっぱり大変な気もするので,特定のパッケージをimportすると言語が拡張されるとかにしてくれないかなぁ.…あれ?それってperlか.lispとかもある意味そんな感じですね.
寝坊して16時過ぎに出社.寝坊したと言ったら,いつもとそんなに変わらないと言われてしまった….
*[Android] ニコニコ動画プレイヤー
飽きそうでしたが,とりあえずコメント投稿とタグ検索を仮実装.今見てる動画のタグ一覧すら見れないのは不便だな.プレイヤー画面のUIをそろそろどうにかするか.
やることメモ
-
動画の説明文の表示
-
再生画面のUI
-
マイリスト管理(移動・削除)(気が向けば)
-
mp4以外の動画対応(気が向けば)
ボリュームキーで変更される音量
VideoViewの上にいろいろ被せていると,VideoViewにフォーカスが無いタイミングでボリュームキーを押したときメディアの音量のつもりが着信音量が変わってしまって困ってました.これは,実は簡単に解決可能だった.
WindowやActivityのsetVolumeControlStream()メソッドでボリュームキーで何のボリュームが変更されるのかを設定できました.フォーカスによって変わるので,Viewにあるものとばかり思って探してたのですが,VideoViewの場合MediaControllerが中で変更してました.
http://jp.techcrunch.com/archives/20101009google-automated-cars/
人間よりも上手く自動運転する技術は8年も待たずとも手に入るでしょうけど,問題なのは人間より上手いレベルでは受け入れられないんじゃないかということです.
例え事故を現状の半分にすることができても,自動車を作る側からすると,事故が起きたときの訴訟リスクがとても大きくなるので,やりたがらないんじゃないかな.技術的な目処が付いた時点で,なるべく早く法律のほうをどうにかしないとですね.
そう考えると,まずはバスやタクシーからかなぁ.
*[Android] ニコニコプレーヤー for Android
昨日寝る前に少しいじったのでアップロードしなおしておきました.
-
コメントの配置を少しだけまともに
-
色つきのコメントに対応(shita,ue,big,smallはまだ)
-
ダウンロード完了まで再生を待つように(再生ボタン押せば途中でも再生可能)
-
見ている動画をマイリストに追加できるように
-
soXXXXXXX形式の動画IDはgetflv通らないので変換するように
-
threadkeyとthread_leaves対応(仮)
最後の2つはチャンネル動画のための処置.
サーバーがリーフ対応してるかどうかの判定方法がググった感じだと良く分からないのですが,とりあえずなんとなく大丈夫そうだったので常にthread_leaves付けるように.ただ,res_fromも一緒につけると二重にコメントを取得してしまうようなのでちょっと気になる.
作り始めて一週間経ったので,そろそろマーケットに登録したいのだけど,自分好みのプレーヤが無いからと作り始めたのに全く目的を達成していない.
とりあえず最低でも公開前にやることメモ.
-
タグ検索,キーワード検索
-
コメント投稿
-
UIまともに
間違って文字列と配列を比較するというバグで30分近く無駄にした.
javaって演算子のオーバーロードが無いせいで,比較したいだけなのにequals()使う羽目になるのは我慢できるようになってきたのだけど,あからさまに違う型のものを入れてもコンパイル時に何も言われないのが凶悪だなぁ.Object型とか使えなくして欲しい.
*[Android] ニコニコプレーヤー for Android
一応,ランキングとマイリストにサムネイル出すようにしたり,動画をSDにキャッシュするようにしたりしました.
実装がまだいい加減なので,SD等の外部メモリー刺さってないと再生すらできません.
案の定飽き気味なので,ソースとかを公開しておきます.
NicoPlayer.zip
GPL扱いならご自由にお使いください.GPLは困るという人はご相談を.
制限
-
mp4以外の動画は再生できない
-
ダウンロードが再生に追いつかないと途中で止まる
-
コメントの位置は
ランダムいいかげん (見苦しいので一応並べるように)
-
コメントできない
-
色々
たぶん,そのままだと使い物にならないので,適当にいじってください.
ダウンロードしながら再生できるように作ろうとしてたのですが,あんまり意味無さそうなので,完了後に再生開始するようにする予定です.それなら,mp4以外はffmpegで変換するようにしたほうが良さそう.
いつの間に寝たのか記憶が全くないのですが,13時間くらい寝てしまった.
15時からミーティングなのに起きたら14:40分だった.急いで会社に.そして今日は20時からオフィスのレイアウト工事するらしいので,早く帰らないと.仕事が出来なくてとても残念ですが,仕方ないです.
それにしても,半年ごとに社内の模様替えが行われて,席が増えることと引き換えに会議室が少なくなっていく.そろそろフロア増やさないと限界じゃないかなぁ.会議室が減るのも気になりますが,このまま人数増えると個人のスペースが狭くなるんじゃないかという心配が.きっとその前にどうにかしてくれるんでしょうけど.
なんか<禁則事項>な噂も聞いたので早いとこ Android のニコニコプレーヤをα版として公開してしまおう.
火曜日までとても忙しかったので,疲れました.あとは,色々失敗してしまった事の後始末をしなければ….お金が絡むものはとても面倒.
今日も早めに起きてAndroidアプリ開発.
ニコニコプレーヤ(仮)でコメント表示できるようになった.配置とかランダムだけど.ここまで来るのに3日.それなりに予備知識はあったつもりだけど,結構しょうもないところで躓くなあ.
*[Android] 画面の向きが変わったときの処理+SurfaceViewのサイズ変更
スクリーンの向きが変わったときにViewの大きさや座標を変更したくなったので,まず,Config Changeにorientationを入れてonConfigurationChangedが呼ばれるようにしました.これで,Activityが作り直されることも無くなります.
…onConfigurationChangedって,レイアウト変更前に呼ばれるのか.これだとViewの座標やサイズが得られないので今回は無理.
仕方ないので,ViewGroupのonLayoutをオーバーライドして自分したけど,こんどはVideoViewがいうことを聞いてくれない.なんだか,VideoViewのSurfaceが再作成されるタイミングとViewのレイアウトが変更されるタイミングに違いがある気がする.
後からinvalidateとかlayoutで簡単にできそうなものだけど,実際に変更が無い場合はダメみたいです.
定期的に画面が縦か横かチェックすれば問題ないのだけど,なんだか嫌なのでもうすこし調べよう.
追記:
少し調べたら
http://www21.atwiki.jp/memodroid/pages/26.html
こんな情報が.面倒なので,他に強制的にレイアウトが変更される場合を探したら,ウインドウのフラグとかでもできそうな感じ.とりあえず,画面の向きが変わるたびに,WindowManager.LayoutParams.FLAG_FULLSCREENを変更することにした.横向きはフルスクリーンにしたかったし一石二鳥.
朝4時に起きてプログラム書く.気づいたら15時前だったので急いで会社に.
一日10時間は趣味に費やしたい.そして最低でも9時間は寝たい.ご飯食べたりその他いろいろに2時間は必要だから,残り3時間か.3時間労働でやっていくにはどうしたらいいんだろ.
*[Android] ニコニコ動画プレーヤ for Android
少し真面目に作りはじめた.
とりあえず,マイリストとかランキングとかを取得して動画を選べるようにする.ランキングはJSONで返すAPI無いのか.RSSで取得してみたけど,とても遅い.なぜかTOP20とか言いながらもっとたくさん返ってくる.(たくさん帰ってくるのは指定しないと各カテゴリから20件になってたからでした)
あと,やっぱりVideoViewがすぐにタイムアウトするので,バッファリングしてから再生開始する必要があるなぁ.
今日中に飽きたりしなければスクリーンショット載せます.
次はコメント表示かな.社内のコードを使わない縛りの開発ってなんか不毛だけど仕方ない.
ニコニコ動画のAPI解析してくれてるサイトが色々あって素晴らしい.大抵のことはググれば出てくるから安心して使えるけど,やっぱり外から見えるものだけだと少し不便だなぁ.
眠いので23時頃帰る.
今日は19時過ぎに出社して、明日まで色々やる予定。これでかなり楽になるはず。
*[Android] VideoViewでニコニコ動画を再生する
VideoViewはURL渡せばダウンロードしながら再生してくれて便利なのですが、Cookieを渡せないという問題があります。最新のAndroidのソースを読む限りだと、リクエストヘッダーを指定できるメソッドが見え隠れしていますがSDKでは公開されていないので使えないようです。
方法を探りましたが無理っぽいのでさっさと諦めてCookieを付加するHTTPプロキシを通すことにします。ただ、外部サーバーが必要なのは面倒だし、ユーザーのセッション情報を管理するリスクは避けたいので、Androidアプリ内部でプロキシサービスを実行しておいてlocalhostにつなぎに行くようにしました。
気を付けないといけないのは、VideoViewはHTTP1.1必須で、たとえAccept-Rangeヘッダが無くても未ダウンロード位置にシークするとRangeリクエストしてくることです。まぁ、ニコニコの動画サーバにそのまま投げれば良いだけですが。
あと、接続をacceptしてから、レスポンスを返すまでに時間がかかるとすぐに「再生できません」とか言い出す気がするのでとりあえず何か返すのが良いかもしれません(あまり確認してないですが)。
コメントを動画に重ねることも出来るので、あとは特に問題なくプレーヤー作れる気がします。
ただ、自分で作ってる時間は今のところない…
@dabits がAndroid用のプレーヤーのソースを公開していたのを思い出したので、上記のプロキシを入れて送りつけておきました。
後から気づきましたが、長い動画だと再生中にCookie内にある再生期限が切れてシーク等で再接続が入ると失敗するな。定期的にwatchにアクセスして更新するか。ちゃんとキャッシュするようにすればよっぽど遅い回線じゃない限りタイムアウトしない気もするのでそっちもやろう。
昨日やった仕事は確認しながらかなり慎重にやったのだけど、微妙にミスがあった…。
Android用のニコニコアプリで良い奴が無いなぁ。作るか。
会社でもVideoViewがCookie渡せないから直接再生できないという噂を聞いたけど、
*休日出勤
月曜までに終わってないとまずい仕事があるので会社で作業。人が少ないと集中できて良いですね。
作業手順書とか、大量のSQLとか、ちょっとしたシェルスクリプトとか。
単純にやたらと面倒くさくて、しかも間違っていると面倒なことになるというのは嫌な仕事だなぁ。
とりあえず、ファイル名とか間違う単純ミスが怖いので手順書とSQLやシェルスクリプトの参照関係を出力するプログラムと、作業開始時に想定したデータがきちんと揃っているかチェックするスクリプトを書く。
一回しか実行しないのだけど、取り返しがつかないので準備が面倒。