駒形電産

今日、とても泥臭いソースを書きましたのでご報告申し上げます。

urlからfaviconのurlを取る。

% cat favicon.php
<?php
require_once 'PHP/Compat/Function/file_get_contents.php';
require_once 'XML/XML_HTMLSax.php';

function getFavicon($url)
{
    class FaviconHandler
    {
        var $favicon;
        function openHandler(&$parser, $name, $attrs)
        {
            if ($name  'link' and $attrs['rel']  ‘shortcut icon’) {
                $this->favicon = $attrs[‘href’];
            }
        }
        function closeHandler(&$parser, $data) {}
    }

    $handler = new FaviconHandler();
    $parser =& new XML_HTMLSax();
    $parser->set_object($handler);
    $parser->set_element_handler(‘openHandler’, ‘closeHandler’);

    $doc = file_get_contents($url);
    $parser->parse($doc);

    $favicon = $handler->favicon;

    if (!$favicon) {
        if ($url{strlen($url)-1} != ’/’) {
            $url .= ’/’;
        }
        $favicon =  $url . ‘favicon.ico’;
    }
    return $favicon;
}

echo getFavicon(‘http://del.icio.us/komagata’) ?> % php favicon.php http://del.icio.us/favicon.ico

ヘッダに書いてない場合は何故か無理矢理URLにfavicon.icoをくっ付けて返す。 誰かJavaScript版ください。さもないとまたおれが泥臭いの書くぞ!faviconの決めつけは良くないということで一応、あるかどうか探すように変更した。

$favicon = $link . 'favicon.ico';
if (!@file_get_contents($favicon)) {
    $favicon = false;
}

file_get_contents()はやっぱりイイ!ネット上のファイルの存在確認もわかる!(404だとfalse返ってくるみたい)

はじめてのBillGレビューのこと – The Joel on Software Translation Project

Excelチームは、我々に必要なのはExcelのためのVisual Basicなんだと言ってBasicチームを説得した。私は自分のお気に入りの機能を4つBasicにどうにか付け加えた。ひとつはVariant型だ。これはどんな型でも保持できる共用データ型で、これがなければswitch文を使わずにスプレッドシートのセルを変数に格納できなかったからだ。

Variant型はExcelチームの提案だったのカ!

Joel on Software
  • Joel on Software
  • オーム社(2005-12)
  • オーム社
  • (著)Joel Spolsky
  • (翻訳)青木 靖
  • 定価:¥ 2,940
  • 新品価格:¥ 2,940
  • 中古価格:¥ 2,600
  • ASIN:4274066304

ここを読んで、さらに教えの通りここを読んで、それからJoel on Softwareをyoshukiさんから借りて読みました。(買っても読み終わったら捨ててしまうからな)

よくある、「これさえ行えばハッピーになれる!」ていう方法論じゃなく、筆者自身のプログラマとしての泥臭い経験談から来る解答が楽しい。GUIプログラム製品をたくさん作ってきた経験に基づくユーザビリティへの考え方はおれの様なチンカスWebプログラマにはとってもためになりました。

ところで、以前から名著・古典を読もうキャンペーン中だったおかげでこの本で引用されてる内容が良くわかって嬉しいです。 以下引用されてる中で読んで良かった名著・古典リスト。

ピープルウエア 第2版 - ヤル気こそプロジェクト成功の鍵

ソフトウェア開発に置ける人間学。知的労働者の生産性に関して引用されてます。

人月の神話―狼人間を撃つ銀の弾はない
  • 人月の神話―狼人間を撃つ銀の弾はない
  • ピアソンエデュケーション(2002-11)
  • ピアソンエデュケーション
  • (著)Jr.,フレデリック・P. ブルックス
  • (原著)Frederick Phillips,Jr. Brooks
  • (翻訳)滝沢 徹
  • (翻訳)富沢 昇
  • (翻訳)牧野 祐子
  • 定価:¥ 3,045
  • 新品価格:¥ 3,045
  • 中古価格:¥ 2,995
  • ASIN:4894716658

古典中の古典。「遅れているプロジェクトに人を投入するとさらに遅れる。」

伽藍とバザール―オープンソース・ソフトLinuxマニフェスト

オープンソース=レイモンドって感じでたびたび名指しされてる。何でもかんでもOSS万歳って姿勢には否定的です。(おれは信者だが)

Microsoft内部の話も結構書き手によって全然違うので楽しい。闘うプログラマーではWindows NT 1.0開発がプロジェクトX並に感動的に描かれてますが、失敗プロジェクトとあっさり…。

言語に関しての話で、シンタックスはどうでもいい。生産性を上げるにはメモリを自動的に開放してくれる言語を選ぶべき。(VB1.0でもやってくれる)ってところは同意。でもそれじゃ最近の言語を選ぶ指標には全然ならん…。メモリ管理以外ではMixin的な機能があるか無いかが結構でかい気がするんだけどどうだろうか。その観点から言うとAggregation系関数が本体に含まれなくなってPHP5は退化? そんなこと言ったら怒られるか。

こんなことに使ってる場合じゃなく、base64はイイ。

最高のデータフォーマットだって気がしてきた。 なにしろデータをもっとも安全に保存するには、base64エンコードして石版。これ。

例えば、cd.pngって画像を安全に保管したかったら、

% php5 -r 'echo base64_encode(file_get_contents("cd.png"));'
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIzSURBVDjLhZNbbtpQEIazgaygG4nUjXRH3QAySvvSKokEgeaBSBGFXJqAQkMxYCA03EJMzcWxCb6AAYP9d46BhqRURfqw5Zn5z5y5bAHYWufd++hbwkdkCYUYEBXCz2yv/dcDtwmOsL/yIkotHU11irY5g9QfIp5tgdmWPtsvBJbB0YOLCuaOC0kHjtIGvhQMfO9PMSYnh2A25sN8VyIrAY4ZNBvezyTvvUsNn66fIGgOXPpGD+jOwr4U4TwBetkhHLFvYy+loqounE74MfxnKupDeBn06M+k55ThukzAYbHe6TG630lBx8dLBbsXCooSUOsBqapJ15mgPwFkEtAplcEcMIjYoiYcE8gLoobPyUcSkOH/JiOS1XGYqDOHLiOcbMCkoDZlU30ChPYcgqgze54JqLfSiE6WsUvBH0jkpmEyY4d4s6RT6U0QoaKGMppHUbKYj/pHwH8ugzvtwXfaRfr+b4HiLwshXsf+zYDoo7AmkM8/DMCdd73gIKlXVRcs7dUVDhMNJBssgyGOSxai5RFyzecreEW8vh9DkIGWBTQMQgMqjxOUOhOkmjOEciPs02wEMiYSJLZeRK+NNrVGph7dDQC+C1yJQLw+x/HtFOG8hQBv4eCHiSBvkrD93Mb1QVKoXYICJCg4VnMRKc8QFsYIZhfBAd5AWrRfDtLrUZYMFznKIF6bI1JcnH4k0C7cWfgp25tHedMyZR90lLtTrwYZKgj79s9l+s86K8t336Z1/g2YLh6PHfCmogAAAABJRU5ErkJggg==

これを石版に彫るべき。 フォーマットはbase64でメディアが石版。これ最善。

保存以外にもデータやりとりにも活躍。メッセンジャーのクライアントが違くてファイル送れない場合、本文にbase64。添付メールも何故か本文中にbase64。相手うざいだけ。

「今日は遅くなります」とか書き置きもbase64。第三者どころか相手にも伝わらない可能性大。

とにかくみんな日常生活でもっとbase64使うべき。

おまけ: 手軽にするためにbase64 encoder / decoder作りました。

http://p0t.jp/base64/

Re

文字列のオフセット指定の推奨方法が変わってる!! – よくきたblog

オフセット指定の推奨が波括弧から角括弧に変わってる!!!

なんだってー(ry

ref: ○文字目の表記

Base64で会話するスレ

1 :login:Penguin:05/03/17 21:15:31 ID:p0W8jPgd ocqhraGmptihpqGuocuks6TzpMukwaTP

馬鹿過ぎる。

一応デコード結果。

veradana:~% php -r 'echo base64_decode("ocqhraGmptihpqGuocuks6TzpMukwaTP");'
(´・ω・`)こんにちは
GIGAZINE オンラインでソースコードをコンパイルする「Compilr」

ソースコードを貼り付けるとコンパイル済みのものがダウンロードできるという仕組みらしい。対応言語はC#、VB.NET、C、Fortran。

binary2.0wwwwwwwwwwwwwwwww

なんとなくDHH製のInstikiをインストールしてみた。

% wget http://rubyforge.org/frs/download.php/9296/instiki-0.11.0.tgz
% tar zxf instiki-0.11.0
% cd instiki-0.11.0
% ./instiki -d

でこの画面。

Screenshot-Instiki Setup <del> Mozilla Firefox.png

いいなこれー。最近のカップ麺の方がセットアップ大変だぞ。 この壮絶な簡単さは見習いたい。

面倒臭がり屋のO/Rマッパー続き。

作り途中だけど使ってみたら早速問題が出た。これを使ってできたインスタンスをセッションに入れたらエラーが出る。そりゃそうか。 定義だけするメソッドを追加。

    function defineClass($name)
    {
        $class = "class {$name} extends DB_Object_Abstract { var \$_name = '{$name}'; }";
        eval($class);
    }

簡単に二重定義になったのでinclude_once的なものも追加。

    function defineClassOnce($name)
    {
        if (!class_exists($name)) {
            DB_Object::defineClass($name);
        }
    }

DBのconnectionが含まれてるから使うときはこんな感じで書くしかないか。

ini_set('unserialize_callback_func', 'autoload');
function autoload()
{
    <strong>include_once 'DB/mysql.php';</strong>
    include_once 'DB/Object.php';
    DB_Object::defineClassOnce('user');
}

キモいぃ。

以下全文。

&lt;?php
require_once 'DB.php';

class DB_Object
{
    var $dsn = "";

    function DB_Object($dsn = "")
    {
        $this-&gt;dsn = $dsn;
    }

    function factory($name)
    {
        DB_Object::defineClassOnce($name);
        $obj =  new $name;
        $con = DB::connect($this-&gt;dsn);
        $obj-&gt;_con = $con;
        return $obj;
    }

    function defineClass($name)
    {
        $class = "class {$name} extends DB_Object_Abstract { var \$_name = '{$name}'; }";
        eval($class);
    }

    function defineClassOnce($name)
    {
        if (!class_exists($name)) {
            DB_Object::defineClass($name);
        }
    }
}

class DB_Object_Abstract
{
    var $_con = null;
    var $_res = null;
    var $_name = '';
    var $_key = 'id';

    function get($column, $value)
    {
        $row = $this-&gt;_con-&gt;getRow(
            "SELECT * FROM {$this-&gt;_name} WHERE $column = ?" ,
            array($value),
            DB_FETCHMODE_ASSOC
        );

        if (is_array($row)) {
            foreach ($row as $name =&gt; $val) {
                $this-&gt;$name = $val;
            }
        }
    }

    function insert()
    {
        $fields = array();
        foreach ($this as $name =&gt; $value) {
            if (!preg_match('/^_.*/', $name)) {
                $fields[$name] = $value;
            }
        }
        $this-&gt;_con-&gt;autoExecute($this-&gt;_name, $fields);
    }

    function update()
    {
        $fields = array();
        foreach ($this as $name =&gt; $value) {
            if (!preg_match('/^_.*/', $name)) {
                $fields[$name] = $value;
            }
        }
        $where = $this-&gt;_key . ' = ' . $this-&gt;{$this-&gt;_key};
        $this-&gt;_con-&gt;autoExecute($this-&gt;_name, $fields, DB_AUTOQUERY_UPDATE, $where);
    }

    function delete()
    {
        $where = $this-&gt;_key . ' = ' . $this-&gt;{$this-&gt;_key};
        $this-&gt;_con-&gt;query('DELETE FROM ' . $this-&gt;_name . ' WHERE ' . $where);
    }

    function query($sql)
    {
        $this-&gt;_res = $this-&gt;_con-&gt;query($sql);
    }

    function find()
    {

    }

    function fetch()
    {

    }
}
?&gt;

空のメソッドとか泣ける。

LaszloLabs – LaszloJapan

Laszloラボは、OpenLaszloアプリケーションの開発者へOpenLaszloサーバーのホスティングを提供します。labs.laszlo.jpではOpenLaszloサーバーと共に、MySQL、JSP、PHP、CGIそしてRubyOnRails(準備中)を利用したOpenLaszloアプリケーションを公開できます。

(゚Д゚)ラズロー

J2EEサーバーも貸してくれんのは太っ腹な感じがする。Tracも使わせてくれればいいのにな。