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

ホーム

2010年05月30日

http://www.sics.se/~adam/ubasic/

900行ちょっとの昔のスタイルのBASICの実装。エラー
処理とかかなり手抜きなんだけど、再帰下降使ったりして、
わかりやすく書かれてる。

逆に、こういう昔のスタイルのBASICの実装を見つけるのが
難しくなってるよね。CP/MとかMS-DOSとかのBASICも残ってる
けど、環境作るのメンドいし、C言語で書かれてるのも
少ないんじゃないかな。

モダンなBASICでもモノによっては昔のスタイルをサポート
してるのもあるらしいんだけど。

自分も昔のスタイルのBASIC書いたことあるはずなんだけど、
GOSUBがどんなものだったか完全に忘れてた (笑)。

本家Permlink


2010年05月27日1

$ip = nil
$rstack = []

class NormalExitException < Exception; end

Cell = Struct.new("Cell", :link, :data)

$codeHello = proc{
  puts("hello")
  $ip = $ip.link
}

$codeNest = proc{
  $rstack.push($ip)
  $ip = $ip.data.link
}

$codeUnnest = proc{
  $ip = $rstack.pop
  $ip = $ip.link
}

$codeNormalExit = proc{
  raise NormalExitException.new
}

def makePrimitive(func)
  code = Cell.new
  param = Cell.new
  code.link = param
  code.data = param
  param.data = func
  return code
end

def primHello
  return makePrimitive($codeHello)
end

def primNormalExit
  return makePrimitive($codeNormalExit)
end

def testPrimitives
  cell1 = primHello
  cell2 = primHello
  cell1.link = cell2
  nexit = primNormalExit
  cell2.link = nexit

  $ip = cell1
  while $ip
    $ip.data.data.call
  end
end

def primNest
  return makePrimitive($codeNest)
end

def primUnnest
  return makePrimitive($codeUnnest)
end

def testColon
  nest = primNest
  prim1 = primHello
  nest.data.link = prim1
  unnest = primUnnest
  prim1.link = unnest
  prim2 = primHello
  nest.link = prim2
  nexit = primNormalExit
  prim2.link = nexit

  $ip = nest
  while $ip
    $ip.data.data.call
  end
end

begin
  testPrimitives
rescue NormalExitException => e
end
puts
begin
  testColon
rescue NormalExitException => e
end

本家Permlink


2010年05月27日

package linkedthreadcode;

import java.util.*;

class NotInstructionException extends RuntimeException {}
class NormalExitException extends RuntimeException {}

class Cell {
    protected Main vm;
    public Cell next;
    public Cell data;

    Cell(Main vm) { this.vm = vm; }
    public void call() { throw new NotInstructionException(); }
}

class Hello extends Cell {
    Hello(Main vm) { super(vm); }
    public void call() {
        System.out.println("hello");
        vm.next();
    }
}

class Nest extends Cell {
    Nest(Main vm) { super(vm); }
    public void call() { vm.nest(); }
}

class Unnest extends Cell {
    Unnest(Main vm) { super(vm); }
    public void call() { vm.unnest(); }
}

class NormalExit extends Cell {
    NormalExit(Main vm) { super(vm); }
    public void call() { vm.normalExit(); }
}

public class Main {
    private Cell ip;
    private Stack<Cell> rstack = new Stack();

    void next() {
        ip = ip.next;
    }

    void nest() {
        rstack.push(ip);
        ip = ip.data.next;
    }

    void unnest() {
        ip = rstack.pop();
        ip = ip.next;
    }

    Cell makePrimitive(Cell func) {
        Cell code = new Cell(this);
        Cell param = new Cell(this);
        code.next = param;
        code.data = param;
        param.data = func;
        return code;
    }

    Cell primHello() {
        return makePrimitive(new Hello(this));
    }

    Cell primNormalExit() {
        return makePrimitive(new NormalExit(this));
    }

    void normalExit() {
        throw new NormalExitException();
    }

    void testPrimitives() {
        Cell cell1 = primHello();
        Cell cell2 = primHello();
        cell1.next = cell2;
        Cell exit = primNormalExit();
        cell2.next = exit;

        ip = cell1;
        while (ip != null) {
            ip.data.data.call();
        }
    }

    Cell primNest() {
        return makePrimitive(new Nest(this));
    }

    Cell primUnnest() {
        return makePrimitive(new Unnest(this));
    }

    void testColon() {
        Cell nest = primNest();
        Cell prim1 = primHello();
        nest.data.next = prim1;
        Cell unnest = primUnnest();
        prim1.next = unnest;
        Cell prim2 = primHello();
        nest.next = prim2;
        Cell exit = primNormalExit();
        prim2.next = exit;

        ip = nest;
        while (ip != null) {
            ip.data.data.call();
        }
    }

    public static void main(String[] args) {
        try {
            new Main().testPrimitives();
        } catch (NormalExitException e) {}
        System.out.println();
        try {
            new Main().testColon();
        } catch (NormalExitException e) {}
    }
}

本家Permlink


2010年05月25日

前にも書いたことがあったかもしれないけど。

アンバランスなコードっていうのがあります。

たとえば、fcloseし忘れてるところがあったり、getsとか
使ってるのに、他の場所でソケット使ってるとか。

コードの全体から受ける熟練度の印象っていうのがある
じゃないですか。ある程度読めば、上手いか下手かは
わかりますよね。で、そういう熟練度の印象とかけ離れた
高度な仕組みを使ってるのを見ると、非常に違和感を覚える
わけです。それを自分はアンバランスなコードと呼ぶ
わけです。

『おいおい、お前がソケット使うのはまだ早いだろ』とか。
『おいおい、お前がスレッド使うのはまだ早いだろ』とか。

そういうアンバランスなコードは、案の定、バグってる
わけです。

で、厄介なのが、このアンバランスを解消させるのが
非常に面倒なこと。説明するのが面倒なんですよね。
ソケットとかスレッドとか説明しだすと何時間も
かかっちゃう。それこそ本読んで出直してこいっていう
話になっちゃう。

ほんとはこういう面倒なことこそ勉強会とかで勉強
しないといけないんだけど。なぜか知ってることに
なっちゃってるんだよね。大学でもそっち系でないと
滅多にやんないことだと思うんだけど。

--

高度な仕組みって、体系的に学ばないとダメで。
体系的っていうのは、コピペじゃ済まないっていうことで。
背景だったり、手順だったり、落とし穴だったり、
そういうのをたくさん詰め込まないといけない。

--

まぁ、アンバランスな自分がいっても説得力ないんですが (笑)。

本家Permlink


2010年05月24日

とちぎテストの会議

http://kokucheese.com/event/index/2504/

まだ席に余裕があります。

会議の発端は:

http://d.hatena.ne.jp/m_seki/20100512#1273654565

がわかりやすい。

会議の内容は:

http://d.hatena.ne.jp/tochigitestnokaigi/

本家Permlink


2010年05月23日

自分の願いは、たとえば:

http://www.drpaulcarter.com/pcasm/

や:

http://www.annexia.org/_file/jonesforth.s.txt
http://www.annexia.org/_file/jonesforth.f.txt

といったドキュメントを寝っ転がって読みつつ、気が
向いたらコードを書いて動かしたりたりしたいという
もの。当然、ブラウザと開発環境とを行ったり来たり
したいし、英語辞書をオンラインで引きたいし。

というわけで、Androidの板PC、早く出てくれないかなぁ。

本家Permlink


2010年05月20日

改善が最終的に結びつくのはリア充でしょう。生産性や
品質は副産物でしかない。それが『成果物は私たちです』
ということの意味だと自分は思います。

生産性や品質といったものは、必ずしも動機にはならない
でしょう。動機はやっぱりリア充になりたいというのが
一番強い。

ここから先は自分でもちょっと怪しいかなと思う話です
けど、計画というからには目標があるわけでしょう。
その目標が妥当なものとして認められているかどうかが
大切でしょう。

目標を数値として設定しにくいこともあるでしょう。
そんなときは仕方がないから評価してくれる人の『実感』
に頼るしかないですよね。実感に頼ると不正の余地が
あるから危いんですけど、他にやり様もないかなと。

--

あれ? 『成果物は私たちです』をググっても全然
引っかからないんだけど?
オリジナルは咳さんだったはず。

本家Permlink


2010年05月16日

う〜ん。あの問題はビミョーだなぁ。

今までお金が流れていなかったところにお金が流れるように
なった。でも、そうなると、今までお金が流れていたところ
にはお金が流れなくなった。新興勢力の台頭っていう見方も
あれば、価格破壊という見方もできる。

値段というか相場というか、そういうのは誰が決めるの?
っていうのもある。でも、いくら相場だっていっても、手が
出せないんじゃしょうがない、っていうかそもそも商売に
なんない。

育成の話も出てたけど。さすがにこれは中小だと背負えない
とこが多いんじゃないの? やれるとしても、今は少ない
額しか払えないけど、当たったらもっと払いますからとか、
次もお願いしますからとか。

まぁ、右を向いても左を向いても厳しいのはお互い様
なんだから、お互い思いやりをもって接しましょうよ、
としかいえないなぁ。ミョーに対立ばっか煽っても景気は
よくなんないよね。

--

なんだかんだで、やっぱりみんなお金にはビンカン
なんだよね。嫌儲なんかもそうなんだけど。

--

たとえば、投稿サイトがガイドラインを作るとか。そこで
相場を決めちゃう。ガイドラインに従う従わないは自由に
するか、それとも違反したらアカウント剥奪するか、
そうしたら、さらに違反をチェックする仕組みが必要に
なって、投稿サイトの負担が増えて、投稿サイトそのものが
成り立たなくなるかもしれない。

あるいは、もっと話を大きくすれば、ギルドを作るって
いうのもある。ギルドが相場を決める。仕事を頼むときは
必ずギルドを通してもらう。違反したらストライキでも
やる。

いずれにしても、一社の責任じゃないし、かといって
すぐ法規制っていうわけでもない。

--

でも、本来、ロングテールの話なんだよね。そういう
意味で、値段が驚くほど低いのは当たり前なんだよね。

本家Permlink


2010年05月07日

WinCVS 1.2 ごった煮版、まぁ、これを使えという感じで
渡されてるんだけど。

まぁ、自分はEmacs VCでdiffとかannotation見て、commit
とかupとかはコマンドラインでやっちゃうから気にして
なかったんだけど。

で、その渡されてるWinCVSを試しに使ってみたら、致命的な
バグがあって。編集中のファイルのdiffを、リポジトリの
最新のと比較しちゃうんだな。

たとえば、リビジョン1.1のファイルを編集しているときに
比較したいのは、ほとんどの場合、編集中のファイルと
1.1との比較なわけ。編集中のファイルと1.2とか1.3とかを
比較したいことは滅多にない。

で、WinCVSのdiffも、当然それがデフォになってると
思ってたし、そういう感じでdiffの設定ダイアログが
出るんだけど。どういうわけか、リポジトリの最新と
比較しちゃう。

これが致命的なバグだというのは、オレが勝手に三点
マージ法と呼ぶやり方が使えないから。

CVSの基本的な使い方は、cvs upして自動マージに任せる
やり方。ただ、このやり方は、毎日のように (あるいは
もっと短い間隔で) cvs upしてないと使えないやり方な
わけ。たとえば、一週間に一回のペースでupしてcommit
してる場合なんかだとコンフリクトが大量に出ちゃって
収集がつかなくなる。

で、up/commitのペースが遅いときに使うのが三点マージ。
つまり、上の例でいえば:

  1.1と編集中のファイルのdiff (1)

  編集中のファイルと1.2 (リポジトリの最新) のdiff (2)

という3つのファイルを使ったやり方。つまり、何を
編集したかを(1)のdiff (とWinMerge) で視覚化して、
その差分を確認しつつ(2)のdiff (とWinMerge) で移して
いく。

で、これでわかるように、(1)のdiffが取れないとこの
三点マージはできなくなっちゃう。だから致命的なバグと
いうわけ。

もちろん、渡されてるWinCVSでも、リビジョン指定した
diffは取れるから『致命的』っていうのは大げさかも
しれないけど、でも、ファイル1つ1つリビジョン指定する
なんてバカな話はないわけで。やっぱり致命的なバグ。

まぁ、最初に書いたけど、ぶっちゃけ、自分はWinCVS
使わないんで、どうでもいいっちゃいいんだけど。でも、
(1)のdiffにしても、WinMergeで見たほうがわかりやすいっ
ていうのはあるよね。自分、ちょっとはdiff -uの
フォーマットに慣れてるけど。でも、diff -uすら知らないで
diffの素の出力だったら、とても見る気しないし。

まぁ、WinCVS使うなっていう話もあるけど、だったら
CVS使うなっていう話もあるしね (笑)。個人的には
git LOVEだから(笑)。

あ、このバグ、WinCVS 1.3のSJIS対応バージョンでは
起きません:

http://www.ne.jp/asahi/kuribara/hiroshi/cvstop.html

TortoiseCVSっていうのも試してみたんだけど、あんまり
好きになれなかったなぁ。なんかEmacs VCが使えなく
なっちゃって。それはともかく、Explorerから操作する
のが、やっぱり違和感あったんだよね。まぁ、馴れの
問題かもしれないけど。

本家Permlink


Copyright © 1905 tko at jitu.org

バカが征く on Rails