Ruby勉強会@札幌
Rubyist入門講座
日本Rubyの会
島田浩二
snoozer.05@gmail.com
OSC 2007 Hokkaido
2007-06-30(土)
ポジションペーパー
“立場表明書”
I LOVE RUBY
私はRubyが大好きだ
24
引用:Dave Thomas “The Island Of Ruby”
本日お伝えしたいこと
theme of this seminar
http://www.ruby-lang.org/ja/
http://www.ruby-lang.org/ja/
http://www.ruby-lang.org/ja/
ここ
本日
大変緊張して
おりますので
どうぞ
お手柔らかに
お願いします
Agenda
✓ 自己紹介
✓ Ruby Hot Topics
✓ Rubyist 入門講座
✓ 日本Rubyの会について
✓ Ruby札幌について
自己紹介
Self-Introduction
自己紹介
•島田 浩二(しまだ こうじ)
•フリーのソフトウェア技術者
•お仕事は組み込みメイン
•使ってる言語はCだったり
•日本Rubyの会
•Ruby札幌
•るびま、るりま等
•http://iddy.jp/profile/snoozer05/
さいきんのRuby
Ruby 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
http://jp.rubyist.net/RubyKaigi2007/
次回の
勉強会でやる
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の会
✓開発者の支援
✓利用者の支援
http://jp.rubyist.net/magazine/
http://doc/loveruby.net/wiki/
メーリングリスト
http://jp.rubyist.net/
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
ご清聴
ありがとう
ございました

Ruby勉強会@札幌 "Rubyist入門講座"