JavaOne二日目
Twitterにエントリできなかったので、テキストファイルに書いたメモをそのまま。
一部不適切な表現がありますが、それは、それって事で、お許しくだしあ。
Closures Cookbook
BGGA Review =>演算子が嫌な感じだなぁ…、 っつうか、レキシカルコンテキストはイラナイのだけどな。 Aggregate Operations Closures と、Fluent Interfacesのコンボで、超キメェ。 ライブラリ作るのが大変すぐる。っつうか、コード読むのも、特に読み易いとも思えないんだが… これ、どうやってデバッグすんだ? 特に、lexicalcontext的な話を、ちゃんとデバッグすんの、スゲェ面倒だぞ、きっと。 スタックにどんだけメモリ食うのかもよく分らん…。 っつうか、それぞれのOperations部分が、Colosureなら、それぞれヒープに領域とるよねぇ? …大丈夫なの?VMが、そこは、最適化するの? TS-5515の内容が、非常に参考になるらしい。(寝てたな…ぁぅぁ…) An API Closures使わないケースと使うケースで、どう変わるかねぇ… 段階を追って、 メソッド呼び出し →独立したクラス ・戻り値がある時に、何か混ざっちゃうのは、イマイチじゃね?とか。 ・まぁ、デフォルト値次第で、コードの綺麗さは、そこそこ変わるだしなぁ… →Multicatchキター!! →Rethrowスゲーーーー →クロージャを使って、APIを書き直してみたり。 ああ、そうか、Genericsがあるから、Callableで大概良くなるのか。 でも、俺が好きな、コーディングパターンは、使えないのかな… メソッドを複数用意したinterfaceを、ボチボチ呼ぶみたいなアレは… クロージャと、型引数をExceptionのサブクラスにするコードパターンは相性がいいんだってさ。 interface Block { void execute() throws T; } こういうのね。 つまり、 interface Executable { R execute() throws E; } execute(Executable executor) throws X { return executor.execute(); } まぁ、こうしろ、と言う事か。キメェな…
型引数の
型引数の前置キーワードでthrowsなんて増えるの?
引数の無いクロージャでは、=>演算子を使わない、簡易記法がアリって事らし。
withstreamのサンプルは、穴が開くほど読むべき。
ナンゾ、スゴイ量のコードが、小さく再表現されていた。
クロージャが二重に使われる事で、原型を留めていない様な呼び出しになっていた。
function type notation ???
public class With1 { /** * A "with" statement that closes your closeable at the end. Any * IOException thrown from the close() method is silently * swallowed. Example usage: <pre> * with (InputStream s : new InputStream(...)) { * // code using s * } * </pre> */ public static <T extends Closeable,R,throws X> R with(T t, {T==>R throws X} block) throws X { try { return block.invoke(t); } finally { try { t.close(); } catch (IOException ex) { // ignore exceptions throws from close() } } } static int counter; static class MyCloseable implements Closeable { final String s; MyCloseable(String s) { this.s = s; counter += 1; } public void close() throws IOException { counter += 2; throw new IOException(); // it will be ignored } } public static void main(String[] args) { with (MyCloseable c : new MyCloseable("testing")) { if (c.s != "testing") throw new AssertionError(c.s); if (counter != 1) throw new AssertionError(counter); } if (counter != 3) throw new AssertionError(counter); } }
eachEntryのサンプルも、何か凄く違和感があるぞ。
forはキーワードなのに、今までと全く違う使い方をしている。
プレゼンで見たのと違うけど、eachのサンプルはこんな感じ。
public class Bloch1 { static <T> void each(Collection<T> c, {T=>void} block) { for (T t : c) block.invoke(t); } public static void main(String[] args) { List<Integer> li = Arrays.asList(1, 2, 3, 4, 5); each(li, { int i => System.out.println(i); }); } }
引数の型に、interfaceじゃなくて、メソッドの構造を指定出来るのか。
っつうか、Scalaにも、こんなのあった様なキガス。
Structural Subtypingとか、そんなんじゃなかったっけか…。
withLockのサンプルは、リエントラントロックが、大きく変わるっつうか、
あれじゃ、syncブロック使えばイイジャン。アフォかwwww
Modularity in Java Platform
JSR-277かね? OSGiとか、何か色々とッ散らかってる感すらあるなぁ… 機能としては、大体この3つが要るヨネ?とか。 ・Package ・AccessControl ・Interfaces まぁ、そうね。OSGiも大体そんなもんだ。 またキーワード増やすのかよ… package の前にmoduleて…、アフォか!!!! アノテーション位にしとけよ… module-info.javaとかwwwww もうダメだwwwwwww VMレベルでmoduleサポートするのか。 つまり、VMが理解するメタモデルの量が増える訳だな。 まぁ、しかし、今の今までmoduleシステムが、真っ当に動いてなかったのには、 それなりに理由があると思うんだがなぁ… Jar Hellってば最悪だよね、みたいなのは、DLL Hellの頃と変わってないじゃんよう。 でも、それはそれで、テキトーに動くんであって、COMや.NETの様な解決策が、 必ずしも正解じゃないと考えている人達はいる訳だよね… The JAM Module System JavaSE7に入ってくるのん?これは、OSGi実装の足回り足りえるのん?んぐー JAMのmetadataは、がりがりとアノテーションを書く。これは、良筋。 でも、俺としては、META-INF/MANIFEST.MFに書いて欲しいんだけどなぁ… ソースコードじゃなくてさ。っつうか、modulurityとコードって、 ほんとは、全然関係なくネ?とかさ。 正直、スコープのモデルと全然違うコンテキストを用意するんなら、それこそ、 メタモデルをソースコード上に書きたく無い… 既存のスコープモデルの上に、moduleが追加されるんなら、 つまりは、スコープの数と種類が2倍になる訳だよね…、 まぁ、何かさ頑張らなくてもいいんじゃないかな… JVM上で動作する言語ではそれぞれ、moduleを意識したスコープモデルを実装してさ、 本家のJavaでは、既存のままでもいいんじゃないかなぁ。 つまりは、Cでasm{}みたいにさ、もう、最終的には何でも出来る領域って残しておいて欲しいんだよネェ… スコープまわりの情報を絞る為の設計ってさ、つまりは、 再利用可能性を定義する事なんだけど、それって、妥当な設計するのがスゲェ難しくて、 結局の所、卑近な表現をすると、スコープを絞った中に、Hackしたい対象はある訳だよ。 クリーンに設計されたinterfaceはそれはそれで必要なのだけど、 そんなに上手く可視性を設計出来ると思うのは、何か、ねじが飛んでるんじゃねぇの?みたいなー。 複雑な可視性構造を出来る様にしたトコロで、地獄の種類が変わるだけだと思うナリ。 A framework for the module System moduleのリポジトリモデルねぇ…単なるツリー構造じゃん… まぁ、何か、他に構造があるのかといわれれば、ねぇけども。 おおう、複数のRepositoryが、1つのJVMのなかで、ゴタゴタと通信するモデルについて説明している。 うん。やっぱり、結局ツリー構造を作らざるを得ないのだね。 後は、このツリーが、シンボリックリンク的な事がサックリと無駄なく、 効率的に出来るかどうかが、問題になるかな。 OSGi in the java Module System 結局、現状キチンと実装されていて、 実績のあるJavaのModuleシステムって、OSGiしかないんじゃね? あー、そんな事も無いか。EJBコンテナとか、DIコンテナもある種のmoduleシステムだな。 でも、スコープを再定義する様なmoduleシステムで、稼動実績がキチンとあるのは、OSGiだけなのかな…
Debugging Data Races
物凄い早口で、まくし立てられたので、途中メモは、無理ですた。
気付いたトコロと、知らんかったやり口を中心に、質疑応答中にメモした感じ。
String でないToken、例えば、longを、per-Threadなring-bufferに突っ込むべし。
マジで!。つまり、タイミングによって、どこがバグっとったのか検知しる。
Stringは、重いからダメなんだってさ。
Double-Chekced-lockingっぽいコードには、バグが入ってるかもねー、とか。
複数スレッドによる、読み込みと、たまに書き込まれるnullのパターンは、確かにヤヴァイ。
キャッシュミス系のバグは、マジで見つからない。
厳密な話、キャッシュ系は、結局の所、読み込みの無いタイミングで、書き込むしかないんじゃねぇの?
つまり、サーバ起動時にキャッシュしる。それ以外は、読込みのみにしる。
ドキュメント超重要。とかwwwww
テキトーなコードを自前実装すんな、とか。
ドキュメントだって言ってるのは、Genericな超絶アイディアが無いからだって、まぁ、そりゃそうか。
java.util.concurrentは、ちゃんとテストされてるからイイよ。とか。
printfデバッグは、凄く簡単で、イイのだけど、書き込みバッファを食っちゃって、
バグが隠れるケースが、あるから気をつけるべき。まぁ、確かにそうだ。
logging系フレームワークによって、タイミングが変わるケースも、忘れないで。
つまるところ、Data Raceなバグを発見する為には、I/Oを伴うデバッグ方法はダメだっつう事か。
ring-bufferに、System.nanotime突っ込んで、後で検証する…とか…ないわー