2012年2月アーカイブ

 javadocよく読んでたら

リストの反復子により、プログラマがいずれかの方向にリストをトラバースし、繰り返し処理時にリストを変更して、反復子の現在の位置をリストで取得することができます。ListIterator には現在の要素がありません。 そのカーソル位置は、previous() の呼び出しによって返された要素と、next() の呼び出しによって返された要素との間に常にあります。長さ n のリストの反復子は、次のキャレット (^) で示されるような、n+1 個の可能なカーソル位置を持ちます。

                  Element(0)   Element(1)   Element(2)   ... Element(n-1)

カーソルの位置: ^ ^ ^ ^ ^

 なるほど。Iteratorは要素を指してるわけじゃないのね(´・ω・`)
 嘘つきとか言ってごめんねjavadoc。

 なんかはまったのでメモ。

あるときバグがあった

 とある要素の次の要素とか前の要素の情報を知りたくて、ListIteratorが使えるコンテナだったのでListIteratorを使ってhasNext()、next()、hasPrevious()、previous()してたんですが、prebious()は前の要素を取ってくるのにnext()が次の要素をとってこない。
 そういえばイテレーションするときもnext()の返り値を使うのでそんなものかと思ったんですが、previous()と対称性が取れていないのが気に入らない。

そうだドキュメントを読もう!

 最近ドキュメントちゃんと読んでなくて苦労したのでjavadocを見に行ったら。

next

E next()

リスト内の次の要素を返します。このメソッドは、リストを反復するために繰り返し呼び出される場合と、前後に移動するために previous の呼び出しと組み合わされる場合があります。next と previous の呼び出しを交互に行うと、繰り返し同じ要素が返されます。

定義:
    インタフェース Iterator<E> 内の next

戻り値:
    リストの次の要素 
例外:
    NoSuchElementException - 繰り返し処理で次の要素がない場合

 と書いてある。次の要素ちゃうやないかヾ(#`Д´)ノ
 一方previousは

previous

E previous()

リストの前の要素を返します。このメソッドは、リストを逆方向に反復するために繰り返し呼び出される場合と、前後に移動するために next の呼び出しと組み合わされる場合があります。next と previous の呼び出しを交互に行うと、繰り返し同じ要素が返されます。

戻り値:
    リストの前の要素 
例外:
    NoSuchElementException - 繰り返し処理で前の要素がない場合

 と書いてある。その通り動いているので何も言えない(´・ω・`)

 javadocが正しいとするとAndroidのCopyOnWriteArrayListが返すListIteratorがおかしい。

そしてAndroidへ

 例によってICSのr1のソースを見てみるとCopyOnWriteArrayListのListIteratorはCowIteratorが返すらしい。CowIteratorのnextとpreviousの実装が以下の通り。

    @SuppressWarnings("unchecked")
    public E next() {
        if (index < to) {
            return (E) snapshot[index++];
        } else {
            throw new NoSuchElementException();
        }
    }

    @SuppressWarnings("unchecked")
    public E previous() {
        if (index > from) {
            return (E) snapshot[--index];
        } else {
            throw new NoSuchElementException();
        }
    }

 と、まさしく実装の通り動いてたということのようです。

おぼれる者はJDKをも掴む

 AndroidのListIteratorがjavadocに沿ってないのはわかった。じゃあJDKどうなの?
 これでJDKが同じ動きだとしたら僕はjavadocのことを許せそうにないよ......。

 ということでJDK6のソースを落としてきてCopyOnWriteArrayListこんにちわ。COWIteratorとか似たような名前のクラスを見つけて覗いてみたら。

    public E next() {
        if (! hasNext())
            throw new NoSuchElementException();
        return (E) snapshot[cursor++];
    }

    public E previous() {
        if (! hasPrevious())
            throw new NoSuchElementException();
        return (E) snapshot[--cursor];
    }

 神は死んだ。。。
 前にも誤訳的な何かがあったりしたしもうそろそろjavadocが信じられなくなってきたよママン。。。

追記

 JavaのIteratorは要素を指しているわけじゃないそうです。

渋谷_つけ麺大臣_油そば.jpg

 連投第四弾。これでラスト。

 前の店が残念だったのでこのまま帰れないと近くにあったつけ麺大臣に行ってきました。
 いつもは鶏白湯そばか鶏白湯つけ麺をオーダーするんですが今回はネタ作りのために油そばをチョイス。次回は魚介つけ麺あたりかな。

 さて、肝心のお味の方ですが、油そばは期待したほど劇的においしいわけではありませんでした。もちろん他のラーメンで実力のある店なのでおいしいんですが、渋谷で他に食べてきた油そばと比較すると一歩劣ります。専門店と比べるのはフェアじゃないかもしれませんが。
 あ、でも日吉のあびすけの油そばよりはおいしいです。
 とりあえずいくらか食べておいしいけど一番じゃないなと思ったものの油そばは味調整がキモなので酢とラー油で化けるかもとぐりぐり入れてみました。するとそこそこよくなってなかなかおいしい。でも結局頭一個の差は埋めきれずでした。最初に思ったほどの差はなくなったので何度か食べるとこなれてきそうな気はします。
 つけ麺大臣はつけ麺のお店だしラーメンもおいしいので基本はやっぱりそっちですね。たまには違うのがいいなというときに選んでみるといいのではないでしょうか。

渋谷_ももみづき_ネギらあめん.jpg

 連投第三弾。実はここについてはガマンしきれずにすぐ書いて貯めてました。

 職場でラーメンいかね? と誘ったら喜多方ラーメンが食べたい! という人がいたのでぐぐって行ってみました。
 実は二日前につけ麺大臣に行った時にも探してたんですが雑居ビルの六階にあると思っていなかったので見落としたお店です。見つからなかったのでつけ麺大臣に行くことになりました。

 さて、肝心のお店の話ですが、ももみづきはラーメンのお店ではないようです。スナックでラーメンも出しているような感じで正直ラーメン屋の環境としては悪いです。渋谷で入ってきた店の中では間違いなく最悪でした。スナックとして行くことをお勧めします。
 それでもラーメンがおいしければアリなのでおとなしくネギらあめんをオーダー。一緒に行った人と話しながら待ってみました。
 出てきたラーメンの見た目は普通にラーメン屋クオリティ。これは案外いけるのかなと思って食べてみると、麺は柔らかめで好みと違う感じでしたがまあ普通。スープは業務用に一手間入れましたといった感じで正直いまいち。トッピングに難アリで玉子がコンビニや酒屋で売っているおつまみ用の味玉のような感じでラーメンに入る玉子の食感じゃありません。
 おそらく多分に環境部分の減点が影響している辛口評価ですがラーメン屋として評価した場合点が低いのは否めません。スナックでラーメンが出ていると評価した場合は悪くないと思います。
 飲んだ後にラーメンが食べたくなるような人は行ってみては?

CameraZOOM-2012020122292483468482.jpg

 連投第二段ですよー。
 またも一週間近く前で恐縮ですが。この日はセンター街ではなく道玄坂の方に行ってみました。
 道玄坂方向も多いんですよね。ぱっと思いつくだけで渋秀、光醤、仲本、春日亭、はやし、真武咲弥、まだ入ってないから名前憶えて無いのが二店ぐらい、そしてここ男旭山。と驚きの密度でラーメン屋が存在してます。

 行くたびにどこはいるか迷うんですが今回は男旭山をチョイス。なんか九州豚骨気分じゃなかったんです。
 と言う事でもうちょっと鶏ガラ醤油的な気分でいた物の豚骨白湯じゃなければいいかと醤油ラーメンをオーダー。
 ここのラーメンは旭川ラーメンなのかな。多分豚骨と魚介のWスープです。
 醤油らしい醤油って感じで好感度高いです。もうちょっとベースの味があっさりしてる方が好みですが、こういう北海道っぽい醤油も良いですね。バターとか入れたい感じです。次回はバターとコーンをトッピングするか味噌かとちょっとワクワクしてます。

 道玄坂方向は割と九州豚骨多いのでちょっとあっさり目に行きたいなーと言う時にオススメです。

CameraZOOM-2012013122293797332547.jpg

 更新サボってましたが食べてますよ。ラーメン。(2回目)
 サボってた間のを連投します。

 一番手はつけ麺大臣の鶏白湯そば。一週間前の話で恐縮ですが長月が渋谷で一番好きな鶏白湯ラーメン食べてきました。
 ここは鶏白湯と魚介醤油があるんですが、長月は鶏白湯恋しさに探して見つけて入った店なので最初の一杯は鶏白湯でした。
 そして未だに鶏白湯しか食べてません。でした。この二日後についに鶏白湯そばとか鶏白湯つけ麺以外のものも食べたんですが、この時点で五回か六回来てて鶏白湯以外食べてませんでした。
 ここの鶏白湯はこってり系で、京都こってり系を意識して鶏白湯が食べたかった長月にベストマッチでした。
 長月の一番なじみの味は (京都ローカルですが) 味の名門なのでもうちょっと甘みがない方が好みかなと思いますが、一口食べた瞬間にktkr!(゚∀゚) でした。
 味の説明が難しいですが天一よりあっさりで甘みがちょっと強い感じです。天一知らないとなんもわかんねえよそれ。
 ちなみにつけ麺大臣宇田川店の近くに天一センター街店があるんですが、この天一は三回入って三回ゆで具合が長月のストライクゾーンど真ん中にジャイロボールでした。渋谷マジパネエ。でも細麺ないのがなー。。。

 と言うわけでちょくちょく寄ってしまって新規開拓の妨げになりつつある大好き過ぎて憎いつけ麺大臣の鶏白湯そばでした。超おすすめなのでお近くの方は是非是非。

 画像をギャラリーから取ってこようと思ってstartActivityForResult使ってごにょごにょやってたらonActivityResultが呼ばれたり呼ばれなかったりしたので調べてみたことをメモ。

 適当なActivityを起動して結果を貰いたいときにはstartActivityForResultを使う。

// 画像取得ボタンの実装
// Intentの帰りを受けるためにActivityクラス内で定義する
@Override
public void onClick(View v) {
    Intent intent = new Intent();

    // 画像取得
    intent.setAction(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, 0);
}

 受け取る方は受け取りたいActivityにonActivityResultを書いとくと読んでもらえる。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0 && resultCode == RESULT_OK) {
        Uri uri = (Uri)data.getData();
        String imgFileName = uri.getPath();

        (略)
    }
}

 で、適当に作って適当に遊んでたらなんとなく動いたのでコードとか誰ともかぶらなさそうなのに変えようと思って変えてみた。

// 画像取得ボタンの実装
// Intentの帰りを受けるためにActivityクラス内で定義する
@Override
public void onClick(View v) {
    Intent intent = new Intent();

    // 画像取得
    intent.setAction(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, 0xDEADBEAF);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0xDEADBEAF && resultCode == RESULT_OK) {
        Uri uri = (Uri)data.getData();
        String imgFileName = uri.getPath();

        (略)
    }
}

 でもこれだとonActivityResultが呼ばれない。なんでやねん。
 で、差を見て理由がわからなかったので調べてみた。

 まずstartActivityForResultのコードを見てみた。ソースはAOSPから拾ってきたICSのr1。
 ※markdownで書いてる都合上4スペースを1タブで変換してます。

Activity.java: startActivityForResult

        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(
                this, mMainThread.getApplicationThread(), mToken, this,
                intent, requestCode);
        if (ar != null) {
            mMainThread.sendActivityResult(
                mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                ar.getResultData());
        }

 上記の通りstartActivityForResultではsendActivityResultで結果を返す。
 sendActivityResultが呼ばれるためにはexecStartActivityからActivityResultが返ってこないといけない。
 execStartActivityの中身を見てみると、ActivityResultオブジェクトを返すところが以下のようになっている。

Instrumentation.java: execStartActivity

                final ActivityMonitor am = mActivityMonitors.get(i);
                if (am.match(who, null, intent)) {
                    am.mHits++;
                    if (am.isBlocking()) {
                        return requestCode >= 0 ? am.getResult() : null;
                    }
                    break;
                }

 ActivityThreadが監視しているActivityMonitorの数だけ上記のコードが回されるんだけど細かいところはおいといて、returnのところを見るとリクエストコードが非負の整数でないと結果を返そうとしていない。
 リクエストコードはstartActivityForResultで渡している値なので、試したコードを再掲すると。

// 画像取得ボタンの実装
// Intentの帰りを受けるためにActivityクラス内で定義する
@Override
public void onClick(View v) {
    Intent intent = new Intent();

    // 画像取得
    intent.setAction(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, 0xDEADBEAF);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0xDEADBEAF && resultCode == RESULT_OK) {
        Uri uri = (Uri)data.getData();
        String imgFileName = uri.getPath();

        (略)
    }
}

 ばっちりリクエストコードが負の整数!
 そりゃないぜセニョール! と思ってAndroid Developersを確認してみたら。。。

Parameters intent The intent to start. requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits.

 ばっちり書いてあった(ノ∀`)アチャー
 いつものことだけどドキュメントよく読めってことですね。サーセンwwwww

このアーカイブについて

このページには、2012年2月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2012年1月です。

次のアーカイブは2012年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.11