PinGooとは?

一つ一つPINGサイトを設定をする手間を軽減させ、より多くのPINGサイトへあなたの記事を一斉に掲載させるサービス、それがPinGoo!です。

WeblogUpdatePingプロキシ。面白い!

こんな風に本当にワンアイデアで速攻サービスを立ち上げちゃうような身軽さを持っていきたいです。

唯一のパソコン(ノート)のキーボードが壊れた問題。

キーボードのケーブルが外れただけかと思いきや、F10, F11, など、曲がっちゃった部分周辺のキーが全滅したので使えたもんじゃない。’’が使えないからインスタンス’->‘とか一切使え(書け)ません。

修理に出すと仕事ができなくなるのでキーボードだけ取り寄せられないもんかサポートに問い合わせてみました。

恐れ入りますが、このたびご要望いただきましたキーボードにつきましては 修理にて対応をさせていただいているため 送付による提供はいたしかねます。

あー、返答がまっとう過ぎる。夢が無いよ。「24万円で特別に提供致します。」とか嘘でもいいから書いてくれよ。 今日び、携帯だって代わりのかしてくれるんだから代パソくれよ!

yoshuki氏のおかげでくっついたケーブルですが、おれがいじくり回したせいか利かないキーが。 修理に出すにしてもパソコンが無くなると(執筆締め切りが)まずいので悩み中。

パソコン修理にも代車とかそういうシステムねーのかよ。 買っちまうか・・・!?

typeT シリーズHDD交換方法

A のケーブルもここで外してしまいます。 C、D、Bのケーブル(写真7)もこの状態でもし外せれば外してしまいましょう。(もし外せなかったら無理せずに次の工程へ)

唯一のパソコンにメモリ増設(PC success)したらキーボードのケーブルが外れたまま付けられなくなってしまった! HELP!

追記:

yoshuki氏に直してもらいました!実際はネジ一本抜く必要は無かったようです・・・。ビバ職人!

compare_encoding.png

地味ノウハウ。 EclipseのCVS Text Compareのリモート側のEncodingはココのが使われる。

複数Webサーバ、単一セッション管理時のsession_start()。
セッションIDがかぶるかもしれない問題用。

アドホック過ぎなのであってるかどうか心配です。

<?php
function session_start_uniq() {
    if (isset($_COOKIE[ini_get("session.name")])) {
        $sid = $_COOKIE[ini_get("session.name")];
    } elseif (ini_get("session.use_only_cookies") != 1 and isset($_GET[ini_get("session.name")])) {
        $sid = $_GET[ini_get("session.name")];
    } else {
        $server_addr = isset($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_ADDR"] : "";
        $sid = md5($server_addr.uniqid(rand(), true));
    }
    session_id($sid);
    session_start();
    return $sid;
}
?>

ref: PHPのセッションID4

開発環境引き続き悩み中。

会社のパソコンがブチ壊れて新パソコンに移行したこともあって、開発環境をまじめに悩みだしました。 方針は、

・なるべくデフォルトや一般的なものがいい。 ・冷静に考えて効率の上がるものは使いたい。 ・シンプルな方がいい。

ツールをコロコロ変えるのにさほど苦痛を感じない派なのでいいものがあればどんどん試してみたいです。

テキストエディタとしての用件:

・LF対応 ・いろんな文字コード対応 ・正規表現を使った置換

IDEとしての用件:

・シンタックスハイライティング ・コード補完 ・CVS/SVNブラウザ

まずはemacs, vim, eclipseを試してみました。

emacsの良かった所:

・コード補完 ・インクリメンタル検索 ・emacsだけでいろいろできる

emacsの悪かった所:

・操作が特殊 ・設定がムズイ

vimの良かった所:

・軽い ・UNIX系でほぼデフォ ・Windows版もちゃんとしてる

vimの悪かった所:

・いまのところ特になし

eclipseの良かった所:

・コード補完 ・デバッガ ・CVS/SVNブラウザの閲覧性が高い

eclipseの悪かった所:

・非常に重い ・複雑

世の中のペチパーはどうしてるんだろうか・・・。

[を] 読書会で「闘うプログラマー」

仕事中毒スーパーハッカー猛烈マネージャーのカトラーが Windows NT を 開発する物語です。強烈です。部下も憑かれたように仕事に熱中してます。 家庭も崩壊です。すごすぎ。プロジェクトXのような感動が得られますが、 なんというか、やはりこういうところでは働きたくないですね。 とは言え、見習うべきところ、参考にすべきところは多い本です。 プログラマーなら必読の本です。絶版なのが残念。 日経ビジネス人文庫ででも是非!!!

家のすぐそばの図書館にこれ置いてあってさわりだけ読みました。 また借りに行こ!

Raw Template Engine用のMojavi2 Renderer作りました。

やっつけ仕事用に使います。

RawRenderer.class.php

<?php
//
// RawRenderer - Renderer for Raw Template Engine.
//
// Copyright (C) 2005 Masaki Komagata <komagata@p0t.jp> 
//     All rights reserved.
//     This is free software with ABSOLUTELY NO WARRANTY.
//
// You can redistribute it and/or modify it under the terms of 
// the PHP License, version 3.0.
//
require_once "Raw.php";

class RawRenderer extends Renderer {
    function RawRenderer() {
        parent::Renderer();
        $this->engine =& new Raw;
    }

    function execute(&$controller, &$request, &$user) {
        if ($this->template === null) {
            trigger_error("A Raw template has not been specified", E_USER_ERROR);
        }

        $this->setAttributeByRef("controller", $controller);
        $this->setAttributeByRef("mojavi", $controller->getMojavi());
        $this->setAttributeByRef("request", $request);
        $this->setAttributeByRef("user", $user);

        if ($this->isPathAbsolute($this->template)) {
            $dir = dirname($this->template)."/";
            $this->template = basename($this->template);
        } else {
            $dir = ($this->dir === null) ? $controller->getModuleDir()."templates/" : $this->dir;
            if (!is_readable($dir . $this->template) && is_readable(TEMPLATE_DIR . $this->template)) {
                $dir = TEMPLATE_DIR;
            }
        }

        if (is_readable($dir.$this->template)) {
            $this->engine->template_dir = $dir;
            if ($this->mode  RENDER_VAR || $controller->getRenderMode()  RENDER_VAR) {
                $this->result = $this->engine->fetch($this->template);
            } else {
                $this->engine->display($this->template);
            }
        } else {
            trigger_error(””Template file $dir${this}->template does not exist or is not readable””, E_USER_ERROR);
        }
    }

    function &getAttribute($name) {
        $attribute =& $this->engine->template_vars[$name];
        return $attribute;
    }

    function removeAttribute($name) {
        unset($this->engine->template_vars[$name]);
    }

    function setArray($array) {
        $this->engine->assign($array);
    }

    function setArrayByRef(&$array) {
        $this->engine->assign_by_ref($array);
    }

    function setAttribute($name, $value) {
        $this->engine->assign($name, $value);
    }

    function setAttributeByRef($name, &$value) {
        $this->engine->assign_by_ref($name, $value);
    }
}
?>

FooView_success.php(使い方):

<?php
require_once(BASE_DIR."opt/renderers/RawRenderer.class.php");

class IndexView extends View {
    function &execute(&$controller, &$request, &$user) {
        $renderer = new RawRenderer();
        $renderer->setTemplate("Index.php");
        $renderer->setAttribute("message", $request->getAttribute("message"));
        return $renderer;
    }
}
?>

テンプレはRawと同じで。
デフォルトのRendererと違うところは、

  • 変数がグローバルに展開される。(Rendererは$template)
  • $controller, $request, $userが最初からassignされてる。(SmartyRendererと同じ)

デフォルトのRendererでその2点だけが気に入らなかったんですよね!

ref: Raw Template Engine

単純フレームワークAwesomeFrameworkを更新。

AwesomeFramework-0.8.1

変更点

  • 依存性を緩やかにする仕組み追加

依存性を緩やかにするといってもDIではなく、ブルース・テイトが言っていた「Ruby などの言語では DI コンテナや AOP は必要ない」 のはなんでなんだろう?と思って考えてみました。

また見たほうが早いのでコード。

index.php(フレームワーク本体):

<?php
define("AF_DEFAULT_ACTION", "default");
define("VERSION", "0.8.1");

$vars = array();
<strong>$dependency = array();
include_once "dependency.php";</strong>
forward(isset($_REQUEST["a"]) ? $_REQUEST["a"] : AF_DEFAULT_ACTION);

function forward($action) {
<strong>    extract($GLOBALS["dependency"]);</strong>
    extract($GLOBALS["vars"]);
    include "$action.php";
}

function fetch($action) {
    ob_start();
    forward($action);
    $buffer = ob_get_contents();
    ob_end_clean();
    return $buffer;
}

function redirect($action) {
    header("Location: index.php?a=$action");
}

function assign($name, $value) {
    $GLOBALS["vars"][$name] = $value;
}

function assign_by_ref($name, &$value) {
    $GLOBALS["vars"][$name] =& $value;
}
?&gt;

dependency.php(設定ファイル):

&lt;?php
include_once "SampleCalculator.php";
$dependency["Calculator"] = "SampleCalculator";
?&gt;

SampleCalculator.php(ロジック):

&lt;?php
class SampleCalculator {
    function add($var1, $var2) {
        return $var1 + $var2;
    }
}
?&gt;

default.php(アクション):

&lt;?php
$calc = new $Calculator();
assign("result", $calc-&gt;add(1, 2));
forward("view");
?&gt;

view.php(ビュー):

&lt;html&gt;
&lt;head&gt;&lt;title&gt;Hello Calculator&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
1 + 2 = &lt;?=$result?&gt;
&lt;/body&gt;
&lt;/html&gt;

依存性を排除するには動的型付け言語の場合、単に依存するクラス名を変数にして設定ファイルに出せばいいんじゃないだろうか?これだと制御は反転しないし、依存性は注入されない。だからDIコンテナは要らないってことなんじゃなかろうか。