「相手が嫌い」っつー感情が言動の起点になってるんだから、議論の相手になるわけがない。

なんか相手から新しいコメントがあったのでいったん保留。つーか、今回もまた言いたいだけ言って勝手に終了宣言してる。まーた書き逃げかよ。もういいけど。


追記:結局、突っかかってきたのは『カチンと来た』からだとさ。カチンと来たから内容もろくに読まず、相手の主張も汲み取らず、カチンと来た箇所に固執してたっつーのが真相。アホらしい。今回の件はワシの人間力を試すための試験だったんだろう。見事不合格だけどな!!


いろいろ言い訳してるようだけど、もともとの行動理由が「kwatchが嫌い」という感情が起点になっているんだから、議論になるわけがない。なんせ彼は何年も前からことあるごとにワシんとこに粘着し続けてきたからね。相当根は深いと思うよ。

続きを読む

RSpec のすごいところ

(注: 以下の内容は、RSpec ユーザの間で広まっていることでもなく、もちろん RSpec 開発チームの公式な見解でもなく、あくまでワシの個人的な見解です。)


RSpec のすごいところは、コードに対してではなく仕様に対してテストを書くことを明確にしたことだと思う。何を今さらと言われそうだけど、今さらになってようやく気づいたニワトリ頭ですまんかった。

ワシも最初は、「assert_equal(expected, actual)」のかわりに「actual.should == expected」と書くかっこよさに目を奪われて、テストコードを自然言語に近い形で記述するのが RSpec のすごいところだと勘違いしてたし、それが「TDD (Test Driven Development)」から「BDD (Behaviour Driven Development)」へという新しい潮流だと勘違いしてた。

続きを読む

るびま0030号

Sapporo での自分の発表がサマリになって載ってたんだけど、なんというか、抜けはないのに多すぎるところもなく、まさに「過不足なし」という言葉がぴったりな、完璧なまとめだった。発表者から見て文句つけるところがない。これ書いた人はきっと優秀。お疲れさまでした。

ところでまた記事が少なくなってきましたね。


追記:言い訳になるけど、上の文は記事が少ないことを揶揄する意図ではなく、「記事が少なくなってきましたね。前みたいにまた書いちゃっていいですか?」という意図でした (「前みたい」というのは、一時期るびまの記事が極端に減少したことがあって、そのときに記事を連投させてもらったことを指しています)。ただ軽率な書き方だったので、不愉快に感じた方がいたら申し訳ありませんでした。

Twitter の 3 パーセントは悪意でできてます

以前、Matz日記が更新されないのはまつもとさんがTwitterを始めたからと聞いて「matz twitter」でぐぐったときから「そうじゃないかなー」と思ってたけど、あるいはひがさんからありがたいお言葉を頂戴したときも「そうじゃないかなー」と思ったけど、やっぱりTwitterって本人のいないところで気軽に陰口をたたきやすよね。

Twitterは、ちょうど会社のタバコ部屋みたいなもの。あるいは女子社員が集まる給湯室。仲間内が集まって、情報交換という名のうわさ話や他人の陰口をする場所。


以前、えらい粘着してきた彼が、Twitterでもネチネチやってた。

続きを読む

Ruby で変数宣言がほしい、とな?

Ruby にも変数宣言があったほうがいいよね、という話。

Thor タスクを書いていて

  desc "load KVS_FILE", "load data from given KVS file"
  def load(kvs_file)
    case kvs_file
    when "shift"
      ksv_file = Dir.glob("kvs/requests/*").sort.first
    when "pop"
      ksv_file = Dir.glob("kvs/requests/*").sort.last
    end

   p kvs_file

load("shift") しても "shift" が表示されちゃう謎の現象に遭遇。

  • 実は Thor は引数を symbol とか特別なオブジェクトにしてる?
  • あれ、case 文って文字列直接はダメだっけか?(classみたいに)

とか色々調べること10分。原因に気付いて愕然としました。てことで、やはり Ruby にも変数宣言が欲しい、というか、無いとダメだ!しかもオプションで使えるレベルでなくデフォ強制が必須。ワンライナー(golf)用途に、disableにするオプションがあるぐらいの勢いで。

http://wota.jp/ac/?date=20100604#p01

あるあるーw でもJavaScriptみたいな仕様ならいらね。

人間の単純なミスだからそれは使う側のユーザの問題

という正論が成立しそうだが、それは違う。そういうつまらないミスを言語(環境)が指摘してくれることで、ユーザはもっと本質的なロジック部分だけに集中できるのだ。というのも、コンパイラ言語を使った後でRubyに戻ってくると、そういう非本質的な部分(変数名を必死にケアするとか)にも神経を使う必要があって、同じ時間のコーディングでも遥かに疲れるのだ。

強く同意する。
よくアジャイル開発を信奉する人が、「テストをすれば大丈夫、コンパイラのエラーチェックなんていらね」みたいなことを言うけど、テストの実行はけっこうな時間がかかるんだから、テストを実行しないと見つけられないよりも、テストをしなくても見つけられるほうが、ずっとアジャイルじゃね?

この知見をRubyにうまく還元して、Rubyをもっといいものにしたい。

Rubyでいまから変数宣言を導入するのは難しいだろうけど、今回の場合なら、代入はされたけど他の箇所で使われていないようなローカル変数を検出する機能がRubyにあればいいんじゃないかな。

あとは、代入されてないのに参照されているローカル変数 (たいがいtypo) の検出ができれば最高だけど、Rubyではレシーバなし引数なしのメソッド呼び出しと、ローカル変数との区別がつかないから、難しいなあ。個人的には前者を禁止したいんだけど。

# Ruby にも pycheker みたいなのがほしいね。

「disる」と「指摘する」は違う・・・よね?

cgi.rbをあんまり意識していないRubyistPHPをdisれないのだとしたら、それはなんか「自分が完全完璧じゃないと、人を指摘してはいけない!」ような雰囲気になってしまってちょっと嫌かなぁと、というのが率直な感想です。

http://d.hatena.ne.jp/kwatch/20100613/1276385931#c1276477440

ワシは、「disる」と「指摘する」はだいぶ違うと思ってるんだけど、どうなんだろう。一緒と思っている人も多いのかな。

ワシのイメージはこんなかんじ。


「指摘する」の例:
http://www.rubyist.net/~matz/20080126.html#p04

「disる」の例:
http://blog.livedoor.jp/dankogai/archives/50835571.html

プログラミング言語の優秀さと道具としての評価は別

ワシは、cgi.rb なんかが標準添付になっている RubyPHP を dis る資格はないと思ってる (cgi.rbの元ネタである CGI.pm を擁する Perl も同じじゃないかな)。cgi.rb は、標準添付モジュールのくせにコードが汚いし遅いし、cgi[] の戻り値が String だったり File だったりするし、どう考えても設計ミス。

## Ruby だと
cgi = CGI.new
p cgi['name']    #=> これが File である可能性がある

## PHP だとそんな問題はない
$name = $_REQUEST['name'];   # 必ず文字列
$file = $_FILE['name'];      # ファイルは別途取り出す

そして大半の Rubyist はこういった問題に気づいてすらいない。そういう人たちが PHP を dis ってるのは「ハァ?」と思う。

実は Python も似たようなもん。知ってるか、21 世紀になって 10 年近くたつというのに、Python 標準添付の cgi.py はセッション機能をサポートしてないんだぜ? びっくりだろ。しかも Google App Engine でも Python SDK ではやっぱりセッション機能が用意されてない。Python はセッションになんか恨みでもあるのだろうか。加えてプロセスの起動はトロいわ、cgi.py の読み込みはもっとトロいわで (これは urllib.py のせい)、ちょろっとした掲示板を作りたいときに Python を選ぶのは躊躇する。まあ Python は昔から mod_python が優秀だったから CGI はさほど重要視されてなかったのかもしれんけど、それでも wsgiref を標準添付するまえにやることがあるんじゃねーの? と思う。


結局のところ、言語としての優秀さと道具としての評価は別の話ということだよね。これは言語の速度とアプリケーションの速度とは別の話であるのとよく似ている。RubyPythonプログラミング言語としてはすごくよくできているけども、Web アプリケーションを作る道具としての評価は、ワシからみると PHP とそれほどの差はない*1

逆に初心者向けでいえば、PHP のほうがずっとよく出来ている。初心者が RubyCGI スクリプトを作成すると、

  1. まずファイルに実行属性をつけるところでつまづく (そんな高度な概念は理解できない)。
  2. 次に #!/usr/local/bin/ruby の書き換えがわからなくてつまづく (そんな暗号は理解できない)。
  3. 最後に 1 行目が「"#!/usr/local/bin/ruby\r\n"」となっているせいで理解不能なエラーになってつまづく (←ワシもワシも)。

これに比べると、PHP は天国だ。なにせ拡張子を「.php」にするだけでいい。これは初心者でも分かりやすい! つまづくポイントが少ない方が、道具としては優秀だ (まあ PHP はそれ以外のところではまりポイントが多数あるけど)。

ドキュメントもそうだよね。PHPの公式ドキュメントは優秀すぎる。関数の一覧も見やすいし、検索もできるし、有益なコメントがついててこれがまたドキュメントの価値を高めている。これに比べて Ruby のドキュメントは、揃ってはいるんだけど、見やすさや検索性という点ではダメダメ。これを初心者が見て理解できるかというと、まあ難しいよね (そういうわけで、このプロジェクトには期待してる (競争が発生するという意味で))。言語を「道具」として見た場合、ドキュメントは非常に重要。この点でいえば、PHPRubyPython よりも優秀な道具だといえる。


「言語の速度 != アプリの速度」という話をすると、スクリプト言語屋さんはだいたい同意してもらえる。けどそういう人でも「言語の優秀さ != 道具としての優秀さ (道具としてみれば RubyPHP もさほど変わんないよ?)」という話をすると、怒ったり無理な反論したり感情的な態度になる (ここらへんの反応とだいたい同じだと思えばわかるだろうか)。

でもさ、「言語としての優秀さと道具としての評価は別」なんて、よく考えたら当たり前のことでしょ? いくら RubyPython が優秀だからといって、Windows 用のゲームを作りたい人にとっては VBHSP のほうが優秀な道具なわけよ。あるいは英語がわからない子供にとっては、道具としてはなでしこのほうが優秀なわけよ。優秀な言語がいつも優秀な道具であるとは限らない。そんなの当たり前のことでしょ?

だから、Rubyist や Pythonista が PHP の言語仕様を dis るのは別にいいけどさ、確かにプログラミング言語としての RubyPython は本当によくできてるけどさ、それと道具としての価値はまた別だということを知ってほしい。そんなこととっくに知っとるわい! という人はぜひ cgi.rb の代替物を作るか cgi.py にセッション機能を追加するか urllib.py の _hextochr まわりを修正してから出直してきてほしい。
#他の言語屋さんから dis られて困っている PHPer の方がいたら教えてください。相談にのります。


今日のまとめ:「言語仕様の優秀さ != 道具としての優秀さ」


・・・え、PHP は道具として優秀じゃないって? そこはぜひ Read Air, PLEASE!!


(追記)

ngsw プログラマではないけれど、言語がそもそも道具だと思うんだ。だから評価は不可分なんじゃないでしょうか。 2010/06/14

http://b.hatena.ne.jp/ngsw/20100614#bookmark-22280889

道具としての価値を決定する要素は、言語仕様以外にもいろいろありますよ、ということです。

oukayuka CGIなんて誰も使ってないから放置されてるだけじゃないの? Webフレームワーク全盛の時代にCGIがダメだからこの言語はダメなんて言う人がいるとは思わなんだ。 2010/06/13

http://b.hatena.ne.jp/oukayuka/20100613#bookmark-22280889

キミはせめてtdiaryhikiぐらいは知るべき。Matz日記もるびまcgi.rbに依存してるじゃないか。
こういうこと言ってるのはきっと事情をよく知らないRails使いに違いない。Railsだってcgi.rb使ってる (た) のにね。
#つうか標準添付ライブラリが放置されてたらまずいだろww

denchuinc ruby 最近RubyでWebプログラミングする人たちって,cgi.rbなんて使ってるのかしら? 拡張子をphpにすれば良い,ってのもサーバ側の設定次第な気が……。2010/06/13

http://b.hatena.ne.jp/denchuinc/20100613#bookmark-22280889

キミもtdiaryhikiを知った方がいい。それともcgi.rbを使ってるtdiaryhikiに対するあてつけか? 高度だなあ。

ssig33 はあ、 cgi.rb の代替って sinatra でいいんじゃないですかね 2010/06/13

http://b.hatena.ne.jp/ssig33/20100613#bookmark-22280889

動作がひどく遅い require 'rubygems' が必要な時点で、代替にはならないんじゃないですかね。
あと代替として推薦するならsinatraじゃなくてrackじゃないですかね。

nazoking PHPの $_REQUEST[xxx] は配列が入ってることがあるよ! 2010/06/13

http://b.hatena.ne.jp/nazoking/20100613#bookmark-22280889

それはキーとして「"xxx"」じゃなくて「"xxx[]"」を指定したとき*だけ*だよね。取り出すデータをプログラマがコントロールできるならそれでいいけど、cgi.rbの場合は違うから。

*1:もちろん今なら RailsDjango の存在が前提だろうけど、そこまで含めるとそれは RailsDjango の評価であって RubyPython の評価じゃないし、PHP だってたくさんのフレームワークがある。