TrueTypeフォントの0x5cを円記号からバックスラッシュに書き換える方法を紹介。IPAフォントに直接適用できるパッチと、TrueTypeフォント一般(ただし*.ttfのみ)を書き換えるスクリプトを提供。
試しにGNOMEを導入したのでGNOME Terminalを使い始めた。 ところがその中でIPAフォントを使ってみたら、0x5cが 円記号で表示されるのが気になって仕方がない。
そこで0x5cのグリフがバックスラッシュになるよう、fontforgeで編集した。
続きを読む原口證さんという方が10万桁もの円周率の暗唱に成功とのニュース。
日本語には語呂合わせというものがあるので、一見無意味な数字の並びを暗唱するのに大きな助けになる。円周率の語呂合わせとしては次のものやこれに類似したものがおそらく最もよく知られていよう。
産医師異国に向かう 3.14159265 産後厄無く 358979 産婦御社(みやしろ)に 3238462 虫さんさん闇に鳴く 643383279
しかし英語では日本語のようにはいかない。ではどうするのかというと、単語の文字数を数字に当てはめるのだそうだ。多数作られているが、例えばこういうものがある。
How I want a drink, alcoholic of course, after the heavy lectures involving quantum mechanics!
1単語1数字というのも効率が悪そうだが、それぞれの単語から数字を出すのも大変そうだ。それに対して日本語は有り難い。尤も、同じ数字に対する候補が多いので考え出しやすいという一面はありそうだから、悪いことばかりではない。
英語での語呂合わせ的な記憶法の中で一般的なのは、何かの並びを憶えるためにそれぞれの頭文字が同じ単語で文を作るものらしい。例えば、太陽系の惑星の場合は
My Very Educated Mother Just Showed Us Nine Planets
などがあるそうだ(惑星の英語名は水星から順に、Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto — Plutoは最近格下げされたが)。
WikipediaのEnglish mnemonicsの項では他にも色々なものが紹介されていて面白い。計算機関係ではOSI参照モデル(Physical layer, Data link layer, Network layer, Transport layer, Session layer, Presentation layer, Application layer)の憶え方というのもある。一例を挙げると
Please Do Not Tell Sales People Anything
または上位層から逆順に
All People Say They Never Download Porn
もう傑作である。
このページと、同じくWikipediaの日本語の語呂合わせの項を比較すると違いが際立つ。英語では様々な対象に対して憶え方が作られているのに対し、日本語では数字の語呂合わせには熱心だが、それ以外の対象にはあまり積極的に行われないように思える。その理由をあれこれ考えてみると面白いが、一つには、憶え方を工夫する必要などなさそうなPCMCIAについてまで作られているのを見ると、日本語の駄洒落に似た言葉遊びを楽しむ面も大きいのかも知れない。
今更の感も強いが、これまで見様見真似でしか書いたことのなかったJavaScriptを勉強した。
教科書はO'reillyの JavaScript: The Definitive Guide, 4th Edition, David Flanagan。 日本語訳は第3版がJavaScript第3版として出ているが、第4版は出ていないようだ。
web上のJavaScriptの紹介にはHTML上の効果としての使い方しか載せていないもの、入門と銘打っていても言語の表層的なシンタックスしか解説していないものがほとんどで、言語として理解しようとすると物足りない。
一方、この本では前半分を使って言語としてのJavaScriptを丁寧に説明している。特に他のプログラミング言語の知識がある人には非常にわかりやすく、面白い。後半はJavaScriptの主な用途であるウェブブラウザでHTMLと組み合わせての使用のため、そこで登場するJavaScriptオブジェクトを説明するとともに、合わせて必要となるHTMLフォームやCSS、クッキー等の知識も要領よく解説している。
言語としてのJavaScriptは結構面白く、一読してもっと早くこの本を読んでおけばよかったと感じた。ただ、多くの項目でブラウザやJavaScriptのバージョンによって色々事情が異なるらしく、互換性についての記述が細かい。そのため言語を使おうとする側としては面倒な感を受けるが、多様なブラウザが使われている現状では致し方ないだろう。もっとも、記述があることは解説書としてそういった差異を丁寧にフォローしていると言える。
そのJavaScriptという言語であるが、JavaScriptは演算子や制御構文といった基本的なシンタックスはCやJavaに似ている。コメントの構文もC/Java譲り。 しかし、似ているのはそれだけ。言語としてはむしろScheme等に近く、そこにプロトタイプベースのオブジェクトを持ち込んだ感じである。
まず、変数には型がない。値は数値(整数と浮動小数点数の区別はなく、64bit浮動小数点数で全てまかなう)、ブーリアン、文字列、そしてオブジェクトのみ。文字列はimmutable。これらの間で必要に応じて暗黙の型変換があり、便利でもあるが嫌らしいような気もする。
クロージャがある(クロージャはオブジェクトの特殊なサブタイプとして扱われる)。 関数定義はクロージャの変数への束縛にすぎない。次の2つはほぼ同義。
function foo(x) { return x } var foo = function(x) { return x }
括弧をつけてfoo(1)
とすれば関数適用だが、foo
と名前だけ書くと変数として参照する。
クロージャであるから当然次のようなコードも可能。
function make_counter() { var x=0 return function() { return x++; } } var c = make_counter() alert(c()) // 0を表示 alert(c()) // 1を表示
以上に加えて、オブジェクトがある。JavaScriptでいうところのオブジェクトは畢竟、文字列をキーとする連想配列だ。オブジェクトの要素をプロパティといい、通常obj.prop
として参照するが、obj["prop"]
としても参照できる。連想配列なので、他の言語のハッシュテーブルにも似た
var p = { x: 10, y: 20 }
というリテラル表現でも書けてしまう。
オブジェクトのメソッドは、単にプロパティにクロージャが代入されているものだ。
obj.method = function () { ... }
後ろに関数適用の括弧をつけてobj.method()
とすればメソッド呼び出しとなる。
ただし、JavaScriptの関数ではthis
という暗黙的に用意される参照があり、obj.method()
という形式で呼ぶとその関数の中でthis
がレシーバobj
を指す。ちなみに通常の関数呼び出しでもthis
はあり、グローバル環境の実行コンテクストを指す。
オブジェクトの作成はnew
演算子をつけて関数を呼ぶことで行う。new Constructor()
とすると、新しい空のオブジェクトが作成され、関数Constructor
が呼ばれる。関数Constructor
の中ではそれをthis
として参照できる。オブジェクトを作るための関数(これをコンストラクタと呼ぶ)は、この新しいオブジェクトに必要なプロパティやメソッドを与えることでオブジェクトを「作る」。例えばこんな具合。
function Point(x,y) { this.x = x; this.y = y } var p = new Point(10,20)
JavaScriptにはクラスという概念はないが、あるコンストラクタが作成するオブジェクトに共通のプロパティを集めたオブジェクト(これをプロトタイプと呼ぶ)を持てる。オブジェクトは、プロトタイプが持つプロパティを自分自身が備えているかのように振舞う。
function Circle(r) { this.r = r } // コンストラクタのprototypeプロパティがプロトタイプを指す。 // デフォルトではプロトタイプは空のオブジェクト。 // そこにメソッドを追加する。 Circle.prototype.area = function() { return 3.141592 * this.r * this.r } var c = new Circle(5) alert(c.area()) // 78.5398と表示
他にもあるが、JavaScriptはどういう言語かというと概略こんな感じの言語である。
追記。JavaScript: The Definitive Guideは2006年8月に5th editionが出版される予定らしい。5年振りの改訂で、XMLやAjax関連の記述も加筆されるようだ。
MinCaml 0.0.9に合わせて改訂した。加えてレジスタ割り当ての項を大きく書き直したが、わかりやすくなったのかどうか。不勉強ながらレジスタ割り当ての様子についても理解したと思うところを筆を加えたが、こちらは正直言って自信がいまひとつである。
久しぶりにチェックすると版が進んでいた。以前読んだ時からの変化を確認するためにダウンロードし、まずはregAlloc.mlを読む。
読みながら頭の中を整理し直していると、ToSpill
による処理の後戻りをなくしても同じ実現できることに気がついた(レジスタ割り当てを行うregAlloc.mlは、レジスタが溢れる度に溢れた変数の定義時点まで立ち戻って処理をやり直すという大変面倒な作りになっている)。
実際にコードを変更して目論見通りの動作を確認。 付属のテストプログラムで確認したところ、オリジナルと同等のコードを生成した(実は一点だけわずかに良くなった)。SPARCを触れる環境にないため確認は生成したコードのdiffによっている。
後程、詳細を記事にする予定。合わせてレジスタ割り当ての解説の項をわかりやすく書き直す。
MinCamlコンパイラを読み終えた。
このコンパイラはOCamlで書かれたMinCamlというML系のサブセットの言語のコンパイラで、SPARCアセンブリを生成する。 「速攻MinCamlコンパイラ概説」というパート毎にソースコードと短い解説が合わせて読めるwebページが作られており、これを案内として読んでいった。
MinCamlコンパイラはコンパイルという仕事を変換の連続と定義している。コンパイラの構成はパートごとに綺麗に分かれていて、それぞれのパートも小さい。 MinCamlの言語としての仕様は教育目的に非常に割り切った仕様であり、これはコンパイラのソースコードを簡潔で理解しやすい大きさに保つ為と思われる。同時に、読む側から見ると色々と手を出してみたくなる点が多いのが心憎い(表面的な仕様拡充以外にも手を出せる余地は最適化やレジスタ割り付けなど色々ある)。OSにおけるMinixのような位置付けのコンパイラ版と言えるかも知れない。
読んでみると、各パートが小さいので十分わかりやすい。しかし後のパートにいくと多少ややこしいものもあったように思う。特にレジスタ割り当ては私には厄介だった。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |