しおしお

IntelliJ IDEAのことなんかを書いてます

IntelliJのStructural Searchでfail文のない異常系テストコードを抽出

IntelliJのStructural Searchを使用してJunitの異常系のテストコードでfail文が無いコードを検索してみました。

TDDやってたら、そんなことにならなくね???との意見があるかもしれないけど、残念ながら現実はそうはなっていないもので・・・
現実がこうなっている以上、全部調べて直さないといけないわけなんですよね。

Structural Searchの定義

以下の値を検索条件として定義します。

try {
    $statement$;
} catch ($Exception$ $exceptionVar$) {
    $catchStatement$;
}

それぞれの変数($で囲まれている値)の説明

statement

例がが発生するであろうプロダクションコードの呼出と、fail文が実装されるべき箇所。
この変数に該当するコードにfail文が無いコードが問題となるので、条件定義でfail文がないものとしてあげる。

この変数には、下の画像のように設定をしてあげます。
f:id:sioiri:20120906224848p:plain

ポイントはfail文がないことと、ステートメントが複数ある可能性があるので「Unlimited」にしてあげます。

Exceotion

catchされる例外のクラス名。これは、デフォルト設定のままでOK。

exceptionVar

catchした例外の変数名。これは、デフォルト設定のままでOK。

catchStatement

catchブロック内のステートメント。assertの前にコメントや余計なコードが有る可能性も否定出来ないので定義してあげます。
また、catchブロックの最後にも同じ変数を定義してあげます。

この変数には、下の画像のように設定をしてあげます。
f:id:sioiri:20120906225833p:plain

ポイントは、minimum countを「1」にすることとMaximum countを「Unlimited」にしてあげること。
それと、期待値との比較をするassert文があること。

実行結果

fail文のないtry-catchのテストコード(異常系その1のテストメソッド)がヒットします。
f:id:sioiri:20120906230054p:plain

残念ながら私が参画しているプロジェクトでは100箇所以上がヒットしました・・・。

おわり。

IntelliJのコード補完の設定など

IntelliJのコード補完は意外と複雑?なので使い方などまとめました。

バージョン14での最新情報をまとめなおしてみた

IntelliJ IDEA14でのコード補完を整理してみた - しおしお(´・ω・`)

補完の種類

 EclipseのCtrl + Spaceと同じかな?*1

  • SmartType補完

 変数や、キャスト演算子で使用可能なもののみを候補として表示してくれるので、Basic補完と比べて選択候補が限定されます。

  • Class Name補完

 クラス名やstaticメソッドを補完候補として表示してくれます。

  • Word補完

 変数やリテラル内の単語を前方(後方)参照して保管してくれます。

メニューの「Code->Completion」といくと下の画像のように補完メニューが表示されます。*2
f:id:sioiri:20120904221114p:plain

補完の設定画面

補完の設定画面は、「Settings->Editor->Code Completion」からいけます。
f:id:sioiri:20120904225304p:plain

幾つか設定項目の説明をしていきます。

Case Sensitive completion

大文字小文字の区別をどこまで厳密にするかを選択します。私は、大文字小文字の区別は面倒なので「None」に設定しています。
例えば、クラス名と予約後や変数名を区別したい場合には、一文字目だけ大文字小文字を区別する「First letter」を選ぶとよいでしょう。

  • All
  • None
  • First letter

Autocomplete when only one choice

チェックがONの場合、補完候補が1つに絞られたタイミングで選択リストの表示をストップします。
まぁ、チェック入れておいてもいいかと。

Show static members after instance qualifier

チェックをONにした場合、変数経由の補完で静的メソッドが選択リストに含まれます。個人的にONにする理由が見つかりません。

ONにした場合

候補にでてきます。
f:id:sioiri:20120904224556p:plain

OFFにした場合

候補に出てきません。
f:id:sioiri:20120904224559p:plain

Autopopup code completion in (ms)

チェックをONにすると、補完アクションを起こさなくても補完候補を表示してくれます。Visual Studio的な感じ?
表示するまでのミリ秒は、好みがあると思うので調整しながら良い感じの時間にしていくしかないかなと思います。

Preselect the first suggestion

補完候補を表示した時に何を選択状態に下の3種類の中から選びます。
前後関係から、選択可能なものを初期状態で選択してくれる「'Smart'」を選択しておくのがいいでしょう。

  • Always
  • 'Smart'
  • Never

Autopopup documentation (ms) For explicitly invoked completion

JavaDocを自動で表示するかどうか。私は見たい時に見れればいい人なのでOFFにしています。

Parameter Info

パラメータの情報を自動で表示するかどうか。JavaDocと同じ理由でOFFにしています。

IntelliJ IDEA12からは、どれぐらい文字入力が削減できたかを確認できるようになっています。補完機能をフル活用して無駄なキー入力は減らせるようにしたいですね!
文字入力の削減数の確認方法はこちら→IntelliJのその機能使ってる? - しおしお(´・ω・`)

おわり。

*1:Eclipseをあまり詳しくないので間違っているかも

*2:バージョン12のビルド:122.264では、Class Name補完がメニューから消えています。機能的には使えますが。

MacとIntelliJの組み合わせで日本語文字化けに悩まされた件。

文字化けの詳細は、下のリンク先のチケットを参照してください。
A Japanese argument is garbled with the Java application of MacOS. : IDEA-90778

この問題を回避するためにまず行ったのが、IDEA_HOME/Contents/Info.plistのVMOptionsに、「-Dfile.encoding」を足してあげる事。とりあえず、プロジェクト内のファイルは全てutf-8だしIDEの設定もutf-8なので、file.encodingにもutf-8を指定してみた。
これで問題なく動くと思ったのに、普通に文字化けしたままに・・・。
ここから色々試していく中で、わかったことがターミナルから起動するとOKだけどDockから起動するとNGだということ。

なんとなく、LANG環境変数が(JVMのデフォルトエンコーディングはLANG環境変数を元に決まるから)悪さをしてるのかなと思うも、Mac初心者の為Dockから起動した場合のLANGがどうなるかよくわからず。

色々調べてみると、Dockから起動した場合のLANG設定は「environment.plist」に剃る必要が有ることを下のサイトで知ることに。
passingloop • Dock や Finder から起動されるアプリケーションの環境変数を設定する方法

これだ!!と思いテンション高めに「~/.MacOSX/environment.plist」に以下の内容を設定するも、文字化けは解消せず・・・。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>LANG</key>
    <string>ja_JP.UTF-8</string>
</dict>
</plist>

困ったときは再起動な流れで再起動してみるおやっぱりダメ。
そこで、自分でもなんでこんな設定をしたのかわかんないんだけど、LANG設定を「ja_JP.SJIS」に変更してPC再起動したら文字化けがなおった!!!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>LANG</key>
    <string>ja_JP.SJIS</string>
</dict>
</plist>

とりあえず、この設定だと実行対象のプロジェクト内のファイルのエンコーディングが何であろうと文字化け解消するっぽいです。Shift_JISUTF-8とGBKで試しましたが文字化けはしませんでした。
ちなみに、Info.plistへの「file.encoding」の設定はなくても大丈夫みたいです。

結論!!

  • environment.plistにLANG環境変数ja_JP.SJISで追加する
  • Info.plistはいじらなくてもOK

理由が全くわかってないですが、私の環境では文字化け解消することができました。

おわり

IntelliJのその機能使ってる?

IntelliJの各機能をどれぐらい使っているかを見ることができます。
他にも、コード補完でどれぐらいの文字入力をしないですんだのかとかも教えてくれます。

私は、1日辺り1.3K程度の文字入力を削減できているらしいです。土日は会社に来ていないので、実際はもーすこし多いのかな?

元ネタは、IntelliJの公式ブログ→Better Code Completion in IntelliJ IDEA 12 Leda | JetBrains IntelliJ IDEA Blog

使い方

Help -> Productivity Guideで起動できます。

Usedに何回その機能を使用したかが表示されます。意外と使ってない機能って多いんですよね。えっ、そんな機能あったの?ってなったりしました。

行を選択すると、下の方のエリアにその機能の説明や使い方を出してくれるのが親切でなかなか良いですね!

見た目はこんな感じです。
f:id:sioiri:20120831123742p:plain

おわり。

Bouncy Castle Crypto APIsを使って電子署名付きメール送信

Bouncy Castle Crypto APIs(The Legion of the Bouncy Castle Java Cryptography APIs)というOSSを使って、電子署名つきのメール送信を試してみました。

以前OracleのSMIMEでもで試した時の記事はこちら→OracleSMIMEとJavaMailで電子署名つきメールの送信 - しおしおの雑記帳

環境構築

Bouncy Castleのサイト(bouncycastle.org)から必要なjarを落としてあげます。

必要なのは、下の3ファイル。(バージョンは置き換えて考えてね。)

  • bcmail-jdk15on-147.jar
  • bcpkix-jdk15on-147.jar
  • bcprov-jdk15on-147.jar

早速お試しコード

bcmail-jdk15on-147.jar内にあるサンプルコード(CreateSignedMail)を少し見やすくした程度でAPIの使い方など細かいことはわかっていません・・・


お試し用証明書は、comodoやベリサインから発行してもらえます。

IntelliJ12でJDK8のlambda

IntelliJ12 EAP(build:122.202)でJDK8のInspectionが使えるようになったみたいなのでお試ししてみました。
Check lambda support in IntelliJ IDEA 12 EAP build 122.202 | JetBrains IntelliJ IDEA Blogの内容を試してみただけとも言いますが。。。

環境準備

IntellijのプロジェクトのJDKと言語レベルの変更

File->Project StructureからJDKと言語レベルを8に変更します。
下の画像のようになっていればOKです。
f:id:sioiri:20120825005124p:plain

試してみよう!

無名クラスからLambdaへの変換

無名クラスのコンストラクタ呼び出し部にカーソルがある状態で、alt + enterしてあげると「Replace with lambda」と表示されています。
これを選択してあげると、無名クラスがlambdaに置き換えられます。

置き換え前

f:id:sioiri:20120825005318p:plain

置き換え後

f:id:sioiri:20120825005528p:plain

Lambdaから無名クラスへの変換

上と逆に、Lambdaから無名クラスへの変換です。
Lambdaのパラメータにカーソルがある状態で、alt + enterしてあげると「Replace lambda with anonymous class」と表示されます。これを選択すると逆変換ができます。
f:id:sioiri:20120825005920p:plain

パラメータから型情報の削除

パラメータの不要な型定義を警告で教えてくれます。また、Quick Fixから削除することもできます。

警告メッセージ

f:id:sioiri:20120825010233p:plain

Quick fix(alt + enter)メニュー

「Remove redundant types」で不要な型定義を削除できます。
f:id:sioiri:20120825010032p:plain

パラメータに型情報を挿入

パラメータの型情報を推論して挿入してくれます。

パラメータ上でalt + enterで出てくる「Expand lambda to〜」を使うと、型情報を挿入できます。
f:id:sioiri:20120825010708p:plain

これらのQuick Fixをオフにする方法

Settings -> Inspectionsからできます。下の画像のようにlambdaでフィルタを掛けてあげると設定部を探しやすくなります。
オフにしたい場合は、チェックを外してあげます。
f:id:sioiri:20120825011246p:plain

おわり。

お題:package-info.javaの一括生成をIntelliJプラグインで解いてみた

お題:package-info.javaの一括生成 - No Programming, No Lifeのエントリーを見てチャレンジしてみました。
すでに、複数の言語でやってる人がいたので、絶対誰もやらないであろうIntelliJプラグインで作ってみてました。

プラグインのコード

説明は、コメントを見てね。

プラグインの動き

プロジェクトビューのコンテキストメニューに「Create package-info.java」なるメニューを追加してます。
このメニューは、ソースコードディレクトリ配下でのみ活性化されます。
f:id:sioiri:20120818004307p:plain

わかりづらいけど、実行するとこんな感じにどんと生成されます。
f:id:sioiri:20120818004514p:plain

見た目はこんな感じです。
f:id:sioiri:20120818004629p:plain

おわり。