ときどきの雑記帖 i戦士篇

最新ページへのリンク
目次ページへのリンク

一つ前へ 2008年5月(下旬)
一つ後へ 2008年6月(中旬)

ホームへ

2008年06月10日

■_

ruby trunk の daily build でこける。

        cl -nologo -MD -Zi  -O2b2xg- -G6 -DRUBY_EXPORT -I. -I.ext/include/i386-m
swin32_71 -I./../include -I./.. -I./../missing     -Fodmyencoding.obj -c -Tc./../dmyencoding.c dmyencoding.c
e:\ruby-src\ruby-trunk-20080610\encoding.c(536) : error C2059: 構文エラー : '{'
e:\ruby-src\ruby-trunk-20080610\encoding.c(536) : error C2065: 'rb_intern_id_cache' : 定義されていない識別子です。

その dmyencoding.c は↓なものなので、まあtrunkにありがちな状態だからということで おとなしく次の修正を待つことにする。

#define NO_LOCALE_CHARMAP 1
#include "encoding.c"

某限定版を最後の最後で確保。 直前まで知らなかったなんてアンテナ低すぎ ○| ̄|_

■_

Cygwin使っている人いますか? その18

606 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 19:57:28  ID: Be:
    ちょっとスレ違いかもしれませんが、UnxUtil 使いの方はいませんか?
    http://unxutils.sourceforge.net/

    grep の挙動が変なので、うちだけの現象なのか切り分けがしたいのです。
    パッケージのバージョン (2007-03-01 06:22)
    パッケージの MD5 59567db7fc650e1e778f91702ed109c6
    grep のバージョン grep (GNU grep) 2.4.2
    OS: Windows2000 SP4

    症状 1
    grep '[a-z]' hoge でマッチすると、小文字の a-zと、大文字の A~Y がある行にマッチしてしまう。
    grep '[a-b]' hoge でマッチすると、大文字の a-bと、大文字の A がある行にマッチしてしまう。
    もちろん -i (case を無視するオプション)は指定していません。

    症状 2
    grep aaaa と、ファイル名を指定せずにコンソールからの入力をしようとすると
    grep: (standard imput): Not enough space
    と表示され実行が中断されてしまう。

    もし、UnxUtils 使いの方がいらっしゃったなら、よろしくお願いします。 

607 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 20:23:21  ID: Be:
    >>606
    すまんがわからん。
    UnxUtilは簡単に導入できるんだけど、文字コードの問題があるような気がするので、バカな自分には使えなかったわ。

    もっと高機能なyagrepとかに差し替えとかじゃダメ?

    ふと思ったんだけど、症状1は似たような問題があったな・・・ 

608 606 [sage] Date:2008/06/09(月) 21:40:07  ID: Be:
    >>607
    レスありがとうございます。
    扱っているのがアスキーだけなので文字コードの問題はないのですが、
    おなじみの改行コードの問題はたまに出てます。
    yagrep 入れました。 いい感じですね。

    残念ながらUnxUtilsはもうメンテされてないみたいだなあ。 

612 606 [sage] Date:2008/06/10(火) 21:54:33  ID: Be:
    UnxUpdates.zip なるものを入れたら、正常に動きました!
    公式ではリンク切れになっていたので↓を手掛りに探してみました。
    http://en.wikipedia.org/wiki/UnxUtils

    見つかったのがここ。
    ウィルスチェックはしてないので、もし気にする人は忘れないでください。(笑)
    http://www.filewatcher.com/m/UnxUpdates.zip.878847.0.0.html

    サイズ: 878847 bytes
    MD5: 9b44ede7449f991439b32bbdd844df7b

    yagrep は小さなファイルにはいいけど、13万行ぐらいのデータを食わせると、
    しばらく黙りこんでしまいました。 うちのPCが貧弱なのも一つの原因ですが… 

んー、正規表現エンジンを鬼車にしただけで基本的なロジックはいじってないんだが(笑) エンジンそのものの性能がそんなに違うとも思えないし、さてなんだろう。 >しばらく黙り込む

grepだんからマッチする行があればその行ごとにちょろちょろ出力しそうなもんだし。

シェルスクリプト総合 その11 

265 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 01:04:38  ID: Be:
    ふともも画像が100~400x810pxくらいのサイズであったとします。
    横幅が1440pxを超えないように画像を結合するスクリプトを書きたいのです。
    結合する画像の組み合わせは特別に指定しません。
    横幅が1440以下でかつなるべく大きければ何でもいいです。

    たとえば、画像は40枚とします。
    1.jpg 300x810
    2.jpg 300x810
    3.jpg 300x810
    4.jpg 300x810
    5.jpg 300x810
    6.jpg 300x810
    **************
    40.jpg 200x810

    だとしたら、1,2,3,4 を結合させて image1.jpg (1200x810px)を作ります。
    それ以降も同様なことを繰り返します。

    お願いします。 

266 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 01:23:06  ID: Be:
    ふともも画像について詳しく 

267 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 01:51:05  ID: Be:
    うん、画像のふとももが実際どうなのかによって対処法も違うよね。 

268 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 05:26:55  ID: Be:
    おまいら少しは協力してやれよw

    で、画像の件なんだがね。。。

269 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 10:51:46  ID: Be:
    画像のサンプルがないことにはどうにもならん。 

270 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 11:56:21  ID: Be:
    >>265
    いわゆるナップサック問題なので、最適解を求めるのはシェルスクリプトには荷が重い。 

271 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 12:23:52  ID: Be:
    >>270
    最適解じゃなくていいから、指定サイズ以下に並べられる
    シェルを書いてうpしてください。 

272 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 13:08:20  ID: Be:
    最適じゃなくていいなら
    頭から順にならべて1440を越えたら次に行けばいいだけじゃん。 

276 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 22:41:50  ID: Be:
    X軸方向に複数画像並べるだけで、Y軸方向には画像は並べない(1枚だけ)という仕様なの? 

277 265 [sage] Date:2008/06/09(月) 22:49:54  ID: Be:
    >>276
    そうです。 

278 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 22:56:48  ID: Be:
    条件後出し乙。
    だったら質問するまでもない簡単な問題じゃん。
    アフォらしいから回答するの辞めた。 

279 名無しさん@お腹いっぱい。 [sage] Date:2008/06/09(月) 23:14:13  ID: Be:
    便乗質問します。
    X座標のドット数も、Y座標のドット数も可変の画像ファイルが複数あります。
    これを、引数指定のX/Y座標の画面サイズに収まるように、
    なるべく多く、なるべくすき間なく画像を並べるようなシェルを発光してください。

    なお、実際の画像結合処理は別コマンドにやらせるので、
    入力としては、各画像ファイルのファイル名とX/Yサイズが書かれたテキストファイルの

    $ cat input.txt
    1.jpg 300 200
    2.jpg 530 250
    3.jpg 410 180
    4.jpg 640 480

    を入力として、

    $ hoge input.txt 1200 1280
    とやると、
    出力として、

    1.jpg 0 0
    2.jpg 300 0
    3.jpg 0 300
    :

    みたいに、画像を配置するべき座標を画像の左上のオフセットで指定して
    出力できればいいです。

    最適配置にする必要はありませんが、当たり判定はちゃんとやって、
    画像が重ならないようにしてください。 

280 名無しさん@お腹いっぱい。 [sage] Date:2008/06/10(火) 00:02:57  ID: Be:
    いつからここは
    エロ画像処理スレッドになったんでしょうか。 

281 名無しさん@お腹いっぱい。 [sage] Date:2008/06/10(火) 00:04:47  ID: Be:
      しかも画像も貼らずに質問とは。 

281に吹いたw。

ダメだ

気力がもう失せた。

2008年06月09日

■_

もうすぐボーナスがでるが、今回はあんまり期待できそうもない喃。

どう組めばいいかはわかっている。 でも手を動かしたくない。 小人さんが勝手に組んでくれればいいのに(それは自己否定というものです)。

Linux User のまつもとさんの連載。 セキュリティ云々の話で、Cの危険なライブラリ関数として getsをはじめとして いくつか挙げていて、その中に strcpy と strcat も。 これらを危険でないというつもりはさらさらないけど、代替で使う関数として strncpy と strncat を紹介するのは正直どうかと。 って前にもこのネタ書いたなあ。@ITだかの記事だっけか。 C99までの範囲の標準関数でまず問題ないだろうと思われる代替関数がないのは まあその通りなんで strncpy と strncat が出てきたんでしょうけど…うーーん。

参考: 2005-11-29 - 日々の報告書 strncpy() and strncat()

strlcpy and strlcat - consistent, safe, string copy and concatenation.

There are several problems encountered when strncpy() and strncat() are used as safe 
versions of strcpy() and strcat(). Both functions deal with NUL-termination and the 
length parameter in different and non-intuitive ways that confuse even experienced 
programmers. They also provide no easy way to detect when truncation occurs. Finally, 
strncpy() zero-fills the remainder of the destination string, incurring a performance 
penalty. Of all these issues, the confusion caused by the length parameters and the 
related issue of NUL-termination are most important.

■_ なんじゃこりゃあっ!?

1.9.0-0, 1.9.0-1, trunk, 1.8.6 と入っていてカオスな環境とはいえ、 なんだこれ。

>gem install revactor
Bulk updating Gem source index for: http://gems.rubyforge.org
C:/ruby-1.9.0-1/lib/ruby/1.9.0-1/rubygems/package.rb:503: [BUG] Segmentation fault
ruby 1.9.0 (2008-03-01 revision 15664) [i386-mswin32_71]

-- control frame ----------
c:0033 p:---- s:0146 b:0146 l:000145 d:000145 CFUNC  :initialize
c:0032 p:---- s:0144 b:0144 l:000143 d:000143 CFUNC  :new
c:0031 p:0211 s:0140 b:0140 l:000ce0 d:000139 BLOCK  C:/ruby-1.9.0-1/lib/ruby/1.9.0/rubygems/package.rb:503

(ry

c:0004 p:0077 s:0015 b:0015 l:000014 d:000014 METHOD C:/ruby-1.9.0-1/lib/ruby/1.9.0/rubygems/gem_runner.rb:39
c:0003 p:0182 s:0008 b:0008 l:000007 d:000007 TOP    C:/ruby-1.9.0-1/bin/gem.bat:30
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH :inherited
c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP    <dummy toplevel>:257
---------------------------
DGB> : "C:/ruby/lib/ruby/1.9.0/rubygems/package.rb:503:in `new'"
DGB> : "C:/ruby/lib/ruby/1.9.0/rubygems/package.rb:503:in `block in initialize'"

(ry

DGB> : "C:/ruby/lib/ruby/1.9.0/rubygems/command.rb:136:in `invoke'"
DGB> : "CE:/ruby/lib/ruby/1.9.0/rubygems/command_manager.rb:104:in `process_args'"
DGB> : "C:/ruby/lib/ruby/1.9.0/rubygems/command_manager.rb:74:in `run'"
DGB> : "C:/ruby/lib/ruby/1.9.0/rubygems/gem_runner.rb:39:in `run'"
DGB> : "C:/ruby/bin/gem.bat:30:in `<main>'"

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

>gem-trunk install revactor
Bulk updating Gem source index for: http://gems.rubyforge.org/
C:/ruby-trunk/lib/ruby/1.9.0/rubygems/package/tar_input.rb:50: [BUG] Segmentation fault
ruby 1.9.0 (2008-06-09 revision 0) [i386-mswin32_71]

-- stack frame ------------
0000 (008E0020): 00000004
0001 (008E0024): 00000001

(ry

0154 (008E0288): 00000001
0155 (008E028C): 00000004
0156 (008E0290): 00000001 <- lfp <- dfp
-- control frame ----------
c:td p:---- s:td b:0157 l:td d:td CFUNC  :initialize
c:td p:---- s:td b:0155 l:td d:td CFUNC  :new
c:td p:0209 s:td b:0151 l:td d:td BLOCK  C:/ruby-trunk/lib/ruby/1.9.0/rubygems/package/tar_input.rb:50

(ry

c:td p:0009 s:td b:0021 l:td d:td METHOD C:/ruby-trunk/lib/ruby/1.9.0/rubygems/command_manager.rb:74
c:td p:0077 s:td b:0016 l:td d:td METHOD C:/ruby-trunk/lib/ruby/1.9.0/rubygems/gem_runner.rb:39
c:td p:0189 s:td b:0009 l:td d:td TOP    C:/ruby-trunk/bin/gem-trunk.bat:32
c:td p:---- s:td b:0004 l:td d:td FINISH :private_class_method
c:td p:0000 s:td b:0002 l:td d:td TOP    <dummy toplevel>:257
---------------------------
DBG> : "C:/ruby-trunk/lib/ruby/1.9.0/rubygems/package/tar_input.rb:50:in `initialize'"
DBG> : "C:/ruby-trunk/lib/ruby/1.9.0/rubygems/package/tar_input.rb:50:in `new'"
DBG> : "C:/ruby-trunk/lib/ruby/1.9.0/rubygems/package/tar_input.rb:50:in `blockin initialize'"

(ry

DBG> : "C:/ruby-trunk/lib/ruby/1.9.0/rubygems/command.rb:136:in `invoke'"
DBG> : "C:/ruby-trunk/lib/ruby/1.9.0/rubygems/command_manager.rb:104:in `process_args'"
DBG> : "C:/ruby-trunk/lib/ruby/1.9.0/rubygems/command_manager.rb:74:in `run'"
DBG> : "C:/ruby-trunk/lib/ruby/1.9.0/rubygems/gem_runner.rb:39:in `run'"
DBG> : "C:/ruby-trunk/bin/gem-trunk.bat:32:in `<main>'"

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

どうもPATHの設定状況やらなんやらもごちゃごちゃになっていたのが悪さの原因の模様。 んーどのようにするのがいいか喃。

■_ uniq

LaTeXのソースからすべての \command を抽出するスクリプト - rubyco(るびこ)の日記

LaTeXのソースからすべての \command を抽出するスクリプト - rubyco(るびこ)の日記


# find_tex_commands.rb
require 'pathname'

commands = Array.new
Pathname.glob("*.tex").each do |file|
  open(file, "r") do |f|
    f.each_line do |line|
      line.scan(/\\[a-zA-Z]+/).each do |c|
        next if commands.include?(c)
        commands << c
      end
    end
  end
end
print commands.sort.join("\n")
# find_tex_commands.rb
require 'pathname'
require 'set'

commands = Set.new
Pathname.glob("*.tex").each do |file|
  open(file, "r") do |f|
    f.each_line do |line|
      line.scan(/\\[a-zA-Z]+/).each do |c|
        # next if commands.include?(c)
        commands <&tl; c
      end
    end
  end
end
print commands.sort.join("\n")

とりあえず集めておいて、あとから uniq するなんてのは古い世代のやり方なんだろうなあ。 と思ったり。

■_

二回目以降はruby-coreにも開催のアナウンス流れてなかったですよね? ログを公開してくれているようなので自分としてはそれで十分ではあるんですが。 http://ruby-design.pbwiki.com/f/ruby-core-20080604.txt

[2008/06/04 19:02:28] <headius> lots of items tonight
[2008/06/04 19:02:44] <drbrain> my RubyGems item is more of a note
[2008/06/04 19:02:49] <evan> yeah, we'll try and keep things moving
[2008/06/04 19:03:03] <drbrain> so I put it there, doesn't need discussion IMO
[2008/06/04 19:03:14] <evan> ok
[2008/06/04 19:03:50] <matz_> hi
[2008/06/04 19:03:54] <matz_> here I am
[2008/06/04 19:03:58] <evan> hello
[2008/06/04 19:03:59] <brixen> hi matz_
[2008/06/04 19:04:01] <evan> shall we begin?
[2008/06/04 19:04:04] <n0kada> hello
[2008/06/04 19:04:07] <headius> I'm ready
[2008/06/04 19:04:07] <matz_> hi
[2008/06/04 19:04:22] <matz_> evan, could you please start?
[2008/06/04 19:04:28] <evan> sure.

(ry

[2008/06/04 20:42:50] <evan> I get in on the 19th
[2008/06/04 20:42:58] <headius> tom and I get in on the 19th also
[2008/06/04 20:43:07] <ko1_> good
[2008/06/04 20:43:16] <evan> ok, thats all.
[2008/06/04 20:43:19] <evan> thanks everyone!
[2008/06/04 20:43:25] <matz_> thank you guys
[2008/06/04 20:43:34] <brixen> thanks everyone
[2008/06/04 20:43:37] <n0kada> thanks

今回の内容は結構興味深い(上にあるのではばっさり切ってますがw)。 Perl6だとマッチオブジェクト(と呼んでいいのか? の抱えているハッシュに 突っ込んでますよね。たしか。

ふとこんなことをしてみたくなってやってみました。

>getc | grep -o "<[^>]*>" | sortf | uniq -c | sortf -nr
    216 <evan>
    171 <headius>
     68 <brixen>
     62 <matz_>
     55 <ko1_>
     48 <akr_m>
     31 <MenTaLguY>
     17 <drbrain>
     14 <akr_>
     12 <nicksieger>
      7 <TheProkrammer>
      6 <lrz>
      3 <blah>
      2 <n0kada>
      2 <...>
      1 <minor>
      1 <major>
      1 <name>
      1 <foo>
      1 <shugo>

ふむ。にしても、evanを ebanと空目してしまうなあw

■_

melancholic afternoon
6月6日

・期待はずれ

やや強気で言うなら, どんな手段であろうと速くなるなら(ことライブラリにおいては)正義だと
思うが(アルゴリズムの改良で10%速くなるより実装技術で2倍速くなる方がいい), もとのアセン
ブリ言語が酷すぎる. K6の頃に既に「86時代の過去の遺物だ, 使うな」と言われていたloopnzな
ど使ったものと比較するなんて. Lists of instruction latencies throughputs and 
micro-operation breakdowns for Intel and AMD CPU'sとか見た方がいい. 最初見たときは, ど
こぞの古い記事みたく発掘されたものかと思った.
melancholic afternoon

6月7日

昨日は降車駅を寝過ごしてしまった. かなりのお疲れモードだった模様. といいつつやってしまった
(fast strlen and memchr by SSE2)
ベンチとるまでまさかgccのstrlen()が遅いとは思わなかった. やってみるもんやね.

少しコードの説明. SIMDにはbyte単位ごとに(x ? 0xFF : 0)を実行することができるので16, 
32byteごとにそれを実行し, ターゲットのbyte(strlenなら0)を見つける戦略をとる. その後
_mm_movemask_epi8を用いてbyte単位ごとにその最上位ビットを通常のレジスタaに集約する. 最
後にbsf命令を使いaを下位から眺めて初めて0になった場所を見つければ完了. これは常套手段.

(参考)
・Range Coder の展開速度を SSE で高速化
・SEA & FSIJ 合同フォーラムでの発表資料

あ、すみません。言葉足らずでした。 アセンブリ言語への書き換えによる高速化を100%否定するつもりはありません。 loopnz もそうなんですが、書き換えるなら書き換えるで リンク先にある fast strlen and memchr by SSE2 (mitsunari@cybozu labs) 位はやってくれてもいいんじゃないかということです。 といっても、SSE2がこういうことに使えるとは思いつきませんでした ○| ̄|_

あと自分が念頭においていたのはlibcとかのレベルで使われるようなライブラリで使う ルーチンではなくて、独立して配布するライブラリ(鬼車とかpcreとか)でした。 とはいえたしか mpfr だったか gmp あたりだと、ビルドするときに アセンブリ言語で記述することによる最適化をしている関数群をCPUごと (といってもX86の中のバリエーションなんですが) に分類してライブラリを構築しているみたいですが。

それは至言です

某日記(前期)
世の中の「動いているプログラム」には二通りある。「正しく書かれたプログラム」と「間違
っているのに動いているプログラム」だ。

「何で動いてるんだこれで」と言いたくなるのがままありますねえ。 って自分でもたまにやらかしてたり。

某日記(前期)

.たとえば、ちょっと前に話題になった C 言語入門における「初期化してないポインタの参照」
なんてのが後者にあたる。

.間違っているということを納得させるのはあまり簡単ではない。たとえば、上記のプログラム
が VC++ では常に動くのに Borland C++ だと常に動かないなんてことになると、文句が 
Borland に飛んだりすることがある。曰く、「VC++ と違うなんてダメじゃないか」。

.X はこの手の「間違ってるのに動くプログラム」の宝庫で、なかなか困る。最近のメジャーど
ころだと Qt の御行儀が悪くてねえ。

ふうむ。XやらQtやらは未知の世界(Xは入り口程度ならわかりますが)。 そういえばどこぞの掲示板で、VB6が浮動小数点演算をx86の浮動小数点演算ユニットの 80bitの精度で計算しているのに対して、.NETなVBは64bit精度で計算するので 微妙なところで差異がでてしまい、お客さんに説明するのに困っているとか 何とか最近見たような。

H?

この会社辞めようと思ったソースコード#20 

566 仕様書無しさん [sage] Date:2008/06/06(金) 00:08:11  ID: Be:
    コーディング規則、用語集がない現場はダメだな。
    大卒で、かつソフ開もってるヤツ同士でも
    これらがないとコミニュケーションに苦労する。

    あとはVB経験者にいきなりJAVAをやらせるような会社な。
    そもそもWindows(.NET)とJavaVMってプラットフォームが違う時点で別世界。

    六本木や青山にあるようなシャレたパン屋のオープニングスタッフを
    普段はナン焼いてるインド人に任せるようなもんだ。
    しかし、何故かこの世界ではこんな馬鹿がまかり通っている。

    これは実装技術に限った事じゃない。
    コボル出身者がJavaのプロマネやって見積もりが狂い
    金融のコンサル営業なんてできない青二才がコンサルやってる。
    そもそもバックボーンにしてる知識が違うだろ。アホすぎる。 

567 仕様書無しさん [sage] Date:2008/06/06(金) 00:32:18  ID: Be:
    コード規約はなるべく少なめがいいな。
    まともな人間が書く分には、多少のスタイルの違いは読むのにほとんど支障はないだろ。
    言語が違う訳じゃないんだし。 

570 仕様書無しさん [sage] Date:2008/06/06(金) 00:59:36  ID: Be:
    しっかりしたコーディング規則があるプロジェクトに入って、
    これは美しいコードを書けそうだと期待していた。

    ・規則にある開発支援ツールが実は永遠にベータ版。
    ツール開発チームがとてつもなく無能な上こちらの声は一切届かないので仕様を満たすことは永遠に
    なさそう。

    ・別な支援ツールがうんともすんとも言わないので聞いたら「既知の不具合。それよりお前のところ
     工程遅れてるぞ」
    お前のゴミのせいで開発が1週間ストップしたわけだが。

    ・規約ではグローバル変数は極力使わず、必要なら全チームに通知しろとあったが
    「パフォーマンスを上げるため全クラス全変数グローバルで静的にしろ」
    規約に従って表にまとめて送ったら「早く通知しろ。メール?見てない。社内メーリングリストでまわせ」
    俺社外で開発してるしメーリングリストなんて初耳。

    ・メソッドは最大何ステップまでと規約があったが、
    「それは無視して、仕様書の1項目を1関数にしろ」
    おかげで1メソッドが10万ステップオーバー。書いた俺にも何がどう動作するのか全くわからん。
    まともにコーディングすればステップ数100分の1保守性10000倍にはなると思う。

    ・あるときいきなりクラス名が大文字になる。定数が小文字。通達なし。質問に回答なし。

    ・他チームが作るはずだったところがごっそり抜けているので聞くと
    「うちでは使わないクラスなので開発しない。そちらで開発しろ」
    規約上、他チームの資料は受け渡しできない。

    H社は地獄だぜフゥーハハー 

571 仕様書無しさん [sage] Date:2008/06/06(金) 01:08:57  ID: Be:
    1関数10万行・・・すげえ。

    でも1000行で書けるなら、まずそれを書いて
    インライン展開のようなことをするのはどうだろう?
    無責任な思いつきだけど、もしかしたら少しは楽になるかもよ。 

575 仕様書無しさん [sage] Date:2008/06/06(金) 10:05:13  ID: Be:
    配列のポインタを渡すのに、
    func( &a[ 0 ] );
    戻り値がある関数を呼んだときに戻り値を使わない場合は、
    ( void )func();
    enumで列挙した定数の論理和を引数に取る関数を
    enum HOGE {
    A = 0x01,
    B = 0x02,
    C = 0x04...
    };
    func( HOGE hoge );
    って定義して、
    func( ( HOGE )( A | B ) );

    意味分からん。 

576 仕様書無しさん [sage] Date:2008/06/06(金) 13:10:21  ID: Be:
    >>575
    少なくとも1個目は、
     変数aは配列なんだと、その行を見るだけで判断できる
    という観点では、一応意味はある。
    2個目は、コンパイルオプションでエラー判定をきつく
    してるとコンパイルが通らないから付けとけってとこか? 

577 仕様書無しさん [sage] Date:2008/06/06(金) 13:26:58  ID: Be:
    >>575
    意味なんかない。頭の悪い拘り。 

578 仕様書無しさん [sage] Date:2008/06/06(金) 13:57:08  ID: Be:
    それで何かアルゴリズムに問題が出るとか可読性が著しく落ちるとかいうわけでもないような。
    その程度の他人のクセをいちいち気にしてたら、仕事進まなくない? 

581 仕様書無しさん [sage] Date:2008/06/06(金) 19:45:35  ID: Be:
    std::vector<unsigned char> buf(256);
    なんか取ってくる関数(&buf[0], buf.size());

    みたいなのならよく書く。
    これは正しくは配列じゃないけど。
    普段STL使っているような人だったら普通の配列でも書いてしまうかもしれない 

582 仕様書無しさん [sage] Date:2008/06/06(金) 21:17:39  ID: Be:
    >>581
    単にbufだけ渡すか、イテレータで開始と終了を渡さないかな…? 

586 仕様書無しさん [sage] Date:2008/06/07(土) 05:03:22  ID: Be:
    >>575
    最初のは俺は常にそう書いてるが...&a[1]なんて時もある.もちろんポインタの時はfunc(p)
    二番目はlint時代の名残だな
    三番目は至極真っ当に見えるが何が不満なんだ? 

587 仕様書無しさん [sage] Date:2008/06/07(土) 05:13:01  ID: Be:
    列挙型にキャストなんてしない 

589 仕様書無しさん [sage] Date:2008/06/07(土) 05:36:36  ID: Be:
    >>586
    >>587ですでに指摘されている通り、(A|B)は型enum HOGEじゃねーから、C(C++)的にはイカレポンチだ。
    でも、そういう(ビット演算に対して閉じている、と宣言できる)型を定義できたらいいのにな、
    と思うことはある。 

590 仕様書無しさん [sage] Date:2008/06/07(土) 09:55:12  ID: Be:
    そう.だから >>575 のは今のCの枠内で工夫した(?)書き方なんだと思った
    俺は(もちろんw)そこまではやらんが 

591 仕様書無しさん [sage] Date:2008/06/07(土) 13:31:38  ID: Be:
    燕雀いずくんぞ鴻鵠の志を知らんや 

592 仕様書無しさん [sage] Date:2008/06/07(土) 14:39:37  ID: Be:
    >>589
    >ビット演算に対して閉じている、と宣言できる)型

    C言語的には、ビットフィールドでやれという事だと思う。 

594 仕様書無しさん [sage] Date:2008/06/07(土) 16:52:50  ID: Be:
    >>592
    ビットフィールド不便すぎないか? 

595 仕様書無しさん [sage] Date:2008/06/07(土) 17:11:39  ID: Be:
    >>594
    どこが? 

ビットフィールドをこの目的では使えないんじゃなかろうか? で、enum → int はノーチェックだけど、int → enum はチェックされるよ、と。 あれ。Cでもこうだったっけ?

H社の関係者の方々。気を落とさずにいきてくだしあ。

iriver、音楽/動画再生対応“名刺入れサイズ”電子辞書
外部メモリースロットは備えていないが、内蔵メモリに転送した音楽や動画ファイルの再生が可
能となっている。なお、内蔵メモリは辞書データで約959MB占有している。

こーゆーので、SDカードとかが使えない仕様のは理解に苦しむなあ。

AngelCode Scripting Library 経由で。

AngelCode.com - scripting library
Introduction

The AngelCode Scripting Library, or AngelScript as it is also known, is an extremely 
flexible cross-platform scripting library designed to allow applications to extend 
their functionality through external scripts. It has been designed from the beginning 
to be an easy to use component, both for the application programmer and the script 
writer.

AngelScriptとしても知られているスクリプティングライブラリ AngelCode は
プラットフォームを跨いで使うことのできるとてつもなく柔軟なスクリプティングライブラリで
あり、外部スクリプトを通じてアプリケーションの拡張のために使うことができるように設計
されています。
作り始めたときからアプリケーションプログラマとスクリプトライターの両方が、
コンポーネントを使いやすいように設計されています。

Efforts have been made to let it call standard C functions and C++ methods with no 
need for proxy functions. The application simply registers the functions, objects, and 
methods that the scripts should be able to work with and nothing more has to be done 
with your code. The same functions used by the application internally can also be used 
by the scripting engine, which eliminates the need to duplicate functionality.

標準的なCによる関数やproxy 関数を通すことなくC++によるメソッドを呼び出すことができるように
労力が払われています。アプリケーションでは
スクリプトが使ったり
関数やオブジェクト、メソッドを単に登録するだけです。
アプリケーションが内部的に使用する関数はスクリプティングエンジンからも
呼び出して使うことが可能です。一つの機能を(内部的に使用するものとスクリプティングエンジン
用のものとで)重複して持つ必要はありません。


For the script writer the scripting language follows the widely known syntax of C/C++ 
(with minor changes), but without the need to worry about pointers and memory leaks. 
Contrary to most scripting languages, AngelScript uses the common C/C++ datatypes for 
more efficient communication with the host application.

スクリプトライター向けに、スクリプティングエンジンは非常に広く知られている
C/C++の構文に従っています(ちょっとした変更はあります)。しかし、
ポインタやメモリーリークについて思い悩む必要はありません。

AngelScriptでは一般的なC/C++のデータ型をホストアプリケーションとの
より効率の良いコミュニケーションのために使用しています。

AngelScript is completely free, released under the zlib license. I only ask for your 
recognition, nothing else. However, if you would like to make a donation I would be 
very grateful. Your donation give me more inspiration and will allow me to spend more 
time working with AngelScript.

AngelScirptはzlibライセンスの元でリリースされていて、完全に自由に扱えます。
ただしただひとつだけわたしがあなたにお願いしたいとこがあります。
あなたがわたしに寄付をしてくれたならそれはわたしにとって非常に嬉しいことです。
あなたの寄付によって、inspiration が向上し、
わたしが AngelScriptに割く時間も増やすことができるでしょう。

Give the library a try, and let me know how you like it.

ライブラリを試してみて、もし気に入ったのならわたしに知らせてください。

PLNewsでもこの名前は見なかったような? →C++風の構文を持つ組み込み向けのプログラミング言語。

「GHOST IN THE SHELL / 攻殻機動隊」、押井守監督の手で全カットを完全リニューアルして7月から限定公開 - GIGAZINE
「GHOST IN THE SHELL / 攻殻機動隊」は士郎正宗のマンガ「攻殻機動隊」を原作として作られ
た映画で、監督は押井守、制作はProduction I.Gが担当しました。ProductionI.Gによると、押
井守監督の最新作「スカイ・クロラ The sky crawlers」が2008年8月2日から劇場公開されるこ
とを記念して、「GHOST IN THE SHELL / 攻殻機動隊」を全カット完全リニューアルし、「GHOST 
IN THE SHELL / 攻殻機動隊2.0」として2008年7月12日から公開することが決定しました。

リニューアル内容としては、
・最新デジタル技術を使用して新作3DCGカットを制作。
・新たに人形使い役として榊原良子が参加して全編新規アフレコ。
・音楽を6.1chにグレードアップ
・サウンドデザイナーとして「Mr.インクレディブル」でアカデミー賞を受賞したランディ・トムが参加。
となっています。

公開は5大都市だけで、東京:新宿ミラノ、大阪:なんばパークスシネマ、名古屋:名古屋ピカ
デリー、福岡:福岡UCIキャナル・シティ、札幌:札幌シネマフロンティアの5劇場での限定公開
となります。

どうせなら品川のあそこ(名前忘れた)でやってくんないかなあ。 イノセンスもやってたんだし。

2008年06月08日

execlv?p? の動作が良くわかりません(><) 引数をどう解釈してるんだ、こいつ。

gawk。IPV6対応とかのために getaddrinfoなどを使おうとすると、 Windows2000や9x系で面倒なことになりそうな気配。 んーむけずっちまおうかなあ。 V6が必要だってんなら別の抜け道を探そう。

2ちゃんの指定のスレをダウンロードするスクリプト/プログラムを作りたい。 というのも、専用ブラウザだと一度に取り込むスレの数が制限されてたりするので (普段良く使うギコナビだと10個)。 あんまり集中的に取り捲るとアクセス禁止とかいう話もあるみたいだけど、 とりあえず手作業でちまちまちまちま10個ずつ取り込む手間が面倒なので、 適当にウエイトをはさみながらのんびり取り込むパターンで一向に構わない。 で、DATを取るには何が必要なんだっけか。 調べておこう。

実はPlaggerでできたりする?w

今日の2ちゃんヲチ(ム板/マ板限定)


推薦図書/必読書のためのスレッド 40 [bbs2chreader]

375 デフォルトの名無しさん [] Date:2008/06/07(土) 13:48:20  ID: Be:
    Code Completeを絶賛して職場においてもらったのだが、
    自分で勧めといて見たらつまらなくて吹いた。

    これのターゲットがわからん。
    新人みたいな初心者は分厚すぎて読まねえし、
    ある程度中級者には不要だし。
    いったいこれは誰が読む本なんだ??? 

376 デフォルトの名無しさん [sage] Date:2008/06/07(土) 14:29:57  ID: Be:
    >>375
    読まないで絶賛しちゃうとか・・・ 

377 デフォルトの名無しさん [sage] Date:2008/06/07(土) 19:38:08  ID: Be:
    >>375
    自分はイケてると勘違いしているコーディング土方。 

378 デフォルトの名無しさん [sage] Date:2008/06/07(土) 19:56:52  ID: Be:
    Code Completeって、おもしろくないのか、、、
    読んでみようと思ったのに。。。 

379 デフォルトの名無しさん [sage] Date:2008/06/07(土) 19:56:54  ID: Be:
    自分で絶賛しといて読んでる375に同僚は不思議がるのでした 

380 デフォルトの名無しさん [sage] Date:2008/06/08(日) 00:03:05  ID: Be:
    >>378
    上級者には退屈な内容だろうね。
    でも、ヘタなくせに読んでも感銘うけるなり、動揺するなりしないやつは、どうだろうっても思う。 

382 デフォルトの名無しさん [] Date:2008/06/08(日) 00:36:12  ID: Be:
    初級~中級のおれは読んだほうがいいのか? 

383 デフォルトの名無しさん [sage] Date:2008/06/08(日) 00:52:08  ID: Be:
    上級者だから、Code Completeとかその他お作法系の本を読まなくていいかっていうと、どうだろうな。
    どうしようもないヘタが、自分を上級者だと思っていたりとかありがちだし。

384 デフォルトの名無しさん [sage] Date:2008/06/08(日) 00:56:07  ID: Be:
    上級者だから読まなくていいっていう話はどうかと思うけど、
    書いてあることはわりと基本的なことばかりだよね。と、目次
    だけ見て思った。 

386 263 [sage] Date:2008/06/08(日) 02:46:44  ID: Be:
    Code Complete は、年間十冊読む奴なら、載ってることは全部他の本で読めるから不要。
    年に二冊とか三冊しか読まない奴は Code Complete でもいいだろう。
    実践的な本だから、退屈は退屈だ。
    繰り返すけど、悪くない本だ。 

388 デフォルトの名無しさん [sage] Date:2008/06/08(日) 03:04:00  ID: Be:
    何十冊にも分かれて載ってる基本的常識が
    一冊にまとまってるのがいいんじゃないか

    初心者の効率的なレベルアップ、
    中級者~だと思っている自分の知識の再確認
    なんかにはいいと思うけど 

389 デフォルトの名無しさん [sage] Date:2008/06/08(日) 03:05:27  ID: Be:
    そもそも何をもって中級者と呼ぶのか 

390 デフォルトの名無しさん [sage] Date:2008/06/08(日) 03:40:28  ID: Be:
    なんとなく書けちゃってる人たち
    かな 

391 375 [] Date:2008/06/08(日) 08:43:25  ID: Be:
    Code Completeは達人プログラマーと同じようなクソな臭いがした 

392 デフォルトの名無しさん [sage] Date:2008/06/08(日) 08:58:06  ID: Be:
    まぁソースコードなんて一子相伝だし
    どう読むかなんて知る必要ないけどな 

393 デフォルトの名無しさん [] Date:2008/06/08(日) 11:51:42  ID: Be:
    >>388
    >何十冊にも分かれて載ってる基本的常識が
    >一冊にまとまってるのがいいんじゃないか

    まさしくCodeCompleteの利点はそこだと思う。膨大な量の技術書と論文から
    引用した情報をまとめて、スティーブマコネルがそれにコメントつけてる。
    他の技術書とか論文とかの索引としても使えるから、とりあえず一冊もっとけ、
    ってのは正しいと思う。

    読者が「読んだだけでレベルアップ」する本ではなく、「迷った時にはこれを見る」
    っていう本。そもそも迷わない人には、全ページ知ってる情報が羅列されてるだけ
    に見えて、つまらなく感じるのでは。

394 デフォルトの名無しさん [sage] Date:2008/06/08(日) 11:56:44  ID: Be:
    和書はうさんくさいのが宣伝してるから
    好かん 

395 デフォルトの名無しさん [sage] Date:2008/06/08(日) 15:13:47  ID: Be:
    CodeCompleteはいい本だと思うよ。
    基本的に「うんうん、そうだよね。やっぱそう考えるよな」って感じで読み進めて、
    「あれ?こんな考えもあるんだ」ってところに当たったら、他の書籍で詳細を追っかける、
    こんな読み方をして、自分の知識を広げるための本だと思う。
【肥大化】C++ を見捨てたヤシ 2人目【複雑化】 [bbs2chreader]

272 デフォルトの名無しさん [sage] Date:2008/06/06(金) 23:44:16  ID: Be:
    確かにC++の複雑さに困っている人はいるのだろう
    でもその人たちは他の言語では困らないの?
    どの辺が境界なんだろう?
    分母の差か? 

273 デフォルトの名無しさん [sage] Date:2008/06/06(金) 23:59:41  ID: Be:
    一つだけ突出してるから境界もクソも無いわな 

276 デフォルトの名無しさん [sage] Date:2008/06/07(土) 00:48:19  ID: Be:
    >>272
    肥大化するのは別にかまわないんだが、その都度「変態的」な
    構文が追加されていってるのが問題なんじゃあるまいか?

    lisp あたりはどんなに言語拡張しても基本は S 式で何とか
    なってるじゃん

277 デフォルトの名無しさん [sage] Date:2008/06/07(土) 06:19:37  ID: Be:
    >>272
    少なくとも、言語仕様レベルで
    深入りしないようにしようという判断をした(テンプレート周りだが)のはC++が初めてだ。

    普通にコードを書くのにEffectiveほにゃららの通読必須ってあたりで何か狂ってるんですよ。
    ゲーム屋だけど、本当に代わりがないから使ってるに過ぎない。 

278 デフォルトの名無しさん [sage] Date:2008/06/07(土) 10:07:44  ID: Be:
    >少なくとも、言語仕様レベルで
    >深入りしないようにしようという判断を
    >
    >ゲーム屋だけど、本当に代わりがないから

    深入りしなかったおかげでC++も使えるんだろ。
    言語が今以上に複雑でコンパイラの実装が困難だったら
    まともなサポートが得られず、
    単に、C言語だけが選択肢になる。


    言語の複雑さが仇になるのは、
    主にアホが書いたソースをメンテするケース。
    まともなメンバーで作る分には問題無い。 

279 デフォルトの名無しさん [sage] Date:2008/06/07(土) 10:27:03  ID: Be:
    そして、そこでいう「アホ」程度ならそこら中にいるので、
    つまりC++の複雑さはそこら中で「仇になる」わけだ。 

280 デフォルトの名無しさん [sage] Date:2008/06/07(土) 10:29:22  ID: Be:
    >>272
    分母の差かどうか知らんが、色々と選択してC++が最適だと思うケースに
    C++を使う言うだけだと思うが。困ると言うよりかは要求に答えてくれるか?ってのが
    重要だろうに。

    漏れの職場だと自分だけの書きなぐり使い捨て速度はそれほど必要ないケースだと
    Python使うし、ある程度みんなが使ったりメンテが重要だったりするケースはJavaで、
    変態的(?)かつ、動作環境べったりでパフォーマンスが要求されるときにC++って
    使い分けてる。 

281 デフォルトの名無しさん [sage] Date:2008/06/07(土) 10:30:16  ID: Be:
    アホばかりの会社の問題を言語の問題にしたいわけですね、わかります。 

282 281 [sage] Date:2008/06/07(土) 10:31:38  ID: Be:
    >>279 

283 デフォルトの名無しさん [sage] Date:2008/06/07(土) 10:44:29  ID: Be:
    >>282
    現実にそこら中にいるのだから、
    「会社の問題であって言語の問題ではないんだァ!」
    とか押してもね。

    1万人に1人が怪我をする道具で怪我をしたなら、流れ的にそいつの不注意とか不運の問題になるけど、
    これがたとえば3人に1人が怪我をするとなると、この道具危ないよねっていう問題になってくる。

    君個人が有能だったり、とても優れた職場しか知らずその辺りが当たり前だと思って生きてるなら、
    それは素晴らしいことだし、ずっと続くことを祈るけど、その場合残念ながら、君は
    「現実を全般的に捉えた話のできない人」ということになる。恵まれすぎている。 

286 デフォルトの名無しさん [sage] Date:2008/06/07(土) 11:16:03  ID: Be:
    >>283
    教習所にも行かせずに自動車使わせているようなものだな。
    教育も何もせず、新人をいきなり実務に入れてそうだ。客も可哀想だ。

    それにC++に向いてない奴は他の言語の仕事に、
    プログラムに向いてない奴は資料作成/客先対応/
    テスト/サポートデスクなどの仕事に回すことも考えるべき。

    単にお前さんが悲惨職場しか知らないんだろう。
    そんなに問題のある言語なら、これほど広まることもない。 

287 デフォルトの名無しさん [sage] Date:2008/06/07(土) 11:16:19  ID: Be:
    今時(?)C++を使うのは「神に選ばれた戦士」的な思い込みがあるのかもしれんが、
    現場のPGなんてほとんどドカタだからなぁ。

    まあ、とは言え言語の性にするのは美しくないけどな。
    やっぱりアホが書いたソースならVBだろうがCOBOLだろうがイヤなモンはイヤだし。 

314 デフォルトの名無しさん [sage] Date:2008/06/07(土) 23:29:21  ID: Be:
    C++の設計が悪いと言う人が想定している設計が良い言語とはなんなんだ
    ほんとはC++のどこが悪いのかもわかってないんでしょ?
    多分C++以外の言語も理解できないんでしょ? 

315 デフォルトの名無しさん [sage] Date:2008/06/07(土) 23:29:59  ID: Be:
    なにそのアンサガ 

316 デフォルトの名無しさん [sage] Date:2008/06/07(土) 23:31:40  ID: Be:
    C++ がロマサガだったら世界はもっとハッピーだったろうなあ 

317 デフォルトの名無しさん [sage] Date:2008/06/07(土) 23:32:36  ID: Be:
    C++に限らず特定のものを個人の評価に依存する状態で必死に勧める人間は
    他人を見下して優越感に浸りたいだけの様な気もする。 

318 デフォルトの名無しさん [sage] Date:2008/06/07(土) 23:37:57  ID: Be:
    >>314
    たぶんHaskellとか言いだすんだろうな。
    で、実際にHaskellをバリバリに使ってるかというとそういうわけではない、と。 

319 デフォルトの名無しさん [sage] Date:2008/06/07(土) 23:39:40  ID: Be:
    仕事でいまさらVBとかCとか非力な言語使いたくないからC++を薦めてる。C++使って楽しようぜ。 

320 デフォルトの名無しさん [sage] Date:2008/06/07(土) 23:39:59  ID: Be:
    攻略本はEffective ~のほうだろ。

    D&Eはどうしたらこんなアレな出来になるかという過程を書いた読み物として
    C++知らない、使う気のない人間でも楽しめると思っている。
    (俺が初めて読んだのもC++よく分かっていない頃だったし)
    これ読んでもC++がどうしようもない言語だという思いは変わらない。 

325 デフォルトの名無しさん [sage] Date:2008/06/08(日) 00:42:54  ID: Be:
    C++ には数々の変態的要素があるが、
    確かにネイティブコンパイルするタイプの言語で
    代替となる言語は存在しない。
    D もガベコレのせいで代替とはなれない。 

326 デフォルトの名無しさん [sage] Date:2008/06/08(日) 00:49:57  ID: Be:
    >>325
    そうだよね
    マルチタスクOSで走るアプリケーションでもStop The Worldが許容できないケースは結構あるからね 

332 デフォルトの名無しさん [sage] Date:2008/06/08(日) 05:20:31  ID: Be:
    俺はC++と心中するぜ
    あばよ、達者でな 

333 デフォルトの名無しさん [sage] Date:2008/06/08(日) 05:33:57  ID: Be:
    無茶しやがって… 

Pythonについて(アンチ専用)
197 デフォルトの名無しさん [sage] Date:2008/06/07(土) 03:10:24  ID: Be:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys, os, stat
    import time

    def main(root):
      dirsize = {}
      for dirpath, dirnames, filenames in os.walk(rootroot.decode('cp932'), topdown=False):
        dirsize[dirpath] = 0
        for file in filenames:
          tgt = os.path.join(dirpath, file)
          siz = os.stat(tgt)[stat.ST_SIZE]
          dirsize[dirpath] += siz
        for dir in dirnames:
          tgt = os.path.join(dirpath, dir)
          siz = dirsize[tgt]
          dirsize[dirpath] += siz
          print '"dir","%s",%d' % (tgt, siz)

      print '"total","%s",%d' % (root, dirsize[root])

    if __name__ == '__main__':
      if len(sys.argv) >= 2:
        main(sys.argv[1])

    のように直したら中断はされなくなったのですが、
    hoge.py . > fuga.csv
    で保存しようとするとエラーになります。
    (上のバージョンはリダイレクトは出来ていました。)
    Python の日本語の扱いが良く分かりません。
    Python 嫌いになりそうです。>< 

198 デフォルトの名無しさん [sage] Date:2008/06/07(土) 03:16:16  ID: Be:
    後から貼った方が何か変なので直しておきます。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys, os, stat
    import time

    def main(root):
    dirsize = {}
    for dirpath, dirnames, filenames in os.walk(root.decode('cp932'), topdown=False):
    dirsize[dirpath] = 0
    for file in filenames:
    tgt = os.path.join(dirpath, file)
    siz = os.stat(tgt)[stat.ST_SIZE]
    dirsize[dirpath] += siz
    for dir in dirnames:
    tgt = os.path.join(dirpath, dir)
    siz = dirsize[tgt]
    dirsize[dirpath] += siz
    print u'"dir","%s",%d' % (tgt, siz)

    print u'"total","%s",%d' % (root, dirsize[root])

    if __name__ == '__main__':
    if len(sys.argv) >= 2:
    main(sys.argv[1]) 

199 デフォルトの名無しさん [sage] Date:2008/06/07(土) 03:22:05  ID: Be:
    >>197
    × rootroot.decode('cp932')
    ○ root.decode('cp932') 

200 デフォルトの名無しさん [sage] Date:2008/06/07(土) 03:24:12  ID: Be:
    >>198
    エラーにならん。
    traceback張れ。 

201 デフォルトの名無しさん [sage] Date:2008/06/07(土) 03:50:59  ID: Be:
    検索パス中に日本語が入っていて
    hoge.py c:/ > fuga.csv
    で保存しようとするとエラーになります。

202 デフォルトの名無しさん [sage] Date:2008/06/07(土) 03:53:38  ID: Be:
    これとか?

    http://python.rdy.jp/wiki.cgi?page=%C6%FC%CB%DC%B8%EC

    site-packageディレクトリにsitecustomize.pyを設置して、文字コードを指定する。

    sys.setdefaultencoding('cp932')

203 デフォルトの名無しさん [sage] Date:2008/06/07(土) 05:34:50  ID: Be:
    >>198
    KeyErrorで止まるのならこれで動くんじゃないかと
    decode()の呼び出しで無駄が多いから調整してね

    print '"total","%s",%d' % (root.decode('cp932'), dirsize[root.decode('cp932')])

    ていうかここアンチスレか 

204 デフォルトの名無しさん [sage] Date:2008/06/07(土) 05:54:35  ID: Be:
    >>201
    だからエラーの内容貼れって 

205 デフォルトの名無しさん [sage] Date:2008/06/07(土) 07:54:49  ID: Be:
    encodeしてないだけだろ 

206 デフォルトの名無しさん [sage] Date:2008/06/07(土) 12:21:50  ID: Be:
    >>196-201
    なにこの大富豪的プログラミングw
    メモリ喰いまくってるだけで全然終わらないしw

207 デフォルトの名無しさん [sage] Date:2008/06/07(土) 13:07:50  ID: Be:
    よくわからんが、os.walkをやりたいだけか?
    http://docs.python.org/lib/os-file-dir.html 

208 デフォルトの名無しさん [sage] Date:2008/06/07(土) 13:23:12  ID: Be:
    >>197
    > Python の日本語の扱いが良く分かりません。 
    > Python 嫌いになりそうです。>< 

    標準出力がリダイレクトされていない場合、Python の print 文は
    与えられた Unicode 文字列を自動的に cp932 等の実行環境固有のエンコーディングで
    エンコードして印字するようになっている。これは Python インタプリタを
    対話的に利用するときには便利な仕組みだ。「実行環境固有のエンコーディング」が
    具体的に何であるかは sys.stdout.encoding を見れば分かる。

    一方、標準出力がファイル等にリダイレクトされている場合、
    どのエンコーディングで文字列をエンコードすべきかを決めるのは難しい問題だ。
    cp932 がいいかもしれないし用途によっては utf-8 や iso-8859-1 の方がいいかも知れない。
    つまり、Python の立場からは標準出力をリダイレクトする場合のエンコーディングを
    これと決めることができない。このことは、標準出力をリダイレクトしているときには
    sys.stdout.encoding が None になることから分かる。

    この場合、print 文は sys.stdout.encoding の代わりに sys.getdefaultencoding() が返す
    エンコーディングでエンコードして出力する。このエンコーディングは Python の出荷時の
    設定では ascii になっているので、日本語等を含む Unicode 文字列を print しようとすると
    実行時エラーになる。

    結局のところ、標準出力をファイルにリダイレクトできるようにプログラムを書くには
    sys.stdout.encoding による自動エンコードに頼らないようにしなければいけないということだ。
    個人的には、Unicode 文字列をファイルなり標準出力なりに書き出すときは
    明示的にエンコードするように心がけるべきだと考えている。暗黙の自動エンコードに
    頼るとロクなことがない。 

209 208の続き [sage] Date:2008/06/07(土) 13:24:23  ID: Be:
    じゃあ具体的にどうすればいいのかという話だけど、お勧めは次の方法だ。
    まず次のように標準出力を適当なエンコーダで包む。

    import codecs
    Writer = codecs.getwriter(sys.getfilesystemencoding())
    stdout = Writer(sys.stdout)

    その上で print 文をすべて次のように書く。

    print >>stdout, '"total","%s",%d' % (root, dirsize[root])

    この例ではリダイレクトしているか否かに関わらず sys.getfilesystemencoding() の返す
    エンコーディングでエンコードするようにしている。このエンコーディングは、俺の知る限り
    標準出力がリダイレクトされていない場合の sys.stdout.encoding と一致している。
    sys.getfilesystemencoding() を使う代わりに、例えば cp932 に決めうちしちゃうとか、
    コマンドライン引数で出力エンコーディングを指定するようにするといった方法も考えられる。
    標準出力リダイレクト時のエンコーディングをどうするかは用途に強く依存する問題なので
    こればかりはプログラムを書く人(つまり197さん)が決めるしかない。 

210 デフォルトの名無しさん [sage] Date:2008/06/07(土) 14:04:17  ID: Be:
    >>209
    u'"total","%s",%d'じゃない? 

211 210 [sage] Date:2008/06/07(土) 14:14:49  ID: Be:
    ごめん、勘違いしてた
    str % unicode はunicodeになるからいいのか 

212 デフォルトの名無しさん [sage] Date:2008/06/07(土) 14:16:34  ID: Be:
    >>211
    その辺がマンドクセなんでp3kではbyteとunicodeのみになるんだろうな。 

213 デフォルトの名無しさん [sage] Date:2008/06/07(土) 14:44:12  ID: Be:
    >>210-211
    確かに u"・・・" にすべきだった。指摘ありがとう。

    一般論としては u"・・・" にする必要があるかどうかは文字列の中身に依る。
    例えば u"・・・" ではなく "・・・" を使って日本語で
    print >>stdout, '"総計","%s",%d' % (root, dirsize[root])
    としたら % 演算子の処理のところで暗黙の string → unicode 変換が起こる。
    ソースのエンコーディングと sys.getdefaultencoding() の値によってはエラーになるわけだ。

    文字列の中身が ASCII 文字だけなら暗黙の変換が起こってもまず問題ない。
    ただ、無駄な変換ではあるし、暗黙の自動変換を避ける方針でやりましょうと言ってる
    わけだから、やはり u"・・・" にするのが妥当だ。

    というわけで>>209を訂正:

    誤: print >>stdout, '"total","%s",%d' % (root, dirsize[root]) 

    正: print >>stdout, u'"total","%s",%d' % (root, dirsize[root]) 

208,209に「参考になる」を。

稼げるプログラミング分野?



The Unix Geek: Programming Salaries

Programming Salaries

I was recently wondering what the salary per specific programming language or API is. 
Here are 13 very popular programming languages, 3 popular operating systems, and 7 
popular APIs and their average salary in the United States. Source

Programming Languages
Objective-C 	$82,000
C++ 		$80,000
TCL 		$80,000
C# 		$79,000
Java 		$79,000
Python 		$78,000
Perl 		$77,000
Ruby 		$74,000
JavaScript 	$72,000
Delphi 		$64,000
PHP 		$64,000
Visual Basic 	$64,000
C 		$60,000

Objective-C が一番高いのは需要に比べて供給が少ないから。なんでしょうかね。 意外にTclが上位グループに。 なんとかいうハード関係で使われているから?

2008年06月07日

まあ東スポの記事だからと云うことはおいといても、 ベイスターズの監督をやりたいとか死ぬ気ですか野村さん(笑)(現 東北楽天イーグルス監督のあの人))

「デバッグ・ガール」読了。 痛え(笑) 内容がそのものではなく、読んでてちくちくくるものがそこかしこにあったのです。

shiroさんの (2008/06/06 12:57:34 PDT ソート) を見て、マージソートは空間的な要求がきつい(リンク付きリストの時はそうでもありませんが) ということをすっかり忘れていました。○| ̄|_ であるからこそ、クイックソートの改良版(クイックソートも空間的な要求はマージソートよりも 格段に小さい = shiroさんが書いている「in-placeでできる」ということ) に使われることもあるわけで。

ただまあ言い訳を書かせていただければ、何かと組み合わせるとか何かの補助としてということではなく 基本的なところで使われる場面というのはというのを考えておりました。 皆無ではないと思いますがクイックソートやマージソートに比べればやっぱり影が薄いんじゃないかなと。

純粋なヒープソートはむかーーーし(笑) メモリの実装量が乏しいとあるデバイス向けのプログラムで使ったことがあります。

記憶をたどってみると、Perl と gawk がソートアルゴリズムをクイックソートから マージソートに切り替えていますね。Perl はプラグマを使って制御できたと思います。 ああ、これだ。

NAME
    sort - perl pragma to control sort() behaviour

SYNOPSIS
        use sort 'stable';          # guarantee stability
        use sort '_quicksort';      # use a quicksort algorithm
        use sort '_mergesort';      # use a mergesort algorithm
        use sort 'defaults';        # revert to default behavior
        no  sort 'stable';          # stability not important

        use sort '_qsort';          # alias for quicksort

        my $current;
        BEGIN {
            $current = sort::current();     # identify prevailing algorithm
        }

DESCRIPTION
    With the "sort" pragma you can control the behaviour of the builtin "sort()" function.

その癖(?)はどこかで見たような

めもがき:2008年6月6日分

regex(3)は kbkさんご想像のとおり、ごにょごにょしてますね。
regex/regcomp.c の findmust()というコード中

    1601         for (i = g->mlen; i > 0; i--) {
    1602                 while (OP(s = *scan++) != OCHAR)
    1603                         continue;
    1604                 assert(cp < g->must + g->mlen);
    1605                 *cp++ = (RCHAR_T)OPND(s);
    1606         }

という部分があるのだけども、OPND()マクロはregex2.hでは

    80 typedef unsigned long sop;      /* strip operator */
    81 typedef int sopno;
    82 #define OPRMASK 0xf8000000
    83 #define OPDMASK 0x07ffffff
    84 #define OPSHIFT ((unsigned)27)
    85 #define OP(n)   ((n)&OPRMASK)
    86 #define OPND(n) ((n)&OPDMASK)

となってて上位bitを別目的に使ってるげ。 

OPNDやらOPというマクロの名称やその定義は見覚えがあります。 Henry Spencer作の regex のどれかのバージョンだったか、 Pythonの obsolete になった regexモジュールで使われていたのにも このような定義を含んだものが使われていたと思います。 大本のご先祖様が同じだったりするんでしょうか?

1.5だかの時代に、python がsjisなテキストを問題なくハンドリングできるように いじったことがあるんですが、regex がそれで悩んだ記憶が(笑) バージョンから想像できる通り90年代も半ばころの話で、 手を入れたものを公にはしませんでした。いじったソースもたぶん消えてるだろうなあ。

めもがき:2008年6月6日分
まあ早いとこ自前のregex(3)持ちましょうってことですな。
ってもその前にcollationがあるのだけども。

うーむ。 わしも作りかけのが…(って仕様も実装方針もほとんど決めてない代物)

ちゃんと一次資料に当たろうよ

リリカルLispな人のところにコメントつけようとしたらどうしてもできないので。

他の言語を学ぶこと (リリカル☆Lisp 開発日記)

あなたは本当に、他の言語を学ぶべきなのか?

こんな記事をオレンジニュース経由で見つけました。
いろんな言語を中途半端にやってる私としては全く賛同できません。

「色々なプログラミングパラダイムを学ぶことにはあれこれな価値がある」
みたいな話は他の人が沢山書いてそうなので、違うところに突っ込みを入れます。

    それは楽しい時間の無駄(例えば趣味)かもしれません。
    しかし、それでもなお無駄なのです。
    もしあなたがそれを遊びで行うなら素晴らしい事ですが、得にはなりません。
    (中略)
    投資した時間に対して得られるわずかなリターンとともに、
    価値の低いタスクに費やされます。

楽しくても無駄な時間に過ぎないってのはどうなんでしょうか。
そんなことを言い出したら大半の娯楽は無駄扱いになる気がします。
仕事に役立つこと以外学びたくないという考えはどうも賛同できません。

役に立たないものを学んで役に立たないプログラムを書くのは楽しい。
それが偶然役に立ったら儲けもの。
趣味で書くプログラムならこれくらいでいいと思うんですけどね。
激務に追われると発想が変わってくるのかな……

元のblogがあって、それに噛み付いたblogがあって、それを InfoQが取り上げて さらにそれを翻訳したもの。じゃないですか。 文句を云うなら清く正しく原文に当たらなきゃ。 わたし自身も彼に全面的に賛同はしませんが (どうも Dave Thomasの意図が誤解されて伝わっているような気がする)、 かといって彼の主張するところに価値なしとも思えないのです。

引き合いに出して悪いのですが、ちょっと前にいけがみさんが書いたこと (一部で反発の発言を書いていた人もいましたよね)と共通すると思います。 って、本人もなんか書いてるし(笑) …ということは自分の感じた印象はそれほどとっぴでもないということか(笑)



Language Dabbling Considered Wasteful : Gustavo Duarte

言語の喰い散らかしには害がある Gustavo Duarte

[Update:
I have renamed this post. The original name, "New Languages Considered Harmful",
was supposed to be a tongue-in-cheek way to get people thinking.
I chose it playing off of the reference to Dijkstra later in the post.
It's absurd when taken literally: every language was once "new", and what exactly
should we stick with? ALGOL? Fortran? Analytical engine punch cards?
Unfortunately it came across as incendiary, which was not my intention.

私はこのポストの名前を変えました。元々の名前は
“New Languages Considered Harmful”(新しい言語には害がある)
というもので、これは読む人に誤解を与えかねないものでした。
どんな言語にも“新しい”ときがあるのですからまずい言い方でした。
わたし達が本当にこだわるべきものはなんでしょうか? ALGOLですか? Fortran?
解析機関のパンチカード?
不運にも扇動的なものとみなされてしまいましたが、それはわたしが意図したところではありません。

This post is not about computer science education: I believe it's important for programmers
to be exposed to a variety of languages and paradigms as part of their education.
It is about how much professionals get from learning new languages.
There are enormous productivity gains one gets from sticking with a small set oforthogonal languages;
moreover, dabbling in languages is overrated as a way to get better at programming
(in particular, when compared to reading high-quality source code).
Plus there's a world of stuff to learn, some of which I think has better returns than a new
language for most programmers. 

このポストはコンピュータサイエンス教育に関するものではありません。
わたしは、プログラマが教育を受けている時期にさまざまなプログラミング言語やパラダイムを
経験することは重要であると信じています。
わたしが主張したかったのは、「プロ」が新しい言語を学ぶことでどれほどの事を得られるのか
ということなのです。
さらに云えば、お遊びで言語に手を出してみるということはプログラミング能力を向上させる
という点において過大評価されています(特に高品質のソースコードを読むことを比べたとき)。
加えて世界には学ぶべきことにあふれていて、その中にはほとんどのプログラマが
新しいプログラミング言語を学ぶよりも多くの見返りが得られるものがあると思うのです。

Examples of these "language sets" could be C/Ruby/LISP, C#/F#/JavaScript, 
C++/Python/Java, etc. The sets are not static, but in my experience there's seldom 
good reason for change. In my own personal set I've had two changes in the last 7 
years: Ruby displaced Perl and JavaScript got added. The original article is below in 
all of its flame-inducing glory.]

“言語セット”の例にはたとえば、C/Ruby/LISP, C#/F#/JavaScript, C++/Python/Java
のようなものです。こういったグループは固定されたものではありません。
とはいえわたしの経験からするとグループの内容を変えるだけの正当な理由があることは
めったにあることではありません。
過去7年間で、わたしはこの言語セットに二つの変更をしています。
RubyはPerlを置き換えて、JavaScriptが新たに加わりました。
元々のアーティクルは以下に flame-inducing glory と共に丸々残っています。]

Learning new programming languages is often a waste of time for professional 
programmers. It may be a fun waste of time (i.e., a hobby), but it’s a waste 
nonetheless. If you do it for pleasure, then great, but profit is scarce.
Pointing this out among good programmers is heresy: even the pragmatic programmers, whose 
teachings are by and large excellent, suggest we should learn one new programming 
language every year. That’s rubbish.

新しいプログラミング言語を学ぶということは、プロのプログラマにとっては
時間の浪費となってしまうことが往々にしてあります。
新しい言語を学ぶことはたとえば趣味として時間をかけるのには楽しいことかもしれません。
それでもそれは時間の浪費なのです。
新しい言語を学ぶことがあなたにとって楽しいことであるのなら、それはとてもすばらしいことです。
それでも学んだことにより得たことは掛けた労力に比べれば不十分なものなのです。
この指摘に対しては、良いプログラマ達は反対しています。
その中には、(whose teachings are by and large excellentで)
わたし達プロのプログラマは毎年ひとつ新しい言語を学ぶべきであるという
提案をしているpragmatic programmers も含まれています。


The theory is that by learning a new language you "expand your mind" and 
become "a better programmer". Right. By that kind of argument we should all 
be eating LSD (don't). In reality learning a new language is a gritty business in 
which most of the effort is spent on low-value tasks with poor return on time invested. 

理論的には新しい言語を学ぶことであなたは“expand your mind”
(あなたの考え方を拡張します?)し、“a better programmmer”(より良いプログラマ)に成長します。
それはいいでしょう。が、それは自分たちプログラマは皆LSDをやるべきだという主張です
(やっちゃダメよ)。
実際のところ、新しい言語を学ぶということは gritty business であって
そのために払う努力というものは掛けた時間に見合うものでは決してない貧弱なリターン
つきの low-value task に消えていくのです。


You need to get to know the libraries, struggle with the environment, find or tune a 
text editor, look for tools, and so on. Most of the effort has to do with housekeeping 
chores, which are surely not mind-expanding by anyone’s measure. If you hope to be 
productive in the new language, things are even bleaker: proficiency has less to do 
with the language itself than with the myriad technologies you must master to use it 
effectively.

あなたはライブラリについても知らなければならないし、環境を構築するのに四苦八苦し、
エディタを見つけたり設定をいじくったりし、ツールを探し…
そんな努力(effort)のほとんどは、日々の雑用と一緒にやるべきことです
(has to do with housekeeping chores) 。そしてそんなことが誰かの視点では
mind-expand することであるなんてことはまずありえないことです。
仮にあなたが新しい言語において生産的 (productive)でありたいと望むのであれば

効率的に使うために使い方をマスターしなければならない有象無象のテクノロジーと
言語との組み合わせに熟練するのではなく、言語そのものに熟練すべきです。


Even core language learning offers dubious return.
How much does it really help to learn a new syntax?
How does it expand your mind to learn new operator precedence quirks?
Much of what constitutes a language is lexical and syntactical bureaucracy. 
Worse, you’re learning absolutely nothing about fundamental aspects of computer 
science. No algorithms, no operating systems, no compiler theory, no math, no AI.
If you’re an undergrad, then you should have time to pick up languages on the side while 
learning all that, of course. But a professional is making a trade-off: what else 
could you learn with that time? We’re better off studying business, security, 
usability, architecture, software estimation, and so on, rather than spending time 
with a different language every year.

コア言語を学ぶことが dubious return を提示していたとしても、それがどれほど
新しい構文を学ぶことの助けになるでしょうか?
新しい演算子の優先順位の quirks を学ぶためにあなたの mind がどれだけ拡張されるでしょうか?


その時間を使ってあなたが他に学ぶことのできるものは?
わたしたちは毎年毎年別の言語を覚えるために時間を浪費するのではなく、
ビジネスやセキュリティ、ユーザビリティ、アーキテクチャ、software estimation
などを学ばなければなりません。


If your goal is better programming, you will learn far more from reading high-quality 
code bases in your current languages than from a new language. Go read top-notch code 
in the languages you know already; it’ll teach you techniques and style quickly, plus 
different ways of thinking about problems, with the added bonus that you can actually 
use what you learn. You can also understand a lot about programming languages in 
general (issues like typing, scoping, functional vs. imperative) by reading a good 
book.

もしあなたの目標がよりよいプログラミングであるのなら、新しい言語で何かするよりも
今自分が主に使っている言語で書かれている品質が高いコードを読んだほうがより多くのことを
学べるでしょう。


There’s another pernicious effect to language hopping: it hurts your momentum. Every 
time you rely on your current languages you get a little better. Not in a fluffy 
expand-your-mind way, but in a concrete way. You learn more about your libraries, you 
set up a new macro in the editor, you have a chance to use that new language feature. 
Scott Hanselman argues that learning a new language is sharpening your saw, but I see 
it as neglecting your half-sharpened saw while playing with the dull, new, shiny one. 
The upfront cost is not the only one either. It’s better to have 3 razor-sharp saws 
than 8 so-so ones. Each new language you add to your toolbox is making it harder for 
you to become furiously productive in any given language.

language hopping によってあなたの mementum が傷つきます。

Scott Hanselman は新しい言語を学ぶことは自分の持っている鋸を切れるようにするようなものだと
主張していましたが、わたしの思うところでは、そういった行為は中途半端な切れ味でしかない
鋸を放置するようなもので、

切れ味鋭い鋸を三本だけ持っているということは、
そこそこの切れ味の鋸を八本持っていることよりも良いことなのです。
あなたが自分の工具箱に追加した新しい言語の一つ毎に

Clipper manual Forget Ruby - Here’s Clipper!

Yet, any programmer worth their weight in silicon must know multiple languages. 
Sometimes the new saw is of a different type altogether, and it’s worth having. Right 
off the bat there are major obvious reasons. Different systems or parts of a system 
call for different languages; that’s been true in any environment I’ve ever worked 
in. For a while this was mostly due to speed and level of control. My first apps were 
written for MS-DOS in Clipper, which was a database-oriented rapid development 
language. Fast to develop, but no power. Soon enough we wanted to add features that 
called for C and assembly. Using C we could write terminate and stay resident (TSR) 
programs and spice up our apps with features no one else had. Sometimes the issue was 
not so much power, but speed. There have been many happy marriages to deal with this: 
Tcl and C, VB and C++, Perl and C, you name it. Fast processors and web apps have 
largely killed the speed/power motive. Computers can happily run applications written 
wholly in Python or Ruby. And if they can’t, a different language probably won’t 
help; you just need more web servers. But alas, you now need to know SQL and 
JavaScript too, so we’re back to obvious reasons for multiple languages.

新しい鋸(saw)がそれまでのものとは違ったタイプのものであることもあって、
そういう場合にはその鋸を持つ価値があります。



わたしが最初に書いたアプリケーションは、MS-DOS向けに
データベース指向のrapid 開発向け言語であるClipperで書いたものでした。
開発するのは早かったのですが、パワーには欠けていました。
すぐにCやアセンブリで書かれたルーチンを呼び出すことで機能追加したくなりました。
Cを使うことによってわたし達は常駐プログラム (terminate and stay resident TSR)
を書くことが可能になり、自分たちのアプリに他には誰も加えていないような
機能をスパイスとしてつけることができたのです。


Aside from the immediate reasons, there’s some merit to the mind expansion argument. 
I think being proficient in at least two languages is indeed important for boosting 
your ability as a developer. This resembles human language: learning a second one 
changes the way you think and your perception of the world. The third or fourth, not 
as much. But it can’t be any two languages. If you know Portuguese and Spanish, your 
mind didn’t have to expand much. Likewise, learning VB.net and C# doesn’t count. 
Also, I agree that some programming languages are hazardous to your skills if used 
exclusively. Edsger Dijkstra claimed COBOL crippled the mind and that its teaching 
should be regarded as criminal offense. We all know who’s the new COBOL. Java, the 
kingdom of nouns, is a programming straight jacket. I imagine Dijkstra would have 
called for harsh no-parole sentences for any CS Department chairs whose students learn 
only Java. If you write a lot of Java code, being fluent in a richer language does 
sharpen your saw. This is true for other statically typed languages, but to varying 
degrees. More on that in a bit.

Java protects developer from self Java protects developer from self

You might think this is contradictory. You’d be right. Life’s not simple; sorry, I 
wish it were. The realities are:

あなたはこれを矛盾したものであると考えるかもしれません。
あなたはたぶん正しいでしょう。しかし varying degrees



このことは別の静的な型付けをする

    * Learning new languages is very expensive (in time), a huge opportunity cost
新しい言語を学ぶことは(時間的な面で)非常に高くつくものである

    * There is loss associated with using multiple languages: the "jack of all 
      trades, master of none" problem
複数の言語を使うことで失うものもある。
“jack of all trades, master of none”問題
    * A good programmer uses multiple languages
よいプログラマは複数の言語を使いこなす

But there’s a sane way to deal with these. Why, you just need to find the minimal 
language set. The smallest set of languages it takes to crank out great software 
quickly while growing as a programmer and making rivers of cash. In the next entry
I’ll talk about my personal language set and the factors I used to compose it.

しかしながら、こういったことを行う「正しい」方法というものが存在します。
なぜか。あなたには最小限の言語セット(minimal language set)を見つけ出す必要があるのです。
言語の最小限のセットというものは、プログラマとして成長し金の川(rivers of cash)を
作る間に優れたソフトウェアをすばやくつくりあげるのに使われるものです。
次のエントリでは、わたしの言語セットについて言及し、わたしがどのようにそれを決めたかに
関する要因を説明します。

全部を片付けるのにはちと馬力が不足していたので途中ですが、ぼちぼち追加していきます (たぶん)。 かなり原著者よりに訳したので参考程度に(笑) そうでなくても誤訳をやらかすのは年中行事なのでそのへんよろしく。

デバッグではじめるCプログラミング

なつたんさんもこの本について書きました (なつたん: デバッグではじめるCプログラミング) し、 あまり細かいところをチェックして回っても面白くないので この辺でひとまとめとします。 なつたんさんと重複するところもありますがそれは気にせず。

これは著者というよりも編集側の努力不足といえるのかもしれませんが、 処理系の入手のところでたぶんCPadに関してだと思うのですが

本書の執筆時点では、作者のサイトからダウンロードできないようです。インターネットを
よく探すと見つかりますから、検索サイトなどで調べてみてください。
  

と脚注があります。しかし、この本の想定読者を考えれば(考えなくても、ですが) ちょっと読者に頼りすぎという気がします。 筆者の環境でだけなんらかの原因で接続できないとかいうことではないのか ということも含めてきちんと調査しておくべきだと思います。 出版ぎりぎりでダウンロードできないことが発覚したという事情があるかもしれませんけど。

使用するコンパイラが Borland C++ 5.5 というのもちょっと考えてしまいますが、 手軽に入手でき、エラーメッセージ等が日本語化されていて、インストールするWindowsに 対する制限が少ないという条件を考えていくと、消去法でこれになりますかねえ。

29ページの、インターフェースが Inter-Face という表記ですが、ハイフンはいらないのでは (Interface)?

52ページ最下部の修行中の魔術師イーノ(若干二十歳) は、「弱冠」ですよね。

本書では統一されて

	for (j = 0; j < 10; j++) {
		for (i = 0; i < 10; i++) {
			....
			else if (dungeon[i][j] == 0)

のように、外側から内側に向かって i, j, k, ... と増えていくのではなく 逆になっているのには違和感があります。また、この二重ループの制御変数を使って 配列にアクセスするときも [j][i] ではなく [i][j] のように、低い次元の添え字に外側のループの制御変数を使うという意図がわかりません。 Fortranのような例外はさておいて、 メモリ上の多次元配列の配置を考えるとこれは逆だと思います。

なつたんさんは kbhit()を使っていることが気になったようですが、 これはまあ仕方ないんじゃないかと。まじめにリアルタイムキー入力を処理するのって面倒ですしね。 みんな一度はチャタリングで悩めばいいんだ :-) リコーの太田さんだったと思うんですが、その昔の fj (fj.comp.lang.c?)に 各種UNIXでkbhit()と同様のことを実現するにはというのを詳しく解説しているFAQを 定期的にポストされてる方もいらっしゃいましたね。 これ (Unix Programming Frequently Asked Questions 日本語訳 - 3 端末 I/O) じゃあないよなあ。 これか → kbhit() in Unix

kbhit() in Unix
あまりいいかげんな方法がまかり通るのを放置しておく のも問題なので、kbhit()まわりで私の
知っていること を書いておきます。1.はUNIX USER 1993 No.2に、2.は UNIX USER 1992 No.4に
執筆したもの(一部追加あり)な ので、手もとにバックナンバーがあったらご覧ください。 サン
プルコードも付属しています。

kbhit()を実現するには、大まかにいって次のような方 法があります。括弧の中はその方法が最
初に用意された システムを指しています。方法はいろいろありますが、 実際には古めのSystem 
V系UNIX(SVR2とかSVR3)を除けば ioctl()のFIONREADリクエストを使う方法かselect()を 使う方
法が利用できるようです。 

惜しい。かすっただけだ。 と、本題に戻ろう。

これもなつたんさんも言及していることですが、巻末のブックガイドについて。 あれがないこれがない。なんでこれが入っているのという疑問はさておいても (見解の相違ってもんですし)、それぞれの本について一言二言解説なり お勧めしている理由を書いてほしかったですね。 大型書店が近くにないけど読んでみたいという人に対してちょっと不親切かなと。 まあ数行の説明で買う気になるかどうかというのも疑問ではありますけど。 わたし個人の感想を申せば、リストの最後にある 「C Programming: A Modern Approach」がリストに入っている理由なりをハゲシク 知りたいです。発行が2008年になってますし洋書なので実に気になる(笑)

これ Amazon.com: C Programming: A Modern Approach, 2nd Edition: K. N. King: Books ですか。 げ。100ドル近い。 Amazon.co.jp: C Programming: A Modern Approach: K. N. King: 洋書 co.jpでも扱ってるけど壱万円越えか。

はつおんしにくいなまえをつけないでくだちい 高速JavaScriptエンジン"SquirrelFish"正式発表 - 性能アップはこれから | エンタープライズ | マイコミジャーナル

高速JavaScriptエンジン"SquirrelFish"正式発表 - 性能アップはこれから | エンタープライズ | マイコミジャーナル
SquirrelFishは最新の仮想マシン研究の結果を反映して設計されたレジスタベース、ダイレクト
スレッドに動作するバイトコードエンジン。組み込みコピープロパゲーションとワンパスコンパ
イラを使ってシンタックスツリーからバイトコードが遅延生成させるようになっている。

SquirrelFishが導入される前のWebKit JavaScriptインタプリタではほかのインタプリタがそう
であるように、一旦プログラムをパースして状態ツリーに変換してから評価する方式を採用して
いた。この方法は実行する必要のないノードを何度もパースしたりインダイレクトに処理を実行
したり、多数のデータコピーが発生するといった遅延要素が含まれている。

SquirrelFishではまずこのベースアーキテクチャを変更することなく各種高速化手法を適用、シ
ンタックスツリーという従来のアーキテクチャの性能を最大化してからバイトコードへの移行を
はじめたとされている。バイトコード化することで不要な処理を削減しノードを走査する処理が
不要となり、さらにパフォーマンスの向上が実現されたとされている。

現状で実現されているバイトコード処理は今後の開発へ向けたはじまりにすぎず、今後はコンス
タントプール命令やスーパーインストラクション、レジスタ操作を明示した操作、命令複製やコ
ンテキストスレッドなどのアドバーンストディスパッチテクニック、Windowsにおける改善など
を実現しさらにパフォーマンスの向上を目指すとしている。

SquirrelFish VMの命令ドキュメントはすでに早期版が公開されている。同発表ではThe 
Structure and Performance of Efficient Interpreters、Virtual Machine Showdown: Stack 
Versus Registers、The Implementation of Lua 5.0など高効率仮想マシン関連技術の論文が紹
介されている。興味があるデベロッパは同論文をチェックしてみるといいだろう。
MSN相談箱 小数点の誤差をなくすのは可能?[ExcelとPHP]
MSN相談箱 小数点の誤差をなくすのは可能?[ExcelとPHP]
Excel, PHP ともに最新版は、整数の和差積に関しては64bit整数で計算されます。
したがって、signed 32bit -(2の31乗)~(2の31乗-1) を考慮する必要がありません。
なので単純に10000倍して計算するとよいと回答しました。

浮動小数点計算の場合は丸め誤差が発生します。
Excelの方が精度が高くなるはずです。
ここで議論しても始まらないので、まずはやってみてください。

そうなの? >64bit整数で演算

2008年06月06日

Many men won't see the sunset

When it ends the longest day
  

■_

最近になって気がついたんですが、 Vista Buissiness って Windows Media Player はプリインストールされているけど、 こいつではDVDの再生もできないし、CDのリッピングもできないんですね(><) まあiTunesでmp3に変換してますけど、wmaなデータも作りたいんですよね。

■_ クイックソートって怖いよ?

ヒープソート - ボクノス
計算量はO(N log N)だけど、クイックソートより遅いし、安定じゃないので、あんまり活用法が
見出せないところですが、バランスの良い木の作り方がわかったので収穫アリでした。

クイックソートってある意味スゲー簡単にコーディングできる割に高速なアルゴリズムではあるんだけど、 落とし穴がそこかしこにあるので使うときには注意が必要(な場合もある)。

たとえば、既にソート済みの巨大データを食わせてみるとか、 特に逆順にソート済み(これから昇順にソートしようとするのなら降順にソートされてるもの) のを食わせてみる。 ナイーブに組んでると、再帰のレベルが(ほぼ)データの長さになるので スタックオーバーフローが簡単に起きる (で、大概の教科書にはそのナイーブなやり方しか解説がない)。

クイックソートについてのあれこれは確かこのシリーズのどこかで書かれていたはず → プログラミングの壺〈1〉ソフトウェア設計編
プログラミングの壺〈1〉ソフトウェア設計編 プログラミングの壺〈2〉人間編
プログラミングの壺〈2〉人間編 プログラミングの壺〈3〉技術編
プログラミングの壺〈3〉技術編 (ぐぐったらなつたんさんのページが引っかかった(笑) → プログラミングの壷 - Google 検索)

とはいうものの、ヒープソートでなければ。という状況はありえるのかな? 高速なアルゴリズムで、再帰が深くならない。 最悪のデータを食わせても所要時間が許容範囲にある (クイックソートは O(n^2)の可能性がある) ということならマージソートでも条件満たすよなあ。 あ、Wikipediaにしっかり書いてある

Heapsort - Wikipedia, the free encyclopedia

Heapsort also competes with merge sort, which has the same time bounds, but requires Ω(n) 
auxiliary space, whereas heapsort requires only a constant amount. Heapsort also typically runs 
more quickly in practice on machines with small or slow data caches. On the other hand, merge sort
has several advantages over heapsort:

    * Like quicksort, merge sort on arrays has considerably better data cache performance, often 
      outperforming heapsort on a modern desktop PC, because it accesses the elements in order.

    * Merge sort is a stable sort.

    * Merge sort parallelizes better; the most trivial way of parallelizing merge sort achieves 
      close to linear speedup, while there is no obvious way to parallelize heapsort at all.

    * Merge sort can be easily adapted to operate on linked lists and very large lists stored on 
      slow-to-access media such as disk storage or network attached storage. Heapsort relies 
      strongly on random access, and its poor locality of reference makes it very slow on media 
      with long access times.

ふむ。ますます使いどころがねえ(笑)

■_ そういえば

odzさんのプロフィールのところがまだ修士2年となっているのは 深い意味があったりするんだろうか? (たぶんありません)

奨励金 - odz buffer
奨励金

入社してから資格等を取得すると奨励金が出たりするのだが、昔取った資格には支給されないらしい。
仮に私が持っているものに対して支給されたら8万円くらいになるのに。

まぁ、すでに持っているものに奨励金を出しても自己研鑽のインセンティブにはならんからなぁ。

某社はそういうの一切ないですよ? 自己研鑽云々は云ってたような気がしますが(笑)

■_ future of PHP

PHP の将来

PHP の将来
ereg

POSIX (Portable Operating System Interface) 正規表現をサポートする ereg 拡張機能は、
PHP のコア・サポートから削除されようとしています。何らかの POSIX 正規表現関数を使用し
ている場合には、ereg 機能を含めることができないことによる影響を受けます。現在 POSIX 正
規表現を使用している場合には、POSIX よりも PCRE 関数の方が機能も豊富でパフォーマンスも
良いため、PCRE (Perl-Compatible Regular Expression) 関数を使うように正規表現関数を更新
することを検討する必要があります。表 1 は、ereg が削除されると利用できなくなる POSIX 
正規表現関数のリストを示しています。この表には PCRE による置き換えも示してあります。

表 1. ereg() 関数と、それらに同等な PCRE 関数
ereg() 関数	                        Similar preg() 関数

ereg(), eregi() 	                preg_match()
ereg_replace(), ereg_replacei() 	preg_replace()

へー。 まあ三種類もあるとわけわかんねーしな(笑)

■_ You should be on ruby-talk

Virtuous Code › You should be on ruby-talk
You should be on ruby-talk

Working as I do in the Rails world these days, I’m periodically reminded of the 
difference between me and most Rails programmers. That is, the fact that I came to 
Rails via Ruby, rather than vice-versa. Usually this happens when someone at work or 
in the blog world expresses delight (or perplexity) about some Ruby feature that I 
thought everyone knew about. This then prompts me to put on my best “old coot” voice 
and ramble on about “young whippersnappers” with their Rails and their fancy 
conferences and their big pants and… get off my lawn, ya darned kids!

One of the biggest disconnects for me is the fact that almost no one I know in the 
Railsverse reads ruby-talk regularly. Having gotten into Ruby somewhere between five 
and seven years ago, it’s difficult for me to imagine being a part of the Ruby 
community and not being privy to the discussions in ruby-talk. Ruby-talk was one of 
the first programming communities I ever regularly participated in (the other one was 
the Pragmatic Programmer mailing list). It was a warm and welcoming place compared to, 
say, the Perl communities of the time; full of the spirit of joyous discovery and 
show-and-tell that this amazing new language from Japan tended to inspire.

The S/N ratio has declined somewhat since some joker hooked up a conduit between 
ruby-forum and the mailing list, leading in a steady stream of Rails newbies who have 
it confused with the RoR forum. But it’s still one of the friendliest and most 
helpful programming communities out there. And nowhere else – not on blogs, not on 
Reddit, nor on Twitter – will you find better and more thoughtful discussions on Ruby 
style, idioms, alternate ways of accomplishing tasks, gotchas, and just plain fun Ruby 
tricks. And, because new Ruby libraries and frameworks are usually announced there, it’
s also a great place to find out about what’s going on in the wider Ruby universe – 
beyond Rails, beyond web development entirely.

I’m going to make a bold statement here:

If you are a developer working in Ruby, you should be reading ruby-talk.

No, let me amend that:

If you are a developer working in Ruby, you should be 
readingcontributing to ruby-talk.

Because apart from being a great place to pick up new techniques, it’s also one of 
the easiest opportunities to give back to the Ruby community. Check in from time to 
time, and if a newbie asks a simple question you know the answer to, help them out! It 
takes five minutes, and it helps perpetuate the culture of supportiveness that is a 
big part of what makes Ruby so special.

It’s easy to get involved with ruby-talk. There are multiple interfaces. There is the 
mailing list itself, which is how I interact with it. Then there is the mail-to-news 
gateway, which enables you to read it as the Usenet newsgroup comp.lang.ruby. You can 
get to it through Gmane if your ISP doesn’t provide NNTP service. Or you can interact 
via the Google Groups frontend. And finally, there’s the aforementioned ruby-forum 
gateway.

Whichever route you choose, I hope to see you on ruby-talk soon!

今はもう ruby-talk追いかけてる元気ねーっすよ(笑)

まったくまともに読んでいる時間もNEE

2008年06月05日

それに私には、ミッドウェイなどという名の軍艦が存在している事自体が許せないのだ。


佐藤大輔 征途
  

■_ MIDWAY

6/6はノルマンディ上陸作戦の開始日(D-DAY)だというのはちょっと前に書きましたが、 6/5は太平洋戦争の大きな分岐点となったとされることの多いミッドウェイ海戦のあった日でもあります。 でまあ「運命の5分間」だとかなんとかいわれたりするわけですが、 そもそもの問題として、大目標が二つあって(ミッドウェイ島の占領と敵空母艦隊の撃破)、 現場がそれに振り回されたというのが致命傷になったわけです。 上の判断ミスに振り回される下っ端はいつも辛いよね。という話 (いいのか、それで)

■_ 訂正とか補足とか

まず始めに、CやC++の場合 foo(x(), y(), z()); という関数呼び出しがあったとき、fooの引数であるx(), y(), z() がどのような 順序で呼び出されるかは決まっていません。 ただし、z() → y() → x() のような順序で呼び出してそれぞれの関数の戻り値を 得ていくのが都合の良い場合が多いので、そうしているように見えることも多いでしょう。

次にC++ の << を使ったストリームへの出力ですが、 std::cout << arg1 << << arg2 とあった場合、まず std::cout << arg1 を実行します。 そこではその実体であるところの operator<<(ostream& typeof (arg1)); を呼び出すわけですが、この関数の戻り値は ostream& です。つまり、 引数として渡された ostream& に対する出力を実行した後で それをそのまま(といってもストリームに対する操作はしているわけですが)返しています。 そうすると、

tmp = operator<<(std::cout, arg1);

なオブジェクト tmp に対してさらにメッセージを送りつけることができます。

tmp << arg2;

このように operator<<() が引数で受け取った ostream& を 戻り値として返すことで、 std::cout << 1 << 2 << 3 << のようにずらずら繋げて記述することができるわけです。

でナニが云いたかったのかというと、上記のような次第なので std::cout << 1 << 2 << 3 << というのがあったときに右側(連結したものの尻尾側)から呼び出していくということはない。 ただしこれによる一連の呼び出しを

    std::endl(operator<<(operator<<(operator<<(std::cout, "hello, "), "world"), " (" __DATE__ ")"));

のように「最適化」して書いてしまうと、この例では operator<< に渡す第二引数が文字列リテラルなので問題ありませんが、ここが func() のような関数呼び出してあった場合にはこれはここで一番最初に書いた foo(x(), y(), z());と同じことで、 それぞれの func() の呼び出し順は保証されません(たぶん)。 ですので、ある環境でこうだったから、ということがいつでもどこでも成り立つとは限らない。 ということにご注意という次第。

■_ 間違いだという指摘ではないです

ふと気になったので、 「二分検索」と「二分探索」でぐぐってみる。

ふむ。探索の方が優勢? 自分も教科書では「探索」で教えられたような気がする。

めんどくさいので、日本語として「検索」と「探索」がどのように違うのか、 同じなのかを調べたりはしません :-)

が、自分はどのようにこの二つを使い分けているのだろうかと疑問に思ってみたり。

■_ XSS

ネット上のお買い物で二箇所ほど立て続けに、XSSの危険性ありと NoScriptが判定してしまって 設定を変えるまで二進も三進も行かなくなってしまったという状態に(しばらく気がつかなかったw)。 そんなに XSSの危険性があるような(具体的にどういう根拠でそのような判定をしたかは 見てないのですが)サイトが多いのだろうか、それとも単なる偶然だったのかとしばし考える。 とはいうものの、そんなにたくさんのネット上のショップを渡り歩いているわけでもないので 意味のある結論は出せないでしょうけど。

Every language tells a story | LispCast
Every language tells a story

Tue, 06/03/2008 - 08:41 — eric

I'm interested in marketing. I don't know why. I guess I like the idea of engineering ideas. 
I particularly like Seth Godin. He explains things in a way that I like. It's simple and 
practical---as opposed to how a lot of marketing books are.

One of the things he harps on is the need for a compelling story. These days, people want an 
authentic message in which to believe. They need a way to fit the idea into their life.

Programming languages have stories, too. They influence your choice of language more than you 
might think. They are not necessarily organized marketing efforts. The stories are more of an 
amalgamation of context from the culture at large.

プログラミング言語にもまた、story があります。
あなたが選んだ言語の影響というものは、あなたが考えるよりももっと大きいのです。



Let's take a look at a few stories.

Java: Java's story has changed a few times. It used to be 
"Java will let your toaster talk to your washing machine." 
That 90's idea of appliances having conversations (about what?) 
died, and in came the "applet". Blech! Now Java has a new story
---something that people actually want.

Javaのstoryは何回か変わっています。
そのstoryは “Javaはあなたの使っているトースターが洗濯機に話しかけるようにするでしょう”
といったものに使われています。

Java tells a story about corporate support. About Object Orientation. About your apps running on 
any platform. About powerful tools. And a lot of university research is using Java now.

Javaは企業サポートという story を語りかけています。
オブジェクト指向に関して。
あなたが書いたアプリがどのプラットフォームでも動作するということについて。
強力なツールについて。



Ruby: Ruby's story is very simple: Ruby makes programming fun and neat. Elegance combined with 
readable syntax. Power through simplicity and powerful abstractions. You won't believe you ever 
programmed in anything else.

Rubyの storyは非常に単純です。
Rubyはプログラミングを楽しく neatなものにします。
読みやすい構文ときれいに結び付けられています。



Perl: Perl tells the story of hacker culture. It's a story of rebellion against the tyranny of 
mainstream languages. A story of Unix glue. Of making easy things easy. Of short programs and fun 
hacking. Of staring in awe at what some other programmer wrote---and how incomprehensible it is 
that a person could have emitted code like that.

Perlはハッカー文化の storyを語ります。
その story はメインストリームの言語のtyranny(圧政)に対する反抗です。
Unix glue の storyです。
簡単なことを簡単にします。
短いプログラムとハッキングを楽しむこと


Python: Python's story is one of elegance, design, and power. Python's library is standardized 
and constantly growing. It comes with batteries included. It's readable and eminently clear. 
You'll be more productive.

Pythonのstoryは elegance, desing, power のひとつです。
Pythonのライブラリは標準化されていて順調に成長しています。
batteries included なのです。
Pythonのプログラムは読みやすく、とても明快です。
あなたはさらに productive になるでしょう。


C: C's story, whether there's anyone from the C camp is telling it or not, is one of standards. 
C is fast. Nobody faster. Except maybe ASM. But that's just silly. C is the standard for systems 
programming.


Cは高速です。これよりも速いものはありません。おそらく唯一の例外はアセンブリ言語です。
しかしそれは些細なことにしか過ぎません。
Cは標準のシステムプログラミング用言語なのです。


C++: C++'s story is that it's C with more power of abstraction and code reuse through object 
orientation.

C++ の story は Cのそれにより強力な抽象化の力と
オブジェクト指向を通じたコードの再利用です。


Scheme: Scheme tells of minimalism, of elegance, and power. It's a good language for experimenting 
with programming languages.

Schemeは minimalism とその elegance、そして力について語ります。
Schemeはプログラミング言語についての実験を行うのに良い言語です。


Haskell: Haskell tells a tale of type systems. That typing is important. That typing is the 
program. And a clear separation of state change from purely functional elements.

Haskellは型システムの物語を語ります。
型付け(typing)は重要です。型付けとはプログラムです。



Common Lisp: Common Lisp tells a long story. It weaves a complex story of power and expressivity. 
That it is--in some way--the mother language. That other languages learn from it. But why not 
come to the source? The story has a twist--that not only did Lisp do it first, but it will 
outlast the other languages. They are just fads. And parentheses are a good thing.

Common Lispが語るのは長い storyです。
Lispは power と expressivity の複雑な物語をつむぎます。
それはつまり、ある意味でLispは母語である(mother langage)ということです。
他の言語はそこから学ぶのです。



The Common Lisp story is sometimes seen as arrogant and stubborn. Hence the name "smug lisp 
weenie". But whether Lisp was the source is not the real issue. The issue is whether it's a 
compelling story. Does it speak to people's self-image and needs?

Common Lispのstoryは arrogant(尊大、威張り散らした) だとか
stubborn (頑固な) なものとして見られることがあります。

Lispがソースであったかどうかということは実はたいした問題ではありません。
重要なのは、それが compelling story であるかどうかです。


But Common Lisp's story is more complex than I can express here. All the stories are, of course.

しかしCommon Lispのstoryはわたしがここで説明できるよりももっと複雑なものです。


I'd like to point out a few compelling pieces of the story:

Paul Graham's On Lisp tells a compelling story about how and why macros are so powerful. This is 
probably the best account of something Lispers have been trying to say for years.

Peter Siebel's Practical Common Lisp turns the idea that Lisp is academic and impractical on its 
head. It presents Common Lisp as an ultimately practical language---more practical than many, in 
fact. It gives a good argument (in code even!) for why Lisp doesn't need so many libraries---they 
are easily coded up from scratch.

Kent Pitman's Answers on Slashdot (and here) explain very cogently what and why Lisp is. His story
is implicit: that Lisp's benefits can be explained and that not all Lispers are weenies.

There are probably many more great stories out there.

I'd like to point out one that I recently came across. I was impressed by the story told by 
newLisp. Check out their logo:

.

This story rides on the idea that programming in Lisp is fun---which is true. It explicitly 
asserts that newLisp is focused mainly on fun.

ウイルスびっくりテクノロジー(3) 正体を隠す工夫:ウイルスびっくりテクノロジー ウイルスびっくりテクノロジー(2) 感染を広げる工夫:ウイルスびっくりテクノロジー ウイルスびっくりテクノロジー(1) 進化するウイルス:ウイルスびっくりテクノロジー おっさんホイホイとしての Code Complete と,近くにあっても気付かない guard 句の話 - NyaRuRuの日記 はてブの技術情報だけを追いかけるサービス開始、翔泳社 - @IT 【コラム】趣味的第一種接近遭遇 (46) 抱き枕工場! 彼女たちは栃木の爽やかな一室で生まれていたの巻(後編) | ホビー | マイコミジャーナル 開発者注目のはてなブックマーク:CodeZine 2008-06-05 - プログラミング日記 名前と値 海外で使うときにはちょっと気をつけたい7つのジェスチャー - GIGAZINE Geekなぺーじ : IPv4アドレス枯渇についてNTT Communicationsさんに聞いて来ました 廃れないテクニック ― ペーパー・プロトタイピング - Radium Software 上司の高圧的態度が,強いストレスに。この先乗り切れるかどうか不安です。:ITpro Turbo C++ Explorer:ITpro ファイルハンドルをめぐる冒険(ただしマニア向け) - daily dayflower アルター、プラグスーツ姿なのにどこか艶めかしい「綾波レイ」を10月に発売 | ホビー | マイコミジャーナル iPhoneは(とても)売れるだろうという話 - 脇見運転 The Lazy Programmer » C++: Using Boost ranges to simplify enumerations Karetta|改良工事 京急蒲田駅 ホーム

UTF-8でのキャラクタの数え上げ

なんか別のエントリが redditに。 Even faster UTF-8 character counting

Even faster UTF-8 character counting
Even faster UTF-8 character counting

I recently came across two articles, "Counting characters in UTF-8 strings is 
fast" by Kragen Sitaker, and "Counting characters in UTF-8 strings is 
fast(er)" by George Pollard, which provide a series of successively faster ways 
of (as the article names suggest) counting the number of UTF-8 characters in a 
NUL-terminated string. We can do better.

最近わたしは、Kragen Sitaker による
"Counting characters in UTF-8 strings is fast"
と George Pollard による
"Counting characters in UTF-8 strings is fast(er)"
という二つのアーティクルをみました。これらはどちらも、ナル終端されている
文字列に収められているUTF-8フォーマットのキャラクタの数を高速に数える
という手順について書かれたものです。
Even faster UTF-8 character counting
This can be improved in three ways:

    * Instead of using conditional branches, identify the initial bytes of UTF-8 characters
      using logical operations only.
      条件分岐を行うのではなく、UTF-8のキャラクタの先頭バイトを見分けて
      論理演算だけを使用する。
    * Instead of handling one character at once, vectorize: Handle lots of bytes in parallel.
      一度にひとつのキャラクタを扱うのではなくて、ベクター化して多くのバイトを並行して扱う。
    * In order to reduce the cost of waiting for memory, prefetch data if possible.
      メモリからのデータ取得待ちのコストを低減させるために可能な限りデータをプリフェッチする。

Making these improvements gave me the following code:
これらの改良により以下のコードが得られた:

#define ONEMASK ((size_t)(-1) / 0xFF)

static size_t
cp_strlen_utf8(const char * _s)
{
	const char * s;
	size_t count = 0;
	size_t u;
	unsigned char b;

	/* Handle any initial misaligned bytes. */
	for (s = _s; (uintptr_t)(s) & (sizeof(size_t) - 1); s++) {
		b = *s;

		/* Exit if we hit a zero byte. */
		if (b == '\0')
			goto done;

		/* Is this byte NOT the first byte of a character? */
		count += (b >> 7) & ((~b) >> 6);
	}

	/* Handle complete blocks. */
	for (; ; s += sizeof(size_t)) {
		/* Prefetch 256 bytes ahead. */
		__builtin_prefetch(&s[256], 0, 0);

		/* Grab 4 or 8 bytes of UTF-8 data. */
		u = *(size_t *)(s);

		/* Exit the loop if there are any zero bytes. */
		if ((u - ONEMASK) & (~u) & (ONEMASK * 0x80))
			break;

		/* Count bytes which are NOT the first byte of a character. */
		u = ((u & (ONEMASK * 0x80)) >> 7) & ((~u) >> 6);
		count += (u * ONEMASK) >> ((sizeof(size_t) - 1) * 8);
	}

	/* Take care of any left-over bytes. */
	for (; ; s++) {
		b = *s;

		/* Exit if we hit a zero byte. */
		if (b == '\0')
			break;

		/* Is this byte NOT the first byte of a character? */
		count += (b >> 7) & ((~b) >> 6);
	}

done:
	return ((s - _s) - count);
}

あとでゆっくり読もう。

NetBSD 絹の日記 インターフェース 2008/ 7 月号特別付録

例えば最近人から newlib の話を聞いていたが、良く理解していなかった。 それについても書
いてある。 

を? それは一度目を通してみなければ。>newlib

OPC Diary: フツウのプログラマがフツウに評価される社会を夢見るをよんでみた。

雑誌も本も売れないはずです。読む必要がないとみんな思ってるんだから。

おっと忘れるところだった

sumim さん MagLev について調べてみた - sumim’s smalltalking-tos と jijixiさん jijixi's diary - 与えられた木から、子→親への対応を作る , 娘フロ。 , 良い機会だから sexplib をもう少し勉強しようかと思った に感謝。

名前の元がリニアモーターカー(のようなもの)というのは意外でした。 Railと関係するようでしていない。というところなんでしょうか。

C++0x 3 [bbs2chreader]

698 デフォルトの名無しさん [sage] Date:2008/06/04(水) 13:39:48  ID: Be:
    C++0xはそろそろJavaの時のような誇大広告を始めて盛り上げるべき。 

699 デフォルトの名無しさん [sage] Date:2008/06/04(水) 13:52:25  ID: Be:
    どんだけ人集めてもmove semantics見たらみんな引くって。
    大衆には見向きもせずプログラミング言語の実験室として頑張っていただきたい。 

700 デフォルトの名無しさん [sage] Date:2008/06/04(水) 14:03:10  ID: Be:
    もはや C++ 自体が大衆向けじゃないよな。
    でも、必要としている一部の人間のために頑張って頂きたい。w 

701 デフォルトの名無しさん [sage] Date:2008/06/04(水) 14:05:12  ID: Be:
    まずはまともな処理系を、話はそれからだ 

702 デフォルトの名無しさん [sage] Date:2008/06/04(水) 14:11:26  ID: Be:
    Move SemanticsとかVariable TemplateとかConceptとか、
    ライブラリを書く奴のための機能だから、
    一般ピーポーが覚える必要は無いんじゃない?

    とは言ったものの、どうやって実装しているか分からないと、
    俺としては、使う気にならなかったりするから微妙だ。

    STLヤベー、超便利ー。
    ↓
    イテレータとか関数オブジェクトとか分からん。勉強するか。
    ↓
    いわゆる、STLの解説本とかではまともに説明されてねー。何コレ。
    ↓
    テンプレート解説本なら詳しく載ってる。やっべ、スゲー詳しい。面白れー。
    ↓
    Boostたのしー。
    ↓
    あれ、当初の目的って何だっけ?
    STL? デザインが貧弱すぎじゃね? あれって。

703 デフォルトの名無しさん [sage] Date:2008/06/04(水) 16:25:03  ID: Be:
    素人の人たちに受けのいい機能も少し追加されたんじゃない。
    auto とか。 

704 デフォルトの名無しさん [sage] Date:2008/06/04(水) 16:26:10  ID: Be:
    conceptだってコンパイル・エラー見やすくなるしね。

705 デフォルトの名無しさん [sage] Date:2008/06/05(木) 04:01:49  ID: Be:
    今回は入門者のためにもなる改良がたくさんあるとどこかで聞きました 

706 デフォルトの名無しさん [sage] Date:2008/06/05(木) 14:58:46  ID: Be:
    c++であと10年は持つのかな
    すでにフォートラン化しはじめてる? 

707 デフォルトの名無しさん [sage] Date:2008/06/05(木) 16:44:53  ID: Be:
    当分、いろんな意味でC++を越える言語は出てこないだろうな。 

708 デフォルトの名無しさん [sage] Date:2008/06/05(木) 20:08:45  ID: Be:
    export イラネ
    予約語から外してほしい 

709 デフォルトの名無しさん [sage] Date:2008/06/05(木) 20:23:20  ID: Be:
    export の実装って結局二度以上同じソースをコンパイルしてるだけだからな
    prelink 工程というのがあってそこで全部解決するまで再帰的にコンパイルしつづける

    関数がインラインにならないという効果はあるがそれ以上の利益はない気がする 

710 デフォルトの名無しさん [age] Date:2008/06/05(木) 21:53:24  ID: Be:
    >>706
    FORTRAN 77とは全然違う。
    FORTRAN 77は数値計算の世界では現役のまま陳腐化した。
    C++0xは現役のまま最先端を走り続け、プログラマを置き去りにし続けてる。 

711 デフォルトの名無しさん [sage] Date:2008/06/05(木) 21:55:37  ID: Be:
    置き去りかよw 

712 デフォルトの名無しさん [sage] Date:2008/06/05(木) 22:04:19  ID: Be:
    道を踏み誤りつつあるマッドサイエンティストみたいなもんだな 

713 デフォルトの名無しさん [sage] Date:2008/06/05(木) 22:04:26  ID: Be:
    exportは後々autoみたいに役に立つ日がくるのでほっといてやってください

714 デフォルトの名無しさん [sage] Date:2008/06/05(木) 22:53:05  ID: Be:
    >>710
    > C++0xは現役のまま最先端を走り続け
    「他言語に出来ることが出来ないので悔しい」
    って、入れた機能がほとんどじゃないかい?

715 デフォルトの名無しさん [sage] Date:2008/06/05(木) 22:53:25  ID: Be:
    >>10
    Fortran2008は結構強烈だぞ? 

716 デフォルトの名無しさん [age] Date:2008/06/05(木) 23:00:35  ID: Be:
    >>714
    conceptはHaskellだけじゃない、似てる機能があるのは。
    しかもそれは後から分かったことだし。
    traitsを置き換えるために生まれた。

    move semanticsだってかなり狂ってるしね。
    明示的なメモリ管理がある言語で導入するとは。 

717 デフォルトの名無しさん [sage] Date:2008/06/05(木) 23:50:13  ID: Be:
    C++ はあまりお作法がない言語だったと思っていたんだが、今は作法が大杉って困る 

718 デフォルトの名無しさん [sage] Date:2008/06/06(金) 00:03:11  ID: Be:
    意味が不明瞭だ
    お作法って具体的にはどういうこと? 


Fortran 2008なんてあるのか! 90以降地道にあがっていってるような気がする (90→95→2000→2003?)

2008年06月04日

■_

ホイホイに引っかかってみる。

MicroVAX。わたしもいぢくったことがあります(大学で)。 ゼミ(研究室)の教授の伝手でなぜか?入ってきた代物で、大学の管理課が自分のところで 手におえないからとかで押し付けられたらしいです(笑) とはいえ、OSはVMSのまんまでしたんで、あまり遊べませんでした。が、 UNIX以外のOSを触ったというのは結構良い経験だったかもしれない。と思ったり思わなかったり。 今いじくれるのだったら骨までしゃぶり尽くすのになあ(笑)

わたしのEthernet経験はほぼCheerperNet(10BASE-2)からで、 トランシーバとかも見たことはありますが実際に使ったことはありません。 CheeperNetで組んだLANでどこかのケーブルが断線したとかのアクシデントがあると大騒ぎになる というのは今の若い人は知るまいw(おぢさんもーど)

しかしみんな(ってどーゆー範囲で?)LispとかSchemeとか結構書けるんだねえ○| ̄|_

昨日はごたごたしてて書き漏らしていたんですがしっかり買っております。 マクロスフロンティアO.S.T.「娘フロ。」

6/25発売の 星間飛行
星間飛行 に中島愛バージョンの「愛・おぼえていますか」が収録されているので非常に楽しみ。 ラジオで一回聴いただけだけど、 オリジナル(飯島真里の最初の奴ね)を除けば一番いいと思う。 上手いとか下手とかじゃなくて(ヘタじゃあないと思うけど)、 聴いてていいなあ思える。 これまでいくつかでてたアレンジ版とかRe-Mix版はどれも気に入らなかったw そのほか一緒に買ったもの。
DJCD さよなら絶望放送 第3巻 「ひだまりスケッチ」ファンディスク/もうすぐ!「ひだまりスケッチ×365」 【完全生産限定版】 ひだまりラジオ×365 ラジオCD ゆめデリバリー
ゆめデリバリーは気にいった。 朝の目覚めに使いたいくらい(笑)

日経コンピュータ、アキバの(書泉)ブックマートで無事買えたんですが原因の解説のくだりを読むと、 単なるテスト不足が原因ではないというのは漏れ聞いたとおりでしたが バージョンの管理ミスってのもちとちがうような? いずれにしろ連絡(コミュニケーション)不足というのは云えるかもしれません。

■_ 24bit?

めもがき:2008年6月3日分
○[NetBSD] nvi-1.81.6 その3くらい

yamtさんから新しいnviってi18n的に大丈夫かどうかreviewを依頼されたので
先日ざーっとソース眺めて発見した怪しげな部分を報告したり。

    * ISO-2022だと正常に動作しない
    * マルチバイトなテキストを開くとカーソル位置がズレる
    * iconv_open(3)に"WCHAR_T"とかGNU libiconv依存?
         *      *
        *  ウソです  +
           n ∧_∧ n
       + (ヨ(* ´∀`)E)
            Y     Y    *
      conv_enc()に"WCHAR_T"が指定された場合は、iconv_open(3)を呼ばずに
      処理抜けてると逆に指摘されました、よってiconv(3)の使い方は問題なさそです
    * regex(3)回り、multibyte.hでwchar_tの最大値を0xFFFFFFつまり24bitに
      制限してるので、現状ではGB18030とかISO-2022は正常に動作しなさげ。
    * :set allした時に表示されるoption一覧が壊れてる

といったとこ。

24bitとはなんと半端な。と一瞬思ったものの、20bitなUnicodeを収めるのには十分。 68000のアドレス空間が24bitでありつつ プログラムカウンタが32bit幅(下24bitだけ有効)だった時代のテクニックよろしく 8bit+αをなにかごにょごにょするためのスペースにしてるんでしょうか。 と妄想したり想像してみたり。
#ホントにそれやるとあとで泣く人が出ると思うkedo。

               /      /,_ュ_>、     \ 
              /       | ヽ  ン' |        \ 
               l      ,. 、 -‐l ゚i(○)i!゚ l- 、,,_       ヽ 
             \  /      ヽ、`'''゙ ノノ   `'ヽ、    / 
                `| __,..   -_‐ ニニニ ‐_- 、 _  l ,.-'゙ 
                   〈.r '' ´          ` '' -={} 
                 /:::!`ァ- 、..,,____,,,.. -、,''゙ソ:::ヘ 
              /:::::l ゙ ,.r=  `  ´ ァ=-、 ` l::::_ィ 
                  〈ヽ|  '゙  ノ  i  丶       l/,' | 
.   , ‐ 、         | 〉!       l            l | リ  見なかったことにしよう! 
.   ヽ.   ヽ         ヽ`|      l   _         k/ 
.      ヽ   ヽ       l」   ,    `    ヽ   l-゙ 
        ヽ.  ',     / ̄〉 ヘ  ' 、ー――一ァ   / 
        ',   '、, べ、 l   ヽ   ヽニニニシ   / 
        ゙, /  _ ヽ!    lヽ   -―-   /l 
.         У_. イ ヽ  〉  _,| ` 、       /  l_ 
         ノ ´_,. ‐ ヽヽ/;  / ヽ    ; ̄ ̄   ,.イ l 
          |       ヽ | Lノ   \_  ヽ  _,.ィ´   L_ 
        |   `´〉  /  ! l      フー/     / `〈_` ' ‐ 、 
        _」    ゝ,l_|  l ヽ     / ̄ ̄ヘ    /    ` ' - 、`tォ、,_ 
     ,.ィ「|,,.ゝ、    ヽ.  l  ヽ  ∧   ハ   /           `' -、 /ス、 
.    /Y゙´   ヽ     l  l  ヽ. / 〉t‐ 〈 ヽ/                 ` - ト、 
   /  |      |     | l    `  l |  |                   |  i 

■_ redditに訊け!

その1 I'm looking for a good book to help me improve from my current working knowledge of Python that isn't Dive Into Python (since I've already downloaded it). Does anyone have any suggestions? http://reddit.com/info/6ly5g/comments/ Dive Into Python 以外のいいPythonを解説している本を探しています (Dive Into Pythonは既にダウンロード済みです)。 誰か良い候補を挙げてくれませんか?

Text Processing in Python is excellent, and freely available online. The appendix that 
succinctly describes the entire Python language is worth looking at too.
  

へえ。

その2 Dear Rubyists, When do you (not) use parentheses, and why (not)? 親愛なるRubyistの皆さん。あなたがカッコを使うときはどんなときで使わないのはどんなときですか? そしてその理由は?
結構みんなそれなりに基準を決めているんだねい。

I use it when I have nested parenthetical arguments and when I want to show expilicit 
behavior or associations.

I don't use them when I don't have to.
  

ふむ。

■_ 期待はずれ

Counting Characters in UTF-8 Strings Is Fast

On IRC, Aristotle Pagaltzis was pondering how much performance variable-width 
encodings such as UTF-8 actually cost, because it's commonly suggested that 
fixed-width encodings such as ISO-8859-1 and UCS-4 are much faster.

He suggested:

    Huh, it just occurs to me that strlen is not at all expensive on UTF-8-encoded 
strings. Not exactly as fast, but if you write it in asm, it only takes one extra 
instruction to count characters in UTF-8 vs those in an 8-bit encoding, per character. 
So, if you factor in cache misses, it should make no measurable difference. All you 
lose with a variable-width encoding is direct random access to arbitrary indices in 
the string, which is basically a non-use case.

It turned out that he was partly wrong, but mostly right. And along the way, we 
discovered that GCC's standard implementation of strlen was quite pessimal.

I'm using Linux on a 700MHz Pentium III laptop with GCC 4.1.2, using just the -O flag 
unless otherwise specified.

どんなやり方だろうと期待してみたら、アセンブリ言語で書いて速くしようとか そういうレベルの話でしょぼーん。

Counting Characters in UTF-8 Strings Is Fast
Conclusions

   1. GCC is better at writing x86 assembly than I am. No surprise there. Even when its inner 
      loop is 10 instructions, it beats my three-instruction inner loops for speed.

      GCCはわたしがアセンブリ言語で書いたものよりも優れたコードを吐いた。これは驚くような
      ことではない。内側のループが命令十個のものだったとしても、

   2. Aristotle is better at writing x86 assembly than GCC is.
      Aristotle は gccよりも優れた x86アセンブリコードを記述した。

   3. Aristotle was essentially correct: the penalty for counting UTF-8 characters, or indexing 
      into or iterating over the characters of a UTF-8 string, is very small.
   Aristotleは正しかった。UTF-8でキャラクタを数えることやインデクシングすること、
      キャラクタ単位でなめていくことのペナルティは非常に小さいものである。

   4. there is a speed penalty. Although GCC's built-in strlen is much slower than Aristotle's 
       function, a straightforward byte-counting C strlen compiled with optimization is faster still.

      動作速度に関してのペナルティがある。GCCの組み込みのstrlenは Aristoleの記述した関数よりも
      格段に遅く、莫迦正直にバイトで数えるCのstrlenを最適化をかけてコンパイルしたものに比べても
      遅い。

5.    GCC should change to use the straightforward byte-counting C strlen instead of what it 
      currently inlines. The version of strlen that GCC inlines is worse than the one it compiled 
      from C in every way: it's more instructions, more bytes of machine code, four times slower, 
      and uses more registers (one of which is a callee-saves register!).

   6. People probably shouldn't worry about the efficiency of counting and iterating over 
      characters in UTF-8 strings, at least not if they were using null-terminated C strings before.

      ユーザーはUTF-8文字列に対するキャラクタ単位の数え上げや繰り返しについての効率について
      気にしないほうが良い。

■_ Maglev?

なんかredditとかでやたらとこの“Maglev”ってのが引っかかったんですが、 ナニモノなんでしょうか?

Patrick Collison ≫ blog Sho Fukamachi Online ≫ Blog Archive ≫ Maglev and the naiivety of the Rails community The Exciter: What's interesting about MagLev
Sho Fukamachi Online ≫ Blog Archive ≫ Maglev and the naiivety of the Rails community

So there’s been some presentation at Railsconf 2008 about a product called “Maglev
“, which is supposedly going to be the Ruby that scales・(yes, they actually use the 
trade mark). This new technology is going to set the Ruby world on fire, it’s going 
to be the saving grace of all Rails’ scaling problems. It’s going to make it 
effortless to deploy any size Rails site. Its revolutionary shared memory cache is 
going to obsolete ActiveRecord overnight. It runs up to 60x faster than MRI. And it’s 
coming Real Soon Now.

Railsconf 2008では、“Maglev”と呼ばれているプロダクトに関する幾つかのプレゼンが
ありました。これ(Maglev)はRubyをスケール(TM)させようとするものです。
この新しい技術はRubyを world on fire に置こうとするもので、
すべてのRails の scaling problem による恩恵(?)を抑えようとするものです。
あらゆる規模の Rails サイトのデプロイ(deploy) を苦労せずにできることを目指します。
その画期的な共有メモリキャッシュ(revolutionary shared memory cache)は
ActiveRecord overnight を時代遅れにするでしょう。
Maglevは MRIに比べて最大で60倍高速です。そしてまもなく現実のものとなります。

訳してみてもよくわかんにゃい…

ふむ。パターンマッチを使うとすっきり書けるっぽいなあ。 ということでjijixiさんにOCaml版を(ry (調子に乗杉でs)

観ている時間なんてNEEEE!

rake 全然知らないのよねん。

あとで(ry

東映アニメーション研究所 | 富野由悠季氏・特別講義(2008年)・3 なせる、スクイーク: なんですとぉ、Javaですとぉ! ねんどろいど

[データセンターを疑似攻撃]クロスサイト・スクリプティング,SQLインジェクション:ITpro
この検証実験も現場スタッフに秘密裏に行うため,
「オデッサ作戦」
という暗号名で呼んでいる。その結果は,次週に報告する。

砂漠に蝶は飛ぶのか?
砂漠に飛ぶのはサボテンのトゲ

RailsConf 2008まとめ(簡易版) - masayangの日記(ピスト通勤他
The Worst Rails Code You've Ever Seen (And How Not to Write It Yourself)

    * いわゆる「汚い」コードの数々と、そうならない・そうさせないためのTips集
    * 悪い例
          o Integration of concerns...一つのメソッドでなんでもやっつける
          o Premature deoptimization...半端な非最適化(笑
          o Application-wide actions...どのリクエストでも必ず実行されるメソッド...
          o 巨大コントローラ...1130行の実例を見せてもらった!
    * SmallTalkを知っているベテランを探し出せ。そして、その人と若手とでペアプロさせるのだ。
          o 日本だと無理っぽい。

sumimさん出番ですw

An Agile Way > Scott Ambler と ソフトウェア開発のメタファについて話をした。 : ITmedia オルタナティブ・ブログ

「建築や土木をソフトウェアのメタファと捉えるのではなく、今一番近いのは、映画を撮る、と
いうモデル。予算が決まって期限が決まる。すると、人を集めて、撮り始めるが、途中で人が抜
けたりテーマが変わったり、予算がなくなったりする。映画の成功は、計画どおりに行ったかで
はなく、その映画が売れたかどうか。予算どおり、納期どおり、ストーリーどおりに映画を作っ
たとしても、それが売れなければ失敗だ。従来のソフトウェア開発のやり方だと、予算どおりに
期限どおりに仕様どおりにできた。でもまったく使い物にならないソフトウェアができた、とい
うことが簡単におこる」 」
雇用流動性と解雇規制は無関係 - カレーなる辛口Javaな転職日記

巨大なパズルの中から,自分の好きな一ピースだけ持ってきたって役には立たないよ.
郵便会社が電気自動車へ切り替え - kmoriのネタままプログラミング日記

タダの昼飯なんてものはどこにも無いのである。このぐらいの原油高騰で騒ぐのなら「二酸化炭
素排出削減」なんて口にするのはやめたらどうか。
Show's Hot Corner
森巣さんに戻って、今回の話は、なぜ、日本人は英語ができないのかという テーマだけど、そ
れは、日本政府や報道機関の陰謀だろうと。\(^O^)/  つまり、国民みんな、英語ができると、
日本政府や新聞やテレビのフィルタ がかかってない海外の情報を直接知ることができて、政府
や新聞やテレビに都合が悪いと。\(^O^)/

2008年06月03日

■_

デジカメのシャッター音。
よからぬこと(盗撮とか盗撮とか盗撮とか)に使えないようにということでシャッター音が あれだけでかくなっているんだろうけど、 もうちょっとなんとかならんのかと思うことしばし。 まあメーカーとかモデルによってはごにょごにょするとシャッター音が でなくなるようにすることもできる場合があるとか聞いたことがあるけど。 あ、それは携帯電話のカメラ機能の話だったカナ?

カメラといえば、一眼レフ(銀塩の方ね)のフィルムを巻き上げるときのあの音が好きなんだけど もう聞く機会なんてないだろうなあ。一応某社製の一眼レフを持ってたりしますが、 フィルムの巻上げはモーターがやってくれちゃいますので(笑)

二週間てのは大概だと思うけど、DELLって全世界からパーツ引っかき集めてシンガポールあたりで 組み立ててるんじゃなかったでしたっけ? まあ全世界つーても、ある程度固まってるでしょうけど。 マザボは台湾で、RAMが韓国で、とか。

■_ まくろ

何ヶ月か前に、Win16時代のMFCはマクロを酷使しているとなかんとか書いたなあと 梶本裕介の日記 を読んでふとそんなことを思い出したり。

最近はどーなんだかねーと思い調べようとしたら、 あららVS2008はまだインストールされてない(そもそも買ってません)し、 VS2005も今使ってるマシンに入ってるのはEEだからMFCないぢゃんw つーことで2003とかで見てみました。

/////////////////////////////////////////////////////////////////////////////
// Message map

#define BEGIN_MSG_MAP(theClass) \
public: \
	BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \
	{ \
		BOOL bHandled = TRUE; \
		(hWnd); \
		(uMsg); \
		(wParam); \
		(lParam); \
		(lResult); \
		(bHandled); \
		switch(dwMsgMapID) \
		{ \
		case 0:


(ry


#define END_MSG_MAP() \
			break; \
		default: \
			ATLTRACE(ATL::atlTraceWindowing, 0, _T("Invalid message map ID (%i)\n"), dwMsgMapID); \
			ATLASSERT(FALSE); \
			break; \
		} \
		return FALSE; \
	}

#define ON_WM_CREATE() \
	{ WM_CREATE, 0, 0, 0, AfxSig_is, \
		(AFX_PMSG) (AFX_PMSGW) \
		(static_cast< int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT) > (OnCreate)) },

#define ON_WM_COPYDATA() \
	{ WM_COPYDATA, 0, 0, 0, AfxSig_bWCDS, \
		(AFX_PMSG)(AFX_PMSGW) \
		(static_cast< BOOL (AFX_MSG_CALL CWnd::*)(CWnd*, COPYDATASTRUCT*) > (OnCopyData)) },

#define ON_WM_DESTROY() \
	{ WM_DESTROY, 0, 0, 0, AfxSig_vv, \
		(AFX_PMSG)(AFX_PMSGW) \
		(static_cast< void (AFX_MSG_CALL CWnd::*)(void) > (OnDestroy)) },

あー、ちょっと思い出してきたぞ。 Win16での定義は思い出せないけど、上の例でいうと AfxSig_ほげほげ というのが 引数のパターン(WPARAMがint だとかポインタだとか、LPARAMはどうだとか そういうのを表すシグネチャ)を表していて、それによって莫迦正直にメッセージマップを 定義しないですむようにして空間を節約してたんじゃなかったっけか (昔は64kの壁ってがあったのですよん♪)。 あ、解説があるな

// Naming scheme:
// <signature> -> AfxSig_<ReturnType>_<WPARAMType>_<LPARAMType>
// <ReturnType> -> b (BOOL)
//                 h (HANDLE)
//                 v (void)
//                 i (int)
//                 l (LRESULT)

で、実際にハンドリングしているところがこう。

BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	LRESULT lResult = 0;
	union MessageMapFunctions mmf;
	mmf.pfn = 0;

	// special case for commands
	if (message == WM_COMMAND)
	{

(ry

	const AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap();
	UINT iHash; iHash = (LOWORD((DWORD_PTR)pMessageMap) ^ message) & (iHashMax-1);
	AfxLockGlobals(CRIT_WINMSGCACHE);
	AFX_MSG_CACHE* pMsgCache; pMsgCache = &_afxMsgCache[iHash];
	const AFX_MSGMAP_ENTRY* lpEntry;
	if (message == pMsgCache->nMsg && pMessageMap == pMsgCache->pMessageMap)
	{
		// cache hit
		lpEntry = pMsgCache->lpEntry;
		AfxUnlockGlobals(CRIT_WINMSGCACHE);
		if (lpEntry == NULL)
			return FALSE;

		// cache hit, and it needs to be handled
		if (message < 0xC000)
			goto LDispatch;
		else
			goto LDispatchRegistered;
	}
	else
	{


(ry


LDispatch:
	ASSERT(message < 0xC000);

	mmf.pfn = lpEntry->pfn;

	switch (lpEntry->nSig)
	{
	default:
		ASSERT(FALSE);
		break;

	case AfxSig_b_D_v:
		lResult = (this->*mmf.pfn_b_D)(CDC::FromHandle(reinterpret_cast<HDC>(wParam)));
		break;

	case AfxSig_b_b_v:
		lResult = (this->*mmf.pfn_b_b)(static_cast<BOOL>(wParam));
		break;

	case AfxSig_b_u_v:
		lResult = (this->*mmf.pfn_b_u)(static_cast<UINT>(wParam));
		break;

以下略

つまり、APIの引数のパターンが同一であれば一つにまとめる(同じ case を通る)ので 全体の分岐の数は減るけれども、きちんと型チェックはしているというわけです。

まあ良い子は忘れて良いテクニックですね(笑) …いやまあ頭の片隅にでもとどめておけば、 いつかどこかで応用できる日がくるかもしんないけどさ。 Objective-Cならこんなワザを駆使しないでも良かったのにねw (にーさんそれは云わないヤクソクです)

BorlandのOWL(ってのがあったのですよ)だとどういうやりかたしてんだろうか。 ありゃあコンパイラを拡張してて

   virtual void hogehoge(...) = [WM_COMMAND]
   virtual void mogera(...) = [WM_HSCROLL + WM_VSCROLL]

なんてな指定ができるタノシイ芸を持ってたんだけど (ただし後でこの拡張を使わないように書き直されました)。 CB Magazine – ボーランドが送り出したC/C++の歴史 About OWLNext

■_ THE LONGEST DAY

ぐち0x19 ~上司が馬鹿で困る~

694 仕様書無しさん [sage] Date:2008/06/03(火) 09:28:00  ID: Be:
    ヘルプという名の召集令状が来た。
    他チームからもガンガン徴兵されてる。
    納期は6/6、現時点での進捗は限りなく0%(詳細設計まで完了とか言ってたが何もやってねーじゃん)
    ノルマンディー上陸作戦かよ。
    しかも、本業とヘルプのダブルジョブ。

    それでは征ってきます・・・ 

695 仕様書無しさん [sage] Date:2008/06/03(火) 10:02:49  ID: Be:
    >>694
    生きて帰って来い。ネタじゃなくてマジで。 

698 仕様書無しさん [sage] Date:2008/06/03(火) 20:18:54  ID: Be:
    >>694
    あと3日で進捗0なんてもう無理じゃん。
    骨を蘇生させようとしてるようなもんじゃん。 

699 仕様書無しさん [sage] Date:2008/06/03(火) 20:42:36  ID: Be:
    そういえば 1944-6-6 はマジでノルマンディー上陸作戦の日だw
    しかし、あと 3 日で進捗 NULL って戦況はノルマンディーどころかは硫黄島並みだぞ。 

700 仕様書無しさん [] Date:2008/06/03(火) 21:00:35  ID: Be:
    進捗フフフフフフフフフフフフフフフフフフフフフフフ 

701 仕様書無しさん [sage] Date:2008/06/03(火) 21:50:35  ID: Be:
    >>694
    で、上層部は講和への道(納期交渉とか)を探ってるの?
    それとも、ほっかむりして玉砕前提なの? 

702 仕様書無しさん [sage] Date:2008/06/03(火) 22:13:20  ID: Be:
    何も考えてないとおもうけど

694のいくところが、せめてオマハビーチでありませんように…

オマハビーチ → 上陸作戦において最大の激戦区となった海岸。 映画「プライベート・ライアン」冒頭のシーンの舞台もここ。 http://www.nicovideo.jp/watch/sm45078 http://www.nicovideo.jp/watch/sm45145 オマハ・ビーチ - Wikipedia

■_ ん?

計算結果の誤差 で引用されている部分。

計算結果の誤差

ちなみに、MSDNでは以下のようなことが書かれています。
--------------------------------------------------------------------------------
Decimal 値型は、多数の有効な整数桁と小数桁を必要とし、丸め誤差を使用しない財務計算に適しています。
Decimal 型では、丸めの必要性はなくなっていません。その代わりに、丸め誤差が最小限に抑えられています。
--------------------------------------------------------------------------------

つまり、Decimal型は誤差がないわけではなく、最小限に抑えられているだけなのですね。


びみょーに誤訳の匂いがするんですが気のせいでしょうか? まあMSDNは基本的に機械翻訳だったと記憶しているので、そういうものなのかもしれないけど。 たとえば、 丸めの必要性はなくなっていません。その代わりに、丸め誤差が最小限に抑えられています ってなんかへんな感じしません? たとえばこれが、~なくなっていませんが、~抑えられています。 って繋ぎ方ならしっくり来るんですが。

原文はこの辺りかな?

Decimal Structure (System)
The Decimal value type represents decimal numbers ranging from positive 
79,228,162,514,264,337,593,543,950,335 to negative 79,228,162,514,264,337,593,543,950,335. 

The Decimal value type is appropriate for financial calculations requiring large numbers of 
significant integral and fractional digits and no round-off errors. The Decimal type does not 
eliminate the need for rounding. Rather, it minimizes errors due to rounding. For example, 
the following code produces a result of 0.9999999999999999999999999999 rather than 1.

うーーーーーん。Rather → その代わりに になっちゃってるのね。 no round-off errors が丸め誤差を「使用しない」ってのもアブナイ気がするなあ。 金融計算だから丸め誤差が「あってはいけない」んじゃないの?

■_ やり方は(ry

CitrusByte Ruby TMTOWTDI, Episode 1

CitrusByte Ruby TMTOWTDI, Episode 1
This is the inaugural post in a series that we’ll be calling Ruby TMTOWTDI (There’s 
more than one way to do it). Usually the TMTOWTDI acronym is used as a disparaging 
term towards flexible languages, which offer a myriad ways of solving most given 
problems. This series, however, aims to use this property of Ruby as an educational 
tool.

The format is as follows: we’ll present a problem, then everyone will try and write 
the most idiomatic, concise code that solves the problem in a readable fashion. This 
is not meant to be a golfing competition, nor an optimization one. However, we will 
benchmark the solutions for a rough idea on how different styles affect performance. 
For every installment we’ll have a performance winner for fastest time and a ‘style’ 
winner for the most elegant code.

This gives us at CitrusByte a better understanding of each other’s coding styles, and 
stimulates discussions about little tricks we may not be aware of. Best of all, it’s 
fun as heck to be a part of.

You can get involved too! Leave a comment with your solution if you think you can best 
the ones listed here. We also encourage you to propose a simple problem (less than 20 
lines of code to solve) for the next instalment in the series.

Since this is the first time we’re doing it, we’ve picked a very simple problem to 
solve as a quick warm-up.

Problem: given a string ‘str’ of the format

"a10 b20 c25 d40"

convert it to a hash

{'a' => 10, 'b' => 20, 'c' => 25, 'd' => 40 }

Note that the values of this hash are integers, not strings. If the string is

"a10 a20"

the output should be

{'a' => 20}

.

"a10 b20 c25 d40" のような、アルファベットに続く数字、空白を置いてそのパターンの繰り返し という文字列から、アルファベット部分をキーに、数字の部分を値に持つような ハッシュを作れというお題。 さまざまな解答が寄せられていますが、あなたならどう解きますか?

エピソード1ということなので、次もあるんでしょうね。

■_

「多重配列」ってはじめて聞くような表現だけど使われてるところもある? どうも自分の感覚としては、「多重配列」という表現から浮かぶイメージと、 多次元配列とのそれが一致しないんだけどなあ。

PHP、Python、Sambaにセキュリティ向上のお墨付き - builder by ZDNet Japan
 オープンソースプロジェクトのうちAmanda、NTP、OpenPAM、OpenVPN、Overdose、Perl、PHP、
Postfix、Python、SambaおよびTCLは、開発者が「複数クラスの潜在的なセキュリティ脆弱性」
をコードから取り除いたとして同レポートの中で賞賛されている。

 発見されたもっとも一般的なセキュリティホールは「Null Pointer Deference」の脆弱性で、
検出された脆弱性全体の28%を占めた。
RubyForge: 1-click-rails-installer-2.1.0
1-Click Rails Installer 2.1.0 has been released.

1-Click Rails Installer is a simple installer that includes Ruby,few necessary 
extensions, SQLite, and Ruby on Rails.

For more information, please see release notes.
2008年 6月 (1)。
とりあえず、どうしても低水準のコードを書かなきゃいけないときは、 新山は次のような原則
でやっている:

   1. とにかく愚直な、泥臭いコードにする。(ようするに djb風)
   2. 可能なかぎり文字列処理を避ける。
   3. マクロやテンプレートのようなものが必要だと感じたら、それは自分の設計が根本的に間
      違っているのだ。 

とくに 3. は重要で、新山は Python でもアクロバティックな技法を避ける傾向があるし、 も
っといえば、日本語に対してさえ似たような原則を持っている。つまり、常識的に考えれば、 
人間界の物事は必ずつねに「平易な言い回し」で説明が可能なはずだ、という信念である。 平
易な言い回しができないのは、自分の頭が悪いからだ。 しかし一方で、世の中には難解な言い
回しを使ったほうが「賢そうに見える」と信じている人々も沢山いる。 物事をわざわざ晦渋な
やり方で言う人々は、C++ で必要もないのにテンプレートを使おうとする人々と 同じくらい罪
深い。まあ、晦渋な評論家も、難解なコードを喜ぶプログラマも、根は同じところにありそうだ
が。

C++のような言語をいまだにリキんで学習しようとしている人々がいることは 全世界的にみて、
ひどい損失だと思う。少なくとも、こいつのせいで計算機科学の進歩が 20年は遅れたね。
Ruby on Rails 2.1.0公開で、2.0系は切り捨てか (山本隆の開発日誌)
安定している1.2系はもう古いし、2.0系はバグが放置されたまま。
2.1系は安定するまで、まだ時間がかかるだろう。
どのバージョンを使うのか、難しい選択に迫られる。

ぬるぽの種は尽きまじ。 one-click rails というのは instant railsとは別物?

再帰的な

弾さんのところのコメントにあった

404 Blog Not Found:regexp - にはネストした表現は出来ない
Perl5.10のperldeltaによると5.10からは"(??{})"なし
(変数なし)でRecursive Patternが書けるようになった
らしいですよ。(自分はまだいじってないけど)

は、たぶんこれのことでしょう。 以下ドキュメントから。

=item (?PARNO) (?-PARNO) (?+PARNO) (?R) (?0) (?PARNO) (?1) (?R) (?0) (?-1) (?+1) (?-PARNO) (?+PARNO)
regex, recursive regexp, recursive regular expression, recursive regex, relative recursion

Similar to (??{ code }) except it does not involve compiling any code, instead it 
treats the contents of a capture buffer as an independent pattern that must match at 
the current position.  Capture buffers contained by the pattern will have the value as 
determined by the outermost recursion.

(??{ code }) と同様のものですが、こちらはなんらかのコードをコンパイルしたりはしないと
いう点が異なります。こちらではコンパイルはせずに、この構造体が置かれたまさにその場所で
マッチしなければならない独立したパターンとして捕獲バッファの内容を扱います。捕獲バッフ
ァの内容はoutermost rerusion (再帰の最も外側ということ?)により決定される値を反映したも
のとなるでしょう。


PARNO is a sequence of digits (not starting with 0) whose value reflects the 
paren-number of the capture buffer to recurse to. (?R) recurses to the beginning of 
the whole pattern. (?0) is an alternate syntax for (?R). If PARNO is preceded by a 
plus or minus sign then it is assumed to be relative, with negative numbers indicating 
preceding capture buffers and positive ones following. Thus (?-1) refers to the most 
recently declared buffer, and (?+1) indicates the next buffer to be declared. Note 
that the counting for relative recursion differs from that of relative backreferences, 
in that with recursion unclosed buffersare included.

PARNO は再帰するために捕獲されたバッファのカッコ番号(paren-number)を反映する値を表す数
字の並び(ただし0から始まることはありません)です。この数字は再帰を行う対象の捕獲バッフ
ァの番号を指定します(?R)は パターン全体に対する再帰的なパターンです。(?0) は(?R)と同じ
意味です。PARNOには+や-の記号を前置することができます。これらは相対的な位置を指定する
ことになり、負の数であった場合には現在注目している位置より前にある捕獲バッファを指示す
るもので、正の数の場合は現在位置より後ろの捕獲バッファになります。したがって、(?-1) は
直前に宣言されたバッファを参照し、(?+1)は現在位置の次に宣言が現れるバッファを参照しま
す。ここで再帰時の相対指定は後方参照の相対指定と異なるということに注意してください。再
帰の場合には、その時点で閉じられていないバッファは数に含まれません。

  
The following pattern matches a function foo() which may contain balanced parentheses 
as the argument.

次のパターンは引数にバランスの取れたカッコ対をとるかもしれない関数 foo() にマッチする
ものです。

  $re = qr{ (                    # カッコグループ1 (full function)
              foo
              (                  # カッコグループ2 (parens)
                \(
                  (              # カッコグループ3 (カッコの中身)
                  (?:
                   (?> [^()]+ )  # カッコ以外のもの(バックトラックをしない)
                  |
                   (?2)          # グループについて再帰 Recurse to start of paren group 2
                  )*
                  )
                \)
              )
            )
          }x;

If the pattern was used as follows

これを以下のような状況で使った場合

    'foo(bar(baz)+baz(bop))'=~/$re/
        and print "\$1 = $1\n",
                  "\$2 = $2\n",
                  "\$3 = $3\n";

the output produced should be the following:

その出力は以下のようになります:

    $1 = foo(bar(baz)+baz(bop))
    $2 = (bar(baz)+baz(bop))
    $3 = bar(baz)+baz(bop)

  

2008年06月02日

武蔵小杉新駅の開業が2009年だということに気づく(広告の看板にあった)。 もっと先だと思ってたけど、それだけ時間がたっているということなのか喃。 新駅ができると、秋葉原まで出やすくなるので首を長くして待ち続けてるんだけどね(笑) 現状は、武蔵小杉から目黒線経由で目黒から山手線で秋葉原。か、 東横線から日比谷線で秋葉原というパターン。 新駅から横須賀線に乗れれば時間的には短くなりそうな 気がしているんだけど勘違いしてたりして。

某ネットラジオ番組のCDが発売中止になった模様。しょぼーん。

と、マクロスFのサントラはフラゲで明日か。

■_ 昨日の補足(C++)

自分もちと勘違いしている部分があったので再確認を兼ねて。 それはちと違うような? で書いていたような C++ の << を使った streamへの出力を、 関数形式で書いてみると以下のようになります。 <<は演算子の多重定義によって関数に結び付けられているもんですから (微妙な表現ですが勘弁してくりくり)、関数として呼び出すことも可能です。 んで、

#include <iostream>

int
main()
{
    std::cout << "hello, " << "world" << " (" __DATE__ ")" << std::endl;

    operator<<(operator<<(operator<<(std::cout, "hello, "), "world"), " (" __DATE__ ")");
    //operator<<(std::cout, std::endl);  //error
    std::endl(std::cout);

    std::endl(operator<<(operator<<(operator<<(std::cout, "hello, "), "world"), " (" __DATE__ ")"));

    return 0;
}

これを見れば、test(1), test(2), test(3)の呼び出しがどういう順序で為されるか 納得が行くんじゃないでしょうか。

上のコードはちゃんとコンパイルできて出力できます。念のため。

$g++ mogera.cpp

$./a
hello, world (Jun  2 2008)
hello, world (Jun  2 2008)
hello, world (Jun  2 2008)
ロベールのC++入門講座 - ボクノス
後で調べること

メモの中からイマイチ不明なところを抜き出すと、

    * C++のeofってどうなってんだ!?
    * 浮動小数を2進数表記したい。
    * 浮動小数の表示桁数を変更したい。
    * staticの初期化について。

後で調べる。

浮動小数点数(のビットパターン)を二進出力というのはマニピュレータを自分で書かないと ダメなんじゃなかろうか。 C++マニアック,マニピュレータの作り方,how to make manipulator

■_

そろそろ〆かなあ。 とはいえ貴重な一次資料になると思うので。

学生とIT業界トップの公開対談で胸を衝かれたこと---IT産業を呪縛する“変われない日本”:ITpro
西垣氏は対談の中で「まず10年間は泥のように働いてもらう」という,伊藤忠商事元社長 丹羽
宇一郎氏の言葉を紹介し,この言葉がネットで話題になった。それは「滅私奉公せよ」という意
味ではなく「自分の能力の限界を広げるために,泥臭い仕事を厭わず,どっぷり漬かって働け」
という意味なのだと思う。ただ「10年」という長さや,下積みを思わせる表現に,学生が拒否反
応を示したことも確かだ。

 対談のレポート記事では書き漏らしてしまったCSKホールディングス 取締役 有賀貞一氏の発
言がある。お詫びとともにここで掲載したい。「この業界で10年は長いかもしれない。5年,3年
でもいい。もっとスピードアップしないと。自分のまわりでやっている関係のないことも10個,
20個勉強しろ。そうしないと5年,3年にはならない。そして実力がついてくれば起業すればよい」
(有賀氏)。

 西垣氏,有賀氏らの関連する発言部分の音声ファイルを用意した。両氏の発言や学生とのやり
とりがどのような雰囲気の中で行われたのか,感じていただけると思う。

IPAX2008 学生と経営者との討論会 抜粋(mp3,4.8Mバイト,10分42秒)
→ http://itpro.nikkeibp.co.jp/article/COLUMN/20080530/305172/IPAX2008TalkSession.mp3


 そして有賀氏は「自分が外に高く売れると思ったら売ればよい。うちの社員には一生この会社
にいなくてもいいと言っている」とも話す。記事に寄せられたコメントの中には「技術者を使い
捨てにするということか」というものあったが,有賀氏の意図は「社内だけで通用するスキルや
人脈ではなく,社外で売れる自分の市場価値を意識し,値段を上げることに努めよ」ということ
なのだと理解している。

 それを体現している人々がいる。IT技術の最先端領域で自分の書いたプログラムや得たノウハ
ウを公開し,多くの技術者から感謝と敬意を集める「アルファギーク」と呼ばれる技術者たちだ
(関連記事)。オープンソースのJavaフレームワーク「Seasar2」の作者,ひがやすを氏は「ア
ルファギークと学生の討論会を開催してはどうか」と提案する(ひがやすを氏のブログ)。
ITpro WatcherでオープンソースGTDを連載している生越昌己氏は,アルファギークとIT業界のト
ップの討論を提案している(生越氏のブログ)。意外と話が合うのではないかと記者は思う。使
う技術やビジネスのスタイルが違ったとしても,自分の意思で選んだことを追求し,その結果を
自分で引き受ける人間同士であれば。

 IPAの西垣氏は,未踏ソフトウェア事業でスーパークリエータに認定された,すなわちIPAが発
掘して支援した技術者がGoogleに就職したことを「いいこと」だと述べた。「彼らには何年かし
て日本で起業して欲しい。そこまでのステップを踏まないと新しい流れは生まれない」(西垣氏)。
有賀氏は「アメリカでは優秀な奴から起業する。今日,ここには優秀な学生の皆さんが来られて
いる。この中で5人とか7人とか,5年以内に起業すれば今日の対話は役に立ったことになる思う」
と話した。そこに「企業で大型システムを開発するにはもったいない,技術を極めた人がそれを
生かす道」のひとつのかたちがあるのだろう。

 IT産業のトップたちは,徹底したリアリストだ。けれども,いやむしろそうであるがゆえに,
日本は変わらなければならないと認識している。記者はそう考えている。

■_ 自分には30分でも難しそうな希ガス

与えられた木から、子→親への対応を作る - 黎明日記“与えられた木から、子→親への対応を作る”を Squeak Smalltalk で - sumim’s smalltalking-tosScheme:リスト処理

Scheme:リスト処理
与えられた木から、子→親への対応を作る

Shiro(2008/05/24 11:55:47 PDT): たまたま昨日、仕事で扱った小ネタ。 初級編クイズになりそうなので
書き留めておく。

木構造が与えられる。たとえばこんなの:

(define *tree*
  '(Root (Spine (Neck (Head))
                (RClavicle (RUpperArm (RLowerArm (RHand))))
                (LClavicle (LUpperArm (LLowerArm (LHand)))))
         (RHip (RUpperLeg (RLowerLeg (RFoot))))
         (LHip (LUpperLeg (LLowerLeg (LFoot))))))

つまり、 <tree> := (<name> <tree> ...) という構造。

これから、子→親の対応を表すalistを作る手続きを書け、というもの。 結果の例はこんな感じ。
各要素の順序は問わない。

((LHip . Root) (LUpperLeg . LHip) (LLowerLeg . LUpperLeg) (LFoot . LLowerLeg)
 (RHip . Root) (RUpperLeg . RHip) (RLowerLeg . RUpperLeg) (RFoot . RLowerLeg)
 (Spine . Root) (LClavicle . Spine) (LUpperArm . LClavicle)
 (LLowerArm . LUpperArm) (LHand . LLowerArm)
 (RClavicle . Spine) (RUpperArm . RClavicle)
 (RLowerArm . RUpperArm) (RHand . RLowerArm) (Neck . Spine) (Head . Neck))

30分で初級。10分で中級。
Scheme:リスト処理
nobsun(2008/05/26 20:39:46 PDT):でおくれた。得意なぶるいかも 5min :)

雲の上なんか遥かに越えてもう銀河系の人ですわ。 Lisp脳にはまだまだ遠そうです。○| ̄|_

ぼんやりと浮かんだやり方があるけど、それでうまく行けるのか。 何分掛かるのかちょっとやってみるの怖いな(笑)

■_ それは

Hena Hena Nikki ~悔い倒れの日々~(2008-06-01)
* [computer/update] Ruby ver.1.8.7

object-oriented programming を意識して作られた interpreted scripting language。 
メンテナンス・リリース。

鬼車の 対応はまだの模様。

1.8系列の正規表現エンジンが公式に鬼車になることはないと思いますが。 …アナウンスなかったっけ?

RubyKaigi2008

そろそろTXのダイヤとか移動時間を確認しておかんといかんな。 あとデジカメ(パナのFX-30)のバッテリが売ってません○| ̄|_ 予備のを一つ持っておきたいんだけどなあ。

中島愛 Part1 
540 名無しさん@お腹いっぱい。 [sage] Date:2008/06/02(月) 22:45:58  ID:UWu5MjRP0 Be:
    6月14日(土)、15時30分~
    ヴィーナスフォート 2階教会広場にて

    「ランカ・リー=中島愛(めぐみ)ミニライブ@フォルモ・・・ぢゃないよ!ヴィーナスフォート☆」

    キタ━━━━━━(゚∀゚)━━━━━━!!!!!


    ・・・って俺行けないじゃん_| ̄|○_| ̄|○_| ̄|○ 

541 名無しさん@お腹いっぱい。 [sage] Date:2008/06/02(月) 23:15:38  ID:2rXbLW1o0 Be:
    ニンジーンキタ━━━ヽ(∀゚ )人(゚∀゚)人( ゚∀)ノ━━━ !!! 

542 名無しさん@お腹いっぱい。 [sage] Date:2008/06/02(月) 23:19:45  ID:V8rPYlAN0 Be:
    May'nのあの混み具合から考えると今から欝になるな

    行くけど 

543 名無しさん@お腹いっぱい。 [sage] Date:2008/06/02(月) 23:23:38  ID:2rXbLW1o0 Be:
    土曜のヴィーナスフォートってヤバイんじゃね
    家族やカップル連ればっかの場所に怖い集団が・・・

544 名無しさん@お腹いっぱい。 [sage] Date:2008/06/03(火) 00:00:52  ID:5Iro0F+/O Be:
    ヴィーナスフォートって上からも見れたから、どんなに混んでも歌は聞けるよね? 

545 名無しさん@お腹いっぱい。 [sage] Date:2008/06/03(火) 00:20:38  ID:LAMS3Yhr0 Be:
    なぜヴィーナスフォート?オタには縁遠い場所じゃないかw

Gauche Nightのときでさえあれだけアウェイ感を感じた場所だものなあw

【Perl,PHP】LLバトルロワイヤル2【Ruby,Python】 

875 デフォルトの名無しさん [] Date:2008/05/31(土) 06:59:18  ID: Be:
    >>837-838
    検索で上位表示されるKENTは、今すぐにたたんでほしい 

876 デフォルトの名無しさん [sage] Date:2008/05/31(土) 08:30:27  ID: Be:
    perl CGI全盛時代の情報弱者の情報源としてブランドになっちまってんだろな
    とほほ氏にw3c派が噛み付き続けたように
    なぜKENTが駄目なのか示していかないと是正されまいて 

877 デフォルトの名無しさん [sage] Date:2008/05/31(土) 13:30:39  ID: Be:
    KENTは別にサイトたたまなくてもいいから、新作ぐらいperl5スタイルで書いて欲しい。 

878 デフォルトの名無しさん [sage] Date:2008/05/31(土) 20:22:02  ID: Be:
    恥ずかしいことだと一般に認知させるしかない 

879 デフォルトの名無しさん [sage] Date:2008/05/31(土) 21:56:41  ID: Be:
    Perlはスタイルを強制しない 

880 デフォルトの名無しさん [sage] Date:2008/05/31(土) 21:57:34  ID: Be:
    まだまだ Perl で戦えまつ(`・ω・´) 

881 デフォルトの名無しさん [sage] Date:2008/05/31(土) 22:01:33  ID: Be:
    Perlを殺すのはPerl 6だというもっぱらの噂だよ。 

882 デフォルトの名無しさん [sage] Date:2008/06/01(日) 11:36:19  ID: Be:
    Perl6の正規表現は最凶 

883 デフォルトの名無しさん [sage] Date:2008/06/01(日) 11:38:08  ID: Be:
    正規表現で本格的なプログラミング言語が作れるぜ 

884 デフォルトの名無しさん [sage] Date:2008/06/01(日) 12:59:35  ID: Be:
    超保守性悪そうだけどな。 

885 デフォルトの名無しさん [sage] Date:2008/06/01(日) 14:17:43  ID: Be:
    Perl6って開発進んでるの 

886 デフォルトの名無しさん [sage] Date:2008/06/01(日) 15:36:50  ID: Be:
    金魚にエサをやるついでに開発されるらしいよ。 

887 デフォルトの名無しさん [sage] Date:2008/06/01(日) 17:45:45  ID: Be:
    ていうか金魚が開発してるんだよ
    ラリーも金魚が書いた 

888 デフォルトの名無しさん [sage] Date:2008/06/01(日) 18:06:40  ID: Be:
    俺の頭脳は金魚並みと馬鹿にされてきたんだが。 

889 デフォルトの名無しさん [sage] Date:2008/06/01(日) 20:24:15  ID: Be:
    >>877
    おま...
    CI...
    消さ... 

文字コード総合スレ part3

611 デフォルトの名無しさん [sage] Date:2008/06/02(月) 06:07:08  ID: Be:
    608は「全角数字使用の585を超初心者だと見抜けないためにゆとりといわれた」ことに
    不満を主張しているようだが、それとJISでの全角数字のあつかいとは関係なくね?
    これだけ使われてるんだし。でも585が(・∀・)カエレ!なのは同意 

612 デフォルトの名無しさん [sage] Date:2008/06/02(月) 09:35:02  ID: Be:
    このスレに居てmohtaを知らんとは言わせん 

613 デフォルトの名無しさん [sage] Date:2008/06/02(月) 15:47:06  ID: Be:
    誰だっけ?昔うさげにいた人? 

614 デフォルトの名無しさん [sage] Date:2008/06/02(月) 18:35:11  ID: Be:
    「うさげ」も何年かぶりに聞いた単語だな 

615 デフォルトの名無しさん [sage] Date:2008/06/02(月) 18:49:35  ID: Be:
    ということにしたいのですね。 

616 デフォルトの名無しさん [sage] Date:2008/06/03(火) 00:02:01  ID: Be:
    >>608
    ならUnicode StandardでいわゆるEAST ASIAN WIDTHがどういう扱いを受けてるのかくらい知ってるだろ?
    それなのにこの場に及んでNORMALIZATIONされていない文字をまだ「ありだと思う」と言い張るその姿勢は実に見苦しい。

    >>610
    半角は潰れるが全角なら潰れないだと?
    そんな文字サイズなら漢字は潰れまくりじゃねーか。

    >>611
    全角数字の扱いだけではない。
    厚顔無恥で教えて君オーラ全開な文章から585の人間性を推し量れない608の稚拙さに問題がある。

    >>612
    知らん。
    ゆとりの俺にも教えてくれ。 

関数型プログラミング言語Haskell Part9
154 初心者修業中 [sage] Date:2008/06/01(日) 01:08:22  ID: Be:
    カリー化とは、
    複数の引数を持つ関数を
    引数一つの関数の組み合せとする事。

    …と認識しています。 

155 デフォルトの名無しさん [sage] Date:2008/06/01(日) 01:08:36  ID: Be:
    カリー化という言葉を見ると頭の中で
    「カリンカカリンカ カリンカマヤ」という歌が繰り返されて止まらなくなる。 

156 デフォルトの名無しさん [sage] Date:2008/06/01(日) 01:54:38  ID: Be:
    おれもそうりかいしてる。<154
    でも、カリー化ときいてターメリックをぶっかけてるイメージしかないw 

157 デフォルトの名無しさん [sage] Date:2008/06/01(日) 09:01:04  ID: Be:
    ガラムマサラとかも入れた方がいいのでは? 

158 デフォルトの名無しさん [sage] Date:2008/06/01(日) 10:27:15  ID: Be:
    エバラ化、桃屋化 

159 デフォルトの名無しさん [sage] Date:2008/06/01(日) 10:28:14  ID: Be:
    味の素化 

2008年06月02日

「いいお話じゃおなかは膨れないよ」

「そうね。それは私が引き受けるわ。一緒に暮らさない、アニタ?」

「いいお話じゃ体は温まらないよ」

「それは私が何とかしよう。」

「一人じゃつらくても、二人なら耐えられるわ。三人なら楽勝よ。皆で助け合っていきましょう!」



R.O.D THE -TV- 第十話「クリスマス・キャロル」
  

午後から本屋めぐり。 ジュンク堂新宿店で色紙ハケーン。
平林雅英さんのサイン 後藤正徳さんのサイン まつもとさんのサイン

今日はすばらしい収穫がありました。 → 基礎から学ぶコンピュータアーキテクチャ
基礎から学ぶコンピュータアーキテクチャ
この森北出版というところは派手さはありませんが、 いい仕事をしているところだと常々思っていて密かにひいきにしています :) んで、この本なんですが、まあタイトルどおり「基礎から~」なのでここを読んでいるような 方々の大部分には無用だと思いますが(^^; それはさておき。 A5判で192頁と非常にコンパクトなものですが網羅している範囲は コンピュータの構成要素/情報の表現/論理関数/コンピュータの論理回路/演算装置/命令セットアーキテクチャ/制御アーキテクチャ のようになっていて、論理関数のあたりでカルノー図をきちんと説明しているのが 自分としてはGJだします :)

身近の新人さんでこの手のカリキュラムを受けてこなかった人がいたりしたらぜひ一冊 :-)

某書店で見かけた翔泳社作のブログラミング言語選択チャート あなたにオススメのプログラミング言語をCHECK!
奴らの上派 実務派080531-185828
OCamlとかRとか入れてるあたり、「よくわかって」らっしゃるw

マルチスレッドのプログラミングはチェーンソーでお手玉をするようなもの

the.codist{} - Writing Multithreaded Code Is Like Juggling Chainsaws

で、Erlangと。

実際、マルチプロセス/マルチスレッド のプログラミングって、 言語の助けが必要だと思うんですがどうでしょうか。 少なくとも、現状あるようなプログラマがアトミックな操作を イベントやらロックやらで制御して行くやり方はプロセッサ数が増えれば増えるほど 性能の向上が難しくなるような気がします。

GPLはソフトウェアをフリーにするためのライセンスのはずなのに,
運用してみると逆に自分が縛られてる気がしてならない
  


はじめてのにき(2008-06-01)
http://twitter.com/yanbe/statuses/822305215

ただしい。

でも、じゆーを守ろうとすると一時的にふじゆーになるのは 普通にごく当たり前なことだとおもう。

んー、まあよく言われていることなんだろうとは思うけど。 エッセイのどれかでストールマンが書いていたことだと思うけど、 原油を運ぶタンカーを建造するときに二重底にしないというのは犯罪である。 そのようなことをさせない縛りが必要だとかなんとか。 要するに、何のための自由なのかということですね。 GPLの求めるところは(流用された)ソースコードが隠匿されないというところであって (ソースコード非公開にできる場合もあるけどそれはおいといて)、 その大目標を達成させるためには(タンカーの船底は二重底以上にしなきゃいけないような) 「不自由」は甘受せよというところでしょう。

その辺がよく、「お前のもの(非GPLな自由に使えるもの)はオレのもの (GPLなソフトウェアに取り込む)。オレのものはオレのもの(GPLなものから持ち出して 非GPL(非互換なもの)にするのはダメ」と揶揄される理由のひとつなんでしょうけど。

いずれにしろ、ライセンスの選択は慎重に。 混ぜたら危険。たべたらしぬで。

それはちと違うような?

ロベールのC++入門講座 - ボクノス

ロベールのC++入門講座 - ボクノス

  * coutの実行順序も右から行われるらしい。(コレは書いてないけど)

#include <iostream>

using namespace std;

int test(int i)
{
    cout << i * i << " ";
    return i;
}

int main()
{

    cout << test(1) << " " << test(2) << " " << test(3) << endl;

    return 0;
}

          o 実行結果は9 4 1 1 2 3

main()から呼び出している test()でも cout に出力しちゃっているのはまず、まずいことのひとつ。 そして、cout に対する << を使った連結は cout.operator<<() が cout(の参照)を返すので、その参照に対してさらに cout.operator<<().operator<<() のようにくっつけられるということで そのためには左側から呼び出さないと呼び出しのチェーンが構成できない。 上記の実行例で最初に 9 4 1 (test(3),test(2),test(1))のような順番になっているのは、 それこそ printf("%d %d %d", hoge(1), hoge(2), hoge(3)); と同じ問題でしょう。

上の文でRuby的な表記になってるのは見逃してね :-)

白やぎさんから

デバッグではじめるCプログラミング の著者からメールをいただく (耳がはえー(笑))。 うかつなことが書けないぢゃないかw

今日はまだまとめを書けませんが、基本的にはいい着想の元に書かれた本だと思います。 重箱の隅を突っついても致命的な減点とは考えてませんのでそこんところよろしく :-)


一つ前へ 2008年5月(下旬)
一つ後へ 2008年6月(中旬)

ホームへ


Copyright (C) 2008 KIMURA Koichi (木村浩一)
この文書の無断転載はご遠慮ください(リンクはご自由にどうぞ)。

メールの宛先はこちらkbk AT kt DOT rim DOT or DOT jp