これなしで生きていけないジェスチャ

  1. ← - 戻る
  2. ↓→ - 現在のタブを閉じる (ウィンドウは閉じないようにカスタマイズ)
  3. ↑←↑ - 一つ上の階層を開く
  4. ↑↓ - リロード

思いついたようにときどき壮絶に使いまくるジャスチヤー

  1. Any Gestures + →↑← - Any Gestures でホバーしたリンクをすべてタブで開く。mixi とか、■ばっかり並んでる絵サイトとかで使いまくる。

このホバーしたリンクを全部開くのは魔法ちっくで好き。こうね、杖をふる的な、ね。

だいじなことを書き忘れていた。ようするに言いたいことはハーマイオニー可愛いよってことで、それ以上でも以下でもない。

  1. トップ
  2. soft
  3. よく使うジェスチャ・最後の日

何かを書きたい。

  • 理想の女性像を明確に想像できないことに気付いた。萌える女の子は明確だけど、あぁだめだ自分きもすぎる。
  • なにかしら美しいものを見つけたい。
  • 目を閉じるととにかく手がある。
  • 俺は正常かつこの上なく普通な人間である。
  • 日記が日記として機能しなくなるのは悲しいことだ。
  • タイミングさえあっていればあとはてきとーでもいい。
  • それっぽい口調が重要らしい。
  • 名前が重要であって中身は重要じゃない。
  • だからそれっぽい口調では書きたくないし、名前もてきとーなままにしておきたい。
  • 俺がなぜウェブに日記を書くというキモイ行動をしているかを、誰かは考えない。
  • それでいい。余計な分析はいらない。
  • 表に出していいものと、出すべきじゃないのがある。
  • 分かり合えるかもしれない、ぐらいの状態でコミュニケーションを止めるべき。
  • 他人に気を使うのは果てしなく面倒くさい。
  • 自分で考えることができる可能性をすべて考慮しても、考慮しすぎるということはない。
  • グロゲーと殺人ゲーは苦手。
  • 誰か一人でいい。
  • まいっか。
  • あらゆるやるべきことに対してやる気が起きない。それがかつてやりたいことであったとしても、やるべきことになったとたんやる気が起きなくなる。内容じゃなくて、情況・環境がじゅうようなのだ。
  • 別に君に訊いてはいるわけじゃないんだから、わざわざ嫌な顔して答えなくてもいいよ。
  • そんなこと、誰も訊いてないよ。
  • 余計なことは言わないようにしよう。何度決めたかわからないけど、特に、つまらない話に関しては気をつけよう。
  • メレンゲについて何度か書いては消しを繰りかえしているけど、うまく書けない。
  • そういえば 地下室で死んだふりしようよ 外は怖いことだらけ って面白すぎるよなぁ。笑っちゃうよなぁ。このフレーズ大好きなんだけど笑える。日々の唄ってこれだよこれ。これこれ詐欺。
  • はずかしそうに水たまりをよけながら よすぎる。ああ。あああ。
  • Omae Ga Dai-Kirai Da / bloodthirsty butchers
  • マナーについて考えようよ。「マナーについて考えようよ」と何かあるごとに言うのが、真にマナーがない。
  • お察しください。
  • 鯖の金を払ってない。早く払えよ。無駄なことばかり、書きすぎて、腹出てるぜ。そんなこといったって、ケーブル切る気に、なれないなぁ? もうだって、両手は、
  • 誰かの言うことを聞きたくないなぁ。
  • 知りたくないことを教わるのが好きじゃない。
  • だから、ね、あなたに、僕は、何も訊いていないんだよ?
  • (a, b) だったらお前らは
  • 独学できないやつが何できるっていうんだ。やる気があるなら独学でできるだろ。
  • 少し前までは「忙しい」っていう社会人の人は本当に「忙しい」んだと思ってたけど、実際は「忙しい」ぐらい忙しくないってことに気がついた。
  • そこでまた、誰かが言うんだよ「社会人の人」っておかしくね、ってね。
  • やろうとすれば、いくらでも他人を貶すことができるから、何が本当に悪いのかを見極めたい。そのためにまず、何が良いのかを考えたい。
  • ということを力がないうちから言っていると、そもそも生きていけないらしい。つまり、むしろそのことで自分は損害を被るってことさ
  • まぁそれでもいいか。いざとなって耐え切れなくなったら死ねばいいのだ。許可はもらったからだいじょうぶ。
  • どちらかといえば、理想的に生きていたい。現実的だと、何か得をするんかな?
  • 今なら、なんでもできそうだ。忘れないようにしとこう。
  • 今日成績通知がくるだろうけど、それの結果が良くても悪くても、先の数日は地獄だ。結果が良かったらクソやりたくない課題をやらないといけないし、悪かったら
  • やーほんと、課題をちゃんとこまめに出来る人ってすごいよなぁ。そういうシステムってどうやって得たのかな。「課題ができる」ことじゃなくて「課題が進められる」ことがすごい。すごすぎる。どうやったら手に入ったのかなぁ。セーブしとけばよかった。LV30 飽きてきた。
  • 無理さ
  1. トップ
  2. life
  3. 何かを書きたい

必修で落としたのは二科目四単位でした。情報処理概論 (講義に出てない) と、ネットワーク情報概論1 (講義に出てない)

教養 (哲学・論理学) は一つも取れませんでした。講義に出てない。テストも出てない。健康科学論も同じ。

他のとれた科目は A:B:C = 4:9:1 。どうでもいいけど情報処理概論が2点なのが謎い。何よ2って。

ということで課題に追われるほうになりました。よかったね。

CD コースのかたはよろしく。成績見る限り CD に全く向いていませんが、強制グループワークで忍耐力をつけたいと思います。

  1. トップ
  2. life
  3. 成績通知がきたよ
  1. トップ
  2. school
  3. 成績通知がきたよ

必要なのは技術じゃないってことは分かっているつもりだけど、俺はその必要なものを手に入れるのが嫌なわけで、そのへんどうにかしないといけないんだけど、その辺どうにかすると俺は俺でなくなるわけで、まぁ俺が考えている俺は所詮誰かが作った俺でしかないんだけどさってことを昨日友達の父親の友人の吉弥さんが言ってた。

コミュニケーション能力が必要とか、そういう話だけど、欲しくないのだ。真面目な話を一対一あるいは、一対多でするのがめちゃくちゃ嫌いなのだ。それって楽しくないから。

ネットワークゲームなんかで、ギルド戦について真面目に議論を交わして揉めているのとか、めちゃくちゃ嫌なわけで、悪いわけじゃないんだけど、単純にああいうのを楽しめない。そういうときはログアウトするんだけどっていうか、ギルド戦とか結局嫌で仕方ないからやらなかったんだけど、っていうかホムンクルスをプログラミングしてみたいんだけど、っていうかアカウントないんだけど、っていうか1500円はたけぇよ、いやこんなの関係ないんだけど。

ネットワークゲームなんかは「ゲーム」であるから、嫌ならばログアウトすればいい。でも実際の面を合わせた情況ではそういうわけにはいかない。そういうわけにはいかない。面を合わせて真面目な話というのは、逃げ道 (例えば相手を認める余裕だったり) を確保することすらぎりぎりのラインだから、本当に話たいことなんて、全く伝わりはしない。もともと伝わらないのがさらに伝わらなくなるわけだ。もういい。

例えばどこから沸いてくるかわからない自信とか、昔はモテたんだぜ今の俺は仮の俺だとか、とりあえず批判しとけとか、とりあえず謝っとけとか、とりあえずお前うざいとか、そういうのが苦手なのでコーヒーゼリー食いたい。

  1. トップ
  2. life
  3. A -> Z

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. ログインに使ってるスクリプト