2007年12月23日日曜日

twitter

今更ながら始めた。hideaki_tです。
blogの記事書くより手軽なので、忙しいときでも簡単にかけるのが良いな。



2007年12月11日火曜日

LUCENE-969の記事訂正

よくみたら、next(Token result)ってAPIが追加されてたのね。
これ使えば問題なかった。



2007年12月6日木曜日

Connector/JのReplicationDriverとコネクションプールの問題が解決

要するに、RoundRobinLoadBalancefailOverReadOnly=trueの問題でした。

  • JDBC URLのホスト部にホストを複数書いたときに、先頭以外のホストが選ばれると、そのコネクションはfailover状態に設定される。
  • failover状態になると、failOverReadOnlytrueなら当然そのコネクションはReadOnlyなコネクションになる。
  • この状態(failover&failoverReadOnly=true)になると、setReadOnly(false)しても書き込み可能にならないので書き込もうとすると例外が発生する。
  • そんなコネクションがc3p0やらdbcpでプールされるが、書き込みたいときに書き込み可能コネクションがとれるとは限らない。

解決策の案
プールを別にする



Tokenつかいまわし(LUCENE-969)の罠

訂正: ちゃんと使えば問題ありません
何にも考えずに、Tokenizerで1つのTokenだけ保持して使い回すようにしたら、
今まで検索できていたものが検索できなくなった。
queryrewrite&toStringしてやっと気付いた。気付くまで時間がかかってしまった。
TokenをつかいまわすTokenizer/AnalyzerQueryParserで使うと、
Analyze結果をPhraseQueryとかにするために、TokenVectorに入れて保持してるから、
最終的に取得できるQueryでつかうTermが全部同じになってしまう。
気付けば当たり前なんだけど。
Indexの構築は問題なかった。

2007年12月1日土曜日

Lucene2.3を見てみる

いつ出るのかわからないけど、かなり性能が改善しているようなので見てみた。

うれしい改善

  • Fieldつかいまわし(LUCENE-963)。これでDocumentも使い回せる。
  • Tokenつかいまわし(LUCENE-969)。Tokenizer内でTokenを使い回す。
  • IndexReader.reopen()(LUCENE-743)。Searcherを作り直さないで良いなら、かなり便利になる気がする。
とりあえず、Field使い回しと、Token使い回しをしてみた。どっちも簡単。

Field使い回し

フィールドの数だけFiledのインスタンスを作っておいて、Documentにaddしておく。
あとは、実際にインデックスにつっこみたい文書を、作っておいたフィールドにそれぞれ設定して、
IndexWriterにdocをaddすればいい。docに対してaddするのは最初だけで良い。

final Document doc = new Document();
final Field url = new Field("url", "", Field.Store.YES, Field.Index.UN_TOKENIZED, Field.TermVector.NO);
final Field title = new Field("title", "", Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO);


final Field desc = new Field("desc", "", Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO);
doc.add(url); doc.add(title); doc.add(desc);
for (Content c: clist) {
    url.setValue(c.url);
    title.setValue(c.title);
    desc.setValue(c.desc);
    indexWriter.add(doc);
}


Token使い回し

Tokenをコンストラクタで作っておいて、nextが呼ばれるたびにTokenに設定されている値を変えるだけ。
Termを書き換えるのに、termBufferを書き換えた方が良いようなのでそうしてみる。

final int len = term.length();
char[] buf = token.termBuffer();
if (buf.length < len) {
  buf = token.resizeTermBuffer(len);
}
term.getChars(0, len, buf, 0);
token.setTermLength(len);

まだベンチマークしてないから、どれだけ効果あるのか不明。


ChasenTokenizerをいじる

ChasenTokenizerを使う場合、Filedのvalueの方に空文字列を設定すると、例外が出て死ぬ(QUITの応答を処理しちゃうから)。
なので、コンストラクタで空かどうか確認するようにしてみた。mark(1)してから1文字読んでみて、-1が帰ってきたらサーバに接続しないようにした。読めたらresetして今まで通り。
connectorがnullでは無いことを仮定しているコードなので、closeとかnextも修正しないと駄目。



2007年11月30日金曜日

pythonとmecabでchasendもどき

python+cmecabを使って、chasen server(chasend?)もどきを書きました。
LuceneでJapaneseAnalyzer+ChasenTokenizerで使う事しか考えてないけど、とりあえず使える。

いまいち仕様がわからないので、ChasenTokenizerのソースとmecab -Ochasenの出力を見て書いてみた。



ubuntu7.10をcoLinuxで

いろいろWindows用にポーティングしたりするのに疲れたので、ubuntu7.10をノートに入れたcoLinux(Snapshot 20071105 of version 0.8.0 with kernel 2.6.22,compiled with gcc 4.1.2)で使えるようにしてみた。
coLinuxでUbuntu 7.04をネットワークインストールを参考に、7.10のファイルを使うようにしただけ。
ネットワークはslirpにした。

初めてubuntuつかうけどdebian使ってた(まだ残ってるけど)から、まあなんとなく勝手はわかる。
メイン機以外だとビルドしまくるgentooは厳しいし、メモリが多くないノートだとOpenSolarisをVMWareで動かすのも厳しい。
deibanのsidとか、gentooの~みたいなのはないのかな?experimentalってやつかな?



excelで文字列をセル参照として使う

頼まれたので簡単に調べてみた。

  • 文字列の連結は&
  • 文字列をセル参照指定としてつかうには、INDIRECT
2つの値の組み合わせによって値を変えたかったので、
  1. 1つ目の値を列指定文字に変換(IFでやった)
  2. 2つ目の値を行指定文字に変換(IFで)
  3. 連結(&で)
  4. INDIRECTで参照
でおわり。



2007年11月22日木曜日

sorting a dictionary by value

pythonで辞書の値でソートしたかったので適当に考えてみたけど、検索したら普通の方法っぽい。


>>> d = {"a": 9, "b":5, "c":10, "d":0}
>>> for i in sorted([(v, k) for k, v in d.items()]):
    print i
  
(0, 'd')
(5, 'b')
(9, 'a')
(10, 'c')
>>>



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のところに書いてあった。



2007年9月30日日曜日

人間ドックに行ってきた

今年も人間ドックに行ってきた。
結構酷い貧血らしい。去年は軽い貧血って言われたので、鉄分とか多少意識して採ってたつもりなんだけど。
あと、初めて"やせ"ってかかれた。あと1Kg足りない。
それ以外は特に問題なしらしい。

採血した後、だるかったのは、貧血のせいなんだろうか?



2007年9月29日土曜日

jdk1.6.0_03

なんかきた。


$ java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode)

nioのSelectorで、Linuxのepollをつかう方法

java -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider



2007年9月22日土曜日

java genericsの型パラメータ

Collections.emptyList()の戻り値を、そのまま別のメソッドに渡そうとしたら駄目だった。
面倒くさいなー。戻り値が使われるメソッドの引数の型から、型を推論できないものかな?
下に書いたとおり、returnなら大丈夫なのに。

import java.util.*;
public class Main {
  static class A {}
    public static void test(List<A> a) {}
    public static List<A> getEmptyList() {
      return Collections.emptyList();
    }
    public static void main(String[] args) {
      test(Collections.emptyList());            // これはList<Object>と判断されるので駄目
      List<A> a = Collections.emptyList(); // 一回代入して推論させれば出来る。
      test(a);                                              // 最適化されるだろうけど書くのが面倒くさい
      test(getEmptyList());                        // こんなのはできる
    }
}



2007年9月16日日曜日

ゲーム機分解

たまってたメールを消化していたら、NEニュースに東京ゲームショウにNE分解班が出展しますっていうのがあった。
良さそうな企画。おもしろそう。

私も、小学生ぐらいの頃は、ファミコンの本体とかカセットとかばらしてたなぁ。適当にLEDつけてみたりしてた。
結局ソフトの方に興味を持って、そっちに進んだけど。



PythonでH2を使ってみる(on Windows)

たまに使ってる、H2をPythonから使えるか試してみた(使い始めた頃は、PureJavaなSQLiteがあるの知らなかった)。

H2が自前ODBCを捨てて、postgresqlのODBCドライバを使えるようにしたって言うニュースをみて、
やろうと思ってて、ずっと忘れてた。
とりあえず何の問題もなく使えるので、まああんまり書くことはないけど、
ちょっと検索してみても見あたらなかったので、メモっておく。

  1. H2をダウンロードしてきて入れる。Windows用インストーラーでも、Platform-Independentなzipでも。
  2. PyGreSQLlibpq.dllを探してきて入れる。8.2.4のlibpq.dllを見つけたのでそれにした。
  3. H2起動。h2.batかjava -cp h2.jar org.h2.tools.Serverでok。
  4. Pythonから使う

>>> import pgdb
>>> con = pgdb.connect(host="localhost:5435", database="test", user="sa", password="sa")
>>> cur = con.cursor()
>>> cur.execute("select * from INFORMATION_SCHEMA.USERS")
>>> for r in cur.fetchall():
    print r

['SA', 'true', '', '15']

portがPostgreSQL標準の5432じゃなくて、5435なのだけ注意すれば特に問題ないんじゃないかな。
現状の制限とか、接続情報も書いてあるので、見ておいた方がよさそう。



2007年9月14日金曜日

tab-widthは8に限る

tab-width=4の人が周りには多い気がするけど、やっぱり8に限る。
python, Javascript, R他のコードを書くときは、スペース2つでインデントして、スマートタブ。ぎっしり。たまに1スペースにしたりするけど。
java, C/C++, sh scriptはほとんどスペース4つで、スマートタブかな。残念ながらshellは書かないよ。
たまに、インデントをタブのみにすると、結構スカスカになって、なんか気持ちがいい。



2007年9月13日木曜日

日経NETWORK「ネットワーク検定2007」の結果

すっかり忘れていたが、結果がきてた。
正解と解説はあったけど、去年のみたいに、問題は公開されてないのかな?

30点満点で27点だった。なんだかわからんが、一問は無回答になってた。
3点落としたのは、全部、「ネットワーク機器を選択する力」で、5点中2点。

NICの写真を見てバスの種類を当てるやつは、無回答にするとは思えないんだけど、まあなんかミスったんだろう…

無線LANのは、IEEE802.11e/EDCAがなんだかわからなかったのが敗因かな。

  • IEEE802.11n
  • WDS
  • 宛先MACアドレスフィルタ
  • 電力線
  • QoS
IEEE802.11n、WDS、電力線はすぐ除外出来たのに、なぜかわからないけど、電力線通信を選んでる…PoEと勘違いしたのかなぁ。

ちょっと悩んだ記憶があるのが、IPSecのパススルーとは何かって問題で、やっぱり間違ってた。
選択肢は、

  • アグレッシブモード
  • NAT-T
  • 暗号化
  • パススルー
  • キープアライブ
NAT-Tと、暗号化と、キープアライブが違うことはすぐわかったけど、なんでアグレッシブモードを選んだんだろう…



2007年9月11日火曜日

最近の気になるもの

東銀座の駅で見かけた。電源ケーブルかなんか(電話線かも)のカバーに「マサル」と書いてあった。

マサル

製品のページを教えてもらった。やっぱり会社名だった。4号は分かったけど、58は何だろう?


東横/みなとみらい線の横浜駅にて、なんか変な画面だなと思って見に行ったら、エラーが出ていた。
延々と、ダイアログが出たり消えたりしていた。Windows2000らしい。ワトソン博士ひさしぶり。
トラブル対応集のPDFが気になる。

Quick

台風一過

台風が通り過ぎた9/7に、仕事場の近くで木が傾いてるのを見かけた。
折れてるのは、台風の後とかで見ることもあるけど、初めて傾いてる実物を見た。

台風

2007年9月6日木曜日

net-snmpのembeded-perlとld --as-needed

net-snmpのconfigureが、eval_pv, perl_eval_pv, Perl_eval_pvを見つけられなかった。
原因はLDFLAGSの--as-neededでした。

hideaki@akane ~ $ gcc pt.c
/tmp/cc2wn2PW.o: In function `main':
pt.c:(.text+0xd): undefined reference to `Perl_eval_pv'
/tmp/cc2wn2PW.o:(.data+0x0): undefined reference to `Perl_eval_pv'
collect2: ld はステータス 1 で終了しました
hideaki@akane ~ $ gcc -lperl -L/usr/lib64/perl5/5.8.8/x86_64-linux/CORE pt.c
hideaki@akane ~ $ gcc -Wl,--as-needed -lperl -L/usr/lib64/perl5/5.8.8/x86_64-linux/CORE pt.c
/tmp/ccu1yJt3.o: In function `main':
pt.c:(.text+0xd): undefined reference to `Perl_eval_pv'
/tmp/ccu1yJt3.o:(.data+0x0): undefined reference to `Perl_eval_pv'
collect2: ld はステータス 1 で終了しました


hideaki@akane ~ $ gcc -Wl,--as-needed -L/usr/lib64/perl5/5.8.8/x86_64-linux/CORE pt.c -lperl

はいける。

把握している範囲では、PHPとwiresharkでもはまる。



2007年9月4日火曜日

pyExcelerator

いままでCSVで出していたプログラムをいじって、pyExceleratorを使ったxls出力が出来るようにしてみた。
スタイルの設定が面倒だけど、それ以外は自分が使う範囲では、とても便利に使える。日本語も問題ない。

スタイルの設定が面倒なのは、writeでrowを作ってしまうと、あとからrowにset_styleしても、row全体にstyleが適用されない点。
先にrowにset_styleして、そのあとのwriteでもset_styleでつかったstyleを使えば、row全体が同じスタイルになる。

row = sheet.row(row_no)
row.set_style(style)
row.write(0, "aaa", style)
row.write(1, "bbb", style)



JFSのmountが出来なくなってはまった

会社の自分のマシン(兼NFSサーバ)が、sshで入れなくなった。コンソールから入ろうとしたら、パスワードを聞くところまでこないで刺さってるっぽい。NFS, httpdは問題なく動いてた。

Magic-Sys-Rqでsync後rebootしたら、/がrwでmount出来ない。
init=/bin/shで起動させても、mount出来ないので、FSが壊れたかとかなり焦る。

mount: / not mounted already, or bad option

上司の持っていたFedora7の起動できるDVDから起動して、mountさせても同じ。
gentoo 2007.0のlivecdでも同じだった。

やっぱりFSが壊れているのかと思い、jfs_fsckかけたら特に問題ない。
で、もう一回mountしてみたら、何事もなかったかのようにmount出来た。
cleanじゃないとmount出来ないのはいいけど、もう少しまともなメッセージを出してくれないと困る。



2007年9月2日日曜日

Dovecot+sieve+quota

新しいサーバのDovecotに入れてある、dovecot-sieveを新しくしてみた。

MANAGESIEVEのパッチを持ってきて適用。dovecot入れ替え。
で、dovecotのリポジトリから、新しめのをdovecot-sieveを取り出して入れた(どうせなら、1.1系と同じCMU sieve 2.3.8相当にしたかったから)

とりあえず簡単に書いて、フィルタリングさせてみたけど、これは便利。
mailerでの振り分けは止めた(休み明けとかで、3000通とかあると、振り分けに時間かかりすぎる)
Dovecot-LDA(postfix経由)は今まで使ってなかったから、みんなが使い出したときの性能が心配ではあるけど。

ついでにQuotaも設定した。IMAPで容量が見られるのは便利。
ただ、他にも使用量を見られる方法を考えておかないといけないな。


MANAGESIEVEのパッチを探しているときに、OpenSolarisでCPU使用率が高い問題の解決策を見かけた。
Solaris10だけど、確かに負荷が高くて、コンパイラもSunStudio12なので、これかもと思って-fast外したら
嘘のようにシステム全体が軽くなった。SunのForumにも記述を発見した。



ゼルダの伝説 夢幻の砂時計をクリアした

2週間ぐらいでクリアした。土日に集中してやる以外は、ほとんどやってないけど、まあ満足。

今までに、まともにやったゼルダ(初代、リンクの冒険、夢をみる島、時のオカリナ、風のタクト、4つの剣+)の中では、一番簡単だったと思う。4剣+はちょっと違うけど。
新しい操作系なのと、DSで新規の人が取り込みたいから、ぬるめなのかな。
まあ、謎解き自体もそんなに難しくない気がしたけど。最後まで、ヒントが親切だからかも。

わかっている取り逃しは、ハートx2、ちからのみなもとx1, ちえのみなもとx1、ゆうきのみなもとx5。
クリアしたんで、攻略サイトを見たけど、どれを取り逃したかわからん。ハートは、魚釣りと、射的だな。



gentoo hardened 2007.0

glibcのemergeがこけてはまった。

Gentoo SELinux 2007.0 Upgrade Guideにしたがって、

FEATURES="-selinux" PORTAGE_T="portage_t" emerge -u1 libsepol libselinux libsemanage checkpolicy policycoreutils selinux-base-policy

したら、glibcも更新対象になっていて、まずglibcのemergeから始まった。
コンパイルが終わって、ファイルのインストールが始まったと思ったら、
最後に、segmentation faultで落ちた。

実際には、新しいファイルが入っていないので、たぶんebuild installの処理で落ちたんだろう。

自動に選択されていたのが、glibc-2.6.1だったので、とりあえず、

FEATURES="-selinux" PORTAGE_T="portage_t" emerge -av1 =glibc-2.5-r4

してみた。HardenedのMLで、2.5がstableとか書いてあったので。
でも、同じところで落ちた(っぽい)。

SELinuxに直接関係あるlibselinuxとか以外なら関係ないかと思って、

emerge -av1 =glibc-2.5-r4

にしたら、うまくいった。

そのあとは、問題なく動いてるっぽい。



2007年8月27日月曜日

Silverlight 1.1とDLR, XAML

XAMLを極力使わないで、IronPython側で組み立てようと思ったら、
マネージドコードでは、DependencyObjectNameはつけられない(作るときも、後からも)、
Durationとかは値が設定できないし、どうにもならないことを知った。

Nameがつけられないのは、そいつへのアクセス方法を、名前で探す以外の方法でやればいいから、まあいいとして、
作れないオブジェクトがあるのは、どうにもならないな。
XamlReader.Loadでがんばるしかないのかな。

カスタムコントロールは、まだIronPythonでの作り方がよくわからない。
まあ、これ自分自身のXAMLは必要みたいだけど。



2007年8月22日水曜日

PyICU

PythonでICUが使えないかなと思って探したら、PyICUが見つかった。
だけど、大好きなTransliteratorが無いようだ。Normailzerもないけど、unicodedataのnormalizeで足りるから問題ないか。

他のソースをまねして、追加してみるかな。



2007年7月26日木曜日

ssh pseudo-tty allocation

crontabを書き換えるのに、わざわざログインするのが面倒くさいと思って、
sshで出来ないかと思ったら、強制的にttyを確保されれば出来るね。
ssh -t host crontab -e

考えてみたら、ローカルファイルに書いておいて、ssh host crontab < fileでいいのか。
こっちの方がいいな。



2007年7月24日火曜日

cmecabをwindowsで

cmecabをWindows上で動かしてみた。
バイナリ配布のPython 2.5.1とmecab-win32 0.96と、Windows SDKを使用。
cmecab.cPyObject_HEADの後にある、セミコロンをなくすだけでコンパイルできた。
とりあえず動いた。

付いてたベンチマークをやってみたら、こんな感じ。

  • cmecab
    3 function calls in 33.654 CPU seconds
  • mecab-python
    10015 function calls in 85.746 CPU seconds



2007年7月12日木曜日

Sun™ studio 12でpythonをbuild

Solaris上でコンパイルするので、Sun studio 12をつかってみた。
Sun studioのコンパイラでは、ctypes用のlibffiが、そのままだとコンパイルできません。
Sun studioのコンパイラが、__i386__を定義していないのが原因なので、__i386__から__i386にすると通ります。

参考



distuiltsのbdist_msi

python setup.py bdist_msiで、
msi形式のインストーラも作れるのに、なんでマニュアルとかには載ってないんだろう?
msi形式で配布されているのも知らないし(Python自体がmsiだけど)。

単純にmsiが嫌われてるだけかな…



VGP-BMS33(Bluetooth mouse)買った

SonyのVGP-BMS33/Bを買いました。ちょっと安くなっていたので。
Notebook Presenter Mouse 8000よりは、持ちやすいので、使いやすい。
東芝のスタックで、特に問題なくつながった。

こいつは単3電池が2本なので、余り気味のeneloopが使えるのがうれしい(単4のが不足気味)



2007年7月11日水曜日

続き mecab-python on windowsの問題

Windows SDKに入っているコンパイラと、mecab-win32でビルドできた。
バイナリ配布のlib/dllを使うので、MeCab_wrap.cxxへのパッチが必要。

manifest(python.exe.manifest, pythonw.exe.manifest)を修正しないと、MSVCR80.DLLがロードできないので、
manifestに、以下のエントリを追加した。

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>

idleでも問題なくなったけど、pyscripterはだめだな。manifestを内部で持ってるのかな?
ほとんど使わないからいいか。




2007年7月10日火曜日

mecab-python on windowsの問題

mingwでコンパイルした、mecabmecab-pythonが、うまくロードできないことがある。
だめなときは、ImportError: DLL load failed: メモリ ロケーションへのアクセスが無効です。とか言われる。

idle、PyScripter, IPythonからだと確実にロードできない。
MeCabLibでもだめだったから、libmecab-1.dllが原因かな。何が悪いんだろう。
バイナリ配布のmecab-win32だと、g++で作ったのとリンクできないし、VC++で試すしかないのかな。

ついでに、mingwだと、mecabをコンパイルするときに、mecab.hをいじっておくか、
MeCab_wrap.cxxをいじらないと、リンクに失敗した。
mecab.hをいじるなら、以下のdiff。

--- mecab.h     2007-03-11 23:19:42 +0900
+++ mecab-0.96/src/mecab.h      2007-07-10 09:58:10 +0900
@@ -217,11 +217,11 @@
     virtual ~Tagger() {}
 
 #ifndef SIWG
-    static Tagger* create(int argc, char **argv);
-    static Tagger* create(const char *arg);
+    MECAB_DLL_EXTERN static Tagger* create(int argc, char **argv);
+    MECAB_DLL_EXTERN static Tagger* create(const char *arg);
 #endif
 
-    static const char *version();
+    MECAB_DLL_EXTERN static const char *version();
   };
 
   /* factory method */

MeCab_wrap.cxxはこっち

--- MeCab_wrap.cxx      2007-06-10 23:32:44 +0900
+++ mecab-python-0.96/MeCab_wrap.cxx    2007-07-10 12:44:27 +0900
@@ -4450,7 +4450,7 @@
   arg2 = reinterpret_cast< char ** >(argp2);
   {
     try {
-      result = (MeCab::Tagger *)MeCab::Tagger::create(arg1,arg2);
+      result = (MeCab::Tagger *)MeCab::createTagger(arg1,arg2);
     }
     catch (char *e) {
       SWIG_exception (SWIG_RuntimeError, e);
@@ -4483,7 +4483,7 @@
   arg1 = reinterpret_cast< char * >(buf1);
   {
     try {
-      result = (MeCab::Tagger *)MeCab::Tagger::create((char const *)arg1);
+      result = (MeCab::Tagger *)MeCab::createTagger((char const *)arg1);
     }
     catch (char *e) {
       SWIG_exception (SWIG_RuntimeError, e);
@@ -4548,7 +4548,7 @@
   if (!PyArg_ParseTuple(args,(char *)":Tagger_version")) SWIG_fail;
   {
     try {
-      result = (char *)MeCab::Tagger::version();
+      result = (char *)mecab_version();
     }
     catch (char *e) {
       SWIG_exception (SWIG_RuntimeError, e);




2007年7月9日月曜日

Softbank 911Tのドキュメントビューアが使えなくなった(のが直った)

本当に、約2ヶ月で、ドキュメントビューアがつかえなくなった…。
調べると、修理に出しても、根本的な解決はしないようだ。
面倒だから、修理出したくないなぁ。

前使ってた、903Tのコンテンツエラーの放置といい、サポートが当てにならなそうだし。
(904Tとか、その頃の機種みんなに起こる問題らしいが、903Tしか知らない)

ソフト(ファーム?)ウェアの更新とかで直らないのかなぁ。

追加
ファームの更新で直りました。



2007年7月8日日曜日

WindowsXPの休止状態

新しい方のノート(memory 1.5GB)で、休止状態が失敗した(システム リソースが不足するため、API を終了できません)。
このマシンでは、いままで一度も出なかったので、パッチの存在をすっかりわすれてた。

何で今まで平気だったんだろう?
2GB乗せているマシンは、しょっちゅう失敗してたのに。



2007年7月6日金曜日

mysqld was killed by less

less hoge.bz2でファイル見てたら、lessが太りまくって、OOM killer発動でmysqldが殺された。怖いね。



2007年6月28日木曜日

名古屋

emobileは、名古屋駅では当然使えたけど、長久手の方はだめだった。
エリアマップを見ると、ぎりぎりエリア外か。

ちょっと時間があったので、新幹線の改札の近くにあった、喫茶店で休憩して、
珍しいので、あずきカプチーノを頼んでみた。
予想を上回るものが出てきたが、当然ながら、あずきは全部入れた。

最初は、ちょっとあずきの風味がする、かなり甘いコーヒーだけど、
最後の方は、コーヒーのにおいがするあずきを食べることになる。
まあ、残せばいいんだけど。

帰ってきて調べたら、有名なものみたいね。


DCF_0070

日付incrementをリストの内包表記で書いてみた

リストの内包表記で、ジェネレータが作れるのを忘れていたので、
考えてみたけど、こんなのしか思いつかなかった。

毎回、timedeltaを作るから、なんかもったいないな。

前回yieldした値がとれれば、前回+deltaを返すだけなんだけどな。

>>> from datetime import timedelta, date, datetime
>>> d = date(2007, 6, 23)
>>> delta = timedelta(days=1)
>>> for i in (d+timedelta(days=x) for x in range(0, 10)):
  print i

2007-06-23
2007-06-24
(省略)

なんとか、毎回timedeltaを作らないようにしてみたけど、さすがにこっちの方が遅いな。
timedelta作らなくても、rangeでタプル作ってて意味なさそうだし、reduceで関数呼びまくるし。

>>> for i in (reduce(lambda x,y: x+delta, range(0, c), d) for c in range(0, 10)):
  print i

2007-06-23
2007-06-24
(省略)



mono meeting

おわった。
今日の収穫

  • ag = 銀

Windowsのfiberの話は、おもしろかった。
Windowsのfiberを、複数のスレッドをまたいで動かそうとすると、やばいことが多いよという話。

moonlightはXAMLとかが結構動かせていて、期待できるかもと感じたが、
今のところSliverlightのやつをそのままではなくて、portingしているものもあるらしい。
そのままどっちでも動かせるようになったら、何か作ってみようかな。
(着いたときから、ちょっと眠かったので、なんか誤解してるかも)


Python Workship the Edge 2007に行く人が、すぐ近くに二人いて、ちょっと驚いた。
まあ、IronPythonがあるから、それなりに関連はあると思うけど。



2007年6月27日水曜日

Jericho HTML Parser 2.4が出てた

仕事でもたまに使っている、Jericho HTML Parser2.4がリリースされていた。
これは、HTML/XMLがぶっ壊れててもそれなりに読めるうえに、extractTextが最高に便利で手放せません(2.4でdeprecatedになったけど、ちゃんと代替手段がある)。
LuceneでIndex作るときとか、mecabを使うときに活躍してます。

StAXと、これがあるから、結局Javaをつかうことになることが多いな。

そのうちサンプルおいてみようかな。



2007年6月20日水曜日

VistaでNetscreenとのVPN接続

Vistaに対応したNetscreen-Remoteが今のところないのだが、VPNが使えないと困るので、Vistaでどうにかならないか調べてみた。

Vista(or XP)のIPSecでつなぐのは、認証設定&こっちが動的アドレスでは無理っぽいので、VMWareをつかってその中でつなぐようにしてみた。

VMwareのNATでつないでみたが、IKEとかは済んで、鍵のアイコンも出るのだが、VPN上で通信できない。
ホストOS側でキャプチャすると、port unreacheableを返しているっぽい。
なお、VistaでPPPの接続をキャプチャできたのは、Microsoft Network Monitor 3.1betaだけだった。Network Monitor 3.0とかWireshark 0.99.5では、キャプチャできなかった。

で、さらに調べていたら、ICSを使っている例があったので、HostOnly&ICSを組み合わせてみたら、無事に通信できた。
ダイアルアップ接続に、HostOnly用のアダプタとの接続共有を設定するだけ。


XPにしたからどうでもいいけど、一応書いてみる。



Vistaやめた

あまりに重すぎるから、プレインストールされていたWindows Vista™ Businessを消して、ライセンスが余ってたWindows XP(Pro.)にした。
PentiumM(753/1.2GHz)からC2D(U7500/1.06GHzに変わったから、dualcoreになったけど、クロックは下がったから、
ピークが落ちてるのかもと思っていたが、同じマシンとは思えないほど快適になった。



2007年6月12日火曜日

Pythonで日付インクリメント

ログの集計で、日付を一日ずつ進めていく必要があるので、久しぶりに日付周りを調べてみた。
いまは、datetime.timedeltaがあるから、timeでがんばらなくてよくなって、わかりやすくなったね。

>>> from datetime import timedelta, date
>>> d = date(2007, 6, 1)
>>> delta = timedelta(days=1)
>>> d+delta
datetime.date(2007, 6, 2)
>>> def date_generator(start_date, end_date, delta):
  d = start_date
  while d <= end_date:
    yield d
    d += delta

>>> for d in date_generator(date(2007, 6, 1), date(2007, 6, 4), timedelta(days=1)):
    print d

2007-06-01
2007-06-02
2007-06-03
2007-06-04



psyco(python)をつかってみた

今作ってる、ログを読んで解析(logbackでスレッド名毎にまとめたりする)&DB(SQLite)につっこむスクリプトでpsycoをつかってみた。
コード自体は単純で量もあんまり無いので、とりあえず、先頭に以下の二行を足しだけ。

import psyco
psyco.full()

13分かかってたのが、11分になった。何にもしないで、これだけ速くなればいいな。
小手先の最適化(文字列比較でinternしたりとか)はやってみたし、これ以上速くしたいなら、プロファイルとらないとだめだな。
まず、pysqlite2/SQLite3がどのくらいの時間を占めているか調べないと、やるだけ無駄かもしれないし。

PyPyのJITも気になったけど、ドキュメント読んでる暇がなかったから、あとまわし。



2007年6月11日月曜日

emobile

D01NXの外部アンテナなしで、東銀座と、新横浜では問題なく使えた。
今月末行く予定の名古屋はどうかなー。



vistaでbeepがうるさい

VistaでJaneをつかうと、beepがうるさいので、どうにかならないかと調べたら、どうも回避できるっぽい。
Slightly annoying bug: beep on listview selection change.

DelphiのTListViewが問題のようだが、当分これでしのげばいいかな。
それか、ほかのに乗り換えるか。



2007年6月8日金曜日

eix-syncの差分

eix-syncしたあとに表示される差分は、eix-sync -dで、再度みられるのに気づいた。
diff-eixで前回のファイル名を指定するより楽だな。



booでDnD

IronPythonでDnDをbooでまねしてみる。
さすがにあんまり変わらんかな。

namespace DnD

import System
import System.Collections
import System.Drawing
import System.Windows.Forms
import System.Windows.Forms.DragDropEffects
import System.Windows.Forms.DataFormats

class MainForm(System.Windows.Forms.Form):
    def constructor():
        InitializeComponent()

    private components as System.ComponentModel.IContainer = null
   
    protected override def Dispose(disposing as bool):
        if disposing:
            if components is not null:
                components.Dispose()
        super(disposing)
   
    def InitializeComponent():
        self.listBox1 = System.Windows.Forms.ListBox()
        self.SuspendLayout()
        #
        # listBox1
        #
        self.listBox1.AllowDrop = true
        self.listBox1.Dock = System.Windows.Forms.DockStyle.Fill
        self.listBox1.FormattingEnabled = true
        self.listBox1.ItemHeight = 12
        self.listBox1.Location = System.Drawing.Point(0, 0)
        self.listBox1.Name = "listBox1"
        self.listBox1.Size = System.Drawing.Size(292, 268)
        self.listBox1.TabIndex = 0
        self.listBox1.DragEnter += self.ListBox1DragEnter as System.Windows.Forms.DragEventHandler
        self.listBox1.DragDrop += self.ListBox1DragDrop as System.Windows.Forms.DragEventHandler
        #
        # MainForm
        #
        self.AutoScaleDimensions = System.Drawing.SizeF(6, 12)
        self.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        self.ClientSize = System.Drawing.Size(292, 271)
        self.Controls.Add(self.listBox1)
        self.Name = "MainForm"
        self.Text = "MainForm"
        self.ResumeLayout(false)

    private listBox1 as System.Windows.Forms.ListBox
   
    private def ListBox1DragEnter(sender as object, e as System.Windows.Forms.DragEventArgs):
        if e.Data.GetDataPresent(System.Windows.Forms.DataFormats.FileDrop):
            e.Effect = DragDropEffects.All
        else:
            e.Effect = DragDropEffects.None
   
    private def ListBox1DragDrop(sender as object, e as System.Windows.Forms.DragEventArgs):
        data = e.Data.GetData(DataFormats.FileDrop, false) as (string)
        for s in data:
            print self.listBox1.Items.Add(s)

[STAThread]
def Main(argv as (string)):
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(false)
    Application.Run(MainForm())



2007年6月7日木曜日

nioとgzip

普通のファイルを読むつもりで、java.nioを使って書いてたら、gzipされたファイルも読まないといけなくなった。
GZIPInputStreamからは、ReadableByteChannelが取得できないので、困っていた。

FileInputStreamからFileChannel取得していたので、環境が限定されるけど、/dev/stdinでも使おうかと思ったら、
FileInputStreamのコンストラクタで、FileDescriptorを渡すものがあるのに気づいた。

ということで、FileInputStreamコンストラクタに、FileDescriptor.inを渡して解決しました。

まあ、複数のファイルは読めないけど、今回は全部つながっててもいいので、
gzip -dc *.gzとかすれば問題なし。



2007年6月6日水曜日

Boo 0.7.7

いつの間にかBoo-0.7.7がでてた



Vistaのメモリ診断ツールが動かなくなった

TrueImageでバックアップから復元したら、0xc0000225とかいうエラーが出て、メモリ診断が起動しなくなった(その前に一度も起動してなかったけど)。


bcdedit set {memdiag} path \boot\memtest.exe
bcdedit set {memdiag} device partition=c:


で直った。



2007年5月14日月曜日

IEDevToolBar

IE Developer Toolbarの正式版がでてた。beta3はひどかった…beta2を消してしまって、我慢しながらbeta3を使ってたから、やっとイライラから解放される。

IE6はやっぱりランタイムエラーがでるっぽい。。



2007年5月8日火曜日

laptop用メモリ買った

メモリ(D2/N533-G1G)を買った。約1.1万円で、21(+1)%ポイントついた。
512Mのモジュールと交換(256+512MBから256+1024MB)したら、VMWareがちょっと快適になったかな。



Solaris10のmptドライバが直った(嘘かも)

VMWareで動かしているSolarisが落ちる件のその後。

125038-04から2回ほど更新された125038-06を入れたら、落ちなかった。
これでパッチ当てるのが楽になる。

追記
落ちるマシンもあった。何が違うか不明。
検証していないので、感覚だと、OSにSolaris10を選んで、kernel/unixを指定するとセーフモードまでは行けて、
OSにSolaris10 64-bitを選ぶと、kernelに32bit/64bit版のどちらを選んでも、その前に落ちる感じがする。
とりあえずまたbackoutした。



2007年5月7日月曜日

D01-NX買った

外出先でインターネットに接続したり、VPNを使うことが多い(LANに繋ぐ為の申請が面倒くさいし、どうせVPNは使えない)ので、D01-NXを買ってみた。
AX420Sを持って行ったから1円。キャンペーンで、5月分は無料&事務手数料が無料だった。

23区の端っこでは快適に使えたので、作業場所でも問題なく使えれば、emobileが使えないところでも電話用のWX310K使えばいいし、AX420Sの回線は解約してしまおう。

AX420S(x2)と比べると、かなり快適な気がする。
SSHとかはまああんまり変わらない感じはするけど、まあこれは仕方がない。でも、メール受信しながらでも、あんまり遅延が大きくならないから、メールチェックとか止めなくていいので楽。

追記
大森の作業場所では問題なく使えた。下り1.2Mぐらい出てる。
三軒茶屋の某ではアンテナが1本しかたたなかった。



2007年5月2日水曜日

JavaのGenericsは難しい(修正2)

ちゃんとドキュメントを読んでいないから、型の扱いがいまいちわからん。

class SSS;
class SSS_a extends SSS;
interface EEE;
class TTT;

public interface SC<S extends SSS>;
public abstract class AAA<S extends SSS & EEE, T extends TTT> implements SC<S>;

List<AAA<SSS_a, ?>> aList = new ArrayList<AAA<SSS_a, ?>>();
List<SC<SSS_a>> scList = new ArrayList<SC<SSS_a>>();

void f(List<SC<SSS_a>> v);

f(aList); // ダメ
f(scList); // ok
f((List)aList); // OK


fに渡すのは、SC<SSS_a>のリスト。
AAASC<SはSSSを継承したもの>を実装していて、
ここでは、SSSS_aを指定している。
普通に考えると、このAAA<SSS_a,?>は、SC<SSS_a>として
扱っても問題なさそうなんだけどなー。
まあ、ダメな理由はなんとなくわかるんだけど。Covariantではないから。



IronPython 2.0 Alpha 1

IronPyton 2.0 alpha1がリリースされていた。

DLR(common dynamic language runtime)をつかうようになったらしい。
Microsoft.Scripting.dllとかが入ってるから、これかな?

Python2.5対応よりこっちが気になる。



2007年4月21日土曜日

ハローキティ ワイヤレスイヤホンセット

ハローキティ ワイヤレスイヤホンセット
24GHzじゃSHFですかね。Bluetoothの2.4GHzはUHF?

まあ、この手のはレシーバ側の電池が交換できなくていやだ。

追記
24GHzもISMバンドなのか。車載レーダーとかで使われてるらしい。
UWBもここか。



2007年4月19日木曜日

MP3FS

MP3FSというのがあった。FUSEをつかっているようだ。

(今のところ)flacファイルがあるディレクトリをマウントして、それぞれのflacファイルを、その場エンコードでmp3にエンコードして取り出せるとある。

実用性はともかく、ちょっとおもしろいかな。cueに対応してるか見てみるか。    



VM上のSolaris10でVMWareが落ちる

125038-04入れたら、起動時に落ちるようになった(5.5.3/6betaどっちも)。
failsafeで起動して、patchrmした。

/aにマウントさせて、# patchrm -R /a 125038-04しただけ。



IronPython 1.1

IronPython 1.1が出てた。でも、いじってる暇がないよ。



2007年4月17日火曜日

ICU4JでFullwidth-Halfwidth

いわゆる全角カタカナをいわゆる半角にするために、ICU4Jを使ってみた。

まず、TransliteratorのIDをしらべてみた。


Jython 2.2b1 on java1.6.0_01 (JIT: null)
Type "copyright", "credits" or "license" for more information.

>>> from com.ibm.icu.text import Transliterator

>>> for i in Transliterator.getAvailableIDs():

...   print i

...

こんな感じで。

日本語が(も)関係すると思われるもの

  • Fullwidth-Halfwidth
  • Halfwidth-Fullwidth
  • Hiragana-Katakana
  • Hiragana-Latin
  • Katakana-Hiragana
  • Katakana-Latin
  • Latin-Hiragana
  • Latin-Katakana
  • Any-Hiragana
  • Any-Katakana

なんか使えそう?

  • Any-Hex/Unicode
  • Any-Hex/Java
  • Any-Hex/C
  • Any-Hex/XML
  • Any-Hex/XML10
  • Any-Hex/Perl
  • Any-Lower
  • Any-Upper
  • Any-Title
  • Any-Name
  • Name-Any

よくみる正規化(JavaSE6のjava.text.Normalizerにもあるけど、違いは知らない)

  • Any-NFC
  • Any-NFD
  • Any-NFKC
  • Any-NFKD

変換してみる
>>> from java.lang import String

>>> t.transliterate(String("バリ島", "UTF-8"))

u'\uFF8A\uFF9E\uFF98\u5CF6'

>>> print t.transliterate(String("バリ島", "UTF-8"))

��゙リ島



2007年4月13日金曜日

会社のネットワーク

打ち合わせしてきた。そろそろ本格的に動かなくては。
かなり好きにできるし、おもしろいと思うんだけど、やっぱりやりたがる人が少ないなぁ。



LuceneとGoSen

Luceneでつかっている、JapaneseAnalyzerを、SenからGoSenをつかうように書き換えてみた。
とりあえず問題なし。

perlは最初だけだからともかく、JCLが不要なのがすばらしい。
これだけのために、jcl104-over-slf4jが必要になってたからな。



2007年1月16日火曜日

pam_stack

会社のサーバ(gentoo hardened profile)をいじってたら、pam-0.99ではまった。
gentooのpolicycoreutilsが作る、newroleとrun_initのpam.d以下のファイルが、
pam_stackを使うようになっているので、使えなくなった。
調べて、includeに書き直した。

バージョンに制限をかけるか、policycoreutilsとpamのバージョンを見て、書き直すような仕組みが必要なのかな。



fish(friendly interactive shell)

fishいれた。おもろい。重い。



ログオンダイアログとHHK Pro.2

前から気になってたんだけど、
WindowsXPでログオンするときに、Ctrl-Alt-Delを押さないといけないようにしているのだが、
なんか、HHK Pro.2にしてから、なかなかログオンダイアログにならない。
HHK Lite(2か?)ではこんなことなかったんだけど。

ケーブルの抜き差しをすると、結構すぐいけるんだけど。
休止状態から戻ったときも同じだな。なんだろう。



2007年1月11日木曜日

写真


年末年始の写真をいくつか置いてみた。ここ数年としては、あり得ないぐらい外出してる。

  • 大晦日に上野に行ったときのやつ(携帯電話のカメラ)
DCF_0048


  • 初詣の後に寄った新宿御苑(K100D)
新宿御苑.2007.01.08_台湾閣_1

新宿御苑.2007.01.08_台湾閣_2

新宿御苑.2007.01.08_1