« 2009年1月 | トップページ | 2009年3月 »

2009年2月

2009年2月12日 (木)

zndk改良版

zndkを改造しました。 面倒くさい AJAXはやめて、単純にして使いやすくすることを 狙ったんだけど、どうなんでしょう。

改良点としては以下のとおり:

  • 結果表示画面を簡潔にして小さくした。
  • Bookmarkletを用意して、Amazonの詳細ページからすぐに価格比較できるようにした。
  • Form入力の画面においても、(ASINを切り出さなくても) URLをいきなり入力して価格比較できるようにした。
  • それにともない、Drag'n Dropしやすいように入力エリアをでかくした (zndkのwindowが部分的に隠れているときにでも DnDできるように。
  • 日本語にした。ヘルプを書いた。
  • 日本円で表示するようにした。

やっぱりブックマークレットは便利です。 似たようなサイトも色々あるけど、なぜかカナダとかを比較対象に してるのは少ないみたい。カナダが一番安いことも多いのに。

でもやっぱりデザインがダサいのはいかんともし難いものがあります。 Webデザインって奴をちゃんと学ぶべきなのかなあ、とか思いました。 こういうせこいものを作って公開したいならインパクトは必要だし、 CSSは知っててもそれだけじゃどうしようもないものがあります。

あとは、やはりまだリテラシーの高くない人には敷居が高いみたい。 嫁に使ってみてもらったけど、最初は使えなかったし。 ここもこれからいじっていきます。

とりあえず使って見て感想でももらえると幸いです。

| | コメント (0) | トラックバック (1)

2009年2月 6日 (金)

cgi.rbでハマったのを Rubyの特異メソッドのせいにする

単純に言うと、以下のようなコードです:
require 'cgi';
form = CGI.new;
query = form['query'];
print query[3..-1];
部分文字列をとりだす [..]で以下のような文句を言われるのです:
/Users/takesi/hack/ruby/cgi-sucks.rb:4:CAUTION! cgi['key'] == cgi.params['key'][0]; if want Array, use cgi.params['key']
なんで、CGI moduleとは関係ない文字列操作だけでこんなこと言われなきゃいかんのか。 おまけに表示されるのは "nil" です。部分文字列が帰ってこない。ダメダメです。

1時間ぐらい悩んだ結果、たどり着いたのは「特異メソッド」でした。

CGI::QueryExtension::[]str.extend(Value)なんて ことをして特異メソッドを追加してやがります。 CGI::QueryExtension::Value::[]では以下のように、"String::[]" に rangeや reが渡されたときの意味を破壊してくれています:

      def [](idx, *args)
        if args.size == 0
          warn "#{caller(1)[0]}:CAUTION! cgi['key'] == cgi.params['key'][0]; if want Array, use cgi.params['key']"
          @params[idx]
        else
          super[idx,*args]
        end
      end
うーん、これは素直に bugとして然るべきところに報告すべきなんだろうな。 と言うか、普通に文字列の中の 1バイトを取り出したいときもあるんだろうから、 全体的に余計なお節介の気がするがなあ。 今からそこら辺変更すると互換性の問題があるのかなあ。

Rubyの特異メソッドがいけないという風にも思ったんだけど、 やっぱりこれは単に CGI libraryの設計が悪いだけだな。 バカ避けのために、まっとうな機能まで破壊されてしまっている。 もったいない限りです。

強引に Ruby全体に敷衍すれば、特異メソッドはこういう訳のわかんない バグを生み出すので使うべきではない、ということか。 特に公共で広く使われるライブラリでは「絶対使わない」というぐらいの policyのほうがいいでしょうな。

ちなみに Ruby 1.8.2 (Tiger付属) の中で "extend" を使っているらしいのは 以下のとおり。関係ないのや妥当なもはいってるんだろうけど、 とりあえず気をつけよう:

% find . -name "*.rb" -exec grep '\.extend' {} +
./cgi.rb:        str.extend(Value)
./e2mmap.rb:  def E2MM.extend_object(cl)
./e2mmap.rb:  def E2MM.extend_to(b)
./e2mmap.rb:    c.extend(self)
./e2mmap.rb:	mod.extend Exception2MessageMapper
./forwardable.rb:#   g.extend SingleForwardable
./irb/ext/change-ws.rb:	main.extend ExtendCommandBundle
./irb/ext/change-ws.rb:# 	  main.extend ExtendCommandBundle
./irb/ext/math-mode.rb:	main.extend Math
./irb/ext/workspaces.rb:	main.extend ExtendCommandBundle
./irb/extend-command.rb:    def EXCB.extend_object(obj)
./irb.rb:      @context.main.extend ExtendCommandBundle
./monitor.rb:  buf.extend(MonitorMixin)
./monitor.rb:#    buf.extend(MonitorMixin)
./monitor.rb:  def self.extend_object(obj)
./mutex_m.rb:#	obj.extend Mutex_m
./mutex_m.rb:  def Mutex_m.extend_object(obj)
./open-uri.rb:      obj.extend Meta
./optparse.rb:  Version = (RCSID[1].split('.').collect {|s| s.to_i}.extend(Comparable).freeze if RCSID[1])
./optparse.rb:    def self.extend_object(obj)
./optparse.rb:ARGV.extend(OptionParser::Arguable)
./shell/process-controller.rb:    @ProcessControllers.extend Mutex_m
./singleton.rb:    klass.extend SingletonClassMethods
./singleton.rb:  'aString'.extend Singleton
./soap/mapping/registry.rb:      @cause.extend(::SOAP::Mapping::MappedException)
./soap/mapping/registry.rb:    obj.extend(::SOAP::Mapping::MappedException)
./soap/mapping/registry.rb:	obj.extend(Mapping.class_from_name(mstr))
./soap/mapping/registry.rb:	obj.extend(m) if m.class == Module
./sync.rb:#   obj.extend(Sync_m)
./sync.rb:  def Sync_m.extend_object(obj)
./sync.rb:  #Sync_m.extend_class self
./thwait.rb:  Exception2MessageMapper.extend_to(binding)

| | コメント (0) | トラックバック (0)

2009年2月 3日 (火)

zndk.skr.jp - Amazon間価格比較サイト (もしくは危険なのはイギリスだけじゃない!)

英国Amazonでのお買い物が危険すぎる」 というネタに触発されて、zndkって サービスを作っちゃいました。 世界中の、日米加英独仏のアマゾンで商品を比較できるサイトです。

例えば、Real Workd Haskellを 比べてみると以下のような感じ(デザインがしょぼいのはお約束です) :

イギリスよりカナダの amazonの方がお買い得な事がわかります。

まあ、本当のところはこれに送料が加わったり、VATが引かれたりして 値段は変動するけど、目安にはなるでしょう。

そう、あとここに出てくる値段は Market Placeも含んだ値段なので、 もしかすると海外発送しないところの値段も出てくるかもしれません。 ここは今後改良します。

あと、AJAXを無駄に使う必要はなく、普通の CGIでよかった気もします。 ASIN (本当は ISBN-10でもいいみたいだけど) を調べるのも面倒なので、 bookmarkletにする予定。

とりあえず、ここで検索してバリバリ買い物してください。 なお、買い物していただいた場合、売上の数%は、カリフォルニアの恵まれない プログラマに寄付させていだたきます。というのはお約束です。

そういう小遣い稼ぎをするのは初めてなのでちとドキドキです。

| | コメント (0) | トラックバック (0)

« 2009年1月 | トップページ | 2009年3月 »