2015/01/18 に Trac 1.0.3, 1.1.3 がリリースされました。0.12.7 のリリースは修正がほとんどないため 1.0.4 と合わせて 2015/03/02 にリリースされることになりました。

ダウンロードは trac.edgewall.org/wiki/TracDownloadpypi.python.org/pypi/Trac からできるようになっています。

リリースノートに上げられている主要な変更の日本語訳をここに載せておきます。

Trac 1.0.3 Released

Trac 1.0.2 は2014年10月にリリースされ、その後、40のバグフィックスと改善を行いました。

このリリースの主要なものです。

  • チケットに添付を追加した際に通知が送られるようになりました (#2259)
  • 自動プレビュー時にスタイルシートとスクリプトが読み込まれるようになりました。それにより、自動プレビュー上で Wiki プロセッサが追加された場合に正しくハイライトされ (#10470)、ワークフローグラフが表示されるようになっています (#10674)
  • マージチェンジセットが最初の親チェンジセットとの差分を表示するようになりました (#10740)
  • Pygments 2.0 をサポートしました (#11796)
  • initenv TracAdmin コマンド後での補完処理のエラーを修正しました (#11797)
  • Environment.get_known_users をキャッシュすることで、認証済みユーザが1,000を超えるようなシステムでのパフォーマンスを向上させました (#11868)
  • wheel パッケージによる配布メタデータをサポートし、About ページで表示されるようになりました (#11877)

1.0.3 の詳細なリリースノートは以下のページにあります。

Trac 1.1.3 Released

このリリースの主要なものです。

  • チケットワークフローの作成時のステータスを設定できるようになり、チケット登録ページにアクションが表示されるようになりました (#2045)
  • プラグインで拡張可能な新しい通知システムが導入されました (#3517)
  • 通知システムに対する個人設定パネルが追加になりました (#4056)
  • Wiki ページの各バージョンに対するコメントが WIKI_ADMIN 権限にて変更可能になりました (#6573)
  • チケットフォームの「コメント追加」セクションと「変更者」フィールドの配置を改善しました (#10207)
  • Wiki ページの削除時に添付ファイルも削除になる場合、警告を出すようになりました (#11542)
  • SilverCity、Enscript、PhpRenderer によりシンタックスハイライトのサポートを削除しました (#11795)
  • 個人設定にある「日付と時間」パネルと「言語」パネルを「ローカライズ」バネルに統合しました (#11813)
  • ワークフローの set_owner 属性でグループと権限が使えるようになりました (#11839)

ここにあげたものに加えて、1.0.3 に対する修正を含んでいます。

詳細なリリースノートは以下にあります。

Apache のモニタリングと言えば mod_status を有効にして /server-status?auto にアクセスする方法が一般的にだと思います。

これは簡単でよいのですが MaxClients いっぱいまでリクエストが入ってこれ以上リクエストを受け付けられないような状態になると /server-status?auto にアクセスできずにモニタリングそのものができなくなります。(そもそもそういう状況を作ってはならないのですが、まあそれはとりあえず。)

server-status 用にワーカーを1つ予約できれば簡単なのですが、そういう設定は Apache にはないようです。もう少し探していると ScoreBoardFile という設定があることに気づきました。この設定にファイルを指定すれば、他のプロセスから統計情報にアクセスできるようです。

実際に FableTech Server Status for Apache というものがあり、これを使えば統計情報の内容を出力してくれます。ただ、これは C 言語で書かれて出力はもう少し加工したいので Python でアクセスするスクリプトを書いてみました。

https://github.com/jun66j5/apache-scoreboard/raw/master/apache-scoreboard.py

Apache の統計情報には ScoreBoardFile に指定したファイ名を apr_shm_attach() に渡すことで共有メモリにアクセスできます。このあたりは ctypes ライブラリを用いています。

スクリプトを試す前に以下のような設定を行いましょう。

LoadModule status_module modules/mod_status.so
ExtendedStatus On
ScoreBoardFile run/httpd.scoreboard

実際に試してみます。このスクリプトでは /server-status?auto と同じ出力が得られるようにしてあります。

$ sudo python ./apache-scoreboard.py /etc/httpd/run/httpd.scoreboard
Total Accesses: 2147
Total kBytes: 17961
Uptime: 5641
ReqPerSec: 0.380555
BytesPerSec: 3260.07
BytesPerReq: 8566
BusyWorkers: 0
IdleWorkers: 50
Scoreboard: ................................................................_________________________......................................................................................................._________________________.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

比較用に /server-status?auto の出力も上げておきます。

$ curl 'http://127.0.0.1/server-status?auto'
Total Accesses: 2148
Total kBytes: 17970
CPULoad: .0266784
Uptime: 5660
ReqPerSec: .379505
BytesPerSec: 3251.11
BytesPerReq: 8566.7
BusyWorkers: 1
IdleWorkers: 49
Scoreboard: ................................................................__W______________________......................................................................................................._________________________.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

もっと細かい出力や監視サーバにデータを投げたい場合などは show_scoreboard() を変更するとよいです。

Posted in dev.

おおまえです。Trac 日本語版 (trac-ja) の 0.12.6, 1.0.2 相当のものを作成しましたので以下のリポジトリで公開することにしました。

https://github.com/jun66j5/trac-ja

これまでインタアクトさんが Trac-ja を公開されていたのですが、最近は 0.12.4 1.0 以降そのままでしたので、公開されている最新のもの Trac-0.12.4.ja1, Trac-1.0.ja1をベースに Trac 本体の 0.12.4 以降 0.12.6 まで、1.0 以降 1.0.2 までの修正内容をマージする形で作成しました。

ダウンロードは以下の URL からできます。

インストールは以下のように pip または easy_install を使ってインストールすることができます。

$ pip uninstall Trac  # すでにインストールしている場合
$ pip install https://github.com/jun66j5/trac-ja/archive/trac-0.12.6ja0.1.zip
$ easy_install https://github.com/jun66j5/trac-ja/archive/trac-0.12.6ja0.1.zip

このソースで何か問題を発見した場合は https://github.com/jun66j5/trac-ja/issues/new までお願いします。

おおまえです。先日 2014-10-26 に Trac 0.12.6, 1.0.2, 1.1.2 がリリースされました。ダウンロードは http://trac.edgewall.org/wiki/TracDownloadpypi.python.org/pypi/Trac からできるようになっています。

個々のリリースで 0.12.6 56チケット1.0.2 182チケット1.1.2 42チケットがクローズされました。以前までのリリースに比べて 1.0.2 のチケット数がかなり多いのですが、主に活動するコミッタがどんなに小さいものでもチケット登録する…というが大きい気がします。

それはさておき、リリースノートに記載されている主要な変更に上げられている部分の日本語訳をここに載せます。また、このリリースでバグを見つけたり改善案などがあれば、http://trac.edgewall.org/メーリングリスト などに報告いただけると大変ありがたいです。


Trac 0.12.6 Released

Trac 0.12.6 は、56チケットに対する修正を含んでいます。以下が主要なものです。

  • Subversion での注釈履歴 (svn blame) が以下の場合に失敗:
    URL エンコード文字がある場合 (#10386)、
    Windows でリポジトリパスのドライブレターを小文字にしている場合 (#10514)、
    Subversion 1.7 でパスに ASCII 以外の文字がある場合 (#11167)
  • svn:mergeinfo 属性に対する browser ページ (#8459) と changeset ページ (#11219) での表示パフォーマンスを改善
  • 大量のカスタムフィールドがあるとカスタムクエリが失敗 (#11140)
  • Zip ファイルのタイムスタンプにタイムゾーン情報がなかった (#11162)
  • TracLinks の log リンクがリビジョンの範囲指定によってはエラーや間違う (#11308, #11346)
  • IE 11 でチケットページでの textarea 中のテキストが正常に折り返されない (#11376)
  • チケットの CSV ダウンロードで担当者フィールドにあるメールアドレスがそのままになる (#11594)
  • Distribute 0.6.29 以降でロケールデータが egg ファイルに含まれない (#11640)
  • マイルストーン削除時に添付ファイルが削除されない (#11672)
  • Babel 1.0 以降のサポートを追加 (#11258, #11345)
  • ConfigObj 5.0 以降のサポートを追加 (#11498)

チケットの詳細は以下にあります。


Trac 1.0.2 Released

Trac 1.0.1 を2013年2月にリリースし、その後、200以上の修正と小さな改善を行いました。

このリリースの主要なものです:

  • Subversion でのキーワード展開と改行コードの置換をリポジトリブラウザでのファイルの参照時とダウンロード時に行うようになりました (#717)
  • チケット通知メールを変更前の担当者、Cc にも送信 (#2311)
  • マイルストーンの名前変更、削除、別マイルストーンへの変更時に、チケットの変更履歴を更新 (#4582, #5658)
  • Authz permissions policy に対して多くの修正を行いました:
    リポジトリブラウザ (#10961, #11646)、Wiki ページ (#8976, #11067)、管理ページ (#11069)、レポートページ (#11176)
  • 二重にフォームを submit できないようになりました (#10138)
  • permission_policies のどれかがロードできない場合に ConfigurationError を上げるようになりました。また、その際にシステム内部の情報やインストールのエラーを漏らさないようにしました (#10285)
  • Wiki ツールバーを設定で無効にできるようになりました (#10837)
  • 管理ページの見出し部分にテーブル中のエントリ数を表示 (#11027)
  • すべてのページで「取り消し」ボタンを一貫性があるように配置 (#11076)
  • 変更ページの表示時に、テキスト要素にフォーカスを移すようにしました (#11084)
  • 並べて編集モードの際に、「編集の衝突」と「マージ」の警告メッセージが常に見えるようにしました (#11102)
  • レポートページ (#11106, #11664) とチケットページ (#11471) のレイアウトを改善
  • Genshi 0.7 に対する互換性 (#11218)
  • Git リポジトリのサポートに対する多くの修正

このリリースは 0.12.6 に対する修正を含んでいます。チケットの詳細は以下にあります。


Trac 1.1.2 Released

主要な変更:

  • Python 2.5 サポートを削除しました。Python 2.5 に対して互換性のない変更がなされ Trac は Python 2.5 では動作しないようになりました (#11600)
  • チケットワークフローに may_set_owner アクションが追加されました。set_owner に似ていますが、担当者を現在のユーザではなくデフォルトの担当者にします (#10018)
  • [ticket] optional_fields オプションが追加されました。任意入力にしたいドロップダウン (セレクト型) のフィールドを指定します。(値を空にできるようになります) (#10772)
  • WikiProcessor コードブロックで行番号の表示とハイライトできるようになりました (#10834)
  • 「デフォルトハンドラ」を個人設定で設定できるようになり、全ユーザのデフォルトを管理ページの「基本設定」で設定できるようになりました (#11519)
  • 読み込み専用の Wiki ページには、ファイル添付できないようになりました (#11244)
  • 管理ページのテーブルに「全選択」チェックボックスを追加 (#10994)
  • 項目が選択する必要がある場合には、submit ボタンを無効にするようにしました (#11056)
  • 管理ページの権限にユーザやグループ間で権限をコピーするフォームを追加しました (#11099)
  • [milestone] default_retarget_to オプションが追加になりました。このオプションは、マイルストーンの削除や完了時に変更先のマイルストーンを指定することができます。また、マイルストーン管理ページからでも設定することができます (#10010)
  • マイルストーンにチケットがない場合には、マイルストーンを再割当てするドロップダウンを表示しないようになりました (#11366)
  • 「デフォルトをクリア」ボタンで管理ページからチケットシステムのデフォルト値をクリアできるようになりました (例えば default_milestone, default_version) (#10772, #11300)
  • TitleIndex マクロは Wiki ページで使用された場合に、相対パスのプレフィックスをサポートするようになりました (#11455)
  • CommitTicketUpdater は #comment:N#comment:description もチケットの参照として解釈するようになります (#11622)
  • マイルストーン管理ページにあるチケットカラムにクエリリンクが用意されるようになりました。そのリンクからは、そのマイルストーンを持つチケットをステータスでグループ化してクエリが実行されます (#11661)
  • Authz policy はレポート一覧ページに対してリソースID -1 を使ってアクセス制限を行うようになります (#11697)

ここにあげたものに加えて、1.0.2 と 0.12.6 に対する修正を含んでいます。

詳細なリリースノートは以下にあります。


おおまえです。

以前に「チケットフィールドのグループ化とチケットフィールドをカスタマイズする」という記事で紹介した機能ですが、この機能を誰でも利用できるように Trac プラグインにして trac-hacks.org に登録しました。

» TracTicketFieldsLayoutPlugin – Trac Hacks – Plugins Macros etc.

Trac 0.12 以降 (TracLightning 含む) であれば機能するように、また、既存の DateFieldPlugin のようなチケットの項目を拡張するようなプラグインに干渉しないように実装しています。

機能の詳細などは、↑の記事でご確認ください。

newticket ticket admin

開発初期から公開前提で作っていましたが、公開しようとしていたらしばらく trac-hacks.org に新しいプラグインが登録できない状態になっていたり…で気づいたらかなり時間が経ってしまいました。

バグやアイデアなどあれば @tracpathtrac-hacks.org のチケットなどで教えてもらえるとありがたいです。

おおまえです。今日は雪がよく降りますね。また大雪らしいです。前の大雪では傘を持ちながらこけて傘の骨を少し曲げてしまいました。今回は気をつけたいところです。

さて Python で Excel ファイルを作成する際に使うライブラリとして xlwt (*.xls) と openpyxl (*.xlsx) が知られていると思います。

ここで xlwt ライブラリ使う際には注意しなければいけないことが1つあります。それは大量の行/セルを設定する場合は、適当なタイミング(1000行ごとに一回とか)で Worksheet.flush_row_data() を呼んでメモリ上のデータをファイルに書き出すようにすることです。

設定されるデータ量が決まっている場合はよいですが、予測できない場合はこれをやっておかないと大量のメモリを消費させられてひどい目に遭います。(というか遭いました)

このメソッドは http://www.python-excel.org/ から辿れる xlwt document のページには見当たりませんが、The Tutorial python-excel.pdf の Page.21 には以下にような記載にて注意がなされています。

If a large number of rows have been written to a Worksheet and memory usage is becoming a problem, the flush_row_data method may be called on the Worksheet. Once called, any rows flushed cannot be accessed or modified.

It is recommended that flush_row_datais called for every 1000 or so rows of a normal size that are written to an xlwt.Workbook. If the rows are huge, that number should be reduced.

そういうことで xlwt を使っている ExcelDownloadPlugin でその状況になってしまいましたので http://trac-hacks.org/changeset/13423 にて修正しています。同じ問題に遭遇したひとはプラグインを更新してみてください。

おおまえです。ふたたび IE11 の話です。タイトルの結論は一番最後にあります。

Internet Explorer 11 がリリースされてしばらく経ち、少しずつ IE11 からアクセスされるようになってきました。Compatibility changes in IE11 (Windows) を見ると User-Agent 文字列の変更はともかくとして IE 独自の API を排除し、いまどきのブラウザが持つような標準に沿った API をちゃんと実装してきている…ようです。

モダンブラウザ用のコードでそのまま動くのを期待していいよね…? と思いたいところですが TracWysiwygPlugin で実際に試してみると、他のブラウザには普通ある API がなくてこの機能が動かないよ…? とかあるわけです。TracWysiwygPlugin IE11 対応を行った際に気づいた点を上げてみました。

1. document.execCommmand(‘inserthtml’) が使えない

WYSIWYG エディタ機能を持つライブラリは、この document.execCommand を用いて色々な文字装飾や任意の HTML を追加したりします。ボールドや斜体などは定義済みのコマンドがあり、第1引数に "bold", "italic" を渡すと選択文字列がコマンドに応じた処理を行ってくれます。また、定義済みのコマンドにないような機能は基本的に "inserthtml" コマンドを用いて必要な HTML を追加します。

しかし IE にはこの inserthtml がありません。IE11 でもありません。他のブラウザにはあるんですが…。また、よくないことに処理しできないコマンドを document.execCommand に渡しても例外などは上げてこないため「エラーになったから代替用のメソッドを…」みたいなことができません。

2. document.selection.createRange ができない

inserthtml の代替手段が document.selection.createRange から TextRange を作成し pasteHTML を呼び出す方法です。これにより inserthtml とほぼ同等のことが実現できます。こんなふうになっています。

TracWysiwyg.prototype._msieInsertHTML = function(html) {
    this.contentWindow.focus();
    var selection = this.contentDocument.selection;
    var range = selection.createRange();
    range.pasteHTML(html.replace(/\t/g, "	"));
    range.collapse(false);
    range.select();
};

しかし IE11 では document.selection がなくなり window.getSelection を使えとあるのですが、このオブジェクトには pasteHTML メソッドがありません。

仕方がないので、以下のようにして Range.createContextualFragmentRange.insertNode を用いて実装するようにしています。もともとこのコードは inserthtml を持たない Safari 2 のために書いたコードです。(消さなくてよかった…)

TracWysiwyg.prototype._fragmentInsertHTML = function(html) {
    var range = this.getNativeSelectionRange();
    if (range) {
        var d = this.contentDocument;
        var tmp = d.createRange();
        tmp.setStart(d.body, 0);
        tmp.setEnd(d.body, 0);
        var fragment = tmp.createContextualFragment(html);
        range.deleteContents();
        range.insertNode(fragment);
        range.detach();
        tmp.detach();
    }
};

3. Selection.containsNode がない

このメソッドは選択領域が指定の要素を内包しているかどうかの判定をしてくれるメソッドです。これが他のブラウザにはあるんですが IE11 にはありません。仕方ないので、これは Range.compareBoundaryPoints を使って、Range オブジェクトと対象の要素の前後関係を順番に調べるというような処理に書き換えました。


ということで、ここまでを踏まえれば User-Agent を見ないで「IE11 判定できそう」と思ったので書いてみました。

    if (!window.TextRange) {
         alert('non IE browser');
    }
    else if (!window.getSelection) {
        alert('IE 8 or early');
    }
    else if (!document.selection) {
        alert('IE 11');
    }
    else {
        alert('IE 9 or 10');
    }

実際にこのコードそのものを使っているわけではないので、何か抜けがあるような気がします。

Internet Explorer 11 で Trac のチケット作成フォームにある textarea の中身が折り返されないようになっている、という内容が2週間ほど前に trac-dev メーリングリストに投稿がありました。確認してみると確かに折り返されません。(Trac 0.12, 1.0 も同様)

IE11

どうも IE11 は以下のような HTML があるときに textarea が上位の要素にある white-space を参照するようです。IE10 以前や他のブラウザはこのような挙動になりません。

<div style="whtie-space:nowrap">
  <div>
    <textarea></textarea>
  </div>
</div>

とりあえずの対処として trac/htdocs/css/ticket.css に以下のパッチを当てると解消できます。

diff --git a/trac/htdocs/css/ticket.css b/trac/htdocs/css/ticket.css
index 7e18e20..5f873c1 100644
--- a/trac/htdocs/css/ticket.css
+++ b/trac/htdocs/css/ticket.css
@@ -214,6 +214,7 @@ form .field div.trac-resizable { width: 100% }

 #propertyform { margin-bottom: 2em; }
 #properties { white-space: nowrap; line-height: 160%; padding: .5em }
+#properties textarea { white-space: pre-wrap }
 #properties table { border-spacing: 0; width: 100%; padding: 0 .5em }
 #properties table th {
  padding: .4em;

IE11 (パッチ後)

もし、この対処で何か問題を見つけた場合、http://trac.edgewall.org/ticket/11376 まで報告、もしくはここにコメントをしてもらえるとありがたいです。

おおまえです。梅雨真っ只中じめじめして暑いので、片付けていたサーキュレーターを出しました。

さて、開催自体がかなりひさびさなのですが、先週金曜6月14日に Shibuya.trac第14回勉強会が開催されました。これに参加して簡単な発表をしてきました。↓がそのときのスライドです。Trac ベースの Apache Bloodhound と Trac のここ最近のことについてです。

勉強会に参加するのはひさしぶりですが、また何かの機会に参加したいですね。

おおまえです。いつのまにか梅雨に入っていてすぐに夏なんだなぁ…陽射しは強いし暑いのは好きじゃないんです。(ぐったり……)

さて、なんか唐突な感じですが、今回は Trac からのチケット通知メールを HTML メールで送れるようにするプラグインを作ったので、それを紹介しようと思います。

Trac からのチケット通知メールは、固定幅フォント前提でカラムが76に入るように折り返しを行ってメールを作成してくるので、カスタムフィールドのラベルが長かったりすると、見辛い感じになってしまいます。

そこで、これを HTML メールとして作成できれば、固定幅フォントや76カラムの制約に拘らず比較的自由にレイアウトできるようになります。

インストール手順

1. easy_install でインストール

easy_install でインストールできます。

C:>easy_install -ZU http://trac-hacks.org/svn/trachtmlnotificationplugin/0.12
Downloading http://trac-hacks.org/svn/trachtmlnotificationplugin/0.12
Doing subversion checkout from http://trac-hacks.org/svn/trachtmlnotificationplugin/0.12 to c:\docume~1\admini~1.ope\locals~1\temp\easy_install-gjfkwq\0.12
Processing 0.12
Running setup.py -q bdist_egg --dist-dir c:\docume~1\admini~1.ope\locals~1\temp\easy_install-gjfkwq\0.12\egg-dist-tmp-mlpzpt
zip_safe flag not set; analyzing archive contents...
trachtmlnotificationplugin 0.12.0.1 is already the active version in easy-install.pth

Installed c:\traclight\python\lib\site-packages\trachtmlnotificationplugin-0.12.0.1-py2.6.egg
Processing dependencies for trachtmlnotificationplugin==0.12.0.1
Finished processing dependencies for trachtmlnotificationplugin==0.12.0.1

2. trac.ini でプラグインを有効にする

有効にしたい Trac プロジェクトの conf/trac.ini か inherit-file で共有している trac.ini でこのプラグインを有効にします。

# trac.ini
[components]
trachtmlnotification.* = enabled

3. SmtpEmailSender の代わりに HtmlNotificationSmtpEmailSender を使うように設定する

この HtmlNotificationSmtpEmailSender が HTML メールを作成します。

# trac.ini
[notification]
email_sender = HtmlNotificationSmtpEmailSender

4. [trac] default_language を ja などにする

HTML 部分を作成する際に、この言語設定を使うので ja などに設定しておきます。

# trac.ini
[trac]
default_language = ja

この後、Trac を動作させている Web サーバを再起動させます。

チケットを作成したりコメントしたりする

チケットを作成するとこのような感じのメールになります。

コメントしたときにはこのような感じ。添付ファイルもリストされます。

このプラグインの仕組み

現状の Trac にはチケット通知時のメール作成を代替させるようなインターフェイスはありません。ですので、実現するには Trac を修正するしかないのですが、このプラグインでは IEmailSender というインターフェイスを使って実現しています。

IEmailSender はメールの送信手段を提供するためのインターフェイスで、SMTP と sendmail コマンドで送信するコンポーネントが Trac 自体に定義されています。このインターフェイスを実装するとメールの送信を行うものなので、メール全体 (message/rfc822) がそのまま取得することができます。

渡ってきたメール全体から X-Trac-Ticket-URL ヘッダを探してチケットの ID とコメント番号を取り出します。そこからチケットを改めて取得し HTML メールになる部分を構築し、代わりにメール送信を行う、という仕組みになっています。

ざっくりした説明ですが、こんな感じです。それでわ。