投稿

NashornがOpenJDKのリポジトリに入ってたのでビルドしてみた

最近、新聞で取り上げられるなど話題(汗)のJava界隈の話。 何気なく、nashornの近況をググってみたら、 nashornがすでにOpenJDKに入れられてた。 ををっ! 自分の想像していた(根拠なし)より、ずっと早くOpenJDK入りしてた。 Nashornの2012/12/21のblogにはリポジトリのURLが載ってる。 参照:https://blogs.oracle.com/nashorn/entry/open_for_business nashornのリポジトリのログ見る限り、b65とか書いてあったので、 自分が先日確認した時点(b72)のbinary配布のjdk8に含まれているかと思って インストールしてみた。 サンプルコード: "use strict"; (function() {  // バージョン取得  var engineName = "nashorn";  var key = javax.script.ScriptEngine.ENGINE_VERSION;  var m = new javax.script.ScriptEngineManager();  var engine = m.getEngineByName(engineName);  var version1 = engine.getFactory().getParameter(key);  var version2 = engine.getFactory().getLanguageVersion();  print("[DEBUG]\r\n"    + " engine version = [" + version1 + "]\r\n"    + " language version = [" + version2 + "]\r\n");  var names = engine.getFactory().getNames();  var temp = [];  for (var i = 0; i < names.size(); i++) {   temp.push(names.get(i));  ...

久しぶりの投稿

何気なく見た サイト に今まで紹介された記事を見たことのないメソッドを見つけた。 Objects.hash() これは地味に便利なメソッドじゃない? JJUG CCC 2011 SpringでもOracleの寺田氏は紹介してなかったと思う。あれは概要だから仕方なかったのか? 7月7日のイベントではじっくり説明されるのかな? Effective Javaにこのネタ載っているし、第3版に記載させる確率高い重要なメソッドな気がする。 ...パッケージはjava.langでなくjava.util。なんでだ。 Obujects.hashCode()とか似たものがある。見ただけじゃ使い方よくわからない。いじってみるか。

最近参加したイベント

例によって今更報告ですが、 JJUG CCC 2009 spring行ってきたぜ。興味なかったクラウドについて知ったぜ。 google app engineのセッションは立見発生の大盛況だぜ。 興味なかったけど者のためしに聴講したセッションのおかげでクラウドが何たるか 見えてきた気がする。 ひが氏google app engine for javaのtipsも開発のキモがわかってよかった。 第1回 scala ユーザー会参加したぜ。最大の目的であるスカラ座で写真撮影できない オチがついたぜ。 scalaは 1 to 4のtoがどこで定義されているかわからず、質問しようかと思ったけど そんなレベルではなかった。すごいレベル高い。仕様読もうぜとか。 私には敷居高いなあ。    

日食ツアーその後

実は3月頃kntの日食ツアーキャンセルしていた。 私の金銭感覚では値段が高すぎる。 先日、本屋で日食の本を手に取ったら結構日食って頻繁に起こっていることが判明。 なんだぁ。 代わりに普通の国内旅行に申し込んだ。自分で計画して行く旅行はほとんど無いので ツアーとかで十分。 きっとおばさんばかりに違いないけどまあいいいや。 次回は海外旅行とか挑戦してみようかな。    

今日の積読。

イメージ
\やべえ/ うかつだった。こんな分厚い本とは思ってなかった。 てっきりEffective C++ぐらいの厚さだと…。 それ以前にすでに積読があるってのにまた買っちまった…。

googleカレンダーオフライン

やった!ついにきたぜ、googleカレンダー オフライン。 うれしいよー。    

セマンティクスってなに

「セマンティクス」という単語をあちこちで見かけていたけど、 今までどんな意味かよくわかっていなかった。 シンタックス(文法)に対してセマンティクスは「意味」「意図」を 表現することみたい。 参考にしたサイト JavaA2Z ではアクセス修飾子protectedで作成者の意図を 表現する例を挙げた。 「意図した使い方は便利に、意図しない使い方は使いにくく設計する。」 というような言葉がどっかにあったと思うけど、これはセマンティクスを プログラムにしっかり織り込むことすすめている話なのかも。 他には... 多分引数にconstを記述するのもセマンティクスの話だろう。 javaでいうと@Overrideアノテーションとか。 プログラミング言語XXや言語入門~などの書籍はシンタックスを紹介し、 Effective XXのような書籍は良いセマンティクスを紹介しているんじゃないかな。 なんかこう、制約を課すような文法はセマンティクスを内包している感じがする。    

JNAのコードを読んでみた

NetBeansの利用ライブラリ一覧を眺めて、JNAなるライブラリを発見。 以前JNIについて調べたことがあったが、JNAはとっても便利そうだ。 .NETのP/Invokeっぽく使えてネイティブライブラリの資源が活用し やすくなったと思う。ブリッジ用DLLとか作る必要なくなって、 Javaから直接ネイティブDLLを呼んでいる感じになるみたい。 P/Invokeのときみたいなエントリポイントのエイリアスとかどうやるんだろ? 今度サンプル作って試してしてみよう...。 CallBackを定義したJavaコードをネイティブで実行できるのは夢広がるなあ。 GPUで処理させたりできないかなあ。 少しいじってみたけど、どうやってこの仕組みを実現しているのか皆目 見当つかないなあ。 ということで、仕組みが知りたくなりソースを読んでみた。NetBeansの プロジェクトなのでNetBeans利用すすることでコードが追いやすかった。 ざっくりいうと、JNAは2層構造でJava側とネイティブ側がある。 Java側はjava.lang.reflect.Proxyクラスを利用している模様。Proxy クラスなんて初めて知ったが、JNAはこれを利用するサンプルとして いいかも。 ネイティブ側はlibffiという代物を利用している。ffiはforeign function interfaceの略らしいのだけど、これが良くわからん。 各種アーキテクチャ ごとのフォルダが並んでいるので、きっとバイナリコードを読んでメタ プログラミング的に定義されている関数を呼び出してくれる仕組みなんだ ろうけど...。 詳細はサッパリ。そもそも拡張子.Sのファイルって...。 私には無理だわ...。 そもそも読む気が起きない。 (^_^;) あとJNAの内部の仕組みについて、ウソ書いていたらごめんなさい。    

kntの皆既日食ツアー

当選した。 さあ、旅行の詳細計画立てないと。主に雨が降ったときの慰め観光を。    

リフレクション無しにjar間のクラスを解決する作りこみ

slf4j,logbackの仕組みから学んだ方法 ※既存のシステムに対して行うというより、これから作るjarモジュールの  分割する方法として使える方法ですな。 api.jarとimpl.jarがあり、クライアントはimpl.jarの実装を直接触れずに api.jarだけ利用するような。インタフェースと実装を切り分ける構成の場合。 impl.jarのクラスの解決はClass.forName()などのリフレクションで行う。 この場合、ロードするクラス名を設定ファイル等でどこかに保持しておく 必要がある。 slf4jの仕組みでは、リフレクションを使わず、クラスパスでのクラス定義 解決を利用する。 1.api.jarはコンパイル時、スタブimplクラスをつくってコンパイルする。 2.jar作成時、スタブimplクラスファイルを抜き不完全なjarを作成する。 3.impl.jarにapi.jarで間引いた、implクラスを実装する。 これがimpl.jarのfacadeクラスに当たる。 4.クラスパス解決時にapi.jarだけでは不完全のため、他のjar(ここでは impl.jar)の同名クラスで解決する。 これにより、実装とインタフェースを分けたモジュールを何の機構も 無しに解決することができる。 なんだかC/C++のリンクに似てる感じ。 後はimpl.jarがない場合のClassNotFoundException()だけ処理して アプリ自体が死なないようにすれば良いわけか。 javaだからこそビルド後"ファイルを間引く"という技が使えるわけで。 これはいいアイデアだ。 pluginのような動的な差し替えが起こらなければ、十分なわけで。 凝った機構を作りこむわけでもなく非常にシンプル。 よく知られた手法なのかな? 些細なことなんだろうけど、私には到底思いつかないアイデアだなあ。    

java7のロードマップ

すでにあちこちで反応があるようですが、アップデートされたjava7の ロードマップの件で、クロージャが含まれないようですね。    JavaLobbyの記事    InfoQの記事 私はblogでクロージャのこと書いていたので余計切ないなあ。 でも前から賛否分かれているので、まあ仕方ないのかなあと。 それより気になったのが  ・Reified generics なにこれ? "Reified"ってO'reilly「Java Generics and Collections」で盛んに出てきた 単語だけど... ちょっと調べた限りだと、型情報をRetentionPolicy.RUNTIMEでも保持し続ける ような仕組みらしいよ? こっちの方がずっと重要じゃないか。 これがJava7に含まれないほうがよっぽど悲しい気がしてきた...    

SunTechDays2008に行ってきた(いつの話だ)

blogしばらく放置していたのでねたが古い古い。。。汗 もったいないので一応上げとく。 JavaFXは12月4日木曜の夜頃リリース。 intelの人の発音によるとNehalemはネハーレム,ネヘーラムというらしい。 glassfishV3はアプリに組み込み可能なライブラリ形式もあるらしい。 JavaFXはSwing,Java2Dの他に、Swing,AWTの上にSceneGraphという ライブラリを利用しているらしい。java.netにプロジェクトがあるとのこと。 先日、 Filthy Rich Clients を衝動買いした。 JavaFXで利用されている技術と関連する記述がありそうなので読んでみる。 (前半はJava2Dの基礎的な内容も書かれていて、私にはちょうどよい。 日本語版Effective Java Second Edition(第2版)買った。 オマケつきを期待して会場で本を購入したが、オマケではなく割引だった。 洋書販売もしており、皆さん当然のように読むのだなあと感心してました。    

Javaのクロージャをいじってみた。(8)

何か、closureの引数でワイルドカード使うとエラーになる。 詳しく調べてないけど、以下のコードはエラーになった。 (BGGA 2008-08-11版のclosure.jarでやってエラーになった)  // × コンパイルエラー  // "? supre T"の周辺で6つぐらいエラーが出る。  public Integer calc({? super T,Integer} func) {   // ありゃエラーになる。  }  // ○ コンパイル/実行可能  public Integer calc(Function<? super T,Integer> func) {   // これはOK  } んー これは何か理由あっての制限なのかな。 それともこのバージョンは未完のためエラーになってしまうのかな。 英語だからってBGGAのページのドキュメントを読むのサボったから 見落としたのかな...。汗    

Java Genericsが難しい(5.1)

ジェネリクスと配列の組み合わせは相性が悪い。 という件は、2007年のJavaOneのセッション「Effective Java Reloaded: This Time It's Not for Real」で言ってるね。 ちゃんと読み直せばO'Reillyの「Java Generics and Collections」にも 書いてあるかも。    

Java Genericsが難しい(5)

ジェネリクスと配列の組み合わせは相性が悪い。 大抵のコードはエラーになる。色々調べたが、そういうものらしい。 それでも納得いかないコードもある。 ArrayList<string>[] = new ArrayList<string>[]; これもエラーになる。これはあんまりだと思う。 これはコンパイル通っていいんじゃない? 次のバージョンでコンパイル通るよう、直すべきだー。 そんなある日、ClassのAPI見てて気づいたのだけど、 Class#getClasses()の戻り値はClass<?>[]なのよ。 つまり、"ArrayList<string>[] ="の部分は問題ないと。 そこで思いついたのが、effective java second editionの手法や、 Google CollectionsのListsやMapsクラスの手法をちっと拡張した 生成用補助メソッド。 但し、ジェネリクスと配列の組み合わせでどうしてもワーニングが発生する。 そこはあきらめ、少なくとも@SuppressWarnings("unchecked")を書くコードと 書かないコードを切り分ける。 書かざるを得ないなら、コードに散在させず、まとめておく。 で作ったのがこれ。 // 定義側 public class ArrayUtils {   ;  @SuppressWarnings("unchecked")  private static <T> LinkedList<T>[] newLinkedListArray(int size) {   return new LinkedList[size];  }   ; } // 利用側 public class Main {   public static void main(String... args) {    ArrayList<Integer>[] temp = ArrayUtils.newArrayLists();    temp[1] = new ArrayList<Integer>();    temp[2] = new ArrayList<Integer>...

「日本語版Effective Java 第2版」のAmazon予約開始

訳者の柴田 芳樹氏のブログによると「日本語版Effective Java 第2版」が Amazonで予約可能になったようですね。 予約すべきか、Sun Tech Daysでやるかもしれない会場販売で買うべきか (オマケ期待)。 ううむ… あと、値段思ったより安いのね。ずいぶん厚くなったから4000円越えると 思ってた。 円高のおかげ?関係ねぇか。    

Arrays.asList()のジェネリクスの仕組み

以前、 ジェネリクスについて書いた とき、引数型に(T...)を利用するのは 相性悪いと書いた。 このときは、引数型(T...)を持つ、インタフェースを継承し利用したときを 例にした。 でも、JavaPlatformAPIの中にはArrays.asList(T... t)というメソッドもあった。 そこで、OpenJDKを開いてasList()のソースを調べてみた。 public static <T> List<T> asList(T... a) {   return new ArrayList<T>(a); } あれ?配列受け取る引数のコンストラクタなんてArrayList持ってたっけ? と思ったらArraysコード内で同名の実装クラスを持ってった。 おおう。 List<T>が戻り値なのでこれを満たせば十分と。 なるほど。 このクラスの中身を見たところ、ジェネリクス配列そのものを内部に持ち、 単純なラッパークラスでした。 ArrayList<T>の様なコンテナとしての利用はOKでComparator<T>みたな 継承前提インタフェースでの引数型に(T...)を利用するのはアウトということか? ふうむ... 余談ですが、Arrays.asList()の利用方法は、可変長引数からListクラスを 作るだけでなく、配列のラッパークラス生成の便利メソッドとしての 利用もよさそう。    

きました。

イメージ
RRoD。 これが出てやっと一人前の360ユーザー。   とはいえ、 来週、大規模アップデートあるのにこの時期はねーだろ。ヽ(`Д´)ノ ところでこの写真、HAL9000ぽく撮れてたんだけどかっこよくね?    

Javaのリフレクションの勉強

私はJavaの基本機能は一通りは理解していると思っていたのですが、 最近、理解していないことが沢山あることに気づきました。 とりあえず、理解不足が集中しているのがリフレクション・クラスロード関連・ あとシリアライズ関連。わんくま同盟の方のblogを見てまだまだ知らないことが 沢山有ることを知り猛省。 リフレクションについては、アノテーション関連で必須になるので理解して おかないとなあ。 インナークラスから、エンクロージングクラスの参照(this)取得する方法とか つい先日知ったよ! .thisだって! へー。   そんなレベル。        

JJUG CCC 2008 Fall行ってきた。

JJUG CCC 2008 Fall行ってきた。(いつの話だ...) がんばっている方々の姿を見てモチベーション上げようとか思ったのに 皆さんスゴすぎて、逆にベッコリへこんできました。 今回は論文発表のようなセッションが多く、実装ベースのものは 多くなかったような感覚がします。気のせい?以前に比べ普段着の人多かった ので学生なのかなあと。まあサラリーマンには平日はやっぱ厳しいですよね。 Hudsonの川口氏はviユーザー? サラッと利用したエディタがviだった。 他には、ペアプログラミングのライブするセッションではHHKとemacsの 組み合わせとかあったな。後でJJUGプレゼンされた方のblogを見て 回ったけど、中にはHHKをモバイルと一緒に持ち歩っている人もいるようで。 すげえ。昔あこがれたなあ。 あとHHKは意外とガチャガチャうるさいのね。以前会社の席の近い人に 言われたことがあるけど、人が打っているの見て初めてわかった。 たまたまマイクが近くだった音が大きかっただけだろうか? Scala 最後Scalaセッションは、マイブームど真ん中なので大変興味深かった ですね。挙手アンケートで多くの人が「触ったことがある」とのことで、 注目されている言語のようですね。俺も置いてきぼり食らわない よう勉強しないと。 ギーク 日本で一般にギークという単語が認知されたのは、「小飼弾氏のアルファ ギークに逢ってきた」という本あたりなのかしら。 なんだかギークという言葉の解釈に違和感を感じました。 私は 技術系オタ = ギークという感覚をもっています。 /. や engadget の出オチ記事を読んで面白いと思える人、ネタを作れる人が ギークというか...。 個人的には、ホリデープログラマ向けのネタ的プログラミング セッションもほしいなあと。 Androidのセッションはゲイナーとかあって、「作ってみた」的ネタが 期待できるんだけど、まだまだこれからみたい。 平日からそんなことしても人集まらないのかしら。あとスポンサーも。 そもそもJJUG等のイベントに対して、私の求めているもの自体が 間違っているのかな...。汗 ※1 LLと書くのとLL言語って書くのどちらがいいだろ?   LL言語の方が分かり易いと思うけど「Lightweight Language言語」   だもんなあ。I...