2009年8月30日日曜日

Grails-1.1.1で「Simple」wiki を動かしてみる

ちょっと思う所あり、日本Grails/Groovyユーザーグループ(JGGUG)でソース公開している、Grailsで実装したWiki「Simple」を動かしてみました。
環境はMacOSX 10.5.8。

まずあらかじめGrailsの動く環境を整えておきます。現在の最新版、Grails-1.1.1を準備しました。
セットアップはいろいろな人が書いているので省略。

自分のワークディレクトリに移動し、 http://code.google.com/p/gcrnagoya/ からソースコードをSVNで落とします。
$ svn checkout http://gcrnagoya.googlecode.com/svn/trunk/simple simple

simpleフォルダができるので、中の application.properties を確認。
#Do not edit app.grails.* properties, they may change automatically. DO NOT put application configuration in here, it is not the right place!
#Thu May 07 12:43:04 JST 2009
app.version=0.1
app.servlet.version=2.4
app.grails.version=1.0.5
app.name=simple

Grailsの作成バージョンが1.0.5なので、grails upgrade(※あんまり信用されてないコマンドなので注意)を実行します。
$ grails upgrade

もう一度 application.properties の中を確認すると、
#utf-8
#Sat Aug 29 18:13:30 JST 2009
app.version=0.1
app.servlet.version=2.4
app.grails.version=1.1.1
plugins.hibernate=1.1.1
app.name=simple


次に grails-upp/conf/ に BuildConfig.groovy を作成し、以下を記述します。
grails.project.plugins.dir="work_tmp/plugins"
grails.project.work.dir="work_tmp/work"

これを書いておくと、 デフォルトでは ~/.grails/1.1.1/plugins にインストールされるプラグインを、アプリケーションの work_tmp/plugins/ 以下にインストールしてくれます。

plugins フォルダにプラグインのzip(grails-acegi-0.3.zip,grails-feeds-1.4.zip)が入っているのですが、これをさっくり無視して本家リポジトリからプラグインをインストールします。
$ grails install-plugin acegi
$ grails install-plugin feeds


application.properties を確認すると、
#utf-8
#Sat Aug 29 18:25:48 JST 2009
plugins.feeds=1.4
app.version=0.1
plugins.acegi=0.5.2
app.servlet.version=2.4
app.grails.version=1.1.1
plugins.hibernate=1.1.1
app.name=simple

となりました。
アプリケーションにwork_tmpフォルダができて、中の plugins の中に acegi-0.5.2 と feeds-1.4 がインストールされます。
アプリケーション直下の plugins フォルダは捨ててしまいます。

これで、grails-appしてみます。
$ grails run-app
Welcome to Grails 1.1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails-1.1.1
----- 省略 -----
create default role & user
Server running. Browse to http://localhost:8080/simple


ブラウザから http://localhost:8080/simple を開くと、


わー。
初期状態だとユーザがひとつもないので、ユーザを新規作成します。


登録すると自動でログインします。
トップページがないので、まずトップページを作成します。



初期状態だと、タイトルに「top」とつけたページがトップページになるようです。それを「index」に変更したいので、
grails-upp/conf/config.groovy の 76行目
simple.contents.toppage="top"

simple.contents.toppage="index"
に変更します。
リロードすると index がトップになるように反映されています。


とてもシンプル。

8/30追記:
ところで、起動コンソールを見ていると、いくつか起動時にエラーが出ています。

2009-08-30 14:07:55,428
[main] ERROR commons.DefaultGrailsControllerClass -
The allowedMethods property in RoleController should be declared static.
The non static version is supported for now but has been
deprecated and may not work in future versions of Grails.
----- 省略 -----

これを解消するために、grails-app/controllers/
  • RegisterController.groovy
  • RequestmapController.groovy
  • RoleController.groovy
  • UserController.groovy
の、
def allowedMethods
となっている部分を
static allowedMethods
に修正します。

参考ページ:Grails-1.0.*からGrails-1.1への〜 Pt.1 - leftovers...

2009年8月22日土曜日

Flash Catalyst を見た話。


今日、うちの会社の会議室にて、FxUGの「Flex勉強会第78回@名古屋」がありました。
自分も一緒に聴講させてもらったのですが、アドビの轟さんがしてくれた、Flash Builder 4 と Flash Catalyst のプレゼンが非常に面白かったので、少しここにも書いておきます。

Flash Catalyst というのは、Illustator や Photoshop で作ったデザインを Flex のビューとして再利用するためのツールです。自分も今回初めて知りました。

イベントレポート「Flash Catalyst / Flash Builder 4 ベータ公開イベント」
Adobe Edge: 2008年12月 Flash Catalyst:PhotoshopデザインがそのままFlexアプリのViewへと変わる!

Webデザインのインターフェースを作る時、今まではデザイナーがIllustratorでカンプを作っても、結局WEB担当者が見た目を似せて作り直したりしていました。せいぜい画像パーツとして切り出す程度。
Flash Catalyst を使うと、IllustratorやPhotoshopのファイルで作り込んだパーツを、そのままFlexのフォームやボタンに変換できる。Flexで作ったWebページや、Airアプリの見た目を、プログラマに頼らずデザイナーが「動き」の部分まで作れるようになるわけです。

今回の轟さんのプレゼンは、Flexアプリケーションを、全くプログラムを書かずに最後まで作る、というコンセプトでした。デザイナーが作ったIllustratorファイルの、普通のパスの四角形で作った部分を選択して右クリックでテキスト入力フォームに変換したり、モーションを追加したりするのを見て、おお、ここまで出来るのかと感嘆。
まあ操作で覚えることは沢山あるにしても、少なくともプログラムは一切書かないし、少し努力すればたいていのデザイナーなら使えるレベルだと思います。

デザイナーが作成したビューをFlexプログラマに渡して、データを読み書きできるようにします。それをやるのが新しい Flash Builder。こちらもデータをドラッグ&ドロップで読み来んでActionScriptのコードを自動生成したりと、面白いデモがてんこもりでした。
でもやっぱり印象的だったのは Catalyst。紙媒体中心の仕事からWEBへの参入は結構壁が厚いと思いますが、Flex、Airのビューという選択肢がひとつ増えた感じ。
どちらにしろ紙媒体の仕事はどんどん減ってるわけだし…

自分はデザインはだめだし、組版方面の話ではないけれど、なんだか最近暗い話ばかりの業界でも面白そうな方向に行けばまだまだ面白い仕事はあるんだ、ということを実感させてくれるようなプレゼンでした。

ps. 他の講演も、会場の雰囲気も活気があって面白い話ばかりでした。
FxUG の皆さんありがとうございました。

2009年8月14日金曜日

perlでJSONを使う

PerlでJSONを作るには、JSONモジュールを使う。
WINDOWSで最新のActivePerlの場合は、JSONモジュールは最初から入っていた。
「Perl Package Manager」から確認できる。


Macの場合は、CPANからインストールする必要がある。
先にCPANのインストール。
参考にしたサイト:
CPAN経由でLinuxにモジュールを組み込む
Heart Beat � Blog Archive � Mac OSXでPerlの環境を整える
MacでCPANを使ってPerlモジュールインストール - nmon
CPANを入れたら、コンソールから
$ sudo cpan
Password:
>install JSON
>exit

これでOK。

使うには、use JSON; を指定して、ハッシュのリファレンスを渡してやる。
#test2.pl
use strict;
use warnings;
use utf8;
use Encode;
use JSON;
binmode STDIN, ':encoding(utf8)';
binmode STDOUT, ':encoding(utf8)';
binmode STDERR, ':encoding(utf8)';

my %hash = (
'チョウ' => {
'アゲハチョウ'=>'Papilio xuthus',
'モンシロチョウ'=>'Pieris rapae',
'ゴマダラチョウ'=>'Hestina persimilis japonica'
},
'コガネムシ' => {
'マメコガネ'=>'Popillia japonica',
'カナブン'=>'Rhomborrhina japonica',
'スジコガネ'=>'Anomala testaceipes'
},
'バッタ' => {
'トノサマバッタ'=>'Locusta migratoria',
'ショウリョウバッタ'=>'Acrida cinerea',
'コバネイナゴ'=>'Oxya yezoensis'
}
);

my $hash_ref = \%hash;
my $hash_json = JSON->new->encode($hash_ref);

print $hash_json;
print "\n";

これで、コンソールから
perl test2.pl
で、
{"チョウ":{"ゴマダラチョウ":"Hestina persimilis japonica","モンシロチョウ":"Pieris rapae","アゲハチョウ":"Papilio xuthus"},"バッタ":{"トノサマバッタ":"Locusta migratoria","コバネイナゴ":"Oxya yezoensis","ショウリョウバッタ":"Acrida cinerea"},"コガネムシ":{"スジコガネ":"Anomala testaceipes","マメコガネ":"Popillia japonica","カナブン":"Rhomborrhina japonica"}}
と表示される。OK。

参考:
[Perl] JSON モジュールの utf8 フラグ周りの仕様 tips 注意点 Kawa.netブログ(川崎有亮)/ウェブリブログ

2009年8月11日火曜日

とりあえず上手くいくperl5.8のエンコード指定テンプレ

正規表現がまともに動いて、文字化けもしない設定がわかってきたのでメモ。
下は簡単な検索置換スクリプトサンプルです。
#!/usr/bin/perl;

use strict;
use warnings;
use utf8; # ソースコード(このスクリプト自体)をUTF8で書くよという宣言
use Encode; # Encode.pm モジュールを使用する宣言

binmode STDIN, ':encoding(utf8)';
binmode STDOUT, ':encoding(utf8)';
binmode STDERR, ':encoding(utf8)';
# 標準出力(コンソールから打ち込む文字、または
# ブラウザから送られてくる文字)のエンコード指定。
# binmode はバイナリモード。
# Windowsのコマンドプロンプトに出すならば ':encoding(cp932)' を使う。

if(@ARGV < 2){
print "Usage: perl test.pl infile outfile\n";
exit;
};

my $INFILE=$ARGV[0];
my $OUTFILE=$ARGV[1];

open my $in, "<:encoding(cp932)", $INFILE or die "$!";
# 読み込み時にかならずファイルのエンコードを指定。
# これで読み込んだ文字に「UTF8フラグ」が立つ。
my @file = <$in>;
close($in);

foreach my $line (@file){
$line =~ s/わらつたよ/うたつたよ/g;
$line =~ s/かぷかぷ/ボェ〜〜〜〜〜と/g;
$line =~ s/クラムボン/ジャイアン/g;
};

open my $out, ">:encoding(utf8)", $OUTFILE or die "$!";
# 書き出す時もかならずエンコードを指定する。
# 「UTF8フラグ」もきちんと取って出力される。
print $out @file;
close($out);


これで、コンソールから
$ perl test.pl infile.txt outfile.txt

を実行すると、WINDOWS shift-jis で書かれた infile.txt
『クラムボンはわらつたよ。』
『クラムボンはかぷかぷわらつたよ。』
『クラムボンは跳てわらつたよ。』
『クラムボンはかぷかぷわらつたよ。』

を読み込んで、UTF8 の outfile.txt
『ジャイアンはうたつたよ。』
『ジャイアンはボェ〜〜〜〜〜とうたつたよ。』
『ジャイアンは跳てうたつたよ。』
『ジャイアンはボェ〜〜〜〜〜とうたつたよ。』
を吐き出します。

結局
  • ソースファイルはUTF8で書き、use utf8を指定
  • 標準出力にbinmodeでエンコードを指定
  • 読み込み、書き出し時にファイルのエンコードを指定

これを守って書けばたいていは上手くいきそうです。
自分用コピペ元として…。

参考:
404 Blog Not Found:perl - Encode 入門
Perl5.8 の UNICODE 対応
WindowsでPerlを使うもんじゃない
Perl: use utf8 と use encoding と \w - えむもじら

2009年8月5日水曜日

JavaScript内に複数行のテキストを書く

JavaScript内に複数行のテキストを書きたいときは、普通はこのように書くと思う。
var text="何が面白くて駝鳥を飼ふのだ。\n"
+ "動物園の四坪半のぬかるみの中では、\n"
+ "脚が大股過ぎるぢやないか。\n"
+ "頸があんまり長過ぎるぢやないか。\n"
+ "雪の降る国にこれでは羽がぼろぼろ過ぎるぢやないか。\n"
+ "腹がへるから堅パンも食ふだらうが、\n"
+ "駝鳥の眼は遠くばかり見てゐるぢやないか。\n"
+ "身も世もない様に燃えてゐるぢやないか。\n"
+ "瑠璃色の風が今にも吹いて来るのを待ちかまへてゐるぢやないか。\n"
+ "あの小さな素朴な頭が無辺大の夢で逆まいてゐるぢやないか。\n"
+ "これはもう駝鳥ぢやないぢやないか。\n"
+ "人間よ、\n"
+ "もう止せ、こんな事は。";

alert(text);
これだと+と\nと""だらけで、いかにも読みにくい。
実は、下のようにも書ける(のだと最近知った)。
var text="何が面白くて駝鳥を飼ふのだ。\
動物園の四坪半のぬかるみの中では、\
脚が大股過ぎるぢやないか。\
頸があんまり長過ぎるぢやないか。\
雪の降る国にこれでは羽がぼろぼろ過ぎるぢやないか。\
腹がへるから堅パンも食ふだらうが、\
駝鳥の眼は遠くばかり見てゐるぢやないか。\
身も世もない様に燃えてゐるぢやないか。\
瑠璃色の風が今にも吹いて来るのを待ちかまへてゐるぢやないか。\
あの小さな素朴な頭が無辺大の夢で逆まいてゐるぢやないか。\
これはもう駝鳥ぢやないぢやないか。\
人間よ、\
もう止せ、こんな事は。";

alert(text);

ちょっとだけ気分が良い。

2009年8月3日月曜日

InDesignでPDFを貼り込むときのオプション


InDesignにPDFを貼り込むスクリプトを作るとき、いつも忘れてしまうのでメモ。
app.pdfPlacePreferences.pdfCrop=PDFCrop.CROP_TRIM;

これはPDFを「ファイルメニュー→配置」で選んだ時に、「読み込みオプションを表示」で出る画面のトリミングオプション。
PDFはEPSとは違い、いろいろなサイズをあらかじめ持っている。
トリミングサイズ、裁ち落としサイズ、メディアサイズetc...

最初にこれを設定しておかないと、スクリプトを実行した時に思わぬ場所でトリミングされてしまう。

オプションの種類は以下のとおり。
  • PDFCrop.CROP_ART
  • PDFCrop.CROP_BLEED
  • PDFCrop.CROP_CONTENT
  • PDFCrop.CROP_MEDIA
  • PDFCrop.CROP_PDF
  • PDFCrop.CROP_TRIM