Redmine 1.2.1 on JRuby/Tomcat

少し前に VPS の Tomcat7 にデプロイしようとして失敗していました、Redmine 1.2.1 さんですが本日また再挑戦してみました。 前回の失敗は JRuby のバージョンを間違っていたという寒いオチなことが分かりましたので、今回は割とすんなりいきました。。 🙂

Rednime は Ruby 1.8 系で動作なのですね、見落としていました。

Redmineのインストール | Redmine.JP

RedmineはたいていのUNIX, Linux, Mac, Windowsシステム等、Rubyが利用可能なシステムで実行できます。

Redmineの各バージョンで必要となるRailsのバージョンは以下の通りです。

というわけで、対応する JRuby は 1.5 系。 前回は 1.6 系つまり Ruby 1.9 でやってしまっていたのでした。 とほほ。

ちなみに JRuby を使うとこういう時に便利で、たとえば OS の Ruby パッケージとか気にしなくても依存関係なくポータブルにインストールすることができます。

というわけで、環境は以下の感じです。

[root@capibara redmine-1.2.1]# java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
 
[root@capibara bin]# /opt/apache-tomcat-7.0/bin/version.sh 
Using CATALINA_BASE:   /opt/apache-tomcat-7.0
Using CATALINA_HOME:   /opt/apache-tomcat-7.0
Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/apache-tomcat-7.0/bin/bootstrap.jar:/opt/apache-tomcat-7.0/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.19
Server built:   Jul 13 2011 11:32:28
Server number:  7.0.19.0
OS Name:        Linux
OS Version:     2.6.18-274.3.1.el5
Architecture:   amd64
JVM Version:    1.6.0_26-b03
JVM Vendor:     Sun Microsystems Inc.
 
[root@capibara redmine-1.2.1]# jruby -v
jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2010-12-03 9cf97c3) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_26) [amd64-java]

適当に JRuby 1.5 を展開してパスを通して Redmine に必要な gem を追加。

# jruby -S gem install rack -v=1.1.1 --no-rdoc --no-ri
# jruby -S gem install rake -v=0.8.7 --no-rdoc --no-ri
# jruby -S gem install i18n -v=0.4.2 --no-rdoc --no-ri
# jruby -S gem install activerecord-jdbcpostgresql-adapter -v=0.9.7  
# jruby -S gem install warbler

ポスグレで動作させるために、activerecord-jdbcpostgresql-adapter を入れていますが、最新バージョンであるとプロジェクト操作時に以下のエラーで落ちてしまうため、0.9.7 に落としています。

   1: ActiveRecord::StatementInvalid (ActiveRecord::JDBCError: ERROR: column "issues.id" must appear in the GROUP BY clause or be used in an aggregate function: SELECT COUNT(*) AS count_all, tracker_id AS tracker_id FROM (SELECT DISTINCT "issues".id FROM "issues"  LEFT OUTER JOIN "projects" ON "projects".id = "issues".project_id  LEFT OUTER JOIN "issue_statuses" ON "issue_statuses".id = "issues".status_id  LEFT OUTER JOIN "trackers" ON "trackers".id = "issues".tracker_id WHERE (((projects.id = 1 OR (projects.lft > 1 AND projects.rgt < 2))) AND issue_statuses.is_closed='f') AND (projects.status=1 AND projects.id IN (SELECT em.project_id FROM enabled_modules em WHERE em.name='issue_tracking'))  GROUP BY tracker_id ) count_all_subquery):

Rails の O/R が生成している SQL が不正してしまっているように見えますね。 とりあえず、古いバージョンならうまく動くようです。

次にポスグレに DB を作成。

# su - postgres
-bash-3.2$ createuser -P redmine
Enter password for new role: 
Enter it again: 
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE
-bash-3.2$  createdb redmine -O redmine
CREATE DATABASE
-bash-3.2$ psql -l
        List of databases
   Name    |  Owner   | Encoding  
-----------+----------+-----------
 postgres  | postgres | SQL_ASCII
 redmine   | redmine  | SQL_ASCII
 template0 | postgres | SQL_ASCII
 template1 | postgres | SQL_ASCII
(4 rows)

Redmine の database.yml を作成。

[root@capibara redmine-1.2.1]# pwd
/root/install/redmine-1.2.1
[root@capibara redmine-1.2.1]# cat config/database.yml
# MySQL (default setup).
 
production:
  adapter: jdbcpostgresql 
  driver: org.postgresql.Driver
  database: redmine
  host: localhost
  username: redmine 
  password: 
  encoding: utf8

この状態で Rails の DB マイグレートを実行。

# jruby -S rake generate_session_store
# jruby -S rake db:migrate RAILS_ENV="production"

Tomcat にインストールしたいので warble。 まずは config 作成その後に war 作成。

# jruby -S warble config
# cat config/warble.rb 
# 下の方に追加
config.dirs = %w(app config lib log vendor tmp lang)
config.gems << "activerecord-jdbcpostgresql-adapter" 
config.gems << "i18n" 
config.gem_dependencies = true
config.webxml.rails.env = 'production'
config.gems["rack"] = "1.1.1" 
config.gems["rake"] = "0.8.7"
config.gems["activerecord-jdbcpostgresql-adapter"] = "0.9.7" 
# jruby -S warble

あとはできた war を Tomcat7 にデプロイしてあげれば動作します。

添付ファイル格納域が WEB-INF/files になってしまいますので、シンボリックリンクで消えないところに飛ばしてあげています。(これは config で設定できたような気もします)

といわけで、

redmine51

無事動きました。 🙂

さて全然関係ないですが、以上 VPS に SSH つないで操作していますが、実は今までさぼってターミナルマルチプレクサ系を入れていませんでした。 yum update 中に回線切れたら、がびーんということで、併せて本日インストール。

tmux です。 CentOS 5.7 にはパッケージないっぽかったので、ソースからインストール。 以下のライブラリに依存するようでしたので、devel を入れています。

# yum install libevent-devel ncurses-devel

あとは、普通に ./configure && make && make install でいけると思います。 😀

redmine50

らいらい。と。

ThinkPad Edge E525 キタ!

頼んでいました ThinkPad Edge E525 さんがやってまいりました。 といってもぼくのじゃなく実家用なのですがっ。 セットアップがてら撮影会でございます。 🙂

ThinkPad の Edge シリーズは実は初めてさわります。 15インチ系でテンキー付がありましたので、そちらを注文。 クアッドコア、メモリ4G で 5万なにがしっていうんですがら、いやになってしまいます(笑) 実際には Microsoft Office をつけて、クーポン割引適応で 6万5千円くらい。

手前が Edge さんで、奥が愛機の X61。 手触りしっとり、モニタの周りは丸みを帯びていてよい感じのデザインです。

edge01

HDD ランプとかってないんですね。 代わりに(?) ThinkPad の i の丸が光っておしゃれです。 ちなみに、キーボードを照らすランプはなし。

edge02

キーはアイソレーションタイプ。 まぁこの辺は、X61 のいわゆる ThinkPad キーボードにはかないませんが、ガタツキもなく違和感はありませんでした。

ただちょっと困ったのが、Fn の扱い。 マルチファンクション(?)側がデフォルトにあたっていて、普通のファンクションキーが Fn 押しになっています。

edge03

普通の人だとこっちのほうが便利なのかな。 なんとなく理由はわかりますが、自分で使うときにちょっと困る。。(笑) 調べると BIOS でデフォルト変更が可能でした。 また、Fn と CTRL の入れ替えもできるようです。

BIOS 起動は初期状態 Fn + F1。 BIOS 最適化かかっていて、あっちゅーまに起動するので心して押してください。 🙂

edge04

というわけで、お待ちかね!

AMD クアッドコア A6-3400M APU (1.4GHz/最大2.3GHz 4MBL2)(+ AMD Radeon™ HD 6520G グラフィックス) ということで、RADEON 機ですが、Ubuntu の対応はどうでしょうか。

いつも X61 と IdeaPad で起動しています USB 外付け HDDをさして 起動です。

edge05

無事 Ubuntu より、らい子ちゃんでてまいりました。 😀

無線 LAN は標準認識、あとは RADEON のプロプラエタリドライバ 入れたら Unity も起動しましたぞ。 一晩ほど外付け HDD の育った Ubuntu で遊んでいましたが、問題は見当たらずむしろ良好な感じでした。

そうなのです。

[tegaki]どのうちの機械より速い。。[/tegaki]

orz

Groovy + XLSBeans でエクセルから HTML に流し込み

Java のエクセルを読むライブラリに XLSBeans さんがありますが、こちらを Groovy と組み合わせて使うと非常に便利ですのでメモがてらご紹介です。 実は以前も書いていたりしたのですが改めて。

Groovy + XLSBeans でエクセルでできた設計書からソースコードを作成したり、なにかテキストファイルを作るとき等に簡易的な DB としてエクセルが利用できたりします。 ここでは後者、サンプル的にエクセルで書いた日記を HTML に出力するのをやってみます。 🙂

というわけで、まずは XLSBeans。

XLSBeans – Project Amateras

ExcelとJavaBeansをJava 5のアノテーションでマッピングするためのライブラリです。

Java のライブラリですので普通に Groovy から呼び出せます。 ここでつくるようなワンショットプログラムは Groovy と非常に相性が良いです。

まずは元データとなるエクセルファイルを作成します。 うちは Linux なので OOo にて。

xlsbeans01

こんな感じに元データをつくります。 できたらこれを bean にマッピングしてあげます。

@Sheet(name="Sheet1")
public class Nikki {
  @HorizontalRecords(tableLabel="日記", recordClass=NikkiLine.class)
  public List<NikkiLine> lines;
}
 
class NikkiLine {
    @Column(columnName="日付")
    public String date
    @Column(columnName="天気")
    public String tenki
    @Column(columnName="コンテンツ")
    public String content
}

アノテーションでシートの構造を指定してあげます。 注目は X/Y 系の位置情報がないところで、これが非常に便利です。 数えなくていいですし、列が増えたとしてもそのままで大丈夫。 🙂

で、bean の定義ができたらエクセルファイルをプログラムから読んであげます。 Groovy なら .groovy ファイルのトップレベルに上のソースと以下をかくだけ。

Nikki nikki = (new XLSBeans()).load(
    new FileInputStream("xls/日記.xls"), Nikki.class)

引き続きやりたいことをプログラムしていきます。 ここでのサンプルでは先ほどのエクセルから .html ファイルを生成していきます。 Groovy お得意の Builder をつかって HTML タグ文字列を意識せず生成できますぞ。

全体の .groovy はこんな感じになります。

import groovy.xml.MarkupBuilder
import net.java.amateras.xlsbeans.*;
import net.java.amateras.xlsbeans.annotation.*;
 
Nikki nikki = (new XLSBeans()).load(
    new FileInputStream("xls/日記.xls"), Nikki.class)
 
for(NikkiLine line : nikki.lines) {
    def date = new Date("$line.date")
    def writer =
        new File("html/${date.format('yyyyMMdd')}.html").newPrintWriter('UTF-8')
    def html = new MarkupBuilder(writer)
    def name = "${date.format('yyyy/MM/dd(E)')}の日記"
 
    html.html('lang':'ja') {
        head {
            meta('http-equiv': 'Content-Type', content: 'text/html; charset=UTF-8')
            title(name)
        }
        body {
            h1(name)
            p("今日は${line.tenki}")
            p("${line.content}")
        }
    }
 
    writer.close()
}
 
@Sheet(name="Sheet1")
public class Nikki {
  @HorizontalRecords(tableLabel="日記", recordClass=NikkiLine.class)
  public List<NikkiLine> lines;
}
 
class NikkiLine {
    @Column(columnName="日付")
    public String date
    @Column(columnName="天気")
    public String tenki
    @Column(columnName="コンテンツ")
    public String content
}

日付のフォーマットやマークアップビルダー、ファイル処理など Groovy パワーをいただきつつ、ちょいちょい 10 分でかけますね。 たぶん VBA でやったらいらっとする類のプログラムです(笑)

[tegaki]できたっ[/tegaki]

xlsbeans02

先ほどのエクセルからこんな感じの(複数の) HTML が生成されます。

<html lang='ja'>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
    <title>2011/08/01(月)の日記</title>
  </head>
  <body>
    <h1>2011/08/01(月)の日記</h1>
    <p>今日は晴れ</p>
    <p>今日は何事もなかった。</p>
  </body>
</html>

Groovy からお手軽にエクセル読めてそれをもとに処理ができるのはかなり適応範囲が広いと思います。 最近もかなり助けられました。。ありがとうございますっ 🙂

てなわけで、Keep on groovy – ing !