2011年7月29日金曜日

調整さんで出席者数をカウントするbookmarklet

調整した後、予約するときとかに人数数えるのが面倒なので書いてみた。カウント

javascript:(function(){var d=document,p=['○','△'],c,i=1,j,k,u,v,t=d.querySelectorAll('#nittei tr');for(;i<t.length-1;i++){u=t[i];v=u.querySelectorAll('td');k=c=0;for(;k<2;k++){for(j=1;j<v.length;j++)c+=(v[j].innerHTML==p[k]);v[0].innerHTML+='|'+c;}}})()

2011年7月25日月曜日

curlは便利

cURLは標準で多くのプロトコルをサポートしていますが、サポートされていないプロトコルでもtelnetで話せる相手なら、telnetと同じように話せるので便利。

memcacheの場合こんな感じで使えます。
echo -e 'stats\nquit' | curl -s -T - telnet://localhost:11211 | egrep 'hits|misses'
(echoがバックスラッシュによるエスケープを処理してくれるものじゃないと、上の例は動きません。bash/zsh組み込みのechoは可)

簡単な処理をシェルスクリプトでする程度なら、これでも十分使えますね。

2011年7月19日火曜日

javaのFutureTask.getがブロック/起きる仕組み

第2回JVMソースコードリーディングの会に参加しました。
最初のクラスファイルVerifierは思ったよりおもしろくて、あんな風にスタックに積まれる値の型チェックしてるんだなーと。ただ、あんなのを毎回やってたら確かに起動が重くなりそうな気もする。起動時に-Xverify:noneで起動すると、どこまでVerifyがオフになるかは調べておきたい。

java.util.concurrentはUnsafeに触らなかったので、FutureTask.getの仕組みあたり。
調べたので簡単に書いておく。

FutureTask.getがブロックするのはpark
  • FutureTask.get
  • FutureTask.Sync.innerGet
  • AbstractQueuedSynchronizer.acquireSharedInterruptibly
  • AbstractQueuedSynchronizer.doAcquireInterruptibly
  • AbstractQueuedSynchronizer.parkAndCheckInterrupt
  • LockSupport.park
  • Unsafe.park
FutureTask.getが起きるのはunpark.(以下はExecutoreの場合)
  • ExecutoreがTask.runを呼び出す(例えばThreadPoolExecutor.runWorker)
  • FutureTask.run
  • FutureTask.Sync.innerRun
    • FutureTask.set(結果セット)
      • FutureTask.Sync.innerSet
      • AbstractQueuedSynchronizer.releaseShared
      • AbstractQueuedSynchronizer.doReleaseShared
      • AbstractQueuedSynchronizer.unparkSuccessor
      • LockSupport.unpark
      • Unsafe.unpark
    • FutureTask.cancel
      • FutureTask.Sync.innerCancel
      • AbstractQueuedSynchronizer.releaseShared
      • 後は結果セット時と同じ

SphinxでXeLaTeXを使って日本語使ったPDFを出力する

make latexして作られたMakefileのpdflatexをxelatexにするのと、XeLaTeX用のpreambleをconf.pyに書くだけでいけます。フォントもfontconfig使ってくれるので楽ちん。

conf.pyにpreambleを記述
latex_preamble = '''
\usepackage{xltxtra}
\setmainfont{TakaoMincho}
\setsansfont{TakaoGothic}
\setmonofont{TakaoGothic}
\XeTeXlinebreaklocale "ja"
'''

手順
make latex
cd _build/latex/
sed 's/pdflatex/xelatex/' Makefile > Makefile.xelatex
make -f Makefile.xelatex 

これでPDFが出来てます。

2011年7月18日月曜日

IgoTokenizer直した

ださいバグがあったので、lucene-gosenベースで作っているIgoTokenizerを直しました。
lucene-gosen(trunk/rev.141)ベースになっています。
これで、IgoTokenizerの評価での問題は解決しているはずです。

なお、launchpadからgithubに移動しています。

作業環境のoperaでうまくスクリーンショットがとれなかったので、以前Python Hack-a-thonのハンズオンで作ったPyQt使ってスクリーンショットを取るやつで、スクリーショットを取ってみました(画面から解析するとPOSTになってしまうので、GETで投げてます)

2011年7月17日日曜日

Canvasを使って透過じゃない画像を無理矢理透過して重ねた

muninのグラフを見ていたら、重ねて表示して飛び抜けて変なやつが居ないか確認できたら便利なんじゃないかと思いました。munin側を調べて手を入れてもいいのですが、面倒ですし、どうせブラウザ使って見ているのだからブラウザ上で何とかすればいいと考え、やってみました。

その1. 画像重ねるだけ
globalAlphaを設定してdrawImageするだけです。速い。

その2. グラフだけ重ねる
白(rgb=(255,255,255)のところ)だけalphaを0にして重ねることによってグラフだけが重なって表示された状態にするのですが、当然ながら折れ線グラフじゃないと使えません。
不透明の画像を透明にするためにまず非表示のcanvasにdrawImageして、各画素に対して処理したあと、その結果を表示用のCanvasに重ねて表示しています。遅いです。

一気に全画像を重ねる版
遅いので画像一枚ごとにsetTimeoutする版

2011年7月13日水曜日

launchpadからgithubへ

gist用にgithubのアカウントを作ったので、ついでにlaunchpadにある幾つかプロジェクトをgithubに移してみました。
以下はそのときのメモです。

普段使っているのがbzrなのでbzr側から調べてやりましたが、git-bzrというのがあるようなのでこっちの方が楽なのかもしれません。

必要なもの
  • インポート元となるlpのブランチ
  • bzr, bzr fast-import, (必要ならbzr-git)
  • git
  • インポート先となるgithubのリポジトリ

手順
  1. lpのブランチからブランチしたローカルブランチにcdする
  2. git init
  3. bzr fast-export . | git fast-import
  4. git reset HEAD
  5. git remote add origin git@github.com:アカウント/リポジトリ.git
  6. git push -u origin master  または  bzr dpush git+ssh://git@github.com/アカウント/リポジトリ.git
  7. (もう不要なら) rm -r .bzr

2011年7月3日日曜日

GroovyFXを使ってみる

GroovyFXを使ってみました。題材は前回のカスタムブラウザです。

GroovyFXはリポジトリが公開されているものの、まだまとまったものは配布されていませんので、チェックアウトしてビルドする必要があります。手順はREADME.txtに従えばいいだけなので省略。7/1ぐらいの状態では存在していないクラスを参照していて、そこを外さないとビルドが通りませんでしたが、7/3現在そのままビルドが通ります。

直接JavaFX 2.0 + Groovyで扱うよりはだいぶすっきりしました。今のところ不便なのは、WebEngineloadTaskが特別扱いされていないので、ボタンなどのようにクロージャをそのまま渡せないのと、アニメーションのTransitionの扱いがない(TimelineはBuilderがある)のが不便というぐらいです。
loadTask関係でクロージャを渡せない方は、他のEventHandlerを使っている部分のソースを参考に、ClosureEventHandlerを利用してGroovyっぽくしてみました。
(追記 後からvisibleにしないとサイズ指定が期待通りにならないので変更しました。Window.sizeToSceneを呼ぶのでもいいようです)