GeSHi - Generic Syntax Highlighter を使うようにした。対応言語が多いことと、シンタックスファイルを増やし易いことがいい感じ。ただし時々 well-formed じゃないエラーがでることがあるっぽい。

  1. トップ
  2. prog
  3. ソースの色づけを復活 2
  1. トップ
  2. js
  3. ソースの色づけを復活 2
  1. トップ
  2. site
  3. ソースの色づけを復活 2
  1. トップ
  2. prog
  3. ソースの色づけを復活 2

toSource とかはじめて知った。

GreaseMonkey で設定値保存するときはこれ使うといいね! わざわざ JSON 云々のコピペなんてしなくてよさげ。

var foo = new Object;
foo.bar = "test";
foo.baz = "pqpq";
foo.toSource(); //=> '({bar:"test", baz:"pqpq"})'
(new Date).toSource(); //=> (new Date(1142625169156))
(function () { return ""}).toSource(); //=> '(function () { return "";})'
alert.toSource(); //=> 'function alert() {[native code]}'

ていうか、forEach とかあるのね! やべ。

var sum = 0;
[1, 2, 3].forEach(function (item, index, array) {
sum += item;
}, this); // 第二引数は callback 中の this
alert(sum);

同じように (Ruby -> JS) select -> filter, all -> every, map -> map, any -> some が使えるみたいだ。どうせ Fx 用の GM しか書かないから使いまくろう。

  1. トップ
  2. js
  3. .toSource(), forEach, etc

pre だけ色付けするようにした。

前に Pure JavaScript で色つけていたことがあったけど、あからさまにブラクラだった。で、なんとなく思いついたのでもっかい別の方法で実装してみた。

なんていうか非常にローテクといいますか他力本願な方法でして、PEAR::Text_Hightlighter に Ajax で丸投げというソリューションでございますです。

<?php
header("content-type: text/xml");
require_once 'Text/Highlighter.php';
require_once 'Text/Highlighter/Renderer/Html.php';
$options = array(
'numbers' => HL_NUMBERS_LI,
'tabsize' => 4,
);
$renderer =& new Text_Highlighter_Renderer_HTML($options);
$hl =& Text_Highlighter::factory($_GET["lang"]);
$hl->setRenderer($renderer);
$ret = $hl->highlight($_GET["source"]);
echo '<div xmlns="http://www.w3.org/1999/xhtml">';
echo $ret;
echo '</div>';
?>

こんなスクリプト書いたら、あとは JSpre 要素列挙して投げてあげる。レスポンスを importNode して、pre と置き換える。みたいな。

でもこんなクソ簡単なスクリプトなのに IE ではちゃんとうごかない。importNode がだめなのか、それとも responseXML から importNode ができないのか……謎。

あーHtml.php の &nbsp; は全部 &#160; に置き換えた。DTD がないからエラーになる。

  1. トップ
  2. js
  3. ソースの色づけを復活
  1. トップ
  2. site
  3. ソースの色づけを復活
  1. トップ
  2. prog
  3. ソースの色づけを復活

JS の XPath なんて書きましたけど、重大なバグがありまして、っていうかなんで気がつかなかったんだろう、えーそれは application/xhtml+xml なページ、すなわち XML として、名前空間をちゃんと扱うページではまともにセレクトできないんですよーははははー、例えばこのサイトとかね。

$X = function (exp, context) {
if (!context) context = document;
var resolver = function (prefix) {
var o = document.createNSResolver(context)(prefix);
return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
}
var exp = document.createExpression(exp, resolver);
var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var ret = [];
for (var i = 0, len = result.snapshotLength; i < len ; i++) {
ret.push(result.snapshotItem(i));
}
return ret;
}
}
return null;
}
alert($X("//x:p")); // Array of p elements
alert($X("count(//node())")); // => node number
alert($X("count(//x:body) = 1")); //=> must be true

かなり強引に修正してみた。

XPath で要素を指定するとき x という prefix (上のコードの場合は別になんでもいいんだけど、普通は x とか xhtml とかいうのをつける) を必ずつけるようにしとく。使い勝手が悪くなったけど、仕方ない。prefix がないときは resolver をよんでくれないみたいだ。

そう、で、resolver なんだけど、実はただの関数だった。evaluate は prefix を見つけると、resolver に prefix を渡し、URI を返すように要求する。resolver は prefix に対応する URI を返す。null の場合はエラー, "" の場合は、名前空間が null のものとして扱われるみたい (要追試)。

つまり、上のコードの resolver がやってることは、とりあえず普通の場合のように NSResolver を作って投げてみて、ダメだったら contentType にあわせて名前空間を返してやるっていう、かなり強引な (二回目) 方法なわけです。誰かもっと美しくして!

使い勝手が悪くなったけど と書いたけど、XSLT で使うような XPath と同じになった。まぁ名前空間を考慮するとこういうことになるっていう名前空間マジックなんだけど、やっぱり面倒くさいよなぁ。

$X("count(//x:body) = 1")$X("count(//*[local-name() = 'body' and namespace-uri() = "http://www.w3.org/1999/xhtml"]) = 1") みたいに書きたくはないし、HTML なページと XHTML ページとで、同じ XPath を使おうとするとこんなもんになってしまうような気もする。

冷静に考えると x より h のほうがいいや。

  1. トップ
  2. xpath
  3. XPath, $X function, NSResolver
  1. トップ
  2. js
  3. XPath, $X function, NSResolver

やっぱ最初のころは Ruby のブロック引数が全く理解できんかった。yield をよぶとどこに飛ぶか、とか結構悩むと思うんだ。

each の「使い方」を先に覚えて、実行してみてやっとブロック引数の概念が理解できた。んで、「じゃあ自分で書くときはどうするんだ」とかでリファレンスを読むと yield とか書いてあって、でもそれ以上はリファレンス読んでもよく分からなかったから、てきとーにサンプル作ってみてやっと理解した。

それまで書いていたのが PHP とかいう謎言語だったので、Ruby が余計に神がかってみえた。Perl は読めなかったし、Python は知らなかったし。今は Perl とか Python を勉強しようと思っても、必要性が見当たらなくて書けない。所詮「勉強」にすぎなくなるから、やる気があんまり起こらない。しかし Perl はホントに、本当に読めない。map { hoge } hage {} @foobar みたいなのをよく見るけど、どういう仕組みで評価されてるのかよくわからない。

まぁ、とりあえず、自分は実装を触りながらじゃないとぜんぜん理解できない。頭が悪い上に「自分の今考えてること」に対してかなり不安を覚えるので、すぐにコンピュータで実行させて、考えていることがあっているのか間違っているのかを確定させたい。

あんまり頭の中で構造を考えないで、とにかく動かしてみる。一行書いて、p 書いて、実行して、ってのを繰り返す。しかもこれ、未だにこういう感じなのだ。数行書くごとに実行する。とにかく p を書きまくる。んで、暇なときにリファレンスを眺めて、「こういうことができるのか」ってまた書いて実行してみたりする。

だから、何か作ろうとしていないと、そもそもプログラムを書かないからなかなか理解できるようにならない。Perl も書いてみたらわかるかもしれないけど、Perl を使って書きたいものがない。気がつくと面倒くさくて Ruby を使ってる。だめじゃん。

  1. トップ
  2. prog
  3. Ruby で、Ruby に限らず

たぶんやらないけど、やりたいことを書いとく。

  • まず libxml-ruby を捨てて REXML を使う。もともと libxml-ruby を使おうと思ったのは REXML が名前空間をまともに処理してないからだったんだけど、名前空間とかどうでもよくなった。んで、libxml-ruby は Pure Ruby じゃないのでいちいち環境間で面倒くさい。REXML は標準添付だからその辺は心配ない。できるだけ Pure Ruby じゃない外部ライブラリを使わないようにしたい。
  • ちゃんとライブラリ化する。
  • 公開できるようにする。
  1. トップ
  2. taglibro
  3. taglibro の今後の予定
  1. トップ
  2. site
  3. taglibro の今後の予定

前々からいちいちあのクソながったらしい evaluate を書くのがだるかったのでちゃんと関数はさむようにした。

大きなバグがあります。詳細はXPath, $X function, NSResolverに書きました。以下のコードは非推奨です。

$X = function (exp, context) {
if (!context) context = document;
var result = document.evaluate(exp, context, null, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
result = document.evaluate(exp, context, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var ret = [];
for (var i = 0, len = result.snapshotLength; i < len ; i++) {
ret.push(result.snapshotItem(i));
}
return ret;
}
}
return null;
}
alert($X("//p")); // Array of p elements
alert($X("count(//node())")); // => node number
alert($X("count(//body) = 1")); //=> must be true
// Firefox が嫌いになる GM スクリプト
if ($X("contains(string(/), 'Firefox')")) {
alert("I LOVE FIREFOX!");
}

これでコピペ地獄から開放される。

  1. トップ
  2. xpath
  3. JS の XPath
  1. トップ
  2. js
  3. JS の XPath

まえのとあわせて

$N = function (name, attr, childs) {
var ret = document.createElement(name);
for (k in attr) {
if (!attr.hasOwnProperty(k)) continue;
v = attr[k];
if (k == "class") {
ret.className = v;
} else {
ret.setAttribute(k, v);
}
}
switch (typeof childs) {
case "string": {
ret.appendChild(document.createTextNode(childs));
break;
}
case "object": {
for (var i = 0, len = childs.length; i < len; i++) {
var child = childs[i];
if (typeof child == "string") {
ret.appendChild(document.createTextNode(child));
} else {
ret.appendChild(child);
}
}
break;
}
}
return ret;
}
var pq;
document.body.appendChild($N("div", {}, [
$N("div", {style:"font-weight:bold"}, "foobar"),
$N("div", {}, [
pq = $N("ol")
])
]));
for (var i = 0; i < 10; i++)
pq.appendChild($N("li", {}, "hoge");
var div = $N("div");

みたいなのを使ってる。

innerHTML を使いたくない (application/xhtml+xml では一切使えない) けど、document.createElement の嵐はキモイ。中間とって GreaseMonkey のテンプレート (xyzzy の拡張 lisp を入れてる) にごちゃごちゃ書いてしのいでるます。

  1. トップ
  2. js
  3. 簡易ビルダー

GMwindow.addEventListener("scroll", fuction (e) {}, false); とかやってみたんだけど、どうもページごとにイベントが発生したりしなかったりする。なんでだろう。全然わからない。

例えばこのサイトだと、日記のページは全てイベントが発生しない。で、/about とか /xbel とかはちゃんと発生する。

  1. トップ
  2. js
  3. scroll イベントが起きたり起きなかったり

例えば就職するときには (別にバイトでもなんでもいいけれど) 自分を売り込む必要がある。自分がこういう能力をもっていて、こういうことができることを、自信を持って言わなければいけない。相手に自分を認めさせる必要がある。

でも、その能力があるとかっていう自覚・自信をどうやってつければいいんだろう。自分で自分を認めて自信をつける場合、よくある自信過剰パターンに陥っている場合が殆ど。だから、他人に認めてもらう必要があるのだけれど、他人に認めてもらうには売り込む必要がある。売り込むには自信がいる。無限ループ。

しかも、自信っていうのは時間がたつにつれて薄れていく。もっと自分より若い人達が現れてすごいことをやるし、あるいは世界が広がってもっとすごい先輩を発見することになる。

で、そういう感じで、まぁいいやって思えてくると就職というかバイトさえできなくなる。人前というか面接だと平気で嘘をつけるので、その嘘をあとでどうやって回収するかを想像してどうにもこうにもいかなくなる。嘘じゃなくなるまで腕を磨くとか、そういう方向になるけど、結局上には上がいる以上嘘は嘘のままになる。

例えば Ruby が書けるっていったらあたりまえだけど Ruby が書けないとだめだ。でもどのレベルから Ruby が書けるっていえるのかが全くわからない。人によって違うだろうし。例えばだから、Ruby に限らない。プログラミングができるっていうのはどのレベルからなのか、ウェブデザインっていうのは何を指しているのか。相手に聞けよ、というのは解決にならない。相手に聞く段階には既に自信が必要だし、嘘をつかないといけない情況になっている。

中には嘘をあとから本当にすればいいという人もいる。でもそれは自分で撒いた嘘に追われる形になる。強制的に嘘によって何かをやらされることになる。そういうのはだめだ。何かをやらされているなんて感じるのはだめだ。もっと能動的に動かないといけない。でもまたそこで必要なのが自信だ。人前で能動的に動くには自信が必要になる。無限ループ。

はいどうしよもない。ただ、どうしよもないからといって諦めてもいい問題じゃないのが鬱陶しい。誰もが働かないといけないから、自分もその例外じゃないのだ。

  1. トップ
  2. life
  3. 自信はどこからやってくる?
  1. トップ
  2. thinking
  3. 自信はどこからやってくる?

クラウド表示させた VIP

rep2 のスレッドリストに雲を表示する GreaseMonkey スクリプト rep2-cloud.user.js

インストールしたら設定で include の設定しないとだめです。もしかしたらデフォルトの rep2 ではだめかも。勢いが表示されてないとだめです。

  1. トップ
  2. 2ch
  3. 2ch cloud / rep2
  1. トップ
  2. web
  3. 2ch cloud / rep2

最初聞いたときは、最後の「望んだ世界はどうだった?」の意味を完全に無視して、プロポーズ系の唄なんだろうか、とてきとーに考えてた。

聞き込むにつれて「望んだ世界はどうだった?」がどう考えてもキーになっているように感じはじめた。というか明らかに文脈が違う。

それで、もしかしてそれまでの綺麗だったりする部分は全部「望んだ世界」で、悪魔が、夢を見せた後に「望んだ世界はどうだった? (そして今の情況を見てみろよ)」訊いているような解釈をした。ようは MARCH 系。

  1. トップ
  2. music
  3. 指輪 / BURGER NUDS, 自分の印象

だいたい固定されたので書く。でも書かないほうがいいかもしれない。基準が曖昧だ。だから、曖昧に書く。

当たり前だけれど、正しい解釈は存在しない。いや、間違った解釈は存在しない。感じたままでいい。だから、もし指輪を聞き込んでいないなら、なおさら読まないほうがいいと思う。

指輪は BEST に収録されており、解説がついているから、それを参考にする。っていうかこの解説が既に意味不明なのがどうもこうも。ぎりぎりセーフってなんだよもう。

解説には三つのヒントがある。それは「指輪」が、「いつでも振り返る事で新しいステップを踏み出す力をくれる、思い出」を唄っているということと、「望んだ世界はどうだった?」は過去の自分による今の自分への問いかけであるということ、そして「望んだ世界」は今の自分にとって「どうしよもないもの」であること。これを前提にして考える。

最初の部分は悪い状態の自分に関するところ。子供たちは残酷に笑う 皆いつか 大人になるから だけど気負ってない こんな眼はしてない までのところ。「大人になるから」とあるけど、たぶん「大人になるのに」という意味だと思う。大人になって汚くなっていくことが決まっている子供たちを見つつ、汚くなっていくことに対して気負いがない純粋さが、自分にとって残酷である、ぐらい。子供たちは気負っていないけど、自分は気負っているわけだ。汚くなりかけの時期に、汚くなりたくないことを望んで。

そいで少し飛ばして 何か忘れたろ? そんな眼をしてるだ。自分は何かを忘れている。あとでもう一度この問いかけが繰り替えさえれるけど、その忘れたモノをしっかり思い出すことが「指輪」の目的である。

忘れたものを思い出すために、ピカピカのピンセットで腐乱した情熱の解剖実験をする。解剖実験は記憶をほじくりかえす作業そのもの。

で、思い出したのが「あの日細い指に 錆びた指輪をして 全てに笑いかけたろ」なわけだ。笑いかけているのはまだでてきていないけど「君」なはず。「君」って誰だかわからないけれど、とりあえず綺麗なので女の子ってことにしとく。いやどうでもいい。ここで重要なのはもちろん「錆びた指輪」だ。「錆びた指輪」はおそらく「腐乱した情熱」と同じもの。「君」は腐乱した情熱をもっていたのにも関わらず、笑っていた。

何を恐れてんだよ 錆びた指輪でいい 気取っている場合じゃないだろ 「錆びた指輪」は「腐乱した情熱」と読み替えてもいい。「気取っている」というのは、純粋なままであろうとするということ。腐らないように、錆びないように生きていくことが「気取っている」こと。

ここで戻るけど いつかここは地獄と言ったろ それは嘘で実はよく分からない 別に気取ってない そんな不快じゃない がわかるようになる。いつかここを地獄といった。地獄というのは腐乱した、錆びた世界について自分が持っているイメージだ。でも、だんだん気持ちが変わってきている。腐乱していて、錆びている世界でもいいのかもしれないと思い始めている。気取っていない、すなわち、自分の素をさらけ出した状態でも、「そんな不快じゃない」と思えるようになった。という変化。

何を忘れたの? それを確かめなきゃ 「生きる意味」も軽いだけ ここでまた忘れたものは何かという問いかけがある。ピカピカのピンセットで腐乱した情熱を解剖して、思い出し、確かめないといけない。気負ったまま、笑えないままでは「生きる意味」も軽いのだ。

そして「あの日細い指に」と入る。君は指輪をして 世界一の笑顔で -snip- 「全て」に笑いかけたろ。「君」は錆びた指輪をしつつも、世界一の笑顔で笑っていられた。腐乱した情熱の中に、硬いガラス玉のようなものを持っていられた。硬いガラス玉というのは、すなわち忘れたモノである。記憶の中の「君」を通して、忘れたものを見つけられた状態が最後の部分。変わっていない部分があるということに気付く。

それで最後に「望んだ世界はどうだった?」だけど、「望んだ世界」がなんだったかというと、純粋なままでいられる世界・純粋なまま生きていける世界。でも、結局どう転んでも、変わらない部分があることがわかっていれば、表向きが腐ろうが錆びてしまおうが、あまり関係ないわけだ。だから、そういう世界にこだわっても無駄だし、「どうしよもなかったもの」と笑い飛ばせる。

つまり、自分が腐ってしまった、あるいは、腐ってしまうかもしれないと思うときに、いつまでも根底に変わらないものがあることを思い出させるのが「指輪」なわけだ。終わり。

「プラチナ」について言及しなかったけれど、それはぶっちゃけよくわからないから。腐食に強い金属の代表かな? エンゲージリング (マリッジリング) によく使われるからかしら。安直だけど

「全てに笑いかける君」という非現実さと、「冷たい水を求める」理想感と、「腐るしかない」ということを暗示させる現実感が共存しているのが美しいと思う。

  1. トップ
  2. music
  3. 指輪 / BURGER NUDS

かさはもっています。ふくはぬれていません。

拙い言葉で理解しあった気分になれるのがインターネット。あいまいでいい。程度の違いでしかないのだから、今なんとなくいい感じなら、それでいい。

家にいながら、てきとーにコミュニケーションがとれる。面倒くさい話に巻き込まれないようにすれば、巻き込まれなくてすむ。いつの間にか巻き込まれているなかで、どうでもいいことに発言を求められるのは面倒くさい。

  1. トップ
  2. music
  3. いんたーねっと、コミュニケーション refusal desire
  1. トップ
  2. net
  3. いんたーねっと、コミュニケーション refusal desire
  1. トップ
  2. thinking
  3. いんたーねっと、コミュニケーション refusal desire

ずっと collect を使ってきたんだけど、マイノリティなのか。

今日 Symbol#to_proc 関連で map をよく見かけたから、map ってなんだっけーとか思いつつリファレンスをひいたら、あら不思議、collect のシノニムだった。IRC でそんなこと言ってたら「collect ってむしろなんだよ」的で驚いた。

map のほうが短くていいからこれからは map にしようかと思いつつ、やっぱどうも map に慣れないいやそれは当たり前だけど。

そもそもなんで collect を使い始めたんだろう。謎だ。リファレンスマニュアルで map より上にあるからだろうか。

あーそうだ。一応忘れないように印象を書いておいてみる。ちなみに俺は数学がわからんちんな坊やなので、map が写像だとかってのは微塵も知りませんでした。いやもだめすぎなんですが、その辺を考慮してください (謎)。

map ってなんか戻り値が予想できない感じがする。配列の各要素にブロックを適用する (脳内での map のイメージは適用だった)、までは名前から分かるのだけれど、そのあとどうやって返ってくるのかが直感的にわからなかった。

対して collect は、集めて配列にするみたいなことが名前からわかるので戻り値は直感的だった。ついでに配列のメソッドにブロックを与えている時点でブロックを適用する感じを醸し出していたので、動作が予想できる感じ。

書くなら断然 map のほうが楽だなぁ……

ちなみに collect, find, select を使ってる。find_all じゃなくてなぜか select, detect じゃなくてなぜか find。この場合 finddetect にして語尾を統一すべきか。

マイノリティじゃないかも。

Rubyist Magazine - Rubyist Hotlinks 【第 1 回】 最初は map はなかったみたいだ。だから collect のほうが上にあるのか。

  1. トップ
  2. ruby
  3. Ruby, collect or map

そういえば、貧困な思考はいつも あなたのパターンを 安易なイメージ処理して のところの最後をしばらくの間「アニメーションにして」と勘違いしていた。

  1. トップ
  2. music
  3. 遊体離脱の空耳

めんどくさがって例外処理しなくても http://static.flickr.com/0/buddyicons/ 以下は全てリダイレクト。

アイコンが設定されていないときは、特別に http://www.flickr.com/images/buddyicon.jpg をアイコンとして使うんだけど、なんとなく面倒くさくてこの処理をしていなかった。というか、どういうレスポンスが返ってくるかわからなかったから放置していた。

で、なんとなくアレしてコレして見てみたら、iconserver=0 がレスポンスされるらしい。例外処理しとくかーって思ったけどリダイレクトだった。細かい配慮ないす。

  1. トップ
  2. net
  3. Flickr は親切だった。

weblogin.rb, 名前失敗したけどもういいや。

そのうち忘れるので使い方をめもる。

@cgi.header を使うことを前提にしてる。

api_keys = {
"Flickr" => {
"api_key" => "Flickr70c55b82e10021ffaaapi_key6",
"secret"  => "Flickrdf5secret3"
},
"TypeKey" => "fsakfsTypeKeyafasAPI"
}
require "weblogin.rb"
@cgi = CGI.new
WebLogin.open(@cgi, api_keys) do |login|
begin
case login.auth
when :login
# login したときの処理
# DB にユーザ ID とユーザ情報を保存したり
end
rescue WebLogin::NoActionError => e
puts @cgi.header("type" => "text/plain")
puts login.services # 有効なサービスの配列
end
end

上のようなのを認証スクリプトとしておいとく。このサイトだと /login.rb がコレ。ログインスクリプトの query_string が logout だったらセッションを破棄してリファラにリダイレクトする。ちょっとアレ。

/login.rb/Flickr?return_path= のようなリクエストをすると Flickr にリダイレクトして認証させる。認証されるとコールバック (Flickr の対応する API key のコールバックには http://example.com/login.rb/Flickr/callback のように指定しておく) にリダイレクトされるので、セッションに情報をセットして、return_path にリダイレクトする。

login.auth は、path_info に何も指定されていなかったりすると NoActionError を投げる。

require "weblogin.rb"
@cgi = CGI.new
WebLogin.open(@cgi, api_keys) do |login|
if login.service
# login している場合
login.service #=> "Flickr"
login.id #=> "25514198@N00"
login.user_name #=> "cho45"
login.profile_uri #=> "http://www.flickr.com/photos/25514198@N00/"
login.icon #=> "http://static.flickr.com/23/buddyicons/25514198@N00.jpg"
login.full_name #=> "Hiroh Satoh"
else
# login していない場合
# id その他上記メソッドは全て nil
end
end

いまいち気持ち悪いんだけどどうにもこうにもわからんのでこんな感じ。ブロックをとっているのはセッションファイルを確実に閉じるため。fcgi 環境で死ぬことがあったのでこういうことやってる。

WebLogin クラスは、それ以下にある、サービス名に対応するクラスをインスタンス化してメソッドを呼び出す。例えば /login.rb/Flickr?return_path=somepath の場合、WebLogin::Flickr.new(@cgi, @session, @api_keys["Flickr"]).auth が呼ばれる。

各サービス名の auth メソッドはサービスの認証画面にリダイレクトする。サービスは /login.rb/Flickr/callback にリダイレクトする。

callback が指定されている場合、インスタンス化されたサービスクラスの callback メソッドを呼ぶ。callback メソッドはユーザ情報をまとめて Hash にして返す。WebLogin はその Hash をセッションに保存して、最初に指定された return_path にリダイレクトする。

いろいろアレなことが思い浮かんだけどあとで考えよう。

new にブロックって一般的じゃないんじゃ?という指摘をうけたので open にした。確かに new にブロックは微妙だった。

  1. トップ
  2. ruby
  3. ログインに使ってるスクリプト

結構説明書読まない人って多いみたいだ。

小学生のときはそれこそ読まない人が全く理解できなかったけど、最近説明書を読みたくないときがあって、もしかしたらこういう感じなのかなぁって分かり始めたかもしれない。それはなんかとにかくいじくりまわしたい衝動が先にくる感覚だったのだけれど。

まぁでも結局そのあと説明書を最初から最後まで読んだわけです。何ができて何ができないのか、よくやる操作はどうやるのが一番スマートなにかを頭に入れておきたい。結構何度も説明書を読んでいると、新しい機能の発見があったりする。最初は「使わないだろう」って思って見逃しちゃうものを再発見できる。結構楽しい。

仕様書やら、プログラミングのリファレンスなんかもそういう感じでよく読む。一時期は XSLTXPath の仕様書が常に開きっぱなしだった。ECMAScript の仕様書 (日本語 HTML 版) はむしろリファレンスとして使ってる。Ruby リファレンスマニュアルは気が付くと何故か上下になんどもスクロールしながら見てる。

暇だからできることだけど、とにかく自分が使うものは隅々まで一応知っておきたい。もし必要な機能じゃなかったら、頭の片隅にその機能があることだけを覚えておけばいい。使い方はまたあとで見ればいいから。

  1. トップ
  2. life
  3. 説明書を読むのが好き。

この日記にもつけてみた。

結局大して書く人がいないだろうってことでログインごとにユーザー情報を保持している XML を更新し、それを XSLT から document() 使って読み込むようにした。

  1. トップ
  2. web
  3. 認証付きコメント実装
  1. トップ
  2. site
  3. 認証付きコメント実装

そうとは限らないし、ちゃんと変わったほうがいいことも多い。

Ajax なりなんなりを含めて、JavaScript でいいことって画面遷移がないことであって、URL が変わらないことじゃない。

UI の補助ではなく、コンテンツを書き換える場合はむしろ URI は変わったほうがいい。要はあとでそのリソースにリンクを貼りたいとき、困るか困らないかが分かれ目だと思ってる。

  1. トップ
  2. ajax
  3. Ajax では URL が変わらない?
  1. トップ
  2. js
  3. Ajax では URL が変わらない?
  1. トップ
  2. web
  3. Ajax では URL が変わらない?