メニュー

関連ページリンク

トップ > image > image - 人気ブログ(Blog)検索結果詳細 (2008年12月1日 10時)

[iPhone]iPhoneでストリートビューを使うコツ

iPhoneでストリートビューを使おうとしてピンを思ったところに刺せなくて困ってる人が居るみたい。何回か使えばすぐ分かるんだけど、さっと触って「こりゃ使えん」つって止めてしまう人も多そうなのでちょっと説明してみる。

まず右下のボタンをして画面内にピンを刺す。

f:id:technohippy:20081125014306p:image

で、なるべくピンの下の方、上の画像で青くなってる辺りを指で押さえると

f:id:technohippy:20081125014305p:image

ピンが浮き上がるように見える。注意するのはここなんだけど、このピン実は浮いてるんじゃなくて移動してる。つまり今ピンが表示されてる位置が指を離したときにピンが刺さる位置指で押さえてる位置に落ちてくる訳じゃないので注意。

f:id:technohippy:20081125014304p:image

それだけ分かってればそのまま好きな位置に移動して、

f:id:technohippy:20081125014303p:image

指を離せばそこにピンが刺さる。先の画像とピンの影の位置を比べれば、ちゃんとこの位置に刺さってるのが分かると思う。

That's it.

iPhoneでストリートビューって自分も最初馬鹿にしてたけど、やってみると未来的な気分が味わえてなかなか楽しいっすよ。まだ試してない人は上のことに注意してぜひ試してみよう。

作者:technohippy

更新日:2008年11月25日 2時0分

このブログのホーム

[Ruby][Rails]Arrayの序数アクセサをGit登録&ジンバブエ対応

先日の序数アクセサはDHHに「中途半端」などと暴言を吐きながら、結局利用可能な最大インデックスは一千兆と、ジンバブエのインフレにも対応できていない中途半端なものだった。

そこで今回ライブラリをGitに登録するにあたって対応数を大幅に拡大した。今回の拡張によって最大のアクセサは以下のようになる。

array.nine_hundred_ninety_nine_noventrigintillion_nine_hundred_ninety_nine_octotrigintillion_nine_hundred_ninety_nine_septentrigintillion_nine_hundred_ninety_nine_sestrigintillion_nine_hundred_ninety_nine_quinquatrigintillion_nine_hundred_ninety_nine_quattuortrigintillion_nine_hundred_ninety_nine_trestrigintillion_nine_hundred_ninety_nine_duotrigintillion_nine_hundred_ninety_nine_untrigintillion_nine_hundred_ninety_nine_trigintillion_nine_hundred_ninety_nine_novemvigintillion_nine_hundred_ninety_nine_octovigintillion_nine_hundred_ninety_nine_septemvigintillion_nine_hundred_ninety_nine_sesvigintillion_nine_hundred_ninety_nine_quinquavigintillion_nine_hundred_ninety_nine_quattuorvigintillion_nine_hundred_ninety_nine_tresvigintillion_nine_hundred_ninety_nine_duovigintillion_nine_hundred_ninety_nine_unvigintillion_nine_hundred_ninety_nine_vigintillion_nine_hundred_ninety_nine_novemdecillion_nine_hundred_ninety_nine_octodecillion_nine_hundred_ninety_nine_septendecillion_nine_hundred_ninety_nine_sexdecillion_nine_hundred_ninety_nine_quindecillion_nine_hundred_ninety_nine_quattuordecillion_nine_hundred_ninety_nine_tredecillion_nine_hundred_ninety_nine_duodecillion_nine_hundred_ninety_nine_undecillion_nine_hundred_ninety_nine_decillion_nine_hundred_ninety_nine_nonillion_nine_hundred_ninety_nine_octillion_nine_hundred_ninety_nine_septillion_nine_hundred_ninety_nine_sextillion_nine_hundred_ninety_nine_quintillion_nine_hundred_ninety_nine_quadrillion_nine_hundred_ninety_nine_trillion_nine_hundred_ninety_nine_billion_nine_hundred_ninety_nine_million_nine_hundred_ninety_nine_thousand_nine_hundred_and_ninety_ninth

無量大数のほぼ二乗程度までその範囲を拡大している。ぜひとも活用して欲しい。

http://github.com/technohippy/ordinal-accessors-for-an-array-object/tree/master

作者:technohippy

更新日:2008年11月23日 4時9分

このブログのホーム

[Ruby][Rails]Array#one_hundred_thirty_two_thousand_six_hundred_and_forty_eighth とかできるよ

Rails2.2でなんとArrayオブジェクトのアクセサとして#second 〜 #tenthなんてのができちゃった。だいたい分かると思うけど ary.second は ary[1] と同じで、ary.tenth はary[9] と同じ。

正直これにはがっかりした。DHHにしては中途半端と言うほかない。なんで10thまでなんだよ。その程度じゃ全然たんねーよ。

やるならこうだろ!

$ irb
>> require 'array_ordinal_accessor'
=> true
>> array = (1..200000).to_a
..snip..
>> array.seventy_third
=> 73
>> array.three_hundred_and_nineth
=> 309 
>> array.one_hundred_thirty_two_thousand_six_hundred_and_forty_eighth
=> 132648

もちろん代入だってこうだ。

>> array.fifty_thousand_six_hundred_and_fifty_eighth
=> 50658
>> array.fifty_thousand_six_hundred_and_fifty_eighth = 'hello'
=> "hello"
>> array.fifty_thousand_six_hundred_and_fifty_eighth
=> "hello"

最大でだいたい一千兆くらい*1まで対応。試してないけど、アクセサの最大値はこんな感じになるはず。

>> array.nine_hundred_ninety_nine_trillion_nine_hundred_ninety_nine_billion_nine_hundred_ninety_nine_million_nine_hundred_ninety_nine_thousand_nine_hundred_and_ninety_ninth

さらにはおまけだけど、数値と英語を相互に変換もできる。

>> 90112.to_alphabetic
=> "ninety thousand one hundred and twelve"
>> 56115.to_ordinal
=> "fifty six thousand one hundred and fifteenth"
>> Integer.from_alphabetic "ninety thousand one hundred and twelve"
=> 90112
>> Integer.from_ordinal "fifty six thousand one hundred and fifteenth"
=> 56115

これでもう ary[123] みたいなだっさい記法とは金輪際さよならだ。男なら ary.one_hundred_and_twenty_fourth って書くよな。

進歩的なRubyistのみなさまにおかれましては是非ともこのライブラリを活用してソースの可読性向上に努めて欲しい。

・・・

# array_ordinal_accessor.rb
class Integer
  LESS_THAN_20 = [
    :zero,    :one,     :two,       :three,    :four,
    :five,    :six,     :seven,     :eight,    :nine,
    :ten,     :eleven,  :twelve,    :thirteen, :fourteen,
    :fifteen, :sixteen, :seventeen, :eighteen, :nineteen,
  ]
  DOUBLE_FIGURES = [
    nil,    :ten,   :twenty,  :thirty, :forty,
    :fifty, :sixty, :seventy, :eighty, :ninety
  ]
  HUNDRED = :hundred
  BIG_FIGURES = [nil, :thousand, :million, :billion, :trillion]
  AND = :and

  SPECIAL_ORDINALS = [
    nil,    :first, :second, :third,  nil,
    :fifth, nil,    nil,     :eighth, :ninth,
  ]
  DOUBLE_FIGURES[2..-1].each_with_index do |fig, i|
    SPECIAL_ORDINALS[(i+2) * 10] = :"#{fig.to_s[0..-2]}ieth"
  end

  class <<self
    def from_alphabetic(str, sep=' ')
      ret, tmp = 0, 0
      (str.is_a?(String) ? str.split(sep) : str).map{|e| e.to_sym}.each do |num|
        case num
        when NilClass, AND;   # ignore
        when *LESS_THAN_20;   tmp += LESS_THAN_20.index num
        when *DOUBLE_FIGURES; tmp += DOUBLE_FIGURES.index(num) * 10
        when HUNDRED;         tmp *= 100
        when *BIG_FIGURES;    ret += tmp * 1000**BIG_FIGURES.index(num); tmp = 0
        else;                 raise ArgumentError.new("Invalid Format: #{num}")
        end
      end
      ret + tmp
    end

    def from_ordinal(str, sep=' ')
      array = (str.is_a?(String) ? str.split(sep) : str).map{|e| e.to_sym}
      array[-1] =
        if SPECIAL_ORDINALS.include?(array.last)
          if (idx = SPECIAL_ORDINALS.index(array.last)) < 20
            LESS_THAN_20[idx]
          else
            array.last.to_s.sub(/ieth$/, 'y').to_sym
          end
        else
          array[-1].to_s[0...-2].to_sym
        end
      from_alphabetic array
    end
  end

  def to_alphabetic(sep=' ')
    to_alphabetic_array.join sep
  end

  def to_ordinal(sep=' ')
    to_ordinal_array.join sep
  end

  private

  def to_alphabetic_array
    triples = []
    num = self
    while num != 0
      triples << num % 1000
      num /= 1000
    end
    raise RangeError.new('Too large') if BIG_FIGURES.size < triples.size

    ret = []
    triples.each_with_index do |n, i|
      array = to_alphabetic_array_less_than_1000 n, ret.empty?
      unless array == [:zero]
        array << BIG_FIGURES[i] unless i == 0
        ret.unshift array
      end
    end
    ret.flatten
  end

  def to_ordinal_array
    alphabetics = to_alphabetic_array
    alphabetics[-1] =
      if special = SPECIAL_ORDINALS[LESS_THAN_20.index(alphabetics.last) || 0]
        special
      elsif special = SPECIAL_ORDINALS[(DOUBLE_FIGURES.index(alphabetics.last) || 0) * 10]
        special
      else
        :"#{alphabetics.last}th"
      end
    alphabetics
  end

  def to_alphabetic_array_less_than_1000(num, last=false)
    case num
    when 0
      # ignore
    when 1..19
      [LESS_THAN_20[num]]
    when 20..99
      [DOUBLE_FIGURES[num / 10], *to_alphabetic_array_less_than_1000(num % 10)].compact
    else
      double = to_alphabetic_array_less_than_1000(num % 100)
      if not last
        [LESS_THAN_20[num / 100], HUNDRED, *double]
      elsif double == [:zero]
        [LESS_THAN_20[num / 100], HUNDRED]
      else
        [LESS_THAN_20[num / 100], HUNDRED, AND, *double]
      end
    end
  end
end

class Array
  def method_missing(symbol, *args, &block)
     name = symbol.to_s
    if name[-1] == ?=
      index = Integer.from_ordinal(name[0...-1], '_') - 1
      self[index] = args.first
    else
      index = Integer.from_ordinal(name, '_') - 1
      self[index]
    end
  rescue
    super
  end
end

*1:正確には九百九十九兆九千九百九十九億九千九百九十九万九千九百九十九まで対応

作者:technohippy

更新日:2008年11月22日 1時43分

このブログのホーム

[Python][JavaScript][徒然]PythonとJavaScriptはちょっと似てると思ってる

先週の金曜日にちょっとした集まりがあって、どういう流れでそうなったのか思い出せないんだけど、なぜかPythonistaがJavaScriptをDisって私がJSを弁護するという展開になった。

まぁでもここではそれの場外乱闘をしたいわけではなくて、ただそんとき言い忘れたことを思い出したので、それについてちょっと書きたい。

要は「PythonとJavaScriptってわりと似てね?」って話。

Pythonの勉強を始めて最初に思ったことなんだけど、PythonとJS、この二つはなんだか他人と思えない。別に上のPythonistaに喧嘩売ってる訳ではなくて、以前ホントにそう思った・・・んだけどなぁ

・・・

ずっと以前にJavaScriptの本読んでかなり驚いたことの一つに変数のスコープの話がある。JSだと変数がブロックのどの位置で宣言されてもその変数はブロックの先頭から有効になるという奴。例えば

function fooIsUndefined() {
  alert(foo);
  var foo = 'hello';
}

上のはfooがブロック内部で宣言されてるのでalertは「undefined」と表示してくれるんだけど

function raiseError() {
  alert(foo);
}

こっちは宣言されてないのでエラー。

あとこれはおまけだけど

function fooIsUndefined() {
  alert(foo);
  if (false) var foo = 'hello';
}

宣言文は実行されなくても大丈夫。これも「undefined」と表示される。

で、この動作、Pythonでも同じ。まぁ同じって言っても両方ともエラーだけど。

def foo_is_undefined():
  print foo
  foo = 'hello'

のエラーは

UnboundLocalError: local variable 'foo' referenced before assignment

「まだ束縛されてない変数ですよ」だけど

def raise_error():
  print foo

NameError: global name 'foo' is not defined

「そんな変数ねぇよ」

で、

def foo_is_undefined():
  print foo
  if False:
    foo = 'hello'

UnboundLocalError: local variable 'foo' referenced before assignment

「まだ束縛されてない変数ですよ」

ほらJSと一緒。この挙動って自分にはちょっと驚きだったんだけど、他にもこういう動作する言語たくさんあったりするんだろうか?

あとJSだと関数の内部でも関数を定義できたりするね。

function outer() {
  function inner() {
    alert('inner!');
  }
  inner();           // もちろんここでは呼べる
}
// inner();          // これは関数が見つからなくてエラー
new outer().inner(); // これなら大丈夫

Pythonでも関数のネストは可能。つかevalが貧弱すぎるPythonには必須。まぁさすがに関数をnewするのは無理だけど。

def outer():
  def inner():
    print 'inner'
  inner()      # 大丈夫
#inner()       # エラー
#outer.inner() # さすがに無理

関数のネストができる言語はいっぱいあるけどRubyはできないんだよな。できたらうれしいんだけど。

あとあれ、関数名が関数オブジェクトで()演算子で実行されるとかも一緒。

function bar() {
  alert('bar');
}
var xyzzy = bar;
xyzzy();
def bar():
  print 'bar'
xyzzy = bar
xyzzy()

まぁこれはCとかでも一緒か。Rubyが特殊なだけかも。

あとはー、あれ?なんも思いつかないな。

なんかあれだな、考えてみれば最初のやつ以外は別に珍しくもないし、最初のやつも実は自分で書きながら思ったけど、似てるっていうにはちと微妙だ。最近Pythonさぼってるから覚えてないけど、以前はもっと似てると感じた気がしたんだけど・・・。

うむ、残念ながらPythonとJavaScriptはちょっと似てると思ってたけどそうでもなかった。まぁそれはそれとしてJSも言語としてはそう悪くないはずなのでそんなに嫌わなくていいと思うよ。てことで、まとまらずにおわる。

作者:technohippy

更新日:2008年11月21日 2時52分

このブログのホーム

[徒然]シングルモルト余市1988テイスティングイベントに参加しました

http://agilemedia.jp/blog/2008/11/11181988.html

f:id:technohippy:20081118203625j:image:w150

ブロガーイベントに参加するだなんて、まるで一端のブロガーみたいだ。

ちなみにこのイベントに申し込んだ理由は世界に冠たるシングルモルト余市をどうしても飲んでみたかったから、とかではもちろんなく、こういうのって当選確率どのくらいのもんなんだろ、と思って何も考えずにフォーム入力しただけ。一言でいえば別に理由なんてない。さらに正直に白状すれば私はウイスキーほとんど飲めない。正直すまんと思ってる。

とりあえずイベントに参加しての結論を先に書くと

  • ニッカウヰスキー創業者の竹鶴政孝マジかっこいい*1

これに尽きる。ごめん、ウイスキーの味とかホントわからない。市場単価2万円のウイスキー飲んどいてそれはないだろうと言う意見もあろうけど、分からんもんは分からん。次回以降はちゃんとイベント内容を見て自重する。ホントごめん。

とはいえ、一応ごちそうしてもらった恩というものがあるので、以下飲んだ感想など。

f:id:technohippy:20081118185314j:image:w300

まず最初の試飲は小手試しの?シングルモルト余市12年。口に入れた瞬間むせた。さらに刺激臭が口内から目に抜けて涙出た。一口目にして自分が間違ったところに来たことを確信。チーフブレンダーの方が壇上で飲み方とか目指した味とか解説してくれてるんだけど、ただもう申し訳ないとしか。ちょっとずつ水で薄めておつまみと合わせて最後までがんばったけど、そもそも「がんばる」という飲み方が明らかに間違い。

で、次が本番のシングルモルト余市1988。グラスの上に乗っかってるフタをとって色と香りを確認。色も香りもさっきのよりは濃いような気がする。ということで次はおそるおそる口へ。で、これが驚いたことに飲みやすかった。とりあえずむせなかった。うまいまずいは分からんので聞くな。ちなみに第二部で別のウイスキーも試したんだけど、そっちはむせた。2杯目だからむせなかったわけじゃないみたい。ブレンダーの方曰く、1988はいきなり来るんじゃなくて時間をかけてやんわり開くような味を作った(正確な表現は覚えてません)そうだけど、これがそういうことなんだろうか。

あと、1988もちょっとずつ水を足しながら試したんだけど、どうしてかストレートが一番飲みやすかった。ちょっとだけ水を足すと逆にむせそうになったし、あんまり足すと味がいまいち物足りない。あ、この1988はブレンダーの方の言葉に従ってチョコレートに合わせて飲んでたので結構余裕ありました。1988とビターなチョコレートの組み合わせならちびちび飲むのもありかも。まぁ、そもそも自分は晩酌とかしないけどな。

ということで、ちょっとネガティブなことも書いたけど、混ぜたり水を足したりしながら香りや味の変化を試して丁寧にお酒を飲むようなことはいままでしたことがなかったし、今回のようなことがなければこれからもしなかったと思う。あと1988が私にとって明らかに他より飲みやすかったのも確か。おもしろい機会を与えていただいたニッカウヰスキーの方達やAMNのみなさんに感謝します。ありがとうございました。

f:id:technohippy:20081118204852j:image:w300

懇親会会場。ウイスキー好きには楽しい空間だったはず。私はむしろ食いに専念した。

以下おまけ。眠いので全部箇条書きかつ順不同

  • ニッカは大日本果汁株式会社の略(ウイスキーは完成に時間がかかるので最初の数年はジュースを売って凌いだ)
  • ウィスキーは仕込み3週間で、あとは全部熟成。なので樽で味が決まる
  • シェリー酒を仕込んでた樽とかバーボンを仕込んでた樽とかでウィスキーを熟成してブレンドに使ったりする
  • 蒸留に石炭直火を使ってる蒸留所は、現存するのは世界でもおそらく余市だけ。本場スコットランドでも3-4年前に全滅
  • サントリーウイスキーの初代責任者はニッカウイスキーの創業者
  • ニッカウイスキー創業者は竹鶴酒造の三男
  • 1988の原酒は全部使っちゃったので、1987みたいに特別版が出ることはない
  • 1988のテーマは剛(漢字違うかも)。曖昧なイメージを元に味を作っていくのはおもしろい。というか「味を組み立てる」という発想自体がおもしろい
  • ブレンダーさんは狙った味を大きく外すことはない。と言ってた

*1:お土産に本をもらったので多分あとで書く

作者:technohippy

更新日:2008年11月19日 2時17分

このブログのホーム

[iPhone]iPhoneでストリートビューを使うコツ

iPhoneでストリートビューを使おうとしてピンを思ったところに刺せなくて困ってる人が居るみたい。何回か使えばすぐ分かるんだけど、さっと触って「こりゃ使えん」つって止めてしまう人も多そうなのでちょっと説明してみる。

まず右下のボタンをして画面内にピンを刺す。

f:id:technohippy:20081125014306p:image

で、なるべくピンの下の方、上の画像で青くなってる辺りを指で押さえると

f:id:technohippy:20081125014305p:image

ピンが浮き上がるように見える。注意するのはここなんだけど、このピン実は浮いてるんじゃなくて移動してる。つまり今ピンが表示されてる位置が指を離したときにピンが刺さる位置指で押さえてる位置に落ちてくる訳じゃないので注意。

f:id:technohippy:20081125014304p:image

それだけ分かってればそのまま好きな位置に移動して、

f:id:technohippy:20081125014303p:image

指を離せばそこにピンが刺さる。先の画像とピンの影の位置を比べれば、ちゃんとこの位置に刺さってるのが分かると思う。

That's it.

iPhoneでストリートビューって自分も最初馬鹿にしてたけど、やってみると未来的な気分が味わえてなかなか楽しいっすよ。まだ試してない人は上のことに注意してぜひ試してみよう。

作者:technohippy

更新日:2008年11月24日 17時0分

このブログのホーム

[Ruby][Rails]Arrayの序数アクセサをGit登録&ジンバブエ対応

先日の序数アクセサはDHHに「中途半端」などと暴言を吐きながら、結局利用可能な最大インデックスは一千兆と、ジンバブエのインフレにも対応できていない中途半端なものだった。

そこで今回ライブラリをGitに登録するにあたって対応数を大幅に拡大した。今回の拡張によって最大のアクセサは以下のようになる。

array.nine_hundred_ninety_nine_noventrigintillion_nine_hundred_ninety_nine_octotrigintillion_nine_hundred_ninety_nine_septentrigintillion_nine_hundred_ninety_nine_sestrigintillion_nine_hundred_ninety_nine_quinquatrigintillion_nine_hundred_ninety_nine_quattuortrigintillion_nine_hundred_ninety_nine_trestrigintillion_nine_hundred_ninety_nine_duotrigintillion_nine_hundred_ninety_nine_untrigintillion_nine_hundred_ninety_nine_trigintillion_nine_hundred_ninety_nine_novemvigintillion_nine_hundred_ninety_nine_octovigintillion_nine_hundred_ninety_nine_septemvigintillion_nine_hundred_ninety_nine_sesvigintillion_nine_hundred_ninety_nine_quinquavigintillion_nine_hundred_ninety_nine_quattuorvigintillion_nine_hundred_ninety_nine_tresvigintillion_nine_hundred_ninety_nine_duovigintillion_nine_hundred_ninety_nine_unvigintillion_nine_hundred_ninety_nine_vigintillion_nine_hundred_ninety_nine_novemdecillion_nine_hundred_ninety_nine_octodecillion_nine_hundred_ninety_nine_septendecillion_nine_hundred_ninety_nine_sexdecillion_nine_hundred_ninety_nine_quindecillion_nine_hundred_ninety_nine_quattuordecillion_nine_hundred_ninety_nine_tredecillion_nine_hundred_ninety_nine_duodecillion_nine_hundred_ninety_nine_undecillion_nine_hundred_ninety_nine_decillion_nine_hundred_ninety_nine_nonillion_nine_hundred_ninety_nine_octillion_nine_hundred_ninety_nine_septillion_nine_hundred_ninety_nine_sextillion_nine_hundred_ninety_nine_quintillion_nine_hundred_ninety_nine_quadrillion_nine_hundred_ninety_nine_trillion_nine_hundred_ninety_nine_billion_nine_hundred_ninety_nine_million_nine_hundred_ninety_nine_thousand_nine_hundred_and_ninety_ninth

無量大数のほぼ二乗程度までその範囲を拡大している。ぜひとも活用して欲しい。

http://github.com/technohippy/ordinal-accessors-for-an-array-object/tree/master

作者:technohippy

更新日:2008年11月22日 19時9分

このブログのホーム

[Ruby][Rails]Array#one_hundred_thirty_two_thousand_six_hundred_and_forty_eighth とかできるよ

Rails2.2でなんとArrayオブジェクトのアクセサとして#second 〜 #tenthなんてのができちゃった。だいたい分かると思うけど ary.second は ary[1] と同じで、ary.tenth はary[9] と同じ。

正直これにはがっかりした。DHHにしては中途半端と言うほかない。なんで10thまでなんだよ。その程度じゃ全然たんねーよ。

やるならこうだろ!

$ irb
>> require 'array_ordinal_accessor'
=> true
>> array = (1..200000).to_a
..snip..
>> array.seventy_third
=> 73
>> array.three_hundred_and_nineth
=> 309 
>> array.one_hundred_thirty_two_thousand_six_hundred_and_forty_eighth
=> 132648

もちろん代入だってこうだ。

>> array.fifty_thousand_six_hundred_and_fifty_eighth
=> 50658
>> array.fifty_thousand_six_hundred_and_fifty_eighth = 'hello'
=> "hello"
>> array.fifty_thousand_six_hundred_and_fifty_eighth
=> "hello"

最大でだいたい一千兆くらい*1まで対応。試してないけど、アクセサの最大値はこんな感じになるはず。

>> array.nine_hundred_ninety_nine_trillion_nine_hundred_ninety_nine_billion_nine_hundred_ninety_nine_million_nine_hundred_ninety_nine_thousand_nine_hundred_and_ninety_ninth

さらにはおまけだけど、数値と英語を相互に変換もできる。

>> 90112.to_alphabetic
=> "ninety thousand one hundred and twelve"
>> 56115.to_ordinal
=> "fifty six thousand one hundred and fifteenth"
>> Integer.from_alphabetic "ninety thousand one hundred and twelve"
=> 90112
>> Integer.from_ordinal "fifty six thousand one hundred and fifteenth"
=> 56115

これでもう ary[123] みたいなだっさい記法とは金輪際さよならだ。男なら ary.one_hundred_and_twenty_fourth って書くよな。

進歩的なRubyistのみなさまにおかれましては是非ともこのライブラリを活用してソースの可読性向上に努めて欲しい。

・・・

# array_ordinal_accessor.rb
class Integer
  LESS_THAN_20 = [
    :zero,    :one,     :two,       :three,    :four,
    :five,    :six,     :seven,     :eight,    :nine,
    :ten,     :eleven,  :twelve,    :thirteen, :fourteen,
    :fifteen, :sixteen, :seventeen, :eighteen, :nineteen,
  ]
  DOUBLE_FIGURES = [
    nil,    :ten,   :twenty,  :thirty, :forty,
    :fifty, :sixty, :seventy, :eighty, :ninety
  ]
  HUNDRED = :hundred
  BIG_FIGURES = [nil, :thousand, :million, :billion, :trillion]
  AND = :and

  SPECIAL_ORDINALS = [
    nil,    :first, :second, :third,  nil,
    :fifth, nil,    nil,     :eighth, :ninth,
  ]
  DOUBLE_FIGURES[2..-1].each_with_index do |fig, i|
    SPECIAL_ORDINALS[(i+2) * 10] = :"#{fig.to_s[0..-2]}ieth"
  end

  class <<self
    def from_alphabetic(str, sep=' ')
      ret, tmp = 0, 0
      (str.is_a?(String) ? str.split(sep) : str).map{|e| e.to_sym}.each do |num|
        case num
        when NilClass, AND;   # ignore
        when *LESS_THAN_20;   tmp += LESS_THAN_20.index num
        when *DOUBLE_FIGURES; tmp += DOUBLE_FIGURES.index(num) * 10
        when HUNDRED;         tmp *= 100
        when *BIG_FIGURES;    ret += tmp * 1000**BIG_FIGURES.index(num); tmp = 0
        else;                 raise ArgumentError.new("Invalid Format: #{num}")
        end
      end
      ret + tmp
    end

    def from_ordinal(str, sep=' ')
      array = (str.is_a?(String) ? str.split(sep) : str).map{|e| e.to_sym}
      array[-1] =
        if SPECIAL_ORDINALS.include?(array.last)
          if (idx = SPECIAL_ORDINALS.index(array.last)) < 20
            LESS_THAN_20[idx]
          else
            array.last.to_s.sub(/ieth$/, 'y').to_sym
          end
        else
          array[-1].to_s[0...-2].to_sym
        end
      from_alphabetic array
    end
  end

  def to_alphabetic(sep=' ')
    to_alphabetic_array.join sep
  end

  def to_ordinal(sep=' ')
    to_ordinal_array.join sep
  end

  private

  def to_alphabetic_array
    triples = []
    num = self
    while num != 0
      triples << num % 1000
      num /= 1000
    end
    raise RangeError.new('Too large') if BIG_FIGURES.size < triples.size

    ret = []
    triples.each_with_index do |n, i|
      array = to_alphabetic_array_less_than_1000 n, ret.empty?
      unless array == [:zero]
        array << BIG_FIGURES[i] unless i == 0
        ret.unshift array
      end
    end
    ret.flatten
  end

  def to_ordinal_array
    alphabetics = to_alphabetic_array
    alphabetics[-1] =
      if special = SPECIAL_ORDINALS[LESS_THAN_20.index(alphabetics.last) || 0]
        special
      elsif special = SPECIAL_ORDINALS[(DOUBLE_FIGURES.index(alphabetics.last) || 0) * 10]
        special
      else
        :"#{alphabetics.last}th"
      end
    alphabetics
  end

  def to_alphabetic_array_less_than_1000(num, last=false)
    case num
    when 0
      # ignore
    when 1..19
      [LESS_THAN_20[num]]
    when 20..99
      [DOUBLE_FIGURES[num / 10], *to_alphabetic_array_less_than_1000(num % 10)].compact
    else
      double = to_alphabetic_array_less_than_1000(num % 100)
      if not last
        [LESS_THAN_20[num / 100], HUNDRED, *double]
      elsif double == [:zero]
        [LESS_THAN_20[num / 100], HUNDRED]
      else
        [LESS_THAN_20[num / 100], HUNDRED, AND, *double]
      end
    end
  end
end

class Array
  def method_missing(symbol, *args, &block)
     name = symbol.to_s
    if name[-1] == ?=
      index = Integer.from_ordinal(name[0...-1], '_') - 1
      self[index] = args.first
    else
      index = Integer.from_ordinal(name, '_') - 1
      self[index]
    end
  rescue
    super
  end
end

*1:正確には九百九十九兆九千九百九十九億九千九百九十九万九千九百九十九まで対応

作者:technohippy

更新日:2008年11月21日 16時43分

このブログのホーム

[Python][JavaScript][徒然]PythonとJavaScriptはちょっと似てると思ってる

先週の金曜日にちょっとした集まりがあって、どういう流れでそうなったのか思い出せないんだけど、なぜかPythonistaがJavaScriptをDisって私がJSを弁護するという展開になった。

まぁでもここではそれの場外乱闘をしたいわけではなくて、ただそんとき言い忘れたことを思い出したので、それについてちょっと書きたい。

要は「PythonとJavaScriptってわりと似てね?」って話。

Pythonの勉強を始めて最初に思ったことなんだけど、PythonとJS、この二つはなんだか他人と思えない。別に上のPythonistaに喧嘩売ってる訳ではなくて、以前ホントにそう思った・・・んだけどなぁ

・・・

ずっと以前にJavaScriptの本読んでかなり驚いたことの一つに変数のスコープの話がある。JSだと変数がブロックのどの位置で宣言されてもその変数はブロックの先頭から有効になるという奴。例えば

function fooIsUndefined() {
  alert(foo);
  var foo = 'hello';
}

上のはfooがブロック内部で宣言されてるのでalertは「undefined」と表示してくれるんだけど

function raiseError() {
  alert(foo);
}

こっちは宣言されてないのでエラー。

あとこれはおまけだけど

function fooIsUndefined() {
  alert(foo);
  if (false) var foo = 'hello';
}

宣言文は実行されなくても大丈夫。これも「undefined」と表示される。

で、この動作、Pythonでも同じ。まぁ同じって言っても両方ともエラーだけど。

def foo_is_undefined():
  print foo
  foo = 'hello'

のエラーは

UnboundLocalError: local variable 'foo' referenced before assignment

「まだ束縛されてない変数ですよ」だけど

def raise_error():
  print foo

NameError: global name 'foo' is not defined

「そんな変数ねぇよ」

で、

def foo_is_undefined():
  print foo
  if False:
    foo = 'hello'

UnboundLocalError: local variable 'foo' referenced before assignment

「まだ束縛されてない変数ですよ」

ほらJSと一緒。この挙動って自分にはちょっと驚きだったんだけど、他にもこういう動作する言語たくさんあったりするんだろうか?

あとJSだと関数の内部でも関数を定義できたりするね。

function outer() {
  function inner() {
    alert('inner!');
  }
  inner();           // もちろんここでは呼べる
}
// inner();          // これは関数が見つからなくてエラー
new outer().inner(); // これなら大丈夫

Pythonでも関数のネストは可能。つかevalが貧弱すぎるPythonには必須。まぁさすがに関数をnewするのは無理だけど。

def outer():
  def inner():
    print 'inner'
  inner()      # 大丈夫
#inner()       # エラー
#outer.inner() # さすがに無理

関数のネストができる言語はいっぱいあるけどRubyはできないんだよな。できたらうれしいんだけど。

あとあれ、関数名が関数オブジェクトで()演算子で実行されるとかも一緒。

function bar() {
  alert('bar');
}
var xyzzy = bar;
xyzzy();
def bar():
  print 'bar'
xyzzy = bar
xyzzy()

まぁこれはCとかでも一緒か。Rubyが特殊なだけかも。

あとはー、あれ?なんも思いつかないな。

なんかあれだな、考えてみれば最初のやつ以外は別に珍しくもないし、最初のやつも実は自分で書きながら思ったけど、似てるっていうにはちと微妙だ。最近Pythonさぼってるから覚えてないけど、以前はもっと似てると感じた気がしたんだけど・・・。

うむ、残念ながらPythonとJavaScriptはちょっと似てると思ってたけどそうでもなかった。まぁそれはそれとしてJSも言語としてはそう悪くないはずなのでそんなに嫌わなくていいと思うよ。てことで、まとまらずにおわる。

作者:technohippy

更新日:2008年11月20日 17時52分

このブログのホーム

[徒然]シングルモルト余市1988テイスティングイベントに参加しました

http://agilemedia.jp/blog/2008/11/11181988.html

f:id:technohippy:20081118203625j:image:w150

ブロガーイベントに参加するだなんて、まるで一端のブロガーみたいだ。

ちなみにこのイベントに申し込んだ理由は世界に冠たるシングルモルト余市をどうしても飲んでみたかったから、とかではもちろんなく、こういうのって当選確率どのくらいのもんなんだろ、と思って何も考えずにフォーム入力しただけ。一言でいえば別に理由なんてない。さらに正直に白状すれば私はウイスキーほとんど飲めない。正直すまんと思ってる。

とりあえずイベントに参加しての結論を先に書くと

  • ニッカウヰスキー創業者の竹鶴政孝マジかっこいい*1

これに尽きる。ごめん、ウイスキーの味とかホントわからない。市場単価2万円のウイスキー飲んどいてそれはないだろうと言う意見もあろうけど、分からんもんは分からん。次回以降はちゃんとイベント内容を見て自重する。ホントごめん。

とはいえ、一応ごちそうしてもらった恩というものがあるので、以下飲んだ感想など。

f:id:technohippy:20081118185314j:image:w300

まず最初の試飲は小手試しの?シングルモルト余市12年。口に入れた瞬間むせた。さらに刺激臭が口内から目に抜けて涙出た。一口目にして自分が間違ったところに来たことを確信。チーフブレンダーの方が壇上で飲み方とか目指した味とか解説してくれてるんだけど、ただもう申し訳ないとしか。ちょっとずつ水で薄めておつまみと合わせて最後までがんばったけど、そもそも「がんばる」という飲み方が明らかに間違い。

で、次が本番のシングルモルト余市1988。グラスの上に乗っかってるフタをとって色と香りを確認。色も香りもさっきのよりは濃いような気がする。ということで次はおそるおそる口へ。で、これが驚いたことに飲みやすかった。とりあえずむせなかった。うまいまずいは分からんので聞くな。ちなみに第二部で別のウイスキーも試したんだけど、そっちはむせた。2杯目だからむせなかったわけじゃないみたい。ブレンダーの方曰く、1988はいきなり来るんじゃなくて時間をかけてやんわり開くような味を作った(正確な表現は覚えてません)そうだけど、これがそういうことなんだろうか。

あと、1988もちょっとずつ水を足しながら試したんだけど、どうしてかストレートが一番飲みやすかった。ちょっとだけ水を足すと逆にむせそうになったし、あんまり足すと味がいまいち物足りない。あ、この1988はブレンダーの方の言葉に従ってチョコレートに合わせて飲んでたので結構余裕ありました。1988とビターなチョコレートの組み合わせならちびちび飲むのもありかも。まぁ、そもそも自分は晩酌とかしないけどな。

ということで、ちょっとネガティブなことも書いたけど、混ぜたり水を足したりしながら香りや味の変化を試して丁寧にお酒を飲むようなことはいままでしたことがなかったし、今回のようなことがなければこれからもしなかったと思う。あと1988が私にとって明らかに他より飲みやすかったのも確か。おもしろい機会を与えていただいたニッカウヰスキーの方達やAMNのみなさんに感謝します。ありがとうございました。

f:id:technohippy:20081118204852j:image:w300

懇親会会場。ウイスキー好きには楽しい空間だったはず。私はむしろ食いに専念した。

以下おまけ。眠いので全部箇条書きかつ順不同

  • ニッカは大日本果汁株式会社の略(ウイスキーは完成に時間がかかるので最初の数年はジュースを売って凌いだ)
  • ウィスキーは仕込み3週間で、あとは全部熟成。なので樽で味が決まる
  • シェリー酒を仕込んでた樽とかバーボンを仕込んでた樽とかでウィスキーを熟成してブレンドに使ったりする
  • 蒸留に石炭直火を使ってる蒸留所は、現存するのは世界でもおそらく余市だけ。本場スコットランドでも3-4年前に全滅
  • サントリーウイスキーの初代責任者はニッカウイスキーの創業者
  • ニッカウイスキー創業者は竹鶴酒造の三男
  • 1988の原酒は全部使っちゃったので、1987みたいに特別版が出ることはない
  • 1988のテーマは剛(漢字違うかも)。曖昧なイメージを元に味を作っていくのはおもしろい。というか「味を組み立てる」という発想自体がおもしろい
  • ブレンダーさんは狙った味を大きく外すことはない。と言ってた

*1:お土産に本をもらったので多分あとで書く

作者:technohippy

更新日:2008年11月18日 17時17分

このブログのホーム