Pages - Menu

ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2013-10-30

JavaでSQLiteを使う

RDBM(Relational DataBase Management System)には、MySQLをはじめいくつかのソフトウェアがあるが、個人で開発を行うような小中規模なアプリケーションではSQLiteがオススメだ。

Javaからデータベースを操作するためには、それぞれのRDBM用のJDBC(Java DataBase Connectivity)というAPIを用いる。

SQLiteをコマンドラインで使う

SQLite公式DownloadPageから環境に合わせた"command-line shell"をダウンロードし、適当なディレクトリに解凍する。インストールは以上。

sqlite3.exeを実行し、コマンドを叩く。
コマンドについては参考URLを参照。

SQLiteをJavaから呼び出す

SQLite-JDBCダウンロードページから最新バージョンの*.jarファイルをダウンロードする。適当なディレクトリに解凍する。
classファイル実行時のクラスパスにjarファイルを含める(IDEではプロジェクトのライブラリにjarファイルを追加する)。

SQLite-JDBCのサンプルプログラムがわかりやすい。


参考

SQLite公式
愚鈍人 JavaとSQLiteデータベース
DBOnline SQLite入門
sqlite-jdbc配布ページ

2013-10-23

Jarファイルのメインクラスを確認する

Jarファイルのメインクラスの確認の仕方

  1. 次のいずれかの方法でJarファイルを解凍する

    • 拡張子を.jarから.zipに変更して解凍
    • コマンドラインで以下のコマンドを実行
      >jar tvf JarTest.jar
  2. META=INF\MANIFEST.MF

    を開く

  3. Main-Class:
    以降に書かれているのがメインクラスである。
    メインクラスが指定されていない場合は、手動でメインクラスを記述することで、コマンドラインから実行できるJarファイルにすることができる。

2013-09-04

HTTPでSPARQLクエリを投げる

DBpediaなどでは、オントロジーののアクセスポイントとしてVirtuosoを採用している。
VirtuosoにはHTTP経由でクエリを投げることができる。
以下は実装例。
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.sparql.util.StringUtils;

public class Virtuoso {

    public static void main(String[] args) {
        String service = "http://dbpedia.org/sparql";
        String queryString = 
                "PREFIX rdfs:  "+
                "SELECT ?x ?y "+
                "WHERE {?x rdfs:label ?y}";
        Query query = QueryFactory.create(queryString);
        
        QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);
        try {
            ResultSet results = qe.execSelect();
            for (; results.hasNext();) {
                QuerySolution soln = results.nextSolution();
                RDFNode x = soln.get("x");
                RDFNode y = soln.get("y");
                System.out.println(x.toString());
                System.out.println(y.toString());
            }
        } catch (Exception e) {
            System.out.println("Query error:" + e);
        } finally {
            qe.close();
        }
    }
}

2013-07-19

JenaAPIを用いたオントロジー構築

Apache Jenaを用いたオントロジーの構築方法。
日本語の記事があまりにも少ないため、落ち着いたらスタートアップガイドをまとめる予定。

サンプルコード

    public void testFunc2() {
        String BASE = "http://mybase#";
        OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_LITE_MEM);
        model.setNsPrefix("mybase", BASE);

        //RDF:TYPE
        OntResource BLOG = model.createOntResource(BASE + "Blog");

        //Property
        OntProperty hasName = model.createOntProperty(BASE + "hasName");

        //Class
        OntClass ITBlog = model.createClass(BASE + "ITBlog");
        ITBlog.setRDFType(BLOG);

        OntClass myBlog = model.createClass(BASE + "myBlog");
        myBlog.setSuperClass(ITBlog);

        myBlog.addProperty(hasName, "Catalina Note");
        myBlog.addProperty(DC.title, "Catalina Note");


        RDFWriter wr = model.getWriter("RDF/XML-ABBREV");
        wr.write(model, System.out, BASE);
        //以下でも可
        //model.write(System.out, "RDF/XML-ABBREV", BASE);
    }

※1
ModelFactoryでModelオブジェクトを生成する際にOntModelSpecを指定しないと、次のようにrdfsの定義まで出力されてしまう。
(ただし、model.writeメソッドで出力する場合はされない模様)
<rdfs:Datatype rdf:about="http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral">
    <rdf:type>
      <rdfs:Class rdf:about="http://www.w3.org/2000/01/rdf-schema#Resource"/>
…

※2
リソースのrdfTypeを定義することで、rdf:IDで出力される。
そうでない場合はrdf:aboutとなる。

実行結果

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:mybase="http://mybase#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Class rdf:ID="myBlog">
    <dc:title>Catalina Note</dc:title>
    <mybase:hasName>Catalina Note</mybase:hasName>
    <rdfs:subClassOf>
      <mybase:Blog rdf:ID="ITBlog"/>
    </rdfs:subClassOf>
  </owl:Class>
  <rdf:Property rdf:ID="hasName"/>
</rdf:RDF>
参考
Apache Jena
An Introduction to RDF and the Jena RDF API Jena I/O Mini HowTo assigning rdf:id in JENA

[NetBeans] コード補完

NetBeansを始めとしたIDEでは、自動でコード補完をしてくれる機能がある。
[省略名]を入力してから[tab]で展開することができる。

デフォルトのコードテンプレート

デフォルトで登録されているコードテンプレートとしては次のようなものがある。(NetBeansIDE, Java)

for

for (int i = 0; i < 10; i++) {

}

sout

System.out.println("");

カスタムコードテンプレート

以下の項目で、任意の省略名を追加することができる。
ツール - オプション - エディタ - コードテンプレート

私はよく使う次のような省略名を追加した。

try

try{
${selection}${cursor}
} catch (Exception e) {

}

it

Iterator ${IDX newVarName default="it"} = ${TREE default=tree}.iterator();${selection}${cursor}
参考
NetBeans IDE Javaエディタでのコード支援: リファレンス・ガイド

2012-10-19

invalid XML character

An invalid XML character (Unicode: 0x1e) was found in ...
というエラーメッセージを吐くことがある。
原因はよく分からないが、とりあえず、replaceAllメソッドで回避することは可能。
String.replaceAll("\\x1e", "")
\x1eは、16進数コード1eの文字。

ついでに、ネットでコードを調べているとよく出てくる"\"は、文字コードの問題でスラッシュになっているが、"¥"のことである。

2012-10-18

String.splitメソッドによるOutOfBoundsException

String.splitメソッドで分割すると、値を代入する配列全体が初期化される。
例えば
String[] str = {"a", "b", "c"};
String x = "abcde";
str = x.split("g", 2);
としたとき、当然文字列xには"g"は含まれない。そのため、
str[0] -> "abcde"
となる。
ところで、予め初期化しておいた配列の第2・3要素は開放されてしまうことに注意する。
つまり、参照しようとするとエラーとなる。
str[1] -> OutOfBoundsException : 1
str[2] -> OutOfBoundsException : 2
そのため、第2以降の要素を用いる場合は、ほぼ必ずstr.lengthの判定が必要ということになる。

2012-10-17

Javaでの正規表現

正規表現では"."や"?"などのいくつかの文字は特殊文字となる。
それらの文字を検索条件に含めるためには、"\"でエスケープする必要がある。
しかし、Javaでは"\"自体がエスケープ文字として認識されてしまうため、二重にエスケープする必要がある。

example
"11.2 Test"  にマッチする正規表現
regex = "[\d]+" + "\\." + "[\d]+" + "\\s" + ".*"

2012-10-03

String#matchesメソッド

簡易的な検索にはcontains, startsWith, endsWithメソッドなどが使える。
正規表現を用いた高度な検索が必要な場合は、matchesメソッドを用いる。

ex)文字列aに数字が4回以上含まれるか
a.matches(".*"+"[0-9]{4,}"+".*")
参考
JAVA Developer

2012-09-25

Java ファイルに出力


PrintWriterクラスを使うと便利なようだ。
標準出力のようにprintやprintlnが使えて分かりやすい。
最後はclose()で閉じる。
File file = new File("test.txt");
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
pw.print("hello world");
pw.close();
参考
JavaDrive

2012-01-17

[Java] 例外処理

必ずしも値が入っているわけではない変数を扱う場合は、java.lang.NullPointerExceptionが返ってきたりする。
そんなときは例外処理を使うのが便利である。

例) SPARQLのOPTIONAL構文で Literal note に値が入っているか不明なとき

Literal note = (Literal) qs.get("note");
String note_s;
try{
      note_s = note.toString();
}catch(Exception e){
      note_s = "null";
}

Javaメモ - Static修飾子

Static修飾子

Staticなものはすべてクローン、もとの変数を参照している。
Staticでないものは、すべて別々のオブジェクト。

Staticなものは、オブジェクトを生成しなくてもよい。
Staticでないものは、newを用いて定義する必要がある。

参考
Javaの道

2012-01-16

[Java] 文字列の桁埋め

/*
 * 文字列のバイト長を返すメソッド
 */
public static int getByteLength(String value) {
    int length = 0;
    for (int i = 0; i < value.length(); i++) {
        char c = value.charAt(i);
        if (c >= 0x20 && c <= 0x7E) {
            // JISローマ字(ASCII)
            length++;
        } else if (c >= 0xFF61 && c <= 0xFF9F) {
            // JISカナ(半角カナ)
            length++;
        } else {
            // その他(全角)
            length += 2;
        }
    }
    return length;
}

/*
 * 文字列の桁あわせを行うメソッド
 * @param string 文字列
 * @param int 長さ
 * @return 指定した長さの文字列
 */
public static String pad(String str, int len){
    int bytelen = getByteLength(str);
    for(int i=0; i<(len - bytelen);i++){
        str = str + " ";
    }
    return str;
}
※getByteLengthメソッドはKigoWiki様からお借りしました

StringFormatではダメなのか?

StringFormatでは、全角を含む変数の場合、等幅のコンソールでうまく表示されない。
そのため、半角/全角の判定をした上で空白を埋める必要がある。

参考
Kigo Wiki
Chat&Messenger