夏の終わりに

投稿者 nanki 2008-10-02 00:42:00 GMT

夏の終わりに、久しぶりに会った君の目は、無邪気さと少し狡猾な光をたたえて、僕を見ていた。
君がそんな目をしたことはない。
初めてみるその目は、みたままを表しているようには思えなかった。
必死に自分を守ろうとしている、しかしそれすらもさとらせまいとしている、そんな目だった。

何が君を変えてしまったのか。
変わってしまったのは僕の方だろうか。
あの頃の君はもういない。

僕は黙って、あの頃の君を思い出にしまい、新しい君を受け入れる。


今日のPostScript - ujj問題

投稿者 nanki 2008-06-19 18:50:00 GMT

文字列をsplitしてsortしてuniqしてjoinする.(いわゆるujj問題)

array.string#concatはWikibooksから。 .sort はghostscript組み込みらしい。

% [(a) (b) ... (z)] array.string#concat -> (ab...z)
/array.string#concat
{ 0 1 index { length add } forall string
  0 3 2 roll
  {
    3 copy putinterval
    length add
  }
  forall pop
} bind def

% (string) string#chars -> [(s) (t) (r) (i) (n) (g)]
/string#chars {
  [ exch { 1 string dup 0 4 -1 roll put } forall ]
} bind def

% [0 0 1 1] array#uniq -> [0 1]
/array#uniq {
  dup 0 get /prev exch def
  [ prev 3 2 roll
    {
      dup /val exch def
      prev ne {
        val
        /prev val def
      } if
    } forall
  ]
} bind def

[(ujihisa) (jikka) (jissitsu)] array.string#concat string#chars {lt} .sort array#uniq array.string#concat ==
参考:

PostScript FAQ - Wikibooks, collection of open-content textbooks


JavaScript デバッグツール - コードゴルフIE杯

投稿者 nanki 2008-06-12 13:31:00 GMT

先ほどのdebug.jsを読み込むBookmarklet.

debug

javascript:void((function(r){var d=document,w=arguments.callee,v,t=r[0],n=r.slice(1);if(t){v=t.split('$');if(v[1]){try{eval(v[0]);t=v[1]}catch(e){setTimeout(function(){w(r)},100);return}}v=t.split('@');if(v[1]){try{eval(v[0]);w(n);return}catch(e){t=v[1]}}d.body.appendChild(d.createElement('script')).src='http://tools.netswitch.jp/jstools/'+t+'.js';w(n)}})(['Prototype@prototype','Prototype$Effect@effects','Effect$DebugTool@debug']))

外部のJavaScriptを読み込むには、JSONPなどでも使われているscriptタグの動的生成を使うのだが、これが非同期で、prototype.js, effect.js, debug.jsを順番に読み込まないといけない今回のような場合はちょっと工夫が必要になる。

effect.jsはPrototype定数が定義されるまで読まない、debug.jsはEffect定数が定義されるまで読まない、など。

それとは別に、すでにprototype.jsが読み込まれている場合は、prototype.jsの読み込みをご遠慮する機能もつけてある。 ブックマークレット中の最後の方の@とか$とかにはさまれているあたりがそれ。 evalして例外が上がらなければ、あるいは上がれば、ロードして、次へ。

しかし、どういうわけか、一番使いたいIEで動かない。 alertを追加するしないで、syntax errorがでたりでなかったりするあたりで、ようやく、bookmarkletの文字数制限を思い出した。

というわけでそこから先は、コードゴルフIE杯。 今では、400台前半に落ち着いて、無事動くようになり、IE6SP2でも余裕がある。

参考:

Rules for Bookmarklets


vimで実行されたautocmdを知りたい

投稿者 nanki 2008-05-28 19:21:00 GMT

$ vim -V9 filename

とすればいいらしい。

あるいは、

:set verbose=9


プログラミング言語 purl を ruby で実装

投稿者 nanki 2008-02-21 01:40:00 GMT

言語処理系を実装するのは、初めて(だと思う)

PostScript などと同じ逆ポーランド風の言語で、画像処理用途。

以下purlのソース。

2:load:dup:2:shadow:swap:composite:geom:1:load:100:100:4:pull:4:pull:crop:swap:composite:to.png

:がリテラルの区切り、その他は数字と演算子。 上のコードでは、2番の画像をロードして、ドロップシャドウしたものに1番の画像を背景として合成している。

ソースコード中に改行は入れられない。何故ならコードはURLの一部だから…

sample


OSXのユーザ辞書の作り方

投稿者 nanki 2007-11-26 04:20:00 GMT

Leopardからは、小学館の辞書データとWikipediaが追加されて、とっても便利なDictionary.app.

たぶん、キーボード使用を前提とした小気味よいインターフェースがいいんだと思う。 慣れてしまうと、もう生のWikipediaを使う気はなかなか起きない。

こうなると、なんでもかんでも、同じインターフェースで済ませたくなるもので、そんな時に、こんな検索しにくいページを見たら、「Dictionary.appで検索できて然るべき」と思ってしまうのが自然な流れ。

というわけで、ライフゲームの辞書、Life LexiconをDictionary.app用に変換します。

まずは、テンプレートをコピーしてくる。 試しにmakeすると、あっさり辞書が作られる。 make installすれば、~/Library/Dictionaries 以下にコピーされ、Dictionary.appから検索できる状態になる。(Dictionary.appの環境設定で有効にしないとだめかも)

$ cp -r /Developer/Examples/Dictionary Development Kit/project_templates dict
$ cd dict
$ make
"""/Developer/Extras/Dictionary Development Kit"/bin"/build_dict.sh"  "My Dictionary" MyDictionary.xml MyDictionary.css MyInfo.plist
- Building My Dictionary.dictionary.
- Cleaning objects directory.
- Preparing dictionary template.
- Preprocessing dictionary sources.
- Extracting index data.
- Preparing dictionary bundle.
- Adding body data.
- Preparing index data.
- Building key_text index.
- Building reference index.
- Fixing dictionary property.
- Copying CSS.
- Copying other resources.
- Finished building ./objects/My Dictionary.dictionary.
echo "Done."
Done.

重要なのは、MyDictionary.xmlファイル。 辞書の元となるデータをパースして、XMLファイルを作ってやる。

<?xml version="1.0" encoding="UTF-8"?>                                                                               
<d:dictionary xmlns="http://www.w3.org/1999/xhtml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">    
  <d:entry id="blinker puffer" d:title="blinker puffer">                                                             
    <d:index d:value="blinker puffer" d:title="blinker puffer" />                                                    
    <d:index d:value="puffer" d:title="blinker puffer" />                                                            
    <h1><span class="headword">blinker puffer</span></h1>                                                            
    <span class="meaning">Any <a href="x-dictionary:r:puffer">puffer</a> whose output is <a href="x-dictionary:r:blinker">blinker</a>s.  However, the term is particularly used for p8 c/2 puffers.  ....
    </span>
  </d:entry>
  <!-- 以下d:entry の山 -->
</d:dictionary>

意味はほとんど見た目通り。
それぞれの項目は、インデックスと内容のXHTMLで構成される。 他の単語を参照する、href=”x-dictionary:r:ID”とかが特徴的か。 上の例では「blinker puffer」という単語に対して、pufferでも検索に引っかかって欲しいので、indexに加えてある。

パースしてXMLを吐くコードは、汎用性がないのでここには載せないが、今回は以下のようなLifeを表す図を、rcairoでpng画像に変換もしている。

OO..
O..O
..OO

画像などのリソースは、dict/OtherResources 以下の適当な場所に置いておき、普通のHTMLのように、<img>タグを使って埋め込む。

<p><img src="Images/blinker%20puffer_0.png"/></p>

これで、

$ make
$ make install

すれば、ユーザ辞書の完成。

続き

さて、これだけで終わりではもったいないので、先日作ったQuartz Compositionを組み込めないか、頑張ってみる。

HTMLにQuartz Compositionを組み込むのは簡単で、EMBEDタグを使って、

<embed id="composition" type="application/x-quartzcomposer" src="LifeLexicon.qtz" width="300px" height="300px" />

とする。

これで、普通のムービーならスタートするのだけど、ライフゲームなので第0世代の画像を渡してやらないといけない。

Quartz ComposerのWebKitプラグインにはJavaScript APIが用意されていて、publishしたパラメータを設定できるようになっている。 が、文字列しか設定できないようだ。画像はどうやって渡すのだろう。

調べてみると、Compositionの中で、Image Downloaderというパッチを使うらしい。 Image Downloaderは指定されたURLの画像をImageとして出力するパッチ。 なるほど。 ImageDownloaderの入力を、imageLocationという名前でPublishして・・・

var composition = document.getElementById("composition");
composition.setInputValue("imageLocation", "fullpath.png");

こんな感じになるのかな。 しかし、フルパス指定じゃないといけないのが面倒だなぁ・・・

先生、こちらにできあがったものが用意してあります。

結局、location.href と、EMBEDに勝手に付け加えたimage属性から、フルパスを取得する仕組みに。 文中のSpaceはCompositionというか、Universeというか。

//LifeLexicon.js
(function () {
  var waitForSpaces = function (spaces) {
    if (spaces.length == 0) return;

    if (spaces[0].loaded && spaces[0].loaded()) {
      var space = spaces.shift();
      var base = location.href.substr(0, location.href.lastIndexOf("/"))
      space.setInputValue("imageLocation", base + space.getAttribute('image'));
    } 
      
    with ({callee: arguments.callee}) {
      setTimeout(function () {callee(spaces)}, 100);
    }
  };

  var arrayFromNodeList = function (nodelist) {
    var result = [];
    for (var i = 0; i < nodelist.length; i++) {
      result.push(nodelist.item(i));
    }
    return result;
  };

  waitForSpaces(arrayFromNodeList(document.getElementsByTagName('EMBED'))); 
})();

なぜか、<script src="LifeLexicon.js">だと読み込まれないので、

<script>
  var tag = document.createElement("SCRIPT");
  tag.src = "./LifeLexicon.js";
  document.getElementsByTagName("HEAD")[0].appendChild(tag);
</script>

というコードも、<d:entry>内に埋め込むように。

これで「生きた」LifeLexiconが完成。

LifeLexicon

CREDITをどこかに入れないと配布できないらしいので、欲しい人には直接送ります。 いないだろうけど。

誰か、Ruby Reference Manualをこれで。

参考:

信号処理言語FAUST

投稿者 nanki 2007-08-29 03:05:00 GMT

DSP(Digital Signal Processing)用言語。
FAUST(Functional AUdio STream)

関数型言語で機能単位(ブロック?)を作り、あとはそのブロックを繋げるようにして全体を組み立てるらしい。 ノイズジェネレータとか、フィルター、アンプとかをケーブルで繋いで、変な音を作る様な感覚。

簡単なGUIを記述することもできて、パラメータをスライダやボタンで入力したりできるらしい。

ちょっと面白いのは、: <: :> , ~ といった記法で、ブロックダイアグラムを表現するあたり。 A の複数の出力をマージしてBの入力とする場合、A :> B と書けるそうな。 信号処理でよく使うフィードバックは ~

出力の数と入力の数が違ったりした場合のルールがよく分からないけど、ツボにはまれば楽しそう。

もう一つ興味深いことには、CVS版にLLVMのバックエンドがあるようで、この辺の実装も、力があれば眺めてみたい。自動でベクトル化(やりやすい分野なので)とかやってくれてそう。

ハードウェアのDSPにマッピングとかもやってくれないかしらん。

papers and documentationのPDFで一週間は楽しめそうだ。

参考:

Infinity

投稿者 nanki 2007-08-01 23:05:00 GMT

よいこは真似してはいけない、変数名。

$ irb -Ku

∞ = 1.0 / 0
=> Infinity

(-∞..4).include? 5
=> false

(4..∞).include? 5
=> true

これが普通に動くRubyに感謝。0で割るとInfinityはかなり気持ち悪いけど。

長い名前にすると、..の左側にいるときと右側にいるときのバランスが悪い。
でも、∞は、見た目短いけど、タイプしづらい。ooかな?

Infinity = 1.0 / 0

-Infinity..4.000000
 4.000000..Infinity

これか!

Inf = 1.0 / 0

-Inf..4.0
 4.0..Inf

あるいは、これくらいで手を打つか。


OSC2007Kansai

投稿者 nanki 2007-07-22 07:30:00 GMT

に行ってきました。

今回は、Railsハンズオンセミナーの講師をやったけど、一日目は、プロジェクタへの接続を確認してなくて、みなさまにご迷惑をおかけしました。ごめんなさい。

ちゃんと設定したのに、二日目もやっぱりつながらなくて、okkezさんに迷惑かけました。ごめんなさい。

二日目の懇親会で見た楽器、ウダーがスゴかった。
販売してたら危うく購入するところだったのに。残念。
今後に期待しています。

あと、お子様連れのお子様たちがとってもかわいかったよぅ。子供ほしー。

帰りは、京都駅から四条まで、数人で散歩。
翻訳の仕事をしている外国の方(といってももうほとんど日本の方)も一緒で、東本願寺に掲げてあった看板のコピーをだしに、面白い話が色々聞けた。

OSCの内容の話が無い!

参考:


おいしいコーヒーの作りかた

投稿者 nanki 2007-07-11 21:34:00 GMT

BRITAのフィルタがそろそろ交換時期だったので実験してみた。

概要

コーヒーをBRITAでろ過する。

手順

  1. もったいないので、ちょっと古そうな、既に挽いてある粉を使って、コーヒーメーカーでコーヒーを淹れる。
  2. 冷ます。(活性炭から余計な物質を呼び覚まさないように)
  3. 試飲。おいしくはないが、想像の範囲内。酸味はほとんど感じられず、香りも感じられない。辛いような苦み。
  4. ろ過。見た目はほとんど変わらない。
  5. 試飲。鼻を近づけると、みたらしの香り、苦味はなく、噛んじゃいけない錠剤を噛んだときのような、嫌な酸味。激マズ。

・・・

BRITAの中身は、フィルタと活性炭と陽イオン交換樹脂だそうで、コーヒーは酸性なので、陽イオン交換樹脂はあまり働いてないと思われる。

とすれば、苦味(とコク)の除去が行われただけであの酸味か。 普段あの酸味はどこへいっているのだろう。 辛いような苦味、の辛い部分はこれかもしれない。

この辺を見ると、ジカフェオイルキナ酸辺りがきな臭い。

そう考えるとおいしいコーヒーはまさに奇跡だなぁ。 非線形な味覚の神秘。