nDiki : 文法

2005年9月13日 (火)

[ WiKicker ] hell mode - HTMLタグ付けブロックの導入

WiKicker では、直接 WikiPageHTMLタグを記述して表示に反映させる機能を提供していない。

HTMLタグ付けを許すのは嫌だ

HTMLタグ付けを許すと

  • 入力ミスによるトラブル
  • 悪意ある入力によるトラブル

が起きやすくなるし、ページのソースの単純さが大きく失われてしまう。 レンダリングしてHTMLにした時に、正しいHTMLを出力されることを保証することが困難になるとともに、HTML以外へのレンダリング/コンバートもかなり難しくなる。

この機能を導入すると、Wiki の良さの半分(あるいはもうちょっと沢山か、もうちょっと少なめ)が失われてしまう。

でも

とはいえ欲しいという声があることも事実。 オープンな WikiForum では全くお勧めできないが、閉じたユーザグループの中ではまぁ必要悪なのかもしれぬ。

また正直ちょっとした表現を追加したい時に、WiKicker 用のプラグインを書くのも面倒だというのは確かにある。

WiKicker では開始・終了マーカによる複数行にまたがるブロックを表すための文法は(閉じ忘れを避けるため)意図的に排除してある。 このため、複数行にわけて書きたいような長いデータを扱うような拡張も導入しにくい。

ちょっと手抜きして「生HTML書けちゃえば」という誘惑はなくはない。

大人の事情

ということでまあ自分に言い訳をしつつ、標準ではオフというかたちで HTMLタグ付けブロックを導入することにした。 スイッチは hell mode とかにしたい (今回は syntax.html というプロパティ名にしたけれど)。

記法は単純に、

 normal wiki syntax text...
 <html>
 html tagged text...
 ...
 </html>
 normal wiki syntax text...

のように行頭が <html> である行から、行頭が </html>である行までをHTMLタグ付けブロックとすることに。 このため、<html>ではじまる段落が書けなくなるという小さな非互換が発生するが、いたしかたない。

サニタイズ

HTMLタグを直接使えるようにするとはいえ、全てを許してしまうのはあまりに危険で非人道的すぎる。 有効なHTMLタグや属性は限定的であるべきだ。

このあたりの処理は面倒だが、幸いにしてCPANにモジュールがある。 今回は HTML::Scrubber を使うことにした。 HTML::Parserを使って parse し、指定したルールに従ってサニタイズしてくれる。

ちょっと使ってみた範囲では日本語(UTF-8UTF8 フラグなし)でも問題ないようだし、文法的に正しくなくてもきちんとサニタイズできているようだ。

ということで、これを採用することに。

どの要素・属性を許すかはまだきちんと決めかねる。 当面は様子をみながら、調整していく予定。 サニタイザは設置者が置き換えられるようにプラガブルにしておかねばならないな。

スポンサード リンク
[ 9月13日全て ]

2005年11月21日 (月)

定型書式で内容を記述していくのに便利な形式は?

要求仕様書LaTeX で書いている。 要求と仕様の組をまとめて longtable で記述しているのだが、 LaTeX らしい繁雑さがあってちょっと効率が悪い。 マクロを定義すればある程度書きやすくなると思うが、それでもそこそこまでな気がする。

文書の中にレコードの並びが書けて、レコードの並びの中に文章が書きやすいそんなフォーマットはないものかなぁ。

  • LaTeX + マクロ
    • 整形は綺麗。
    • 記述が繁雑になりがち。\マクロ名とか {} とか。
  • DocBook
    • 仕様デカスギ
    • 以前使ってみたことがあるが、手で書くのにはしんどい。
  • XML
    • 構造的な情報の表現には良いのだが、手で書くのはしんどい。開きタグも閉じタグも。
    • 普通の章節や、マークアップのルールを考えなければならない(定義するか借りてくるか)。
    • LaTeX等へのコンバータを書く必要あり。
  • YAML
    • レコードの並びだけだったら良いが、文書の他の要素を一緒に書くのには適さない。
    • ある程度の構造やボリュームがあると、思ったほど手書きしやすくない。
    • YAML Perl モジュールで痛い目にあっている。

Wiki に慣れきっている自分にとっては Wiki 文法のような感じで記述できて、一部に定型レコードの並びが書けて、そこの整形ルールだけ定義してあげれば LaTeX に変換できるとかそういった感じがのものが欲しい。 定型レコードの部分は RFC822 のヘッダみたいな感じで良くで、値の部分に長めの文章を複数行で書けるものがいい。

構造化テキスト用フォーマット、あるいはWiki フォーマットをアレンジするのがいいかもしれないな。 このあたりのフォーマットは、ソーステキストのままでも十分読み易いことを意識して定義されているので書くのは楽。

  • reStructuredText
    • いいらしい。
    • HTMLLaTeXXML へのコンバータがある。
    • 拡張性も考慮されているらしい。
    • でも Python
  • Markdown
  • WiKicker (Wiki)
    • かなり書き慣れている。
    • レコードの並びの書き方を考える必要あり。
    • 複数行にまたがる処理を書くのが面倒。
    • 自分で書いているシステムなので中身は何でも知っている。
    • マイナー。

レコード部分とは関係ないけれど reStructuredTextMarkdown の「アンダーラインのあるテキストを見出しとする」っていうのはいいな。 普段メールプレーンテキストでちょっと文書を打つときに使っているスタイルと一緒だ。

要求仕様書用に使うかどうかは別として、要チェック。

[ 11月21日全て ]

2005年11月24日 (木)

早速 reStructuredText から LaTeX へのコンバータを書く

要求仕様書を書くのに reStructuredText を使ってみることにしる。 reStructuredText文法の上で、あるルールに従って書いた特定のセクションやフィールドリストを要求レコードや要求仕様レコードとし、自前でコンバータを書いて LaTeX へ変換する形。

まずは最初のアイデア通り rst2xml で XML に変換してから、Perl スクリプトで読み込んで処理することにする。

Perl 側の処理は XML::LibXML で (何となく XML::DOM より好き)。 しかし毎度ながら DOM 面倒くさい。 とりあえず、今必要な要素のみ変換コードを書く。 reStructuredTextXML へ変換した時の DTD があるので、おいおいこれを見ながらきちんと埋めていかねば。

最低限のものができて、早速コンバート。

これで生 LaTeX で書くより随分楽になった。よし。

[ 11月24日全て ]

2005年12月31日 (土)

私的10大ニュース2005 [ comp ]

今年は主に開発等よりもオンラインサービスの活用が中心的な話題であった。 来年度は、積極的に何かを産み出していきたところである。

Skype

rimage:/nDiki/Flickr/2930278321.jpg 年初はまずは Skype。 社内でも本社との連絡に活用されるようになった。 これほどツールがスムーズに社内に広まるのは珍しい。

社内といえば、やっと Wiki の利用が社内で広まってきた。今後より利用が進むといろいろ不満も出てくるはず。 それをうまく吸い上げていくことが重要。

ソーシャルブックマークサービス

Squrl を使いはじめて、はてなブックマーク1本へ。 2月のサービス開始から使いはじめてブックマークの数は 3,337。

folksonomy という観点では folk (folc / people) を実感できなかった。 タグは主に自分で分類するのに使っているというところ。

Flickr

2月に使い始めて、5月に Pro Account へ。 これで www.naney.org の容量を気にしなくて良いようになった。

Bloglines

RSS を発行しているサイトの巡回は Bloglines へほぼ集約。 斜め読み化が進んだ。

reStructuredText

可読性の高いテキストマークアップ文法

この文法で書いておけば、メールでやり取りをしてまとまった内容をそのまま書き換え直さずに、小綺麗に整形してHTMLPDF形式にすることができる。

ちょっとした文書の作成にもってこい。

今後環境整備や、自分なりの運用スタイルの確立がポイント。

[ 12月31日全て ]

2006年5月16日 (火)

社内 Blog 開設

ウェブ進化論の中の Google の話に触発されて、そのうちやろうと思っていた社内 Blog の開設を行ってみた。

DiKicker を使用

ソフトウェアnDiki で使用している DiKicker を。 コメント機能・トラックバック機能が無いためコラボレーション的な要素はあまり望めないかもしれないが、RSS フィードもあるし社内情報発信のとっかかりとしては十分かと。

そのかわりにキーワードで串刺し表示する機能を使ってプロダクト名やプロジェクト名など決まったテーマをまとめて読み進めることができるため、社内利用には向いているのではと考えている。

検索機能が無いのは痛いので、早めに手当てする必要あり。

運用

特に全社的に強制導入とかではなくて、まずは自分が試行錯誤しながら運用してみるといった感じで進めるつもり。 自分がガンガン情報を書いて、メールに permalink を貼りつける。

メンバに定期的に見てもらうには、随時小ネタをしこむ必要があるかなぁ。 他にも書く人が現れて、社内での RSS 活用が進めばしめたものである。

ちなみに各人が使うのは DiKicker にこだわるつもりは全然無くて、適当に設置してくれればと考えている。 DiKicker 社内で使っている Wiki (WiKicker) と同じ文法とはいえ細かいところは便利じゃないので、むしろ違うものが流行ったほうがいいかなとも(数人は一緒に DiKicker を使ってくれると嬉しいけど)。

ある程度 alpha な人が開設し揃って波がおきたら、普通の人でも簡単に書けるような環境を整備してより広めていきたい。

[ 5月16日全て ]

2007年4月3日 (火)

WiKickerJSON でのページ出力機能を追加

最近は DiKicker ばかりに手を入れていたが、久しぶりに WiKicker の改良も行っている。 しばらく前から実装を始めていた JSON 形式での出力機能が今日完成。

今までは WikiPage について

  • HTML 形式による出力
  • Wiki 文法で書かれている生テキスト形式による出力

という2つの出力形式を持っていたので、JSON が加わることで3つめとなる。

サーバ側で WikiPage の構文解析まではやる

クライアントサイドの JavaScript でページの内容に合わせて様々な処理をできるように、サーバ側で構文解析まではしてあげるというのが主な目的。

JavaScript でまたパーサを書いてメンテしていくのも大変なので、その部分はサーバでやってしまおうかと。 構文解析した結果の解析木を JSON 形式で返して、JavaScript 側であとはお好きにという形。

CPAN にある JSON モジュールを使用

サーバ側の Perl プログラムには、構文解析をして解析木を作れるようになっている。 この解析木から Visitor パターンで JSON 形式を生成していく。

依存モジュールを増やすことを避けるべく、最初は自前で JSON 形式に変換していこうと思ったのだがやっぱり面倒だった。 ということで CPAN にあるモジュールをチョイス。

JSON 関連では JSONJSON::Syck、JSON::PC などがあるが今回はインストールのしやすさを考えて pure Perl モジュールとして実装されている JSON を採用することにした。

Visitor クラスで解析木を無名ハッシュ/無名配列のツリーに変換して、JSON モジュールに流しこめば OK。

 use JSON;
 my $json = JSON->new(pretty => 1);
 my $js = $json->objToJson($tree);

WiKickerフレームワークにはフォーマット別に出力を切り換える機構があるので、これに JSON を追加して application/json で送るようにして完成。

ちなみに残念ながら JSON 1.07 は Perl 5.005_03 では make test が fail するので、NaneyOrgWiki では使えない。

[ 4月3日全て ]

2007年11月23日 (金)

最近の Twitter ステータスを nDiki最近のさえずり」ページに自動表示

11月9日から「Twitter ステータスを nDiki サイドバーに表示」しているのだが、それで使っているスクリプトにちょっと手を加えて「最近のさえずり」という nDiki ページを自動生成/更新するようにした。

サイドバーRSS フィードと同じく最近の20件を表示するのに対し、最近のさえずりページには数日分表示するようにした。

ここ最近は Twitter のステータスをとりまとめて、ライフログ的に nDiki に上げているのだが、今までは Twitter Web ページやサイドバーの部分から手作業でコピーして日時やリンクを整形していたので面倒であった。

今回の(30分毎に)自動更新するページは最初から WiKicker / DiKicker 用の Wiki 文法で出力している。 なので、これからはこの自動生成ページから必要なものだけを抜き出して貼り付ければよい。 これで楽ちんになるはず。

ほぼ自分用。自己満足。

[ 11月23日全て ]

2009年10月23日 (金)

さくらのレンタルサーバ プレミアム申し込んだ

www.naney.org で使っているホスティングサービスは

  • SSH が使える。
  • daemon プログラムを起動しておいても怒られない。
  • cron が使える。

という点でいろいろ遊べるのだが、

  • 今の相場的にはかなり高めなのにホームが容量 100MB (メールは別に 100MB)。
  • Perl が10年以上前の Perl 5.005_03。自分で新しい Perl を入れようにも容量 100MB だと厳しい。5.005_03 だと Perl 5.6 系以降の文法が使えないし、使える Perl モジュールも限定されているので悲しい。
  • 夜中になると analog が動いてサーバが重くなる。
  • メールの送受信が遅延することがある。

などから使いづらくなってきた。 なにより容量を気にして記事を書き控えようという心理が働くのがよろしくない。 そろそろ今後を考えて他社に乗り換えようかと。

選んだのはやはり人気があって SSH も使える「さくらのレンタルサーバ」。

選んだプランは容量 10GB のプレミアム。 スタンダードでも容量 3GB でまずまずだし cron も使えるから機能的にも十分なんだけれど、1ホストあたりの収容ユーザ数により余裕があるであろう1つ上のプランにしておいた。

Web から申し込んで、風呂に入っている間に DNS 設定が反映されて SSH ログインできるように。 順次ソフトウェアのインストール・コンテンツの移行とメールの設定をしてから、naney.org をこちらに切り替える予定。

[ 10月23日全て ]

2010年10月20日 (水)

今日のさえずり: ロック方式のバージョン管理機能やっぱりお肌にあわない

2010年10月19日

  • 10:25 素晴らしい。Data::MessagePack 0.34 のおかげで Xslate も Strawberry Perl 上にインストールできるようになりました。
  • 11:57 Strawberry Perl + Twiggy + Plack + Mojolicious + DBIx::Skinny + PostgreSQL + Xslate でやろうかな。
  • 12:06 和風牛丼 350円。 (@ なか卯 神田佐久間町店) http://4sq.com/9tdwTs
  • 12:56 Git 使ったことないのでチュートリアル読んでる。
  • 13:42 Red Hat Linux 8.0 (古)上で Git 1.7.3.1 のコンパイルに失敗したので先に OpenSSL 1.0.0a をコンパイルしていることろ。
  • 14:20 駄目だ。Git のコンパイル通らん。
  • 18:07 K-9 Mail 3.200 出た。 #Android
  • 21:17 mopera U U ライトプランって日割じゃなかったのか。9月1日に廃止したけど9月は満額請求されてた。
  • 22:12 Git ってまだ Windows 使うのは難があるのかな。だとオフィスの Linux サーバに Git インストールしておいても自分以外使う人いないので無駄だな。

2010年10月20日

[ 10月20日全て ]

2010年11月11日 (木)

Evernote 上で reStructuredText で書いてクリップボード経由で HTML

Evernote の書式機能はしょぼい。 Evernote 上でちょっとした文書を書く場合は reStructuredText 形式で書いておいて必要な時に HTML 形式などに変換したいのだが、ノートの内容に対してコマンドを実行する機能などがないのでクリップボード経由で rst2html を呼ぶようにしてみた。

Evernote for Windows 4 のノート上で全文選択して[コピー]後、以下の Perl スクリプトを実行するとクリップボードの内容に対して rst2html を実行して HTML ファイル生成後、デフォルトブラウザで開いてくれる。

 #!/usr/bin/perl
 
 use warnings;
 use strict;

 use Encode;
 use Win32::Clipboard;
 use File::Temp;

 my $clip = Win32::Clipboard();
 exit 0 unless $clip->IsText();
 my $text = $clip->GetAs(CF_UNICODETEXT);
 $text = Encode::decode("UTF16-LE", $text);
 $text =~ s/\015\012\015\012/\015\012/g;
 $text =~ s/\x{00a0}/ /g;                  # U+0020

 my $tmp_file = File::Temp->new(SUFFIX => '.rst');
 binmode($tmp_file, ":encoding(utf8)");
 print $tmp_file $text;
 system "rst2html", $tmp_file, $tmp_file . '.html';
 system "start", $tmp_file . '.html';

まずは的 Perl スクリプトなので、ファイルは一時ファイルとして作成していて削除もしていない。なお rst2html は設定ファイルで [general] input_encoding: utf-8 に設定してある。

Evernote のクリップボードテキストを処理するのに、ちょっと工夫がいる点は以下。

  • 現在の Windows 版では空行が増殖するので削除してあげる必要がある。
  • 一部空白が U+0020 (NO-BREAK SPACE) になる。

どちらもそのままだと reStructuredText 文法的におかしくなるので、変換してあげる必要あり。

HTML 版のプレビュー

  1. 全文選択
  2. コピー
  3. Perl スクリプトの実行

と3アクションあるので若干手数が必要だが、そこそこ便利。 Perl スクリプトの方は Win32::Clipboard::WaitForChange() あたりを監視するようにするともう1操作減らせるはず。

[ 11月11日全て ]

About Me

Naney Naney

Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

About nDiki

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。

#nNote タグがついている記事は他の記事に比べて、より断片的・未整理・不完全なちょっとしたノートです。まだ結論に至っていない考えなども含まれます。頻繁/大幅に更新したり削除したりすることがあります。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Other Notes

ナレッジベースアプリケーション Obsidian で書いているノートの一部を notes.naney.org で 公開しています。

月別インデックス
Process Time: 0.054687s / load averages: 0.54, 0.52, 0.47
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker