2011年8月31日水曜日

おとなしいめんどり ポール・ガルドン

猫と犬とねずみとあかいおとなしいめんどりが小さな家に一緒に暮らしている。家事をするのはめんどりの仕事で他3匹はゴロゴロしている。めんどりが、小麦の種を手に入れてから、おかしを作るまでの間、3匹に何を頼んでも、「いやだね」「いやだよ」「いやだな」。最後に、めんどりは「わたしはひとりでこむぎをうえてていれしてかりとってこなやへもってってこなにひいてもらったわ。わたしはひとりでこえだをあつめひをおこしこなをまぜたわ。だからわたしはひとりでおかしをたべます!」と言うというお話。

メッセージは明快で、お話もとても面白い。息子はやりたがりでお手伝いをするのが好きだが、この絵本の影響かどうかはわからない。もともとの性格の問題だろうから関係ないかな。あと、小麦の種を植えて刈り取るという何ヶ月もかかることが絵本では淡々と進んでいくので時間の流れはどうなっているんだ、とは思った。

アプリのアップデート

CPU利用率ビューアーで一件、障害報告があがっていたので、修正してアップデートした。なるほど、どこで例外が発生したのか、確認できるんだな。便利だ。

2011年8月29日月曜日

ぐりとぐらのえんそく なかがわりえことやまわきゆりこ

ぐりとぐらが弁当を持って野原に。なかなか昼にならないので、マラソンしていると毛糸を見つけ、毛糸をたどっていくとくまの家に到着。毛糸はくまのチョッキがほどけたものだった。そして、熊と一緒に弁当を食べました。というお話。

ぐりとぐらが毛糸につまずいて転ぶシーンがあるんだが、まったく表情が変わらないのに笑えるとか、くまの家にはくまのプーさんのおりょうりのほんがある、とか絵を見るのは面白いかもしれないが、お話としては、うーん。息子への読み聞かせではいまいちだった。


ぐりとぐら なかがわりえことおおむらゆりこ

すでに僕が子供のときにあった絵本で有名な作品。

ぐりとぐらという2匹のネズミが食材探しに出かけると大きな卵を発見。その場に調理器具などを持ってきてカステラを作る。いいにおいにつられて森の動物たちが集まってきてみんなで食べる。というお話。

読んでいて思うのは、この卵は何の卵なのだろうか、ということ。森の動物たちの誰かのではないのか。集まってくる動物のなかには、鳥もいるのに。もし、卵の親がくれば大惨事、森のみんなで食べました、というほんわりした状況ではない、と思うのだけれども。なんてことは気にせずに読む物なんだろう。息子には特に気にならないようだ。


くろくんとなぞのおばけ なかやみわ

くれよんのくろくんのシリーズの3作目。10色のクレヨンのキャラクターたちが出てくる。

クレヨンのキャラクターの一人、きいろくんがいなくなったのを皮切りに毎日何人かずついなくなり、最後に残されたくろくんがみんなを助けにいく。みんなのところにたどりつくと、動けなくなったおじいさん(ネズミ)のために絵を描いてもらいたいネズミたちのしわざだった。最後にはくろくんのアイデアですてきな絵を描くというお話。

絵のかわいさとやさしい雰囲気がとてもいい絵本。1点だけ気になるところ、最後にすてきな絵を見た後おじいさんは死ぬことになるが、「つぎのひ。おじいさんはてんごくのおばあさんのところへたびだちました。」という一文。「おじいさんはなくなりました。」でいいのではないか、と思った。その方が、その後で出てくる「おじいちゃんは、やっとおばあちゃんにあえたんだ!ぼくたち、ないちゃだめだよ!」の文にすんなりつながるように思う。読み聞かせではそうアレンジしている。どちらにしろ3歳の息子にはまだ死ぬことがよくわからないだろうから、読み聞かせではどう伝わったかわからない。


Boot時起動方法

Android OSがブートしたとき自動でサービスを開始させたい場合がある。BroadcastReceiverを実装することでできる。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class TBroadcastReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
  if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
   context.startService(new Intent(context, TProcessWatcherService.class));
        }
    }
}
AndroidManifest.xmlに作成したクラスを記述する。
<service android:enabled="true" android:name=".TProcessWatcherService" />
 <receiver android:name=".TBroadcastReceiver">
  <intent-filter>
   <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
 </receiver>

アプリ情報の取得方法

パッケージ名から、アプリ名、アプリアイコンを取得できる。CPU利用率ビューアーではグラフを表示するプロセスを選択するために、この情報を使用した。

public String appname = null;
 public Drawable icon = null;
 private void getAppInfo(Context context) {
  PackageManager pm = context.getPackageManager();
  try {
   ApplicationInfo applicationinfo = pm.getApplicationInfo(pkgname, 0);
   icon = pm.getApplicationIcon(applicationinfo);
   appname = (String)pm.getApplicationLabel(applicationinfo);
  } catch (NameNotFoundException e) {
  }
 }

タイトルバー(アプリ名)を消す方法

デフォルトでAndroidアプリはタイトルバーにアプリ名が表示される。画面が狭くなるので消したい。AndroidManifest.xmlでActivityのプロパティを設定する。

<activity android:name=".TCPUUseRateWatcherActivity"
  android:theme="@android:style/Theme.NoTitleBar" android:label="@string/app_name">
  <intent-filter>
   <action android:name="android.intent.action.MAIN" />
   <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>

CPU使用率の計算方法5 (計算)

CPU使用率の計算方法1-4で述べた方法で、システムの実行時間(tick単位)、プロセスの実行時間(tick単位)、プロセスIDのリスト、USER_HZを取得することができる。さらに、実行時間(tick単位)を取得するときに、合わせて時刻を取得しておく (測定時刻(秒単位)) とすると、以下になる。 CPU使用率はシステム・プロセスともに、

(今回の実行時間(tick単位) - 前回の実行時間(tick単位)) / USER_HZ / (今回の測定時刻(秒単位) - 前回の計測時刻(秒単位))

で計算できる。CPU利用率ビューアーではこの計算結果をグラフ表示している。

CPU使用率の計算方法4 (USER_HZの取得)

CPU使用率の計算方法1, 2で書いたように、/proc/[pid]/stat, /proc/statから取得できる実行時間の単位はtickである。 http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html を参考にすると、sysconf(_SC_CLK_TCK)を使って取得したUSER_HZで実時間に変換できることがわかる。具体的には、実行時間をsysconf(_SC_CLK_TCK)で割ることで、秒単位に変換することができる。しかし、USER_HZを取得するためのJava用のAPIはないようだ。多くのAndroidシステムのUSER_HZは100のようだが、異なるものも存在する。したがって、CPU利用率ビューアーではJNI経由で値を取得した。
#include <unistd.h>
#include <jni.h>

jlong Java_com_appspot_takuyaandroid_tcpuuseratewatcher_TUserHzJni_getUserHz(JNIEnv *env, jobject obj) {
 return sysconf(_SC_CLK_TCK);
}

CPU使用率の計算方法3 (プロセスID取得)

CPU使用率の計算方法2で書いたように、CPU使用率を計算するためには/proc/[pid]/statにアクセスする。したがって、[pid]が必要である。実行中のプロセスの情報はActivityManagerを使ってアクセスできる。

static public void insert(Context context) {
  ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
  List list = am.getRunningAppProcesses();
  long now = new Date().getTime();
  for (RunningAppProcessInfo info : list) {
   long tick = getTick(info.pid);
   String name = info.processName;
   TProcess p = new TProcess(info.pkgList[0], name, tick, 0, now);
   p.insert(context);
  }
  long tick = getTick();
  TKernel k = new TKernel(tick, 0, now);
  k.insert(context);
 }
上記は、CPU利用率ビューアーのソースの一部である。上記を定期的に呼び出して、CPU使用率を計算するために使う情報を現在時刻とセットで保存している(TProcess#insert/TKernel#insert)。パッケージ名を使用してアイコン等の情報を取得できるため、CPU利用率ビューアーでは保存している。 なお、上記ソースでは、現在時刻として保存した時刻と/proc/[pid]/stat, /proc/statにアクセスした時間にわずかだが差があり、情報として正確ではない。

CPU使用率の計算方法2 (プロセス)

AndroidはLinuxをベースにしているため、Linux同様、/proc/にアクセスして、プロセスの情報を取得することができる。
http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html で書かれているように、/proc/[pid]配下から実行中のプロセスについての情報を取得できる。 CPU利用率ビューアーでは、/proc/[pid]/statの項目にあるプロセスのtick単位の実行時間(utime/stime)を使用した。
static private long getTick(int pid) {
  try {
   String filename = "/proc/" + pid + "/stat";
   String stat = load(filename);
   String[] split = stat.split(" +");
   return Integer.parseInt(split[13]) + Long.parseLong(split[14]);
  } catch (Exception e) {
   return 0;
  }
 }

 static private String load(String filename) {
  try {
   BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
   String str = reader.readLine();
   if (str == null) return null;
   reader.close();
   return str;
  } catch (Exception e) {
  }
  return null;
 }

CPU使用率の計算方法1 (システム)

AndroidはLinuxをベースにしているため、Linux同様、/proc/にアクセスして カーネルに関する情報などを取得することができる。
http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html で書かれているように、/proc/statから、システムが消費した時間(tick単位)を取得することができる。 Android端末で実際に/proc/statにアクセスしてみると、 cpu 970616 85105 578431 25520823 316076 976 33674 0 0 0 のような情報が取得できる。10項目存在する。上記のサイトでは、9項目までは説明がある。CPU利用率ビューアーでは、すべての項目の和を使用した。
static private long getTick() {
  try {
   String filename = "/proc/stat";
   String stat = load(filename);
   String[] split = stat.split(" +");
   long time = 0;
   for (int i = 1; i < split.length; i++) time += Long.parseLong(split[i]);
   return time;
  } catch (Exception e) {
   return 0;
  }
 }

 static private String load(String filename) {
  try {
   BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
   String str = reader.readLine();
   if (str == null) return null;
   reader.close();
   return str;
  } catch (Exception e) {
  }
  return null;
 }

2011年8月28日日曜日

くろくんとふしぎなともだち なかやみわ

「くれよんのくろくん」と同様、10色のクレヨンがキャラクターでてくる。くろくんがさんぽに出ると、バスとふねのキャラクターと出会う。他のクレヨンたちと同じ場所に行くと、新幹線のキャラクターがいて、走ってもらうと新幹線が事故を起こしてしまい、クレヨンたちがもめる。新幹線が正体を明かして最後はクレヨンたちも仲直りというお話。ストーリーがわかりやすく、絵もきれいで、僕はお気に入り。でも、機関車・電車好きな息子には、新幹線が出てくるのがよかったようだ。前回の話でクレヨンは使われたのじゃないのか、なぜ、新品に戻っているんだ、と僕は思ったが、息子は気にならないんだなあ、と思った。


2011年8月27日土曜日

くれよんのくろくん なかやみわ

まったく使われていないクレヨンたちが箱から飛び出し、絵を描いていくが、黒色のクレヨンはみんなから必要とされず仲間にいれてもらえない。最後は、シャープペンのお兄さんの手助けがありながら、黒をメインに使ったきれいな絵ができあがって、みんなから仲間と認められるいいお話。途中のシーン「ねぇ、ぼくは? ぼくは、どこをかけばいいの?」という言葉に、そんなこと言ってないで自分からアピールしろ、と3歳の息子へ読み聞かせでいろいろ言っていたら、息子は、ありでもカラスでも描けばいいのにね、というようになった。あとどうでもいいことだけど、「シャープペン」は、「シャーペン」か「シャープペンシル」かどちらかにしてくれ、と思うのは僕だけ?


ディズニーピース カーズ2

映画「カーズ2」を21ページの絵本にしたもの。最近、息子がカーズに興味を持っているようなので買った1冊。映画を見た子供の復習用の絵本のようで、映画を見たことがない息子と自分には話がわからなかった。最低でも、キャラクターの名前ぐらいは知っていないと楽しめない絵本と思う。「メーターがトイレにはいると、グレムとエーサーというあやしいふたりぐみが、トルクというくるまとにらみあっていました。」と新しい車の名前が一気に出てきたり、「みえないビームでくるまのエンジンをばくはつさせるカメラ」と実体が想像しづらい言葉が多かったり。この本は映画を見てから、もう一度読んでみたい。


汽車のえほん26 わんぱく機関車

収録内容
「ゆうれい列車」 Ghost Train
「毛虫」 Woolly Bear
「ディーゼル機関車メイビス」 Mavis
「トビーのつなわたり」 Toby's Tightrope
登場機関車
・パーシー・トーマス・トビー・メイビス・デイジー

ウィルバート・オードリーの汽車のえほんの最終巻。1話目の「ゆうれい列車」は事故で真っ白になってしまったパーシーが幽霊のふりをしてトーマスを脅かしてからかう非常にゆかいなお話。驚かされたトーマスは、「にげるようにはしっていってしまいました。そのよる、トーマスは、とうとう機関庫にもどってきませんでした。」となっている。機関士はどうなってしまったのだろうか。機関士は乗っていなくて、自走していたのだろうか。2話目の「毛虫」は、糖蜜をあびてしまったパーシーに干し草がくっついて毛虫のようになりトーマス・トビーに笑われるこれまた楽しいお話。3話目、4話目は、メイビスとトビーの話で、2人の掛け合いが面白くこれまた楽しめるお話。ところで、3話目で、毎日違う場所に貨車を置くメイビスにトビーが「いつでもすぐひけるところにおいておくものだ」と言うシーンがある。同じ場所にきっちり物を片付けない妻に文句を言う自分の姿が重なった。


汽車のえほん25 きえた機関車

収録内容
「おじいちゃんポッポ」 Granpuff
「デュークとファルコン」Bulldog
「デュークとスチュアート」You can't Win!
「ねむれる森の機関車」 Sleeping Beauty
登場機関車
デューク・ファルコン(サーハンデル)・スチュアート(ピーターサム)・2号機関車・スカーロイ・レニアス・ダンカン・ドナルド

サーハンデル・ピーターサムがファルコン・スチュアートという名前だったころのお話。テレビの「きかんしゃトーマス」と同じカラーリング (サーハンデル:青、ピーターサム:緑) の絵を見ることができる。2話目と3話目が昔話となっていて、1話目と4話目がつながっている流れになっているため、わかりにくく、3歳の息子は戸惑っていたようだ。3話目まで活躍してたのに、4話目で唐突に行方不明になったように感じられる。また、デュークという機関車の名前とデュークという言葉自身のもとの意味「公爵」とをひっかけた文があり、これもわかりにくくなっている。4話目のタイトルは「眠れる森の機関車 (Sleeping Beauty)」となっており、実際行方不明になっていたデュークを発見したときに発見した牧師が「あ、『ねむれる森の美女』‥‥‥いや、『機関車』だ!」と叫ぶのだが、なぜ、Sleeping Beautyという言葉をこの話の流れで使うのかわからない。非常に唐突な感じがする。しかし、全般的に息子はなぜかデュークが好きなためか、おじいちゃんポッポという言葉を何度も言うなど楽しめる話だった。


2011年8月26日金曜日

汽車のえほん19 山にのぼる機関車

収録内容
「登山鉄道の機関車」Mountain Engine
「カルディーのつくりばなし」 Bad Look-out
「ロード・ハリーの脱線」 Danger Points
「魔の尾根」 "Devil's Back"
登場機関車
・サーハンデル・スカーロイ・レニアス・ドナルド・カルディー(4号機関車)・ダンカン・ゴッドレッド(1号機関車)・ロードハリー(6号機関車/パトリック)・アーネスト(2号機関車)・ウィルフレッド(3号機関車)・アラリック(7号機関車)・エリック(8号機関車)

機関車の名前は多く出てくるだけでほとんどは出番なし。「カルディーのつくりばなし」で、カルディーは、思い上がった機関車ゴッドレッドが失敗を繰り返し、最後は機関庫に閉じ込められて少しずつ部品が取り外されてなくなってしまう、という恐ろしいつくり話をして、他の機関車を戒める。「ロード・ハリーの脱線」は、思い上がった機関車ロードハリーが脱線をしてしまい名前を剥奪されるお話。前者は、存在しなくなるという不幸な結末で終わるのに対して、後者は次の話「魔の尾根」で活躍して人から感謝され新たにパトリックという名前をもらうという結果になる。この名前を奪われたり、与えられたり、ということへの感覚はわかりにくいし、読み聞かせをする子供にも伝えにくい部分でもある。そもそも名前が変わると同じ機関車であることが伝わっていない。少し、息子(3歳児)には難しいお話だった。


もう一つアプリをアップロード

Androidマーケットにアプリをもう一つアップロードした。アップロード時に、何度か「アップロードで予期しないエラーが発生しました。しばらくしてからもう一度お試しください。」と表示されて失敗した。ほんとうに、しばらくしてからアップロードすると成功したが、単にサーバーの性能の問題で失敗しているだけかなのかな。

汽車のえほん24 機関車オリバー

収録内容
「ドナルドのあひる」 Donald's Duck
「オリバーの大しっぱい」Resource and Sagacity
「トードの手だすけ」 Toad stands by
「ぶくぶくバルジー」 Bulgy
登場機関車
ドナルド・ダック・オリバー・ダグラス・ヘンリー・ジェームス・ゴードン・(トード)・(スクラフィー)・(バルジー)

本のタイトルは、オリバーだが、最初の話「ドナルドのあひる」には、オリバーは出てこない。「ドナルドのあひる」では、ダックの機関士と助手は、ドナルドの水のタンクにあひるを入れるといういたずらをする。機関士と助手はいつもろくなことをしない。その仕返しに、ドナルドはダックの下に巣箱と卵をおくといういたずらをするというなかなか楽しいお話。2話目はおもいあがったオリバーが事故を起こすお話。3話目はオリバーが貨車に馬鹿にされるようになったからと、ブレーキ車トードと組んで、貨車スクラフィーを前後に引っぱり破壊するお話。貨車を破壊したのに対して、ふとっちょの局長はしかったりしないのが不思議なところ。最後の話は、鉄道はんたいを唱えるバスのバルジーのお話。「おまえたち機関車は、おれたち労働者から血をしぼりとって、そのたのしみとやらのためにいきているんじゃないか。かくめいがおこったら、鉄道なんかずたずたさ。」というバルジーの台詞がある。少し、子供向けにしては難しめ。この世界では、バスは労働者で鉄道は資本家なのか、機関車もスクラップにされるなど大変そうなのだけれども。話の最後には、バルジーはぼろぼろに。それほど悪い訳でもないのに、ひどい扱いだ。


2011年8月25日木曜日

汽車のえほん9 青い機関車エドワード

収録内容
「エドワードとめうし」Cows!
「エドワードとバーティー」Bertie's Chase
「エドワードとトレバー」Saved from Scrap
「ふる鉄エドワード」Old Iron
登場機関車
エドワード・ゴードン・ヘンリー・トビー・トーマス・ジェームス・(バーティー)・(トレバー)

スクラップにされそうになっているトレバーを助けるお話「エドワードとトレバー」、暴走して止まれなくジェームスをワイヤーロープで助ける「ふる鉄エドワード」とやさしいエドワードのいいお話が収録されている。非常にいいと思うのだが、あまり、息子には受けがよくない。エドワードは面白みにかけ、子供向けではないのかもしれない。


汽車のえほん16 機関車トーマスのしっぱい

収録内容
「トーマスの大しっぱい」Thomas Comes to Breakfast
「しんけいしつなデイジー」 Daisy
「牛の目玉」 Bull's-eyes
「貨車にのりあげたパーシー」 Percy's Predicament
登場機関車
トーマス・パーシー・トビー・ドナルド・ダグラス・デイジー

タイトルにトーマスとついているが、最初の話で壊れてしまうので、それ以降、4話目の最後まで出てこない。「トーマスの大しっぱい」では、トーマスが機関士を乗せないまま、走り出し、家に突っ込んでしまう話である。走り出した理由として、「そうじにきたひとが、うっかり機械にさわったからうごいただけのことだったのです。」とある。しかし、トーマスが「まったく、きみは、わんぱくな機関車だ」といわれてしまうのがかわいそうなところ。最後の話は、パーシーが貨車に押されて事故を起こしてしまうお話。事故を起こす直前に、機関士も助手も飛び降りてしまう。いつもながらの役立たずだ。

Jobsがとうとう引退。

ビルゲイツもジョブズも引退で時代が変わったなーという気がする。子供の頃、AppleIIはあこがれのマシンだった。ミステリーハウスしたかったよ。今やったらがっかりだろうけどさ。

2011年8月24日水曜日

ダウンロード数2

Androidマーケットにアップロードしたアプリの状況を見ると、ダウンロードが2件あったようだ。何の宣伝もないのに、どうやってたどり着いたのだろうか。興味をひくためには、検索でひっかかるように、きっちりキーワード的な言葉をちりばめたコメントを作ったほうがいいのだろう。もう少し、考えてみたい。

2011年8月23日火曜日

アンドロイドアプリを公開

Androidマーケットにアプリを公開した。
アプリをアップするために、デバッグ用でない署名をつけたら、Google Map APIが動作しなくなちゃった。そりゃそうだよな。それで、Google Map APIに登録するため、keytoolを使おうとしたら、keystoreファイルが見つからない。
/Applications/eclipse/Eclipse.app/Contents/MacOS/
こんなところに入ってた。

あと、正式公開にするとログは出なくなると思っていたが、それは間違いだった。ログが出ないようにすべて修正した。そして、再公開。

2011年8月20日土曜日

MacBook Airの購入

MacBook Airを買い、家でのメインマシンはMacとなった。家のPCが古くなってきてそろそろ買い替え時と思って調べたところ、自身が欲しいスペックでみるとMacのほうが安かった。一人暮らしのときはでかくてもよかったのだが、今は片付けなくてはいけないので、14インチが限界。あんまり小さすぎてもいけないので最低12。HDDよりは容量が小さくてもSSD。価格.comで調べても、VaioZが125000円が最低。MacBookよりも高いんだ...。驚きだ。Apple IIの時代からAppleは高いというイメージがあったのに、時代が変わったなあ。