技術ネタというか

PHPとかJavascriptのネタをこっちに書き続けるのもどうかなーと思いまして。(そんなに書いてないけど、これからは書こうかと思って)
WordPressのマルチサイト機能を使って、もう一個ブログを作ってみました。

http://vctn2.sakura.ne.jp/wp/wpdev/

こちらで。

Greasemonkeyで半自動スクレイピング

ログイン認証後のサイトでスクレイピングをする必要があって。しかも結構Ajaxで動的にコンテンツを書きかえたりもしてるので、ちょっと難しいかなーなど思ってたのですが。
FireFoxでユーザー独自のスクリプトを実行するGreasemonkeyアドオン(実は今回初めて触った)
Firefoxでスクレイピングしたいページを表示させて、ユーザースクリプトの中のAjaxでデータを保存するURLに取得したい文字列をPOSTしてあげれば良いかなと。

で、ちょっと実験中なのですが、とりあえずサイトの文字列をPOSTして受ける所まではOKみたい。
Greasemonkeyってユーザースクリプトでサイトの表示を弄るためのモノかと思ってたのですが、結構色々なことに使えそうだなーとか。

XML(RSSとか)をjQueryでParseしてみる

ちょっと色々試してみました。基本的にはRSS2.0前提で。

その1: jQueryの$.Ajax()を使ってベタでやる

$.ajax({
  url: url,
  type: 'GET',
  dataType: 'xml',
  success: function(data){
    feed = $(data).find('item');
    for(var i=0; i<feed.lenth; i++){
      $("#content").append($(feed[i]).find('title').text() + '<br />');
    }
  }
});

…コレでも簡単だけど、個人的にはjQueryのfind()があんまり好きじゃないのと、ちょっと面倒な気がする。

その2: jFeedプラグイン

http://www.hovinne.com/blog/index.php/2007/07/15/132-jfeed-jquery-rss-atom-feed-parser-plugin
RSS1.0/RSS2.0/ATOMのFeedの取得のためのプラグインみたい。

$.getFeed({
  url: url,
  success: function(feed){
    $('#content').append('<h2>' + feed.title + '</h2>');
    items = '';
    for(var i=0; i<feed.items.length; i++){
      var item = feed.items[i];
      items += item.title + '<br />'
    }
    $('#main section').append(items);
  }
);

イイ感じだけどjFeedで取れる要素はchannelのtitle/link/description/language/updatedとitemのtitle/link/description/updated/id(?)のみで固定。item要素のauthorとかcategoryとかは無視されるみたい。(自動的に取ってくれれば良いのに)
それは、ちょっと、困る。

その3: jParseプラグイン

http://jparse.kylerush.net/
elementTagで指定した順番に jpet00, jpet01…って順番で output の中で出力形式決めて、指定した要素に突っ込んでくれます。

$("#content").jParse({
  ajaxOpts: {url: url},
  elementTag: ['title', 'link', 'description'],
  output: '<a href="jpet01">jpet00</a><br />'
});

おお、コレは楽で良いけど・・・channelの要素取るのどうすんだ??

その4: PHPでJSONにして$.getJSON()で受ける

他のドメインのXMLを取る場合どちらにせよProxy的な処理を挟むので、こんなPHP(proxy_parser.php)をローカルに書いて XML をそのまんま JSON に変換します。

$url = $_GET['url'];
$xmlobj = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA);
print(json_encode($obj));

で、jQuery.getJSONを使って取り出します。

$.getJSON('proxy_parser.php',{url: url}, function(data){
  $("#content").append('<h2>' + data.channel.title + '</h2>');
  var items = data.channel.item;
  for(var i=0; i<items.length; i++){
    $("#content").append(items[i].title + '<br />');
  }
});

何でもかんでもJSONで処理する人間としては、自由度も高いしこのやり方が楽で良いかなぁなんて思ってます。
このproxy_parser.phpもちょっと弄ればそのまま ExtJS に流し込めそうな気がする。

Google Calender Widgetプラグイン

を突っ込んで、GoogleCalendarで管理してる行きたいライブ をウィジェットにして右側に表示させてみました。

最初はGoogleCalendarのフィードのXMLをWordPress標準のRSSで取り込んで表示させよーと思ってたけど、上手くいかなかったので結局pluginにて。
ちなみにちょっと覚えたこと。公開してるGoogleCalendarのfeedは
http://www.google.com/calendar/feeds/{カレンダーのID}/public/basic
が基本的なURLで、feedの並び替えをする時とかはbasicの後ろに
?orderby=starttime (ソートキー、デフォルトだとlastmodified)
?ordersort=ascending (昇順降順)
?futureevents=true (現時点以降のみを表示するかどうか、デフォルトだとfalse)
みたいな感じで GETメソッドと同じようにくっつければ良いみたい。
GoogleDataAPI とかの呼出も基本的にはコレと同じオプションが有ったような。

http://code.google.com/apis/calendar/data/2.0/reference.html

Tracの複数プロジェクトまとめ(TraM)

CentOS5.4+Trac0.11.2.1.ja1 を使って、1サーバで複数のTracを運用しています。
svnのリポジトリは /var/svn/hoge1, /var/svn/hoge2 みたいな感じで
それぞれのsvnに対して /var/trac/hoge1, /var/trac/hoge2 とTracを設定しています。

んで、複数プロジェクトの進行をチェックするのがちょっと面倒なので、Tracの複数プロジェクトをまとめるのをやってみました。
ちょっと調べてみると、こちらのリポジトリからTraM0.3をチェックアウトできるみたい。

svn checkout http://svn.sourceforge.jp/svnroot/shibuya-trac/plugins/TraM/branches/genshi-ja
cd genshi-ja
python setup.py install

で、インストール。ここまでは問題なし(本当は別のサイト見て0.2をインストールしちゃったので、一回やり直した)
あとチェックアウトしたリポジトリに入ってた t7823-genshi_modpython-r8333-011.diff を tracのソースにパッチ当て。trac/web/__init__.py のパッチみたいなので、pythonのsite-packagesのtracのディレクトリに移動して

patch < t7823-genshi_modpython-r8333-011.diff

設定ですが、同じくRyuzeeさんの所を参考にして作業。

まとめ用のsvn(/var/svn/all)とまとめ用のtracを作成(/var/trac/all)

svnadmin create /var/svn/all
chown -R apache /var/svn/all
trac-admin /var/trac/all initenv (リポジトリは/var/svn/all を指定、他は適当)
chown -R apache /var/trac/all

まとめたいTracプロジェクトの /var/trac/hoge1/conf/trac.ini とかに

tramplugin.* = enabled

の記述を追加。

最後に httpd.conf の設定ですが、ココでハマりました。

Alias /trac/hoge1 "/var/www/cgi-bin/trac.cgi"
<Location /trac/hoge1>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv /var/trac/hoge1
</Location>
Alias /trac/hoge2 "/var/www/cgi-bin/trac.cgi"
<Location /trac/hoge2>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv /var/trac/hoge2
</Location>

こんな感じの設定にしておいて、複数Tracのディレクトリを分けて管理してたので。ここにTramの設定を追加。

#All Project (TraM)
Alias /trac/all "/var/www/cgi-bin/trac.cgi"
<Location /trac/all>
    SetHandler mod_python
    PythonHandler tram.web.modpython_frontend
    PythonOption TracEnvParentDir /var/trac
    PythonOption TracUriRoot /trac
</Location>

としたら「Internal Server Error」
ログ見ると 「PythonHandler tram.web.modpython_frontend: ImportError: No module named web」
と。

んで、ココでしばらく悩んだ(setuptools辺りとかclearsilver入れ直したり、思い誤ってweb.pyインストールしたり)のですが。
tramの中見たら、tram直下にmodpython_frontend.pyが有ったので

Alias /trac/all "/var/www/cgi-bin/trac.cgi"
<Location /trac/all>
    SetHandler mod_python
    PythonHandler tram.modpython_frontend
    PythonOption TracEnvParentDir /var/trac
    PythonOption TracUriRoot /trac
</Location>

と変更したらそのまま動いた…
その他使い勝手とかまだ見てないけど、それは後日にしようかと。TracLightningくらい予めプラグイン乗っかってるパッケージ、Linuxに無いのかなぁ。

(追記)
何か統合タイムラインがエンコード関係の問題で動いてなかったので。site-packages/sitecustomize.py に

import sys
sys.setdefaultencoding('utf-8') # cp932 でも良いかな。

を書いて動かした。いやでもこの対応で良いのかな?

TracWikiのPDF化プラグイン、日本語の改行対応

先日のTracWikiをPDF化する件ですが、どうも日本語で長文を書いたときに自動的に改行されずに、ページをはみ出してました。
英語の長文を適当に突っ込んでPDF変換するとちゃんと単語間(スペースの部分)で改行されるので、どうもコレはwordWrap辺りの問題ではないかと。
「linebreak」でpisaの下のソースを当たってみると reportlab_paragraph.py というファイルの925-929行目に

if style.wordWrap == 'CJK':
    #use Asian text wrap algorithm to break characters
    blPara = self.breakLinesCJK([first_line_width, later_widths])
else:
    blPara = self.breakLines([first_line_width, later_widths])

とゆー記述が。
reportLabのドキュメントによると、たぶんParagraphStyleってclassのwordWrapを「CJK」に書き換えれば良いと思うのですが、pisa経由でソース追っかけて行ったら良くわかんなくなってきて・・・結局。

if style.wordWrap == 'CJK':
   #use Asian text wrap algorithm to break characters
   blPara = self.breakLinesCJK([first_line_width, later_widths])
else:
   blPara = self.breakLinesCJK([first_line_width, later_widths])

と言うベタな対応(まぁ基本的に日本語でしか書かないし)。
禁則処理とか右端の揃い方にちょっと不満はあるのですが、その辺はもうちょい時間のある時にでも。

TracWikiのPDF化プラグイン

今まで趣味の事と下らない事しか書いてなかったので、これからはちょっとプログラム系のネタも一緒に載せてみようかなと。

で、仕事でプロジェクト管理とかにTracとゆーソフトを使ってるのですが。これにプロジェクト管理用のWikiがくっついてまして。仕様とか議事録とかメモとかを書いとくのに重宝してまして。
で、コレをそのまんまPDFにできないかなーと思ってググった所。
http://d.hatena.ne.jp/penguin_niisan/20100209/1265674139
でバッチリ紹介されてました。
http://trac-hacks.org/wiki/TracWikiPrintPlugin から TraicWikiPrintPluginとゆーモノを使えば良いようで。

ウチの環境はCentOS5.4+Python2.4.3+Trac0.11で。大体こちらのサイトに書いてある通りで問題なかったのですが、
http://www.daionet.gr.jp/~knok/trac/trac.cgi/wiki/pisa-l10n
から持ってきたPatchがeasy_install でインストールしたPISAとのバージョン違い(pisa-3.0.32)で通らなかったので、パッチの内容を見ながら直接
/usr/lib/python2.4/site-packages/pisa-3.0.32-py2.4.egg/sx/pisa3/pisa_context.py
を修正しました。

で、先のサイトでも書かれてる通りHeiseiKakuGo-W5だと、英数字がズレる。(普通にReportLabでHeiseiKakuGo-W5使うときはこんなにズレないんだけどなぁ・・・)
なので http://mix-mplus-ipa.sourceforge.jp/ からIPAフォント系を取ってきて、/usr/share/fonts/ja/TrueType/ の下にごそっとコピー。loadTTFontを組み込んでOKかなーと思ってたんですが、ここでちょっとハマリ。どうもReportLabにフォントパスが通ってないみたいで・・・結局
self.loadTTFont(['ipag','ipag'],’/usr/share/fonts/ja/TrueType/ipag.ttf’)
self.loadTTFont(['ipamp','ipamp'],’/usr/share/fonts/ja/TrueType/ipamp.ttf’)
self.fontList['helvetica'] = ‘ipamp’

と、フルパスでフォントの設定したら上手く行きました。

ちなみに設定は trac.ini に
[components]
wikiprint.* = enabled

[wikiprint]
toc_title = “{ ブックで出力する時のタイトル }”
#CSS and content files (or URLS, using http://…)
#css_url=c:/path/to/file.css
#article_css_url=c:/path/to/article.css
#book_css_url=c:/path/to/book.css
#frontpage_url=c:/path/to/frontpage.html
#extracontent_url=c:/path/to/extracontent.html

みたいな感じでokでした。
まだやってないけど、PDF出力のフォーマットやヘッダフッタ設定は上記のcssとかhtmlで出来るみたい。書式は
http://www.xhtml2pdf.com/doc/pisa-en.pdf
を参照で。

POP2*0

ってブログが有りまして。

もう知ってる人は知ってると思うのですけど「電子音楽 in Japan」の田中雄二さんのウェブサイト。

音楽系のライターさんの名前なんてほとんど知らないのですが、この方だけは別格に思っています。(そもそも音楽ライターという訳でも無いような気もしますが)

あの本が最初に分厚い黄色のヤツで出た頃にも電子音楽 in Japanのサイトもやってたんですけれど、その頃と変わらない圧倒的な情報量とネタ密度(更新も多い)のブログです。

相変わらず凄いなぁぁぁぁ、タダで読むのが恐れ多い感じです。

( http://d.hatena.ne.jp/snakefinger/ )