Ruby Günlüğü – Gün 8

Düzenli İfadeler ve String İşlemleri

* Regular Expressions konusu aslında oldukça detaylı bir konu, ama dilden dile çok fazla fark göstermiyor, örneğin Php’de ilk iki karakteri kastetmek istediğimizde %.2a (a burada temsili ifade) kullanıyoruz. Ruby’de ise, “^..” kullanıyoruz.

Ruby düzenli ifadeler kullanımı konusunda Perl’e çok benziyor ve NFA eşleştirmesini kullanıyor.

Bu düzenli ifadeler nerede işimize yarar, açıkcası bende bir proje üzerinde çalışırken önemini anlamıştım. Bir kullanıcı adı ve şifre girişi düşünün, kullanıcı adı olarak öğrenci numarası kullanılacak ve okulumun öğrenci numaraları 8 haneli. İlk 2 hane okula giriş yılını temsil ediyor, kullanıcı adında bunu kontrol ettirip, öğrenci olmayanların girmesine bir ölçüde engel olmalıyız, hangi kontroller lazım ;

* Kullanıcı adı 8 haneli ve integer olmak zorunda.

* Sadece 2008’den bugüne olan öğrenciler girsin, yani öğrenci numarasının ilk 2 karakteri 08-09 ve 10 olabilir.

İşte burada tam olarak düzenli ifade kullanarak kontrol ettirdik.

Her Eve Lazım Eegular Expression Tablosu :

Daha Detaylı Bir Regular Expression Tablosu

Örnekle başlayayım ;

Bu örnekte String sınıfının “sub” metodu ile, bir çeşit atama yaptık. Atamadan kasıt değişken atamaları gibi değil, bir string parçasını (aslında onun adı parametre), diğerine atadık. ‘hat’ yerine ‘ser’ yazdıracaktır bu kod ve sonuç; serser olacak.

“sub” metodu tek bir işlem yapar, yani şöyle bir örnek ;

Burada a parametresini, boş parametreye atadık, bütün “a” harflerinin boş karakterle değiştirileceğini sanıyoruz, oysa ki çalıştırınca yalnızca ilk “a” karakteri boş karakterle değişecek ve sonuç “Mustfa Serhat” olacak.

Multiple atama işlemi için “sub” yerine “gsub” metodunu kullanmalıyız.

Şimdi sonuç “Mustf Serht” olacak.

“Mustafa Serhat” stringinin ilk dört harfini “böte” olarak değiştirmek istersek, yukarıda bahsettiğim ifadeleri kullanmak gerekir.

Sonuç “boteafa Serhat” olacaktır.

^ karakteri, düzenli ifadenin, çalışmaya stringin başından başlayacağını söyler. Sondan bu işlemi yapmak istersek $ sembolünü kullanmalıyız.

Sonuç “Mustafa Sebote” olacak.

Bu karakterler karmaşık ve hatırda tutması zor karakterler olduğundan, \A ve \Z karakterleri daha elverişlidir.

Aynı örnekler ;

Aynı sonuçları verecekler.

Düzenli İfadeler ile String Iteration

Daha önce sayma işlemi için iteratör kullanmıştık, bunu regular expressions ile stringler üzerinde de yapabiliyoruz ;

Burada stringin her bir harfini tarattık ve tarama sonuçlarını x’e pass ettik ve ekrana bastırdık.

String sınıfının “scan” metodu, ona verdiğimiz düzenli ifadeye uyan herşeyi x’e yolladı. Sonrada ekrana bastırdık zaten.

Eğer ekrana 2 karakter grubu halinde bastırmak isteseydik? Çok basit, o zaman 2 nokta koyarız. (Veya nokta yerine hangi regular expression koyacaksak, ondan iki tane)

İlk başta paylaştığım tabloyu kullanarak, string içerisinden integerları çıkartıp ekrana bastıralım ;

Burada ki “+” sembolü ile, rakamları mümkün olduğu kadar tek satırda bastırmaya çalış dedik. “+” sembolü kullanmasaydık, bütün rakamlar tek tek ve alt alta bastırılacaktı.

Bu uzun cümlede ki sesli harfleri ayıralım :

Bu cümlede yer alan harflerden sadece a’dan g’ye kadar olanları alalım :

Eşleştirme

“=~” operatörü eşleştirme görevi yapar. Basit bir örnek ;

Bu ifade eğer karmaşık gelirse, String sınıfının bir metodu olan “match”i kullanabilirsiniz. O da şöyle olurdu ;

Şimdi sıra dizilerde.

Görüşmek üzere.

Ruby Günlüğü – Gün 7

Sabitler

Daha önce söylemiştim, Ruby case-sensitive bir dildir. Hemde Ruby’de bu büyük-küçük harf olayı arka planda çok farklı anlamlar doğurabiliyor. Şöyle görelim :

Pi = 2 dedik ve ekrana bastırdı, daha sonra Pi=200 dedik, yine ekrana bastırdı ama bi uyarı verdi “already initialized constant Pi” yani demek oluyor ki, “eyy yazılımcı daha önceden Pi sabitine başka bir değer vermiştin”.

Yazılımcı olarak bizde diyoruz ki “ama ben onun sabit olduğunu söylemedim ki sana?”, Ruby de hemen yapıştırıyor cevabı “o zaman niye büyük harfle başladın arkadaşım !”.

Değişken için denedik (x) olarak herhangi bir hata almadık. Aslında ismi “sabit” olmasına rağmen onuda değiştirebiliyoruz, ama Ruby’den bu uyarıyı alarak. İnanmadık ve birde Xi sabiti oluşturduk, evet demek ki Ruby’de işler böyle yürüyormuş.

Bir değişken tanımlamasında, ilk harfi büyük yaparsak, o artık bir değişken türü olan “sabitler”e dahil oluyormuş.

Daha önce sınıflarıda böyle tanımladığımızı hatırlayın! Baş harfleri büyüktü. Sınıflarda, programın sabitleri sayılabilir.

Text ve Stringler

Şimdi Ruby’ye dönmeden önce, söylemek isterim ki, daha önce okuduğum bir Python3 kitabında “String” konusu tam 200 sayfa boyunca anlatılmıştı, yani aslında çok önemli bir konu, ama bu kadarda sıkmaması lazım değil mi 🙂

Program içerinde string kullanmanın birçok yolu var, ancak çoklu satırda string kullanımı için Python’da 3 tane çift tırnak kullanıyorduk açılış ve kapanış için. Ruby’de ise bunu “%q” ile yapmaktayız, bir nevi kaçış ifadesi.

Burada %q’nun kaçınılmaz olduğunu bilmemiz gerekir, bunu kullanmalıyız ancak { } ifadeleri tamamen bizim isteğimize kalmış.

Açılış ve kapanışı ifade eden herhangi başka birşey de kullanılabilir.

veya

veya

Artık nasıl hoşunuza giderse.

Burada dikkat edilmesi gereken şey şu, açılış ve kapanış için yazıda kullanmayacağız bir karakter seçmeniz ! Bu çok önemli, yoksa Ruby doğal olarak sizin nerede bu string dizisiniz kapattığınız anlayamaz, o da şöyle ki ;

Doğal olarak hata verecektir.

%q’ya alternatif olarak birde “<<herhangi_birsey” var. Kullanım aynı;

String Karşılaştırma

Stringleri de rakamlarda olduğu gibi “< ve >” gibi ifadelerle karşılaştırabiliyoruz.

Peki neye göre yapılıyor bu karşılaştırma? ASCII değerlerine göre.

Bir stringin ASCII değerini görmek için başına “?” koymamız yeterli.

Şu adreste daha detaylı açıklamada var ; http://en.wikipedia.org/wiki/ASCII

Hep dedim yine diyorum, bir IDE kullanın ! IDE kullanmamak, bilgisayar dersinde daktiloyla not tutmaya benziyor. Çalışır, sorun vermez ama aptalca.

Interpolation

En kısa tabiriyle, string içine ifade gömme işlemine Ruby’de “interpolation” deniyor.

Şu vakte kadar yazdığımız programlarda, değişkenleri tanımladık, çeşitli işlemler yaptırdık ve ekrana bastırdık.

Ama günü-birlik kod yazmaktan öte geçmedik, yazdığımız kod kullanıcı dostu değildi ve tam olarak işlerin nasıl yürüdüğünü anlamak güçtü. Şimdi bu sorunu çözelim.

x = 20 ve y = 30 olsun. Bunları tanımladık, ekrana da 20 + 30 = 50 yazdırmak istiyoruz. Şuana kadar öğrendiklerimizle bunu nasıl yaparız ?

Kötü kod yazmaya en güzel örnek oldu sanırım. Burada bir virgülün yanlış yazılması veya bir ” işaretinin eksik olması hata verdirecek.

Tabi ki tek çare bu değil, rakamları stringe çeviripte kullanada bilirdik. O da oldukça zahmetli ;

Oysa ki Ruby’de şöyle güzel imkanlar var ;

Bu örnekler de, integerları ve aritmetik ifadeyi, string içine interpolate ettik.

Stringleri – string içine de interpolate edebiliyoruz :

Akıllıca bir örnek vardı kitapta, paylaşayım ;

Bir sonra ki gün, uzun uzun düzenli ifadeler hakkında yazacağım, görüşmek üzere.

Ruby Günlüğü – Gün 6

Şu aralar günlüğü biraz boşlamıştım açıkcası, farklı projeler içerisine girip Ruby’yi biraz unuttum, ama bugün bulduğum mis gibi bir kitapla tekrar kaldığım yerden devam ediyorum. Her programcının elinin altında bulunması gereken türden bir kitap ;

Regular Expression Pocket Reference: Regular Expressions for Perl, Ruby, PHP, Python, C, Java and .NET

Şuradan : http://www.amazon.com/Regular-Expression-Pocket-Reference-Expressions/dp/0596514271/ref=dp_ob_title_bk/188-1156418-0492525

En son değişkenler ve bazı koşullu ifadeler hakkında biraz yazmıştım. Şimdi sıra basit döngülerde.

Döngüler

Eğer programımız aynı işlemi tekrarlar halinde birden çok yapacaksa, bunu manuel olarak yapmamız oldukça meşakkatli olacaktır. Bunun çözümü ise döngü kurmaktan geçer.

Ruby’nin İngilizce bildiğiniz söylediğim konuda bir örnek yazmıştım;

Bu kod ekrana 5 kez “serhat” yazdırıp, işlemini tamamlıyordu.

Burada do ve end kullanmak yerine süslü parantezlerde kullanabiliriz. Genelde Ruby programcıları tek satırlık ifadeler için do ve end kullanmazlar, bunun yerine süslü parantezler kullanırlar ;

Bu yazım tarzı kodun daha okunur olmasını sağlamakta.

Ruby’de döngü kurmal için “iterator” ismini verdiğimiz bir yapı bulunmakta. Iterator’a Türkçe’de “tekrarlayıcı” diyebiliriz veya bu anlamı doğuracak herhangi bir şey..

Şuana kadar FixNum sınıfının bir metodu olan “times”ı görmüştük. Şimdi “upto”, “downto” ve “step” gibi metodları yani fonksiyonları göreceğiz.

Aslında kod çok açık, hatta şu noktada meraklı bir programcı adayı, hemen benim yaptığım gibi IDE’yi açıp bi sonuç görmek ister. O anda farklı birşeyle karşılaşır !

1’den 5’e kadar sayar. Ve her sayışta ekrana bir tane “serhat” yazdırır. Yani toplamda 5 tane “serhat” yazdırılır.

10’dan 3’e kadar geri geri sayar. Ve her sayışta ekrana bir tane “serhat” yazdırır. Yani toplamda 8 tane “serhat” yazdırılır.

0’dan 50’ye 5’er 5’er sayar. Ve her sayışta ekrana bir tane “serhat” yazdırır. Yani toplamda 11 tane “serhat” yazdırılır.

Peki ya ekrana, sayma işleminde geçilen adımları bastırmak istersek? Aslında demin IDE’nin bize söylediği tam olarak buydu ;

Bu snippet ise ekrana 1,2,3,4,5 bastıracaktır.

Bu kod parçasını daha açıklayıcı olacak şekilde şöyle de yazabilirdik ;

Küsürlü Sayılar (Floats)

Burada ki birçok şey Python programcılarına tanıdık gelecek.

Çünkü integer/integer = integer’dır.

Çünkü float/integer = float

integer/float = float

float/float = float

Şimdi rakamları kendimiz girersek sorun yok, bir şekilde integer veya float olarak belirtebiliyoruz, fakat rakamları kullanıcıdan alacak olursak sorun olacaktır.

O halde ne yapmak gerekir ?

Integer’lar için “to_f” isimli bir metodumuz var, Fixnum sınıfının bir built-in metodu.

Tam tersi olan Float’lar için ise “to_i” isminde bir metodumuz var, o da Fixnum’un bir metodu.

hepsi bu kadar.

Hatta bugünlük de bu kadar.

Ruby Günlüğü – Gün 5

Kaldığımız yerden devam edelim.

Ruby ve Değişkenler (Variables)

En son Ruby’de nesne mantığını iyice kavramıştım ve öğrendiklerimi buraya not etmiştim. Bugün biraz değişkenler hakkında not tutacağım.

Değişkenler; stringler, integerlar ve bilumum her türlü veriyi atayabileceğimiz yer tutuculardır. Yapılan atama işleminden sonra bellek içerisinde kendilerine yer edinirler ve çağırıldıkları taktirde kolayca kullanılabilirler.

Örneğin burada serhat isimli bir değişken yarattık ve ona 2011 değerini atadık. Daha sonra onu yazdırdığımızda 2011 sonucunu alacağız.

Her dilde olduğu gibi Ruby içinde bazı değişken tanımlama kuralları var.

  • Değişkenler tek parçalı olmalıdır yani diyebiliriz ki değişken isimleri tanımlarken sözcük parçaları veya heceler arasında boşluk olmamalıdır.
  1. serhatdundar
  2. serhat2011dundar
  3. serhat11dundar33
  4. serhat dundar
  • Değişkenler yalnızca alfabe karakterleri ile veya alt çizgi ile başlayabilirler. Örnekler ;
  1. SerhatDundar
  2. serhatdundar
  3. _serhat
  4. 1serhat
  5. 7fx3dsmax
  • Değişken isimleri yalnızca; rakamlar – alfabe karakterleri ve simgelerden ise alt çizgiyi içerebilirler.
  1. !serhatçokyaşa
  2. _büyükadamsınvesselam
  3. ruby_guzel_bir_dil_sene_2011_
  4. ah_ruby_vah_ruby_sen_neymissin_be_abi?
  • Değişkenler case-sensitive’dir. Yani büyük-küçük harf değişken tanımlarken önemlidir.
  • Değişken isimlerinde Türkçe karakter kullanabilirsiniz, ancak kullanmanızı tavsiye etmem. Neden mi? Konuyu dağıtmayalım, buna sonra değiniriz.

Basit bir değişkenler örneği yapalım;

“sene” değişkenimiz 2011 değerini tutuyor, “olumyili” değişkeni ise 1938 değerini tutuyor. “fark” değişkeni ise “sene” değişkeninden “olumyili” değişkenini çıkartıyor. Daha sonra ekrana bastırıyoruz.

Kötü Programcılık

Bir örnek daha;

Bu kod parçası sorunsuz çalışacaktır, ancak kötü programcılığa güzel bir örnektir.

Hata 1 : Gereksiz olduğu halde değişken tanımlamak ! Programın hantallaşması için gayet geçerli bir sebep.

Hata nerede? “z” değişkeni bu program içerisinde gereksiz bir şekilde tanımlandı. Oysa ki kodumuz şu şekilde olmalıydı ;

Hata 2 : Kodumuzu gereksiz bir şekilde uzattık, kısatmalardan yararlanmadık. Oysa ki kodumuz şu şekilde olabilirdi ;

Birçok dilde bu şekilde aritmetik kısatlama ifadeleri bulunur. Python’da buna bir örnektir. += ifadesini diğer aritmetik ifadeler içinde değiştirebilirsiniz -=, *=, /= gibi.

“x += y” nin anlamı, y’yi alıp x’e eklemektir.

Karşılaştırma İfadeleri ve Operatörleri

Mantık sahibi olmayan bir program, hesap makinasından farksızdır. Programlarımıza mantıklı düşünme imkanı sunmak için karşılaştırma operatörleri kullanırız.

Örnek 1 :

Şimdi burada durup bir inceleme yapalım. Eğer klasik yazım stillerine alışkın iseniz bu örnek size biraz garip gelmiş olmalı ? Öncelikle puts yani ekrana yazdırma komutu çağırıyoruz, daha sonrasında şart ifadesini kuruyoruz? Ancak denediğimizde örnek çalışıyor. Nasıl yani?

Şöyle yazsak daha doğru olmaz mı?

Bu noktada bir IDE kullanmanın önemini bir kez daha görüyoruz. Netbeans IDE hemen bana önerisini yaptı !

Yapılacak olan değişikliği de görebiliriz :

Fazla inat etmeden, IDE’nin lafını dinliyoruz.

Birde çift şartlı ifade örneği yapalım :

Burada ki “&&” ifadesinin anlamı aslında bildiğimiz “and”le özdeştir. Bu ifadeyi kaldırıp yerine “and” yazmanız durumunda değişen birşey olmayacaktır, ancak kısaltmalar iyidir demiştik.

Kodun Türkçe meali ise “Eğer x, 20’den küçük ve sıfırdan büyük ise ekrana “çok ufak bir rakam” yazdır.” olacak.

Bir başka deyişle, “Eğer x 0 ile 20 arasında bir değer ise ekrana “çok ufak bir rakam” yazdır.” olacak.

Sorulması gereken güzel soru : Peki işleri tersten yapmak istersek? “Değil” ifadesi nedir?

Aslında oldukça basit “unless” ifadesi ile bunu sağlayabiliriz.

“unless” ifadesini “if not” olarak düşünebiliriz.

Bu yöntem biraz tehlikeli.. Neden mi, buna şimdi değinmeyelim, ama tehlikeli olduğunu bilin.

Ruby’de “arada olma” durumu için güzel bir fonksiyon bulunmakta.

Bu metodun adı “between?”. Evet sonda ki soru işaretini yanlışlıkla yazmadım, ismi “between?”

Eşitlik (equality) durumu ise aynı Python’da olduğu gibi “==” ile kontrol edilir.

Atama (assignment) için ise sadece bir tane eşittir işareti kullanırız. “=”.

Eşit olmama durumu ise yine Python’da olduğu gibi != ile kontrol edilir.

Bir de <=> ifadesi var, buna da kısaca göz atalım. x<=> y için ;

x ve y eşit ise 0 değerini döndürür, x daha büyük ise 1 değerini, y daha büyük ise -1 değerini döndürür.

|| ifadesi ile iki ayrık durumu denetletebiliriz, yani bu sefer arada olma gibi bir zorunluluk yok, örnekte daha anlaşılır olacak.

Çoklu kontrol işlemlerini parantezler ile sınıflandırabiliriz;

Bu günlük bu kadar.

Ruby Günlüğü – Gün 4

Tüm günlüğe şu adresten ulaşabilirsiniz : http://www.serhatdundar.com/tag/ruby-dersleri

Ruby’de Herşey Nesnedir

Soru? : 2 nesne ve 2 method (fonksiyon) içeren tek satırlık bir kod yazılabilir mi?

Cevabı hemen verebiliriz ;

Sonucun 7 olduğu aşikar. Peki 2 nesne ve 1 method nerede? Daha önce Ruby’de herşeyin bir nesne olduğunu söylemiştik, pure-object-oriented bir dil olduğunuda. Burada 2 rakamı bir nesnedir. 5 rakamı da. Evet yanlış duymadınız bunlar birer nesne. + işareti ise bir method, yani fonksiyon.

(Aslında burda bir metod daha bulunmakta, birazdan değineceğiz)

Sorulması gereken güzel soru : Bu nesneler hangi sınıfa aitler? Neden sınıf ismi kullanmadan çağırdık, nasıl olabilir?

Evet 2, 5 rakamları birer nesne dedik, peki hangi sınıfa aitler? Bunu anlamak çok basit, irb’de “2.class” komutunu verebilirsiniz, veya bir IDE üzerinde çalışıyorsanız “puts 2.class” komutunu verebilirsiniz. Class nesnesini bu şekilde her yerde kullanabilirsiniz !

Sonuç ne peki :

“Fixnum”. Fixnum bir built-in class’tır, yani Ruby içerisinde gömülü gelen sınıflardan biridir. Rakamlar ise bu sınıfın nesneleridir.

“+” işaretinin bir metod yani fonksiyon olduğunuda söylemiştik. İki nesneyi toplama görevini yapan bir methodtur.

Aslında “puts 2+5” yerine, “puts 2.+(5)” yazarakta aynı sonucu elde edebilirdik.

class metodu ile sınıf için kullanılan class’ı karıştırmamak gerekir. Method olan class; string, integer, fonksiyonlar, değişkenler vb. birçok şeyin hangi sınıfa ait olduğunu söyleyen iş yapıcıdır, yani methodtur.

İlerde aşmış bir Ruby programcısı olursak, Fixnum gibi built-in sınıflara kendi methodlarımızı ekleyebilir ve bu modülü geliştirebiliriz de.

Kernel Metodları

Kernel’de aynı Fixnum gibi özel bir sınıftır, aslında bu built-in class’lara programlama dilinde biz modül diyoruz, python tecrübesi olanlar bunu hemen idrak edeceklerdir zaten, python’da matematik işlemler için math modülü, işletim sistemi ve dosya işlemleri için os modülü gibi birçok modül bulunmaktaydı.

Kernel modülünün bir özelliği var, bu özellik sayesinde biz bu modülün metodlarını her sınıf içerisinde rahatlıkla kullanabiliriz.

“puts” metodu Kernel modülüne ait bir fonksiyodur.

Bizim oluşturduğumuz metodlardan farklı olarak “puts” metodu bir prefixe ihtiyaç duymuyor, yani bir ön-ad gerekmiyor. Örneğin  “Serhat.puts” şeklinde kullanmıyoruz puts metodunu.

Biz ne zaman “puts” fonksiyonunu ansak, Ruby gidiyor Kernel modülü içerisinden puts fonksiyonunu bulup kullanıyor, tabi bu işi Ruby’ye yaptırtmak yerine kendimizde yapabiliriz :

Tam olarak aynı sonucu verecektir, arada herhangi bir farkta yoktur. Aşağıda ki örneklerin tümü aynı işi, aynı şekilde yapmaktadır :

Kernel’i teleffuz etmek, külfetli bir iştir ve gerekli değildir, Ruby zaten bu işi bizim yerimize yapıyor, tekrar tekrar bizim yapmamıza gerek yok.

Peki bu parantezlerde nereden çıktı? Parantez kullanımı zorunlu olmamakla birlikte, birçok metodu birbirine bağladığımızda, kodumuzun daha okunur olması için kullanılmasında fayda olabilir. Ancak bu çok sık karşılaşacağımız bir durum değildir, çünkü puts metodu tek bir argüman alabilir (parametre) ve çok nadir olarak başka metodlara bağlanır.

Arada ki farkı görmek açısından;

İkinci yazım formunun daha açık olduğu kesin, ancak bu kullanım sizin programlama stilinize kalmış.

Her şey bir nesne demiştik, peki “Mustafa Serhat Dündar” hangi sınıfa ait bir nesne?

Hemen bakalım;

Görüldüğü gibi String sınıfına ait bir nesneymiş.

String Sınıfının Metodları

String sınıfının birçok metodu bulunmakta, bunları örnekle anlamak mümkün olduğu için doğrudan örnekliyorum :

Son örneklerde gördüğümüz birçok metodun birbirine bağlanması durumunda, parantez kullanımı paydalı olabilir, karışıklığı önleyebilir.

Bir çok metod birbirine bağlandığında işlem sırasının soldan-sağa doğru sırayla olduğunu test edebilirsiniz.

OOP Kullanmamak

OOP yöntemlerini kullanmanın zorunlu olmadığını biliyor olmalısınız önceki yazılardan. OOP kullanmadan Ruby kullanabilir miyiz? Evet kullanabiliriz, python’da OOP bir dildir ancak kullanım zorunluluğu yoktur, ancak Ruby pure-oop olduğundan OOP kullanımı daha çok öne çıkmaktadır.

gördüğünüz gibi sadece bu kod parçasını çalıştırabilmemiz mümkün. Burada havlamasesi metodunu herhangi bir nesneye veya sınıfa bağlamadan doğrudan kullandık. Diğer dillerde bu durumu procedure, function, subfunction Türkçe’si olarak ise “alt program” olarak biliriz.

Bir sınıfa bağlı olmadığını söyledik bu metodun ama Ruby’de herşeyin bir nesne olduğunu ve tamamen OOP bir dil olduğunu söylemiştik, bu tezat değil mi? Aslında şuan biz görmesekte “havlamasesi” metodu bir sınıfa bağlı. Fark etmeden, object sınıfına bağlı bir metod oluşturduk.

Denemek mi istiyorsunuz? “Object.havlamasesi” kullanmanız yeterli.

İyi günler dilerim.

Mustafa Serhat Dündar

Ruby Günlüğü – Gün 3

Nesne Tabanlı Programlama

Öncelikle Ruby pure-object-oriented bir dil olduğu için, nesne tabanlı programlama hakkında bir kaç noktaya değinmek gerekir, aksi halde ileri ki konularda nesne, sınıf, fonksiyon gibi kavramlar karışacaktır. Ben daha önce çok derinlemesine olmasa bile bir python tecrübem olduğu için ve bu sorunları python çalışırken yaşamış olduğum için, bi kez tekrarlamakta fayda görüyorum.

* OOP kullanmak zorunlu değildir, ama bilinmesi gerekir ve kullanılsa iyi olur. Neden mi? “Nesne ve Sınıflarla Birlikte Ruby – 2” başlığında açıkladım.

Konuya devam etmeden önce şu yazıları okumak faydalı olacaktır :

  1. http://cygm.meb.gov.tr/modulerprogramlar/kursprogramlari/bilisim/moduller/nesnetabanliprogramlama1.pdf
  2. http://www.istihza.com/py2/nesne.html
  3. http://www.be.itu.edu.tr/~e.fatih.yetkin/sunum/python3.pdf
  4. http://enginyoyen.com/blog/tr/nesne-tabanli-programlamaoop-nedir

Nesne ve Sınıflarla Birlikte Ruby

Ruby’nin bir OOP dili olduğunu biliyor, bunu en kısa şekilde, Ruby programlarının gerçek hayatımızda ki konsept kavramlarını tanımlayabildiğini ve yönetebildiğini söyleyerek özetleyebiliriz. Ruby programı, insanlar, kutular, biletler, haritalar gibi çalışmak istediğimiz birçok konsepti içerebilir. Ruby OOP dili olması sebebi ile, oluşturduğumuz bu konsepler arasında ilişki kurabilir.

Konseptlere birazdan, sınıf ismini vereceğiz.

Örnek vermek gerekirse, spor müsabakaları için bir bilet sistemi programı kodlamayı düşünüyoruz. Elimiz de temel ve ortak olarak insan, bilet, yer, etkinlik gibi konseptler var. Bu konseptleri iki ayrı etkinlik için kullanabiliriz. Şampiyonlar ligi finali içinde bunları kullanmamız gerekli, üniversiteler arası basketbol turnuvası içinde, işte Ruby’de ilişkilendirmeler kurarak farklı etkinlikler için belirli konseptleri tekrar tekrar hazırlamamıza gerek yok.

Daha önce ki yazıda örnek olarak bir insan oluşturmuş ve ilişkilere göz atmıştık, şimdi OOP bilgisi ile o yazıyı okursanız daha net olacaktır.

Hatırlamak gerekirse ;

Normal bir insan, temel olarak isim-yaş-cinsiyet gibi özelliklere sahiptir. “Class Insan” ile bir insan konsepti tanımladık.

“attr”nin attribute (özellik) manasına geldiğini söylemiştim. “accessor” ise en kaba manasıyla, bak Ruby programı ! Bu tanımladığım özellikler var ya, işte onları istediğim zaman atayabilmemi ve istediğim zaman değiştirebilmemi sağlayabilecek şekilde tanımla demek oluyor.

Sınıfları temel olarak, gerçek hayatta ki konseptler için kullanabileceğimizi söyledik, nesneler ise sınıflar üzerinde ki birer elemandır. Örneğin “insan” bir sınıf ise “serhat” bir nesnedir gibi.

Veya “araba” bir sınıftır, “yarış arabası” ve “jip” ise bir nesnedir, yarış arabasının mavi renk olmasını onun bir özelliği (attribute) olarak örnekleyebiliriz.

ile “Insan” sınıfına ait yeni bir nesne oluşturduk. insan1 nesnesi burada bir yer tutucudur, yani diğer bir tabirle değişkendir. Bellek içerisinde insan1’i tutar ve istediğimiz zaman kullanabilmemizi sağlar.

Değişken’ler mantığını en kolay anlayabildiğimiz terimlerden, özellikle matematik ile biraz olsun uğraşmış biri iseniz değişkenleri çok kolay anlayabilirsiniz. Bir matematik sorusunda “x=5” ile aslında x’değişkenini 5’e eşitlemiş oluyor, yaptığımız şey x isminde bir değişken oluşturmak ve bunu 5 değerine eşitlemek.

Bu örneklemeyi matematik-programlama anlamında ayırmak için genellikle x=x+1 örneği kullanılır.

Matematiksel olarak bu örneğe yaklaşında 0=1 sonucu çıkmakta ve bu tanımsızlık demektir, ancak programlama için konuşursak bu ifade doğrudur. Programın başında x’i x=5 ile 5’e eşitlemiş olalım, bir sonra ki satırda x=x+1 ile x’i değiştirdiğimizi ifade ediyoruz. x önceden 5’ti, artık 1 ekledik ve şuan 6 oldu. Adı üstünde “değişken” yani her an değişebilir.

Değişkenler, sınıflar gibi kalıcı bilgi tutmaz, daha geçicidirler. Program içerisinde sürekli değiştireceğimiz ve oynayacağımız bir veriyi değişken olarak tanımlamak bize esneklik kazandırır.

Nesne ve Sınıflarla Birlikte Ruby – 2

Başlığı 2’ye böldüm çünkü, önce ki satırları tam olarak kavrayamadıysanız ve aklınızda soru işaretleri varsa önce bunları çözmeniz gerekmekte, aksi halde yazının geri kalanı ezberden öte geçmeyecektir.

Şimdi 3 ayrı sınıf tanımlayalım. Bunlar; “Kedi”, “Köpek” ve “Yılan” olsun.

Bu şekilde 3 ayrı hayvan için sınıf tanımlamak herhangi bir sorun doğurmaz, kodumuz hatasız işler, bu sınıflara ailt hayvanlar oluşturabilir, bu hayvanlara tanımladığımız özellikleri atayabiliriz vs.

Ancak bu şekilde sınıf tanımlaması yaptığımız taktirde OOP nimetlerinden faydalanmıyoruz demektir. OOP’in temel yapı taşlarından biri olan “miras” sistemini bu sınıf tanımlamasında hiç kullanmadık. Oysa ki 3 ayrı hayvan var ve belirttiğimiz özellikler de tamamen aynı. Boşu boşuna tekrar tekrar isim, yaş, cinsiyet ve renk özelliklerini tanımlamış olduk.

3 sınıfımızda daha genel, ortak bir özelliğe sahip. Üç sınıfımızda birer hayvan. O halde “Hayvanlar” isminde daha genel bir sınıf tanımlayıp, buna ait özellikleri Kedi, Köpek ve Yılan için kullanabiliriz.

* Kod içerisinde gördüğünüz & ile başlayan şekiller “<” ifadesidir, scriptten kaynaklanan bir durum yüzünden bu şekilde çıkmakta. Karakter setleriyle ilgili bir sorun var, sanırsam. Bunlar neymiş, neyin nesiymiş diyenler şurdan bakabilir : http://msdn.microsoft.com/en-us/library/ms537495.aspx

Kedi, Köpek ve Yılan’ın “Hayvanlar” sınıfın özelliklerini miras alma durumunu “<” işareti ile sağladık. Bu sayede her seferinde isim, yaş, cinsiyet ve renk özelliklerini belirtme zorunluluğundan kurtulduk.

Sorulması gereken güzel soru : Peki her bir hayvanın, sadece kendine has özelliklerini, bu yapıyı bozmadan tanımlamak istesek? Örneğin tüm bunların dışında, kedi için birde kedinin cinsini tanımlayabilir miyiz? Van kedisi gibi?

Elbette, zaten bunu yapamasaydık, OOP’nin ne anlamı kalırdı ki? Şimdi bu nasıl yapılıyor onu görelim örnek üzerinde ;

Gördüğünüz gibi kedi sınıfının altında birde “kedicinsi” özelliği tanımladık. Bu özellik sadece kediler için geçerli, yılan ve köpek hala diğer özellikleri “hayvanlar” sınıfından miras alıyor ve kedi de aynı şekilde ancak, kedinin artı olarak birde “kedicinsi” özelliği var.

Ruby ve Metodlar

Şimdi, oluşturduğumuz bu hayvanlara (siz birer tane oluşturdunuz ve denediniz sayıyorum) bazı işler yaptıralım. Bir nesneye yaptırdığımız işleri method veya fonksiyon olarak ifade edebiliriz. Örneğin köpeğimize bir havlama işi yaptırtabiliriz.

“def” yani “define” bloğunu yine end ile kapattığımıza dikkat etmişsinizdir. Blokları daima end ile kapatmaktayız, yoksa programımız bizim bloğu sürdürmek mi yoksa bitirmek mi istediğimizi anlayamaz.

Sorulması gereken güzel soru : Bütün hayvanlar için ortak olan bir eylem yok mu peki? Eğer varsa bunu nasıl tanımlarız?

Örneğin bütün hayvanlar için ortak bir eylem düşünelim. Aklıma daha iyi bir örnek gelmediği için bütün bu hayvanlara “saldırma” eylemi yaptırtmak istesek? Biz bunları programda çağırınca bize kızıp saldırsalar? (:

O halde bu kod parçamızı ana sınıf içerisine yazmalıyız, yani “class Hayvanlar” ile tanımladığımız blok içerisine.

Tüm örnekleri tek bir uygulama içerisinde görelim o halde :

Bu günlük bu kadar, öğrendikçe yazmayada devam edeceğim.

Mustafa Serhat Dündar

Ruby Günlüğü – Gün 2

Neden Ruby?

Bu sorunun cevabını IBM’den almak, güvenilirliği arttıracaktır.

Aşağıda ki linkten orjinal kaynak üzerinden okuyabilirsiniz :

http://www.ibm.com/developerworks/opensource/library/os-rubyeclipse/

Kendi çapında bir Java programcısı neden Ruby’yi önemsemelidir? Ruby, 10 yıl önce Japonya’da geliştirilen genel amaçlı bir programlama dilidir. Tamamen object-oriented olması sebebi ile popülerlik kazanmıştır. Java’da olduğu gibi skalerler içermez, bu yüzden integer (rakamsal ifadeler) dahil herşey birer first-class nesnedir (Bu tabire Python geliştiricilerinin hiç yabancı olmaması gerekiyor). Ruby syntax’ı yani söz dizimi, Smalltalk, Python ve Ada’da oldukça benzerlik gösterir. Ruby bütün bilinen işletim sistemlerinde rahatlıkla çalışabilen, tamamen taşınabilir bir dildir. İşletim sistemine göre bağımlılık içermez.

Ruby’nin kullanımı her geçen gün artmakta, buna sebep olarak Ruby’nin esnekliği ve uygulama geliştirmede gösterdiği pratikliği gösterebiliriz. Java’da uygulama geliştirme süreci çok daha meşakkatlidir. Yazının geri kalanını kaynağından okuyabilirsiniz, sözü çok uzatmayacağım.

Ruby Geliştirme Ortamı – IDE’nin Hazırlanması & Aptana – Eclipse Plug-in

Uzun zamandır eclipse kullanan biri olarak, alışkanlıklarımdan vazgeçmek istemiyorum, bu yüzden Ruby uygulamalarımı eclipse ile geliştirmek istiyorum.

IBM’den makalesinde okuduğum üzere Aptana’yı keşfetmiş bulunmaktayım. (Daha sonra RadRails ve Heroku üzerinde de duracağım, ancak o günlere biraz daha var)

Aptana Studio’yu stand-alone olarakta kurma imkanınız var ancak ben eclipse plug-in olarak kuracağım.

http://www.aptana.org/products/studio2/download

adresine giderek “Eclipse plug-in version” seçeneğini seçerek download edelim, karşımıza nasıl kuracağımızı anlatan sayfa gelecek, orada ki adımları takip ederek kurulumu gerçekleştirdim.

Aptana Studio’nun eski ismi RDT imiş, yani RDT olarakta aratıp internette çeşitli yazılar bulabilirsiniz, RDT yani Ruby Development Tools.

Kurulum işlemi biraz sürecektir, internet hızınıza bağlı olarak (1Mgb. bağlantı ile yaklaşık 15 dakika sürdü, 80 megabyte kadar bir dosya)

Son zamanlarda NetBeans’ta hızlı bir giriş yapıp Ruby desteği sunmaya başlamış, onada şurdan ulaşılabilir;

http://netbeans.org/features/ruby/index.html

http://netbeans.org/kb/docs/ruby/setting-up.html

NetBeans için plug-in kurulu açıkcası Ubuntu ortamında çok daha kolay, Eclipse plug-in’i için üst seviye yönetici girişi yapmanız vs. gerekiyor, güvenlik sertifikası hatası veriyor (Ubuntu 10.04 Lts), ancak Netbeans sorunsuz bir kurulum gerçekleştirdi.

Ruby Konsepti

Ruby konseptini nesne ve sınıfları daha iyi anlamak için bir örnek yapalım.

Şimdi bu örneği adım adım inceleyelim;

“class Kisi” satırı ile kişi isminde bir konsept tanımladık, Ruby içerisinde tanımladığımız tüm konseptlere sınıf adını veririz. Tek tipli nesnelere sınıf adı verilir. Ruby’de sınıf isimleri daima büyük harfle başlar.

attr_accessor :isim, :yas, :cinsiyet

satırı ile, bir insanın sahip olabileceği temel özellikler olan isim, yaş ve cinsiyeti, sınıf bileşeninin içermesini söyledik.

“attr”, “attribute” kelimesinin kısaltılmış halidir ve “accessor” ile bu özelliklerin kullanıcı tarafından girilebilmesini ve istenildiğinde değiştirilebilmesini söyledik. Bu demek oluyor ki, Kisi isimli nesne üzerinde çalışmaktayken, istediğimiz zaman bu kişinin adını, yaşını ve cinsiyetini değiştirebiliriz.

“end” komutu ile “Kisi” sınıfını tanımlamayı bitirdiğimizi belirttik.

Özetle; Bir sınıf, bir konsepti tanımlar ve bir nesne ise sınıf üzerine kurulmuş tek bir şeydir.

Kodu command promt üzerinde çalıştıralım :

Daha önce “001:0” gibi rakamların ne olduğunu biraz olsun öğrenmiştik, şimdi sonra ki “0” rakamının “1” olarak değiştiğini görüyoruz. İlk satırda “class” komutu verdiğimizde, Ruby artık bir sınıf tanımlaması başlattığımızı ve bundan sonra gireceğimiz komutları derhal işlemek yerine, sınıf tanımlamasını devam ettirmesi gerekiğini anlıyor ve sondaki rakam, yani kitapta yazdığı anlamıyla “programın derinliği” 1 olarak değişmiş oluyor. İlk üç rakamın ise programda bulunduğumuz satır olduğunu yine öğrenmiştik.

Aldığımız “nil” sonucu, python programcılarına tanıdık gelecektir.

“null” olarak bildiğimiz, hiçbir şeyin döndürülmemesi (return) durumu, Ruby içerisinde “nil” olarak ifade ediliyor.

Şimdi böyle birşey deneyelim.

“kisi_instance” ile yeni bir kişi oluşturduk ve bize Ruby ilginç bir sonuç bastırdı. Bu sonuç bilgisayardan bilgisayara değişebilir, şimdilik üzerinde durmuyoruz ve kişinin ismini, yaşını ve cinsiyetini tanımlıyoruz:

Şimdi ekrana herhangi bir değeri döktürelim:

Sonuç başarılı.

Tüm kod tek parça halinde :

Daha önce ki örneklerde birşey yazdırmak için “print” kullanmıştık, ancak şimdi “puts” kullandık.

Aralarında oldukça ufak bir fark bulunmakta, “print” komutu, sayfaya herhangi birşeyi yazdırır ve imleci o satırda bırakır, “puts” komutu sayfaya birşey yazdırdıktan sonra bir satır boşluk bırakır.

Bir sonra ki gün, görüşmek üzere.

Mustafa Serhat Dündar

Ruby Günlüğü – Gün 1

Nedir?

Ruby öğrenme sürecimde, edindiğim tecrübeler, yaşadığım zorluklar, bulduğum çözüm yolları gibi durumları, bu yazı dizisinden günlük şeklinde aktaracağım.

Daha sonra geriye dönüp baktığımda, nerelerde yanlış yapmışım, nelerde kendimi boşa yormuşum, neleri yanlış anlamışım, bunları değerlendirebilmek için bu günlüğü tutuyorum.

Ruby’ye başlangıç için “Beginning Ruby: From Novice to Professional – Second Edition” kitabını kullanmaktayım.

http://www.amazon.com/Beginning-Ruby-Professional-Peter-Cooper/dp/1430223634/ref=dp_ob_title_bk/186-0250703-4878934

Bu kitabı hızlıca tüketip, “The Ruby Programming Language, O’Reilly” kitabına geçmek ilk etapta düşüncem.

Kitapların .pdf halini bir kaç Google araması ile kolayca bulabilirsiniz.

İşletim sistemi olarak “Ubuntu 10.04” kullanmaktayım, tabi ki siz farklı bir işletim sistemide kullanabilirsiniz.

Ruby’yi Kurmak

– Ubuntu’da öncelikle Ruby’yi kurmak üzere yola çıktım. Paket yöneticisi kullanmak istemiyorum, direk kaynak koddan yüklemek istiyorum, bu sayede versiyon seçiminde daha spesifik davranabilirim. Daha önce ki denemelerimde Ruby’yi paket yöneticisinden kurdurmak istediğimde, hangi sürüm tanımlıysa direk onu kurduğu için, işimi görmeyen bir sonuçla karşılaşmıştım.

– “sudo apt-get install build-essential” komutunu vererek kaynaktan kurulum yapmak için gerekli olan kütüphaneleri yüklüyorum. Bu sayede sistemim kaynaktan program derleme kabiliyeti kazandı.

– http://www.ruby-lang.org/tr/downloads/ sayfasına giderek, Ruby kaynak kodunun, son kararlı sürümünü indirdim.

Aşağıda ki talimatları okursanız apt-get ile nasıl kolayca kurabileceğinizi de görebilirsiniz, ancak ben uzun yolu seçtim, kaynak koddan kurulum kabiliyetlerimin gelişmesi için kolaya kaçmak istemiyorum, sonuçta zaman sıkıntım yok ve amacım kolaya kaçmak değil, çok şey öğrenmekti.

– İndirdiğim .tar.gz arşivini uncompress ediyorum, yani arşivden çıkartıyorum. Bunu arşiv yöneticisi ile iki tıklamayla yapabilirim ancak komut satırından yapmak istiyorum bu yüzden önce arşivi indirdiğim masaüstü dizinine düşüp, daha sonra “tar xzvf ruby-1.9.2-p136.tar.gz” komutu vererek işlemi tamamlıyorum. Arşivin olduğu yerde, yeni oluşmuş bir ruby klasörü görmeniz gerekmekte, arşivden çıkmış dosyalar onun içinde.

– Bu yeni oluşan dizine düştüm ve “./configure” komutu ile Makefile ve config.h dosyalarını oluşturdum.

– “sudo make install” komutu ile kurulumu başlattım. Eğer root iseniz sudo komutunu vermenize gerek yok. Bu işlem biraz sürebilir, bilgisayarınızın hızına bağlı olarak.

– Yükleme bittikten sonra “ruby -v” ile ruby versiyonunuzu kontrol edebilirsiniz. Bu komuttan sonra yüklü sürümün numarası ekrana basılmalı.

İlk Adım

* “irb” (Interactive Ruby) komutu vererek ruby’yi çalıştırabilirsiniz. Ruby’den çıkmak için “Ctrl + D” yapmanız yeterli.

– irb komutu verdim ve ruby komut satırına geldim. Burada ki “irb(main):001:0>”ın anlamı ;

001 => 1 Nolu satırdayım

0 => 0 numaralı derinlikteyim (veya katmandayım, nasıl hayal etmek kolay olacaksa)

– 2**9 ile 2 üzeri (üssü) 9’u Ruby’ye kolayca hesaplattım ve bana beklenen sonuç olan 512’yi döndürdü.

Ruby İngilizce Biliyor !

Ruby syntax’i diğer programlama dillerinde olduğu gibi katı kurallar ve sıkıcı ifadeler içermiyor, eğer aklınızda birşey varsa bunu İngilizce düşünmek yeterli (her zaman değil tabi ki) Örneğin şöyle bir programcık algoritması düşünsek;

“10 kez sayfaya serhat yazdır ve bitir”

Bunu Ruby’de İngilizce’ye çevirip kullanabiliriz (her zaman değil tabi ki);

Evet, karmaşık süslü parantezler, girintilemeler, tanımlamalar vs. yapmadık, sadece İngilizce düşündük ve Ruby anladı.

Bunu Python’da şu şekilde yapabilirdik ;

* Kod renklerdirmeyi GeSHi destekli WP-Syntax ile yaptım. Bu plug-in yüzlerce dili tanımakta ve özel fonksiyonları ve yapıları Css ile renklendirmekte.

Ruby’nin İngilizce konuşması ile ilgili başka bir örnek olsun ;

peki bu kod parçası ne iş yapar? Aslında İngilizce düşününce ve hafif bir programlama temeliniz varsa kod oldukça açık ve net.

admin@google.com e-mail adresini kullanan kullanıcıyı bul, ülkesini Türkiye olarak değiştir. (Değiştirme de nerden çıktı diyebilirsiniz, = işareti ile atama yaptık, ve bir veri arattığımıza göre ülke bilgisi zaten var, biz tekrar atama yapınca değişmiş oldu)

Mustafa Serhat.