PINguAR.org
Uykusuzluk insanın hayal gücünde ve görme yetisinde oyunlar oynayabiliyor. Aşağıdaki fotoğrafa ilk baktığımda, Matz’ın (en sağdaki) yerlere kadar uzanan kırmızı bir pelerin giyen, göğsünün ortasında kocaman bir M yazan bir süperkahraman olduğunu falan zannettim
Herneyse, harika bir vidyo: Kenji Hiranabe, Shintaro Kakutani, ve bizim Matz C++, Java ve Ruby’yi irdeliyorlar (ingilizce altyazı mevcut).

Diğer güzellik de Rails Podcast’inin yeni bölümü. Çoğu devchix‘ten olan bağyanlar ile bilişim ve programlama dünyasında kadınlar hakkında sohbet etmişler:
Bu sene gördüğümüz son sınıf dersleri arasında “Yazılım Mühendisliği” diye bir ders var. Aslında hep teori içerikli gittiği için; öğretici olabilecek bu ders öğrenci psikolojisi karşısında direnemiyor ve anlatılanlar bir kulağımızdan gidip ötekinden çıkıyor
Ancak hepimiz içgüdüsel olarak yazılım geliştirme konusunda kendimize göre yöntemler uygulamışız zaman içinde: mesela ben 1. sınıftayken ucundan tek kişilik ? extreme programlama yapıyor olduğumu farkettim * *. Programın tasarım sürecini göz ardı ederek direkt kodlamaya geçiyordum; hızlı geliştirme/bol bug oluyordu haliyle. Ya da yıllardır üst sınıflardan aldığımız bazı derslerin ödevlerini yeni ihtiyaçlara göre ‘modifikasyon’ ederken aslında reengineering yapıyormuşuz…
Açıkçası yazılım geliştirirken genel/geçer kuralları izlemiyorum. Ama daha iyi bir geliştirici/mühendis olmak için bazı kuralları akılda bulundurmakta fayda var. Deneyimli Ruby hackerlarından Yurii Rashkovskii, dün daha efektif bir geliştirici olmak için bir kaç ipucu vermiş. Bazıları benim de benimsediğim kurallar olduğu için bahsettiği ipuçlarına burada yer vermek istedim:
Planlama
Planlama şüphesiz bir yazılım için olmazsa olmaz adımlardan biri. Her ne kadar yazılım hakkında tasarladığınız bir takım adımlar olsa da; direkt kafanızdaki taslak ile kodlamaya geçerseniz mutlaka geri dönmeniz gereken adımlar oluyor. Yurii’nin önerdiği planlama şöyle:
- Yapmanız gereken işlerin bir listesini hazırlayın
- Kısa zamanda bitecek işleri ‘Rightnow’ dizinine koyun
- Ertesi gün bitmesi gerekenleri ‘Today’, haftaya kadar bitirilmesi gerekenleri ‘ThisWeek’, … vb. dizininlere koyun
- Bunları yaparken görevleri kısa ve açıkça belirleyin
- Zamanlama konusunda gerçekçi olun
Ben planlama için genelde kağıt-kalem
bunları webe aktarmak için de Ta-da List‘i kullanıyorum. Zihin haritalama programları da bu iş için alternatif olabilir.
Çalışma
- Öncelikli işleriniz için ‘Rightnow’ dizinine göz atın. Yapılacakları yapın, dizin boşaldığında Today’a, o boşaldığında bir sonraki dizine atlayın
- Ancak üzerinde çalıştığınız dizini bitirmeden bir sonrakine geçmeyin
Kaynak Kodun Yönetimi
Kaynak kodlarımız ortaya koyacağımız en önemli eser değil mi?
Hepinizin başına gelmiştir: kendi kendinize geliştirdiğiniz amatör uygulamalarda radikal bir değişiklik yaparken yedeğini alırsınız, bir süre sonra eğer sürüm numarası da vermesiyseniz iş içinden çıkılmaz hale gelir. Kendi subversiyon sunucunuzu kurmanıza gerek yok. *forge türü proje barındırma siteleri genelde bu hizmeti sunuyor.
- Versiyon kontrol sistemi kullanın: Subversion, Darcs gibi..
- Kontrol mesajlarınızın açıklayıcı olmasına dikkat edin
- trac ya da ona benzer bir scm kullanın
Kaynak Kod
Kodumuzu açık kaynaklı olarak yayınlamakla iş bitmiyor tabii. Anlaşılır kodlar yazmak için de bir dizi öneri var:
- İsimlendirme kurallarına uyun
- Anlamlı değişken, metot, sınıf adları kullanın
- Okunabilir kodlar yazmaya çalışın
- Kod boyutunuzu küçültmeye çalışın; eğer kullandığınız metodun daha kısa hali varsa onu kullanın *
- Kodunuzu depoya göndermeden önce gözden geçirin; beğenmediğiniz yerleri düzeltmeye çalışın
- Meslektaşınızdan kodunuzu 15 dakikalığına gözden geçirmesini rica edin
Bu zaten sıkça dile getirilen bir şey ama, aynı zamanda kodunuza yorum satırları eklemeye özen göstermelisiniz. Bu sadece kodu okuyana değil, uzun bir aradan sonra koda baktığınızda size de faydalı olacaktır.
Test
Yurii bu maddeyi daha çok Ruby kullancıları için özelleştirmiş. Test noktasında ben birşeyler söyleyeyim: yazacağınız metodun/sınıfın önce iskelet halini oluşturun. Böylece neler yapmanız gerektiğini önünüze koymuş olursunuz. Aynı zamanda belli bir işi yapan kod parçalarını interaktif kabukta deneyerek tüm programı derlemeden/çalıştırmak zorunda kalmadan test edebilirsiniz. Tabii test aşaması oldukça geniş bir alan. Pek çok argüman eklenebilir.
Sonradan gelen edit: Bugun konuyu biraz daha araştırayım dedim. Keşke daha önce rastlasaydım dediğim harika bir makaleye rastladım: “How To Write Unmaintainable Code”. Roedy Green tarafından yazılmış. Eğer benden önce davranan olmazsa en kısa zamanda Türkçe’ye çevireceğimdir
Dün INETD kapsamında IBM Linux’da seminerim vardı. Aslında Seminer-CG çalışanı olduğumdan bu tür seminerlere katılımcı sayısını az çok tahmin edebiliyordum, ama dünki seminere gelen katılımcı sayısının çokluğuna bir miktar şaşırdım diyebilirim. Seminer umduğum gibi güzel geçti. Aslında aynı gün olsa da iki seminerden oluşan bir etkinlikti. İlk seminerde Ruby’nin genel özelliklerinden bahsettim ve beraber kod örneklerine baktık. İkinci seminerde de bir kaç basit örnekle GTK ile arayüz tasarlamanın nasıl olduğundan bahsettim ve Glade ve Gecko kullanarak bir web tarayıcısı yaptık *.
İlk kısım 70, ikinci kısım ona nazaran daha insancıl olarak 25 slayttan oluşuyordu. Katılımcılara zafiyet geçirtmeden etkinliği bitirdiğime sevindim
Kısacası bir günlüğüne İstanbul’a gidip geldiğime değdi.
Birinci seminerin notlarına buradan, GTK ile ilgili seminere buradan ulaşabilirsiniz.
Tabii maraton henüz bitmedi
Bu Cuma da bizim üniversitemize bağlı Yenice Meslek Yüksek Okulu’nda “Pardus ve Yenilikleri” isimli bir seminer vereceğim. Aslında tek günlük bir özgür yazılım etkinliği olacak. Necdet hoca “Linux nedir? Neden Önemlidir?” diyecek, ardıdan Figen bir Firefox semineri, Şule de Openoffice semineri verecek. Bu kez sadece seminer vereceğimiz öğrencilere faydalı olacağımız için değil, seminer camiasına iki yeni arkadaşı da katacağımız için mutluyuz (kendileri aynı zamanda bilgi işlem‘de beraber çalıştığım iş arkadaşlarım). Umarım güzel bir etkinlik olur…
Daha önce “Ruby Advent Calendar” diye bir projeden bahsetmiştim. Proje Aralık ayı başından beri aktif halde ve her gün Ruby ile yazılmış minik betikler/siteler/bazen kütüphaneler yayınlanıyor. Mesela benim en çok işime yarayanı; dün (7 Aralık’taki) yayınlanan kod renklendirme aracı.
Sitenizin ya da blogunuzun css’ine burada yazan kodları yerleştiriyorsunuz, ve kodlamak için yine aynı sayfadaki kutucuğu kullanıyorsunuz. Ve Ruby kodlarınız aşağıdaki gibi renklendirilmiş oluyor (Eskiden bu iş için kodlarımı Lapis Nopaste‘e yapıştırıp html kaynağından da renklendirilmiş hallerini çalıyordum ama şimdi bloguma münhasır renklendirmem var
def power(x,n)
result = 1
while n.nonzero?
if n.modulo(2).nonzero?
result = result * x
n = n-1
else
x = x*x
n = n/2
end
end
return result
end
Advent Calendar’da daha ne gibi ilginç uygulamalar çıkacak merakla bekliyoruz
Birileri Ruby & Cep telefonları ile ilgili uktemi duymuş olacak ki, Ruby’nin Symbian üzerinde çalışan versiyonu resmi olarak duyuruldu. Aslında daha önce Ruby’yi Symbian OS’a port etmeyle ilgili planlar yapıldığını duymuştum, ama bugün karşıma böyle bir haber çıkınca sevindim açıkçası
Tabii ki GPL ile lisanslanmış ve S60 ve UIQ için POC kütüphanesi aşağıdaki özellikleri sunuyor:
Symbian paketini buradan indirebilirsiniz.
Not: Aslında bir süre önce Symbian’ı kurcalamayı planlamış, araya bambaşka işlerin girmesiyle * * bir türlü yeterince ilgilenememiştim. Bir göz atmak için iyi bir fırsat olabilir.
Ruby Inside tayfası Ruby Advent Calendar diye bir proje duyurdu. Projenin ayrıntıları henüz belli değil, ama kabataslakça; Ruby ile ilgili bir takvim projesi diyebiliriz. Aralık ayında başvuruya açılacak projenin Rss adresi burada. Ayrıca eklemek istediğiniz herhangi bir tarih varsa, buraya e-posta ile bildirebiliyorsunuz: rubyinside [et-ot] bigbold.com
Bir süre önce, Ruby’in de artık mainstream diller arasına girdiğinden bahsetmiştim. Ruby “ağır ama emin adımlarla ilerleme” sıfatının hakkını vererek bu ay 12. sıraya yükseldi.
Bakalım 1. sırayı kapabilecek mi? (Ve fekat dürüst olmak gerekirse… Ortada her cep telefonunda fink atan bir Java * *, ortadan kaldırdığımızda dünyadaki uygulamaların yarısından fazlasının duracağı bir Perl, ve aslında Ruby ile karşılaştırmanın anlamsız olacağı bir C varken * pek mümkün değil bu dileğim…)
Bilgisayar alanında okuyan her öğrenci, bir kere bile olsa; sıralama algoritmalarıyla uğraşmanın, bazen ne kadar vahim bir hal aldığını bilir.
Özellikle vize/finalde, türlü türlü sıralama algoritmasını performansına, zamanına, türlü kriterine göre sıralamaya çalışmak, bir yandan kodlamayı akla getirmek vs.vs… Pek de keyifli bir iş değil aslında; en son 2 sene önce C finalinde sadece Selection Sort için bir sayfa kod yazan bir insan olarak, aşağıdaki Ruby kodlarını sunmaktan gurur duyuyorum efem
a = [1,5,54,1,543,5,431,541,54,5,43]
def sort(array)
def min(array, from)
min_val = array[from..-1].min
min_idx = array[from..-1].index(min_val) + from
return min_idx
end
array.each_with_index { |v, i|
min_idx = min(array, i)
tmp = array[i]
array[i] = array[min_idx]
array[min_idx] = tmp
}
array
end
p sort(a)
a = [60,5,54,1,543,5,431,541,54,5,43]
def sort(f, array)
return [] if array.empty?
pivot = array[0]
before = sort(f, array[1..-1].delete_if { |x| not f.call(x, pivot) })
after = sort(f, array[1..-1].delete_if { |x| f.call(x, pivot) })
return (before << pivot).concat(after)
end
p sort(Proc.new { |x, pivot| x < pivot }, a)
a = [1,5,54,1,543,5,431,541,54,5,43]
def sort(array)
i = 0
while (i < array.size)
j = array.size - 1
while (i < j)
if array[j] < array[j - 1]
tmp = array[j]
array[j] = array[j - 1]
array[j - 1] = tmp
end
j -= 1
end
i += 1
end
return array
end
p sort(a)
Diğer algoritmalar için buraya bakabilirsiniz.
Ruby 1.9 ile gelecek yeniliklere hep beraber göz atalım:
String
hello".bytes.to_a # => [104, 101, 108, 108, 111]
Introspection
NilClass.instance_methods(false) # => [:to_a, :inspect, :yield, :to_f,
, :to_s, :&, :to_i, :^, :nil?]
Syntax
def m(a, b=nil, *c, d)
[a,b,c,d]
end
m(1,2) # => [1, nil, [], 2]
… Tamamı için Changes in Ruby 1.9.
Not #1: Ruby sonunda mainstream diller arasına girdi. Meşhur TIOBE istatistiklerine göre 13. sıradan A listesine girmeyi başararak en popüler 13. programlama dili oldu. İlgili link: TIOBE İstatistikleri, İlgisiz link: Jobtrends: Ruby Programmer
Not #2: Uzun süredir modernlikten uzak tasarımıyla eleştirdiğimiz Ruby‘nin web sitesi yeni bir görünüme kavuştu. Tek kelimeyle harika olmuş! * *
Not #3: Yazın hazırladığım Ruby belgelerini doğru dürüst bir dizgiye sokup yayınlamam gerek. Buraya da yazayım da geri dönüşüm olmasın. Ruby & GTK, Ruby & SNMP ve bir de (mysql desteği eklenecek, sadece Postgresql versiyonu var şimdilik) Jabber Sunucusu NASIL. Eğer tembellik yapmayıp bir kaç saatimi verirsem yakında sizlerle olacaklar efeem.
Not #4: Blogger adam gibi tag&rss desteği verene kadar böyle ayda bir haber postası modunda gider gibi görünüyor girdiler.. * *
Son zamanlarda, Matz’a harakiri yaptıracak cinsten olaylara karıştım… Evet.. İtiraf ediyorum; son bir kaç zamandır, Ruby’yi aldatıyorum! Üstelik hem Java, hem de Python ile!
Zaten, hayatım hep ironik olaylarla çerçevelenmiştir, ama böylesi hoş oldu açıkçası
Zaten bu iki dili de biraz kurcalamak istiyordum daha önceden. Ama fırsat olmamıştı hiç. Artık var; bendenizin Perşembe & Cuma; Python; Çarşamba & Cuma da Java dersi var.
Şimdilik her ikisiyle de iyi gidiyor, ancak en büyük vicdan azabını eve gelip Ruby kodlarken hissediyorum
Neyse, bir süre sonra, Python ve Java programcılarının Ruby’le, Ruby’cilerin de diğerleriyle derdi neymiş, anlayacağız galiba…
Sonradan gelen edit:
moon@debian:~$ free -m
total used free shared buffers cached
Mem: 250 248 2 0 1 45
-/+ buffers/cache: 202 48
Swap: 729 233 495
İnsaf diyorum. Alt tarafı Eclipse’de iki üç basit Java kodu yazıyorum. Benim sistem mi görmeyeli iyice kaplumbağa olmuş yoksa Eclipse kullanmak için bir canavara mı sahip olmak gerek?
Özlü SözMaaaatz!... heeelp!... where aaare youuuu ...
--Tobias Reif, in ruby-talk