2005 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
2014 1 2 3 4 5 6 7 8 9 10 11 12
2015 1 2 3 4 5 6 7 8 9 10 11 12
2016 1 2 3 4 5 6 7 8 9 10 11 12
2017 1 2 3 4 5 6 7 8 9 10

ホーム

2009年05月29日

まず最初に、この仕事に年齢は関係ない。

次に、デキル人間は、できるだけ影響範囲を広げないと
いけない。

したがって、年齢に関係なく、できるヤツが仕事を
引っぱっていかないといけない。

こないだも書いたけど、「愚者は教えたがり、賢者は
学びたがる」というのは、この仕事では間違った考え方。

もちろん、「教えたがりの賢者」がベストだろうが、
そうでなくても「教えたがりの愚者」は、「寡黙な
賢者」より優る。

技術者というのは、自分の影響範囲を限定したがる。
悪気はないのだろうが、自分の知識を外に向けようと
しない。それは本当によくない傾向だと思う。それでは
組織というものはよくなっていかない。

もし、あなたが技術者で、自分の仕事は組織をよく
することとは無関係だと思っていたら、その考えは
改めないといけない。

--

何度も書いてるけど、「優れたプログラマ」よりも
「優れた習慣を身につけたプログラマ」を目指す。

だから、よい習慣を見つけたら、それをみんなと共有
しないといけない。

習慣というのは、なかなか変わらないから習慣であって、
悪い習慣をなくすには働きかけが必要。その働きかけを
するのは、組織の中の一人一人であって、「誰か上の人」
ではない。

本家Permlink


2009年05月27日

ときどき、キヤノンの問題を考えるんだけど。

結論めいたことをいえば。上流も、下流も、プロパーも
下請けも、その一人一人が「いいものを作りたい」っていう
思いを持ってないとダメなんだろうなと。

作業マニュアルとかね。そういうのは、上みたいな
「思い」がないと効果がないんだよね。それで、マニュアルに
従わなかったらバツを与えるとかね。そんなんでいいものが
作れるのかっていう話だよね。

--

あと、イスがない工場の話だけど。あんな短い記事で
短絡的に反応しちゃイカンよ。生産性を高めるための
努力っていうのは、そういうところがあってもおかしく
ないんだから。それを「非人間的だ!」なんていってたら
生産性なんてなかなか上がらないよ。遊びでやってんじゃ
ないんだから。

--

しかし、このタイミング (つまり、派遣切りとか、上の
話で盛り上がってる最中) でこの記事出すニッケーも
何考えてんだかな。炎上するの目に見えてるだろ。

本家Permlink


2009年05月22日

『東洋経済 5/23』、『ワークライフバランスを実現する仕事術』、
佐々木常夫 (東レ経営研究所所長)。

  そもそも書庫にある書類は、先輩の誰かが何度も検討したり分析したりした
  もののうち、優れたものだから、問題設定や調べ方のフォーマットを借用す
  れば、すぐに応用できる。先輩の書類を参考にしながら、最近のデータを入
  れて、自分の知恵を付け加えるだけでよい。

  このようなやり方をすれば仕事は早くて、出来がいいに決まっている。おそ
  らく独力で考える人の半分以下の時間で終わっていたはずだ。

  自分の出す知恵などたかが知れている。それよりも先輩の優れた作品をよく
  読み、あるいはそのことをよく知っている人に聞き、その優れた部分を学ん
  で応用すればよいのだ。

  このことを私は「プアなイノベーションより優れたイミテーション」と言っ
  ている。プアなイノベーションのために多くの手間と時間をかけるのは誤り
  だ。むしろ優れたイミテーションを積み重ねた先に、優れたイノベーション
  が生まれてくるのだ。

  「凡を極めて非凡に至る」ことこそ仕事の奥義である。

上の話は、プログラマにも当てはまると思うんですよね。
プログラマの場合は、書類の他にソース・コードも重要な
資料になるというだけで。

それと、やっぱり、歴史を積み上げていく姿勢っていうのは、
長く続けていく上では大切なことなんでしょうね。
受け継がれる知恵があるっていうのは、ベンチャーには
ないものだから。

本家Permlink


2009年05月20日

弓って、引き絞ってるとき、□ボタンで回避できんのな。
知らんかった。×ボタンしか使ってなかった。
□回避、メッチャベンリ!

あ、つまり、△ボタン押しっぱで、あとから□ボタンを
重ねるってことね。△離しちゃダメ。

ちなみに、自分は、MHP2Gで、弓が一番優秀な武器だと
思ってるのね。どれだけ短時間で狩れるかっていったら、
ハンマーか大剣だろうけど。確実に狩れるかっていったら、
弓が一番だと思ってる。安上がりだしね。

ああ、もちろん、あくまでも一般論ね。得意不得意は人
それぞれだし。

まぁ、それでも、自分は、弓は素材集めのときしか
使わないんだけど

本家Permlink


2009年05月19日

いーんだよ、オレはバカだから。教えたがりで。

で、学んでますます賢くなった賢者様には一体何が残るんだ?

「オレ様のほうがアイツより賢いぜ、フッ」みたいな
シニカルな態度だけじゃねーのか?

本家Permlink


2009年05月18日

前から「プロジェクトを押す」ことの大切さを書いてる
わけだけど。

自分も、一人のプログラマとして、サインしたストーリー
というものに対して責任を果たしたいと願っているわけ
だけど。でも、自分も未熟だし、自分一人の力で解決
できないこともあるわけだよね。

そんなとき、独力で解決することにこだわっちゃうと、
そのストーリー、引いてはプロジェクト全体がスタック
しちゃう。だから、そんなときは他のメンバの力を借りて
でも、スタックから抜け出すことを考えなきゃいけない。

「どうやったらプロジェクトを一番早く前に進められるか」
って考えたら、他のメンバに協力してもらうことを
ためらっちゃいけないんだよね。そういうことを含めて、
「プロジェクトを押す」っていってるわけ。

これもいつもの話だけど、独力と協力との境界はあいまい
なんだよね。どこまで独力でできて、どこから協力して
もらわないといけないかっていうのは、自分の勘でしか
決められない。そういうところで早く見切りをつけられる
のも1つのセンスだろうね。

--

これも前に書いたことがあると思うけど。

非公式なコミュニケーションっていうのが大切なのね。
これは、XPでいうFlowになると思うんだけど。

公式なコミュニケーション、たとえば朝会であったり、
例会であったり。そういうところでのコミュニケーション
っていうのは、まぁ、それなりに重要なんだけど。

でも、隣の人に「ちょっとこのコード見てほしいんだけど」
みたいなのも大切なのね。「このコード、コミットしたいん
だけど、ちょっと自信がないなぁ」ってときに、他の
人に相談してからコミットするのと、不安なままコミット
するのとじゃ、全然違うんだから。

これが公式なチャンネルだと、「コミットしました」
っていうことだけが報告されちゃって、不安なままコミット
されたことが消えちゃうでしょ。

本家Permlink


2009年05月15日

みねろうさんのlittlehttpdをPHPに劣化移植したもの:

http://i.loveruby.net/ja/linuxprog/

<?php

define("HTTP_MINOR_VERSION", 0);
define("SERVER_NAME", "LittleHTTP");
define("SERVER_VERSION", "1.0");
define("BLOCK_BUF_SIZE", 1024);
define("LINE_BUF_SIZE", 4096);
define("MAX_REQUEST_BODY_LENGTH", (1024 * 1024));

class HTTPHeaderField {
    public $name = "";
    public $value = "";
    public $next = NULL;
}

class HTTPRequest {
    public $protocol_minor_version = 0;
    public $method = "";
    public $path = "";
    public $header = NULL;
    public $body = "";
    public $length = 0;
}

class FileInfo {
    public $path = "";
    public $size = 0;
    public $ok = False;
}

function main($port, $docroot)
{
    $server = listen_socket($port);
    server_main($server, $docroot);
}

function listen_socket($port)
{
    $uri = "tcp://0.0.0.0:" . $port;
    $server = stream_socket_server($uri, $errno, $errstr);
    if (!$server) {
        log_exit("%s (%d)", $errstr, $errno);
    }
    return $server;
}

function server_main($server, $docroot)
{
    for (;;) {
        $client = stream_socket_accept($server);
        if (!$client) {
            $err = error_get_last();
            log_exit("accept(2) failed: %s", $err["message"]);
        }
        service($client, $client, $docroot);
        fclose($client);
    }
}

function service($in, $out, $docroot)
{
    $req = read_request($in);
    respond_to($req, $out, $docroot);
}

function read_request($in)
{
    $req = new HTTPRequest();
    read_request_line($in, $req);
    $req->header = read_header($in);
    $req->length = content_length($req);
    $req->body = read_body($in, $req->length);
    return $req;
}

function read_body($in, $length)
{
    if ($length == 0) {
        return NULL;
    }
    if ($length > MAX_REQUEST_BODY_LENGTH) {
        log_exit("request body too long");
    }
    $body = fread($in, $length);
    if (isfalse($body) || strlen($body) < $length) {
        log_exit("failed to read request body");
    }
    return $body;
}

function read_header($in)
{
    $header = NULL;
    for (;;) {
        $field = read_header_field($in);
        if (!$field) {
            break;
        }
        $field->next = $header;
        $header = $field;
    }
    return $header;
}

function read_request_line($in, $req)
{
    $buf = fgets($in, LINE_BUF_SIZE);
    if (isfalse($buf)) {
        log_exit("no request line");
    }
    list($method, $path, $protocol) = explode(" ", $buf, 3);
    if (!$method || !$path || !$protocol) {
        log_exit("parse error on request line (1): %s", $buf);
    }
    $req->method = strtoupper($method);
    $req->path = $path;
    if (strncasecmp($protocol, "HTTP/1.", strlen("HTTP/1.")) != 0) {
        log_exit("parse error on request line (3): %s", $buf);
    }
    $req->protocol_minor_version = 0 + substr($protocol, strlen("HTTP/1."));
}

function read_header_field($in)
{
    $buf = fgets($in, LINE_BUF_SIZE);
    if (isfalse($buf)) {
        $err = error_get_last();
        log_exit("failed to read request header field: %s", $err["message"]);
    }
    if ($buf == "\n" || $buf == "\r\n") {
        return NULL;
    }
    $p = strstr($buf, ":");
    if (isfalse($p)) {
        log_exit("parse error on request header field: %s", $buf);
    }
    list($name, $value) = explode(":", $buf, 2);
    $field = new HTTPHeaderField();
    $field->name = $name;
    $field->value = trim($value);
    return $field;
}

function content_length($req)
{
    $val = lookup_header_field_value($req, "Content-Length");
    if (!$val) {
        return 0;
    }
    $len = 0 + $val;
    if ($len < 0) {
        log_exit("negative Content-Length value");
    }
    return $len;
}

function lookup_header_field_value($req, $name)
{
    for ($h = $req->header; $h; $h = $h->next) {
        if (strcasecmp($h->name, $name) == 0) {
            return $h->value;
        }
    }
    return NULL;
}

function respond_to($req, $out, $docroot)
{
    if (strcmp($req->method, "GET") == 0) {
        do_file_response($req, $out, $docroot);
    } else if (strcmp($req->method, "HEAD") == 0) {
        do_file_response($req, $out, $docroot);
    } else if (strcmp($req->method, "POST") == 0) {
        method_not_allowed($req, $out);
    } else {
        not_implemented($req, $out);
    }
}

function do_file_response($req, $out, $docroot)
{
    $info = get_fileinfo($docroot, $req->path);
    if (!$info->ok) {
        not_found($req, $out);
        return;
    }
    output_header($req, $out, $info);
    if (strcmp($req->method, "HEAD") == 0) {
        return;
    }
    output_body($out, $info);
}

function output_body($out, $info)
{
    $fd = fopen($info->path, "r");
    if (isfalse($fd)) {
        $err = error_get_last();
        log_exit("failed to open %s: %s", $info->path, $err["message"]);
    }
    for (;;) {
        $buf = fread($fd, BLOCK_BUF_SIZE);
        if (isfalse($buf)) {
            $err = error_get_last();
            log_exit("failed to read %s: %s", $info->path, $err["message"]);
        }
        if (strlen($buf) == 0) {
            break;
        }
        $n = fwrite($out, $buf);
        if (isfalse($n)) {
            $err = error_get_last();
            log_exit("failed to write to socket: %s", $err["message"]);
        }
    }
    fclose($fd);
}

function output_content_fields($out, $info)
{
    fprintf($out, "Content-Length: %ld\r\n", $info->size);
    fprintf($out, "Content-Type: %s\r\n", guess_content_type($info));
}

function output_header($req, $out, $info)
{
    output_common_header_fields($req, $out, "200 OK");
    output_content_fields($out, $info);
    fprintf($out, "\r\n");
    fflush($out);
}

function method_not_allowed($req, $out)
{
    output_common_header_fields($req, $out, "405 Method Not Allowed");
    fprintf($out, "Content-Type: text/html\r\n");
    fprintf($out, "\r\n");
    fprintf($out, "<html>\r\n");
    fprintf($out, "<header>\r\n");
    fprintf($out, "<title>405 Method Not Allowed</title>\r\n");
    fprintf($out, "<header>\r\n");
    fprintf($out, "<body>\r\n");
    fprintf($out, "<p>The request method %s is not allowed</p>\r\n", $req->method);
    fprintf($out, "</body>\r\n");
    fprintf($out, "</html>\r\n");
    fflush($out);
}

function not_implemented($req, $out)
{
    output_common_header_fields($req, $out, "501 Not Implemented");
    fprintf($out, "Content-Type: text/html\r\n");
    fprintf($out, "\r\n");
    fprintf($out, "<html>\r\n");
    fprintf($out, "<header>\r\n");
    fprintf($out, "<title>501 Not Implemented</title>\r\n");
    fprintf($out, "<header>\r\n");
    fprintf($out, "<body>\r\n");
    fprintf($out, "<p>The request method %s is not implemented</p>\r\n",
            $req->method);
    fprintf($out, "</body>\r\n");
    fprintf($out, "</html>\r\n");
    fflush($out);
}

function not_found($req, $out)
{
    output_common_header_fields($req, $out, "404 Not Found");
    fprintf($out, "Content-Type: text/html\r\n");
    fprintf($out, "\r\n");
    if (strcmp($req->method, "HEAD") != 0) {
        fprintf($out, "<html>\r\n");
        fprintf($out, "<header><title>Not Found</title><header>\r\n");
        fprintf($out, "<body><p>File not found</p></body>\r\n");
        fprintf($out, "</html>\r\n");
    }
    fflush($out);
}

function output_common_header_fields($req, $out, $status)
{
    $buf = gmstrftime("%a, %d %b %Y %H:%M:%S GMT");
    fprintf($out, "HTTP/1.%d %s\r\n", HTTP_MINOR_VERSION, $status);
    fprintf($out, "Date: %s\r\n", $buf);
    fprintf($out, "Server: %s/%s\r\n", SERVER_NAME, SERVER_VERSION);
    fprintf($out, "Connection: close\r\n");
}

function get_fileinfo($docroot, $urlpath)
{
    $info = new FileInfo();
    $info->path = build_fspath($docroot, $urlpath);
    $info->ok = True;
    if (!is_file($info->path)) {
        $info->ok = False;
        return $info;
    }
    $info->size = filesize($info->path);
    if (!is_readable($info->path)) {
        $info->ok = False;
    }
    return $info;
}

function build_fspath($docroot, $urlpath)
{
    return sprintf("%s/%s", $docroot, $urlpath);
}

function guess_content_type($fileInfo)
{
    return "text/plain";   /* FIXME */
}

function isfalse($arg)
{
    return is_bool($arg) && !$arg;
}

function log_exit() {
    if (func_num_args() < 1) {
        exit(1);
    }
    $args = func_get_args();
    $fmt = array_shift($args);
    vfprintf(STDERR, $fmt, $args);
    exit(1);
}

if (isset($argv) && basename(__FILE__) == $argv[0]) {
    main($argv[1], $argv[2]);
}

?>

本家Permlink


2009年05月14日

Meadowで.rbを開くとruby-electric-modeが発動しちゃって
チョーウゼーとか思ってて。で、調べたら:

meadow/packages/pkginfo/ruby/auto-autoloads.el

で何かやってて、それをコメントアウトした。

てか、ruby-electric-modeはデフォルトじゃOFFですから!

本家Permlink


2009年05月13日

キリン100頭の称号は『一閃』でした。

本家Permlink


2009年05月08日

もうちょっと前に書こうと思ってたんだけど。

技評もわかってねーよなー。

Webkit? なにそれ? おいしーの? 食べる気せんね。

って、オレが読みたいのは、そんな誰にでも書けるような
ハウツー記事じゃねーんだよな。

そんなんだったらブログのほう読むって。つか、ブログの
ほうが断然おもしれーじゃねーか。

ほんと、技評も、この書籍不況でナニ考えてんだかな。
雑誌で著者を育てるとか、そういう考えはないのかね。
こういう原石を磨くのに雑誌記事は最適だろ。で、
ゆくゆくはJoelみたいな存在になってくれたらウハウハ
じゃねーか。

http://steps.dodgson.org/?date=20090503

--

もう、ね。翻訳とか、監訳とか、ほんとどーでもいーわ。
オレは、日本人が書いた「上質」な記事が読みたいんで
あって。

本家Permlink


2009年05月06日

集会所上位★8『夢幻泡影』、クリア!

いやー、喜びすぎてクリア時間見るの忘れた (笑)。
30分くらいかな?

装備は:

  ヒドゥンスティンガー
  ゲリョスUヘルム
  シルバーソルメイル
  ゲリョスUアーム
  シルバーソルコイル
  ゲリョスUグリーヴ

スキルは:

  気絶無効
  心眼

猫飯は乳酒で、猫スキルはなし。

当然、分離作戦で。前に爆殺できないかやってみたんだけど。
爆発に2頭目が気づくみたいで、分離作戦が破綻する。

アイテムは回復系をほとんど。いにしえの秘薬、秘薬、
回復薬G、回復薬、薬草、サシミ魚 (笑)、こんがり魚。
それと戻り玉とその調合素材とか。

もうね。この『夢幻泡影』のために訓練所にこもってた
からね。モンスターリストで見ると、キリンの狩猟数が
62になってんだけど。半分以上は訓練所の気がする。
キリンでランスばっかり。

で、訓練所でやっててわかったのは、『自分の都合で狩れ』
ってこと。キリンが怒ってるのはキリンの都合で、そこに
突っかかるのは相手の都合に合わせてることになる。
キリンが怒ってるときは納槍して逃げ回るほうがいい。
怒りが収まったら、槍を手にして、突進はできるだけ
早めにステップでかわすと。

ただ、訓練所のキリンより大きいせいか、ステップで
避けきれないことがよくあって。回避距離UPのほうが
よかったかもしんない。ただ、ナルガ装備は雷に弱くて、
それがイヤだったんだけど。

--

ああ、自分はヘタクソですよ。ガードランサーだし、
オートガード好きだし。

--

PSP-3000なんだけど。やっぱり、動きが激しい場面で
ジャギーが目立つね。ジャギーっていう表現は違うかも
しんないけど。

本家Permlink


2009年05月05日

うへ。キーボードに水こぼしたら、Enterキーが無限ループに。

仕方ないからLinuxマシンに差さってた英語キーボードを
持ってきたんだけど。でも、どうしてregeditでいじんなきゃ
英語キーボード使えないんだろうね。WinXP。

本家Permlink


2009年05月03日

『わーい、PSP-3000だ!』

と喜ぶとでも思ってんのか。これで3台目だぞ?

最初のPSP-2000買ったのって、確か、ちょうど1年前くらいだぞ?

おまけに、『PSP-2000の黒ください』っていったら、
『3000しかありません』とかいわれて。

なんでまたPSP-3000なんて地雷踏まなきゃいけねーんだよ?!

モンハンつけてみたけど、空に格子模様が見えてんじゃねーか。
これは、なにか? ディスプレイの精度が上がったせいでアラが
目立つようになったとでもいうのか?

300万本売れたゲームで検証もせずにゲーム機作ってんのか?

--

もう、ね。PSP-2000、アナログパッドが渋くなるんですわ。
全然利かなくなるんじゃなくって、ちょっと引っかかる
ようになる。ババコンガあたりなら大丈夫でも、キリン
とかになると、さすがに厳しくなる。これから集会所の
夢幻泡影に挑むっていうときに、しかも、ランスでって
いうときに、これはない。

PSP-3000でも変わってないけど、もうちょっと根本的に
アナログパッドの設計見直したほうたいいんじゃないの?
スティック型にするとか。現行のだと、パッドを押し潰す
感じで、機械に負担がかかるでしょ?

つか、PSPにコントローラつなげられんなら、まぁ、
文句いわずにそうやるけどな。

--

ある技術について、その重要さと、その習得の容易さとは
無関係だからな?

逆にいえば、習得が容易なのにもかかわらず習得して
いなければ『なにやってんだ!』という話になる。

バージョン管理は、それほど難しい技術ではない。
けれども、会社においてお金の扱いが大切なのと同じ
ように、ソフトウェア開発においてソース・コードの
扱いは大切なんだよ。

本家Permlink


2009年05月02日

バージョン管理は、ソフトウェア開発の技術として語られる
ことは少ないが、ソフトウェア開発というビジネスにおいて、
非常に重要な技術ではある。

変更履歴の追跡や、ブランチ間のマージなど、どれ1つ
取っても、莫大な損害が出かねない類の話ではある。

ゆえに、プログラマは、すべからく、バージョン管理に
習熟すべし。

もし、あなたが新人で、まだバージョン管理の何たるかを
知らなければ、何をおいても、まず最初にやらなければ
ならないのは、バージョン管理の習得である。

オブジェクト指向が理解できなくとも、デバッガが使い
こなせなくとも、先輩たちは大目に見てくれるだろう。
しかし、バージョン管理でのミスは許されない。それほど
ソース・コードというものは、ソフトウェア開発において
神聖なものなのだ。『神聖』という言葉が悪いなら、
ソース・コードこそが『カネの成る木』ということだ。

--

コピペを一切許さないところもあるようだが (笑)、
バージョン管理の都合上、コピペのほうが望ましいことも
ある。

もちろん、コピペというのは負の遺産であることに違いは
ない。しかし、変更履歴の追跡や、マージをする場合には、
コピペのほうが目でわかりやすいという利点がある。

この『目でわかりやすい』というのは、特に出荷して
しまった製品では重要になる。

であるから、コピペしたものを一旦コミットしてから、
さらにリファクタリングしたものをコミットするという
手順も検討すべきである。あるいは、出荷バージョンでは
コピペで済ませておき、ヘッドではリファクタリングした
ものをコミットするといったことも検討すべきである。

本家Permlink


Copyright © 1905 tko at jitu.org

バカが征く on Rails