2005年 11月 04日

似非 xml-mode in textarea

制限つきながら、IE でも動くように。閉じタグ補完とかだけ。

Ajax による Full IME のコードをパクっています。

keypress 時のコードがうまくかければもうちょい使えるだろうけど、いかんせん IE はデバッグしにくいのでやる気起きない。Opera も。

Feed クロールの混乱

mixi の最新日記も更新されないなぁ。わからん。なにが悪いのか全然分からん。

Fucking IE

IE がモノとして存在していたら、とりあえず床に叩きつけ、五階建てマンションのベランダから踏み切りにほうりなげ、電車によりつぶされる様なストーリーを連想したりするんだけど、きっと IE がモノとして存在するとすれば、東京タワーあるいはもっとよくわからんデカイものなのだろうから、叩きつけることも、五階建てマンションのベランダから放り投げることもできないし、ましてや踏み切りにいきなり東京タワーなんて現れた日には事故どころじゃないよサイコキネシスだ、とここまで書いてちょっと切なくなってきた。つまるところ今なんでこのトップページだけが IE でズレて表示されるのか全くわからなくてむかついていたわけです。CSS のどこ書き換えてもなおらねぇ。a { border: 1px solid red } とかやるとなおるけどな!!

というか、なんでトップページだけなんだよと。意味わかんねぇよと。IE なんて死んでしまえばいいんだ。ほんとうに。でも俺と IE どっちのほうが価値があるかっていったら明らかに IE さんなわけで、あぁ、これはきっと僻みなんだな。俺ってばバカなやつ、あはは。とかなんとか。

自動筆記で日記書くのって頭悪いなぁ。なぁ。

そんなわけで、もう知らない。知らないったら知らないよ!!!!

Bloglines sanitize <script>alert("unco");</script>

なんか Bloglines が title を sanitize しない気が。。。

title に &lt;textarea&gt; って書いたやつ (すなわちタグじゃなく実態参照) からバグって表示される。なんですか。いぢめ食らってますか僕。

script じゃダメっぽいな。textarea だけか。

で、いつリダイレクトのほうの URL に書き換わるんだろう。

2005年 11月 03日

キーバインドの実装

textarea で動く劣化コピー xml-mode の入力まわりを整理して分離してみた。C-x i とかいうツーストローク以上のキーバインドも可能に。ただ、やっぱり文字入力をキャンセルさせる方法がわからないため、入力された文字をあとから削除する方法になってる。チラつく。

これである程度自由にキーバインドが変えられるようになった。

function xmlText_initialize() {
var xml = new xmlText(document.getElementById("xmltext"));
var kb = new keyBinding(document.getElementById("xmltext"), {
"C-x i" : function () { xml.indentLine() },
"TAB"   : function () { xml.indentLine() },
"C-q"   : function () { xml.indentBuffer() },
"C-."   : function () { xml.wellClose() },
"/"     : function () { xml.slash() },
"="     : function () { xml.equal() },
"RET"   : function () { xml.newLineAndIndent() }
});
}
window.addEventListener("load", xmlText_initialize, true);

劣化コピー xml-mode と一緒に使うとき、キャレット位置が若干混乱するのが微妙。なんで混乱するのかよくわからないのだけれど。

textarea のスクロール位置をセットしなおす方法が分からん。使えないって!

event.preventDefault() を使えばキャンセルできるみたいだ。書き換えよう。

あー、しかもブラウザのキーバインド横取りできる。

スクロール問題解決?

Ctrl+記号を入力すると文字が誤認される。

2005年 11月 01日

xml-mode in textarea

textarea で動く劣化コピー xml-mode

まだまだバグがあるんだけど、ぶっちゃけ微妙に飽きてきたので公開 (してモチベーションあげる作戦)。Firefox でしか確認してない。IE では絶対動かないだろう。Opera でもたぶん動かないだろう。問題なのは setSelectionRange, selectionStart。綺麗にクロスブラウザ化するスクリプトをどっかで見たけどまぁいいや。

keydown/keyup は shift とかを単体で押しても反応しやがるので困った。keypress はイベント発生時点で、まだ textarea.value に文字が入力されないのが困った。かなりキモイ方法で解決したけど、スマートなのは keypress 単体を使って、文字入力をキャンセルする方法かなぁ。できなかったけど。

キャレット位置がおかしいバグがなおせたらそこそこ実用になるかな。

dump() しまくってるので Fx のコンソール表示させてると楽しいですよ。なにがだよ?

TAB 以外の文字でのインデントは一切考えていません。必要性を感じませんから。

  • 属性に / を書こうとすると空要素タグ補完されてうざい。文字列の中にいるか外にいるか調べられればいいんだけどうまくいかない。タグの中の "[^"]*" をスキャンするとかなんとか。
  • たまに補完後のキャレットの位置がおかしい。原因・再現性不明
  • CDATA を見事に無視してインデントする。そんなに難しくないと思うけど、面倒くさいと思う。大して使わないのでどうでもいいちゃどうでもいい。
  • <empty-tag /></close-tag> みたいなときインデント崩れる。原因は空要素タグを最初から無視しているせいなんだけど、これ修正するのはめんどい。
  • 一通り実装終わり。CDATA のインデント無視も動いてるっぽい。俺的に汚いソースを書くとインデントが崩れる素晴らしい仕様に(わらい
  • 2005年 10月 30日

    新しいサイトスタイルを考えたけどどうしようか以下略

    質素かつやりたいほうだいかつファンタジーな感じにしようと試行錯誤してとりあえず画像は作ったんだけど、どうあがいても実装できないので構造をちょっといぢっちゃおうかな!バレないよね!とか思ったりしたり。とか書いたらバレるじゃんかよ。誰だよこれ書いたやつ。

    年賀状も同じ系統にしようかと思ってる。flickr の CC 画像をコラージュしようと思ってたんだけど微妙にそれさえめんどくさくなってきた。ああ、どんどんダメ人間に。どうせダメ人間だよ。悪いかよ。もともとダメ人間だよ。うるさいなぁ。

    ちょっとごめんトイレ行って来る、なんて言って席を立ったはいいけど、戻ってきたら自分の座る場所がなかったとか、がんばって作ったはいいけど使われなかったとか、一緒に選んだもののせいで悲しい眼をする誰かを見るとか、そういう気分。たぶんそれいっぱいある。きもちわるいぜ。ぜ。ぜ。ぜ。

    つまらないから寝るよ。寝ようよ。夢の中は素晴らしいぜ。

    あぁそうそう、言うのを忘れていたけれど、僕は妖精と暮らすから君は君なりに生きてくれよ、って彼がいってたよ。

    2005年 10月 27日

    How Much Is My Blog Worth

    Your blog, lowreal.net/, is worth $2,822.70

    30万ぐらい? 売りたい。

    2005年 10月 25日

    SSH on XREA

    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

    なぜ。

    2005年 10月 23日

    ruby-xslt 0.8.2

    新しくなっているのに気付いた。 ruby extconf.rb --enable-error-handler (off by default) とか書いてあるのでちょっと期待しつつ。

    とりあえず cygwin で make できんので Makefile 修正。OBJS に /lib/libxml2.dll.a /lib/libxslt.dll.a を追加して強制リンキング。exslt ははずす。

    いろいろやってみたんだけど、よくわからん。USE_ERROR_HANDLERXML::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
    

    将来完璧な実装になっても消すだけ! これなら使えそう? ごめん嘘。エラークラス云々があるのでそのままじゃ無理。