カスタム検索

2009年5月19日火曜日

Grails 1.1.1 でプラグインリポジトリ(認証付き)を使ってみた

Grails1.1.1がリリースされた事もあり、自分プラグインリポジトリを試してみました。

1.1系になり、プラグイン周りが大幅に変わったのはコチラで詳しく解説されています。


では早速実践です!(環境はMacです)


まずはSubversion Clientを1.5系にします(SVNKitの部分で1.5以外はうまく動作しませんでした)
ココから探っていくと過去のバージョンもありましたのでそこから 1.5.6 を入れました。

次にSVNリポジトリを作成します。リポジトリ側のバージョンは1.5でなくてもOKです。(今回は 1.4.2 でテストしました)
サーバ側の設定は何もありません、中身も空で良いです。

開発環境orプロジェクトへリポジトリ設定を追加します。
開発環境に追加する場合は ~/.grails/settings.groovy ファイルへ、
プロジェクト毎に設定する場合はプロジェクトの grails-app/conf/BuildConfig.groovy ファイルへ以下の内容を記述します。

grails.plugin.repos.discovery.リポジトリ名称=SVN URL
grails.plugin.repos.distribution.リポジトリ名称=SVN URL

discovery は取得(list-pluginsやinstall-plugin)、
distribution はコミット(release-plugin)の設定です。

開発環境とプロジェクトの両方に同じリポジトリ名称が設定されている場合はプロジェクトに設定された方が優先されます。

SVNのURLは認証が無い場合はそのまま、http://svnurl/ と記述すればOKですが、今回はBasic認証を使います。
Basic認証を使う場合には https を使用する必要があります。

試しに https://svnurl/ だけ指定して list-plugins するとユーザ名とパスワードを聞かれます。
ですが、これ list-plugins 以外にも run-app 等毎回聞かれます、しかもhttpsのリポジトリが複数あると、すべてのパスワードを毎回聞かれてうっとおしいことこの上ないです。(しかもパスワード入力がマスクされないので丸見えです :p)

ユーザを聞かれないようにするには https://username:password@svnurl と入力しておきます。
ですがこれもパスワード丸見えなので、BuildConfig.groovy に書いておくとチームで使うには不便です。
(とりあえずチーム内で使うには各自の settings.groovy へ書いておくのが得策と思われます)

ここまで設定出来れば準備完了です。
適当な plugin を作成し、releaseしてみましょう。

grails create-plugin testPlugin
cd testPlugin
grails release-plugin -repository=リポジトリ名称

コミットメッセージ等を聞かれて、うまくいけばSVNへプロジェクトがコミットされます。
初releaseの場合はリポジトリに .plugin-meta/plugin-list.xml ファイルが作成されます。
この中にそのリポジトリ内のpluginの情報が記述されます。
ファイルがうまく作成されていたら以下のコマンドを実行して確認してみましょう。

grails list-plugins -repository=リポジトリ名称

先程releaseした testPlugin が表示されれば成功です。

ですが、今 release したローカルのファイルはsvnの管理下にいないので、次のバージョンをリリースするには、
一度アップされた plugin を checkout して、更新後、release-plugin する必要があります。
1回目だけはちょっと面倒です。

最後に通常のGrailsプロジェクトを作成し、insall-plugin 出来れば完璧です。

grails create-app test
cd test
grails install-plugin test-plugin

これでチーム開発をする時に plugin ファイルを共有する必要がなく、
application.properties に plugins.test-plugin=0.1 が記述されているだけで、ファイルがなければ run-app時に自動的にインストールしてくれます!

まだちょっと扱いが生な感じがするのですが機能としては十分使えそうです、プラグインもプロジェクトもスッキリさせましょう!

2009年5月12日火曜日

そろそろMySQL Clusterと向き合う時期が来たのかもしれない その1

普通のMySQLすらまともに使った事の無い状態でのトライです
なんで基本的に間違ってる事があるかもしれませんがご了承を・・・

まずはMySQL Clusterから必要なパッケージをダウンロードしにいく
今回はRedHatにセットアップするので、RedHatのリンクへ

・・・
・・・
・・・
Server、Client、Cluster storatge engine、Cluster storage engine managemen、Cluster storage engine basic tools、Cluster storage engine extra tools、Headers and libraries、Debug Info、Shared libraries、Test suiteと山盛りであるんですが・・・

どれをダウンロードしろと?w

・・・

まーさっぱりわからんのでとりあえず何がどれなのか知る為に漢の中の人が書いてるココを参照

MySQL Clusterには管理ノードとデータノードとSQLノードというのがある、それぞれは以下のように解釈

・管理ノード
他のノード達の管理をしている、バックアップもこいつから実行
管理といっても居ないと動かないわけではなく、ノード達のON/OFFなど本当に管理だけ

・データノード
実データ格納場所、MySQL Clusterは基本的にデータをHDD上ではなくメモリ上で管理する(!)オプションでHDD保存も出来るらしいけど
データノード間でハートビートを送り、タイムアウトすると管理ノードに報告する。ちくり魔め。

・SQLノード
SQLを解析して、データノードからデータを取得する
なんだかよくわからんかったけど、どうやらこれは通常のMySQLという事らしい
MySQLにはRDBMSのENGINEとしてMyISAMとInnoDBが主に使われているんだけど、MySQL ClusterとはこのENGINEの一つとして動作するものらしい!
(ずっとMySQL Clusterというまったくの別物だと思っていたので、ここを理解したらなんだか随分わかりやすくなった)


で、ようやくダウンロードに戻るわけですが・・・イマイチよくわかりませんでしたw
セットアップ後の自分なりの解釈で、

Server SQLノードにあたる部分
Client サーバ上でSQLノードへ接続したり、いわゆる mysql コマンド
Cluster storatge engine データノード
Cluster storage engine managemen 管理ノード
Cluster storage engine basic tools データノードツール?
Cluster storage engine extra tools データノードツール?
Shared libraries 共通のライブラリ

こんな感じ、以下は必要なさそうだったのでダウンロードしてない :)

Headers and libraries
Debug Info
Test suite


2009/5/13 追記
漢の中の人がすでに書いてました :)
これは公式にも乗せるべき内容!


実は内容的にまったく進んでないんですが、MySQL Clusterにはこんな初心者向けな記事があってもいいよね!

次回はセットアップ奮闘編
(本当にやるのかなw Grails+Connector/J(フェイルオーバー)+MySQL Clusterで色々落ちても安心だね!までやったので残しておきたいけど)

Grailsで添付ファイル付きメールを送る

Grailsには公式でMailPluginというのがあり、こいつを使うとDSL形式で簡単にメールが送れます。

ですが、こいつは添付ファイルに対応していません。
ここですでに解決が出ているのですが、公式のバージョンではまだ実装されていないので、自分で拡張してしまいましょう。

grails install-plugin mail
でpluginをインストールし、その中の MailService.groovy ファイルを開きます。

このファイルの中に MailMessageBuilder Class の定義がされているのですが、こいつがDSLを処理している部分になります。
(void to とか void title とかその辺りです。)
ここに attachBytes という添付ファイル名、コンテントタイプ、バイト配列を受け取ってメールに添付する処理を追加してやります。


void attachBytes(String fileName, String contentType, byte[] bytes) {
getMessage().mimeMessageHelper.addAttachment(fileName, new ByteArrayResource(bytes), contentType) }
}


このままだと getMessage した時に、以下の部分が呼ばれます


message = new MimeMailMessage(mailSender.createMimeMessage() )


添付ファイルを送る時は Multipart にしないといけないので、以下のように書き換えてやります

message = new MimeMailMessage(new MimeMessageHelper(mailSender.createMimeMessage(), true ))


あとはメール送信時に attachBytes を呼び出してやればOKです。

def file=new File("test.dat")
// ファイル名に日本語が含まれる場合は文字列をエンコードする必要があります
// 日本のメール環境では iso-2022-jp がまだまだ主流なので、iso-2022-jp を使いましょう
//def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat", "utf-8", "B")
def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat", "iso-2022-jp", "B")

// コンテントタイプはファイルや用途に合わせて変更して下さい
def contentType="application/octet-stream"

mailService.sendMail {
to "test@test.jp"
from "test@test.jp"
subject "添付テスト"
body "添付ファイルを送ります"
attachBytes title, contentType , file.readBytes()
}


と、思ったらMail from Grailsなんてページがあったり、この方法でもファイル添付出来るみたいですね。
↑プロポーザル的に書かれているだけで、実装されているわけではないらしいです

2009/5/13 追記
メールタイトルの文字コードと、Mail from Grailsのページについて、mottsniteの中の人から指摘があったので修正

2009年5月7日木曜日

HudsonをCLI(CUI)で操作する

Hudson CLIとGroovy shellという記事をよんでとても興味深かったので早速試してみました。

自分所に入ってるのが古かったので最新版を公式からダウンロード
前はjarパッケージしてスタンドアローンアプリで動かしていたけど、特別必要もなかったので普通に tomcat に配備

tomcat を起動して http://serverurl/hudson/cli へアクセス
こんなんでましたよっと



リンクから hudson-cli.jar をダウンロードして shell から早速実行してみる


java -jar hudson-cli.jar -s http://serverurl/hudson help

version
Shows the Hudson version
help
Lists all the available commands
groovysh
Runs an interactive groovy shell



とりあえず version と help と groovysh が実行出来るっぽい
記事元の groovy コマンドもばっちり動いて Hudson の instance を取得出来た!
pluginとか作る時とか、サーバから操作する時とか色々出来そうですね

なにより Groovyってのがいいね :)

2009年5月1日金曜日

Grailsで帳票! fop編

帳票、というか組版の部類になると思うんですが、fopでPDFを作成してみました。

帳票というと帳票ソフト+帳票ツールという概念が強かったのですが、
mottsniteさんから
「HTML組む時にGUIソフト使わないっしょ?帳票もGUI使わずにfopでタグ書いたらいいんじゃないの?」
と言われ妙に納得してしまったので、使ってみる事に。

日本語出力までに微妙な所でハマってしまったのでメモっておきます。

・まずはApache fopをダウンロードします。(0.95を使いました)

・Grailsのプロジェクトにライブラリを追加します。
buildフォルダから fop.jar と、libフォルダから以下のファイルを grails プロジェクトの lib フォルダにコピーします。
xmlgraphcs-commons-1.3.1.jar
batik-all.jar
avalon-framework-4.2.0.jar

その他のjarファイルはgrailsが持っているもので補えるので必要ありません。

・FOPの設定ファイルをコピーします
conf/fop.xconf ファイルを適当な場所にコピーして以下のように書き換えます。

<?xml version="1.0"?>
<fop version="1.0">
<base>.</base>
<source-resolution>72</source-resolution>
<target-resolution>72</target-resolution>

<default-page-settings height="11in" width="8.26in"/>

<renderers>
<renderer mime="application/pdf">
<filterList>
<value>flate</value>
</filterList>

<fonts>
<auto-detect/>
</fonts>

</renderer>
</renderers>
</fop>


昔のバージョンではフォントファイルからフォントメトリクスを作成し、その定義をちまちまと書く必要があったのですが、
今はfontsのauto-detectでOSがもってるTTFのフォントが使えるようになります。
(一回目の起動時はフォントファイルを全部読み込むので時間がかかります。)

・簡単なFoファイルを用意します

<?xml version="1.0" encoding="UTF-8" ?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="PageMaster">
<fo:region-body margin-top="3cm"/>
</fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="PageMaster">
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="Batang" font-size="18pt" text-align="center">
Hello: XSL-FO to PDF
日本語
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>


*font-family は実行するPCに入っている適当なTTFフォントを指定します。
(はじめはMS明朝でテストしていたのですが、なぜかMS明朝はうまく乗らないようです、他のTTFフォントを使いましょう。)

・FopFactoryを定義します。
通常は new FopFactoryでいいんですが、せっかくなのでGrailsっぽくSpringBeanとして登録しちゃいます。
conf/spring/resources.groovy を以下のように書き換えます。

import org.apache.fop.apps.FopFactory

beans = {
def fopFactory=fopFactory(FopFactory){
}
}


これでコントローラーやサービスに def fopFactory とするだけで注入されます :)

・レンダリングを実行します
とりあえずコントローラーにでも書いちゃいましょう



def fop={
fopFactory.setUserConfig(new File("fop/fop.xconf"))
OutputStream os = new BufferedOutputStream(new FileOutputStream(new File("fop/fop.pdf")))

try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, os)

TransformerFactory factory = TransformerFactory.newInstance()
Transformer transformer = factory.newTransformer()

Source src = new StreamSource(new File("fop/fop.fo"))
Result res = new SAXResult(fop.getDefaultHandler())

transformer.transform(src, res)
} finally {
os.close()
}

render "ok"
}





素晴らしい!
速度も十分です。
グラフを出したりはまた別の仕組みが必要になってしまうのですが、組版的な細かい調整(長体かけたり、外字使ったり、レイアウト組とか・・・)が出来たり、MarkUpBuilder使ってプログラム的に組んでしまえばデータにあわせて微妙に形をかえるような帳票も出来ちゃいますね!