2005年 01月 13日

Ruby for-in

elsif もそうだけど for - in も嫌いだ。読む順番がアレなんだよなぁ。素直に each でいいじゃないみたいな。ついでに each と同じだと考えてるとハマる。スコープがスタックされない (この表現が正しいかは知らない)

2005年 01月 12日

chokan 再実装

IRC BOT を作り直し。RICE 使うことにする。

プラグインのロード方法を変えた。新しい無名のモジュールを作ってその中で実行してクラスのインスタンスを得るようにする。そうすれば空間が汚れないし GC 的にも嬉しいっぽい。たぶん。

    def load(klass_name)
filename = klass2file(klass_name)
mod = Module.new
mod.module_eval(File.open("#{dir}/#{filename}") {|f| f.read}, filename)
c = nil
begin
c = mod.const_get(klass_name)
rescue NameError
raise ClassNotFoundError.new("#{dir}/#{filename} must include #{klass_name} class")
end
# @klass (new に渡した上位クラス) を継承していなかったらエラー
if c < @klass
@plugins[klass_name] = {
:instance => c.new,
:loaded   => Time.now,
}
else
raise NotInheritAbstractClassError.new("The class #{klass_name} must inherit #{@klass}")
end
klass_name
end

Abstract っていうのはなんか違う気がする。

2005年 01月 11日

バナーをキャッスのソース

バナナ: cache.rb

なんかやっぱソースが汚いけどとりあえず置いとく。

ちなみにうちは以下のような構成

  1. img/
    1. cache/
      1. .htaccess
      2. cache.rb
      3. http%3a%2f%2f...
      4. ...

.htaccess でアクセス制限&DirectoryIndex cache.rb 設定みたいな。アクセス制限よりスクリプトでパーミッション設定してもいい気もする。

2005年 01月 08日

三角形カラーピッカー

Painter 風のやつを JavaScript で実装した。っていっても重要な部分は GIMP のコードからまるパクり。別のもっと単純な計算方法でやってたら、どう考えても三角形の範囲から色がはみ出すのでパクり。某 IRC チャンネルで長いことチャンネル違いな話をしつつアレとかソレとか。

IE はやる気になったらやろう……

2004年 12月 30日

めんどくさ

XML の本文部分の名前空間あたりがうまいこと決まらないので思いつくまで放置。

なんか軽いのが書きたい。

Ruby or PHP

ある関数の比較

function _load_flavors() {
$xns = $this->_xpc->xpath_eval("/config:config/config:flavors/config:flavor");
foreach ($xns->nodeset as $node) {
$ext = $node->get_elements_by_tagname("extension");
$ext = $ext[0]->get_content();
$content_type =$node->get_elements_by_tagname("content-type");
$content_type = $content_type[0]->get_content();
$this->flavor[$ext] = $content_type;
}
$this->default_flavor = $this->_xpc->xpath_eval_expression("string(/config:config/config:flavors/@default)");
$this->default_flavor = $this->default_flavor->value;
}
private
def load_flavors
@flavors = {}
@doc.elements.each("/config/flavors/flavor") do |ele|
@flavors[ele.text("extension")] = ele.text("content-type")
end
@default_flavor = @doc.root.elements["flavors"].attributes["default"]
end

でもここで使ってる Ruby の REXML というパーサは名前空間をあんまり (ほとんど?) 考慮してない (だから接頭辞がついてない。読み込んでいるドキュメントはデフォルト名前空間でやっていて接頭辞がないから) REXMLXPath とか使えるしイケてるけど、やっぱ微妙な部分がいくつかあるわけです。

PHP は書いた気になれる。んで後から読むと読み難い。実際には一回の代入が二行になっていたりするから。だからといって一行に纏めても読み難い。

PHP4 には例外もない。5 からあるけど、5 でやっと?みたいな勢い。

2004年 12月 29日

日記スクリプト思考

XML は中間データとして使うようにしてみる。もちろんデータを XML で書いてもいいし、てきとーにデータベースから XML 生成するような実装をすればデータベースを元データとして使えるように。

例えば XMLDB みたいなクラス作っといて、get_latest_xml($num), get_month_xml($year, $month) みたいなメソッドを実装 (できればインターフェイスだけ定義したクラスを作っておきたいけど PHP4 じゃ無理くさい) しとく。それぞれのメソッドは決まった XML を返す。

スクリプトは設定に応じてどのクラスを使うかを決めてインスタンス化&メッセージを投げて XML を得る。あとはそいつを XSLT エンジンに丸投げして、結果を設定した Content-type で出力。

別に PHP でなくてもいいんだけど、Ruby は三郎拡張がローカルで動かないから……

カテゴリ? タグ?

新しくするスクリプトではカテゴリではなくてタグという形にしてみる。そもそもカテゴリ的な使い方 (ツリー構造) で使っていないのでそのまま要素を tag 要素にするだけ。

理由は、カテゴリのツリー構造を表現するのが面倒くさいし、実際のところカテゴリのツリー構造ってあんまり上手くいかなかったりするから。

PHP わけわからん。UNKE PHP

なにやらeval('$db = new ' . $config->dbclass . '($config, $lang, $tags);');$db = new $config->dbclass($config, $lang, $tags); は同じっぽい。もちろん $config->dbclass はただの文字列。ナンダコレ。

それと $ext = $node->get_elements_by_tagname("extension")[0]->get_content(); がパースエラーって何よ。前にも書いた気がする。

$ext = $node->get_elements_by_tagname("extension");
$ext = $ext[0]->get_content();

上記のようにしないとダメ。

書いてて途中で PHP 捨て実行のために sablot/Ruby とか sablotron を一からやりなおしたりした。まー無理だったわけですが orz

つまり、PHP では汚いコードを心置きなく書けるわけです。あら素敵?

PHP でコードを書く理由って Sablot と mod_php のためだけなんだよね。ホント。関数の命名規則もバラバラだし、謎が多い。

2004年 12月 14日

コードに色をつける bookmarkletcode coloring bookmarklet

コードに色づけ Firefox でしか試してません。Opera ではもしかしたら動くかもしれないけれど、IE では絶対動きません。コアな部分 (つまりコードをマークアップするとこ) はブラウザにあんまり依存しないみたいなので、ブックマークレット化する部分をクロスブラウザすれば OK だけど面倒臭い。

  1. ブックマークレット起動
  2. 色づけしたいテキストをクリック (カーソルが I ビームになるとこ)
  3. プロンプトに使用するシンタックスを入力。

ECMAScript, Ruby, Lisp, XML, CSS, PHP, Io, Perl が適当に色づけ可能だと思うけど Perl はよく知らないし、Lisp はそもそもキーワード的なものがないので微妙。Javascript も JScript も ActionScript でも ECMAScript のスーパーセットである限りは ECMAScript でそこそこ色づけできるはず。HTMLXML でソレっぽくなるはず。

このスクリプトは少なくともコード部だけは独立してマークアップされてる必要があります。

<p>ほげほげ</p>
<pre>code</pre>
<span>code</span>
<code>code</code>
<p class="foo">code</p>

上のは OK. 下のは NG

<p>ほげ<em>ほげ</em>うげ
code</p>

子要素を持った要素は無理 (テキストノードに兄弟要素があるとダメ) ってことっす。

巨大なコードをやると死ぬかも。でも俺は謝らない。

Opera で一応動くように修正。リンクに %22 とか含まないようにしたのと、中途半端な IE 対策 (コピペなので) を削除。