25 Kasım 2005

The İmam

Yeni Şafak'ta -daha doğrusu haber7.com'da- Ali Murat Güven abimiz The İmam filmini izleyen kişi sayısı 80.000 gibi komik bir rakamda kaldığı için kızıyor ve imam hatiplilere biraz sitem ediyor.
Son yılların en anlamsız filmi "Maskeli Beşler", iki haftada yarım milyonu aşkın bilet keserken, "The İmam", Ramazan'ın başlangıcından bu yana topu topu 80 bin izleyici toplayabiliyor. Demem odur ki, fırsatı kaybettiniz sevgili İmam Hatipliler. Artık kimse acılarınızı ciddiye almayacak. Bir daha aklı başında hiçbir yapımcı sizlere dair bir öyküye 1 milyon dolar para yatırmayacak."
Bizde sırf imam hatipliyiz diye destek olmak maksadıyla gittik ve izledik. Filmi de beğenir gibi olduk üstelik. Fazla seyirci gelmedi diye eleştir, kız, köşende yaz ama biraz insaflı yaz. "Bu ülkede X kadar imam hatipli var, onlara yönelik bir film çekelim kesin X/2 kadar bilet satarız" gibi bir yaklaşımla çekmişlerse bu filmi zaten direk yazıklar olsun diyorum yok aksini düşünüyorlarsa o zamanda yeterince iyi bir iş ortaya koyamadıklarını düşünüp ilerde daha iyilerini yapmak için daha fazla çalışmaları gerektiğini kabul edecekler. Gerçi Eşref Ziya gibi oyunculuk konusunda hiçbir tecrubesi olmayan birisinin başrolünü oynadığı bir film içinde 80.000 bence iyi bir rakam. Öpte başına koy. birde habertürkün yorumuna bakın isterseniz Haber7.com sitesindeki ilgili haberde yer alan yorumlardan..
PEYGAMBERİMİZ (s.a.v.) BUYURDU Kİ : “ Yüce Allah , yaptığınız işi sağlam ve iyi yapmanızdan hoşnut olur ” (Beyhaki, Şu'abu'l-İman, 4/334)

Testere II

Eve doğru hareket etmişken askerden yeni gelmiş olan Ahmet birden "hadi sinemaya gidelim" diyince iskender, ahmet ve ben düştük büyülü fenerin yollarına. Yolda hangi filme gitsek diye konuşurken iskender "harry pıtıra gitmeyelim çok kötü bir film" dedi ardından ben de "uçuş planına gitmeyelim berbat bi film" :) dedim. Bunun üzerine Saw II ye gitmeye karar verdik her ne kadar ahmet karşı çıksada :) Testere I'i izlemiş ve çok beğenmiştim. Testerenin seçtiği yöntem yanlış olsada insanlara vermek istediği mesaj çok derin. En azından bir katil değil. Yaşamla ölüm arasındaki kararları hep kurbanına bırakıyor (gerçi bırakmasa daha ii ama) o sadece bunu bir oyun olarak görüyor. Yaptığı planlarda çok psikopatça oluyor tabi. Neyse sağda solda okuduğum yorumlara göre çoğu kimse I'deki tadı II de bulamamış gibi ama bence II daha manyak. Filmin sonunda şok olup kalıyorsunuz. Uçuş Planı mı yoksa Testere II mi sorusuna Testere II diye cevap verebilirim.

24 Kasım 2005

Uçuş Planı

Özel hayatıyla beni dumurdan dumura uğratmış, oyunculuk yeteneğiyle de bir o kadar kendisine hayran bırakmış bir kişi. Jodie Foster. En azından filme girerken içimde "acaba verdiğim paraya değecek mi?" sorusuna "% 99 değecek" diyebildiğim bir oyuncu ve öyle de oldu. Koca bir uçakta kaybolan 6 yaşındaki kızını arayan bir annenin hikayesi gibi bir konusu var filmin. Uçakta ne kadar ekşın olabilirse o kadar ekşın var ne kadar heyecan olabilirse o kadar heyecan var. Yakın zamanda yine kaybolan kızını arayan bir annenin konu olduğu bir film izlemiştim. Film öyle ilginç bir hale gelmişti ki filmi izlediğim arkadaşlarla birbirimize söylediğimiz tek cümle şuydu: "abi filmin sonunu eğer uzaylılara bağlarlarsa valla çok kötü ederler". Filmin sonu mu? Tabiki uzaylılara bağlayıp olayı kapattılar. Bizde filmin arkasından niğde de "alnının çatısına" koca bir taş yiyen uzaylılar gibi kalakaldık ortada... Uçuş planı bu yöndende iyi sayılır. Bana göre mantıksız bir tek yeri vardı ve finalde de eksik bir olay vardı. Bu eksiklerine rağmen filmin sonunda "lan bu muydu ya!" demeyeceğiniz bir filmi. Kısaca hem izlenebilir bir film hem de judie ablanın oyuncluğunu birkez daha izlemek için güzel bir fırsat. İyi seyirler.... Not: Filmi hamzayla birlikte izledik. Eminim son sahnede o da gözyaşlarını tutamamştır :)

19 Kasım 2005

Zengin Yedek Kulubesi ve Interfaceler IV (Hatta TDD I)

Eski yazılarımızda Zengin Yedek Kulubesi adı altında üzerine gittiğimiz bir konu vardı. Amacımız tek programla birden fazla veritabanını desteklemekti. Bunun için çeşitli yöntemler üzerinde durmuş dbexpress ile de ufak bir örnek yapmıştık. Bu konunun ardından Interface'ler konusuna girip birkaç yazıda bu konuyla ilgili yazmıştık. Şimdi ise interfaceler sayesinde zengin yedek kulubesi oluşturmanın bir başka yolunu -bence en iyisi- göreceğiz. Interfacelerin temel varoluş şeklini hatırlarsak neyi nasıl yapacağımızı daha kolay anlama şansımız olabilir. Interfaceler sadece "Ne" sorusuna cevap veriyolarlardı. "Nasıl" sorusuna ise cevap vermiyorlardı. Bizde bu nimetten yararlanarak arabirim kodu üzerinde minumum oynama yaparak programımıza birden çok veritabanı ile çalışma esnekliğini kazandırmış olacaz. Toparlarsak; mantık şu şekilde olacak.
//Yeni Kayıt Ekleme İşlemi
Interface.Ad := 'Ahmet'
Interface.Soyad:= 'Çakar'
Interface.Ekle;
ShowMessage('kayıt eklendi');
Peki burdaki interface neyin interfaci veya neye atıfta bulunuyor. Interface.Ekle dediğimiz zaman hangi sınıfın ekle metodu çalışıyor? "veritabanı olarak paradox kullanmak istiyorum" düğmesine tıklandığında çalışan kod
Interface :=TParadox.Create(Database);
Eğer programın paradox veritabanını kullanmasını istiyorsak yukarıdaki gibi Interface nesnemize TParadox sınıfına ait bir nesneyi atıyoruz eğer programın Access veritabanını kullanmasını isteseydik bu sefer Interface :=TAccess.Create(Database); gibi bir satır yazmamız gerekecekti. Aynı şekilde programın Oracle kullanmasını isteseydik Interface :=TOracle.Create(Database); yazmamız kafi olacaktı. Peki bunun avantajı ne olacak ? Biz hangi veritabanını kullanırsak kullanalım yukarıda yazdığımız "Yeni Kayıt Ekleme İşlemi" metodundaki kodlarımızın hiçbirisi etkilenmeyecek. Oradaki kodlar Oracle seçmisek Oracle'a göre, Access seçmişsek Access'a göre , Firebird seçmiçsek Firebird'e göre sorunsuz bir şekilde çalışacaktır. Dezavantajı Nedir? Çok fazla kod yazmanız gerekecek. Yani kaç tane veritabanına destek vermek istiyorsanız o kadar Interface.Ekle; metodu yazmak zorunda kalacaksınız. Diyelim ki 3 tane veritabanına destek vermek istiyorsunuz. Access, Firebird ve Oracle. Bu en az 3 tane sınıfınız olacak demektir ve her sınıfın kendi Ekle metodunu da yazmanız gerekiyor demektir. Gerçi bu sınıfların içerisinde dbexpress, ado gibi teknolojileri kullanıp tek bir ekle metoduylada bu iş çözülebilir gibi olsada bana göre en güvenli ve en bağımsız çözüm yolu herbirini ayrı ayrı yazmaktır. Hepsini ayrı ayrı yapmanız size tam bir bağımsızlık kazandırır. Burda yapacağımız örneğin içeriği basitçe şu şekilde olacak. Örneğimiz iki veritabanını destekleyecek. Paradox ve Access. Üzerinde işlem yapacağımız tablo ise çok basit bir tablo. Tablonun alanları aşağıdaki gibi : KISILER TABLOSU : ID: Integer AD: Karakter SOYAD : Karakter Bu tabloyu hem paradoxta hem de access te oluşturduktan sonra bu tablolara erişecek iki sınıf tanımladım. TPrdxKisiler = Paradoxta oluşturulmuş olan kişiler tablosu üzerinde işlem yapacak olan sınıfımız TAccessKisiler = Accessta oluşturulmuş olan kişiler tablosu üzerinde işlem yapacak olan sınıfımız İki nesneninde çok fazla ortak yönü olduğundan bu nesleri bir ata nesneden türetmeyi tekrarlanan kod sayısını azaltmak açısından uygun gördüm ve bu nedenle her iki nesneyi de TAtaKisiler adlı bir sınıftan türettim. Interfacei uygulayan nesnede zaten bu nesne.... Kısaca dördü(Interface, Ata nesne ve diğer iki türetilmiş nesne) arasındaki ilişkiyi şu şekilde özetleyebiliriz. Diğer bir önemli hususta bu uygulamanın DUnit ile birim testlerinin yapılıyor olması. Yani sınıflarımızda yer alan Ekle, Düzenle, Sil gibi metodların doğru çalışıp çalışmadığını test eden kodlarımız var. TDD Üzerine adlı kısımda konuyla ilgili daha ayrıntılı bilgi bulabilirsiniz. Şimdi en başa geri dönelim. Veritabanımızda 3 tane alan bulunuyor. ID, AD ve SOYAD. İlk önce Interfacein bu alanları bir şekilde karşılaması gerekiyor. Yapısı gereği içeresinde her hangi bir değişken barındıramadığından bu alanları property olarak tanımlamamız gerekiyor. Değerleri okumak ve set etmek içinde yine birer tane prosedür ve fonksiyona ihtiyacımız olacak. E tabi birde Ekle, sil ve güncelle metodlarımız olacak. Interfacein oluşturulduğu kod aşağıdaki şekilde.
   IData = Interface
   ['{D1332F05-2543-42DB-9267-401304481BC1}']
     function  GetID():Integer;
     Procedure SetID(Const Value : Integer);
     function  GetAd():String;
     Procedure SetAd(Const Value : String);
     function  GetSoyAd():String;
     Procedure SetSoyAd(Const Value : String);

     property  ID:Integer read GetID write SetID;
     property  Ad:String read GetAd write SetAd;
     property  Soyad:String read GetSoyad write SetSoyad;

     procedure Ekle;
     procedure Sil;
     procedure Guncelle;

   end;
Sırada bu interfaci kullanan ve asıl kullanmak istediğimiz nesnelere atalık edecek olan TAtaKisiler sınıfının tanımı...
  TAtaKisiler = class(TInterfacedObject,IData)
  private
    fID:Integer;
    fAd:String;
    fSoyad:String;
    procedure SetID(const Value: Integer);
    function  GetID: Integer;
    function  GetAd: String;
    function  GetSoyad: String;
    procedure SetAd(const Value: String);
    procedure SetSoyad(const Value: String);
    { Private declarations }
  public
  constructor Create();virtual;abstract;
  property ID:Integer read GetID write SetID;
  property Ad:String read GetAd write SetAd;
  property Soyad:String read GetSoyad write SetSoyad;

  procedure Ekle;virtual;abstract;
  procedure Sil;virtual;abstract;
  procedure Guncelle;virtual;abstract;
    { Public declarations }
  end;
//

Bu sınıfın diğer sınıfların (TPrdxKisiler,TAccessKisiler) ortak bazı alan ve metodlarını içerdiği için çalışma sırasında her hangi bir şekilde bir örneğinin oluşturulmasını istemiyorum çünkü kendisi tek başına her hangi bir anlam ifade etmeyen bir sınıf. Bu yüzden Create yapılandırıcısını abstract anahtarıyla soyut hale getiriyorum. (constructor Create();virtual;abstract;) Eğer bu sınıfa ait bir nesne oluşturmak isterseniz Delphi bunu kabul etmez ve oluşturmaz. Her nesnede ortak olan alan ve metodları burda tanımlıyorum fakat her metodu diğer nesneler kendilerine göre yeniden düzenlemeleri gerektiğinden metod isimlerinin sonuna abstract anahtarını eklemeyi unutmuyorum. ve nihayetinde işte karşımızda kullanacağımız asıl sınıflardan biri....
  TPrdxKisiler = class(TAtaKisiler)
  private
    fDatabase : TDatabase;
    fQuery:TQuery;
    { Private declarations }
  public
  constructor Create(DataBase:TDatabase);reintroduce;
  destructor Destroy; override;
  procedure Ekle;override;
  procedure Sil;override;
  procedure Guncelle; override;
    { Public declarations }
  end;
bu da bir diğeri....
  TAccessKisiler = class(TAtaKisiler)
  private
    fAdoConnection : TAdoConnection;
    fQuery:TAdoQuery;
    { Private declarations }
  public
  constructor Create(AdoConnection:TAdoConnection);reintroduce;
  destructor Destroy; override;
  procedure Ekle;override;
  procedure Sil;override;
  procedure Guncelle; override;
    { Public declarations }
  end;
Private alanında tanımladığım nesnelerin tipine ve Create yapılandırıcısındaki parametre tipine dikkat edin. Gövde metodlarının hepsini buraya yazmayacam ama örnek olması için sadece TPrdxKişiler sınıfının metod gövdesini buraya ekliyorum.
{ TPrdxKisiler }

constructor TPrdxKisiler.Create(DataBase: TDatabase);
begin
 inherited;
 fDatabase :=DataBase;
 fQuery :=TQuery.Create(nil);
 fQuery.DatabaseName :='SADODATA';
end;

destructor TPrdxKisiler.Destroy;
begin
  FreeAndNil(fquery);
end;

procedure TPrdxKisiler.Ekle;
begin
fQuery.Close;
fQuery.SQL.Clear;
fQuery.SQL.Add('Insert Into KISILER (AD,SOYAD) '+#13+
               'Values (:AD,:SOYAD)');
fQuery.Params[0].AsString := fAd;
fQuery.Params[1].AsString := fSoyad;
fQuery.ExecSQL;
end;



procedure TPrdxKisiler.Guncelle;
begin
fQuery.Close;
fQuery.SQL.Clear;
fQuery.SQL.Add('Update KISILER  Set AD = :AD,'+#13+
               'SOYAD = :SOYAD Where ID = :ID');
fQuery.Params[0].AsString := fAd;
fQuery.Params[1].AsString := fSoyad;
fQuery.Params[2].AsInteger := fID;
fQuery.ExecSQL;

end;





procedure TPrdxKisiler.Sil;
begin
fQuery.Close;
fQuery.SQL.Clear;
fQuery.SQL.Add('Delete From KISILER Where ID = :ID');
fQuery.Params[0].AsInteger := fID;
fQuery.ExecSQL;
end;

Sıra geldi bunları kullanmaya... Formun üzerinde iki tane düğme var. Paradox kullanmak isteyen birisi "Paradox kullanmak istiyorum" adlı düğmeyi, Access kullanmak isteyen birisi ise "Access Kullanmak istiyorum" adlı düğmeyi tıklıyor. Bunun yanında kayıt silmek , güncellemek ve eklemek içinde 3 adet düğme bulunuyor. Tabi birde verilerin girilebileceği editler. Test etmek amacıyla sol tarafa iki adet grid yerleştirdim. Düğmlere tıkladıktan sonra bu gridlerden işlemlerin başarılı bir şekilde olup olmadığını burdan kontrol ediyorum. Interfacei formun public bir alanında Data:IData şeklinde tanımladıktan sonra ilgili düğmelerde interface uygun değerleri aktarıyorum.
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Data :=TPrdxKisiler.Create(Database1);
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
 Data :=TAccessKisiler.Create(ADOConnection1);
end;
Ekle, sil, Düzenle düğmelerinin kodları ise şu şekilde...
procedure TForm1.Button1Click(Sender: TObject);
begin
Data.Ad := edit2.Text;
Data.Soyad:=edit3.Text;
Data.Ekle;
ShowMessage('kayıt eklendi');

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Data.ID := StrToInt(edit1.Text);
Data.Ad := edit2.Text;
Data.Soyad:=edit3.Text;
Data.Guncelle;
ShowMessage('kayıt güncellendi');

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Data.ID := StrToInt(edit1.Text);
Data.Sil;
ShowMessage('kayıt silindi');

end;
Programa yeni bir veritabanı desteği eklemek istediğinizde yapmanız gereken nedir? TPrdxKisiler gibi bir sınıf daha oluşturmak (mesela TFirebirdKisiler), programa "Firebird Kullan" başlıklı bir buton eklemek ve butonun koduna Data :=TFirebirdKisiler.Create(IBDatabase1); yazmak. Hepsi Bu. Aslında testler bana göre daha ilginç ama testleri şu an için buraya koymaya üşeniyorum. Kaynak kodu indirdiğiniz zaman DUnit klasörü altındaki test kodlarına bakmayı da unutmayın. Düşüncelerinizi de burda belirtirseniz çok sevinirim. //edit: test kodlarını yorum bölümüne ekledim ÖRNEK UYGULAMAYI İNDİRMEK İÇİN BURAYA TIKLAYIN. Bu arada RemObjects software'in Data Abstract adlı ürününe de bir gözatın...

Polisin Hatıra Defterinden

Emniyet Genel Müdür Yardımcısı Feyzullah Arslan 'ın "Polisin Hatıra Defterinden" kitabından Heyecanlı bir ses: "Merkez tarandık". Merkez: "Hayır efendim aranmadınız". 4512: "Merkez! Alet kontrol" Merkez: "Elinizdeki alet değil, cihaz". 4512: "Aletin cihaz olduğu anlaşıldı merkez". Şöför: "Müdürüm, araç intikal etsin mi?" Müdür: "Etsin, ama içinde şöförüde olsun". Merkez: "Camide son durum nedir?" 5436: "Cenazeler mezarlığa seyir halindeler". 4536: "Merkez, orta kilolu, kara renkli, boynuzlu bir tosun kaybolmuş". Merkez: "Anlaşıldı. İstasyonlar not alın. Kaybolan tosun eşkali veriyorum". 3370: "Bir minibüs at arabasına çarpmış, at vefat etmiş". Merkez: "Başın sağ olsun evladım. 7553:"Kaçan aracı takip halindeyiz". Merkez: "Anlaşıldı. Mevkiiniz?" 7553:"Kaybolduk Merkez!..." Merkez:"Mevkiiniz?" 4566:"Cumhuriyet caddesi". Merkez:"Tam mevkiiniz?" 4566:"Arabadayız Merkez". 5452: "Bahse konu aracı aldık, inceliyoruz, tamam" Merkez: "Araç alkollü mü?" 5452: "Olumsuz efendim, araç dizelmiş". 4512: "Merkez, hırsız kaçıyor!" Merkez: "Anlaşıldı, nereden nereye kaçıyor?" 4512: "Şuraya doğru kaçıyor". Merkez: "Biri 4512'den telsizi alsın, adam gibi tarif etsin". 3345: "Yonca Evcimik konserindeki son durum nedir?" 6220: "Henüz Abone'yi söylemedi amirim". 5433: "Caddede şüpheli bir paket var." Merkez: "Anlaşıldı, çevre güvenliğini alın, pakete dokunmayın. Uzman ekip seyir halinde 5433: <3 dakika sonra> "Uzman ekibe gerek yok. Paket boş". Merkez: "Nereden anladınız, 'Çevre güvenliğini alın' demiştik". 5433: " Üzerinden kamyon geçti efendim". Merkez: "İskeledeki aracın belgelerini alın". 5426: "Araç feribota binmekte..." Merkez: "Belgeleri muhakkak alın". 5426: "Doğrudur Merkez, ben de feribota biniyorum". 5426: <5 dakika sonra> "Aracın belgelerini aldım". Merkez: "Derhal merkez karakoluna intikal edin". 5426: "Olumsuz Merkez. Feribot hareket etti. Ben karşıya geçiyorum. 17.00 feribotu ile dönerim".

18 Kasım 2005

E-Devlet Kapısında Galip: Linux + Java

birkaç ay önce E-devlet kapısında Linux - MS savaşı başlığı altında yapılacak olan bir ihaleyi buraya yazmıştım. İhale sonuçlanmış ve Oytek ihaleyi kazanan firma olmuş. Bana kalırsa bu kapı dert kapısına dönüşeceği kesin. en azından devletin parası yine devlete gidecek :) ayrıntılar...

South Park - Simpsons Benzerliği

Başlarındaki "S" lerden başka bir benzerlikleri olmasada "usta" diyip bağrımıza bastığımız kişiler South Park diye bize Simpsonları kakalayabiliyor. Gerçi kalbimden geçeni okumuş diycem -simpsonları daha bi severim- ama benim gibi bir garibi kandırmanın ne alemi var ? :P South parkın 3. sezonu var mıydı?

17 Kasım 2005

DataWars Episode II

Açık kaynak kodlu veritabanları (HSQLDB, Derby, SQLite, Firebird, Ingres, PostgreSQL, MySQL vb.) pastadan iyi pay alınca bu işi paralı yapan firmalar da boş durmadı ve atağa geçti. İlk önce Sybase ASE Express Edition for Linux çıktı ardından SQL Server 2005 Express Edition ve bunun da ardından Oracle Database 10g Express Edition çıktı. Genelde hepsinin limiti aşağıdaki şekilde : Supports 1 CPU, but can be installed on any server 1 gigabyte (GB) addressable RAM 4 GB maximum database size İyi olan kazansın !

Firefox ve Opera

Google'ın Personalized Home kısmına giriyorum ve sık okuduğum blogları buraya ekleyeyim diyorum. Add Content --> Create a Section diyorum karşıma hiçbirşey çıkmıyor. Başka bir site olsa hemen firefox diycem ama Googel be kardeşim. Googel'da bile problem çıkartıyorsa bu firefox gerisini düşünmek istemiyorum. Sorunun kimde olduğunu tespit etmek için açıyorum operayı ve ilgili yere bu seferde opera ile bir tık yapıyorum. Gayet düzgün bir şekilde gösteriyor. Gerçi daha sonra operadaki Feed menüsü gözüme takılıyor ama ben yine blogları faremle tıklaya tıklaya açıp okumak daha iidir diyorum ve bu mevzuyu burda kapatıyorum.

16 Kasım 2005

Java ile Kahve Molası

Teknoloji TV de salı günleri 23:00 (doğru mu bu?) te başlayan ve java ağırlıklı olmak üzere programlama üzerine yayın yapan bir program. Sunucu sabit konuklar değişken. Forum kısmı işe yaramaz, program ise genelde eğlenceli ve güzel geçiyor ama bu hafta ki bölümü pekte güzel değildi. Beş parmağın beşi de bir olmaz ne de olsa :) Salı geceleri yapacak bir işiniz yoksa ve cnbc-e de de malcom in the midle oynamıyorsa Java ile Kahve Molası'na takılabilirsiniz.... http://www.teknolojitelevizyonu.com/

15 Kasım 2005

Elveda Google AdSense

yahu bari benim sırtımdan para kazanma :) elveda kapitalizmin masum görünen haylaz çocuğu... dipnot: bugüne kadar hesabımda birikmiş olan 0,6 $ ' ı da türk hava kurumuna bağışlıyorum.

11 Kasım 2005

fatal error

// harbi fatal error //