2010-09-11
*1284167528*HTMLで雑誌の原稿を書くためのツール
こんなの作った
img src=http://gyazo.com/4997c984d379a4bb468ffee925d81df0.png
img src=http://gyazo.com/56313c86a3bb1b7c6a902c5e296c34fd.png
***モチベーション
テキスト形式での納品を求められるけども、もうちょっとメタデータの乗せやすいフォーマットで書きたいなぁ、ついでに言えば自分が今どれくらい書けているかのイメージを掴む上でも、人に渡してレビューしてもらうにしても、編集しているものが手軽に見やすい形にできるといいなぁ。プログラムで扱うのが楽なフォーマットがいいなぁ。ってそれHTMLでいいんじゃない?
***過去の実装
Jython本を執筆するときは「求められているテキストフォーマットに最低限のメタデータを載せられるようにした独自フォーマット」からHTMLと納品用テキストに変換していたが、メタデータの載せにくさと自分の書いている原稿のプレビューのたびに変換スクリプトを走らせるののめんどくさにこのアプローチはダメだと思った。
***現在の仕様
1行23文字、1ページ42行、1ページ2カラム構成の紙面を想定。 JSとCSSで真面目に2カラム構成をやる気にはならなかったので1カラムだけを縦に表示して、およそ1ページ分の間隔で赤い横線をひくことにした。文字のフォントサイズは17pxに固定して、カラムの幅は400px(17 * 23 = 391)、ページの縦幅は1114px (17 * 42 * 1.5 = 1071)にしてある。Firefox以外だと想定外になったりしそうな気もするが、まあとりあえず原稿を書いてから考えよう。
***出力フォーマット
||
$ convert.py genko.html
||
ってやると標準出力にタグとかdiv class=ignoreで囲われた部分とかを取り除いて出力するんで適当にリダイレクトしてファイルに保存してください。-oってオプションをつけるとアウトラインモードとして表題だけ出力するよ!
***ライセンス
GPLv3だよ!あたりまえだけどもこれを使って作った原稿とかにライセンスは波及しないよ!
hr
というものを作った。まだこれから実際にこれを使って書いてみて問題点を見つけてどんどん修正していくアルファ版だけどとりあえず公開しておく
http://bitbucket.org/nishio/genko
*1284172426*RubyとCの x = y + y = x について
Rubyで x = y + y = x と書くとこれは x = y + x と y = x を行ったのと同じ振る舞いをする。
|ruby|
x = y = 1
= 1
x = y + y = x
= 2
x, y
= 2, 1
x = y + y = x
= 3
x, y
= 3, 2
x = y + y = x
= 5
x, y
= 5, 3
x = y + y = x
= 8
x, y
= 8, 5
||
なぜかというと、まず
||
x = y + y = x
||
の y = x が実行されてその代入式の値はxになるから
||
x = y + x
||
ところで、これはCでも動くと思って試してみたがしたのようなエラーになってしまう。
||
error: lvalue required as left operand of assignment
||
これはおそらく+の結合強度の方が=の結合強度より高いから
||
x = (y + y) = x
||
と解釈されて、 y + y は左辺値ではないので代入の左辺にこれないってことなのだが、じゃあ、と
||
x = y + (y = x);
||
にしてみたら、これは x = x + x になってしまった。ふむ、+の引数って右辺から評価されるの?そう思って関数呼び出しに変えてみたら左辺が先に評価された
|cpp|
#includeiostream
int y = 5;
int get_y(){
std::cout get_y: y std::endl;
return y;
}
int main(){
int x = 3;
x = get_y() + (y = x);
std::cout x , y std::endl;
}
||
get_y()の時は8,3になり、そこをyに置き換えると6,3になる。a href='http://www.cppreference.com/wiki/jp/operator_precedence'C++ 演算子の優先順位 C++ Reference/aによれば式の評価順序は未定義な物が多いとのこと。要するに代入という「副作用のある処理」を式の中に混ぜると評価順序によって異なる結果になるからやめようね、ってことね。
ちなみにPythonでは
|python|
x = y = 1
||
という「= Expr が1個以上続いたもの」を「代入文」として定義しているので上のようなことがそもそもできない。下のように書く。
|python|
x, y = y, x + y
||
hr
ささださんのTweetに反応して書いたのだけども、ささださん曰く出典はこれらしい: http://jarp.does.notwork.org/diary/201009a.html#201009101