SlideShare ist ein Scribd-Unternehmen logo
1 von 70

      
       
      
     
      
       Ruby Programlama Dili'nin  
       Temelleri 
      
     
      
       Pınar Yanardağ 
       [email_address] 
      
     
      
       INETD Seminerleri@IBM Linux 
       16.12.2006

      
       
      
     
      
       
      
     
      
       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)

      
       
      
     
      
       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...

      
       
      
     
      
       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.

      
       
      
     
      
       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.

      
       
      
     
      
       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.

      
       
      
     
      
       RUBY'nin GENEL ÖZELLİKLERİ

      
       
      
     
      
       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.

      
       
      
     
      
       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

      
       
      
     
      
       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.

      
       
      
     
      
       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"]

      
       
      
     
      
       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.

      
       
      
     
      
       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

      
       
      
     
      
       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...

      
       
      
     
      
       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...

      
       
      
     
      
       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,

      
       
      
     
      
       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 ...

      
       
      
     
      
       Yüksek trafikli web uygulamaları, 
       
       
       İşletim sistemi gerçekleştirimleri, 
       
       
       Derleyici gerçekleştirimleri... 
       
       
       
      
     
      
       Ruby hangi uygulamalar için uygun değil?

      
       
      
     
      
       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ü.

      
       
      
     
      
       
       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

      
       
      
     
      
       KARŞILAŞTIRMALAR

      
       
      
     
      
       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.

      
       
      
     
      
       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)

      
       
      
     
      
       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

      
       
      
     
      
       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

      
       
      
     
      
       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.

      
       
      
     
      
       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, ...

      
       
      
     
      
       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

      
       
      
     
      
       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...

      
       
      
     
      
       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ı,

      
       
      
     
      
       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

      
       
      
     
      
       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  :)

      
       
      
     
      
       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 ?

      
       
      
     
      
       KOD ÖRNEKLERİ

      
       
      
     
      
       Dizgeler (String'ler) 
      
     
      
       Tek, çift tırnak? 
       
       ifade=  "1 2 3 4 5 #{2*3} 7 8 9 10" 
       
       #  "1 2 3 4 5 6 7 8 9 10" 
       
       ifade=  '1 2 3 4 5 #{2*3} 7 8 9 10' 
       
       #  "1 2 3 4 5 {2*3} 7 8 9 10"

      
       
      
     
      
       Birleştirme işlemi, 
       
       sozcuk = " ozgur "+" yazilim " 
       
       #" ozgur yazilim " 
       
       Tekrarlatma işlemi, 
       
       sozcuk= sozcuk*2 
       
       #" ozgur  yazilim  ozgur  yazilim " 
      
     
      
       Dizgeler #2

      
       
      
     
      
       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

      
       
      
     
      
       
       Altdizge seçimi, 
       
       kelime=”ruby” 
       
       kelime[0..2] 
       #“rub” 
       
       kelime[0,1] 
       #“r” 
       
       kelime[-2,2] 
       #“by” 
       
       
      
     
      
       Dizgeler #4

      
       
      
     
      
       
      
     
      
       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"]

      
       
      
     
      
       Dizgeler #6 
      
     
      
       
      
     
      
       
       
       string = "ruby programlama dili" 
       
       print "cumlede gecen harfler: ", string.split('').uniq.sort, "" 
       
       #cumlede gecen harfler:  abdgilmopruy 
       
       ip_adresi= “192.168.0.1” 
       
       ip_adresi.split(“.”) 
       
       #["192", "168", "0", "1"] 
       
       
      
     
      
       
      
     
      
       
      
     
      
       Split metodu,

      
       
      
     
      
       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

      
       
      
     
      
       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"]

      
       
      
     
      
       Diziler #2 
      
     
      
       Ruby iç içe geçmiş dizileri destekler, 
       
       
       tek_boyutlu= ["bir", "iki", "uc"] 
       
       # ["bir", "iki", "uc"] 
       
       i ki_boyutlu= [“bir”, [“iki”, “iki bucuk”], “uc”] 
       
       # ["bir", ["iki", "iki bucuk"], "uc"] 
       
       
       tek_boyutla= [“bir”, [“iki”, “iki bucuk”], “uc”].flatten 
       
       # ["bir", "iki", "iki bucuk", "uc"]

      
       
      
     
      
       Dizideki elemanları listeleyelim, 
       
       dizi= ["pinar", "tulin", "ikbal"] 
       
       # nesneye yönelik tarzda : 
       
       dizi.each {|kisi| 
       
       puts "Hosgeldin #{kisi.capitalize!}!" 
       } 
       
       
       # fonksiyonel tarzda : 
       
       for kisi in dizi 
       
       puts "Hosgeldin #{kisi.capitalize!}!" 
       
       end 
      
     
      
       
       =begin 
       
       Hosgeldin Pinar! 
       Hosgeldin Tulin! 
       Hosgeldin ikbal! 
       
       =end 
      
     
      
       Diziler #3

      
       
      
     
      
       Ruby'de dizileri to_s metoduyla dizgeye, dizgeleri de to_a metoduyla diziye dönüştürebiliriz; 
       
       dizi = [“12”,21,”ruby”] 
       dizi.to_s 
       # "1221ruby" 
       
       join 
       
       dizge= dizi.join(“:”) 
       # “12:21:ruby” 
       
       dizge.to_a 
       # ["12:21:ruby"] 
       
       split 
       
       dizge.split(":") 
       # ["12", "21", "ruby"] 
       
      
     
      
       
      
     
      
       
      
     
      
       
      
     
      
       Diziler #3

      
       
      
     
      
       
      
     
      
       Hash'ler 
      
     
      
       yas = { "Pinar",21, 
       "Tulin",51, 
         "Ikbal",85  
       } 
       
       # {"Ikbal"=>85, "Tulin"=>51, "Pinar"=>21} 
       
       
       
       yas["Pinar"]  = 21 
       yas["Tulin"]  = 51 
       yas["Ikbal"]  = 85

      
       
      
     
      
       
      
     
      
       Hashler #2 
      
     
      
       Hash'e eleman ekleyelim:  hash[key] = value 
       
       yas["Ozgur"]= 22 
       #22 
       
       puts "Kisiler: ", yas.keys 
       
       =begin 
       
       Kisiler: 
       Ikbal 
       Ozgur 
       Tulin 
       Pinar 
       
       =end

      
       
      
     
      
       
      
     
      
       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

      
       
      
     
      
       
      
     
      
       Hashler #4 
      
     
      
       Eleman silmek? 
       
       yas.delete( "Pinar" ) 
       
       #{"Ikbal"=>85, "Ozgur"=>22, "Tulin"=>51} 
       
       
       Hash'i dolaşmak? 
       
       yas.each { |key, value| 
       
         puts "Isim: #{key}, Yas: #{value}" 
       } 
       
       =begin 
       Isim: Ikbal, Yas: 85 
       Isim: Ozgur, Yas: 22 
       Isim: Tulin, Yas: 51 
       =end

      
       
      
     
      
       
      
     
      
       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"]

      
       
      
     
      
       
      
     
      
       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

      
       
      
     
      
       
      
     
      
       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 &quot;Bu değil.&quot; #false 
       hex &quot;Belki bu? {0x35}&quot;  #false 
       hex &quot;Ya da bu? <0x38z7e>&quot;  #false 
       hex &quot;Tamam, bu: <0xfc0004>&quot; #true 
      
     
      
       Metodumuzu deneyelim:

      
       
      
     
      
       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 &quot;python ya da perl&quot; 
       
       when /ruby/ 
         print &quot;ruby! &quot; 
       
       end 
       
       
       
       # ruby!

      
       
      
     
      
       
      
     
      
       Denetim Yapıları #2 
      
     
      
       sayac = 0 
       
       while satir = gets 
       
       if satir =~ /Ruby/ 
       sayac += 1 
       end 
       
       end 
       
       puts &quot;#{sayac} Ruby satırı var&quot; 
      
     
      
       Girdi:  
       
       Bu birinci Ruby satırı 
       Bu ikinci 
       Bu da üçüncü Ruby satırı 
       ^D 
       
       Çıktı: 
       
       2 Ruby satırı var 
      
     
      
       
      
     
      
       While

      
       
      
     
      
       Denetim Yapıları #3 
      
     
      
       
      
     
      
       for i in [200,-3.6,&quot;ruby&quot;] 
       
       print &quot;#{i}(#{i.type})&quot; 
       
       end 
      
     
      
       =begin 
       
       200  (Fixnum) 
       -3.6  (Float) 
       ruby  (String) 
       
       =end 
      
     
      
       For,

      
       
      
     
      
       Yineleyiciler (iterasyonlar) 
      
     
      
       
      
     
      
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],
       ,[object Object],

      
       
      
     
      
       dizi =[200,-3.6,&quot;ruby&quot;] 
       
       for i in dizi 
       
         puts i 
       
       end 
       
       
       # 200 
       #-3.6 
       #ruby 
      
     
      
       Yineleyiciler #2 
      
     
      
       
      
     
      
       
      
     
      
       For yineleyicisi,

      
       
      
     
      
       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 &quot;ruby&quot; } 
       
       #ruby 
       #ruby 
       #ruby

      
       
      
     
      
       
      
     
      
       Dosya Erişimi 
      
     
      
       Dosya açma işlemleri: 
       
       
       dosya = File.new(&quot;/home/odev.txt&quot;, &quot;r&quot;)  
       
       # path'de belirttiğimiz dosyayı sadece okumak için açar, 
       
       dosya  = File.new(path, &quot;w&quot;)  
       
       # 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.

      
       
      
     
      
       
      
     
      
       Dosya Erişimi #2 
      
     
      
       passwd dosyasında kullanıcı adı hexa olan kullanıcının bilgilerini bulalım: 
       
       
       
       File.open(&quot;/etc/passwd&quot;).each { |line| 
       
         puts line if line =~ /hexa/ 
       } 
       
       #hexa:x:1001:1001::/home/hexa:/bin/bash

      
       
      
     
      
       
      
     
      
       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

      
       
      
     
      
       
      
     
      
       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...

      
       
      
     
      
       
      
     
      
       Miras #2 
      
     
      
       class Memeli 
       
       def nefes 
       print &quot;Nefes al, Nefes ver&quot; 
       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 &quot;Miyauvvvv&quot; 
       end 
       end 
      
     
      
       pisi = Kedi.new 
       
       pisi.nefes 
       #Nefes al, Nefes ver  
       pisi.konus 
       #Miyauvvvv

      
       
      
     
      
       
      
     
      
       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)

      
       
      
     
      
       
      
     
      
       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:

      
       
      
     
      
       
      
     
      
       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.

      
       
      
     
      
       
      
     
      
       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

      
       
      
     
      
       irb; Ruby ifadelerini stdin'den okuyarak anlık çalıştırmaya ve sonuçları görmenize yarayan bir araçtır; 
       
       moon@debian:~$ irb 
       irb(main):001:0> &quot;ruby &quot;*3 
       => &quot;ruby ruby ruby &quot; 
       irb(main):002:0> Fixnum.superclass 
       => Integer 
       irb(main):003:0> 10.methods 
       => [&quot;%&quot;, &quot;upto&quot;, &quot;<<&quot;, &quot;div&quot;, &quot;&&quot;, &quot;object_id&quot;, &quot;>>&quot;, &quot;times&quot;, &quot;singleton_methods&quot;, &quot;equal?&quot;, &quot;taint&quot;, &quot;id2name&quot;, &quot;*&quot;, &quot;succ&quot;, &quot;frozen?&quot;, &quot;instance_variable_get&quot;, &quot;+&quot;, &quot;kind_of?&quot;, &quot;round&quot;, &quot;to_a&quot;, &quot;respond_to?&quot;, &quot;-&quot;, &quot;divmod&quot;, &quot;integer?&quot;, &quot;chr&quot;, &quot;/&quot;, &quot;type&quot;, &quot;protected_methods&quot;, &quot;to_sym&quot;, &quot;|&quot;, &quot;eql?&quot;, &quot;instance_variable_set&quot;, &quot;~&quot;, &quot;hash&quot;, &quot;is_a?&quot;, &quot;truncate&quot;, &quot;between?&quot;, &quot;to_s&quot;, &quot;send&quot;, &quot;prec&quot;, &quot;modulo&quot;, &quot;singleton_method_added&quot;, &quot;class&quot;, &quot;size&quot;, &quot;zero?&quot;, &quot;tainted?&quot;, &quot;private_methods&quot;, &quot;__send__&quot;, &quot;^&quot;, &quot;untaint&quot;, &quot;+@&quot;, &quot;next&quot;, &quot;-@&quot;, &quot;id&quot;, &quot;**&quot;, &quot;step&quot;, &quot;to_i&quot;, &quot;<&quot;, &quot;inspect&quot;, &quot;<=>&quot;, &quot;method&quot;, &quot;instance_eval&quot;, &quot;==&quot;, &quot;prec_i&quot;, &quot;remainder&quot;, &quot;>&quot;, &quot;===&quot;, &quot;nonzero?&quot;, &quot;clone&quot;, &quot;public_methods&quot;, &quot;floor&quot;, &quot;extend&quot;, &quot;>=&quot;, &quot;<=&quot;, &quot;freeze&quot;, &quot;display&quot;, &quot;quo&quot;, &quot;downto&quot;, &quot;to_f&quot;, &quot;__id__&quot;, &quot;=~&quot;, &quot;methods&quot;, &quot;prec_f&quot;, &quot;abs&quot;, &quot;nil?&quot;, &quot;dup&quot;, &quot;to_int&quot;, &quot;coerce&quot;, &quot;instance_variables&quot;, &quot;[]&quot;, &quot;instance_of?&quot;, &quot;ceil&quot;] 
       
      
     
      
       irb

      
       
      
     
      
       http://docs.comu.edu.tr/howto/ruby-ug.html 
       
       http://www.ruby-doc.org/docs/ProgrammingRuby/ 
       
       http://pleac.sourceforge.net/pleac_ruby/ 
       
       http://www.ruby-lang.org/en/ 
       
       http://www.rubyist.net/~matz/slides/ 
       
       http://www.rubygarden.com/ruby?RealWorldRuby 
       
       http://pine.fm/LearnToProgram/ 
       
       http://www.tiobe.com/tpci.htm 
       
       Bu seminerin notlarını seminer.pinguar.org adresinden alabilirsiniz. 
      
     
      
       KAYNAKLAR

      
       
      
     
      
       Teşekkürler...

Weitere ähnliche Inhalte

Was ist angesagt?

BKK16-205 RDK-B IoT
BKK16-205 RDK-B IoTBKK16-205 RDK-B IoT
BKK16-205 RDK-B IoTLinaro
 
Discover Quarkus and GraalVM
Discover Quarkus and GraalVMDiscover Quarkus and GraalVM
Discover Quarkus and GraalVMRomain Schlick
 
Polygot Java EE on the GraalVM
Polygot Java EE on the GraalVMPolygot Java EE on the GraalVM
Polygot Java EE on the GraalVMRyan Cuprak
 
GraalVM: Run Programs Faster Everywhere
GraalVM: Run Programs Faster EverywhereGraalVM: Run Programs Faster Everywhere
GraalVM: Run Programs Faster EverywhereJ On The Beach
 
Driving containerd operations with gRPC
Driving containerd operations with gRPCDriving containerd operations with gRPC
Driving containerd operations with gRPCDocker, Inc.
 
Introduction to CI/CD
Introduction to CI/CDIntroduction to CI/CD
Introduction to CI/CDHoang Le
 
Building a Google Cloud Firestore API with dotnet core
Building a Google Cloud Firestore API with dotnet coreBuilding a Google Cloud Firestore API with dotnet core
Building a Google Cloud Firestore API with dotnet coreMike Melusky
 
오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기Nalee Jang
 
Designing APIs with OpenAPI Spec
Designing APIs with OpenAPI SpecDesigning APIs with OpenAPI Spec
Designing APIs with OpenAPI SpecAdam Paxton
 
DevOps at Amazon: A Look at Our Tools and Processes
DevOps at Amazon: A Look at Our Tools and ProcessesDevOps at Amazon: A Look at Our Tools and Processes
DevOps at Amazon: A Look at Our Tools and ProcessesAmazon Web Services
 
Developing RESTful Web APIs with Python, Flask and MongoDB
Developing RESTful Web APIs with Python, Flask and MongoDBDeveloping RESTful Web APIs with Python, Flask and MongoDB
Developing RESTful Web APIs with Python, Flask and MongoDBNicola Iarocci
 
Driving Pipeline Automation With Newman and the Postman API
Driving Pipeline Automation With Newman and the Postman APIDriving Pipeline Automation With Newman and the Postman API
Driving Pipeline Automation With Newman and the Postman APIPostman
 
Introduction to gRPC
Introduction to gRPCIntroduction to gRPC
Introduction to gRPCPrakash Divy
 
DevOps Taiwan Monitor Tools 大亂鬥 - Prometheus
DevOps Taiwan Monitor Tools 大亂鬥 - PrometheusDevOps Taiwan Monitor Tools 大亂鬥 - Prometheus
DevOps Taiwan Monitor Tools 大亂鬥 - PrometheusAdam Chen
 

Was ist angesagt? (20)

BKK16-205 RDK-B IoT
BKK16-205 RDK-B IoTBKK16-205 RDK-B IoT
BKK16-205 RDK-B IoT
 
Discover Quarkus and GraalVM
Discover Quarkus and GraalVMDiscover Quarkus and GraalVM
Discover Quarkus and GraalVM
 
Polygot Java EE on the GraalVM
Polygot Java EE on the GraalVMPolygot Java EE on the GraalVM
Polygot Java EE on the GraalVM
 
GraalVM: Run Programs Faster Everywhere
GraalVM: Run Programs Faster EverywhereGraalVM: Run Programs Faster Everywhere
GraalVM: Run Programs Faster Everywhere
 
Driving containerd operations with gRPC
Driving containerd operations with gRPCDriving containerd operations with gRPC
Driving containerd operations with gRPC
 
gRPC with java
gRPC with javagRPC with java
gRPC with java
 
Java Logging
Java LoggingJava Logging
Java Logging
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
Introduction to CI/CD
Introduction to CI/CDIntroduction to CI/CD
Introduction to CI/CD
 
Building a Google Cloud Firestore API with dotnet core
Building a Google Cloud Firestore API with dotnet coreBuilding a Google Cloud Firestore API with dotnet core
Building a Google Cloud Firestore API with dotnet core
 
오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기
 
Designing APIs with OpenAPI Spec
Designing APIs with OpenAPI SpecDesigning APIs with OpenAPI Spec
Designing APIs with OpenAPI Spec
 
DevOps at Amazon: A Look at Our Tools and Processes
DevOps at Amazon: A Look at Our Tools and ProcessesDevOps at Amazon: A Look at Our Tools and Processes
DevOps at Amazon: A Look at Our Tools and Processes
 
Developing RESTful Web APIs with Python, Flask and MongoDB
Developing RESTful Web APIs with Python, Flask and MongoDBDeveloping RESTful Web APIs with Python, Flask and MongoDB
Developing RESTful Web APIs with Python, Flask and MongoDB
 
gRPC
gRPCgRPC
gRPC
 
Driving Pipeline Automation With Newman and the Postman API
Driving Pipeline Automation With Newman and the Postman APIDriving Pipeline Automation With Newman and the Postman API
Driving Pipeline Automation With Newman and the Postman API
 
Introduction to gRPC
Introduction to gRPCIntroduction to gRPC
Introduction to gRPC
 
Dart Programming.pptx
Dart Programming.pptxDart Programming.pptx
Dart Programming.pptx
 
Inside pc tower
Inside pc towerInside pc tower
Inside pc tower
 
DevOps Taiwan Monitor Tools 大亂鬥 - Prometheus
DevOps Taiwan Monitor Tools 大亂鬥 - PrometheusDevOps Taiwan Monitor Tools 大亂鬥 - Prometheus
DevOps Taiwan Monitor Tools 大亂鬥 - Prometheus
 

Andere mochten auch

Ruby - Dünyanın En Güzel Programlama Dili
Ruby - Dünyanın En Güzel Programlama DiliRuby - Dünyanın En Güzel Programlama Dili
Ruby - Dünyanın En Güzel Programlama DiliSerdar Dogruyol
 
Ruby ve GTK Kullanarak Arayuz Tasarlamak
Ruby ve GTK Kullanarak Arayuz TasarlamakRuby ve GTK Kullanarak Arayuz Tasarlamak
Ruby ve GTK Kullanarak Arayuz Tasarlamakpinguar
 
Ozgur Yazilimm Belgelerinin Yerellestirme Sureci
Ozgur Yazilimm Belgelerinin Yerellestirme SureciOzgur Yazilimm Belgelerinin Yerellestirme Sureci
Ozgur Yazilimm Belgelerinin Yerellestirme Surecipinguar
 
Kadinlar ve Linux
Kadinlar ve LinuxKadinlar ve Linux
Kadinlar ve Linuxpinguar
 
Pardus ve Yenilikleri
Pardus ve YenilikleriPardus ve Yenilikleri
Pardus ve Yenilikleripinguar
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentationadamcookeuk
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 

Andere mochten auch (9)

Ruby - Dünyanın En Güzel Programlama Dili
Ruby - Dünyanın En Güzel Programlama DiliRuby - Dünyanın En Güzel Programlama Dili
Ruby - Dünyanın En Güzel Programlama Dili
 
Ruby ve GTK Kullanarak Arayuz Tasarlamak
Ruby ve GTK Kullanarak Arayuz TasarlamakRuby ve GTK Kullanarak Arayuz Tasarlamak
Ruby ve GTK Kullanarak Arayuz Tasarlamak
 
Ozgur Yazilimm Belgelerinin Yerellestirme Sureci
Ozgur Yazilimm Belgelerinin Yerellestirme SureciOzgur Yazilimm Belgelerinin Yerellestirme Sureci
Ozgur Yazilimm Belgelerinin Yerellestirme Sureci
 
Kadinlar ve Linux
Kadinlar ve LinuxKadinlar ve Linux
Kadinlar ve Linux
 
Pardus ve Yenilikleri
Pardus ve YenilikleriPardus ve Yenilikleri
Pardus ve Yenilikleri
 
Ruby on Rails for beginners
Ruby on Rails for beginnersRuby on Rails for beginners
Ruby on Rails for beginners
 
Turkce
TurkceTurkce
Turkce
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentation
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 

Ruby Programlama Dili'nin Temelleri

  • 1. Ruby Programlama Dili'nin Temelleri Pınar Yanardağ [email_address] INETD Seminerleri@IBM Linux 16.12.2006
  • 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 &quot;We *love* Ruby!&quot; } 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| &quot;http://www.&quot; + engine.downcase + &quot;.com&quot; end [&quot; http://www.google.com &quot;, &quot;http://www.yahoo.com&quot;, &quot;http://www.msn.com&quot;]
  • 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 ?
  • 34. KOD ÖRNEKLERİ
  • 35. Dizgeler (String'ler) Tek, çift tırnak? ifade= &quot;1 2 3 4 5 #{2*3} 7 8 9 10&quot; # &quot;1 2 3 4 5 6 7 8 9 10&quot; ifade= '1 2 3 4 5 #{2*3} 7 8 9 10' # &quot;1 2 3 4 5 {2*3} 7 8 9 10&quot;
  • 36. Birleştirme işlemi, sozcuk = &quot; ozgur &quot;+&quot; yazilim &quot; #&quot; ozgur yazilim &quot; Tekrarlatma işlemi, sozcuk= sozcuk*2 #&quot; ozgur yazilim ozgur yazilim &quot; Dizgeler #2
  • 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
  • 38. Altdizge seçimi, kelime=”ruby” kelime[0..2] #“rub” kelime[0,1] #“r” kelime[-2,2] #“by” Dizgeler #4
  • 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) #[&quot;Kestane&quot;, &quot;Gurgen&quot;, &quot;Palamut&quot;] x, y, z = y, z, x #[&quot;Gurgen&quot;, &quot;Palamut&quot;, &quot;Kestane&quot;]
  • 40. Dizgeler #6 string = &quot;ruby programlama dili&quot; print &quot;cumlede gecen harfler: &quot;, string.split('').uniq.sort, &quot;&quot; #cumlede gecen harfler: abdgilmopruy ip_adresi= “192.168.0.1” ip_adresi.split(“.”) #[&quot;192&quot;, &quot;168&quot;, &quot;0&quot;, &quot;1&quot;] Split metodu,
  • 41. Bir cümleyi tersine çevirelim, cumle=”ruby programlama dili” ters_byte = cumle.reverse # &quot;ilid amalmargorp ybur&quot; ters_kelime = cumle.split(&quot; &quot;).reverse.join(&quot; &quot;) # &quot;dili programlama ruby&quot; Büyük harf, küçük harf dönüşümleri, x = &quot;ruby on rails&quot;.upcase # &quot;RUBY ON RAiLS&quot; x.downcase! # &quot;ruby on rails&quot; x.capitalize! # &quot;Ruby on rails&quot; Dizgeler #7
  • 42. Diziler Ruby'de dizilere farklı türden nesneler atayabilirsiniz, dizi=[1.9,3,&quot;ruby&quot;] # [1.9,3, &quot;ruby&quot;] Dizileri de , aynı dizgeler gibi birleştirebilir, ya da tekrar ettirebilirsiniz, dizi + [“programlama”, “dili”] # [1.9,3, &quot;ruby&quot;,&quot;programlama&quot;, &quot;dili&quot;] dizi*2 # [1.9,3, &quot;ruby&quot;,1.9,3,&quot;ruby&quot;]
  • 43. Diziler #2 Ruby iç içe geçmiş dizileri destekler, tek_boyutlu= [&quot;bir&quot;, &quot;iki&quot;, &quot;uc&quot;] # [&quot;bir&quot;, &quot;iki&quot;, &quot;uc&quot;] i ki_boyutlu= [“bir”, [“iki”, “iki bucuk”], “uc”] # [&quot;bir&quot;, [&quot;iki&quot;, &quot;iki bucuk&quot;], &quot;uc&quot;] tek_boyutla= [“bir”, [“iki”, “iki bucuk”], “uc”].flatten # [&quot;bir&quot;, &quot;iki&quot;, &quot;iki bucuk&quot;, &quot;uc&quot;]
  • 44. Dizideki elemanları listeleyelim, dizi= [&quot;pinar&quot;, &quot;tulin&quot;, &quot;ikbal&quot;] # nesneye yönelik tarzda : dizi.each {|kisi| puts &quot;Hosgeldin #{kisi.capitalize!}!&quot; } # fonksiyonel tarzda : for kisi in dizi puts &quot;Hosgeldin #{kisi.capitalize!}!&quot; end =begin Hosgeldin Pinar! Hosgeldin Tulin! Hosgeldin ikbal! =end Diziler #3
  • 45. Ruby'de dizileri to_s metoduyla dizgeye, dizgeleri de to_a metoduyla diziye dönüştürebiliriz; dizi = [“12”,21,”ruby”] dizi.to_s # &quot;1221ruby&quot; join dizge= dizi.join(“:”) # “12:21:ruby” dizge.to_a # [&quot;12:21:ruby&quot;] split dizge.split(&quot;:&quot;) # [&quot;12&quot;, &quot;21&quot;, &quot;ruby&quot;] Diziler #3
  • 46. Hash'ler yas = { &quot;Pinar&quot;,21, &quot;Tulin&quot;,51, &quot;Ikbal&quot;,85 } # {&quot;Ikbal&quot;=>85, &quot;Tulin&quot;=>51, &quot;Pinar&quot;=>21} yas[&quot;Pinar&quot;] = 21 yas[&quot;Tulin&quot;] = 51 yas[&quot;Ikbal&quot;] = 85
  • 47. Hashler #2 Hash'e eleman ekleyelim: hash[key] = value yas[&quot;Ozgur&quot;]= 22 #22 puts &quot;Kisiler: &quot;, yas.keys =begin Kisiler: Ikbal Ozgur Tulin Pinar =end
  • 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...! [ &quot;Figen&quot;, &quot;Sule&quot; ].each { |name| print name, &quot; ailenin &quot;, yas.has_key?(name) ? &quot;bir ferdidir&quot; : &quot;bir ferdi degildir&quot;, &quot;&quot; } #Figen ailenin bir ferdi degildir #Sule ailenin bir ferdi degildir
  • 49. Hashler #4 Eleman silmek? yas.delete( &quot;Pinar&quot; ) #{&quot;Ikbal&quot;=>85, &quot;Ozgur&quot;=>22, &quot;Tulin&quot;=>51} Hash'i dolaşmak? yas.each { |key, value| puts &quot;Isim: #{key}, Yas: #{value}&quot; } =begin Isim: Ikbal, Yas: 85 Isim: Ozgur, Yas: 22 Isim: Tulin, Yas: 51 =end
  • 50. Hashler #5 İki hash'de aynı olan ya da farklı olan anahtarları nasıl tespit ederiz? ogr_no={“Pinar”, 30401012, “Figen”, 40401022} #{&quot;Figen&quot;=>40401022, &quot;Pinar&quot;=>30401012} İkisinde de var olan anahtarlar? genel= yas.keys & ogr_no.keys #[&quot;Pinar&quot;] Birinci hash'de olup da ikincisinde olmayan anahtarlar? farkli= yas.keys - ogr_no.keys # [&quot;Ikbal&quot;, &quot;Ozgur&quot;, &quot;Tulin&quot;]
  • 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 = &quot;ruby programlama dili&quot; 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 &quot;Bu değil.&quot; #false hex &quot;Belki bu? {0x35}&quot; #false hex &quot;Ya da bu? <0x38z7e>&quot; #false hex &quot;Tamam, bu: <0xfc0004>&quot; #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 &quot;python ya da perl&quot; when /ruby/ print &quot;ruby! &quot; end # ruby!
  • 54. Denetim Yapıları #2 sayac = 0 while satir = gets if satir =~ /Ruby/ sayac += 1 end end puts &quot;#{sayac} Ruby satırı var&quot; 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,&quot;ruby&quot;] print &quot;#{i}(#{i.type})&quot; end =begin 200 (Fixnum) -3.6 (Float) ruby (String) =end For,
  • 56.
  • 57. dizi =[200,-3.6,&quot;ruby&quot;] 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 &quot;ruby&quot; } #ruby #ruby #ruby
  • 59. Dosya Erişimi Dosya açma işlemleri: dosya = File.new(&quot;/home/odev.txt&quot;, &quot;r&quot;) # path'de belirttiğimiz dosyayı sadece okumak için açar, dosya = File.new(path, &quot;w&quot;) # 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(&quot;/etc/passwd&quot;).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 &quot;Nefes al, Nefes ver&quot; 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 &quot;Miyauvvvv&quot; 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
  • 68. irb; Ruby ifadelerini stdin'den okuyarak anlık çalıştırmaya ve sonuçları görmenize yarayan bir araçtır; moon@debian:~$ irb irb(main):001:0> &quot;ruby &quot;*3 => &quot;ruby ruby ruby &quot; irb(main):002:0> Fixnum.superclass => Integer irb(main):003:0> 10.methods => [&quot;%&quot;, &quot;upto&quot;, &quot;<<&quot;, &quot;div&quot;, &quot;&&quot;, &quot;object_id&quot;, &quot;>>&quot;, &quot;times&quot;, &quot;singleton_methods&quot;, &quot;equal?&quot;, &quot;taint&quot;, &quot;id2name&quot;, &quot;*&quot;, &quot;succ&quot;, &quot;frozen?&quot;, &quot;instance_variable_get&quot;, &quot;+&quot;, &quot;kind_of?&quot;, &quot;round&quot;, &quot;to_a&quot;, &quot;respond_to?&quot;, &quot;-&quot;, &quot;divmod&quot;, &quot;integer?&quot;, &quot;chr&quot;, &quot;/&quot;, &quot;type&quot;, &quot;protected_methods&quot;, &quot;to_sym&quot;, &quot;|&quot;, &quot;eql?&quot;, &quot;instance_variable_set&quot;, &quot;~&quot;, &quot;hash&quot;, &quot;is_a?&quot;, &quot;truncate&quot;, &quot;between?&quot;, &quot;to_s&quot;, &quot;send&quot;, &quot;prec&quot;, &quot;modulo&quot;, &quot;singleton_method_added&quot;, &quot;class&quot;, &quot;size&quot;, &quot;zero?&quot;, &quot;tainted?&quot;, &quot;private_methods&quot;, &quot;__send__&quot;, &quot;^&quot;, &quot;untaint&quot;, &quot;+@&quot;, &quot;next&quot;, &quot;-@&quot;, &quot;id&quot;, &quot;**&quot;, &quot;step&quot;, &quot;to_i&quot;, &quot;<&quot;, &quot;inspect&quot;, &quot;<=>&quot;, &quot;method&quot;, &quot;instance_eval&quot;, &quot;==&quot;, &quot;prec_i&quot;, &quot;remainder&quot;, &quot;>&quot;, &quot;===&quot;, &quot;nonzero?&quot;, &quot;clone&quot;, &quot;public_methods&quot;, &quot;floor&quot;, &quot;extend&quot;, &quot;>=&quot;, &quot;<=&quot;, &quot;freeze&quot;, &quot;display&quot;, &quot;quo&quot;, &quot;downto&quot;, &quot;to_f&quot;, &quot;__id__&quot;, &quot;=~&quot;, &quot;methods&quot;, &quot;prec_f&quot;, &quot;abs&quot;, &quot;nil?&quot;, &quot;dup&quot;, &quot;to_int&quot;, &quot;coerce&quot;, &quot;instance_variables&quot;, &quot;[]&quot;, &quot;instance_of?&quot;, &quot;ceil&quot;] irb
  • 69. http://docs.comu.edu.tr/howto/ruby-ug.html http://www.ruby-doc.org/docs/ProgrammingRuby/ http://pleac.sourceforge.net/pleac_ruby/ http://www.ruby-lang.org/en/ http://www.rubyist.net/~matz/slides/ http://www.rubygarden.com/ruby?RealWorldRuby http://pine.fm/LearnToProgram/ http://www.tiobe.com/tpci.htm Bu seminerin notlarını seminer.pinguar.org adresinden alabilirsiniz. KAYNAKLAR
  • 70. Teşekkürler...