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

ホーム

2007年12月30日

ああ、そうか。会長は北海道出身か。そういや北大だった
もんね。

でも、やっぱりみんな帰省するんだねぇ。それがフツーか。
帰省しないで広島行っちゃう人もいるみたいだけど。

本家Permlink


2007年12月29日1

会長、1月2日、札幌、ワロタ。

http://ruby-sapporo.org/news/2007/12/16/workshop-7/

くれぐれも風邪など召されないように。

それにしても、結構シキイ高くしてんね。SNS登録とか、
ポジペとか。せっかく会長が来るんだから、シキイ下げ
ないと意味ないんじゃない?

toRubyもさぁ、もっと人集まってほしいんだけど。特に
女性ね、女性。ようやくアマチュアの人も入ったしさ。
ほんと、アマは大歓迎なのよ。まぁ、プロでも歓迎する
けどさ。オレもさぁ、たまにはagile抜きに純粋にRubyと
いうかプログラミング楽しみたいときだってあんのよ?
いや、ほんとに。

大体オレ、『勉強会』っていう呼称が嫌いなのよ。だって、
勉強なんか昔っから嫌いだし。勉強好きだったら、今ごろ
もっと別の人生歩んでるっつーの。もし『日本Rubyの会』が
『日本Ruby勉強会』だったらゼッテー入会しなかったね。

だから、プログラミングは楽しむもんであって、勉強する
もんじゃないだろう的なね。ほんと、なんかみんな勘違い
してるよね。

--

あ、Ruby会議。コミュニティ企画というのがあるのね。
これはtoRubyとして何かやらねばという気がする。
会長にも理事にもお越しいただいたわけだし。

問題は、この話題をオレが1/9まで覚えてるかどうか (笑)。

本家Permlink


2007年12月29日

へー、チュンソフトってドワンゴに買収されてたんだ。
まぁ、別に問題なくゲーム出てるみたいだけど、なんか
ガッカリ (笑)。

つか、シレンがスーファミ版の焼き直しになったのも、
それが影響してんのか?

--

http://news.livedoor.com/article/detail/3438007/

なんでいまだにTBSに放送免許が与えられてるのか
サッパリわからんのだが。総務省なにやってんの?

本家Permlink


2007年12月28日

うわ、みんなチェック早すぎ (笑)。

自分の場合、書いた記事消すのは、『マズいこと書いちゃった』
っていうパターンはほとんどなくって、『つまんないこと
書いちゃった』っていうのがほとんどなわけです。

本屋の話は、『まぁ、もういいか』って思って消したん
ですけど。

ポイントだけ再録すると:

  池袋ジュンク堂は会長に足を向けて寝れないし、さっさと
  『会長セレクトフェア』(笑) をやるべし。結局のところ、
  漫然と本を並べて売れる時代は終わったということなん
  だし、そうすると本の目利きが重要なんだし、それを
  会長にやらせる、あるいは他の読者にやらせるっていう
  のは面白いアイデアだし、そうやって『スター読者』
  みたいなムーブメントを作んなきゃダメ。

  まず、今から自分がリアル本屋に愛情を注ぐのは物理
  的にムリ。そもそもこっちは潰れていいと思ってるん
  だし、歩み寄るのはリアル本屋のほう。で、上みたいな
  本屋から読者側へのアプローチっていうのは聞いたことが
  ない。

  出版社もリアル書店なんかに本回さねぇでアマゾン
  とかに絶対的に量を回さないとダメ。クズ本と一緒に
  並べて売られてたら売れる本も売れないし、返本の山に
  なるのがセキの山。

みたいな感じだったはず。

全部が全部潰れていいっていってるわけじゃないしね。
お客さん、読者に愛されてる店は生き残ってほしいしね。
でも、そういう店だって、工夫なしに生き残れるほど
甘くないよね、今はもう。

誤解しないでほしいっていうか、いいたいのは、たまたま
オレがキチガイだから『リアル本屋潰れろ』って表立って
書いてるだけで、多くの人は実際には何もいわずにもう
本屋見限ってるはずなんだよね。

http://d.hatena.ne.jp/umedamochio/20071222

いわずと知れた梅田さんのとこ。アマゾンで本買ってる
わけ。すでに本を買うために本屋に寄るっていう行動は
選択肢に入ってないわけ。時間のムダだから。

梅田さんが『水を飲むように本を読む』っていう表現して
んじゃん? その文脈でいえば、本屋に行くっていうのは、
もう『水を買うため』じゃなくなってんだよな。『水』
っていう人間にとって欠かせないものは、もうリアル
本屋じゃなくっても買えるわけだ。本屋に行くっていう
行動が一種のエンターテインメントになっちゃってる。

あと、オレは、リアル本屋が潰れるのはオーケーだけど、
本が売れなくなるのは困るのね。そこらへんは勘違い
しないでほしいんだけど。

リアル本屋のバカどもは、自分らが潰れたら本が売れなく
なるなんてゴーマンかましてるんだろうけど。テメーらが
いなくなったって、いい本はアマゾンがいくらでも売って
くれるから、安心して潰れろといいたいね、オレは。

本家Permlink


2007年12月27日1

う。さすが会長、痛いとこを突く (笑)。

--

なんか、ムリヤリfor_each使ってる感じ。素直にiterator
使ったほうがいい。for_each使っても大して短くなんない。
bind1stとかmem_fun使うことになるし。あるいは関数
オブジェクト使っても、長くなることには変わりはないし。
iteratorはiteratorで長くなるんだけど、typedef使えば
ガマンできるかな。

--

で、typedefするのに、標準の慣習だと"_type"をつける
みたいだけど、これじゃ長すぎ。たとえば、よく使いそうな
vector<string>の場合:

typedef std::vector<std::string> strings_type;

ってやるくらいなら:

typedef std::vector<std::string> Strings;

ってやるほうがいい。

本家Permlink


2007年12月27日

// depinject.hxx
#include <functional>
#include <map>
#include <string>
#include <vector>

namespace DI {
    class DIComponent;
    typedef std::vector<DIComponent*> Compos;
    typedef std::vector<std::string> Strings;

    class DIComponent {
    public:
        virtual DIComponent* newInstance() = 0;
        virtual void acceptComponents(Compos& components) = 0;
    };

    class Dependency {
    private:
        std::string componentName;
        DIComponent* componentPrototype;
        Strings dependentNames;

    public:
        Dependency(std::string componentName, DIComponent* componentPrototype,
                   const char* dependentNames[])
            : componentName(componentName),
              componentPrototype(componentPrototype) {
            for (int i = 0; dependentNames[i]; ++i)
                this->dependentNames.push_back(dependentNames[i]);
        }

        virtual ~Dependency() {}

        virtual void deleteComponentPrototype() {
            delete componentPrototype;
        }

        virtual std::string getComponentName() {
            return componentName;
        }

        virtual DIComponent* getComponentPrototype() {
            return componentPrototype;
        }

        virtual Strings getDependentNames() {
            return dependentNames;
        }
    };

    class DIContainer {
    private:
        typedef std::map<std::string, DIComponent*> S2compo;

        S2compo components;
        std::vector<Dependency> dependencies;

    public:
        DIContainer() {}

        virtual ~DIContainer() {
            deleteComponents();
            deleteDependencies();
        }

        virtual void registerComponent(std::string componentName,
                                       DIComponent* componentPrototype,
                                       const char* dependentNames[]) {
            Dependency dep(componentName, componentPrototype, dependentNames);
            dependencies.push_back(dep);
        }

        virtual void assembleComponents() {
            newComponents();
            introduceComponents();
        }

        virtual DIComponent* getComponent(std::string componentName) {
            if (components.count(componentName) == 0)
                return 0;
            return components[componentName];
        }

    private:
        virtual void deleteComponents() {
            for_each(components.begin(), components.end(),
                     std::bind1st(std::mem_fun(&DIContainer::deleteComponent),
                                  this));
        }

        virtual void deleteComponent(S2compo::value_type pair) {
            delete pair.second;
        }

        virtual void deleteDependencies() {
            for_each(dependencies.begin(), dependencies.end(),
                     std::bind1st(std::mem_fun(&DIContainer::deleteDependency),
                                  this));
        }

        virtual void deleteDependency(Dependency dep) {
            dep.deleteComponentPrototype();
        }

        virtual void newComponents() {
            for_each(dependencies.begin(), dependencies.end(),
                     std::bind1st(std::mem_fun(&DIContainer::insertComponent),
                                  this));
        }

        virtual void insertComponent(Dependency dependency) {
            std::string name = dependency.getComponentName();
            DIComponent* prototype = dependency.getComponentPrototype();
            DIComponent* instance = prototype->newInstance();
            components.insert(make_pair(name, instance));
        }

        virtual void introduceComponents() {
            for (std::vector<Dependency>::iterator it = dependencies.begin();
                 it != dependencies.end(); ++it) {
                DIComponent* compo = getComponent(*it);
                if (!compo)
                    continue;
                Compos compos;
                Strings dependentNames = it->getDependentNames();
                getServices(dependentNames, compos);
                compo->acceptComponents(compos);
            }
        }

        virtual DIComponent* getComponent(Dependency dependency) {
            std::string name = dependency.getComponentName();
            if (components.count(name) == 0)
                return 0;
            return components[name];
        }

        virtual void getServices(Strings& dependentNames,
                                 Compos& ret_services) {
            for (Strings::iterator it = dependentNames.begin();
                 it != dependentNames.end(); ++it) {
                if (components.count(*it) == 0)
                    continue;
                DIComponent* compo = components[*it];
                ret_services.push_back(compo);
            }
        }
    };
}

// cxx.cxx
#include "depinject.hxx"
#include <iostream>

using namespace DI;
using namespace std;

class Openfilename : public DIComponent {
public:
    Openfilename() {}

    virtual ~Openfilename() {}

    virtual DIComponent* newInstance() {
        return new Openfilename();
    }

    virtual void acceptComponents(Compos& components) {}

    virtual bool open(string& path) {
        path = "Openfilename";
        return true;
    }
};

class Filer : public DIComponent {
private:
    Openfilename* openfilename;

public:
    Filer() : openfilename(0) {}

    virtual ~Filer() {}

    virtual DIComponent* newInstance() {
        return new Filer();
    }

    virtual void acceptComponents(Compos& components) {
        for (Compos::iterator it = components.begin();
             it != components.end(); ++it) {
            if (!openfilename) {
                openfilename = dynamic_cast<Openfilename*>(*it);
                if (openfilename)
                    continue;
            }
        }
    }

    virtual bool open(string& path) {
        return openfilename->open(path);
    }
};

class AppModel : public DIComponent {
private:
    Filer* filer;

public:
    AppModel() : filer(0) {}

    virtual ~AppModel() {}

    virtual DIComponent* newInstance() {
        return new AppModel();
    }

    virtual void acceptComponents(Compos& components) {
        for (Compos::iterator it = components.begin();
             it != components.end(); ++it) {
            if (!filer) {
                filer = dynamic_cast<Filer*>(*it);
                if (filer)
                    continue;
            }
        }
    }

    virtual void open() {
        string path;
        if (filer->open(path))
            cout << path << endl;
        else
            cout << "open failed" << endl;
    }
};

class AppControl : public DIComponent {
private:
    AppModel* model;

public:
    AppControl() : model(0) {}

    virtual ~AppControl() {}

    virtual DIComponent* newInstance() {
        return new AppControl();
    }

    virtual void acceptComponents(Compos& components) {
        for (Compos::iterator it = components.begin();
             it != components.end(); ++it) {
            if (!model) {
                model = dynamic_cast<AppModel*>(*it);
                if (model)
                    continue;
            }
        }
    }

    virtual void dispatch(string event) {
        if (event == "open")
            model->open();
    }
};

static void
registerOpenfilename(DIContainer* container)
{
    const char* name = "Openfilename";
    DIComponent* prototype = new Openfilename();
    const char* dependents[] = {0};
    container->registerComponent(name, prototype, dependents);
}

static void
registerFiler(DIContainer* container)
{
    const char* name = "Filer";
    DIComponent* prototype = new Filer();
    const char* dependents[] = {"Openfilename", 0};
    container->registerComponent(name, prototype, dependents);
}

static void
registerAppModel(DIContainer* container)
{
    const char* name = "AppModel";
    DIComponent* prototype = new AppModel();
    const char* dependents[] = {"Filer", 0};
    container->registerComponent(name, prototype, dependents);
}

static void
registerAppControl(DIContainer* container)
{
    const char* name = "AppControl";
    DIComponent* prototype = new AppControl();
    const char* dependents[] = {"AppModel", 0};
    container->registerComponent(name, prototype, dependents);
}

int
main()
{
    DIContainer container;
    registerOpenfilename(&container);
    registerFiler(&container);
    registerAppModel(&container);
    registerAppControl(&container);
    container.assembleComponents();
    DIComponent* compo = container.getComponent("AppControl");
    AppControl* control = dynamic_cast<AppControl*>(compo);
    control->dispatch("open");
    return 0;
}

本家Permlink


2007年12月26日

下書き。

class Service
  def new_instance
    return self.class.new
  end

  def accept_server(name, server)
  end
end

class Dependency
  def initialize(proto, dependents)
    @proto = proto
    @dependents = dependents
  end
  attr_reader :proto, :dependents
end

class Container
  def initialize
    @dependencies = {}
    @services = {}
  end

  def register(name, proto, dependents)
    @dependencies[name] = Dependency.new(proto, dependents)
  end

  def assemble
    new_instances
    connect
  end

  def new_instances
    @dependencies.each do |name, dep|
      @services[name] = dep.proto.new_instance
    end
  end

  def connect
    @dependencies.each do |name, dep|
      client = @services[name]
      dep.dependents.each do |dep_name|
        server = @services[dep_name]
        client.accept_server(dep_name, server)
      end
    end
  end

  def get_service(name)
    return @services[name]
  end
end

class Openfilename < Service
  def open(path)
    path << 'Openfilename'
    return true
  end
end

class Filer < Service
  def initialize
    @openfilename = nil
  end

  def accept_server(name, server)
    name == 'Openfilename' and @openfilename = server
  end

  def open(path)
    return @openfilename.open(path)
  end
end

class AppModel < Service
  def initialize
    @ctrl = nil
    @filer = nil
  end

  def accept_server(name, server)
    case name
    when 'AppControl'
      @ctrl = server
    when 'Filer'
      @filer = server
    end
  end

  def open
    path = ''
    if @filer.open(path)
      puts(path)
    else
      puts('open failed')
    end
  end
end

class AppControl < Service
  def initialize
    @model = nil
  end

  def accept_server(name, server)
    name == 'AppModel' and @model = server
  end

  def dispatch(event)
    event == 'Open' and @model.open
  end
end

container = Container.new
container.register('Openfilename', Openfilename.new, [])
container.register('Filer', Filer.new, ['Openfilename'])
container.register('AppModel', AppModel.new, ['AppControl', 'Filer'])
container.register('AppControl', AppControl.new, ['AppModel'])
container.assemble
ctrl = container.get_service('AppControl')
ctrl.dispatch('Open')

本家Permlink


2007年12月25日1

うほ。アマゾン、プレミア会員だとヤマトでしたよ。
もちろん、近所のセブンで受け取り可 (こっちはこっちで
ヤマトのWeb会員になんなきゃいけないんだけど、もう
会員になってた)。

早いのは日曜頼んで月曜の夜届きました。こっちもヤマト
でした。

--

つーかさ、オレもお人好しっていうか、根がバカなもん
だから。梅田さんのいうように、こんなとこで怒りブチ
まけないで、黙ってアマゾン使ってりゃいいんだけどさ。
まぁ、これでも本屋好きなんだよね。やっぱりフラリと
本屋に入って、面白そうな本見つけるっていうのは楽しい
もんだしね。

でも、そういうのだって、実際に面白い本が並んでなきゃ
ダメなわけでしょう。スカつかまされたら、そりゃ客
だったら怒るよ、フツー。ましてや今はアマゾンもあるし。

アマゾンに負けずに生き残れるかってことを考えなきゃ
いけないんだし。その答えが売り場面積の拡大とか、そんな
安直なもんでいいのかっていいたいわけだよ。

本家Permlink


2007年12月25日

dependencyって、「依存物」と「従属物」っていう訳語が
あるけど、これらって日本語の感覚だと正反対の意味です
よね。

本家Permlink


2007年12月23日2

テンプレート (あるいはparametarized type) って、
依存性の注入に外ならないはずなんだけど、DIコンテナに
テンプレートを導入しようとすると脳ミソが固まる。

--

『ラグビー魂』、やっぱりというか、関東学院大学の
事件の話はスルーに近い状況。

やっぱり、ここは正面から取り上げなきゃいけないんじゃ
ないの? 関東学院、いわゆる『名門』に伝統では劣る
っていわれるけど、50年以上の歴史はあるんだし。その
ラグビー部といえば、大学ラグビーの王者といっても
過言ではない成績を残してるんだし。

そこが起こした事件をスルー決め込むんじゃ、そこら
へんにあるラグビー雑誌と変わんないし、第一、ラグビー
への愛が感じられない。辛いことでも、それが現実なら、
それを直視し、乗り越えるのが愛ってもんだろう。

『魂』の文字が泣くぜ。

http://www.kgu-rugby.net/

本家Permlink


2007年12月23日1

今日、遠出して大きな書店いくつか回ったんだけど、
結局、今の本屋が詐欺商売っていうのがよ〜っくわかった。

『アジャイルプラクティス』と『達人プログラマー』の
2冊目当てだったんだけど、結局、どっちもどっこにも
売ってなかった。並んでるのはクズ本ばっか。

クズ本ばっか売ってんだから、そりゃ詐欺と呼んで差し
支えないだろ。

いいか? 八百屋だって、仕入れる品の善し悪しくらいは
見極めてんだよ。それって商売として当たり前のことだろ?
卸の言いなりに本並べてるだけじゃ、そりゃ商売って
いえるもんじゃねぇだろ?

いいか? 売れてる本を売るんじゃなくって、売りたい
本を売るんだぜ? それが再販価格維持制度の本当の
狙いなんだから。それができねぇってんだから、再販
価格維持なんて必要ねぇだろ? そのせいでクズ本ばっかり
店に並んでるんだから。

もう専門書は本屋じゃ買わねぇよ。本屋は雑誌だけ売ってろ。
いいか? 専門書っていうのは4コマとかもそうなんだぜ?
囲碁の本だってそうだぜ? 『これ、そこらの本屋じゃ売って
ないかも?』って思う本みんなだ。そういうのはみんな
アマゾンで買うよ。

なんか、今、大型書店が流行ってんだってな? バカか?
腐るほどある出版物、すべて店頭に並べるつもりか?
そんなもん、フロア面積がいくらあっても足んねぇよ。
結局、こっちが買いたい本がねぇ本屋なんか、そこらの
ツタヤと変わんねぇんだよ。テメーらぜんぶ潰れろ!

--

つーわけで、アマゾンのプライム会員になった。

てか、『アジャイルプラクティス』、まだ売ってねぇ
のかよ!

上で書いた怒りはどこに向ければ (笑)。

まぁ、『達人プログラマー』売ってない時点でブチキレ
なんですけどね。

というわけで、『コードコンプリート上下』やエロDVD
なんかも注文。これで3万超の買い物。ほとんどが明日に
届くはず。

ほんとに、自分みたいな客層はどんどんリアルの本屋から
買わなくなるんだよなぁ。で、ほんとはこの層が一番
お金を落とすんじゃないの? ほんと、リアルの本屋は
潰れていいよ。売り場面積がどうとかいって反省しないん
だから。

--

そうそう、自分の専門はソフトウェア開発なわけで、
だからこそ、ソフトウェア開発に関してクズ本しか
並んでないと判断できるわけだ。もちろん、他の分野の
ことはわかんないんだけど、多分他の分野もクズ本しか
並んでないんだろうと容易に推測できるわけだ。

結局『消費者はバカだ』という前提のビジネス・モデル
なわけだよな。その分野の新刊っぽいものを善悪に関係
なく並べてりゃバカが騙されて買うだろうっていう。

今どき、そんなモデルが成り立つわけがない。

出版不況が云々いうけど、結局、そういうモデルじゃ
回んなくなったってだけじゃねぇのか? 消費者は情報を
知ってるし、賢いし、いいんだか悪いんだかわかんねぇ
もんに払うカネなんか持ってねぇ。でも、それって当たり
前の話だよな。いいもんが売れて、ダメなもんが売れねぇ
って、それだけの話じゃねぇのか?

--

まず、定番といわれるものはできるだけ切らさない。

で、その上でトレンドを押す。

そういう戦略で客の信頼を得るんだよ。『こいつ、
わかってるな』と思わせることが大切なんだよ。
信頼が得られたら、それだけ客が足を向けてくれるん
だから。

ダメな本売ったら店の評判が落ちるくらいの気持ちを
持たなきゃダメだろ。

新刊かどうかなんて関係ねぇんだよ。いい本売れよ。

--

トレンドっていうのは、情報発信なんだから、量が
さばけなくったっていいんだよ。それでこそ再販価格
維持が活きるってもんだろ。

今一番熱いのはFPだろう。ただ、これはちょっと熱すぎる
かもしれない (笑)。それでもHaskellやOCamlなんかの
新しめの本が出てるわけで、押せないこともない。

agileにはすでに定番と呼べるものがある。新刊もある。
ただ、ハズレも多いから注意が必要だ。

Ruby。というかRails。これは押しやすいトレンド。

それから、リアルなことを活かすことだって考えられる。
たとえば、名古屋だったらトヨタ関連なわけだ。トヨタ
生産方式あたりはいくらでも出回ってるだろうけど、
組み込みが多いんだろうから、それとかC/C++方面も
手厚くしておきたい。トヨタ生産方式の逆輸入である
『リーンソフトウェア開発』も同様。

逆に、東京であればSIerが多いからJava関係や、UML
なんかのカッチリ系。まぁ、東京は基本的に何でもアリ
だけど。

究極のところ、本屋がソフトウェア・エンジニアの
理想像を提案しなきゃいけないわけだ。新人のときは
これを読んで基礎を身につけなさいよ、中堅のときは
これを読んで技術を深めなさいよ、ベテランのときは
これを読んで視野を広げなさいよっていうふうに。

スーパーなんかでも、晩飯のメニューまで提案しながら
食材を売るところなんかが好調なんだろ? それとおんなじ
だよ。今の本屋は手間を惜しみすぎてる。

本家Permlink


2007年12月23日

操作に流れを作るよう心がける。

1つの画面にあれこれ詰め込むもんじゃない。

たとえば、VisualStudioで新しいプロジェクトを作る
とき、ウィザードが立ち上がって一連の設定を行う。
これなども操作に流れを作った例といえる。

逆に1つの画面にいろいろ詰め込んだ例が、プロジェクトの
プロパティ画面。タブを使ったりいろいろやっているけど、
それほど成功しているとはいえない。でも、これはこれで
仕方ない面がある。細かな設定をいろいろやらせるための
画面なんだから。

だから、基本は、単純な画面で、ユーザが迷わないように
道を作ること。それ以上をユーザが望むんなら、それは
もうゴチャゴチャ見せても構わない。

--

技術者っていうのは、自分の担当する機能ばっかりを
いじるもんだから、その機能だけを見て便利かどうかを
判断してしまう。そのあげく、不必要なまでにゴチャ
ついたUIになってしまう。

そして、そのゴチャついたUIに慣れてしまったユーザが
新しい機能の導入の障害になる。

本家Permlink


2007年12月22日

agileっていったって、その力は弱いもんなんだよ。

それに、やっぱりチームから人が出ていくっていうのは
避けられないしね。

--

あははは。なんと犯人はruby-modeだったとな。長い
こと使ってて全然気づきませんでした。

さっそくruby-mode-hookに細工させていただきました。

個人的には、ソース・コードであれテキスト・ファイルは
『絶対改行で終わらせる派』で、他人が改行で終わらせて
なかったら怒りを覚えるんですけど (笑)。でも、だから
っつって、エディタが勝手に改行入れるのは許せんのよね。

cc-modeでもC-c C-aで勝手に改行入れるようになるん
だけど、これも絶対使わない。

--

つか、これも前から腹立ってることなんだけど、ソース・
ファイルをFirefoxで見らんないんだよね。何かアプリ
選ばせるじゃん? バカか? テキスト・ファイルだろ?
テキスト・ファイルも見れねぇで、よくブラウザなんて
名乗れるよな。で、選べるアプリの中にFirefoxは入って
ねぇしな。

なんかFirefox、年々ダメになってくよな。他に選択肢
ないから使ってるけど。

本家Permlink


2007年12月21日1

どうなったら自分らは『agileになった!』といえるん
だろう?

『リファクタリング』になぞらえていえば、自分らが
新しい人たちと、新しいプロジェクトをはじめたときに
(あるいは新しいプロジェクトに放り込まれたときに)、
昨日より今日のほうが充実した日々を送れると自信を
持っていえるときじゃないだろうか。

agileとは単なる理想論じゃない。理想を追いつつも、
常に現実の問題、今直面している問題をを解決しようと
する生き方のことだ。だからこそ、昨日より今日のほうが
充実してると自信を持って言える。

--

あ、あれ、ダボだったんだ。WindowsだからCRLFなんだ。

で、もっと短くするやり方教わったんだけど、ネタバレ
だからここには書かない。まぁ、他の人が書いてる
だろうけど。それ使えばバーディだった。

つか、ファイル末尾の改行入れてんの、ruby-modeじゃん!
ファイル名を``rb.rb''から``rb''に変えたら改行入れなく
なったよ。今試したのはubuntuのemacs。

本家Permlink


2007年12月21日

全然短くなんねぇ (笑)。

とりあえずこのくらいはバカでもわかる:

200.upto(1000){|v|puts v*-10}

で、こっから先がサッパリ。

これなんか苦労した割には1バイトも縮まらない:

801.times{|v|puts -10.*v+200}

どっちもトリプルボギー。

--

でさぁ、これ、Meadowで書いてたんだけどさぁ、
このバカが勝手に改行つけてやがってさぁ。
これは前にもさんざんこきおろしたことがあったけど。
つか:

(setq mode-require-final-newline nil)
(setq require-final-newline nil)

これ利いてない?

結局、Meadowはゴルファーが使っちゃいけない
エディタってことだな。

本家Permlink


2007年12月20日1

  以下はフィクションです。

  近くにスゲーウルセーサーバがあって。まぁ、政治的な
  事情で落とすこともできなければ、どかすこともできない
  としよう。

  で、このウルセーサーバを事故に見せかけてブッ壊すと
  決心したとしよう。どういう手段が考えられるか。

というフィクションの話を隣の同僚に振ってみたら、
「磁石を使ってHDDを壊す」とか、「HDDをレンジに入れて
高温で痛めつける」なんていう答えが返ってきた。

これにはひどくガッカリした。こういうのはハッカーの
素質がない。まず現実味がないし (レンジを使うとか)、
バレやすい (HDDがおかしくなってたらまずバレるとした
もの)。こういう問題を真剣に考えられるかが、ハッカーの
素質の有無を見る指標の1つ。

今朝フと思ったんだが、瞬断を繰り返すのが一番事故っ
ぽいんじゃないか。つまり、電源プラグをコンセントから
瞬間的に抜き差しする。確実性には劣るが、これで壊れたら
もっとも自然な壊れ方じゃないか。

マザーボードに塩水をたらすっていうのも考えたんだけど、
ちょっと事故っぽくないかなと思った。

まぁ、確実性に劣る手段は、試行を繰り返さなきゃいけない
から、それだけ露見する可能性も高くなるんだけど。

というわけで、この話はフィクションだからな! (笑)

--

いや、待てよ。ログが残っちゃうな。電源はイカれても
HDDは生きてんだから、ログをサルベージしたら何度も
起動してたのがバレるかもな。

これはやっぱり発想の転換が必要か。故意に壊されたと
バレるのはいいとしよう。誰がやったかわからなけりゃ
いい。

まぁ、こういう発想は推理小説の中の犯人と同じなわけだ。
つまり、もう自分の扱う問題じゃないってことか (笑)。
この話はフィクションだしな (笑)。

本家Permlink


2007年12月20日

というわけで、WinCE向けのプログラムをチョコチョコ
書いてるわけですが。Visual Studio 2005にSDKなんかを
入れたりして。eMbedded VC++も入れたんですけど、今は
VS2005のほうを使ってます。エディタは、いつもどおり、
Meadowなんですけどね。

で、WinCEのAPIはダメだって書いたんですけど、C++が
フツーに使えそうなのはちょっとビックリ。フツーにっ
ていうのはSTLのことなんですけど。

STL使っても、小さなコードが数MBになるとか、そんな
こともなく。wstringもそのまま使えたり。そういう意味で
いえば、クロスということを別にすれば、フツーに開発
できそうな感じ。

これを機会に.NETの世界にも手を出そうかと思わなくも
なかったんですけど。でも、C#に手を出すのもちょっと
シンドイし、C++好きだから、まぁ、いいかということで。

Cのコールバックっていうのは、ズバリいっちゃえば、
WNDCLASS#lpfnWndProcです。で、よく考えたら、というか、
常識なんでしょうけど、このコールバック、Pascal形式
なわけで、C++の関数オブジェクトなんか滅相もないと
いったところ。

結局のところ、C++といえども、OSのAPIの前では、Cの
ラッパーに過ぎないんだなぁと。そういう意味では、
C++だからといってすごくアドバンテージがあるわけでも
ないんですね。よくひとくくりに『C/C++』と書きます
けど、この『/』は超えられない一線なわけです。

本家Permlink


2007年12月18日1

いや、そんなことはどうでもいい。

CRCカード。なんで広まらないんだろう? 使い勝手は
いいのに。

『手で動かせる』っていうのは、流行りの言葉でいえば、
1つのエクスペリエンスなんだな。これはUMLみたいな『死んだ
図』にはない特徴なんだな。

UMLに限らず、どんな図でも、描いているときはダイナミック
なんだな。躍動してるんだな。でも、描き終えちゃったら、
もうそれは死んじゃってる。スタティックになっちゃって
るんだな。

でも、CRCカードは違うんだな。カード1つ1つは図でも
何でもないんだな。でも、そいつらを集めて、あっちや
こっちへ動かすことができるんだな。だから、いつまで
たってもダイナミックなんだな。

人間の脳ミソはよくできてて、動かしてくうちに、カードと
カードとの間に線が見えてくるんだな。まぁ、実際には
見えないんだけど。で、こいつらを上に並べて、あいつらを
下に並べて、なんてことをやってるうちに全体が図に見えて
くるんだな。

こういうダイナミックな特徴っていうのは、会話のときに
すっごく活きるんだな。並べ替えるだけで、いろんな
シナリオを描けるんだな。

第一、図を描くのってセンスが必要で、シーケンス図に
しても、ドキュメント・ドリブンのときの清書としてなら
いくらでも時間をかけられるけど、会話のときにそんなに
時間はかけてらんないんだな。

その逆で、CRCカードは、ドキュメント・ドリブンには
全然向かないんだな。たとえば、hyukiさんなんかきれいな
シーケンス図を描いてるけど、ああいうのはやっぱりCRC
カードじゃムリなんだな。多分、それがCRCカードが広まら
ない最大の理由なんだな。

でも、くどいようだけど、図なんていうのは、描いてる
ときが一番ワクワクするし、見てるほうもわかった気に
なるんだな。大抵は『気になる』だけなんだけど (笑)。

本家Permlink


2007年12月18日

アンドロイド、Linuxであることに一部で不評を買って
ますけど。でも、勝機は十分にあるんじゃないですかね。

つーか、WinCE、MSナメすぎだろ。『スマートフォン
みたいなチンケなデバイスだったらこの程度で十分だろ』
っていうのがミエミエなんだよな。

いや、以前はそれで十分だったのかもしんないけど、
今じゃフツーにUNIX動いておかしくない環境なんだし。
だったら、ワザワザきゅうくつなAPIでプログラム書く
動機なんかどこにもない。

なんかMSはWinCEをWin32 APIだと思い込ませたいみたい
だけど、そんな子どもだましが通じるご時世じゃねぇだろ。
Win32 APIのダメなサブセットじゃねぇか。

結局、Ultra Mobile PCが注目集めてんのはそこらに理由が
あるわけでしょ。あるいは、iPhoneが注目を集めてんのも
そこらに理由があるわけでしょ。

まぁ、アンドロイドにとってWinCE系のスマートフォンは
眼中にないっていっても過言じゃない。iPhoneをどれだけ
抑えられるか、どれだけ追いついけるか。そこらへんが
アンドロイドの勝負。

--

まぁ、ほんとにマック率が上がってるよね。仕事はともかく
プライベートじゃマックっていう人がほんとに増えた。

で、そういう人って、ほんとにAppleの思惑どおりに
ハマってるんだよな。マックだけじゃなくってiPodも
持ってて、iTunesで好きなセットリスト作って、iTunes
Storeで買い物してって感じで。ほんとにAppleの提案する
ライフスタイルのとおりな生活を送ってる。そりゃ儲かる
よ。

もちろん、Wiiも売れてるわけだ。で、みんなWii Fit
買ってるわけだ。これまた任天堂の提案するライフスタイルの
とおりな生活を送ってる。そりゃ儲かるよ。

だから、やっぱり単純にデバイス売るだけじゃもう儲かん
ないんだよな。今さらいうまでもないことなんだけど。

で、ソニーはそれに失敗しちゃったんだな。なんか知らない
けど、豪華な部屋で豪華な家電に囲まれるライフスタイルを
提案してたんだけど、そんなもんで釣られる人間が多いわけが
ない。

--

そういう意味じゃ、耽溺の時代は終わったってことなん
だろうな。ゲームに耽溺する、ネットに耽溺する、そう
いう時代は終わった。

本家Permlink


2007年12月17日1

C++の話は、Cのコールバックに関数オブジェクトを渡せ
ないのが不満なんですね。まぁ、これは自分でもムチャを
いってるっていうのがわかります。

ああ、あと、ハルコビヨリが終わるというのは初耳でした。
ショックです。それに、Wikipediaで知ったんですけど、
『ひがわり娘』もとっくに終わってたんですね。これも
ショックでした。竹しか追っかけてないもんで。

--

さらに続き。

会のほうは、困ってることがないことが困ってるっていうか、
そんな感じ? カイギのほうもまだ特に何もないみたい?
どっちかっつーとリファレンス・マニュアルのことを
心配してたなぁ。

--

でも、『じゃあ、コミュニティって何よ?』っていわれ
ちゃと返事に困っちゃうんだよね、実のところ。

コミケみたいなの目指すのかなぁ? だったら、カイギ
とか、そういうイベントを開くことが主目的なのかなぁ
とか。イベントが主目的で、他の、互助的なものは二の次
なのかなぁとか。まぁ、でも、イベントが柱として存在
してれば、それについてくる感じでまたいろいろと生まれる
かもしれないなぁとか。

まぁ、でも、まだまだ小さい勢力だしね。

本家Permlink


2007年12月17日

ああ、あと:

  K.Beckは最近英語上手くなった。わかりやすく書く
  ようになった。

ってのもあった。

--

ああ、あと、レトロスペクティブに書いてあることらしい
んだけど (すんません、未読です)、勉強会は自分で主催
するほうが勉強になるっていう話もちょっとあった。

参加するだけじゃなくって、セッティングとかそういう
ことを自分から積極的にやることで、いろいろと勉強に
なるらしい。

ちょっと話が違うけど、行動力に関しては、団塊の世代の
人あたりのほうがありそうな気がする。そういう意味でも、
そのあたりの世代の人の力を取り込めないもんかと思う。

いや、逆に、そういう世代の人だからこそ、コミュニティが
どんなものであるかということを肌で知ってそうな気が
する。ゼニカネ抜きの関係というか。

--

そういえば、モチオちゃんもそんなこと言ってたんだよなぁ。
あれは、市井の知識人といった文脈だったけど。でも、
そういう人たちは、まだつながってないだけで、つながりが
できれば、もともと行動力のある人たちなんだから、あとは
早いかもしんない。

あるいは、Wikipediaにしても、実際はそういう世代の
人が大勢執筆してるかもしれない。わかんないけど。

--

続き:

  アジャイル、またキテる気がする。ここ最近はWeb 2.0
  系の話に押されてたけど。

  出版のほうは景気のいい話がチラホラ出てきたらしい。

  プラクティス、がんばった。原稿のリビジョンがもの
  すごいことになった。だから、買って (笑)。

--

ペアで世間話するって、とっても大切なことなんだよ?

つーか、ペアの楽しさっていうのは、会話の楽しさなんで
あって。もちろん、コードを介した会話というのもあり
得るけど。でも、もっと会話を楽しまないと。

どこまでプライベートに触れていいかとか、そういう
難しい問題もあるにはある。でも、そういうのは経験
しないとわかんないし。こわがって会話が少なくなるん
じゃ、何のためにペア組んでるのかってことになる。

ペアは相互監視の側面もある。でも、そういうことを
考えてギスギスしちゃったら元も子もない。だから、
会話して、楽しさと緊張のバランスの取れた心地良い
空気を作り出すことが大切。

会話のきっかけは自分で作らないと。少なくともagiler
なりXPerなりを自認してるんなら、自分から話題を振る
努力をしないとダメ。コミュニケーションっていうのは、
ただ2人の人間がそばにいるだけじゃ、なかなか生まれ
ない。

--

ああ、「バランス」って言葉は禁句か。バランスって
いうと50:50みたいに受け取られちゃうよな。そうじゃ
なくって、楽しさ90:緊張10くらいでもいいんだよ。
いや、緊張はもっと少なくったっていい。

脱線大いに結構。バカ話で大笑いして、何がいけない?
しかめっ面するだけで生産性が上がるんなら、いくら
でも眉間にシワ作ってやるけどな。そうじゃないだろ?

本家Permlink


2007年12月16日1

呑んだあとプログラミングしたくなるのはオレだけ? (笑)

あ、そうか! nokadaさんが呑んだくれてるのもそういう
わけか!

でも、nokadaさんと違って、自分は、ヤル気マンマン
なんだけど勃たないっていう、あの状態なんだよな。
実際にコーディングしようとすると指がもつれるって
いう (笑)。

--

遠路はるばるありがとうございました。

聞いた話の中で思い出せるものを:

  DHHは天才肌というより努力型なんじゃないか。たくさん
  本を読んでそう。

  会長が何を考えてるか、何をやろうとしてるか、イマ
  イチ伝わってこない (笑)。

  Railsって面白いかなぁ? (笑) Railsのソース・コード
  読むのは面白いけど。

  ほんとは、レトロスペクティブとプラクティスは同時
  くらいに出す予定だったんだけど、向こうがものすごい
  勢いでやっちゃったもんだからズレちゃった (笑)。

  The Art of Agile Developmentはなかなかいい。

まぁ、他にもあるんだけど、ここで書けるように言い
替えると、オーム社がんばれってことかな (笑)。

--

基本的に自分の話に関しては、オフレコっていうのは
ないですから。もちろん、人から聞いた話に関しては、
オフレコかどうかは判断しますけど。

だから、自分がエロ動画だけのためにWindows捨てられ
ないとか、そういうのは全然書いてオッケーな話なわけ
です。

--

薬剤師の世界に``Problem Oriented System''という考え
方があるそうな:

http://homepage3.nifty.com/akika-pos-yakuzaishi/page005.html

--

そうそう、朝ちょっと思ったんだけど、官僚って、自分ら
プログラマの仕事に似てるんじゃないかって。

官僚って、法律作るわけだけど。法律の文言って、一般人
にはわかりにくい言葉だったりするわけで、それはそれで
1つの独特の言語じゃないかと。法律にしても、それなりに
論理の積み重ねがあったり、『抜け』がないかレビュー
したりするんでしょう。それって、いってみればバーチャルな
世界じゃないの?

いや、もちろん、法律はリアルな世界を縛るもんなんだ
けど。でも、立案してるときにそのリアリティを感じる
ことは難しいんじゃないかな。

プログラミングだったら、作ったプログラムをすぐに実行
して、すぐにその結果が正しいかどうか判断できるけど。
法律って、それがたとえば悪法であっても、それが悪法で
あると実感されるまではかなり時間がかかるだろうし。

だから、官僚っていうのは、自分らからしてみれば、
仕様だけ考える人間に似てなくもない。いわゆる『上流』
ってヤツ (笑)。

--

いや、いってもせんないことなんだけど、これがコンパイル
できないのは納得できない:

typedef void (*func_type)();

class Func {
public:
    void func() { cout << "hello, world" << endl; }
};

void
callit(func_type func)
{
    func();
}

int
main()
{
    callit(Func());
    return 0;
}

本家Permlink


2007年12月16日

いや、だからね、取り返しのつかなくなる前に書けっ
つーの。

パッタリ更新されなくなったなぁと思って、つか、更新
されなくなったことに気づくのがまずむずかしいし。で、
いきなり更新されて身体壊しましたとか。そんなん、
こっちだってビックリするだけで、何もできない。

自分のアンテナにも更新されなくなったとこがいくつか
あって。すっげー心配してるんだよな。つっても、たまに
思い出すくらいなんだけど。思い出したときはコメント
入れられれば入れたりしてるんだけど。

本家Permlink


2007年12月15日1

いわゆる『廃人』系の同僚なんかでも、ミョーにネットに
恐怖感持ってんだよね。実名晒されるのを極度に嫌う。

いや、そっち方面だからよけいに恐怖感が強いっていう
のはあるかもしんないけど (笑)。

でも、どっかで一線を超えないとネットとリアルは
つながってこないよね。当たり前だけど。

逆の見方をすれば、恐怖感を持ってる人ほど、ネットと
リアルを別物だと考えてんじゃないかな。どんなに日常
的に使っててもね。

OSSに日本人の貢献者が少ないっていうのは、これと全然
関係ないように見えて、実は根っこはおんなじなんじゃ
ないかっていう気がする。外に出たがらないっていうかな。

こないだ出た『東洋経済』でも、日本人は米国人より
人間を信用しないっていうことが書かれてた。意外だった
んだけど、実験結果でそうなったっていう。身内は信用
するけど、それ以外は全然信用しない。そういう心理的な
ものがいろんなところに影を落としてそうで、ちょっと
恐い。

本家Permlink


2007年12月15日

いや、だから、あり得ないって (笑)。特に
ウスターソース (笑)。

http://www.246.ne.jp/~bayou/nikuman_chousa.htm

--

セブンもさぁ、PB商品よりも、亀田のソフトサラダと
天乃屋の歌舞伎揚げ置いてほしいんだよな。

こういう定番中の定番置かないってのも、商売として
どうかと思うよ、ほんとに。

本家Permlink


2007年12月13日1

アジリティ (agility) があって、それとコンプライアンス、
あるいはガバナンスっていうのは対立することもあるん
だけど。だからといってほっといていいわけでもない。
どっかで折り合いをつけなきゃいけない場合もある。
これからはもっとそういう場面が増えていくんだろう。
そういうときに、テクノロジーはどこまで支援できるん
だろうか。

本家Permlink


2007年12月13日

コードを書くとき、読みやすさというものの基準を自分に
置きがちなわけです。でも、初心者とベテランとでは、
読みやすさの基準というものは違うわけです。どっちの
基準が正しいかは、いうまでもなく、ベテランのほうが
正しいわけです。だから、初心者でも、読みやすさの
基準をベテランのものに合わせなきゃいけないわけです。

そのためには、コードをたくさん読んで、読みやすさの
基準というものを知らなきゃいけないわけです。

ダメなスタイルで書くバカに限って、外のコードを読んで
ない。身内のコードばっかり読んでいて、身内ローカルな
ダメスタイルが唯一のものと思ってる。

--

『中学野球小僧 2008年1月号』、福岡ソフトバンクホークス
内野守備走塁コーチ・森脇浩司:

  漠然とやっても強い意識でやっても、100球のノックを
  打てば100球分の時間が過ぎていく。それなら、強い
  意識を持ってやったほうが実になりますよね。
  (中略)
  これはノックに限らず、物事がうまくなるための考え
  方の基本だと思うんです。

  ・・・

  同時に、ノックは危険と背中合わせの練習です。
  イレギュラーして選手の目に硬球が当たれば、失明
  する可能性もある。もし漠然とした気持ちで打った
  ボールで、教え子が野球生命を断たれてしまったら・・・
  私はもう、野球を続けることはできないと思います。

--

Cやってる人、あるいはC上がりのC++初心者に多いんだけど、
#defineは、それが定数であれ、マクロであれ、必ずヘッダ・
ファイルでやるもんだと思ってる人がいる。

そうじゃない。ヘッダっていうのは、複数のファイルで
参照されるものを書くもの。だから、1つの*.cなり*.cpp
なりでしか使われない#defineは、ヘッダでやっちゃいけ
ない。

enumなんかにしても、グローバルな空間に置かずに、それが
使われるクラスなり名前空間の中に置く。

本家Permlink


2007年12月11日

当たり前だけど、シンプルに書くには言語の文法を知って
なくちゃいけない。たとえば、こないだ:

return (-1);

なんていうコードを見て固まっちゃったんだけど。こう
いう書き方しちゃうのは、文法のことを知らない自信の
なさがもたらすんじゃないか。

他にも:

if ((a == b) || (c == d))

みたいな書き方。こういう規約があるのは知ってるし、
それに従ってるんなら問題はない。でも、『なんとなく
恐いから』なんていう理由でカッコを使ってるんなら
問題がある。だって、文法上は:

if (a == b || c == d)

で問題ないし、そのほうがシンプルなんだから。繰り返す
けど、規約があるんなら、それに従わなきゃいけない。

それと、『カッコでくくるのがルール』なんていっても:

if ((a == b) || (is_it()))

なんていう書き方だと『バカの1つ覚え』。せめて:

if ((a == b) || is_it())

くらいに書く。

シンプルに書くには努力が必要だし、シンプルと安易は
全然違うもの。だから、シンプルに書くように心を配る。

--

ああ、あと嫌いな書き方といえば:

if (a == true)

みたいなの。こういうのもダメ。見てらんない。

本家Permlink


2007年12月10日1

ああ、『ねこまんが』に『肉まんに酢醤油つけて食べる』
ネタあったよ。おいしい肉まんが台なしになるのに、なんで
そんな食べ方するんだろうって子供心ながらに不思議に
思ってたそうな。ちなみに佐賀。で、上京してみんな
そんな食べ方しないから驚いたって、みたい話。

いや、やっぱTwitterとかtumblrとか、オレにはムリ。

本家Permlink


2007年12月10日

いや、そんなに苦労してまでやってもらうもんじゃ
ありませんから。ほんとに。

フリートークでもオッケーすよ? つか、今入れ込んでる
ものを語ってくれるのが一番 (笑)。

--

何も趣味でやってる人にまでうるさくいわねぇですよ?
でも、趣味でやってる人だって、どっかのオープン・
ソースのプロジェクトに参加するとなったら、そこの
スタイル守るわけでしょ? ましてや自分ら職業なんだ
から。

プログラミングってのはレトリックなわけでしょう。
文章でいえば構成とか章立てとかが設計に当たるんだ
ろうけど、文章の1文1文はレトリックなわけで。その1文
1文を丁寧に書かねぇでどうするのっていう話でね。

この「丁寧」っていうのは、だから見た目にきれいな
フォーマッティングっていう意味じゃなくってね。ある
程度認められたスタイルっていうもんがあるでしょう。
CだったらK&RかBSDとか。それが標準語であって、「です
ます調」かなんかわかんないけど。でも、そういうのから
外れたら、どんなみ見た目がきれいでも、それはベランメエ
調なわけ。一人で書くんだったらベランメエでもハナモゲラ
でもいいけど、そうじゃなかったら標準語で書けっていう
こと。

本家Permlink


2007年12月09日1

でも、ほんとコードに無神経なヤツが多いな。

前にも書いたことあるけど、returnの行の前に必ず空行
入れるバカとかな。それに何の意味があるの? 空行と
いえども意味がなけりゃノイズなだけだろ。

空行でひどいのになると:

doit();

dothat();

dothis();

なんて、1行おきに空行入れるバカ。だから、その空行に
何の意味があるっていうんだよ。読む人間のこと考えて
んのか? 気分だけで空行を入れるんじゃない。空行にも
意味を持たせろっつーの。

つーか、空行なんか、コメントといっしょで、ないに
越したことねぇんだから。

これも何度も書いてるけど:

int i   = 0;
char c  = '\0';
float f = 0.0f;

とかな。こういう気分だけのフォーマッティングは止めろ。
そんなもんのカラムをそろえる意味なんかどこにもねぇ
だろ? その情熱をもっと本質的なことに使え、バカが。
そんな見た目だけきれなコードでも、長い関数書いてちゃ
意味ねぇだろ?

あと、カッコの内側にスペース入れるバカな。

doit( var );

とか。職業プログラマとして恥ずかしくないのかね。
カッコなんてスペースみたいなもんで、そんなもんを
わずらわしいと思ってるようじゃ修行が足んねぇって
ことだろ?

--

そういえば、はてながさ、エンジニアとクリエータを
分けたっていう話あったじゃない? それ聞いたとき、
ちょっと違和感あったんだけど、でも今は、それも
しょうがないかなって思ってるのよ。

ライブドアの事件あったとき、ヒゲメガネが『あれだけ
アクセス集中してもサーバが落ちない、だからライブ
ドアの技術力もスゲーんだぜ』って書いてたじゃん?
それ聞いたとき自分、スッゲー違和感あってさ。『じゃあ、
なんでその技術力をカネに変えらんなかったわけ?』って
思ったのね。

ベンチャーっていう視点から見たら、サーバが落ちない
とか、そういうのは二の次、三の次の技術なわけでしょう。
ベンチャーっていうのは錬金術みたいなもんなんだから。
金の卵を生むニワトリを探すわけでしょう。でも、サーバが
落ちないとか、そういうのってニワトリじゃないでしょう。

いや、サーバ落とさないのは大変だろうけどね。でも、
そんなのはイグジットしちゃえば大手がやってくれること
なわけでしょう。いってみればトヨタが壊れない車作る
のとおんなじでね。誰も驚かないわけ。いくら技術が
スゴイっていってもね。

だからね、おんなじエンジニアでも、やっぱり錬金術師
みたいな人間が必要なんだよね。自分は、若い人たちに
そういう錬金術師を目指してほしいと願ってるわけ。

はてなの話でちょっとした違和感覚えたのは、自分は
みんなそういう錬金術師を目指してるもんだと思ってた
から。一発屋っていっちゃうとそれまでなんだけど (笑)。
でも、一発当てるだけでも大したもんだと思うんだけど
ねぇ。

本家Permlink


2007年12月09日

既存のシステムに手を加えるとか、古いシステムを移植
するとか、そういったとき、既存のシステムの動き、
仕様を再現することは重要だ。でも、それだけでいいのか。
使いにくさまで引き継いでしまったら、いつまで経っても
システムは良くならない。あるいは、ダメなコードを
そのままトレースするようでも、システムは良くならない。

だから、既存のシステムを下敷にして、今の、そして
将来のシステムのあり方というものを考えてほしいんだ。

既存のシステムの動きにしたって、熟慮された結果では
なく、『たまたまそうなっていた』っていうことが往々に
してある。『たまたまそうなっていた』なら、自分らで
良くしてしまえばいいじゃないか。

新しい道に踏み出すのは危険だと思うかもしれない。
でも、プログラミングの本当の醍醐味はそこにある。
未知への挑戦こそ、プログラミングでもっともエキサイ
ティングなことなんだから。

本家Permlink


2007年12月08日1

『ライブドア監査人の告白』(田中慎一、ダイヤモンド社)

なかなか。食い足りなさは残るけど、素人が書いたもの
だし仕方ない。

結局、テクノロジーあるいはネットで利益が上がって
なかったっていうのが大きいんじゃないかな。だから
アレコレ小細工しちゃったと。でも、まぁ、上場過程も
ウサン臭かったっていう指摘もあるから、どの程度
テクノロジーやネットに思い入れがあったかは疑問だ
けどね。

本家Permlink


2007年12月08日

『ねこまんが 4』(こいずみまり、竹書房)

http://www.amazon.co.jp/%E3%81%AD%E3%81%93%E3%81%BE%E3%82%93%E3%81%8C-4-%E3%83%90%E3%83%B3%E3%83%96%E3%83%BC%E3%83%BB%E3%82%B3%E3%83%9F%E3%83%83%E3%82%AF%E3%82%B9-%E3%81%93%E3%81%84%E3%81%9A%E3%81%BF-%E3%81%BE%E3%82%8A/dp/4812467276/ref=sr_1_3?ie=UTF8&s=books&qid=1197098393&sr=1-3

買うの忘れてた。何度か紹介してますけど、4巻目なのに
いまだにアマゾンでレビューされてない。1冊たりとも (笑)。

何度も書いてますけど、ほんとにこのマンガ、コミック
になることが奇跡みたいなもんで。それが4巻も出てるん
だから、すっごい奇跡なわけです (笑)。

中身なんですが、作者のホームページがあるんで:

http://www.k3.dion.ne.jp/~maririn/

で、ここ:

http://www.k3.dion.ne.jp/%7Emaririn/sub1.html

こういう感じのマンガです (笑)。コミックではさすがに
もうちょっとまともな絵で描かれてます (笑)。
アフィリエイトくらい誰か教えてやれ (笑)。

でも、自分も幼稚園のときは一人で歩いて通ってたけど
なぁ。子供の足だから30分くらいかかってたと思うけど。

本家Permlink


2007年12月07日1

これは自分で実現できるかどうかわかんないからここに
書いとこう。

Lisp系の言語を作るとして、関数オブジェクトがそのS式、
つまりソース・コードを記憶する。そうすることでより
便利なデバッガ (ステッパ) が作れないか?

こないだ見た、テーブルを利用したデバッガは面白かったが、
今、デバッガの発展は全体的に止まっているように思える。
たとえば、ステップ実行は、ソース・コード・テキストの
『行』という概念に縛られたままだ。だから:

if (foo) return bar else return baz

といったコードをステップ実行するのがためらわれる。
だから:

if (foo)
  return bar
else
  return bas

といった書き方をしなくてはならない。それが面倒。

実行される部分の色を変えるなり、やり方はいくらでも
考えられる。

本家Permlink


2007年12月07日

へー。Schemeの名前付きletをはじめて知りました。いや、
存在は聞いたことがあったから、はじめて理解したといった
ほうがいいですか。

W-ZERO3買ったんですよ。古いヤツ (WS004SH)。EMONEも
あるんですけど、自分、ケータイ持ってないじゃない
ですか。で、データだけじゃなくって音声もできるヤツが
ほしくって。だったらアドエスもあるんですけど、それ
でもやっぱり画面大きいほうがいいかなって思って。

で、いろいろやって。とりあえずNg。とりあえずRuby。
まぁ、このあたりはデフォということで。

で、前にも書いたことあると思うんですけど、こういう
PDA環境の本命はvi + Lisp系だと思ってるわけです。
何しろ、キーが限られてるわけで。ブラケットすらまともに
入力できないわけで。幸い、W-ZERO3にはCtrlキーはある
んでNgでもOKなんですけど、ほんとはviにしたい。でも、
残念ながら、手軽に入れられるviはないみたいで。

Lisp系については、大文字小文字を区別しない処理系が
多いですし、リストに限れば丸カッコしか使いません。
WinCE向けのLisp系ではPocket Schemeっていうのが見つかり
ました。

そういう意味でいえば、RubyはPDA環境に全然向かない (笑)。

で、せっかくだし、W-ZERO3でWeb見ながらScheme入門
してたわけです。

--

それで、いっつも思うんですけど、Schemeの入門書って
面白くないんですよね (笑)。『いやいや、計算だったら
電卓使うし!』みたいなのが多い (笑)。『リスト? ハァ?』
みたいな。

やりたいのはWebにアクセスしたり、CGIやってみたり、
あるいはGUIだったり、ゲームだったりするわけでしょう。
なのにファイルの入出力でさえ後回しでしょう。

いや、これはSchemeに限らず、関数型全般にいえること
なのかもしれませんけど。ハッキリいって、そういうのは
病んでますから。修行僧みたくストイックにつまらない
題材で鍛錬を重ねるって、もうそこで間口狭めちゃってる
わけで。それを病んでるといわずしてなんという。

プログラミングがプログラミングだけを目的として
モチベーションを保てたのはもう昔の話でしょう。今は、
プログラミングで何ができるか、どんな楽しいことが
体験できるかを問われてるわけで。

自分みたく『ほうほう、これが名前付きletですかぁ』
なんて感心する人間なんて、無視しなきゃいけないん
ですよ、ほんとは。メジャーになるってことはそういう
ことなんだから。

本家Permlink


2007年12月06日


本家Permlink


2007年12月05日

東洋経済に増井さんがチョコっと紹介されてました。
ただし本文では触れられてない (笑)。

iPod特集だったわけだけど、どっちかっつーと今は後悔
してるんですよね。囲い込まれた感がバリバリあって。

Windowsをホストにしてるんですけど、それをLinuxに
替えられるかっていうのがあって。まだ詳しく調べた
わけじゃないんでなんともいえないんですけど、第一感
面倒そう。接続周りを特許で固めてあるっていうのは、
いかもにAppleくさいやり方 (笑)。

--

でも、Linusは、Transmetaに雇われて、BMWに乗って
喜んでたよね?

本家Permlink


2007年12月02日1

いいね、クロネコヤマト。近くのコンビニで荷物を受け
取ることができる。ただ、Webで会員登録しないといけ
ないのがちょっと面倒だけど。まぁ、これは仕方ないか。

アマゾンも日通なんか切ってヤマトにしろよ。いまだに
週末配達指定すらできねーんだから。あきれる。

本家Permlink


2007年12月02日

XPE2の13章、"Testing: Early, Often, and Automated"の
冒頭:

  Defects destroy the trust required for effective software development.
  The customers need to be able to trust the software. The managers
  need to be able to trust resports to progress. The programmers need to
  be able to trust each other. Defects destroy this trust. Without trust,
  people spend much of their time defending themselves against the pos-
  sibility that someone else may have made a mistake.

欠陥によって信頼が失われる。信頼が失われると、他の
人間を監視するためのコストを払うことになる。それが
生産性の低下を引き起こす。

XPE2、途中で投げ出してたんですけど、またポツポツ読み
進めていこうかと。で、出てきたのが上の文章。不思議な
ものです。ちょうど似たようなことを考えてたんですから。

前に"XP is about social change"のことが話題になって
ましたよね。自分はこれの元ネタ、知らないんですけど。
でも、やっぱり自分は、ソフトウェア開発とそれを取り
巻く社会とを別個に考えることはできないと思うんです
よね。そもそもXPが生まれたのだって、社会が変化した
からでしょう。

社会の変化がソフトウェア開発に反映される。これは
当たり前の話。じゃあ、ソフトウェア開発の変化は社会に
影響しないのか? そんなことはないと思うんですよ。
だって、それを否定しちゃうと、"social change starts
with you"を否定することになっちゃうから。

自分が変わることで、チームが変わる。チームが変わる
ことで会社が変わる。会社が変わることで社会が変わる。

少なくともXPでは、信頼を保つことで生産性を高めようと
する。監視よりも信頼に価値を置く。そういう価値観を
チーム、会社、そして社会にまで広げる。

変化はいつだって小さい。だから、続けることが大切に
なる。何かを変えたいなら、変えるまで続けなきゃいけ
ない。1つ何かが変わったら、また新しい何かを変えなきゃ
いけない。

--

結局のところ、貧乏なのにモラルを保つのはむずかしい。

『清貧』という言葉を日本人は好きだけど、それは自分に
できないものに対する憧れみたいなものなんだろう。

だから『清富』を目指す。

Googleのいう"Don't be evil"っていうのは間違いじゃ
ない。清いという自信があるんなら、いくら稼いだって
構わない。

稼いだ金を溜め込むのは清いとはいえない。だから、
ジャンジャン稼いでジャンジャン使う。浪費という意味
じゃなく、社会に金を回す。

本家Permlink


Copyright © 1905 tko at jitu.org

バカが征く on Rails