メイン

技術メモ アーカイブ

2006年08月03日

mysqld の起動の仕方

/bin/sh ./bin/mysqld_safe --user=mysql --basedir=/usr/local/jiro/mysql --datadir=/usr/local/jiro/mysql/data --socket=/usr/local/jiro/mysql/data/mysql.sock &

/usr/local/jiro/mysql に mysql がインストールされているものとする。

初期化のときに、--datadir が同様にセットされていなければならない。

mysql (コマンド) を実行するときに、--socket=/usr/local/jiro/mysql/data/mysql.sock オプションが必要。

DataIntegrityViolationException

org.springframework.dao.DataIntegrityViolationException: Hibernate operation: could not insert: [jp.co.crm.orm.KVString]; SQL [insert into kvbase (parent, kvkey, ctime, value, VTYPE) values (?, ?, ?, ?, 'St')]; Data too long for column 'value' at row 1; nested exception is java.sql.SQLException: Data too long for column 'value' at row 1
Caused by: java.sql.SQLException: Data too long for column 'value' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2901)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1584)
	at com.mysql.jdbc.Connection.serverExecute(Connection.java:4742)
	at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1251)
	at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:993)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1930)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1855)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1693)
	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2050)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2515)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:47)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
	at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:623)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
	at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:620)
	at jp.co.crm.orm.FacadeHbImpl.save(FacadeHbImpl.java:37)
	at jp.co.crm.jiro.CustomerBeanTest.doTestAddCustomer(CustomerBeanTest.java:95)
	at jp.co.crm.jiro.CustomerBeanTest.testAll(CustomerBeanTest.java:80)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:154)
	at junit.framework.TestCase.runBare(TestCase.java:127)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at junit.framework.TestSuite.runTest(TestSuite.java:208)
	at junit.framework.TestSuite.run(TestSuite.java:203)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

【解決策】
単にテーブルが不整合なだけ。クエリーを実行してテーブルを正しく作成すると解決した。

2006年08月08日

class ファイルが期待している所にできない

Project の Properties を開き、Java Build Path を確認する。Source タブをクリックして、output folder の位置を確認。

ターゲットに指定されているフォルダがなかったりすると、全然コンパイルしてくれないらしい。

jsf - Property not found

14:55:40,734 ERROR org.apache.myfaces.shared_impl.renderkit.RendererUtils:256 - Property not found - called by component : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /faces/listtest2.jsp][Class: javax.faces.component.html.HtmlOutputText,Id: id0]}
javax.faces.el.PropertyNotFoundException: Bean: jp.co.crm.jiro.ElementsBean, property: getItems
	at org.apache.myfaces.el.PropertyResolverImpl.getPropertyDescriptor(PropertyResolverImpl.java:483)

getItems はメソッドの名前だから、こんな所に書いてはいけない。 jsf の中の getItems と書いてある箇所を items に直せば動く。

2006年08月16日

J2SE 5.0 Update 8

既に Update 7 がインストールされているので、 まず 7 をアンインストールしてから 8 をインストールする。 状況によっては、 7 を残したままで 8 を別の場所にインストールしても構わないが、 今回はそう大きな変更はなさそうなので、 7 は削除する。 なお、手順は Windows の場合。

Update 7 のアンインストール手順

コントロールパネルの「プログラムの追加と削除」で、 J2SE Runtime Environment 5.0 Update 7 と、 J2SE Development Kit 5.0 Update 7 を削除。 順序は多分どちらでもいいと思うが、今回は J2RE を先に削除した。 普段は JDK から削除している。

インストールの手順

Sun の J2SE のダウンロードサイト からダウンロードしておいた jdk-1_5_0_08-windows-i586-p.exe を実行する。

ライセンスの使用許諾契約の画面が出るので、 読んで同意してから 「同意します」のラジオボタンをonにして、 [次へ]をクリックする。

カスタムセットアップの画面になる。 インストール先をデフォルトは C:\Program Files\Java\jdk1.5.0_08\ になっているので、 D:\java\jdk1.5.0_08\ に変更する。 他はそのままにして、[次へ]を押すと、 いきなりインストールが始まる。 もう一回確認があると思っていたら不意打ちを食らうので注意。

途中で、 J2RE のカスタムセットアップウィザードのダイアログが表示される。 インストール先が C:\Program Files\Java\jre1.5.0_08\ になっているが、 これも D:\java\jre1.5.0_08\ に変更。 ブラウザの登録という画面が出るので適当に。 分からなかったら[次へ]を押してしまえばいい。

classpath の変更

ant 等で以前の classpath を直接指定している記述があれば、 新しいパスに変更する。

2006年08月21日

tomcat 落ちる?

tomcat 起動中にサーブレットに使っているクラスを変更しすぎたのが原因と思われる。 再現しない。

致命的: 以前のエラーのためにコンテキストの起動が失敗しました [/prototype]
12:25:27,031  INFO org.apache.catalina.core.ApplicationContext:646 - Closing Spring root WebApplicationContext
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d781572, pid=2856, tid=2764
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_08-b03 mixed mode)
# Problematic frame:
# V  [jvm.dll+0xc1572]
#
# An error report file with more information is saved as hs_err_pid2856.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp

Failed shutdown of Apache Portable Runtime

Eclipse から Tomcat を終了させたときに出るメッセージ。

Failed shutdown of Apache Portable Runtime

日本語訳: Apache Tomcat は正常に終了しました。

2006年08月22日

Apache MyFaces Tomahawk の TLD

tomahawk-1.1.3.jar の中に入っている。META-INF/tomahawk.tld を次のコマンドで取り出す。

jar xvf tomahawk-1.1.3.jar META-INF/tomahawk.tld

2006年08月24日

Eclipse/CVS サーバ上のファイルに無条件に置き換える


自分のローカルで作業していて、サーバー上のファイルが更新された場合に、
ローカルのファイルを無条件にサーバーのファイルに置き換える方法

------
該当ファイルを選択して右クリックで
「Replace With/latest from DEAD」メニューを実行

2006年08月25日

betwixtでinner-classを扱う

betwixtは、JavaのオブジェクトをXML形式で出力するのに使用します。何も指定しないと自動変換されますが、ファイルでルールを指定することもできます。例えばTargetBean.javaというクラスの変換ルールは、そのソースファイルのあるディレクトリにTargetBean.betwixtというファイルを作ることで定義します。
以下のような内部クラスがある場合、TargetBean$InnerClass.betwixtというファイルを作る必要があるので注意してください。解決に2日かかりました。
public class TargetBean {
private InnerClass innerBean;
public class InnerClass {
}
public TargetBean() {
innerBean = new InnerClass();
}
}

2006年08月30日

java.sql.SQLException: Unknown type '16 in column 7 of 17 in binary-encoded result set.

JDK5.0 + Spring Framework + Hibernate 3.0 で、 boolean をマップしたクラスを扱うときに例外が発生した。

12:20:05,468  WARN org.hibernate.util.JDBCExceptionReporter:71
 - SQL Error: 0, SQLState: S1000
12:20:05,468 ERROR org.hibernate.util.JDBCExceptionReporter:72
 - Unknown type '16 in column 7 of 17 in binary-encoded result set.
java.sql.SQLException: Unknown type '16 in column 7 of 17 in binary-encoded result set.
    at com.mysql.jdbc.MysqlIO.unpackNativeEncodedColumn(MysqlIO.java:4149)
    at com.mysql.jdbc.MysqlIO.unpackBinaryResultSetRow(MysqlIO.java:3672)
    at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1335)
    at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2253)
    at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:434)
    at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:1952)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1400)
    at com.mysql.jdbc.Connection.serverExecute(Connection.java:4793)
    at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1251)
    at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:993)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1657)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
        ...

詳しい発生条件は不明。 binary を扱うマッピングを除去したら動作するというのが謎だったが、 結果だけ書くと、MySQL のドライバを最新 (mysql-connector-java-5.0.3-bin.jar) に置き換えて解決した。 例外が発生したのは 3.2.0-alpha という怪しいバージョンだった。

2006年09月02日

Hibernate Tools で codegen 時に NoClassDefFoundError

ant codegen で Java のソースを生成しようとしたら、こうなった。

BUILD FAILED
java.lang.NoClassDefFoundError: org/hibernate/loader/custom/SQLQueryReturn
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1225)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
    ..
--- Nested Exception ---
java.lang.NoClassDefFoundError: org/hibernate/loader/custom/SQLQueryReturn
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2395)
        at java.lang.Class.privateGetPublicMethods(Class.java:2519)
        at java.lang.Class.getMethods(Class.java:1406)

Hibernate の core と Hibernatetools のバージョンのミスマッチが原因らしい。 つまり、Hibernate Tools を最新版 (3.2 beta 7, 2006-08-23) に置き換えたら解決した。 動作した Hibernate core のバージョンは 3.2 cr3 (2006-07-06) である。 ただし、現時点の core の最新版は 3.2 cr4 (2006-08-25) となっている。

Hibernate

2006年09月04日

Javaではフィールドはオーバーライドできない

PHPやJavaScriptは動的参照です。PHPではクラスを継承すると、新しい宣言で古い宣言が上書きされます。これは、メソッドもメンバ変数も同じです(JavaScriptにはクラス宣言はありませんが、似たようなことができます)。以下はPHPの例です。

class baseclass {
var $text = "baseclass";
function print() {
print $this->text;
}
}

class extendedclass extends baseclass {
var $text = "extendedclass";
}

$obj =& new extendedclass();
$obj->print();

extendedclassは、extendedclassでオーバーライドされたメンバ変数$textと、baseclassで宣言されたメソッドprint()を持ちます。このprint()が参照する$this->textは、extendedclassでオーバーライドされた"extendedclass"を指します。
しかし、Javaはメンバ変数をオーバーライドすることができません。このため、このプログラムと同じことをJavaでおこなうと、baseclassで宣言されたメソッドprint()は、常にbaseclassで宣言された(またはそのスーパークラスで宣言された)メンバ変数を参照します。
ちなみに、PHPでスーパークラスのメソッドを呼び出すには、parent::print()のようにします。::演算子は、左側にクラス名を書きますが、クラス名のかわりにparentを書くと親クラスを示します。

2006年09月07日

JSF の予約語

and, div, empty, eq, false, ge, gt, instanceof, le, lt, mod, ne, not, null, or, true

なにげに Managed Bean 側で isEmpty というのを作ってハマった。 isXmpty という謎のメソッドがあるのはそのためである。

2006年09月13日

Eclipse で compare with を実行すると文字化けする場合は

Window - preferences - でダイアログを開いて、General - Editors をクリックする。

Text file encoding を UTF-8 に指定する。

Eclipse: build path とか全部トビ

team update したら build path の中身が全部消滅していて、 ビルドも実行も何もできなくなっていた。 原因不明だが、 事前に branch とか見たのが影響するということはあるのか?

同じレポジトリから別プロジェクトにして全部取り直して、 修正が反映できなかったものをコピーして commint して一応解決。 tomcat の設定は、 server.xml を直接変更した。

project 全部取り直した後で必要な設定変更のメモ。

project の properties の設定は、 Java Compiler の Building で、 Enable project specific setting を on にして、 Output folder の Scrub output folders when cleaning projects の check を off にする。

Java Compiler は、 Compiler compliance level を 5.0 とする。

Enable PMD が off になっていたので on にする。 このとき、 Select rules for this projectで、 次の check を off にする。

LocalVariableCouldBeFinal
LogVariable
MethodArgumentCouldBeFiral
OnlyOneReturn

Eclipse で Javadoc 作成

Eclipse の Project - Generate Javadoc で、 Javadoc command のテキストボックスに、実行ファイルを指定する。 例えば、 D:\java\jdk1.5.0_08\bin\javadoc.exe

さらに、 Next>, Next> と押して、 Extra Javadoc Options に、次のオプションを追加。

-encoding UTF-8
-charset UTF-8

これを忘れると死ぬほど警告が出まくる。 他は触らずに enter。 こんな感じの警告が表示されたが、

Do you want to update the Javadoc location for 'hoge' with the chosen destination folder 'hogehoge..'

何となく怪しさ抜群だが Yes To Allを選択して続行すればok。

2006年09月19日

ant で build.xml を実行したときに javax.xml.parsers.FactoryConfigurationError

このような Error が出る。

javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found

ant の classpath に ant/lib が入っていないのが原因。 classpath をセットするところに、 例えば次のような定義を追加する。

        <fileset dir="/usr/local/jiro/apache-ant-1.6.5/lib">
          <include name="*.jar"/>
        </fileset>

テスト用のサイトのURLを絶対アドレスで書く理由

ローカルでサーバーを立ち上げてテストするときに、http://localhost:8080/hoge/… でも構わないのだが、http://127.0.0.1:8080/hoge/… と書いた方がいいかもしれない。

というのは、もし localhost:8080 というサーバーが起動していなかったら(という条件だと思うのだが)、ある種のブラウザというか firefox が気をきかせて、http://www.localhost.com というサイトを探しにいったりするから。127.0.0.1:8080 が見つからなくても、そのようなヘンなことにはならない。

2006年09月22日

Linux: bash script がエラー

bash スクリプトを実行するとこのようなエラーが出る。

: そのようなファイルやディレクトリはありませんomcat-5.5.17

見た感じの通り、表示がおかしい。これは改行ではなく CR で行先頭に戻って上書きしたときの現象である。つまり、スクリプトファイルの改行コードが LF ではなく CR+LF になっているため、期待通り動作してくれない。

改行コードを LF だけになるように編集すれば解決。

Linux + MySQL, 複数の mysqld をインストールする

MySQL のインストール。次のような前提。

・Fedora core 5 で動かす。

・MySQL 5.1.11-beta を使う。

・MySQL 4.x が既に動いているので、port=3307 にして同時に使えるようにする。

Linux (non RPM package) をダウンロードする。 既に動いているものが RPM なので、RPM 版を使うことができない、もしくは大変難しいと思われる。

展開して適当なディレクトリに配置。 今回は /usr/local/jiro/ に展開して、mysql-5.1.11-beta-linux-i686 というディレクトリに配置する。

cd /usr/local/jiro
ln -s my*686 mysql

とでもやって、symbolic link を作っておく。my*686 というのは bash が展開してくれるので mysql-5.1.11-beta-linux-i686 とタイプしたのと同じことになる。copy-paste してもいいのだが、ターミナルからコマンド打つのならこういう省略が便利。ただし、このパターンにマッチする他ファイルがないことが前提になる。

mysql の標準的なインストール手順は mysql のドキュメント通りなので省略するが、ちょっと注意が必要なのは、init の手順。

scripts/mysql_install_db --user=mysql

これだと既に動いている方の MySQL を使ってしまうので、次のようにする。これがログを間違って削除してしまったのでうろ覚えだが、間違っていたら後で訂正する。

scripts/mysql_install_db --defaults-file=/usr/local/jiro/my.cnf --port=3307 --user=mysql

/usr/local/jiro/my.cnf の内容は、こんな感じ。

[mysqld]
port=3307
datadir=/usr/local/jiro/mysql/data
socket=/usr/local/jiro/mysql/data/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

[mysql.server]
user=mysql
basedir=/usr/local/jiro/mysql

[mysqld_safe]
log-error=/var/log/jiro_mysqld.log
pid-file=/usr/local/jiro/mysql/data/mysqld.pid

データベースの初期化に成功していたら、 root のパスワードを設定して、 マニュアルに書いてある通りに chown、chgrp を実行する。 daemon は、次のコマンドで起動できる。

/bin/sh ./bin/mysqld_safe --defaults-file=/usr/local/jiro/mysql/my.cnf --port=3307 &

これは多分 root でないと実行できないので注意。

shutdown は、root になって(ならなくてもいい?)、 /usr/local/jiro/mysql に移動して、次のコマンドを実行。

./bin/mysqladmin --socket=/usr/local/jiro/mysql/data/mysql.sock --port=3307 -u root -p shutdown

socket は user=mysql で書き込めるような権限を持たせた場所に配置すること。 mysql/data の下に配置してあるのは、そのためである。 (mysql 直下は root でなければ書き込めない)

2006年09月26日

Movable Type から trackback 送信時にエラーが発生する件

先の記事の方法で解決した。 すなわち、rootで、

/usr/sbin/setsebool -P httpd_can_network_connect 1

原因: seLinux のデフォルト設定で、httpd が外部ネットワークに接続することを禁止するようになっていたために、 mt.cgi が ping を送信できない。

問題点: エラーメッセージが Bad hostname ということで、DNS の経路をまず疑ってしまった。 これはその後、mt の内部で、socket を呼ぶモジュールを使っていて、 そこでエラーが出ているという所まで分かったのだが、 mt をどうやって debug すればいいのか分からなかった。 debug のオプションの付け方は分かるが、 ログがどこにできるのかも分からない。

audit の log にはこういうのが出ていた。 こちらに気付かなかった。 このログを見れば、 アクセス権の設定が怪しいことが分かる。

type=AVC msg=audit(1159173411.527:95810):
 avc:  denied  { read } for  pid=6755
 comm="mt.cgi" name="resolv.conf" dev=dm-0 ino=31359894
 scontext=root:system_r:httpd_sys_script_t
 tcontext=system_u:object_r:net_conf_t tclass=file

type=SYSCALL msg=audit(1159173411.527:95810):
 arch=40000003 syscall=5 success=no exit=-13a0=92d24e a1=0 a2=1b6 a3=9bf5190
 items=1 pid=6755 auid=500 uid=501 gid=501 euid=501 suid=501 fsuid=501 egid=501
 sgid=501 fsgid=501 comm="mt.cgi" exe="/usr/bin/perl"

type=CWD msg=audit(1159173411.527:95810):
  cwd="/home/webmaster/blog/mt-cgi"

type=PATH msg=audit(1159173411.527:95810):
 item=0 name="/etc/resolv.conf"
 flags=101  inode=31359894 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00

type=AVC msg=audit(1159173411.527:95811):
 avc:  denied  { create } for  pid=6755 comm="mt.cgi"
 scontext=root:system_r:httpd_sys_script_t
 tcontext=root:system_r:httpd_sys_script_t
 tclass=udp_socket

普通に同じ pc から外が見えるに、 trackback ping だけ出て行かない、 というあたりで suLinux の設定の問題ではないかと推測できるはずである。 DNS の問題とかだと、 ブラウザから外を見ることもできないはずなので。

2006年09月29日

hibernate: TransientObjectException

11:07:46,500 ERROR org.hibernate.event.def.AbstractFlushingEventListener:300 - Could not synchronize database state with session
org.hibernate.TransientObjectException: jiro
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:753)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1141)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:26)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.springframework.orm.hibernate3.HibernateTemplate$27.doInHibernate(HibernateTemplate.java:799)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
	at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:797)
	at jp.co.crm.orm.FacadeHbImpl.flush(FacadeHbImpl.java:209)
  ...

flush しようとした所で TransientObjectException が発生している。 これは mapping の cascade を none に変更したため、 永続化したいオブジェクトが List の要素であるときに、 全て明示的に save しておかないと flush できない、というエラーである。 つまり、cascade が save-update のときには発生していなかったのだが、 none にしたら発生するようになった。

save を呼んでなかったオブジェクトに対して save を呼ぶようにしたら解決した。 cascade の設定を変えた理由は別記する。

Hibernate: cascade で NonUniqueObjectException

Spring の HibernateTemplate.saveOrUpdate でNonUniqueObjectException が発生。 バージョンは、 Hibernate Core 3.2.0 CR4、 Spring Framework 2.0 rc3。

Caused by: org.springframework.orm.hibernate3.HibernateSystemException:
 a different object with the same identifier value was already associated with the session:
 [jp.co.crm.orm.StringItem#1105]; nested exception is org.hibernate.NonUniqueObjectException:
 a different object with the same identifier value was already associated with the session:
 [jp.co.crm.orm.StringItem#1105]
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:657)
	at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:413)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:371)
	at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:674)
	at jp.co.crm.orm.FacadeHbImpl.save(FacadeHbImpl.java:199)
  (略)
	... 27 more
Caused by: org.hibernate.NonUniqueObjectException:
 a different object with the same identifier value was already associated with the session:
 [jp.co.crm.orm.StringItem#1105]
	at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:556)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:259)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:217)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
	at org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:147)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
	at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:299)
	at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:185)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:160)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:248)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:223)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:332)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:304)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:217)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
	at org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:147)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
	at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:299)
	at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:185)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:160)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:248)
	at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:437)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:326)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:98)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
	at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:677)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
	... 40 more

この Exception は既に session に load されている object を session.get あるいは session.load しようとしたら発生、 というように言われているが、 事態はそう簡単な話ではなかった。 先に解決方法を書いておくと、 mapping (.hbm.xml) の list のところの cascade を none に変更して、 list の要素となる (nest した) object は、明示的に save や update を呼ぶように書き直した。 つまり、cascade の save-update を使わないようにした。

この list は、many-to-many のモデルを使っていて、 最初は save-update で cascade していた。 これは大抵うまくいくのだが、 list の中に他でも使っている entity を入れたら前述の NonUniqueObjectException が出てしまうことがある。 (発生条件がよく分からない)

Hibernate の manual には次のように書いてある。 (10.11. Transitive persistence)

It doesn't usually make sense to enable cascade on a <many-to-one> or <many-to-many> association. Cascade is often useful for <one-to-one> and <one-to-many> associations.

many-to-many のデータモデルは現実にはないののかというと、 例えば、parent と children のモデルが、 hibernate のマニュアルにさんざん出てくる。 マニュアル中では one-to-many の例として実装されているが、 これを例えば人間や動物の親子関係に使おうとすると、 praent は 2 人いることがあるから、 モデルとしては(実装上の裏技とか Tips は別にして)、 many-to-many とした方が自然だと思う。

実際に作っているデータに関していえば、 例えば document に対して、creator とか author とかが list 要素に入っているようなもの。 1つの document に対する author が複数いたり、 author が複数の document を作ったりするので、 普通に考えると many-to-many にしかなりようがない。 author を String で表現した value object にして永続化する手はあるかもしれないが、 オブジェクト指向的におかしいモデルになってしまう。

ということで個々の document に対して class Author を用意しておいて、 それを entity として永続化したものを list に入れる、 というような実装を考えたのはそれほどおかしな話ではないと思うのだが、 これを save とか update するときに、 cascade の処理内で NonUniqueObjectException が出ているような気がする。

確かに delete の時に cascade すると many-to-many が破綻するというのは分かる。 reference count でも持てばいいのかもしれないが、 hibernate はそういうことをしてくれないし、 モデル的に、many-to-many で親が削除されたらすぐに子を削除するのがまずいのは当然として、 では、どこからも参照されていない状態になったらどうかというと、 その状態でさえ、永続化した実体を削除していいかどうかが分からない。 今回のデータだと、document が一つもない author というのは許さないのかというと、 そういうことはないのでは、ということだ。

しかし、今回のプログラムは、 どちらかというとどんどんデータを突っ込むタイプのものなので、 save や update は大量に発生するが、 delete はそう滅多にないというか、 save-update をどう効率的にコーディングするかというのが勝負どころで、 そこで cascade が使えないと結構疲れる。 何かこちらの使い方が間違っている可能性もあるので、 もう少し調べてみたい。

なお、 Hibernate の manual には、次のように書いてある。

Otherwise, you might not need cascade at all. But if you think that you will often be working with the parent and children together in the same transaction, and you want to save yourself some typing, consider using cascade="persist,merge,save-update".

これも試してみたが、ダメだった。 やはり NonUniqueObjectException が発生してしまう。

2006年10月04日

Spring Framework 2.0

Spring Framework 2.0 Final が公開されました。 カウントダウン終了直後は接続できなかったのですが、 既に落ち着いているようです。

http://www.springframework.org/

なお、 開発には既に 2.0 rc3 等を使っていますので、 コーディングの方針等の変更はありません。 WEB-INF/lib 等の内容は、 今週中に 2.0 final に差し替える予定です。

2006年10月14日

ViewVCのインストール

ViewVCを使って、CVSサーバ(Linux Fedora 4)のリポジトリをwebからブラウズできるようにする手順です。Pythonが必要ですが、はじめから入っていました。

続きを読む "ViewVCのインストール" »

2006年11月06日

ctrl+wでフォームが閉じてしまう

OperaでWikiやMovableTypeを書いているときに、誤ってctrl+wを押すとウィンドウが閉じてしまい、入力途中のフォームが失われてしまうことがありました。Operaのカスタマイズで、コントロールWを無効にすることができるのに気づき、変更しました。

[ツールメニュー]→[設定]→[タブ:詳細設定]→[ショートカット]→[キーボード設定:編集]

パネルが開くので「Application」の中に4つほどある「w ctrl」などを削除します。これで、ctrl+wでウィンドウが閉じなくなります。


2006年11月14日

XML の変換

XML のコンバート作業が入りそうなのだが、 XML を別形式の XML に変換するには、xslt を使うのが基本だろうということで、 xalan の最新版をチェック。

Xalan-Java Version 2.7.0

このたあたりが最新版のようだ。 download のリンクをたどると、 xalan-j_2_7_0-bin.zip というファイルが 08-Aug-2005 となっている。 少し古そうな気もするが、これを get。

展開したら、クラスパスを設定。 今回は Windows XP でテストしている。 こんな感じの setpath.bat を作って、 クラスパスをセットする。

set JAVA_HOME=d:\java\jdk1.5.0_09
set XALAN_HOME=d:\java\xalan-j_2_7_0
set CLASSPATH=.
set CLASSPATH=%CALSSPATH%;%XALAN_HOME%\xalan.jar;%XALAN_HOME%\xml-apis.jar;%XALAN_HOME%\xercesImpl.jar

実行はこんな感じ。

java org.apache.xalan.xslt.Process -IN inHoge.xml -XSL conv.xsl -OUT outHoge.xml -TT

-TT のオプションはマッチしたときのトレース用のもので、 通常不要。

Missing 'rows' attribute

MyFaces 拡張 (tomahawk) の t:dataScroller を使うときに、 t:dataTable の rows が指定されていないと、この例外が発生する。 考えてみると当たり前で、表の行数が分からないと、 全体で何ページあるかも計算できないのであった。

t:dataTable のタグ内に rows を指定すれば解決。

19:50:53,140 ERROR org.apache.catalina.core.ApplicationDispatcher:704
 - サーブレット jsp のServlet.service()が例外を投げました
javax.faces.FacesException: Missing 'rows' attribute on component 'table1'
	at org.apache.myfaces.custom.datascroller.HtmlDataScroller.getPageIndex
          (HtmlDataScroller.java:246)
	at org.apache.myfaces.custom.datascroller.HtmlDataScrollerRenderer.setVariables
          (HtmlDataScrollerRenderer.java:100)
	at org.apache.myfaces.custom.datascroller.HtmlDataScrollerRenderer.encodeBegin
          (HtmlDataScrollerRenderer.java:180)
	...(略)...

19:50:53,156 ERROR org.apache.catalina.core.StandardWrapperValve:253
 - サーブレット Faces Servlet のServlet.service()が例外を投げました
javax.faces.FacesException: Missing 'rows' attribute on component 'table1'
	at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch
          (ServletExternalContextImpl.java:435)
	at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView
          (JspViewHandlerImpl.java:234)
	at org.apache.myfaces.lifecycle.LifecycleImpl.render
          (LifecycleImpl.java:384)
	...(略)...

2006年11月30日

ant で tar ファイルを展開したときにパーミションを保持する

linux の場合、 ant の untar 機能を使うとすれば、 次のように書けばいいのだが、 これでは permission が保持されないことがある。

    <untar
      src="${filename}.tar"
      dest="${destdir}" />

そこで邪道だが /bin/tar を呼び出す手がある。 なお、展開先のディレクトリを指定したい場合は、 dir を使って適当に設定する必要がある。

    <exec executable="/bin/tar">
      <arg line="xf ${filename}.tar"/>
    </exec>

2006年12月04日

XHTML のコメントの書き方

これはもちろん正しい。

<!-- hoge -->

しかし実はこれも正しい。

<!-- hoge --     >

w3c の validator を通すと、validという評価になる。 ただし、 S separatior in comment declaration という警告は出る。

ということは、 XHTML のコメントを除去するソフトは、 このようなコメントも正しく認識する必要があるということだ。 例えば、

-->

という3文字連続を終わりとして認識するようなロジックだと、 正しい XHTML を処理できないおそれがある。

2006年12月11日

seLinux を無効にする

/etc/selinux/config を編集する。

2006年12月12日

Linux 起動時のサービスの調整 (chkconfig)

chkconfig --list で状況を確認して、 起動時に稼動させたいサービスに対して、

chkconfig サービス名 on

のようにする。 稼動しないようにする場合は off。

xinetd 管理下のサービスは、 xinetd の設定に書かれているファイルをチェックして、 disable という所を編集する。

Eclipse 3.1.x から 3.2.1 へ upgrade

・Eclipse

http://www.eclipse.org/downloads/ から Eclipse SDK 3.2.1 をダウンロードして、 \java\eclipse に配置する。

起動するときに、 3.1.2 のときに使っていた \java\workspace を workspace として指定する。

・PMD

http://pmd.sourceforge.net/eclipse/ に書いてある手順を実行する。 概要は次の通り。

Eclipse を起動して、 Help>Sotfware Updates>Find and Install... メニューを開く。

Search for new features to install を選択。

New Remote Site を選択し、 name を PMD Eclipse Site、 URL を http://pmd.sourceforge.net/eclipse とする。

後は手なりで何とかなるはず。

・DBViewer

DB を使わないのなら必要ないが、 JIRO の開発にはあると便利。

http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/about.html

最新の jar を plugin の下に配置する。

・GEF

http://download.eclipse.org/tools/gef/downloads/ から、バージョン 3.2.1 を選択し、 GEF-ALL-3.2.1.zip をダウンロードして、適切な場所に展開。

・Amateras htmleditor

http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi
の Products から EclipseHTMLEditor
を選択し、
ダウンロードページの「こちら」と書いてあるリンクをクリックする。

・tomcat plugin

http://www.sysdeo.com/eclipse/tomcatplugin

3.2 beta3, tomcatPluginV32beta3.zip というのが 2006-11-20 付けで出ているので、これを使う。

Eclipse 3.1.2 から 3.2.1 に upgrade したらソース行表示でエラー

プログラム実行時、 Exception が発生したときにスタックトレースが表示されるが、 ソース行へのリンクをクリックしたらエラーが発生するようになった。

An exception occurred while follwing link.

Reason:
  Error logged from JDK Debug UI

Error logged from JDT Debug UI: 
  Unable to access archive D:\java\eclipse\plugins\org.eclipse.jdt.source_3.1.1\src\org.junit_3.8.1\junitsrc.zip

Eclipse 3.1.2 で使っていたプロジェクトの .classpath を見ると、次のような行がある。

<classpathentry sourcepath="ECLIPSE_HOME/plugins/org.eclipse.jdt.source_3.1.1/src/org.junit_3.8.1/junitsrc.zip"
 kind="var" path="JUNIT_HOME/junit.jar"/>
eclipse を終了して、 エディタでこの行を削除してから再起動すると、 JUnit へのパスがなくなっているため、 JUnit test case を使ったソースでエラーが発生する。 改めてJUnit を指定し直せば解決する。

2007年01月17日

Apacheでバーチャルホストを設定

Apacheで、1つのIPアドレスに複数のホスト名を割り当てる、いわゆるバーチャルホスト・バーチャルドメインの設定ですが、NameVirtualHostの引数とVirtualHostの引数を完全に同じにしないと、うまく表示されなくなります。例えば下記の例で、片方を*にしてしまうと、期待したように動作しなくなります。

NameVirtualHost *:80
<VirtualHost *:80>

以下のページを参考にしました。

http://httpd.apache.org/docs/2.0/ja/vhosts/name-based.html

2007年02月20日

wgetのパッチ

wget -rで再帰取得をする場合、パスの記述によっては以下の問題が発生し、無限にネストしてしまうケースがあります。
- "../"でルートの親を指すことができる(Apacheでは、http://www.crm.co.jp/../index.htmlはhttp://www.crm.co.jp/index.htmlにリダイレクトされるようです)
- "dir/index.html"と"dir//index.html"を同一視しない(UNIX系ファイルシステムでは同じ扱いになります)
後述するパッチを利用すると、これに対応することができます。

なお、wget-r -Oを指定して固定ファイルに出力しようとすると、HTMLファイルのパースを(追記分だけでなく)毎回固定ファイル全体に対しておこなってしまうようで、うまく動作しないようです。

続きを読む "wgetのパッチ" »

2007年03月12日

ミスキャッシュのペナルティ

現在のプロセッサ(CPU)はメモリ(DRAM)よりも高速に動作できるため、プロセッサ内部のキャッシュ(cache)にメモリの内容の一部をコピーすることで、メモリの速度の限界よりも速く動作できるようになっています。しかし、アクセスの仕方によってはキャッシュが有効に機能せず、性能を大きく落としてしまいます。

以下は、後述するプログラムを実行した例です。「a」をつけるとキャッシュに有利なアクセス方法になり、結果として速度が5倍弱になっています(環境によっては10倍近くになるものもありました)。

[kimoto@localhost test]$ time ./cachetest

real    0m15.528s
user    0m15.457s
sys     0m0.008s
[kimoto@localhost test]$ time ./cachetest a

real    0m3.669s
user    0m3.644s
sys     0m0.008s
[kimoto@localhost test]$

この違いは、メモリのアドレスによってキャッシュできない組み合わせがあることにより生じます。つまり、キャッシュの全容量が有効に利用できるわけではないということです。一般のプログラミングで考慮することはまず不可能ですが、プロセッサにはいろいろなタイプの限界があることを体験することができます。

続きを読む "ミスキャッシュのペナルティ" »

2007年06月11日

OpenOffice.org SDK で BootstrapException: no office executable found

OpenOffice.org SDK (2.2) で、 プログラム実行時に次のような Exception が発生する。

     [java] com.sun.star.comp.helper.BootstrapException: no office executable found!
     [java] 	at com.sun.star.comp.helper.Bootstrap.bootstrap(Bootstrap.java:253)

これは office executable が見つからないと言っているのだから、 office の実行ファイル (soffice, soffice.exe, ..) が CLASSPATH に含まれているかを確認してみると解決することがある。

すなわち(OpenOffice.org 2.1 の場合)、 $OFFICE_HOME/program/classes だけではなく、 $OFFICE_HOME/program も classpath に含めるようにする。

2007年06月23日

MySQL が複数インストールされているときに昔の設定が影響して予期しない状態になることを防ぎたい

MySQL はデフォルト設定、例えば C:\my.cnf などを見に行くので、 後からインストールした MySQL が、 大昔にインストールした MySQL の設定を知らないうちに使ってしまい、 予期しない振る舞いとなることがある。 例えば、DBを格納するディレクトリなどが、 このファイルに書かれている場所になったりする。

この場合は、 次のパラメータを指定して mysqld (または mysqld-nt) を起動すれば、 C:\my.cnf 等を参照しないで起動できる。

--no-defaults

2007年11月17日

Spring Framework: nested List

List の要素に List を入れたい場合の XML 定義の書き方。 設定したい property の要素の list の中に list を単純に書けばいい。

<property name="listList">
  <list>
    <list>
      <value>1-1番目の要素</value>
      <value>1-2番目の要素</value>
      <value>1-3番目の要素</value>      
    </list>
    <list>
      <value>2-1番目の要素</value>
      <value>2-2番目の要素</value>
      <value>2-3番目の要素</value>      
    </list>
  </list>
<property>

2010年08月16日

CentOS に redmine 1.0.0 RC をインストールする (1)

Redmine は Ruby で書かれたプロジェクト管理ツールである。 2010年7月19日バージョン 1.0.0 RC がリリースされた。 弊社開発チームは Redmine を使っていたので、最新版に update することになったので、 手順を紹介する。

インストールするサーバーの OS は CentOS である。 現時点の CentOS に標準でインストールされている(できる) Ruby のバージョンは 1.8.5 だが、 Redmine は Ruby が 1.8.6以降のバージョンでないと動かない。 このため、まず、Ruby 1.8.7 のインストールから始めることになる。

・Ruby 1.8.7 のインストール

公式サイト ( http://www.ruby-lang.org/ja/downloads/ )トに、ダウンロードページがあるので、 ここから、ruby-1.8.7-p299.tar.gz をダウンロードして、/usr/local の下で展開した。

cd /usr/local
tar xf /tmp/ruby-1.8.7-p299.tar

何も考えずに定番の手順でインストールする。

./configure
./make
./make install

これで /usr/local/bin/ruby がインストールされた。 /usr/bin/ruby も残っているので、 バージョン違いのものが並存したことになる。 どちらを呼び出すか、注意が必要である。

# /usr/bin/ruby --version
ruby 1.8.5 (2006-08-25) [x86_64-linux]
# /usr/local/bin/ruby --version
ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]

一般には、違うバージョンのプログラムが並存するというのは微妙に怖い状況だが、 今回はokとする。 1.8.5 でないと困るということは通常はないと思われるので、 1.8.8 をアンインストールしても構わないと思うが、 それはそれで手間がかかるので今回は放置することにした。 which で確認すれば、デフォルトで呼ばれるのは 1.8.7 になっている。

$ ruby --version
ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]

(つづく)

2010年08月17日

CentOS に redmine 1.0.0 RC をインストールする (2)

・RubyGems 1.3.7

Ruby をインストールしたら、続いて RubyGems をインストールする。

Redmine 1.0.0. のインストールページに動作環境が書いてある。

RubyGems 1.3.1
Rake 0.8.3

これが必要だと書いてあるのだが、RubyGems の最新版は 1.3.7 である(2010-08-17 現在)。 このように書いてある場合は、1.3.1 を入手した方が確実なのだが、 今回は 1.3.7 を使った。一応、問題なく動作しているようである。

次のサイトからダウンロードする。

http://rubyforge.org/frs/?group_id=126

ダウンロードしたファイルを、/usr/local の下で展開すると、rubygems-1.3.7 というディレクトリができる。 その中のファイルに、インストールの方法が次のように書いてある。

3. Install with: ruby setup.rb  # you may need admin/root privilege

この通りに実行する。

# ruby setup.rb
RubyGems 1.3.7 installed

=== 1.3.7 / 2010-05-13

NOTE:

http://rubygems.org is now the default source for downloading gems.

You may have sources set via ~/.gemrc, so you should replace
http://gems.rubyforge.org with http://rubygems.org

http://gems.rubyforge.org will continue to work for the forseeable future.

New features:

(途中略)

RubyGems installed the following executables:
        /usr/local/bin/gem

#

このインストールは、特に問題なさそうだ。

(つづく)

2010年08月18日

CentOS に redmine 1.0.0 RC をインストールする (3)

・rake のインストール

続いて Rake をインストールする。 RubyGems がインストールされているので、手順は簡単で、

gem install rake

このように実行すればいい。

# gem install rake
ERROR:  Loading command: install (LoadError)
    no such file to load -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::InstallCommand
#

拒絶された。 先に、zlib をインストールしなければならないらしい。 zlib の公式サイト ( http://www.zlib.net/ ) からダウンロードする。

最新版の zlib は zlib-1.2.5 のようだ。zlib-1.2.5.tar.gz を get する。 インストールの手順は定番通り。

# ./configure

(省略)

# make

(省略)

# make install
cp libz.a /usr/local/lib
cp libz.so.1.2.5 /usr/local/lib
cd /usr/local/lib; chmod u=rw,go=r libz.a
cp zlib.3 /usr/local/share/man/man3
chmod 644 /usr/local/share/man/man3/zlib.3
cp zlib.pc /usr/local/lib/pkgconfig
chmod 644 /usr/local/lib/pkgconfig/zlib.pc
cp zlib.h zconf.h /usr/local/include
chmod 644 /usr/local/include/zlib.h /usr/local/include/zconf.h
# cd /usr/local/ruby/ext/zlib
# ruby extconf.rb --with-zlib-include=/usr/local/include --with-zlib-lib=/usr/local/lib
[root@t110 zlib]# make all
gcc -I. -I. -I/usr/local/lib/ruby/1.8/x86_64-linux -I. -DHAVE_ZLIB_H  -DOS_CODE=OS_UNIX -I/usr/local/include    -fPIC -g -O2   -c zlib.c
gcc -shared -o zlib.so zlib.o -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L/usr/local/lib -Wl,-R/usr/local/lib -L.  -rdynamic -Wl,-export-dynamic    -lz  -lrt -ldl -lcrypt -lm   -lc
# make install
/usr/bin/install -c -m 0755 zlib.so /usr/local/lib/ruby/site_ruby/1.8/x86_64-linux

この状態で、 もう一度 rake をインストールしてみる。

# gem install rake
Successfully installed rake-0.8.7
1 gem installed
Installing ri documentation for rake-0.8.7...
Installing RDoc documentation for rake-0.8.7...
#

今度は問題ない。

(つづく)

2010年08月19日

CentOS に redmine 1.0.0 RC をインストールする (4)

・Redmine の config の調整 (インストール手順 3)

Redmine のインストール手順は http://redmine.jp/guide/RedmineInstall を参考にする。 データベースの選択だが、 たまたま MySQL は他のソフトでも使っていていろいろ面倒だったので、 以前のバージョンは SQLite を選択して使っていた。 今回も引き続き SQLite を使うことにした。 この場合、インストール手順 2 の、空のデータベースの作成は省略できる。

redmine をインストールしたディレクトリにある、 次の2つのファイルを環境に合わせて編集する必要がある。

config/database.yml
email.yml

今回は以前のバージョンのものがあるから、 それをコピーした。

・session_store.rb の実行 (インストール手順 4)

続けて、redmine をインストールしたディレクトリで、次のコマンドを実行する。

# rake config/initializers/session_store.rb
(in /usr/local/redmine/redmine-1.0.0)
#

これも特に問題なさそうだ。

(つづく)

2010年08月20日

CentOS に redmine 1.0.0 RC をインストールする (5)

・テーブルの作成 (インストール手順 5)

公式サイトに次のように書いてあったので、 その通りにしてみる。

rake db:migrate RAILS_ENV=“production”

実はうっかりこのまま実行したのだが、 double quote が全角だとまずいのではないかと思う。 しかし、もっとまずいことに、こんなメッセージが出てしまった。

# rake db:migrate RAILS_ENV=“production
(in /usr/local/redmine/redmine-1.0.0)
rake aborted!
Could not find RubyGem rack (~> 1.0.1)

(See full trace by running task with --trace)

rack がない。 ということで、rack をインストールする。

# gem install rack
Successfully installed rack-1.2.1
1 gem installed
Installing ri documentation for rack-1.2.1...
Installing RDoc documentation for rack-1.2.1...

そんなに新しいのでいいのか? とりあえずこれで続行してみると、

# rake db:migrate RAILS_ENV="production"
(in /usr/local/redmine/redmine-1.0.0)
rake aborted!
RubyGem version error: rack(1.2.1 not ~> 1.0.1)

(See full trace by running task with --trace)

よくないらしい。

ということで、アンインストールしてから、 -v オプションを使って、1.0.1 を指定してインストールし直すことにする。

# gem uninstall rack
Remove executables:
        rackup

in addition to the gem? [Yn]  Y
Removing rackup
Successfully uninstalled rack-1.2.1
#
# gem install rack -v 1.0.1
Successfully installed rack-1.0.1
1 gem installed
Installing ri documentation for rack-1.0.1...
Installing RDoc documentation for rack-1.0.1...

これで確実なものがインストールされたので、再度 rake を実行。

# rake db:migrate RAILS_ENV="production"
(in /usr/local/redmine/redmine-1.0.0)
rake aborted!
no such file to load -- openssl

(See full trace by running task with --trace)
#

openssl がインストールされていないと言われてしまった。

(つづく)

2010年08月23日

CentOS に redmine 1.0.0 RC をインストールする (6)

・openssl-devel のインストール

openssl がインストールされていないというのだが、

# which openssl
/usr/bin/openssl

入っているように見える。確認する。

# yum list openssl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: www.ftp.ne.jp
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Installed Packages
openssl.i686                           0.9.8e-12.el5_4.6                         installed
openssl.x86_64                         0.9.8e-12.el5_4.6                         installed

もしかして、devel が入ってないからだめなのか?

# yum list openssl-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: www.ftp.ne.jp
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Available Packages
openssl-devel.i386                          0.9.8e-12.el5_4.6                         base
openssl-devel.x86_64                        0.9.8e-12.el5_4.6                         base

ということで、 openssl-devel をインストールすることにした。 yum を使う。

# yum install openssl-devel

(途中略)

Installing:
 openssl-devel              i386          0.9.8e-12.el5_4.6          base           1.9 M
 openssl-devel              x86_64        0.9.8e-12.el5_4.6          base           1.9 M
Installing for dependencies:
 e2fsprogs-devel            x86_64        1.39-23.el5                base           632 k
 keyutils-libs-devel        x86_64        1.2-1.el5                  base            27 k
 krb5-devel                 x86_64        1.6.1-36.el5_5.4           updates        1.9 M
 libselinux-devel           x86_64        1.33.4-5.5.el5             base           149 k
 libsepol-devel             x86_64        1.15.2-3.el5               base           192 k
 zlib-devel                 x86_64        1.2.3-3                    base           102 k

Transaction Summary
==========================================================================================
Install       8 Package(s)
Upgrade       0 Package(s)

Total download size: 6.7 M
Is this ok [y/N]: 

yを押せばインストールが始まる。

Downloading Packages:
(1/8): keyutils-libs-devel-1.2-1.el5.x86_64.rpm                    |  27 kB     00:00
(2/8): zlib-devel-1.2.3-3.x86_64.rpm                               | 102 kB     00:00
(3/8): libselinux-devel-1.33.4-5.5.el5.x86_64.rpm                  | 149 kB     00:01
(4/8): libsepol-devel-1.15.2-3.el5.x86_64.rpm                      | 192 kB     00:01
(5/8): e2fsprogs-devel-1.39-23.el5.x86_64.rpm                      | 632 kB     00:02
(6/8): openssl-devel-0.9.8e-12.el5_4.6.x86_64.rpm                  | 1.9 MB     00:08
(7/8): krb5-devel-1.6.1-36.el5_5.4.x86_64.rpm                      | 1.9 MB     00:05
(8/8): openssl-devel-0.9.8e-12.el5_4.6.i386.rpm                    | 1.9 MB     00:04
------------------------------------------------------------------------------------------
Total                                                     281 kB/s | 6.7 MB     00:24
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : zlib-devel                                                         1/8
  Installing     : keyutils-libs-devel                                                2/8
  Installing     : libsepol-devel                                                     3/8
  Installing     : libselinux-devel                                                   4/8
  Installing     : e2fsprogs-devel                                                    5/8
  Installing     : krb5-devel                                                         6/8
  Installing     : openssl-devel                                                      7/8
  Installing     : openssl-devel                                                      8/8

Installed:
  openssl-devel.i386 0:0.9.8e-12.el5_4.6     openssl-devel.x86_64 0:0.9.8e-12.el5_4.6

Dependency Installed:
  e2fsprogs-devel.x86_64 0:1.39-23.el5      keyutils-libs-devel.x86_64 0:1.2-1.el5
  krb5-devel.x86_64 0:1.6.1-36.el5_5.4      libselinux-devel.x86_64 0:1.33.4-5.5.el5
  libsepol-devel.x86_64 0:1.15.2-3.el5      zlib-devel.x86_64 0:1.2.3-3

Complete!
#
これで openssl-devel が入ったので、ruby から使えるように設定する。 ruby をインストールしたディレクトリの、ext/openssl に移動して、extconf.rb を実行する。
# ruby extconf.rb --with-openssl-include=/usr/include --with-openssl-lib=/usr/lib
=== OpenSSL for Ruby configurator ===

(略)

=== Checking done. ===
creating extconf.h
creating Makefile
Done.

これで Makefile ができるので、make all を実行。 実行できたら、make install を実行する。

# make all

(略)

# make install
/usr/bin/install -c -m 0755 openssl.so /usr/local/lib/ruby/site_ruby/1.8/x86_64-linux
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/openssl
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/net
/usr/bin/install -c -m 644 ./lib/openssl/ssl.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/cipher.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/x509-internal.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/buffering.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/digest.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/x509.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/pkcs7.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/bn.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl/ssl-internal.rb /usr/local/lib/ruby/site_ruby/1.8/openssl
/usr/bin/install -c -m 644 ./lib/openssl.rb /usr/local/lib/ruby/site_ruby/1.8
/usr/bin/install -c -m 644 ./lib/net/telnets.rb /usr/local/lib/ruby/site_ruby/1.8/net
/usr/bin/install -c -m 644 ./lib/net/ftptls.rb /usr/local/lib/ruby/site_ruby/1.8/net

ということで、ここまではうまくいった。

(つづく)

2010年08月24日

CentOS に redmine 1.0.0 RC をインストールする (7)

・sqlite のインストール

DB の migration がうまくいかない。 どうも sqlite3-ruby が入っていないのが原因らしいので、gem install してみる。

# gem install sqlite3-ruby
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3-ruby:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal' or 'yum install sqlite3-devel'
*** extconf.rb failed ***
(略)

yum install しろというので、してみる。

[root@t110 redmine]# yum install sqlite-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: www.ftp.ne.jp
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package sqlite-devel.i386 0:3.3.6-5 set to be updated
---> Package sqlite-devel.x86_64 0:3.3.6-5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================
 Package                  Arch               Version               Repository        Size
==========================================================================================
Installing:
 sqlite-devel             i386               3.3.6-5               base             257 k
 sqlite-devel             x86_64             3.3.6-5               base             257 k

Transaction Summary
==========================================================================================
Install       2 Package(s)
Upgrade       0 Package(s)

Total download size: 515 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): sqlite-devel-3.3.6-5.x86_64.rpm                             | 257 kB     00:01
(2/2): sqlite-devel-3.3.6-5.i386.rpm                               | 257 kB     00:01
------------------------------------------------------------------------------------------
Total                                                     206 kB/s | 515 kB     00:02
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : sqlite-devel                                                       1/2
  Installing     : sqlite-devel                                                       2/2

Installed:
  sqlite-devel.i386 0:3.3.6-5                sqlite-devel.x86_64 0:3.3.6-5

Complete!
[root@t110 redmine]#

ここまでは問題なさそうなので、もう一度 gem install してみる。

# gem install sqlite3-ruby
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3-ruby:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb
checking for sqlite3.h... yes
checking for sqlite3_libversion_number() in -lsqlite3... yes
checking for rb_proc_arity()... no
checking for sqlite3_initialize()... no
sqlite3-ruby only supports sqlite3 versions 3.6.16+, please upgrade!
*** extconf.rb failed ***

要するに 3.3.6 だと古すぎるそうだ。 sqlite の最新のものをインストールすることにする。

公式サイト ( http://www.sqlite.org/download.html ) から 3.7.0 を download する。

この頃になると、 もう疲れているので、何も考えずに。ダウンロード、展開、./configure、make、make install、と、呪文のように黙々と実行する。

# ./configure

(略)

configure: creating ./config.status
config.status: creating Makefile
config.status: creating sqlite3.pc
config.status: executing depfiles commands
# make
(略)

creating sqlite3
# make install
make[1]: ディレクトリ `/usr/local/sqlite-3.7.0' に入ります
test -z "/usr/local/lib" || mkdir -p -- "/usr/local/lib"
 /bin/sh ./libtool --mode=install /usr/bin/install -c  'libsqlite3.la' '/usr/local/lib/libsqlite3.la'
/usr/bin/install -c .libs/libsqlite3.so.0.8.6 /usr/local/lib/libsqlite3.so.0.8.6
(cd /usr/local/lib && { ln -s -f libsqlite3.so.0.8.6 libsqlite3.so.0 || { rm -f libsqlite3.so.0 && ln -s libsqlite3.so.0.8.6 libsqlite3.so.0; }; })
(cd /usr/local/lib && { ln -s -f libsqlite3.so.0.8.6 libsqlite3.so || { rm -f libsqlite3.so && ln -s libsqlite3.so.0.8.6 libsqlite3.so; }; })
/usr/bin/install -c .libs/libsqlite3.lai /usr/local/lib/libsqlite3.la
/usr/bin/install -c .libs/libsqlite3.a /usr/local/lib/libsqlite3.a
chmod 644 /usr/local/lib/libsqlite3.a
ranlib /usr/local/lib/libsqlite3.a
PATH="$PATH:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin"
  /bin/sh ./libtool --mode=install /usr/bin/install -c 'sqlite3' '/usr/local/bin/sqlite3'
/usr/bin/install -c .libs/sqlite3 /usr/local/bin/sqlite3
test -z "/usr/local/include" || mkdir -p -- "/usr/local/include"
 /usr/bin/install -c -m 644 'sqlite3.h' '/usr/local/include/sqlite3.h'
 /usr/bin/install -c -m 644 'sqlite3ext.h' '/usr/local/include/sqlite3ext.h'
test -z "/usr/local/share/man/man1" || mkdir -p -- "/usr/local/share/man/man1"
 /usr/bin/install -c -m 644 './sqlite3.1' '/usr/local/share/man/man1/sqlite3.1'
test -z "/usr/local/lib/pkgconfig" || mkdir -p -- "/usr/local/lib/pkgconfig"
 /usr/bin/install -c -m 644 'sqlite3.pc' '/usr/local/lib/pkgconfig/sqlite3.pc'
make[1]: ディレクトリ `/usr/local/sqlite-3.7.0' から出ます

特に指定もしていないのだが、 /usr/local/ にインストールされていることが分かる。 もう一度、gem install を実行する。

# gem install sqlite3-ruby
Building native extensions.  This could take a while...
Successfully installed sqlite3-ruby-1.3.1
1 gem installed
Installing ri documentation for sqlite3-ruby-1.3.1...

Enclosing class/module 'mSqlite3' for class Statement not known

No definition for libversion
Installing RDoc documentation for sqlite3-ruby-1.3.1...

Enclosing class/module 'mSqlite3' for class Statement not known

No definition for libversion
#

うまくできている? ユーザーアカウントで、次のコマンドを実行する。

rake db:migrate RAILS_ENV=“production” 
(略)

大量のメッセージが出ているので、成功したらしい。 permission の変更をしろということで、手順通りやってみる。

mkdir tmp public/plugin_assets
sudo chown -R redmine:redmine files log tmp public/plugin_assets
sudo chmod -R 755 files log tmp public/plugin_assets

(つづく)

2010年08月25日

CentOS に redmine 1.0.0 RC をインストールする (終)

これでインストール終了のはずなので、 とりあえず起動してみる。

$ ruby script/server webrick -e production
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
./script/../config/../vendor/rails/railties/lib/rails/gem_dependency.rb:119:Warning: Gem::Dependency#version_requirements is deprecated and will be removed on or after August 2010.  Use #requirement
Rails Error: Unable to access log file. Please ensure that /usr/local/redmine/redmine-1.0.0/log/production.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.
DEPRECATION WARNING: Please update config/database.yml to use 'database' instead of 'dbfile'. (called from parse_sqlite_config! at /usr/local/redmine/redmine-1.0.0/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:35)
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-07-22 22:18:03] INFO  WEBrick 1.3.1
[2010-07-22 22:18:03] INFO  ruby 1.8.7 (2010-06-23) [x86_64-linux]
[2010-07-22 22:18:03] INFO  WEBrick::HTTPServer#start: pid=9825 port=3000
[2010-07-22 22:18:21] INFO  going to shutdown ...
[2010-07-22 22:18:21] INFO  WEBrick::HTTPServer#start done.
Exiting

怪しいメッセージが出ている。 何かまだ permission に問題があるようだ。 ログに関しては、log ディレクトリの下を見ると、こうなっていた。

# ll
合計 16
-rw-r--r-- 1 mai  mai  36 10月 15  2006 delete.me
-rw-r--r-- 1 root root 51  7月 22 18:52 production.log

mai というのは私のアカウントで、Redmine を起動するユーザーでもあるのだが、 production.log が root しか書けなくなっているのはマズいので、chown で調整する。

# chown mai.mai pro*
# ll
合計 16
-rw-r--r-- 1 mai mai 36 10月 15  2006 delete.me
-rw-r--r-- 1 mai mai 51  7月 22 18:52 production.log

もう一度起動してみる。

ruby script/server webrick -e production
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
./script/../config/../vendor/rails/railties/lib/rails/gem_dependency.rb:119:Warning: Gem::Dependency#version_requirements is deprecated and will be removed on or after August 2010.  Use #requirement
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-07-22 22:19:54] INFO  WEBrick 1.3.1
[2010-07-22 22:19:54] INFO  ruby 1.8.7 (2010-06-23) [x86_64-linux]
[2010-07-22 22:19:54] INFO  WEBrick::HTTPServer#start: pid=9858 port=3000

これでokっぽいが、こんな Exception が出てしまう。

SQLite3::ReadOnlyException: attempt to write a readonly database: INSERT INTO "users" ("created_on", "hashed_password", "admin", "language", "lastname", "mail", "updated_on", "type", "firstname", "mail_notification", "login", "status", "identity_url", "last_login_on", "auth_source_id") VALUES('2010-07-22 22:21:46', '', 'f', '', 'Anonymous', '', '2010-07-22 22:21:46', 'AnonymousUser', '', 'f', '', 0, NULL, NULL, NULL)

RAILS_ROOT: /usr/local/redmine/redmine-1.0.0

db の下を見ると、こうなっている。

drwxr-xr-x 2 mai  mai   16384  7月 19 03:21 migrate
-rw-r--r-- 1 root root 195584  7月 22 22:14 redmine.db
-rw-r--r-- 1 root root  27041  7月 22 22:14 schema.rb

db の owner が root なので書けない。間違って途中で root のまま作業してしまったようだ。 これを chmod mai.mai * で owner=mai にすれば解決。 その後、特に問題なく稼動している。

開発製品

jirologos.gif

About 技術メモ

ブログ「三田ブログ」のカテゴリ「技術メモ」に投稿されたすべてのエントリのアーカイブのページです。新しい順番に並んでいます。

前のカテゴリはwikipediaです。

次のカテゴリは日記です。

他にも多くのエントリがあります。メインページアーカイブページも見てください。

Powered by
Movable Type