ついでに、一太郎にほしいスタイル機能

今回の論文は数式が入らないので、アウトライン機能を見込んで一太郎で作成中。文書の見た目は完全にTEXのjArticleだけど。遊びすぎだっつの。
しかし、文書の論理構造とビジュアルの分離という点では、一太郎のスタイル機能ではまだまだ、できないことがいっぱいです。

  • 段落スタイルで、行頭記号として任意の文字を任意のスタイルで設定させてください。現状、行頭記号の選択肢は貧弱すぎます(中黒がない)
  • 行頭記号として、連番も使えるようにしてください。これができると、アウトライン機能と連携することで、見出し行設定と連番振りが一体化されます
  • 同じく段落スタイル、「段落前で改行」というチェック項目がほしいです。大見出しはページの頭にあってほしいですよね
  • ページ番号設定は目次機能と連動してください。標準機能で目次を自動作成してるんだから、目次が何枚あって表紙(目次より前のページ)が何枚あるかぐらい自明でしょう

EclipseにほしいJavaリファクタリング機能

もう十分すぎるくらい高機能なEclipseリファクタリング機能ですが。

  • 親クラスをフィールドに変換
  • フィールドを親クラスに変換(親子でのフィールド名衝突は自動解決)
  • コードを「メソッドを抽出」するとき、メソッドの作成先は他クラスも指定できるように
  • しかも、「メソッドを抽出」ではプロジェクト内すべてのクラスを検索して抽出可能なコードを変換

これがあったら今日の作業は10クリックぐらいで終わったのに。

prototype.jsを一カ所だけ修正してほしい

このはてなダイアリーでも使われているJavascriptライブラリのprototype.jsですが、Firebugを使っていると一点だけ困ることがあります。
Firebugはスクリプトがエラーを起こすとそこで必ず止まるんだけど、ちゃんとキャッチされるエラーでも止まるという悪い癖があります。そして、prototype.jsには、Try.theseというエラーを起こすことを前提にした記述のためのメソッドがあります。
Try.these使ってると、予定通りのエラーが起きたとき必ずFirebugのウィンドウが開いちゃうんですよね。Try.these使わない場合には大抵、エラーが起きないかどうか確かめてから(オブジェクトの存在やメソッドの存在を確かめてから)ブラウザ依存のコードを呼ぶ場合が多いのでこの問題は起きにくいんですが。
悪いのはFirebugだとも言えるんですが、prototype.jsをたった一カ所修正してくれればほとんどのサイトで止まらなくなるんです。それがここ。

var Ajax = {
  getTransport: function() {
      return Try.these(
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
      function() {return new XMLHttpRequest()}
    ) || false;
  },

IE用のコード(return new ActiveXObject('Msxml2.XMLHTTP'))が先に来ているからエラーを起こして止まっちゃう。Firefox用のコード(return new XMLHttpRequest())を先にしてくれれば止まりません。ここで成功したらIEのコードには制御がいかないので。
こういうことです。

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

ギャル曽根のあれが心配

可愛くてスリムなのに大食い、のキャラで人気のギャル曽根。あの食べっぷりは演出ではなくて実際のものだそうですが。
「あんなに食べてお腹をこわさないのか?」「カロリーオーバーで肥満にならないのか?」
という心配については、どうも体質的に大丈夫らしいですね。カロリーは、たぶん熱にして捨てられるんでしょう。
むしろ問題なのは、捨てられるカロリーではなくて、捨てられないものです。具体的にはナトリウムと、窒素です。
窒素は、タンパク質と言い換えてもほぼ同じ。糖分や脂肪分と違うのは、貯蔵が利かないので余った分はすべて捨てないといけないということです。しかも、それはすべて腎臓の仕事。
そして、腎臓はダメージを受けると再生はしないというかよわい臓器です。ちなみに腎機能が低下するとナトリウムが捨てられないとかその他の理由から血圧が上がって、高血圧はさらに腎臓にダメージを与えるという悪循環が始まります。
常人と同じ食事を何人前も食べていればナトリウムも窒素も明らかに摂取過剰。早くから腎不全の悪循環に陥る危険があり、それがなにより心配です。

平行移動だって変換行列で

以前、幾何計算はベクトルで考えるときれいにプログラミングできるというコツを書きました
その続編として、図形のズームや回転、移動があるときには、ベクトルは必須ですよという話。

拡大縮小と回転には変換行列、これは習いましたね?

これは高校の代数幾何学で習ったはずです。座標をベクトルで表せば、特定の行列をかけるだけで拡大縮小と回転ができること。
横にx倍、縦にy倍のズームは\left(  \begin{array}{ccc}   x & 0  \\ 0 & y \end{array}\right)で、
原点を中心にθ度の回転は\left(  \begin{array}{ccc}   \cos \theta & -\sin \theta  \\ \sin \theta & \cos \theta \end{array}\right)です。

試しにやってみましょう。(10,10)を横に2倍、縦に0.5倍でズームすると
\left(  \begin{array}{ccc}   2 & 0  \\ 0 & 0.5 \end{array}\right)\left(  \begin{array}{ccc}   10  \\ 10 \end{array}\right)=\left(  \begin{array}{ccc}   20  \\ 5 \end{array}\right)
(10,10)を90°回転させると
\left(  \begin{array}{ccc}   0 & 1  \\ -1 & 0 \end{array}\right)\left(  \begin{array}{ccc}   10  \\ 10 \end{array}\right)=\left(  \begin{array}{ccc}   -10  \\ 10 \end{array}\right)

行列による座標変換のいいところは、変換行列同士を掛け合わせてしまうことができることです。何段階かの変換も、その行列を掛け合わせてたった一つの行列にできるので、記述も簡潔になるしなにより計算が早い。不可逆な変換でなければ、逆行列を求めることで逆変換も簡単に記述できます。

でも、回転とズームだけではたいした変換はできませんね。やはり水平移動がないと…… 水平移動は、無理なのかな?

余分な一次元が、水平移動を可能にする

2次元のベクトルに2×2行列を掛けるだけの変換では、水平移動を記述することはできません。が、余分な一次元を加えることで、簡単にそれが実現できてしまうのです。
余分な一次元ってなに?
それは、座標(a,b)をこう書くことです――(a,b,1)。
ダミーの次元を付け加えて、値を1としておく。これだけです。座標が3次元表示になるから、変換行列は3×3になりますね。
ズームと回転の変換行列は、こうなります。
\left(  \begin{array}{ccc}   x & 0 & 0  \\ 0 & y & 0 \\ 0 & 0 & 1 \end{array}\right)\left(  \begin{array}{ccc}   a  \\ b \\ 1 \end{array}\right)=\left(  \begin{array}{ccc}   ax  \\ by \\ 1 \end{array}\right)
\left(  \begin{array}{ccc}   \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\0&0&1\end{array}\right)\left(  \begin{array}{ccc}   a\\ b\\1\end{array}\right)=\left(  \begin{array}{ccc}   a\cos \theta -b\sin \theta \\ a \sin \theta + b \cos \theta \\ 1 \end{array} \right)
2×2のときの変換行列の右と下に0を詰め込んだだけですね。これで、ダミーの3次元表示を回転&ズームできます。

次に平行移動。ここで初めて、3×3行列の余った場所を使います。
\left(  \begin{array}{ccc}   1 & 0 & x  \\ 0 & 1 & y \\ 0 & 0 & 1 \end{array}\right)\left(  \begin{array}{ccc}   a  \\ b \\ 1 \end{array}\right)=\left(  \begin{array}{ccc}   a+x  \\ b+y \\ 1 \end{array}\right)
うわ、ほれぼれするくらい簡潔に移動が記述できましたね!

実は、頻用されています

ダミーの次元を加えるというやり方、初めて知った人にはかなりトリッキーなやり方に思えるかもしれません。でもこれは、図形を扱うシステムではわりとよく使われる技法です。
例えば、postscript……ひいてはPDFでは2次元図形の座標を3次元で表示して変換しています。Direct3Dでも、空間図形の座標は4次元表示。3次元の図形を移動するには4×4行列を使うんですね。

僕はこの技法を知る前にDirect3Dのことを習って、変換行列が4×4行列である理由は「そういうものなんだ」と教わりました。ひどい先生に出会ったものだと思います。