Ruby – The Scripting Language

5,033 views

Published on

It's very important the scripting language side of Ruby.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,033
On SlideShare
0
From Embeds
0
Number of Embeds
263
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Ruby – The Scripting Language

  1. 1. Ruby – The Scripting Language<br />Akio Tajima<br />aka arton<br />
  2. 2. Agenda<br />decade<br />Scripting Language<br />Ruby<br />To Err is Human<br />Windows is Not Unix<br />Unix is Not United<br />For Your Pleasure<br />
  3. 3. Ruby<br />http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=ruby%A4%C3%A4%C6%A1%FB%A1%FB%A1%FB%A4%F2%C6%B0%A4%AB%A4%B9%A4%CE%A4%CB%C9%AC%CD%D7%A4%CA%A5%E4%A5%C4%A4%C0%A4%C3%A4%B1%A1%A9<br />2005 Railsを動かすのに必要なヤツ<br />2004 tDiary|portupgradeを動かすのに必要なヤツ<br />
  4. 4. 私とRuby<br />1999末~2000年<br />Windows<br />ネットワーク<br />正規表現<br />COMインターフェイス<br />スクリプト言語<br />
  5. 5. 宣伝<br />2000<br />2001<br />2009<br />2006<br />2008<br />
  6. 6. Scripting Language<br />The origin of the term was similar to its meaning in &quot;a movie script tells actors what to do&quot;: a scripting language controlled the operation of a normally-interactive program, giving it a sequence of work to do all in one batch. For instance, one could put a series of editing commands in a file, and tell an editor to run that &quot;script&quot; as if those commands had been typed interactively. <br />http://www.c2.com/cgi/wiki?ScriptingLanguage<br />
  7. 7. Rubyとは<br />Rubyは、手軽なオブジェクト指向プログラミングを実現するための種々の機能を持つオブジェクト指向スクリプト言語です。本格的なオブジェクト指向言語 であるSmalltalk、EiffelやC++などでは大げさに思われるような領域でのオブジェクト指向プログラミングを支援することを目的としていま す。もちろん通常の手続き型のプログラミングも可能です。<br />http://www.ruby-lang.org/ja/about/<br />
  8. 8. スクリプト<br />
  9. 9. 繰り返しの達人<br />反復作業は達人を生む<br />瞬時にファイル名のパターンを認識し<br />マシンのようにマウスを動かし<br />マシンのようにキーボードを叩く<br />マンマシンシステム<br />
  10. 10. To Err is Human<br />
  11. 11. To Forgive is Machine<br />何を繰り返しているか<br />作業の分解<br />⇒ スクリプト化<br />
  12. 12. 例<br />tDiayのツッコミspam<br />
  13. 13. I ROBOT<br />2009/200902.tdcをエディタで開く<br />TDIARY2.00.00<br />Date: 20090204<br />Name: メル<br />Mail: <br />Last-Modified: 1139188007<br />Visible: true<br />こないだ私のお兄さんとしたんですけど、不幸なことが<br />.<br />Date: 20090204<br />Name: paealos<br />Mail: <br />Last-Modified: 1140972441<br />Visible: true<br />Viagra are often the first treatment tried for erectile <br />.<br />Date: 20090204<br />Name: アリバイ会社<br />Mail: <br />Last-Modified: 1140972441<br />Visible: true<br />&lt;a href=&quot;http://dmajor.info/&gt;アリバイ会社&lt;/a&gt;<br />.<br />sudo –u www-data vi …<br />削除<br />
  14. 14. http://tach.arege.net/trac/browser/tdiary/trunk/contrib/util/clean-spam?rev=713<br />#!/usr/bin/env ruby<br />#<br /># Copyright (C) 2004 Satoru Takabayashi &lt;satoru@namazu.org&gt;<br /># You can redistribute it and/or modify it under GPL2.<br />#<br />puts &quot;Usage: tdiary-comment-clean PATTERN FILE...&quot; if ARGV.length == 0<br />pattern = Regexp.new(ARGV.shift)<br />file_names = ARGV<br />deleted_comments = []<br />file_names.each {|file_name|<br />i = File.open(file_name)<br />first_line = i.gets<br />(continue…)<br />
  15. 15. file_names.each {|file_name|<br />i = File.open(file_name)<br />first_line = i.gets<br /> comments = []<br /> comment = &quot;&quot;<br /> while line = i.gets<br /> if line == &quot;. &quot;<br />comments.push(comment)<br /> comment = &quot;&quot;<br /> else<br /> comment &lt;&lt; line<br /> end<br /> end<br />i.close<br />(continue…)<br />
  16. 16. tmp_name = &quot;tmp.#{Process.pid}&quot;<br />File.open(tmp_name, &quot;w&quot;) {|o|<br />o.printfirst_line<br />comments.each {|comment|<br /> if pattern.match(comment)<br />deleted_comments.push(comment)<br /> else<br />o.print comment<br />o.puts &quot;.&quot;<br /> end<br /> }<br /> }<br />File.rename(file_name, file_name + &quot;.bak&quot;)<br />File.rename(tmp_name, file_name)<br />}<br />deleted_comments.each {|comment|<br /> print comment<br /> puts &quot;.&quot;<br />}<br />
  17. 17. Windows is Not Unix<br />
  18. 18. というわけで、1.8.7-p173にはバグが見つかってしまいました。ごめんなさい。修正したものをリリースします。<br />&gt; <br />&gt; ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz<br />&gt; ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.bz2<br />&gt; ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.zip<br />&gt; <br />&gt; Checksums:<br />&gt; <br />&gt; MD5(ruby-1.8.7-p174.tar.bz2)= 88c45aaf627b4404e5e4273cb03ba2ee<br />&gt; SHA256(ruby-1.8.7-p174.tar.bz2)= 203978b6db1cc77a79ff03d141d162f6f17d86c3574f76de9eae9d0c8cb920bc<br />&gt; SIZE(ruby-1.8.7-p174.tar.bz2)= 4144807<br /><ul><li>[ruby-list:46090] Re: [ANN] Ruby 1.8.7-p174 released</li></li></ul><li>無い袖は振れない<br />c:TEMP&gt;sha256sum ruby-1.8.7-p174.tar.bz2<br />&apos;sha256sum&apos; は、内部コマンドまたは外部コマンド、<br />操作可能なプログラムまたはバッチ ファイルとして認識されていません。<br />
  19. 19. そうだ、ケーキを食べよう<br />
  20. 20. @echo off<br />c:progra~1 uby-1.9usrin uby -x /Users/arton/bin/sha256sum.bat %*<br />@gotoendofruby<br />#!/usr/bin/ruby<br />require &apos;digest/sha2&apos;<br />def sha256sum(str)<br /> sha256 = Digest::SHA2.new<br /> sha256.update(str)<br /> sha256.hexdigest<br />end<br />def file(name)<br />File.open(name, &apos;rb&apos;) do |f|<br /> yield sha256sum(f.read)<br /> end<br />end<br />if ARGV.length == 0<br />STDERR.puts(<br />&apos;usage: ruby sha256sum.rb file [more file...]‘)<br />else<br />ARGV.each do |a|<br /> file(a) do |sum|<br /> puts &quot;#{sum} #{a}&quot;<br /> end<br /> end<br />end<br />__END__<br />:endofruby<br />
  21. 21. c:homearton uby&gt;sha256sum ruby-1.8.7-p174.tar.bz2<br />203978b6db1cc77a79ff03d141d162f6f17d86c3574f76de9eae9d0c8cb920bc ruby-1.8.7-p174.tar.bz2<br />c:homearton uby&gt;<br />
  22. 22. 余談:巨大なファイル<br />def file(name)<br />File.open(name, &apos;rb&apos;) do |f|<br /> buff = &apos;x&apos; * 16384<br /> sha256 = Digest::SHA2.new<br /> while len = f.read(buff.size, buff)<br /> sha256 &lt;&lt; buff 自動伸縮<br /> end<br /> yield sha256.hexdigest<br /> end<br />end<br />
  23. 23. 余談:速度比較(470MBファイル)<br />(一括読み込み版)<br />c:homearton uby&gt;sha256sum “Windows Mobile 6 Professional SDK Refresh.msi&quot;<br />ff2bccc6d9618ff64d8172e9612f7fc46342f9e055bf99b407e689b74fad321b <br /> Windows Mobile 6 Professional SDK Refresh.msi<br /> 16.723000 1.092000 17.815000 ( 22.539000)<br />(16KB分割読み込み版)<br />c:homearton uby&gt;sha256sum “Windows Mobile 6 Professional SDK Refresh.msi&quot;<br />ff2bccc6d9618ff64d8172e9612f7fc46342f9e055bf99b407e689b74fad321b <br /> Windows Mobile 6 Professional SDK Refresh.msi<br />17.020000 0.905000 17.925000 ( 17.749000)<br />c:homearton uby&gt;<br />いい時代だ……<br />
  24. 24. -x<br />-x[directory]<br />メッセージ中のスクリプトを取り出して実行します。スクリプトを読み込む時に、`#!&apos;で始まり, &quot;ruby&quot;という文字列を含む行までを読み飛ばします。スクリプトの終りはEOF(ファイルの終り), ^D(コントロールD), ^Z(コントロールZ)または予約語__END__で指定されます。 <br />ディレクトリ名を指定すると、スクリプト実行前に指定されたディレクトリに移動します<br /><ul><li>Ruby リファレンスマニュアル</li></li></ul><li>-x<br />@echo off<br />c:progra~1 uby-1.9usrin uby -x /Users/arton/bin/sha256sum.bat %*<br />@gotoendofruby<br />#!/usr/bin/ruby<br />require &apos;digest/sha2‘<br /> ……<br />end<br />__END__<br />:endofruby<br />
  25. 25. FileUtils<br />FileUtils<br />cp –r<br />rm –f<br />touch<br />ruby –rfileutils –e “FileUtils.touchDir.glob(‘*.c’)”<br />
  26. 26. wget<br />ruby –ropen-uri –e “File.open(ARGV[0], ‘wb’)do|f|f.write open(‘http://arton.hp.infoseek.co.jp/’ + ARGV[0]).read;end” ActiveRuby.msi<br />
  27. 27. Unix Tools<br />http://homepage1.nifty.com/~tetsu/ruby/<br />渡辺哲也さんのスクリプト集<br />ls, cal, wc, sleep, mkdir, pkill, du, hd……<br />
  28. 28. Unix is not Linux<br />start-stop-daemon<br />
  29. 29. 事例<br />JavaのRMIサーバの起動シェル<br />停止用シェルに与えるpidファイルが必要<br />UnixのJavaは環境設定のためにfork/exec<br />pkill……× (すべてが java–Dxxxxx –Dxxxx )<br />setpgrp java … ← シェルが止まらない<br />            またはpidを残せない<br />
  30. 30. 自前start-stop-daemon<br />if ARGV[0] == ‘stop&apos;<br /> if File.exist?(PIDFILE)<br />File.open(PIDFILE, &apos;r&apos;) do |f|<br />pid = f.read<br /> end<br /> begin<br />Process.kill(-9, pid.to_i)<br /> rescue<br /> end<br />File.delete(PIDFILE)<br />end<br />elsif ARGV[0] == ‘start&apos;<br />init_policy<br />pid = fork<br /> if pid.nil?<br />Process.setpgrp()<br /> exec(CMD)<br /> else<br />File.open(PIDFILE, &apos;w&apos;) do |f|<br />f.write(pid.to_s)<br /> end<br /> end<br />end<br />
  31. 31. まとめ<br />スクリプト言語はスクリプトを書くための言語<br />(他のことにも使える)<br />スクリプト言語を使うということは、スクリプトを書くということ<br />スクリプトを書くと手作業から解放される<br />スクリプトを書こう!<br />
  32. 32. Followup<br />1.9.1以降は、fork ではなくspawn を使いましょう。(thanks AKR and Yugui)<br />ダイジェストを求めるには、<br />ruby –rdigest/sha2 –e “p Digest::SHA2.file(‘filename’)”<br />でOK (thanks _tad_)<br />例)<br />C: emp&gt;ruby -rdigest/sha2 -e &quot;p Digest::SHA2.file(ARGV[0])&quot; ruby-1.8.7-p174.tar.bz2<br />#&lt;Digest::SHA2:256 203978b6db1cc77a79ff03d141d162f6f17d86c3574f76de9eae9d0c8cb920bc&gt;<br />

×