Aug 28 2010

Redmine を Tomcat6 にデプロイ

先日インストールしましたプロジェクト管理ツールの Redmine ですが、1.0.1 として 1系の正式版がでました!

というわけで、先日は mod_rails で動作させていましたが、せっかくなので今度は JRuby を使って Tomcat6 上にデプロイしてみたいと思います。

なにか利点があるかって話ですが、1パッケージにして JavaVM で動作させておけば、OS にのっている Ruby 実行環境に依存しなくて済むのがいいところ。 gem のバージョン依存とか考えなくていいし、Servlet の実行環境さえあればどこにでも乗せられるのでなかなか便利かもしれません。

とりあえず、.war 玉をつくる作業した環境は以下の通りです。

[hiromasa@localhost ~]$ java -version
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) Server VM (build 17.0-b16, mixed mode)
[hiromasa@localhost ~]$ jruby -v
jruby 1.5.2 (ruby 1.8.7 patchlevel 249) (2010-08-20 1c5e29d) (Java HotSpot(TM) Client VM 1.6.0_21) [i386-java]
[hiromasa@localhost ~]$ sudo /opt/tomcat6/bin/version.sh 
[sudo] password for hiromasa: 
Using CATALINA_BASE:   /opt/tomcat6
Using CATALINA_HOME:   /opt/tomcat6
Using CATALINA_TMPDIR: /opt/tomcat6/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/tomcat6/bin/bootstrap.jar
Server version: Apache Tomcat/6.0.29
Server built:   July 19 2010 1458
Server number:  6.0.0.29
OS Name:        Linux
OS Version:     2.6.18-194.11.1.el5
Architecture:   i386
JVM Version:    1.6.0_21-b06
JVM Vendor:     Sun Microsystems Inc.

まずは、JRuby のインストールから。

$ sudo wget http://jruby.org.s3.amazonaws.com/downloads/1.5.2/jruby-bin-1.5.2.tar.gz
$ sudo tar zxvf jruby-bin-1.5.2.tar.g
$ cat /etc/profile
export JRUBY_HOME=/opt/jruby-1.5.2
export PATH=$PATH:$JRUBY_HOME/bin

でもって、必要な gems を入れていきます。 ぼくは PostgreSQL で動作させているため、jdbc はポスグレのになります。

$ sudo jruby -S gem install rail
$ sudo jruby -S gem install activerecord-jdbcpostgresql-adapter
$ sudo jruby -S gem install warbler
$ sudo jruby -S gem install rack --version '~> 1.0.1

warbler というのが、Rails のアプリを .war 玉にしてくれるありがたいものです。 あと、rack が 1.0.1 じゃないと後で Redmine を動かしたときに Exception するので入れておきます。

でもって、Redmine をダウンロードしてきて、普通に config を設定していきます。 config/database.xml については以下のように。

[hiromasa@localhost redmine-1.0.1]$ cat config/database.yml
# MySQL (default setup).
 
production:
  adapter: jdbcpostgresql
  driver: org.postgresql.Driver
  database: [dbname]
  host: localhost
  username: [username]
  password: [password]
  encoding: utf8
  scheme_search_path: public

以下、Redmine のファイルを置いた直下のディレクトリにて。

これで DB のマイグレーションができるハズです。(ここでは .war をつくるのと同じ環境に入れてます)

$ sudo jruby -S rake db:migrate RAILS_ENV="production"

でもって、いよいよ warbler で .war をつくります。 まずは config をつくってもらいます。

$ sudo jruby -S warble config

ほいでもって、できた config を編集。

config/warble.rb

config.dirs = %w(app config lib log vendor tmp lang)
config.gems << "activerecord-jdbcpostgresql-adapter"
config.gem_dependencies = true
config.webxml.rails.env = 'production'
config.gems["rack"] = "1.0.1"

最後の rack のバージョン指定をしないと依存関係でおちるようです。(新しい方が使われてしまう)

できたら、いよいよ。

   1: $ sudo jruby -S warble

 

[root@localhost redmine-1.0.1]# ls -laF redmine-1.0.1.war 
-rw-rw-rw- 1 root root 17230199  8月 28 16:01 redmine-1.0.1.war

 

キター!

こころを込めて配置します。 ここでは、war つくった環境と同じなのでそのまま…

$ sudo /etc/init.d/tomcat6 stop
$ sudo cp redmine-1.0.1.war /opt/tomcat6/webapps/redmine.war
$ sudo /etc/init.d/tomcat6 start

無事デプロイ成功。 起動しました。 :)

redmine20

でもって、添付ファイルについてが気になって調べてみたのですが、どうやら WEB-INF/files に置かれる模様。 こんなところに置いてたらちょっとしたことで消えちゃういますのでシンボリックリンクで対応。

$ sudo ln -s /home/apache/redmine/files/ files

デプロイするたびにですが、しょうがないですね。 設定とか実はあるのかもしれませんがとりあえず。 あとは必要なら mod_ajp でつなぐなど。

というわけで、できあがった redmine.jar と Tomcat さえあればどこでも動くようになりました。 とりあえず事務所に持って行きます。。(笑)

DB マイグレーションは、 .war 作成でつかった JRuby 自体もただコピーするだけで他に持って行けると思うので、それでマイグレーション動かするのが良さそうですね。

エクスポートインポートでいければ Stax Networks とかにもデプロイできるかもしれません。(ただしファイルがかけないため、添付ファイルはだめだと思われる)

さて気になる .war ファイルですがほどいてみると以下のようになっていました。

redmine21

画像が小さくて見にくいですが、WEB-INF/gems/gems に依存する gems が格納されるようです。 あとは、ひとつの filter から jruby を起動して .rb を動的コンパイルしつつ動作という感じでしょうか。

動きはきびきびして、いい感じです。 先ほど入れて一通り動作見たばかりなので、もうちょっと動作させてみたいと思います。

以上、デプロイ田中でした。 ざっ。

Aug 21 2010

Subversion サーバ を CentOS 5.5 で。

Subversion サーバは昔も家にたてていたのですが、ローカルサーバを Atom 機にしてからまだインストールしていなかったので CentOS 5.5 上に改めて構築してみました。

すぐたつと思ったら、いろいろ罠があってはまったのでメモ代わりの投稿です。 結論から言うと思った通りにたてることができませんでした。。orz

とりあえず、CentOS 5.5 に subvesion と Apache + mod_dav_svn をインストール。 mod_dav_svn は新しいものを使いたかったので、rpmforge から 1.6 系をもってきています。

[root@localhost conf.d]# rpm -q httpd
httpd-2.2.3-43.el5.centos
[root@localhost conf.d]# rpm -q mod_dav_svn
mod_dav_svn-1.6.12-0.1.el5.rf

でもって、/etc/http/conf.d/subvesion.conf を以下のようにしました。 全権限を BASIC 認証にしたのと、DocumentRoot が Apache とかぶると問題がでるようなので、新しいポートで mod_dav をたてています。

<VirtualHost *:8082>
   <Location />
      DAV svn
      SVNParentPath /home/apache/svn
      SVNListParentPath on
      DavDepthInfinity on
      Order deny,allow
      Deny from all
      Allow from 127.0.0.1
      Allow from 192.168.0.0/24
      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile /home/apache/passwd/.htpasswd 
      Require valid-user
   </Location>
</VirtualHost>

DocumentRoot かぶりの問題は、mod_dav_svn の FAQ に記載がありました。

Webブラウザからリポジトリを見られるようにしているんだけど、’svn checkout’ が、「301 Moved Permanently」というエラーになる。何が悪いの?

解決策としては、リポジトリの<Location>を、通常の Web 共有として既に公開されている領域とオーバーラップしないようにするか、もしくはその中へ収めるべきだ。

ここがまず一発目にはまったポイントでした。。

さてディレクティブに SVNParentPath というのがありますが、これが親ディレクトリから subversion を使う設定です。 要はプロジェクトの作成の権限をユーザがもてることになります。

てなわけで、Eclipse の Subclipse (SVNKit) からプロジェクトの共有を発行すると…。

svn: can not read HTTP status line
 PROPFIND request failed on '/'

エラー。。 なじぇ。。

http status line が読めないということで、まず SVNKit のソースを疑ったのが間違いの始まり。。 org.tmatesoft.svn.core.internal.io.dav.http の自前パーサでやっているようだったので、バグっているのかと。。

で、いろいろいじっていると、なんと本気で PROPFIND メソッドで status line が返ってきていないことが発覚。。

hiromasa@hiromasa-cube:~$ telnet 192.168.0.100 8082
Trying 192.168.0.100...
Connected to 192.168.0.100.
Escape character is '^]'.
PROPFIND / HTTP/1.1
Host: aaa
Authorization: Basic fjwi094j403fj49fj949
 
Connection closed by foreign host.

いきなりぶったぎられています。。 おかしいなぁということで、SVNParentPath の下に svnadmin create test とかして svn リポジトリをつくってそこを対象に同じ事をしてみると…

hiromasa@hiromasa-cube:~$ telnet 192.168.0.100 8082
Trying 192.168.0.100...
Connected to 192.168.0.100.
Escape character is '^]'.
PROPFIND /test HTTP/1.1
Host: aaa
Authorization: Basic fjwi094j403fj49fj949
 
HTTP/1.1 207 Multi-Status
Date: Sat, 21 Aug 2010 01:51:23 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 2306
Connection: close
Content-Type: text/xml; charset="utf-8"
 
<?xml version="1.0" encoding="utf-8"?>
(以下略)

ちゃんと返ってくる~。 なじぇ~。 権限?ということで OPTIONS を発行してみると、、

hiromasa@hiromasa-cube:~$ telnet 192.168.0.100 8082
Trying 192.168.0.100...
Connected to 192.168.0.100.
Escape character is '^]'.
OPTIONS / HTTP/1.1
Host: aaa
Authorization: Basic fjwi094j403fj49fj949
 
HTTP/1.1 200 OK
Date: Sat, 21 Aug 2010 01:43:25 GMT
Server: Apache/2.2.3 (CentOS)
DAV: 1,2
DAV: version-control,checkout,working-resource
DAV: merge,baseline,activity,version-controlled-collection
DAV: http://subversion.tigris.org/xmlns/dav/svn/depth
DAV: http://subversion.tigris.org/xmlns/dav/svn/log-revprops
DAV: http://subversion.tigris.org/xmlns/dav/svn/partial-replay
DAV: http://subversion.tigris.org/xmlns/dav/svn/mergeinfo
DAV: <http://apache.org/dav/propset/fs/1>
MS-Author-Via: DAV
Allow: OPTIONS,GET,HEAD,POST,DELETE,TRACE,PROPFIND,PROPPATCH,COPY,MOVE,LOCK,UNLOCK
Content-Length: 0
Connection: close
Content-Type: httpd/unix-directory
 
Connection closed by foreign host.

ちゃんと Allow されているっぽい。。 なぞぞーん。。

で、ふと Apache の error_log を PROPFIND したタイミングでみてみると、、

[Sat Aug 21 11:53:30 2010] [notice] child pid 3497 exit signal Segmentation fault (11)

 

きゅるきゅるるるるる…、ぼぼん!

セグってるし。。 どうりですぐ切断されるはずです。。

てなわけで Apache が悪いのか mod_dav_svn が悪いのか、組み合わせが悪いのかちょっと分かりませんが、これ以上はぼくの手におえなそうです。 まぁアプリ的な設定が悪いわけではなさそうなのが収穫。

とりあえず SVNParent に直アクセスするのはあきらめて、プロジェクトできるたびに svnadmin create する運用にしたいとおもいます。 Eclipse にリポジトリいっぱい登録しなきゃいけないのがいたいですが、しょうがない。。

無事 Eclipse や TortoiseSVN からもみることができるようになりました。

snv01

ほいでもって、Redmine からも接続。 :)

svn02

Eclipse の mylyn から Redmine につなげば、チケットとくくりつくようなことも可能なはずです。 もうちょっとやってみるデス。

Aug 1 2010

Fastladder を mod_rails にインストール

昨日 Redmine を入れるために Ruby / Ruby on Rails の環境を、Cent OS 5.5 のローカルサーバにつくりました。

というわけで、今日はさらにそこに Fastladder Open Source を入れてみます。 なかなか手ごわかったですが、なんとか動いたようです。 :)

Fastladder はサーバインストール型の RSS リーダです。

Fastladder Open Source / Free Download

オープンソース版「Fastladder」は、サーバインストール型のRSSリーダーです。法人で管理しているサーバや、個人でお持ちのPCなどにインストールして使用できますので、イントラのRSSも読むことができます。

以前から Gregarius をインストールして使っていたのですが、ちょっと遅い、、ということで Fastladder。 こちらも前からやってみたかったのですが、 Rails の環境が用意できなかったので断念していました。

とりあえず動いた! の図。 :)

fastladder01

まぁ ASP 版とほとんどいっしょなので ASP つかえって話ですが、やっぱりデータがこちらのおなかにあるのは、いろいろ使い勝手がいいのでローカルサーバで動かすことにしています。

さて、CentOS 5.5 へのインストールですが、Ruby とかライブラリとかの関係でなかなか動かすのが大変でした。。 覚えている限りでひっかかったところを、書いていきます。

とりあえず、作業した環境

[root@localhost ~]# cat /etc/httpd/conf.d/passenger.conf 
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.15
PassengerRuby /usr/bin/ruby
 
[root@localhost ~]# ruby -v
ruby 1.8.5 (2006-08-25) [i386-linux]
[root@localhost ~]# gem -v
1.3.1

まず必要となる Freeimage ライブラリは、コンパイルしていれました。 make; make install して ldconfig すれば入ると思います。

rfeedfinder については、hpricot が依存するのですが、0.8 系だとエラーになるようなので、0.7 系を入れています。

gem install hpricot --version 0.7

これで、Fastladder の INSTALL.txt はクリアできると思います。

で次に、Rails アプリケーションの設定。 せっかく、昨日 Postgres 入れたのでこちらを使うようにしました。

[hiromasa@localhost config]$ cat /opt/fastladder/config/database.yml
production:
  adapter: postgresql
  database: fastladderdb
  username: fastladder
  password: パスワード
  host: localhost
  encoding: utf8

でもって、ポスグレに DB とユーザ追加。

   1: sudo -u postgres createuser -U postgres -dEeP
   2: sudo -u postgres createdb -e -U postgres -O fastladder fastladderdb "For Fastladder"

httpd.conf に Rails アプリを追加。

<VirtualHost *:80>
   ServerName localhost.localdomain
   DocumentRoot /var/www/html
   RailsBaseURI /redmine
   <Directory /var/www/html>
      AllowOverride all
      Options -MultiViews
   </Directory>
</VirtualHost>
 
<VirtualHost *:8081>
   ServerName localhost.localdomain
   DocumentRoot /opt/fastladder/public 
   <Directory /opt/fastladder/public>
      AllowOverride all
      Options -MultiViews
   </Directory>
</VirtualHost>

上が Redmine 用で下の 8081 が Fastladder です。 *:80 のほうに RailsBaseURI に /fastladder を追加でいけるはずだったのですが、Fastladder にアクセスするとコンテキストパス(?) が無視されて / にすっとばされてしまうので、しょうがなくポートを分けました。

config.action_controller.relative_url_root の設定を config/environment.rb にしてみたりもしたのですが、だめそう。。 Fastladder がパスを固定でもっちゃってるのかもしれません。(フレームワーク使っているのにあるかなぁという疑問はありつつ)

で、これでアクセスで動くと思いきやまだまだ苦難が。(笑)

log/production.log を tail して動かしていくといいかもです。

まず、Rails のバージョンが新しいせいなのか、フレームワークのファイル名の命名規則が変わっていてコントローラでおちちゃいます。

app/controllers/application.rb をapp/controllers/application_controller.rb にリネームする方向で。

次に、rfeedfinder.rb が引数がおかしいだかで落ちますので、/usr/lib/ruby/gems/1.8/gems/rfeedfinder-0.9.13/lib/rfeedfinder.rb の、

#data = Rfeedfinder.open_doc(fulluri, options)
data = Rfeedfinder.open_doc(fulluri)

2引数になっている、open_doc を 1引数にパッチ。

それから、lib/string_utils.rb で strip_tags() が no such method とかいわれて落ちるので、

class String
  # for strip_tags
  #include ActionView::Helpers::TextHelper
  include ActionView::Helpers::SanitizeHelper
  extend ActionView::Helpers::SanitizeHelper::ClassMethods

extend の行を追加します。

たしか以上で動いたはずです。 いろいろやっていたらログとばしてしまいました。。

あ、あと RSS の URL のバリデータがきつかったのでとばしました。 なんか Google のバリデータだったような気がします。 どこだったか失念(笑) 必要ならログにでますので、コメントアウトすればいいと思います。

RoR はおろか Ruby もよくわかっていないでやっていますので、変なことしていたらすいません。

あとは、クローラを init.d で自動起動するようにすればいいと思います。 動いてしまえば順調。 いい感じですぞ。

最近、WordPress 関係でお会いする方が増えて、RSS の整理が追い付いてなかったのですが、これでうまくできそうです。 懸案ひとつ解決で、すっきりです。 :)

Aug 1 2010

プロジェクト管理アプリケーション Redmine

気になっていました、プロジェクト管理アプリケーション Redmine を入れてみました。

実は shiroica さんが以前から使われているようだったので、それを見てすぐに試してみたかったのですが Ruby & RoR が使える環境がぱっと用意できなくて断念していました。 先日、うちのローカルサーバを Atom 機に変えた際に、CentOS 5.5 になりましたので晴れて こちらで試してみました。 :)

Redmine – Wikipedia

RedmineRuby on Railsで開発されている、Webベースのプロジェクト管理ソフトウェアである。 また、RedmineはオープンソースGPLで配布されており、その設計はTracに影響を受けている。

Redmineはプログラミング言語Ruby本体の開発を始めとして、さまざまな企業やプロジェクトでの導入が報告されている。[1]

WordPress をやられているかたは、WordPress Trac を想像してもらえれば、どんなもんか分かりやすいですね。 あちらは、Trac というのを使っています。

てなわけで、とりあえず CentOS 5.5 への Redmine インストールから。 ほぼこちらのサイトを参考にしてやらせていただきました。 ありがとうございます!。

サクっとly.com – サクッとCentOS 5.4にRedmine + Passenger環境をインストール

約1年前にサクッとCentOS 5.3にRedmine + Passenger環境をインストールを書きましたが、ちょうどインストールし直す機会があったので若干の変更をしながら書き直してみました。

解説では Ruby と RubyGems をソースから入れていますが、ぼくは rpm を使って入れてみました。 使った Redmine は 1.0.0 の RC です。

rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/i386/epel-release-5-3.noarch.rpm
yum install -y ruby ruby-irb ruby-libs ruby-rdoc ruby-ri
yum install -y rubygems --enablerepo=epel

あと、DB を作成する部分で rack のバージョンが異なるというエラー (1.1.0 と 1.0.1 で 1.0.1 を要求された)がでたような気がするので、1.0.1 を入れています。

sudo gem install rack --version '~> 1.0.1'

ぐらいです。 gem で時間が結構かかりましたが、あとは詳しい解説のおかげで滞りなくインストールすることができました。 :)

さて、Redmine は Web ベースのアプリケーションですが、Redmine-Mylyn Connector というのをいれると Eclipse から GUI 接続できるようになります。 こちらにも挑戦。

SourceForge.net: Installation – redmin-mylyncon

Use the update-site (currently Eclipse 3.4 and higher only) http://redmin-mylyncon.sourceforge.net/update-site/nightly/

クライアント(Eclipse)側と、サーバ(Redmine)側の両方にプラグインを入れます。 でもって、Redmine をリスタートすれば準備完了です。

まずは Web インターフェース。 すっきりしていてなかなかいい感じです。

redmine01

チケットをカレンダーにだしてくれるのが、良いですね。

でもって、Eclipse の Mylyn 経由からの接続の図。

redmine02 

redmine04

こんな感じで Eclipse GUI から表示できます。 ただっ、

なぜか更新できない~

ということで、どーもサーバに対してチケットの新規登録・更新がききません。。 新規登録では unknow error と画面にでています。 細かいログがどこかにでているといいのですが。 ちょっと継続調査です。

ただ、読み込みについてはうまく動きますのでちゃんと Eclipse に変更通知が来ます。 :)

redmine03

かわゆすですね。

Eclipse の GUI からも上のボタンをぽちっとおすと、インターナルブラウザで Web の画面見れますので更新はこちらからできます。 まぁコンテキスト付与とかできないので、SVN 連携とかちょっと手作業になってしまいますが、まぁまぁとりあえずタスクの通知と閲覧ができるだけでも十分です。

お仕事でもこの手のたまに使いますが、メーカ製なので製品名はあげないでおきますが、あれとかあれとかはなかなか使いづらい。。 エクセルのほうが良かったくらいにして(笑)

というわけで、次回自分たちメインでやるプロジェクトで使ってみようか、というのもあって Redmine をお試し。 ファイル管理とか Wiki も使え、使いようによってライトにもヘビーにも転べそうですので、良いと感じました。

ぼくらは、開発中は1日中 Eclipse 起動しっぱなしなので、通知が行ったり画面一覧したりできるのも便利です。 この手のは手軽に活用し始めてなんぼだと思うのです。

とりあえず、検証に家で少し動かしてみたいと思います。 :)

Jul 25 2010

最近の WordPress 的な写真

先月の OSC 北海道からの WordPress 的な写真達です。 ここ1年、2年、WordPress のオフライン活動も活発になってきていてみなさん楽しそうです。 :)

というわけで、OSC 北海道にからめて北海道にきてくれた、てぃあーこさんおでこさんとジンギスカン写真からいってみよう!。

2010/6/23。

wordpress00-01 

2次会でジンギスカンに(笑) てぃあこさん、食べれないかと心配でしたが、大丈夫だったようで良かったです。 :-)

次は OSC 北海道、前夜祭。

(ここからおでこさんの、フリッカー写真をお借りしています)

かんぱーい。(^ ^

wordpress01-01

活ほっけって、ぼくもはじめて。

wordpress01-02

おいしかったす。 :)

OSC 北海道、当日。

ブースにて。

wordpress01-03

セミナ中。 姿勢悪いな、おれ。(笑)

wordpress01-04

(ここまでおでさんのフリッカーより。 さんきゅ~!)

後日。

前夜祭、OSC に来てくださいました、りぃさんとそのお仲間に混ぜていただいて、すすきの的な何か。

wordpress02-01

wordpress02-02

飲むときに薄暗いのは好きですなぁ。(←どういうオチだ!

Jul 25 2010

Microsoft Office 2010 を買いました。

もう1ヶ月くらい前になるのですが、Microsoft Office 2010 を購入しました。 実は、我が家にあった Office は 2000。。 正確な発売日は分かりませんが、バージョンナンバーにして実に 10年ぶりのバージョンアップとなりました。

きっかけは、WordCamp Yokohama でおでさんがつくってくれたパワーポイントの修正をするときに OOo だとやっぱりうまくなかったこと(笑) あと、OSC もあったので購入しました。

office201002 

Access があるとたまに便利なので、Professional 版に。 アップグレード版で 3万なにがしでした。(Office 2000 が プレミアム版だったので下げるともったいない感もあり)

普段、事務所では 2003 が多いので噂のリボンインターフェースは初めて使います。 :)

office201001

ALT からのショートカットが分かりやすくでてくれるので、複数ストロークショートカットがやりやすくなったかもですね。 最近はワイドスクリーンが多いので、リボンも横に配置できればいいのになぁと思いましたが、よく言われるほど悪いとは思いませんでした。

まぁぼくの場合、エクセルとかは前からメニューとかアイコンとか使わないで、ショートカットキーでしか操作していないからかもですが…(笑) あと描画系のアプリで、Visual Studio で実装されている、図形の配置が使えるようになったのは便利ですね。

てなわけで、Windows 7 + Office 2010 とようやくモダンな環境に。 あとは、Visual Studio 2010 が入ればいいのですが、こちらはいまのところ Express 版でがまんの子しています。

Jul 25 2010

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 はまだ様子見という感じです。 引き続きウォッチしていこうと思います。 :)

Jun 27 2010

オープンソースカンファレンス 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 グッズを東京から輸入してくださいました。 :D

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

Jun 20 2010

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回目…

Jun 20 2010

WordPress 3.0 Thelonious リリースとカスタムメニュー

幾度かの RC を経まして WordPress 3.0 Thelonious がリリースされました!

ja(日本語)版リリースに先駆けまして、ここ hiromasa.another も 3.0 にアップグレード。 実は少し前から RC 版で動かしておりましたので、トラブルなく動作しました。

3.0 はマルチブログ、カスタム投稿、カスタムメニューの機能追加、カスタム分類強化などなどデータ構造の変更を含む大きなリリースとなっています。

その他の大量の変更内容も含めまして、codex をみると非常によく分かります。 :)

Version 3.0 – WordPress Codex 日本語版

2010年6月17日(木)(米国時間)、WordPress バージョン 3.0 がリリースされました原文)。このバージョンのバグフィクスについての情報は、Trac のクローズチケット一覧をご覧ください。

カスタム投稿 + カスタム分類は強力な変更ですが、ここのような既に動作しているブログでは品行方正(?!)が必要な部分もありいきなりの導入はちょっと難しい(笑)ですので、まずはカスタムメニューを導入してみました。

WordPress を CMS 的に使う場合、コンテンツがスタックする部分にカテゴリやタグを、変更が累積しない場合にはページを使うというのがあちこちでみる常套手段となっていますが、その統一ナビゲーションメニューをつくるのって結構大変です。

wp_page_manu だと基本ページの一覧しかだせないので、カテゴリリンクとまぜて ol li を構築するのがやっかいです。 あとページだけでも順番そろえたりとか結構面倒、てなわけで登場したのが wp_nav_menu。

管理画面の UI 操作で、カテゴリ、タグ、カスタム投稿、その他手動設定のリンクや個別の投稿を選択してメニュー化できます。

nav02

階層構造ももつことができて、対応する CSS を書いてあげればドロップダウンメニューとかもできるようになっています。

使い方は簡単で、今テーマで wp_page_menu とかしているところを、wp_nav_manu テンプレートタグに置き換えればとりあえず、それとなく動くようになっているようです。 本来的にはテーマの functions.php で register_nav_menu してあげてからにすると、複数のメニューを任意の位置にだすことができます。

nav01 

たとえば、ここのサイトで使っているテーマフレームワーク Thematic の場合は、functions.php に以下を追加すると既存のヘッダページメニューをカスタムメニューに置き換えられます。(そのうち Thematic 本家も対応すると思いますのでこれはサンプルってことで :)

/******************************************************************************
 * メニュー変更
 *****************************************************************************/
function refrect_setup() {
    // thematic 標準ナビゲーション(wp_page_nav)削除
    remove_filter('thematic_header','thematic_access', 9);
    // テーマにナビゲーション登録
    register_nav_menu('primary', 'ヘッダのところのナビゲーション');
    // thematic ナビゲーション変更
    add_action('thematic_header','add_custom_menu', 9);
}
 
function add_custom_menu() {
?>
    <div id="access">
    <div class="skip-link"><a href="#content" title="<?php _e('Skip navigation to the content', 'thematic'); ?>"><?php _e('Skip to content', 'thematic'); ?></a></div>
        <?php wp_nav_menu(array(
            'theme_location' => 'primary'
            , 'container_class' => 'menu'
            ,'menu_class' => 'sf-menu sf-js-enabled')); ?>
    </div><!-- #access -->
<?php
}
 
add_action('after_setup_theme', 'refrect_setup');

 

このソースは Thematic 特有のコードが入っていますが、基本はそれぞれのテーマの functions.php に

register_nav_menu('primary', 'ヘッダのところのナビゲーション');

 

この1行を追加しまして、テーマでカスタムメニューをだしたい部分に、

<?php wp_nav_menu(array('theme_location' => 'primary')); ?>

 

とかけば OK のハズです。 primary っていうのが id で任意の名前をつけて複数メニューがある場合はこれで識別します。 簡単あるね。

wp_nav_manu には引数で html の id や class を指定できますので、CSS にいい感じに合わせれば良いと思います。

テーマファイルもいじりたくないって場合は、3.0 からこのカスタムメニューを表示するウィジェットが用意されていますので、これをぺたっと張ればサイドバーとかにはすぐだせますね。 :)

nav03

ちなみに、このサイトの上のナビゲーションはカスタムメニュー化しています。 ページしか使っていなかったので、見た目「ホーム」が「Home」になっただけですが、順番を UI で変えられるのは便利です。

まずは、是非是非。 :)