http://esiyo.net - uordek.essiyoo.each { |yazi| esiyo.net << yazi }

Evlilik ve Danışmanlık

13.06.2007, yazan Tankut ŞENTÜRK

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

Bağlı olduğu kategoriler; Yaşam 2 Yorum »

JRuby 1.0 RC3

04.06.2007, yazan Tankut ŞENTÜRK

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…

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok »

Ruby ile Struct

23.05.2007, yazan Tankut ŞENTÜRK

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

class YeniSinif
attr_reader ...
attr_writer ...
attr_accessor ...

def ...
end

...
end

ş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;

# Temel Struct tanımı...
Adres = Struct.new(:posta_kodu, :sehir, :ilce, :semt, :mahalle, :apt_no, :apt_isim, :daire)

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

yeni_posta_kodu = posta_kodu
yeni_sehir = sehir
yeni_ilce = ilce
yeni_semt = semt
...
...

peki Adres diye bir tür kullansaydık ve işlemleri bu tür üzerinden yürütseydik;

yeni_adres = adres.clone # Bu kadar.. :)

ş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;

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

Bir sonraki yazımda OpenStruct'u anlatmaya çalışacağım... :)

Kolay gelsin :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok »

Ruby Yedekleme Sistemi Detayları

18.05.2007, yazan Tankut ŞENTÜRK

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.

$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

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.

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

Bu bölümde ayar dosyası disk üzerinden okunmaya çalışılır.

IO.read(ARGV[0] || "rackup_config.yaml")

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.

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

bu bölümde ise 'yaml' içersinden yedekleme işlemi ile ilgili bilgiler okunur.

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

config["include_subfolders"] bilgisine "true", "yes", "evet", "yeah", "y", "e", "1" bilgilerinden herhangi birinin yazılsının 'true' olacağını ifade eder.

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

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.
Yazının geri kalanı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok »

Ruby Backup (Rackup)

17.05.2007, yazan Tankut ŞENTÜRK

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;

  • Ruby kurulu olmalı, ruby programları çalıştırabiliyor olmalısınız.
  • RubyZip kütüphanesi kurulu olmalı, eğer değil ise, 'gem install rubyzip --include-dependencies' ile kurulabilir.
  • rackup_config.yaml dosyasının hazırlanması;
    • source: kaynak dizininin ve dosyaların bilgilerini taşır
    • include_subfolders: Kaynak dizinin yedeklenmesinde alt dizinler de dikkate alınacak mı?
    • file_extension: Kaynak dizinin altında yer alan hangi dosya uzantılı dosyaların yedekleri alınacak. Eğer belirtilmez ise tüm dosyaların yedeği alınır.
    • target: Hedef dizinin bilgilerini ve oluşturulacak dosyanın bilgilerini taşır.
    • prefix: Sıkıştırılarak oluşturulmuş dosyanın ön ekini belirtir.Oluşturulacak olan dosyanın yapısı [prefix][Tarihsel ayırac][postfix].zip şeklindedir. [Tarihsel ayırac] kısmı değiştirilemez, prefix ve postfix bölümleri değiştirilebilir.
    • postfix: Sıkıştırılarak oluşturulmuş dosyanın son ekini belirtir.
    • Tüm özelliklerin kümesi bir örnekle example_config_file.yaml'de açıklanmıştır.
  • config dosyasında belirtilen target ve source dizinleri daha önceden yaratılmalıdır
  • Programın çalıştırılması Rackup.rb'nin çalıştırılması ile gerçekleşir.
  • Rackup.rb çalıştırılırken eğer parametre olarak herhangi bir 'yaml' dosyası verilmez ise, aynı dizindeki rackup_config.yaml dosyası config dosyası olarak alınır. Eğer parametre olarak herhangi bir config dosyası verilir ise örneğin; "Rackup.rb example_config_file.yaml" şeklinde çalıştırılır ise 'example_config_file.yaml' içerisinde yer alan ayarlar ise işlemleri gerçekleştirir. Böylece birden fazla 'cron' veya 'at' veya 'schedule job' tanımlayarak istediğimiz zaman istediğimiz dizindeki, istediğimiz dosyaların yedeklerini alabiliriz.

Bir sonraki yazımda Rackup.rb'yi daha detaylı bir şekilde açıklamaya çalışacağım.

Kolay gelsin :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) 1 Yorum »

Ruby ile konfigürasyon dosyaları (YAML)

15.05.2007, yazan Tankut ŞENTÜRK

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;

# 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

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
Yazının geri kalanı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok »

Ruby Zip Kütüphanesi (RubyZip)

14.05.2007, yazan Tankut ŞENTÜRK

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.
Yazının geri kalanı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok »

Evleniyorum :D

12.04.2007, yazan Tankut ŞENTÜRK

Evleniyorum :D

Nikah: 5 Mayıs 2007 Cumartesi Saat 16:00'da
Fatih Belediyesi
Zübeyde Hanım Kültür Merkezi
Oğuzhan Cad. Oğuzhan İş Hanı.
No: 19/1 Giriş Fındıkzade / İstanbul
(Vatan caddesi Migros'dan Fındıkzade'ye doğru çıkarken solda, Fındıkzade Tramvay durağından Vatan caddesine inerken sağda.)

Bağlı olduğu kategoriler; Yaşam 8 Yorum »

Şişirme Veri Girişi / Bulk Data Creation

06.04.2007, yazan Tankut ŞENTÜRK

Merhaba arkadaşlar,

Bugün sizlerle acayip, acayip olduğu kadar da zor bir konuyu paylaşacağum. Son bir haftadır çalıştığım firmada 'Şişirme Veri Girişi' (Bulk Data Creation) ile uğraşmaktayım. Uzun bir süre değil mi ? evet uzun :) ama yapacak birşey yok uzun sürüyor işte :)

Aklınızda hemen, bu konu neden önemli, üzerinde neden çalışıyoruz şeklinde sorular oluşabilir, oluşmalıdır da :) bu nedenle sizlere öncelikle müşterilerin şişirme veri girişini neden istediklerini izah etmeye çalışayım;
- İlk örneğimiz Microsoft'un Windows işletim sisteminden; işletim sistemine çok fazla program ekleyip kaldırdığımızda sistemin yavaşladığını Registery dosyasının şişmesine bağlarız. Zamanında Microsoft'da çalışan arkadaşlar, bu durumu test etmemiş veya test etmiş fakat sonuçlarını dikkate almamışlar ki biz halen 'Windows'u nasıl hızlı kurarım' gibi işlerle uğraşıyoruz.
- 3~5 yıldır kullanılan yazılımlarınızda, çok uyduruk işlemlerin bile artık çok fazla zaman aldığına şahit olabilirsiniz. Bunun nedeni başlangıç verinin çok küçük olacağını düşünüp, veri tabanında uygun indeksleri kullanmamız veya yazdığımız algoritmaların p = n^2 (buradaki 'n' veri adedi, 'p' performans) veya buna benzer bir şekilde çalışması olabilir. Örnek vermek gerekir ise; n = 1 ise, p = 1, n = 2 ise p = 4, n = 3 ise p = 9, n = 4 ise p = 16 olur... bu durumda 3~5 sene sonra n = 100 olduğunda p = 10.000 olur ki... sistem artık çalışmıyor demektir. Elbetteki örnekler daha da arttırılabilir.

Akıllı yazılım müşterilerinin artık bu soruyu sormaya başlamalarının nedeni işte bunun gibi nedenler arkadaşlar. Peki biz yazılımcılar bu durumda neler yapabiliriz. Aklınıza 'Veri boyutu 2 katına çıkarsa sistemin bunu işleme süresi de 2 katına çıkar.' gibi bir yaklaşım gelebilir. Bu yanlıştır, bu şekilde olmamalıdır. Günümüzdeki veri tabanı uygulamalarını akılcı kullanmak ve eğer bu da yetmiyor ise, yazılıma arvişleme yeteneği eklemek gerekir.

Veri tabanı performansı günümüzde çok büyük problemler teşkil etmemektedir. Asıl problem, programın yazıldığı algoritmanın ve yapılan dizaynın getirdiği kısıtlamalardır. İşte bu tür kısıtlamaları ve bunlara bağlı performans düşüşlerini daha rahat yakalamak için uzun vadeli çalışacak olan sistemlerde şişirme veri girişi(bulk data creation) işlemi ile beraber performans sınaması gerçekleştirilmelidir.

Evet tanımı yaptıktan sonra aklınızda oluşan bazı karışıklıkları gidermek gerekir. Öncelikle Örnek Veri Girişi ile Şişirme Veri Girişi arasındaki farkı sizlere tarif etmem gerekiyor. Örnek veri girişi; sistemin olanaklarını çok zorlamayacak şekilde, örnek teşkil edecek çoklukta veri girmektir. En fazla sistemde oluşabilecek bir aylık verinin oluşturulmasıdır. Şişirme Veri Girişi ise; Sistemde stres test yapmak ve data boyutlarının hangi sevilere doğru çıktığını, en kötü koşullarda veri tabanı üzerinde yapılacak işlemlerin veya yazılmış algoritmaların ne kadar süreceklerini görebilmek için yapılan işlemdir. Tahmini 2 veya 3 seneden daha az olmamak kaydı ile veri giriş yapılmalıdır. Diğer bir deyişle Örnek Veri Girişinin 30 veya 40 katı kadar veri girilmesi gerekir. Girilen bilgiler en az örnek veri girişinde olduğu kadar mantıklı ve kendi içerisinde tutarlı olmalıdır.

Bu aşamadan sonra sizlere nasıl hızlı ve mantıklı şişirme veya örnek veri girişi nasıl yaparsınız onları tarif etmeye çalışacağım. Bu işlem için elbetteki Ruby'yi :) kullanacağız(.NET veya Java'yı da kullanabilirdik ama henüz onlarda bu işlemler kolaylaşmadı.).

Bu işlemi Microsoft SQL Server için gerçekleştireceğiz. Böylece Microsoft SQL Server için ActiveRecord bağlantısını da incele fırsatı bulmuş oluruz. Öncelikle sizlere neden ActiveRecord kullandığımızı açıklamam gerekir, daha önceki ODBC yazılarımda (1,2,3,4) belirtiğim kütüphane ile değilde, neden ActiveRecord ile gerçekleştiriyoruz. Çünkü ODBC düşük seviyeli bir bağlantı prokolüdür. Fakat ActiveRecord yüksek seviyeli bir veri tabanı ile Ruby arasında bir eşleme kütüphanesidir. Yani ActiveRecord'da veri tabanında bulunan tablolardan Ruby sınıfları oluşturulabilir, bu sınıflar üzerinde 'Insert', 'Delete', 'Update' ve 'Select' gibi SQL işlemleri birkaç küçük hareket ile gerçekleştirilebiliriz. Fakat ODBC bize bu şekilde bir yardımda bulunmaz, aynı işlemleri ODBC kullanarak bizlerde gerçekleştirebiliriz, ama bunun için kod yazmamız gerekir ki :) tembel adamın istiyeceği en son şeydir :). Hazırı var işte ActiveRecord :). Eğer ActiveRecord üzerinde hoşumuza gitmeyen bölümler olursa Ruby'nin esnekliğinden faydalanarak bunları değiştirebiliriz. Ayrıca ActiveRecord, ODBC gibi bir bağlantı kütüphanesi değildir, tek başına herhangi bir veri tabanına bağlanamaz fakat ODBC, ADO, DBI, OCI gibi birçok bağlantı kütüphanesini kullanabilir.
Yazının geri kalanı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) 1 Yorum »

Ruby Bucak Semineri

02.04.2007, yazan Tankut ŞENTÜRK

Merhabalar,

Geçtiğimiz hafta sonu çok güzel bir organizasyona katıldık. Bu güzel anı bizlerle paylaştıkları için organizasyonu düzenleyen çok değerli öğretim üyelerime ve katılımcılara çok teşekkür ederim. Burdur-Bucak'ta gerçekten çok güzel, organize ve istekli insanlarla karşılaştık. Umarım bu istekleri devamlı olur, eğitimlerini başarı ile tamamlar ve sektörde önemli yerlere gelirler. Tüm ihtiyaçlarının kendi ellerinde olduğunu anladıklarını tahmin ediyorum.

Hüseyin Gömleksizoğlu ile beraber çıktığımız bu yolculukta, Hüseyin'in bazı çekinceleri ve şüpheleri vardı, ama sorunsuz bir yolculuktan sonra Bucak'a vardır.

Merak edenler olabilir hemen anlatayım; İstanbul-Bucak arası, uçak ve otobüs macerası :)
İstanbul'dan 19:10'da kalkan Pegasus'a ait uçağımız saat 20:10'da Antalya havaalanına indi. Daha sonrasında Havaş'ın servisi ile Antalya'nın diğer ucunda bulunan otobüs terminaline gittik, vardığımızda saat 21:15 idi. İstanbul'dan yaptığımız telefon görüşmelerinde 20:00'dan sonra Bucak'a gidemeyeceğimizi kesin bir dille söylemişlerdi. Ama benim gazımla beraber Hüseyin'de ikna olunca biz şansımızı denemeye karar vermiştik, terminale gittiğimizde, 2. sorduğumuz kişiden 18 ytl karşılığında saat 22:00 otobüsünde Bucak için bilet almıştık. Bu kadar kolay bulmamıza şaşırarak bileti hemen aldığımız için kendimize kızdık, hiç araştırmamıştık belki başka bir firmada 21:30 otobüsünde yer vardı :) neyse almıştık işte biletleri; saat 22:00'da otobüs kalktı ve saat 23:00'da Bucak'taydık.

Kısadan hisse durumuna indirecek olursak; tüm tur yetkililerinin veya otobüs işletmecilerinin o saatte gidemezsiniz dediği İstanbul - Bucak arasını uçak + otobüs ile 4 saat gibi bir sürede katettik :) mutluyuz, gururluyuz :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok »

İstanbul Üniversitesi Ruby Semineri

25.03.2007, yazan Tankut ŞENTÜRK

Merhabalar arkadaşlar,

24 Mart 2007 Cumartesi günü İstanbul Üniversitesi Bilgisayar Programcılığı bölümünde, Hüseyin Gömleksizoğlu ile Ruby ve Ruby on Rails konuları hakkında seminer verdik. Her birimiz iki saatlik konuşma yapacaktık, ben saat 13:00'dan başlayarak 2 saat boyunca genç yazılımcı arkadaşlara Ruby ve yazılım dünyası hakkında seminer verdim. Benden sonra sözü alan Hüseyin arkadaşımız, sunumuna yeni başlamıştık ki, kısmetsizliği tuttu ve güvenlik görevlisi, bir terslik çıktığını ve 30 dakkika sonrasında bölümün kapatılacağını söyledi. Yazık oldu, çok yazık oldu. Genç arkadaşların Ruby on Rails ile tanışamamaları gerçekten çok kötü oldu ama en azından varlığından, yazılımdan, yazılımcılıktan bahsetti Hüseyin arkadaşımız.

Kolay gelsin :)

Bağlı olduğu kategoriler; Yaşam 2 Yorum »

Ruby’nin Yeni Sürümü

12.03.2007, yazan Tankut ŞENTÜRK

Merhabalar arkadaşlar,

Uzun süredir beklenen Ruby 1.8.6 sürümü nihayet duyuruldu. ruby-lang.org adresinden indirilebilir. Windows kullanıcıları için küçük bir not, bu yazı yazılırken henüz One-Click Installer güncellenmemişti, download esnasında dikkatli olunuz.

Gelen yeniliklere deyinecek olursak;

  • Artık Visual C++ 8 Sp1'de de Ruby'yi derleyebilirmişiz.
  • Date sınıfı güncellenmiş.
  • TK bağlayıcısında (bindings) geliştirmeler yapılmış.
  • Kernel ve Module sınıflarına reflection'a yönelik yeni methodlar eklenmiş.
    - Kernel#instance_variable_defined?
    - Module#class_variable_defined?
  • Thread işlemleri, yeni bir yöntem kullanılarak, daha da hızlı hale getirilmiş.
  • Uzun süredir nokta bile eklenmeyen Webrick'de bazı geliştirmeler yapılmış.
  • Digest üzerine dosyalar üzerinde de işlem yapma yeteneği eklenmiş.
  • nkf de güncellenen sınıflar arasında yer almış.

Değişiklikler (Change Log) ve yenilikler ruby'nin resmi sitesinde de okunabilir.

Kolay gelsin :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) 6 Yorum »

MapCache.rb - 2

06.03.2007, yazan Tankut ŞENTÜRK

Merhabalar arkadaşlar,

Uzun bir aradan sonra tekrar berebariz. Aranızda hiç evlilik hazırlıkları yapan var mı ? Var ise halimden anlayacaktır, bu adam neden yazı yazmaz, bu süre içerisinde ne yapar gibi sorular soruyor olabilirsiniz. Ama bu aralar herşey birbirleri ile sözleşmiş gibi ardı arkasına yoğunlaşıyor, yeni hareket alanları açılıyor..vs..vs. Bunların üzerine bir tutam, olmazsa olmaz, arkadaşlarımın özellikle dostlarımın bu yoğunluğumdan şikayetçi olması eklenince, inanın tadından yenmez bir hal alıyor. Ama en çok şikayet eden benim ama duyan yok. Neyse her zamanki gibi, yoğunluk can sıkıntısından iyidir. Sözleri ile bir önceki MapCache.rb - 1 (Detayları öğrenmek için lütfen tıklayın) adlı yazımızda başladığmız küçük yazı dizisini bitirelim.

Öncelikle bir önceki yazımıza yorum yapan Hüseyin Gömleksizoğlu'nun dediği gibi, MapCache uygulamamıza Threading ekleyelim ki, Http sunuculardan daha hızlı verileri alabilsin, çalışabilsin. Üstelik sizlere Threading ile ilgili gerçek hayat örneği verebilmek ise bu işin artısı olsun.

Yazımıza başlamadan önce bazı şeyleri belirtmem gerekiyor.
- Http sunucudan yaptığımız istek içerisinde yer alan v=w2.37 alanını v=w2.43 olarak değiştirmeliyiz. Muhtemelen bu bilgi version(sürüm) bilgisini taşıyor, bu nedenle bizim bu projeyi gerçekleştirdiğimiz tarihlerde 2.37 olan sürüm 2.43'e çıkmış. Kodları güncellemek gerekir.
- MapCache.v3.rb uygulamasını denemek için MapCache.v3.rb'nin bulunduğu klasörün içerisine sunucu_1, sunucu_2 ve sunucu_3 adlı klasörler açmalıyız. Bunun nedenini sizlere kodu verdikten sonra açıklayacağım.

$stdout.sync = true

require 'net/http'

proxy = nil
proxy_port = nil
port = 80

allThread = []

[1,2,3].each do |index|
    # Yeni bir Thread yaratılıyor, index -> ServerNo olarak
    # Thread-safe biçimde Thread içerisine aktarılıyor.
    thread = Thread.new(index) do |serverNo|
        httpObj = Net::HTTP.new("mt#{serverNo.to_s}.google.com", port, proxy, proxy_port)
        httpObj.start do |http|
            19000.upto(19125) do |x|
                12250.upto(12375) do |y|
                    puts "X=#{x.to_s} Y=#{y.to_s}"
                    resp = http.get("/mt?n=404&v=w2.43&x=#{x.to_s}&y=#{y.to_s}&zoom=2")
                  
                    file_name = "sunucu_#{index}\\temp_#{x.to_s}_#{y.to_s}.png"
                    open(file_name, "wb") { |file|
                        file.write(resp.body)
                    }
                    puts "#{file_name} adlı dosya başarı ile yazıldı..!"
                end
            end
        end
    end
    # Yeni yaratılan Thread'in yönetilebilmesi için
    # allThread adlı diziye ekleniyor.
    allThread <<thread
end
# Ana thread üzerinde, tüm Thread'lerin bitmesi için bekleniyor.
allThread.each { |thread| thread.join }

Programı çalıştırdığımızda 3 ayrı Http sunucusuna 3 farklı Thread kullanarak istek göndermeye başladığımızı göreceksiniz. Bu bizlere büyük ölçüde performans kazandıracaktır. Peki nasıl kazandıracak ? önceki MapCache sürümlerinde sadece bir Thread üzerinden 3 farklı sunucuya sırası ile erişip isteklerde bulunuyorduk, yani ben bir sunucudan veri alırken diğer sunucular işlem sırasının kendilerine gelmelerini bekliyorlardı, bu sürümde eklediğimiz Multi-Threading yapı ile artık bu bekleme sona erdi. Böylece işlem hızımızı arttırmış olduk.

MapCache uygulamasının (elbetteki bu yazı dizisi için) son sürümü olan v4 için yapacak tek bir şey kaldı. Hüseyin arkadaşımızın bir önceki yazıya yaptığı yorumda da belirttiği gibi sunuculardan verileri alırken problem yaşıyorduk, bu nedenle 3 farklı sunucudan veri almaya başladık ve bu verileri farklı klasörlere kayıt etmeyi başardık. Şimdi bize 3 farklı sunucudan gelen verileri yorumlayıp, kayıp verileri ayıklayan bir program bloğu daha gerekiyor. Ama bu programı melesef ben yazamıyorum. Umarım sizler yazıp bana gönderirsiniz. :) Elbetteki yazan kişinin adını ve notunu yayınlayacağım.

Kolay gelsin :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok »

MapCache.rb - 1

27.02.2007, yazan Tankut ŞENTÜRK

Merhaba arkadaşlar,

Bugün sizlerle eskişehirde yaptığımız seminerde yapmayı planladığım fakat seminer saatlerinin değişmesi neticesinde tamamlayamadığım sunumun konularından birisi olan MapCache adlı küçük uygulamayı sizlerle paylaşacağım.

- MapCache nedir ?
- MapCache, Hüseyin Gömleksizoğlu'nun "Nasıl yapsamda cep telefonumda varolan GPS uygulamasını internete (GPRS'e) bir dünya para vermeden (ücretsiz) kullansam ?" sorusu üzerine doğmuştur. MapCache uygulamasının ilk versiyonu bu şekilde Hüseyin arkadaşımız tarafından yazıldı (Kendisinin söylediğine göre kaynak olarak esiyo.net'i kullanmış :) ). Daha sonra, Hüseyin arkadaşımız uygulamayı bana ulaştırdı ve iyi olup olmadığı sordu, ben de birkaç değişiklik yapıp çok güzel olduğunu belirttim ve kendisinden seminerde kullanmak için izin istedim. Sağolsun izni verdi ve bu konuyu sizlerle paylaşma fırsatı buldum.

MapCache uygulaması Ruby ile uygulama yazımını çok güzel ve mantıklı biçimde işlediği için anlatımı oldukça basit fakat sizlerin daha rahat anlamabilmesi ve benim belli konulara daha çok ağırlık verebilmem için uygulamayı adım adım oluşturacağız.
Yazının geri kalanı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) 1 Yorum »

Ruby Eskişehir Semineri

26.02.2007, yazan Tankut ŞENTÜRK

Merhabalar,

Uzun süredir yazı yazmadım. Bu kadar sessiz kalmamın nedeni inanın tembellik değil. Tembel bir adam değilim (Bunu kendime uzun süredir söylüyorum, sanırım iyileşme göstermeye başladım.:) ). Tam aksine çok çalışkan bir ruh hali içerisindeyim. Hatta ve hatta arada sırada çalışacağım diye kendimi paraladığımı bile düşünüyorum ama hemen bu düşünce aklımdan uzaklaşıyor.. az bile çalışıyorum... (Bunu da kendime uzun süredir söylüyorum :) )

Şimdi koltukta yer alan karpuzları sıralayalım;
- Taşındım.. Artık beylikdüzünde oturuyorum.
- Evlilik hazırlıkları içerisindeyim, inşallah 5 mayısta evleneceğim.
- Geçen hafta sonu Eskişehir'de gerçekleşen bu etkinlikte Ruby hakkında bir konuşma yaptım.

Ehh tüm bunlar bu ay içerisinde başladı, bazıları bitti, bazıları devam ediyor. Durum böyle olunca pek yazı yazamadım. Sizlerden özür dilerim ama arayı kapatmaya gayret edeceğim, bilginize..

Eskişehir hakkında birşeyler yazacak olursam, gerçekleşen seminer oldukça güzeldi. Hüseyin ile beraber gerçekleştirdiğimiz bu seminerde organizasyonu yapan arkadaşlar önceden bizlere her birimizin 1,5 saatlik süresi olduğunu hatta ve hatta istersek uzatabileceğimizi belirtikten sonra, her ikimizinde 1,5 saat içerisinde bitirmesini istemek gibi gaddarca bir tutuma sahip olsa da seminer düzenleyicileri, bizler mutlu ayrıldık. Umarım seminerleri izlemeye gelen arkadaşlar da mutlu ayrılmıştır.

Fakat yiğidi öldürelim hakkını verelim. Çok çok iyi insanlarla tanışma fırsatı bulduğum için organizasyonu yapan arkadaşlara teşekkür etmem gerekir, iyi ki bu şekilde bir organizasyon yapmışlar.

Yaptığım konuşmanın tam metni yok, fakat dökümanları ve kullandığım küçük kod parçalarını ilerleyen günlerde yavaş yavaş yayınlamak istiyorum. Şimdilik sizlere Eskişehir notları başlığı altında örnekleri ve vakit darlığından sunamadığım sunumu vermek istiyorum.

İlerleyen günlerde bu döküman içerisinde yer alan bilgileri ve konuları daha direnlemesine inceleyeceğim.

Kolay gelsin :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) 4 Yorum »

« Önceki Yazılar Sonraki Yazılar »