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

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

一つ前へ 2009年12月(下旬)
一つ後へ 2010年1月(中旬)

ホームへ

2010年01月10日

■_

・ぐろーばるうぉーにんぐうぉーみんぐ
読売新聞の書評欄でですね、こんなのがあったんですわ。

評・横山広美(科学コミュニケーター)

アル・ゴア著
私たちの選択

私たちの選択次第で地球温暖化は解決できる。ノーベル平和賞も受けた著者はそう信じ、私たち
に行動を促している。

発電に関しては二酸化炭素を極力ださない太陽、風力、地熱などそれぞれの利点を生かし(ママ)、
使うことができるだろう。著者はこうした技術を詳しく紹介したのち「政治的な障害」を述べて
いる。温暖化を否定する利害団体がいかに巧妙に意図的な情報を流し、人々を疲れさせ、政治的
判断を鈍らせているかは興味深い。

話題になった『不都合な真実』よりも、事実と数字は詳細に調べられ、説得力を増した。インパ
クとある写真や図解も優れている。IPCC(気候変動に関する政府間パネル)が示したように温暖化
はもはや疑いようのない事実であり、私たちは未来を選択しなければならない。
  

とかあったんですけど、ちょっと前にデータの捏造があったのなかったのって話が ありましたよね? 実際のところどうなんでしょうか。 書評子の名前などでぐぐってみたら 「地球温暖化懐疑論批判」 というのが見つかったりしました。 んで、原著についての amazon さんでのレビューを見ると Amazon.com: Our Choice: A Plan to Solve the Climate Crisis (9781594867347): Al Gore: Books まさに褒めているのとそうでないのと真っ二つ(笑)

このコンピュータ書がすごい!2010年版
一晩寝かせると、もともと断片的なメモがさらに訳わからんものに(笑) ま、それはそれとして

2009 iPhone本の年
(こんだけ出ましたと見せた量が、買い物かご山盛り×2)

iPhoneSDK
XCode
Cocoa

2010 は?

iPhone開発
スピードが問題で Objective-C → C and/or C++ のパターンが割りとある
#そうなの?

*個人的感想
去年はプログラミングの入門書のタイトルがちらほら見えたのが今年は減ってる?
(皆無ではない)

コンパイラ(言語処理系をつくる)の本がたくさん出ました。

タイガー、
http://www.amazon.co.jp/dp/4798114685/
ドラゴン、
http://www.amazon.co.jp/dp/478191229X/
ふつパイラ
http://www.amazon.co.jp/gp/product/4797337958/
プログラミング言語を作る
http://www.amazon.co.jp/dp/4774138959
コンパイラの構成と最適化
http://www.amazon.co.jp//dp/4254121776/

…あれ?(笑)


「ヘッドファースト ソフトウェア開発」
「アジャイル開発が当然のものと新人さんに刷り込む本」
かくたにさん一押し。

アジャイル開発の「再発見」
・一周目 ケント・ベック xp本
・二周目 より「practical」なものとして

エンタープライズなところでどのようにアジャイルするか
QAも アジャイル

twitter

クラウド

「オープンソースの育て方」
  コミュニティ重要

「アドレナリンジャンキー」
  この著者のシリーズが好きな人なら

「プログラミング Haskell」
「Real World Haskell」

「セキュアコーディングスタンダード」
#Cは素人お断りな言語。いろいろ面倒

「ふつパイラ

PHP
Lua

「プログラミングのための確率統計」
@ogijun も大プッシュ。

「アルゴリズムとデータ構造」(スプリンガー)
up-to-date な内容
古臭いままの本も多くね?

SAIの本たくさん出ました。
pixiv
「素材」の本
「プログラマーのジレンマ」

ポートフォリオ
エンジニアにもポートフォリオが必要じゃないか?

「Let Over Lambada」
「Relase It!」

OPC Diary: このコンピュータ書がすごい!2010年版 あー、一度お会いしたい。などとつぶやいてみたり。

・一つのアーキテクチャ、コンセプト、パラダイムに縛られすぎ >ついった上のだれか まあ人それぞれだけどねえ。

・レールガン14話
ちょっと書きたいことがあったけど、眠いので書かない(笑)

■_ BCCは無料配布続けてるんだよなw


くだすれDelphi(超初心者用)その51

90 デフォルトの名無しさん [sage] 2010/01/10(日) 11:33:17 ID: Be:
    無料のdelphiって無いですか?
    昔personal6ってのがあったのですが・・・ 

91 デフォルトの名無しさん [sage] 2010/01/10(日) 11:40:02 ID: Be:
    Turbo Delphi Explorerってのがあったけどそれもなくなった。
    今あるのは期間限定のトライアルのみ。
    新会社の方針として完全にアマチュアそっちのけになったのだろう。
    某が潰れる前にDel6Per認証解除パッチでも出してくれればよかったのに。 

92 デフォルトの名無しさん [sage] 2010/01/10(日) 12:10:38 ID: Be:
    ボーランド終わったな 

93 デフォルトの名無しさん [sage] 2010/01/10(日) 13:06:54 ID: Be:
    もうとっくにEmbarcaderoに身売り済みですが

94 デフォルトの名無しさん [sage] 2010/01/10(日) 15:10:16 ID: Be:
    del6personalって認証しないでも一応使えるぞ
    いいのか悪いのか別としてw 

95 デフォルトの名無しさん [sage] 2010/01/10(日) 15:25:13 ID: Be:
    そもそもダウンロード出来るところがなくなっちゃった 

96 デフォルトの名無しさん [sage] 2010/01/10(日) 15:28:01 ID: Be:
    どっかの大学がサイトに置いて無かったっけ 

97 デフォルトの名無しさん [sage] 2010/01/10(日) 15:30:39 ID: Be:
    もう無いよ 

98 デフォルトの名無しさん [sage] 2010/01/10(日) 16:14:27 ID: Be:
    CodeGearからダウンロードしたのがあったなと思って、
    ディスクのなかを探してみたら
    Turbo Pascal 3.0
    が出てきた。なつかしい・・・・

99 デフォルトの名無しさん [sage] 2010/01/10(日) 16:18:01 ID: Be:
    delphi6personalとturbodelphiどっちもあるけど再配布とかしたらウルサイこと言われんのかな? 

100 デフォルトの名無しさん [sage] 2010/01/10(日) 16:45:21 ID: Be:
    俺は言わないよ 

101 デフォルトの名無しさん [sage] 2010/01/10(日) 16:52:02 ID: Be:
    そういえば大学の図書館のdelphi6の本で付属CD-ROMに入ってたぞpersonal
    大きい図書館で探せばあるかもね 

103 デフォルトの名無しさん [sage] 2010/01/10(日) 21:23:12 ID: Be:
    turboはあるから6が欲しいなぁ 

Turbo Pascal 3.0 て。 いや、自分も最初に Pascal 使ったのはこれでしたw(大学で)

■_ 鬼車

ハングアップの日々 (2010/01) 経由で知ったのですが、久方ぶりにバージョンアップしたんですね。 でも


鬼車
更新情報
    * 2010/01/09: Version 5.9.2 リリース

で履歴も見ると



History

2010/01/09: Version 5.9.2

2010/01/05: [bug]  fix utf16be_code_to_mbc() and utf16le_code_to_mbc().
2008/09/16: [bug]  fix memory leaks in parse_exp().
2008/08/01: [bug]  fix memory leaks.
2008/06/17: [bug]  invalid type of argument was used
                   in onig_st_lookup_strend().
2008/06/16: [bug]  invalid CaseFoldMap entry in ISO-8859-5. 0xdf -> 0xde
2008/02/19: [new]  add: onig_reg_init().
2008/02/19: [new]  add: onig_free_body().
2008/02/19: [new]  add: onig_new_without_alloc().
2008/02/19: [API]  rename onig_alloc_init() to onig_reg_init(),
                   and argument type changed.
2008/01/31: [impl] move UTF16_IS_SURROGATE_XXX() to regenc.h.
2008/01/30: [bug]  (thanks akr)
                   fix euctw_islead().
2008/01/23: [bug]  update enc/koi8.c.

2007/12/22: Version 5.9.1

2007/12/21: [impl] add sprint_byte().
2007/11/28: [bug]  (thanks Andy Armstrong)
                   don't overwrite error code in fetch_name().
2007/11/12: [bug]  utf8 mbc length of code 0xfe, 0xff are not 1,
2007/10/23: [spec] onig_enc_len() takes three arguments. (not used)
2007/10/15: [impl] (thanks Rui Hirokawa)
                   add check HAVE_STDARG_H.
2007/09/07: [API]  rename enc_len() to onig_enc_len() in oniguruma.h.
2007/09/04: [API]  remove ONIGENC_ERR_XXXXX.
2007/09/03: [API]  add error ONIGERR_INVALID_CODE_POINT_VALUE.
2007/09/03: [impl] change error message to "invaid code point value"
                   for ONIGERR_INVALID_WIDE_CHAR_VALUE.
2007/09/03: [bug]  xxx_code_to_mbclen() should return
                   ONIGERR_INVALID_WIDE_CHAR_VALUE for invalid code point.
                   ex. /[\x{7fffffff}]/ for ASCII encoding.
2007/08/28: [impl] remove "warning: no previous declaration ...".
2007/08/21: [impl] remove warnings in enc/mktable.c.
2007/08/20: [impl] remove "warning: unused parameter"
2007/08/20: [impl] remove "warning: comparison between signed and unsigned".
2007/08/06: [impl] remove clear_not_flag_cclass().
2007/08/03: [bug]  fix the case of undefined USE_NAMED_GROUP.
2007/08/02: [spec] add backref by number.
2007/08/01: [API]  add OnigCtype.
2007/07/27: [spec] add USE_CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS.
2007/07/24: [impl] define PLATFORM_UNALIGNED_WORD_ACCESS.
2007/07/23: [dist] fix doc/FAQ.ja

新機能の実装とかの気配はなし。 やっぱりモチベーションなくしちゃったのかなあ。

■_ 誇大宣伝か?

ついったでも誰か反応してたのを見かけましたが


anic - Project Hosting on Google Code

Introduction

anic is the reference implementation compiler for the experimental, high-performance, 
statically-safe, fully implicitly parallel, object-oriented, general-purpose dataflow 
programming language ANI.

Portably written using the GNU toolchain, anic works on all of the popular operating 
systems, including *nix, Mac OS X, and Windows (via Cygwin).

The Aim

Try to imagine, if you will, the amount of time and effort it would take you to write 
a bug-free, efficiently multithreaded real-time clock + infix calculator hybrid 
application in a language like C.

While you're thinking, here's a terse but complete implementation in ANI:

@std.in;
a=[[0\]]; op=[[' '\]]; b=[[0\]]; r=[[0\]];
0 { clock => [[int ms]] { ("\r" + ms/1000.0 + ":" + a + op + b + "=" + r) ->std.out; 1 std.delay (ms+1) clock} };
inLoop => {\in->a \in->op \in->b inLoop};
\\op ?? {'+': (\a+\b) '-': (\a-\b) '*': (\a*\b) '/': (\a/\b) : 0} ->r;

ANI is an attempt to fuse the intuitive feel of shell scripting (and all of its perks 
like implicit parallelism) with the safety of strict compilation and the speed of 
hand-optimized parallel assembly: in other words, lightweight programming that runs 
even faster than typical C. You read that right.

You're forgiven for being skeptical; you're encouraged to read on.

The Gears

ANI is probably unlike any programming language you've encountered; it does away with 
state, variables, commands, stacks, and memory itself, as we know it. In ANI, the 
compiler sequences the ordering of your program logic for you, laying out as much of 
it as possible in parallel, and guaranteeing that the resulting binary will be 
statically safe and deadlock-free. Best of all, compiler technology has advanced to 
the point where you don't need to understand any of this to leverage it; that's anic's 
job!

Crazy? Most definitely. And yet strangely enough, it works!

(以下略)

reddit でも大反響(でもないか?) anic: Faster than C, safer than Java, simpler than *sh : programming

■_ 本日の巡回から

■_ 本日のAA

推薦図書/必読書のためのスレッド 53 

888 デフォルトの名無しさん [sage] 2010/01/09(土) 19:29:26 ID: Be:
    アジャイルはもう古いこれからはナジャイルだ 

889 デフォルトの名無しさん [sage] 2010/01/09(土) 19:33:55 ID: Be:
           , ―、
            | | |
           | | |
           __.| .ニニ|__
        ,-'__σ宀σ__'- ,
       /(^.| 一  ー |^)\
       ⌒ヾヽα ∇α ノノ⌒
      _⊂!⌒~⊂~⌒ ヘ
    ∠/ | | (,二_.λゝ ノ
        ∪y   ^^!_し )
         '==' ⌒ '==' 

890 デフォルトの名無しさん [sage] 2010/01/09(土) 19:44:02 ID: Be:
    それは尾JAL丸 

891 デフォルトの名無しさん [sage] 2010/01/09(土) 21:18:09 ID: Be:
    さてこれからアジャって寝るか… 

2010年01月09日

■_

ふらっとC#,C♯,C#(初心者用) Part52 

745 デフォルトの名無しさん [sage] 2010/01/08(金) 16:23:23 ID: Be:
    プロパティーとクロマティーって似てるよな(´・ω・`) 

・2009年このコンピュータ書がすごい
いってきました。 オーム社の方もいらしたので、ささださんの話をしとけばよかったか(笑)

感想とか書こうと思いましたが、気力が尽きたので明日にでも。

■_ ノマ

まあ漢字じゃないっちゃあそうだろうけどねえ。

ふらっとC#,C♯,C#(初心者用) Part52 
776 デフォルトの名無しさん [] 2010/01/09(土) 11:02:05 ID: Be:
    2.【C#】文字列が全角か半角かを調べる方法
    C#の正規表現を用いて、漢字を除去する方法を考えています。

    public static string Remove_Kanji(string moji)
    {
        string a = "";
        try
        {
            for (int i = 0; i < moji.Length; i++)
            {
                if (Regex.IsMatch(moji.Substring(i, 1), @"^.*\p{IsCJKUnifiedIdeographs}.*$"))
                {
                }
                else
                {
                    a += moji.Substring(i, 1);
                }
            }
       }
       catch
       {
         エラー命令
       }
       return a;
    }

    と記載したのですが、「佐々木」の「々」が漢字とみなされないのか、除去されずにReturnされます。
    正規表現で漢字を検知する機能には限界があるのでしょうか。
    もし、他に方法があれば教えていただけないでしょうか。

777 デフォルトの名無しさん [] 2010/01/09(土) 11:03:56 ID: Be:
    C#で、全角かどうかを判定する方法はありますでしょうか。
    ・shift-jisに変換して文字コードを判別する方法
    ※ 過去にサイトで見たことがあるのですが、どのサイトかは失念してしまいました。
    ・文字のバイト数で判定する方法
    http://7ujm.net/NET%20Framework/isOneByteChar.html
    http://codezine.jp/article/detail/1083?p=2
    ・正規表現を用いて判定する方法
    http://dobon.net/vb/dotnet/string/regexismatch.html
    ※半角文字列の判定方法ですが、半角が見つからないときは全角とみなしていいのかもしれないので、チェックしています。
    がありましたが、

    正直文字コードについての知識がなく、どれが堅実な方法か、長所短所は何かなどが分からないんです。
    よろしくお願いします。 

778 デフォルトの名無しさん [] 2010/01/09(土) 11:11:51 ID: Be:
    C#でそういうのは組んだこと無いけど、別環境で
    自前で文字コード関連を実装したときはs-jisがやりやすかったかな

    半角はアスキー互換だし全角についてはアスキーの空き部分を使ってるから
    判定は楽だし

    http://qpon.quu.cc/pc/sjis.htm

779 デフォルトの名無しさん [sage] 2010/01/09(土) 11:22:54 ID: Be:
    >>776
    「残してもいい文字」で考えればいいんじゃないの?
    >>777
    1文字取り出して半→全変換して変化があったら半角 

780 デフォルトの名無しさん [sage] 2010/01/09(土) 11:32:21 ID: Be:
    々〃とか鬼門だったな。単純に00ffを越える文字は全部読み飛ばすじゃダメなの? 

781 デフォルトの名無しさん [sage] 2010/01/09(土) 11:37:05 ID: Be:
    ttp://msdn.microsoft.com/ja-jp/library/20bw873z.aspx#SupportedNamedBlocks
    で見ただけでもCJK関連はこれだけあるね。
    々はIsCJKSymbolsandPunctuationみたい。

    IsCJKRadicalsSupplement
    IsCJKSymbolsandPunctuation *
    IsCJKUnifiedIdeographsExtensionA
    IsCJKUnifiedIdeographs
    IsCJKCompatibilityIdeographs
    IsCJKCompatibilityForms

782 デフォルトの名無しさん [sage] 2010/01/09(土) 11:55:30 ID: Be:
    々って 3005か 

783 デフォルトの名無しさん [] 2010/01/09(土) 12:18:44 ID: Be:
    ということは、正規表現の
    \p{IsCJKUnifiedIdeographs}
    だけでは日本人の要望に合致しないわけか…。
    あと何が必要なんだろう。
    >>781さんの定義が必要なのかな。
    と言いつつ、…CJKって何…? 

784 デフォルトの名無しさん [] 2010/01/09(土) 12:20:54 ID: Be:
    >>783
    http://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97
    CJK統合漢字とかCJKVとかあるんだね
    まあ英語圏以外の2バイト以上の文字使うところに関係してるようだけど 

785 デフォルトの名無しさん [sage] 2010/01/09(土) 12:20:57 ID: Be:
    支那日本朝鮮 

786 デフォルトの名無しさん [sage] 2010/01/09(土) 12:22:25 ID: Be:
    チャイニーズ・ジャパンニーズ・コリアン文字セット
    16ビットに入りきらないんで漢字圏の文字はごちゃ混ぜなのよ。 

787 デフォルトの名無しさん [] 2010/01/09(土) 12:25:03 ID: Be:
    なんと…China・Japanese・Koreanの頭文字とな…!!!!!!!!!!! 

788 デフォルトの名無しさん [] 2010/01/09(土) 12:26:01 ID: Be:
    Chinese-Japanese-Korean-Vietnamese
    もあるんだな
    BRICsとかVISTAみたいなもんか 

789 デフォルトの名無しさん [] 2010/01/09(土) 12:27:57 ID: Be:
    >>788
    「vista」もそういう流れできてるの? 

790 デフォルトの名無しさん [] 2010/01/09(土) 12:29:54 ID: Be:
    >>789
    OSは知らんけど数年前の投資ブームの時はVISTAってこれから発展するであろう
    国の名前並べていってたね。VISTAじゃなかったかもしれないが発音はビスタだった 

791 デフォルトの名無しさん [sage] 2010/01/09(土) 12:31:23 ID: Be:
    BRICs(ブリックス)とは、経済発展が著しいブラジル (Brazil)、ロシア (Russia)、インド (India)、中国 (China) の頭文字を合わせた4ヶ国の総称。

    V ベトナム
    I インドネシア
    S 南アフリカ共和国
    T トルコ
    A アルゼンチン

792 デフォルトの名無しさん [] 2010/01/09(土) 12:31:48 ID: Be:
    つまり…isCJKで始まる分類を指定しておけば、
    漢字を除去できると考えてよさそうだね。
    勉強になりました。今日得た知識でも数万円の価値がある…! 

793 デフォルトの名無しさん [sage] 2010/01/09(土) 12:32:55 ID: Be:
    >>776>>783
    繰り返し記号はもとから漢字じゃなくて記号
     ゝ (ひらがな用)
     ヽ (カタカナ用)
     々 (漢字用)

    >>777
    ttp://www.unicode.org/reports/tr11/
    ttp://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt

    文字幅に関しては規定されているから自分で実装するといい
    文字列について判定するなら、全角/半角/混成/不明くらいかね 

794 デフォルトの名無しさん [sage] 2010/01/09(土) 12:34:45 ID: Be:
    >>775
    http://homepage1.nifty.com/yamato/texts/memorandum/memo5_1.html 

795 デフォルトの名無しさん [] 2010/01/09(土) 12:45:50 ID: Be:
    >>793
    難しすぎる…英語もあるし…。
    英語の成績丙の私に分かりやすく教えていただけないでしょうか・ 

796 デフォルトの名無しさん [] 2010/01/09(土) 12:47:48 ID: Be:
    CJKVとか御託並べてるけどJオンリーなんだろ?
    S-JISにコンバートしてアスキーの基本文字以外のコードが出てきたらそのコードともう一文字削っとけばいいよ 

797 デフォルトの名無しさん [] 2010/01/09(土) 12:49:33 ID: Be:
    >>779
    もともと半角の文字が紛れているときはどうしたらいいんだろ。
    返還前後で変化がないけど半角として残したいし…。

798 デフォルトの名無しさん [sage] 2010/01/09(土) 12:52:24 ID: Be:
    bool IsHankaku(string c) { }って書くんだよ。元を変更する必要なんてない 

799 デフォルトの名無しさん [] 2010/01/09(土) 12:54:49 ID: Be:
    >>797
    S-JISで適当な全角半角混在テキスト作って保存、バイナリエディタで中みてみなよ

    ↑上の文字列を実際に覗いてみるとこんな感じ
    http://uproda.2ch-library.com/203594AB4/lib203594.png 

800 デフォルトの名無しさん [] 2010/01/09(土) 12:56:43 ID: Be:
    >>798
    もし半角が引数に与えられて、
    半角から全角への変換前後で変化があったときだけ、全角とした場合は、
    もし「カ」が入ってきたら変化がないので全角とみなされてしまうよ。 

Perl がその機能を持っているはずだけど、\p{ほげ} でユーザー定義のクラスが 作れるようになってるといいんだけどねえ。

C言語なら俺に聞け(入門編)Part 58 

967 デフォルトの名無しさん [sage] 2010/01/09(土) 01:01:02 ID: Be:
    Cは難解すぎるからもっと入門にはライトな言語が良いと言う人もいれば
    入門用に最適。シンプルでわかりやすいから初心者に勧める

    という2人がいますが、どっちが正しいんでしょうか 

969 デフォルトの名無しさん [sage] 2010/01/09(土) 01:01:35 ID: Be:
    どっちも正しい 

970 デフォルトの名無しさん [] 2010/01/09(土) 01:05:34 ID: Be:
    >>967
    「入門」がどういうレベルかによるが、
    ローティーンにはインタープリタ方式の方が頭の柔らかさを活かせると思う
    それで育った幅広い発想力を土台に、専門分野へチャレンジするときがCの出番だと思う 

971 デフォルトの名無しさん [sage] 2010/01/09(土) 01:06:51 ID: Be:
    Cから入って、さっさと卒業した方が良い 

972 デフォルトの名無しさん [sage] 2010/01/09(土) 01:46:47 ID: Be:
    >>967
    前者が正しい。
    Cがシンプルでわかりやすい?初心者に勧める?とんでもない大ウソだ。
    シンプルでわかりやすく、初心者でも扱えるような言語で、UNIXが記述できるはずがない。

    こだわる人のために補足すれば、Cは「難解」ではなく、「危険」だ。ちょっとしたミスが大怪我を引き起こす。
    それだけ細かいことが出来るからこそ、OS記述言語として使われている。 

973 デフォルトの名無しさん [sage] 2010/01/09(土) 01:49:22 ID: Be:
    >>967
    最初かと言われると微妙だけど、フォンノイマン型コンピュータを扱う上でいつかはCに触れて欲しい。

974 デフォルトの名無しさん [sage] 2010/01/09(土) 01:51:22 ID: Be:
    アセンブリよりシンプルで分かりやすいよ 

975 デフォルトの名無しさん [sage] 2010/01/09(土) 01:52:48 ID: Be:
    >>967
    アセンブラと比べると難解すぎるし、
    C++と比べればシンプルでわかりやすい。 

976 デフォルトの名無しさん [sage] 2010/01/09(土) 01:55:07 ID: Be:
    馬鹿らしい。目的と手段が逆転してる 

979 デフォルトの名無しさん [sage] 2010/01/09(土) 09:48:52 ID: Be:
    俺は>>971の意見に賛成。


    > 入門にはライトな言語が良い
    これは、勉強する人がくじけそうな性格ならそうだろう。
    しかしC言語が書けないプログラマはもはやプログラマではない
    と言って差し支えないほどC言語は普及しているので、
    どうせやるなら最初はC言語がいいんではないかと。 

980 デフォルトの名無しさん [sage] 2010/01/09(土) 09:59:21 ID: Be:
    Cができれば他の言語は全部できたも同じ 

981 デフォルトの名無しさん [sage] 2010/01/09(土) 10:02:29 ID: Be:
    >>980
    同感 

982 デフォルトの名無しさん [sage] 2010/01/09(土) 10:37:17 ID: Be:
    >>967
     ・ネットで読めるサンプルの数
     ・質問のできる場、対する回答者の数
     ・入門者向けのために「正確さ」を端折った解説の量

    C言語はこれらが圧倒的に多いため入門用に最適。
    ただ、コードの読み書きだけで見れば、他のLL言語が良い。

    どちらにしても初心者ってのは、何がわからないのかがわからない。
    調べる方法と聞ける相手と場を与えることが大切で、それさえ教えてしまえば
    もう初心者ではなく、どんな言語でもあとは
    読んで触って試して改造してテストしまくってもらえば身につく。

    本当にどんな言語のコードでも読んだことも見たことも無い人向けならば
    俺なら構造と階層の意味と、プログラムにおける当たり前の
    開いたら閉じる書式を知ってもらうために、まずはXHTML薦めるわ。
    IEバグに関連付けてソフトウェアのバージョン違いを意識してもらうことと
    更新の大切さも教えられるから。

    C言語でもLL言語でも入るのはそれからだな。 

983 デフォルトの名無しさん [sage] 2010/01/09(土) 10:40:20 ID: Be:
    Cからjavaに来てあいかわらずCライクな
    書き方しかできないおっさんとかゴロゴ
    ロいるからCができれば他もできるって
    のは賛成できない。 

984 デフォルトの名無しさん [sage] 2010/01/09(土) 10:43:30 ID: Be:
    >>983
    あるあるw

    Cやった上で、JavaなどのOOPL行くのが最良と思う。
    Cで溜まったある種のフラストレーションを、
    OOPでの抽象化によって開放させてみてほしいと思う。 

C はできた方がいいのは異論がないけど、 プログラミングの入門に使うのはどうなんかねえ。 というのは何年も前から書いてるな(笑) 「難解」というよりはやんなきゃいけないことが多い「面倒」な言語だろうし。

■_ くろじゃ

Closures ― Andreas Zwinkau
Andreas Zwinkau ➙ articles ➙ Closures

The concept of a closure in the context of programming seems to be as confusing as 
traits. The Wikipedia definition isn't easy to understand:

プログラミングという文脈での closure というコンセプトはtraits と同様に混乱しているよう
です。Wikipedia にある定義も簡単に理解できるようなものではありません:

A closure is a first-class function with free variables that are bound in the lexical 
environment

closure は lexical な環境に束縛されている自由変数を伴った first-class の関数です。

That is a nice definition, but it takes a little understanding.

これは nice な定義ですが、いささか浅い理解でもあります。

Anonymous functions (無名関数)

First the notion of a first-class function is essential. It means that a function is a 
thing that can be created, destroyed, assigned and passed around. Consider the 
following code:

first-class 関数の first the notion は essential です。
それはつまり、関数は作り出すことや、破棄すること、代入すること、引き渡すことができる
ものだということです。次のようなコードを考えてみましょう。

f = function(x) { return x(x) }

The variable f gets a function assigned. Before we dig deeper think about names for a 
while. What is the name of the function? Is it f? If we assign g = f afterwards, does 
the same function have two names? What is the name of the function before it gets 
assigned to f? At this point you should understand the concept of anonymous functions 
or think about the questions a little more.

変数 fには関数が代入されています。ちょっとの間、名前について深く考えてみましょう関数の
名前とはいったいなんでしょうか? (上の例での)f ってなんでしょうか?もし g = f という代入
を行ったなら、同一の関数が二つの名前を持つことになるのでしょうか? fに代入される前のこ
の関数の名前とは何でしょうか?ここであなたは無名関数のコンセプトを理解しておくべきです
さもなければこの質問についてもう少し良く考えてみましょう。

That anonymous function takes one argument x. The programming language at hand doesn't 
require static types, so we don't know anything about x so far, but it is a variable 
with an assigned value. It could also have an anonymous function assigned.

上記の無名関数は一つの引数 x をとります。このプログラミング言語では静的な方を要求して
いないのでわたしたちは x について何も知りません。ただし、何かの値が代入されている変数
だということだけはわかります。この引数には無名関数を代入することも可能です。

Judging from the body of the anonymous function the argument x must be a function, 
because it is called. The body of the function contains strange code. It calls the 
argument function x and passes x as an argument, too. Now the most difficult question 
in this article: What happens at the statement f(f)?

Judging from the body of the anonymous function the argument x must be a function,
無名関数の本体

引数xは関数でなければなりません。

because it is called.
なぜならそれが呼び出されるからです。
The body of the function contains strange code.
この関数の本体には不可思議なコードがあります。
It calls the argument function x and passes x as an argument, too.
呼び出された関数 x はその引数にも x を渡します。
Now the most difficult question in this article: What happens at the statement f(f)?
さて、この article で最も難しい質問です。
f(f) という statement でいったいなにが起きるのでしょうか?

Using a closure (クロージャを使う)

After understanding anonymous functions the concept of a closure isn't hard anymore. 
Consider the accumulator function:

無名関数を理解してしまえばクロージャのコンセプトはもはや難しいものではありません。次は
アキュムレーター関数を考えてみましょう

mk_acc = function() {
    sum = 0;
    acc = function(x) {
        sum = sum + x;
        return sum;
    }
    return acc;
}

The mk_acc function generates accumulator functions. An accumulator function takes a 
number, adds it to sum and returns the sum. The sum variable is a free variable in the 
acc function, but bound in the (lexical) environment of the generated inner function. 
It is used in the expression sum + x, before it is declared by an assignment sum =. In 
contrast x is bound to be the argument of the acc function.

この mk_acc 関数はアキュムレーター関数を生成します。アキュムレーター関数は数値を引数に
取りそれを sum に足した後でそのsum を返します。この変数sumはacc 関数における自由変数
(free variable)ですが、内側の関数(inner function)を生成している(lexicalな)環境に束縛さ
れています。この自由変数sumはsum+x という式の中で使われています。sum= という代入によっ
て宣言されるよりも前に対照的に、x は acc 関数の引数として束縛されています。

So sum grows with every call to the accumulator function, which means that two 
function calls with equal arguments to an accumulator return a different result:

ですから、sumはアキュムレーター関数関数に呼び出されるそのたび毎に大きくなっていきます。
これは同じ引数でアキュムレーターを呼び出す二つの関数呼び出しが異なる結果を返すというこ
とを意味しています。

a = mk_acc();
print a(2);        # prints 2
print a(2);        # prints 4
print a(2);        # prints 6

Storage of the state (状態を納めるストレージ)

It is clear that an accumulator function holds some internal state, since the sum is 
stored. Where is that storage located? Consider the case, where two accumulators are 
generated:

このことはアキュムレーター関数がなんらかの内部状態を保持していると言うことを明白にして
います。sum が格納されているそのストレージはどこに位置しているのでしょうか?二つのアキ
ュムレーターが生成されているケースを考えてみましょう。

a = mk_acc();
b = mk_acc();
print a(2);        # prints 2     2を出力
print b(2);        # prints what? さて何が出力される?

Clearly a "2" will be printed first, but what is the second printed number? 
Is it "2" or "4"? Actually that depends on the semantics of the 
programming language. Both scenarios are possible. The inner anonymous function is 
generated multiple times and all these function may be bound to the same sum or get 
their own sum variable.

最初に出力される数字が 2 であるのは明らかですが、二番目に出力される数字は何でしょうか? 
2 でしょうかそれとも 4 でしょうか?実際には、これはそのプログラミング言語のセマンティク
スによって決まります。(2と4の)いずれのシナリオもあり得るものです。内側の無名関数は複数
回生成され、それらの関数はすべて同じ sum を束縛しているかもしれませんしひょっとしたら
個々の無名関数に固有のsum変数を得るかもしれません。

Implementation (実装)

Many programmers are familiar with C. In C a function is just a pointer into some code, 
hence a function pointer may be passed around. There is just no syntax to generate an 
anonymous function in C (though there is an extension).

多くのプログラマーが C に慣れ親しんでいます。C に置ける関数はなにがしかのコードに対す
るポインターに過ぎません。したがって、関数ポインターを持ち回ることが可能です。C におい
ては無名関数を生成するための構文は存在していません(拡張としては存在していますが)。

I can think of an elaborate trick, to create an anonymous function in C nevertheless. 
Use LLVM to JIT a function. The getPointerToFunction method returns something like an 
anonymous function.

C において無名関数を作り出すための elaborate trick を考えることができます。実行時に関
数を作り出すためのLLVMを使うのです。getPointertToFunction メソッドは無名関数のような
何かを返します。

For closures with internal state a function needs to be more than a function pointer 
though. Consider the mk_acc function above. The sum variable is a local variable, 
hence it lives on the stack. If every acc function has its own sum variable, then an 
accumulator function consists (at least) of a pointer to code and a copy of sum. If 
all acc functions share a sum variable instead, the first idea is to include a pointer 
to the stack address of sum. No, that is a mistake, because after the program returns 
from mk_acc the stack frame is freed and may be overwritten. Therefore the compiler 
must create a global variable instead, which stores the value of sum.

内部状態を持ったクロージャのための関数には、単なる関数ポインター以上のものが必要になり
ます。先の例の mk_acc を考えてみましょう。sum 変数はローカル変数であるので、スタック上
に存在しています。各々の acc 関数は固有の sum 変数を持ち、アキュムレーター関数は(最低
限)コードへのポインターと sum のコピーとを持っています。もしすべてのacc関数が一つの 
sum 変数を共有させるようにするのであれば、最初に考えられるのはsum のスタック上のアドレ
スへのポインターを含めるというものです。しかしこれは間違いです。なぜなら、プログラムが 
mk_acc 関数から復帰した後でそのスタックフレームは解放されてしまい、さらに上書きされる
可能性があるからです。したがって、コンパイラーは sum の値を格納するための変数をスタック
上に置くのではなく、グローバル変数を作り出さねばなりません。

Use cases

The classical use case, where closures shine are callbacks as used in event-based 
systems, like all GUI frameworks I've seen. In C the callback register function 
usually takes an additional void pointer to transfer some information for the callback. 
This shows how closures have to be made explicit, if they are not built-in. Java on 
the other hand got anonymous classes in version 1.1 instead, which can also be 
closures.

classical な使い方では、クロージャはイベントベースなシステムにおけるコールバックで使わ
れてきました。GUI のフレームワークのような C で行うコールバック登録関数(callback 
register function) は通常、そのコールバックに対してなんらかの情報を伝えるために付加的
な void pointer を取ります。これはクロージャをどのように explict に作り出さねばならな
いかを示しています。ビルトインで持っていないときにJava の場合はバージョン1.1で無名クラ
スを手にしていますからそれをクロージャとすることができます。

Another use case is applying a function to a bunch of objects. Consider a graph data 
structure G and the task to find all nodes that hold a value with a given range x to y. 
With closures the API can be easily designed to allow the terse solution:

もうひとつの使用例は、ある関数をオブジェクトの集まり(bunch of objects)に適用するという
のものです。あるグラフデータ構造 Gと与えられた範囲 x から y に収まるある値を保持してい
るすべてのノードを見つけ出すタスクを考えてみましょう。クロージャを使うと、次の例のよう
な簡潔な solution を可能にする APIが簡単に設計できます。

filter(range_checker(x,y), G);

The range_checker function is like mk_acc and returns a filter function, which is 
applied to every node in G and is used by filter to select the right nodes. In C a 
solution could look like this:

range_checker 関数は mk_acc のようなもので、 フィルター関数を返します。この関数は G の
各ノードに適用され、正しいノードを選択するためのフィルターとして使われます。C では次の
ようなやり方を取ることができます。

range r;
r.lower = x;
r.upper = y;
filter(&range_checker, G, &r);

Further reading

If you want to know more, you should follow the links on Wikipedia. I'll close with 
the definition again, that you can comprehend now:

あなたがもっと知りたいと思うのなら、
Wikipediaのリンクを辿っていくと良いでしょう。


    A closure is a first-class function with free variables that are bound in the 
    lexical environment

クロージャとは lexicalな環境に束縛されている自由変数を持った first-class の関数である

Thanks to Sebastian Gregorzyk, Christian Maniyar and David Förster for the feedback.

f(f) by the way results in an infinite loop or a stack overflow.
Andreas Zwinkau
at lunch time on Saturday, December 19th, 2009
delicious reddit digg
blog comments powered by Disqus

This site uses ikiwiki since January 2009.
Google Analytics Alternative Clicky 

■_ 本日の巡回から

2010年01月08日

■_

やーるーきーぜーろー♪

■_ しくしくしく


推薦図書/必読書のためのスレッド 53

836 デフォルトの名無しさん [sage] Date:2010/01/07(木) 09:41:23  ID: Be:
    絶版書の「ものまね鳥をまねる」がオンライン書店「ブックサービス」で買えた
    届くことは今日確認出来たんで,あと何冊あるか分からんけど欲しい人はお早めに 

859 デフォルトの名無しさん [sage] Date:2010/01/08(金) 02:27:57  ID: Be:
    >>836
    Mocking Birdの訳書?
    アレ和訳あったんだ. 

この書き込みを見てすぐに、ブックサービスでものまね鳥~を注文したのだけど、 金曜日になって

xxxxxxx  様
ブックサービスをご利用いただきありがとうございます。
さて、このたびのご注文ですが、本日取引先より下記の
連絡があり、お届けできないままご注文は終了となります。


001)森北出版 「数学パズル ものまね鳥をまねる愉快なパズルと結合子論理の夢の鳥物語 愉快なパズルと結合子論理の夢の鳥物語」
   品切れのため、お届けできません。

  受注日:2010/01/07  受注番号:xxxxxxxx

ご希望にそえず誠に申し訳ございません。
(なお、代金のご請求は発生しておりません)
何卒ご了承いただけますよう宜しくお願い申し上げます。

○| ̄|_

■_ awkあれこれ


コメント: Aho、Weinberger、Kernighan著の「プログラミング言語AWK」復刊 - スラッシュドット・ジャパン
一桁間違ってません? (スコア:1)

新紀元社版の訳書 [shinkigensha.co.jp]と,原書 [amazon.co.jp]とが両方店頭にあったのです
が,選択の余地はありませんでした。

そう。ボリュームに比べてすげー値段が高いのだよね。 まあ元の値段からして高いってのがあるのだけど。 わたしは、ある機会にアメリカに行ってきたときに買ってきました。


コメント: Aho、Weinberger、Kernighan著の「プログラミング言語AWK」復刊 - スラッシュドット・ジャパン

Perlって、sedやawkに強く影響を受けてるけどね。文法的にもそうだし、エディタを立てなくて
も、直接シェルに1行打ち込むだけで結構な仕事が出来るっていう設計、思想は明らかにawkの影
響でしょう。

Perlの5.x以降とか、Rubyは正統派(?)のプログラミング言語になっちゃったけど、本来のスクリ
プト言語は、目的の結果を得られるなら、多少、汚い言語仕様でもいいじゃないかという、近代
的なコンピュータサイエンスと逆行する思想だったと思うんだよ。ただ、最近はハードが高速化
されたこともあって、かなり大きなシステムもスクリプト言語で記述するようになったから、
Rubyが有意義なわけだけど。

コメント: Aho、Weinberger、Kernighan著の「プログラミング言語AWK」復刊 - スラッシュドット・ジャパン

たまにはSNOBOLのことも思い出してあげてください

コメント: Aho、Weinberger、Kernighan著の「プログラミング言語AWK」復刊 - スラッシュドット・ジャパン

SNOBOLの作者が作ったIcon言語はPerlと同じ時期に登場してたんだよね。
当時からジェネレータとかあって凄く先進的だったけど、全然受けなかった。
Perlは性能が圧倒的だったからねぇ。スクリプトなのにこんなに速いのかっていう。
いまじゃランタイムコンパイルがLL言語の必須機能みたいになってるけど

Icon はむしろ、ふつーの「プログラミング言語」として作られた面が強いと思う。 なぜなら、「コンパイル」のステージがあったりするから。 C のように機械語の実行ファイルを出力するわけではないのだけど、 中間言語(言語仕様に含まれていたはず)を出力して、 実行するときは(中間言語用の)インタープリターにその中間言語ファイルを食わせて 実行するというスタイル。 だから、#!/usr/local/bin/icon とかいうのはまったく不可能ではないけれども 難しかったりした。 あとは日本語対応する人が出てこなかったからじゃないかなあ(笑) (g)awk → perl は serow さんがいたけど。


コメント: Aho、Weinberger、Kernighan著の「プログラミング言語AWK」復刊 - スラッシュドット・ジャパン

つTCT Manager [vector.co.jp]

GUI上で標準入力、コマンドを入力し、コマンドを実行して
標準出力、標準エラーを表示します。
Java+SwingなのでOSを問いません。
この本のサンプル実行にどうでしょう?

コマンドをパイプでつないで組み立てる場合でも、1つ1つのコマンドを
オプション変えながら試行錯誤するのに便利です。

ほう。

■_ 延期再び

Lisp Scheme Part28 
946 デフォルトの名無しさん [sage] 2010/01/08(金) 17:49:17 ID: Be:
    8日だけど竹内本出た? 

948 デフォルトの名無しさん [sage] 2010/01/08(金) 20:30:03 ID: Be:
    >>946

    3月上旬に延期なんだって。書店から連絡があったよ。
    やりだしたら徹底的にやる竹内先生のこと、単なる復刻版じゃなくて
    あれこれと仕掛けを仕込んでるんで時間がかかってるんじゃないかな。
    気長に待つよ。 

951 デフォルトの名無しさん [sage] 2010/01/08(金) 21:25:58 ID: Be:
    竹内本、前の版持ってるんだけど、買うべき? 

952 デフォルトの名無しさん [sage] 2010/01/08(金) 21:27:22 ID: Be:
    まだ出てもいない本を買うべきかとか
    馬鹿か 

953 デフォルトの名無しさん [sage] 2010/01/08(金) 21:38:42 ID: Be:
    >>945
    > 「対話によるCommon Lisp入門」と言う森北出版から出てる本(ただし絶版)

    今は POD で出てるので、それでよければ普通に買える。 

「ものまね鳥~」オンデマンド出版でいいから復刻してくんないかなあ。

■_ Perl 6


Ovid at blog.perls.org: Cool Things in Perl 6

Cool Things in Perl 6
By Ovid on January 4, 2010 1:01 PM

Yeah, Perl 6 is going to allow us to do very interesting things. Given this code:

use v6;

subset Filename of Str where { $_ ~~ :f };

sub foo (Filename $name) {
    say "Houston, we have a filename: $name";
}

my Filename $foo = $*EXECUTABLE_NAME;
foo($foo);
foo($*EXECUTABLE_NAME);
foo('no_such_file');

We get this output:

Houston, we have a filename: /Users/ovid/bin/perl6
Houston, we have a filename: /Users/ovid/bin/perl6
Constraint type check failed for parameter '$name'
in Main (file src/gen_setting.pm, line 324)

Obviously the error message needs some work (and I would love to be able to generate 
custom error messages for subsets), but proper use of subsets are going to save a lot 
of code and prevent a lot of errors.

よくわからん(笑)

■_ 本日の巡回から

2010年01月07日

■_

・引退
東スポにちっちゃく記事が載っていて知ったのですが、 “ビッグ・ユニット”ランディ・ジョンソンが 2009年シーズン限りで引退だそうで。 グレッグ・マダックスもすでに引退しているし、 時代は変わっていってるんだなあと。しみじみ。

■_ gawk_mb_cur_max

まあいつものようにありがちなパッチなんですが。

Re: [gawk] printf does not recognize .PREC if locale is en_US.UTF-8
Re: [gawk] printf does not recognize .PREC if locale is en_US.UTF-8
From: 	Aharon Robbins
Subject: Re: [gawk] printf does not recognize .PREC if locale is en_US.UTF-8
Date: 	Fri, 01 Jan 2010 11:46:32 +0200

Greetings. Re: this:

> Date: Thu, 31 Dec 2009 13:32:39 +0200
> From: tczy <address@hidden>
> To: address@hidden
> Subject: [gawk] printf does not recognize .PREC if locale is en_US.UTF-8
>
> *** ISSUE AND HOW TO REPRODUCE (IT): ***
>
> echo nothing | awk '{printf "%.3s", "foobar"}'
>
> produces 'foobar' if LC_ALL is en_US.UTF-8. Other variations of the same
> program (with awk 'BEGIN{printf ...', etc.) produce the same. If LC_ALL
> is set to C, everything is fine.
>
> awk '{a=3Dsprintf("%.3s", "foobar"); print a}'
>
> also has this issue.
>
> IRC reports 3.1.5 working well with UTF locale.
>
> *** SYSTEM INFO ***
>
> % gawk --version
> GNU Awk 3.1.7
>
> % uname -a
> Linux sidep.ath.cx 2.6.31-ARCH #1 SMP PREEMPT Tue Nov 10 19:01:40 CET 2009 =
> x86_64 Intel(R) Core(TM)2 Duo CPU T5670 @ 1.80GHz GenuineIntel GNU/Linux
>
> Also GLibC 2.11.1.

It is indeed a bug.  Dealing with multibyte characters in general has been
a continuing source of pain.  Attached is a patch. It will wend its way
into the Savannah CVS shortly.

Happy New Year!

Arnold
---------------------------------------------------------------------------------
Fri Jan  1 11:41:50 2010  Arnold D. Robbins  <address@hidden>

        * builtin.c (format_tree): At pr_tail, remember to take the precision
        into account when determining how many characters to copy out.
        Thanks to tczy <address@hidden> for the bug report.

Index: builtin.c
===================================================================
RCS file: /d/mongo/cvsrep/gawk-stable/builtin.c,v
retrieving revision 1.38
diff -u -r1.38 builtin.c
--- builtin.c   21 Nov 2009 21:16:50 -0000      1.38
+++ builtin.c   1 Jan 2010 09:40:49 -0000
@@ -1223,9 +1223,18 @@
                        if (fw == 0 && ! have_prec)
                                ;
                        else if (gawk_mb_cur_max > 1 && (cs1 == 's' || cs1 == 'c')) {
+                               int nchars_needed = 0;
+
                                assert(cp == arg->stptr || cp == cpbuf);
-                               copy_count = mbc_byte_count(arg->stptr,
-                                               cs1 == 's' ? arg->stlen : 1);
+
+                               if (cs1 == 'c')
+                                       nchars_needed = 1;
+                               else if (have_prec)
+                                       nchars_needed = prec;
+                               else
+                                       nchars_needed = arg->stlen;
+
+                               copy_count = mbc_byte_count(arg->stptr, nchars_needed);
                        }
                        bchunk(cp, copy_count);
                        while (fw > prec) {

主にlocale が C のときの高速化(というか速度低下を防ぐ)のために、 マルチバイト文字を使用するかどうかの判定をいろいろなところでやっているのですが、 そのために参照しているのが gawk_mb_cur_max という変数です。 これはまあ MB_CUR_MAX とほぼ同じです。というか起動時の MB_CUR_MAX の値が gawk_mb_cur_max に代入されたりするんですが。

ふと、gawk 全体ではどのくらい参照していたりするのだろうかということが 気になったので、grep で抜き出してみました。まあおおよその目安にはなろうかと。

awkgram.c:4098:	if (gawk_mb_cur_max > 1) {
awkgram.c:4192:	if (gawk_mb_cur_max > 1)
awkgram.c:4291:			if (gawk_mb_cur_max == 1 || nextc_is_1stbyte) switch (c) {
awkgram.c:4364:	if (gawk_mb_cur_max == 1 || nextc_is_1stbyte) switch (c) {
awkgram.c:4613:			if ((gawk_mb_cur_max == 1 || nextc_is_1stbyte) &&
builtin.c:333:	if (gawk_mb_cur_max > 1) {
builtin.c:351:			if (! do_single_byte && gawk_mb_cur_max > 1) {
builtin.c:387:			if (! do_single_byte && gawk_mb_cur_max > 1) {
builtin.c:480:		if (gawk_mb_cur_max > 1) {
builtin.c:1220:			else if (gawk_mb_cur_max > 1 && (cs1 == 's' || cs1 == 'c')) {
builtin.c:1481:		if (gawk_mb_cur_max > 1) {
builtin.c:1527:	if (gawk_mb_cur_max > 1) {
builtin.c:1550:	if (gawk_mb_cur_max > 1) {
builtin.c:1568:		emalloc(substr, char *, (length * gawk_mb_cur_max) + 2, "do_substr");
builtin.c:1916:	 * And we need gawk_mb_cur_max free bytes before we convert the last
builtin.c:1917:	 * char, so we add (gawk_mb_cur_max - 1).
builtin.c:1919:	osiz = t1->stlen + 2 + (gawk_mb_cur_max - 1);
builtin.c:1928:		if (ofre < gawk_mb_cur_max) {
builtin.c:1988:	if (gawk_mb_cur_max > 1)
builtin.c:2018:	if (gawk_mb_cur_max > 1)
builtin.c:2183:		if (rlength > 0 && gawk_mb_cur_max > 1) {
builtin.c:2209:					if (len > 0 && gawk_mb_cur_max > 1) {
builtin.c:2443:	if (gawk_mb_cur_max > 1 && repllen > 0) {
builtin.c:2449:		if ((gawk_mb_cur_max == 1 || (repllen > 0 && mb_indices[scan - repl] == 1))
builtin.c:2537:				    && (gawk_mb_cur_max == 1
builtin.c:2543:				    && (gawk_mb_cur_max == 1
builtin.c:3364:	assert(gawk_mb_cur_max > 1);
builtin.c:3365:	mb_len = mbrlen(ptr, numchars * gawk_mb_cur_max, &cur_state);
builtin.c:3370:		mb_len = mbrlen(ptr, numchars * gawk_mb_cur_max, &cur_state);
builtin.c:3395:	if (gawk_mb_cur_max == 1)
builtin.c:3398:	mb_len = mbrlen(ptr, numbytes * gawk_mb_cur_max, &cur_state);
builtin.c:3403:		mb_len = mbrlen(ptr, numbytes * gawk_mb_cur_max, &cur_state);
eval.c:1504:		if (gawk_mb_cur_max > 1) {
field.c:378:	if (gawk_mb_cur_max > 1)
field.c:400:			if (gawk_mb_cur_max > 1)	{
field.c:594:	if (gawk_mb_cur_max > 1) {
field.c:642:	if (gawk_mb_cur_max > 1)
field.c:664:		if (gawk_mb_cur_max > 1) {
field.c:731:		if (gawk_mb_cur_max > 1) {
io.c:2741:        if (rs != '\n' && gawk_mb_cur_max > 1) {
main.c:158:int gawk_mb_cur_max;		/* MB_CUR_MAX value, see comment in main() */
main.c:160:const int gawk_mb_cur_max = 1;
main.c:289:	gawk_mb_cur_max = MB_CUR_MAX;
main.c:290:	/* Without MBS_SUPPORT, gawk_mb_cur_max is 1. */
node.c:445:			if (gawk_mb_cur_max > 1) {
re.c:52:	if (gawk_mb_cur_max > 1)
re.c:73:		if (gawk_mb_cur_max > 1 && ! is_multibyte) {
re.c:87:		if ((gawk_mb_cur_max == 1 || ! is_multibyte) &&
re.c:146:		if (gawk_mb_cur_max > 1 && is_multibyte)
re.c:172:		if (gawk_mb_cur_max > 1) {

コメントの中身とか、assert の条件とかもありますが 1との比較をしているところがけっこうありますね。 関数に切り出してごにょるとかして、この辺のロジックをすっきりできないもんかなあ と思ったり思わなかったり。

■_ Scala開発者がやりがちな間違い

わたしは今のところは Scala には手を出していませんので (例の本をちょっと読んだだけ)、ここで挙げられたものが実際どうなのかは良くわかりません(笑)

割りと量があったので、適当に抜き出しています。

Common programming mistakes for Scala developers to avoid - Stack Overflow

In the spirit of

    * Common programming mistakes for Java developers to avoid?
    * Common programming mistakes for JavaScript developers to avoid?
    * Common programming mistakes for .NET developers to avoid?
    * Common programming mistakes for Haskell developers to avoid?
    * Common programming mistakes for Python developers to avoid?
    * Common Programming Mistakes for Ruby Developers to Avoid
    * Common programming mistakes for PHP developers to avoid?

what are some common mistakes made by Scala developers, and how can we avoid them?

Also, as the biggest group of new Scala developers come from Java, what specific 
pitfalls they have to be aware of?

For example, one often cited problem Java programmers moving to Scala make is use a 
procedural approach when a functional one would be more suitable in Scala. What other 
mistakes e.g. in API design newcomers should try to avoid.

Keeping with return null idiom instead of using the Option trait to indicate that a 
method call may not return a value:

val p = productService.find(RIC, "MSFT.O")
if (p == null)
  //do something 
else
  //do something else

Should be replaced by:

productService.find(RIC, "MSFT.O") match {
  case None => //do something
  case Some(p) => //do something else
}

ie. the ProductService.find method should have the signature:

def find(cType: CodeType, code: String) : Option[Product]


Syntactic Mistake

Thinking of "yield" as something like "return". People will try:

for(i <- 0 to 10) {
  if (i % 2 == 0)
    yield i
  else
    yield -i
}

Where the correct expression is:

for(i <- 0 to 10) 
yield {
  if (i % 2 == 0)
    i
  else
    -i
}

Forgetting that Range is non-strict

Ranges are not evaluated until needed, which offen causes confusion when using the to 
function as to returns a Range.

Here's an example where we create three random numbers to use:

$ scala
Welcome to Scala version 2.7.5.final....
Type in expressions to have them evaluated.
Type :help for more information.

scala> val r = new scala.util.Random
r: scala.util.Random = scala.util.Random@36ccf41c

scala> val nums = for(i <- 1 to 3) yield r.nextInt(100)       
nums: RandomAccessSeq.Projection[Int] = RangeM(17, 79, 50)

This looks as if we have 17, 79, and 50. But when we print them again and again...

scala> println(nums)
RangeM(40, 97, 81)

scala> println(nums)
RangeM(41, 75, 86)

...we get different results because the to in 1 to 3 is a Range which is "non strict".

If you want a strict list of numbers you can add toList (or force):

scala> val nums = for(i <- 1 to 3 toList) yield r.nextInt(100) 
nums: List[Int] = List(74, 31, 90)

scala> nums
res2: List[Int] = List(74, 31, 90)

scala> nums
res4: List[Int] = List(74, 31, 90)

+
Misusage Mistake

Forgetting about type erasure. When you declare a class C[A], a trait T[A] or a 
function or method m[A], A is not present at run-time. That means, for instance that 
any type parameter will be actually compiled as AnyRef, even though the compiler 
ensures, compile time, that the types are respected.

It also means that you can't use type parameter A at compile time. For instance, this 
won't work:

def checkList[A](l: List[A]) = l match {
  case _ : List[Int] => println("List of Ints")
  case _ : List[String] => println("List of Strings")
  case _ => println("Something else")
}

At run-time, the List being passed doesn't have a type parameter. Also, List[Int] and 
List[String] will both become List[_], so only the first case will ever be called.

You can get around this, to some extent, by using the experimental feature Manifest, 
like this:

def checkList[A](l: List[A])(implicit m: scala.reflect.Manifest[A]) = m.toString match {
  case "int" => println("List of Ints")
  case "java.lang.String" => println("List of Strings")
  case _ => println("Something else")
}

Misusage and Syntactic Mistake

Using scala.xml.XML.loadXXX for everything. This parser will try to access external 
DTDs, strip comments, and similar things. There is an alternative parser in 
scala.xml.parsing.ConstructingParser.fromXXX.

Also, forgetting spaces around the equal sign when handling XML. This:

val xml=<root/>

really means:

val xml.$equal$less(root).$slash$greater

This happens because operators are fairly arbitrary, and Scala uses the fact that 
alphanumeric character must be separated from non-alphanumeric characters by an 
underscore in a valid identifier to be able to accept expressions such as 
"x+y" without assuming this is a single identifier. Note that "x_+" 
is a valid identifier, though.

So, the way to write that assignment is:

val xml = <root/>


An index is a pointer. It's a pointer over an array, instead of directly into memory, 
but it is a pointer. Everything bad about pointer manipulation applies to indices. It 
subjects your code to pointer math errors, bound errors, etc. A for-comprehension can 
generate the elements themselves, and that's less prone to errors

Design Mistake

Badly designing equality methods. Specifically:

    * Trying to change "==" instead of "equals" (which gives you "!=" for free).
    *v Defining it as

      def equals(other: MyClass): Boolean

      instead of

      override def equals(other: Any): Boolean

    * Forgetting to override hashCode as well, to ensure that if a == b then
      a.hashCode == b.hashCode (the reverse proposition need not be valid).

    * Not making it commutative: if a == b then b == a. Particularly think of subclassing
      -- does the superclass knows how to compare against a subclass it doesn't

      even know exists? Look up canEquals if needed.
    * Not making it transitive: if a == b and b == c then a == c.

■_ 本日の巡回から

■_


人生無根帯  にんげんねもなくへたもない
瓢如陌上塵  みちにさまようちりあくた
分散随風転  ときのながれにみをまかすだけ
此己非常身  しょせんこのみはつねならず
落地成兄弟  おなじこのよにうまれりゃきょうだい
何必骨肉親  えにしはおやよりふかいのだ
得歓当作楽  うれしいときにはよろこんで
斗酒聚比隣  ともだちあつめてのもうじゃないか
盛年不重来  わかいときはにどとはこない
一日難再晨  あさがいちにちにどないように
及時当勉励  いきてるうちがはなではないか
歳月不待人  さいげつひとをまたないぜ


陶淵明「雑詩」『人生無根帯』川島 雄三 訳

2010年01月06日

■_

・カレチ
一部の人には知られてきましたが(笑)、わたしもわりと鉄分が豊富ですので
カレチ 1 (モーニングKC)
こういうのが好きだったりします。 鉄分豊富でも、遠くまで載りにいったりとか写真撮りにいったりはしないんですよね。 どういう風に運営しているのかとかそっちのほうに興味が向いてたりします。 そして鉄道といえば
root(ルート)から/(ルート)へのメッセージ―スーパーユーザーが見たひととコンピュータ
雪に閉ざされた中、除雪しながらSLが近づいてくるエピソードが載ってる話が大好きなんですね。

歴史群像
歴史群像 2010年 02月号 [雑誌]
次が通巻100号だそうで。 これ、創刊号から買ってるんだよなあ。 もちろん全部捨てずに保存している…ということはありません(苦笑) それでも創刊号から何冊かは残していたような気がする。 創刊時は季刊で、隔月刊になり、月刊にまでなったけど 季刊に戻って、さらに隔月刊になって今に至ってるんじゃなかったかなあ。 歴史群像 - Wikipedia によると月刊だった時期はなかったか。 お、こんなページが。 歴史群像 ― 学研デジタル歴史館

■_ とれいと

よくわからん(笑) 適当な日本語訳がついたりするとさらに訳わからんのだろうなあと思いつつ。


Traits ― Andreas Zwinkau

While discussing the pro and contra of single and multiple inheritance, traits are 
often mentioned as the golden mean. Afterwards the discussion gets confusing, because 
nobody really knows what a trait actually is. The Wikipedia page isn't helpful in this 
case. The definitions are often vague or even contradictory. Their meaning changes 
between programming languages.

単一継承と多重継承の pro と contra について議論しているとき、traits はしばしば golden 
mean として言及されますが、そうすると議論は混乱します。なぜなら、実際に trait が何であ
るのかを本当に理解しているのは一人もいないからです。ここでは Wikipedia のページは助けに
はなりません。trait の定義はしばしば vague であり、contradictory ですらあるからです。
その意味もプログラミング言語ごとに変わっています。

In this article I'll describe traits formally and in their implementations in the 
programming languages Scala, C++ and D. The concept of mixins is often confused with 
traits, so I will refrain from mentioning them here and explain them in a different 
article.

本稿では、traits を形式的に、また Scala や C++, D のようなプログラミング言語における実装
で説明します。mixin (ミックスイン) の conceptは traits のそれと良く混同されるので、
I will refrain from mentioning them here and explain them in a different article.

Formal Traits (形式的な Traits)

The basic paper is Traits: Composable Units of Behaviour, where traits are described 
by six properties:

The basic paper is Traits: Composable Units of Behaviour,
traits を六つの proparties によって説明しています:

   1. A trait provides a set of methods that implement behaviour.
      trait は振る舞いを実装するメソッドの集合を提供します。

   2. A trait requires a set of methods that serve as parameters for the provided 
      behaviour.
      trait は振る舞いを提供するためのパラメータとしてのメソッドの集合を要求します。

   3. Traits do not specify any state variables, and the methods provided by traits 
      never access state variables directly.

      traits はなんらのステート変数を指定しませんし、traitsによって提供されるメソッドは
      ステート変数に直接アクセスすることは決してありません。

   4. Classes and traits can be composed from other traits, but the composition order 
      is irrelevant. Conflicting methods must be explicitly resolved.

      クラスと traits は他の traits と compose (集成) することができます。しかし、その
      composition の順序は irrelevant です。メソッドの衝突は明確な形で解決されます。

   5. Trait composition does not affect the semantics of a class: the meaning of the class
      is the same as it would be if all of the methods obtained from the trait(s) were defined
      directly in the class.

      trait の composition はクラスのセマンティクスに影響を及ぼすことはありません。クラスの
      meaning は、すべてのメソッドがそのクラスの中で直接定義されているtrait(s)から得られたと
      きにそうなるであろうものと同じです。

   6. Similarly, trait composition does not affect the semantics of a trait: a composite
      trait is equivalent to a flattened trait containing the same methods.

      同様に、trait の集成は、ある trait の semantics に影響を及ぼすことはありません。集成
      された       trait (composite trait) は同じメソッドを抱えた flattened trait と等価です。

The first three properties describe something like an abstract class where all 
attributes are static, but the methods may call non-static methods of the super class. 
The resolving in (4.) is usually done by declaring a new method, which overrides the 
conflicting methods. If there are no conflicts by definition, composition order 
becomes irrelevant, since it would only be used to resolve conflicts. Traits in Scala

最初三つの properties は、すべてのattributes がスタティックである抽象クラスのようなも
のを説明しています。しかしメソッドはそのスーパークラスの非スタティックなメソッドを呼び
出すことができます。(4.) を解決するのは、通常衝突しているメソッドをオーバーライドす
る新しいメソッドを定義することによります。定義において衝突がなければ、composition 
order は衝突を解決することにだけ使われるので不適切なものとなってしまいます。

Traits in Scala (Scala における traits)

The Scala programming language tries to implement traits faithfully, but has to 
respect its platform, which is the JavaVM. When the Scala compiler processes a trait A 
the resulting class file contains an interface A. The methods declared within a trait 
are moved into every class that inherits from the trait. On top of this there are some 
type checks to keep everything safe. As an example consider the typical class diamond.

プログラミング言語 Scala は traits を faithfully に実装することに挑戦していますが、
JavaVM というプラットフォームを respect しなければなりません。Scala コンパイラーが 
trait A を処理したときの結果のクラスファイルには interface A が含まれています。trait 
の中で宣言されたメソッドはその trait を継承したすべてのクラスの中へと移動します。この
頂点で全てを安全にするために幾つかの型検査が存在します。例として、典型的なダイヤモンド
継承したクラスを考えてみましょう。

    class Top {
      def f = { ... }
    }
    class Left extends Top {
      override def f = { ... }
    }
    class Right extends Top {
      override def f = { ... }
    }
    class Bottom extends Left with Right { }

The Scala compiler will complain that Right must be a trait, because of with Right. 
Classes can only inherit from at most one other class, but many traits. So let's 
change Right to be a trait.

Scala コンパイラーは Right がtrait でなければならないと文句を言いますが、それは
"with Right" となっているからです。クラスはただ一つのクラスからしか継承することができ
ませんが、複数の traits からの継承は許されます。そこで、Right を trait へと変更します。

class Top {
  def f = { ... }
}
class Left extends Top {
  override def f = { ... }
}
trait Right extends Top {
  override def f = { ... }
}
class Bottom extends Left with Right { }

This code compiles and if you evaluate new Bottom().f the method from the Right trait 
will be called. Remember that methods of traits are moved into the inheriting class, 
i.e. Bottom. This can lead to seemingly contradictory error messages, if we remove the 
f method from Top.

このコードをコンパイルして new Bottom().f を評価すると、Right trait からメソッドが呼び
出されます。traits のメソッドは、継承しているクラス、ここでは Bottom に移動しているこ
とを思い出してください。このことは Top からf method を取り除いたときに混乱した error 
messages につながる可能性があるように見えます。

class Top {
}
class Left extends Top {
  def f = { ... }
}
trait Right extends Top {
  override def f = { ... }
}
class Bottom extends Left with Right { }

The compiler will complain that Right::f mustn't have the override qualifier, since 
there is no f in Top, which could be overridden and Right extends Top. The compiler 
will tell you that Right::f must have the override qualifier, since the method ends up 
in Bottom and overrides Left::f.

コンパイラーは、Top に オーバーライドできる f がなく、Right が Top を extends している
ために Right::f が override qualifier を持っていてはいけないと文句を言います。コンパイ
ラーはあなたにそのRight::f が override qualifier をもっていなければならないと主張しま
す。なぜならそのメソッドは結局 Bottom の中で Left::f をオーバーライドするからです。

This shows that traits can get confusing, when you go down to the details like method 
qualifiers. We won't dig deeper into stuff like self types, which refers to the 
"required set of methods" of the second trait property above.

このことはメソッドの qualifiers のような詳細に踏み込んだときに
traits が混乱を招く可能性があることを示しています。
We won't dig deeper into stuff like self types,
わたしたちは self types のような stuff へと深く掘り下げることはしません
which refers to the 
"required set of methods" of the second trait property above.

Traits in C++ (C++ におけるtraits)

In C++ traits are more like a [design pattern]
(http://en.wikipedia.org/wiki/Design_pattern_(computer_science)), since C++ 
allows unrestricted multiple inheritance. The only trait I could find is the 
iterator_trait. It contains multiple attributes which hold types that are associated 
with iterators. For example the attribute iterator_trait<I>::difference_type 
contains the compile-time information of a signed integral type that can be used to 
represent the distance between two iterators. The iterator_trait is implemented by 
using a C++ feature called "partial specialization", which is higher 
template magic.

C++ における traits は、よりデザインパターン
( http://en.wikipedia.org/wiki/Design_pattern_(computer_science) ),
のようなものになっています。なぜならそれは、 C++ が制限のない多重継承を許可しているか
らです。わたしが見つけることのできたただ一つの trait が iteraor_trait です。それはイテ
レーター (itrerators) に結び付けられた型を保持する複数の attribuites からなります。
たとえば iterator_trait<I>::difference_type という attribuite は二つのイテレータ
ー間の距離を表現するのに使用できる符号付き整数型のコンパイル時情報を保持しています。
iterator_trait は高度なテンプレート魔術である "partial specialization"と呼ば
れる C++ の機能を使って実装されています。

Traits in D

The D programming language will also feature traits in version 2.0, but the 
description sounds a little like the C++ version.

プログラミング言語Dもまた version 2.0 で traits の機能を持つことになりますが、その詳細
は C++ のそれと多少似たもののように思われます。

    Traits are extensions to the language to enable programs, at compile time, to get 
    at information internal to the compiler. This is also known as compile time reflection. 
    It is done as a special, easily extended syntax (similar to Pragmas) so that new 
    capabilities can be added as required.

    tratis とは、プログラムがコンパイル時にコンパイラーの内部情報を得られるようにするための
    言語に対する拡張です。これはコンパイル時リフレクション (compile time reflection) として
    も知られています。これは特殊で簡単な (プラグマと同様な)拡張構文として実行されるので、新
    しい capabilities は要求されたものとして追加できるのです。

For example __traits(isAbstractClass, C) is an expression that returns a boolean, 
representing whether C is an abstract class or not. The motivation is:

たとえば  __traits(isAbstractClass, C) というのは
C が abstract class がそうでないかを表すブール値を返す式です。
その motivation は:

    (1) Giving better error messages inside generic code than the sometimes hard to follow
        compiler ones.

    (2) Doing a finer grained specialization than template partial specialization allows for.
        テンプレートの partial specialization が許すものよりも、さらに finer な specialization
        を実現するため。

So traits in D are somewhere between pragmas and C++ traits. They are hardcoded and 
can't be extended by the programmer.

したがって、Dにおけるtratis というのはプラグマと C++ のtraits との間のどこかに位置する
ものです。それらはハードコードされていて、プログラマーによって拡張することはできません。

Conclusion (結論)

There seem to be two distinct ideas about traits. In an academic context the first 
concept of "set of methods" is probably the dominant use. For C++ and 
friends traits are about "compile time information". I hesitate to call the 
latter real traits, since there only seem to be special cases. In D they are a 
hardcoded set of functions and in C++ there is probably no other trait than 
iterator_trait.

traits に関しては、二つの相異なるアイデアがあるようです。academic cotext における最初
のコンセプトの“メソッドの集合”(set of methods) はおそらく広く使われているものです。
For C++ and friends traits are about "compile time information". C++ とその
同類の traits ではコンパイル時情報 (compile time information)についてのものになります。
それらは特殊なケースのように思われるので後者を本物の traits (real traits) と呼ぶことに
は抵抗があります。D における tratis とはハードコードされた関数群であり、C++ の場合には
iterator_trait 以外のものはおそらくありません。

The general meaning of traits should be something that fulfills the six properties 
described above to avoid confusion. This concept looks like a powerful, yet safe 
mechanism between single and multiple inheritance. Thanks to Sebastian Buchwald, 
Sebastian Gregorzyk and Christian Jülg for proofreading

traits の一般的な意味は、混乱を避けるためにあらかじめ説明しておいた六つの propatiess 
を満足している何かであるべきだということです。このコンセプトは強力で、単一継承と多重継
承とのあいだの安全な機構であるように思われます.
Thanks to Sebastian Buchwald, 
Sebastian Gregorzyk and Christian Julg for proofreading

Andreas Zwinkau
Wednesday afternoon, March 18th, 2009

要するに俺様定義がいろいろあるってこと?

■_ 本日の巡回から

■_

みょーん。

2010年01月05日

■_

・Smalltalkはじめました
Haskellどうしたというツッコミが入るでしょうが、まあそれはそれということで。 @sumim さんにアドバイスをいただきながらインストールから簡単なオペレーションを 教えていただきました。これでばりばり処理系内部に潜れるぜ!w 基本的にこれと同じものが何十年も前にあったというのが信じられません。はい。

■_ How to debug your programs

ちょっと前の記事なんですが。

ビルドエラーと実行時エラーの区別が付かない? | 株式会社きじねこ

最近感じることですが、IDEが便利になったせいか、ビルドエラーと実行時エラーの区別がつか
ない人が増えているようです。もう少し具体的にいうと、Visual Studioの場合、コーディング
を行うとすぐにCTRL + F5で実行させようとします。IDEは、ビルドを実行し、ビルドに成功すれ
ばデバッグなしで実行するわけですが、この過程でエラーが発生すると、単に「エラーが出た!」
というだけの認識しか持たず、どんな過程でどんなエラーが出たのかを確認しようとしないので
す。

(略)

このように書くと、ベテランの人からは「うんうん」と合意されたりするのですが、ベテランで
あってもC++のテンプレートに関する不具合については似たような状況になることが少なくない
ようです。C++のテンプレートにバグがあっても、デバッガでステップ実行したりすることがで
きませんから、展開過程のログがエラーメッセージという形で出力されるわけですが、これを
「ワケのわかならないエラーメッセージが大量に出た!」で済ませてしまうベテランも多いので
す。

(略)

確かに、Yahoo知恵袋やOKWaveをはじめとした質問掲示板で 「コンパイルに成功したのにプログラムが期待通り動きません」 的な質問? が投げられているのを良く見かけますね。 それから 「ワーニング」ってエラーが出てしまいます~ とか。 もうひとつ、これはちょっと方向が違いますが、 「ヘッダーファイルはちゃんとしたところにあるのに実行ファイルができません」 (ライブラリの設定がちゃんとしていないのでリンクでこけてる)というのも何度か見ました。 どういった経緯でそういうカリキュラムをとったのか見当がつきませんが、 C やらせんのは無理があんじゃないのかなあ。

あと、後半ですが、Haskellでプログラム組んでるときのわたしがそれです ○| ̄|_ >わけのわからないエラーが大量に

たいしたものを組んでるわけでもないんですが。

■_ Most harmful misconception of beginners about programming?

redditから。 初心者にありがちな問題行動?

Most harmful misconception of beginners about programming? - Stack Overflow

Most harmful misconception of beginners about programming?

What do you consider to be the most harmful misconception about programming from 
people who are new to programming that you have seen?

Re-inventing standard library functions/classes.

After going through a language book/tutorial, most beginners - knowing how to handle 
strings and numbers - will invent their own date functions, their own 'compression 
algorithms', their own SORT implementations.

Oh, and they always spend their first day searching for clrscr();.

Maybe not the most harmful, but they usually can't estimate how long stuff will take 
to be done, they think it can be done much faster than it really must(including me).

As for harmful stuff, good companies usually keep beginners away from where they can 
do much harm. They are usually encouraged to work by someone more experienced, so they 
can learn better.

That if their code doesn't compile or work, it is because of a bug in the compiler.

That if their program works on their own computer, then it will work on everybody 
else's computer too.

    "But it works on my machine!"


    * Programming is easy: Programming is a lot of fun but don't ever think of it as 
      being easy. It takes a lot of experience, learning, and failure to get better at it 
      and be humble about it.

    * Tools do it for me so I don't need to learn what happens underneath the covers: 
      Tools make things a lot easier and allow you to get things done quicker. However, you 
      still need to know and get familiar with what's happening underneath the covers 
      because sooner or later you will need to pop open the hood.

    * Lack of curiosity

    * It's all about the newest and the coolest technologies: Not necessarily. It is 
      about what's right for the customer and the problem you're trying to solve.

"The problem is not in my program, it's a bug in the library / OS / language."

"It worked on my machine! What is wrong with yours?"

"Everything is a pattern, you just have to find them."

"I don't need to test because I only made a one line change."

"Source control is a waste of time for this project."

That their solution is the One and Only True Way To Solve The Problem, and everyone 
else is just dumb and wrong.

The most common misconception is that you can write an application by starting your 
favorite IDE/editor and then write code immediately.

Yes, it will create an application. Yes, it's probably cr@p too when you're finished...

You start developing software by first creating a design. Preferably with pen and 
paper or with some useful tools on your computer. Writing the actual code just happens 
to be a small part of the whole process. (If not, you're doing something wrong!)


That you have to have design patterns in your code.


That the program has to be correct the first time.

Fail fast, early, and often. It's the only way to get better.


That their code doesn't need to be documented. They're the only ones who will ever 
look at it, right?


That the hard part is typing in the code. The farther up you go, the more that comes 
to be the easy part.


    Testing is not important / necessary.

    Unittests are a waste of time

    Certain codestyles (naming conventions, etc..) are not important

コンパイラーのバグってのはありがちな気が。

■_ ふたつでじゅうぶんですよ

やり取りがなんとなく気に入ったのでw

C++相談室 part76 
574 デフォルトの名無しさん [sage] 2010/01/02(土) 22:33:04 ID: Be:
    C++で使えるパーサには
    flex, bison, Boost.Spirit
    等など 色々あるみたいですが、

     1. 習得しやすさ
     2. 対応コンパイラの多さ
     3. できることの広さ
     4. 将来性

    等を総合的に見て、どのパーサが一番良いのでしょうか?
    そのパーサを習得しようと思います。

575 デフォルトの名無しさん [sage] 2010/01/02(土) 23:18:03 ID: Be:
    Boost.Spirit!! 

576 デフォルトの名無しさん [sage] 2010/01/02(土) 23:18:51 ID: Be:
    やめて! 

577 デフォルトの名無しさん [sage] 2010/01/02(土) 23:20:34 ID: Be:
    flexはパーサーじゃなくてレキシカルアナライザー(トークン分割) 

578 デフォルトの名無しさん [sage] 2010/01/02(土) 23:20:50 ID: Be:
    flex と bison じゃ、出来ること違うし。 

579 デフォルトの名無しさん [sage] 2010/01/02(土) 23:23:37 ID: Be:
    spiritって禿しく遅いよね 

580 デフォルトの名無しさん [sage] 2010/01/02(土) 23:26:38 ID: Be:
    メモリも超食うよね 

582 デフォルトの名無しさん [sage] 2010/01/02(土) 23:32:36 ID: Be:
    >>574
    とりあえず、二つに分けて LR と LL という方法がある。
    yacc と ANTLR がそれぞれの方法の代表なので、それで調べてくれ。
    どちらがいいかという話は、宗教論争になる。 

583 デフォルトの名無しさん [sage] 2010/01/03(日) 00:02:27 ID: Be:
    いやいや宗教論争じゃないから処理時間オーダーの性質だとか
    適した言語パラダイムだとかいろいろ性質の違いがあるから。 

584 デフォルトの名無しさん [sage] 2010/01/03(日) 00:48:11 ID: Be:
    >とりあえず、二つに分けて LR と LL という方法がある。
    ここはいい。

    >どちらがいいかという話は、宗教論争になる。
    けど、ここはなんで? 

585 574 [sage] 2010/01/03(日) 09:34:02 ID: Be:
    ありがとうございます。
    flex + bison
    Spirit
    と分けるべきでしたか。
    LL法とLR法ですが、現在ではLR法の方が主流という話も伺っています。

624 デフォルトの名無しさん [sage] 2010/01/05(火) 17:57:03 ID: Be:
    >>582,584
    二つじゃないよ。 

625 デフォルトの名無しさん [sage] 2010/01/05(火) 17:58:19 ID: Be:
    二つで十分ですよ
    分かってくださいよ 

626 デフォルトの名無しさん [sage] 2010/01/05(火) 18:00:03 ID: Be:
    正確に言うと4つ。
    RRとRLもあるよね。 

627 デフォルトの名無しさん [sage] 2010/01/05(火) 18:02:13 ID: Be:
    ノー、ツーツーフォー 

RR とか RL はないだろう(^^; まあネタでいってるんだろうけど。 ここで演算子順位法とか再帰下降とか持ち出せば、合計四つになる?

■_ 本日の巡回から

2010年01月04日

■_

・しーごーとー
明日から(もう0時回ってますが)仕事。やれやれだ。

■_ キャスト

ちょっとぐぐったらやっぱり前にも書いていました(笑) んでまあ、多分前回とは違う方向で。


Errata for The C Programming Language, Second Edition
Errata for The C Programming Language, Second Edition

This lists all known errors in The C Programming Language, Second Edition, by Brian 
Kernighan and Dennis Ritchie (Prentice-Hall, 1988).

The pagination of the book has changed only in minor ways across printings of the 
English-language edition. These errata now include section numbers, which are more 
likely to be preserved across translations. This might help identify errors that 
survive into translated editions.

(略)

142(§6.5, toward the end): The remark about casting the return value of malloc 
("the proper method is to declare ... then explicitly coerce") needs to be 
rewritten. The example is correct and works, but the advice is debatable in the 
context of the 1988-1989 ANSI/ISO standards. It's not necessary (given that coercion 
of void * to ALMOSTANYTYPE * is automatic), and possibly harmful if malloc, or a proxy 
for it, fails to be declared as returning void *. The explicit cast can cover up an 
unintended error. On the other hand, pre-ANSI, the cast was necessary, and it is in 
C++ also.

(略)

Updated Oct 23 2006 with program bug on line 136

Copyright © 2002 Lucent Technologies. All rights reserved. 

まあそういうことで。

■_ これは(ry

毎度おなじみ OKWaveから


簡易grepコマンドの作成を自作プログラムで作りたいのですが…… | OKWave

簡易grepコマンドの作成を自作プログラムで作りたいのですが……

C言語でです。
C++ではなぃです。

できれば初心者が考えるよぉなプログラムで。

またコメントみたぃにプログラムの意味も詳しくわかりやすくあると助かります。

コンパイルは
./mygrep 検索するもの ディレクトリ/ファイル名

だった気がします。
mygrepはプログラム名です。


おねがぃします。

ANo.1

で、何がわからないんでしょうか?

>できれば初心者が考えるよぉなプログラムで。

回答を課題の結果として提出するから…ですか?
高度(?)なものだと、先生にバレる…とか。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 char cmd[100];

 sprintf(cmd, "grep %s %s", argv[1], argv[2]);
 return system(cmd);
}

補足

質問はgrepコマンドを自作でつくることです。

コマンドラインから取得なので…

あとcmdの使い方はまだよくわかりません(泣)

あと課題は課題です。
ですが初心者というのは、
ほんとに初心者だからです。

すぃません。
みなさんならどんな自作プログラムを考えれるのかと思い、
質問をしています。

プログラムを提示が一番うれしぃですが
どんな考え方をするのかだけでもかまいません。

すぃません、お願いします。

ANo.2

...で、ご質問は?

補足

grepコマンドの自作プログラムを作ってほしぃのです。

すぃません、プログラムでもどのような考え方だけでもかまいません。

お願いします。

ANo.3

>grepコマンドの自作プログラムを作ってほしぃのです。
それはもはや自作とは呼べません

>考え方だけ
1.コマンドラインから検索したい文字列を指定したパラメータを取得する
2.検索対象ファイルを読み込んで指定された文字があるか検索(比較)する
3.結果を表示する
4.他に対象のファイルがあるなら2へ無ければ終了

ANo.4

どれくらいの「簡易」を期待しているのでしょうか。

grepのreは正規表現(regular expression)を表していますが、正規表現をサポートしたプログ
ラムを書こうとするとかなりの分量になります。

参考までに、GNU grepのソースコードならftp://ftp.ring.gr.jp/pub/GNU/grep/から入手できます。

GNU grepのソースってのは意識してなのかそうでないのか。 あれをいきなり読ませるのは…(笑) たぶんソフトウェア作法にあるレベル程度で問題ないと思うけど、かえってわかりづらいか。

■_ 本日の巡回から

■_

あーあれもこれも中途半端。

2010年01月03日

■_

五月雨式に今年の目標的な何か。

・新しい何か。誰も見つけていない何かを探すのではなく、 皆が見落としているもの、忘れてしまっているもの、 なくなろうとしているものを探してみたい。 具体的には何も考えていない(笑)

・結局あれもこれもと増えてきてしまって収集つかなくなるのは目に見えているけれども、 圏論日記の方ももうちょっとペースを上げるなりなんなりしたい。

・toRubyに一回参加してみたい

■_ PEP 392

こういうのもPEPになるのかあ。


PEP 392 -- Python 3.2 Release Schedule

Abstract

This document describes the development and release schedule for Python 3.2. The 
schedule primarily concerns itself with PEP-sized items. Small features may be added 
up to and including the first beta release. Bugs may be fixed until the final release, 
which is planned for December 2010.

Release Manager and Crew

    * 3.2 Release Manager: Georg Brandl
    * Windows installers: Martin v. Loewis
    * Mac installers: Ronald Oussoren
    * Documentation: Georg Brandl

Release Schedule

The current schedule is:

    * 3.2 alpha 1: June 26, 2010
    * 3.2 alpha 2: July 24, 2010
    * 3.2 alpha 3: August 21, 2010
    * 3.2 beta 1: September 18, 2010

(No new features beyond this point.)

    * 3.2 beta 2: October 16, 2010
    * 3.2 candidate 1: November 13, 2010
    * 3.2 candidate 2: November 27, 2010
    * 3.2 final: December 11, 2010

Every release day listed here is a Saturday; the actual availability of the release 
for download on python.org will depend on the schedules of the crew.

Features for 3.2

Note that PEP 3003 [1] is in effect: no changes to language syntax and no additions to 
the builtins may be made.

No large-scale changes have been recorded yet.

References
[1]	http://www.python.org/dev/peps/pep-3003/

Copyright

This document has been placed in the public domain.
Website maintained by the Python community
hosting by xs4all / design by Tim Parkin
Copyright © 1990-2009, Python Software Foundation
Legal Statements

まあがんがんバージョン上がるのもこまるわけで、このくらいならば。

■_ これも今年の目標?

Introduction to Algorithms, Third Edition Introduction to Algorithms, Third Edition
(右の高いほうがハードカバーです。わたしが買ったのはペーパーバック)

原書では最近第三版が出まして、せっかく読むのならそっちにしようと。 で、某方面から第二版との違いをまとめろと圧力をかけられてたり(笑) とりあえず目次を第二版と第三版とで比べてみるとこんな感じ。


Introduction to Algorithms, Second Edition - Table of Contents - The MIT Press

Introduction to Algorithms, Second Edition

Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein

	Preface

I	Foundations	
	Introduction	3
1	The Role of Algorithms in Computing
2	Getting Started	15
3	Growth of Functions	41
4	Recurrences	62
5	Probabilistic Analysis and Randomized Algorithms	91

II	Sorting and Order Statistics	
	Introduction	123
6	Heapsort	127
7	Quicksort	145
8	Sorting in Linear Time	165
9	Medians and Order Statistics	183

III	Data Structures	
	Introduction	197
10	Elementary Data Structures	200
11	Hash Tables	221
12	Binary Search Trees	253
13	Red-Black Trees	273
14	Augmenting Data Structures	302

IV	Advanced Design and Analysis Techniques	
	Introduction	321
15	Dynamic Programming	323
16	Greedy Algorithms	370
17	Amortized Analysis	405

V	Advanced Data Structures	
	Introduction	431
18	B-Trees	434
19	Binomial Heaps	455
20	Fibonacci Heaps	476
21	Data Structures for Disjoint Sets	498
VI	Graph Algorithms	
	Introduction	525
22	Elementary Graph Algorithms	527
23	Minimum Spanning Trees	561
24	Single-Source Shortest Paths	580
25	All-Pairs Shortest Paths	620
26	Maximum Flow	643

VII	Selected Topics	
	Introduction	701
27	Sorting Networks	704
28	Matrix Operations	725
29	Linear Programming	770
30	Polynomials and the FFT	822
31	Number-Theoretic Algorithms	849
32	String Matching	906
33	Computational Geometry	933
34	NP-Completeness	966
35	Approximation Algorithms	1022

VIII	Appendix: Mathematical Background	
	Introduction	1057
A	Summations	1058
B	Sets, Etc.	1070
C	Counting and Probability	1094
	
	Bibliography
	Index

第三版はこっち。


Introduction to Algorithms, Third Edition - Table of Contents - The MIT Press


Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein

Preface

I	Foundations

		Introduction	3
	1	The Role of Algorithms in Computing	5
	1.1	Algorithms	5
	1.2	Algorithms as a technology	11
	2	Getting Started	16
	2.1	Insertion sort	16
	2.2	Analyzing algorithms	23
	2.3	Designing algorithms	29
	3	Growth of Functions	43
	3.1	Asymptotic notation	43
	3.2	Standard notations and common functions	53
	4	Divide-and-Conquer	65
	4.1	The maximum-subarray problem	68
	4.2	Strassen's algorithm for matrix multiplication	75
	4.3	The substitution method for solving recurrences	83
	4.4	The recursion-tree method for solving recurrences	88
	4.5	The master method for solving recurrences	93
	4.6	Proof of the master theorem	97
	5	Probabilistic Analysis and Randomized Algorithms	114
	5.1	The hiring problem	114
	5.2	Indicator random variables	118
	5.3	Randomized algorithms	122
	5.4	Probabilistic analysis and further uses of indicator random variables	130
		
II	Sorting and Order Statistics	
	
		Introduction	147
	6	Heapsort	151
	6.1	Heaps	151
	6.2	Maintaining the heap property	154
	6.3	Building a heap	156
	6.4	The heapsort algorithm	159
	6.5	Priority queues	162
	7	Quicksort	170
	7.1	Description of quicksort	170
	7.2	Performance of quicksort	174
	7.3	A randomized version of quicksort	179
	7.4	Analysis of quicksort	180
	8	Sorting in Linear Time	191
	8.1	Lower bounds for sorting	191
	8.2	Counting sort	194
	8.3	Radix sort	197
	8.4	Bucket sort	200
	9	Medians and Order Statistics	213
	9.1	Minimum and maximum	214
	9.2	Selection in expected linear time	215
	9.3	Selection in worst-case linear time	220
		
III	Data Structures	
	
		Introduction	229
	10	Elementary Data Structures	232
	10.1	Stacks and queues	232
	10.2	Linked lists	236
	10.3	Implementing pointers and objects	241
	10.4	Representing rooted trees	246
	11	Hash Tables	253
	11.1	Direct-address tables	254
	11.2	Hash tables	256
	11.3	Hash functions	262
	11.4	Open addressing	269
	11.5	Perfect hashing	277
	12	Binary Search Trees	286
	12.1	What is a binary search tree?	286
	12.2	Querying a binary search tree	289
	12.3	Insertion and deletion	294
	12.4	Randomly built binary search trees	299
	13	Red-Black Trees	308
	13.1	Properties of red-black trees	308
	13.2	Rotations	312
	13.3	Insertion	315
	13.4	Deletion	323
	14	Augmenting Data Structures	339
	14.1	Dynamic order statistics	339
	14.2	How to augment a data structure	345
	14.3	Interval trees	348
		
IV	Advanced Design and Analysis Techniques	
	
		Introduction	357
	15	Dynamic Programming	359
	15.1	Rod cutting	360
	15.2	Matrix-chain multiplication	370
	15.3	Elements of dynamic programming	378
	15.4	Longest common subsequence	390
	15.5	Optimal binary search trees	397
	16	Greedy Algorithms	414
	16.1	An activity-selection problem	415
	16.2	Elements of the greedy strategy	423
	16.3	Huffman codes	428
	16.4	Matroids and greedy methods	437
	16.5	A task-scheduling problem as a matroid	443
	17	Amortized Analysis	451
	17.1	Aggregate analysis	452
	17.2	The accounting method	456
	17.3	The potential method	459
	17.4	Dynamic tables	463
		
V	Advanced Data Structures	
	
		Introduction	481
	18	B-Trees	484
	18.1	Definition of B-trees	488
	18.2	Basic operations on B-trees	491
	18.3	Deleting a key from a B-tree	499
	19	Fibonacci Heaps	505
	19.1	Structure of Fibonacci heaps	507
	19.2	Mergeable-heap operations	510
	19.3	Decreasing a key and deleting a node	518
	19.4	Bounding the maximum degree	523
	20	van Emde Boas Trees	531
	20.1	Preliminary approaches	532
	20.2	A recursive structure	536
	20.3	The van Emde Boas tree	545
	21	Data Structures for Disjoint Sets	561
	21.1	Disjoint-set operations	561
	21.2	Linked-list representation of disjoint sets	564
	21.3	Disjoint-set forests	568
	21.4	Analysis of union by rank with path compression	573
		
VI	Graph Algorithms	
	
		Introduction	587
	22	Elementary Graph Algorithms	589
	22.1	Representations of graphs	589
	22.2	Breadth-first search	594
	22.3	Depth-first search	603
	22.4	Topological sort	612
	22.5	Strongly connected components	615
	23	Minimum Spanning Trees	624
	23.1	Growing a minimum spanning tree	625
	23.2	The algorithms of Kruskal and Prim	631
	24	Single-Source Shortest Paths	643
	24.1	The Bellman-Ford algorithm	651
	24.2	Single-source shortest paths in directed acyclic graphs	655
	24.3	Dijkstra's algorithm	658
	24.4	Difference constraints and shortest paths	664
	24.5	Proofs of shortest-paths properties	671
	25	All-Pairs Shortest Paths	684
	25.1	Shortest paths and matrix multiplication	686
	25.2	The Floyd-Warshall algorithm	693
	25.3	Johnson's algorithm for sparse graphs	700
	26	Maximum Flow	708
	26.1	Flow networks	709
	26.2	The Ford-Fulkerson method	714
	26.3	Maximum bipartite matching	732
	26.4	Push-relabel algorithms	736
	26.5	The relabel-to-front algorithm	748
		
VII	Selected Topics	
	
		Introduction	769
	27	Multithreaded Algorithms
	27.1	The basics of dynamic multithreading	774
	27.2	Multithreaded matrix multiplication	792
	27.3	Multithreaded merge sort	797
	28	Matrix Operations	813
	28.1	Solving systems of linear equations	813
	28.2	Inverting matrices	827
	28.3	Symmetric positive-definite matrices and least-squares approximation	832
	29	Linear Programming	843
	29.1	Standard and slack forms	850
	29.2	Formulating problems as linear programs	859
	29.3	The simplex algorithm	864
	29.4	Duality	879
	29.5	The initial basic feasible solution	886
	30	Polynomials and the FFT	898
	30.1	Representing polynomials	900
	30.2	The DFT and FFT	906
	30.3	Efficient FFT implementations	915
	31	Number-Theoretic Algorithms	926
	31.1	Elementary number-theoretic notions	927
	31.2	Greatest common divisor	933
	31.3	Modular arithmetic	939
	31.4	Solving modular linear equations	946
	31.5	The Chinese remainder theorem	950
	31.6	Powers of an element	954
	31.7	The RSA public-key cryptosystem	958
	31.8	Primality testing	965
	31.9	Integer factorization	975
	32	String Matching	985
	32.1	The naive string-matching algorithm	988
	32.2	The Rabin-Karp algorithm	990
	32.3	String matching with finite automata	995
	32.4	The Knuth-Morris-Pratt algorithm	1002
	33	Computational Geometry	1014
	33.1	Line-segment properties	1015
	33.2	Determining whether any pair of segments intersects	1021
	33.3	Finding the convex hull	1029
	33.4	Finding the closest pair of points	1039
	34	NP-Completeness	1048
	34.1	Polynomial time	1053
	34.2	Polynomial-time verification	1061
	34.3	NP-completeness and reducibility	1067
	34.4	NP-completeness proofs	1078
	34.5	NP-complete problems	1086
	35	Approximation Algorithms	1106
	35.1	The vertex-cover problem	1108
	35.2	The traveling-salesman problem	1111
	35.3	The set-covering problem	1117
	35.4	Randomization and linear programming	1123
	35.5	The subset-sum problem	1128
		
VIII	Appendix: Mathematical Background	
	
		Introduction	1143
	A	Summations	1145
	A.1	Summation formulas and properties	1145
	A.2	Bounding summations	1149
	B	Sets, Etc.	1158
	B.1	Sets	1158
	B.2	Relations	1163
	B.3	Functions	1166
	B.4	Graphs	1168
	B.5	Trees	1173
	C	Counting and Probability	1183
	C.1	Counting	1183
	C.2	Probability	1189
	C.3	Discrete random variables	1196
	C.4	The geometric and binomial distributions	1201
	C.5	The tails of the binomial distribution	1208
	D	Matrices	1217
	D.1	Matrices and matrix operations	1217
	D.2	Basic matrix properties	1222
	
	Bibliography	1231
	Index

同じチャプタータイトルでも同じとは限らないのでしょうが、それはまずおいといて。 VI のグラフ関係はまるきり新しく増えたのかな? VII の selected topics でもマルチスレッド関連は新規に増えた分でしょうね。

ということでゆるゆると進めていきます。 とか書くとまた放置するだろうから、適当にプレッシャーかけてください(笑) 東急沿線あたりで他にも買ったと言う人が名乗り出てきたら、 勉強会とか読書会とかを考えないでもありません。

あーでもあれだ。新しく増えた部分はいいとしても、第二版持ってないから、 チャプタータイトルが同じところで変わったところのチェックとかはできないなw

http://www.asahi-net.or.jp/~KI4S-NKMR/wabijo141.html

■_ strなんとかとかキャストとか


C言語なら俺に聞け(入門編)Part 58 
727 デフォルトの名無しさん [sage] 2010/01/03(日) 15:12:32 ID: Be:
    strcpyみたいな文字列関連の関数は
    コピー先を参照渡しじゃなくて戻り値として取得することは出来ないの? 

733 デフォルトの名無しさん [sage] 2010/01/03(日) 17:51:08 ID: Be:
    >>727
    char *strcpy(s, ct) の戻り値は s だが、それでは不満?
    とすれば、C 言語には文字列型はないので、それは不可能。
    というか、C 言語の malloc()/free() について経験と考察が必要と思われます。
    strcpy が文字列を戻り値として返してきたとして、それを解放するのは誰? 

739 デフォルトの名無しさん [sage] 2010/01/03(日) 18:18:03 ID: Be:
    >>727
    環境によっちゃstrdupがあったりするけど、コピー先決められないのって不便じゃね? 

740 デフォルトの名無しさん [sage] 2010/01/03(日) 18:24:03 ID: Be:
    今だと、ローカルルールでstr系の関数を使用禁止にしてたりしない? 

741 デフォルトの名無しさん [sage] 2010/01/03(日) 18:27:59 ID: Be:
    >>740
    そんなところあるの? 

742 デフォルトの名無しさん [sage] 2010/01/03(日) 19:40:34 ID: Be:
    >>740
    なぜに、というか strncpy() 推奨ってことかも。 

743 デフォルトの名無しさん [sage] 2010/01/03(日) 20:10:56 ID: Be:
    >>742
    しかしstrncpyもstr系には入らないのか?

744 デフォルトの名無しさん [sage] 2010/01/03(日) 21:01:24 ID: Be:
    >>739
    strdup() にしても使用後にはちゃんと解放しなければならないし。 

745 デフォルトの名無しさん [sage] 2010/01/03(日) 21:02:09 ID: Be:
    >>743
    んー、入るでしょうかね、んー。 

746 デフォルトの名無しさん [sage] 2010/01/03(日) 21:41:27 ID: Be:
    strncpyって罠が多すぎるうえに非効率極まりないゴミという印象しかない 

747 デフォルトの名無しさん [sage] 2010/01/03(日) 21:46:45 ID: Be:
    >>746
    場合によっては '\0' をつけないときがあるのがややこしいですね。 

748 デフォルトの名無しさん [sage] 2010/01/03(日) 21:47:47 ID: Be:
    もっとゴミなのは、strcpy_s とか独自の関数を作って
    しかもそれを推奨するコンパイラ 

749 デフォルトの名無しさん [sage] 2010/01/03(日) 21:51:16 ID: Be:
    >>748
    おっとVCの悪口はそこまでだ 

750 デフォルトの名無しさん [sage] 2010/01/03(日) 21:52:00 ID: Be:
    strnlcpyってのもあるが

    GCCなどワガママが作ってるコンパイラには入ってない

    お前ンとこのポリシーがどうかじゃなく
    安全かどうかだっつうに 

751 デフォルトの名無しさん [sage] 2010/01/03(日) 21:54:01 ID: Be:
    >>727,742-751
    bccでlstrcatでも使ってろ 

752 デフォルトの名無しさん [sage] 2010/01/03(日) 22:00:21 ID: Be:
    >>750
    > 安全かどうかだっつうに
    それこそお前だけのポリシーじゃねぇか
    お前本当に職業プログラマかよw
    移植性とか標準規格とか考えたこともないの?哀れな。 

753 デフォルトの名無しさん [sage] 2010/01/03(日) 22:02:30 ID: Be:
    何の手も加えずにどこでも動くもんなんか存在しねえよ
      

754 デフォルトの名無しさん [sage] 2010/01/03(日) 22:30:09 ID: Be:
    職業プログラマ(笑)は黙ってろよ 

755 デフォルトの名無しさん [sage] 2010/01/03(日) 22:42:23 ID: Be:
    >>754
    ん?オープンソースで活躍している人も
    ほとんどが(元)職業プログラマですけど。。。 

756 デフォルトの名無しさん [sage] 2010/01/03(日) 23:18:27 ID: Be:
    ここは入門スレだから元だろうが現だろうがプロ(笑)はいらねーんだよ 

757 デフォルトの名無しさん [sage] 2010/01/03(日) 23:30:48 ID: Be:
    >>756
    そんな自分に言い聞かせなくてもw 

759 デフォルトの名無しさん [sage] 2010/01/03(日) 23:37:04 ID: Be:
    >>740
    隣の席の人のやってるプロジェクトが、str系使わないで、
    memcpy()とかmemcmp()を使って、文字列のサイズをことごとく、
    直接書いてるのな。
    memcpy(a, b, 10); みたいに。

    str系はセキュアじゃないみたいなのが、間違って伝わってるんだろうなって
    推測してる。 

762 デフォルトの名無しさん [sage] 2010/01/03(日) 23:41:25 ID: Be:
    >>748
    独自って言っても、そのうち標準になるんでしょ? 

763 デフォルトの名無しさん [sage] 2010/01/03(日) 23:52:05 ID: Be:
    >>762
    そんなんいつの話さ。

764 デフォルトの名無しさん [sage] 2010/01/03(日) 23:58:17 ID: Be:
    Cで

    char *head;

    if( (head = (char *)malloc(SIZE1024)) == NULL){
     fprintf(DISPLAY, "Process couldn't get Memory space\r\n");
     return -1;
    }

     ・・・
     ・・・
     ・・・

     free(head);     /* free */
     head = NULL;   /* headは他からもfreeされる恐れあり */


    ってやると「やり直せ!」と言われるんだけどなして?

765 デフォルトの名無しさん [sage] 2010/01/04(月) 00:04:32 ID: Be:
    >>764
    SIZE1024って意味なくね? 

768 デフォルトの名無しさん [sage] 2010/01/04(月) 00:08:09 ID: Be:
    最大255文字を取る文字列の操作のために1024バイトを確保 

769 デフォルトの名無しさん [sage] 2010/01/04(月) 00:09:40 ID: Be:
    mallocと言えば、キャストするしないでえらい怒られたなあ。
    俺は単純に見た目分かりやすいのを好むのと、
    C++ではvoid*は明示的にキャストしないといけないからやっていただけだっつうのに。
    なんぞ悪いんかい。って思った。 

770 デフォルトの名無しさん [sage] 2010/01/04(月) 00:12:46 ID: Be:
    (char *)malloc(SIZE1024 * sizeof(char)) かなぁ
    名前の付け方とか 

771 デフォルトの名無しさん [sage] 2010/01/04(月) 00:18:28  ID: Be:
    >sizeof(char)
    何ひとつ解っていない、と思われても仕方ないレベル 

772 デフォルトの名無しさん [sage] 2010/01/04(月) 00:32:22 ID: Be:
    >>769
    不必要にキャストするのはバグの元だし、C++ならCのキャストは使わない方がいいし
    どっちにしろ怒られるのは仕方がないことかと 

Microsoftもかわいそうに(笑) まあこれまでの行いがという話なんだろうけど。 mem* でごにょるというのは、うるりっひがどうとかいう話で見かけたような。 まあそれはそれとして、strncpy/strncat も末尾の '\0' がつかないケースがある という他にもはまりやすいとか、デスティネーション側が大きいときに 無駄に0埋めするパターンが生じて遅くなりました。ってケースも聞くしねえ。

キャストに関してはまあ 772 のいう通りなんだけど、 日本で出ているたいていの参考書や教科書は(K&Rを含めて) キャストしているものばかりじゃないかなあ。

■_ 本日の巡回から

2010年01月02日

■_

さて初詣はどうしましょうかねえ。

■_ iに時間を

見覚えあったよなあ。で探してみたところ、二つほど引っかかりました。 redditにもあったかなあ。


Who "invented" i,j,k as integer counter variable names? - Stack Overflow

    i = integer

    Comes from Fortran where integer variables had to start with the letters I through N and
    real variables started with the other letters. Thus I was the first and shortest integer
    variable name. Fortran was one of the earliest programming languages in widespread use
    and the habits developed by programmers using it carried over to other languages.

(From: Why are we using i as a counter in loops)

Obviously, j and k are just the next ones in your favorite alphabet.

Maybe it was a later addition, but in FORTRAN-G at least, variables starting with I-N 
where INTEGER unless declared otherwise. It was perfectly legal to say "REAL 
IVAR" or "INTEGER A".


The Mathematicians :)

It's common from school-level and college-level algebra exercises (although x and y 
had their part to play, there, too :-)

Also, if I remember correctly, the early programming languages (like early versions of 
FORTRAN) used variable naming in a way where initial letters were significant, and 
this may have had a part to play. For example, as this page says:

    A FORTRAN variable is a way of referring to a cell of the computer. Names for 
    variables must conform to the following rules:

       1. The name may be from one to six characters.
       2. The first character must be a letter.
       3. Characters other than the first may be letters or numeric digits.
       4. If the first character is I, J, K, L, M or N, the variable is integer (i.e. can
          hold a whole number value). Otherwise, it is real (i.e. can hold a value according
          to the floating point convention).


FORTRAN. If the first character is I, J, K, L, M or N, the variable is integer (i.e. 
can hold a whole number value). Otherwise, it is real (i.e. can hold a value according 
to the floating point convention).


From the wikipedia for Loop Counter

    A common identifier naming convention is for the loop counter to use the variable 
    names i, j and k (and so on if needed), where i would be the most outer loop, j the 
    next inner loop, etc. The reverse order is also used by some programmers. This style 
    is generally agreed to have originated from the early programming of FORTRAN, where 
    these variable names beginning with these letters were implicitly declared as having 
    an integer type, and so were obvious choices for loop counters that were only
    temporarily required. The practice also dates back further to mathematical notation 
    where indices for sums and multiplications are often i, j, etc.


I always thought i stands for index as used eg in sum formulas in mathematics.

ふたつめ。


Why are we using i as a counter in loops - Stack Overflow

why are we using

for (int i = 0 ; i < count ; i++){ }

why the i

why not

for (int a = 0; a < count; a++){ }

I do it, you do it, everyone does it but WHY?

*edit

I found out an old saying about FORTRAN which is more funny than correct which says 
"god is real, everything else above is an integer".

"god" would be a variable name stating with a g so it would be in the real 
domain, while everything else above (excluding h for the joke's purpose) would be an 
integer

It seems that the original saying was in fact : "God is real, unless declared 
integer". Apologies to everyone citing me in their phd thesis
i = integer

Comes from Fortran where integer variables had to start with the letters I through N 
and real variables started with the other letters. Thus I was the first and shortest 
integer variable name. Fortran was one of the earliest programming languages in 
widespread use and the habits developed by programmers using it carried over to other 
languages.

EDIT: I have no problem with the answer that it derives from mathematics. Undoubtedly 
that is where the Fortran designers got their inspiration. The fact is, for me anyway, 
when I started to program in Fortran we used I, J, K, ... for loop counters because 
they were short and the first legally allowed variable names for integers. As a 
sophomore in H.S. I had probably heard of Descartes (and a very few others), but made 
very little connection to mathematics when programming. In fact, the first course I 
took was called "Fortran for Business" and was taught not by the math 
faculty, but the business/econ faculty.

For me, at least, the naming of variables had little to do with mathematics, but 
everything due to the habits I picked up writing Fortran code that I carried into 
other languages.

I'm pretty sure it was FORTRAN. 


Ya, fortran..... It rots the mind. We have a programmer that uses i ii and iii as loop 
variable names. The other symptom is 6 character variable/function names with no 
vowels. 


Hey, the FORTRAN guys got it off the mathematicians! – timday Jan 18 '09 at 0:10

I love historical artifacts like this. It adds depth to programming, and makes me feel 
connected to the past. – OrbMan Jan 18 '09 at 1:48

I agree with @timday. Using i as an index of a series has been a practice by 
mathematicians for at least 2 centuries. – Scottie T Jun 2 at 13:06

Mathematicians were using i,j,k to designate integers in algebra (subscripts, series, 
summations etc) long before (e.g 1836 or 1816) computers were around (this is the 
origin of the FORTRAN variable type defaults). The habit of using letters from the end 
of the alphabet (...,x,y,z) for unknown variables and from the beginning (a,b,c...) 
for constants is generally attributed to Rene Descartes, (see also here) so I assume 
i,j,k...n (in the middle of the alphabet) for integers is likely due to him too.


This is exactly the reason that the we need to be able to vote for a community 
accepted answer (and yeah I know this belongs on uservoice).

Heh. I occasionally update the link to an old google book in this answer because 
google keeps chopping stuff around. By chance, I note the 1816 document now linked 
includes Charles Babbage (presumably he of difference engine/analytical engine fame) 
as an author. So arguably it's an example of the first use of an integer variable 
"i" by a computer programmer :^)

I think it's most likely derived from index (in the mathematical sense) - it's used 
commonly as an index in sums or other set-based operations, and most likely has been 
used that way since before there were programming languages.


Yup. The mathematic notation for a sum like Y = Σ Xi precedes every programming 
language.


I am thinking of index each time I use i. But originally I use it mainly because all 
code I look at elsewhere use it, and that may be inherited from Fortran programmers... 

Possibly historical ?

FORTRAN, aurguably the first high level language, defined i,j,k,l,m as Integer 
datatypes by default, and loops could only be controlled by integer variable, the 
convention continues ?

eg:

do 100 i= j,100,5 .... 100 continue ....
I use it for a number of reasons.

    * Usually my loops are int based, so you make a complete triangle on the keyboard typing
      "int i" with the exception of the space I handle with my thumb. This is a very fast
      sequence to type.

    * The "i" could stand for iterator, integer, increment, or index, each of which
      makes logical sense.

With my personal uses set aside, the theory of it being derived from FORTRAN is correct,
where integer vars used letters I - N.


It's funny how everyone has a different take on this. I always assumed that it stood 
for 'index'. The fact that everyone immediately realizes what it means is enough for 
me.


i = iterator, i = index, i = integer

Which ever you figure "i" stands for it still "fits the bill".

Also, unless you have only a single line of code within that loop, you should probably 
be naming the iterator/index/integer variable to something more meaningful. Like: 
employeeIndex

BTW, I usually use "i" in my simple iterator loops; unless of course it 
contains multiple lines of code.

Most probably we are using i because we learn to program from examples.

Early examples of for(;;){} loops in C seem to use i as the iteration variable. 
Checking around the Internet shows this to remain true (see 
http://en.wikipedia.org/wiki/For_loop).

Once we learn a pattern (i, j, k for nested loops) they become habits and moreover 
become accepted, even expected, norms for collaboration.

This doesn't make it right or optimal to continue, of course.


The original BASIC manual from 1964 used X. From the late 1970s and early 1980s, I 
remember a lot of I, J, X, Y, M, N. Every once in awhile you saw an A, A0, AA, but not 
very often. bitsavers.org/pdf/dartmouth/… 


I'm quite sure that i comes from index (I'm a mathematician, after all).

Actually when I was high-schooler, my loop variables were usually called idx, jdx and kdx.

FORTRAN の implicit な型宣言が元だろうという意見は海の向こうでもあるみたいですね。 でまあ数学から来てるんじゃね? ということで。

■_ あーこれは

だめだな(笑)


Beatjamにてナビから音楽を戻そうとしたら、データが消えた!!権利 | OKWave

Beatjamにてナビから音楽を戻そうとしたら、データが消えた!!権利情報とは?
お世話になってます!!
下記の文が理解できないので、教えて下さい。

曲の転送について
パソコンからカーナビゲーションに転送した曲を、再度パソコンに戻す場合、パソコン側へは音
楽ファイルは転送されず曲の権利情報のみが転送されます。音楽ファイルがパソコンに残ってい
ない状態で曲を戻しても、パソコンに曲は復活しません

復活しないのは分かったけど、ナビに入っていた音楽ファイルが消えてしまいました。戻す方法は
あるのでしょうか?

権利情報だけある状態なんですよね・・どうしたらいいのでしょうか?
またいちからレンタルしかないのでしょうか?
半泣き状態です。誰か教えてください。

ANo.1

violet430

不具合の様な気がしますけど。
最新版へアップデートしても駄目ならサポートへgと居合わせた方が良いですよ。
サポート切れのバージョンならバージョンアップです。

仮に音楽データをそのものを取り出せたとすると、本来使っているPCとは違うPCに つなぐことで「コピー」できることになっちゃうからねー。 昔使ってたGigabeat でも、PCから転送するときに暗号化してしまって そのGigabeatでしか再生できないようになってた。iPod も iTnues 使っているときは PC側に「同期」するのでPCにない音源を取り出せないですよね (まあいろいろ手段はあるようですけど)。 んで「権利」を転送してしまったので、ナビとやらに残っているデータの「権利」は なくなったということで消したという理屈ではなかろうかと。

■_ あとでよむ



A Neighborhood of Infinity: Monads are Trees with Grafting
Monads are Trees with Grafting

This is an attempt to collect together, in tutorial form, a few of the things I've 
said about monads going back as far as my field guide. It's probably not a good first 
tutorial, but it contains things I'd wish I'd known immediately after reading my first 
tutorial.

Unfortunately, I used a few more LaTeX features than I ought to have while drafting it 
making it hard to get back into HTML form cleanly. So here is a
PDF: Monads are Trees with Grafting.

Probably the main inspiration was this post by Derek Elkins.

つーことでpdfをげと https://dl.dropbox.com/u/828035/Monads/monads.pdf

■_

2010年1月1日

■_

・今年の目標とか抱負とか
本の虫: 成功の秘訣 経由で 8割近くの人は新年の目標達成できず、「成功の秘訣」を心理学者が指南。 | Narinari.com という話を知ったので、ねりなおしちうw


    * 目標は1つだけにする。
    * 数日じっくり考える。
    * 以前立てた目標は避ける。
    * ごく普通の目標にする。
    * 細かくポイントを設定し、1つずつクリアしていく。
    * 自分にプレッシャーをかけ、サポートを得るために友人や家族に目標を話す。
    * 定期的に「達成するとどう好ましくなるのか」を書き出し、利点を考えるようにする。
    * モチベーションと進歩の感覚を守るため、1つのステップをクリアしたら自分にご褒美を与える。
    * 達成までの計画やプロセスを記録し、グラフや絵を使って分かりやすく示す。
    * 心が折れそうなときは諦めるのではなく、一時的に前の習慣に戻ったと解釈する。

「目標をひとつに」かあ。言語的には Haskell も R も Erlang も中途半端には手をつけてんだよな。 Scala とか Clojure?

とりあえず、Smalltalk (Squeak Smalltalkが候補か?)と、 あと一つ二つ処理系のソースコード読んでおきたい。

それとは別に、ちょっと前からぼんやりと考えていることはあるのだけど これはもうちょい煮込んどくか。

ということで今年もよろしくお願いします。

■_ 目標ではないけれど

新年のお願い(笑)。 「Cを使ったプログラミング入門書」が出なくなりますように…なむなむ。 せめて C Programming: A Modern Approach
この本のレベルくらいは…ってハードル高すぎ? ページ数も半端でないしね。

■_ にーせんじゅーねんのもーくひょーはー♪

from reddit。 年末からたっていたスレッドですが。


What are your 2010 programming goals? : programming

finish a project, goddamn you kaens.


Same thing we do every year, Pinky:

   1. Decide on a language to learn for 2010.
   2. Learn said language.


Force myself to stop hating on C++ so much because it's like dissing your wife when 
you have 3 kids and you're not going to get divorced so you just better love her 
quirks and get on with your life


You have to love it when Stockholm Syndrome kicks in.

//unashamed C++ fan


Go to university, learn more about algorithms and data structures.


My big 2010 programming goal is to NOT have any hobby projects this year. No matter 
how enticing it may be, no matter how fun it may seem...NO NO NO. No hobby projects!


Make a distro for kids & netbooks.

Make an alternative page layout system to html/css

Make an open flash-like system

Port my windows Turning Machine Emulator to Linux

Make some Games.

Port some of my games from Windows to Linux.

Make an artificial life playground (already designed. not coded yet)

Make a tiny native lib to do decompression with my crazy level image compression

I need minions. I should have minions dammit.


Get a job. Resume here: http://jjncj.com/papers/KuglerResume.pdf


Thanks. Heh...I've had other reviewers tell me to get away from bullet points, and 
making it more prose like. :)


Get a more concise resume. Never mind too long, your resume is too wide. Also, stop 
using YYYY-MM. I found it mindfuckingly hard to read.


Becoming very rich! Maybe I write a CMS. Or an iPhone App!


I doubt there's much money in CMSes...


… or iPhone Apps. That's the point.


Ooh, ok. I was under the impression there's still money in iPhone apps, so I didn't 
catch the sarcasm.


    * Learn Common Lisp
    * Actually finish the little game I've been working on
    * Start a bigger, more interesting game


Read Practical Common Lisp!! Guy who wrote it, Peter Seibel, is a gent.


    ... Peter Seibel, is a gent.

from my first hand experience (email correspondence), he most certainly is


An interpreter for a subset of Scheme might only be 1000 lines in C. I don't think 
there'd be much advantage to using C++. Actually I think there would be more advantage 
in getting to know C better ;-)


I actually know C pretty well now. I'm not looking for an advantage by using C++, but 
to learn it for real :-)


    * Write iPhone Apps
    * Complete My XNA shmup
    * Learn Python/Django

Learn haskell

Finish that file transfer server I've been working on. (this has to be done for April, 
actually)

Make a game

Make an iphone application.

Set up and maintain a home server

Make myself a homepage.


Learn Objective C


Learning

    * Learn Agda
    * Spend some time reading about Qi
    * Learn Prolog
    * Learn Python
    * Find a use for Clojure
    * Learn how to program on OS X
    * Try Literate Programming (proper, a la Knuth) for a nontrivial project
    * Learn how to incorporate automatic testing into my projects more
    * Read more chapters of SICP
    * Read something from The Art of Programming
    * Learn and use ASM
    * Learn how Linux works under the hood, read the Kernel source code
    * Learn OpenGL and 3D math/algorithms
    * Learn Drupal
    * Read more CS papers
    * Learn more about complexity theory
    * Try out Scala
    * Try out Erlang
    * Learn more about compression
    * Learn how AES works

Writing

    * Hack on more open source projects, make more open source projects
    * Maybe write that experimental indentation-based programming language
    * Get my bloody webcam to work in Ubuntu again, write some nice video4linux stuff
     with FFI interface to Haskell
    * Make a "delete package" feature for Haskell Cabal
    * Become a legend at using Git
    * Write several cute JS/canvas or Flash mini games
    * Contribute somehow to the GHC project
    * Make some pretty Fractal projects
    * Make two player Tetris
    * Write a language compiler to LLVM, JVM and/or CLI. That would be swell
    * Write a language-to-ASM compiler, that would also be fun
    * Implement a few compression algorithms

I guess that's maybe a few years' worth of stuff... I don't know how you guys pick from all
the juicy stuff that's out there.


Learn functional programming. become an iPhone developer


Learn how to write a simple machine code compiler! I've used parser generators to grab 
information from a loooot of different sources, but I've never compiled code all the 
way down

I also want to build a persistent data structure library to use with the compiler. 
Clojure intrigues me, and I want to see how easy/hard they are to make in C

   1. Finish something
   2. Finish something useful


Learn Rails 3.0 as soon as it's released; port all my personal pending PHP web 
projects to CodeIgniter.

   1. Read less and write more. (less reddit, more code)
   2. Spend less time learning and more time doing(stop learning languages
      and start writing more production code)
   3. Actually finish some of my projects


1.Keep on reading books, blogs, news
2.Write a simple proxy webapp from sratch('cause i'm a newbie)
3.Try erlang(yes, not Haskell) 4.Get a job or die

■_ 余裕があったら追いかける

ということは十中八九放置確定だな(苦笑



Functional Programming Doesn't Work (and what to do about it)

Read suddenly and in isolation, this may be easy to misinterpret, so I suggest first 
reading some past articles which have led to this point:

Admitting that Functional Programming Can Be Awkward

Follow-up to "Admitting that Functional Programming Can Be Awkward"

How I Learned to Stop Worrying and Love Erlang's Process Dictionary

After spending a long time in the functional programming world, and using Erlang as my 
go-to language for tricky problems, I've finally concluded that purely functional 
programming isn't worth it. It's not a failure because of soft issues such as 
marketing, but because the further you go down the purely functional road the more 
mental overhead is involved in writing complex programs. That sounds like a 
description of programming in general--problems get much more difficult to solve as 
they increase in scope--but it's much lower-level and specific than that. The kicker 
is that what's often a tremendous puzzle in Erlang (or Haskell) turns into 
straightforward code in Python or Perl or even C.

(略)
  

prog21: Follow-up to "Functional Programming Doesn't Work"

Follow-up to "Functional Programming Doesn't Work"

Not surprisingly, Functional Programming Doesn't Work (and what to do about it) 
started some lively discussion. There were two interesting "you're crazy" 
camps:

The first mistakenly thought that I was proposing fixing problems via a judicious use 
of randomly updated global variables, so every program turns into potential fodder for 
the "Daily WTF."

The second, and really, the folks in this camp need to put some effort into being less 
predictable, was that I'm completely misunderstanding the nature of functional 
programming, and if I did understand it then I'd realize the true importance of 
keeping things pure.

(略)

■_ SecureZeroMemory

Memory 上の機密情報の保護 経由で。



SecureZeroMemory Function (Windows)

WCHAR szPassword[MAX_PATH];

// Retrieve the password
if (GetPasswordFromUser(szPassword, MAX_PATH))    
   UsePassword(szPassword);
// Clear the password from memory
SecureZeroMemory(szPassword, sizeof(szPassword));


If ZeroMemory were called in this example instead of SecureZeroMemory, the compiler 
could optimize the call because the szPassword buffer is not read from before it goes 
out of scope. The password would remain on the application stack where it could be 
captured in a crash dump or probed by a malicious application.

へー。

■_ ネタ


フリーソフト作者の愚痴 36 
714 仕様書無しさん [sage] 2009/12/31(木) 18:38:59 ID: Be:
    正月休み 

715 仕様書無しさん [sage] 2009/12/31(木) 19:18:38 ID: Be:
    サーバルームは、冷暖房完備で年末年始も快適 

716 仕様書無しさん [] 2009/12/31(木) 20:46:29 ID: Be:
    >>715
    サーバルームで年越し乙 

717 仕様書無しさん [] 2009/12/31(木) 21:04:35 ID: Be:
    暖房は完備してねぇよw 

718 仕様書無しさん [sage] 2009/12/31(木) 21:45:15 ID: Be:
    >>717
    1日完全休業があると次の日HDDがスピンアップしなくなる
    この厳寒の地にあやまれ!(AA略) 

寒すぎてディスクが~ってのは経験したことないなあ。幸いにも。


最も美しいプログラミング言語は? Part4 
945 デフォルトの名無しさん [sage] 2010/01/01(金) 13:14:05 ID: Be:
    C言語を「テープとハサミと画用紙でつくる工作」とすれば、
    Haskellは「おりがみ」だと思う。

    どちらも美しく作られたものは美しが、
    設計や作ってる姿はおりがみ(Haskell)の方が何となく美しく感じる。 

946 デフォルトの名無しさん [sage] 2010/01/01(金) 13:23:38 ID: Be:
    CとHaskell比べてどうする。 

947 デフォルトの名無しさん [sage] 2010/01/01(金) 14:07:10 ID: Be:
    俺はLispに1票
    S式可愛いよS式

おめーのバグだろ、ゴルァ!! その31 [chaika]
377 仕様書無しさん [sage] 2010/01/01(金) 12:09:21 ID: Be:
    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    | 先輩、新年になりましたね
    \
       ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ∧_∧       / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ・∀・)  ∧ ∧ < まだ12月32日だろうが、ゴルァ!!
     (  ⊃ )  (#゚Д゚)  \____________
     ̄ ̄ ̄ ̄ ̄ (つ_つ__
     ̄ ̄ ̄日∇ ̄\|VAIO-Z|\
           ̄   =======  \ 

378 【大凶】 【868円】 [sage] 2010/01/01(金) 13:11:07 ID: Be:
    あけおめ ことよろ

    今年こそおまいらがいい年になりますように

379 378 【大吉】 【1117円】 [sage] 2010/01/01(金) 13:13:00 ID: Be:
    どうやらおいらは今年もだめっぽい orz

    おまいらには幸あらんことを。

380 【大吉】 【185円】 [sage] 2010/01/01(金) 13:19:44 ID: Be:
    >>379
    そんなことない
    そんなことない
    運気上向きw 

381 【大吉】 【954円】 株価【30】 [sage] 2010/01/01(金) 14:03:15 ID: Be:
    あけまして、おめでとうございます。 

■_ 本日の巡回から


一つ前へ 2010年12月(下旬)
一つ後へ 2010年1月(中旬)

ホームへ


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

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