_ 動きません。
_ freebsd の linux エミュレーションを使っても、dropbox が利用している inotify のシステムコールがサポートされてないので、やっぱり動かない。リアルタイムに同期されなくてもいいのであれば、 公開されている API を使ったツールで操作できるけど、それだったら dropbox を使わずにふつーに rsync で同期すれば十分であまりうれしくない。
_ ムリヤリ動かす方法。
うん、母艦が freebsd だから freebsd 上で動いてることにしよう。これだけのために Linux な環境を作るのであればムダすぎるけど、どうせ実験環境のためにひとつ作るつもりだったのでまあいいかな、と。いいんだよ、使いたいのであって動かしたいわけじゃないんだから。
- bhyve (じゃなくてもいいけど)で linux の guest vm を作る
- その上で dropbox を動かす
- Dropbox の同期対象ディレクトリを NFS で共有する
_ で、試しに CentOS7 を入れてみたけど、噂に聞いてた systemd が想像以上に謎すぎてよくわからん…。
_ ちなみに inotify がないというまったく同じ理由で FreeBSD では lsyncd も動かない。*BSD には kqueue という仕組みがあるけど同じものではないのでそうそう簡単にエミュレートできるものではないみたい。以前、 がんばってエミュレートしてやるぜ的なライブラリを見つけて試してみたことがあるけど、これを使っても lsyncd はやっぱりまともには動かなかった。
_ ただのメモ。http://www.example.org/hoge.html#fragments という URL における #fragments の部分について。
_ RFC3986 の定義ではこんな感じ。
要するに、ほとんどの英数記号が使えて、許されないものでも %-encoding してやればよい。RFC2396 も、定義は若干異なるけど結果としてはほぼ同じ。fragment = *( pchar / "/" / "?" ) pchar = unreserved / pct-encoded / sub-delims / ":" / "@" unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" pct-encoded = "%" HEXDIG HEXDIG sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="_ RFC1738 ではまったく異なっていて、
で、URL に #fragments は記述できない。マジかよ。知らなかった。まあ obsoleted だから無視しよう。httpurl = "http://" hostport [ "/" hpath [ "?" search ]] hpath = hsegment *[ "/" hsegment ] hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ] search = *[ uchar | ";" | ":" | "@" | "&" | "=" ]_ W3C による URL の定義。必要な部分だけ抜粋。
A fragment must be zero or more URL units.ほとんどの英数記号と、%-encoding な文字列が使えちゃうよ。一部の unicode 文字はエンコードなしでそのまま使えるよ。
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._ fragments は URL として指し示された先の HTML 文書内では、<a name="fragments"> とか <h1 id="fragments"> てな感じで指定される。その定義はどうなっているのか。
ちうことで、おおむねどんな文字も使える緩い定義だけど、HTML4.01 の id にかぎってけっこう厳しい。これに従っておけばエンコーディングでおかしな結果になることも避けられそうだし、これ以外の場合でも、この範囲内を使うようにしておけば困ることはないはず。
- HTML5
- idは空白文字不可、長さ1以上、という制限だけ(空白以外はどんな文字も可)
- a の name 属性は廃止された
- HTML4.01
- idは 先頭はアルファベットのみ、続く文字は英数と一部記号のみ
- a の name 属性は CDATAなのでほとんどなんでもあり
- id と name は同じ名前空間を共有するけど、使える文字が異なるということに
- HTML3.2
- id 属性はない
- a の name 属性は CDATAなので何でもアリ
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