2010-11-28 (日)
Androidを色々いじってたら,ホームアプリがおかしくなって何も出来なくなったりして,全部初期化.ついでにアカウントも変える.
この日記はフィクションです.登場する人名・団体名・地名・職業などはぜんぶ架空のものです. なので実際のものとは何も関係がありません. それから,写真のように見える画像はCGもしくは念写によるものです.
Androidを色々いじってたら,ホームアプリがおかしくなって何も出来なくなったりして,全部初期化.ついでにアカウントも変える.
そろそろAndroidの本を何か買ってみるかなぁ.とりあえず触ってみようと思って遊んでいると,本などを買うタイミングを逃すことが多いです.
一部動画が再生できなくなってしまっていたので,少し早めにアップデートしておきました.あと,前のバージョンからですが,sm9だけ実験のためにmp4じゃなくても再生します.まだ実装中なのでシークすらできませんが.
公開してから一か月間のDL数のグラフ.
やっぱり,1日500DLくらいで安定している.
実際に使い続けてくれてる人は,60%くらいっぽい.
ニコのアカウントもAccountManagerで管理した方がいい気がするけど,自分のアプリだけ対応しても仕方ないので少し考え中.
ニコニコPlayer(仮)を少しいじっておく.flv以外の動画を再生してみるテスト中.
前回のアップデートで公式チャンネルの動画が再生できなくなったというコメントがあったのを思い出して,原因らしいものを直す.動画情報取得回りをいじったのでその関係かと思ったら,違うところだった.
(仮)の次は(β)にするつもりだったけど,変えるのいまいちかもなぁ.
今日休み取ってる人多いなぁ.4連休にすれば良かったかも.
昼過ぎに起きる.最近,12時間くらい寝てるな….
行ってきました.はやぶさの実物大模型がとても目立ちますね.
一回りしてから,eldeshとGazyuと合流.
UDXで夕食.もつ鍋食べた.
Desireの画面に貼っていた保護フィルムが傷だらけになってきたのでヨドバシで買う.サンワサプライの反射防止のやつを買って貼ったらせかっくの綺麗な画面が残念な感じになってしまったので,光沢の方をもう一枚買っておく.
公開しました.今回は時間が無かったので大きな変更は無いかも.mp4以外の動画に対応する準備のため,色々いじってます.
ただ,あえてデバッグ用の機能を殺さずにアップロードしたので,隠してある作りかけの機能とかを探してみるのも良いかもしれません.
Firefox Developers Conferenceに行く予定だったのだけど,すっかり忘れて秋葉原をふらふらしていた.まぁいいか.
16GBのmicroSDを買った.3000円で買えるのか.
昨日は早めに寝たので12時間以上眠れた.
ニコニコPlayerのアップデートするつもりだったけど,今週はそんなにいじってないし明日でも良いかなぁ.
Android Marketのアプリケーションの管理画面がまた変わってるな….解像度の高いアイコンとかよりも,早く日本語が化けないようにして欲しい.
http://cekirdek.uludag.org.tr/~ismail/ffmpeg-docs/adpcm_8c-source.html
ずっと寝たり起きたりしてたせいで,時間間隔がおかしいけど,とりあえず出社.
もしかして,Javaの匿名クラスは複数のインターフェイスを実装できない?
一時的複数のインターフェイスを持たせる必要があるけど,その処理特有の問題なので匿名クラスにしたいのに....IterableやSerializableすらつけられないのかな.
何か特別な理由があるのだろうか.クラスには名前付けろということなのかもしれないけどちょっと納得いかないな.
風邪.
吐き気がして朝の9時頃に起きてしまって,まだ眠いのだけど気持ち悪くて寝れなくて困っていたら案の定熱があった.考えてみると昨日の夜からかなり調子悪かったな.インフルエンザとか怖いので念のため病院行ったけど大丈夫という結論に.
会社やすむことにしたので,家でおとなしくアニメ見たりプログラム書いたりして充実した病人生活を送ろうと企んでいたけど無理そう
会社から帰ってきて何もせずにそのまま寝る.
昨日苦労して入れたrubyが動かなくなっていた.
cronから起動してた多くのスクリプト達が
failed to allocate memory (NoMemoryError)
とか言いながら死んでいる.再度rubyを入れなおしたら動いたけど,なんなんだこれ.
情報探したら,
CentOS 4.7 では prelink が ruby 1.9.1 のバイナリを破壊する
というものが….これっぽいな.
今までFreeBSD以外のサーバーを真面目に運用したことないのだけど,Linuxってこういうトラブル多いのかなぁ?
それにしてもVPS上にみんな移してしまって良かったのか少し考えてる.ネットバンクのパスワードを握っているプロセスとかが普通に走ってるからなぁ.ネットバンクも必要な権限だけOAuthとかで認証できるようになってほしい.
Android-x86 Projectが結構活発だなぁ.後で試しに入れてみるか.
vpsの環境を少し整える日になった.ruby入れたりapacheの設定書き直したり,移行したら動かなくなったスクリプト類を直したり色々.
金曜日に公開したニコニコPlayer(仮) 0.1.6にログイン失敗すると強制終了してしまうバグがあったので慌てて修正した.デバッグ用に入れてたコードが原因でNullPointerException起きてた.
ついでにいくつか修正.
何時の間にやら10,000ダウンロード.
EeePCで運用しているサーバが動いたままガラクタと一緒にダンボールの中に放り込んであったのですが,熱がこもって火事の原因になったらいやだなぁと思って掘り出す.ディスプレイ見たら,ディスクが読めない系のエラーが大量に出ていた.uptimeみたら233日間放置していたっぽい.
で,最低限のバックアップ取ってから再起動したら,案の定起動しなくなった.
というわけで,家のサーバで動いている怪しいデーモン類をVPSに移動することに.
スクリプト類をコピーしたら動かなくなって,よく見たらrubyが1.8だった.
CentOS上のrubyを最新版にする.
yumでは1.9をインストールできなかったので,rpm作るためにcheckinstallを….
http://packages.sw.be/rpmforge-release/
にあるcheckinstallがダウンロードできない….
http://futuremix.org/2009/01/centos5-x86_64-checkinstall-rpm
x86_64なCentOS用のrpmを公開してくれてる方がいたので,少し古い化も知れないけどこれを使う.
で,とりあえずrubyのrpm作ってインストール.
gems使おうと思ったらzlibが無いとか言われて,ライブラリのパスとか確認するが,ある…ってzlib-develが入ってないのか.
わけも分からず色々やり直したりしたけど,結局rubyのソースのext/zlibだけインストールすれば良かったっぽいことを知る.opensslとかも同じように入れる.
今までFreeBSDのportsに頼ってたのでLinuxのパッケージは面倒に感じてしまうな.
無事ruby1.9.2に出来た.いままでは1.9.1で動かしてたのだけど,正規表現の/~/nがASCII-8BIT以外に使えなくなってしまった気がする?よく分からないので,深く考えずに全部force_encodingを入れてしまう.gemsで入れたhttpclientとかも同じ原因で動かないので,それも適当にいじる.
あとは,データをコピーして,cronとかの設定して様子見.問題なく動いてくれると期待.
寝る.
ページの文章を書き換えて楽しむグリモン書くときは,textareaとinputを除外したほうが良いと思った日.だけど,そうなると面白さは半減するなぁ.
とりあえずリリース.今週はあまり触れなかったので大きな変更はないかも.
(実は前のバージョンから入ってた機能だけど,メニュー画面左上のテレビちゃんもどきを長押しすると…)
8時間くらい寝てるのだけど,疲れが取れないなぁ.
5年前に着メロ解析してたときのプログラムを発掘して,デコードしてみた.
実際に再生してみたいところだけど,エンコーダーのテスト用に作ったプログラムなので,wavで出力する機能が付いてなかった.ただ,微妙に波形が怪しい.まぁ,エンコーダも結局ちゃんとしたものが作れなかった記憶があるので,まともな実装を探してみよう.
新宿で肉を食べた.
画面が小さい端末でもそれなりに見えるようにCSSとテンプレートを少し修正した.日記は面倒なので後回し.
ニコニコPlayerのコードを少し整理する.ついでに少し高速化とかも.
いいかげん,正規表現やめてXmlPullParserでxmlをパースしようと思って,試しに書いてパフォーマンス見てみたら遅すぎて使う気にならなかった.多少コードの見通しが良くなるけど4倍近く遅くなるのを考えるとなぁ.
メモ
iPhoneとかが使ってるインターフェイスにアクセスしてみる.
iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2)
iPhoneとか持ってないので,この記事がとても参考になりました.
最初はデータ生成するからちょっと待て(?)といわれるので,数秒置いて同じリクエストを送るとデータが帰ってくるようです.
間違ってるかもしれませんが,chat_get=0で情報を取得したあと,chat_get=1とかにして動画データを取得できるようです.
取得したデータを見たら,動画情報,コメント,音声,jpeg,jpeg,音声,jpeg,jpeg,音声…という風に格納されていました.データの先頭にサイズが入っているのでパースするのは簡単そう.
音声部分は,生のPCMではないようなので,ニコモバの資料にある通りADPCMでしょうか.ADPCMと一言で言ってもフォーマットがいくつかあるので困りますが.
詳細な説明を書きたいところですが,なんかダメな気もするので我慢.
必要なモジュールは適当に入れてください.
#!/usr/local/bin/ruby -Ke # -*- coding: ascii-8bit -*- require "rubygems" require 'httpclient' require 'kconv' account = { 'mail'=>'hoge@exsample.com', 'password'=>'*******' } vid = 'sm9' client = HTTPClient.new res = client.post('https://secure.nicovideo.jp/secure/login?site=nicoiphone', account) if res.content !~ /status="ok"/i || res.content !~ /<ticket>([^<]+)<\// print "TICKET ERROR\n" exit end ticket = $1 print "ticket: #{ticket}\n" res = client.get_content('http://i.nicovideo.jp/v2/login?ticket='+ticket).toutf8 if res !~ /status="ok"/ || res !~ /<session_id>([^<]+)<\// print "LOGIN ERROR\n" exit end sid = $1 print "sid: #{sid}\n"; res = client.get_content("http://fence.i.nicovideo.jp/v2/videostatus?video_id=#{vid}").toutf8 print "status: #{res}\n" res = client.get_content('http://fence.i.nicovideo.jp/v2/gate?video_id='+vid+'&sid='+sid,nil,{'User-Agent' => 'iPad'}).force_encoding('ascii-8bit') if res !~ /tid\x00.([^\x00]+)\x00.*psvr\x00.([^\x00]+)/m print "GATE ERROR\n" exit end tid = $1 psvr = $2 time = 0 begin res = client.get_content("http://fence.i.nicovideo.jp/v2/play?transmission_speed=0&sound_quality=16&frame_rate=8&chat_get=1&video_id=#{vid}&sid=#{sid}&network=wifi&thread_id=#{tid}&date_time=#{time}&play_server=#{psvr}&initial=1").force_encoding('ascii-8bit') p a = res.unpack('a4NnnN') if a[0] == "DNOP" && a[2] == 2 print "wait...\n" sleep 1 elsif a[0] != "DWNG" print "header: #{a[0]}\n" exit end end while a[0] == "DNOP" && a[2] == 2 pos = 0x14 + a[5] frame = 0 while pos+6<res.length do block_info = res[pos,6].unpack('nN') p pos p block_info if block_info[0] == 0xCB foo = File.open("#{vid}_#{sprintf("%04d_%02d",time,frame)}.adpcm",'wb') foo.write res[pos+6,block_info[1]] foo.close end if block_info[0] == 0xC8 foo = File.open("#{vid}_#{sprintf("%04d_%02d",time,frame)}.jpg",'wb') foo.write res[pos+6,block_info[1]] foo.close frame+=1 end pos+= 6 + block_info[1] end
ysaotomeが会社を見学しにくるというので,社内を案内したりした.
アップデートした.
一週間空くと,自分では何が変更されたのか覚えてないな….
とりあえず今後のバージョンに入れたいと考えてる機能を.まだ考えてるだけですが.
キャッシュを個別に消したいという人もいると思うので,実装はする予定です.ただ,キャッシュは自動的に消えてくれるべきだと思うので,特定の動画だけいつでも見れるように消す対象から除外とかになるかなぁ.
ただ,オフライン再生はニコニコ側で削除された動画も見れてしまったりするので実装しない気がします.
これを実装したら(仮)から(β)にしても良いかなと思っています.
デコーダをjavaで書くのは現実的じゃない&ffmpegで変換しないと再生できないのはなんだかいやなので,iPhoneで以前から使われていたモバイル用のデータ使うかもです.画質が悪いのと,ネット上の資料が少ないのが問題.かといって,社内の資料使って作ってしまうと問題だし.普通に解析できるとは思うけど,なんだかなぁという気分が開発の邪魔をしている.
他にも細かい部分をたくさん直したいのだけど,時間が足りないかも.気長にやります….
昼に起きて,午後は昼寝.気づいたら外が暗かった.買い物行ったり.
ADTのLayout Editorでレイアウトを確認しながら画面を作れると便利なのですが,こいつは日本語が表示されるボタンとかがあるとレイアウトが崩れてしまって使い物にならないです.
結局xmlを直接書いていたのですが,下のURLのページ見て,半角スペースを前後に入れたらちゃんと表示されるようになりました.strings.xmlとかで文字列を管理しているなら,全ての文字列をスペースで囲って,リリース時には消すようにすれば良さそう.どうせスペースは見えないし消さないのもありかも.
今日は12時に起きたので,会社に行くまでに少しニコニコPlayerをいじる.
ランキングのキャッシュ回りを少し直して,サムネイルのキャッシュも実装してみる.画像のキャッシュはSQLiteよりファイルシステムの方が読み込み速いし,変な条件で検索することも無いから単純にファイルベースで良さそう.あとは,少し様子みてからマイリストもキャッシュするようにしよう.
今週は水曜日が休みらしいのでもう少しいじって,木曜か金曜に最新版を公開する予定.
月曜日は眠い.
Android Marketのエラーレポート便利だな.
いままでは面倒なのでアプリケーションが落ちても送信してなかったのだけど,開発してる側からするとデバッグがとても楽になるので,今度からは送信しよう.