忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2012-11-11(Sunday)

moでカッコが伸びる

例えば

f(x)=frac12

と書いて変換したMathMLは、丸括弧を

<mo>(</mo>...<mo>)</mo>

と変換します。

mythさんから指摘を受けたのですが、MathMLでは本来、こう書いた場合の丸括弧は同じ行にある式の高さにあわせて縦に伸びてしまいます。

試したところ、Firefoxでは伸びませんが、IEにMathPlayerを入れたものだと伸びます。

以下の画像は上が何も工夫しない丸括弧、下がちょっと加工した丸括弧です。

こっちがFirefoxで

firefoxでの丸括弧

こちらがIE+MathPlayerです

IEでの丸括弧

そもそもなぜ伸びてしまうのかというと、MathML2の仕様によると、moにはstretchy属性というものがあって、この値がtrueだと伸びます。 デフォルト値はfalseなのですが、ここでOperator Dictionaryというのがあり、この中で括弧の類のstretchy属性はデフォルトでtrueになる、と記述されています。

一方LaTeXでは、明示的に\leftと\rightで囲んだりしない限り、縦には伸びません。

という訳でLaTeXからの変換では、括弧はstretchy='false'と指定するのが良さそうです。

Tags: MathML

MathMLライブラリ 0.14公開

というわけで、上記の修正を行ったMathMLライブラリ 0.14 を公開しました。 http://www.hinet.mydns.jp/?mathml.rb からダウンロードできます。

また、gemの方も更新してrubygems.orgにアップしたので、そちらからもインストールできるようにもなるはずです。

今回の修正はちょっと大雑把で、一部を除いてmo要素には fetchy='false' を追加する、という形になっています。 本当は記号ごとにデフォルトの値とLaTeXの場合とを調べて分けるべきなんですけど、ちょっと調べている時間がなくてこのような変更になりました。

「使ってる記号で、LaTeXでも伸びるのにMathMLに変換したら伸びなくなった~」というケースがあったらお知らせくださいませ。

Tags: 更新 MathML

マイナスとハイフン

これについても指摘を受けたので、ちょっと調べてみたのです

マイナスとハイフンの表

こちらはIE+MathPlayerでもFirefoxでも挙動は変わらないようで、mtextの中でHyphen-minus(-, #%x2d)を使うと短くなるようですが、mo要素の場合は&minus;と変わらないようです。

Tags: MathML
本日のツッコミ(全4件) [ツッコミを入れる]

Before...

_ myth [ところで,ディラックのブラケット記号のような,¥left¥langle と ¥right¥rangle だけでなく真..]

_ ひらく [HikiのInternal Server Error、どうもコメントをスパム扱いしてるんですが、その時にエラーになっ..]

_ myth [braket.sty というスタイルファイルがあるそうです。]


2012-11-30(Friday)

Ruby 1.9がcloneしている件

るりまのスナップショット20120829を試そうと思って、server.rbを起動してアクセスしたんですが、画面が真っ白なままになるんです(これはこれで気になる)。

で、bitclust/bin/bitclustを直接起動する事にして、どうせならupstartを使ってPC起動時に自動的に起動するようにしようと思ったのです。 bitclustは--debugを与えずに起動することにして(Webrick::Daemon.startが使われる)、このプロセスの管理をupstartで行うために、upstartの設定ファイルに

expect daemon

と書くべきか

expect fork

と書くべきか調べようと、upstartのCookbookにあるように、straceでforkの回数を調べたのです。

Rubyには1.9.3-p327を使ったのですが、これでbitclustを起動してstraceのログでforkの回数を調べたら、なぜか3回cloneしているのです。 以下、ちょっとごちゃごちゃしてますが、今手元で再現したログです

hiraku@shako:~/tmp/tmp/ruby-refm-1.9.3-dynamic-20120829$ strace -o s.log /opt/ruby/1.9.3-p327/bin/ruby -I bitclust/lib/ bitclust/bin/bitclust server --pid-file=r.pid --baseurl= --database=db-1_9_3
[2012-12-01 02:22:13] INFO  WEBrick 1.3.1
[2012-12-01 02:22:13] INFO  ruby 1.9.3 (2012-11-10) [x86_64-linux]
fork
my pid: 5340
0
5342
fork
my pid: 5342
5345
0
hiraku@shako:~/tmp/tmp/ruby-refm-1.9.3-dynamic-20120829$ kill `cat r.pid`
hiraku@shako:~/tmp/tmp/ruby-refm-1.9.3-dynamic-20120829$ egrep "\<(fork|clone)\>\(" s.log 
clone(child_stack=0x7fe0b682eff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fe0b682f9d0, tls=0x7fe0b682f700, child_tidptr=0x7fe0b682f9d0) = 5341
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fe0b82229d0) = 5342
clone(child_stack=0x7fe0b682eff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fe0b682f9d0, tls=0x7fe0b682f700, child_tidptr=0x7fe0b682f9d0) = 5344

forkとかmy pidとかは、process.cに入れたprintf-debugの出力です。

で、色々試して一番単純な例として、単にruby -vしたときのstraceのログを同じ方法で調べてみると

hiraku@shako:~$ strace -o s.log /opt/ruby/1.9.3-p327/bin/ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
hiraku@shako:~$ egrep "\<(fork|clone)\>\(" s.log
clone(child_stack=0x7f52c462fff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f52c46309d0, tls=0x7f52c4630700, child_tidptr=0x7f52c46309d0) = 2764

なんかcloneしてます。

(gdb) run -v
Starting program: /opt/ruby/1.9.3-p327/bin/ruby -v
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff65ec700 (LWP 2728)]
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
[Thread 0x7ffff65ec700 (LWP 2728) exited]
[Inferior 3 (process 2727) exited normally]

cloneというか、スレッドを作っているのか、ちょっと良く分かりません。

と言うところで力尽きたので今日はここまで。 trunkでも同じようになってて、1.8だと、こうはならないところまでは確認しました。

結論としては、Ruby 1.9で自分でforkするdaemonを動かす場合は、upstartで完全に管理(restartしたりrespawnさせたり)できないという事になるのかな。