2009-07-30

qi.LiveChat を試してみました (Plone)

Ploneも、buildoutな環境にもようやく慣れてきた気がします。


最初はやりかたが良く判らなくて、『何それ?』な状態でしたが、設定ファイルに追加したいプロダクトを記載さえしておけば良いので、以前のように自分でソースをダウンロードし、Products/ 以下に配置してZOPEの再起動....という手間が省けるようになりました。

また、何よりサーバを起動する前にプロダクトのビルドがうまくいくか確認できますし、先にビルドされる分、起動も早くなっているようです。

* * * * *



さて、本日は、『何か楽しいものも入れよう!』と思い、いろいろとCMS Infoを眺めておりました。そこで目にとまったのが、Chat用プロダクト。

メッセージのやり取りには、色々なIMもありますし、いまさらChatなんて...とも思ったりしました。でも、ブラウザだけで済むのと、外部のWebサービスを利用しなくても済むことが良さそうだったので、qi.LiveChatというプロダクトを追加してみることにしました。

buildout.cfgへの設定は、このような感じです。(eggs, zcmlにプロダクト名を追加)



# If you want Zope to know about any additional eggs, list them here.

# e.g. eggs = ${buildout:eggs} my.package

eggs =
${buildout:eggs}

qi.LiveChat



# If you want to register ZCML slugs for any packages, list them here.

# e.g. zcml = my.package my.other.package

zcml =

${buildout:zcml}

qi.LiveChat



# For Chat

[scripts]

recipe = zc.recipe.egg

eggs = qi.LiveChat

インストールは、bin/buildout -n でつつがなく終了。

また、チャット用のサーバプログラム(XML-RPC)がプロダクトに付属しているので、外部のサービスなどを使わずともすぐにサービスが開始できます。 以下のとおりコマンドを実行すると、デフォルトで8000番でチャット用サーバが起動します。

% python /usr/local/Plone/buildout-cache/eggs/qi.LiveChat-0.21-py2.4.egg/qi/LiveChat/server/xmlrpcServer.py

スクリーンショットは、こんな感じです。
フォームからメッセージを入力すると、Ajax通信でサーバにPOSTされます。また、サーバからのデータは、デフォルトで20秒間隔でGETし、Ajax.Updateさせて画面を更新しています。

メッセージ用のサーバは、localhost:8000 (ZOPEのインスタンスと同じホスト)でプログラムの中で決めうちになっています。

Ploneの管理画面やChatコンテンツの編集画面で変更できれば良いのですが、Ajax利用のため、少なくともlocalhost固定になっているのは仕方がなさそうです。

でも、できればPortくらいは任意で切り替えられると嬉しいな、と思います。


* * * * *


※お約束の、本日のトラブル(?)


Ajaxを使ってデータをPOSTしているんですが、私のWindowsの環境だと、エンターキー押すだけでPOSTされちゃいます。メッセージの途中で漢字変換を行い、変換を確定させると、それがPOST用のイベントだと判断されてしまいました。

メッセージが切れ切れになっちゃうので、これだと嬉しくないですね。上記の点に加え、プロダクトの日本語化は未だなので、うまく動くように修正して使ってみようと思います。

2009-07-21

DB内のオブジェクト(テーブル)の全部の制約を無効/有効にする

#PASSJ Blogからの転記+修正版です。

SQL ServerのExport & Import作業やデータの削除時に、制約が邪魔をして、うまくお掃除できないことがあります。

そこで、一括して制約を無効/有効にするストアドを作ってみました。

※ただし、制約を無効化しても、制約が無くなるわけではありません。SQL Server 2005の場合、テーブル間の制約があると、制約が無効化状態であっても、TRUNCATEは出来ません。(ここは、Oracleと違うところみたいです)
TRUNCATEだと、とトランザクションが発生しないからでしょうか。

SQL Serverで、テーブルをTRUNCATEするためには、制約の削除 -> 再作成というステップを行わないとだめのようで、これはちょっと悲しい....。(他にもっといい方法があるのかもしれません。また、2008ではOKかもしれませんが、こちらは未確認)

ちなみに、DELETEとかINSERTは可能になります。(その代わり、SQLのトランザクションが発生するので、実行時間はそれなりにかかるかと思います)




とりあえず、全部のテーブルに対し、有効化/無効化を切り替えるストアドは、こんな感じとなりました。

CREATE PROCEDURE maintenance.sp_Disable_AllConstraints
@disable BIT = 1
AS
DECLARE
@sql VARCHAR(500),
@tableName VARCHAR(128),
@tableSchema VARCHAR(128)

-- List of all tables
DECLARE triggerCursor CURSOR
FOR
SELECT
t.TABLE_NAME AS TableName,
t.TABLE_SCHEMA AS TableSchema
FROM
INFORMATION_SCHEMA.TABLES t
ORDER BY
t.TABLE_NAME,
t.TABLE_SCHEMA

OPEN triggerCursor

FETCH NEXT FROM triggerCursor
INTO @tableName, @tableSchema

WHILE ( @@FETCH_STATUS = 0 )
BEGIN
IF @disable = 1
SET @sql = 'ALTER TABLE ' + @tableSchema
+ '.[' + @tableName + '] NOCHECK CONSTRAINT ALL'
ELSE
SET @sql = 'ALTER TABLE ' + @tableSchema
+ '.[' + @tableName + '] CHECK CONSTRAINT ALL'

PRINT 'Executing Statement - ' + @sql

EXECUTE ( @sql )
FETCH NEXT FROM triggerCursor
INTO @tableName, @tableSchema
END

CLOSE triggerCursor
DEALLOCATE triggerCursor






今回は、maintenanceというスキーマに作ってみました。
使い方は、こんな感じです。 ( -- 1で全制約を無効化、0で有効化 )

EXECUTE maintenance.sp_Disable_AllConstraints @disable = 1
-- 結果
Executing Statement - ALTER TABLE xxxx.[Application] NOCHECK CONSTRAINT ALL
Executing Statement - ALTER TABLE xxxx.[ApplicationAttachementFile] NOCHECK

CONSTRAINT ALL
:
:

実は、上記のコードは、ほぼMSDNライブラリのコードを参考にしました。

外部キーの無効化って、Transact-SQLだとどうやるのかな...と思って検索したところ、NOCHECK CONSTRAINT で行えることが判明。しかも、テーブル単位で、ALL指定ができるんですね。

さらに、一括でトリガや外部制約を無効化するサンプルコードがMSDNライブラリに載っていたのですが、なぜか外部制約のためのスクリプトが「トリガの無効化」のコードになっていました(^^;

とりあえずSQLを良く見て、ちょこちょこと変えたら、希望通りの動作になったので、こちらに載せてみました。
ただ、実際は全部のスキーマに操作しちゃうのは良くないと思うので、スキーマ名を引数にとって実行するのが良いかなあ...と思っています。

2009-07-17

Redmineの日本語メールJIS対応のはずが?

今日のトラブルは、RedmineのメールのJIS化にともなうものです。

Redmineのバージョンアップ作業で、ユーザさんからのリクエストに応えようと、メールのJIS対応を行ってみました。あんまりRORには詳しくないので、まずは検索。

そして、参考にさせていただいたのが、以下のサイトです。

おかげさまで、めでたくメールがISO-2022-JPになってくれました。

メールの件は片付いたので、しばらくはその他のプラグインの検証などを行っていたのですが、意外なところで不具合が発生。

Redmine0.7xの環境で登録したデータを、バージョンアップの検証環境にインポートし、Redmine0.8.4の動作確認ということを行っていたのですが、検証環境で新たにユーザを追加すると、そのユーザだけ、正常にログインが出来なくなってしまったのです

最初は何がなんだかわからなかったのですが、ログを見ると、エラーの発生するユーザには、すべて以下のようなメッセージが出ていました。

ActionView::TemplateError (uninitialized constant GetText::Rails::SecretKeyGenerator) on....

最初の疑惑は、バージョンアップそのものでしたが、これはどうも考えにくい。

次に、ユーザの認証に関してです。追加ユーザは、Internalではなく、LDAP認証を利用しています。でも、すでに0.7xの環境でも同じLDAPサーバを利用してのユーザ追加は問題ないので、これも考えにくいのでした。

そして、最後に疑ったのが、gettextまわり。

実は、gettextもインストールにするにあたって、Railsのバージョンやgettextのバージョンとの組み合わせで、Redmineがうまく動かなかったり、migrateでエラーになったりして、結構一苦労していました。

また、せっかくメールはJIS対応させたものの、SystemNotificationsという、ユーザへの一斉通知用プラグインに関しては、HTMLを含む送信メールがうまくJIS化できませんでした。

なんだか危険だなあ...と思っていたgettextだけに、エラーメッセージをキーに検索をすると、とても有難い情報が!

  • 2009-07-01 Redmine にチャレンジ中 (By JULYさま)

まさにビンゴ、という感じで、早速Gettextのコードを解除し、もとのUTF-8に戻すと、あっけなく不具合が解決しました。
参考にしたBlogの方法が有効化はまだ判らないのですが、あまりgettextまわりはいじりたくないと直感が働いているので、メールのJIS化は保留としました。

ですが、タイムリーなことに、別の方法(プラグイン)を、お世話になっている方から教えていただいたので、こちらを試してみようと思っています。

それにしても、助かりました、JULYさま、本当に有難うございました。
(コメントが付けられないので、かげながらお礼申し上げます....)

2009-07-14

うっかり再起動

今日のトラブルはこちら。

VMWareのGuestOS上で、vmware-toolsのプロセスを再起動すると、いったん接続が切れてしまいます...。 たとえば、こんな感じで。

# /etc/rc.d/init.d/vmware-tools restart

....あとはターミナルがだんまり.....

なるべくScreenコマンドを使ったりしておきましょう...。

2009-07-11

Local Avatars plugin

Redmine0.8.4に、Local Avatars pluginを追加してみました。
プラグイン組み込みの後、動作チェックをしていたところ、チケットの一覧から個別のチケットを表示する画面へ遷移すると、こんなエラーが...。

undefined method `attachments' for #<User:0xb7233be4>

こんな基本的な動作でもエラーになってしまっては、ぜんぜん使い物になりません!
そのほかにも、自分のアカウントの情報を表示する画面でもエラーが発生。
どうやら、Avatarの表示にかかわる箇所でエラーが発生しているようでした。

画面に出ているエラーは、こんな感じ。
vendor/rails/activerecord/lib/active_record/attribute_methods.rb:256:in `method_missing'
vendor/plugins/redmine_local_avatars/lib/application_helper_avatar_patch.rb:14:in `avatar'
app/views/account/show.rhtml:5:in `_run_erb_47app47views47account47show46rhtml'
/usr/bin/mongrel_rails:19:in `load'
/usr/bin/mongrel_rails:19


困ったなあ~と思い、環境をチェックしてみると、そう言えばdevelopmentモードで起動させていたことに気が付きました。

実は、Local Avatars以外にも、プラグインに関しては、developmentモードだとうまくいかないものが幾つかあったのです。もしや、と思ってproductionモードに切り替えると、今度は正常に動作してくれました。

...とまあ、これでひと安心。

でも、productionモードでないと動かないというのは、ちょっと困りますね。
せっかくテストと本番を切り替える仕組みがあるのに。

2009-07-10

buildout.cfg

buildoutを使ってPloneをビルドすると、毎回zope.confが書き換わってしまいます。
たとえば、Zopeを再起動してもSessionのタイムアウト設定がクリアされないように、
session-timeout-minutes 180

の一行を、zope.confに書いておいても、bin/buildout すると値がデフォルトに戻ってしまいます。

そういうときは、おおもとのbuildout.cfgの [instance] の部分に設定を書いておけば良いとのこと。


[instance]
# Added by akiko for session
zope-conf-additional = session-timeout-minutes 180