« January 2008 | Main | March 2008 »

2008.02.25

今日の日記

・世界樹2やりてー。
パーティは決めていて、斧ソ、ブシドー、パラ、メディ、アルケ。

・(長門の)mini py
とりあえず、演習のテストファイルはパース出来るようになった。
mini pyの範囲では、
target := subscription | identifier
だけが、一つ先読みが必要だった。
参考:http://www.hanecci.com/pukiwiki/index.php?Programming%2FPython%2FReferenceManual

家に転がっていたコンパイラ構成法を、読んでみると結構分かるようになっていた。LL(1)の1の意味とか、たっくさんから聞いたShift reduceとかもちんぷんかんぷんではなくなった。

パーサーの書き方が分からない人は、The little schemerSICPHigher-order Perl東大 電気系B演習の順に勉強すればよいと思うよ。

面白いのは間違いないんだが、あまり深入りしないようにしよう。

Cプログラムの中身が分かる本 ポチのプログラミング講座

絵とか、書名とか、いろんな所でおかしすぎるだろwww。
見かけは犬だけど、中身は狼だからな。大半がx86アセンブラだからな。書名に「C言語」が入っていないからAmazonでさがすのに苦労した。この辺りも売る気があるのか無いのかよくわからない。

とりあえず一冊確保。みんなも買おう。

| | Comments (0) | TrackBack (0)

2008.02.22

今日のScheme

これはもっと評価されてよい
The Little Kefiaer 第4と3/4章

| | Comments (0) | TrackBack (0)

2008.02.20

今日のYuyarin

4年生の卒研発表を見学してきて感じたことが素晴らしすぎるのでリンクを張ってみる。

学生時代にこんな事を1秒たりとも考えたことはありませんでした。

| | Comments (2) | TrackBack (0)

2008.02.12

今日の日記

Rambus Design Seminar in Osaka
AO diaryさんから。
行こうと思ったけど、ほとんどXDRなので今回は見送り。DDR2/3なら行きたかった。


・DoxygenがVHDLをサポート
コーヒーでも飲みながら検証の話でもさんから
俺、mini py 終わったらVerilog パーサ書くんだ。(←デスマフラグ)


・(長門の)minipy
空き時間にデバッグ中。
動かないところを動くようにしていくと、気がついたら以前動いた奴が動かなくなっていた。先に、レグレッションテスト環境を作った方が良い。急がば回れ。

・Lisp Scheme Part19
http://pc11.2ch.net/test/read.cgi/tech/1200237296/

何この流れ

174 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/18(金) 12:25:47
ここにいる人たちは学生ですか?
あるいは社会人だけど趣味やスキルアップのためにSchemeを
やっているのですか?
仕事でScheme使ってる人はいるのでしょうか?

俺は仕事で使ってるよ。Common Lispだけど。

180 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/18(金) 22:00:49
>>174
本職はハードの設計だが, できあいのツールで機能が足りないときは
Lisp で書いてるな. C とか C++ で数値計算する気にならん.

184 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/19(土) 22:46:09
>>174
回路設計者(しかも、アナログ)だけど、趣味でschemeやってますよ。


185 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/19(土) 23:58:15
意外とハードウェア技術者が多いな。俺も昔、Lisp系でHDL(ハードウェア記述言語)を作ろうとか
考えたことがあるよ。

186 名前:180[sage] 投稿日:2008/01/20(日) 01:07:07
>>185 wwWwWW!おまえはなんて俺なんだ!!

190 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/20(日) 01:24:49
>>185-186
俺が多すぎ


191 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/20(日) 01:33:02
VHDLisp


俺もいるよ!

| | Comments (5) | TrackBack (0)

2008.02.08

[minipy] 演算子のオーバーロードを使ってみた

befor

# 特定のトークンを見つけるパーサ
eoi = parser.end_of_input()
nl = parser.lookfor('TOK_NEWLINE')
lk_print = parser.lookfor('TOK_KW_PRINT')
int = parser.lookfor('TOK_LITERAL_INT')
plus = parser.lookfor('TOK_PLUS')
minus = parser.lookfor('TOK_MINUS')

#a_expr ::= integer ( ( "+" | "-" ) integer)*
p_or_n = parser.alt('p_or_n', [plus, minus])
p_or_n_int = parser.cat('p_or_n_int', [p_or_n, int])
p_or_n_int_star = parser.star('p_or_n_int_star', p_or_n_int)
a_expr = parser.cat('a_expr', [int, p_or_n_int_star])

#expression ::= a_expr
expression = parser.cat('expression', [a_expr,])

#print_stmt ::= "print" expression_list_with_comma
print_stmt = parser.cat('print_stmt', [lk_print, expression])

#statement ::= print_stmt NEWLINE
statement = parser.cat('statement', [print_stmt, nl])

#file_input ::= (NEWLINE | statement)* EOF
nl_or_st = parser.alt('nl_or_st', [nl, statement])
nl_or_st_star = parser.star('nl_or_st_star', nl_or_st)
entire_input = parser.cat('file_input',[nl_or_st_star, eoi])

after

# 特定のトークンを見つけるパーサ
eoi = parser.end_of_input()
nl = parser.lookfor('TOK_NEWLINE')
lk_print = parser.lookfor('TOK_KW_PRINT')
int = parser.lookfor('TOK_LITERAL_INT')
plus = parser.lookfor('TOK_PLUS')
minus = parser.lookfor('TOK_MINUS')

#a_expr ::= integer ( ( "+" | "-" ) integer)*
a_expr = int + star((plus | minus) + int)

#expression ::= a_expr
expression = a_expr + None

#print_stmt ::= "print" expression_list_with_comma
print_stmt = lk_print + expression

#statement ::= print_stmt NEWLINE
statement = print_stmt + nl

#file_input ::= (NEWLINE | statement)* EOF
entire_input = star(nl | statement) + eoi

ちゃんと動いた!。
これなら文法を手入力しても良いかなってレベルになった。

文法の名前は自動でつけるようにして、各パーサの基底クラスに下の行加えただけ。動作確認入れても30分。LLって凄いよ。ほんと。
def __add__(self, other):
 if other == None:
  return cat([self,])
 else:
  return cat([self, other])

def __or__(self, other):
 return alt([self, other])

Higher-order-PerlとPython万歳!

| | Comments (0) | TrackBack (0)

今日の日記

・雑記帖さんへショートパス
ちょこちょこと最もタメになる「初心者用言語」はVerilog HDL!が、話題になっていてなにより。すこしはVerilogに興味を持ってくれた人が増えたと思う。リンク、はてぶ、ありがとうございます。

おおっときどきの雑記帖 i戦士篇からも、リンク・・・されていない!

> ・最もメタになる「初心者用言語」 O’Caml - suztomoの日記
> ・http://natu.txt-nifty.com/natsutan/2008/02/verilog_hdl_968b.html 最もタメになる「初心者用言語」はVerilog HDL!
> ・Hacking is believing@itoshi.tv - 最もタメになる「初心者用言語」はRです

URL付きで紹介はするけどリンクはされていないなんて。The Practice of Programmingをちゃんと読まないとリンクしてもらえないんだと思う。勉強するので、他の人と同じように扱ってください><

# 一応、ネタですので。紹介していただいてありがとうございます。

・パタヘネ Third Edition,
家でぱらぱらと読んでみた。昔と全然違うよ!プロセッサの話が減って、ソフトウェア周りが増えている。これは勉強しなくては。練習問題をVerilogとSystemCでちゃんと解くとか需要あるのかしら。

| | Comments (0) | TrackBack (0)

2008.02.07

[minipy] パーサを作ろう その2

0回以上の繰り返しは、結局ループで処理した。
print 1 + 1 がそれっぽくパース完了

YUKI.N>python parser.py
[file_input]
 [nl_or_st_star]
  [nl_or_st]
   [statement]
    [print_stmt]
     [TOK_KW_PRINT]TOK_KW_PRINT
     [expression]
      [a_expr]
       [TOK_LITERAL_INT]TOK_LITERAL_INT (1)
       [p_or_n_int_star]
        [p_or_n_int]
         [p_or_n]
          [TOK_PLUS]TOK_PLUS
         [TOK_LITERAL_INT]TOK_LITERAL_INT (1)
    [TOK_NEWLINE]TOK_NEWLINE
  [nl_or_st]
   [TOK_NEWLINE]TOK_NEWLINE
  [nl_or_st]
   [TOK_NEWLINE]TOK_NEWLINE
 [EOF]TOK_EOF
YUKI.N>

文法の定義はこれ
# 特定のトークンを見つけるパーサ
eoi = parser.end_of_input()
nl = parser.lookfor('TOK_NEWLINE')
lk_print = parser.lookfor('TOK_KW_PRINT')
int = parser.lookfor('TOK_LITERAL_INT')
plus = parser.lookfor('TOK_PLUS')
minus = parser.lookfor('TOK_MINUS')

#a_expr ::= integer ( ( "+" | "-" ) integer)*
p_or_n = parser.alt('p_or_n', [plus, minus])
p_or_n_int = parser.cat('p_or_n_int', [p_or_n, int])
p_or_n_int_star = parser.star('p_or_n_int_star', p_or_n_int)
a_expr = parser.cat('a_expr', [int, p_or_n_int_star])

#expression ::= a_expr
expression = parser.cat('expression', [a_expr,])

#print_stmt ::= "print" expression_list_with_comma
print_stmt = parser.cat('print_stmt', [lk_print, expression])

#statement ::= print_stmt NEWLINE
statement = parser.cat('statement', [print_stmt, nl])

#file_input ::= (NEWLINE | statement)* EOF
nl_or_st = parser.alt('nl_or_st', [nl, statement])
nl_or_st_star = parser.star('nl_or_st_star', nl_or_st)
entire_input = parser.cat('file_input',[nl_or_st_star, eoi])

最後のentire_inputに対して、entire_input.parse(tk)で引数のTokenizerからトークンを読み込んでパースする。

mini とはいえ、すべての構文でこれを手書きするのは気が進まないので良い方法を考えよう。BNFを読み込んでこの形式に変更し、importするのがそこそこ楽そうな気がするんだが、気になる点が2つ

・上のやり方だと基本的に前方参照で文法を解決しないいけないので、いったん全部の文法を読み込んでから、順番を変えていかないといけない。言い方を変えると、文法はentire_inputが一番最初にあるけど、ソースに落とすときには一番最後でないとダメ。
・変換をするために、BNFをパースしないといけない。何がなんだか分からなくなる可能性が高い

一瞬S式という単語が浮かんだが、気にしないことにした。

HOPを見ると、演算子のオーバーロードを利用して見やすくしろ、とのこと。

#a_expr ::= integer ( ( "+" | "-" ) integer)*
p_or_n = parser.alt('p_or_n', [plus, minus])
p_or_n_int = parser.cat('p_or_n_int', [p_or_n, int])
p_or_n_int_star = parser.star('p_or_n_int_star', p_or_n_int)
a_expr = parser.cat('a_expr', [int, p_or_n_int_star])

同じ事が、これくらいで表現できるとうれしい
a_expr = int + ( (plus | minus) + int) >> star

ちょっと、演算子のオーバーロード勉強してくる。

| | Comments (0) | TrackBack (0)

2008.02.06

カーニハン先生のありがたいお言葉

The Practice of Programming から

・Chap 5 Debuggingから2つ
プログラミング言語について
Each language feature that prevents some problem has a cost of its own. If a higher-level language makes the simple bug disappear automatically, the price is that it makes it easier to create higher-level bugs. No language prevents you from making mistakes.

こちらは励ましのお言葉
Every bug you can find teach you how to prevent a similar bug from happening again or to recognize it if it does.

・Chap4 User interfaces から
エラーメッセージの出し方について
Don't say that a parameter is too large: report the valid range of values

The Practice of Programming いいよ。

| | Comments (0) | TrackBack (1)

[minipy] 繰り返しの実装

日記を書く[・ _ゝ・]はやみずさんから

> 演習の課題提出のあと、春休みに適当に整理してCodeReposにコミットする予定。
これは期待。

なんとか、HOPの作法にのって、catとaltが出来た。
catは、今あるパーサを組み合わせて長いパーサを返す。

eoi = parser.end_of_input() # end of input (EOF) にマッチするパーサ
nl = parser.lookfor('TOK_NEWLINE') # 改行にマッチするパーサ

nl_eoi = parser.cat('nl_eoi', [nl, eoi])
とすると、改行 + EOFにマッチしたとき成功する。

nl_eoi = parser.alt('nl_eoi', [nl, eoi])
とすると、改行もしくは、EOFにマッチしたとき成功する。
基本的には、この連結(cat)と選択(alt)で再帰していけば良いはず。

次の部品が、任意の繰り返しのアスタリスクだ。
#file_input ::= (NEWLINE | statement)* EOF
#a_expr ::= "integer" ( "+" "integer" )*

上は簡単で0回以上の繰り返しの後、EOFが来れば成功だから終了条件が分かる。
下がちょっと難しい、1回でもintegerに入ってしまうと、終わりの条件をどうして良いのか分からない。

HOPの繰り返しの実装star()を見てみて納得。

nothing → トークンを消費せず、何でもマッチし、常に成功を返す。

こういうパーサをつくって、自分自身と nothingの選択にすればよさそう。で自分自身を先にパースしに行って失敗したとき(*が終了するとき)、nothingにマッチしてパースを完了する。このとき、トークンは消費されない。成功したときは、また自分自身を呼び出してパースをするから、繰り返しを実現できる。なるほど。

だんだん、Higher-order Perlが僕のバイブルになってきた。

| | Comments (0) | TrackBack (0)

2008.02.05

[minipy] パーサーを作ってみる その1

適当にHOPを参考にしながら、(長門の)minipyを始めた。

とりあえず、改行+EOFはパース出来るようになった。
改行+改行+EOFはまだこれから。

改行+EOFの場合
YUKI.N>python parser.py
[file_input]
[TOK_NEWLINE]TOK_NEWLINE
[TOK_EOF]TOK_EOF
YUKI.N>

改行+改行+EOFの場合
YUKI.N>python parser.py
parse error
[file_input]
[TOK_NEWLINE]TOK_NEWLINE
[TOK_EOF]TOK_NEWLINE
error Token:TOK_NEWLINE, line = 2

パースしていったら、順に構文ツリーを作るようにした。最後にエラーの場合はエラー箇所の表示までできた。プログラミングは楽しい。

Python(というかLL)の凄いところは、適当にかけること。Cだったらツリー構造一つとっても結構悩む。構文ツリーはbranchが2個じゃないので、malloc使うか、文法から最大数を抑え行くか、そこを決めないと先に進まない。

実際に手を動かしてパースをして気がついた事。
再帰下降形のパーサってのは、パースに失敗した時点で、パース全体が失敗したのかどうかが分からないこと。パース全体が失敗したか成功したかを返すのは簡単だけど、どのトークンで失敗になったかを返すのはパースの戻り値だけでは分からない。

だから、パース失敗のエラーメッセージを出すためには、順番に失敗を返して行って全体が失敗だったら、再帰のトレースをしないと行けない。これは面白い。

最初はHOPのサンプルそのままに、成功/失敗だけを返すように書いてういた。上に書いた事にに気がついてからは、パースに失敗したらその場所(トークン)にフラグをつけて、失敗した状態の構文ツリーを返すようにした。全体が失敗したなら、そのツリーを下っていってフラグの付いているトークンを元にエラー表示をさせればどこでgive upしたかがわかる。

こういう変更がPythonだったらすぐに出来るのがうれしい。Cだったら今まで0、1を返していた関数を、構文ツリーの構造体を返す仕様に変更したら結構手間だ。ポインターを返すにしても、引数のポインターに入れるにしても、だれが領域を確保するのかを考えないといけない。ツリーを再帰的に下っていくのもこんな簡単にかけて感激。

def dump_tree(self, depth=0):
 print self.string_for_dump(depth)
 for br in self.branches:
  br.dump_tree(depth + 1)

次は、A | Bの部分を作ろう。それができると、複数の改行+EOFがパース出来るはず。

次の目標はこれだ!
#file_input ::=
# (NEWLINE | statement)* EOF

Pythonいいよ。Python。
minipyいいよ。minipy。

| | Comments (0) | TrackBack (0)

2008.02.04

最もタメになる「初心者用言語」はVerilog HDL!

# VHDLに置き換えてもほぼ同じ

・Verilogでコンピュータの基礎を身につける
コンピュータがどのように動くのか。CPUやメモリのスペックに出てくる○○MHzの意味が本当にわかるのはVerilogだけ。キャッシュ、パイプライン、スーパースカラーのようななじみの深いテクノロジーだけでなく、VLIW、SIMDといった尖ったテクノロジーまで全部OK。

・意外に身近
プロセッサ、チップセットだけでなく、携帯、テレビ、ゲーム機まで、身の回りの物はほとんどVerilogで動いています。見えないところでは、各種検査装置、電力制御、エレベータの制御など、ありとあらゆる所でVerilogで記述された回路が動いています。

・アナログ回路も記述できる
Verilog-AMSを使うことで、0、1のデジタルな世界から飛び出し、アナログ回路の動きも記述できます。ものづくりの力が衰えてきたと言われる昨今、もういちど電気回路の基礎であるアナログ回路を見直してみてはどうでしょうか。

・オブジェクト指向
SystemVerilogは普通にオブジェクト指向です。C++よりも簡単で、Javaに近い感覚で簡単にオブジェクト指向のプログラミングが学べます。

・標準化
Verilogは、IEEE 1364-1995、IEEE 1364-2001で標準化されています。標準化されている言語は、C/C++、Common Lispだけじゃない。

> 正式な言語仕様の無い、実装=仕様みたいな言語と混同するのは勘弁して欲しいです
practical-schemeから


・C言語との連携
VPIとして普通に標準化されています。処理系毎に呼び出し方が違うのは初心者向きじゃないですよね。

・真の並列化言語
マルチスレッドのような擬似的な並列化ではなく、完全な並列化された動作が記述可能です。並列化の粒度にかんしては、他の言語の追随を許しません。

・自由がある
Verilogは何でも自由です。レジスタの大きさを100bitにしたければ、reg [99:0] r;で宣言しましょう。足すも引くも反転も何もかも自由に出来ます。CPUの命令セットに縛られている言語では出来ることも限られます。Verilogだけが、真の自由なプログラミングを可能にしています。

| | Comments (5) | TrackBack (0)

2008.02.03

QuartusIIで最適化によるレジスタの削除を抑止 その2

FPGAの部屋 DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)のコメント欄にお返事。

XSTなり、QuartusIIのオプションで制御すると全体にオプションが適用されてしまいます。marsee さんの言われるとおり、それは設計者の意図するところでは無かったりします。回路全体のFANOUTを1に設定するのは全く意味が無いのですが、レジスタを保存するならそれほど全体に影響しないという違いもあります。あらためて考えると面白い。

XSTでFANOUTの数を自力で制御するなら(* equivalent_register_removal = "no" *) でも行けますね。こちらこそ勉強になりました。ありがとうございます。

で、それアルテラでできるよ、という話。

reg [7:0] r ;
reg [7:0] outp /* synthesis preserve = 1 */;

always @ (posedge clk)begin
  r <= {inp, inp, inp, inp, inp, inp, inp, inp};
  outp <= r;
end

このように、/* synthesis preserve = 1 */をつけることで、レジスタを最適化から守ることができます。この状態で、Remove Duplicate RegistersをONにすると、rは最適化され1つになりますが、outpは最適化が抑止されます。

大成功

| | Comments (2) | TrackBack (0)

2008.02.02

QuartusIIで最適化によるレジスタの削除を抑止

元ネタはFPGAの部屋さんから

この手の最適化が一番困るのが、やはりメモリのI/O周りです。128bitのイネーブルを1つのFFでやろうとすると、すぐに同じ問題にぶちあたります。

Xilinxの場合は、コメントの通りEquivalent Register RemovalのチェックをはずすでOK。
当然Alteraでも当然同じ事はできるわけで。昔のQuartusはそんなのわかんねーよって所に設定があったのですが、今はそれなりに分かりやすいところで設定できます。

これくらいの簡単なVerilogで試してみます。

module er(inp, outp, clk);

input inp;
output [7:0] outp;
input clk;

reg [7:0] r;
reg [7:0] outp;

always @ (posedge clk)begin
  r <= {inp, inp, inp, inp, inp, inp, inp, inp};
  outp <= r;
end

endmodule

まず普通に合成してみると、このようなメッセージが出て等価なレジスタは削除された事がわかります。

Info: Duplicate registers merged to single register
Info: Duplicate register "r[7]" merged to single register "r[0]"
Info: Duplicate register "r[6]" merged to single register "r[0]"
Info: Duplicate register "r[5]" merged to single register "r[0]"
Info: Duplicate register "r[4]" merged to single register "r[0]"
Info: Duplicate register "r[3]" merged to single register "r[0]"
Info: Duplicate register "r[2]" merged to single register "r[0]"
Info: Duplicate register "r[1]" merged to single register "r[0]"
Info: Duplicate register "outp[7]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[6]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[5]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[4]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[3]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[2]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[1]~reg0" merged to single register "outp[0]~reg0"

Technology map Viewerで見ると、間違いなく最適化により8bitのレジスタが1つにまとめられています。

次に、設定を変えて最適化を抑止してみましょう。Quartusの設定で、Assignment→Setting→Analysis & Synthesis Setting とすすみ、More Settingでこの画面に行きます。

ここで、Remove Duplicate RegistersがデフォルトでONになっているはずですので、ここをOFFにします。
もう一度論理合成をかけると、さっきのメッセージは出なくなります。

Technology map Viewerで見ると、宣言した数だけFFが使われています。

めでたし、めでたし。

ちなみにQuartusのVersionは 7.1 Web Editionです。

| | Comments (1) | TrackBack (0)

Youtubeでサポートを受けた

いろいろあって、基板にアジレントのプローブをつけることになった。
これが難しいってレベルじゃない。長門派の僕でも「うん、それ無理♪」と言いたくなるくらいの難易度。

アジレントの人に泣きを入れたところ、これを参考にしてくださいと書かれたメールにはなんと、Youtubeのアドレスが一つ。

Agilent N5425A/N5426A Soldering Guide

すげー!
後で確認したところ、作業をしているのはアジレント本国のエンジニアだそうです。Youtubeってこういう使い方もあるんだと感心した。

これを見せられても無理な物は無理でしたけどね。

| | Comments (9) | TrackBack (0)

ISEのプロジェクトにxcoファイルを追加する

coregenで作成済みのxcoファイルが、プロジェクトに上手く足せない事がある。

プロジェクトから、右クリックNew Sourceだと普通にプロジェクトに電球のアイコンの.xcoが追加される。これは問題ない。昔のプロジェクトをコピーした時、同名の.vがプロジェクトに追加されていて、ダブルクリックしても、ソースが表示されるだけでCoregenで修正できない。

まずプロジェクトから右クリック→Add Sourceを使って、xcoファイルを追加しようとするとこのエラー

Core Generator cores can not be added using Add Source ... use Add Copy of Source ... instead.

言われるがままに、Add Copy of Sourceをするとこのエラー
Source file all ready in project directory. It wasn't necessary to copy the file.
Core Generator cores can not be added using Add Source ... use Add Copy of Source ... instead.

こんな時は、

(1)対象となる.xcoファイルをいったん別のフォルダーに移動
(2)Add Copy of Sourceで移動先のxcoファイルを追加

でプロジェクトに、xcoファイルが追加できる。あとはダブルクリックで、Coregenが立ち上がるはず。

ちなみにISEのバージョンは9.1.03i
そのうちバージョンアップで直りそう。典型的BK

| | Comments (0) | TrackBack (0)

Lispの歌

渚の『・・・・・』だろ、JK

♪(S式が)きれいね
夕日の絵の具に塗り替えられた 油絵みたいな波打ち際に (PGも油絵って言ってた)
足跡がてんててんててん (← 可変長引数)

なーぎさーのかーぎかっこ
(マクロが)ぱっとひらいたら、アッーと驚いて
なーぎさーのかーぎかっこ
(マクロが)ぱっとひらいたら、顔が近づいた
やってくれました、やってくれました、たったいま (← マクロが今評価された!)

かっこ、かっこ、かっこ、かっことじとじ

| | Comments (0) | TrackBack (0)

2008.02.01

今日の日記

・ときどきの雑記帖 i戦士篇から
隗よりはじめよ
以前、ひげぽんさんに「まずは隗から」と薦めた事があるのですが、書いてから自分以外の人に言うのは失礼だったなとしこたま反省していたことを思い出した。

だふのわるだくみ (Duff's Device)
こんなの始めて見た!
switch文ってのは実はgotoなので動きそうなのは分かりますが、なんというか凄いな。ここまでするんだったら、インラインアセンブラでも(ry

エキスパートCプログラミング良いよ。

・Python
改行'\n'がLFなのか。
mini pyで、改行コードがCRCFだったので、改行+EOFという簡単なファイルすらパース出来なかった。CRもスペースと同じ扱いにしたら、CRLFも処理できた。CRのみだったら駄目だけど、今は気にしないで行こう。

・業界への転職
twitterから
人気の職業「プログラマ」
薬剤師の免許持っているエンジニアにはまだ会ったことがない。
薬剤師しながらアマプログラマってのも良いと思うんだけどな・・・・、逆は出来ないから。

とにかく応援中。


・Verilogの質問
OKWaveに結構Verilogの質問があって驚く。
http://okwave.jp/search.php3?search_type=word&kw=Verilog&x=65&y=30

・PHP
対岸の火事なので、どんどんやれ~と思ってみている。
これがマシン語だったら黙ってないからな。ふるぼっこにしてやるよ。

僕的まとめ
言語に駄目出しするのと、言語を使っているユーザー(層)に駄目出しするのは違う。

・FF4(NDS)
戦闘がかったるい。移動がかったるい。
FF3もそうだったけど、ダンジョンの見せ方上手いね。

・泥棒が増えだした
http://meganeinu.myminicity.com/sec

| | Comments (0) | TrackBack (0)

« January 2008 | Main | March 2008 »