2003年12月30日(Tue) お呼ばれしました
● ザルツブルグの向こうの湖(Wolfgang湖。じつは有名な観光地なのだそうだ)にある友人の別荘(というか本宅か?)にお邪魔しました。おいしい料理をいただいて教会をみに行って、おいしいお菓子をたべて、ずんこは犬に遊んでもらう。すばらしいKrippe(聖書からイエスの生誕を題材にしたジオラマ)も見せてもらいました。どうもありがとうございました。ドイツ語がちゃんとできればもっと楽しかったのにな。そうそう、オーストリアの高速道路は10日で7.60ユーロの通行料がかかりました。初めて通行券を買ったよ。
2004年12月30日(Thu) 嵐が来ているそうだ
● 新ウイングレット大活躍
嵐が来ているそうで、今日は南風が強く吹いている。昼休みにウイングレットを改造したZagiをひっぱりだして飛ばしてみると前のウイングレットよりずっと良いのがわかった。前のはいいかげんに作ったので主翼から斜めにつきだしていて、二段上反角をつけたような効果があったのだろう。今回のものはちゃんと垂直に着けた。浮力の無いものよりも抵抗はずっと少ない感じがするし、ロールも素直。むふふ。
しかし。嵐はまだ去らないのかな。正月休みにどこか行こうと思ってたんだけどな。
● ゴム動力機も大活躍
この前の出張の時に380円くらいで買ってきたもの。どうも冴えないなーと思って車輪を外してやったらそりゃもう良く飛ぶこと。木にひっかかって大変でした。
あとで主翼のつけねを補強すること。
2005年12月30日(Fri) 久しぶりに曇
● cygwinで開発を続ける
メインマシンが壊れてしまったので、Windowsでの仕事も残っているノートPCにsvn checkoutしてきました。へぇ、だいたい動く。
WindowsのMy Doccumentsへのシンボリックリンクになっている/home/zunda/My Documents/...でconfigureすると、「/bin/sh: /home/zunda/My: No such file or directory」と言われて、さらに「configure: WARNING: `missing' script is too old or missing」と言われるのがちょっと情けないです
あと、-std=c99するとcygwinではsnprintfが宣言されないようです。ではwin32 native版の_snpritnfがC99のsnprintfと仕様が違う、という話が出ているのですが、その辺と関係するのかな。どうするのがいいだろうか…。
しかし最もなさけないのは、ソースファイルの一部がレポジトリに入ってなかったことでした。tar ballを別のマシンに置いておいてよかったよ。
● …やっぱりリブートしてLinuxにしました。DOS窓のbashに耐えられなかった。
2007年12月30日(Sun)
● [Momonga] gdmからマシンをシャットダウンできるようにする
手元のx86_64マシンでは、gdmのActionsメニューから Shut down the computerやRestart the computerを選ぶと、 一度画面が黒くなりシャットダウンしかけたようにみせかけて、 gdmが再起動してしまう。 xfce4の「電源を切る」や「再起動」メニューは期待通りに動いている。 /var/log/messagesを見ると下記のような行が残っていた。
userhelperかconsolehelper (usermode-1.92-1m.mo4) がうまくできてないのかな?
/etc/X11/gdm/custom.confを下記のように編集して、 /usr/bin/poweroffや/usr/bin/reboot (/usr/bin/consolehelperへのsymlink) を使わないようにしたら期待通りに動いた。
2013年12月30日(Mon) 炎の九日間3日目
● [Android] GitHubのアンドロイドアプリにプルリクエストを出してみる
GitHubのアンドロイドアプリに期待とは違う動作をみつけたのでプルリクエストを出してみました。 検討してもらえるとうれしいな。 それはそれとして、恥をしのんで今回の思考の過程を記録公開しておきます。
体調が悪くて夜眠れない時には時々GitHubのアプリを眺めてます。 るびまの編集作業とか手動かしたいんだけどまだちょっとまとめて時間を確保できる自信が無いので指をくわえて見てるわけです。 そこでIssueから辿るURLのパス部にスラッシュが無い時に、そのURLではなくてパス部をユーザー名としてそのユーザーの情報を表示しようとすることに気づきました。
さてどうやって中身を見ようか。 GitHubでレポジトリをforkしつつ まずはlogcatの出力を見てみるのかな。 ActivityManagerの知らせてくれるIntentはすぐに見ることができました。
うまくURLを辿れた時は、例えば、
だめだった時はUserViewActivityが呼ばれてしまっています。
ビルド環境を整えて、 LogCatデバグをしたり、 KMC Staff Blog:AndroidのJavaアプリからスタックトレースをログに出す簡単な方法を参考にさせていただいて、 スタックトレースデバグをしたりして、 結局のところ、UrlLauncher#convert()があやしそうだということになりました。
convert()の動作を追います。 渡ってきているURLを見てみると、期待どおりの模様。 convert()後半で パスにスラッシュの無いURLがすべからくGitHubユーザーのページと思われていることがわかりました。
どう変更すれば期待している動作になるか。 convert()の中盤を見ると、 スキームやホストの無いURLにも対応しようとしている。 根本的にはここで@付きの文字列をGitHubのユーザーに対応させられれば良いのだろうけれど、 どうもHTMLへの変換はこのアプリのコードのそとでおこなわれているようでした。
表示内容がどこで作られているのか、スタックトレースからは追えませんでした。 例えば、class CommitViewAcivityはPagerActivityを継承していて、 PagerActivity#onCreate()からスタックトレースを眺めると Issueを眺める時にこのメソッドが呼ばれることはわかりましたが、 スタックはすぐにアプリの外に出てしまいます。
じゃあレイアウトから…。 issue_header.xmlの@+id/tv_issue_bodyのTextViewに本文が入りそうなことは想像できましたが、 これを参照している IssueFragment.javaには 内容を設定しているコードが見つけられないのです。 それじゃあIssueFragment#onActivityCreated()の 中は… やっとこ、IssueFragment#updateHeaderを呼んでいるコードを発見しました。 しかしここまで。 updateHeader()から呼ばれているIssue#getBodyHtml()を定義しているコードは見つけられなかったのでした。
そういうわけで、ここでは、 やはりタップされた後のconvert()の動作を変更することにします。
GitHub Enterpriseのユーザーへのリンクがある可能性を考えると、 ホスト名を決めうちにするのは避けた方が良いかとも思うのですが、 パス内に特徴的な文字列を含む他のマッチャと違い、 今回のようにGitHubユーザーのURLへのマッチはマッチしすぎるようなので、 ホスト名で制限をかけることにしましょう。
このアプリの中でgithub.comのホスト名はどうやって定義されているか。
いろいろですねw urlLauncher.javaでは、
よりLogCatによるとHOST_DEFAULTが「github.com」として使われていたので倣うことにします。 変更は簡単。 URLのホスト部とHOST_DEFAULTが一致するかを確認するだけ。
そうそう、テストも書きかけたのですが、
するとログイン画面から進めなくなるテストがあったり、 新規に作ったテストのうち変更前に通りはずのものが通らなかったりで、 今回は諦めました。
デバッグビルドしたものを端末に入れて試してみて満足したら、 Pull requestをするまでのgitコマンドのメモ に従ってpull requestを作成しました。 cherry-pick便利!! 今回は、ここまでの作業で、3日間ほど使ったようです。
そうそう、後日、 convert()内ではそれ以降参照されないIntentへの代入を消したのを 巻き戻しました。 メソッドが返ってからこのIntentが参照される可能性がありましたよね。 Pull request用のブランチにこの変更(の取り消し)をmergeしてpushしたところ、 Pull requestにも そのまま反映されました。便利だねえ。
というわけで、今回は、Androidアプリに期待と異なる動作を見つけて、
- LogCatでIntentとスタックトレースを見て動作を理解
- findとgrepを使って根本的な解決が難しいことを把握
- テストケースの追加を失敗
- 最小の変更とプルリクエスト
と作業が進みました。次の機会にはもう少しちゃっちゃと進められるといいな。
最近のツッコまれどころ