Groovy のスクラップコードと Eclipse 3.6 Helios

コンピュータでの作業中に、定型的なテキストファイルをつくったり、加工したりなどの効率化を図りたいときがあります。

こんなとき手元でぱっと動くプログラム言語があると便利です。 Linux なんか使っていると Perl とか Ruby とかすぐ動くのでそちらという手もありますし、Windows なら Excel VBA とか?

そんな一つの方法で、Eclipse 立ち上げて仕事しているのなら Groovy が便利かもしれません、、というわけで使いそうな Groovy のプログラム断片をメモしておきます。

Groovy 言語は Java を拡張して連携できるようなスクリプト言語です。

Groovy – Wikipedia

GroovyはJVM上で動作する言語処理系および言語の名称であり、Javaとの直接的な連携を特徴とする。例えばGroovyからすべてのJava SE APIや、Javaで書かれた任意のサードパーティ製のコンパイル済みのライブラリなどを呼び出すことができる。言語の記述能力としては、Javaで記述できることは、無名内部クラスの定義など一部の例外を除き基本的にGroovyでも記述することができる。逆に言うとJavaで記述できない機能は記述できないが、Javaと同様にC言語などで書かれたネイティブメソッドなどは呼び出すことができる。

groovy-eclipse という Eclipse 用のプラグインが提供されており、これ入れておけば実行環境が簡単につくることができます。 最終的には JVM で動くコードができるので、隣の人につくったプログラム動かしてもらうのも簡単だという利点もあるですね。

Eclipse向けのGroobvy開発プラグイン「Groovy-Eclipse 2.0」 登場 – SourceForge.JP Magazine  オープンソースの話題満載

Groovy Eclipseプロジェクトは1月15日、「Eclipse」向けプラグイン「Groovy-Eclipse 2.0」を公開した。Eclipse環境でGroovy開発を構築するもので、EclipseのJava開発機能に匹敵するレベルの支援機能を提供するという。

というわけで、使いそうな断片集です。 ぼくはその場に応じて適当につかっているだけなので、間違っていたらごめんなさい。 メモレベルです。

作業用に、Eclipse のプロジェクトをひとつつくっておいています。

groovy10 

まずは文字列操作編。

// 部分文字列取得
println "テストです。"[3..-1]
 
// 文字列長さ取得
println "Lengthのテストです。".length()
 
// 文字列分割
"split1,split2,split3".split(",").each { str ->
    println str
}

 

結果は上から、

です。
13
split1
split2
split3

 

となります。 日本語も思った通り処理されます。

次は文字列マッチ系。

// 正規表現マッチ判定(完全一致)
if("hiromasa" ==~ /.+masa$/) {
    println "mutch!"
}
 
// 正規表現マッチ判定(部分一致)
if("hiromasa" =~ /masa$/) {
    println "mutch!"
}
 
// 正規表現マッチ取得
"stronger, stranger, walker, hiromasa".eachMatch(/(\w+?er),/) { all, match ->
    println match;
}
 
// 正規表現マッチ置換
println "stronger, stranger, walker, hiromasa".replaceAll(/\w+?er/, { match ->
    match[0].toUpperCase() + ((match.size() > 1) ? match[1..-1] : '')
})

 

結果は、

mutch!
mutch!
stronger
stranger
walker
Stronger, Stranger, Walker, hiromasa

 

こんな方向で。

次は、リストとマップ。

// リスト
def lists = ["test1", "test2", "test3"]
lists.each { value ->
    println value
}
 
// マップ
def maps = ["key1":"apple", "key2":"orange", "key3":"mango"]
maps.each { key, value ->
    println key + " = " + value
}

 

こんな感じでまわせます。 結果はご想像通りの方向で(笑)

次はファイル処理系。

// ファイル読み込み
new File("file/readme.txt").eachLine { line ->
    println line
}
 
// ファイル書き出し
new File("file/writer.txt").withWriter { line ->
    line.println("hoge")
    line.println("moge")
}

 

読み書きともクロージャ渡す感じで。 オープンクローズ、異常系を勝手にやってくれます。 便利あるね。

最後に、便利そうなの。

// 回数指定ループ
(0..2).each { counter ->
    println counter
}
 
// 埋め込み文字列
def lines = ["line1", "line2", "line3"]
def number = 1
lines.each { value ->
    println "${number} : ${value}"
    number++
}
 
// 長い文字列
def gstr = """\
改行できますぞ。
改行できますぞ。
改行できますぞ。\
"""
println gstr

 

文字列系がいろいろ拡張されているようです。

これくらいあればあとは知恵と勇気でなんとかなるかと。 困ったら Java そのまま呼べちゃうので、それでパッと回避するのが吉かもしれません。 ライブラリ jar 入れれば、すぐその機能を使えるのも楽ですね。

てなわけで、Groovy でした。 🙂

さて、先日でました Eclipse 3.6 Helios をちょっと評価がてら最近使っております。

helios01

事務所では Windows XP / JavaEE 版をつかっていますが特に不具合はなさそうです。 最近流行のプログラムのマーケット的なところからプラグインの導入ができるようになりました。

helios02 

毎回、Subclipse のアップデート探していたりしていたので、便利かもしれません。 ぼくの使い方では、あとは JavaEE では劇的に便利になるのはないかな。。

家では、PHP for Developer 版を導入してみました。

Windows 7 対応がされているハズなのですが、うちの環境だとジャンプリストとかがうまく動作しませんでした。 右クリックが無反応でした。(うちだけかな)

Linux 版もいれて、3.5 ガニメデ で存在していた「ボタンが押せなくなる」 SWT の不具合が解消しているのを確認しました。 ただ、PHP のでかいコード表示すると、無反応になった後ヒープエラーがでることも確認。。 パーサがバグってるのかも。

というわけで、全般的にはうちでは 3.6 はまだ様子見という感じです。 引き続きウォッチしていこうと思います。 🙂

オープンソースカンファレンス 2010 北海道 + WordPress セミナ & ブース

昨日 6/26 に札幌市産業振興センターで行われました、オープンソースカンファレンス 2010 北海道にて、WordPress ブース展示とセミナの開催をWordBench 札幌として実施させていただきました。  🙂

セミナで「世界標準ブログツール WordPress の最新版 3.0 と豊富なプラグイン」ということでお話しさせていただきましたので、資料のほうをこちらで公開したいと思います!。

東京からはるばる札幌まで支援に来ていただきました、yuriko さんてぃあこさんおでこさん、札幌よりさっちん、どうもありがとうございましたっ。

オープンソースカンファレンス2010 Hokkaido – オープンソースの文化祭!

内容:オープンソースに関する最新情報の提供
・展示 – オープンソースコミュニティ、企業・団体による展示
・セミナー – オープンソースの最新情報を提供

自分は普段ソフトウェア会社所属なもので、WordPress のブース・セミナに興味を持って多く足を運んでくださるであろう、札幌の Web 製作会社の方との交流が実はなく、実際どの程度着ていただけるのかが未知数でしたが、ふたを開けてみればセミナの方は立ち見までということで、札幌で活動をされている方と交流を持たせていただけたことを嬉しく思いました。 🙂

というわけで、セミナ資料を公開いたします。

世界標準ブログツール WordPress の最新版 3.0 と豊富なプラグイン

本日お話しする内容

  • 日本時間 6/18 にリリースされた WordPress 3.0 について、WordPress の CMS としての紹介とともに新機能を解説します。(6/23 に日本語版がリリースされました)
  • その中で WordPress の動作を追いながらプラグインの仕組みと、その仕組みを使った具体的な例を紹介します。
  • 最後に、WordPress コミニュティサイト WordBench をご案内します。

ご存じの通り人前でしゃべるのが苦手なもので分かりづらくてホントすいません。。 当日の資料で口頭にしてしまっているところには、若干ですが補足いれましたので、来られていない方も見ていただければと思います。

セミナ終わった後にご挨拶させていただけた方、ありがとうございました。 今後ともヨロシクお願いいたします。 🙂

WordPress ブースの方もみなさん足を運んでくださってありがとうございました!

IMG_0092

yuriko さんが、WordPress グッズを東京から輸入してくださいました。 😀

前日のお食事会の様子や、OSC 中の楽しげな写真などは次のエントリでいきます!(おでこさんの写真待ちともいう(笑))

WordPress 3.0 と プラグインアクション・フィルターフックへのクロージャ渡し

3.0 開発中は全然気がつかなかったのですが、WordPress 3.0 からプラグインのアクション・フィルターフックにクロージャが渡せるようになりました。

クロージャが使えるのは PHP 5.3 からなのでみんなに使ってもらうプラグインなどではあまり使えませんが、5.3 と決まった環境でのテーマつくりなどの作業の場合は楽できるかもです 🙂

特に、Thematic などテーマフレームワークの functions.php で小さなフックをつくらなければいけない場合に威力を発揮しそうです。 ついでに 5.3 じゃなくても楽する方法も紹介します。

修正元の trac はこちらです。

#10493 (Allow closures as callbacks) – WordPress Trac

PHP 5.3 allows closures, which means we can replace this:

add_action('init', create_function('', '//do something'));

with this:

add_action('init', function() { // do something });

and it only requires two lines of extra code.

実はサンプル上の create_function を使うパターンは少し前からマイブームだったのでタイムリー。 こちらは PHP 5.3 じゃなくてもいけます。

でもって、これって何の話かというと…。

いつもの、the_content のフィルターをつかった、記事の頭に☆をつけるサンプルでご説明。

まず、以下のソースが一般的にかいたフィルタープラグインフックです。

// 普通のパターン
function add_star($content) {
    return "☆" . $content;
}
 
add_filter('the_content', 'add_star');

 

別にこれでいいわけなんですが、問題は add_star っていう関数。 こんな小さい関数に名前をいちいち考えるのも大変ですし、他とかぶってはいけないという制約もあります。 要は面倒であります。

ってことで、PHP では create_function というのを使うと匿名関数というのがつくれますので(名無しさんですね)これを利用すると…。

// 匿名関数(create_function)
add_filter('the_content'
    , create_function('$content', 'return "▲" . $content;'));

 

add_star をなくせました。 create_function でつくりだした匿名の関数をフックに渡してしまいます。 ちょいフックならこれで十分。 これは PHP 5.3 じゃなくても動きます。

でもちょっと問題がありまして、見ての通り関数の内容がただの文字列。 IDE サポートもうけられませんし、何より分かりづらい。 SQL をソースコードに直接書いているようながっかり感があります(笑)

というわけで PHP 5.3 から登場した、無名関数。 PHP マニュアル見ると匿名と無名で分けてみるみたいですね。

php 無名関数 – Manual

無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 コールバック パラメータとして使う際に便利ですが、用途はそれにとどまりません。

どうなるかというと、

// 無名関数(PHP 5.3)
add_filter('the_content'
    , function($content) { return '△' . $content;});

 

やぁすっきりしました。 function() {} ということで名前なしで関数を定義して、直で add_filter に渡してしまいます。(これが WordPress 3.0 からサポートされました)

ここまでで十分便利ですが、調子に乗って「振る舞いを変えた」無名関数を the_content に登録してみます。

// 無名関数(エンクロージャ参照)
function enclosure($value) {
    $add = $value;
    return function($content) use($add) {
        return $add . $content;
    };
}
 
add_filter('the_content', enclosure('□'));
add_filter('the_content', enclosure('■'));
 

 

これは今までは class でやっていたことを、関数で実装する感じです。 PHP のクロージャは外側の変数を参照するのに use を使うようです。 🙂

さてさて、これらを全部テーマの functios.php いれるとこんな感じになります。

closure01

予定通り全部動いていますね。 🙂

最後に thematic テーマフレームワークで head 部に generator meta タグを復帰させるコードをサンプルに。

// 匿名関数版(create_function)
add_action('init', create_function('',
    "remove_filter(
        'the_generator'
        , 'thematic_remove_generators');"), 999);
 
// 無名関数版(PHP 5.3)
add_action('init', function() {
    remove_filter(
        'the_generator'
        , 'thematic_remove_generators');},999);
 

 

というわけで、小さいフックをかかねばならない場合は、是非是非(←3回目…