秋葉原でごはん.買い物して,ヨドバシと書泉ブックタワー
Bluetoothヘッドセット欲しかったので,ためしにLogitecのPCHP02を買ってみたのだけど音質は期待してなかったので良いとして,結構音が途切れる.同じ部屋の中でも2mくらい離れると不安定になるなぁ.Class2のBluetoothって10mくらい届くんじゃなかったっけか.
*Chrome
FirefoxからChromeに乗り換えようと思って色々試行錯誤中.微妙に色々足りなくて満足できないなぁ.自分で拡張作るか….
最近,Google Code Searchのコードの表示がFirefoxだと重すぎて使い物にならなくなったのが,Chromeに移ろうと決意したきっかけなので,Googleの策略ではないかと思っている.
*boost勉強会 #4
土曜日はいつも寝て過ごしてしまうので,boost勉強会行ってみる.気軽に参加したら,朝10時からとか….eldeshがいた.
boostあまり使わないので普通に面白い話が多いな.
個人的にはboostで実装されてるような機能は,言語レベルでのサポートが欲しいと思う.それかテンプレートよりも自然な形で文法を拡張できる機能が言語に備わってれば良いのになぁ.
なんとなく,C++0xの様子を見るために,gccとVC++とBCC32で色々書いてたのだけど,BCCが0x以前のところで色々手ごわい気がする.
#include <iostream>
using namespace std;
class Foo {
public:
void a(){}
void a(int a){cout << "hello!" << a << endl;}
};
template<typename T>
class Bar : public Foo {
public:
using Foo::a;
void a(){}
};
int main() {
Bar<int> a;
a.a(123);
return 0;
}
このコードはBCC32でコンパイルできない.どうもテンプレート内でのusingで「コンパイラ内部のエラー」というエラーになるようなのだけど,C++にそんな制約あるんだっけか.それにしてもBCCのエラーメッセージは情報量が少ないですね.
僕のC++の教科書はVC++とgccなので,本来の仕様を良く知らない.
飲み会.
*ニコニコPlayer(仮)
アップデートしました.
昨日のニコニコ動画のサイトの更新から,キーワード検索の結果が上手く取得できなくなったので少し急いで対応.
もう少し後の予定だったのだけど,まだ作りかけの新しいUIも入れてしまいました.
UI変更
見た目が色々変わりました.レイアウト変更で,使いにくくなった箇所はこれから調整する予定です.
あと端末についてる検索ボタンから検索できるようになりました.
キャッシュ済み動画の再生を効率化
内部で色々やってる処理のうち,動画がすべてキャッシュ済みの場合には一部省くように.副次的な効果ですが,他のツールで変換したmp4をキャッシュディレクトリに入れておけばそれが再生できるようになってます.flvからmp4への変換を別アプリとして実装するかもです.時間があればですが...
キャッシュディレクトリの変更に対応
Galaxy S と Galaxy Tab は,外部ストレージとしてマウントされているフラッシュメモリの中にmicroSDがマウントされているという妙な構造になっていて,AndroidのAPIでディレクトリが取得できないので,その対応です.あまりテストしてないので,変に弄らない方が良いです.
不具合修正以外の更新はこんな感じです.
次のアップデートは,細かいバグの修正と,省メモリ化の予定です.余裕があれば,動画のバッファリング周りの改善もしたいなぁ.
*AndroidのListViewとaddHeaderView/addFooterView
ListViewに対して,addHeaderViewやaddFooterViewすると,自動的にWrapperListAdapterが生成されてよしなにやってくれます.
ただ,フッタやヘッダを選択不可にしたいときに,自分の管理下にあるArrayAdapterのisEnableでは出来ないのが不便.
結局HeaderViewListAdapterを自分で生成して渡さないとダメなのかなぁ.たぶん,getAdapter()で後から取得できるのですが,必ずHeaderViewListAdapterが使われているという保障があるのかよく分からない.
ArrayAdapterのgetViewの中でpositionの値で分岐してヘッダやフッタのViewを生成するという,とても嫌な感じのコードを良く見かけるのはこの辺の面倒くささが原因かも.
AndroidアプリはAndroid自体のソース読みながらじゃないと,まともに作れないのは早くどうにかして欲しいなぁ.
顎の腫れは引いてきた.言われていたより腫れなくて一安心.
痛み止め切れると,歯よりも頭が痛いような….
かなり痛い.顎がはれている.痛み止め飲んだ状態なら,ものが食べれそうなので,買い物行く.
熱は下がった.
親知らず抜いた.
抜きましょうと言われて4年経った親知らずが,虫歯になってそうだったので抜くことにしたのですが,大変でした.
昼に一度歯医者言ったら,夕方から時間をかけて抜きましょうということに.面倒な生え方してるので,大学病院とかで抜いたほうが良いらしいですが,今回を逃すといつ抜く気になるのか分からないのでやってもらうことに.
一度帰って抗生物質飲んで備える.
大変だよとは言われていたし,大変だからずっと放っておいたのですが.1本抜くのに2時間….
というわけで,自分は何もしてないのに,それだけで体力使い果たした.
そして,また熱があるのは,今度は親知らず抜いたせいかな….
体調はまだダメっぽい….熱のせいか,体中が痛い.
佐川の人に起こされた以外はずっと寝ていた.
そして今日はチョコレートと水しか口にしてない…なにかまともなもの食べないと.
* CyanogenMod7のNightly buildで再生できないmp4がある場合の対処法
CyanogenMod7のNightly build使ってるのですが,以前は再生できていたmp4が再生できないことがある気がしてきました.
再生しようとすると,「この動画は再生できません」といわれてしまいます.ログを見ると Parse errorとか言ってます.mp4コンテナの問題かと思ったのですが,色々見てるともっと先で起きている.デコードは全てハードウェアデコーダーでしてるもとの思ってたのですが,どうやらその前に色々チェックしているっぽい.
ソースで該当しそうなところを探したら,OMX core の H264_Utils.cpp あたりが問題っぽい.ストリームからヘッダなどの情報を取っているところみたいなので,ハードウェアデコーダーにデータが渡る前にはねられてしまっている.
たぶん,そんなに大きく仕様は変わってないだろうし,ABIも一緒っぽいので,cm6から持ってきたlibOmxVdec.soを上書きしてみたところ,無事に再生できるようになった.
問題なさそう.
* CyanogenMod7 RC1
やっとRC1出た.
RC1はcm6のやつのままのようなので大丈夫そうです.libOmxVdecだけ古いやつのままなところを見ると,問題に気づいてはいて後で修正されるのかな.
とりあえず入れてみた感じだと問題ない.
風邪.
会社行ったけど,晩御飯食べたあたりから体調悪化したので,帰って寝る.
CyanogenMod7のRC1が出てるので入れたいのだけど.
体調悪い上に,色々疲れた.
最近少し余裕が出来てきたけど,やっぱり時間が全く足りない.1日240時間くらい欲しい.
Google Maps
会社に自動的にチェックインするようにしてたら,「常連」から「達人」になった.達人って….
*ニコニコPlayer(仮)
解像度やビットレートの問題で再生できないのは仕方ないのですが,どうも別の問題で再生できない動画が増えてる気がしてきた.
せっかく降った雪はもう解けてしまった.日陰に少し残ってる程度.
ヒルズでランチ食べてきた.
…なんか,違う国にきちゃったみたいだね
写真撮ってはいけないっぽいので残念.
* Google Latitude
年明けてからダッシュボードの情報が正常にならないなぁ.いつの間にか,職場と自宅が逆になってたり,その状態で引っ越したので最近会社に行ってないように見える.引っ越し先はまだ認識されてなくて訪問した場所扱い.まぁ2週間しかたってないので仕方ないか.
* よりにもよって,友達を自動で放り投げ続けるプログラム
昨日書いたやつ.eldeshが書けというので仕事が忙しい中,40分かけて書いたプログラムです.
初期のスクリーンショット http://twitpic.com/3zp4cd
#include <iostream>
#include "../cppfl/all.h"
#include "../cppfl/imagetool/binarize.h"
int main() {
BitmapWindow win("よりにもよって,友達を自動で放り投げるプログラム",400,300);
Screen screen;
DIBitmap dib(200,200);
DIBitmap dib2(200,200);
int opos = 0;
int spos = 0, start_time = 0;
while (win.isexist()) {
// マウス周辺をキャプチャして二値化
Point p = Mouse::point();
screen.capture(dib, p.x, p.y);
imagetool::thresholdRGB(dib2,dib,60);
// トラック探す
int px = 0 , py = 0;
for (int y=0;y<195;y++) {
for (int x=0;x<195;x++) {
if (dib2[Point(x,y)].b == 0 && dib2[Point(x+1,y+1)].b == 0 &&
dib2[Point(x+1,y+2)].b == 0 && dib2[Point(x+2,y+1)].b == 0) {
dib2[Point(x,y)].r = 255;
px = x; py = y + 1;
break;
}
}
}
// 残り距離
int pos = 0;
for (int x = px-1 ; x>0 ; x--) {
if (dib2[Point(x,py)].b == 0) {
pos = px - x - 50; // 落下位置は左端から50pxの位置
break;
}
}
// pixel per sec.
int speed = 0;
if (opos>0 && pos>0 && spos>pos) {
speed = (spos-pos)*1000 / (GetTickCount()-start_time);
}
// 行けそうなら投げる 数値は適当に調整
if ( speed>0 && speed<55 && pos*1000/speed-1750 <= 0 && pos*1000/speed-1750 > -80 ) {
Mouse::lclick(p.x,p.y);
}
if (pos>opos) {
spos = pos;
start_time = GetTickCount();
}
opos = pos;
// 表示
win.clear();
win.draw(Point(0,0),dib2.getdc(),Rect(0,0,200,200));
win.color(Color::green);
win.circle(px,py,10);
if (speed > 0) {
win.print(STR "pos:"+ pos + " speed:" + speed + " p:" + pos*1000/speed);
} else {
win.print(STR "マウスで右下のあれの場所を");
}
Application.wait(20);
}
return 0;
}
*雪降った
もっと積もらないかな….
*【再掲】チョコレートはこちら
http://www.amazon.co.jp/registry/wishlist/1XQ9N9HNX8PS9
365日いつでも受け付けております.老若男女問いません.
追記:欲しいものリストの住所設定されてなかったので設定.もしかして,アカウントの住所を登録しなおすとウィッシュリストの住所設定消えるのかなぁ.
* [Android] Android Marketのアプリ説明文の文字数
いつのまにやら,説明文に書ける文字数が大幅に増えてますね.
文字数を気にしながら説明文書いたりしてたのですが,もうそんな必要ないようです.
* [Java] パッケージ
Java方式のパッケージって結構不便だと思うのだけど,みんなどうやって管理してるのかなぁ.
特に,ブランチ切るときにパッケージ名も変えたいときに結構面倒だし,マージするときも,うっかりパッケージ名までマージして面倒なことになる.
実はJavaとか良く分かってないのですが,どうやって解決するものなんだろう?
どうせディレクトリがパッケージに同期してるんだから,相対指定させて欲しいなぁ.もう少しネームスペース系の機能を全体的に改善してくれれば,javaプログラミングの苦痛も少し和らぐのに….
javaはネームスペースとメタプログラミングをサポートして,VMのメモリ使用量を10分の1にして,実行速度をもう少し早くしてくれれば,少しは快適になると思う.
*ニコニコPlayer(仮) 0.1.11.KARI
久しぶりに色々弄り回したので怪しいバグとかあるかも.とりあえず,ずっと直そうと思ってた問題をいくつか直しました.
-
検索ボタン長押しでソート順を選んでから検索できるように
-
ニコレポ対応はじめました(まだ途中)
-
アカウント設定でメールアドレスからスペースを消すように
-
キャッシュディレクトリを/Android/data下に移動(すでに古いキャッシュがあれば移動しません)
-
再生中のダウンロード処理を改善
-
無駄な処理を省いてサイズを軽量化
-
バグ修正
ニコレポは要望がちらほらあったので,手をつけてみました.個人的にはあまり使ってませんでしたが,もう少しちゃんと作れば便利かもですね.
そろそろ最初に表示されるメニュー画面をもう少しまともなUIにしたいですが,まだ決まらず.
*[Android] CyanogenModで時計が遅れる
CyanogenModを使ってるとネットワークで同期してるはずの時計がずれます.
ハードウェアクロックはずれてないので,システムクロックが同期して無いのが原因のようです.なので再起動などして,ハードウェアクロックと同期すれば正しい時間になります.
24時間で1分近く遅れてたので,これはちょっとイヤだなぁ.カーネルをビルドしなおす時間があったら適当に直すか.BusyBoxだけビルドしなおしてhwclockを入れようかとも思ったけど,/dev/rtcが無いってことは,RTCドライバ自体が動いていない?
でも,cyanogen_bravo_defconfigにはCONFIG_RTC_DRV_MSM7X00A=yになってるし,dmesg見る限り大丈夫そうなのだけど.追いかけるの時間かかりそうだな.
前のカーネルのときはどうだったかなぁ.後でまたROM入れなおしてみるか.
*[Android] install Gingerbread into Desire
そろそろ,Android2.3に手を出そうと思って,DesireのROMを新しくしました.
XDA Developers見てたら,CyanogenModベースのGingerbradがもう公開されてたので,安定してきたと判断して,CyanogenModのNightlyを入れる.
一応問題なくROMの入れ替えは成功.ただ,gapps入れたら,なぜか起動中に/cacheが溢れて無限再起動状態に陥って,やり直してもやっぱりダメだったので,
rm -rf /cache/dalvik-cache
ln -s /data/dalvik-cache /cache/dalvik-cache
な感じでごまかす.
まだ1日しか使ってませんが,特に問題なく使えてます.Froyoに比べて起動が早くなった気がするな.普通に使ってる限りだと,Gingerbreadになって一番変化するのは視覚効果周りな気がする.NativeActivityとか後で色々試してみよう.
バックアップしたapkをadbから入れようと思ったけど,せっかく,PCのブラウザからインストールできるようになったので,全部インストールしなおしてみることに.
-
ConnectBot
-
OpenWnn plus
-
Google Chrome to Phone
-
Twicca
-
QRコードスキャナー
-
Adobe Reader
-
ニコニコPlayer(仮)
-
Pixiv
-
世界天気時計
-
gEditor
この辺をインストール.
Android Marketで検索して,インストールボタンを押すだけなのと,PCからもインストールした履歴を見れるみたいなので,次からは検索もしなくて良くなるのかな?
あとは日本語フォント入れたり.
日本語入力は OpenWnn plus を使ってましたが,これを機に他のものに乗り換えようと思ったのだけど,ソフトウェアキーボードがConnectBot等の直接キーイベントを扱うソフトと相性が悪くて断念.改行キーとかにキーコード振って無いのかなぁ.
*ソーシャルネットワーク
見て来ました.ysaotome,eldesh,safiiと4人で.本当は先週見に行くつもりだったのだけど,ysaotomeが都合悪いみたいだったので今週になりました.
内容はともかく技術的な面では色々突っ込みどころもあるし,微妙に気になるところもありましたが,普通の人からみてすごそうに見えるので良いのかな.少なくとも,Facebookに転職したくなるような映画ではなかった.ちょっとアレだけど,Facebook周辺を知るにはいい映画かも.
品川で焼肉食べた.
*ニコニコPlayer(仮)
Gingerbreadインストールしたついでに,SDKのリファレンス見てたら少しいじる気になったので,さくっと微妙に要望のあるニコレポあたりに手をつける.
スクレイピングして最低限の情報だけ表示してみたけど,いまいちなので,普通にWebViewでページを表示するかなぁ.
ただ,そのままだと見にくいのでjsで適当に要素を消したりしてシンプルするのがいいかな.HTML加工して表示するのはなんとなくグレーな気がするけど画面狭いので仕方ない.
雪.
*ruby遅い…
10秒くらいで終わる処理のつもりが1分以上かかってている箇所があった.
Arrayが遅い気はしてたけど,unshiftが極端に遅かった.前にベンチマーク取ったとき,popとshiftは似たような速度だったので油断していました.他とオーダーが違うメソッドはリファレンスマニュアルに注意書きが欲しい….
会社でPHP使ったときも遅いと感じたけど,やっぱりperlは速かったんだなぁ.
そろそろ,LL言語にもJITコンパイラを載せるべきじゃないかなぁ.
RubyにもPerlのInline::Cみたいなモジュール無いか探したらgemにRubyInlineってのがあるな.数時間チューニングして高速化するより,そこだけCで書き直したほうが簡単なので使いやすければこれでいいかも.
*チョコレートはこちら
http://www.amazon.co.jp/registry/wishlist/1XQ9N9HNX8PS9
365日いつでも受け付けております.老若男女問いません.
*PHPのコードを静的に型チェックしてみた
PHP -lとか使い物にならないし,フリーで良さげなツールが見つからないので仕事の合間に作ったやつを.
<?php
/**
* @return Hoge
*/
function getHoge()
{
return null;
}
$hoge = getHoge();
/* !info $hoge */
class Foo{}
class Hoge {
/**
* @var Foo
*/
public $hoge;
/**
* @return string
*/
public function getBar()
{
return '1234567\'afafa';
}
/**
* @param Foo $a
* @return Hoge
*/
public function getHoge($a)
{
return null;
}
}
$h = new Hoge();
$h2 = $h->hoge;
/* !info $h */
/* !info $h2 */
/* @var $a int */
$a = "aaa\"123\n";
$b = 234;
$c = $a;
$d = $h->getBar();
/* !info $a */
/* !info $b */
/* !info $c */
/* !info $d */
$h->getHoge(null,null);
$hoge = $h->getHoge(new Hoge())->getBar();
/* !info $hoge */
これをチェックするプログラムに入れると,
start
/test.php
line:10 INFO: $hoge is Hoge
line:39 INFO: $h is Hoge
line:40 INFO: $h2 is Foo
line:44 WARN: Type mismatch $a: int -> string
line:47 INFO: $a is string
line:48 INFO: $b is int
line:49 INFO: $c is string
line:50 INFO: $d is string
line:52 ERROR: Too many arguments for Hoge::getHoge(1)
line:53 WARN: type mismatch param(1): Hoge -> Foo
line:54 INFO: $hoge is string
ok.
という結果が出力されます.INFOはデバッグ用に型を表示してるだけです.出力は簡素なテキストかHTMLか選べます.
PHPDocコメントで定義している型と違うものを代入した場合や,関数の引数の型が違う場合も警告出してくれます.
まぁ,ちゃんとテストしてれば動作に問題は無いのですが,コメントに書いてあることが嘘だったり,メソッド呼び出し時のパラメータが多すぎたりとかがあると,後で勘違いの元凶になるのでどうにかしないとです.
まだ演算子の処理がいい加減なのと,配列がチェックできてないので,もう少しいじる必要がある.
とりあえず,定期的にリポジトリ内のコードをチェックするようにcronに入れておく.
PSATとか,PHPCodeAnalyzerとかがあるようですが,少し調べた感じだと,まだ実用に足るものではなさそうです.Zend Studio にも解析ツール入ってるみたいですが,どの程度使えるのかなぁ.
*やっとRuby使えるようになった気がする
普段使うスクリプト言語を,PerlからRubyに変えようと思いつつ,数年ほど経過しました.
Ruby自体はすぐに書けるようになったのだけど,スクリプト書くときは,1秒でも早く動くものが欲しいと思ってるので,結局は慣れているPerlで書いてしまうことが多かったです.
数年間その調子でしたが,最近様子が変わってきて,急にRubyで書くことが多くなってきました.
ライブラリの使い方を覚えてそこそこ早く書けるようになってきたのもありますが,rubyからexecでperlを呼ぶのを躊躇わなくなったのもあるかも….
やっぱり,ライブラリ類の使い方を覚えるのと,コーディング時間の見積もりが出来きるようになってくると,安心してその言語を使えるようになりますね.
ただ,頻繁に使う用になると,やっぱり不満も色々出てきます.次は何の言語がいいのかなぁ….
*Android Market
PCのブラウザからアプリ探してインストールできるようになったのは結構便利.ただ,開発用のアカウントとAndroid端末に紐づいているアカウントが違うとログインしなおすのがちょっと面倒です.端末に複数アカウントを登録してあっても,最初に設定したアカウントしか使ってくれないみたい.
トップページから開発者用の/publish/Homeへのリンクが見当たらなくなって少し不便.あと,Android MarketのwebサイトにAndroidから繋ぐとSSL証明書の警告が出るな. *.google.comの証明書が帰ってきてるみたい.
追記:
後で見たらSSL証明書は正常になってた.
新しい無線LANルーターを買ってきた.BUFFALOのWZR-HP-G302H.
PPPoEのスループットが高いやつってあまり無くて,これにしました.
リモートのサーバーにファイル転送した感じだと110Mbpsくらいは出てる.
ネットワーク関係はこれでよしとしよう.
あとは,ディスプレイ買いたいのだけど,いまのPCがアナログRGBしか出せないので,せっかくなのでPCごと買い換えたい.
秋葉原でご飯.
第二回豆まき.
eldeshのところに.
住民票を移す.中央区役所に行って転出証明書を発行してもらって,そのまま江東区役所に行って転入届を出してくる..早めに家を出たのだけど,おもったより時間がかかって,出社したのは16時.
節分.
eldeshのところに豆撒きに行く.
微妙な時間なので帰ろうかと思ったけど,会社に戻る.
*PHPの静的解析
仕事の合間に(?)rubyでPHPのパーサー書いて簡単な型チェックをするプログラム書いたりした.
真面目な型推論とかは面倒だし良くわからないので,PHPDocのコメントと代入と関数の引数と戻り値だけ処理して型を予測してみる.
試しに20万行くらいのPHPのコードを入れてみると,それなりにいろいろ出てきた.
正直,引数が多すぎるときとか警告出ない方がおかしいと思うのだけど,PHP様は謙虚なので何も言ってくれない.
*Google Mapsアプリ
チェックイン機能が付いてた.400mくらい離れたら自動的に外れたけど,距離を見てるのかな.
*IPv4
IANAが持っていた未割当のブロックが尽きたみたいですね.
まぁ,新規にアドレスを割り当てられなくなっても,しばらくは既存のアドレスをやりくりしてどうにかできるので,急に何かは変わったりはしない気もする.
近いうちに,割り当て済みのIPv4アドレスが売買されるようになって,ISPとかもグローバルIPアドレスは別料金とかになるんじゃないかなぁ.そうなってくると,今度こそIPv6が普及し始めたりするのかも.
部屋の鍵を返却.
あとは住所変更の手続きしないと.
照明のリモコンが無くて不便で仕方ないと言っていたら,yosshi1202が余ったリモコンをくれた(?).帰って使ってみたら,普通に使える.
基本的にベッドの上が私の主な生活空間なのです.反対側の壁にあるスイッチまで歩いていくという信じられない行為をもうしなくて済むのがすごくうれしい.