ときどきの雑記帖 めぐりあい電脳空間編

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

一つ前へ 2010年4月(上旬)
一つ後へ 2010年4月(下旬)

ホームへ

2010年04月20日

■_

・やさしい~
やさしいF#入門 なんてのがでるようで。出版予定いつなんだろう? 日付書いてないっぽいし Amazonさんとかでもまだ見当たらないような。 あった。明日じゃん! 2010/4/22 やさしいF#入門 日向 俊二 [単行本] - 新刊.net 早売りだと今日にも買えるか(買う気なのか?)な。

■_ うは


仮想ネットワーク実装でTCP/IPを学ぼう(5) ― アプリケーション層の勘所(1/5):CodeZine
質問/指摘についての注意

 本記事の対象を超えるもの、記述箇所を特定しないもの、読者固有環境に起因するもの、読者
の主義思想に関するもの、読者の誤解によるもの、社会人としてのマナーを欠いたものなどは質
問/指摘を頂いてもお答えできません。あらかじめご了承ください。

最初からコメント欄閉じといたらいいんじゃなかろか。

■_ 補数とか

みねこあさんところで、ずいぶん前のエントリにコメントついてるのが気になったので 確かめてみたり。

2008-01-29 - みねこあ
通りすがり 2010/04/20 23:46 まったくの初心者です。
1.8-3の計算で「10借りてくる」と「10返す」必要性が分かり
  ません。
  単に10の補数を足してオーバフローした1は無視すると考えた
  ほうがすっきり分かるのですが。
2.2の補数を求める方法
  いきなりビット反転して1を足すのが裏技といわれても
  シロートにはなんでそれが2の補数になるのか?ポカーン…。
  基数や補数の定義から順に説明してもらわないと
  チンプンカンプンです。
3.いくらなんでも「2の補数とは、要するに 10(bin)の補数」
  という説明は大雑把すぎるのでは?
  その後の8ビットの例に整合しません。

わかってる人が突っ込みいれてるような気もするけどそれはさておき。 確かに、ある数値のビットパターンをビットごとに反転してその結果に+1すると 元の数値の2の補数になるんだけど、はて、これどういう理屈だったけか。

あー、あれだ。 n進数があったときにはn の補数と n-1 の補数というのがあって (たとえば10進数なら10の補数と9の補数がある)、 n-1 の補数というのは各桁が最大値の同じ桁数の数値から引いた結果。 n の補数だとその差に+1したもの。んで、二進数の場合は たとえば4ビットの範囲で5の1の補数を求めるには

    1111
-   0101

なんだけど、その結果はビットごとにみると反転したのと同じ (なぜそうなるかは説明不要ですよね?)。

次に、n進数の nの補数というのは、補数を求めたい数値の桁数の最大値より 1大きなものから引いたもの。上の例で言うと

    10000
-    0101

ということ。ということは、1の補数に1加えたもの→ビット反転したものに1加えたもの が、2の補数になると。桁数がどうのそれより1大きいのがどうのというのがわからない といわれてもそういうものだからとしか(^^;

お、Wikipediaの項目引いたほうがわかりやすいかな。

補数 - Wikipedia
補数
出典: フリー百科事典『ウィキペディア(Wikipedia)』

補数(ほすう;complement)とは、ある基数法において、ある自然数 a に足したとき桁が1つ上
がる(桁が1つ増える)数のうち最も小さい数をいう。 コンピュータが加算処理で正の数の減算
(負の数の加算)を行う際に利点がある。

b 進法において、自然数 a を表現するのに必要な最小の桁数を n としたとき、

    * bn − a を「b 進法における a に対する基数の補数(b の補数)」
    * bn − a − 1 を「b 進法における a に対する減基数の補数(b - 1 の補数)」

という。

例えば、10進法において、自然数 61 に対する基数 10 の補数は 102 − 61 = 39である。また、
2進法において、自然数 100102( = 1810) に対する基数 2 の補数は 25 − 18 = 11102( = 1410) 
である。

定義したように考えると、a の基数の補数と a とを足すと、桁数が1つ増える最小の自然数( = bn)
となり、a の減基数の補数と a とを足すと、桁数が増えない最大の自然数( = bn − 1)となる。

■_ warning

まあ良くある話ですが。


【超高速】C/C++に代わる低級言語を開発したい 3 
660 デフォルトの名無しさん [sage] 2010/04/18(日) 22:30:02 ID: Be:
    なんかワーニングオプションの要望ばっかだな 

661 デフォルトの名無しさん [sage] 2010/04/18(日) 22:41:45 ID: Be:
    言語の規定に warning はウォーニングと読むと明記して欲しい。 

662 デフォルトの名無しさん [sage] 2010/04/18(日) 22:43:44 ID: Be:
    /awrg?n/ 

665 デフォルトの名無しさん [sage] 2010/04/18(日) 22:56:52 ID: Be:
    >>661
    あっそれ欲しいw
    ワーニングとかバカかよと思う。 

666 デフォルトの名無しさん [sage] 2010/04/18(日) 22:58:50 ID: Be:
    くだらね 

667 デフォルトの名無しさん [sage] 2010/04/19(月) 01:13:42 ID: Be:
    ウォーニン 

668 デフォルトの名無しさん [sage] 2010/04/19(月) 01:24:49 ID: Be:
    全部英語表記にしろ 

669 デフォルトの名無しさん [sage] 2010/04/19(月) 01:47:34 ID: Be:
    ウォーニング の検索結果 約 122,000 件中 1 - 10 件目 (0.12 秒)
    ワーニング の検索結果 約 147,000 件中 1 - 10 件目 (0.20 秒)

    star wars スターウォーズ
    warp ワープ

    ぶっちゃけどっちでもよくね 

670 デフォルトの名無しさん [sage] 2010/04/19(月) 02:13:50 ID: Be:
    アルトラマン

671 デフォルトの名無しさん [sage] 2010/04/19(月) 02:57:51 ID: Be:
    スクールワーズ 

672 デフォルトの名無しさん [sage] 2010/04/19(月) 08:18:43 ID: Be:
    SFで普及してしまった「ワープ」が諸悪の根源。
    あれが「ウォープ」でありさえすれば... 

673 デフォルトの名無しさん [sage] 2010/04/19(月) 08:27:11 ID: Be:
    >>669
    野村克也「人間の最大の罪は鈍感であることだ」 

676 デフォルトの名無しさん [sage] 2010/04/19(月) 10:14:18 ID: Be:
    >>673
    アップル→アポー
    ゼロ→ズィーロウ
    エッチ→エイチ
    ガラス→グラス
    ヒレ肉→フィレ肉
    とかそんな感じで以後よろしく

    ウォーニングを正しい発音だと思ってる俺カコイイとか
    どこの中二病だよ 

678 デフォルトの名無しさん [sage] 2010/04/19(月) 10:47:46 ID: Be:
    >>676
    あんた、さすが! カコイイね!! 

679 デフォルトの名無しさん [sage] 2010/04/19(月) 10:49:58 ID: Be:
    >>676
    ワーニングを気持ち悪いと思わないほどの鈍感な奴には何を言ってもムダだな 

680 デフォルトの名無しさん [sage] 2010/04/19(月) 10:50:24 ID: Be:
    >>679
    お前は今後ウォープでアルトラマンな 

681 デフォルトの名無しさん [sage] 2010/04/19(月) 10:52:14 ID: Be:
    あと、「グ」を気持ち悪く思わない時点でもう土着日本人だから 

682 デフォルトの名無しさん [sage] 2010/04/19(月) 10:55:07 ID: Be:
    言語の話しろよw
    ウォーニング単体の話に他の話を混ぜてどうにかしたい人がいるということぐらいしかわからん。 

683 デフォルトの名無しさん [sage] 2010/04/19(月) 10:55:44 ID: Be:
    なんでそんな必死にワーニングを擁護するんだろう 

684 デフォルトの名無しさん [sage] 2010/04/19(月) 10:57:17 ID: Be:
    その人のアイデンティティーか何かなんだろう。
    三つ子のワーニング、百まで。 

685 デフォルトの名無しさん [sage] 2010/04/19(月) 11:04:13 ID: Be:
    >>683
    べっべつに必死でワーニングの擁護なんてしてないんだからね!

    マジレスすると、ぐぐってワーニングのほうが多いほど定着してて
    意味が通じないわけでもない用語に今更ケチつける意味が理解できない
    しかも「2chで」だ
    んなもんどっちでもいいだろ

    つーかこの手の議論はfjのvoidでさんざん見飽きたわ 

686 デフォルトの名無しさん [sage] 2010/04/19(月) 11:07:24 ID: Be:
    >>685
    だからそういう、みんなが言ってるんだからいいじゃん、ていう考え方を鈍感って言ってんだろうが 

687 デフォルトの名無しさん [sage] 2010/04/19(月) 11:08:41 ID: Be:
    >>686
    いやだから、お前は自分の信念に基づいてウォープとかアルトラマンとか
    言ってれば?
    俺は止めないから 

688 デフォルトの名無しさん [sage] 2010/04/19(月) 11:12:21 ID: Be:
    なんでワーニングの話なのに別の単語を必死で持ち出すんだろう 

689 デフォルトの名無しさん [sage] 2010/04/19(月) 11:13:16 ID: Be:
    >>688
    馬鹿にも分かるように言うと
    war
    warp
    warning
    全部warの部分の発音が一緒だから

    ワープは良くてワーニングがダメなおまえさんの理由を言ってみな? 

690 デフォルトの名無しさん [sage] 2010/04/19(月) 11:14:59 ID: Be:
    話を摩り替えてることに自分で気づいてないらしい 

691 デフォルトの名無しさん [sage] 2010/04/19(月) 11:15:17 ID: Be:
    Honesty is such a lonely word
    アーネスティ サッチャ ロウンリ ワード 

692 デフォルトの名無しさん [sage] 2010/04/19(月) 11:16:00 ID: Be:
    そのうち全ての英単語はカタカナで表記できないと言い出す方に1000カノッサ 

693 デフォルトの名無しさん [sage] 2010/04/19(月) 11:17:32 ID: Be:
    誰か
    > ワープは良くてワーニングがダメなおまえさんの理由を言ってみな?

    これに答えられないの? 

694 デフォルトの名無しさん [sage] 2010/04/19(月) 11:19:30 ID: Be:
    誰ひとりそんなことを言ってない件 

695 デフォルトの名無しさん [sage] 2010/04/19(月) 11:20:11 ID: Be:
    んじゃあ、なんで「ワーニング」をキモいと思うべきで
    そう思わないのは鈍感で

    「ワープ」との違いは何なの? 

696 デフォルトの名無しさん [sage] 2010/04/19(月) 11:22:00 ID: Be:
    どんどん違う単語を出せば永遠に逃げられますよね 

697 デフォルトの名無しさん [sage] 2010/04/19(月) 11:23:41 ID: Be:
    要するに、合理的な理由を一人も説明できないけど
    中二病だからケチだけはつけたいってことでおk?

    ・発音が同じ
    ・表記の仕方も同じ
    ・定着してるからみんな使ってるということも同じ

    だから「ワープ」の例を上げてるんだけど
    そんなことも分からないほど馬鹿なの? 

698 デフォルトの名無しさん [sage] 2010/04/19(月) 11:44:39 ID: Be:
    ワーニング娘。はワーワーワーワー 

699 デフォルトの名無しさん [sage] 2010/04/19(月) 12:51:55 ID: Be:
    定着度合いが圧倒的に違う例を出してバカが必死、としか見えない。 

700 デフォルトの名無しさん [sage] 2010/04/19(月) 12:54:25 ID: Be:
    charをチャーと呼ぶかキャラと呼ぶかみたいなもんだろ 

701 デフォルトの名無しさん [sage] 2010/04/19(月) 12:56:16 ID: Be:
    チャラ 

702 デフォルトの名無しさん [sage] 2010/04/19(月) 13:08:17 ID: Be:
    >>700
    英語人はキャーorカーな 

703 デフォルトの名無しさん [sage] 2010/04/19(月) 13:10:07 ID: Be:
    あとチャーもあるな 

704 デフォルトの名無しさん [sage] 2010/04/19(月) 13:23:48 ID: Be:
    >>702
    カーだとLispのcarと紛らわしいな 

705 デフォルトの名無しさん [sage] 2010/04/19(月) 13:36:56 ID: Be:
    >>697
    アルトラマンは無かったことになったんですかw 

706 デフォルトの名無しさん [sage] 2010/04/19(月) 13:43:31 ID: Be:
    >>669
    「定着」って数の論理は認めるんだろ
    なら今更ダダこねてももう無駄だから諦めろ
    ずっと前から「ワーニング」は使われてしまっていて、グーグルでも
    「ワーニング」のほうが多い
    幸い「ウォーニング」も多いから、「ウォーニング」を使いたい奴は
    こっちを使えるが
    日本語としては本来「警告」で済む話だ 

707 デフォルトの名無しさん [sage] 2010/04/19(月) 13:49:46 ID: Be:
    なんでそんな必死なの 

708 デフォルトの名無しさん [sage] 2010/04/19(月) 13:50:27 ID: Be:
    俺がド厨房な上に、虫の居所が悪いからさ 

709 デフォルトの名無しさん [sage] 2010/04/19(月) 14:06:20 ID: Be:
    おまいらアホやな
    発音記号で出力したら無問題 

710 デフォルトの名無しさん [sage] 2010/04/19(月) 14:07:52 ID: Be:
    ウァーニングでいいじゃん 

712 デフォルトの名無しさん [sage] 2010/04/19(月) 14:33:24 ID: Be:
    >>709
    Unicode使うにしても
    タイプすんのめんどい 

713 デフォルトの名無しさん [sage] 2010/04/19(月) 14:44:26 ID: Be:
    >>712
    ネタにマジで返すところがおまえの限界 

715 デフォルトの名無しさん [sage] 2010/04/19(月) 15:33:32 ID: Be:
    wɔːɼniň
    ŋ

716 デフォルトの名無しさん [sage] 2010/04/19(月) 15:34:17 ID: Be:
    wɔːɼniŋ

自分は英語表記か警告か。ですかね。無理やりかな書きにするときは 「をーにん」とか(笑)

■_ 本日の巡回から

2010年04月19日

■_

行数で数えるのはまあ意味ないにしても、今年に入ってめっきりコーディングの量が 減っている気がする。いや、気のせいじゃないな。 ついったーの時間制限するか(笑)

■_

だいぶ時間かかったなあー。


Roman Roelofsen's blog: Why I hate everything you love about Java

Thursday, February 11, 2010

Why I hate everything you love about Java
(あなたが Java に関して好きなことのすべてをなぜわたしが嫌うのか)

A couple of days ago, Nick Kallen, the author of magicscalingsprinkles.wordpress.com, 
wrote an interesting blog entry titled "Why I love everything you hate about 
Java" (link). He starts with addressing the "hipster programmers who loves 
Clojure, Ruby, Scala, Erlang, or whatever" and why he thinks that their sympathy 
for convention-over-configuration is a fallacy. He continues to discuss why his 
favorite design pattern (dependency injection, factories and decorators) are key 
features for modular applications.

二、三日前に、magicscalingsprinkles.wordpress.com の author である Nick Kallen は 
"Why I love everything you hate about Java" (なぜわたしはあなたが Java につ
いて嫌っているすべてのことが大好きなのか) というタイトルの興味深い blog entry を書きま
した(link)。 彼は“ClojureやRuby、Scala、Erlang などが大好きな hipster プログラマー”
(hipster programmers who loves Clojure, Ruby, Scala, Erlang, or whatever) についての言
及を始めました。そしてなぜ彼が、 そういった“hipster プログラマーたち”の
convention-over-configuration に対する sympathy (共感、同意、支持) が fallacy (誤謬、
見誤り、こじつけ) であると考えるのかについても。さらに彼はなぜ彼の好むデザインパターン 
(依存性注入、ファクトリー、デコレーター)が modular アプリケーションにとって鍵となる 
features であるかについて議論を続けました。


The blog entry is a very good read and every Java/OO programmer should be familiar 
with these concepts. However, I disagree with most of his statements about 
convention-over-configuration and functional programming in particular. Overall, the 
blog reads a bit like "Why OO design pattern are better than functional 
programming and why those hippie trends like convention-over-configuration are 
overrated". It's always hard to cover everything in detail in a blog entry and 
often you simply have to set a focus (that's why it's called a blog and not an 
academic paper, right?) and here the focus clearly was set on object-orientation and 
design pattern. Within the OSGi enterprise expert group we had a short off-topic 
discussion about this blog entry and someone pointed out that it would be nice to see 
some counter examples.


このブログエントリは very good read なので、すべての Java プログラマーと OO プログラマ
ーはこのようなコンセプトに親しんでおくべきでしょう。しかしながらわたしは彼の主張の、特
に convention-over-configuration と関数プログラミング (functional programming) の部分
については賛同できないのです。全体として、このブログでは  "Why OO design pattern
are better than functional programming and why those hippie trends like
convention-over-configuration are overrated"  (OO デザインパターンがなぜ関数プログ
ラミングよりも優れているのか。また、なぜ convention-over-configuration のようなヒッピー
の流行 (trends) が過大視 (overrate) されているのか) のようなことを書いています。
blog エントリで詳細をすべてカバーすることはいつでも困難なことであり、また、しばしば 
simply に set a focus しなければなりません。そしてそれが、academic paper ではなく blog 
と呼ばれる理由なのです。よろしいか?)。そしてここではオブジェクト指向とデザインパターン
に明確にフォーカスされていました。OSGi のエンタープライズエキスパートグループで、わた
したちはこのブログに関する短いオフトピックディスカッションを行いました。そして、誰かが
良い反例 (countr examples) であると思われるものを幾つか見つけました。


Challenge accepted! I will use Clojure to convert the examples to a more functional 
style.

チャレンジは accept されました! 例をより関数スタイルに変換するのにわたしは Clojureを
使います。


Convention-over-configuration (設定に優る規約)


In the first part of the blog entry Nick presented an API usage where he always 
parametrizes the use of a ThreadPoolExecutor instead of using a more simplistic 
approach driven by convention-over-configuration. The used configuration "depends 
entirely on the nature of the problem you're solving and how callers of this code 
behave". Nick states that this boilerplate code "is really important when 
you work at massive scale" and that it provides "a way to configure the 
behavior of the system". He further describes that this style of API usage leads 
to modular software.

blog エントリーの最初のパートで、 Nick は API の使い方を彼がいつも使っている 
convention-over-configuration によって drive されるもっと単純なアプローチの代わりにプ
レゼンしています。そこで使われていた設定は、“あなたが解こうとしている問題の性質とこの
コードが呼び出し元にどのように影響するのかに完全に依存”しています。 Nick はこのボイラ
ープレートコードが"is really important when you work at massive scale" (あな
たが massive scale で動かすときにとても重要である)ことを主張しました。そしてまた、(ボ
イラープレートコードが)"a way to configure the behavior of the system". (シ
ステムの振る舞いを設定するための方法) を提供しているとも主張しました。
さらに彼は、このスタイルのAPI の使い方が modular ソフトウェアを lead すると説明しました。



I think that this has nothing to do with the language or even the paradigm you choose 
since it's simply a matter of good API design. Provide meaningful defaults but do not 
tie the user to unchangeable behavior. However, I think that we can already improve 
his code and that his requirements even show some weaknesses of object-oriented 
programming! First, lets define the requirements:

これが言語に対して行うことはなにもないし、あなたが選択したパラダイムに対してもなにもし
ないとわたしは考えます。なぜならそれはただ単に良い API 設計の matter だからです。意味
のある規定値を提供していますが、ユーザーが変更することのできない振る舞いに結び付けられ
ていません。しかしながらすでにわたしたちは彼のコードを改良できるし、そしてオブジェクト
指向プログラミングの弱点をあらわにする彼の要求項目さえも改良できるのだとわたしは考えて
いるのです。

First, lets define the requirements:

まず初めに要求項目を定義しておきましょう:

1. Create a parametrized ThreadPoolExecutor
   パラメータ化された ThreadPoolExecutorを生成する

2. Execute a future task
   future タスクを実行する

3. The configuration depends on the problem and the caller
   configuration は問題と呼び出し元に依存する


To keep the code simple, I will limit the configuration to PoolSize (just to 
demonstrate it, I won't change the size) and ThreadFactory. I will use the 
ThreadFactory to assign different names to the created threads. This provides us with 
an easy way to validate our configuration during task execution.

コードをシンプルな状態に保つために、わたしは PoolSize と ThreadFactory に対する 
configuration (ただしこれは単にデモンストレーションのためであって、実際には変更しませ
ん)を制限します。生成スレッドに異なる名前をアサインするために ThreadFactory を使用しま
す。これはタスクを実行している間の configureation のバリデートのための簡単な方法を提供
します。


First, we create variables to define the default values for the ThreadPoolExecutor and 
ThreadFactory. We will later override the values when we want to parametrize:

最初に ThreadPoolExecutor と ThreadFactory のためのデフォルト値を定義するための変数を
生成します。あとでパラメータ化したいときにこの値をオーバーライドします:


(def *pool-size* 10)
(def *thread-name* "default name")


We need a ThreadFactory that uses the *thread-name* variable every time it creates new 
threads:

わたしたちは、新しいスレッドを生成するごとに変数 *thread-name* を使用する ThreadFactory
を必要としています:


(def thread-factory (proxy [ThreadFactory] []
                      (newThread [runnable] (Thread. runnable *thread-name*))))


For testing purposes we will need several ThreadPoolExecutors so lets create a factory 
function that creates and returns a new executor. The created executor will use the 
*pool-size* and the thread-factory which in turn uses the *thread-name*:

わたしたちにはテストの目的のためにいくつかの ThreadPoolExecutors が必要ですから、新し
い executor を生成して返すファクトリ関数を生成しましょう。生成された executor は 
*pool-size* を使うでしょうし、そのスレッドファクトリは *thread-name* を使うでしょう。


(defn create-executor
  []
  (ThreadPoolExecutor. *pool-size*
                       10
                       (long 500)
                       (TimeUnit/SECONDS)
                       (LinkedBlockingQueue.)
                       thread-factory))


We also need a function that will get called by the executor. We create another 
factory function that returns FutureTasks. Since every Clojure function implements the 
java.lang.Runnable interface we can easily pass a Clojure function to the FutureTask 
constructor. The factory function takes a task-id as parameter. We will use this ID to 
identify the created task later. When the created tasks get called by the executor, 
they simply print their ID and the name of the current thread:

わたしたちはまた、その executor から呼び出される関数を必要とします。わたしたちは 
FutureFasks を返すもうひとつのファクトリ関数を生成しますClojure のすべての関数は 
java.lang.Runnaable インターフェースを実装しますから、わたしたちは簡単に Clojure の関
数をFutureTask のコンストラクターに渡せます。そのファクトリー関数はパラメータとして 
task-id を受け取ります。わたしたちはこの ID をあとで生成するタスクの identify のために
使用します。生成されたタスクが executor から呼び出されたとき、そのタスクは自分の IDと
カレントスレッドの名前を単純に出力します:


(defn create-demo-task
  [task-id]
  (FutureTask. (fn []
                 (println "Task ID:" task-id
                          "Thread Name:" (.getName (Thread/currentThread))))))


Lets try it (note: The print to stdout will happen in a different thread so you might 
not see the output in your normal console):

では試してみましょう (注意:標準出力に対する出力は異なるスレッドで行われる可能性がある
ので、あなたは自分の normal console で出力を見られないかもしれません):

(.execute (create-executor) (create-demo-task 1))

=> Task ID: 1 Thread Name: default name


Nothing special so far. The task gets executed and prints its ID and the name of the 
thread. So far we followed the convention-over-configuration way since we simply used 
our default value of "default name" for the thread. Our executor usage is 
very simple and we only implemented requirement 1 and 2. Nick argued that this 
simplicity is only an illusion and that you therefore always have to write the 
boilerplate code (for requirement 3). However, Clojure has a simply yet powerful 
mechanism to get a simple API and a flexible configuration at the same time: Bindings! 
Lets assume our problem demands a different thread name and that therefore the caller 
wants to influence the configuration:


別段、特殊なことはありません。タスクが実行されると、その ID とスレッドの名前とが出力さ
れます。単にデフォルトの値とスレッドの“デフォルト名”を使っていたので、わたしたちは 
convention-over-configuration way にしたがいました。わたしたちの excutor の使い方は非
常に単純で、要求項目の1と2しか実装していませんでした。この simplicity は illusion の中
にしかなくて、したがってあなたは (要求項目3のために) 常にボイラープレートコードを書く
必要があるとNick は主張しました。けれども、Clojure は単純な API を得ると同時に柔軟なコ
ンフィグレーションを得るための単純でありながら強力なメカニズムを持っているのです。
Bindings! 異なるスレッド名を要求していて、そしてそのために呼び出し元が influence the 
configuration を必要としていると仮定しましょう。


(binding [*thread-name* "my new name"]
  (.execute (create-executor) (create-demo-task 2)))

=> Task ID: 2 Thread Name: my new name


Bindings can be nested and each binding has its own scope. In the next example, the 
inner binding overrides the name with "my second name":

束縛はネストが可能で、個々の束縛は各々固有のスコープを持っています。次の例では、内側の
束縛は  "my second name" でその名前をオーバーライドします:


(binding [*thread-name* "my first name"]
  (.execute (create-executor) (create-demo-task 3))
  (.execute (create-executor) (create-demo-task 4))
  
  (binding [*thread-name* "my second name"]
    (.execute (create-executor) (create-demo-task 5)))
  
  (.execute (create-executor) (create-demo-task 6)))

=> Task ID: 3 Thread Name: my first name
=> Task ID: 4 Thread Name: my first name
=> Task ID: 5 Thread Name: my second name
=> Task ID: 6 Thread Name: my first name


As you can see, the use of binding is completely optional and we only need to use it 
when we want to provide a different configuration. Requirement 3 is a very important 
one: "The configuration depends on the problem and the caller" and this is 
where object-oriented programming shows some weaknesses:

見てのとおり、束縛の使用は完全にオプショナルであり、異なるコンフィグレーションを提供し
たいときにだけ使用する必要があります。要求項目 3は非常に重要です: "The configuration
depends on the problem and the caller" (コンフィグレーションが問題と呼び出し元と
に依存している)。そしてこれはオブジェクト指向プログラミングが some weakness を見せる箇
所でもあります。


    * The caller (who knows what configuration makes sense) is often not the one who 
      creates the object (where we need to apply the configuration)! Sometimes the objects 
      get created later in the call chain, sometimes the objects were already created long 
      before the caller knew something about it.

      呼び出し側 (who knows what configuration makes sense) はそのオブジェクトを生成したもの
      でないことが頻繁にあります! オブジェクトは call chain の中であとになって生成されること
      も時折りありますし。呼び出し側が知るよりも遙か以前にすでにオブジェクトが生成されている
      こともあります。


    * Once our tangled web of objects is instantiated, it's quite hard to change it. 
      We either have a global dependency injection configuration or we pass factories
      around.

      一旦わたしたちの tangled web of objects が生成されてしまうと、それを変更するのは非常
      に困難です。わたしたちには global dependency injection を使うかファクトリを渡すか
      のいずれかを行います。


    * Whenever we create a new object (to apply a new configuration) we in fact create 
      a new tree of objects since the object creation might imply the creation of child 
      objects. This means that we often have a redundant set of trees with only slight 
      differences. These trees often need to share some other objects so we again pass 
      factories and references around etc. The beloved OO-design pattern are often just 
      workarounds for problems introduced by object-oriented programming!

      わたしたちが (新しいコンフィグレーションを適用するために) 新しいオブジェクトを生成
      するときはいつでも


新しいツリーオブジェクトを生成します

これらのツリーは
しばしば必要になります
何かほかのオブジェクトを共有するために


オブジェクト指向デザインパターンはしばしば
オブジェクト指向プログラミングによって持ち込まれた問題を回避するためだけに


So far my examples mixed the concepts of executor creation, defining new thread names 
and running tasks. To add the concept of layers, we now assume that we have an 
application-wide configuration that creates the executor. For whatever app-specific 
reason, it's common in our application that new threads should get a random name in 
some contexts. We only need to capture this behavior once in a new function:


新しいスレッド名と実行するタスクを定義します。レイヤーのコンセプトを追加するために、わ
たしたちはここで executor を生成するようなアプリケーション全体にわたるコンフィグレーシ
ョンがあると仮定します。なんらかのアプリケーションに固有の理由のために、新しいスレッド
は何らかの文脈において (in some contexts) ランダムな名前をつけられるべきなのはわたした
ちのアプリケーションでは一般的なことです。この動作を得るためにわたしたちに必要なのは新
しい関数一つだけです:


;; Create application executor
(def app-executor (create-executor))

;; Capture "random name" behavior
(def with-random-name #(binding [*thread-name* (str (rand))]
                         (%)))


The application code now only needs to use the with-random-name function and the 
*thread-name* variable is now an implementation detail of our application-wide 
configuration:

アプリケーションのコードは今 with-random-name 関数を使うことだけを必要としていて、
*thread-name* 変数はわたしたちの aplication-wide なコンフィグレーションの詳細を
実装されています


(with-random-name
  #(.execute app-executor (create-demo-task 7)))

=> Task ID: 7 Thread Name: 0.5414362847600062


Easy, isn't it? Obviously, you can create as many functions, compose them, pass them 
to other functions etc. This is a very powerful programming concepts and I fail to see 
how "function composition is a degenerate case of the Decorator pattern", as 
Nick called it.

簡単ですね。違いますか? 明らかに、あなたは関数を多数生成できてそれらを合成しそれをほか
の関数に渡すなどのことができます。これは非常に強力なプログラミングのコンセプトであり、
Nick が "function composition is a degenerate case of the Decorator pattern",
(関数合成はデコレーターパターンの degenerate case である) と呼んだようなことがわたしには
良くわかりません。


This style of programming is called context-oriented programming and I hope that we 
will see more use of it in the future.

このプログラミングのスタイルはコンテキスト指向プログラミングと呼ばれるもので、わたした
ちが将来この手法をもっと使うところを見るのをわたしは望んでいま。す


The design patterns of modularity (moularityのデザインパターン)

The blog continues to describe the use of dependency injection, decorators and 
factories and shows why those pattern are important for modular application. Again, I 
argue that those pattern can be easily implemented in functional languages and that 
the result is often more flexible and probably easier to use. The examples heavily 
depend on OO constructs (e.g. class hierarchies) and therefore do not translate 1:1 to 
a functional style. However, this shouldn't be a big problem since the purpose is to 
demonstrate the design pattern, not the API of a query framework. We assume that we 
have a query function and simulate a long running operation with Thread/sleep:

blog では続けて依存性注入とデコレーター、ファクトリーの使い方を説明し、なぜそれらのパ
ターンが modular application にとって重要であることを示しています。繰り返しますが、そ
れらのパターンが関数型言語では簡単に実装できるものであると同時に、その結果がよりフレキ
シブルかつおそらくは容易に使えるものであるとわたしは主張します。この例はオブジェクト指
向的構造(クラス階層)に強く依存しており、従って関数型のスタイルに一対一で変換されていま
せん。しかし目的がデザインパターンをデモンストレーションすることにあって query 
frameworkの API をデモンストレーションすることではないので、これは大きな問題にはならな
いでしょう。わたしたちが query function と、Thread や sleepを使った長時間実行される操
作をシミュレートするのだと仮定しましょう。


(defn query [q] 
  (Thread/sleep (rand 1000))
  (println "Run query:" q))


In practice, the function would contact the database, return the query data structure 
etc. The first task is to add a TimingOutQuery that cancels the query after a certain 
amount of time. To keep our Clojure code simple we instead create a timing decorator 
that prints how long the operation took (a timing function is already implemented in 
the Clojure core library):

実践ではこの関数はデータベースにコンタクトして  query data structure などを返します。
最初のタスクは、一定時間経過したあとで query をキャンセルする TimingOutQuery を追加す
ることです。Clojure コードをシンプルに保つために、そのオペレーションがどの位の時間を要
したのかを出力するタイミングデコレーターをTimingOutQuery 関数の代わりに作りました (タ
イミング関数はClojureのコアライブラリに既に実装されています):

(defn timing-query [q]
  (time (query q)))


This function simply delegates to the original query function. With this design we 
would need to create a wrapper function for each database function 
(query/select/cancel) which is clearly not an option. Fortunately it's quite easy to 
generalize this abstraction:

この関数は単純にオリジナルの query 関数にdelegateしているだけです。この設計によって 
clearly not an option なデータベース関数(query/select/calcel) のそれぞれに対するラッパ
ー関数を作成する必要がでてきました。幸運なことにこの抽象化を一般化することはとても簡単
です。


(defn timing-fn [f & args]
  (time (apply f args)))


The function timing-fn takes a function and an arbitrary number of arguments as 
parameters, calls the function with the arguments and wraps everything in Clojure's 
time function. We simply created a generic timing decorator that we can use to wrap 
any function:

この関数 timing-fn は関数を一つと任意の数の引数をパラメータを受け取ってパラメーターで
受けた関数を引数と一緒に呼び出し、Clojure の time 関数の中に全てをラップします。わたし
たちは単純に汎用の (任意の関数をラップするのに使える) timing デコレーターを作成しまし
た。

(timing-fn query "query string")


Nick stated that "function composition is a degenerate case of the Decorator 
pattern" but it's the object-oriented implementation which is limited because e.g. 
only Query objects can be decorated. The TimingOutQuery and Query are even tied 
together via class inheritance, one of the most strict coupling you can use! Making 
the OO version generic would involve another abstraction, maybe new interfaces, etc.

Nick は "function composition is a degenerate case of the Decorator pattern"
(関数の合成はデコレーターパターンの degenerate なケースである) と主張(state)しましたが、
それは Query オブジェクトがデコレートできるもののみであったので限定されたオブジェクト
指向実装でした。TimingOutQuery とQueryはクラス継承を通じて一緒に結びつけられていました。
これはあなたが使えるものの中でもっとも strict に coupling されているものの一つなのです!
OOバージョンを汎用にすることは、新しいインターフェースなどのような、もう一つの抽象化を
必要とします。


One of the advantages of decorators is that you can test the code in isolation, no 
matter if you use the OO or the functional way. As described above, the timing-fn is 
ever easier to test since it does not depend on a specific type that it will wrap. For 
example, we could easily wrap the println function:

デコレーターの利点の一つが、オブジェクト指向の手法を使っているか関数型の手法を使ってい
るかには関係なくコードのテストをまとめることができることです。前述したように、
timing-fn はテストするのがとても容易でしたなぜなら、特定の型に依存することがなかったか
らです。たとえば、わたしたちは println 関数を容易にラップできました:


(timing-fn println "Hello World!")


After we decomposed everything into small functions, we need factories to put 
everything together again. The idea is that user code should never know what type of 
query (normal query, timing query, ...) it is using. We therefore pass factories to 
the user code. These factories return the actual query function that the user code 
should use. First we need to create 2 factory function, one for normal queries and one 
for timing queries:

わたしたちには、なにもかもを小さな関数に分解 (decompose) したあとに put everything 
together again のためのファクトリが必要です。このアイデアはユーザーのコードが使用して
いる query の型が何であるか (通常の query なのか、タイミング query なのかなどなど) を
決して知るべきではないというものです。わたしたちはしたがって、ユーザーのコードに対して
ファクトリーを渡します。これらのファクトリーはユーザーのコードが使用すべき actual 
query function を返します。最初にわたしたちはファクトリー関数を二つ生成する必要があり
ます。その一つは通常の query のためのもので、もう一つは timing query のためのものです:


(defn query-factory []
  (fn [q] (query q)))

(defn timing-fn-factory [factory]
  (fn [q] (timing-fn (factory) q)))


It is important to note that while the query-factory has no parameters, the 
timing-fn-factory takes another factory as parameter. Our timing factory knows nothing 
about the query function and is completely generic. Next we need a user code function 
that takes a factory as parameter and invokes it to get and use the actual query 
function:

query-factory がパラメーターを持たないのに対してtiming-fn-factory が別のファクトリーを
引数として受け取るということは注視すべき重要な点です。わたしたちの timing ファクトリー
は query 関数については何も知らないので、完全に汎用 (generic) なものです。次にわたした
ちにはパラメーターとしてファクトリーを受け取って、実際の query 関数を得て使用するため
にそのファクトリーを起動するユーザーコード関数が必要です


(defn load-users [factory]
  ((factory) "load users"))


Lets use it with the normal query function:

ではこれを通常の query 関数と一緒に使ってみましょう:


(load-users query-factory)


Using the timing-fn-factory is a bit more tricky, since a) we want that the user code 
calls the factory and b) the user code does not know that the factory takes another 
factory as parameter. Hence we need something like "here is your factory and I 
already fill in the parameters for you" feature. This pattern is called partial 
application in functional languages and is probably one of the most basic operation:

timing-fn-factory を使うことは a) わたしたちはユーザーのコードがファクトリを呼び出すこ
とを求めている。b)ユーザーのコードはファクトリがもう一つのファクトリをパラメータとして
受け取ることを知らないという理由で bit more トリッキーです。わたしたちは "here is 
your factory and I already fill in the parameters for you" (これがあなたのための
ファクトリで、すでにあなたのためにパラメーターを埋めています) 機能のようなものを必要と
しています。このパターンは関数型言語において部分適用 (partial application) と呼ばれて
いるものであり、関数型言語における最も基本的な操作の一つと云えるでしょう。


(load-users (partial timing-fn-factory query-factory))


We simply call partial with the function and parameters.

わたしたちは単に関数と引数を部分的に呼び出します。

As I wrote in the beginning, I think that every Java/OO programmer should be familiar 
with the concepts Nick presented and they indeed are very important. However, I hope 
that I was able to show that the functional programming world is powerful as well and 
that there are more reasons than just convention-over-configuration why "hipster 
programmers who loves Clojure, Ruby, Scala, Erlang, or whatever" are adopting 
functional programming languages.

最初に書いたように、わたしは Java/OOプログラマーのすべてが、 Nick がプレゼンし重要なも
のとみなされたこのコンセプトに慣れ親しんでおくべきであると考えています。しかし関数プロ
グラミング世界が powerful as well であり、そして“hipster (新しいもの好き) プログラマ
ーたち”がなぜ関数プログラミング言語を adpot (採用する、選ぶ、身につける) しようとして
いるのかの単なる convention-over-configuration 以上の理由を目にできることをわたしは希
望しているのです。

Gepostet von Roman Roelofsen unter 5:13 PM

■_ 本日の巡回から

■_ GNU grep


  Re: removing blank lines: "grep ." is really slow
http://lists.gnu.org/archive/html/bug-grep/2010-04/msg00138.html

なんかパッチが間断なく寄せられている模様。 2.6.4もすぐかな?

2010年04月18日

■_

・めも
NHK ハーバード白熱教室 の再放送予定。

4月24日(土)【23日深夜】午前1時15分教育
    第1回「殺人に正義はあるか」再放送

4月25日(日)【24日深夜】午前1時05分教育
    第2回「命に値段をつけられるのか」再放送

4月25日(日)【24日深夜】午前2時04分教育
    第3回「“富”は誰のもの?」再放送

4月25日(日)午後6時00分教育
    第4回「この土地は誰のもの?」

買った
会計HACKS!
これから読む。 なつたんも読むといいよ!

電子書籍の衝撃 (ディスカヴァー携書)
第三章まで読んだ。

ほかにも買いたい(読みたい)のがあったけど金が苦しいのでちょっとがまんの子。

■_ 「関数を使います」

うけてしまった。

Win32API質問箱 Build87 
279 デフォルトの名無しさん [sage] 2010/04/16(金) 14:29:40 ID: Be:
    質問です。
    プラットフォームSDK/win32 で CreateFile を使った場合、
    戻された HANDLE からファイルを closeするにはどうしたら良いのでしょうか。

    MSDN の該当ページ ( http://msdn.microsoft.com/ja-jp/library/cc429198.aspx ) を見ると、

    >解説
    >CreateFile が返したオブジェクトハンドルを閉じるには、 関数を使います。

    とだけ書かれていて、「どの関数」 かが明示されていません。 ご存知の方、よろしくお願い致します。


280 279 [sage] 2010/04/16(金) 14:33:12 ID: Be:
    ・・・って、書き込みをした直後に上の方のレスを見て、もしやと思いテストして見た所、
    いきなり上手くいきました・・・ すみませんでした。

    http://msdn.microsoft.com/ja-jp/library/cc429605.aspx

    >解説
    >CloseHandle 関数は、次のオブジェクトのハンドルを閉じます。
    >?ファイル

281 デフォルトの名無しさん [sage] 2010/04/16(金) 14:39:26 ID: Be:
    Win32APIを弄りだして最初に面食らう一つがCloseHandle。 

282 デフォルトの名無しさん [sage] 2010/04/16(金) 14:45:54 ID: Be:
    日本語ページはクソ

    http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx 

283 デフォルトの名無しさん [sage] 2010/04/16(金) 14:49:00 ID: Be:
    >>279
    >>CreateFile が返したオブジェクトハンドルを閉じるには、 関数を使います。
    >とだけ書かれていて、「どの関数」 かが明示されていません。

    クソワロタwwwwwww マジで日本語版MSDN死んでいいよwwww 嫌がらせだろこれww

284 デフォルトの名無しさん [sage] 2010/04/16(金) 14:57:26 ID: Be:
    When an application is finished using the object handle returned by CreateFile,
    use the CloseHandle function to close the handle.

    機械翻訳の過程で CloseHandle を close hande と置き換え→すっとばし発生 なのかねw 

285 デフォルトの名無しさん [sage] 2010/04/16(金) 15:04:31 ID: Be:
    MSDN見るなら英語版にしろって言う人時々いるけど、これまさにその1例になりそうな話だなww
    そして何かのコピペになりそうだw

    問い「これはどうしたらいいのですか?」
    答え「関数を使います」

286 デフォルトの名無しさん [sage] 2010/04/16(金) 15:06:33 ID: Be:
    関数呼び出しにに必要な構造体とか関数ポインタ型へのリンクがないだけでも
    使いものにならないのに。 

288 デフォルトの名無しさん [sage] 2010/04/16(金) 15:25:13 ID: Be:
    いまだにVC6使ってる俺は2001年10月版の日本語MSDN使ってるけど
    ちゃんと

    CreateFile が返したオブジェクトハンドルを閉じるには、CloseHandle 関数を使います。

    てなってるな。劣化してるのかな? 

299 デフォルトの名無しさん [sage] 2010/04/16(金) 20:45:03 ID: Be:
    最近打ち合わせでは分かり切ったことは飛ばして話を進めているのに
    知識として持っててあたりまえのことを質問する馬鹿が増えた 

300 118 [] 2010/04/16(金) 21:13:46 ID: Be:
    そうかあ。

     俺、ブラやぱんつに興味ないんだ。
     スリップが透けてるといいと思うけど、いないしな。
     下着なしも、もっといないしな。
     透けてなくていいよ。 

■_ 枚数(なんのだっけ?)を強調する質問には以下略


[500枚!!]HSPのテキスト複合化について・・・ テキストのセーブ時に暗号化、ロー... - Yahoo!知恵袋


テキストのセーブ時に暗号化、ロード時に複合化したいのですが、複合化がわかりません;誰か
教えてください。

--------------ソース-----------------
cls 1
objmode 1
sdim buf,65000
flg=1
mesbox buf,636,446,flg+4,0

objsize 60,24
pos 410,450:button gosub "LOAD",*file_load
pos 480,450:button gosub "SAVE",*file_save
pos 548,450:button gosub "END",*endbtn

onkey gosub *keychk
stop

*keychk
title "size="+strlen(buf)
return

*file_save
dialog "dcp",17,"暗号プログラムファイル"
if stat=0 : return
fname = refstr
if getpath(fname,2)="" : fname+=".dcp"
gosub *encrypt
notesel data
notesave fname
return

*file_load
dialog "dcp",16,"暗号プログラムファイル"
if stat=0 : return
notesel buf
noteload refstr
/* ここで復号化処理を行うこと */
objprm 0,buf
return

*encrypt
sdim data,2500*2

repeat strlen(buf),0
dst=(($12+(peek(buf,cnt)^dst2))^$b6)+256&255
dst2=dst
data+=strf("%02x",int(dst))
loop
return

*endbtn
end
------------------------------------
上の複合化処理を行うところでソースを入れて貰うと嬉しいです。それとdcpファイルと言うの
を自作したのでプログラムから開くでdcpファイルを開くと自動で保存してあるテキストを複合
化して表示できるようにしたいのですが、開くと上のプログラムだけ開いてしまい。テキストが
表示されません、そこのソースもいれてもらえると「俺のネ申」ですサイコーです。
お願いします

HSP わからんのだけど dst=(($12+(peek(buf,cnt)^dst2))^$b6)+256&255 +256 ってのは何のためにやってるんだろう? しかしこの cnt って変数がシステム変数とはねえ。

■_ 本日の巡回から

■_ リスト内包

言われてみりゃ納得できるけど、いきなり出遭うと面食らうかも?


Pythonのお勉強 Part37

499 デフォルトの名無しさん [sage] 2010/04/10(土) 09:48:52 ID: Be:
    'はじめてのpython'に書いてあったことなんだけど
    res = []
    for x in range(5):
     if x%2 == 0:
      for y in range(5):
       if y%2 == 1:
        res.append((x,y))

    print res
    //(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)
    をfilterとmap関数で表現したいのですが

    print map(lambda x:map(lambda y:(x,y), filter(lambda x:x%2==1, range(5))), filter(lambda x:x%2==0, range(5)))
    //[[(0, 1), (0, 3)], [(2, 1), (2, 3)], [(4, 1), (4, 3)]]
    てな感じで配列具合がうまいこと出来ません。
    どうしたら良いのでしょう? 

500 デフォルトの名無しさん [sage] 2010/04/10(土) 10:20:56 ID: Be:
    http://www.josw.net/blog/?p=987 

501 デフォルトの名無しさん [sage] 2010/04/10(土) 10:51:45 ID: Be:
    reduce(lambda x, y: x + y, map(lambda x: map(lambda y: (x, y), range(1, 5, 2)), range(0, 5, 2))) 

502 デフォルトの名無しさん [sage] 2010/04/10(土) 11:06:01 ID: Be:
    非実用的な動的コードを書くのはやめて下さい。
    even = filter(lambda x: x%2 == 0, range(5))
    # 0-5の偶数をリストとして返します
    odd = filter(lambda x:x%2==1, range(5))
    # 0-5の奇数をリストとして返します
    print map(lambda x:map(lambda y: (x, y), odd), even)
    # これを内包表記で表現すると原因が分かります。
    [[(x, y) for y in odd] for x in even]
    # この場合は以下の通りに書き換えれば配列の具合が良くなります
    res = []
    [[res.append((x, y)) for y in odd], for x in even]
    print res

    # 或いは
    res = []
    map(lambda x:map(lambda y:res.append((x,y)), filter(lambda x:x%2==1, range(5))), filter(lambda x:x%2==0, range(5))) 

503 デフォルトの名無しさん [sage] 2010/04/10(土) 11:13:00 ID: Be:
    print (lambda x,y,z: '%s, %s, %s'%((lambda x,y: '%s, %s'%(x,y))(*x),(lambda x,y: '%s, %s'%(x,y))(*y),(lambda x,y: '%s, %s'%(x,y))(*z)))(*map(lambda x:map(lambda y:(x,y), filter(lambda x:x%2==1, range(5))), filter(lambda x:x%2==0, range(5)))) 

504 デフォルトの名無しさん [sage] 2010/04/10(土) 11:16:39 ID: Be:
    わらた 

505 デフォルトの名無しさん [sage] 2010/04/10(土) 11:17:20 ID: Be:
    >>502
    こういうのは一行に拘るから意味があるのであって
    二行以上でいいなら出来るのは当たり前で楽しくない

    ↓以下一行野郎うぜーのレス 

506 デフォルトの名無しさん [sage] 2010/04/10(土) 11:18:17 ID: Be:
    どうみても、役には立たないな。
    理論とは適当に折り合いをつけてプログラムしろぐらいの意味しかないだろ。 

507 デフォルトの名無しさん [sage] 2010/04/10(土) 11:27:45  ID: Be:
    >>505
    499の質問にはそういった事は書いて居ないと言うことは
    君には協調性も知性もないということだな。
    そして君はここから出ていくべきだ。 

508 デフォルトの名無しさん [sage] 2010/04/10(土) 11:32:47 ID: Be:
    1行にまとめる場合はlambdaを使う必要はないし、むしろ使うのはタブーだ
    499ならまだしも、505はPython道を理解できてないし、それかただのperl流れの初心者であると推測できる 

509 デフォルトの名無しさん [sage] 2010/04/10(土) 11:49:15 ID: Be:
    >>499
    ようは、mapをネストするとリストのリストになってしまうわけだ。
    >>501のようにreduce使えばリストに戻せるが、mapとfilterでそれをする方法は少なくとも俺は知らない。

    mapのネストをしないように気をつけて書いてみたら、こういう風になった(もっといい方法求む)
    つまり5進数で考えて、10(5)の位をx、1の位をyに置いた。
    map(lambda x:(x//5, x%5), filter(lambda x: (x//5)%2 == 0 and (x%5)%2 == 1, range(5*5)))

    ただ、pythonではmap使うくらいなら内包表記をすることが推奨されている。
    それだと、回りくどい方法を考えなくても素直にこう書ける。
    [(x, y) for x in range(5) for y in range(5) if x%2 == 0 if y%2 == 1] 

510 デフォルトの名無しさん [sage] 2010/04/10(土) 12:02:38 ID: Be:
    どう見ても内包表記向きの問題だが、それを使わないのなら
    flatmapを使うのが定石
    Pythonにはないけど、
    flatmap = lambda f, xs: sum(map(f, xs)), [])
    のように定義すればよい

    flatmapを使うと、以下のようになるよ
    flatmap(
      lambda x: map(lambda y: (x, y),
                    filter(lambda x: x % 2 == 1, range(5))),
      filter(lambda x: x % 2 == 0, range(5))) 

511 デフォルトの名無しさん [sage] 2010/04/10(土) 12:03:38 ID: Be:
    ああごめん
    flatmap = lambda f, xs: sum(map(f, xs), [])
    こうね 

512 デフォルトの名無しさん [sage] 2010/04/10(土) 13:43:40 ID: Be:
    おまえらって文法で遊んでるだけじゃね? 

513 デフォルトの名無しさん [sage] 2010/04/10(土) 13:46:58 ID: Be:
    初心者に変なこと刷り込むわけでもないし別にいいじゃん 

514 デフォルトの名無しさん [sage] 2010/04/10(土) 13:47:26 ID: Be:
    失せろクズ 

515 デフォルトの名無しさん [sage] 2010/04/10(土) 14:07:03 ID: Be:
    >>512
    Lispスレで言ってこい。 

516 デフォルトの名無しさん [sage] 2010/04/10(土) 14:11:28 ID: Be:
    >>512
    おい
    ム板の核心を突くのはよせ 

2010年04月17日

■_

きた
POD版

図書館から借りていた旧版(というのか?)と並べてみた

■_ メモリの無駄遣い?

なぜメモリの無駄遣いになるのかよくわかんないけど


C/C++: MB_LEN_MAX が無駄に大きい | Microsoft Connect

Visual C++ は、2バイトまでのマルチバイト文字しかサポートしていないにもかかわらず、マク
ロ MB_LEN_MAX が 5 と定義されているため、無駄にメモリを消費する。

※ちなみに、Visual C++ 6.0 では 2 と定義されていた。

Unicode と MBCS:
> http://msdn.microsoft.com/ja-jp/library/cwe8bzh0(v=VS.100).aspx
メモ
このドキュメントでは、MBCS は、Unicode でサポートされていないすべてのマルチバイト文字
を指します。Visual C++ では、MBCS は常に DBCS を意味します。2 バイトを超える文字セット
はサポートされていません。
<< 

んー、Wide characeter との変換時のバッファーの大きさとかのことを言いたいんだろうか? でも、MBCS のいう MB と MB_LEN_MAX の MB とでは同じ「マルチバイト」でも 意味は微妙に違ってるんじゃないかなあ。

■_ ジャアクなもの

数日前にも紹介した reddit のスレ?から。 いくつか抜き出し。


What is the most EVIL code you have ever seen in a production enterprise environment? - Stack Overflow


I've seen a password encryption function like this

function EncryptPassword($password)
{
    return base64_encode($password);
}


This was the error handling routine in a piece of commercial code:

/* FIXME! */
while (TRUE)
    ;

I was supposed to find out why "the app keeps locking up".

Base 36 encoding to store ints in strings.

I guess the theory goes somewhat along the lines of:

    * Hexadecimal is used to represent numbers
    * Hexadecimal doesnt use letters beyond F, meaning G-Z are wasted
    * Waste is bad

At this moment I am working with a database that is storing the days of the week that an event can happen on as a 7-bit bitfield (0-127), stored in the database as a 2-character string ranging from '0' to '3J'.

I remember seeing a login handler that took a post request, and redirected to a GET 
with the user name and password passed in as parameters. This was for an 
"enterprise class" medical system.

I noticed this while checking some logs - I was very tempted to send the CEO his 
password.


In the main project header file, from an old-hand COBOL programmer, who was 
inexplicably writing a compiler in C:

int i, j, k;

"So you won't get a compiler error if you forget to declare your loop variables."

32 source code files with more then 10K lines of code each. Each contained one class. 
Each class contained one method that did "everything"

That was real nightmare for debuging that code before I had to refactor that.

■_ 追いかけてみようか

Common Lisp コンパイラーを作るとか何とか


Common Lisp Compilers Internals: Intro. Why this blog was launched

As you may guess from the blog title, it is dedicated to Common Lisp compilers. During 
my attempts to fix several bugs in SBCL I understood that it would be good to have 
some SBCL Compiler (Python) internals manual first. It happened that there are only 
three or fours papers about the subject at this time, and they are not very detailed. 
Since I have some experience with other compilers internals, I thought that it would 
be good to try writing such a manual myself.

Maybe it sounds crazy:), especially because I cannot say that I am a Lisp guru. Yes, I 
have been using Common Lisp on my daily job for almost three years, and yes, I 
participate in the development of industrial-level compilers on that job. Is that 
enough to think that it is a time to write my own book? Probably not... But anyway I 
have started this manual, because I need it at least for my own SBCL hacking goals. In 
case somebody else finds it to be useful, I will be happy.

This blog will hold chapters from the book. In case you find some 
grammar/logical/fundamental mistakes in these chapters, I will appreciate notes and 
comments about them.

Also I will probably post other Lisp-related things here, in case I consider them to 
be interesting.

The last thing to mention: I am not a native English speaker, so I apologise for any 
grammar mistakes you may see in my posts:) 

現時点では三つ目のエントリまでかな?

とりあえず rss リーダーに登録はした。

■_ 本日の巡回から

■_ 疲れた

面倒になって途中で投げる最近のパターン_| ̄|○

Tic-Tac-Toe: Haskell « Torquing Wet Strainers

Haskell is seriously packed with modern, interesting, expressive goodies.

But I have a message for the Haskell community: stop trying to “simplify” monads.  
Really, just stop.  I have yet to see an “explanation” of monads that does not add 
to the confusion and fear a novice might feel at approaching the language.  You don't 
need to know what a monad is in order to use the language effectively.  Talking about 
them to a beginner is about as useful as explaining loop unrolling and keyhole 
optimization to a beginning C programmer.  Later, yes, it's helpful.  But it's too 
much information at the start.  A beginner just needs to know that if you want to use 
code that does IO, it has to go inside a do, and if you want to pull out values and 
use them elsewhere, you need the <- operator.  It took me three nights of working 
on this one to learn that one, because the Gentle Introduction relegated I/O to 
chapter 7.

しかし、わたしはHaskellコミュニティに対して言いたいことがあります。モナドを「単純化」 
(“simplify”)しようとするのは止めてください。本当に、止めてください。わたしは、混乱を
招くこともしないし初心者がHaskellという言語に近づくのを怖がらせることもしないようなモ
ナドの“解説”(explanation) を未だに見たことがありません。Haskell という言語を効果的に
使うためにモナドがなんであるのかを知る必要はないのです。そういったことに関することがら
を初学者に話すことは、新米 Cプログラマーにループのアンローリングやキーホール最適化 
(keyhole optimisation) を説明するのと同じ程度には useful です。それは、学習が進んだあ
とであれば helpful であるといえるでしょう。しかし最初の時点での情報としては多すぎるの
です。初学者が知らなければならないことは、自分が IO を行うコードを使いたい場合にはそれ
を do の内側 (inside) で行う必要があるということと、値を pull out してそれを別のところ
で使いたいのなら<- 演算子が必要だということだけなのです。
It took me three nights of working on this one to learn that one, 
because the Gentle Introduction relegated I/O to chapter 7.



On that note, you've got to stop treating I/O in general as a red-headed stepchild.  I 
realize that isolating side effects is one of the raisons d'être for Haskell in the 
first place, but if you hope to win converts from the programming world at large (and 
I really hope you do) then you've got to understand that most of us mere mortals want 
our programs to do something, and that means input/output.  I understand, or at least 
I think I do, that you want to instill good habits from the start and minimize time 
spend in the IO monad, but honestly, the language is pretty good at doing that already. 
 You've got to go and talk to people where they already are before you can lead them 
somewhere else.


一つ注意しておくと、
you've got to stop treating I/O in general as a red-headed stepchild.  
副作用を isolating することが first place における Haskell の存在意義の一つ
であるとわたしは認識しました。

but if you hope to win converts from the programming world at large (and I really hope 
you do) then you've got to understand that most of us mere mortals want our programs 
to do something, 

普通の人間であるわたしたちの大多数は (most of us mere mortals) は
プログラムに何かをさせたいのであり、そしてその何かは入力と出力を意味しているのです。
わたしが理解した、少なくともそうだと確信していることは
あなたは最初から良い習慣を教え込ませて (instill good habits)
IO モナドに賭ける時間を最小にしようとしているのだろうということです。
しかし正直に言えば、Haskell はすでにそういった普通の人たちの望むことを行うのに
pretty good なのです。
You've got to go and talk to people 
where they already are before you can lead them somewhere else.



Once peple get used to IO and Maybe and whatever other monads are out there, then you 
can introduce the concept because there's somewhere for it to land.  I remember taking 
CS theory in college, and talking with one of the TFs who I happened to know socially. 
 He is an extremely bright guy, and as is sometimes common with bright guys, can have 
trouble explaining a concept to someone who doesn't get it themselves right away.  I 
made plea for more concrete examples to go with the theoretical explanations in the 
class, and his response was, “Well, we assume that you, the smart [name of school] 
students, can come up with the examples yourselves.”  This is exactly wrong for many 
many people out there, including a lot of the folks who are attracted to coding in the 
first place.  Some folks work well top-down — get the overarching concepts and then 
fill in the details themselves.  But some people learn the other way around — 
experience the details, and then build up the framework from there.  My impression is 
that the Haskell community is filled with the former type of learner.  But it's a 
great language, even for the more experiential/practical and less theoretical, and I 
hate to see it shunned as too scary.

ひとたび IO と Maybe の使い方を理解し、そのほかにもモナドが存在しているということを知
れば、あなたはそこでモナドというコンセプトを導入できるようになります。なぜなら、土台が
できたからです。わたしは大学で CS 理論について講義をしたときに TFの中にいた (I 
happened to know sociallyな) 人物と話したことを忘れません。彼は飛びぬけて優秀な人間で
したが、そういった優秀な人間にありがちな正しく理解していない人に対してコンセプトを説明
するのにトラブルを起こしがちなタイプでした。わたしはそのクラスで理論的な説明をするとき
にはもっと具体的な例を使ってくれとお願いしたのですが、彼の反応はこういったものだったの
です
“Well, we assume that you, the smart [name of school] students, can come up with the examples yourselves.”  
これは
 a lot of the folks who are attracted to coding in the first place
を含めそこにいた many many people に対して全くもって間違ったやり方でした
一部の folks はトップダウンで、コンセプトを overarching してから詳細を自分自身で埋めて
いくということができました。しかし中には、学ぶのに別のやり方、詳細を経験してそこから
フレームワークを構築するというやり方を採っていた人たちもいたのです。わたしの受けた印象
は Haskell コミュニティには  former type of learner がたくさんいるというものです。
けれども、Haskell は theoretical というよりは  experiential/practical である great な
言語であり、Haskell が scary (恐ろしい、怖い) すぎると言って避けるのを見るのがわたしは
嫌なのです。



Ranting aside, I really enjoyed writing this.  For those of you who haven't tried it 
yet, I highly recommend it.  It will make you smarter.  I stumbled on places where it 
differs from OCaml, and I got stuck on IO for a while, but I'm glad I persevered.

Ranting aside,I really enjoyed writing this.  
もしあなたがまだ Hasekll に try していないのなら、わたしは try するのを強くお勧めしま
す。Haskell に try することはあなたをより賢くするでしょう。
I stumbled on places where it differs from OCaml, 
and I got stuck on IO for a while, 
but I'm glad I persevered.

This was written against GHC 6.10.4.

(以下プログラム部分は省略)

2010年04月16日

■_

Haskellers Meeting 2010 Spring : ATND
あとでかく

とりあえず、8割がた読んだところで止まっている ガウディ本を 読破しないといけないと思いました。

■_ 1.7

新機能。

Java 1.7 - What's new? Release date, code examples and performance

(略)

What's new in Java 1.7?

First thing first. To determine what set of small language changes should be added to 
JDK 7, a project has been set up called Project Coin. The final five changes (bit more 
than 5) are described on the following blog entry of Joseph D. Darcy.

So what made it through is the following:

    * Strings in switch
      switch 文で string
    * Automatic Resource Management
      自動的なリソース管理
    * Improved Type Inference for Generic Instance Creation (diamond)
      ジェネリックなインスタンス生成のための改良された型インターフェース (diamond)
    * Simplified Varargs Method Invocation
      単純化された可変引数メソッドの起動
    * An omnibus proposal for better integral literals
      よりよい整数リテラルのための pmnibus proposal
    * Language support for Collections
      コレクションのための言語サポート
    * Language support for JSR 292
      JSR 292 のための言語サポート

There is a list of other features available on the OpenJDK 7 features page.

These features are divided in different categories:

VM

    * Compressed 64-bit object pointers
      圧縮された64ビットオブジェクトポインター
    * Garbage-First GC (G1)
    * JSR 292: VM support for non-Java languages (InvokeDynamic)
      Java以外の言語に対するVMサポート (InvokeDynamic)


lang

    * SR 294: Language and VM support for modular programming
              モジュラープログラミングのための言語およびVMのサポート
    * JSR 308: Annotations on Java types
              Javaの型に対するアノテーション
    * JSR TBD: Small language enhancements (the Project Coin I was talking about)
              小規模な言語拡張
    * JSR TBD: Project Lambda


core

    * Modularization (Project Jigsaw)
      モジュール化
    * Upgrade class-loader architecture
      クラスローダーのアーキテクチャのアップグレード
    * Method to close a URLClassLoader
    * Unicode 5.1
    * Concurrency and collections updates (jsr166y)
    * JSR 203: More new I/O APIs for the Java platform (NIO.2)
      Javaプラットフォームのためのより新しい I/O API群
    * SCTP (Stream Control Transmission Protocol)
    * SDP (Sockets Direct Protocol)
    * Elliptic-curve cryptography (ECC)


client

    * XRender pipeline for Java 2D
    * Forward-port 6u10 deployment features
    * Create new platform APIs for 6u10 graphics features
    * Nimbus look-and-feel for Swing
    * Swing JLayer component


web

    * Update the XML stack

As you can see there is a lot of stuff. I personally tried the new Garbage Collector 
(G1) a few months back and was really impressed by the performance. Unfortunately the 
JVM was crashing every few hours so it couldn't be used for production. This GC is 
available in Java 1.6 as well but same thing, it crashes every so often.

I think that's it for the new features. Maybe it's a good idea to see some code 
examples now.

Code examples for new features in Java 1.7

Most of what is below come from the excellent article from Joe Wright on his blog 
about New language features in Java 7

Language support for collections (コレクションに対する言語サポート)

This is all about writing less code when you create a List, a Set or a Map. You don't 
have to instantiate the Object and then add the element to the Collection. You can now 
do it in 1 line.

List<String> list = ["item"];
String item = list[0];

Set<String> set = {"item"};

Map<String, Integer> map = {"key" : 1};
int value = map["key"];

Automatic Resource Management (自動的なリソース管理)

Annoyed to have verbose code because of try / catch statement. You will love this one.

try/catch 文のための冗長さにうんざりしていることでしょうから、
この新機能をあなたはすきになるでしょう。

Indeed, this:

BufferedReader br = new BufferedReader(new FileReader(path));
try {
   return br.readLine();
} finally {
   br.close();
}

Become this:

try (BufferedReader br = new BufferedReader(new FileReader(path)) {
   return br.readLine();
}

Improved Type Inference for Generic Instance Creation (diamond)
ジェネリックなインスタンス生成に対する型インターフェースの改良

Same thing, today you specify the Generic when you declare the interface of your 
object and then you have to repeat yourself when you instantiate the object. You won't 
have to now as you can do:

同じくうんざりしていることで、あなたのオブジェクトのインターフェースを宣言するときに
Generic を特定し、さらにそのオブジェクトをインスタンス化するときに repeat yourself
しなければなりません。今やそのようにする必要はなく、次のように書けるのです:


Map<String, List<String>> map = new HashMap<>();


Underscores in numeric literals (数値リテラル中のアンダースコア)

Not sure this one will be useful to lot of people. You can do:

int billion = 1_000_000_000;

Strings in switch (switch 文における Strings)

Nothing to explain here, the title says it all.
ここで説明することはありません。タイトルがすべてを物語っています。

String availability = "available";
switch(availability) {
 case "available":
    //code
    break;

  case "unavailable":
    //code
    break;

  case "merged":
    //code

  default:
    //code
    break;
}

Binary literals (二進リテラル)

You can create binary literals using the 0b prefix

0b プリフィクスを使って二進リテラレルを作れます。

int binary = 0b1001_1001;

That's it for the code examples. It would be great if someone can point me on more 
things. I am sure there are plenty of other cool stuff.

Performance of Java 1.7 (Java 1.7 の性能)

I have picked up the tests I ran from an article from Taranfx posted here.

So the tests are the following (my code, not his but I followed the same ideas). I ran 
all of this on a Macbook Pro running ArchLinux (the one with an Intel(R) Core(TM)2 Duo 
CPU T7700 @ 2.40GHz. I think 2 years old). I have 2Gb of RAM. I set the Heap Size to 
728m (-Xms728m -Xmx728m).

Test 1. Add 1 Million String values to a List (the String is a UUID generated using 
UUID.randomUUID()).

百万個の文字列を一つのリストに追加する(この文字列は UUID.randomUUID()を使って
生成されたUUIDです)。

Test 2. HashMap with 1 million keys, values. Each key, value pair is being calculated 
via concurrent thread. The key is a UUID and the int is generated using Math.random()
百万個のキーと値のペアを持ったHashMap。それぞれのペアは並行スレッドを通じて
計算されます。キーはUUIDであり、その int は Math.random()を使って生成されたものです。

Test 3. Printing 1 million items of ArrayList to number of Files (1000). Writing to 
different files happening in parallel.

AllrayList の百万個のアイテムを多数(1000)のファイルに出力します。
異なるファイルへの書き出しは並列に行われます。

I am just comparing Java 1.6 (1.6.0_19) vs Java 1.7 (b87). I haven't used Java 1.5 for 
a very long time so I didn't see the point and Java 1.4 is from an other age to me but 
if someone asks maybe I'll do that.
So here is the result

Performance benchmark Java 1.6 vs Java 1.7

	Java 1.6 	Java 1.7
Test 1 	9.481 ms 	9.328 ms
Test 2 	37.935 ms 	36.636 ms
Test 3 	30.868 ms 	27.383 ms

The difference of performance is clearly not as big as it is in the article of Taranfx. 
It appears that our implementation of his tests are probably quite different as well 
as my tests are taking a lot more time than his.

■_ エスパー求む

落ちが…

C言語なら俺に聞け(入門編)Part 63 
193 デフォルトの名無しさん [sage] 2010/04/16(金) 20:29:35 ID: Be:
    #include <stdio.h>
    int main(void)
    {
    long i=0;
    for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
    return 0;
    }
    (8) : error C2143: 構文エラー : ';' が '型' の前にありません。
    (9) : error C2065: 'i' : 定義されていない識別子です。
    (9) : error C2065: 'i' : 定義されていない識別子です。
    (9) : error C2065: 'i' : 定義されていない識別子です。

    どこがおかしいのか分かりません
    たすけてくだしあ 

194 193 [sage] 2010/04/16(金) 20:33:11 ID: Be:
    ↑
    (8)は4行目です 

195 デフォルトの名無しさん [] 2010/04/16(金) 20:55:01 ID: Be:
    >>193
    普通に動いたよ。
    long int じゃないとだめとかかな?

196 デフォルトの名無しさん [sage] 2010/04/16(金) 20:59:20 ID: Be:
    >>193
    うちのGCCはWARNINGは出るがコンパイル自体は通ってる。

    環境に何か問題あるんじゃまいか。

    他にエラーとか、警告とか出てないのか? 

197 デフォルトの名無しさん [sage] 2010/04/16(金) 21:17:41 ID: Be:
    >>193
    うちのコンパイラでもエラーはでないな。
    Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
    Copyright (C) Microsoft Corporation. All rights reserved.

    06.c
    Microsoft (R) Incremental Linker Version 9.00.30729.01
    Copyright (C) Microsoft Corporation. All rights reserved.

    /out:06.exe
    06.obj

198 デフォルトの名無しさん [sage] 2010/04/16(金) 21:19:18 ID: Be:
    >>184
    otherwise を「引数リストの型などについて」の意味と解釈した理由を教えていただけませんか? 

199 デフォルトの名無しさん [sage] 2010/04/16(金) 21:27:17 ID: Be:
    >>193
    {
    /* 行番号から、ここに何かあると予想 */
    long i=0;

200 デフォルトの名無しさん [sage] 2010/04/16(金) 21:43:23 ID: Be:
    (4) : error C3872: '0x3000': この文字を識別子で使用することはできません
    (5) : error C2143: 構文エラー : ';' が '型' の前にありません。
    (6) : error C2065: 'i' : 定義されていない識別子です。
    (6) : error C2065: 'i' : 定義されていない識別子です。
    (6) : error C2065: 'i' : 定義されていない識別子です。

    こうならできたけどなぁ 

201 デフォルトの名無しさん [sage] 2010/04/16(金) 21:48:36 ID: Be:
    >>187
    ほう、ディレクティブっていうのか。
    10年C使ってて初めて知ったぜ 

202 デフォルトの名無しさん [sage] 2010/04/16(金) 21:55:43 ID: Be:
    >>200
    何で最初に
    (4) : error C3872: '0x3000': この文字を識別子で使用することはできません
    これを書かなかったんだ……

    何処かに全角文字使ってる。
    多分long i=0;の辺り 

203 デフォルトの名無しさん [sage] 2010/04/16(金) 22:03:40 ID: Be:
    >>200
    4-7行目あたりに、他のコード(そこだけなら動く)があるんじゃないか?
    で、今度は、それを消した時に、全角文字が残って、
    違うエラーがでたんじゃないのか? 

204 デフォルトの名無しさん [sage] 2010/04/16(金) 22:06:28 ID: Be:
    あ、ちがうちがう。>>200は>>193じゃない。
    まぎらわしくてすまん。
    同じメッセージを出したくて、つい。 

205 デフォルトの名無しさん [sage] 2010/04/16(金) 22:18:35 ID: Be:
    可能性は∞。

    全角文字がある可能性もあるし、人間には見えない文字が紛れ込んでいる可能性だってある。
    或いはコンパイラが賢すぎてfor内の条件が1度も満たされない事に気付いてexeを生成するのを拒否してるのかもしれん。 

206 デフォルトの名無しさん [sage] 2010/04/16(金) 22:22:09 ID: Be:
    >>204
    同じメッセージを出したいなら、こんな感じ。

    #include <stdio.h>
    int main(void)
    {
    char buf[] = "Hello, world!";

    printf( "%s\n", buf );

    long j=0;
    for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
    return 0;
    } 

207 193 [sage] 2010/04/16(金) 22:22:49 ID: Be:
    すいません
    再起動したら直りました 

208 デフォルトの名無しさん [sage] 2010/04/16(金) 22:25:02 ID: Be:
    Hello worldに書き換えた時に、変な消し方をしてしまった…orz
    long j=0; // ×
    long i=0; // ○

209 デフォルトの名無しさん [sage] 2010/04/16(金) 22:29:16 ID: Be:
    >>206
    ああ、その手があったかw 

210 デフォルトの名無しさん [sage] 2010/04/16(金) 22:30:27 ID: Be:
    >>207
    んなアホな… 

■_ Perl 5.12

なんのかんので Perl 5もいろいろ芸が増えてますね。


What's new in ActivePerl 5.12? | ActiveState Blog

(略)

New “package NAME VERSION” syntax

It allows you to set the module version right in the “package” statement at compile 
time, without having to assign to $VERSION at run-time.  This makes the code more 
concise, and also makes it easier for other tools to extract the version number out of 
the source.

The “…” operator

The so called “yada yada” operator of Perl 6 heritage is a shortcut to mark 
unimplemented code:

    if ($condition) { ... }

is the same as

    if ($condition) { die "not yet implemented" }

Implicit “use strict”

An explicit request to require Perl 5.12 or later will automatically turn on “use 
strict”:

陽に Perl 5.12 もしくはそれ以降のものを require した場合、自動的に
“use strict”が有効になります。

    use 5.12.0;

implies:

    use strict;
    use feature ":5.12";

Unicode improvements

Perl 5.12 now bundles Unicode 5.2. Perl now supports all Unicode properties for 
developers doing globalization work in multiple languages. The implementation has been 
improved to provide access to every Unicode character property, including the loose 
matching rules for property names, and definition of all Unicode-defined synonyms for 
property names and values.

The “feature” pragma now supports the new “unicode_strings” feature:

    use feature "unicode_strings";

This will turn on Unicode semantics for all case changing operations on strings, 
regardless of how they are currently encoded internally.

Y2038 compliance

The built-in date and time function now all work correctly past the year 2038 even 
when Perl is compiled with only 32-bit support. With previous versions of Perl for 
32-bit Unix systems, it could only represent dates up to the year 2038, after which it 
wraps around back to 1970. It is especially important for financial services 
organizations that use Perl for applications such as mortgage and insurance contracts 
that run for 30 years or longer. This has been updated within the internal functions 
of 32-bit Perl 5.12.

qr overloading (qr演算子のオーバーロード)

It is now possible to overload how objects are turned into regular expressions when 
they appear on the right hand side of the =~ operator, or when they are interpolated 
into a regexp.

オブジェクトが =~ 演算子の右辺に登場したとき、もしくは正規表現への interpolate が
なされるときにどのように正規表現に変換するのかをオーバーロードできるようになりました。

Pluggable keywords

The experimental keyword plugin mechanism allows extensions to cleanly hook into the 
Perl parser to define new kinds of keyword-headed expressions and compound statements. 
The syntax following the keyword is defined entirely by the extension. This feature 
facilitates the development of domain specific languages (DSLs) within Perl by 
allowing a completely non-Perl sub-language to be parsed inline, with the correct ops 
cleanly generated. The word “experimental” signifies that this feature may be 
changed significantly, or even be removed completely, in a future release of Perl.

この実験的なキーワードプラグイン機構は extension が Perlのパーザーを
クリーンにフックしてそのキーワードから始まる新しい種類の式と複合文の定義を
できるようにします・キーワードに続く構文は完全にその extension によって定義されます。
この機能はPerlの中でドメイン特化言語 (DSL Domain Specific Language) を開発することを
インラインでパーズされる完全にPerlではないサブ言語を許すことによって可能にします
(with the correct ops cleanly generated)。“実験的”という単語はこの機能が
将来のPerlにおいて大きく変わったり完全になくされてしまう可能性があることを示しています。

Experimental \N regexp escape

The new \N regex escape works like the inversion of \n, matching any character that is 
not a newline, and (unlike the ‘.’ meta-character) is not affected by the “single 
line” regexp modifies /s.

新しい \N 正規表現エスケープは \n に対する inversion のように振舞います。
改行を除くすべてのキャラクターにマッチし、(メタキャラクター '.' とは異なり)
“単一行”を指定する正規表現修飾子 /s の影響を受けません。

Lots more

There are a lot more changes and bug fixes in 5.12, so please read the full 
perl5120delta document before upgrading.

(略)

■_



var/タワゴト(2010-04-15)
ソフトウェア開発における初心者 by Matz
http://www.rubyist.net/~matz/20080204.html#p02

    まるでババ抜きのようだ。 「使えないソフトウェア」を引いて顧客が損するか、 「プロジ
    ェクト赤字」を引いてベンダーが損するか、 「消耗しきって体調不良」を引いて火消し開発者
    が損するか。

    それでも「自称初心者」だけは、「私はわかりません」という顔をして生き残り、 ますま
    すはびこることになる。 

ぎゃあ、黒歴史に不意打ち。うちの場合は3者損でしたが。。

でも、メッセサンオーも酷い開発者を引いてしまったよなぁ。加えて「何も悪くない正規の購入
者」が損をしているんですもの。。

ちなみにこの事件の場合、TBCプライバシー事件のように委託元企業の損害賠償責任が明確に認
定されそうなんで、集団訴訟でがっつり賠償金取れます。法律事務所の方、集団訴訟の呼びかけ
頑張ってくださいー。

こうやって訴訟を通じ、自称初心者を経済的に廃業に追い込むことで数を減らすことが、プログ
ラマ界のデバッグ機構になると自分は信じております。リバタリアニズム。

作り手に責任云々ということで最近読んだこの本を思い出しました
欠陥ソフトウェアの経済学 ―その高すぎる代償―
プログラミングテクニックとか開発手法の話はなかったりして、 たぶん受けは非常に良くない種類の本なのでしょうけど一読しておくと良い本だと思います。

■_ 本日の巡回から

2010年04月15日

■_

・東スポ
記事の量としてはそれほどでもないのですが、 xperia と iPhone の 比較記事があってびっくりした(笑) 購買層重なるのかなあ。

・ムダヅモ無き改革
もうなにがなにやら

■_

VS6って今でもよく使われているっぽいけどなんでなんだろう。 まあいくつか推測できなくもないけど。

【ActiveScript】RubyをWindowsで使うスレ【GUI】 [chaika]
705 デフォルトの名無しさん [sage] 2010/02/26(金) 08:55:39 ID: Be:
    今って、mingw32とVC6でビルドされたmswin32との差異って何になるんだろう?

    ・使用コンパイラがmingw32はgcc、mswin32はVC6
    ・前項に関連してRubyソースにgcc特有の最適化が入っているため性能が違う(mingwの方が速い)
    ・RUBY_PLATFORMの値が違う
    ぐらい?

    昔だと
    ・Ruby本体のDLL(今でいうmsvcrt-rubyXX.dll)が別名で拡張ライブラリのバイナリ共用不可(現在は可能)
    ・archdirが別
    とかあったみたいだけど1.7の頃に統一されたみたいだし。

    ruby-win32メーリングリストあたりに情報がありそうな気がするものの、
    アーカイブが公開されてないみたいでどうしたもんかな。 

706 デフォルトの名無しさん [sage] 2010/02/26(金) 09:30:23 ID: Be:
    >>705
    ビルドされたrubyそのものの違いはあまり聞かないな

    最大の違いは、開発環境を揃えるのが容易かどうか
    というかVC6ってまだ手に入るの?

707 デフォルトの名無しさん [sage] 2010/02/26(金) 09:49:00 ID: Be:
    >>706
    >というかVC6ってまだ手に入るの?
    正式な形では無理と思われる。

    msvcrt.dllへのリンクって観点だとWDKやDDKあたりからCRT.libを持ってくると
    今時のVCでもmsvcrt.dll使わせることが可能ではあるみたい。

    あと、Windows Server 2003 SP1 DDK は無料でダウンロードできて、
    コンパイラもついてくる、と。
    ttp://d.hatena.ne.jp/j_m/20080301/1204394341

    性能と、拡張ライブラリ作るときの敷居の低さから
    mswin32からmingw32への移行を考えてるんだけど、
    特に差異もない感じなんだろうか。

    Ruby自体のDLLやらシンボルやらも同じならASRとかも
    インストールすれば動くんだろうしなあ。 

708 デフォルトの名無しさん [sage] 2010/03/11(木) 13:58:22 ID: Be:
    VC9でもできるらしい。
    ttp://www.garbagecollect.jp/~usa/d/200910a.html
    ttp://www.garbagecollect.jp/~usa/d/200910c.html 

709 デフォルトの名無しさん [sage] 2010/03/30(火) 01:22:45 ID: Be:
    >>707

    この辺のファイルは今のうちにダウンロードしておくことをお勧め。

    Windows Server 2003 SP1 DDK (VC6が入っている)
    http://download.microsoft.com/download/9/0/f/90f019ac-8243-48d3-91cf-81fc4093ecfd/1830_usa_ddk.iso

    Windows Server 2003 Platform SDK Feb 2003 (VC6用PSDK)
    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm

    Visual Studio 6.0 SP6 (DDKで不足しているライブラリの一部を入手可能)
    http://www.microsoft.com/downloads/details.aspx?FamilyId=A8494EDB-2E89-4676-A16A-5C5477CB9713&\1displaylang=ja

    DirectX 9.0 SDK Oct 2004 (Extrasを入れるとVC6で使用可能)
    http://www.microsoft.com/downloads/details.aspx?FamilyID=b7bc31fa-2df1-44fd-95a4-c2555446aed4&\1DisplayLang=en

    DirectX 9.0 SDK Oct 2004 Extras (DirectX SDKをVC6で使う場合に必要)
    http://www.microsoft.com/downloads/details.aspx?FamilyID=d6f237de-a6ee-4ded-8bb6-139536162eb8&\1DisplayLang=en

710 デフォルトの名無しさん [sage] 2010/03/30(火) 01:49:05 ID: Be:
    >>709

    ちょっと間違い。DDKのコンパイラはVS2003相当なので,VC6を入手するにはeMbeded Visual C++が必要。

    eMbeded Visual C++ 4.0 (ダウンロードページのプロダクトIDが必要)
    http://msdn.microsoft.com/ja-jp/vstudio/cc789301.aspx

    eMbeded Visual C++ 4.0 SP4
    http://www.microsoft.com/downloads/details.aspx?familyid=4A4ED1F4-91D3-4DBE-986E-A812984318E5&\1displaylang=ja 

711 デフォルトの名無しさん [sage] 2010/04/13(火) 20:04:27 ID: Be:
    IronRuby、結構イケルぞ! 

712 デフォルトの名無しさん [sage] 2010/04/13(火) 22:27:20 ID: Be:
    IronRuby、MRI 1.8.7対応してほしいのう。 



C++0x 9 
238 デフォルトの名無しさん [sage] 2010/04/13(火) 21:12:34 ID: Be:
    Visual Studio 2010 is now available!
    http://blogs.msdn.com/visualstudio/archive/2010/04/12/visual-studio-2010-is-now-available.aspx

    C++0x Core Language Features In VC10: The Table
    http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx 

239 デフォルトの名無しさん [sage] 2010/04/13(火) 22:28:56 ID: Be:
    Japanese版早く出せ 

240 デフォルトの名無しさん [sage] 2010/04/14(水) 23:34:16 ID: Be:
    >>239
    1週間ぐらい待てないのか?

    俺は待てない 

241 デフォルトの名無しさん [sage] 2010/04/15(木) 05:06:09 ID: Be:
    あんまりソワソワしないで 

242 デフォルトの名無しさん [sage] 2010/04/15(木) 18:46:38 ID: Be:
    あなたはいつでもキョロキョロ 

243 デフォルトの名無しさん [sage] 2010/04/15(木) 20:40:40 ID: Be:
    よそ見をするのはやめてよ 

244 デフォルトの名無しさん [sage] 2010/04/15(木) 20:44:14 ID: Be:
    おまえら何歳なんだよ 

245 デフォルトの名無しさん [sage] 2010/04/15(木) 20:50:16 ID: Be:
    ょぅι゛ょです 

うる星やつらかw

■_

■_


http://lists.gnu.org/archive/html/emacs-devel/2010-04/threads.html#00538
http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00507.html
http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00515.html
http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00538.html
http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00565.html
http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00575.html

読んでる時間が~~~~っ

■_ あれ? 前回で最後だったんじゃあ

逆コンパイルの見方について(再度)(1/1) | OKWave

askaaska`様 コンパイルまでは出来ましたが実行段階で不調です。やみくもにやっているので
ご迷惑をお掛けしているのは重々承知しています。恐らくこのプログラムからJSPを実行してWeb
に表示しているものと考えられます。残念ながら画面が遷移しません。このプログラムだけです、
あとは無理やり直しました。邪道とは思いますが方法がありません。

public class TranslationEntryBL {
private final String STR_ARRAY[];
private TranslationEntryForm srcform;
private TranslationEntryBL() {
STR_ARRAY = new String[0];
srcform = null;
}
(略)
}
try {
srcform.setFocusElement(null);
obj = srcform;
} catch (Exception exception) {
DBUtil.closeConnection(conn);
throw exception;
}
DBUtil.closeConnection(conn);
return ((GenericApplicationForm) (obj));
}

return ((GenericApplicationForm) (obj));のところで処理が止まります。何かアドバイスを下
さい御願いします。尚、止まると判断しているのはBEEP音を入れてどこまで動いたかを確認した
ものです。

最早、専門家でないと出来ない領域かと思いますが、何卒宜しく御願い致します。

逆コンパイラ使って一生懸命何をやっているんだろう?

■_ 標準講座C

現物見ました。 悪くないような気はしますが、じっくり読んだら違うかもw

■_ みずしまさん

国際デビューおめでとうございます♪

2010年04月14日

■_

・tool de programming?
【コラム】攻略! ツール・ド・プログラミング (20) Zen-Codingをカスタマイズしてさらにコーディング効率を上げる なんですが(もう20回もやってるのか)。 多分、ツール・ド・フランス (ツール・ド・フランス - Wikipedia) をもじったものだろうと思うんですが、これってフランス語ですよね。 んで、フランス語じゃあプログラミングのことを「programming」とは言わないんじゃないの? という気がするので以前からむずがゆいものを感じていたのですが、URIをよーーーく見ると column/tool/020/index.html となっているのに気がつきました。 tool? 一体全体「ツール・ド・プログラミング」とはなんなのかもう何がなにやら。

【コラム】攻略! ツール・ド・プログラミング (1) Javaアプリケーション対応のクラウド環境「Stax Networks」

したがってタイトルの「ツール」とは"Tour"ではなく"Tool"のことですが、
さまざまなツールをできるだけ広範囲に紹介するTourのようなコラムにしたいと考えています。
どうぞよろしくお願いいたします。

連載一回目にこういう記述がありましたが、うーん。 言葉遊び自体はキライじゃないしむしろ好きだけど、 自分の母語でない言語を弄繰り回すのはどうも。

■_ なにをやってるんだろう


逆コンパイルの見方について(1/1) | OKWave

ソースがなくて困ってJADの逆コンパイルをしてみました。
(Decompiled by Jad v1.5.8e.)以下のように結果が出ます。

public GenericApplicationForm save() throws Exception {
Connection conn = null;
TranslationEntryForm translationentryform;
initCommonInfo();
if(checkEntryContent()) {
break MISSING_BLOCK_LABEL_24;
}
translationentryform = srcform;
DBUtil.closeConnection(conn);
return transentryform;
conn = DBUtil.getConnection(srcform.getWebInfoPath());
daSaveContent(conn);
conn.commit();
ContentData();
break MISSING_BLOCK_LABEL_61;
Exception exception;
exception;
DBUtil.closeConnection(conn);
throw exception;
DBUtil.closeConnection(conn);
return srcform;
}

Break MISSING_BLOCK_LABEL とexception;並びにCloseが2箇所あるところがおかしいと思うので
すが、どう読めば良いでしょうか

変な質問で申し訳ありませんが宜しく御願い致します。

質問者が選んだベストアンサー

jadによる逆コンパイルは100%成功するわけではないのよ。
特に元の実装が想定外の形で作られていると
こういうことが発生するわ。
余計な代入があったり、変な処理をしてたり、とかね。
逆コンパイルは、こういうときはこう復元する、ってやっているだけだから
それに当てはまらないとおかしなソースが出来上がるわ。

推測だけど
public GenericApplicationForm save() throws Exception {
Connection conn = null;
TranslationEntryForm translationentryform = null;
try {
initCommonInfo();
if(checkEntryContent()) {
} else {
translationentryform = srcform;
DBUtil.closeConnection(conn);
return transentryform;
}
conn = DBUtil.getConnection(srcform.getWebInfoPath());
daSaveContent(conn);
conn.commit();
ContentData();
} catch(Exception exception) {
DBUtil.closeConnection(conn);
throw exception;
}
DBUtil.closeConnection(conn);
return srcform;
}
こんな形だったんじゃないかしら。
まあ、こんな変な実装は普通しないと思うけど。
変数とかおかしいし。
このコードはあくまで推測よ。

お礼

誠にありがとうございます。大変なご面倒をお掛けしております。
ご指摘のように作成者のシステムはグチャグチャです。
稼動確認は十分でないものの兎に角動きました。
多分また同様な質問をさせて戴くかと思いますが宜しく御願い致します。


逆コンパイルの見方について(再度)(1/1) | OKWave逆コンパイルの見方について(再度)(1/1)

もう一度だけ教えて下さい御願いします。逆コンパイルをした結果が読めません。どうのように
に読めばいいでしょうか、同様の修正を行いたいと思います。

private GenericApplicationForm prepareContentData() throws Exception {
(略)
気張ってはいるのですが、もう一度ご指導願います。

質問者が選んだベストアンサー

if (条件式) {
break MISSING_BLOCK_LABEL_XXX;
}
文1
return リターンコード
文2

となっていたら

if (条件式) {
} else {
文1
return リターンコード
}
文2

と読み替えてみれば良いと思います。

最後の4行はcatch句だと思うけど、
どこからtryがかかっているかはわからないですね。

お礼

ありがとうございます。

逆コンパイルの見方について(再度)(1/1) | OKWave逆コンパイルの見方について(再度)(1/1)

逆コンパイル(JAD)で以下のようになります。

if(resultP.getRs().next()) {をどう処置するかが問題だと思いますが、如何せん実力不足です。
break MISSING_BLOCK_LABELが複数あるので色々
やってみなしたが駄目です。
アドバイス下さるよう御願い申し上げます。
(略)

何卒宜しく御願い致します。
きれいに逆コンパイルできなった
そんなときは
それっぽいコードに組み立てあげるしかないのよ。

おそらく
if(!resultP.getRs().next()) {
obj = returnList();
DBUtil.closeConnection(conn);
return ((GenericApplicationForm) (obj));
}
なんじゃないかと推測はできるけど。
他のIF文も同様ね。

あといくつ質問が来るのかしら。

補足

これが最後です。
推測というのは経験にもとづくものです。
経験がないのを口惜しくは思いますが、短時間で経験をあがなうことは出来ません。人に縋るよ
り術がなく何度も質問してしまいました。

如何せん状況が悪すぎるのが実態で、ここを乗り越えるには人様にお知恵を拝借するにかないと
決めていました。

全く、Webを触ったこともない中でここ3ヶ月Java、JSP等々、おぼろげな推論と手探りで手直し
して来ました。

日本人は約束をベースに動いている民族です。こちらでは、出来ないと悟ると逃げ出します。経
験がなくても逃げ出さない自分に頼るしかありませんでした。

教えるというのは難しいことです。ゴールと現在地のギャップが大きすぎると諦めるしか道がな
くなります。このギャップの幅も民族によって異なるものと思われます。この地では「自分で考
えろ!」というと逃げ出します。幼児のようなものです。

幼児に教えるには、少し背伸びすれば出来そうなことをやらせる。褒めるの繰り返ししかありま
せん。

「自分で考えろ!」が成立するのは、皆、能力を持っているだから頑張れという前提があるので
す。階級性が強い社会では、ものを考えるのは支配階層の役割です。この地では大卒であっても
東西南北の概念すら分かりません。

一方で、日本も今岐路にあるように思われます。支配階層が実は全く無能であったことに気付い
てしまったのです。再設計が必要なのですが、誰かがやってくれないかと待っているのが現状で
しょう。

余分なことを書きましたが色々アドバイスありがとうございました。

何だこの捨て台詞(?)

■_

そーいやそーゆー話もあったなあ >がいる


Re: Guile in Emacs (was: integer overflow)

Re: Guile in Emacs (was: integer overflow)
From: 	Thomas Lord
Subject: Re: Guile in Emacs (was: integer overflow)
Date: 	Mon, 12 Apr 2010 13:05:39 -0700

On Mon, 2010-04-12 at 08:30 -0400, Richard Stallman wrote:
> When I read about Sun's plan to make TCL the universal scripting
> language, I decided to oppose that.  The plan I chose was to implement
> Scheme and support other scripting languages by translation into Scheme.
> Guile is the program I chose to adopt to do this with.  That plan
> is what I am talking about.
> 
> Whatever history that code had before its adoption for this plan
> is not what I am talking about.

Sure.  In one sense it was just your use of the word "original"
as in "original goal" that I was objecting too.  

Yet, there is another aspect of this which I think is
relevant to "Guile in Emacs" and to your notion of 
supporting other scripting languages -- otherwise I 
wouldn't harp on it:

In those early days of Guile, after your decision, those
of us closer to the project discussed at considerable
length how exactly to support Tcl, Emacs lisp, and 
other languages.  Not just how to be able to run programs
in those languages but how to integrate them into a 
cohesive environment.

In each and every case we discovered devils in the details
and realized "Well, we can't."   We could make a TCL-like
language that could run many simple TCL programs but that
would not be upward compatible - and have that TCL-like
language nicely integrated with the larger environment.
We could make an Emacs Lisp style of environment that 
could run some Emacs Lisp code directly but that would
not be upwards compatible - and have that alternative Emacs
Lisp nicely integrated with the larger environment.  
But we absolutely could not, for fundamental reasons,
directly support Tcl and Emacs Lisp with fidelity and
wind up with a sane programming environment.

We realized that pretty quickly and tried (but failed) to 
convey to you this notion that we could not promise to
seamlessly integrate those other languages - but that we
could offer a reasonable compromise.  It was always 
an oversimplifying exaggeration to say that Guile would
support all of those other languages in any strong sense
of the word "support".  We could offer alternative 
syntaxes.  We could offer environments with simplified
evaluation models and more flexible types.  We could
give people the *feel* of Tcl or Python or Emacs Lisp
but there was no point in trying to faithfully reimplement
those languages in detail.   We failed miserably at 
communicating that distinction, apparently.

(略)


Meanwhile, with all the (often interesting and skilled - 
admirable) work that has gone down that rat-hole in 
those years, a thoroughly Scheme-based but not upwards
compatible Emacs could have been casually produced by,
say, 10 or 12 years ago.   Coulda' Shoulda' Woulda' but
Didn't, as the saying goes.

I just hope that the next 10 years of GNU generally
and Emacs specifically isn't going to be tied down
to the historic baggage of the "Tcl Wars" and the 
misunderstandings it provoked.

Someone -- that is to say "someone" -- should just 
rip Emacs Lisp out of the C part of GNU Emacs, bind 
the best parts of that stuff to Guile, and start *there*.
It's not a small job but it's also not a "more than 
a decade" job.  It could have been started much more than
a decade ago.  It'd be, in my view, a giant leap back
towards the vision of a GNU system that was shared 
among several key GNU hackers back in the early 1990s
and earlier.  And it'd be, in my view, technically sane
in comparison to some more popular alternatives like 
trying to support Emacs Lisp in detail.

I'm done.  I've said my piece.

-t

やり取り全部追いかけてみるか。

■_ 本日の巡回から

2010年04月13日

■_

おかしい。今日はわりと早く帰ってきたのになんでこんなになにもできていないんだ。

■_ 標準講座 C

ぐぐっても、「標準講座 C++」とか「標準講座 C#」の方が上位に来てしまうのが なんとも悲しい。


標準講座 C:SEshop.com/商品詳細
標準講座 C
たしかな基礎力と幅広い応用力を培うために初めての人でもやさしく学べる
著:	Stephen G. Kochan
訳:	中尾真二
商品番号:119710
ISBN:9784798119717
サイズ:B5変
ページ:544
販売価格:\3,360(本体\3,200 消費税5%)
発売日:2010/04/14
出版社:株式会社翔泳社
原著タイトル:Programming in C


目次
まえがき
訳者まえがき

     第1章  はじめに 
     第2章  基本事項 
     第3章  最初のプログラムのコンパイルと実行 
     第4章  変数、データ型、算術式 
     第5章  ループ 
     第6章  条件分岐 
     第7章  配列 
     第8章  関数 
     第9章  構造体 
     第10章  文字列 
     第11章  ポインタ 
     第12章  ビット演算 
     第13章  プリプロセッサ 
     第14章  データ型の詳細 
     第15章  大規模プログラムの開発 
     第16章  入出力命令 
     第17章  高度な機能 
     第18章  デバック 
     第19章  オブジェクト指向プログラミング 
     付録A  C言語サマリ 
     付録B  標準Cライブラリ 
     付録C  gccによるコンパイル 
     付録D  プログラムにありがちなミス 
     付録E  参考資料 

索引

先週後半に確か秋葉原の有隣堂に先行販売で入ったとかいうのをついったでみたんですが、 ほかの大型書店では見かけず(つーてもそういくつも回ったわけではないんですが)。 Cの入門書とみるといちおーチェックせずにはいられない(笑)

タイトル忘れちゃったけど、やっぱり翻訳の入門書レベルの本を見たら 「配列は参照渡し」みたいな事がかかれててひっくり返った覚えが。 これはそういうのがないことを祈ろう。

■_ ジャアクなコード

reddit から。


What is the most EVIL code you have ever seen in a production enterprise environment? - Stack Overflow

What is the most evil or dangerous code fragment you have ever seen in a production 
environment at a company? I've never encountered production code that I would consider 
to be deliberately malicious and evil, so I'm quite curious to see what others have 
found.

The most dangerous code I have ever seen was a stored procedure two linked-servers 
away from our core production database server. The stored procedure accepted any 
NVARCHAR(8000) parameter and executed the parameter on the target production server 
via an double-jump sp_executeSQL command. That is to say, the sp_executeSQL command 
executed another sp_executeSQL command in order to jump two linked servers. Oh, and 
the linked server account had sysadmin rights on the target production server.
Warning: Long scary post ahead

I've written about one application I've worked on before here and here. To put it 
simply, my company inherited 130,000 lines of garbage from India. The application was 
written in C#; it was a teller app, the same kind of software tellers use behind the 
counter whenever you go to the bank. The app crashed 40-50 times a day, and it simply 
couldn't be refactored into working code. My company had to re-write the entire app 
over the course of 12 months.

Why is this application evil? Because the sight of the source code was enough to drive 
a sane man mad and a mad man sane. The twisted logic used to write this application 
could have only been inspired by a Lovecraftian nightmare. Unique features of this 
application included:

    * Out of 130,000 lines of code, the entire application contained 5 classes (excluding
      form files). All of these were public static classes. One class was called
      Globals.cs, which contained 1000s and 1000s and 1000s of public static variables
      used to hold the entire state of the application. Those five classes contained
      20,000 lines of code total, with the remaining code embedded in the forms.

    * You have to wonder, how did the programmers manage to write such a big application
      without any classes? What did they use to represent their data objects? It turns
      out the programmers managed to re-invent half of the concepts we all learned 
      about OOP simply by combining ArrayLists, HashTables, and DataTables. We saw a lot
      of this:

          o ArrayLists of hashtables
          o Hashtables with string keys and DataRow values
          o ArrayLists of DataTables
          o DataRows containing ArrayLists which contained HashTables
          o ArrayLists of DataRows
          o ArrayLists of ArrayLists
          o HashTables with string keys and HashTable values
          o ArrayLists of ArrayLists of HashTables
          o Every other combination of ArrayLists, HashTables, DataTables you can think of.

      Keep in mind, none of the data structures above are strongly typed, so you have 
      to cast whatever mystery object you get out of the list to the correct type. It's 
      amazing what kind of complex, Rube Goldberg-like data structures you can create
      using just ArrayLists, HashTables, and DataTables.

(以下略)

抜き出して整形している時間的余裕がががが。 しかし脅威のノベタンプログラム。

■_ 5.12.0

5.10からもう? という印象がなくも。


Perl 5.12.0 is now available - nntp.perl.org

Perl 5.12.0 is now available

(略)

This release cycle marks a change to a time-based release process.
Beginning with version 5.11.0, we make a new development release
of Perl available on the 20th of each month.  Each spring, we will
release a new stable version of Perl.  One month later, we will make a
minor update to deal with any issues discovered after the initial ".0"
release. Future releases in the stable series will follow quarterly.
In contrast to releases of Perl, maintenance releases will contain fixes
for issues discovered after the .0 release, but will not include new
features or behavior.

Notable changes in Perl 5.12 include:

* Perl now conforms much more closely to the Unicode standard.
  Additionally, this release includes an upgrade to version
  5.2 of the standard.

* New experimental APIs allow developers to extend Perl with 
  "pluggable" keywords and syntax.

* Perl now has a better sense of time and will be able to keep
  accurate time well past the "Y2038" barrier.

* New syntax allows developers to specify package version numbers
  directly in "package" statements

* Perl now warns the user about the use of deprecated features
  by default.

Perl 5.12.0 features numerous new features, optimizations and bugfixes.
You can find a complete list of these changes on the web at:

  http://search.cpan.org/~jesse/perl-5.12.0/pod/perl5120delta.pod

(以下略)

time-based release process へえ。

■_ どうしろってねえ

中二未満(笑)


中1です。HSPの勉強をする時間がありません!!どうしたらいでしょうか!! - Yahoo!知恵袋

中1です。HSPの勉強をする時間がありません!!どうしたらいでしょうか!!

まだ始まっていませんが、
部活が始まれば夕方まで学校にいますし、
そのあとは塾があります。
そして、帰ってきたら
宿題&復習&寝る
ことくらいしかできません。

でも、HSPの勉強はしたいです。
せめて簡単なシューティングゲームくらい作れるようになりたいです。

どうにかして時間を作り、
HSPの勉強もしたいのですが、
どうしたらいいでしょうか?

あと、とりあえず参考に出来るシューティングのソースが欲しいんですが、
もしできたら、
簡単なシューティングゲームのソースがあるサイトを教えてもらえませんか?

あと、とても親切な方でしたら、
「この部分は**を実行しています」
みたいなのをソースに書いておいてくれませんか?(図々しくてすいません・・・)

訊く場所を間違えているような気がしないでもない。

■_

ちょっと前に関連したものを紹介しましたが、読み返していてちょっと気になったので。


What Pythonistas Think of Ruby | Free PeepCode Blog

3 February 2010

What Pythonistas Think of Ruby

San Pueblan Milksnake


    The very things I find ugly in Ruby are what make amazing Ruby software like RSpec 
    possible, and that Python could never have (given the current implementation).

    わたしが Ruby に関して見つけたもっとも ugly なものは RSpec のようなソフトウェアを
    可能にする何かでした。そしてそれは、Python が決して持つことができないであろう
    ものです(現在の実装においては)。

Gary Bernhardt 

    I think Ruby's syntax is ugly until they do something glorious and beautiful with 
    it like Rake, then I think "damn it!"

Unidentified Attendee 

    Q: Does Ruby have a better inheritance system than Python?
       Ruby は Python よりも優れた継承システムを持っているのですか?

    A: I find inheritance distasteful. That's like asking me whether I would rather 
       eat grasshoppers or tree bark.

       わたしは継承が distateful なのに気がつきました。あなたの質問はわたしに
       grasshopper と tree bark のどちらを食べたいかを尋ねるようなものです。

Gary Bernhardt 


My perspective on Ruby was rocked last weekend at Northwest Python Day in Seattle.

先週末にシアトルで行われた Northwest Python Dayにおいてわたしの Ruby に対する 
perspective は rock されました

Compared to other programming languages, Python and Ruby are so similar that hearing 
arguments between them is like trying to figure out which identical twin is more 
handsome.

そのほかのプログラミング言語と比較して、Python と Ruby はよく似ています。両者の主張を
くらべてもidentical twin (一卵性双生児?) のどちらが more handsome なのか区別しようとす
るようなものです。


But there are differences, and not only in the languages! The Seattle Python community 
represented there was almost painfully polite. People sat silently for 3-5 minutes 
between talks while the speaker plugged in to the projector. I rudely whispered to my 
neighbor, eager to discuss the ideas presented.

けれどもこの二つの言語には違いがあって、それは言語にとどまらないのです! Seattle Python
コミュニティは almost painfully な polite (丁寧さ、上品な)だったと表現しました。スピー
カーがプロジェクターを接続するまでの間の 3分から 5分の間皆が静かに座っていました
I rudely whispered to my neighbor,eager to discuss the ideas presented.
#隣の人とひそひそばなしで ideas presented について熱く議論した?


During the talks, people mostly sat and listened to the speaker. Many Ruby conferences 
in the USA are half full of hackers with laptops open, coding away at a project and 
jeering the speaker over IRC. Not here.

トークの間、みなは着席してスピーカーの話に聞き入っていました。USAにおける多くの Ruby 
カンファレンスでは半分ほどがラップトップを開いたハッカーたちであり、プロジェクトのコー
ディングをしていたりスピーカーをIRCで jeering したりしているのですが、ここでは違いまし
た

I later learned that this may be an attribute unique to Seattle Python developers. 
After all, we're the city that gave the world the Uptight Seattleite and where drivers 
with the right-of-way stop to let cyclists turn left in front of them.

わたしは、これがシアトルの Python デベロッパーたちに特有な態度なのではないかということを
後になって学びました。結局のところ、

we're the city that
わたしたちは city なのです
gave the world the Uptight Seattleite and
where drivers with the right-of-way stop to let cyclists turn left in front of them.

■_ 本日の巡回から

2010年04月12日

■_

・ヤンマガ増刊
買う。あ、14日か。

■_ オラ

これが翻訳されるとは。 原著を紀伊国屋書店の洋書売り場で見かけたりして気にはなっていたのだけど、 買うにはいたらなかった(苦笑) 4000円しないし、買うかな。


O'Reilly Japan - アルゴリズムクイックリファレンス
目次
まえがき
第I部
1章 アルゴリズムは大事だ
1.1 問題を理解せよ
1.2 必要なら実験しろ
1.3 救援のためのアルゴリズム
1.4 ついでの話
1.5 この話の教訓
1.6 参考文献

2章 アルゴリズムの数学

3章 パターンとドメイン
3.1 パターン――コミュニケーションの言語
3.2 アルゴリズムのパターン形式
3.3 疑似コードのパターン形式
3.4 設計形式
3.5 評価実験の形式
3.6 ドメインとアルゴリズム
3.7 浮動小数点計算
3.8 手動メモリ割り付け
3.9 プログラミング言語を選ぶ
3.10 参考文献

第II部
4章 整列アルゴリズム
5章 探索
6章 グラフアルゴリズム
7章 AIにおける経路発見
8賞 ネットワークフローアルゴリズム 9章 計算幾何学 第III部 10章 他のすべてがうまくいかなかったとき 10.1 主題の変形 10.2 近似アルゴリズム 10.3 オフラインアルゴリズム 10.4 並列アルゴリズム 10.5 乱択(Randomized)アルゴリズム 10.6 間違うかもしれないがその確率を減少させたアルゴリズム 10.7 参考文献 11章 結び 11.1 概観 11.2 原則:汝のデータを知れ 11.3 原則:問題を小さく分割せよ 11.4 原則:正しいデータ構造を選べ 11.5 原則:性能を上げるにはストレージを追加せよ 11.6 原則:解が明らかでないなら、探索を構築せよ 11.7 原則:解が明らかでないなら、解を持つ別の問題に帰着させよ 11.8 原則:アルゴリズムを書くのは難しい、アルゴリズムを試験するのはもっと難しい 第IV部 付録 ベンチマーク 索引 訳者あとがき

この本にしかないというのは多分ないだろうけど、 手元に置いておきやすいし持ち歩く辞書的に持っててもいいかも。

■_


prog21: Rethinking Programming Language Tutorials

Rethinking Programming Language Tutorials
(プログラミング言語のチュートリアル再考)

Imagine you've never programmed before, and the first language you're learning is Lua. 
Why not start with the official book about Lua? Not too far in you run across this 
paragraph:

自分がこれまでプログラムを作ったことが全くなくて、最初のプログラミング言語としてLuaを
学ぼうとしていると想像してみてください。当然、Lua に関する公式の本で始めますよね?
読み始めてほどなく、次のパラグラフに遭遇するでしょう:


The table type implements associative arrays. An associative array is an array that 
can be indexed not only with numbers, but also with strings or any other value of the 
language, except nil. Moreover, tables have no fixed size; you can add as many 
elements as you want to a table dynamically. Tables are the main (in fact, the only) 
data structuring mechanism in Lua, and a powerful one. We use tables to represent 
ordinary arrays, symbol tables, sets, records, queues, and other data structures, in a 
simple, uniform, and efficient way. Lua uses tables to represent packages as well. 
When we write io.read, we mean "the read entry from the io package". For Lua, 
that means "index the table io using the string "read" as the key".

テーブル型は連想配列 (associative array) を実装しています。連想配列とは、数字に限らず
文字列や nil 以外のなんらかの値を添字付けに使える配列です。それに加えてテーブルは固定
された大きさを持ちません。テーブルに対しては、動的に好きなだけの数の要素を追加できます。
テーブルは Lua における主要な(実際には唯一の)データ構造機構であり、強力なものです。わ
たしたちはテーブルを通常の配列を表現するのに使っていますし、シンボルテーブルや集合、レ
コード、キュー、さらにそのほかのデータ構造を単純で、統一的で効率の良い方法で表現するた
めに使っています。Luaではテーブルをパッケージを表現するためにも使っています。わたした
ちが io.read を書いたとき、それは"the read entry from the io package"(io パ
ッケージからエントリーを読み出す)を意味しています。Lua にとってそれは"index the 
table io using the string "read" as the key". (テーブル ioに対して文字
列を使ってインデクシングしてキーとして読み出す)ということなのです。

All right, where to start with this? "Associative arrays"? The topic at hand is tables, and they're defined as being synonymous with an odd term that's almost certainly unfamiliar. Ah, okay, "associative array" is defined in the next sentence, but it goes off track quickly. "Indexed" gets casually used; there's the assumption that the reader understands about arrays and indexing. Then there's the curious addendum of "except nil." All this talk of arrays and association and indexing, and the novice's head is surely swimming, and then the author throws in that little clarification, "except nil," as if that's the question sure to be on the mind of someone who has just learned of the existence of something called a table. よろしい。ではどこから始めましょうか? "Associative arrays" から? ここで扱っ ているトピックはテーブルであり、読者のほとんどが知らないであろう奇妙な用語の同義語とし て定義されています。ああ、確かに次のセンテンスで"associative array" が定義は されています。しかし、それは goes off track quickly です。"Indexed" という言 い回しが casually に使われていますが、そこには読者が配列と添字付け (indexing) について 理解しているという仮定があります。そしてそのあとに"except nil" という不思議な 付録 (curious addendum) があります。この、配列やら連想やら添え字付けといった言葉で初心 者の頭はいっぱいになってしまっているのに、チュートリアルの書き手はさらにそこへ "except nil" という意味不明の言葉を投げつけているのです。 as if that's the question sure to be on the mind of someone who has just learned of the existence of something called a table. I've only dissected two sentences of that paragraph so far. 問題のパラグラフの二つのセンテンスについてだけ dissect します Really, I should stop, but I can't resist the declaration "Lua uses tables to represent packages as well." Who is that sentence written for exactly? It has no bearing on what a table is or how to use one; it's a five mile high view showing that a beautifully invisible language feature--packages--is really not so invisible and instead relies on this table idea which hasn't been explained yet. この辺りで止めておくべきなのでしょうが、わたしは"Lua uses tables to represent packages as well." (Lua はパッケージを表現するのにもテーブルを使っています) につい て一言言わずにはおれないのです。いったい誰がこのセンテンスを書いたのでしょうか?このセ ンテンスはテーブルの振る舞いを説明していなければテーブルの使い方を説明しているわけでも ありません。それは beautifully invisible language feature であるパッケージが実はそれほど invisible ではなく、まだ説明されていないテーブルという考え方に基づくものであることを showing that する five mile high view なのです。 I don't mean to single out Lua here. I can easily find tutorials for other languages that have the same problems. Every Haskell tutorial trots out laziness and folding and type systems far too early and abstractly. Why? Because those are the concerns of people who write Haskell tutorials. これは Lua のみに限ったことではありません。同じ問題を抱えた他の言語のチュートリアルも 簡単に見つけられます。すべての Haskell チュートリアルで、遅延性 (laziness) と folding と型システムをとんでもなく早い段階で、かつ抽象的に登場させています。なぜでしょうか? それは、それらが Haskell のチュートリアルを書いた人たちの関心事であるからなのです。 To really learn to program, you have to go around in circles and absorb a lot of information. You need to get immersed in the terminology. You'll be exposed to the foibles and obsessions of language communities. You'll absorb beliefs that were previously absorbed by people who went on to write programming tutorials. It's hard to come out of the process without being transformed. Not only will you have learned to program, but all that nonsense that you struggled with ("We use tables to represent ordinary arrays...") no longer matters, because you get it. After that point it's difficult to see the madness, but it's still there. 本当にプログラミングを学ぶには堂々巡りをしたり、大量の情報の中で夢中にならなければなり ません。terminology に没頭する必要があります。言語コミュニティの短所や obsessions (強 迫観念、執念、妄念)に接することでしょう。プログラミングのチュートリアルを書くようにな った人たちがかつて夢中になった信念にあなたも夢中になるでしょう。being transformed せず にこのプロセスから抜け出すのは困難なことです。プログラムのしかたを学ぶだけでなく (普通 の配列を表現するのにテーブルを使っているといった)、あなたが既に理解していて最早重要で もないことと格闘するような意味のないことをすることになるでしょう。 After that point it's difficult to see the madness, but it's still there. Programming language tutorials shouldn't be about leaning languages. They should be about something interesting, and you learn the language in the process. プログラミング言語のチュートリアルは言語の学習についてのものになるべきではありません。 チュートリアルは、何か興味を引くものに関してプロセスの中で言語を学ぶものになっているべ きなのです。 If you want to learn to play guitar, the wrong approach is to pick up a book about music theory and a chart showing where all the notes are on the fretboard. There's a huge gap between knowing all that stuff and actually playing songs. That's why good music lessons involve playing recognizable songs throughout the process. But what do we get in programming tutorials? Hello World. Fibonacci sequences. Much important manipulation of "foo." あなたがギターを弾きたいと思ったなら、音楽理論に関する本をピックアップして chart showing where all the notes are on the fretboard するのは間違ったやり方です。all that stuff を知ることと、実際に歌うことの間には巨大な 隔たりがあります。それが優れた音楽のレッスンがプロセスを通じて recognizable songs を play するのを要求している理由です。しかし、プログラミングのチュートリアルでわたしたちが やっているのはどういったことでしょうか? Hello World. Fibonacci sequences. Much important manipulation of "foo." Not all tutorials are this way. Paradigms of Artificial Intelligence Programming is a survey of classic AI programs mixed together with enough details about Lisp to understand them. I've mentioned others in Five Memorable Books About Programming. But I still want to see more. "Image Processing in Lua." "Massively Multiplayer Games in Erlang." "Exploring Music Theory (using Python)." すべてのチュートリアルがこのやり方をしているわけではありません。「Paradigms of Artificial Intelligence Programming」 は伝統的な AI プログラミングをそれを理解するのに 必要十分なディテールの Lisp の解説を織り交ぜた servey です。 けれどもわたしはまだもっと目にしたいのです。 "Image Processing in Lua." "Massively Multiplayer Games in Erlang." "Exploring Music Theory (using Python)." I'll give a real example of how "Image Processing in Lua" could work. You can convert the RGB values of a pixel to a monochrome intensity value by multiplying Red, Green, and Blue by 0.3, 0.6, and 0.1 respectively, and summing the results. That's an easily understandable Lua function: "Image Processing in Lua" (Lua でイメージ処理) がどのように行えるのかの実例を挙げ ましょう。あるピクセルの Red、Green、Blue の値に対してそれぞれ0.3、0.6、0.1を乗じその結 果を合計することによってRGB 値からモノクロの輝度への変換ができます。これは容易に理解で きる Lua による関数です: function intensity(r, g, b) return r*0.3 + g*0.6 + b*0.1 end If each color value ranges from 0 to 255, then a full white pixel should return the maximum intensity: それぞれの色の値が0から255の範囲にあれば full white のピクセルは最大輝度を返すでしょう。 intensity(255, 255, 255) and it does: 255. This tiny program opens the door for showing how the R, G, and B values can be grouped together into a single thing...and that turns out to be a table! There's also the opportunity to show that each color element can named, instead of remembering a fixed order: つまり、255 です。この小さなプログラムは R、G、B の値がどのように一つのものへまとめら れるのかを表すためにドアを開きます…そして and that turns out to be a table! ここには また、それぞれの色に対応した要素には名前を付けることが可能で固定された順序を覚えておか なくてもいいことを示す機会もあります: {green=255, blue=255, red=255} Rewriting the "intensity" function first using tables and then using tables with named elements should hammer home what a table is and how it gets used. There was no need to mention any techy tangentials, like "tables have no fixed size." (That can go in a terse reference doc.) 最初にテーブルを使って "intensity" 関数を書き直し、そうしておいてから名前つ き要素を持ったテーブルを使ってテーブルがどういったものであってどのように使われているの かを理解させるべきなのです。"tables have no fixed size." (テーブルには大きさ が固定されていません) のような techy tangentials に言及する必要は一切ありません (That can go in a terse reference doc.)。 After all, the reason to learn a programming language is to do something useful with it, not simply to know the language. 結局のところ、プログラミング言語を学ぶ理由とはそれを使ってなにか有用なことを行うためな のであって、ただ単にその言語を知りたいと言うからではありません。 (If you liked this, you might like The World's Most Mind-Bending Language Has the Best Development Environment.)

関連 Rethinking Programming Language Tutorials : programming

■_ 2.7

なんのかんの言って、3.xからのバックポートされてる(3.xの)新機能って結構あるんだねえ。


Python 2.7 ベータ1リリース - SourceForge.JP Magazine : オープンソースの話題満載

 Python 2.7の代表的な新機能としては下記が挙げられる。

    * Cで実装されたより高速なioモジュール
    * 順序付き辞書型(orderd dictionary)
    * 数値に自動的に「,」を付けるための新たなフォーマット指定子
    * memoryviewオブジェクト
    * float型から文字列への変換、および文字列からfloat型への変換機構の改善
    * テストスキップ機能や新たなアサートメソッドが追加された新しいunittestモジュール
    * str.format()メソッドの改善。無名のフィールドに対し引数を順番に割り当てることが可能になった
    * Tkinter向けのTileサポート
    * 「set()」構文の仕様がPython 3.x相当に
    * with構文において複数の引数を同時に与えられるようになった
    * 辞書型(directory)へのViewの導入
    * sysconfigモジュール

順序つき辞書(ハッシュ)ってほしがる人多いのかねえ。

■_

Knuth センセの大発表って何だろう? ということで冗談交じりの予想の数々。


Donald Knuth making an Earthshaking Announcement June 30 in San Francisco : programming

Taken from HN, it deserves more recognition!

http://www-cs-faculty.stanford.edu/~knuth/news.html#lectures

Any guesses?

I'd figure he's going to drop the bomb on everyone tt he has single-handedly completed 
Duke Nukem Forever!


He's selling TeX to Adobe.


And he's been secretly using MS Word for the past 10 years.


...as code editor.


The remaining volumes of the Art of Programming will be released as a Clippy resource.

"It looks like you're implementing a lexical scanner..."


P = NP

P > NP!


TeX for iPad.


Pffft! iTeX is 100% HTML 5 and Javascript!


XML will be the primary syntax of the next version.


My prediction - volume IV will be released.


Hey! You and your real answer can just get the hell out of here. Jokes only!


The full text of The Art of Computer Programming will be donated to the public domain. 
Or at least open-sourced.


Wow that's a fantastic idea. I have always wanted to read it but I know it's going to 
take work and that price tag is just too much to add another hunk of dead tree to rot 
on my bookshelf. Plus, who wants to lug around a hardback?


He's going to announce that The Art of Computer Programming will remain unfinished for 
consistency with The Art of Fugue. Computer programming and fugue writing are


Announcing TeX version 4.0!


Tex version number converges to pi.


Yes. That would be the joke.

■_ 本日の巡回から

2010年04月11日

■_

・アニメイトバイオ
なんて名前の競馬馬がいるんですな。

・Boo本
洋書売り場で Boo の新刊本(らしきもの)を見かけたんですが、 生きていたのかというかなんというか。 あ、でも何ヶ月か前にも日本語のblogで見かけたような気も。

・城は踊る
読んだ。 面白かった。 (史実をほとんどベースにしていない)フィクションだから面白くない とかいう書評をどこかで読んだような気がするけど、 そりゃあもったいないというかなんというか。 全体のイメージとしては、「ガンダム 0080 ポケットの中の戦争」 というときっと通じない(笑)
機動戦士ガンダム 0080 ポケットの中の戦争 vol.1 [DVD]
あと、この表紙絵がとても好き。作品の雰囲気を良く表していると思う。 スーパー戦国武将は出てこないので、そういった方面がお好きな人にはごめんなさいかな。 ということで書影もでかいのを(笑)
城は踊る

■_


8 reasons for re-inventing the wheel as a programmer

26 March, 2010

8 reasons for re-inventing the wheel as a programmer
プログラマーとして車輪を再発明する八つの理由

Again and again I read somewhere around the net that `re-inventing the wheel' is one 
of the worse errors a programmer can fall into. In fact, I've read it so often that 
the only thought of doing it makes me re-think over and over other ways of solving (or 
ignoring) the problem. But here, I advocate my pro's (the cons can be found elsewhere) 
for re-inventing the wheel, or at least not being frightened of it.

繰り返し繰り返しネットのそこかしこで“車輪の再発明”はプログラマーが陥る可能性のある 
worse error の一つだという主張をわたしは読んできました。
In fact, I've read it so often that the only thought of doing it makes me re-think over
and over other ways of solving (or ignoring) the problem.
(あまりにも読むことが多かったので問題を解決する別の方法がないか何度も考えるようになった?)
しかしここでわたしは、車輪の再発明に対する自分の pro's (the cons can be found elsewhere)、
あるいはすくなくとも車輪の再発明を恐れることのないことを advocate (支持、援護、応援)
します。
#frighened おびえた、ぎょっとした

1. I don't like the default wheel color: Sometimes you need a specific type of algorithm,
   one that the 'library standard' just does, without the bells and whistles you need.
   Writing your own version allows you to tweak it to suit your problem domain. Do it!

   デフォルトの車輪の色が気に入らない:
   “library standard”ではあなたが必要としている笛太鼓 (bell and whistles) が欠けている
   ために specific type なアルゴリズム を必要とすることもあるでしょう。自分独自のバージ
   ョンを書くことであなたは  your problem domain を suit するために tweak できるように
   なるのです。Do it!

2. I want a bigger wheel: What happens when the usual algorithm doesn't fit at all? When
   you need to write really context-specific code, working with generalistic libraries is
   impossible. Even worse, what happens when you are writing the specific library? Go
   ahead!

   わたしはもっと大きな車輪が欲しい:
   usual なアルゴリズムでうまく問題を解決できないときに何が起きるでしょうか? 本当にあな
   たに  context-specific code を書く必要があるのなら generalistic libraries を使って仕
   事をすることは不可能です。悪くてもあなたが specific なライブラリを書いたときに何が起
   きるでしょうか? Go ahead!

3. I am a wheel engineer: if you are deep in the know-hows of the subject, re-inventing
   the wheel is a way to be sure of your complete knowledge of your domain of expertise.
   A kind of self-knowledge test. Test it!

   自分は車輪のエンジニアだ:
   もしあなたが deep in the know-hows of the subject なら、車輪の再発明は your complete
   knowledge of your domain of expertise  を確実なものとする手段です。
   これは self-knowledge テストの一種です。Test it!


4. I want to know how does the wheel work: related to the previous item, but focused 
   to amateurs on the subject. I feel this way quite often, and sometimes this has
   paid off in the long run. This can lead to spicing up a boring afternoon. Discover
   it!

   車輪がどのように動作しているのかを知りたい:
   一つ前の項目に関連していますが、amateurs on the subject にフォーカスしています。
   わたしはこの手法は非常に頻繁に行われているけれども長期的にうまくいくことはときどきに
   しかないと感じています。これは退屈な午後を spicing up するものになるでしょう。
   Discover it!


5. My wheel is better than your wheel: Pride. You can write it better, can't you? 
   Closely related to the programmer virtues: laziness, impatience and hubris.
   (check this page for them). Be proud of it!

   わたしの車輪はあなたの車輪よりも良いものだ:
   プライド。あなたはもっといいものを書けます。違いますか? これはプログラマーの美徳
   である怠惰、短気、傲慢 (laziness, impatience and hubris) に密接に関係しています:
   Be proud of it!

6. Proprietary vs free: maybe the wheel you want to use is a proprietary wheel,
   thus you can't add it to your open-source project, or have to pay some fee to
   use it. Free it!

   Proprietary vs free:
   あなたが使いたい車輪はおそらく proprietary なもので、当然あなたは自分のオープンソ
   ースプロジェクトにそれをくわえることができなかったり使用するために幾ばくかの対価
   (fee) を支払う必要があったりするでしょう。
   Free it!

7. Create a new wheel: you need to know how the old stuff works to be able to create 
   the new big thing (usually, in most areas). We are standing on the shoulders of
   giants, but if we don't know how tall they are, we can step over midgets. Learn it!

   新しい車輪を作る:
   あなたは new big thing を作り出すのを可能にするためにold stuff がどのように動作して
   いるかを知る必要があります(usually, in most areas)。わたしたちは巨人たちの肩の上に立
   ってはいますが仮にその巨人たちの高さがわからないのであればわたしたちは midgets (小人)
   を step over できます。
   Learn it!

8. Boredom: maybe you have a free Sunday afternoon and don't want to code something 
   over-the-top, and you decide to write your own algorithm for X. Closely related to 
   reasons 4 and 5. Enjoy!

   退屈:
   たぶんあなたには自由だけれど something over-the-top をコーディングしたくはないような
   日曜の午後があって、X のための自分独自のアルゴリズムを書こうと決めたのでしょう。理由
   の 4と 5 に密接に関係しています。Enjoy!

Do you have your reasons and they are not in this list? Post a comment and I'll write 
a new (collaborative) version!

このリストには載っていない理由をあなたは持っていますか?

Post a comment and I'll write a new (collaborative) version!


Posted by RBerenguel at 20:55 Labels: Linux, Programming, Thoughts

Creative Commons License

This work by www.mostlymaths.net is licensed under a Creative Commons 
Attribution-Share Alike 3.0 Unported License.

■_



C++0x 9 
218 デフォルトの名無しさん [sage] 2010/04/10(土) 17:39:14 ID: Be:
    誰か猫でもわかるオーバーロード入門を書いてください 

219 デフォルトの名無しさん [sage] 2010/04/10(土) 17:47:55 ID: Be:
    >>218
    オーバーロードのどこが難しいの?

    猫でも分かるADL入門
    猫でも分かるTMP入門

    のがやばいだろ。

220 デフォルトの名無しさん [sage] 2010/04/10(土) 18:41:38 ID: Be:
    日本の猫はいったいどこまで賢くなろうとしているのか 

221 デフォルトの名無しさん [sage] 2010/04/10(土) 19:16:55 ID: Be:
    猫は害獣 

222 デフォルトの名無しさん [sage] 2010/04/10(土) 19:34:47 ID: Be:
    我が輩は猫である
    名前は間田内 

223 デフォルトの名無しさん [sage] 2010/04/10(土) 20:52:31 ID: Be:
    我輩は猫である
    I am a cat. 

224 デフォルトの名無しさん [sage] 2010/04/10(土) 21:28:43 ID: Be:
    仕事はもう無い 

225 デフォルトの名無しさん [sage] 2010/04/10(土) 21:37:30 ID: Be:
    どこでミスしたかとんと見当がつかぬ。 

226 デフォルトの名無しさん [sage] 2010/04/10(土) 21:42:07 ID: Be:
    何でも薄暗いじめじめした所で壁に向かって仕事していた事だけは記憶している。 

227 デフォルトの名無しさん [sage] 2010/04/10(土) 21:46:09 ID: Be:
    吾輩はここで始めてプログラマというものを見た。 

228 デフォルトの名無しさん [sage] 2010/04/10(土) 22:47:54 ID: Be:
    >>227
    吾輩はここで始めて 上司 というものを見た。

    じゃないかな・

229 デフォルトの名無しさん [] 2010/04/10(土) 23:10:01 ID: Be:
    Boost.BigInt
    はLGPL汚染されるってことで
    ttp://pc12.2ch.net/test/read.cgi/tech/1251446016/
    で話題になってるよ。

    もし興味ある方はぜひ。

    ttp://pc12.2ch.net/test/read.cgi/tech/1251446016/741-743
    が発端。

230 デフォルトの名無しさん [sage] 2010/04/10(土) 23:27:53 ID: Be:
    TR2でbigint入れて欲しいとかそういうネタ振りですか 

231 デフォルトの名無しさん [sage] 2010/04/10(土) 23:45:18 ID: Be:
    Cat, I'm kitty cat. 

232 デフォルトの名無しさん [sage] 2010/04/10(土) 23:47:04 ID: Be:
    >>230
    そんなん期待できねぇよ。
    できたら願ったり叶ったりだがな。 

233 デフォルトの名無しさん [sage] 2010/04/11(日) 06:26:55 ID: Be:
    >219
    どうやって candidate functions が決まるのかを入れるなら name lookup の話を含むだろうし、
    best viable function を定めるルールだけでもきっちり分かりやすく説明できるというのなら
    今すぐ執筆してくれ。 

(`・ω・´)「OK」

■_ これは☓☓ その1


スレ立てるまでもない質問はここで 105匹目 
375 デフォルトの名無しさん [sage] 2010/04/11(日) 16:18:50 ID: Be:
    質問させてください
    perlのwhile(<STDIN>){...}にあたるものを、
    c/c++で書こうとするとどのように書けばよいでしょうか?

    ・詳細
    Apacheのフィルタを開発していおり、
    ユーザに渡すHTMLをフィルタを用いて書き換えたいと思っています。
    調べたところperlを用いた次のようなものはあるのですが、
    c/c++を用いた方法がわからず質問させていただきました。
    ・perlでは
    while(<STDIN>){
       //標準入力に元のHTMLが入った状態で起動される
    //ここで書き換え
    }
    ・自分で試したこと
    void main(argc,*argv)のargv内に元のHTMLが入ってるのではないかと思ったが入っていなかった。
    fgets(stdin)を用いてみたが、(おそらくキー入力待ちとなり)ブラウザが停止してしまった。
    以上です。
    よろしくお願いいたします。 

376 デフォルトの名無しさん [sage] 2010/04/11(日) 16:24:39 ID: Be:
    質問を見ればキミのレベルが判断できるが、キミには無理。外注しなさい。 

377 デフォルトの名無しさん [sage] 2010/04/11(日) 16:40:25 ID: Be:
    >>375
    Apacheのfilterのことは何も知らないが、perlでSTDINから読み込んで実現できるなら、
    C/C++でも標準入力からの読み込みでいいはず。
    フィルタプログラムを単体で起動したら、標準入力はキーボードになるが、
    cat filename | myfilter
    みたいにフィルタとして起動された場合は、標準入力はパイプになる。 

378 375 [sage] 2010/04/11(日) 16:47:13 ID: Be:
    >>376
    外注はできないため、もう少し自力でやってみます

    >>377
    なるほど。
    フィルターの呼び方を少し工夫してみます、ありがとうございました。 

379 デフォルトの名無しさん [sage] 2010/04/11(日) 16:50:10 ID: Be:
    いや、普通に標準入力から読めばいいだけ。
    #include <stdio.h>

    int main(int argc, char* argv[])
    {
      char buf[1024];
      while (fgets(buf, sizeof buf, stdin)) {
        printf("%s", buf);
      }
      reutrn 0;
    }
    バッファサイズは考慮する必要があるが。 

380 デフォルトの名無しさん [sage] 2010/04/11(日) 16:56:29 ID: Be:
    つか、プロセス起動するフィルタなんだったら、Perlでいいんじゃね? 

381 375 [sage] 2010/04/11(日) 17:14:06 ID: Be:
    >>379
    試してみましたが、うまくいかないようです。
    どうも常にwhile(偽)となってしまっているようです、
    フィルター自体は正しく読まれているのですが、
    フィルターに標準入力から渡されるはずのHTMLソースが渡ってないように感じます。
    おそらくまだ私が何かミスをしているはずなので、
    もう少し試行錯誤してみます、アドバイスありがとうございました。

    >>380
    今回の作成では、いくつかの制約があり、
    その一つがc/c++を用いなければならないというもののため、
    現在四苦八苦しています。 

382 デフォルトの名無しさん [sage] 2010/04/11(日) 17:15:56 ID: Be:
    Apacheスレ(ってどこ?)で、どうやってそのフィルタを起動しているかを具体的に書いて
    質問した方がいいと思う。 

383 デフォルトの名無しさん [sage] 2010/04/11(日) 18:44:28 ID: Be:
    バッファの状態をチェックしないで読み込めば、
    待ち状態になるのは当たり前だろ。
    ランタイムライブラリの使い方を一からやり直せ。 

384 デフォルトの名無しさん [sage] 2010/04/11(日) 19:59:28 ID: Be:
    だから外注させろと。オレ様の見立てが狂った事は無い。 

386 デフォルトの名無しさん [sage] 2010/04/11(日) 20:26:11 ID: Be:
    確かにこのレベルで頑張って作ってもどうせバグだらけだろうし、
    僕には無理です、という勇気も大事 

■_ これは☓☓ その2


文系プログラミングについて。(1/1) | OKWave

お世話になります。
私は高校・大学共に文系なのですが、今年4月からSEとして働き始めました。

しかし、プログラミングの研修を行って一週間経ちましたが、プログラミングというよりも「算
数」の分野で非常に苦しんでいます。

先にプログラムのソースを見ると言いたいことはわかるのですが、文章でこういったブログラム
を作成しなさいといわれると頭が真っ白になってしまいます。

「絶対値を求めなさい」や、「最小値・最大値を求めなさい」など理系出身者にとっては簡単き
わまる問題も1時間もかけてようやく解けるか解けないかのレベルです。

会社の同期や先輩方には「慣れだな」とおっしゃていただけるのですが、明らかに不向きだと私
は痛感しています。みなさんはどのようにjavaを学習されましたか?

特に同じ悩みをかかえていた文系SEの方にお聞きしたいです。

よろしくお願いいたします。

採るほうも採る方な気が。

■_これはひ☓☓ その3


_bstr_tからchar*へ変換 - Yahoo!知恵袋

_bstr_tからchar*へ変換

以下のコードで_bstr_tからchar*へ変換しようとしたのですが
実行時にエラーとなってしまいます(コンパイル、ビルドは正常)
なぜでしょうか?

■■■ソース■■■
_bstr_t orig("Hello");
const size_t newsize = 100;
char nstring[newsize];
strcpy_s(nstring, (char *)orig);

これと同じようなことをやって動かないと騒いだ人と一緒に仕事したことがあります ○| ̄|_ 「コンパイルは異常なく終わるのに動かないんだよね~」

補足: bstr というのは大まかに言って wide 文字のようだと思ってもらえれば 問題ないと思います(この場合は)。

ファイルの拡張子を.mp3 に変えて、「mp3に変換できません」とかいう人もいるしなあ。 世界は驚きに満ちている…

■_ 本日の巡回から

■_ Jのススメ

そいや、ム板のJスレもすっかりおとなしくなったような。 宿題スレには結構 Jで書かれた回答があるみたいだけど。

prog21: The World's Most Mind-Bending Language Has the Best Development Environment
The World's Most Mind-Bending Language Has the Best Development Environment

I highly recommend that all programmers learn J. I doubt most will end up using it for 
daily work, but the process of learning it will stick with you. J is so completely 
different from everything else out there, and all your knowledge of C++ and Python and 
Scheme goes right out the window, leaving you an abject, confused beginner. In short, 
J will make you cry.

(以下略)

■_ Cabal

関数型プログラミング言語Haskell Part11 
838 デフォルトの名無しさん [sage] 2010/04/11(日) 15:49:53 ID: Be:
    Cabalがエラりまくる
    なんだよこれ3パッケージに1つはエラーでビルド失敗するわ 

847 デフォルトの名無しさん [sage] 2010/04/11(日) 17:23:55 ID: Be:
    Cabalが依存パッケージのビルドに失敗する
    個別にインストールすれば成功するのに
    なぜだろう 

849 デフォルトの名無しさん [sage] 2010/04/11(日) 18:38:54 ID: Be:
    駄目だiconvがインスコできね
    死ねCabal 

850 デフォルトの名無しさん [sage] 2010/04/11(日) 18:41:27 ID: Be:
    >>849
    では Cabal はもう死んだと思って、別の手段を使えばいいのではないか 

851 デフォルトの名無しさん [sage] 2010/04/11(日) 19:10:39 ID: Be:
    諸君らが愛してくれたCabalは死んだ。何故だ! 

852 デフォルトの名無しさん [sage] 2010/04/11(日) 19:12:51 ID: Be:
    >>851
    研究のためのモルモットに過ぎなかったから 

この局面では「坊やだからさ」はむりぽだなあw


一つ前へ 2010年4月(上旬)
一つ後へ 2010年4月(下旬)

ホームへ


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

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