Benim Yazılarım. Benim Düşüncelerim.

49.7 gün sonra GetTickCount !

// 6 Haziran 2009 // 3 Yorum » // Delphi, İşletim Sistemi, Programlama, Win32

Eğer sizlerde projelerinizde zamansal kontroller kullanıyorsanız, iki kod sürecinin arasındaki zaman dilimini hesaplıyorsanız muhtemelen GetTickCount API’sini kullanıyorsunuz demektir. Bu API, işletim sistemi açıldığı zaman sıfır(0)’a eşitlenen ve her milisaniyede bir değeri bir arttırılan işletim sistemine has bir değişkenin değerini bizlere geri verir. Win32 API Help’te tanımı aşağıdaki gibidir:

DWORD GetTickCount(VOID)

Görüldüğü üzere geri dönüş değeri DWord türünde. Delphi’de DWord, LongWord türüne eşitlenmiştir. LongWord ise 32 bit işaretsiz bir tamsayıdır. Yani bu sayının alabileceği değer aralığı; 0..4.294.967.295 dır. Bu değerlerin doğruluğunu aşağıdaki kod ile de kontrol edebilirsiniz:

var
  dw : DWord;
begin
  dw := Low(DWord);
  ShowMessage(InttoStr(dw));

  dw := High(DWord);
  ShowMessage(InttoStr(dw));
end;

Hatırlarsanız eğer, GetTickCount API’sinin her milisaniyede bir işletim sistemi içinde bir yerde bulunan bir değişkenin değerini bir arttırdığını ve bu değeri geri döndürdüğünü söylemiştik. Peki; 4.294.967.295 + 1 milisaniye sonra ne olacak ? İsterseniz bu milisaniyenin kaç güne tekabül ettiğine önce bir bakalım;

  • 4.294.967.295 ms = 4.294.967.295 ms / 1000 = 4.294.967,295 sn.
  • 4294967,295 sn = 4294967,295 sn / 60 = 71.582,78825 dk.
  • 71.582,78825 dk = 71.582,78825 dk / 60 = 1.193,04647083 saat
  • 1.193,04647083 saat = 1.193,04647083 saat / 24 = 49,71 gün
  • Gördüğünüz gibi 49.7 gün sonra GetTickCount API fonksiyonu uygulamamız için tehlike sinyalleri vermeye başlayacaktır. 49.7 günün sonunda işletim sistemindeki değişken maksimum değerine erişecek ve bir sonraki milisaniyede bu değişken otomatikman sıfırlanacaktır. Dolayısı ile yapacağımız zamansal kontroller hatalı neticeler üretecek, belkide beklemediğimiz durumlar ile karşılaşacağız.

    Peki ne yapmalıyız ? Aslında yapılabilecek şeyler sınırlı, ama ben size QueryPerformanceCounter‘a bakmanızı yada Vista işletim sistemi kullanıyorsanız GetTickCount’un 64 bit değer döndüren ve kernel32.dll içinde tanımlanmış ancak Delphi’de implemente edilmemiş GetTickCount64 fonksiyonunu kullanmanızı önerebilirim.

    49.7 gün bir bilgisayar açık kalmaz, benim programım da 49.7 gün sürekli açık kalacaksa patlarsa patlasın derseniz o zaman bu hususlara bakmayabilirsiniz tabii :)

    Saygılar, sevgiler..

    Delphi ve Google Maps API

    // 6 Haziran 2009 // 40 Yorum » // Delphi, Internet, Programlama

    google_maps Hepimizin bildiği üzere Google arama motorunun popüler haritalama hizmetidir Google Maps. Gelişen teknoloji ile iyice küçülen dünyamızı evlerinizde gözlerinizin önüne getiren faydalı bir hizmet. Hizmete girmesinden kısa bir zaman sonra popülerliğini arttıran Google Map, sunduğu API’ler ile daha da yaygınlaşacağa benzer.

    Artık hemen hemen her web sitesinde bir Google Map haritasına rastlamak mümkün. Ancak masaüstü uygulamalarda emsaline pek rastlanılmıyor henüz. Bizim makalemizin konusu ise masaüstü uygulamalarda Google Maps API’lerini kullanmak. Devasa bir hizmet kütüphanesi olma yolunda hızla ilerleyen Google Maps’in tüm özelliklerini detaylıca anlatmamız elbette mümkün değil; ancak makelemiz, Delphi’de TWebBrowser nesnesi vasıtası ile Google MAP API’lerinin kullanımını ve JavaScript – Delphi interaktif haberleşmesini anlatacak.

    Makalemizi okumakta ilerlemeden evvel, Delphi & JavaScript Kardeşliği isimli makalemizi okumanız faydalı olacaktır. Google’ın bizlere sunduğu bu harita hizmeti ile haberleşmenin temellerini “Delphi & JavaScript Kardeşliği” isimli makalemizde anlattığımız için bu kısımda haritalama hizmetini kullanacak olan JavaScript sınıf tanımını, bu sınıfın Delphi altından kullanımını ve karşılıklı etkileşimini göstereceğim.
    Devamını Okuyun

    Delphi & JavaScript Kardeşliği

    // 1 Haziran 2009 // 7 Yorum » // Delphi, Internet, Programlama

    Son zamanlarda bir raporlama aracının Delphi’ye adaptasyonu ile uğraşıyorum. Bu aracın adı Fusion Charts. Son derece şık ve yetenekli bir araç. Arka planında Flash animasyonları kullanan, kendisine veriyi XML üzerinden alabilen , HTML & JavaScript kullanarak flash nesnelerinin erişimine müsaade eden bir raporlama aracı. Bu hali ile Fusion Charts aracı; Delphi üzerinde TWebBrowser nesnesi vasıtası ile rahatlıkla kullanılabiliyor. Yeterki uygulamanızın çalıştığı klasörde ihtiyaç duyduğu dosyalar olsun. Benim ileride yazacağım Fusion Charts & Delphi entegrasyonunda XML, HTML ve JavaScript dosyalarına gerek olmayacak. Ama bu raporlama aracı üzerinde çalışırken, JavaScript’e amiyane tabir ile biraz bulaşmak durumunda kaldım.

    Meraklı bir mizacım olduğu için, Delphi üzerinde TWebBrowser nesnesi vasıtası ile bir JavaScript sınıfını yada metodunu kullanıp kullanamayacağımı araştırdım. Ve gördüm ki, bizim sevgili Delphi’mizin yapamayacağı şey yok :) Delphi üzerinden TWebBrowser nesnesi vasıtası ile(daha doğru bir ifade ile COM vasıtası ile) JavaScript’e ulaşmak ve JavaScript kodları çalıştırmak mümkün. Öncelikle söylemek isterim ki; JavaScript konusunda pek bilgili sayılmam. Dolayısı ile yazacağım örnekler sizlere basit gelirse yahut bazı hatalarım olursa şimdiden affınıza sığınırım.

    Herşeyden evvel, TWebBrowser nesnesi kendisine yükleyeceği bir HTML dosya alır. Bu dosya disk üzerinde yada internet üzerinde bir yerdedir ve TWebBrowser’ın Navigate metoduna parametre olarak aktarılır. Navigate metodu, kendisine verilen HTML dosyayı yada linkin gösterdiği verileri parse eder ve TWebBrowser üzerinde gösterir. Buraya kadar herşey normal. Lâkin ben yapım gereği disk üzerinde bulunan dosyalar ile çalışmayı pek sevmem. Bu dosyaların bozulabilme ihtimalleri yada silinebilme ihtimallerinin olması programınızın doğru çalışmasını engelleyeceği için dosya erişimli yöntemlerden mümkün mertebe uzak kalmanızı tavsiye ederim. Bu bağlamda yaptığım araştırma sonucu, pek çok kaynakta HTML kaynak kodlarının herhangi bir dosyaya ihtiyaç duymadan TWebBrowser nesnesinde gösterilebildiğini öğrendim. Bulduğum metod aşağıdaki gibidir:

    procedure LoadHTML(WebBrowser: TWebBrowser; HTMLCode: String);
    var
      sl: TStringList;
      ms: TMemoryStream;
    begin
      WebBrowser.Navigate('about:blank') ;
    
      if Assigned(WebBrowser.Document) then
      begin
         sl := TStringList.Create;
         try
            ms := TMemoryStream.Create;
            try
               sl.Text := HTMLCode;
               sl.SaveToStream(ms);
               ms.Seek(0, 0);
               (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
            finally
               ms.Free;
            end;
         finally
            sl.Free;
         end;
      end;
    end;
    

    Devamını Okuyun

    TIdHTTP Partial Download(Parça Parça Download)

    // 30 Mayıs 2009 // 20 Yorum » // Delphi, Internet, Programlama

    Hemen hemen hergün internetten birşeyler indirip duruyoruz. Kimi zaman çeşitli resim dosyaları, kimi zaman videolar kimi zamanda işimizle alakalı yada değil başka materyaller. Bu dosyaları bilgisayarımıza indirirken çoğu zaman indirme yönetici programlarından istifade ediyoruz. FlashGet, GetRight gibi. Bu programların indirilecek dosyayı bir kaç parça halinde indirme özellikleri olduğu gibi, herhangi bir bağlantı sorununda kaldıkları yerden devam edebilme gibi akıllı özellikleri var. Bizlerin onları tercih etmesindeki yegane neden de bu zaten. Peki hiç düşündünüz mü, internetten bir dosya bir kaç parça halinde nasıl indirilebiliyor ? Yada indirme işleminde sorun olduğunda kalınan yerden indirmeye nasıl devam edilebiliyor ?

    Bir önceki makalemde BITS konusunu ele almıştım. BITS’de dosyalarımızı sessiz sedasız indirme yeteneğine sahipti. Aynı zamanda kaldığı yerden devam da edebiliyordu. Ancak arka planda ne gibi bir teknoloji kullandığı hakkında hiçbir fikrimiz yok. Nasıl yapıyor da internet üzerindeki bir dosyayı belirli bir yerinden okumaya başlayabiliyordu.. Aynı sorular diğer indirme yöneticileri için de sorulabilir elbette. İşte bu makalemizde bu konuya biraz ışık tutmaya çalışacağız. Ben sizlerle paylaşacağım örneğimde aşağıda göreceğiniz resim dosyasını bilgisayarıma indirmeye çalışacağım. Siz başka bir kaynak üzerindeki herhangi bir dosyayı deneyebilirsiniz. İşte indireceğimiz dosya ;)

    turboman
    Devamını Okuyun

    BITS(Background Intelligent Transfer Service) ile sessiz sedasız download ;)

    // 27 Mayıs 2009 // 12 Yorum » // Delphi, İşletim Sistemi, Programlama

    Açılımı Background Intelligent Transfer Service olan BITS, arka planda dosya indirmeye yarayan bir windows servisidir. Windows 2000′den sonra ve daha ziyade Windows XP’ler ile tanınmış ve daha sıklıkla kullanılmıştır. Windows’un arka planda updatelerini yaptığı servisin adıdır aynı zamanda. Bu servisin en önemli özelliği network’ün bandwith’ini en uygun şekilde kullanmasıdır. Bundan sonra yazacaklarımızı deneyebilmeniz için öncelikle bu servisin makinanızda çalışıyor olduğundan emin olmalısınız.

    bits_background_intelligent_transfer_service

    BITS servisinin en önemli özelliğinin sizin internet trafiğinize pek zarar vermemesi olduğunu söylemiştik. C ve C++ kullanıcıları için geliştirilmiş olan BITS, kendisine verilen indirme emirlerini yerine getirmek için network’ün en az kullanıldığı zamanları takip eder(Idle). Bu zamanı tespit edebilmek için de ethernet kartını sürekli izler. Network’ün yeterince kullanılmadığını anladığında arka planda indirim işlemine başlar. Ancak network kullanımının artması durumunda hemen transfer hızını düşürür ve mevcut network sistemine zarar vermez. Tüm bu özelliklerinden dolayı Windows, kendisi için gereken update’leri bu sistem vasıtası ile karşı bilgisayardan sizin bilgisayarınıza indirebilmektedir.

    Biz de bu makalemizde, mevcut ağımızı yormayan basit bir indirme yöneticisi yazmaya çalışacağız. Ancak kendi indirme yöneticimizi yazmaya başlamadan evvel BITS’i biraz daha tanımakta fayda var. BITS, mevcut ağ performansına zarar vermeden, iletişimi sekteye uğratmadan dosya indirmeleri için son derece uygundur. Yazdığımız programların internet üzerinden bir yerlerden güncellenmiş sürümlerini yada bazı dosyaları indirmesi gerektiğinde kullanılabilecek mükemmel bir yardımcıdır.
    Devamını Okuyun

    TThread & TQueue işbirliği..

    // 26 Mayıs 2009 // 4 Yorum » // Delphi, Programlama

    Kısa bir aradan sonra tekrar merhaba, bu makalemde iki önemli sınıfın birbirleri ile iletişiminin nasıl olacağını ve yaptıkları işbirliğinin getirilerini izah etmeye gayret edeceğim.

    Malumunuz odur ki, hemen hemen her programcı time-critical kod parçacıklarında TThread nesnesine en azından bir kere müracaat etmiştir. Thread’ler programlama dünyasında işimizi kolaylaştıran son derece faydalı yapılardır. Ancak faydaları olduğu gibi, dikkatle kodlanmalarını gerektirecek pek çok neden de var. Bu nedenleri dilim döndüğünce daha evvel izah etmiştim. İlgilenen arkadaşlarımın öncelikle thread’ler hakkındaki makalemi okumasında yarar olduğunu düşünüyorum.

    Bu noktadan sonra thread’ler hakkında bir fikre sahip olduğunuzu varsayarak ilerleyeceğim. Makalemize konu olan yararlı işbirliğinin diğer tarafındaki sınıfımız ise TQueue sınıfı. Bu sınıf, ilk giren ilk çıkar(first in first out) prensibine göre tasarlanmış bir Delphi sınıfı. Bu sınıfın tam zıttı olan TStack sınıfı ise tahmin edeceğiniz gibi son giren ilk çıkar(last in first out) mantığına göre tasarlanmış bir sınıf. Lâkin şimdi bizim konumuz TQueue.
    Devamını Okuyun

    Exception Handling :)

    // 23 Mayıs 2009 // 3 Yorum » // Genel

    try_finally_except

    Bitsin bu Tarih/Saat işkencesi(TDateTime tipleri ile oynamak..)

    // 23 Mayıs 2009 // 2 Yorum » // Delphi, Programlama

    Hemen hemen hepimiz yazdığımız projelerde tarih/saat verilerini kullanır, bunlar üzerinde çeşitli maniplasyonlar yaparız. Kimi zaman belli bir tarihe bir değer eklemek , kimi zamanda çıkartmak isteriz. Kimi zaman muhasebe/finansman uygulamalarında vade gün ve tarihlerini hesaplarken tarih/saat hesaplama rutinlerine ihtiyaç duyarız. Bazen de daha spesifik tarih/saat hesaplarına ihtiyacımız olur, artık yıl ile başımızı derde sokarız.

    Tabii ki her modern programlama dilinin bu sorunları aşmak için hazır fonksiyon/kütüphaneleri vardır. Delphi’nin de var. Ancak bizim makalemize konu olacak gibi değil ;)
    Genellikle, kullanıcılarımıza tarih ve saat verilerini girebilmeleri için, veri biçimlendirme denetimleri kullanırız. Bunların başında sanıyorum ki hepimizin kullandığı TDateTimePicker gelir. Ancak TDateTimePicker bileşeni bile tarih saat girmek için aslında meşakkatli bir bileşendir. Bu bileşenle uğraşmak istemeyenler TMaskEdit’in tarih saat formatındaki maskelerini kullanarak giriş işleminin yapılmasını sağlamak isterler. Ancak bu bileşen TDateTimePicker’dan bile daha yorucudur. Bu bileşenlerin birbirlerine göre güzel tarafları bulunmakla birlikte her ikisi de tam manası ile kusursuz tarih/saat girişleri için yeterlidir denilemez. TDateTimePicker’ın hem tarih hem saat gösterme ve değiştirmesine yarayan format harici bir property’si yokken, Format kullanıldığında da çeşitli garipliklerle karşılaşırız. TMaskEdit’in ise geçersiz tarih formatı hatalarından hem size hemde kullanıcılara eminim gına gelmiştir.

    Herhangi bir tarihe 07 ay 25 gün 06 saat 05 dk 48 saniye eklemek istesek, bahsedilen bileşenler ile bunu yapmamız son derece zor olacaktır. Evet tüm bu zorlukları yaşadığınızı, yada siz yaşamasanız bile yazdığınız programın kullanıcılarının yaşadıklarını biliyorum. Belki artık onlar daha iyi bir alternatife rastlamadıkları için bu durumu kanıksamış olabilirler ama biz şimdi tarih/saat girişlerindeki kalıplaşmış yapıyı kırmaya hazırlanıyoruz.. Nasıl mı ?
    Devamını Okuyun

    Blog yazmak böyle bir şeymiş..

    // 22 Mayıs 2009 // 16 Yorum » // Genel

    Bir blog sahibi olmanın hem güzel, hem de üzücü yanları varmış. Sitenize birilerinin geldiğini yazdıklarınızı okuduklarını bilmek güzel olan tarafı, ancak insanların bir kaç saniyelerini alacak bir yoruma dahi meyil etmemeleri üzücü olan kısmı.

    Demek blog yazmak böyle birşeymiş.. Zaman zaman blog yazanların tartışmalarında rastladığım cümleler bana şimdi daha anlamlı gelmeye başladı. Acaba gerçekten de havaya mı yazıyoruz ?

    Debugger Fault Notification Delphi 2007/Delphi 2009

    // 22 Mayıs 2009 // Yorum Yok » // IDE

    Eğer sizde boş bir proje dahi açsanız her iki denemeden bir tanesinde kesinlikle projenizin kaynak kodunda bir breakpoint varmış gibi kalıyorsanız, ardından CPU ekranına düşüp “Debugger fault Notification” hata mesajını alıyorsanız ve makinanızda Logitech firmasına ait bir webcam bulunduruyorsanız ya Delphi ile çalışırken görev yöneticisinden LVPrcSrv.exe isimli dosyayı sonlandıracaksınız, yada benim gibi Logitech driver’larını temelli kaldıracak ve rahat bir nefes alacaksınız. Buyurun bu da video‘lu anlatımı..