29 Haziran 2005

Son Bir Nefes !

Uyuşturucu ticareti yapmak suçundan ölüm cezasına çarptırılan iki çinli, cezaları infaz edilmeden önce son sigaralarını içiyor.

Geç kalmış bir itiraf

SİDNEY - Microsoft CEO’su Steve Ballmer, Avustralya’da yaptığı bir konuşmada Microsoft’un son yıllardaki başarısızlıklarına değindi. Ballmer’a göre, .Net stratejisi ve SQL Server hayal kırıklığı yarattı. İnternetin en büyük arama motoru Google ile rekabette ise, etkisiz kalındı. Microsoft’un Google arama motoruyla rekabete girmesiyle ilgili olarak Ballmer, yazılım devinin geride olduğunu kabul ederek şöyle dedi: “Ama arama teknolojileri hızla değişiyor, bundan 10 yıl sonra bu iş çok farklı olacak, biz uzun dönem stratejimize güveniyoruz. İddia ediyorum 6 ay içinde Google’ı yakalarız.” Ballmer, aramanın sadece masaüstünde değil, aynı zamanda kurumsal ağlarda da önemli olduğunu vurgulayarak, aramayı kurumsal kullanıcıya götüreceklerini söyledi. ‘.NET VE SQL BAŞARISIZ OLDU’ Avustralya’da yaptığı bir iş gezisinde gazeteciler ve iş ortakları ile biraraya gelen Ballmer, .Net’i canlandırmak niyetinde olduklarını belirterek, “Açık kaynağı desteklemeyeceğimize göre karşılıklı çalışırlık (interoperability) sistemlerini odaklanacağız” diye konuştu. SQL Server’ın depolama sorunlarına dikkat çeken bir gazeteciye Ballmer, “Bu sorunların çıkacağını beklemiyorduk, ancak 18 ay içinde çıkacak yeni SQL Server sürümünde bunları çözeceğiz” yanıtını verdi. Kaynak: ZD.NET Australia
http://www.ntvmsnbc.com/news/330936.asp Bu haberde takıldığım nokta şu : “Ama arama teknolojileri hızla değişiyor, bundan 10 yıl sonra bu iş çok farklı olacak, biz uzun dönem stratejimize güveniyoruz. İddia ediyorum 6 ay içinde Google’ı yakalarız.” google bu 10 yıl içinde armut toplarsa 10 yıl sonra yetişirsiniz google'ı. hatta 10 yıl sonra ben bile yetişebilirim google'a. çünkü ben de uzun dönemli geliştirme stratejime güveniyorum. microsoft mu ben mi ? bunu zaman gösterecek

27 Haziran 2005

Teach Yourself TDD in 1 Day (Yes,Yes Only 1 Day)

... ... ... Oysa, yazılımda başarısızlıklara yol açan sorunların daha çok teknik olmayan becerilerle çözülebildiğini görürüz. VPAK, yazılım projelerine teknik ve teknik olmayan bakışı dengeleyerek, "kaliteli yazılım" ve "başarılı proje yönetimi" sağlamanız, yazılım projelerinde başarıya ulaşmanız için benzerlerini bulamayacağınız bir eğitim programı sunuyor. Kod Değerlendirme Süreçleri 1 Gün Code Review Process Refactoring 1 Gün Refactoring Konfigürasyon Yönetimi 1 Gün Configuration and Build Management Performans Testleri ve Performans Arttırma Yöntemleri 1 Gün Performance Tests and Improving Application Performance Kurumsal Uygulama Tasarımı 2 Gün Design of Enterprise Applications Yazılım Metrikleri 1 Gün Software Metrics Test Tabanlı Uygulama Geliştirme 1 Gün Test Driven Development Design Patterns 1 Gün Design Patterns Yazılım Geliştirme Metodolojileri 2 Gün Software Development Methodologies
Oysa, burda belirtilen her bir eğitim öyle 1 günle 2 günle öğrenilip uygulanabilecek konular değildir. Şimdi ilk önce şunu belirteyim. Her ne kadar veripark bir eğitim kurumu olmasada ülkemizdeki bu açığı kapatmak için attığı bu eksik eğitim hamlesinden dolayı veriparkı tebrik etmek lazım. Bu adımın eksik olduğunu şüphesiz en iyi kendileri biliyorlar fakat web sitesinden edindiğim izlenime göre insanlara "Teach Yourself XXX in 1 Day" izlenimi verilmeye çalışılıyor. 1 günde insanlara verilse verilse ancak bu deyimlerin ne olduğu, mantık olarak neyi amaçladığı ve gerçekleştirim sırasında kullanılabilecek araç ve gereçlerin sadece adları verilebilir. -bu araçların download adresleri bile verilemez :) - İlk önce 1 gün denen süreden bize net kalan zamanı hesaplayalım. En iyi ihtimalle eğitim sabah saat 9 da başlar ve akşam 5 te biter ki bu % 99 ihtimalle imkansızdır. Biz çıkış saatini 3 yapalım. Sabah 9 dan ikindi 3 e kadar 6 saat. Öğle arasını düşelim. 5 Saat. Blok ders dersek ve dersler arasına yarım saat eklersek süre 4 saate düşüyor. 4 saat yine fazla. Bir insan beyni 4 saatlik şeyin dörtte birini ancak dinler ve anlar dersek 1 günlük eğitim = 1 saatlik eğitimdir. Mesela 1 günlük eğitimlerden olan Teste Dayalı Yazılım Geliştirmeyi ele alalım. İnsarlara ilk derste teste dayalı yazılım geliştirmenin ne olduğunu, hangi ihtiyaçlardan dolayı meydana çıktığını, kimler tarafından çıkartıldığını ve bize kazandıracaklarını anlatacaksınız. İnsanlara bu biraz saçma gelecek daha sonra somut birkaç örnekle bunu kanıtlamaya çalışacaksınız. Birkaç soru gelecek ve bunları yanıtlamaya çalışacaksınız. İlk ders bitti. İkinci derste kullanılan araçları DUnit, JUnit, NUnit gibi kavramlardan bahsedeceksiniz ve en kötü ihtimalle bu araçların nasıl kullanıldığını gösterip bi tane de örnek vereceksiniz. öğle yemeğinden sonra insanların kafası daha iyi çalışacağından 3. derste yoğun bir şekilde karşılaşacağınız sorular olacaktır. Bunlardan yakanızı sıyırabilirseniz jester, nester, taklit nesneler, xdoclet gibi kavramlardan da kursiyerlerinize bahsedersiniz :) neyse süresi her ne kadar yetersiz olsada insanlara "programcılık != ide" anlayışını kazandırmaya çalıştığı için veriparkı tebrik ederiz. Eğer bu eğitimlerden faydalanmak isterseniz armağan gürkan ile temasa geçebilirsiniz. Kazandırmak derken canım kazandibi çekti. En iyisi gidip bi kazandibi yiyim ben :) http://www.veripark.com/ http://vpak.veripark.com/

25 Haziran 2005

Milli Kazık

Şenol Güneş'in ardından milli takıma teknik adam arayan Haluk Ulusoy ilk olarak bu iş için Fatih Terim'i düşünmüş. Bu düşüncesini hükümete bildirmiş ve Tayyib Erdoğan'ın danışmanlarından "biz fatihe sıcak bakmıyoruz" cevabını almış. Bunun üzerine göreve Ersun Yanal getirilmiş. Bugünlerde Fatih'e tekrar görev vermeyi düşünen federasyon terim'den şöyle bir cevap almış. "başbakan arayıp rica ederse görevi kabul ederim." çüşşşşş ohaaaaa de geeeettt nasssıı yani kimin kime naz yapacağı beni ilgilendirmez ama hem milli görev demek hem o benden özür dilesin demek hem de aylık 100 milyar para istemek.... bu üçünü "milli görev" söcükleri gölgesinde biraraya getiremiyorum doğrusu. Gelse gelse "milli kazık" sözcükleri altında gelir. Lucescu gelsin hem almanyaya gideriz hem almanyada final oynarız hem daha az para veririz hem de kimseden özür dilemek gerekmez.

22 Haziran 2005

Bir piliç yolda karşıdan karşıya neden geçer ?

OLAY : Bir piliç bir yolda karşıdan karşıya geçer. SORU : Piliç niçin karşıdan karşıya geçer? Bu sorunun yanıtlarını aşağıdaki düşünürler verseydi: Yolun öbür tarafına geçmek için. Rene DESCARTES İyiliği için. Gerçek, öteki taraftadır. EFLATUN Karşıdan karşıya geçmek pilicin doğasıdır. ARİSTOTELES Tarihsel olarak kaçınılmazdı. Karl MARX Pankreasının aşırı salgısı yüzünden. HİPOKRATES Tüm piliçlerin nedenini açıklamak zorunda kalmadan özgürce karşıdan karşıya geçtikleri bir dünya düşlüyorum. Martin Luther KİNG JR. Ve Tanrı cennetten inip pilice dedi ki: "Karşıdan karşıya geçeceksin!" Ve piliç karşıdan karşıya geçti ve Tanrı bunun iyi olduğunu gördü. Hz. MUSA Piliç karşıdan karşıya geçmedi, tekrar ediyorum, piliç asla yolun karşısına geçmedi. Richard M. NİXON Pilicin karşıdan karşıya geçmesiyle ilgilenmeniz, sizde güçlü ve latant bir cinsel güvensizlik duygusunu ele vermektedir. Sigmund FREUD Bu soruyu sormak, sizin kendi piliç doğanızı inkâr etmektir. BUDA Oysa piliç karşıdan karşıya geçiyor... GALILEI Piliç belki yolun karşısına geçti, ama otoyolun karşısına henüz geçmedi. Charles DE GAULLE Pilicin yolun karşısına geçmesi ya da yolun pilicin ayakları altında yer değiştirmesi, tümüyle sizin gösterdiğiniz referansa bağlıdır. EINSTEIN Anayasa üzerine yemin ederim ki bu piliçle aramda hiç bir şey geçmemiştir. Bill CLINTON Piliç geçmişse geçmiş, geçmemişse geçmemiştir. Süleyman DEMİREL Bu memleket için karşıdan karşıya geçen piliç de bizimdir, üstünden geçen traktör de bizimdir. Tansu ÇİLLER Ben tavuklu sandviç de satmıştım. R.Tayyip ERDOĞAN Hayır, bana böyle bir bilgi verilmedi ama karşıdan karşıya geçtiyse hükümet gereğini yapar. Abdullah GÜL Pilicin bu yolda BM kararlarına rağmen cezalandırılmadan karşıdan karşıya geçmesi, demokrasiye, özgürlüğe ve adalete kafa tutmaktır. Bu durum, o yolu bizim çoktan bombalamış olmamız gerektiğini göstermektedir. Bölgede barışı sağlamak amacıyla ve savunduğumuz değerlerin tavuk türü teröristler tarafından bir kez daha ayaklar altına alınmaması için Amerika Birleşik Devletleri oraya karadan 243 bin GI, havadan 846 bombardıman uçağıyla desteklenen 17 uçak gemisi, 46 firkateyn ve 154 kruvazör göndermeye karar ve bu güçlerine özgürlük ve demokrasi adına 5 bin kilometre çapındaki bir alanda bulunan tüm kümesleri yerle bir etmek görevi vermiştir. Bu kutsal görev, ülkede uzaktan yakından kümese benzeyen her şeyi bir avuç kül haline getirinceye kadar sürecek ve küstah kümes efradının milletimize kafa tutması önlenecektir. Hükümetimiz, ondan sonra ülkedeki kümeslerin standartlara uygun biçimde yeniden inşasına ve başlarına ABD Büyükelçisi tarafından demokratik olarak seçilecek bir horoz geçirmeye karar vermiştir. Kümeslerin yeniden inşası finansmana karşılık olarak, bölgedeki tüm yem üretimine 30 yıl süreyle el koymakla yetineceğiz. Yerel canlıların, bizimle işbirliği yaptıkları takdirde yem üretiminin bir miktarından özel fiyatlarla istifade ettirilmesi öngörülmüştür. Bu yeni adalet, özgürlük ve barış kümesleri ülkesinde, size temin ederiz ki bir daha asla bir piliç bir yoldan karşı karşıya geçmeye kalkmayacak, çünkü yol kalmayacak ve piliçlerin de yürüyecekleri bacakları olmayacaktır. Tanrı Amerika'yı takdis etsin! George W. BUSH

15 Haziran 2005

Kimsin Sen ?

Yıllar önce "Kimsin Sen ?" sorusuna aldığım cevap : Dünyada bekleyişin ben can bulmuş büstüyüm, Ümitlerin bittiği geç bir akşam üstüyüm.

11 Haziran 2005

Sadettin Yılmaz: Linkler, internette ilgili sayfalar, dokümanlar.. sadettin yilmaz

Sadettin Yılmaz: Linkler, internette ilgili sayfalar, dokümanlar.. sadettin yilmaz: Sadettin Yılmaz ile ilgili diğer web sayfaları Aşağıda adresi verilen web sayfaları internetten herhangi bir şekilde derlenmiştir. Bu adreslerin konuyla ilgili olmaları, adreslerin çalışıyor durumda olmaları, adreslerde yer alan bilgilerin doğruluğu hiç bir şekilde garanti edilmemektedir. Antoloji.Com ile herhangi bir ilişkisi bulunmayan bu web sayfaları sadece ek bir bilgi olarak sunulmaktadır. http://sadettinpolat.blogspot.com/ adresinin konuyla kesinlikle bir ilgisi olmadığını (en azından bu ana kadar) düşünüyorum ama siz illa da var diyosanız ona bişe diyemem :)

10 Haziran 2005

Asım'ın ders notları - I

Lanet olsun sana ey zalim nesne, Beni değirmende taşa döndürdün Kendi kendine ne mırıldanıp duruyon Asım ? Gel yanıma sana bişeler gösterecem. Geliyom abi... ..... ..... Şimdi yapacağım şey bazı veritabanı işlemleri için kendi nesnemi oluşturup işlemleri bu nesneye yıkmak, Asım. Ben nesneye sadece "şu hesaptan şu hesaba şu miktarı havale yap" diye emir verip işlemin nesne tarafından yapılmasını sağlayacam. Abi "Zengin yedek kulubesi" ne ne oldu ? Ona biraz ara verdik ilerde tekrar dönecez Asım. Sen şimdi buraya konserve ol bakim. İlk önce her hangi bir veritabanında CARI adında bir tablo oluşturalım ve bu tabloya aşağıdakilere uygun bir şekilde alanları ekleyelim. Ben firebird kullandım, tablonun ddl ise aşağıda gözüken şekilde. Tabi burda gözükmeyen trigger, generator gibi bazı kodlar da var ama onlar şimdilik konumuz değil.
CREATE TABLE CARI (
    ID      INTEGER NOT NULL,
    AD      VARCHAR(20) COLLATE PXW_TURK,
    SOYAD   VARCHAR(20) COLLATE PXW_TURK,
    BAKIYE  NUMERIC(15,2)
);
Tabloyu oluşturduktan sonra programın grafik arayüzünü ve veritabanına bağlantı için gerekli olan bileşenlerimizi ayarlıyoruz. Firebird'e bağlanmak için ben IBX bileşenlerini kullandım. Yapmak istediğimiz iş Havale yapmak. Bunun için bize gerekenler bir adet havale yapacak insan, bir adet havale yapılacak insan ve yapılacak olan havale miktarı. Hepsi bu. Kullanıcıya bu değerleri girebilmesi/seçebilmesi için ekranda iki adet TDBLookupComboBox ve bir adet TEdit bulunuyor. DBLookupComboBox1 havale yapacak kişiyi belirtmekle birlikte dfm dosyasındaki kaydı :
  object DBLookupComboBox1: TDBLookupComboBox
    Left = 136
    Top = 18
    Width = 225
    Height = 21
    KeyField = 'ID'
    ListField = 'AD;SOYAD'
    ListSource = DataSource1
    TabOrder = 1
  end
DBLookupComboBox2 havale yapılacak kişiyi belirtmekle birlikte dfm dosyasındaki kaydı :
  object DBLookupComboBox2: TDBLookupComboBox
    Left = 136
    Top = 48
    Width = 225
    Height = 21
    KeyField = 'ID'
    ListField = 'AD;SOYAD'
    ListSource = DataSource1
    TabOrder = 2
  end
Veritabanı ayarlarına girmiyorum. Sen bunları zaten biliyon Asım. Şimdi bize bu işi yapacak bir nesne gerekiyor. Aklıma ilk gelen nesne arayüzü aşağıdaki gibi oldu.
HavaleNesnesi.HavaleYapacakKisi -özellik-
HavaleNesnesi.HavaleYapilacakKisi -özellik-
HavaleNesnesi.HavaleMiktari -özellik-
HavaleNesnesi.HavaleIsleminiYap -metod-
O zaman Nesnemizi yapmaya başlayalım. Yeni bir Unit oluşturup UnitHavale adında kaydettim. Daha sonra aşağıdaki gibi nesneyi oluşturdum.
type
  THavale = class
  private
    fHavaleYapanCariID   :Integer;
    fHavaleYapilanCariID :Integer;
    fHavaleYapilanMiktar :Double;
    function  GetHavaleYapanCariID: Integer;
    procedure SetHavaleYapanCariID(const Value: Integer);
    function  GetHavaleYapilanCariID: Integer;
    procedure SetHavaleYapilanCariID(const Value: Integer);
    function  GetHavaleYapilanMiktar: Double;
    procedure SetHavaleYapilanMiktar(const Value: Double);

  public
  Procedure HavaleYap;
  property  HavaleYapanCariID   : Integer 
read GetHavaleYapanCariID write SetHavaleYapanCariID;
  property  HavaleYapilanCariID : Integer 
read GetHavaleYapilanCariID write SetHavaleYapilanCariID;
  property  HavaleYapilanMiktar : Double  
read GetHavaleYapilanMiktar write SetHavaleYapilanMiktar;
  end;
//
//
HavaleYap proseduru hariç diğer fonksiyon ve prosedurler sadece private veriye ulaşmaya ve değerini set etmeye yaradığından sadece birini yazmam yeterli.

function THavale.GetHavaleYapanCariID: Integer;
begin
    Result := fHavaleYapanCariID;
end;

procedure THavale.SetHavaleYapanCariID
(const Value: Integer);
begin
  fHavaleYapanCariID := Value;
end;
//
//
İşlemleri tamamladığımıza göre sıra HavaleYap metodunu yazmaya geldi. Lan Asım ! Bu metodda nesnenin hangi veritabanına bilgi ekleyeceği eksik. Niye uyar mıyon? Bunun için nesneye Veritabanı adında TIBDatabase tipinde değer alan bir özellik ekledim.
property  Veritabani          : TIBDatabase  
read GetVeritabani write SetVeritabani;
Şimdi HavaleYap metodunu yazabiliriz.

procedure THavale.HavaleYap;
begin

 IBSqlOlustur;

 if fibsql.Transaction.InTransaction = False Then
    fibsql.Transaction.StartTransaction;
try
 try

   fibsql.Close;
   fibsql.SQL.Clear;
   fibsql.SQL.Add('Update CARI set BAKIYE = BAKIYE + ' +
 FloatToStr(HavaleYapilanMiktar));
   fibsql.SQL.Add('Where ID =' + 
IntToStr(HavaleYapilanCariID));
   fibsql.ExecQuery;


   fibsql.Close;
   fibsql.SQL.Clear;
   fibsql.SQL.Add('Update CARI set BAKIYE = BAKIYE - ' + 
FloatToStr(HavaleYapilanMiktar));
   fibsql.SQL.Add('Where ID =' + 
IntToStr(HavaleYapanCariID));
   fibsql.ExecQuery;

   fibsql.Transaction.CommitRetaining;

 except
   fibsql.Transaction.RollbackRetaining;
   Raise Exception.Create
   ('Dikkat!!! Havale işlemi başarılı olamadı...');
 end;

finally
 IBSqlYokEt;
end;

end;



procedure THavale.IBSqlOlustur;
begin

 if not Assigned(fIBDatabase) Then
   Raise Exception.Create
  ('Bağlanılacak Veritabanı bulunamadı. İşlem iptal ediliyor !!!');

  if Assigned(fibsql) Then Exit;

  fIbSql := TIBSQL.Create(nil);
  fIbSql.Database := Veritabani;
  fIbSql.Transaction := Veritabani.DefaultTransaction;
end;

procedure THavale.IBSqlYokEt;
begin
   FreeAndNil(fibsql);
end;
//
//
Şimdi işlemi gerçekleştirecek olan düğmenin click olayına ilgili kodumuzu yazalım.
procedure TForm1.btnHavaleYapClick(Sender: TObject);
var
Havale :THavale;
begin

Havale :=THavale.Create;
try
 Havale.Veritabani :=IBDatabase1;
 Havale.HavaleYapanCariID :=DBLookupComboBox1.KeyValue;
 Havale.HavaleYapilanCariID :=DBLookupComboBox2.KeyValue;
 Havale.HavaleYapilanMiktar :=StrToFloat(edit1.Text);
 Havale.HavaleYap;
 ShowMessage('Havale Başarılı');
finally
 FreeAndNil(Havale);
end;

end;
//
//
Programı çalıştırıyoruz ve listelerden uygun kişileri seçip havale miktarını da yazdıktan sonra Havale Yap düğmesine tıkladığımız zaman havale işlemini yapıyoruz. Ardından veritabanına gözatarak işlemin doğru olup olmadığını kontrol ediyoruz. Gayet başarılı :) Asım: Sistem iyi güzel çalışıyo da biz neden böyle bir şey yaptık. Havale Yap butonuna aşağıdaki kodları yazsak bizim işimizi görmez mi ? Neden THavale adında bi nesne tanımlayıp 170 - 20 = 150 satır daha fazladan kod yazdık ? Ne kadar kod, o kadar kafa karışıklığı demek değil mi?
procedure TForm1.btnHavaleYapClick(Sender: TObject);
begin
 try
   IBSQL1.Close;
   IBSQL1.SQL.Clear;
   IBSQL1.SQL.Add('Update CARI set BAKIYE = BAKIYE +
 ' + edit1.Text);
   IBSQL1.SQL.Add('Where ID =' +
 IntToStr(DBLookupComboBox1.KeyValue));
   IBSQL1.ExecQuery;


   IBSQL1.Close;
   IBSQL1.SQL.Clear;
   IBSQL1.SQL.Add('Update CARI set BAKIYE = BAKIYE - ' + 
Edit1.Text);
   IBSQL1.SQL.Add('Where ID =' + 
IntToStr(DBLookupComboBox2.KeyValue));
   IBSQL1.ExecQuery;

   IBSQL1.Transaction.CommitRetaining;

 except
   IBSQL1.Transaction.RollbackRetaining;
   Raise Exception.Create
('Dikkat!!! Havale işlemi başarılı olamadı...');
 end;

end;
//
//
Asım, böyle yazacaksın. Nesneye dayalı yazılım diyosan al sana nesne işte. Bu kodu butona yazacan da ne olacak ? İki gün sonra başka bi formdan tekrar havale yapmak istersen ne olacak? Burdaki kodu alıp oraya mı yapıştıracan ? Hadi sen neysende senden sonra bu programın gelişimini devam ettirecek çaylağın BAKIYE = BAKIYE * MIKTAR gibi bi kod yazmayacağını garanti edebilir misin? Böyle ulu orta yere serpilmiş bir kodla Teste dayalı yazılım nasıl geliştireceksin ayıptır sölemesi ? Birçok yerden havale yaptığın vakit, havale işleminde meydana gelecek bi değişikliği programa nasıl yansıtacan ? Butonlara yazdığın iki kodu şöyle bir karşılaştırdığında hangisi daha anlaşılır, hataya yapma olasılığı daha az ve kolay okunabilir ? Aldırma elime karamiş sopasını Asım ! :) Devam ediyoruz... Günün birinde yetkili amcam geldi ve "Sistemde açık var. Bakiyesinde yeterli miktarda parası olmayan kişi havale yapabiliyor?. Bu nasıl bir iş ? Sen nasıl bir programcısın?" diye bize fırçayı attı. Altında kalma. Ver cevabını. (Bu senin işten atılmana engel olmuyorsa tabi) "Ne kızıyon yaw ? Yaparız iki dakka da" dedin ve işe koyuldun. Nesnemizin bulunduğu uniti açıp değişiklik yapcaz. Hepsi bu. Sonra programı yeniden derleyecez. Sonra programı bankadaki tüm memurların bilgisayarına yeniden yükleyecez. (mi acaba ? Nesneye dayalı yazılım, dağıtık uygulamalarda da çok önemli Asım) Nesnemizin Private alanına Function HavaleYapacakKisininYeterliBakiyesiVarmi:Boolean; adlı bi fonksiyon ekledik. Bu fonksiyonun nesnemizi kullanan kişiler tarafından görünmesini istemiyoruz çünkü. Bu da nesnenin gövdesi :
function 
THavale.HavaleYapacakKisininYeterliBakiyesiVarmi: Boolean;
begin
fIbQuery :=  TIBQuery.Create(nil);
try
  Result := False;
  fIbQuery.Database    := fIbSql.Database;
  fIbQuery.Transaction := fIbSql.Transaction;
  fIbQuery.Close;
  fIbQuery.SQL.Clear;
  fIbQuery.SQL.Add('Select BAKIYE FROM CARI WHERE ID =' + 
IntToStr(HavaleYapanCariID));
  fIbQuery.Open;
  Result := fIbQuery.Fields[0].AsFloat - 
HavaleYapilanMiktar >= 0.00;
finally
 FreeAndNil(fIbQuery);
end;

end;
//
//
Sonra havale yap prosedurune bunu ekliyoruz.
procedure THavale.HavaleYap;
begin

 IBSqlOlustur;

 if HavaleYapacakKisininYeterliBakiyesiVarmi = False Then
   Raise Exception.Create
('İşlem yapacak kişinin bakiyesi yeterli değil. İşlem iptal ediliyor !!!');

 if fibsql.Transaction.InTransaction = False Then
    fibsql.Transaction.StartTransaction;
...
...
//
//
İşimiz bitti... Müdür : - Hişt aloooo! Napıyonuz lan orda siz ikiniz ? Yine ogame ' mi oynuyonuz ? Asım : - Yok patron ! Sadece grafiklerini inceliyoduk. Müdür : - Yaw benim biraz metale ihtiyacım var. Bi nakliye çıkartsanız bana. He ! Asım : - Valla olsa dükkan senin müdür bey. Müdür : - Neyse ben buraya size bişe sölemek için geldim. Bundan sonra Havale yapan kişiden havale ücretinin % 1'i kesilecek. Hadi bir an önce yapın şunu. Asım : (Yaw tam da filoyu saldırıya göndermiştim. hay allah) - Tamam müdür bey.
...
...

  private
    fHavaleYapanCariID   :Integer;
    fHavaleYapilanCariID :Integer;
    fHavaleYapilanMiktar :Double;
    fIBDatabase :TIBDatabase;
    fIbSql : TIBSQL;
    fHavaleUcreti : Double; // yeni eklenen satır
...
...




HavaleYap Proseduru
...
...

   fHavaleUcreti := HavaleYapilanMiktar / 100;

   fibsql.Close;
   fibsql.SQL.Clear;
   fibsql.SQL.Add('Update CARI set BAKIYE = BAKIYE - '+
 FloatToStr(HavaleYapilanMiktar + 
 fHavaleUcreti));
   fibsql.SQL.Add('Where ID =' + 
IntToStr(HavaleYapanCariID));
   fibsql.ExecQuery;
...
...
...
//
İşlem tamam abi.

09 Haziran 2005

Bu mudur ? Budur ...

29032005122236.jpg (JPEG-Grafik, 317x400 Piksel) nelly furtado ve şarkıları 1 avril lavigne ve şarkıları 2 gerisi yalan...

Zengin yedek kulubesi - 3

dbExpress ile muhabbetimize devam ediyoruz. Bir kaç ufak araştırmadan sonra 2 nolu yazıda bağlantı için yazdığımız onlarca parametrenin fazlalığından şikayet etmiştim. Google'da biraz araştırınca TSqlConnection bileşeninin LoadParamsOnConnect özelliğinin bu işe yaradığını öğrendim. Gerçi adı zaten böyle birşeyi çağrıştırıyor ama hazıra alışmışız bi kere :( Neyse efenim, bu parametreyi True yaptığımız vakit Firebird veritabanına bağlanmak için kullandığımız butonun click olayına aşağıdakileri yazmamız yeterli oluyor.
SQLConnection1.Close;
SQLConnection1.CloseDataSets;
ClientDataSet1.Close;
SQLConnection1.ConnectionName :=  'dbExMySql';
SQLConnection1.Open;
ClientDataSet1.Open;
Caption := cntBaslik + ' - Veritabanı :' + cntFirebird;
StatusBar1.Panels[1].Text := cntFirebird;
Bu kolaylığın elbet bize bi getirisi olacaktır. D:\Program Files\Common Files\Borland Shared\DBExpress dizininde yer alan ve bizim ConnectionName değerimize ait olan parametleri içeren dbxconnections.ini dosyasını da programla birlikte dağıtmak zorundasınız. Birinci yöntemde bu dosyaya gerek yok haliyle :) Delphi 7 de bu dosyanın adı da değişmiş olabilir. Hazır dağıtmak falan demişken dbexpress ile yaptığınız programlar kullandığınız veritabanına bağlı olarak bazı dll dosyalarını da programla birlikte dağıtmanızı gerektiriyor. Mesela Interbase/Firebird kullanıyorsanız dbexpint.dll dosyasını ve clientdataset içinde midas.dll dosyasını programla dağıtmanız gerekiyor. Bu dosyaları programa gömmek için uses satırına MidasLib ve dbexpint unitlerini eklemeniz yeterli ama bu birimlerin uluslar arası karakter setleriyle ilgili problemleri varmış. Belirtmekte fayda var... Bugünlük bu kadar muhabbet yeter :)

07 Haziran 2005

Zengin yedek kulubesi - 2

Şimdi dbexpress ile ufak bir örnek yapacaz. Bu örnekteki amaç tek bir uygulama ile iki farklı veritabanına aynı yapı içerisinde kayıt eklemek, düzenlemek ve silmek... bunun için gerekli olan alet edevatımız şu şekilde : 1- Firebird 1.5 Kullanacağımız birinci veritabanı sunucusu 2- IBExpert Firebird yönetim aracı 3- MySql 4.1 Kullanacağımız ikinci veritabanı sunucusu 4- MySql Front MySql yönetim aracı 5- dbExpress driver for MySQL (http://crlab.com/dbx/download.html) Delphi 6 ile gelen mysql sürücüleri ile mysql 4.1 ile bi türlü bağlantı kuramadım. Bende bunu yükledim. Oluşturmamız gereken tablomuz oldukça basit
CREATE TABLE KURUMLAR (
    KURUMID   INTEGER,
    KURUMADI  VARCHAR(20)
);

Mysql için database adını tedarik olarak oluşturdum.
Çalışma anında programın görüntüsü
Programı yavaş yavaş inşaa ediyoruz.
Tasarım anında programın görünümü
1- SQLConnection1 : Veritabanı sunucusuna bağlanmamızı sağlayan bileşen. 2- SQLTable1 : Veritabanındaki tablolara bağlanacak bileşenimiz. 3- DataSetProvider1 : SqlTable1 bileşenimizde ki verileri ClientDataset üzerine taşımamıza yardım edecek olan bileşen. 4- ClientDataSet1 : Verileri grid üzerinde göstermek ve diğer işlemleri yapmak için gerekli olan bileşenimiz. 5- SQLMonitor1 : Arka planda neler oluyor ? Programı inşaa etmeye başlayalım. İlk önce Firebirde ve Mysql bağlanmak için gerekli olan bağlantıları oluşturalım.

Firebird bağlantısını gerçekleştiren kod
procedure TForm1.Button7Click(Sender: TObject);
begin
SQLConnection1.Close;
SQLConnection1.CloseDataSets;
ClientDataSet1.Close;
SQLConnection1.ConnectionName :=  'dbExFirebird';
SQLConnection1.DriverName     :=  'interbase';
SQLConnection1.GetDriverFunc  :=  'getSQLDriverINTERBASE';
SQLConnection1.LibraryName    :=  'dbexpint.dll';
SQLConnection1.VendorLib      :=  'GDS32.DLL';
SQLConnection1.Params.Clear;
SQLConnection1.Params.Add('DriverName=Interbase');
SQLConnection1.Params.Add('BlobSize=-1');
SQLConnection1.Params.Add('CommitRetain=False');
SQLConnection1.Params.Add('Database=F:\Developers\Delphi\Samples\'+
'Database\dbExpress\Ornek4\data.fdb');
SQLConnection1.Params.Add('ErrorResourceFile=');
SQLConnection1.Params.Add('LocaleCode=0000');
SQLConnection1.Params.Add('Password=masterkey');
SQLConnection1.Params.Add('RoleName=RoleName');
SQLConnection1.Params.Add('ServerCharSet=WIN1254');
SQLConnection1.Params.Add('SQLDialect=1');
SQLConnection1.Params.Add('Interbase TransIsolation=ReadCommited');
SQLConnection1.Params.Add('User_Name=sysdba');
SQLConnection1.Params.Add('WaitOnLocks=True');
SQLConnection1.Open;
ClientDataSet1.Open;
Caption := cntBaslik + ' - Veritabanı :' + cntFirebird;
StatusBar1.Panels[1].Text := cntFirebird;

end;

Bu da mysql bağlantısını yapan kodlarımız
procedure TForm1.Button8Click(Sender: TObject);
begin
SQLConnection1.Close;
SQLConnection1.CloseDataSets;
ClientDataSet1.Close;
SQLConnection1.ConnectionName :=  'dbExMySql';
SQLConnection1.DriverName     :=  'MySQL (Core Lab)';
SQLConnection1.GetDriverFunc  :=  'getSQLDriverMySQL';
SQLConnection1.LibraryName    :=  'dbexpmda.dll';
SQLConnection1.VendorLib      :=  'libmysql.dll';
SQLConnection1.Params.Clear;
SQLConnection1.Params.Add('DirverName=MySQL (Core Lab)');
SQLConnection1.Params.Add('BlobSize=-1');
SQLConnection1.Params.Add('HostName=localhost');
SQLConnection1.Params.Add('DataBase=tedarik');
SQLConnection1.Params.Add('User_Name=root');
SQLConnection1.Params.Add('Password=123');

SQLConnection1.Open;
ClientDataSet1.Open;
Caption := cntBaslik + ' - Veritabanı :' + cntMySql;
StatusBar1.Panels[1].Text := cntMySql;
end;

---> Program şu anda kayıt ekleme, silme, düzenleme işlemlerini gayet güzel yapıyor. Gerçi bağlantılar falan biraz hamal işi oldular ama ilk örnek için gayet başarılı sayılır bence :) Örnek projeyi buradan indirebilirsiniz.

06 Haziran 2005

Zengin yedek kulubesi

Yaptığınız bir yazılımın birden fazla veritabanı ile gayet sorunsuz çalıştığını düşünün. Programı çalıştırıyorsunuz, program size bir liste içerisinde kullanabileceğiniz veritabanlarının bir listesini gösteriyor ve siz listeden size uygun olanı seçerek programı çalıştırıyorsunuz. Bunun hem size hem de kullanıcıya maddi anlamda çok büyük bir rahatlık getireceği aşikar. Daha fazla hız ve daha fazla güvenlik istenen bir ortamda Oracle kullanabileceğiniz gibi orta ve küçük ölçekli yerlerde mySql, Firebird gibi veritabanlarını kullanabilirsiniz. Bu tür işler için geliştirilmiş başka teknolojiler var mıdır bilmiyorum ama benim etrafımda görebildiğim bir kaç teknolojiden bahsetmek istiyorum. İlk söylemek istediğim aslında böyle birşeyin olamayacağı :) Tıpkı "bir kere derle, her işletim sisteminde çalıştır" sözü gibi... Yani extra kod yazmadan böyle bir şeyin çok sağlıklı bir şekilde yapılabileceği şimdilik uzun bir hayal çünkü veritabanı sistemleri arasında oldukça büyük farklar var. Birisi Stored prosedürleri destekler birisi desteklemez, birisinde tetikleyiciler vardır diğerinde yoktur, birinde otomatik artan sayı vardır diğerinde yoktur v.s. v.s. (Aslında bırakın bu tür yapısal farklılıkları sql lehçelerinde bile inanılmaz farklılıklar var.) 3 yol var : 1 - Case Veritabanı Of mySql: bla1 bla1 ; firebird: bla2 bla2; oracle : bla3 bla3; sybase: bla4 bla4; end; tarzı kodlarla farklı olan yerleri manuel olarak biz yönetecez ve bu da programdaki kod ve hata sayısının kabarıklaşmasına neden olacak. Kafamızı karman çorman etmesini hiç söylemiyorum bile... 2- Kullanmak istediğimiz her veritabanının ortak alt kümesi belirlenir ve bu şekilde sadece connection stringi değiştirerek aynı programla birden fazla veritabanına destek vermiş olursunuz. İşin güzel yanı; fazla kod yoktur, fazla kafa karışıklığı yoktur, hata oluşma şansı çok azdır fakat alacağınız performans çok azdır. Hiçbir veritabanının üstün özelliklerinden faydalanamazsınız. 3- 1. ve 2. maddelerin karışımını uygulamak ve çok büyük hayaller kurmamak :) Böyle birşey çok elzemse Firebird + Oracle ikilisiyle sorunsuz şekilde çalışan bir uygulama yazın ve öpüp başınızın üzerine koyun. Gelelim kullanılabilecek teknolojilere...
Yukarıdaki resimde bu teknolojilerin bir kısmını görebiliyoruz. Tabi biz olaya sadece Delphi penceresinden bakacağımız için burda Delphi ile standart olarak gelen teknolojilere bakacaz. Bunların haricinde daha başka birşeyler bulmak pekala mümkün. Örnek : ZeosLib (http://sourceforge.net/projects/zeoslib/) dbGO : Borlandın Ado'ya erişmek için kullandığı kütüphane. dbGo kullanarak odbc üzerinden bütün veritabanlarına bağlanabilirsiniz. Ado.net ne durumdadır bilemiyorum ama şahsen ado'yu Access ve Ms SQL haricinde bir veritabanı ile kullanmayı pek tercih etmem. Ado'nun asıl sorunu sadece Windows platformunda çalışması. Yani ben o kadar kasacam, birden fazla veritabanı ile çalışan bir program yazacam ve bu program sadece windows ortamında çalışacak. Olmaz kardeşim :) Bde : Bde olmaz. Neden ? 1- Artık geliştirilmiyor. 2- Kylix için mevcut bir sürümü yok dbExpress : Borlandın ado ve bde'ye alternatif olarak geliştirdiği kütüphane. Özellikleri : 1- Veritabanı yönetim sistemleri ile çalışması 2- Kylix desteği sayesinde linux platformunu desteklemesi 3- Terminal bilgisayarlarda extra bir sürücü yüklemeye gerek kalmaması 4- Hızlı olması 5- Sürücü kütüphanesinin 3. şahıslar tarafından da geliştirilebilmesi dbexpress'in mantığı çok basit aslında. Bir veritabanına bağlanmak ve programdan gelen sql sorgusunu çalıştırıp dönen sonuçları direkt olarak tekrar programa göndermek. dbexpress'in önemli bir özelliği sadece ileriye yönelik imleçler içermesi. Bunun anlamı bir dbexpress tablosunu dbGride bağlayıp üzerinde hareket edemezsiniz. Kayıtlar üzerinde sadece ileriye doğru hareket edebilirsiniz. Bu ne işe yarar gibi gelebilir ilk başta ama dbexpresi ilginç yapan özellik bu :) Eğer kayıtlar üzerinde ileri geri sağa sola hareket etmek istiyorsanız clientdataset bileşenine göz atabilirsiniz... bu konuyla ilgilenmeye devam edecem. konu hakkında yorumlarınızı esirgemeyin. bu konuda cahal kalmayayım :)