基本の基本

MySQLのコマンドに関するメモ

  • ヘルプを表示する
> mysql -?
  • 接続する
> mysql -u [ユーザー名] -p -h [ホスト名]
  • SQLファイルを実行する
mysql> source [ファイル名]
  • ユーザー権限
mysql> GRANT ALL ON *.* TO [ユーザー名]@'[接続元のホスト名]' IDENTIFIED BY '[パスワード]';
  • パスワード変更

## 最初にSELECT文を発行し,目的のユーザー以外のパスワードを変更しないように注意する。
## WHERE句をしっかりつけるのがポイント。

mysql (none)> select count(*) from mysql.user where user='[ユーザー名]';
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql (none)> update mysql.user set password=password('[パスワード]') where user='[ユーザー名]';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql (none)> flush privileges;
Query OK, 0 rows affected (0.03 sec)

ExifTool の使い方

ExifTool を使いデジカメやiPhoneで撮った写真や動画のファイル名を、撮影日時に一括変換する方法を解説します。

  • 基礎知識

ExifTool はオリジナルサイトから入手します。
http://owl.phy.queensu.ca/~phil/exiftool/

exiftool-9.02.zip のような ZIP ファイルをダウンロードして解凍すると、
exiftool(-k).exe というファイルが展開されます。

ファイル名の (-k) はコマンドラインオプションで DOS コマンドの PAUSE と同じ意味。
カッコ内の文字列は実行時のオプションになります。

  • ファイル名を一括変換する方法

デジカメで撮った写真をPCに転送した直後の状態。

C:\xxx>dir
2009/05/06  14:56         2,158,249 DSCF0669.jpg
2009/05/06  14:57         2,087,631 DSCF0671.jpg
2009/05/06  16:13         2,072,319 DSCF0672.jpg
2009/05/06  16:14         2,109,090 DSCF0673.jpg
以下省略

これらのファイル名を撮影日時(年-月-日 時.分.秒 の形式)に一括変換する。

C:\xxx>"exiftool(-k).exe" "-FileName<CreateDate" -d "%Y-%m-%d %H.%M.%S.jpg" *.jpg
   19 image files updated

変換後は下記のようになります。

C:\xxx>dir
2009/05/06  14:56         2,158,249 2009-05-06 14.56.33.jpg
2009/05/06  14:57         2,087,631 2009-05-06 14.57.12.jpg
2009/05/06  16:13         2,072,319 2009-05-06 16.13.09.jpg
2009/05/06  16:14         2,109,090 2009-05-06 16.14.49.jpg
以下省略
  • 作成日時とファイル名の一覧を表示する方法

ファイル名を一括変換する前に、下記のように事前に撮影日時を確認することもできます。

C:\xxx>"exiftool(-k).exe" -CreateDate -FileName -q *
Create Date                     : 2009:06:13 20:19:12
File Name                       : DSCF0702.jpg
Create Date                     : 2009:06:13 21:11:27
File Name                       : DSCF0703.jpg
Create Date                     : 2009:06:13 22:28:48
File Name                       : DSCF0704.MP4
  • 写真の位置情報等を削除するには

デジカメの機種や写真の位置情報等のEXIF情報は、下記コマンドで一発削除できます。
EXIF情報を含んだ元のファイルは [元のファイル名_original] にリネームされます。

C:\xxx>"exiftool(-k).exe" -all= *
  • Dropboxのカメラアップロードの仕様について

iPhoneで撮った写真はDropboxのカメラアップロード機能で自動的にDropboxにアップロードできます。
この時にDropbox側で自動的にファイル名が日時に変換されるが、下記要領で変換していると思われる(あくまで推測)。

1. JPEG画像でCreateDateタグあり → CreateDateタグの日時に変換される
2. JPEG画像でCreateDateタグなし → FileModificationDateタグの日時に変換される
3. 動画(mov)はFile Modification Date/Timeタグの日時に変換される

Dropboxのカメラアップロードのファイル名変換自体は問題ないが、
他人からもらった動画等の場合は Modification Date の時間計算がおかしくなる場合があるようなので要注意。
具体的には日本時間(GMT+9)の情報が反映されず、9時間ズレたファイル名になることがある。

  • 参考:CreateDate等のタグ一覧

http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

完全リカバリと不完全リカバリの違い

Oracleで障害が発生した場合のリカバリ方法は2種類。

障害が発生した直前(直前のコミット完了時点)までリカバリする方法。
障害発生直前ということは、リカバリ時にREDOログを適用することになる。
よって、アーカイブログモードで動作していることが前提。

特定の時点までリカバリする方法。
アーカイブログが破損した場合、存在するアーカイブログを適用できる限りの時点までリカバリが可能。
また、とあるバッチ処理の開始時点、のように特定の時間まで戻すことも可能。
ただし、これらはアーカイブログモードで動作していることが前提。
ノーアーカイブログモードで動作している場合は、アーカイブログを適用出来ないので、最後に一貫性バックアップを取得した時点まで戻すことになる。

GPGで暗号化/復号化

Gnu Privacy Guard (GPG) の一番お手軽な使い方として、ファイルをパスワードで暗号化/復号化する方法。
GPG本体をインストールしなくても、Windows版のGitをインストールしていればGPGの一部が含まれています(Git/bin/gpg.exe)。単純にファイルをパスワードで暗号化したいだけ、程度の用途であればこれで十分です。

  • ファイルを暗号化する
> gpg -c file.txt

暗号化時のパスフレーズは、ひらがなや漢字等も含めることができます。
なるべく長く、覚えやすいパスフレーズにしましょう。

これで file.txt.gpg という暗号化ファイルが作成されます。
-a オプションを追加して暗号化した場合は file.txt.asc という ASCII 形式の暗号化ファイルができます。

  • ファイルを復号化する
> gpg file.txt.gpg

これで file.txt という平文のファイルが出来上がります。

  • Emacsと連動させる

拡張子が .gpg のファイルは Emacs から透過的に扱えます。
ファイルを開く時にパスフレーズを入力すれば、自動的に復号化してくれます。

ちなみに、ASCII 形式の暗号化ファイルの場合は、全選択し、

M-x epa-decrypt-region

で復号化できます。

同様に、平文のファイルのある部分を選択し、

M-x epa-encrypt-region

とすれば、ファイルの一部分だけを暗号化できます。

  • 暗号化方式についての補足

上記で説明したGPGの共通鍵暗号は、デフォルトの暗号化方式としてCAST5が採用されています。
自分の利用しているPCの設定が知りたければ -v オプションを付加することで、以下のように暗号化方式が表示されます。

gpg: using cipher CAST5

暗号化方式を変更するには --cipher-algo オプションを利用します。
例えば AES256 で暗号化する場合は、

> gpg --cipher-algo AES256 -c -v file.txt

のようにします。

サポートされている暗号化方式はヘルプで見ることができます。
私の環境では下記の7種類がサポートされていました。

3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH

暗号化の基本的な理論は下記の書籍が参考になりました。
古代暗号の歴史から解説されていますが、第4章、第5章を読めば「共通鍵暗号」「公開鍵暗号」の基本的な仕組みが分かります。

暗号 情報セキュリティの技術と歴史 (講談社学術文庫)

暗号 情報セキュリティの技術と歴史 (講談社学術文庫)

良い人を採用するには面接/面談で何を聞けばよいか

通常のSI開発において、全員がプロパー(自社の人)で構成されるケースはほとんどない。
特に、開発規模が大きいほど、他社の人(協力会社やパートナーと呼ぶことが多い)の割合が高いように思われる。

ここで問題になるのが、いかに「良い」人を採用するか。

「良い」の基準はケース・バイ・ケースだが、採用/不採用の基準を整理してみることにする。
※以下、法的に聞いてはいけないと思われる項目も含まれているので、そこは注意が必要。
そもそも「面接」や「面談」という言葉自体が違法となる局面もあるが、以下では「面談」と記述する。

Step1: 書類選考の段階
経歴書を見ただけでは大まかなことしか分からない。
よって、この段階では、面談するに値する/値しないだけを判断する。

下記に該当する人とは基本的に面談しない(つまり不採用)。

  • ある程度(目安は5年以上)の経験年数にもかかわらず、短期のプロジェクト(基準は1年未満)しか経験が無い人

下記に該当する人は面談しない可能性が高い

  • プロジェクトとプロジェクトの間に3ヶ月以上無職の期間がある人
  • 通勤時間が片道2時間以上の人

Step2: 面談の段階
この段階で採用/不採用を決定するが、忘れてはいけないことが1つ。
それは、相手方もこちらを吟味している、ということ。
仮に採用となっても、相手方に嫌だと言われればそれまでである。
面談に来てくれたことに感謝の意を示さなければいけない。<基準1>
30分なり1時間なり話をして、その人と働きたいと思ったかどうか。
この点で不安要素があるなら採用すべきでない。<基準2>
話に一貫性があったかどうか。
下記の質問事項について、聞き方を変えて2回は質問してみる。
別な答えが返ってくるようなら採用すべきでない。<質問事項>
採用する目的にもよるが、下記の事項は今までの面談で聞いたこと。

  • 過去に携わった開発の期間と規模、役割を説明できるか
  • リーダー経験(経験ありの場合、何に対して責任を持っていたか)
  • ユーザーとの対面レビュー経験(経験ありの場合、対情シスなのか、対エンドユーザーなのか)
  • ド新規の開発経験(経験ありの場合、担当工程)
  • 保守案件の場合、保守案件に抵抗がないか(ド新規の開発しかやりたがらない人は結構いる)
  • 保守の場合、保守経験はあるか
  • 過去の残業実績(MAXで何時間迄なら残業可能か)
  • プロジェクト固有の技術経験(例: SVFやらOraclePL/SQLJavaでのフレームワーク経験)

以下は営業担当に確認する事項。

  • 契約形態
  • 単価
  • 残業代の清算基準
  • 仮に採用となった場合、いつからプロジェクトに参画可能か

最後は備忘録的な書き方になってしまったが、随時アップデートします。

EclipseのソースコードをCVSから取得する方法

例えばJDT Core ComponentのソースをCVSから取得する方法

C:\home\jdt-core>set CVSROOT=:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse

C:\home\jdt-core>cvs login
Logging in to :pserver:anonymous@dev.eclipse.org:2401/cvsroot/eclipse
CVS password:
cvs login: warning: failed to open C:\home\.cvspass for reading: No such file or directory

C:\home\jdt-core>cvs co org.eclipse.jdt.core

cvs loginでエラーがでましたが、ソース自体は問題なく落とせました

Org-Modeで日本語を含むファイルをPDFにエクスポートする方法

最近Org-Modeを使い始めた。きっかけはテキストなのに簡単な表が組めること、HTMLにエクスポートできること。エクスポートのオプションを見ていると、なんとPDFにもエクスポート可能ではないか。
という訳で今回はまずLaTeXにエクスポートし、そこからPDFに変換する方法。

環境は GNU Emacs24.1 on Windows7 です。

LaTeXのインストールはTeXインストーラ 3を使わせて頂きました。

Org-Modeで作成するファイルの先頭部分では、jsarticleを使うと宣言する。

#+LATEX_CLASS: jsarticle
#+LATEX_CLASS_OPTIONS: [a4j]

init.elへの追加内容はこんな感じ。

(setq org-export-latex-coding-system 'shift_jis)
(setq org-export-latex-date-format "%Y-%m-%d")
(setq org-export-latex-classes nil)
(add-to-list 'org-export-latex-classes
  '("jsarticle"
    "\\documentclass[a4j]{jsarticle}"
    ("\\section{%s}" . "\\section*{%s}")
    ("\\subsection{%s}" . "\\subsection*{%s}")
    ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
    ("\\paragraph{%s}" . "\\paragraph*{%s}")
    ("\\subparagraph{%s}" . "\\subparagraph*{%s}")
))
(setq org-export-latex-packages-alist
  '(("AUTO" "inputenc"  t)
    ("T1"   "fontenc"   t)
    ))

いよいよOrg-ModeからPDFにエクスポート。C-c C-e p で直接PDFに変換したいところだが、Org-Modeのデフォルトは、日本語対応しているpLaTeXでなくLaTeXで処理する仕様。デフォルトの挙動は変更可能だが、今回はOrg-Modeからtexをエクスポートし、PDF化はコマンドで実行することにする。
Org-Mode上で C-c C-e l で tex を出力、以下のコマンドを順に実行

> platex filename.tex
> dvipdfmx filename.dvi

これで filename.pdf というPDFができるはずです。


★おまけ PDFのフォントを指定する方法

例えばメイリオ(Meiryo)に変更するには、C:\Windows\Fonts にある メイリオ
\w32tex\share\texmf\fonts\truetype\meiryo\meiryo.ttc
\w32tex\share\texmf\fonts\truetype\meiryo\meiryob.ttc
にコピーする

次に meiryo.map というファイルを下記要領で作成する

rml H meiryo.ttc
rmlv V meiryo.ttc
gbm H meiryo.ttc
gbmv V meiryo.ttc

dvipdfmxでPDF化するときに上記のファイルを指定する

> dvipdfmx -f meiryo.map filename.dvi

応用システムの文書化要領(JIS X 0126:2001; ISO/IEC 6592:1998)

現在ではもう廃止規格となってしまったが、それでもなお参考になることは多いので適当に抜粋しておく。使い方は規格を参照して欲しい。

番号構造 > 情報項目内容
1 システム要求
11問題の定義開発中のソフトウェアによって解決する問題の記述とその限界。
12目的ソフトウェアに期待する効果の記述とソフトウェアの要件。
13提案の根拠提案のねらいと根拠。
14参照文書開発の次のフェーズで参照する文書、例えば現在の状態を示す文書、の一覧。
15制約次のフェーズのために取得者が開発に際して定める要件(例えば、条件、制限、品質計画、安全保護)の記述。例えば、次のようなものがある。
- 人、材料、資金などの割り当てるべき資源
- 実装の方法
- 報告日付
- 完了日付
16言語文書に使用する言語を識別することが望ましい。例えば、日本語、フランス語、英語。
17契約情報契約情報を指定することが望ましい。版権の条件、ライセンス条項、使用条件及び保証事項を明記するとよい。第三者による保証のときには保証人を明示することが望ましい。
2 システム記述
21 システムの識別
211システム名称システムを識別するための名称及び可能ならば、品目番号又は製品コード。
212システムの目的システムの目的は、
- システムの直接効果
- 成果物を生産するときのシステム性能に対する要求、例えば、評価基準である。
22 詳細要求事項ソフトウェアの開発によって実現する物理的/論理的システムの記述。
221機能システムが支援するすべての論理的機能を含めた機能に対する要求事項であって、技術的な実現とは独立である。
222データシステムが必要とするすべてのデータを明記する。
223可用性可用性は、主としてシステムの利用可能性を示す数量(例えば、頻度、時間分布)である。
224制約制約は、安全保護、秘密、完全性、使用性などを含む。
225用語
226情報モデル
23 システム構成要素計画された又は既存のソフトウェアの要求事項を満たすシステムの構成要素の記述。
231 システム構成
2311構造
2312インタフェース
232 ソフトウェアの構成要素
2321ソフトウェア構成
2322データ構成
233 物理的な構成要素物理的な資源は、システム運用に必要な機器、用品及び設備である。
24 試験システムの目的や計画に基づき試験の要件、手順及び結果について記述する。
241試験目的
242試験方法とツール
243テストケース/ベンチマーク
25 導入新しいシステムを導入するために必要となる段階の記述。
251導入/使用方法
252教育訓練
26 人的資源
261要員
262組織
3 評価指標評価文書にはシステムを評価するために必す(須)なデータを含む。
4 結論/提言結論/提言は現実の結果に基づいた、意思決定者の見解であって、ソフトウェア開発を更に進める基礎となるものである。

Windows7のEmacs23.4にcmigemoを導入する

前回SKKを導入した。せっかくなのでcmigemoもインストールする。

http://www.kaoriya.net/software/cmigemo
まずはここから適切なバイナリをダウンロード、解凍しておく。

次に migemo.el の入手だが、どうも情報が錯綜している。
最も確実と思われうオリジナルのサイトから入手することに。
http://migemo.cvs.sourceforge.net/viewvc/migemo/migemo/migemo.el.in?revision=1.8
migemo.el.in となっているが、これを migemo.el として保存する。
コンパイル前のファイルだが、特に問題ない。

init.el はこんな感じ。

;; migemo
(add-to-list 'exec-path "C:/cmigemo-default-win64")
(require 'migemo)
(setq migemo-command "cmigemo")
;; "-i" "\a" for searching a word over multi-lines.
(setq migemo-options '("-q" "--emacs" "-i" "\a"))
(setq migemo-dictionary "C:/cmigemo-default-win64/dict/utf-8/migemo-dict")
(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil)
;; キャッシュの有効化
(setq migemo-use-pattern-alist t)
(setq migemo-use-frequent-pattern-alist t)
(setq migemo-pattern-alist-length 1000)
;; 辞書の文字コードを指定
(setq migemo-coding-system 'utf-8-unix)
;; 初期化
(migemo-init)

migemo のオプションに "-i" "\a" を指定しているが、文字が複数行に分かれていると検索できない。
なぜだろう…

Windows7のEmacs23.4にSKKを導入する

http://openlab.ring.gr.jp/skk/ddskk-ja.html
ここから ddskk-14.4.tar.gz をダウンロード、解凍する。
※解凍するフォルダはデスクトップとかで構わない。
※このページに書いてあるようにAPELのインストールはもはや不要だそうです。

続いて辞書のダウンロード。
http://openlab.ring.gr.jp/skk/dic/
ここから SKK-JISYO.L.gz をダウンロード、解凍して ddskk-14.4\dic 直下にコピーする。

インストールの前準備。
ddskk-14.4\makeit.bat の EMACSemacs.exe の絶対パスを記述する。

set EMACS=C:\emacs-23.4\bin\emacs.exe

インストール先を確認する。

ddskk-14.4>makeit.bat what-where

インストールする。

ddskk-14.4>makeit.bat install

やまほどメッセージが出るが、これで完了。Emacsを再起動して、skk-modeを試してみる。

M-x skk-mode

ちなみに分かりやすいチュートリアルもある。

M-x skk-tutorial

ユーザー辞書は ~/.skk-jisyo に保存される。鍛え抜いてやるぞ〜。

YASnippetがあまりに便利すぎる件

Emacsでの生産性を格段に向上させるツール。便利すぎるのになぜ今までインストールしてなかったのか不思議。

まずはgithubからYASnippetをzipでダウンロードする。
https://github.com/capitaomorte/yasnippet

ダウンロードしたら ~/.emacs.d/elisp 直下に解凍する。

次に init.el に以下の設定を追加する。

;; YAsnippet
(add-to-list 'load-path "~/.emacs.d/elisp/capitaomorte-yasnippet-b7c54b8")
(require 'yasnippet)
(yas/global-mode 1)

Java用のスニペットは以下にあった。
https://github.com/nekop/yasnippet-java-mode

同じくgithubからzipでダウンロードして ~/.emacs.d/snippets/java-mode となるように解凍する。

これで完了。

試しに foo.java を作成し、「h」と打ってTABを押すと、以下のようなソースに展開される。

public class foo {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

Emacsテクニックバイブル ?作業効率をカイゼンする200の技?

Emacsテクニックバイブル ?作業効率をカイゼンする200の技?

形態素解析Senのインストールと使い方

Senのインストールに関してまとめておく。

SenはJavaで書かれているのでJavaは必須だが、ここでは省略。

  • Antの準備

最近はもっぱらMavenばかり使ってたのでAnt入れてなかった...

Apache Ant - Binary Distributions
ここから apache-ant-1.8.3-bin.zip をダウンロード。
任意のディレクトリに解凍、解凍したディレクトリをWindows環境変数ANT_HOMEに登録、PATHに %ANT_HOME%\bin を追加する。
コマンドプロンプトでantが起動するか確かめる。

c:\>ant -version
Apache Ant(TM) version 1.8.3 compiled on February 26 2012

c:\>

残念ながらPerlには明るくない。
Strawberry PerlとActiveState Perlの2種類あるようだが、聞き覚えのあるActiveState Perlをインストールすることにした。

Download and Install Perl Binaries: ActivePerl | ActiveState
ここからActivePerlをダウンロード。現時点の最新バージョンは5.14.2。

インストーラーを起動し、ひたすら [Next] をクリックするのみでOK。
インストールが終わったら、コマンドプロンプトを起動、正常にインストールされたか確認する。

c:\>perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2011, Larry Wall

Binary build 1402 [295342] provided by ActiveState http://www.ActiveState.com
Built Oct  7 2011 15:19:36

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.


c:\>

Apache Subversion Binary Packages
ここからSubversionをダウンロードしてインストールする。現時点の最新バージョンは1.7.4。
何種類かあるが、どれでも問題ない。
インストーラーを実行、svn.exe があるディレクトリ(例えば C:\Program Files\SlikSvn\bin)をWindows環境変数PATHに追加する。
コマンドプロンプトSubversionが起動するか確かめる。

c:\>svn --version
svn, バージョン 1.7.4-SlikSvn-1.7.4-X64 (SlikSvn/1.7.4) X64
   コンパイル日時: Mar  8 2012, 13:42:47

Copyright (C) 2012 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/

以下のリポジトリアクセス (RA) モジュールが利用できます:

* ra_neon : Neon を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
  - 'https' スキームを操作します
* ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。
  - Cyrus SASL 認証を併用
  - 'svn' スキームを操作します
* ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。
  - 'file' スキームを操作します
* ra_serf : serf を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
  - 'https' スキームを操作します


c:\>
  • Senの入手

いよいよ本題。以前はsenをzipでダウンロードできたそうだが、2012/5/23現在は入手不可なので最新のソースをSubversionで取得する。

※SenプロジェクトのURL http://java.net/projects/sen

C:\Users\xxx\home>svn co https://svn.java.net/svn/sen~svn/tags/SEN_1_2_2_1/sen
'https://svn.java.net:443' のサーバ証明書の認証中にエラーが発生しました:
 - 証明書は信頼のおける機関が発行したものではありません。証明書を手動で認証
   するためにフィンガープリントを用いてください!
証明書情報:
 - ホスト名: www.java.net
 - 有効範囲: Sun, 19 Sep 2010 15:00:00 GMT から Wed, 19 Sep 2012 14:59:59 GMT まで
 - 発行者: Class 3 MPKI Secure Server CA, VeriSign Trust Network, Sun Microsystems Inc
 - フィンガープリント: 22:d2:d5:43:96:0f:eb:e0:9a:20:b9:14:b4:d9:32:1e:6a:f3:37:11
拒否しますか (R)、一時的に承認しますか (t)、常に承認しますか (p)? t
A    sen\dic
A    sen\dic\dictionary.properties
A    sen\dic\ipa2mecab.pl
A    sen\dic\build.xml
A    sen\dic\compound.pl
A    sen\demo
A    sen\demo\SenBench.java
A    sen\demo\MeCabBench.java
A    sen\conf
A    sen\conf\sen-processor.xml
A    sen\conf\sen.xml
A    sen\lib
A    sen\lib\junit.jar
A    sen\lib\LICENSE.logging
A    sen\lib\LICENSE.junit
A    sen\lib\commons-logging.jar
A    sen\src
A    sen\src\test
A    sen\src\test\dic
A    sen\src\test\dic\compound.dic
A    sen\src\test\custom_dic.csv
A    sen\src\test\testcase
A    sen\src\test\testcase\StringTaggerTest.java
A    sen\src\test\testcase\RemarkProcessorTest.java
A    sen\src\test\testcase\CompositPostProcessorTest.java
A    sen\src\test\testcase\CompoundWordPostProcessorTest.java
A    sen\src\java
A    sen\src\java\ProcessorDemo.java
A    sen\src\java\StringTaggerDemo.java
A    sen\src\java\net
A    sen\src\java\net\java
A    sen\src\java\net\java\sen
A    sen\src\java\net\java\sen\processor
A    sen\src\java\net\java\sen\processor\CompositPostProcessor.java
A    sen\src\java\net\java\sen\processor\PostProcessor.java
A    sen\src\java\net\java\sen\processor\CompoundWordPostProcessor.java
A    sen\src\java\net\java\sen\processor\PreProcessor.java
A    sen\src\java\net\java\sen\processor\RemarkPostProcessor.java
A    sen\src\java\net\java\sen\processor\RemarkPreProcessor.java
A    sen\src\java\net\java\sen\StringTagger.java
A    sen\src\java\net\java\sen\Token.java
A    sen\src\java\net\java\sen\tools
A    sen\src\java\net\java\sen\tools\PairObject.java
A    sen\src\java\net\java\sen\tools\MkCompoundTable.java
A    sen\src\java\net\java\sen\tools\DictionaryMaker.java
A    sen\src\java\net\java\sen\tools\MkSenDic.java
A    sen\src\java\net\java\sen\CToken.java
A    sen\src\java\net\java\sen\Viterbi.java
A    sen\src\java\net\java\sen\Dictionary.java
A    sen\src\java\net\java\sen\Node.java
A    sen\src\java\net\java\sen\StreamTagger.java
A    sen\src\java\net\java\sen\SenUtils.java
A    sen\src\java\net\java\sen\io
A    sen\src\java\net\java\sen\io\FileAccessor.java
A    sen\src\java\net\java\sen\io\RandomAccessReader.java
A    sen\src\java\net\java\sen\io\FullBufferedReader.java
A    sen\src\java\net\java\sen\io\FileAccessorFactory.java
A    sen\src\java\net\java\sen\io\MappedBufferedReader.java
A    sen\src\java\net\java\sen\Tokenizer.java
A    sen\src\java\net\java\sen\ja
A    sen\src\java\net\java\sen\ja\JapaneseTokenizer.java
A    sen\src\java\net\java\sen\resources
A    sen\src\java\net\java\sen\resources\sen.xsd
A    sen\src\java\net\java\sen\util
A    sen\src\java\net\java\sen\util\CSVData.java
A    sen\src\java\net\java\sen\util\CSVParser.java
A    sen\src\java\net\java\sen\util\DoubleArrayTrie.java
A    sen\src\java\net\java\sen\util\DoubleArrayTrie.cpp
A    sen\src\java\StreamTaggerDemo.java
A    sen\bin
A    sen\bin\simplelog.properties
A    sen\bin\sen.bat
A    sen\bin\sen.sh
A    sen\docs
A    sen\build.xml
 U   sen
リビジョン 89 をチェックアウトしました。

C:\Users\xxx\home>
  • Senのビルド

上の続き。このままビルドするとcppコマンドが無いエラーが発生するので、build.xmlの以下の箇所をコメントアウトする。

    <exec executable="cpp" output="${src.dir}/net/java/sen/util/DoubleArrayTrie.java" >
	<arg line="-P ${src.dir}/net/java/sen/util/DoubleArrayTrie.cpp"/>
    </exec>

コメントアウトしたらビルドする。

C:\Users\xxx\home\sen>ant
Buildfile: C:\Users\xxx\home\sen\build.xml

init:
    [mkdir] Created dir: C:\Users\xxx\home\sen\build
    [mkdir] Created dir: C:\Users\xxx\home\sen\build\classes
    [mkdir] Created dir: C:\Users\xxx\home\sen\build\lib

compile:
    [javac] C:\Users\xxx\home\sen\build.xml:59: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 31 source files to C:\Users\xxx\home\sen\build\classes
    [javac] 警告:[options] ブートストラップ・クラスパスが-source 1.3と一緒に設定されていません
    [javac] C:\Users\xxx\home\sen\src\java\net\java\sen\SenUtils.java:158: 警告:この文字は、エンコーディングeuc_jpにマップできません
    [javac]      * unicodeToDATCode("???".toCharArray());
    [javac]                          ^
    [javac] C:\Users\xxx\home\sen\src\java\net\java\sen\SenUtils.java:158: 警告:この文字は、エンコーディングeuc_jpにマップできません
    [javac]      * unicodeToDATCode("???".toCharArray());
    [javac]                           ^
    [javac] C:\Users\xxx\home\sen\src\java\net\java\sen\SenUtils.java:158: 警告:この文字は、エンコーディングeuc_jpにマップできません
    [javac]      * unicodeToDATCode("???".toCharArray());
    [javac]                            ^
    [javac] 警告4個

jar:
     [copy] Copying 1 file to C:\Users\xxx\home\sen\build\classes\net\java\sen\resources
      [jar] Building jar: C:\Users\xxx\home\sen\lib\sen.jar

BUILD SUCCESSFUL
Total time: 4 minutes 43 seconds

C:\Users\xxx\home\sen>

警告が出ているが問題ない。「警告:この文字は、エンコーディングeuc_jpにマップできません」にちょっとびびったが、ソースを見ると思いっきりコメントなので全く問題なし。

  • Senで使う辞書のビルド

上の続き。普通に辞書をビルドするとIPA辞書が使われるが、今回はあえてNAISTの辞書を使ってみる。

http://sourceforge.jp/projects/naist-jdic/releases/
ここから naist-jdic-0.4.3.tar.gz をダウンロードし、C:\Users\xxx\home\sen\dic に解凍する。
解凍したら、フォルダ名を naist-jdic-0.4.3 から ipadic-2.6.0 に変更する(とりあえず以下のbuild.xmlの修正量を減らすため)。
次にbuild.xmlの修正。
perlの実行パスがUNIX用になっているので修正する。

  <!--
  <property name="perl.bin" value="/usr/bin/perl"/>
  -->
  <property name="perl.bin" value="perl"/>

また、辞書ファイルのアーカイブはダウンロード済なので下記2箇所もコメントアウト

    <get src="${ipadic.home}/${ipadic.archive}" dest="${ipadic.archive}" />
    <gunzip src="${ipadic.archive}"/>
    <untar src="${ipadic.dir}.tar" dest="." />
    <delete file="${ipadic.dir}.tar"/>

ビルトする。

C:\Users\xxx\home\sen\dic>ant
Buildfile: C:\Users\xxx\home\sen\dic\build.xml

prepare-proxy:

prepare-archive:

prepare-dics0:

prepare-dics:

download:

melt:

prepare:

dics0:
     [exec] ipadic-2.6.0/naist-jdic.dic ...

create:
     [java] [INFO] MkSenDic - (1/7): reading connection matrix ...
     [java] [INFO] MkSenDic - connection file = connect.csv
     [java] [INFO] MkSenDic - charset = EUC_JP
     [java] [INFO] MkSenDic - (2/7): building type dictionary ...
     [java] [INFO] MkSenDic - (3/7): writing conection matrix (5 x 1940 x 1095 = 10621500) ...
     [java] [INFO] MkSenDic - (4/7): reading morpheme information ...
     [java] [INFO] MkSenDic - load dic: dic.csv
     [java] [INFO] MkSenDic - 50000...
     [java] [INFO] MkSenDic - 100000...
     [java] [INFO] MkSenDic - 150000...
     [java] [INFO] MkSenDic - 200000...
     [java] [INFO] MkSenDic - 250000...
     [java] [INFO] MkSenDic - 300000...
     [java] [INFO] MkSenDic - 350000...
     [java] [INFO] MkSenDic - 400000...
     [java] [INFO] MkSenDic - 450000...
     [java] [INFO] MkSenDic - (5/7): sorting lex...
     [java] [INFO] MkSenDic - (6/7): writing token...
     [java] [INFO] MkSenDic - key size = 456169
     [java] [INFO] MkSenDic - (7/7): building Double-Array (size = 387066) ...
     [java] [INFO] DoubleArrayTrie - save time = 0.107[s]
     [java] [INFO] MkSenDic - total time = 78[ms]

BUILD SUCCESSFUL
Total time: 1 minute 36 seconds

C:\Users\xxx\home\sen\dic>
  • Senを使ってみる

実際に形態素解析できるか確かめる。

C:\Users\xxx\home\sen\lib>set SEN_HOME=C:\Users\xxx\home\sen

C:\Users\xxx\home\sen\lib>java -Dsen.home=%SEN_HOME% -cp sen.jar;commons-logging.jar StringTaggerDemo
done.
Please input Japanese sentence:
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: token file = C:\Users\xxx\home\sen\dic/token.sen
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: time to load posInfo file = 16[ms]
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: double array trie dictionary = C:\Users\xxx\home\sen\dic/da.sen
5 23, 2012 12:02:48 午前 net.java.sen.util.DoubleArrayTrie load
情報: loading double array trie dict = C:\Users\xxx\home\sen\dic/da.sen
5 23, 2012 12:02:48 午前 net.java.sen.util.DoubleArrayTrie load
情報: loaded time = 0.374[ms]
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: pos info file = C:\Users\xxx\home\sen\dic/posInfo.sen
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: time to load pos info file = 0[ms]
5 23, 2012 12:02:48 午前 net.java.sen.Tokenizer loadConnectCost
情報: connection file = C:\Users\xxx\home\sen\dic\matrix.sen
5 23, 2012 12:02:48 午前 net.java.sen.Tokenizer loadConnectCost
情報: time to load connect cost file = 47[ms]
すもももももももものうち
すもも  (すもも)        名詞-一般(0,3,3)        スモモ  スモモ
も      (も)    助詞-係助詞(3,4,1)      モ      モ
もも    (もも)  名詞-一般(4,6,2)        モモ    モモ
も      (も)    助詞-係助詞(6,7,1)      モ      モ
もも    (もも)  名詞-一般(7,9,2)        モモ    モモ
の      (の)    助詞-連体化(9,10,1)     ノ      ノ
うち    (うち)  名詞-非自立-副詞可能(10,12,2)   ウチ    ウチ

C:\Users\xxx\home\sen\lib>

Apache Solr入門 ―オープンソース全文検索エンジン

Apache Solr入門 ―オープンソース全文検索エンジン