ひがきの日記

2008-06-28

第 27 回 Ruby/Rails 勉強会

Ruby 勉強会に参加しました。

関数型言語 Ruby by keisuken さん

Ruby関数型言語として設計された訳じゃないけど、そこそこ関数型言語っぽく使えるよ (という話かな)

見た目がどうこうじゃなく、関数型言語の考え方とその効果を Ruby でも利用しよう (という話だよね)

発表資料に関数型言語の特徴がコンパクトにまとまっていて、たいへんわかりやすい。

私は今までカリー化がまったく理解できなくて、今回の発表資料を事前に見たときもピンとこなかったんだけど、実際に keisuken さんの説明を聞いて始めて理解できた。
まだ実際に使えるようには、なってないだろうけど。

でもパターンマッチは理解できなかった。
Ruby変数に型がないオブジェクト指向言語なんだから polymorphism で解決するのがいいんじゃないの?

遅延評価もうれしさがよく解らなかった。今後の課題だ。

日本 Ruby 会議 2008 参加報告 by いまいさん & サイロスさん

今年の Ruby 会議のキーワードは、

  • Diversity
  • Affordance
  • Regional

らしい。

私は Affordance と聞くと胡散臭さを感じてしまう。

Affordance って、結果として afford できてるってだけで、どうすれば afford できるようになるか判らないし、afford できてるかどうか作ってる人には判らないから。

サイロスさん会議期間中は大変だったんですね。お疲れさまです。

初級者向けレッスン by okkez さん & チカホリさん

今回は「Ruby で学ぶオブジェクト指向

ポリモフィズムと言っていたのが非常に気になる。私のようなオジサンは、その昔ポリモフィズムって習ったんだけど。

チカホリさんが萌えな件が Lingr で報告されていた。たいへん気になる。

Ruby変数には型がないので、継承ってあんまり必要ないんじゃ?

演習問題
#! /usr/local/bin/ruby -Ke
# -*- coding: euc-jp -*-
#								-*- Ruby -*-

class Shain
  def initialize
    @kihonkyu = 0
  end

  def standup
    raise NotImplementedError
  end

  def kyuryo
    raise NotImplementedError
  end

  attr_accessor :kihonkyu

  def bonus
    kyuryo * 4
  end
end

class Tanto <Shain
  def standup
    "#{self}が普通に起立しました。"
  end

  def kyuryo
    @kihonkyu
  end

  def to_s
    "担当"
  end
end

class Shunin <Shain
  def standup
    "#{self}がすばやく立ちました。"
  end

  def kyuryo
    @kihonkyu * 2
  end

  def to_s
    "主任"
  end
end

class Bucho <Shain
  def standup
    "#{self}がだるそうに立ちました。"
  end

  def kyuryo
    @kihonkyu * 3
  end

  def to_s
    "部長"
  end
end

class Torishimariyaku <Shain
  def standup
    "#{self}はふんぞりかえって立ちました。"
  end

  def kyuryo
    @kihonkyu * 4
  end

  def to_s
    "取締役"
  end
end


if $0 == __FILE__
  require 'optparse'

  classes = open($0){|f|f.readlines}.select{|buf|/^\s*class\s/=~buf}.map{|buf|buf.strip.sub(/class\s(\w+).*/, '\1')}.reject{|c|/Shain/=~c}

  base = 100
  opt = OptionParser.new
  opt.banner = <<USAGE
usage: #{File.basename($0)} [options] <classes> ...
classes:
    #{classes.join(', ')}
options:
USAGE
  opt.on('-b basic salary'){|val| base = val.to_i}
  opt.parse!(ARGV)

  shain = ARGV.map{|s| Object.const_get(s).new}

  shain.each do |s|
    puts
    s.kihonkyu = base

    puts s.standup
    puts "給料は #{s.kyuryo} 円です。"
    puts "ボーナスは #{s.bonus} 円です。"
  end
end

オープンソースとビジネスの実際 by かずひこさん

matz さんはスーパーモデルだから真似しようとしても無理。
だから、かずひこさんを真似しよう ...... って、それも無理。
かずひこさんも、かなりのスーパーモデルですよ。

ってか、日本のソフトウェア開発の現場は、もっと低レベルです。

2008-06-11

数字を数値に変換

C 言語のヘッダファイルをパースして、特定の define 文から Hash に変換するという地味な作業をしていた。

C 言語では、数字の前に 0x が付いていれば 16 進数。数字の前に 0 が付いていれば 8 進数という意味になる。
この数値リテラルのルールは Ruby でも一緒。

この地味な作業の最中にふと思った。
8 進数, 10 進数, 16 進数の文字列を簡単に数値に変換する方法はないものか。

C 言語でも Ruby でも同じ記法なら eval でできるか?

str = ["16", "020", "0x10"]
str.map{|s| eval s}             # => [16, 16, 16]

できた。
でも流石にこれは不採用。

いろいろやってるうちに、String#% が意外な結果を返すことに気付いた。

str = ["16", "020", "0x10"]
str.map{|s| "%d" % s}           # => ["16", "16", "16"]

C 言語脳で考えると SEGV 起こしそうだけど、Ruby では適切な型変換が行なわれている模様。

そこで「るりま」を見てみると、こんなことが書いてあった。

引数整数でなければ関数 Kernel.#Integer と同じ規則で整数に変換されます。

早速やってみる。

str = ["16", "020", "0x10"]
str.map{|s| Integer(s)}         # => [16, 16, 16]

なんだ難しいことしなくても、これで良かったのか。

それにしても「るりま」はすばらしい。感謝。

2008-06-05

split で末尾の空要素も欲しいとき

Ruby の String#split は末尾の空の要素を取り除く。

"1,2,3".split(/,/)   # => ["1", "2", "3"]
"1,,3".split(/,/)    # => ["1", "", "3"]
"1,,".split(/,/)     # => ["1"]  # 要素は 3 個のはずなのに

どうせ空なんだし、どうでもいいよと思っていたけど、CSV ファイルの最後の項目だけ抜き出そうとしてハマッた。

これを防ぐ方法をどこかで見たはず ...... 思い出した。

第24回 Ruby/Rails勉強会@関西に参加しています - 趣味的にっき

znz さんのコメントにその答えが。

"1,,".split(/,/)        # => ["1"]
"1,,".split(/,/, -1)    # => ["1", "", ""]

作業を終えてから「るりま」を見たら、ちゃんと書いてあった。

「るりま」すばらしい。

2008-06-01

ひと月の迷惑メール

1456 通。

そして今日、偶然 Gmail Team さんからのメールに気付いた。

迷惑メールかと思ったら

○○さんからの "××" ってメールにはウィルスが付いてるから 取得せずに POP サーバに残しといたよ
みたいな内容だった。

なんて親切な。
今まで迷惑メールだと思って読まずに捨ててました。
すみません。

Connection: close