Software-Defined どさにっき 〜2015年5月中旬〜

by やまや
<< = >>

2015年5月12日(火)

Dropbox on FreeBSD

_ 動きません。

_ freebsd の linux エミュレーションを使っても、dropbox が利用している inotify のシステムコールがサポートされてないので、やっぱり動かない。リアルタイムに同期されなくてもいいのであれば、 公開されている API を使ったツールで操作できるけど、それだったら dropbox を使わずにふつーに rsync で同期すれば十分であまりうれしくない。

_ ムリヤリ動かす方法。

  1. bhyve (じゃなくてもいいけど)で linux の guest vm を作る
  2. その上で dropbox を動かす
  3. Dropbox の同期対象ディレクトリを NFS で共有する
うん、母艦が freebsd だから freebsd 上で動いてることにしよう。これだけのために Linux な環境を作るのであればムダすぎるけど、どうせ実験環境のためにひとつ作るつもりだったのでまあいいかな、と。いいんだよ、使いたいのであって動かしたいわけじゃないんだから。

_ で、試しに CentOS7 を入れてみたけど、噂に聞いてた systemd が想像以上に謎すぎてよくわからん…。

_ ちなみに inotify がないというまったく同じ理由で FreeBSD では lsyncd も動かない。*BSD には kqueue という仕組みがあるけど同じものではないのでそうそう簡単にエミュレートできるものではないみたい。以前、 がんばってエミュレートしてやるぜ的なライブラリを見つけて試してみたことがあるけど、これを使っても lsyncd はやっぱりまともには動かなかった。


2015年5月18日(月)

URL fragments

_ ただのメモ。http://www.example.org/hoge.html#fragments という URL における #fragments の部分について。

_ RFC3986 の定義ではこんな感じ。

   fragment      = *( pchar / "/" / "?" )
   pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
   unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
   pct-encoded   = "%" HEXDIG HEXDIG
   sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="
要するに、ほとんどの英数記号が使えて、許されないものでも %-encoding してやればよい。RFC2396 も、定義は若干異なるけど結果としてはほぼ同じ。

_ RFC1738 ではまったく異なっていて、

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
で、URL に #fragments は記述できない。マジかよ。知らなかった。まあ obsoleted だから無視しよう。

_ W3C による URL の定義。必要な部分だけ抜粋。

A fragment must be zero or more URL units.

The URL units are URL code points and percent-encoded bytes.

The URL code points are ASCII alphanumeric, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "?", "@", "_", "~", and code points in the ranges U+00A0 to U+D7FF, U+E000 to U+FDCF, U+FDF0 to U+FFFD, U+10000 to U+1FFFD, U+20000 to U+2FFFD, U+30000 to U+3FFFD, U+40000 to U+4FFFD, U+50000 to U+5FFFD, U+60000 to U+6FFFD, U+70000 to U+7FFFD, U+80000 to U+8FFFD, U+90000 to U+9FFFD, U+A0000 to U+AFFFD, U+B0000 to U+BFFFD, U+C0000 to U+CFFFD, U+D0000 to U+DFFFD, U+E0000 to U+EFFFD, U+F0000 to U+FFFFD, U+100000 to U+10FFFD.

A percent-encoded byte is "%", followed by two ASCII hex digits. Sequences of percent-encoded bytes, after conversion to bytes, should not cause a utf-8 decoder to run into any errors.
ほとんどの英数記号と、%-encoding な文字列が使えちゃうよ。一部の unicode 文字はエンコードなしでそのまま使えるよ。

_ fragments は URL として指し示された先の HTML 文書内では、<a name="fragments"> とか <h1 id="fragments"> てな感じで指定される。その定義はどうなっているのか。

ちうことで、おおむねどんな文字も使える緩い定義だけど、HTML4.01 の id にかぎってけっこう厳しい。これに従っておけばエンコーディングでおかしな結果になることも避けられそうだし、これ以外の場合でも、この範囲内を使うようにしておけば困ることはないはず。
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").

_ で、何でこんなことを調べてたのかというと、テキストから HTML に変換するスクリプトで、id 部分をどうやって機械的に生成したらいいのか迷ったため。上の調査により、ruby 的に書くと、

def heading(level, title)
  id = "id_" + URI.encode_www_form_component(title.strip.gsub(/\s+/, "_")).tr("%", ":")
  "<h#{level} id=\"#{id}\">#{title}</h#{level}>"
end
としておけばだいじょぶかな。


<< = >>
やまや