2.
Ruby Ne Zaman Doğdu?
Yukihiro Matsumoto (a.k.a Matz) tarafından yaratıldı.
İlk temel 23 Şubat 1993 yılında atıldı.
Aralık 1995'de 0.95 sürümü Japon haber listelerine duyuruldu.
Bu tarihten itibaren geliştirici ve kullanıcı sayısında patlama yaşandı.
Ruby, şu an Japonya'dan en çok kullanılan programlama dillerinden biri.
Son kararlı sürüm 1.8.5 (29 Ağustos 2006)
3.
Ruby Nasıl Doğdu?
Matz'ın üniversite yıllarındaki en büyük hayali, kendi programlama dilini tasarlamaktı.
Nesneye yönelik programlamanın avatajlarını, betikleme alanında göstermek istiyordu.
Aradığı özelliklere uygun bir dil yoktu. Bu yüzden tasarlayacağı dilin;
Perl'den daha güçlü,
Python'dan daha nesneye yönelik olmasını istiyordu...
4.
Ruby'nin Büyüme Hızı Nedir?
Camiaya sunulduğu 1995 yılından beri dünyanın dört bir yanından programcıların ilgisini çeken bir programlama dili oldu,
2006 yılı, Ruby'nin geniş kitleler tarafından kabul gördüğü bir yıl oldu.
Ruby-talk listesinin günde ortalama 200 e-posta
trafiği var,
TIOBE istatistiklerine göre, Ruby şu an dünyanın en popüler 11. dili.
6 ay içinde, ilk 10'a gireceği söyleniyor.
5.
Ruby'nin Temel Aldığı Felsefeler Nelerdir?
Programcı makinaya odaklanmak yerine, programlamanın nasıl yapıldığı ile ilgilenmeli,
“ We are the masters they're the slaves”...
Bir şeyi yapmanın birden fazla yolu vardır,
Ruby, size seçme özgürlüğü verir.
6.
Ruby'nin Temel Aldığı Felsefeler Nelerdir? #2
İyi bir arayüz,
Programlama dilinin sihirli kurallarına dikkat edeceğimize, pseudo kod yazar gibi programlama yapsak olmaz mı?
POLS (Principle of Matz's Least Suprise)
Belirsiz bir durumla karşılaşıldığında, çözüm sizi sürprize uğratmayacak olanıdır.
7.
RUBY'nin GENEL ÖZELLİKLERİ
8.
Ruby'de herşey bir nesnedir
Ruby yüzde yüz saf nesneye yönelik bir dildir,
Ruby'de her kod parçasına kendisine ait özellikler ve olaylar verilebilir,
Özellikler -> Örnek değişkenler (instance variables),
Olaylar -> Metotlar ile gerçekleştirilir.
Yönlendirdiğiniz herşey ve bunların döndürdüğü sonuçlar birer nesnedir.
9.
Metotlar nesneye bir mesaj yollanarak uyandırılırlar,
number = Math.abs(number) //Java
number = number.abs #Ruby
Bir sayıya bile olay verebiliriz!
5.times { puts "We *love* Ruby!" }
Ruby'de herşey bir nesnedir #2
10.
Ruby Esnektir...
Ruby kullanıcıları kısıtlamaz,
Beğenmediğiniz kısımları değiştirebilir, yeniden tanımlayabilirsiniz.
Toplama işlemini + operatörü ile değil, topla diye bir metodla yapmak istiyorum?
class Numeric
def topla (x)
self. + (x)
end
end
y = 2.topla 3
# y'nin değeri 5 oldu.
11.
Ruby gücünü bloklardan alır...
Blok kavramı, Ruby'nin esnek bir dil olmasının nedenlerinden biridir,
Ruby'de herhangi bir metoda blok koyabilirsiniz.
Ruby'nin blokları fonksiyonel dillerden esinlenilerek yaratılmıştır,
Matz, blok kavramını Lisp dilinden aldığını ifade etmiştir.
search_engines =
%w[Google Yahoo MSN].map do |engine|
"http://www." + engine.downcase + ".com"
end
[" http://www.google.com ", "http://www.yahoo.com", "http://www.msn.com"]
12.
Mix-in tekniği?
Ruby, özellikle yalnızca tekli mirası destekler,
Modül kavramı, çoklu mirası gerçekleştirmek için daha iyi bir yöntemdir.
Bir sınıf, bir modül ile karıştırılabilir (mix-in),
Böylece modülün metodlarına sahip olur.
class MyArray
include Enumerable
end
#each yöntemi varsa, sort ve find yöntemlerini bedava aldık.
13.
Dinamik tanımlanan bir dil...
Ruby değişken tanımlamalarını duck-typing paradigmasına göre yapar,
Değişken tanımlamak gereksiz!
String dizge;
dizge=”pinar”;
dizge=”pinar”
Değişkenlerin yaşam alanı basit kurallarla belirleniyor,
degisken # yerel değişken
@degisken # örnek değişken
$degisken # global değişken
14.
Türemiş bir dil...
Ruby, bir çok programlama dilinden özellikler almıştır;
- Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell...
Tekerleği yeniden keşfetmeye gerek yok,
Bozulmamış olanı düzeltmeye gerek yok,
İnsanların varolan tecrübelerinden faydalanmak her zaman iyidir...
15.
Doğrudan Sistem Çağrıları Gönderebilme,
UNIX'teki tüm sistem çağrılarına erişebiliyor,
Win32 API'si sayesinde, tüm sistem çağrılarına erişebiliyor.
Yüksek Taşınabilirlik,
Linux üzerinde geliştirilse de diğer işletim sistemleri üzerinde de çalışabilir,
UNIX, DOS, Windows 95/98/Me/NT/2000/XP, MacOS, BeOS, OS/2 ...
Platform bağımsız...
16.
Ve daha pek çok iştah kabartan özellik!
Kolay hata yakalama mekanizması,
Güçlü metin işleme ve düzenli ifadeler,
Mark & Sweep çöp toplayıcısı,
C kodlarını koda gömmek Perl ve Python'a göre daha kolay,
17.
Ruby hangi uygulamalar için uygun?
Metin işleme,
CGI programlama,
Web programlama,
XML programlama,
GUI uygulamaları,
Yapay zeka ve keşifsel matematik,
Genel programlama,
Programlama eğitimleri,
Extreme programlama ...
18.
Yüksek trafikli web uygulamaları,
İşletim sistemi gerçekleştirimleri,
Derleyici gerçekleştirimleri...
Ruby hangi uygulamalar için uygun değil?
19.
Ruby nerelerde kullanılıyor?
Simülasyonlarda,
NASA ve Motorola, bazı simülasyonlarını yapmak için Ruby'yi kullanıyor.
Robotbilimde,
Siemens, bir servis robotunun kontrolünü sağlamak için Ruby'yi kullandı.
Oyunlarda,
Japonya'da ticari bir oyun firması, Ruby ile geliştirdiği RPG oyununu Haziran 2004'te piyasaya sürdü.
20.
Telefonculukta,
UCB, kablosuz telefonları ve trafiğin yükünü kontrol etmek için Ruby'yi kullanıyor.
3G kablosuz telefonculuk şirketi, ~150K'lık C++ koduna karşı, ~6K'lık Ruby kodunu kullandı.
Bilimde,
Yüksek yoğunluklu yıldız sistemlerinin modellemesi üzerinde çalışan ACS şirketi de projelerinde Ruby kullanıyor.. .
Ruby nerelerde kullanılıyor? #2
21.
KARŞILAŞTIRMALAR
22.
Java vs Ruby
Java, gelişmiş, test edilmiş ve Ruby'ye göre hızlı bir dil.
Peki o zaman niçin Ruby'ye geçelim?
Ancak bir o kadar da gereksiz sözcüklerle dolu.
Ruby kullanarak, aynı kodu çok daha kısa sürede ve çok daha az satırda yazabilirsiniz.
23.
Java & Ruby arasındaki benzerlikler
Otomatik çöp toplayıcısı,
Değişkenlerin tiplerine uygun içerikte olup olmadığının sıkı kontrolü (strongly typed),
Public, protected ve private metotlar,
Gömülü dosya aracı (Rdoc ~ Javadoc'a benziyor)
24.
Java & Ruby arasındaki farklar
Yazdığınız kodu derlemenize gerek yoktur, direkt olarak çalıştırabilirsiniz,
Her şey birer nesnedir (3.15, 5 vs...)
Değişken tipi tanımlamaya gerek yoktur,
int[] a = {1,2,3}; # java
a = [1,2,3] # ruby
25.
Ruby'de yapılan her işlem nesneye mesaj olarak geçer,
number = Math.abs(number) // Java
number = number.abs # Ruby
Bazı kavramlar,
#ruby //java
require import
nil null
self this
mix-in'ler interface'ler
Java & Ruby arasındaki farklar #2
26.
PHP vs Ruby
PHP, web uygulamaları için çok kullanılan yaygın bir dil.
Peki o zaman Ruby ile neden ilgileneyim?
Ruby on Rails (RoR) kullanmak istiyorsanız,
Ya da daha geniş amaçlar için kullanılan bir dil arıyorsanız göz atmakta fayda var.
27.
PHP & Ruby arasındaki benzerlikler
Değişken tipleri dinamik olarak tanımlanıyor (dynamic typing)
Public, protected, private erişim mekanizmaları,
Geniş bir standart kütüphaneye sahipler, ...
28.
Ruby, strong typing bir dil (dönüştürmeler için to_s, to_i, ...),
Dizgeler, sayılar, diziler birer nesne,
Soyut sınıf ya da arayüz yoktur,
Ruby'de her işlem nesneye mesaj olarak geçer, ...
PHP & Ruby arasındaki benzerlikler #2
29.
Python vs Ruby
Python da tıpkı Ruby gibi genel amaçlı bir dildir,
Python ~ Ruby (ya da tam tersi) göç çok kolaydır,
Ruby kullanmak size Python'dan daha fazla syntax öğretebilir...
30.
Python & Ruby arasındaki benzerlikler
İkisinde de interaktif komut satırı vardır (ipython ~ irb),
Komut satırından döküman okuyabilirsiniz (pydoc ~ ri),
Nesneler strong ve dynamic type'dır,
Gömülü belgeleme araçları,
31.
Tüm işlemler nesneye mesaj olarak geçer,
Python'da metotların haricinde fonksiyonlar yazmak mümkündür,
Ruby'de miras mix-in tekniği ile gerçekleştirilir,
Python'da çoklu miras vardır,
Bazı sözcük farklılıkları,
#ruby #python
require import
elsif elif
Python & Ruby arasındaki farklar
32.
Niçin Ruby?
Basit; öğrenmesi ve kodlaması kolay,
Güçlü,
Zengin kütüphaneler,
Hızlı geliştirme,
Yardımsever Ruby topluluğu,
Açık kaynak kodlu,
Eğlenceli :)
33.
Performans
Tıpkı Perl ya da Python gibi, C kodu ile sarılsa dahi yeterince hızlı değil,
İyi bir VM'ye sahip değil,
Ruby2, RITE...
Varolan dahili standartlar,
Deneyim,
İyi bilinen bir dil değil; belgelendirme çok az,
Çok az deneyimli coder...
Niçin Ruby değil ?
37.
Dizgeler #3
Karakter seçimi,
kelime=”ruby”
kelime[0]
#114, r harfinin ASCII kodu
kelime[-1]
#121, y harfinin ASCII kodu
Eşitlik kontrolü,
kelime= “ruby”
kelime == “ruby”
#true
kelime == “perl”
#false
39.
Dizgeler #5
Değişkenlerin değerini geçici değişkenler kullanmadan değiştirebiliriz!
v1, v2 = v2, v1
x, y, z = %w(Kestane Gurgen Palamut)
#["Kestane", "Gurgen", "Palamut"]
x, y, z = y, z, x
#["Gurgen", "Palamut", "Kestane"]
41.
Bir cümleyi tersine çevirelim,
cumle=”ruby programlama dili”
ters_byte = cumle.reverse
# "ilid amalmargorp ybur"
ters_kelime = cumle.split(" ").reverse.join(" ")
# "dili programlama ruby"
Büyük harf, küçük harf dönüşümleri,
x = "ruby on rails".upcase # "RUBY ON RAiLS"
x.downcase! # "ruby on rails"
x.capitalize! # "Ruby on rails"
Dizgeler #7
42.
Diziler
Ruby'de dizilere farklı türden nesneler atayabilirsiniz,
dizi=[1.9,3,"ruby"]
# [1.9,3, "ruby"]
Dizileri de , aynı dizgeler gibi birleştirebilir, ya da tekrar ettirebilirsiniz,
dizi + [“programlama”, “dili”]
# [1.9,3, "ruby","programlama", "dili"]
dizi*2
# [1.9,3, "ruby",1.9,3,"ruby"]
48.
Hashler #3
Acaba vereceğimiz anahtar değere karşılık gelen bir değer var mı?
if (dizi.has_key?(“Pinar”))
puts “Zaten var...!”
else
puts “Boyle bir anahtar bulunmuyor.”
end
# Zaten var...!
[ "Figen", "Sule" ].each { |name|
print name, " ailenin ", yas.has_key?(name) ? "bir ferdidir" : "bir ferdi degildir", ""
}
#Figen ailenin bir ferdi degildir
#Sule ailenin bir ferdi degildir
50.
Hashler #5
İki hash'de aynı olan ya da farklı olan anahtarları nasıl tespit ederiz?
ogr_no={“Pinar”, 30401012, “Figen”, 40401022}
#{"Figen"=>40401022, "Pinar"=>30401012}
İkisinde de var olan anahtarlar?
genel= yas.keys & ogr_no.keys
#["Pinar"]
Birinci hash'de olup da ikincisinde olmayan anahtarlar?
farkli= yas.keys - ogr_no.keys
# ["Ikbal", "Ozgur", "Tulin"]
51.
Düzenli İfadeler
Düzenli ifadeler, bir dizgenin verilen şablona uyup uymadığını bulmaya yarar,
Ruby'de düzenli ifadeler (regex) ters bölü işaretleri arasına yazılır,
/regex/ tanımlaması yapıldığı an yeni bir Regexp nesnesi yaratılır.
=~ bulduğu dizgenin konumunu, aksi halde nil değerini döndürür,
ifade = "ruby programlama dili"
ifade =~ /programlama/
# 5
52.
Düzenli İfadeler #2
< > işaretleri arasında, onaltılık sayı olup olmadığını kontrol edelim...
def hex(s)
(s =~ /<0(x|X)(|[a-f]|[A-F])+>/) != nil
end
hex "Bu değil." #false
hex "Belki bu? {0x35}" #false
hex "Ya da bu? <0x38z7e>" #false
hex "Tamam, bu: <0xfc0004>" #true
Metodumuzu deneyelim:
53.
Denetim Yapıları
case,
i=8
case i
when 1,2..5
print “1..5”
when 6..10
print “6..10”
end
# 6..10
case 'ruby programlama dili'
when 'python', 'perl'
print "python ya da perl"
when /ruby/
print "ruby! "
end
# ruby!
54.
Denetim Yapıları #2
sayac = 0
while satir = gets
if satir =~ /Ruby/
sayac += 1
end
end
puts "#{sayac} Ruby satırı var"
Girdi:
Bu birinci Ruby satırı
Bu ikinci
Bu da üçüncü Ruby satırı
^D
Çıktı:
2 Ruby satırı var
While
55.
Denetim Yapıları #3
for i in [200,-3.6,"ruby"]
print "#{i}(#{i.type})"
end
=begin
200 (Fixnum)
-3.6 (Float)
ruby (String)
=end
For,
56.
57.
dizi =[200,-3.6,"ruby"]
for i in dizi
puts i
end
# 200
#-3.6
#ruby
Yineleyiciler #2
For yineleyicisi,
58.
Yineleyiciler #3
Yield, denetimi yineleyiciye parametre olarak geçilen kod bloğuna verir..
def repeat(num)
while num > 0
yield
num -= 1
end
end
repeat(3) { print "ruby" }
#ruby
#ruby
#ruby
59.
Dosya Erişimi
Dosya açma işlemleri:
dosya = File.new("/home/odev.txt", "r")
# path'de belirttiğimiz dosyayı sadece okumak için açar,
dosya = File.new(path, "w")
# path'de belirttiğimiz dosyayı yazmak için açar,
dosya = File.open(“/home/odev.txt”, File::WRONLY|File::CREAT, 0666)
# path kısmında belirtilen dosyayı yazmak için aç. Eğer dosya yoksa, 666 izni ile beraber bu dosyayı yarat.
60.
Dosya Erişimi #2
passwd dosyasında kullanıcı adı hexa olan kullanıcının bilgilerini bulalım:
File.open("/etc/passwd").each { |line|
puts line if line =~ /hexa/
}
#hexa:x:1001:1001::/home/hexa:/bin/bash
61.
Dosya Erişimi #3
Harici bir temp dosyası kullanmadan, dosyanın içeriğini nasıl değiştiririz?
File.open('/home/moon/dosya.txt', 'r+') do |f|
lines = f.readlines
lines.each do |it|
it.gsub!(/pinar/, 'pinguar')
end
f.pos = 0
f.print lines
f.truncate(f.pos)
end
62.
Miras
Ruby'de miras denince kastedilen tekli mirastır,
Ruby'nin tasarım sürecinde, tekli miras kavramının daha anlaşılır ve daha az karmaşık olduğu kabul edilmiş ve çoklu miras gerçeklenmemiştir.
Gerçek hayatta yaptığımız sınıflandırmalar son derece hiyerarşiktir,
Küçük sınıflar büyük sınıfların karakteristik özelliklerini miras alırlar,
Eğer bütün memeliler nefes alabiliyorsa, bütün kediler de nefes alıyor demektir...
63.
Miras #2
class Memeli
def nefes
print "Nefes al, Nefes ver"
end
end
Basit bir Memeli sınıfı tanımlayalım:
Şimdi de bir Kedi sınıfı tanımlayalım, ancak bu sınıfın Memeli sınıfının alt sınıfı olduğunu belirtelim:
class Kedi<Memeli
def konus
print "Miyauvvvv"
end
end
pisi = Kedi.new
pisi.nefes
#Nefes al, Nefes ver
pisi.konus
#Miyauvvvv
64.
Modüller & Mix-in
Ruby'de modüllerin ve sınıfların ilk harfi büyük olmak zorundadır,
Modüller module ... end şeklinde tanımlanır.
Modüller iki amaç için kullanılabilir,
İlki iişkili yöntemler ve sabitlerin bir araya toplandığı modüllerdir:
Örneğin standart kitaplıktaki Math modülü:
Math.sqrt(2) #1.41421 include Math
Math::PI #3.14159 sqrt(3)
65.
Mix-in
İkinci kullanım yolu ise mix-in tekniğidir,
module Trig
PI = 3.141592654
def Trig.sin(x)
# ..
end
def Trig.cos(x)
# ..
end
end
class Geo
include Trig
# ....
end
Modüller:
Mix-in:
66.
Tekil Metotlar
Bir örneğin davranışı mensup olduğu sınıf tarafından belirlenir,
Fakat bazen belirli bir örneğin özel bir davranışı olmasını isteyebiliriz...
Çözüm : Tekil (singleton) metotlar...
Tekil metotlar, genelde GUI tasarlarken değişik düğmelerin değişik eylemler yapması istendiği zaman kullanılır.
67.
Tekil Metotlar #2
def kisi1.konus
print “Selam”
end
kisi1= TekilOrnek.new
kisi1.konus
#Selam
class TekilOrnek
def konus
print “Merhaba”
end
end
kisi1= TekilOrnek.new
kisi1.konus
#Merhaba
kisi2= TekilOrnek.new
kisi2.konus
#Merhaba