投稿

9月, 2008の投稿を表示しています

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

unrestructured closureなるものが出てきた。キーワード==>とか。 このunrestructured closureの書きっぷり、Rubyのブロックっぽいな。 unrestructured closureを見てまずひらめくのは、多次元配列や コレクションのforeachメソッドかな。多次元でもひとつのforeach()で すべての要素をイテレーションする。 ↓こんな感じの。 //定義側 package xxxx; public class Matrix3 {   public int[][] elements;   public static void foreach(Matrix3 mat,                {int==>int} closure) {     int[] row = null;     int element = 0;     for (int i=0; i<elements.length; i++) {       for (int j=0; j<elements[i].length; j++) {         elements[i][j] = closure.invoke(elements[i][j]);       }     }   }   public Matrix3() {     elements = new int[3][3];     for (int i=0; i<elements.length; i++) {       for (int j=0; j<elements[i].length; j++) {         elements[i][j] = 0;       }     }   } } //利用側 import xxxx.Matrix3; import static xxxx.Matrix3.foreach;   ; void func() {   Matrix3 mat = new Matrix3();   foreach(int element : mat) {     element = 10;   } } というような感じ。 呼び出し側の記述は、":"の右側がforeach()の引数、左側は クロージャ==...

C++テンプレート宣言と定義

1.クラステンプレートを利用したクラスの書き方 C++テンプレートを利用したクラスを初めて書いてみた。 とろが、リンクでエラー。 いくつか存在するC++のサイトサンプルに従い作ったがうまくいかない。 色々調べた結果、以下のことがわかった。  ・クラステンプレートを利用したい場合、よくやるクラスメンバの   定義と異なりクラスメンバの定義もヘッダファイルに記述する   必要がある。(-->要はヘッダで完結しソースファイルを作らない)  ・externをつけるとソースファイル(.cpp)に書くことも可能らしい。   但し、externに対応しているコンパイラが多くないため、いい方法では   ないらしい。(VisualStudio2005はだめらしい) これは知らないとプログラムがビルドできない知識なのに、書いていない サイト(書籍)が結構ある。んーなんでだろ? とりあえず自分がリファレンスとして利用している 手元の書籍には書いて 無いっぽい。C++の言語仕様が複雑なため、網羅し切れていないケースも 少ないということなのか? Effective C++など有名な書籍を読めばそれくらいのこと書いてあるのかな。 例: // ★クラステンプレートの利用(ヘッダファイルで完結する必要がある) // .hppファイル template<int R, int C> class Matrix { public:  Matrix();  ~Matrix();  void func(); }; template<int R, int C> Matrix<R, C>::Matrix() { // コンストラクタ } template<int R, int C> Matrix<R, C>::~Matrix() {  // デストラクタ } template<int R, int C> void Matrix<R, C>::func() {  // メンバ関数 } // .hppファイル終わり そういえば、テンプレートはデストラクタ関連で何か制限があるとか どこかに書いてあったような...。なんだっけなあ...。 2.ヘッダファイル拡張子 ヘッダファイル拡張子の慣習の中には、以下のような慣習があるらしい。...

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

(※updated 2008-08-11のBGGAクロージャライブラリ使用) 1.return の記述 いまさら気づいたんだけど、returnのないクロージャの場合、 最後のステートメントは ; つける必要があるみたいね。 逆にこれがついていない場合はreturnがあるものとみなされるみたい。 // ○ 成功する {String str => System.out.println("Hello " + str); } // × コンパイルでエラーになる // [cannot use a void expression as a closure result]というエラー {String str => System.out.println("Hello " + str) } 2.戻り値無しのクロージャ型記述 あとクロージャの型はvoid型戻り値の場合、明示的にvoidを記述する必要が あるっぽい。引数は空でいいのに。 ...昔のblog記事見直すと{String=>}とか書いているので、 BGGAクロージャライブラリのバージョンによって違うのかも。 // ○ 成功する {String=>void} print; // × コンパイルでエラーになる // [required a type; found a lambda]というエラー {String=>} print; // これはOK {=>String} print; 戻り値として渡したいステートメントは、最後尾で ; が ついていないことが目印なのかも。(想像) {=>} とかいう型の書き方はなくなっちゃうのね。void型ぐらい無記名でも いいと思うんだけどなあ。 {=>void} ってリフレクションやJNIで利用する シグネチャの書式 ()V っぽいな。      

最近の流行のJNI

最近の流行はJNI 現在仕事で.netを利用しており、度々ネイティブコードを 呼ぶ必要が出てきており、P/Invokeのお世話になっている。 そんなときjavaではネイティブコードとの連携はどうなのよ? という疑問がふと起きまして、調べている。 JNIってJavaプラットフォームを構築するなくてはならない基盤技術だと 思うけど案外情報が少ない気がする。 OpenJDK読むにはこの知識必須っぽいよ? 単に調べ足りないだけかな?海外のサイトならたくさんあるのかな。 とりあえずsunのJavaのリファレンスマニュアルと、日本語で数少ない ピアソン・エデュケーションのJNI本を買って読んでる。 C/C++相手なので、メモリ管理やマルチスレッドに対する記述について、 安全なお決まりの書き方のようなものがあれば知りたいと思ったのだけど、 具体的なサンプルコードはweb上ではあまり見つからなかった。 サンプルコードで手に入ったのはOpenJDKだったので、ちょろっと読んで みた。意外だったのは、Stringクラスのネイティブコード部分が意外に 少なかったこと。見間違えでなければJNIの関数は1つしかなかった。   【2008/09/22追記】   ↑よくよく見たらネイティブコード(hotspotのコード)に    java_lang_Stringクラスとかある。 …ん~わからん。 投 昔Stringクラスは高速化のためネイティブコードを 活用しているようなこと聞いた気がするんだけどなあ。 バージョンによって違うのかな? 私のような初心者にはまだ早すぎたようです...。出直します。 気を取り直し、まずは購入したJNIの本を読んでみことにする。 JNIは前世紀でほぼ固まった仕様っぽく、購入した本も1998年初版の 本だけど、新宿紀伊国屋で買ったこの本はやけにきれいだった。 焼けて黄ばんでいるかと思ったけどそんなことなく。 やっぱり需要はあって、コンスタントに売れているのかも。      

P/Invokeで深いため息がでた。

1.P/Invokeについて 仕事で.netからWIN32API呼び出しする処理を書くことになり (P/Invokeというやつ?)構造体定義でウンザリしているところ。 API呼び出しなんて誰が書いても同じになると思うんだけど、 なんでそんなこといちいち定義を書き起こす必要があるのかと。 ...何のためのMicrosoft.Win32ネームスペースなのかと。 こう...深いため息が...。 ...。 pinvoke.net なるサイトがあることを知る。常識? ...。 2.VisualStudio2003の悲しさ あと、同じ仕事場の人がExcel(OfficeXP)から、ASP.NETの webサービスにアクセスするシステムの作成で苦労されている。 問題を困難にしているのは実行/開発環境の縛りがあることかなと。 具体的には   実行環境 WinXP, OfficeXP, .net1.1   開発環境 WinXP, VS.NET2003, .net1.1 客先の環境がこれなので仕方ないのだけど...こういうのってやるせないね。 Office2007あたりなら新しい連携のAPIとかもあって.netとの連携も スムーズかもしれないし、VS2005ならC++/CLRがあるのでネイティブからの 連携も十分ありの選択肢だと思うけど、そのどちらもできない。 マネージ拡張は2005でC++/CLRに取って代わるのに、1から勉強する気に ならないしー。 そこまでしなくてもなにか方法あるのかしら? 3.VisualStudio2003のVB.NETには unsignedの型ないのね。 わたくしてっきり.netなら言い回しこそ違えど、C#と同じ文法を提供していると 思ってましたよ。まして基本型の種類なんて。 Win32APIの引数や戻り値って結構unsigned intな値が良く利用されているので 困った。 戻り値でDWORD型を返す関数を利用することがあり、Long型で受け取った のだけど、使うとなぜか処理成功のでありながら成功"0"を戻さないという 問題にぶつかる。(処理は正常に動いているっぽい) 戻り値を切ったり張ったりずらしたりしたけど、適当な値が取れなかったので すっぱりあきらめC#で書くことにした。汗 原因はたぶん100%私のミスだと思うけど、原因を調べて直...