java.util.ListIteratorのドキュメントが嘘つきな件(´・ω・`)

Filed in Android, Java, prog

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

あるときバグがあった

 とある要素の次の要素とか前の要素の情報を知りたくて、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は要素を指しているわけじゃないそうです。

[渋谷]つけ麺大臣 油そば

Filed in ラーメン

渋谷_つけ麺大臣_油そば.jpg
 連投第四弾。これでラスト。
 前の店が残念だったのでこのまま帰れないと近くにあったつけ麺大臣に行ってきました。
 いつもは鶏白湯そばか鶏白湯つけ麺をオーダーするんですが今回はネタ作りのために油そばをチョイス。次回は魚介つけ麺あたりかな。
 さて、肝心のお味の方ですが、油そばは期待したほど劇的においしいわけではありませんでした。もちろん他のラーメンで実力のある店なのでおいしいんですが、渋谷で他に食べてきた油そばと比較すると一歩劣ります。専門店と比べるのはフェアじゃないかもしれませんが。
 あ、でも日吉のあびすけの油そばよりはおいしいです。
 とりあえずいくらか食べておいしいけど一番じゃないなと思ったものの油そばは味調整がキモなので酢とラー油で化けるかもとぐりぐり入れてみました。するとそこそこよくなってなかなかおいしい。でも結局頭一個の差は埋めきれずでした。最初に思ったほどの差はなくなったので何度か食べるとこなれてきそうな気はします。
 つけ麺大臣はつけ麺のお店だしラーメンもおいしいので基本はやっぱりそっちですね。たまには違うのがいいなというときに選んでみるといいのではないでしょうか。

[渋谷]ももみづき ネギらあめん

Filed in ラーメン

渋谷_ももみづき_ネギらあめん.jpg
 連投第三弾。実はここについてはガマンしきれずにすぐ書いて貯めてました。
 職場でラーメンいかね? と誘ったら喜多方ラーメンが食べたい! という人がいたのでぐぐって行ってみました。
 実は二日前につけ麺大臣に行った時にも探してたんですが雑居ビルの六階にあると思っていなかったので見落としたお店です。見つからなかったのでつけ麺大臣に行くことになりました。
 さて、肝心のお店の話ですが、ももみづきはラーメンのお店ではないようです。スナックでラーメンも出しているような感じで正直ラーメン屋の環境としては悪いです。渋谷で入ってきた店の中では間違いなく最悪でした。スナックとして行くことをお勧めします。
 それでもラーメンがおいしければアリなのでおとなしくネギらあめんをオーダー。一緒に行った人と話しながら待ってみました。
 出てきたラーメンの見た目は普通にラーメン屋クオリティ。これは案外いけるのかなと思って食べてみると、麺は柔らかめで好みと違う感じでしたがまあ普通。スープは業務用に一手間入れましたといった感じで正直いまいち。トッピングに難アリで玉子がコンビニや酒屋で売っているおつまみ用の味玉のような感じでラーメンに入る玉子の食感じゃありません。
 おそらく多分に環境部分の減点が影響している辛口評価ですがラーメン屋として評価した場合点が低いのは否めません。スナックでラーメンが出ていると評価した場合は悪くないと思います。
 飲んだ後にラーメンが食べたくなるような人は行ってみては?

[渋谷]男旭山 醤油ラーメン

Filed in ラーメン

CameraZOOM-2012020122292483468482.jpg
 連投第二段ですよー。
 またも一週間近く前で恐縮ですが。この日はセンター街ではなく道玄坂の方に行ってみました。
 道玄坂方向も多いんですよね。ぱっと思いつくだけで渋秀、光醤、仲本、春日亭、はやし、真武咲弥、まだ入ってないから名前憶えて無いのが二店ぐらい、そしてここ男旭山。と驚きの密度でラーメン屋が存在してます。
 行くたびにどこはいるか迷うんですが今回は男旭山をチョイス。なんか九州豚骨気分じゃなかったんです。
 と言う事でもうちょっと鶏ガラ醤油的な気分でいた物の豚骨白湯じゃなければいいかと醤油ラーメンをオーダー。
 ここのラーメンは旭川ラーメンなのかな。多分豚骨と魚介のWスープです。
 醤油らしい醤油って感じで好感度高いです。もうちょっとベースの味があっさりしてる方が好みですが、こういう北海道っぽい醤油も良いですね。バターとか入れたい感じです。次回はバターとコーンをトッピングするか味噌かとちょっとワクワクしてます。
 道玄坂方向は割と九州豚骨多いのでちょっとあっさり目に行きたいなーと言う時にオススメです。

[渋谷]つけ麺大臣 鶏白湯そば

Filed in ラーメン

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

Intent投げて返りが欲しいときの注意点

Filed in Android, Java, prog

 画像をギャラリーから取ってこようと思って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

[渋谷]らーめん金伝丸 特丸

Filed in ラーメン

渋谷_らーめん金伝丸_名物特丸32546.jpg
 更新さぼってましたが食べてますよ、ラーメン。
 というわけで関東へ戻っての第一段はらーめん金伝丸の名物特丸です。
 このお店大抵人がいっぱいでなんとなく並ぶのもなーと入らずじまいだったんですが、1/30の夜に入る店を決めずにぶらついていたら空いてたので入ってみました。
 味は九州系の豚骨です。ですが博多な感じとも熊本な感じとも違うので関東にあわせて捻っているのかなと思いました。考えてみたら関東にきてから九州系の豚骨ラーメンをいくつか食べてもガチ博多! みたいな味はなかったように思います。生き残ってる店は何かしら工夫をしてるということなんでしょうか。
 さて、そんな金伝丸なんですが味はちゃんとおいしいです。渋谷は生き残ってるだけでもうおいしいんじゃないのかってぐらいラーメン屋が多いのでどこのもおいしいと書いてる気がしますがばっちりおいしいです。
 九州系豚骨だと近所に光醤があったりセンター街の方には桂花があったりして大変そうですが存在感で負けてる様な店ではないです。豚骨気分の時には候補に入れてみては?

[京都拉麺小路]ラーメン東大 徳島ラーメン

Filed in ラーメン

DSC_0109.JPG
 本日のラーメンは京都拉麺小路第五段ラーメン東大です。
 徳島ラーメンはここでしか食べたことがないのでみんなこんな味なのかわかりませんが、ラーメン東大のラーメンは濃くてまったりしててお肉が甘辛く煮てあるのが特徴です。お肉のたれのせいかスープの味もほんのり甘いです。濃いけど辛い系じゃないですね。長月はこの味嫌いじゃありません。
 ここのラーメンは濃いめのスープがとても卵に合います。無料の生卵をラーメンに投入してみたり卵かけご飯とラーメンライスしてみたりすると卵の魅力にメロメロです。もともとマイルドな味ですが卵を入れるとよりまったりと柔らかくなって濃いのに優しい味になります。
 そして長月的に一番お気に入りの点が麺。ここの麺の口当たりや食感がとても好きです。麺の固さやコシが長月のラーメンセンスにドハマりです。麺がおいしいお店でぱっと思い出すのは第一旭の硬めと宝屋とラーメン東大が筆頭でしょうか。しっかりした麺が好きな人にお勧めです。
 と、京都に帰省中のラーメン行脚はこんなところで、今回の帰省では京都駅に用事があったので京都拉麺小路ばかりでしたが、次の機会には四条や北白川にも足を延ばしたいですね。

[京都拉麺小路]一幸舎 焼きラーメン

Filed in ラーメン

DSC_0108.JPG
 1/28二軒目は一幸舎。ここも拉麺小路では長いですよね。多分ラーメン屋では唯一開始当初から残ってる店じゃないでしょうか。(すみれも?)
 残念ながら宝屋と佐世保バーガーのお店が退店して拉麺小路開始以来の最後の店舗になりましたが相変わらずの人気でしばらくは居てくれそうです。
 さて、今回食べたのはちょっと変わったラーメンでした。新メニューののぼりがあったので思わず頼んでしまいました。焼きラーメン。
 焼きラーメンというのは豚骨スープでラーメンの中華麺を炒めた焼きそばです。豚骨ラーメンのメッカ博多中洲では結構昔からあるようでラーメン好きなら知ってる人もそこそこ居るでしょう。
 実は長月焼きラーメンを食べるのは初めてでちょっと期待していました。ですが食べてみた初焼きラーメンは残念と言わざるを得ない味でした。思っていたほど豚骨の味がしない。割と味が薄い。パンチが効いてないので味が印象に残らない。お好みでどうぞと置いていかれた明太マヨも入れてみたものの脂っこくなるだけでした。思いつきで辛子高菜を多めに入れてみたらなんとなく良くなったので辛子高菜推奨です。
 とまあ採点の甘い長月にしては酷評なんですが、誉めるところがないわけではありませんでした。油そばなんかもそうなんですが、汁がないので食べやすいです。猫舌の方も冷めやすいので待ち時間が少ないでしょう。あとスープがあるラーメンより味が整えやすいのでトッピングでバリエーションを出すのに向いてると思います。つまりテーブル上の付け合わせで自分好みに染められるということです。長月が試した範囲ではトッピングを入れても本体の風味は早々負けないようなので個性がないわけでもなさそうです。
 というわけで長月の感想としては冒険だと思いますが興味のある方は試してみては?

[京都拉麺小路]くじら軒 醤油そば

Filed in ラーメン

DSC_0105.JPG
 昨日1/28も京都駅にいたので拉麺小路に行ってきました。
 さっぱりしたのから食べたい気分だったのでとりあえずくじら軒へ。ここの醤油はあっさり醤油の中ではトップクラスにお気に入りです。
 久しぶりに入りましたが相変わらずのおいしさ。あっさりしていて中華そばらしい鶏ガラ醤油ですごくほっとする味です。豚骨がはやる前はラーメンと言えばこれだったと言っていいぐらいラーメンらしいラーメンといった感じがします。
 くじら軒は塩もあっさりとしていておいしいのであっさりが好きな人、昨今の豚骨系ラーメンや魚介がきついラーメンに飽きてきた人にオススメです。
 この後一幸舎の焼きらーめんを食べたので次の記事で。


Warning: sprintf() [function.sprintf]: Too few arguments in /home/users/2/lolipop.jp-dp07042166/web/wordpress/wp-includes/widgets.php on line 1042
Oenology Post Formats
Click to view/hide

Warning: sprintf() [function.sprintf]: Too few arguments in /home/users/2/lolipop.jp-dp07042166/web/wordpress/wp-includes/widgets.php on line 1042
Posts Calendar
Click to view/hide
2017年6月
« 12月    
 123
45678910
11121314151617
18192021222324
252627282930  

Warning: sprintf() [function.sprintf]: Too few arguments in /home/users/2/lolipop.jp-dp07042166/web/wordpress/wp-includes/widgets.php on line 1042
アーカイブ
Click to view/hide

Warning: sprintf() [function.sprintf]: Too few arguments in /home/users/2/lolipop.jp-dp07042166/web/wordpress/wp-includes/widgets.php on line 1042
最近の投稿
Click to view/hide