Yazılım Notları
uordek.esiyo.each
uordek.esiyo.each
Sep 19th
Merhabalar,
Geçmiş zaman olurki bir proje için internette yayınlanan videoların kaç kez görüntülendiğini öğrenmek isteyen arkadaşlar ile tanıştım, çok ısrar ettiler yaptım. Bazı siteler için süper basit ve hızlı olurken bazıları için uzun sürdü ama 5 site için görüntüleme bilgilerini 2 saat gibi uzun bir sürede yapmayı başardım. Öff bee çok uzun sürmüş harbiden… şimdi yazınca daha da uzun geldi… aman aman bir daha yapmam valla… bu nedenle sizler de tekrar tekrar uğraşmayın diye bu Tankut kulunuz bu yazıyı yazıyor. Sırf sizler için, reklamları tıklamanız için değil, adımı ağzınızda sakız yapmanız için değil.. sadece siz uğraşmayın diye.. heyttt bee hizmet etmeye geldik diye siyasi bir yaklaşım içerisinde bulunan ve hiç birşey yapmayanlar utansın..
Öfff öff gene gereksiz yazdım işte örnekler :)
Öncelikle bulduğumuz gösterim sayılarını (view count) html veya “,” gibi karakterler ayırmak için bir methoda ihtiyacımız var. İşte ‘remove_char’ methodu tam bu noktada isteklerimizi karşılıyor.
def remove_char(number)
ret = ''
number.to_s.split(//).each do |char|
ret += char if char.to_i.to_s == char
end
ret
end
Öncelik google kardeşimizin olsun, google kardeşimiz video url’i aslında frame’lerden oluşuyor. Ve gösterim sayısının (video view count) bulunduğu frame’i üstün araştırmalarımın sonucunda buldum… :) url’de ‘videoplay’ yerine ‘videohosted’ yazıyorsunuz oldu bitti maşallah :).
require 'open-uri'
require 'hipricot'
# Sassy Girl (Chun-Hyang) Episode 5
video_url = 'http://video.google.com/videoplay?docid=1197987351381288347'
google_video = Hpricot(open(video_url.gsub('videoplay','videohosted')))
temp = google_video.search("//table[@id='statsshowmore']")
google_video_view = Hpricot(temp.innerHTML).search("//td")
view_count = remove_char(google_video_view[0]).to_i
puts view_count
Sonraki örneğimiz myspace’den olsun…
# Internet People!
require 'open-uri'
require 'hipricot'
video_url = 'http://vids.myspace.com/index.cfm?fuseaction=vids.individual&VideoID=2057681175'
myspace_video = Hpricot(open(video_url))
temp = myspace_video.search("//div[@class='userinfo']")
myspace_video_view = Hpricot(temp.innerHTML).search("//span")
view_count = remove_char(myspace_video_view[2]).to_i
puts view_count
Vur patlasın çal yahoo’dan gelsin örnek..!
# Eastern Promises
require 'open-uri'
require 'hipricot'
video_url = 'http://video.yahoo.com/video/play?vid=1145798&fr=&cache=1'
yahoo_video = Hpricot(open(video_site.url))
temp = yahoo_video.search("//div[@class='vd']")
yahoo_video_view = Hpricot(temp.innerHTML).search("//span[@class='bold']").inner_text
view_count = remove_char(yahoo_video_view).to_i
puts view_count
En son youtube kardeşe bakalım; ama bir saniye youtube kardeşle uğraşmaya gerek yok.. :)
“gem install youtube” yazın evinize gelsin :)
require 'youtube'
Kolay gelsin..
Sep 5th
Merhabalar,
Öncelikle karşılaştırma derken, nasıl bir karşılaştırma yapacağımızı anlatmalıyım. Performans işlemleri karşılaştırma kriterlerim içerisinde bulunmuyor, bundan hiç bahsetmeyeceğim. Ama kodun okunabilirliği, hızlı yazılması, hatalara karşı ne kadar duyarlı olduğu ve tabii ki en önemlisi tekrar kullanabilirliği.
Aslında bu son nokta yani ‘tekrar kullanılabilirlik’ başlı başına bir yazı konusu ama buna şimdilik pek değinmeyeceğim. Başlıkta yazdığı gibi dosya işlemlerini karşılaştıracağım.
Arşılaştırmayı sadece VBScript, JScript ve Ruby arasında yapacağım, neden mi ? hali hazırda yapmıştım da ondan.. bu yazıyı yazacağım diye oturup program yazmadım. Önce programları yazdım, sonra yazıyı yazmak aklıma geldi. Bu nedenle neden diye sormayın. :)
Ama belki daha sonraki zamanlarda Java ve C# versiyonlarının karşılaştırmalarını da eklerim.
Öncelikle sizlere problemden bahsedeyim.
Belirli bir server üzerinde ps ve txt (post script ve text) dosyaları online bir uygulama tarafından oluşturuluyor, daha sonrasında online uygulama üzerinden kullanıcı bu dosyaları temizlemeyi unutuyor ve dosya sisteminin şişmesi ile beraber performans problemleri ortaya çıkıyor. Bu nedenle dosyaların gün bazında ömürlerinin olmasına ve ömrünü doldurmuş olan dosyalarında sistem tarafından silinmesine, silme işlemi esnasında log almasını ve bu loglarında aynı ömür kuralına tabii olmasını istiyoruz… işte bu program bu işi yapacak.. günde bir kez çalışacak ve bu işlemi yapacak. Microsoft Windows sistemde çalışmasını istediğimiz için VBScript ve JScript’de (JavaScript’in bire bir aynı klonu) ve platform bağımsız olan Ruby’de yazıldı. İşte Ruby örneği;
More >
Aug 21st
Merhabalar,
Bu yazımı aslında takip ettiğim bir kaç sitede yayınlanan blogları gördükten sonra yazma gereği duydum. Bahsettiğim bloglarda yer alan yazılar aslında basit anlamda Ruby’nin temel özelliklerinden bahsediyorlarda fakat bu yazılara çok farklı tepkiler geldi. Bu tepkiler içerisinde çok şaşıranlar.. hadi ya ben bunu bilmiyordum diyenler.. yaa demek böyle birşey varmış ama bu kötü vs..vs.. Ben de bu yorumları inceledikten sonra bu yazıyı yazmaya karar verdim.
Aslında konumuz Ruby’de sınıfların yapısı, özellikleri ile Ruby’nin sınıfları, kütüphaneleri ve bizim Component dediğimiz şeyleri nasıl gördüğüdür.
Öncelikle OO (Object Oriented) tüm dillerde olduğu gibi Ruby’nin sınıf tanımı Java’nın veya C#’ın sınıf tanımı ile aynıdır. Peki o zaman farklılık nerede :) ayrıntılarda.. şeytanın gizli olduğu yerde :)
public class HelloWorld extends ExampleSupport {
private String execute() throws Exception {
setMessage(getText(MESSAGE));
return SUCCESS;
}
}
Yukarıda belirtilen örnekte olduğu gibi execute isimli methodumuz private tanımlanmış, yani sadece HelloWorld sınıfı içerisinden kullanılabilir. Neden çünkü private…
peki bir de bunun benzerini Ruby’de gerçekleştirelim;
class HelloWorld < ActiveSupport
private
def execute
SetMessage(GetText(MESSAGE))
return SUCCESS;
end
end
Yukarıdaki iki örnek birbirlerinin aynısı. Ama diyorum ya şeytan bu ayrıntılarda gizli elbetteki.. :) Tahmin ettiğiniz gibi Java dilinde herhangi bir esneklik yok tabiki.. private tanımladın.. private.. yok öyle yanar döner method tanımlama olayları...
Peki ya Ruby'de private olarak tanımlanmış bir methodu public yapabilirmiyiz.. elbette yaparsınız; private yerine public yazarsınız.. taaa taa oldu.. :) Diğer bir yöntem;
Parçalı sınıf (Partial Class) yönetimi ile yapılabilir.
class HelloWorld
public
def execute_public
execute
end
end
peki başka nasıl olur bu iş.. mesajlaşma ile olur.. şöyleki aslında bir methodu çağırmanın tek yöntemi o methodu direkt olarak çağırmak değildir. Ayrıca Reflection dediğimiz kavram ile de çağrılabilir (Java dünyasında da oldukça kullanılır).
helloWorld = HelloWorld.new
helloWorld.execute # Hata üretir.. execute halen private bir methodtur...
helloWorld.execute_public # Çalışır :)
helloWorld.send("execute") # Çalışır.. problem çıkarmaz.. Sınıfa execute adlı bir method çalıştırmasını söyler.
helloWorld.instance_eval("execute") # Çalışır.. problem çıkarmaz..
Görüldüğü gibi.. yazılımcıdır tüm kodların hakimi.. yoktur programlama dilinin mecburiyetleri.. :P
En son olarak benim tercih ettiğim yöntem; tabii private yerine public yazmak yerine.. :)
class HelloWorld
public :execute
end
Yukarıda belirtilen bu yordam ile.. execute methodu artık public olmuştur.. hayırlı uğurlu olsun.. :D
Kolay gelsin..!
Aug 3rd
Merhabalar,
Tatile çıkamayanları düşündükçe bu yazıyı yazmak içimden gelmiyor ama :) BEN TATİLE ÇIKIYORUM :) diye bağırıyorum :) işte gördünüz bağırdım. Uzun uğraşlar sonucunda, Vodafone’da bulunan sevgili yönetici kardeşlerimizin benim 3 hafta olan tatilimin hepsini kesmemeleri konusunda ikna edebildim ve 3 hafta çıkmam gereken tatilime 1 haftacık da olsa çıkabileceğim için ne kadar mutluyum bilemezsiniz. Bana bu hazzı yaşatan sevgili yöneticilerime teşekkürü bir borç bilirim. Üstelik bana ‘sen daha yeni geldin ya, ne tatili ?’ diye soran çalışma arkadaşlarımı da sizlerin huzurunda sevgiyle kucaklıyor :) ve ben TATİLE ÇIKIYORUM :)
Kendinize iyi bakınız, bir aksilik çıkmaz ise, sizlere Bodrum’dan da bir yazı yazmaya çalışacağım. Hoşçakalın.
Jul 30th
Merhabalar,
Bu yazı, bir önceki SQL nedir, ne değildir ? adlı yazının devamı şeklinde olacak ve ‘Group By’ ve ‘Having’ ile SELECT sonuçu olarak dönen liste üzerinde yapılan işlemlere değineceğiz.
Geçen yazımızdan hatırlayacağınız gibi, SELECT cümlesi geriye bir liste dönen bir ve üç ana parçaya ayırabileceğimiz bir komut idi. Bu ana parçalardan kısaca bahsedecek olursak;
- süzme işlemi (WHERE alt cümlesi ile yapılabilen)
- sıralama işlemi (ORDER BY alt cümlesi ile yapılabilen)
- geri dönen liste üzerinde yapılan işlemler (GROUP BY, HAVING, MAX, SUM, COUNT, MIN….vs.)
Peki SELECT cümlesinde gerçekleşen olayları biraz daha derinden inceleyelim, bu şekilde GROUP BY ve diğer işlemlerin anlaşılmasını kolaylaştırmaya çalışalım.
SELECT Price
FROM Customer
WHERE Price < 100
AND Price > 50
Bu SQL cümlesinden geriye bir liste gelir, buraya kadar herşey çok normal ve oldukça basit. Ama biz biraz daha analitik bir liste istersek ki iş dünyasında bu çeşit listelere oldukça fazla başvuruluyor.
SELECT Count(*), Price
FROM Customer
WHERE Price < 100
AND Price > 50
GROUP BY Price
Yukarıdaki cümlede durum biraz karışık ama inanın göründüğü kadar değil, şöyleki; Bu SELECT cümlesi bir üstte belirtiğimiz SELECT cümlesi ile aynı listeyi oluşturur ama son yazılan SELECT cümlesine ‘Count(*)’ ve ‘GRUOP BY’ gibi SELECT’den dönen listeyi değiştiren alt cümleleri eklenmiştir. Biz standart listeleme işleminden dönen (yani Price bilgisi 100 ile 50 arasında olan Customer listesine) listeye düşük seviyeli liste diyelim. Bu düşük seviyeli listenin üzerine GRUOP BY ve COUNT işlemleri uygulandıktan sonra ortaya çıkan yeni listeye ise sonuç listesi adını verelim.
Veri tabanı uygulamaları, işte bu mantık doğrultusunda öncelikle düşük seviyeli listeleri oluşturur ve bu düşük seviyeli listeler üzerine yapılan işlemlerle sonuç listesini meydana getirirler. Bu bilgiler ışığında GROUP BY alt cümlesinin tanımı şu şekilde olabilir;
- Cümleden sonra parametre olarak belirtilen alanın veya alanların değerine göre düşük seviyeli listeyi parçalara ayırır, belirtilen alanın veya alanların kaç farklı değeri var ise o kadar düşük seviyeli liste oluşturur.
Bu tanım biraz daha aklınıza yattı değil mi.. ?
Peki şimdi bir de COUNT(*), MIN, MAX, AVERAGE gibi fonksiyonların nasıl çalıştıklarını anlatmaya çalışalım;
- Tüm bu fonksiyonlar, düşük seviyeli listenin tamamı üzerine çalışır. Eğer düşük seviyeli liste GRUOP BY ile bölünmüş ise, her bir parça için ayrı ayrı çalışırlar.
Yani son SQL cümlesinde yer alan Count(*) işlemi her Price değeri için bölünmüş olan düşük seviyeli listenin herbir parçası için çalışır. Ve ortaya sonuç listesi olarak, her parçanın içerisinde yer alan kayıt sayısı ve her parçanın ayıraçı konumundaki Price bilgisi çıkar. Örnek;
Count(*) – Price
5 60
7 70
… vb.
Peki biz şu şekilde bir SQL cümlesi yazacak olursak;
SELECT Count(*), Price, Name
FROM Customer
WHERE Price < 100
AND Price > 50
GROUP BY Price
Veri tabanı bize hata verecektir. Hemen aklınızdan ‘Kardeşimmmm bu ne hatası böyleee…. eee Customer üzerinde Name var.. neden görmez bunu bu salak..’ vb. düşünceler geçebilir. Aman geçmesin çünkü veri tabanı manyağı haklı. Peki neden haklı onu inceleyelim;
Şimdi öncelikle düşük seviyeli listenin ne olduğunu bulalım;
- Price bilgisi 100 ile 50 arasında olan Customer bilgileri.. Id, Price, Name…vs.. vs.. Bu listeye ‘A’ listesi diyelim.
‘GRUOP BY’ işlemi olduğuna göre, elimizdeki düşük seviyeli ‘A’ listesi Price bilgisinin değerlerine göre bölümlere ayrılmıştır. Örnek olarak Price bilgisi 5 farklı değere sahip olsun elimizdeki ‘A’ listesi ‘A1, A2, A3, A4, A5′ şeklinde küçük listelere ayrılır.
Daha sonra COUNT(*) işlemi ile bu her bir küçük listenin adet bilgisi ile Price ve Name bilgisi sonuç listesine verilmiştir. Peki burada ki gariplik ne, neden hata veriyor. Sorun şu A listesinden A1′e geçiş sırasında her bir Price’a karşılık ‘n’ adet Name bilgisi oluşmuştur bu nedenle sonuç listesi oluşturulurken, Count bilgisi hesaplanmış, Price bilgisi tek olduğu için alınmış fakat hangi Name bilgisinin kullanılacağına karar verilememiştir.
Düşük Seviyeli Liste’nin son hali..
| Id | Price | Name |
| 1 | 60 | Test60-1 |
| 2 | 60 | Test60-2 |
| 3 | 70 | Test70-1 |
| 4 | 70 | Test70-2 |
| 5 | 80 | Test80-1 |
| 6 | 90 | Test90-1 |
‘Group By’ uygulandıktan sonraki düşük seviyeli listenin hali;
| Price | Alt Kümeler | ||||||
| 60 |
|
||||||
| 70 |
|
||||||
| 80 |
|
||||||
| 90 |
|
İşte bu da son ipucu; SQL programlama dilinde herhangi bir liste oluşturabilmek için bir kademe altta yer alan listenin elemanları direkt olarak kullanılabilir ya da fonksiyonlar yardımı ile alt listelere ulaşılıp, toplam, en küçük, en büyük, ortalama.. vb. değerler elde edilebilir.
Kolay gelsin.
Jul 29th
Merhabalar arkadaşlar,
“Uzun bir aradan sonra tekrar birlikteyiz ben …” şeklinde bir cümle kurmayacağım, ben de biliyorum bu aralar tembelleştim, önceden ne güzeldi sık sık ve güzel güzel yazıyordum ama ya şimdi aradan aylar geçmesi gerekiyor, elime kalem alabilmem için :P (Duyan da gerçek yazar zennedecek :) ) Neyse bugün kü konumuz “SQL nedir, ne değildir ?”
Şimdi aklınızda şöyle bir soru olabilir “beee adam canın mı sıkıldı oturuyorsun SQL hakkında yazı yazıyorsun ?”. Olabilir diyorum ya olabilir, illa olacak diye bir kaide yok. Ben size genede nedenini söyleyeyim, memleketimin yazılımcılarının SQL ile arasının pek olmaması nedeni ile bu yazıyı yazıyorum. Açıklayıcı olması için ve gerçek örneklerle bu yazıyı yazmaya çalışacağım, gariplikler görürseniz şaşırmayın.
Öncelikle bu SQL ne değildir ? sorusuna cevap arayalım. SQL programlama dili animasyon yapımında, gelişkin matemetiksel işlemlerde veya işletim sistemi yazımında kullanılmaz, kullanan var ise hemen anlından öpeyim bitsin bu çile.
Peki nedir bu SQL ? diye soracak olursanız;
- Sadece veriler üzerinde işlem yapmak için tasarlanmıştır. Bu nedenle basit anlamda 4 adet işlemden oluşur. Bu işlemler listeleme, güncelleme, ekleme ve silmedir. (SELECT, UPDATE, INSERT, DELETE)
- Kendi kendine herhangi bir şekilde çalışamaz, veri tabanı uygulamaları tarafından veriler üzerinde işlemler yapabilmek için kullanılırlar. (Malesef tüm veri tabanı uygulamarı üç aşağı beş yukarı, ufak da olsa bir takım farklılıklarla SQL dilini destekler.)
- Sonuç olarak, SQL programlama dili veri tabanı uygulamaları tarafından derlenen ve çalıştırılan (bu nedenle veri tabanı uygulamasına göre çalışması değişebilen), sadece verilere hükmetmek için kullanılan, evrensel bir programlama dilidir.
http://en.wikipedia.org/wiki/SQL adresinden daha fazla bilgiye ulaşabilirsiniz. Hemen belirtmem gereki ki; SQL programlama dilinin bazı versiyonlarıda bulunmaktadır, veri tabanları hangi SQL versiyonuna destek verdiklerini belirtirler. Bu versiyonları biraz tarif etmek gerekir ise;
SQL-86: Bildiğimiz standart SQL cümlelerinden oluşur, herhangi bir ek yoktur. Kısaca tüm dünyanın ~%95′i sadece bu kadarlık kısmını kullanılır.
SQL-1999: Bildiğimiz SQL cümlelerinin üzerine birçok yeni özellik eklenmiştir ki saymakla bitmez, kısaca SQL programlama dilinin programlama dili olduğu versiyon bu versiyondur.
SQL-2003: Tüm bu özelliklere XML ile çalışabilme özelliği eklenmiş ve ortaya bu versiyon çıkmıştır.
SQL-2006: Artık bu versiyonda XML entegrasyonu konusunda ‘Yok artık löbran ceyms’ konumuna ulaşmış ve XQuery (XML Query Language)’de desteklemeye başlanmıştır.
Sizleri çok endişelendirmeden hemen konumuza girelim; Biz bu yazımızda sedece; SQL-86′yı inceleyeceğiz. İşe sizlere küçük bir ipucu vermek ile başlayacağız, (bu belirteceğim ipucu SELECT cümlesi içerisinde listeme sırasında veri üzerinde herhangi bir değişikliğin yapılmadığı durumlarda geçerlidir) aslında ‘INSERT’ hariç tüm cümleler bir çeşit ‘SELECT’ cümlesidir tek bir farkla ‘UPDATE’ kayıtları ekrana yazmak yerine güncellerken, ‘DELETE’ ise kayıtları siler. INSERT’in durumu ise, çok vahimdir işi gücü belirtilen tek kayıdı veya SELECT cümlesi ile bulunmuş bir kümeyi tabloya eklemektir.
Örnek vermek gerekir ise;
SELECT *
FROM Customer
-- OR
DELETE *
FROM Customer
-- OR
UPDATE Customer
SET Name = 'Hebele'
-- Farklı olan INSERT
INSERT
INTO Customer (Name)
VALUES ('Hebele2')
Yukarıda belirtiğim gibi aslında sizler SELECT cümlesini öğrendiğinizde geri kalan tüm işlemleri aşağı yukarı öğrenmiş olursunuz. Şimdi bu nedenle bizler SQL programlama dilinin en önemli özelliği olan SELECT cümlesi üzerine yoğunlaşacağız.
Hemen ikinci ipucunu verelim; SELECT cümleleri içerisinde yer alan komutlar üçe ayrılır. Bunlardan birincisi verileri süzme işlemidir bu işlem WHERE alt cümlesi ile yapılır, başka bir komut ile süzme işlemi yapılmaz. İkinci komut sıralama işlemidir, sadece ‘ORDER BY’ alt cümlesi ile yapılır. İşte işin zor kısmı listeme sırasında yapılacak işlemler için ise ‘GROUP BY, HAVING, ROWNUM, LIMIT, TOP, COUNT, MAX, MIN, AVARAGE……’ ve daha zilyon tane alt cümle kullanılabilir, tüm bunların hepsi yani WHERE ve ORDER BY haricindekiler, oluşan liste üzerinde değişiklik yapar veya liste üzerinden farklı listeler, farklı veriler elde etmeye yararlar.
Örnek vermek gerekir ise; Yeri gelmişken SQL cümleleri nasıl okunmalıdır, bunun da örneğini yapalım.
SELECT Name, Price -- Name ve Price alanlarını göster FROM Customer -- Customer'ın WHERE Price < 100 -- Price'ı 100'den küçük olanların ORDER BY Price DESC -- Price bilgisi büyükten küçüğe doğru sıralanmış olsun. -- Peki biz 100'un altında kaç tane kayıt olduğunu öğrenmek istersek SELECT COUNT(*) FROM Customer WHERE Price < 100 -- Peki biz 100'ün altında yer alan fiyatlardan hangisinden kaç tane bulunduğunu öğrenmek istersek; SELECT Count(*), Price FROM Customer WHERE Price < 100 GROUP BY Price
Bir sonraki yazımızda SELECT konusuna daha fazla değineceğiz.
Kolay gelsin.
Jul 16th
Merhabalar,
Öncelikle bu kadar uzun bir süre yazı yazmak ilginç oluyor. Bir aydan fazla bir süredir, nokta koymadığım bu günlüğe birşeyler yazmak biraz yabancı geldi açıkcası.
Bu yazıyı yazmam için beni birazcıkta olsa gaza getiren sevgili Mehmet DURAN kardeşime buradan teşekkür etmek isterim.. şak şakk şakk şakk.. javaayyyyy diyorum sana Mehmet.. :)
Öncelikle bu yazıdaki konumuzu belirteyim; Ruby programlama dilinde değişkenlerin nasıl tanımlandığı ve değişkenler üzerinde tip dönüşümlerinin nasıl olduğu.
Ruby’de değişkenler tanımlanırken herhangi bir şekilde tip belirtmenize gerek yoktur. İsterseniz Java veya C#’da yaptığınız gibi yapabilirsiniz ama o zaman biraz ayıp olur.. yuhananırsınız.. ohaa artık diyenler olabilir. Şöyledir yani;
intValue = 5
strValue = 'Hobaaa'
arrValue = []
hashValue = {}
regValue = \.*\
classValue = MyClass.new
Öncelikle programlama dillerinde değişken tiplerinin dönüşümü ve bu tiplerin ele alınmasını iki soru altında toplanabiliriz; Bu sorular
1. Tipler arasındaki dönüşüm nasıl gerçekleşir?
2. Değişken üzerinde işlem yaparken tip önemlimidir?
Öncelikle 1. soruyu ele alalım; “1. Tipler arasındaki dönüşüm nasıl gerçekleşir?”
El cevap: Eğer değişkeninizi bir tipten öteki tipe hödöö hödöö diye gönderiyorsanız, kullandığınız dil dinamik tip dönüşümüne sahiptir demektir. Eğer hödö hödöö diye değil de, daha efendi bir şekilde (örnek: ‘String.valueOf(55)’) yapıyorsanız durağan tip dönüşümüne sahipsiniz demektir. Değişkenlerinizi bir tipten öteki tipe değiştiremiyorsanız, ohaaa sizin o kullandığınız şey programa dili değil çin işkencesi demektir.
Programlama dillerine göre dinamik ve durağan tip dönüşümüne sahip olan diller;
Dinamik: Ruby, Python..vb.
Durağan: Java(yyyy), C#….vb.
İkinci soruyu ele alırsak; “2. Değişken üzerinde işlem yaparken tip önemlimidir?”
El cevap: Eğer siz bir karakter ile sayiyi toplamak isterseniz veya benim bir değerim var ama inan ben bile bilmiyorum ne olduğunu öyle yanar dönerli birşey işte.. (Basic’den Variant, C’den void) diyebiliyor iseniz, sizin için değişkenin tipi pekde önemli değildir. Yani değişkenler ile değişken tipleri arasındaki bağlantı ‘zayıf’tır. Her değişkenin veya her işlemin tipi olmasına gerek yoktur, diyebilirsiniz. Ama dersenizki ‘hadeee canım, tipsiz tipsiz değişkenmi olur, tipli adamın tipsiz değişkeni olmaz’ derseniz, tüm değişkenleriniz ile değişken tipleri arasında ‘güçlü’ bir bağlantınız var demektir.
Güçlü: Ruby, Java(yyyy), C#, C++…vb.
Zayıf: C, Basic, Java(yyy)Script….vb.
Peki Ruby’de bunlar nasıl oluyor da oluryor diyeceksiniz şimdi; İşte böyle oluyor..;
intValue = 5 puts 5 + intValue # problem yok. puts "5" + intValue # büüürrrstt nereye biraderr.. puts "5" * "5" # bürrsttt yok daha neler.. # bir string(a) ile numarayı(b) çarptığınızda, ruby sizin a'yi b kez tekrarlamak istediğinizi zanneder. puts "5" * intValue # Olur, bunun ruby'de karşılığı vardır.
Kolay gelsin..!
Jun 13th
Merhabalar,
Geçtiğimiz bir ay içerisinde hayatımda olup biten değişikliklerin toplamı belkide beş senedir başıma gelmemiştir. Kardeşim insan hayatı değişir değişirde bu kadar mı değişir. Aslına bakarsanız depresyona bile girdim ama teşhis koyamadım (ne olduğunu bilmiyorum ki, sanki siz biliyorsunuz?). Tek bildiğim önceden sevgili eşime çok uyuduğu için ‘tavuk’ lakabını uygun görürken, şimdilerde eşim televizyon seyrederken;
- ‘Agghhh… benim uykum geldi ben yatıyorum’ diyorum,
- ‘Daha erken, sana iyi uykular canım…!’ diyor…
Bu durumda iki seçenek var; ya gülme komşuna gelir başına olayı ya da ben depresyondayım. Kolay mı kardeşim? 5 Mayıs 2007′de evlendim, iyi tamam süper, eşimi çok seviyorum, zaten uzun süredir beraberdik o yönden pek bir değişiklik olmadı ama, (burada ‘ama’nın altı özellikle çizili) haftanın ortalama 6 günü akşam yemeklerini dışarda (yani Taksim’de) yiyen ben.. artık tüm yemekleri evde yiyorum! Taksim’i ancak hafta sonlarında, açık görüş olduğunda :P ve rüyalarımda görebiliyorum. Tüm bunların yanında bir de şu Vodafone Türkiye olayı çıktı ama nasıl çıktı, anlatayım; evlenir evlenmez dinlenmek için bir hafta tatile çıktım (ohhh canıma değsin iyi ki çıkmışım) tatilden dönmek üzere iken şu anki patronum Osman Ataker’den bir telefon aldım. Kendisi bana pazartesi Vodafone Türkiye’ye gitmemi, bundan sonra orada danışmanlık hizmeti vereceğimi söyledi. Gittim, ve halen Vodafone Türkiye’de danışmanlık hizmeti vermekteyim.
Şimdi ben size bunları anlattım ama siz bir gariplik göremediniz değil mi? Evet göremezsiniz tabii, çünkü “yok” sadece evlilik, ortam ve arkadaş değişiklikleri hepsi bir arada fazla geldi aslında :). Demek ki neymiş, herşeyinizi bir anda değiştirmeyin, tamam benim için önemli değil siz değiştiriyorsanız değiştirin de benim değiştirmemi istemeyin.
Şimdi sizlere biraz da Vodafone Türkiye’nin Bilgi İşlem-Yazılım Geliştirme (IT-Software Development) bölümünden bahsedeyim, belki aranızda burada çalışmak isteyenler olabilir. Aslında Vodafone’un bilgi işlem bölümü diğer rakiplerine göre biraz daha küçük, çalışan sayısı daha az ama gene de aynı işi yapıyorlarki sizlere yani Vodafone kullanıcılarına hizmetler sorunsuzca ulaşıyor. Tam rakamı bilmiyorum ama tüm bölümler ile beraber toplam ~300 kişiden oluşuyor. Tüm yazılım geliştirme proseslerinde tahmini ~100 kişi (fazlası olabilir) çalışmakta. Tüm bu insanların açık bir ofiste beraber çalıştıklarını düşünün, işte orası Vodafone’un IT bölümü :). Yaklaşık 100~120 metre uzunluğunda, 50~70 metre genişliğinde bir açık ofiste veri tabanı yöneticilerinden tutunda, testçilere kadar herkes bu açık ofiste çalışıyor, kaynaşıyor, gülüşüyor :) kısaca hafta içi hergün sabah 08:00′inden akşam 17:00′ına kadar yaşıyor, fazla mesai yapanlar da cabası :(. Küçük bir bilgi, yöneticilerin ayrı bir odası yok, IT’nin başındaki kişi de bu açık ofiste çalışıyor. Yakın zamanda Maslak’a taşınmayı düşünüyorlarmış, o zamana kadar halen danışmanlık görevim devam ederse, bana da Maslak yolları gözüküyor. Hemen eklemekte fayda var, sanırım halen işe alım süreci devam ediyor, bilginize.
Kolay gelsin..
Jun 4th
Merhabalar arkadaşlar,
Küçük bir yazı olacak, sadece sizlere JRuby’nin 1.0 Release Candidate 3 sürümünü duyurmak için bu yazıyı yazıyorum. Evet doğru duydunuz, JRuby takımı Microsoft’tan daha hızlı davranarak (yarış halen bitmedi, gerçi ortada bir yarış var mı onu da bilmiyorum ama :) ) RC3′de olsa 1.0 sürümünü dünyaya *nihayet* duyurdu.
Şimdi aklınızda soru işaretleri olabilir, Hemen sizlere JRuby’nin ne olduğunu anlatmaya çalışayım. Aslında sizler normal Ruby uygulamalarınızı yazıyorsunuz, çalıştırıyorsunuz..vs..vs. Fakat sonra canınız sıkılıyor, neden sıkılıyor bilmiyorum ama birden Ruby’de yazdığınız kodların Ruby’nin doğal ortamında değil de, Java Virtual Machine (JVM) üzerinde çalışmasını istiyorsunuz, nedenleriz şunlar olabilir;
- Performans amaçlı olabilir (bu konu tartışılır)
- Ruby’nin çalışmadığı fakat java’nın çalıştığı bir ortamda çalıştırmak için (Hangi ortam o ?? belki vardır, bilen varsa yazsın…)
- Müşterinizi ‘ben programı Java’da yazdım’ diye kandırmak için :)
galiba en geçerli neden bu sonuncusu :).
Ama sonuçta güzel, hoş ve desteklenmesi gereken bir olay. Ruby dili çok güzel ve akıcı bir yapıya sahip neden JVM’yi kullanmak istiyenler bu güzel dili kullanmaktan mahrum kalsınlar ki.. ciddiyim, espiri falan yapmıyorum, tamamiyle destekliyorum.
Rails kullanıcılarına önemli bir not, RoR altyapısı tamamiyle Ruby’de yazıldığı için JRuby yoluyla JVM üzerinde de dolayısı ile Java Application Server’lar üzerinde çalışabilir hale gelmiştir. Özellikle sağlam veri tabanı özelliklerini kullanan uygulamalarda bu sayede hız artışı sağlanabilir. (Henüz 1.0 RC3′ü inceleyemedim ama bazı kısıtlardan bahsediliyor fakat kesin bir şey söyleyemiyorum.)
Kolay gelsin…
May 23rd
Merhaba arkadaşlar,
Bugünkü yazımızda Struct ve OpenStruct yapılarından bahsedeceğiz. “Bu yapılara neden ihtiyacımız var ?”, “Var olan ‘class’ yapısı veya bu işlemlere benzer olan ‘Array’ ve ‘Hash’ yapılarını neden kullanmıyoruz ?”, “Bu kadar fazla öğrenmemiz gereken sınıf, yapı ve işlev varken neden bir de başımıza bu ikisi çıktı ?”, ve son olarak “Ne işimiz var kardeşim Struct ile falan, bunlar boş iş.. ne yapacan öğrenip de..!?” gibi soruları cevaplamak gerekir. Ama tüm bu sorulardan önce ben neden bu yazıyı yazıyorum onu anlatmalıyım sanırım. Bu yazıyı bu linkte yer alan bir yazıyı gördükten sonra yazmaya karar verdim. Bu yazıda blog sahibi arkadaş Ruby on Rails’de ActionMailler kullanımı sırasında kullanmış, çok da güzel kullanmış. Ben de kendi kendime ‘Ben de bunu bizimkilerle paylaşayım’ dedim. İyi ettim di mi ? ettim ettim.. :)
Hatta ve hatta çok da güzel bir snippet’da mevcut. Bir göz atmanızı tavsiye ederim.
‘Struct’ ruby içerisinde yer alan ‘Class’ benzeri bir yapı, aslında Class’dan türemiş farklı bir yapı. Şöyleki normalde yeni bir ‘class’ yaratmak istediğimiz de
[ruby]
class YeniSinif
attr_reader …
attr_writer …
attr_accessor …
def …
end
…
end[/ruby]
şeklinde ‘YeniSinif’ı yaratır ve bu sınıftan nesneler üretmeye başlayabiliriz. Struct, sadece veri taşımak için tasarlandığı için şu şekilde bir tanımlamaya ihtiyaç duyar;
[ruby]
# Temel Struct tanımı…
Adres = Struct.new(:posta_kodu, :sehir, :ilce, :semt, :mahalle, :apt_no, :apt_isim, :daire)
[/ruby]
anlaşılacağı üzere, herhangi bir şekilde erişim belirleyicisi tanımlanamaz (private, protected, public gibi) tüm üyeler public’dir. Önemle belirtmem gerekirki, bu yeni oluşturduğum ‘Adres’ bir nesne değildir, bir sınıftır yani yeni bir türdür(type). Peki biz neden ruby içerisinde yeni bir tür(type) yaratmak istedik ? Örnekten de anlaşılacağı gibi, normal hayatta adres bilgisinde posta kodu, şehir, ilçe…vb bilgiler birbirlerinden ayrılamazlar ve mantıksal anlamda da bir birliktelikleri vardır. Elbette kullanmazsak programlarımızda çok büyük problemler çıkmaz ama bazı durumlarda bize çok büyük kolaylıklar sağlayabilir; örnek vermek gerekir ise; Struct kullanmadan adres yapısının kopyalanması;
[ruby]
yeni_posta_kodu = posta_kodu
yeni_sehir = sehir
yeni_ilce = ilce
yeni_semt = semt
…
…[/ruby]
peki Adres diye bir tür kullansaydık ve işlemleri bu tür üzerinden yürütseydik;
[ruby]
yeni_adres = adres.clone # Bu kadar.. :)
[/ruby]
şeklinde küçücük bir kod parçası ile bu işlemi yapabilirdik. Peki hemen aklınıza gelebilir, zaten sınıf(class) yapısı mevcut ben struct yerine class kullanamazmıyım ? Elbette kullanabilirsin, class, struct’ın yapabileceği tüm özelliklere sahip temel ve en genel yapıdır. Struct sadece verileri tutmak için yapılmış ve bu iş üzerine yönelmiş class’ın alt sınıfıdır. Yukarıda da bahsettiğim snippet incelenecek olursa, bu konu daha rahat anlaşılır diye tahmin ediyorum.
Peki “Struct sadece verileri tutmak için yapılmış ve bu iş üzerine yönelmiş class’ın alt sınıfıdır” dedik, bu veri tutma işinde bizlere hangi özellikleri vermektedir. Struct, class’lardan farklı olarak bizlere bir Array veya Hash nesnesine erişir gibi içerisinde yer alan özelliklere erişimimizi sağlayabilir. Şöyleki;
[ruby]
adres = Adres.new()
# veya
# adres = Adres.new(34300, “İstanbul”, “Fatih”, “Cerrahpaşa”, “ZZZZ ZZZ ZZZZ ZZ”, 1, “Gonca”, 18)
adres.posta_kodu = 34300
adres.sehir = “İstanbul”
puts adres[:posta_kodu] # 34300
puts adres["sehir"] # İstanbul
puts adres[1] # İstanbul
puts adres.members # üyelerin isimlerini verir.
puts adres.values # üyelerin değerlerini verir.
adres.each_pair do |key,value|
puts key.to_s + “:” + value.to_s
end[/ruby]
Bir sonraki yazımda OpenStruct’u anlatmaya çalışacağım… :)
Kolay gelsin :)
May 18th
Merhabalar arkadaşlar,
Bir önceki yazımda Ruby ile gerçekleştirdiğim yedekleme sisteminden bahsetmiş ve tanımlarının nasıl yapılması gerektiğini anlatmıştım. Bu yazımda ise kod bloğunu sizlerle paylaşarak bazı ipuçları vermek istiyorum. Böylece eğer isterseniz, uygulamayı kendinize göre değiştirmeniz daha kolay hale gelecektir.
Diğer tüm yazılarımda olduğu gibi hemen konumuza geçelim. Rackup.rb dosyasını parça parça işleyeceğiz.
[ruby]
$stdout.sync = true
require ‘yaml’
begin
require “zip/zip”
rescue Exception => err
puts “Error: You should execute ‘gem install rubyzip –include-dependencies’ command, before run this program..”
puts err.message
exit
end
[/ruby]
Bu bölümde, eğer ‘rubyzip’ kütüphanesi yok ise, oluşan hata program tarafından yakalanır ve kullanıcıya sorunu nasıl giderebileceği belirtilir.
[ruby]
begin
config = YAML::load(IO.read(ARGV[0] || “rackup_config.yaml”))
rescue Exception => err
puts “Error: Configuration file can not be found..”
puts err.message
exit
end
[/ruby]
Bu bölümde ayar dosyası disk üzerinden okunmaya çalışılır.
[ruby]
IO.read(ARGV[0] || “rackup_config.yaml”)
[/ruby]
ARGV[0]: Gelen ilk parametre anlamındadır.
Eğer gelen bir parametre var ise onu, eğer gelen herhangi bir parametre yok ise “rackup_config.yaml”yi yani standart ayar dosyasını kullanmasını söyler.
[ruby]
source_folder = config["source"]
source_include_sub_folders = (["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)
source_file_extension = config["file_extension"] || “*”
target_folder = config["target"]
target_prefix = config["prefix"]
target_postfix = config["postfix"]
[/ruby]
bu bölümde ise ‘yaml’ içersinden yedekleme işlemi ile ilgili bilgiler okunur.
[ruby]
# Tüm evet anlamına gelen ifadeler kullanılmıştır..
(["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)
[/ruby]
config["include_subfolders"] bilgisine “true”, “yes”, “evet”, “yeah”, “y”, “e”, “1″ bilgilerinden herhangi birinin yazılsının ‘true’ olacağını ifade eder.
[ruby]
source_files = nil
if source_file_extension.include?(“,”)
source_files = File.join(“**”, “*.{#{source_file_extension}}”)
else
source_files = File.join(“**”, “*.#{source_file_extension}”)
end
puts “Source dir is #{source_folder}”
puts “Target dir is #{target_folder}”
puts “File type is #{source_files.to_s}”
if File.directory?(source_folder) == false || File.directory?(target_folder) == false
puts “Error: Source or target folder can not be found..!”
exit
end
[/ruby]
Bu bölümde ise birden fazla dosya uzantısı (file_extension) tanımlandı ise farklı bir takım işlemler yapar. Hedef ve kaynak dizin ile dosya uzantılarını ekrana yazar. Hedef ve kaynak dizinlerin varlığını kontrol eder.
More >
May 17th
Merhaba arkadaşlar,
Bu yazımda daha önceden de bahsetmiş olduğum ve son iki yazımda da alt yapısını oluşturduğum Ruby Backup (Rackup) uygulamasını sizlere tanıtacağım.
Öncelikle belirtmem gerekir ki; Bu uygulamayı ben kendim için geliştirdim, nedenlerini anlatayım;
- Paranoyaklığımdan ötürü (ve elbetteki kodları kaybetmenin mazereti olmayacağını bildiğim için) kullandığım versiyon kontrol yazılımının yetmeyeceğini, birgün bana inat çok önemli bir dönemde çökebileceğini düşünerek yazdığım programların kopyasını almaya başladım.
- Diğer neden ise tembelim.. evet evet tembelim, her seferinde klasörleri tek tek seçip sıkıştır daha sonra sıkıştırma işlemi ile oluşturduğun dosyayı nispeten daha güvenli olduğuna inandığım bir aygıta kopyalamak yerine… :) oturdum bu işleri benim yerime yapacak Rackup uygulamasını geliştirdim. İyi de ettim diye düşünüyorum. Hatta iş arkadaşlarım kullanmaya başladılar bile. Elbette onlar için de birkaç geliştirme yapmak ve hata düzeltmek zorunda kaldım. ‘Bırak olduğu gibi kalsın kardeşim ne hatası ne düzeltmesi’ diyecek oldum.. ama diyemedim.. :D siz de demeyin. bulduğunuz hataları bana iletin.. ben de sizlere peşin peşin teşekkür edeyim :)
Neyse konuyu şimdiden uzattım bile. Hemen Rackup uygulamasının içeriğine başlayalım.
Öncelikle projenin dosyalarına buradan ulaşabilirsiniz.
Programı çalıştırabilmek için bazı işlemleri yerine getirmeniz gerekli, bunlar;
Bir sonraki yazımda Rackup.rb’yi daha detaylı bir şekilde açıklamaya çalışacağım.
Kolay gelsin :)
May 15th
Merhabalar arkadaşlar,
Bugünkü yazımızda ‘.yaml’ (YAML A’int Markup Language) uzantılı dosyalar nasıl okunur, nasıl işlenir gibi konuları ele alacağız. Bir önceki Ruby Zip Kütüphanesi adlı yazıda belirttiğim Ruby Backup (Rackup) uygulaması için gerekli bir konu olduğu için öncelikle bu konuyu inceleyeceğiz.
Peki YAML dosyalarına neden ihtiyacımız var. XML ile bu işlem yapılamaz mı ? Elbette yapılabilir. Ama Ruby on Rails’de (RoR) veri tabanı bağlantılarını kontrol eden dosya bir yaml dosyası ‘database.yaml‘. Neden ? Cevap; Okunabilirlik.
XML dosyalarına göre YAML dosyalarını değiştirmek, bazı durumlarda, çok daha kolay ve hızlı olabiliyor. Elbetteki bunun tersi durumlarda söz konusu fakat önemli olan alternatif olması ve bazı durumlarda da avantajının olduğunun bilincine vararak kullanmak. Özellikle bir sonraki yazımda yazmayı planladığım Ruby Backup projesinde kullanıcıların fazladan herhangi bir bilgiye ihtiyaç duymadan bazı ayarları değiştirmeleri ve/veya eklemeleri gerektiğinde kullanılabilirliği XML’den fazla olduğu bir gerçek. Neyse lafı fazla uzatmadan hemen konumuza geçelim;
Kuruluma ihtiyacı yoktur. Ruby’nin çekirdek sınıfı içerisinde yer alır. Öncelikle YAML dosyaları neye benzer bir örneğini verelim;
[ruby]
# Standart yorum satırı
kaynak:
dizin: c:\Document And Settings
alt_dizinler: yes
dosya_uzantılari: doc,xls,txt,msg,html
hedef:
dizin: c:\Backup
ön_ek: Document
son_ek: Office
[/ruby]
Görüldüğü gibi türkçe karakterleri kullandık.. :) Yukarıda belirtiğimiz dosyayı ‘config.yaml’ olarak bir dizine kayıt ettikten sonra, aynı dizinde
More >
May 14th
Merhabalar arkadaşlar,
Uzun ama çok uzun bir aradan sonra tekrar merhaba :). Evlilik hazırlıkları, nikah sonrası dinlenme derken nihayet bugün ilk blog yazımı yazma fırsatı buldum. Öncelikle nikah törenimde beni yanlız bırakmayan tüm arkadaşlara teşekkürlerimi tekrar iletmek isterim. Gerçekten insan bu gibi günlerde etrafında arkadaşlarını görmek istiyor. Şimdi ben bu şekilde yazı yazdım ya.. gelemeyenleri hemen bir telaş almış olabilir :) merak etmesinler, korkacak birşey yok hiç birini öldürmeyeceğim… yani şimdilik :)
Lafı uzatmadan bu yazımızın konusu olan RubyZip’i (Ruby için sıkıştırma kütüphanesi) incelemeye başlayım. Kullanımı diğer tüm Ruby kütüphaneleri gibi oldukça kolay olan bu sıkıştırma kütüphanesinin kurulumuda oldukça basit….
‘gem install rubyzip –include-dependencies‘
şeklinde kurulumu gerçekleştirililyor.
More >
Apr 12th