« August 2008 | Main | October 2008 »

September 2008

2008.09.27

PYTHON_EGG_CACHE

 以前はSetEnvでApacheのconfファイルに書いていましたが、いつの間にかPythonOptionで指定することが基本になったようです。

 Trac0.11-ja1では、

egg_cache = req.subprocess_env.get('PYTHON_EGG_CACHE')
if egg_cache:
    os.environ['PYTHON_EGG_CACHE'] = egg_cache

といった感じで扱っており、Trac0.11.1-ja1では
options = req.get_options()
egg_cache = options.get('PYTHON_EGG_CACHE')
if not egg_cache and options.get('TracEnv'):
    egg_cache = os.path.join(options.get('TracEnv'), '.egg-cache')
if not egg_cache and options.get('TracEnvParentDir'):
    egg_cache = os.path.join(options.get('TracEnvParentDir'), '.egg-cache')
if not egg_cache and req.subprocess_env.get('PYTHON_EGG_CACHE'):
    egg_cache = req.subprocess_env.get('PYTHON_EGG_CACHE')

となってます。

・・・ってことは、PythonOptionで指定しないと、TracEnvなどのパスを基準に.egg_cacheを作成するので、プロジェクト一覧に.egg-cacheが表示されてしまう(Parentで設定していた場合)という現象が発生してしまうわけですね。

⇒TracEnvもTracEnvParentDirも指定せずにTracを動かすことは基本的にないと思うので、実質PythonOptionで指定することが基本になるのでは。

| | Comments (0) | TrackBack (1)

2008.09.25

Pythonでxmlrpc

 普段はJavaでTrac XML-RPC Pluginにアクセスしているのですが、どうせならPythonだけで完結できるように・・・ってことで、Pythonを用いてアクセスしてみるテスト。

 単純にアクセスするだけであれば、実はすごく簡単。

import xmlrpclib
srcServer = xmlrpclib.ServerProxy('http://hostname/trac/test/xmlrpc')
srcTicket = srcServer.ticket.get(1)

って感じで、実行すると、チケット#1の内容を取得することができます。Basic認証が必要な場合は、
srcServer = xmlrpclib.ServerProxy('http://username:password@hostname/trac/test/login/xmlrpc')

となります。SSLでの通信も、単純にプロトコルをhttpsにするだけで問題なく行えます。
srcServer = xmlrpclib.ServerProxy('https://username:password@hostname/trac/test/login/xmlrpc')

Pythonのhttps通信では、サーバ証明書のチェックは特に行っていないようで、自己署名証明書等を用いた場合でも特にエラー等は出たりしないようです(Python2.5.1で動作確認)。

Continue reading "Pythonでxmlrpc"

| | Comments (0) | TrackBack (0)

2008.09.24

Trac 0.11 rc1 -> Trac0.11.1へのアップデート

 あるところで使用しているTracが0.11-rc1(shuwa-ja)のままだったので、0.11.1-ja1に更新しました。

 ・・・どのページを開こうとしても、UnicodeDecodeError(だったと思う)が発生(汗)。0.11.1-ja1で新規に作成したプロジェクトは問題なく表示できることから、0.11-rc1で作成したデータベース(あるいは設定ファイル)に原因があると推測。

・試しに、Trac0.11.1で作成したiniファイルに変更して見ると問題なく動作する
  ⇒iniファイルに問題があると判断

ってことで、2つのiniファイルを見比べてみると・・・かなり項目が増えていますね。で、その中で処理を行うクラスを定義している(と思われる)ものもあったので、それが原因かと。Trac0.11.1で作成したiniファイルに対して、従来使用していたiniファイルの内容をコピーして完成させたiniファイルを使用すると、問題なく動作するようになりました。

#Unicodeのエラーが出ていたのは、Trac-0.11.1.ja1でエラー発生時にエラー(?)あたりが関連しているのかも知れません。

| | Comments (0) | TrackBack (0)

2008.09.23

Trac Plugin - IRequestFilter

 IRequestFilterを用いると、既存のリクエストをフックして処理を割り込ませることが可能となります(例:BatchModifyPluginにおけるチケット一括更新処理)。

 シンプルな例としては、


def pre_process_request(self, req, handler):
    if req.method=='GET' and req.args.get('HogeParam'):
        self._hoge(req)
    return handler

のような感じでしょうか。

 GETリクエストにおいて、リクエストパラメータ中にHogeParamというキーが存在した場合、自身のクラス(プラグイン)の_hoge関数を呼び出すことができます。

Continue reading "Trac Plugin - IRequestFilter"

| | Comments (0) | TrackBack (0)

2008.09.22

医療制度

 厚労大臣の先週末の発言で、次の選挙でどこが政権を取っても後期高齢者医療制度は大幅に変更されることになりそうな感じですね。

 負担について世代間の反目を助長する仕組みにしないということだそうですが、果たして、そんなことが可能なんでしょうか。
 もちろん、国の財源が有り余っていれば可能だとは思いますが、保険料を前提とした場合は・・・? 行政のいろんな無駄を省くことで、それを充分にまかなって余るだけのお金が出てきたりするんでしょうか(苦笑)。

#一応毎回投票には行っていますが・・・。

| | Comments (0) | TrackBack (0)

2008.09.21

ログインユーザに関するTicket一覧

 「チケットを見る」をクリックした場合に表示されるリストにおいては$USERがログインユーザ名に自動的に置き換えられます。しかし、queryリンクの場合は反応してくれません・・・(TicketQueryマクロの場合は0.11以降は$USERは反応します)。

 URLパラメータなしでqueryを呼び出した場合&TicketQueryマクロの場合と、queryリンクの場合の違いを見るため、とりあえず、ticket/query.pyのソースを確認。
 URLパラメータなしでqueryを呼び出した時は、

if user:
    qstring = qstring.replace('$USER', user)
constraints = Query.from_string(self.env, qstring).constraints

という感じで、明示的に文字列置換を行ってからQueryの再構築を行っているようです。TicketQueryマクロの場合は・・・辿っていくと、get_sql(self, req=None, cached_ids=None):関数のところですかね。SQL文を構築するタイミングで置き換えているような感じです。

 TicketQueryマクロはそれはそれで便利なのですが、表示対象件数が多くなってきた時に改ページ機能がない(maxを指定しなければ全件が表示されますが、やはり、queryページのように指定した件数単位での表示にしたいところ)というのがネック。

Continue reading "ログインユーザに関するTicket一覧"

| | Comments (0) | TrackBack (0)

2008.09.20

XML-RPC Pluginで関数を追加する

 Trac XML-RPC Pluginに関数を追加してみました。あまりカスタマイズしすぎると本家がバージョンアップした時が大変なので、個人的にはできれば避けたいところではあるのですが・・・。

 例えば、tracrpc/ticket.pyで各種(RPC用の)関数を定義しているところに、


yield ('TICKET_VIEW', ((dict, str),), self.getHogehoge)

と記述すると、

・実行にはTICKET_VIEW権限が必要である
・引数はString型1つのみである
・関数名はgetHogehogeである
・戻り値は、Structure(PythonではDictionary、JavaではMap)である

という関数が追加されます。

Continue reading "XML-RPC Pluginで関数を追加する"

| | Comments (0) | TrackBack (0)

2008.09.19

XML-RPC Pluginでチケット作成日時を指定する

 Trac以外で管理している修正依頼等をXML-RPC Pluginで取り込む場合、そのままの状態だとチケットの作成日時はXML-RPCで実際に取り込んだ日時になってしまいます。ただ、場合によっては、初期の作成日時(Trac以外で管理している際の作成日時)で取り込みたいというような場合も。

 Tracで定義されているクラスの関数(ticket/model.py ファイル内の insert)を見てみると、引数にwhen=Noneと定義されており、それがセットされている場合はその日時を用いてチケットを作成するようになっているようです。ってことは、その値をセットしてあげることができれば、好きな作成日時のチケットを作成することができるようになるはず・・・。
 ってことで、XML-RPC Pluginの r3074 のソースを元に手を加えてみました。

Continue reading "XML-RPC Pluginでチケット作成日時を指定する"

| | Comments (0) | TrackBack (0)

2008.09.18

workflowの図化における日本語

 TracのTicket WorkflowをPDFに変換 では日本語が含まれていると、スクリプトの処理のところでエラーが出ていました。で、久しぶりに調べてみると・・・http://trac.edgewall.org/ticket/6930の内容を適用することで、とりあえずエラーは出なくなりました。
 ただ、pngで出力したものは問題なく日本語が出力されていますが、pdfに変換したものは見事に(?)日本語の部分が化けてしまっています・・・。
 まぁ、pngの状態でもとりあえずは事足りるといえば事足りますが(^^;

Continue reading "workflowの図化における日本語"

| | Comments (0) | TrackBack (0)

2008.09.17

PERMISSIONの付与

 Tracでは、PERMISSIONの付与を行う権限がありますが、他人に付与可能な権限は、『自分が有している権限』に限定されるんですね。

 まぁ、そうでなければ、自分自身にTRAC_ADMINなどを割り当ててしまうことができてしまい、実質PERMISSION_GRANTとTRAC_ADMINとが同格になってしまいますからねぇ(^^;

| | Comments (0) | TrackBack (0)

2008.09.13

SSLクライアント証明書が必要なサイトへのXML-RPC

Tracに対してXML RPCで接続すると結構いろいろなことができるようになります。で、接続先をSSLクライアント証明書で保護しているような場合の接続方法に関するメモ(使用するのはApache XML-RPC)。

まずは普通にXmlRpcClientを初期化。

XmlRpcClient client = new XmlRpcClient();
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setBasicUserName("username");
config.setBasicPassword("password");
config.setServerURL(new URL("https://hostname/trac/test/login/xmlrpc"));
client.setConfig(config);

Continue reading "SSLクライアント証明書が必要なサイトへのXML-RPC"

| | Comments (0) | TrackBack (0)

2008.09.11

BatchModifyPlugin(2)

BatchModifyPluginの補足。

現在のバージョンでは、

・カスタマイズしたワークフローに関しては、選択はできるものの、想定している遷移パターンには対応していないようです。なので、通常のチケット更新からでは遷移できないステータスへも変更できてしまいます。

・ステータスとresolutionとは連動していません。従って、assignedのままfixedとしたり、resolutionなしのclosedとしたりすることもできてしまいます。

という点に注意が必要かも知れません。

なお、後者は、「暫定処置」ならソースを直接修正することで比較的容易に対応できますが、前者は・・・それなりに大変な気が。

Continue reading "BatchModifyPlugin(2)"

| | Comments (0) | TrackBack (0)

2008.09.10

WebDAVを用いてファイル共有

 かなり以前にSubversionを使用しないシンプルなWebDAV(on Apache)をやってみましたが、それをCentOS(5.0)上でやってみました。

 必要となるモジュールはほとんどデフォルトで入っていました(もしかしたら、Trac/Subversionなどの環境構築中に一緒にインストールされたのかも知れませんが)。
 とりあえずは、DAVLockDBを定義し、データを格納するフォルダに対するLocationディレクティブなどでDAV onを定義すればOK(Options Indexesが指定されていない場合、それの追加も必要ですが)。

 以外と盲点なのが、データを格納するフォルダのPermissionの設定かも?(っていうか、僕だけか(^^; ) Apacheを起動しているユーザに対して書き込み権限を与えておく必要があります。

chown apache:apache data

Continue reading "WebDAVを用いてファイル共有"

| | Comments (0) | TrackBack (0)

2008.09.09

AjaXplorer

AjaXplorer
オンラインストレージサービスのような感じのものを自前のサーバで構築するためのWebアプリケーションといったところでしょうか。

phpが動くようになっていれば、インストールそのものはサクッと完了します。手元のCentOSの場合、そもそもphpをインストールしていなかったので、まずはyum install phpでインストール。
1.AjaXplorer 2.3.5のアーカイブをダウンロードして展開。
2./var/www/html/ajaxplorerとしてコピー。
3.chownでajaxplorerのフォルダの所有者を(サブフォルダも含めて)apacheに。
とりあえず、上記3点を行えば使えるようになります。外部サーバと組み合わせて使用したりする場合、server/conf/conf.phpファイルを編集する必要がありそうですが、単体で使用する場合はデフォルトのままでもOKのようです。

なお、.htaccessでアクセス制限を行っているため、Apacheの設定でAllowOverride noneなんてしていると、予期せぬファイルが閲覧されたりするので注意が必要。

Webで調べてみると、認証機能がないといった話がありましたが、2.3.5ではユーザ管理が行えるようになっているようです。残念ながら、更新履歴が見つからなかったので、いつの時点で機能が追加されたのかまではわかりませんでしたが・・・。

気になった点としては、serverフォルダにおいては何故か.htaccessでのアクセス制御が行われていないんですよね・・・(とりあえず.htaccessを追加してみました・・・が、もしかしたら、これが原因でどこか動かない機能が出てきたりするのかも知れません)。

Continue reading "AjaXplorer"

| | Comments (5) | TrackBack (0)

2008.09.08

virtuozzoのリソースの取り扱い

 実際に割り当てられているメモリとは別に、コンテナのリソース制限値というものがあるんですね。特に、kmemsizeの閾値が小さいと、気付けば制限値に達してしまって、いろんなサービスを提供するのはなかなか厳しそうです(特にTomcat等)。まぁ、今回はコンテナ上でTomcatを使用する予定はないので特に問題とはなりませんが。でも、freeなどではまだまだ空きメモリがあるのを見ると少し悔しい感じではありますが(笑)。

 VPS(Virtuozzo) リソース消費量モニタリング - LinuxVirtuozzo系VPSにおけるメモリの節約方法などが参考になります。

| | Comments (0) | TrackBack (0)

2008.09.07

global name 'log' is not defined

 Subversion1.5がインストールされている環境で、setuptools 0.6c8以下を用いてTracのプラグイン等をインストールしようとしたときに発生するエラー。原因としては、Subversion1.4と1.5とでWorkingCopyの仕様が変更されたのですが、setuptoolsがそれに対応していないため。

 で、解決方法としては、
1.[PEAK] problem in setuptools "NameError: global name 'log' is not defined"で記載されているように開発版を用いる。
2.Subversion 1.4互換形式のWorkingCopyにする。
3.svn checkoutではなく、svn exportで取得したファイルを用いて処理する。
のパターンがあります。

Continue reading "global name 'log' is not defined"

| | Comments (0) | TrackBack (1)

2008.09.06

AccountManagerPlugin

今更ではありますが、AccountManagerPlugin。普段は、ApacheのBasic認証で、認証情報に関するメンテナンスは手製ツールで行えるようにしているのですが、Tracと一体型にした方が何かと便利と思われるので(^^;

その際のメモなどなど(r3857 を使用)。

Continue reading "AccountManagerPlugin"

| | Comments (2) | TrackBack (0)

2008.09.05

Trac入門

Trac入門――ソフトウェア開発・プロジェクト管理活用ガイド

著者のうち2人は同い年なんですね(^^;

発売日まで約2週間。おそらく、購入することでしょう。

| | Comments (0) | TrackBack (0)

2008.09.04

GridModifyPlugin

GridModifyPluginは、BatchModifyPluginと同様に、多数のチケットのステータスをまとめて変更する場合に有用となるプラグインだと思います。

BatchModifyPluginと異なり、クエリ結果の一覧に多数のコンボボックスが表示され、その内容を切り替えたタイミングで自動的に更新される(ajaxで処理が行われている)という動きとなります・・・が、その性質上、フィールドの種類がselectであるものしか処理対象となりません。従って、ステータスや、reporter等は編集対象外となるため、結果としてはBatchModifyPluginの方が使い勝手がいいのかなぁ、と思ったりも。

あと、あるチケットの複数の属性を変更したい場合、属性毎に履歴が作成されるのも好みの分かれるところかも知れません(僕自身は、あるタイミングで変更した内容は1つの履歴にまとまって欲しいと感じる方なので)。

なお、属性を変更した場合、自動的にupdated by gridmod pluginというコメントが追記されるようになっています。

Continue reading "GridModifyPlugin"

| | Comments (0) | TrackBack (0)

2008.09.03

BatchModifyPlugin

BatchModifyPlugin

多数のチケットのステータスを一括して変更する必要があるような場合、1件ずつ開いて更新していくのはかなり面倒・・・(一括変更が発生するかどうかはチケットの運用スタイルにもよると思いますが)。そんなときは、BatchModifyPluginでサクッと処理。

普通にソースを取得してインストールし、プラグインを有効にし、ユーザに然るべき権限を与えるだけでクエリの画面から選択したチケットのステータスを一括して変更することが可能となります。

Continue reading "BatchModifyPlugin"

| | Comments (0) | TrackBack (1)

2008.09.02

Tracの通知メールを編集

参考:tracの通知メールをカスタマイズしてみる にも書かれていますが、通知メールのカスタマイズって、あまり見あたらないっぽいんですよね・・・。まぁ、多くの場合はデフォルトのままでもさほど困らないのかも知れませんが。

今回の目的は、通知メールの内容をシンプルにすること。PC宛に送信するのなら今のままでも問題ないのですが、携帯宛にも通知する場合、段組(?)の部分がかなり見にくくなってしまうので。
本来ならメールアドレス毎にメールのテンプレートを切り替えることができればいいんでしょうけど、さすがにそこまでPythonの知識があるわけではないので、ざっくりと書き換え。PCに送信した場合でも、それなりに内容がわかるから問題ないでしょう、ってことで(笑

Continue reading "Tracの通知メールを編集"

| | Comments (0) | TrackBack (0)

2008.09.01

Trac:通知メール送信の条件を追加

Tracでnotificationを有効にすると、チケットの内容に何らかの変更が発生する度にメールが送信されることになります。が、それだと『メールが飛び交いすぎる』ということになる場合も。

ってことで、例えば『メール送信を行う』というチェックボックスをチケット入力画面に追加し、そこにチェックがついている場合のみメールを送信するというようなことにする場合。

ticket/web_ui.pyの_do_create(チケット作成時)および_do_save(チケット更新時)のtn = TicketNotifyEmailの処理を行うところに

if 'sendmail' in req.args:
といった条件文を追加すればOK(sendmailはチェックボックスのパラメータ名)。
_do_saveの場合、チケットの変更点がないとメールは送信されませんが、『送信し忘れた』というような場合に後付で送信できるようにする場合は、
if ticket.save_changes (get_reporter_id(req, 'author'),~
のifブロック(変更点がありDBを更新した場合にtrue/DBを更新しなかった(する必要がなかった)場合はfalse)に対してelse節を追加し、そこにメール送信を行う処理を記述。なお、else節においては、modtime=nowの部分をmodtime=ticket.time_changedとすると、最後に変更された内容を用いてメールを構築します。

#html側は、ticket/template/ticket.htmlに

<input type="checkbox" id="sendmail" name="sendmail" value="1" /><label for="sendmail">メール送信</label>
といった感じで追加すればOK。

| | Comments (7) | TrackBack (0)

« August 2008 | Main | October 2008 »