JTextComponent で Keymap を設定するには? [Java]
Java の Swing という GUI フレームワークの TIPS。
JTextComponent で Keymap (キーマップ) を設定するには?
例えば、バックスラッシュをタイプしたとき、「円記号」を出力させる場合のコードを以下に示す。ここでは、バックスラッシュのキー入力を奪っ て\u00A5コードをinsertするアクションに対応させている。javax.swing.text.TextAction と KeyMap クラスがポイント。
Groovy の日本語の情報源は? [groovy]
Groovy の日本の情報源は少ない。特に書籍は 2 冊しかない。
Grails 徹底入門は正確には Groovy の本ではなく Grails という Groovy を利用したフレームワークの入門書だ。ただし、Groovy の基本的な文法などは簡潔にまとめられている。
雑誌記事としては
Java World (ジャバ・ワールド) 2004年 11月号
- 作者:
- 出版社/メーカー: IDGジャパン
- 発売日: 2004/09/24
- メディア: 雑誌
に 25 ページくらいの特集が掲載されている。本誌は既に休刊しており本として手に入れるよりも、
を購入した方が良いかもしれない。 Java World メモリアル DVD には Java World 2004 年 11 月号の Groovy の特集も収録されている。
Java World 誌は 2004 年 11 月なので 5 年くらい経過しており、内容が古い面も多いが、基本的な文法はほぼ現在も同じだ。概要をつかむには問題ないだろう。
他には
に 9 ページにわたり紹介記事が掲載されているがページ数が少々物足りない感じ。こちらの雑誌を購入するよりは、今なら縮刷版
があるので、 WEB+DB PRESS 総集編 [Vol.1~36] を選ぶことをお勧めする。
結論としては、日本語の Groovy の本を買うなら Groovyイン・アクション しか選択肢が無いよ!と言うこと。もう少し普及しないかな :-。
grep でパターンをファイルから読み込むには? [NT]
grep で正規表現にマッチした部分だけ抽出するには? で grep について書いたので、その続き。
複数のパターンで grep を実行したい場合、スクリプトを書かなくても -f オプションを用いればよい。これを使うと、パターンをファイルから読むことが出来る。
pattern.txt というファイルを次のように記述する。
CLOSE_WAIT
LI.*G
検索対象のファイル list.txt が次の内容であるとする。
Active Connections
Proto Local Address Foreign Address State
TCP 127.0.0.1:4111 127.0.0.1:4112 ESTABLISHED
TCP 127.0.0.1:4112 127.0.0.1:4111 ESTABLISHED
TCP 127.0.0.1:4114 127.0.0.1:4115 ESTABLISHED
TCP 127.0.0.1:4115 127.0.0.1:4114 ESTABLISHED
TCP 127.0.0.1:5152 0.0.0.0:0 LISTENING
TCP 127.0.0.1:5152 127.0.0.1:4113 CLOSE_WAIT
TCP 127.0.0.1:9089 0.0.0.0:0 LISTENING
TCP 127.0.0.1:10110 0.0.0.0:0 LISTENING
このとき、
grep -f pattern.txt hoge.txtと実行すると、
TCP 127.0.0.1:5152 0.0.0.0:0 LISTENING
TCP 127.0.0.1:5152 127.0.0.1:4113 CLOSE_WAIT
TCP 127.0.0.1:9089 0.0.0.0:0 LISTENING
TCP 127.0.0.1:10110 0.0.0.0:0 LISTENING
を得られる。
尚、-F を指定しなければパターンファイルの各行は正規表現として扱われる。そのため、LI*G が LISTENING に該当するので、CLOSE_WAIT だけでなく、LISTENING の行も表示されている。
grep で正規表現にマッチした部分だけ抽出するには? [NT]
grep で正規表現にマッチした部分だけを抽出(抜き出す)には、-o オプションを用いる。
ただし、-o オプションは比較的新しい grep でないと使用できない。 GNU utilities for Win32 で紹介したパッケージに含まれる grep のバージョンは、
> grep -V
GNU grep version 2.0 + multi-byte extension 1.04
であり、このバージョンでは使えない。そこで、Grep for Windows からダウンロードできるバージョンを使うと良い。こちらは 2.5.4 である。
>grep -V
GNU grep 2.5.4
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ダウンロード出来るファイルは幾つかあるが、めんどくさい方は Setup を使う。zip が欲しい方は Binaries と Dependencies の Zip をダウンロードして、 Dependencies に含まれる dll を Binaries の grep と同じディレクトリに入れればよい。
-o オプションは例えば、
Active Connections
Proto Local Address Foreign Address State
TCP 127.0.0.1:4111 127.0.0.1:4112 ESTABLISHED
TCP 127.0.0.1:4112 127.0.0.1:4111 ESTABLISHED
TCP 127.0.0.1:4114 127.0.0.1:4115 ESTABLISHED
TCP 127.0.0.1:4115 127.0.0.1:4114 ESTABLISHED
TCP 127.0.0.1:5152 0.0.0.0:0 LISTENING
TCP 127.0.0.1:5152 127.0.0.1:4113 CLOSE_WAIT
TCP 127.0.0.1:9089 0.0.0.0:0 LISTENING
TCP 127.0.0.1:10110 0.0.0.0:0 LISTENING
という内容の ip.txt のデータがあるとして、これから IP アドレスとポートの部分を抜き出すには、
grep -o -e [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+:[0-9]\+ ip.txt
とすると、
127.0.0.1:4111
127.0.0.1:4112
127.0.0.1:4112
127.0.0.1:4111
127.0.0.1:4114
127.0.0.1:4115
127.0.0.1:4115
127.0.0.1:4114
127.0.0.1:5152
0.0.0.0:0
127.0.0.1:5152
127.0.0.1:4113
127.0.0.1:9089
0.0.0.0:0
127.0.0.1:10110
0.0.0.0:0
を得られる。
参考文献
- #085 正規表現の落とし穴
- 正規表現の基礎
- 【 どのような正規表現があるのか 】 - Linuxコマンド逆引き大全:ITpro
- grepの正規表現 - satospo
- 単語抽出するちょっとしたテクニック - 技術メモ帳
- www.okubo.tk/blog: grep -o
- grep で欲しい部分のみ出力 - 波間の浮遊物
古いバージョンの JDK/JRE を入手するには? [NT]
Java はある程度、上位互換性を保っているので、基本的には最新の JDK/JRE を使用すれば足りる。また、古いバージョンではセキュリティに問題がある場合があり、最新の JDK/JRE では修正されていることも多い。
しかし、それでも JDK (Java Development Kit)、JRE (Java Runtime Environment) の古いバージョン(旧バージョン) を必要とすることがたまにある。
例えば、
- 企業の社内システムで JRE 1.5 でないと動作しない。または、動作保証してくれない。
- ダウンロードしたサンプルプログラムが JDK 1.2 ベースだった。
- オープンソースのソフトウェアで開発が止まっているんだけど、ちょっと動かしてみて、大丈夫そうなら使ってみたいが、JDK 1.4 向けに作成されていた。
などなど。少なくとも、エンドユーザが使うべきではなく、開発者向け。基本的にサポートしてくれない。
そんな、古いバージョンの JDK / JRE は次の場所から入手できる。
先に「Java はある程度、上位互換性を保っている」と述べたが、各バージョンについての互換性については次の場所で述べられている。
その他のバージョンの互換性についても上記ページからリンクを辿って確認できる。Groovy から e-mail を送信するには? [groovy]
Sh*tmores: Missing Groovy Recipe: Send e-mail from Groovy で紹介されているように AntBuilder を使うと簡単にできる。
上記 blog でのコメント欄にもあるけれどgrails を使っている場合は AntBuilder ではなく Grails - Mail Plugin を使った方が容易だろう。
シェルスクリプトを書く代わりに Groovy で簡単なツールを書く者にとっては Grails のプラグインでない AntBuilder の方が使い安い。
ただ、幾つかライブラリを用意する必要がある。ライブラリを CLASSPATH に設定しないと
[mail] Failed to initialise MIME mail: org.apache.tools.ant.taskdefs.email.MimeMailer
と表示されてメールを送れない。ライブラリは次の場所から入手できる。
- http://java.sun.com/products/javamail/index.jsp
- http://java.sun.com/javase/technologies/desktop/javabeans/glasgow/jaf.html
- http://ant.apache.org/bindownload.cgi
それぞれ、JavaMail と JavaBeans(TM) Activation Framework、Apache Ant である。
ソースコードを UTF-8 で書いていて、メールの本文も UTF-8 にしたいのなら charset を指定すればよい。以下サンプル。
param1 = "だよね orz.."
ant = new AntBuilder()
ant.mail(mailhost:'mail.example.com', mailport:'25', subject:'日本語のテスト', charset:'utf-8'){
from(address:'experiment@example.com')
replyto(address:'experiment@example.com')
to(address:'experiment@example.com')
message(
"""日本語のテスト
ヒアドキュメント便利 ${param1}
""")
}
Groovy だから ${変数名} で変数を差し込めるし、ヒアドキュメントも使える。先に紹介した blog ではファイルの添付方法も紹介している。
最終的に、ソースコードを UTF-8 で mail.groovy にしたなら、
groovy -c utf-8 -cp "I:\lib\activation.jar;I:\lib\mailapi.jar;I:\lib\smtp.jar;I:\lib\ant-javamail.jar" mail.groovy
でとすれば良い(各種ライブラリのパスは各自で適切に変えて頂きたい)。
メールサーバの認証方法はいろいろあるが、POP before SMTP だと、上記のスクリプトのままでは POP してくれないので、認証に失敗してメール送信できない。その場合は、POP してメールを受信(受信せず、メールがあるかないか調べるだけでも可)するコードを書くか、Thunderbird などで一旦、受信しておいて、そのアカウントを用いてメール送信すれば良い。少なくとも so-net は可能だった。
Ant の Mail タスクのマニュアルは Mail Task にある。このマニュアルは XML ファイルとして設定をどのように記述するか述べたものだから、Groovy で実装する場合は注意されたい。
筆者の場合 charset:'utf-8' と書くべきところを charset='utf-8' と書いて、
Caught: The <mail> type doesn't support nested text data ("utf-8").
と表示されて何が悪いか直ぐ分からなかったので...
参考文献
wget で cookie を利用するには? [NT]
wget はコマンドラインから使えるダウンローダである。元々、UNIX/Linux 向けに開発されたものだが Windows 版もある。
wget を含むツールの取得方法は GNU utilities for Win32 でエントリを書いたので、今回は、wget で cookie の設定方法について書く。
ログインの有無などのために、多くのページでは cookie を用いている。cookie はキーと値から構成されるので、それらが分かれば wget でも利用できる。
キーが "key" で値が "value" ならば、
wget --cookies=off --header "Cookie: key=value"
と記述すればよい。この記述方法は --cookies=off で cookie を無効にしておいて、HTTP ヘッダに自前で cookie を設定している。
cookie が分からなければ Mozilla Firefox と そのアドオンである HttpFox などを利用すれば容易に調べることが出来る。
必要に迫られて調べたことだったが、案外便利だったのでメモしておく。
Groovy で正規表現にマッチした箇所を抜き出すには? [groovy]
groovy で正規表現にマッチした箇所を抜き出すには次のように記述する。
matFile = (file =~ /^([0-9a-zA-Z\-]+) (.*).mp3/); if (matFile.matches()) { id = matFile[0][1] title = matFile[0][2] }
この場合、file が 「AAb-32D なんかのタイトル.mp3」であれば、
- id = AAb-32D
- title = なんかの タイトル
を取得できる。もし、file が 「日本語 なんかの たいとる.mp3」のときは、 正規表現にマッチしないため、id、title には設定されない。
id が英数字からなるものの 場合は [0-9a-zA-Z] とすれば良い。
先に示した正規表現では「~」 が先頭に付与されているので 「 AAb-32D たいとる.mp3」のように、先頭に空白など英数字(と「-」)以外の文字がある場合はマッチしない。
Groovy からプログラムを実行するには? [groovy]
Groovy でちょこちょこコードを書くことがあり、せっかくなので忘れないようにメモしておく。
Groovy から任意のプログラムを実行する(サブプロセスを起動するとか子プロセスを起動するとも呼ばれるが、本エントリでは区別しない)には、次のように記述する。
str = "wget http://www.example.com/"
Process p = str.execute()
p.waitFor();
ここでは、wget と言うプログラムを http://www.example.com/ を引数として実行している。
実際に実行するのは execute() で、String クラスのメソッド。Process を返し、Process.waitFor() メソッドを用いると実行したプログラムが終了するのを待つことが出来る。
waitFor() を明示的に呼び出さない場合は非同期実行になるっぽい。
ちなみに、Windows の dir は cmd (コマンドプロンプト) の組み込み関数なので、dir を使う場合は次のように記述する。
"cmd /c dir".execute()
dir は指定したディレクトリに含まれるファイルのリストを表示するコマンドなので、普通は dir した結果を利用する。この場合は、
"cmd /c dir /b C:\\someDirectory".execute().text.eachLine {
println it
}
と記述すれば、ファイルリストの各ファイルパスを参照できる。dir の他にも cmd の組み込み関数はあるので注意されたい。
参考文献
SQL の基礎 その6 [exam]
SQL のメモ。ORACLE MASTER Bronze SQL 基礎Ⅰ向け。SQL の基礎 その5 の続き。
ORACLE MASTER Bronze SQL 基礎Ⅰ日本オラクル公式テキスト改訂版によると、索引を作成するとき・しないときのガイドラインがあるという。以下、同書籍から引用。
次の場合は、索引を作成します。最後の、「索引を付けた列が、式の一部として使用される」場合は索引を付けない方が良いということは気がつかなかった。何故だろう。
- 列の値の種類が多い、または列の値が一意。
- 列の値に NULL 値を多く含み、WHERE 句の条件で NULL 値でない値の検索が多い。
- WHERE 句の条件として頻繁に使用される。
- 表のサイズが大きい。
- ほとんどの問合わせが、表全体の 2%~4%未満の行を検索する。
次の場合は、索引を作成しません。
- 列の値の種類が少ない。
- 列の値に NULL 値を多く含み、WHERE 句の条件で NULL 値の検索が多い。
- WHERE 句の条件としてあまり使用されない。
- 表のサイズが小さい。
- ほとんどの問合わせが、表全体の2%~4%以上の行を検索する。
- 頻繁に更新、追加、削除が行われる表。
- 索引を付けた列が、式の一部として使用される。