Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ruby初級入門

17,723 views

Published on

Ruby初級入門という勉強会やりました http://shokai.org/blog/archives/7966 http://gyazz.com/masuilab/Ruby初級入門2013

Published in: Technology
  • Be the first to comment

Ruby初級入門

  1. 1. Ruby初級入門 @shokai 2013年7月16日(火) @masuilab
  2. 2. 私 •@shokai (しょうかい) •趣味:料理、glitch
  3. 3. Ruby2.0.0を インストールしよう
  4. 4. なぜMacに入ってるRuby じゃだめなの? • 1.8.7は開発終了したから • 最近はライブラリ作ってる人もだいた い2.0用に作ってるから • 今は過渡期だからちょっと面倒だけど そのうち良くなるはず • 次のOSXには2.0.0が入ってるという
  5. 5. 苦行 Ruby2.0.0インストール • http://gyazz.com/masuilab/MacにRuby2.0.0インストール • App Store.appからXCodeインストール、XCodeの環 境設定からcommand line toolsもインストール • osx-gcc-installerをインストール • Homebrewをインストール • Homebrewでrbenvとruby-buildをインストール • % brew install rbenv ruby-build readline openssl
  6. 6. 苦行 Ruby2.0.0インストール(2) • ruby2.0最新版のpatch levelを確認 • % rbenv install --list | grep 2.0 • 2.0.0-p247がない場合、ruby-buildが古い • brew updateしてruby-build入れなおす • Ruby2.0.0をインストール • % rbenv install 2.0.0-p247 • % rbenv global 2.0.0-p247 • % gem install bundler rake rbenv-rehash • % rbenv rehash • これでruby2.0.0-p247が使えるようになっているはず
  7. 7. 苦行 Ruby2.0.0インストール(3) • Rubygems, SSL, Digest, SHA1, md5などで不具合が出る • 解決方法はだいたいここに書いてある • http://shokai.org/blog/archives/7832 • http://shokai.org/blog/archives/7497 • ruby1.9.2-p320をビルドして、digest関係をコピーして くる簡単な苦行です
  8. 8. UbuntuにRuby2.0.0インストール • MacのようなSSL, Digest, Rubygemsの不具合が無いので楽です • 必要なもの入れる • % sudo apt-get install build-essential libreadline-dev libssl-dev • rbenv, ruby-buildをgithubから入れる(aptのは古い) • % git clone git://github.com/sstephenson/rbenv.git ~/.rbenv • % mkdir ~/.rbenv/plugins • % git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/ plugins/ruby-build • % rbenv install 2.0.0-p247
  9. 9. 以下Ruby2.0.0 インストール中のお話
  10. 10. Rubyに向いてること • テキスト処理、正規表現、配列やHashの複雑なデー タ構造、関数型プログラミング • HTTP、HTMLやXMLみたいなのの解析、並列実行、 イベント駆動、webサービス • 言語ルールの改変(メタプログラミングなど) • 絶対にかっこよく書ける • こんなメソッドがあったらいいのに、が絶対ある
  11. 11. 色々できる • Mac用のツールを作れる。Platypusを使う • gemで配布できる • Macなどにインストールするサービスも作れる • launch-agentやforemanなどのgemを使う • 自分のマシン内にHTTPサーバーを立てるアプリ • ワンライナー、他のUNIXツールとpipeで連携、CUIツール • ArduinoやPhidgetsなどで実世界コンピューティング
  12. 12. 色々な所で動く • VPS • 組み込みボードのLinux • 自分のMac • 仮想マシンのLinux
  13. 13. 実行のしかた • % ruby ファイル名 • 拡張子は.rb • 定期的に実行 • crontabを使おう • クローラやbotなど • 常に実行 • foremanで各OSにサービスとしてインストールしよう • OS起動時に自動起動、エラーで落ちても再起動する
  14. 14. Platypus • スクリプト言語をMac用アプリにしてく れるラッパー • Gyazo(Mac用クライアント) • clip2htmlescape • など
  15. 15. RailsとSinatra • よく何が違うのか聞かれる • ぜんぜん違うよ • Railsやめとけ
  16. 16. Railsやめとけ • Railに乗れないことが多い • レールに乗ったアプリは簡単に作れる • SNSやECみたいなサイト。静的ページとDBが たくさんあってログインしたりカートに入れ たり友だち申請するようなやつ • ユーザインタフェースやおもしろアプリの研究 は、ほぼ確実にレールを外れる
  17. 17. Sinatra • 超シンプル • このURLにアクセスきたら→(何かしてから)→これを返す • HTTP通信の薄いラッパー • にcookieやsessionなどの便利ツールをちょっと足した感じ • RocketIOがある • 実験的なことに使いやすい
  18. 18. Rubygems • gemコマンドでインストールできる便利ライブラリ集 • 59480種ある • % gem install 名前 • http://rubygems.org/gems/名前 にドキュメントがある • そこからGitHubに飛べる
  19. 19. gemの使い方を調べる • READMEを読む • サンプルを見る • sampleかexampleみたいなディレクトリがあるはず • testを読む • testかspecというディレクトリがあるはず • ソースを読む • 手元にgit cloneしてから git grep -C10 キーワード
  20. 20. gemの使い方を調べる(2) • pryの ls と $ を使うと、関数の定義が見れる • (次のページヘ)
  21. 21. コードが 引数も中身も 全部みえる $ メソッド名 Tw::Client の使い方を調べる
  22. 22. gemの使い方を調べる(3) • awesome_print で対象の#methodsを見る • 引数も全部見える Objectインス タンスで引き 算すると綺麗 になる
  23. 23. どんなgemを使っているか • http://shokai.org/blog/archives/7931 % find $HOME -name Gemfile | grep "^$HOME/.*Gemfile$" | xargs grep "^gem " | ruby -lane 'puts $_.scan(%r{["''']([^"'''] +)["''']})[0]' | sort | uniq -c | sort -nr % find $HOME -name "*.r[bu]" | grep "^$HOME/.*.r[bu]$" | xargs grep "^ *require " | ruby -lane 'puts $_.scan(%r{["''']([^"' '']+)["''']})[0]' | sort | uniq -c | sort -nr Macbook Air内のGemfileから集計 Macbook Air内の.rbと.ruから集計
  24. 24. 便利なgem • addressable • 日本語が含まれたURIなどを扱う • arduino_firmata, phidgets-ffi • ArduinoやPhidgetsを操作 • args_parser • CUIアプリの引数をparse • asearch, levenshtein • 文字列間の類似度を判定
  25. 25. 便利なgem(2) • backports • Ruby1.9以降の関数を1.8で使えるようにする • capybara, capybara-webkit • Ruby内でqtでwebkitが使える • data_mapper, dm-mysql-adapter, dm-sqlite-adapter • SQLその他の汎用ORマッパー • diff-lcs • 2つの文字列の差分を取る
  26. 26. 便利なgem(3) • event_emitter • 全てのmodule/class/instanceにイベント機能を追加 • eventmachine • イベント駆動フレームワーク • feed-normalizer • RSSやAtomなどなんでも同じように扱える • foreman, launch-agent • プロセス管理ツール、OSにインストール
  27. 27. 便利なgem(4) • growl, g • growlする • haml, sass, coffee-script • HTML, CSS, JSのメタ言語 • hashie • HashやArrayを使いやすくする • headless • xvfb (Xの仮想フレームバッファ)を作る
  28. 28. 便利なgem(5) • httparty • HTTPのラッパー。綺麗に書ける • hugeurl • 短縮URLを展開 • json • JSONをパース・シリアライズ • logger • ログレベルごとに出力
  29. 29. 便利なgem(6) • mecab, igo-ruby • 形態素解析、分かち書き • mechanize • webブラウザのふりをしてHTTPアクセス • mini_exiftool • 写真や動画のexif情報を読む • minitest • シンプルなテストツール
  30. 30. 便利なgem(7) • nokogiri • HTML, XMLのparse • oauth • oAuthで認証 • octokit • GitHub API • parallel • for文を並列実行
  31. 31. 便利なgem(8) • pit • 設定やパスワードをホームディレクトリに保存 • rack • WAFとWebサーバーの接続部分 • rainbow • 色がつく puts “hello”.color(:green) • rake • Rubyでmakeが書ける
  32. 32. 便利なgem(9) • rbenv-rehash • 自動的にrbenv rehashしてくれる • rmagick, mini_magick • imagemagickのラッパー • serialport • シリアルポートを使う • sinatra-contrib • Sinatraの便利ライブラリまとめ
  33. 33. 便利なgem(10) • sinatra-rocketio • Sinatraでwebsocket/cometが美しく使える • skype, im-kayac • メッセンジャーを使う • stringio • IOとバイナリでやりとりする • thin, mongrel, webrick, rainbows, unicorn • Rack対応webサーバー
  34. 34. 便利なgem(11) • tiqav • ネタ画像検索ナンバーワン • tmp_cache • memcache風に揮発するオンメモリキャッシュ • tw, twitter, userstream • twitterのライブラリ • weather_jp, weather-report • MSNとLivedoorから天気取得
  35. 35. 便利なgem(12) • awesome_print • ppより見やすいprint。とくにHashやmethodsが見 やすい • pry • irbのすごい版。$ 関数名 で関数が定義されている コードが見れる。gemの使い方を調べるのに便利 @shigeyas先生より
  36. 36. gemを作る • gemを作ることでRubyを理解できるようになる • たいして難しくないし、審査も無い • 次の機会があればgemの作り方やりましょうか
  37. 37. bundler • 将来gemをたくさん使うようになったら bundlerのことを思い出してください • 使わないとお前のアプリは1年以内に死 ぬ!!マジで!! • Ruby書くならBundler使え http://shokai.org/blog/archives/7262
  38. 38. Rubyにどこから手を付けるか • はじめ:ググりながら簡単なアプリを作る • インターネットからデータを取得して自分に送るよう なやつから始めるといいのでは • SkypeやGTalkやTwitterで自分に通知するようなの • 作ったツールは毎日愛用して、不満がある所を直そう • 本は読まないでいい • Rubyは超間違った情報はWebに無いから安心していい • 次:人の作ったものを見る
  39. 39. オブジェクト指向 • class作って継承してnewして∼みたいな考え、とりあ えず捨てよう • それはクラス指向です • たぶんあなたのやりたい事は(最初は)メソッドベ タ書きかクラスメソッドで実現できる • 他の言語(Javaとか)でクラスを書かなければ出来な かった事も、Rubyなら配列やHashだけでできると思 うよ
  40. 40. プログラムの基礎
  41. 41. puts, print, p puts "hello work" main.rb % ruby main.rb 実行
  42. 42. 条件式 a = 3 if a > 2 puts "大きい" else puts "小さい" end puts "大きい" if a > 2 後ろにも付けれる ifの否定形のunlessもある
  43. 43. 条件式(2) num = 3 case num when 1 puts "1です" when 2 puts "2です" when 3 puts "3です" else puts "その他" end case when - C言語のswitch文みたいなもの
  44. 44. 関数 def square(num) num * num end puts square(2) puts square 3 def 名前 ~ end かっこ付けても付けなくても良い return書いても書かなくても良い
  45. 45. 関数(2) def send_mail(to, from="hashimoto@shokai.org") ## (略) end send_mail "test@example.com" send_mail "test2@example.com", "shokai@sfc.keio.ac.jp" 引数のデフォルト値を指定できる
  46. 46. 繰り返し i = 0 loop do puts i += 1 break if i > 10 end i = 0 while i < 10 puts i += 1 end i = 0 10.times do puts i += 1 end 1.upto(10) do |i| puts i end while, loop, times, upto, downto
  47. 47. Array arr = [1,3,5,2,4,1,2,3] p arr p arr.reverse arr.each do |i| puts i end arr.uniq.sort.each do |i| puts i end arr.select{|i| i % 2 == 0 }.each do |i| puts i end each, map, find, flatten, grep, sort, uniq, select, reject, delete_if, reverse, min, max
  48. 48. Hash h = { :name => "shokai", :mail => "hashimoto@shokai.org", :web => "http://shokai.org" } p h p h.keys p h.values h.each do |k,v| puts "#{k} : #{v}" end each, map, keys, values, find, grep, select, reject,
  49. 49. 正規表現 str = "今日はかずすけにいこう" p str =~ /あああ/ # => nil p str =~ /かずすけ/ # => 3 p str.gsub(/すけ/, "どん") # 置換 p str.split(/は/) # 分割 p str.scan(/は(.+)にいこう/)[0] # 抜き出し gsub, split, scan
  50. 50. module module Foo BAR = "const value" def self.baz "module method" end end puts Foo::BAR puts Foo.baz ただの入れ物、入れ子にできる
  51. 51. class class User attr_accessor :name, :age def initialize(name, age) @name = name @age = age end def to_s "#{@name}さん #{@age}さい" end end user = User.new "shokai", 28 puts user.name puts user user.name = "ABCD" puts user @付きはインスタンス変数
  52. 52. class(2) class User def initialize(name, age) @name = name @age = age end def to_s "#{@name}さん #{@age}さい" end def age=(age) ## setter raise ArgumentError, "年齢がおかしいです" if age.class != Fixnum @age = age end def age ## getter @age end end 末尾に=が付いた関数はsetterになる
  53. 53. Error test.rb:15:in `age=': 年齢がおかしいです (ArgumentError) from test.rb:27:in `<main>' どのファイルの何行目にエラーが出たかわかる
  54. 54. 巨大なError /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/backports-3.3.3/lib/backports/tools.rb:328:in `require': / Users/sho/projects/rocketio/rocketio-tiqav-chat/main.rb:12: syntax error, unexpected keyword_end, expecting end-of-input (SyntaxError) from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/backports-3.3.3/lib/backports/tools.rb:328:in `require_with_backports' from /Users/sho/projects/rocketio/rocketio-tiqav-chat/config.ru:15:in `block in <main>' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize' from /Users/sho/projects/rocketio/rocketio-tiqav-chat/config.ru:in `new' from /Users/sho/projects/rocketio/rocketio-tiqav-chat/config.ru:in `<main>' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `eval' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `new_from_string' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:40:in `parse_file' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:277:in `build_app_and_options_from_config' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:199:in `app' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:314:in `wrapped_app' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:250:in `start' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:141:in `start' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/bin/rackup:4:in `<top (required)>' from /Users/sho/.rbenv/versions/2.0.0-p247/bin/rackup:23:in `load' from /Users/sho/.rbenv/versions/2.0.0-p247/bin/rackup:23:in `<main>' おわかりいただけるだろうか
  55. 55. 巨大なError /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/backports-3.3.3/lib/backports/tools.rb:328:in `require': / Users/sho/projects/rocketio/rocketio-tiqav-chat/main.rb:12: syntax error, unexpected keyword_end, expecting end-of-input (SyntaxError) from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/backports-3.3.3/lib/backports/tools.rb:328:in `require_with_backports' from /Users/sho/projects/rocketio/rocketio-tiqav-chat/config.ru:15:in `block in <main>' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize' from /Users/sho/projects/rocketio/rocketio-tiqav-chat/config.ru:in `new' from /Users/sho/projects/rocketio/rocketio-tiqav-chat/config.ru:in `<main>' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `eval' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `new_from_string' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:40:in `parse_file' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:277:in `build_app_and_options_from_config' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:199:in `app' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:314:in `wrapped_app' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:250:in `start' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:141:in `start' from /Users/sho/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rack-1.5.2/bin/rackup:4:in `<top (required)>' from /Users/sho/.rbenv/versions/2.0.0-p247/bin/rackup:23:in `load' from /Users/sho/.rbenv/versions/2.0.0-p247/bin/rackup:23:in `<main>' 正直どこから読めばいいかわからないけど、自分のアプリ内 の .rb ファイルの名前を探そう ココ
  56. 56. IO File.open("hoge.txt", "w+") do |f| f.write "abcdefg" end File.open("hoge.txt") do |f| f.readlines.each do |line| ## 行ごとに読む puts line end end ファイルの読み書き
  57. 57. IO(2) cat hoge.txt | ruby main.rb UNIX PIPE入力 while line = STDIN.gets puts line end ARGF.each do |line| puts line end main.rb
  58. 58. どこから手を付けれ ばいいか
  59. 59. とりあえず日常的に使うツール を作るのがいいのでは? • ぶっこぬき系がいいのでは? • ぶっこぬき == クロール・HTML解 析・DBに貯めて・通知するという総 合芸術 • pi○ivをクロールしてRSSを出すとか • SkypeやTwitterで自分に通知するとか
  60. 60. かっこいい書き方ができる • 先にsample.rbを書く • マジかよと思うようなサンプルコードを書く • Rubyなら、それを実行できるライブラリは必 ず作れる chat = Skype.chats.find{|c| c.title =~ /増井研/ } chat.messages.each do |m| puts "#{m.user} #{m.body}" end chat.post "おなかすいた"
  61. 61. 実演:ぶっこぬき

×