prog

Posts filed under prog

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は要素を指しているわけじゃないそうです。

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

java.util.concurrentのドキュメントがひどい件(´・ω・`)

Filed in Java, prog

 ちょっとコンテナに用事があって、マルチスレッドなので色々気をつけるのもめんどくさくてjava.util.concurrentパッケージなんて調べてたんですが、APIドキュメントを読んでて意味不明な用語がありました。
日本語版Javadoc
 ConcurrentLinkedQueueの辺り。「リンクノードに基づく、アンバウンド形式のスレッドセーフなキューです」。
 アンバウンド形式って何?
 よくわからないので原文探してみた。
英語版Javadoc
 同じくConcurrentLinkedQueueの辺り。「An unbounded thread-safe queue based on linked nodes」。
 ん? 形式とかどこ? unboundedがアンバウンド形式?
 unboudedはboundedでない。詰まり有界ではないと言ってる気がする。誤訳なんちゃうのこれ。
 と思ったら結構有名みたいこの誤訳。直せよ(´・ω・`)

android.graphics.Matrixの動作

Filed in Android, prog

 DevelopersでMatrixの仕様を確認しようとしたついでにいくつかblogを見た感じ
http://mymo.blog8.fc2.com/blog-entry-39.html
http://blog.livedoor.jp/inosan206/archives/51847604.html
 見たいにはまった人が居るようなので解説。
 Matrixには行列を設定するメソッドがいくつも用意されてます。
* xxxRotate
* xxxScale
* xxxSkew
* xxxTranslate
 xxxにはpre、set、postが入ります。
 preはすでに設定されている行列より前に目的の操作が行われるように行列を掛け合わせます。
 setは与えられた引数で行列を作って設定します。
 postはすでに設定されている行列の後に目的の操作が行われるように行列を掛け合わせます。
 つまり冒頭で挙げたblogのような不思議な挙動は使うメソッド或いはメソッドの順番が問題だったわけですね。

【急募】C#の良書教えてなう

Filed in C#, prog

 どうもどうも以前C#の仕事するかも詐欺を行った長月です。
 今度こそC#の仕事にアサインされたので勉強用の書籍を探しています。
 とりあえず独習C#2.0があるのでその範囲外のトピックを扱ってるものがいいです。
 アプリ作るときに気をつけるべきものとか.NETに特有の事情とかC#らしいスタイルがよくわかるとかお前ライブラリの中身とか低レイヤの事情とか好きだろ? とかそういう観点でいい書籍があったら教えてください。
 ↓しかたねーな教えてやんよという方はコメントどぞー。

ストラウストラップのプログラミング入門はじめました

Filed in C/C++, prog,

 こんにちはあおいたんこと長月葵です。

 長月も査読に参加したプログラミングの教科書「ストラウストラップのプログラミング入門」がもうすぐ発売です!
 C++erなら誰もが知ってるストロウストラップ御大が手ずから書いた、C++を使ったプログラミングの入門書として名高いProgramming Principle and Practice Using C++の日本語版です。
 約二年に渡る査読作業の結果妙な訳も概ね無くなって初心者も中級者も上級者も一読しておくべき本に仕上がったと思います。
 Amazonでも予約が始まったみたいなのでリンク貼っときますよ。

 

XcodeのSCMでちょっとはまったのでメモ

Filed in progTags:

 XcodeのSCMでちょっとはまったのでメモ。
 XcodeのSCMメニュー経由でSVNを使ってバージョン管理をしているのだけど、ローカルで管理してるとHDDとか壊れたときに困るので外部のリポジトリに移した。
 で、そのリポジトリからチェックアウトしたプロジェクトでコミットとかdiffとかしようとすると170001(Authorization failed)が発生して操作できない。
 しばらく設定を格闘しても正しいっぽい。そもそもリポジトリの構成メニューでは認証出来てる。ターミナルで試してみても認証が通らない。でもなんかユーザ名が違う。なんでユーザ名が違うんだと海外のblogとか見て回っていたら同じことで悩んだ人が!(→こちら
 設定全部見たつもりだったけどプロジェクトの設定をローカルのリポジトリから外部のリポジトリに変えてなかった。なので認証に使うユーザ名とかパスワードとかがローカルのリポジトリに使われるものになっていて認証エラーになっていたと。なんでSCMの構成メニューとSVN操作で統一感ないんだこれ。
 まあ日本語ではこの手の話題が引っかからなかったので同じことで引っかかる人のためにメモっておきました。
まとめ:
 SCMの構成メニューでは認証出来てるのにコミットでAuthorization failed出る人は[プロジェクトの設定]→[一般]→[ルートとSCMを構成...]を確認してねってことで。

あ、あれ?

Filed in prog,

最近ちょこちょこ読んでるTypes and Programming Languagesなんですが、どうも全体をパラ見した感じA正規化とかの話題はないっぽい? 或いはλ式の変換式とかでの議論はないっぽい?
ちょっと期待はずれでしょんぼり。
まあパラ見で英語が読めるほど英語力ないので数式とかBNFしか読んでないですからね、見落としてる可能性は高いのです。どっかに載ってる事を期待して読み進めます。

Types and Programming Languagesが大変な件

Filed in prog,

内容難しいし英語だし。。。
正直何度も読み返すのは英語な分だけ労力がバカにならないのでメモしながら読まざるを得ないと感じました。
というわけで数学的なつぶやきが今後増えるかも。
#計算理論の基礎も読んでるしね! 全然基礎じゃねえよあれ!

coutの動作に軽く驚いた

Filed in C/C++

わんくまの方に投稿したんですがなにやらいつ見てもさーびすあんあv(ryなのでこっちにも。

ちょっと古いエントリへのリンクで恐縮ですが。

http://d.hatena.ne.jp/y-hamigaki/20091212#1260635305

wcoutにchar食わせられるの? と言う話題に対してこのURLが示されていたので見てみたら吃驚の動作。

長月は普通の環境でC++使う事はあんまりないのでcout自体まず使わないんですが、たまに使う時もあまり気にせず日本語含みならwcout程度で使ってました。詳しく見るとこんな動きするんですね。

C++のオーバーロードとテンプレートむずかしすなー。


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年12月
« 12月    
 12
3456789
10111213141516
17181920212223
24252627282930
31  

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