ruby勉強会@札幌 "rubyist入門講座"
TRANSCRIPT
Ruby勉強会@札幌
Rubyist入門講座日本Rubyの会島田浩二
OSC 2007 Hokkaido2007-06-30(土)
ポジションペーパー“立場表明書”
I LOVE RUBY
私はRubyが大好きだ
24
引用:Dave Thomas “The Island Of Ruby”
本日お伝えしたいことtheme of this seminar
ここ
本日大変緊張しておりますので
どうぞお手柔らかにお願いします
Agenda✓ 自己紹介✓ Ruby Hot Topics✓ Rubyist 入門講座✓ 日本Rubyの会について✓ Ruby札幌について
自己紹介Self-Introduction
自己紹介•島田 浩二(しまだ こうじ)•フリーのソフトウェア技術者•お仕事は組み込みメイン
•使ってる言語はCだったり•日本Rubyの会• Ruby札幌•るびま、るりま等
• http://iddy.jp/profile/snoozer05/
さいきんのRubyRuby Hot Topics
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
次回の勉強会でやる
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
RubyOnRailsの面白い話題は
masuidriveさんのセッションで
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
Ruby Hot Topics✓ RubyKaigi2007 - Key is Love
✓ YARV - “Not” Yet Another Ruby VM
✓ Rails - Ruby’s Killer App
✓ JRuby - From Java to Ruby
✓ RSpec - Behavior Driven Develop
Rubyist入門講座Rubyist Guide
Lesson (1)Rubyの価値
Values of Ruby
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
開発者に優しいNice to developers
開発者にやさしい✓ 開発しやすい環境を提供• irb, RubyGems, Test::Unit
✓ 手になじんだ環境で開発を• emacs, vim, eclipse, visual studio
✓ 困ったときには• メーリングリスト
開発者にやさしい✓ 開発しやすい環境を提供• irb, RubyGems, Test::Unit
✓ 手になじんだ環境で開発を• emacs, vim, eclipse, visual studio
✓ 困ったときには• メーリングリスト
開発者にやさしい✓ 開発しやすい環境を提供• irb, RubyGems, Test::Unit
✓ 手になじんだ環境で開発を• emacs, vim, eclipse, visual studio
✓ 困ったときには• メーリングリスト
開発者にやさしい✓ 開発しやすい環境を提供• irb, RubyGems, Test::Unit
✓ 手になじんだ環境で開発を• emacs, vim, eclipse, visual studio
✓ 困ったときには• メーリングリスト
メーリングリスト
メーリングリスト
メーリングリスト
つくった人が日本語で答えてくれる :-)
開発者にやさしい✓ 開発しやすい環境を提供• irb, RubyGems, Test::Unit
✓ 手になじんだ環境で開発を• emacs, vim, eclipse, visual studio
✓ 困ったときには• メーリングリスト
開発者に優しいNice to developers
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
簡潔であることClear and readable
ポール・グラハム
良いデザイン
Say what you mean and say it briefly
- Paul Graham言いたいことは簡潔に言え。
- ポール・グラハム『ハッカーと画家』
ためしに言ってみる
言いたいこと
文字列クラスのメソッド一覧のうち末尾が”f”で終わるものをアスキー順にソートして改行で区切って出力したい
Javaで言ってみる
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
文字列クラスの
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
文字列クラスの
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
メソッド一覧の
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
メソッド一覧の
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
末尾が”f”で終わるものを
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
末尾が”f”で終わるものを
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
アスキー順にソートして
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
アスキー順にソートして
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
改行で区切って出力したい
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
改行で区切って出力したい
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
Rubyで言ってみる
文字列クラスの
文字列クラスの“”.
メソッド一覧の“”.
“”.methods.
メソッド一覧の
末尾が”f”で終わるものを“”.
methods.
末尾が”f”で終わるものを“”.
methods.grep(/f$/).
アスキー順にソートして“”.
methods.grep(/f$/).
アスキー順にソートして“”.
methods.grep(/f$/).sort.
改行で区切って“”.methods.grep(/f$/).sort.
“”.methods.grep(/f$/).sort.join(“¥n”).
改行で区切って
“”.methods.grep(/f$/).sort.join(“¥n”).
出力したい
“”.methods.grep(/f$/).sort.join(“¥n”).display
出力したい
“”.methods.grep(/f$/).sort.join(“¥n”).display
“”.methods.grep(/f$/).sort.join(“¥n”).display
確認
Javaで言うと
import java.lang.reflect.Method;import java.util.regex.*;
public class sample { public static void main(String arg[]) { try { Method[] methods = “”.getClass().getMethods(); Array.sort(methods); Pattern pat = Pattern.compile(“.*f$”); for(Method m : methods){ Matcher mat = pat matcher(m.getName()); if (mat.matches()) { System.out.println(m.getName()); } } } catch(Exception e) { System.out.println(e); } }}
Rubyだと
“”.methods.grep(/f$/).sort.join(“¥n”).display
Say what you mean and say it briefly
- Paul Graham言いたいことは簡潔に言え。
- ポール・グラハム『ハッカーと画家』
ポイント
目にやさしい
読みやすさ
無駄がない
本質を捉えている
簡潔であること✓ 処理の本質だけを捉える✓ 読みやすさ
簡潔であること✓ 処理の本質だけを捉える✓ 読みやすさ
開発が楽しくなる
簡潔であること✓ 処理の本質だけを捉える✓ 読みやすさ
開発が楽しくなる開発効率も段違い
簡潔であることClear and readable
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
柔軟であることFlexible and agile
Part1
Expressiveness
表現力
This works! Such finding make me happy.
- Dave Thomasこれも動くんだ!こんな発見が僕をハッピーにしてくれる。
- 達人プログラマ
デモ
表現力
いろいろな表現が可能
複数のプログラミングパラダイムを許容
✓ オブジェクト指向✓ 手続き型✓ 関数型✓ 単なるスクリプト✓ etc
マルチパラダイム
マルチパラダイム✓ 問題解決にあたって最良のパラダイムを✓ プログラマは表現者➡ 表現に自由を!✓ 新しいパラダイムへの入り口として
✓ 問題解決にあたって最良のパラダイムを✓ プログラマは表現者➡ 表現に自由を!✓ 新しいパラダイムへの入り口として
表現力
柔軟であることBe flexible and agile
Part2
Dynamic
動的
動的✓ インタプリタ✓ 動的型✓ オープンクラス
インタプリタ
インタプリタ✓コンパイル不要
• 実行までにかかる時間が短い✓ぎりぎりまで自分自身を書き換えることが可能• 実行中にプログラムを変更➡ アジャイル開発に最適
インタプリタ
動的型
動的型✓ 型宣言不要
• コードをシンプルに保つことが可能➡変更に強く!本質に注力!
✓ 振る舞いにより型を判断• 大事なのはそのオブジェクトが何を出来る(どのような振る舞いを持つ)のか ➡Duck Typing!
動的型
オープンクラス
あらゆるクラスを改変可能
デモ
オープンクラス✓ あらゆるクラスを改変することが可能• Rubyはオープンな言語➡プログラマを信頼!
オープンクラス
動的✓ インタプリタ✓ 動的型✓ オープンクラス
✓ アジャイルな開発を低コストで実現✓ 変更に強く! 本質に注力!✓ すべてはプログラマ次第➡Rubyは信頼してくれている
動的
柔軟であることFlexible and agile
✓ 問題解決にあたって最良のパラダイムを✓ プログラマは表現者➡ 表現に自由を!✓ 新しいパラダイムへの入り口として
表現力
✓ アジャイルな開発を低コストで実現✓ 変更に強く! 本質に注力!✓ 決めるのはプログラマ➡Rubyが信頼してくれている
動的
柔軟であることFlexible and agile
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
開かれていることOpen
開かれていること✓ オープンソース
• 誰でもRubyを好きなように利用できる
✓ 意思決定のプロセス• 誰でも意思決定のプロセスに参加できる✓ コミュニティ
• 大切なのはコミュニティ、そして人
開かれていること✓ オープンソース
• 誰でもRubyを好きなように利用できる
✓ 意思決定のプロセス• 誰でも意思決定のプロセスに参加できる✓ コミュニティ
• 大切なのはコミュニティ、そして人
開かれていること✓ オープンソース
• 誰でもRubyを好きなように利用できる
✓ 意思決定のプロセス• 誰でも意思決定のプロセスに参加できる✓ コミュニティ
• 大切なのはコミュニティ、そして人
開かれていること✓ オープンソース
• 誰でもRubyを好きなように利用できる
✓ 意思決定のプロセス• 誰でも意思決定のプロセスに参加できる✓ コミュニティ
• 大切なのはコミュニティ、そして人
Ruby = コミュニティ、人
開かれていること✓ オープンソース
• 誰でもRubyを好きなように利用できる
✓ 意思決定のプロセス• 誰でも意思決定のプロセスに参加できる✓ コミュニティ
• 大切なのはコミュニティ、そして人
開かれていること✓ オープンソース
• 誰でもRubyを好きなように利用できる
✓ 意思決定のプロセス• 誰でも意思決定のプロセスに参加できる✓ コミュニティ
• 大切なのはコミュニティ、そして人
開かれていることOpen
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
Values Of Ruby✓ Be nice to developers✓ Be clear and readable✓ Be flexible and agile✓ Be open
Lesson (1)Rubyの価値
Values of Ruby
Lesson (2)
Lesson (2)続きは勉強会で
To be continued
ご案内
日本Rubyの会
日本Rubyの会
✓開発者の支援✓利用者の支援
メーリングリスト
Ruby札幌
Ruby札幌
✓Ruby勉強会@札幌
✓Ruby Sapporo Night
Ruby勉強会@札幌
Ruby勉強会@札幌✓1.5ヶ月に一回くらい✓平均すると20人くらい✓Ruby初心者歓迎✓手伝ってくれる方歓迎
Ruby勉強会@札幌✓ピッケル本読み合わせ✓るびま読み合わせ✓他言語探訪✓Rails導入事例など
✓次回は 7月21日(土)✓RubyKaigi2007報告会✓http://jp.rubyist.net/
Ruby勉強会@札幌
Ruby Sapporo Night
RubySapporoNight
✓7月から開始✓デモ中心??✓アップルストアでw✓初回は7月25日(水)
Ruby札幌
✓Ruby勉強会@札幌
✓Ruby Sapporo Night
Ruby札幌
詳しくは日本Rubyの会をご参照ください
以上
謝辞:• 前田さん、設楽さん• 千葉さん、菅野さん• いつも勉強会にご参加くださっているみなさん
• OSC-Do運営スタッフのみなさん• 日本Rubyの会のみなさん• Ruby開発チームのみなさん• and Special Thanks to Dave Thomas
ご清聴ありがとうございました