Javaでは
new Date(new Date().getTime() - 20 * 60 * 1000);
とかくものが、Ruby (with ActiveSupport) では
20.minutes.ago
と書ける。簡潔でよろしい。では、C#ではどうするか。 C# 3.0なら、既存のクラスにextentionという形でメソッドが追加できるので、 オープンクラスのようなことができ、結果として
20.Minutes().Ago();
と書ける。括弧が省略できないので惜しいな。
いろいろなレベルのPythonプログラマによる階乗プログラム。
っていうか、個人的には英語で運営されている4chan.orgが まるっきり2ちゃんねるなところの方が驚いた。
ちなみにRubyなら、こんな感じ(1.9限定)。
1.upto(6).inject(:*)
JavaFX Scriptによるプログラミングの紹介。
なんど読み返してもJavaFXが魅力ある言語には思えない。 functionとoperationの奇妙な分離といい、 宣言的なんだけど、結局制限の多い記述とか、 よく動作が理解しにくいlazyとか。
もうちょっと言語そのものがわかれば、使いやすいと感じるようになるのかなぁ。
メールがたまりすぎちゃうと処理できなっちゃって、「破産」するしかなくなる、という話。
スパムはまあある程度機械的に処理できるので別としても、 確かにメールはたまる一方である。 私のinboxには処理待ちのメールが残っているのだが、 すでに500通を越えている。
古いものはもうフォローしきれないのでアーカイブ行きになるべきだろうな。
Timothy BuddのLittle Smalltalk ver.3 からの派生。
まだはじまったばかりだが、GCが単純なリファレンスカウントから マークアンドスイープによって循環参照に対応したり、 残っていたバグをつぶしたり、今後が期待できる、かも。
LazyなArrayを、と書いたら、弾さんがあっという間にPerlで実装してしまったという話。
こういう時にtieというのは強力だよね。 言語機能としてはあまり好きではないんだけど。
RubyだとArrayの機能をそのまま流用とは行かず、 元々のエントリにあったLazyListのように別のクラスとして再実装する形になるだろう。
Rubiniusとかなら配列もRubyで記述されることになるから、 Arrayをサブクラス化して、いくつかのメソッドをオーバーライドすることで 簡単に目的が達せられるかもしれない。
blogで公開されている以上、「こっそり」とは呼べないのではないでしょうか。
どなたかがコメントされていたが、 「こっそり」の主体はあくまでも観察者である私であって、 作者の石橋さんではない。
アドバイスする「おじさんやおばさん」の価値をまったく否定するものではないが(そういえば、この業界、おばさん/おねえさんは、ほとんど見かけないなあ、少なくとも日本では)、 多すぎるリクエストやコメントが集中するにはまだ早いと私は考えていた。
たまたま見かけた「おじさん」がコメントするのならともかく、 1日数千PVの「Matzにっき」や、恐らく万を越えるPVを持つ「404 Blog Not Found」から リンクされると影響力が大きすぎるんではないかと。
杞憂かもしれないけど。
まあ、でも、しょうがない。 杞憂であることを祈りつつ、正常な成長が促されるように これからも見守ることにしよう。
言語設計ってのはねぇ、ソフトウェアの多くの領域とは違って 正解というものがほとんどないので、 難しいのだ。アドバイスしたがる人は多いけど、 本当に役に立つアドバイスができる経験者がどれだけいるかと考えると、 すべてのアドバイスは眉に唾をつけて聞くべきだ。
たぶん、「日本で一番言語設計にうるさい男」だろう私だって、 Rubyじゃない言語に対するアドバイスは当てにならない。
>言語設計ってのはねぇ、ソフトウェアの多くの領域とは違って正解というものがほとんどないので、
えっと、言語設計についてほとんどないだろうってのはいいのですが、それ以外の領域で多くには正解がある、ってのには首を傾げます。
私が階乗プログラムをつくったら、こんな感じになってしまいました。(1.8.5動確済)
eval((1..6).to_a.join('*'))
私なら「Calendar.getInstance().add(Calendar.MINUTE, -20);」と書きます。
>new Date(new Date().getTime() - 20 * 60 * 1000);
そういえば、Enterprise Java programmerならば、どんな階乗プログラムをお作りになられるのでしょうか?
CNET Japanで読みましたが、楽天技術研究所フェローになられるのですか。
おめでとうございます。
一利用者として、現在のRubyの開発に専念できる体制から、大きく変わってしまわないことを祈るばかりです。
Calendar.getInstance().add(Calendar.MINUTE, -20);
これだと Calendar インスタンス取れないんですよね……。
add() の戻り値 void だから(涙
> Enterprise Java programmerならば、どんな階乗プログラムをお作りになられるのでしょうか?
きっとこんな感じ:-p
public BigInteger factorial(BigInteger n) {
BigInteger result = BigInteger.ONE;
for (BigInteger i = BigInteger.ONE; i.compareTo(n) <= 0; i = i.add(BigInteger.ONE)) {
result = result.multiply(i);
}
return result;
}
>Javaらーさん
なんでaddの戻り値がvoidだと涙するのか理解できません。
Calendarインスタンスを操作して別のインスタンスが返る方が不思議です。
階乗は再帰を使った方がスマートですね。
おおもとのk2さんのコードではCalendarインスタンスを参照する変数がないので、addしてもCalendarインスタンスから換算結果であるDateを取ってくる術がない、ということでしょう。
> なんでaddの戻り値がvoidだと涙するのか理解できません。
にょんさんの書かれてる通りです。このままだと20分前を指すインスタンスがどこからも参照できないんで困ってしまうのです。
> 階乗は再帰を使った方がスマートですね。
全くもってその通りですね。
というか、「JVMが末尾再帰の最適化行うかわからないよねー」とか「そもそもBigIntegerまで必要な階乗ってどんだけだよ」とか「でもエンタープライズだしー」とかいった諸々を詰め込んだジョークのつもりだったんですが解りづらかったですね。
すいませんm(_ _)m
> このままだと20分前を指すインスタンスがどこからも参照できないんで困ってしまうのです。
JSR 310 でそのへんが改善されるかもしれませんね。
Joda Time の DateTime クラスだと plusMinutes メソッドの戻り値が DateTime になっているようです。
Javaらーさん。
エンタープライズなソース、ありがうございました。
エンタープライズだと、あとjavdocコメントを書いだり、「引数が負じゃない」チェックをしたりするかもしれません。まだまだあるかも。
>まだまだあるかも。
の中の一つは、たぶん、nが0のとき、1を返すだと思います。
↑たぶん、間違えました。頭痛もちさん。申し訳ありません。