C++を使って作成した共有ライブラリをJavaから簡単に利用する方法を紹介します。JNI(Java Native Interface)を使うよりはるかに簡単です。 用意するものは、jnaerator: http://code.google.com/p/jnaerator/ です。 jnaeratorは、JNA(Java Native Access): https://jna.dev.java.net/を利用して簡単に共有ライブラリへのアクセスを実現しています。 C言語についてのJavaから共有ライブラリへのアクセスの情報はいろいろとあったのですが、C++を使った共有ライブラリの情報が少なかったので、この記事を書きました。 C++のソースを作成. ここは定番のHelloWorldでしょうか。 $ vi HelloWorld.h #ifndef _HELLO_WORLD_H_ #define
情報系修士にもわかるダブル配列 http://d.hatena.ne.jp/takeda25/20120219/1329634865 上の解説記事が素晴らしくて、自分も分かった気になりました。ありがたいことです。 解説されている内容をJavaで書いてみました。 ダブル配列の検索 https://gist.github.com/1931737 う……ひどい……。ホントに分かったのか??(せめてテーブルも配列で表現しないと比較可能にならない気がする)だれかボスケテ……。 単語終端の情報を保持しているので、厳密なダブル配列ではありません(トリプル配列ですね)。元記事に、ずらし量の1ビットを使って単語終端を表現する案がありましたが、せっかくJavaで書くのであればビット演算なんてしたくないのであります。とはいえ、妙案があるわけでもなく、どうしたらよいのか。 もちろん、ずらしを作るアルゴリズムについ
インターネットの普及に加えて、リッチクライアント/RIAの発展とともに、アプリケーションの形態は、C/S(クライアント/サーバ)システムから、Webアプリケーションシステムにシフトしています。一般の情報発信システムだけではなく、企業の基幹情報システムまで、盛んにWebアプリケーションで構築するようになりました。 この変化の主役であるといわれる、Java技術は、Webアプリケーションシステムの発展とともに、ネットワークの親和性や、プラットフォーム適用の多様性で、広く受け入れられて、Webアプリケーションシステム開発の基盤技術になっています。 これまでのC/Sシステムでは、サーバロジックはC/C++で実装されるケースが一般的でした。C/SシステムからWebアプリケーションシステムにシフトする際に、Java技術を導入することを決めた場合、Java技術で、すべて新規開発するのは1つの選択肢ですが、
JavaでSetやListから指定した数の要素をランダムに取り出したいとき用。 Pythonのrandomライブラリを参考にした。 非復元抽出というのは、取り出した要素を元に戻さずに次の要素を取り出す、みたいなやり方。 引数として渡したコレクションへの変更は行わない。 以下ソース import java.util.Collection; import java.util.List; import java.util.ArrayList; import java.util.Random; public class RandomUtils { /** * 受け取ったコレクションから指定された数の要素をランダムに非復元抽出する。 * * @param population 要素の母集団 * @param n 抽出する要素数 * @param random 乱数生成器 * @return 抽出され
メソッドの総称型 メソッドのみに総称型を適用した定義を行うことも出来る。[2007-06-12] 戻り値の型の直前に「<仮型引数, 仮型引数…>」を置くだけ。後はクラスの場合と同様。 public static <T> T notNull(T arg1, T arg2) { T ret; if (arg1 != null) { ret = arg1; } else { ret = arg2; } return ret; } このメソッドを呼び出す側は、クラスの場合とは異なり、明示的に型引数を指定する必要は無い。 指定した引数の値に応じて、自動的に型が判断される。 String s = notNull("abc", "def"); //型引数はString Long l = notNull(new Long(1), new Long(2)); //型引数はLong int i = notNu
FindBugsで気づいたんですが、下記のようなコードはパフォーマンス的によろしくないのでした。 Map map = new HashMap(); // ... for (Iterator it = map.keySet().iterator(); it.hasNext();) { Object key = it.next(); Object value = map.get(key); }これは、こう書くべきでした。 Map map = new HashMap(); // ... for (Iterator it = map.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); Object key = entry.getKey(); Object value = entry.getV
JavaのコアAPIに含まれるjava.util.Mapインターフェイスは、キーと値とのマッピングを表すデータ構造のためのインターフェイスです。同パッケージに含まれるListインターフェイスとともに、Javaプログラミングでは非常によく使われるインターフェイスといえるでしょう。 コアAPIには、このMapインタフェース実装クラスがいくつも用意されています。マップというデータ構造は、常にキーを通して値へのアクセスを行うものです。そのため、キーが許容する値やその格納方法などが、個々の実装を特徴付けるポイントになります。 マップの利用頻度は非常に多いだけに、コアAPIで使えるマップの種類を確認しておくのは、効果的なプログラミングへとつながります。ここでは、java.utilパッケージに含まれる5つのMap実装クラス、Hashtable、HashMap、TreeMap、IdentityHashMa
今回は、文字コードのチェック(エンコーディングチェック)を行う処理に関する問題です。 問題 以下のコードの問題を指摘し、修正してください。 ただし、問題は複数あることもあれば、全くないこともあります。 public class StringValidator { private static boolean checkCharacterCode(String str, String encoding) { if (str == null) { return true; } try { byte[] bytes = str.getBytes(encoding); return str.equals(new String(bytes, encoding)); } catch (UnsupportedEncodingException ex) { throw new RuntimeExcepti
毎度毎度、文字コードの話は面倒である。開発のメインストリームでないことと、外部調整が必要であることが原因だと思う*1。 プラットフォームが変わるたびに、毎回検証しているような気がする。私の場合だと、毎回OSが違う。Windows Server、AIX、HP-UX、Red Hat Linux。毎回Java仮想マシン(JVM)が違う。SunのJDK(今はOracleか)、JRockit(これもOracleか)、IBMのJVM、HPのJVM。データベースエンジンは、だいたい同じ。 本当にみんな、毎回やっているのだろうか? とりあえず、Javaで開発することは決まっている前提で、外部設計と内部設計にて、やるべき(と思っている)ことをまとめておく。 以降で挙げる例は、次のようなシステムをイメージしている*2。 構築対象システム Webアプリケーション バッチ 外部システム ホスト 外部設計 画面や帳
最近,SQL ばかり書いてて久しぶりに Java 書いたら 「Map ってどうやって回すんだっけ??」 という超初歩的な疑問がwwww 拡張 for 文で keySet 回せばいいかなぁと思ったら id:sett-4 に 「entrySet まわした方が早かった筈ですよ」 って言われた. 勝手な想像で,entrySet って Iterable#iterator() の Iterator#next() で return new Map.Entry(key,map.get(key)); 的な事してて逆に遅いんじゃね??って思ったので 調べてみた. とりあえずソース読んでみる そしたら public Set<Map.Entry<K,V>> entrySet() { return entrySet0(); } private Set<Map.Entry<K,V>> entrySet0() { Se
JavaSE5から追加されたjava.util.Scannerというクラスを今まで一度も使ったことが無かった。 ただの食わず嫌いだったので、ちょいと使い方を勉強!! お試し!! package okazuki; import java.util.Scanner; import junit.framework.TestCase; public class ScannerTest extends TestCase { public void test普通にスペース区切りで読んでみる() throws Exception { Scanner scanner = new Scanner("Hello world"); assertEquals("最初がHelloで", "Hello", scanner.next()); assertEquals("次がworld", "world", scanne
今回はN-gramでテキストを分解します。N-gram法とは対象の文字列を一定のN文字単位で分解し、それの出現頻度を求める方法です。これによって、検索エンジンに使われる転置インデックスを作成したいと思います。転置インデックスの作成方法にはN-gramの他に形態素解析があります。両者の性能の長短は全文検索 – Wikipediaに詳しく載っています。 Javaソースコード(Make2gram.java) さて、まずは文字列を2単語に切り分けるプログラムを作成しました。データ構造は単純にArrayListで、出現頻度も求めていません。 import java.io.*; import java.util.*; /** * N-gram法 */ public class Make2gram { public static void main(String[] args) { final shor
ジェネリクスでは、「型」を変数にした「型変数」というものを取り扱う。型変数で何が嬉しいかというと、メジャーな例ではコレクションAPIが挙げられる。java.util.Listとかjava.util.Mapとかのデータを格納するタイプのユーティリティクラスのことだ。 2004年にJavaのバージョンが5.0となるまでは、Javaにはジェネリクスの機能はなかった。なので、Listにデータを格納し、取得する場合は List list = new ArrayList(); list.add("hello!"); String str = (String) list.get(0); といったソースコードになる。 add()の引数はObject型で宣言されており、どんな参照型でもadd()することができた。 get()の戻り値もObject型で宣言されておりキャストが必要だった。このキャストはプログラ
HashMapを使う上での注意点について説明します。 Map型変数を使う HashMapオブジェクトを格納するには、HashMap型変数ではなくMap型変数を使います。 // HashMapオブジェクトの生成 Map<String, String> map = new HashMap<String, String>(); HashMapはMapの実装の一つに過ぎません。HashMapをMapとして使っているのであればMap型変数に格納した方が自然です。また、パフォーマンス上の問題で他のマップ(TreeMapなど)と差し替えることが容易になるなど、プログラムの汎用性が上がります。HashMap独自の操作が必要である場合(あまり思いつきませんが)を除いてMap型変数を使いましょう。 初期容量と負荷係数 HashMap生成時のパラメータとして、初期容量と負荷係数があります。 初期容量は、Hash
MacでのJAVA_HOMEは /Library/Java/Homeになるらしい。 ググると、/System/Library/Frameworks/JavaVM.framework/... などを設定している例も多いが、いろいろリンクが張られているので、結局は同じディレクトリを見てるみたい。 ついでに、JAVA_HOMEを環境変数に設定したいのだが、.bash_profileなどに書いてもGUIアプリケーションでは読み込んでくれない。 調べると、~/.MacOSX/environment.plistというファイルに書けばいいようだ。 デフォルトでは~/.MacOSXなんてディレクトリすらないので、最初はディレクトリから作らないといけない。 できあがったenvironment.plistの中身はこんな感じ。 <?xml version="1.0" encoding="UTF-8"?> <!D
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く