旅行に行く夢を見た。
ついたのが午前2時ぐらいで、すぐにみんな寝てしまう。俺と、もう一人が近くの崖で何か話をする。話の結果俺は彼を殺す。よくわからんけど。絞殺。あーやってしまったんだなぁ、と思う。
部屋に戻る途中に何か動物的なものに見つかる。ぎりぎりで部屋に入る。同じ部屋のやつが眼を覚ます。そいつは寝ぼけていたのですぐに寝てしまう。このとき午前3時。
起きて、朝食をとる。殺したやつがいる。死んでいない。あー、また俺は生き延びたんだなぁと思う。
哀さん から (http://mixi.jp/view_diary.pl?id=48756398&owner_id=9740)
友人に言われて検索してみて吹きそうだったんですが、「音夢」は某エロゲーのキャラとは全然関係ないです。というかそのゲームやったことないし。
午[前後]n時でもいいよ。
内臓えぐりだして見せてやろうか、ということを考えて、それに関することでいくつか決心してみたりするけど、やっぱそういうのに不快的な人もいるわけで、やっぱ考え直したほうがいいんだろうか、今ならまだ戻れるかもしれないぜ、なんていうことを脳内天使と悪魔がささやきあっていたりするけど、脳内天使と悪魔について考えていたら俺には悪魔と悪魔が不毛な議論を重ねているように見えてきたので彼らをどうにかして消去する方法を考えることにした。.scan(/考/).size #=> 4
Your blog, lowreal.net/, is worth $2,822.70
30万ぐらい? 売りたい。
SSH ログインの制限緩和うんちゃらがだいぶ前になってたわけでして、できるなら CGI 経由で make なんてしたくねぇよとか思ったのでいろいろとやった。未完成。
なんかサッパリよくわからないけど XREA に SSH でログインしたときは ~/.profile が実行されるらしい。~ は /virtual/username。そこで次のような .profile を用意
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH"
hh=$HOSTNAME
uu=$USER
col=32
TITLEBAR='\[\033]0; \w\007\]'
PS1="${TITLEBAR}
\[\e[${col}m\]$uu@$hh \[\e[33m\]\w
\[\e[${col}m\]\$\[\e[m\] "
PATH 通せば ruby とかが素で通る。これ自体は CGI 経由と同じ。残りはどっかからパクったオマケ。カレントディレクトリ見えてないと嫌よ症なので……
しかしこれで make しようとしても、collect2: cannot find `ld'
とかでやがって通りません。ld -v は通るんだけどなぁ? 小プロセスに環境変数引き継がれてないとか? わかんねぇ。ほんとわかんねぇ。
lowreal@s63.xrea.com ~ $ echo $PATH; ruby -ve "p ENV['PATH']" /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/rbin ruby 1.8.3 (2005-09-21) [i686-linux] nil
なぜ。
標準添付の rexml は軽くやるぐらいなら十分だけど、名前空間関係がちょっと怪しい。今時 XML を真面目に使えないとなるとやばい。
RAA を検索してみると libxml-ruby がよさげなので試してみる。extconf.rb がなんだかしらんが全く通らないので該当部分でばっさりコメントアウト。extconf.rb の存在意義なし!!!
リファレンスの類が見当たらない。要素は ele = XML::Node.new(element_name[, content]) で作るみたい。便利だけど Node っていう名前にちょっと違和感が……属性は ele["attr_name"] = attr_value。DOM 実装を期待してたんだけど違うらしい。getElementsByTagName は Node#find みたいだし (find の引数は XPath なので全然違うが) あーやばい。コンテキストノードとカレントノードの違いを忘れそうだった。Node#find はトップレベルのコンテキストノードにレシーバを設定して云々、でいいのかな。カレントノードが XSLT のものだよなぁ。
名前空間関連はまだ調べてない。libxml だから大丈夫だと思う(てきとう。とりあえず学校へ。眠いっつうの。
どういうのが切ないのかを考える。どういう風に表現すれば切ないっぽいのかを考える。ちなみにただのメモだから結論なんて出ていないし、そもそも考えるまでいってない部分だってありますよと。うるせーよ。
切なさがの正体がよくわからないので、正体不明のままにしとく。
効率的、とか書いたけどまずムリだ。頭痛くなってきた。とりあえず日本語かけるようになれよ俺。な?
新しくなっているのに気付いた。 ruby extconf.rb --enable-error-handler (off by default)
とか書いてあるのでちょっと期待しつつ。
とりあえず cygwin で make できんので Makefile 修正。OBJS に /lib/libxml2.dll.a /lib/libxslt.dll.a を追加して強制リンキング。exslt ははずす。
いろいろやってみたんだけど、よくわからん。USE_ERROR_HANDLER で XML::XSLT.errors が定義されるんだけどエラー起こしても特に何も入ってない。
とか書いてあって苦労してんなぁとかなんとか。/* this is really quite inelegant */
とりあえずさらに really quite inelegant
なコードで解決を図る。Ruby 側で…
require '../xslt' xslt = XML::XSLT.new xslt.xmlfile = "fuzface.xml" xslt.xslfile = "fuzface.xsl" begin err = STDERR.dup pipe = IO.pipe STDERR.reopen(pipe[1]) out = xslt.serve # raise RuntimeError rescue RuntimeError => e p XML::XSLT.errors #=> [] if e.message =~ /^(XSL|XML|Stylesheet) / p e p pipe[0].readpartial(4096) #=> エラーメッセージ else raise end ensure STDERR.reopen(err) end __END__ 起こりうるエラーたち (grep) parser.c:53: rb_raise( rb_eRuntimeError, "XSL parsing error" ); parser.c:59: rb_raise( rb_eRuntimeError, "XSL Stylesheet parsing error" ); parser.c:65: rb_raise( rb_eRuntimeError, "XSL Stylesheet parsing error" ); parser.c:84: rb_raise( rb_eRuntimeError, "XML parsing error" ); parser.c:90: rb_raise( rb_eRuntimeError, "XML parsing error" ); parser.c:97: rb_raise( rb_eRuntimeError, "Stylesheet transformation error" );
tests/fuzface.rb の改造。xmlfile= は使うなという警告がでるけどとりあえず放置。$stderr じゃなくて STDERR にメッセージを吐くらしくめんどっちいことをやってる。readpartial は cygwin の ruby が 1.8.3 になったから使ってみた。便利よねコレ
ごちゃごちゃやってみたけど使わない。XREA に入れるのめんどいし……
これでドウダ
class XML::XSLT class XSLTError < StandardError; end class XSLParsingError < XSLTError; end class XSLStylesheetParsingError < XSLTError; end class XMLParsingError < XSLTError; end class StylesheetTransformationError < XSLTError; end alias __org__serve serve def serve ret = nil err = STDERR.dup pipe = IO.pipe Thread.critical = true STDERR.reopen(pipe[1]) begin ret = __org__serve rescue RuntimeError => e STDERR.reopen(err) Thread.critical = false message = pipe[0].sysread(4096) error_class = XSLTError case e.message when "XSL parsing error" error_class = XSLParsingError when "XSL Stylesheet parsing error" error_class = XSLStylesheetParsingError when "XML parsing error" error_class = XMLParsingError when "Stylesheet transformation error" error_class = StylesheetTransformationError end raise error_class.new(message) ensure STDERR.reopen(err) Thread.critical = false end ret end end xslt = XML::XSLT.new xslt.xmlfile = "fuzface.xml" xslt.xslfile = "fuzface.xsl" begin xslt.serve rescue XML::XSLT::XSLTError => e p e end
将来完璧な実装になっても消すだけ! これなら使えそう? ごめん嘘。エラークラス云々があるのでそのままじゃ無理。
make がうまくいったっぽいのでメモ。ちなみに数度要望の末 ruby-xslt を入れてもらってある (この過程で別の鯖と違う点があるかもしれない)。でもやっぱり自分でビルドできないかなぁという試行。
#!/bin/sh PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH" export PATH ruby extconf.rb #1 #make #2 # test #cd tests #ruby fuzface.rb
みたいなのを make.sh として作って保存しとく。ちなみに AddHandler cgi-script-debug .sh してある。念のため一発でやらずに一行ずつ実行させる。
ruby extconf.rb は Permission Denied がでつつも一応通るので問題なしということにしとく。んで、make なんだけど libxml/* が見つからないとかいわれる。しかたないのでローカルの /usr/include/libxml2/libxml を同じディレクトリに転送する。エラー一切なく make が通った。テストもしてみたけど大丈夫っぽい。微妙だけど。
関係ないけど XREA に拡張ライブラリ置くとき怪しいことをすることにした。/virtual/username/lib/ruby/RUBY_PLATFORM を掘ってその中に入れる。ローカルは cygwin なので /virtual/username/lib/ruby/i386-cygwin/xml/xslt.so、XREA は /virtual/username/lib/ruby/i686-linux/xml/xslt.so。んで使う場合は $LOAD_PATH.unshift("/virtual/lowreal/lib/ruby", "/virtual/lowreal/lib/ruby/#{RUBY_PLATFORM}") しとく。もともと XREA 上の RSS パーサが古いのでアレしてコレした感じ。
s63.xrea.com 上で作った xslt.so。ちゃんと動くかは知らない。
ちなみに上のセクションのスクリプトは動かないです。1.8.2 なので。readpartial を sysread にすればとりあえず動きます。どっちでもよさげだから sysread にしとくのが吉か。
IE で表示崩れていることには気付きつつ、あの例のリンクホバーで margin だか padding だかがぶっとぶバグなわけで、解決方法をバグリストから探して云々ってのがめんどくさくてめんどくさくて……
仕方ないから新しくスクラッチから書き直すか、とか思ってみたりもするんだけど、いやそれむしろもっと面倒くさくなっているよとも思うわけでして、あーしかしそろそろ今の CSS 飽きたなぁとか、なんかグッっとくるテーマが欲しいなぁなんて。なにがグッっとくるんだよって話だけど。
衝動買いしたんだけど、これは良かった。
スリーピースでそれぞれがものすごい存在感あるのってホントすごいなぁ。ベースがカッケェとか思った次の瞬間ドラムがッみたいな。ヴォーカルはすごいいい声だし……ストレイテナーかっこよすぎ。
とりあえず、そんな普通の感想はどうでもいいんです。ただの導入です。問題は見ていてふと BURGER NUDS に似てる気がしたことです。少し見た感じスリーピースであること以外はぜんぜん共通点を見出せない。そしていろいろ考えてみたんだけど割と共通点が。
かっこよさはストレイテナー、世界観は BURGER NUDSって感じ。思うに BUMP OF CHICKEN よりも全然近い。BUMP OF CHICKEN は最初のアルバム以外希望的だし。
っていうかですね? 日向氏がぽっちゃりになっててでちょっとびびったよ。BOYS DON'T CRY (ART-SCHOOL) のときは太ってるとは感じなかったんだけどな。
あとすごい楽しそうにライブしてて羨ましい。
この DVD 3k は安いなぁホント。
ROCKSTEADY のイントロはじまって最初の声入った瞬間がすごいぞくぞくする。WHITE ROOM BLACK STAR はじめて聴いたけどやばい……THE REMAINS もやばい。THE REMAINS は買うしかないなぁ。やばすぎる。
買ってよかった……
前書いたかもしれない話さ。STRAIGHTENER.NET は表向き RSS リンクがないんだけど、ちゃっかり link 要素をかいていやがるので Sage で検索してやると見つかりますよ。わらわら。Words のやつだけだけどね。
実は発売日はまだまだ先だとか思い込んでた。とりあえず第一印象。
全部綺麗系になってる。優しい白鳥の歌云々はだいたいそんな感じ。前まであった疾走感みたいなのはあんまり感じない。
完全に新しい ART-SCHOOL が実感させられる。Requiem for Innocence を聴いた直後に Paradise Lost を聴いたらかなりギャップがあって戸惑うと思う。全然違う。ぶっちゃけ一回解散して同じ名前で結成した (あくまで再結成ではない) ようなもん。表現だけ若干変わって言ってることは全く変わらんけど。
すごい聴いてて気持ちいいけど、やっぱ BOYS DON'T CRY 以前のほうが俺は好きだなぁ……もっとすごく悩んで、狭い空間で音楽やってる不完全さが良かった気分。ホントはどうだか知らんよ。
それはさておきですよ。LOST IN THE AIR Tony Doogan mix はヤバいと思った。
とりあえず似非 require を使うことに。ミニ JSAN みたいな実装にしといた。変数のリストを取得できないからこれ以外方法がなさげ。まぁ必要なオブジェクトを明示できるから悪いとはいえないんだけど。
function require(__path, __exports) {
if (!__exports) __exports = [];
var __code = (require.LOADED_FEATURES[__path]) ? require.LOADED_FEATURES[__path] : HTTP.get(__path);
(function () {
with (Global) {
eval(__code);
}
for (var __i = 0, __len = __exports.length; __i < __len; __i++) {
Global[__exports[__i]] = eval(__exports[__i]);
}
})();
require.LOADED_FEATURES[__path] = __code;
return true;
}
require.LOADED_FEATURES = {};
require("/ruby.js");
require("/xb.js", ["document_addEventListener", "document_removeEventListener"]);
require("/dom.js", ["getElementsByAttribute", "getElementsByClassName"]);
require("/mm.js", ["MetadataManipulator"]);
require("/code.js", ["markupCode"]);
require("/util.js", ["MessageArea", "ProgressBar", "AccessibilityOption"]);
余計なことをしても使わないので、できるだけ短くすることにした。"Obj.prop" みたいなのも渡せるようにしたやつも書いてみたけど思ったより長くなったので却下した。
HTTP.get とか書いてるけどこれより前にそういうのを書いてある。
さっき気付いたんだけど IE で表示崩れるよね。なんか直す気力がないから放置するよ。別に読めないわけじゃないし。それにともなって MM のテストをいったん廃止
読んだ順
読み始めてみたけど最後まで読めなかった本は書かないぜ。
Javascript はファイル間の依存関係を一切書けない。ロードする順番は結局 script 要素の出現順、つまり HTML 依存。どう考えても気持ち悪い。のでどうにかして require もどきを作りたい。
function createXMLHttpRequest() {
return this.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}
var __LOADED_FEATURES = {};
var Global = this; // this == window == Global
function require(lib) {
if (__LOADED_FEATURES[lib]) return false;
var req = createXMLHttpRequest();
req.open("GET", lib, false); // 同期
req.send(null);
if (req.status == 200) {
// IE ではグローバルコンテキストで実行してくれない。
Global.eval(req.responseText);
__LOADED_FEATURES[lib] = true;
} else {
throw Error("Load Error");
}
return true;
}
require("/ruby.js");
require("/mm.js");
Global という名前のオブジェクトが宣言されてなかったりするので強調をこめて宣言してある。それ以上の意味はないです。window.eval でも問題なし。見たとおり XMLHttpRequest を使って取得し、eval させてみる。
これは Firefox 1.0.7と Opera 8 ではうまくいくけど、IE 6 ではうまくいかない。
IE の場合 eval する部分のコンテキストが変わってくれない。つまり mm.js に var MottoMottoMeidosan = function () { .. } とかいう宣言があったとき、require 関数の変数オブジェクトに代入されやがるので、require のあとに new MottoMottoMeidosan() とか書くと「そんな変数宣言されてません」と怒られる。
解決法なんですが、さっぱりわかりません。誰か助けて。
なんだったら .php にでもして include() でもいいんだろうけど、これは完全に負けだよね(謎
卑怯な解決方法1を発見した。
eval(req.responseText.replace(/^var/g, ""));
インデント依存っていうか副作用がどれだけあるか不明すぎ。
JSAN つかえよバーカ。
JSAN はそもそもグローバルスコープで eval することなんて考えてない。指定したオブジェクトだけグローバルスコープに登録してる。つまり基本的に一個のファイルで一つの固まりしかロードできない。use は必要なのをグローバルスコープに登録するらしい。 DOM 定数とかをグローバルスコープに登録するなら全部 use/export の引数に書けってことなのか?
なんか素晴らしすぎて使いづらいなぁ。特定ファイルを単純にロードしたい。とくにディレクトリ構造を要求するのがなんともいえない。
疑問なんだけど JSAN は 291 行ものコードを最初から書いておけっていうだろうか?
script 要素二つ書けっていうんだったら目的が違うな。モジュールシステムが欲しいんじゃないし。
一回で10k以上使ったのはさりげなく初めてだな、と思った。
とりあえず Paradise Lost きく。
さよならリフレインのジャケットが素晴らしすぎて悶えるので是非紹介したかったんだけど、amazon にないっぽい。残念。傾向的にはメレンゲの初恋サンセット系。と思いきや公式ページにありましたよっと。
for(;;) window.status = ""; がブラクラ。Firefox 1.0.7 と IE6 にて。Firefox はステータスバーを書き換えを許さないようにしたら死なない (スクリプトが遅い警告が出る) けど、他にもあるんじゃねぇの的な。
あと for(;;) alert(""); もある意味ブラクラ。止める方法が存在しない (するのかもしれないけど見つけられない)
Javascript 実行中ブラウザが止まるのはアレだなぁ? Gecko だと仕方ないのかなぁ? まぁ IE もだけどさ。
どうでもいいし関係ないけど俺は Bugzilla-jp が苦手だ。なんか雰囲気がおかしく感じる。何を基準に「おかしい」なのかはさておき、バグ報告したくない。報告しただけで怒られそう。ってか前報告したときなんか怒られたし。INVALID とか言われたとき「ハァ?」とか思ったと同時に諦めた。まぁそのときは他の人がフォローしてくれたけどさ。なんであんな「お前の報告が間違ってる」っていう感じをヒシヒシと出してくるんだろ。まぁどうせ100%俺の考えすぎなんだろう。被害妄想で申し訳ありません。
あーちなみに while (true) じゃないのは for (;;) のほうが可愛いから!
ECMAScript でイテレータ なんてのを書いたことがあったけど、これ、each の中で break ができないのでちょっと気持ち悪い。ちまたで時々聞く ruby.js はどうやって解決しているんだろう?って思ってみてみたけど、特に何もしてなかった。つーか ruby.js 見つけるのが割りとめんどかったよ。
いろいろ考えたけどとりあえず動いたのをメモっとく。
function Array_each(func) {
try {
var context = {
escape : function () {
throw "break";
}
}
for (var i = 0, len = this.length; i < len; i++) {
func.apply(context, [this[i]]);
}
} catch (e) {
if (e != "break") throw e;
}
return this;
}
Array.prototype.each = Array_each;
[1, 2, 3].each(function (i) {
if (i > 1) this.escape();
Debug.dump(this);
});
Function.prototype.apply() の第一引数は関数の中での this なのでそれにメソッド設定してみる。ループから抜けるのに try - catch。投げるオブジェクトは "break" という文字列。"break" 以外の場合は例外を投げなおす。
ほんとはコンテキストの変数オブジェクトに直接関数を突っ込めるのがいいんだけど、ECMAScript では変数オブジェクトにアクセス方法はない (Activation オブジェクトは変数の実体化を目的とした変数オブジェクトとして使用される。Activation オブジェクトは純粋に仕様のメカニズムである。 Activation オブジェクトへのアクセスは ECMAScript プログラムには不可能である。
メンバ (変数) にはもちろんアクセスできるから eval つかえばいいけどスマートとは思えない。) のでこんな感じ。Global (window) は使いたくないし……
あとは eval(func.toString().replace(/\{/, "\{ var escape = function () { .. };")) とか?
昨日なんとなくメレンゲのサイト見たら、なんか違和感を感じる文字列あって、注目したらSINGLE「すみか」のリリースが決定しました。来年1月下旬公の映画「最終兵器彼女」の主題歌です。
とかなんとか書いてありふきだす。ちょ、おま的な何か。
ていうか実写なのね。最終兵器彼女殆ど読んだことないけどさ、実写って可能なんだ。グロそうなんだけど
はじまった。ラジオで ART-SCHOOL ははじめて。今回はメディア露出が多い気がする。気のせいか。
木下氏はアレか、風邪もしくは花粉症か。
ファッション経由で髪形 (マッシュ) について言及。わろた。
BLACK SUNSHINE
試聴済みだから特にアレもソレもなく。
ジャケは写るんです。
ダニー・ボーイ
すんごい綺麗
あと10秒での remix は「どうなの」なのか(w
ライブ中にマネージャーが片手で栗むいて食うのか。いや違うけど。
影
で、終わり。なんか微妙。宇野氏と櫻井氏の話が聞きたいな。謎すぎる。
icho にデフォルトで搭載される予定らしい MetadataManipulator について。
とりあえず基本的に icho に依存しないので自分のサイトで実験することにする。Javascript 入れていれば左上になんか出てるはず。たぶん。
どこまで決めうちしていいか考え中なので、いまのところ MetadataManipulator 自体はソース生成しかやってない。ピョコピョコさせたり、CSS 的に欲しい要素を補完するのも外側。
link 要素の出現順に何も考えずにソース生成すると CSS が適用しずらいのでいくつか MetadataManipulator の外側で修正してある。内側に入れるか悩む。入れるんだろうけどどうやって入れるか悩む。
# IE は CSS の問題があるけど本質じゃないのでとりあえず放置
var mmul = document.getElementById("MetadataManipulator-Local-RelatedLinks-Dd").childNodes[0];
var fill = function (linkName) {
var ret = getElementsByClassName("MetadataManipulator-" + linkName, "li", mmul);
if (ret.length < 1) {
ret = document.createElement("li");
ret.className = "MetadataManipulator-" + linkName;
ret.appendChild(document.createTextNode(linkName));
} else {
ret = ret[0].parentNode.removeChild(ret[0]);
}
return ret;
}
// 順番を保証・これ以外の rel は copyright の次以降に。
var standard_link_rel = ["start", "prev", "next", "contents", "index", "glossary", "help", "copyright"];
var links = {};
standard_link_rel.each (function (i) {
links[i] = fill(i);
});
standard_link_rel.eachWithIndex (function (i, index) {
mmul.insertBefore(links[i], mmul.childNodes[0+index]);
});
with (mmul.parentNode) {
style.left = "-201px";
if (document.all && document.attachEvent) mmul.parentNode.addEventListener = document_addEventListener;
addEventListener("mouseover", function (e) {
style.left = "0px";
}, true);
addEventListener("mouseout", function (e) {
style.left = "-201px";
}, true);
} ながったらしい CSS との組み合わせです。see base.css