2007年10月24日水曜日

コンストラクタのオーバーロード

Pythonは、コンストラクタ(__init__)のオーバーロードはできないのね。
1.5から使ってるけど、今まで全く気付かなかったよ。



2007年10月17日水曜日

c3p0とmysqlのReplicationDriver

今作ってるシステムで、DBにデータを入れてすぐに、そのデータを取得する場面が存在する。
MySQLのレプリケーションは非同期なので、Connection.setReadOnly(false)で、
マスターに強制的につないで、データをとるようにしていた。
c3p0でStatementCacheを使うと、デッドロックするというのが、私のところでも起きていたので、
maxStatementsを0にしていたが、試しに10にしてみたら、デッドロックにはならなかったものの、
うまくデータとれない事象が発生するようになった。検索したら、似たことで困ってる人がいた。
私が困ってるのも同じで、setReadOnly(false)してあるコネクションでのトランザクション内。
ReplicationDriverのコネクションは、表向きは1コネクションでも、
内部で切り替えているから、何にも言わないと、こういう事態が発生しそうなのはわかる。
でも、直前にsetReadOnly(false)したコネクションで、しかも1トランザクション内なんだけどな…

c3p0側のStatementキャッシュ周りを調べてみるかな。
この処理の前に、同じStatementをsetReadOnly(true)で実行しているので、
プールからコネクションを取り出したときに、同じコネクションが回ってくると、キャッシュされてるのが使われそう。
キャッシュを使うときに、コネクションをどう処理してるかを見たら、なんかわかるかな。
適当に書いてるけど。
まあ、プール側は単純に1コネクションとしか思ってないだろうから、なんかしら不整合はありそう。
dbcpでもPrepareStatmentのキャッシュが問題だったし。
キャッシュをしないようにするしか解決策がないんだとすると、結局無駄な作業だったのかな…

2007年10月16日火曜日

pythonでurlencode

いつも迷うけど、javaのURLEncoder.encode相当の処理は、urllib.urlencodeではなくて、urllib.quote
複数のパラメータをエンコードしたかったら、urllib.urlencodeを使うことが多いけど。



2007年10月14日日曜日

コメントドリブン開発

コメントドリブン開発 - コメントを書いてからコードを書くことの効能

書く内容は違うかもしれないけど、昔からコメントを先に書くのはよくやってる。
適当にインタフェース(クラスとか関数とか)を決めて、おおまかな構成とか繋がりを考える。
で、中身はどんなことをするかを書くだけ。関数/メソッド呼び出し/returnまでは書いてしまうこともあるかな。
ただ、コメントを書き終わると(とくに詳しく書いたときは)出来た気になってしまい、後で追い込まれたりするけど…

pythonで、doctestつかってやれば、test&comment drivenかな?



2007年10月12日金曜日

mod_proxy_balancerでホットスタンバイ

日本語の方のドキュメントには書いてないけど、英語でかかれている方には、
ProxyPass/BalancerMemberのパラメータにstatusと言うのが書いてある。
で、statusに、H(hot-standby)というのがあった。
(最初はS/Dだけで、HとEは後から追加されたようだ。さらに後にIが追加されている)

これで、mod_jkみたいに、普段は使わないけど、なんかあったときだけ使うって言うのが出来る。



2007年10月5日金曜日

Jericho HTML Parserをjythonでつかう

医者の待ち時間で、あまりに暇なので書いてみた。
voxブログのトップページから、タイトルと本文を抜き出して、テキスト化して出力。

from java.net import URL
import java.lang.System.out.println as println
from au.id.jericho.lib.html import Element, Source

s = Source(URL("http://hide-t.vox.com/"))
for e in s.getElementById("alpha-inner").findAllElements("div"):
  if e.getAttributeValue("class") == "post-asset asset":
    for ie in e.findAllElements("h2"):
      title = ie.getTextExtractor().toString()
break
    for ie in e.findAllElements("div"):   
      if ie.getAttributeValue("class") == "asset-content":
        content = ie.getTextExtractor().toString()
break
    println("title: %s\ncontent: %s" % (title, content))


IE7がWindowsUpdateにきた

調べたいことがあったので、朝PCの電源を入れたら自動更新がきてた。
何かと思ったら、IE7だった。

新しいPCにしてから、IE6のままだったけど、前のPCではIE7使ってて困ることもなかった(タブが有効にならないのはあったけど)から、良いんだけど。

IE7入れたけど、配布したのはミスだったみたいね。
WindowsUpdate経由で入れずにダウンロードしてきて、また/nobackupでいれた。



2007年10月4日木曜日

dbcpやめてc3p0にした

DBCP使うって書いたばっかりだけど、問題があってc3p0にした。

切り分けはしてないけど、DBCPConnector/JReplicationDriverを組み合わせて使い、
poolPreparedStatementstrueにしたときに、

No operations allowed after statement closed.

が出てしまい、poolPreparedStatementsfalseにする以外の方法が見つからなかった。
出たところは、前のPreparedStatementを閉じた後に、別のPreparedStatementを作ってるところ。

検索してみたら、似た事例があった。
これによると、c3p0なら問題ないらしいので、勢いでc3p0を使うようにしてみた。
DataSourceのセットアップの所以外は、特にDBCPに依存してないので、すぐにc3p0を使う版にできた。

一通りテストしたけど、とりあえず問題はなさそう。



2007年10月3日水曜日

Jericho HTML Parser 2.5

久しぶりに確認したら、Jericho HTML Parser 2.5が出てた。
scriptタグ内のHTMLを無視してくれるのは、ちょっとうれしいかな。

typoしてたので、なおした。



commons-dbcpとConnector/Jの設定

以前DBCPを使った関係で、DBCPをまた使うことになった。
いちいちset呼んで設定するのは面倒なので、Factory経由でプロパティを渡すことにした。

Connector/J(というか、DBCPで使うドライバ)に、DBCP経由でパラメータを渡すには、
BasicDataSourceFactory.createDataSourceに渡すプロパティに、
connectionPropertiesと言う名前で、"ドライバに渡すプロパティ名=値;名前=値;..."と言う値を持つ要素を持たせればOK。

javadocにはprotectedなのがあることは書いてあるけど、他のDBCPの設定みたいに、setConnectionPropertiesはない。
ならば、DBCPに渡すプロパティにつっこむしかなさそうなのはわかるが、書き方が分からない。
よく見たらConfigurationのところに書いてあった。