MeCabとeclipseのバインディングに苦労した

表題の通り、MeCabeclipseで動かそうとして2日間くらいさまよったので、メモ。
ググっても色んな人がそれぞれやってる感じでよくわからんかった。。

環境

使用するもの

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

  • mecab-0.996_x64.zip
  • cmecab-java-2.0.1-src.zip

Google Code Archive - Long-term storage for Google Code Project Hosting.


まず、MeCab-0.996.exeを実行しインストールする。
UTF-8でやったいいようである。。
注意するのが、これは32bitなんで64bitにコンパイルし直す必要があるということ。

インストールしたら、mecab-0.996_x64.zip、
cmecab-java-2.0.1-src.zipをどこでも良いので解凍する。

mecab-0.996_x64.zipのbinの中にあるlibmecab.dllをWindows/System32にコピー。

eclipseを起動し、new projectのotherからJava Project from Existing Ant Buildfileを選択。

f:id:Sakaiaka:20180220230344p:plain
eclipse

Ant buildfileにcmecab-java-2.0.1-srcにあるbuild.xmlを選択し、プロジェクト作成。
そしたらworkspaceの方のプロジェクトフォルダにsrcを作って、JDKのlibにあるtools.jarにパスを通す。
そのまま、Ant Build実行!


うまく実行出来たらbin内にjarファイルができる。

このjarファイルとbridj-0.6.1.jarをビルドパスに入れるとようやく動いた。。。


参考
satoyashiki.hatenablog.com
ほぼそのまま参考にさせて頂きました。
ありがとうございます。

SQL テーブル結合のメモ

1.NATURAL
 同じカラム名の値で一致を判断。
 一致カラムが1つに結合。
 異なる値で同じカラム名の場合や同一の値でカラム名が異なると使えない。

2.INNER JOIN
 ON句で結合条件指定。
 条件句はテーブル名指定の必要あり。
 条件に一致しないデータは取得されない。

3.OUTER JOIN
 ON句で結合条件指定。
 条件句はテーブル名指定の必要あり。
 LEFT OUTER でFROM後のテーブルにしかない行データも取得する。

RIGHT OUTER はJOIN後のテーブルにしかない行データも取得。
FULL OUTER は両方のデータを取得。
※あまり使わない?

INNER → 内に絞り込み。
OUTER → LEFT(FROM後のテーブル)側に合わせ広げるイメージ。




 

ゼロサプレス

英語だと「zero suppress」、「zero suppression」。
ゼロ抑制!

数字の余分なゼロを消すことです。

 

 BigDecimalで呼んでも、小数点以下のゼロって消えないんですよね。
 

String aa = "77.00";

String aa = "77.00";

String ab = "0077.000";

String ac = "-00032.32000";

 

System.out.println(new BigDecimal(aa)); //77.00

System.out.println(new BigDecimal(ab)); //77.000

System.out.println(new BigDecimal(ac)); //-32.32000

一般的には正規表現で解消している模様。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

String [] array = {"1.1010", "-0002.2220","1.0200"};

String str = "(.*\\..+[1-9])0*$";
Pattern ptn = Pattern.compile(str);
for (String s: array) {
    Matcher m = ptn.matcher(s);
    if(m.matches()) {
        System.out.println(m.group(1));
    }
}         //1.01、-0002.222、1.02  -0002.222が残ってしまったけど。。

オブジェクトクラス

オブジェクトクラスはすべてのオブジェクトの親クラス。

ミトコンドリア・イブみたいなものなのか。。

 

9つのpublicメソッドと2つのprotectedメソッドが入っている。

そのうち5つはwait()とnotify()関連でスレッド待機と再開に使用される。

残りの4つは基本的な比較や型変換、コピーに使用される。

 

・toString() オブジェクト派生元のクラス名+@+ハッシュコードの16進数を返す

・equals()

・hashCode()

・clone() Clonableインターフェースの実装が必要

 通常シャローコピー

 

メモ

・InstantiationException

抽象クラス、インターフェースのインスタンス

・IllegalAccessException

コンストラクタにアクセスできない

 

 

 

 

 

 

ScannerとBufferedReader

Scanner

java.util.Scanner

String型を読むnextLine()の前にnextInt()などのメソッドを呼ぶと、nextLine()はスキップされる。

 

java.io.

IOExceptionのthrowsが必要。

バッファ使用はScannerより大きい。

 

何度も呼ぶときはBufferedReaderを使う。

BufferedReaderは文字を読むが、Scannerは入力値をパースするため、BufferedReaderが若干早い。

public static void main(String [])について

 mainメソッドですね。

 

・public …どこからでもアクセス可能

・static …静的

通常、クラスメソッドにアクセスする際は、newを使って、クラスをインスタンス化しなければならないが、staticメソッドはその必要がない。

この理由は、staticクラスメソッドや変数は実行時にすでにメモリに呼び出されているから。

一方、staticでないメソッドはインスタンス化されたときにメモリに呼ばれる。

定数などはstatic finalで変更できない形で宣言することで、共通化できる。

 

・void…型。voidは返り値がない場合のメソッドに付ける。

・(String [])…String型の配列。コマンドライン引数がここに入る。入力値の分だけ長さも自動で増える。普通の配列もこうしたらいいのに。。

 

今日のメモ

オブジェクト化することで複数の変数を持たせreturnできる。