名古屋ruby会議01 - rubyでライフハッキング10連発♪

51
Rubyでライフハッキング 10連発♪ 2009.10.10 がぶちゃん

Upload: shoya-tsukada

Post on 01-Nov-2014

2.188 views

Category:

Technology


6 download

DESCRIPTION

すみません10連発じゃなくて、Ruby 1.9 を使おうよ!って内容になってます。

TRANSCRIPT

Page 1: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Rubyでライフハッキング10連発♪

2009.10.10 がぶちゃん

Page 2: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

自己紹介•塚田翔也(つかだしょうや)•サラリーマン3年半•フリーランス2年目• IPA 2008年度下期未踏• 音声認識Webアクセスツール「Puppy」の開発• Android + NDK 開発 なう。

Page 3: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

諸事情により未踏の話• IPA(独立行政法人情報処理推進機構)• 公募テーマに対して提案• 開発費とPMによるサポートを受けて約半年間で開発

• 開発終了後もサポート• ベンチャー支援系の団体としては優良• 2000年からやっている

Page 4: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Rubyと私• サラリーマン• Java + Strutsで3年半• Rails を知る。→ Ruby を知る。• フリーランス• Rails 2件• CakePHP 1件 もちろん他にいろいろ• 未踏• Merb

Page 5: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

ライフハッキングその1

Page 6: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

ExcelもRubyで

Page 7: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Excelを読み込むrequire 'win32ole'

app = WIN32OLE.new('Excel.Application')book = app.Workbooks.Open(app.GetOpenFilename)

for row in book.ActiveSheet.UsedRange.Rows do for cell in row.Columns do p cell.Name p cell.Age endend

book.close(false)app.quit

via http://jp.rubyist.net/magazine/?0027-ExcellentRuby

Page 8: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

YAMLで書き出すrequire "yaml"

people = []for row in book.ActiveSheet.UsedRange.Rows do for cell in row.Columns do people << {:name => cell.Name, :age => cell.Age} endend

File.open 'people.yml', 'w' do |file| YAML.dump(people, file)end

Page 9: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

そしてRailsのDBへrequire 'yaml'

people = YAML.load_file 'people.yml'people.each do |person| p = Person.new person p.saveend

これを import.rb というファイル名で保存して、以下を実行。ruby script/runner import.rb

Page 10: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

幸せポイント• VBAよりも簡単!• CSVに変換して他の言語でも出来るけど簡単!• 直感的で可読性がすごく高い!• Rails/MobelのValidate(入力チェック)が活用できる!

• 独自にインポートするプログラムを作った場合、入力チェックも作り込まなきゃいけない。

Page 11: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

ライフハッキングその2

Page 12: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

SocketもRubyで

Page 13: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

と、思ったんですが

Page 14: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

このペースだととても時間内に終わりそうにありません。

Page 15: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

そこで

Page 16: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

突然ですが

Page 17: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

皆様!Ruby 1.9

使ってますか?

Page 18: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Ruby 1.9について隣の人と30秒相談してください。

Page 19: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

私はまだです。

Page 20: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

ということで一緒に Ruby 1.9 に移行しましょう!

Page 21: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Ruby 1.9 おさらい

•2007年クリスマス 1.9.0 リリース•2009年1月31日 1.9.1 リリース•1.9 系の安定版

Page 22: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

早く移行しましょう!(自分• YARV(Yet Another Ruby VM)で速くなった!• M17N• エンコーディングとかマルチバイトとか標準サポート。

• 便利なクラス/メソッドが増えた!• 関数型っぽさが増えた!<ここ重要

Page 23: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

M17N• StringインスタンスがEncodingを持っている。

• なんと!標準メソッドで文字コード変換が出来る!

u = 'がぶちゃん'u.encoding # => #<Encoding:UTF-8>

s = u.encode(‘Shift_JIS’)s.encoding # => #<Encoding:Shift_JIS>

Page 24: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

M17N• マルチバイトも標準でOK!

# Ruby 1.9系"がぶちゃん"[0..2] # => "がぶち"

# Ruby 1.8系"がぶちゃん"[0..2] # => "\343\201\214"

Page 25: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

M17N• マジックコメントで文字コードを指定するべし。

$ cat hello.rbp "はろー!はろー!"

$ ruby1.9 hello.rbhello.rb:1: invalid multibyte char (US-ASCII)

Page 26: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

M17N• マジックコメントで文字コードを指定するべし。

$ cat hello.rb# vim:fileencoding=utf-8p "はろー!はろー!"

$ ruby1.9 hello.rb"はろー!はろー!"

Page 27: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

M17N• マジックコメントは emacs 風と vim 風があります。

vim 風# vim:fileencoding=utf-8

emacs 風# -*- coding: utf-8 -*-

Page 28: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

M17N• けど、• ライブラリなど他言語で利用されるファイルはエンコーディングを指定するべきではない。

• そうです。

Page 29: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

M17N

Page 30: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Arrayの拡張

Listプログラマや数学好きな人が喜びそうなメソッドが増えた!

Page 31: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Arrayの拡張• 組合せ• 重複を持たない組合せ

• 重複組合せ

[1, 2, 3].combination(2).to_a# => [[1, 2], [1, 3], [2, 3]]

[1, 2, 3].permutation(2).to_a# => [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]

Page 32: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Arrayの拡張• 直積集合

• flatten(ふらっとん)で平滑化する深さを指定できる。

[1, 2].product([3, 4])# => [[1, 3], [1, 4], [2, 3], [2, 4]]

[1, [2, [3]]].flatten(1) # => [1, 2, [3]]# Ruby 1.8系は、深さを指定できないから# => [1, 2, 3]

Page 33: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Arrayの拡張• 要素をシャッフルする。

• ランダムに要素を取り出す。

[0, 1, 2, 3].shuffle # => [1, 3, 0, 2][0, 1, 2, 3].shuffle # => [2, 0, 3, 1]

[0, 1, 2, 3].sample # => 2[0, 1, 2, 3].sample(2) # => [3, 2]

Page 34: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Enumerable• 先頭からn個を取り出す。

• 指定したインデックス以降のリストを返す。

• つまり、• carっぽい事は、 Enumerable#take(1)• cdrっぽい事は、Enumerable#drop(1)

[0, 1, 2, 3].drop(1) # => [1, 2, 3]

[0, 1, 2, 3].take(2) # => [0, 1]

Page 35: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Enumerable• inject でシンボルが渡せるようになった。

# Ruby 1.8 までのリストの合計[1,2,3,4,5].inject(0) {|result, i| result + i} # => 15

# 1.9 からは

[1,2,3,4,5].inject(:+) # => 15

# ついでに reduce というaliasも追加された。[1,2,3,4,5].reduce(:+) # => 15

Page 36: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

全て紹介することはできませんが

Page 37: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

やっぱりRuby 1.9も楽しいですよ!

Page 38: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

さて、これで

Page 39: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

名古屋のRubyistは

Page 40: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Ruby 1.9に移行完了

Page 41: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

ライブラリ動かないとか言わない。動かせばいい!

Page 42: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Ruby 1.9入門って意味で

Page 43: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

済!

Page 44: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

Ruby を愛し育てるためにもRuby 1.9 を使いましょう

Page 45: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

最後に

Page 46: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

名古屋のRubyコミュニティを盛り上げましょう!

Page 47: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

最後の最後に

Page 48: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

大募集お友達

ビジネスパートナーアルバイト

Page 49: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

詳しくは

Twitter : gabu

Page 50: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

ご清聴ありがとうございました。

Rubyで素敵なプログラミングライフを

by がぶちゃん gabu

Page 51: 名古屋Ruby会議01 - Rubyでライフハッキング10連発♪

午前中の集計の問題

data = (1..100).map{rand(5)+1}.map{|id| {:id => id, :value => rand(10000)}}(1..5).map{|i| {:id => i, :sum => data.select{|h| h[:id] == i}.map{|h| h[:value]}.reduce(:+)}}

2行で出来ましたが、ひどい有様ですw