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

Bir Kiosk ve CreateDesktop macerası..

// 20 Mayıs 2009 // 36 Yorum » // Delphi, Programlama

Bu yazıma gecenin bu saatinde başladığıma göre büyük ihtimalle yarın işe geç kalacağım. Ama tamamlandığında da bu konuyu 3 gündür makaleleştirememenin verdiği sıkıntıdan da kurtulmuş olacağım. Sanırım bu kafi derecede haz verir bana.

Hayatının herhangi bir anında herhangi bir husus hakkında birşeyler karalamış olanlar bilirler ki, bir şeyi biliyor olmak ile anlatabiliyor olmak cidden farklı. Bunlar farklı kaabiliyetler sanıyorum. Ve yine yazmaya gönlü kaymış kişiler bilir ki; bazen bir konuyu layıkı ile anlatamama endişesi “acaba hiç mi yazmasam” düşüncesine hayat verir. Bende böyle gitgeller yaşadım bu makale için ama elimden geldiğince kendi üslubum gereği aklıma gelen tüm detaylara da inerek bir cesaretle ya Allah diyip başlıyorum makaleye. Şimdiden okuyanların gözlerini ve zihinlerini yoracağım için helallik diliyorum.

Aslında anlatacaklarım tam bir kiosk uygulaması değil elbette. Ancak bir ucundan dokunuyor. Daha ziyade Unix türevli işletim sistemlerinin popüler KDE, Gnome gibi arayüzlerinde görmeye alıştığımız multi-desktop meselesini anlatmaya çalışacağım. Pek çok kullanıcı bazen muzurluk adına ve bazen de gerçekten işi gereği çoklu masaüstlerine ihtiyaç duyar. İşyerinde çalışırken, başkalarından gizlemek istediği programları başka bir masaüstünde barındırmak isteyen insanların sayısı gerçekten de az değildir. Hatta irili ufaklı pek çok uygulamada vardır sevgili patron ve müdürlerin gözlerinden sizleri korumak için :)
Devamını Okuyun

CLR Stored Procedure (Socket)

// 18 Mayıs 2009 // 6 Yorum » // C#, Delphi, Veritabanı

CLR DESTEKLİ STORED PROCEDURE İLE SOCKET HABERLEŞMESİ

SQL Server 2005 ve .Net 2.0 ile birlikte gelen yeniliklerden biriside CLR destekli stored procedurelerdir. Bu özellik; mevcut database sistemleri adına tam anlamıyla bir devrim niteliğindedir. Peki nedir bu devrim biraz açıklayalım;

Bu güne kadar sql server ile yapılabilecekler sadece sql dilinin özellikleri ve sql serverın becerileriyle sınırlı iken, Microsoft amcamız .Net 2.0 teknolojisini kullanarak, Visual Studio 2005 üzerinden (ki biz burada C# kullanacağız), herhangi bir programı yazarken kullandığımız kod yapımızı stored procedure içine gömebilmeyi ve stored procedureleri adeta bir uygulama haline döndürebilmeyi bize sunuyor. Nasıl kafanız biraz karıştımı..!! Uzun bir cümle oldu biliyorum ama sözü daha fazla uzatmadan, başlıkta da belirttiğim gibi bir stored procedure aracılığı ile socket bağlantısını kısa bir örnekleme ile anlatıp olayı detaylandırmaya çalışacağım.
Devamını Okuyun

Paranoyaklar için :)

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

Muhtemelen başlığa bakıp kimse bu yazının ilerleyen satırlarını okumak istemeyecektir, çünkü insan psikolojisi gereği bilinçaltı başlığın kendisine uygun olmadığını düşündürecektir. Ama kimbilir belki yanılırım okuyanlar olur, ne de olsa tüm dünya üzerinde for Dummies serisi makale ve kitaplar nerede ise yok satıyor :)

Siz değerli okuyucularıma paranoyak demiyorum ama benim bazen paranoyakça davrandığım ve meyvesini bu makale haline getiren bazı olaylar oluyor. Bu makalenin tohumlarının atılmaya başladığı zaman, tam olarak işletim sistemimde bazı gariplikleri hissetiğim zamana tekabül ediyor. Bir müddet önce makinamda bir kısım yavaşlık hissettim, yazdığım yazılar sırasında bu yavaşlığı hissetmem beni hemen keylogger olma ihtimali üzerinde düşündürmeye başlamıştı. Bu bağlamda, Startup, registry’de çalışan uygulamalar listelerini incelemiş, ardından servisleri de gözden geçirmiştim. Gereksiz olduğuna inandığım belki de gerekli olduğu halde sildiğim pek çok program oldu :) Ancak insanın içine şüphe girdimi bir kere imkan yok çıkmıyor :)
Devamını Okuyun

Programımız hafızada kaç KB yer kaplıyor ?

// 16 Mayıs 2009 // Yorum Yok » // Delphi, Programlama

Yazdığımız programların hafızada ne kadar yer kapladıkları bilgisini elde etmenin pek çok yolu olmasına rağmen sanırım en iyi yöntem PSAPI.DLL içindeki metodları kullanmak. Bizim sevgili Delphi’miz sağolsun bu DLL’in içindeki metodları psAPI.pas(WinNT process API Interface Unit) içinde deklere etmiş. Bizlere sadece kullanmak kalıyor. Unit’i incelediğimizde pek çok yararlı metodun tanımlı olduğunu gözlemleyebiliyoruz. Processleri listeleyenlerinden tutunda, makinanızdaki device driverları listeleyen yada programınızın gereksiz kullandığı hafıza bloklarını serbest bırakmaya yarayacak bir diğer metod olan EmptyWorkingSet‘e kadar pek çok yararlı metod mevcut.(Bknz.)

Biz bu metodlardan GetProcessMemoryInfo isimli metodu kullanacağız makalemizde. Bu metod psAPI.pas’da aşağıdaki şekilde tanımlanmıştır:

function GetProcessMemoryInfo(Process: THandle;
  ppsmemCounters: PPROCESS_MEMORY_COUNTERS; cb: DWORD): BOOL;

Devamını Okuyun

Nedir bu Thread’lerden çektiğimiz..!

// 16 Mayıs 2009 // 7 Yorum » // Delphi, Programlama

Uzun yıllık programcılık hayatımda pek çok defalar Thread kullandım ancak ilk defa bu kadar yoğun ve derinlemesine kullanma ihtiyacı hissettiğim bir projede çalıştım. Bu projemde TThread sınıfı ile uğraşırken karşılaştığım bazı sorunları sizlerle de paylaşmak istedim. Sizler önlemlerinizi baştan alın ki, saç baş yolmayın…

Eğer gerçekten time-critical işler yapıyorsanız thread’iniz içerisinde kesinlikle Synchronize kullanmayın.Çünkü Synchronize çağrısı thread’in çalışmasını kesip main thread’e geçirir.

Eğer siz TThread sınıfından türettiğiniz kendi sınıfınızda Execute metodunda bütün işi Synchronize metoduna teslim etmiş iseniz o zaman siz MTA (Multi Threaded Application) değil STA (Single Threaded Application) geliştiriyorsunuz demektir.. Yani ha formunuzun bir metodunu çağırmışsınız ha bir Thread create etmişsiniz.Arada hiçbir fark olmaz.! Bir örnek vermek gerekir ise:

TMyThread = class(TThread)
private
  fErrorString : String;
  procedure CallExternalProc;
protected
  procedure Execute; override;
public
  constructor Create;
  property ErrorString read fErrorString write fErrorString;
end;

constructor TMyThread.Create;
begin
  inherited Create(true); // Bekler vaziyette oluştur.!
  FreeOnTerminate := true; // Thread terminate olduğunda nesneyi Free et.!
  Resume; // Thread başlasın artık
end;

procedure TMyThread.CallExternalProc;
begin
  frmMain.Bilmemne;
  frmMain.BaskabirMetod;
  ...
  ...
 // Burada ise pek çok hesaplama vs. yaptığınızı düşünelim.!
end;

procedure TMyThread.Execute;
begin
  inherited;

  try
    Synchronize(CallExternalProc);
  except on E: Exception do
  begin
    ErrorString := Format('TMyThread: Error occured. %s, %s', [E.ClassType.ClassName, E.Message]);
  end;
end;

Devamını Okuyun

Delphi Win32 & Lambda Expressions

// 16 Mayıs 2009 // 8 Yorum » // Delphi, Programlama

C# 3.0 ile birlikte gelen Lambda Expressionlar hakkında hemen hemen pek çok yerde makale yada yazıya rastlamak mümkün. Bu makalelerin bazılarında Lambda ifadelerin geleceğin programlama özelliği olduğu yönünde abartılı görüşler olsa da yine de faydalı ve olması gereken özellikler olduğu kanaatindeyim bende. Ancak bazı Lambdacıların da bilmesi gerekir ki bu programlama alemine kesinlikle yeni girmiş bir unsur değildir. Bazı programlama dillerinde bu yetenek çok uzun zamanlardan beri mevcut. Ancak maalesef Delphi’de henüz yok. En azından Win32 versiyonunda yok, Delphi Prism’de var.

O zaman bende kolları sıvadım ve tam anlamı ile Lambda Expressions gibi olmasa , onun gücüne yakınlaşamasa da, yine de benzer bir yapıyı kodlamak istedim. Lambda ifadelerinin genel kullanım amacı SQL sorgularında olduğu gibi bir veri kümesini filtrelemek olarak düşünülebilir. Bizde Delphi’de yazacağımız bir liste sınıfına bu özelliği kazandırmaya çalışacağız örneğimizde. Hatalarımız, eksiklerimiz olursa şimdiden affola diyerek başlayalım kodlamaya.

  TOperator = (opEqual, opGreater, opSmaller, opDifferent, opLike);

  TMyList = class(TList)
  public
    function Where(const PropertyName, PropertyValue : Variant; Operator : TOperator = opEqual) : TMyList;
    function InheritsFrom(const aClass : TClass) : TMyList;
  end;

Devamını Okuyun

Uygulamamızın kullandığı hafıza miktarını nasıl düşürebiliriz ?

// 16 Mayıs 2009 // 8 Yorum » // Delphi, İşletim Sistemi, Programlama, Win32

Hepimizin bildiği gibi yazdığımız uygulamalar işletim sisteminde Process olarak adlandırılmaktadır. Her bir process en az bir main thread’e sahiptir. Bu iş parçacıkları, derlenmiş ikilik formattaki ham bilginin işletim sisteminin bellek yöneticisi vasıtası ile hafızaya yüklenerek işletilmesi ile hayat bulur. İşletim sistemlerinin bellek yönetimini nasıl yaptıkları son derece karmaşık bir konudur. Bir işletim sisteminde aynı anda birden fazla iş parçacığının çalışabilme ihtimali olduğu için bu işlemlerin bellekte kaplayacakları alanların ve bu bellek bölgeleri arasındaki etkileşimlerin son derece dikkatle hesaplanması gerekmektedir. İşletim sistemlerinde bir process fiziksel bellek ile iletişim halinde değildir. Bunun yerine her bir iş parçacığı için ayrılmış olan hafıza bloklarında her bir işlem kendisini fiziksel belleğin hakimi sanmaktadır. Bu tasarım, her bir işlem parçacığının teoride fiziksel belleğin kendisinden de daha fazla hafıza bloğuna sahip olabilmesini sağlamaktadır. Tüm bunları detaylıca anlatacak ne yerim ne de yeterince malümatım var ancak, bildiklerim ışığında izah etmeye devam edeyim. Process’lerin yani iş parçacıklarının fiziksel bellekten daha fazla alan kullanabilmesine imkan tanıyan teorik yaklaşıma Virtual Memory adı verilir. Virtual Memory modern işletim sistemlerinde disk vb. depolama cihazlarının kapasitelerinin bir kısmının fiziksel hafıza alanı gibi kullanması anlamına gelir. Örneğin Windows işletim sistemlerinde bu pagefile.sys dosyasıdır. İşletim sistemi bir iş parçacığının çalışması için gerekecek hafıza bloğunun karşılanamaması durumunda disk üzerindeki bahsi geçen dosyayı bir hafıza alanı gibi kullanarak fiziksel hafıza alanını rahatlatmaya çalışmaktadır. Ancak RAM’de tutulamayan verilerin sürekli disk ve RAM arasında yazılıp okunması elbette iş parçacığının çalışma performansını olumsuz yönde etkiler.

İşletim sistemleri, RAM ile sanal bellek arasındaki adreslemeleri fiziksel bellek haritasını kullanarak gerçekleştirirler. Her bir işlem için ayrılmış izole hafıza bloğundaki $101112 gibi bir adres fiziksel adresteki aynı adres demek değildir. Bu adresin fiziksel adresteki karşılığı başka bir tabloda tutulur ve fiziksel hafızaya erişim için bu tablodan istifade edilir. Modern işletim sistemleri, iş parçacıkları için ayırdıkları hafıza bloklarının tamamen izole olmasından sorumludurlar. Bir iş parçacığının diğer birisinin kullandığı hafıza bloğuna erişimi, o blokta yapabileceği değişiklikler tehlikeli durumlara sebebiyet verecektir. İşte bu sebeple arada sırada da olsa Protection Fault gibi hatalar alırız. Aynı zamanda işletim sistemleri, mevcut fiziksel hafızayı iş parçacıkları üzerinde adil dağıtma gibi bir misyonu da bünyelerinde barındırmak durumundadırlar.
Devamını Okuyun

Bir TStringList türevi..

// 15 Mayıs 2009 // 6 Yorum » // Delphi, Programlama

Bir istek üzerine , mevcut VCL sınıflarından birisine onun bünyesinde barındırmadığı bir event yazma ile ilgili bir makale yayınlayacağım.Düşündüm taşındım hangi nesneye ne eklesem diye, VCL’in üreticileri sağolsunlar pek çok şeyi düşünmüşler.Benimde aklıma TStringList sınıfına birkaç olay eklemek geldi. Zaten amaç genel olarak ne yapıldığını anlayabilmek ondan sonrasında siz değerli arkadaşlarım kendi isteklerinize göre istediğiniz sınıfı özelleştirirsiniz. Bu yazım da OnBeforeAdd, OnAfterAdd olaylarını eklemeyi düşündüm önce.Ama daha sonra aklıma, filtreleme özelliği de eklemek geldi.Nasıl yani filtreleme ? Biz istediğimiz kadar kötü kelime (badword) belirtebilseydik, ve TStringList nesnemize ekleme yaparken sınıfımız eklemek istediğimiz metnin içerisinde kötü bir kelime geçiyor ise bize bir event’le cevap verseydi , sonra bizde o eventte “Evet, kabul ediyorum” yada “hadi oradan..!” diyebilseydik ne güzel olurdu değil mi ? Eh o zaman demek ki birde OnBadwordFind diye bir olay daha oluşturmalıyız. Sınıfın anafikrini sizlerle paylaştığımıza göre, gelin TStringList sınıfı etrafında biraz dolanalım..Araştırma yapmadan olmuyor bu işler.. ;) Yine her zamanki gibi Delphi Help’i açtık ve yazdık TStringList diye..Metodlarına bakıyoruz. Evet bizim kullanmamız gereken metodu Add metodu..Gelin tanımına şöyle bir bakalım:
Devamını Okuyun

Absolute (votka değil!)

// 15 Mayıs 2009 // Yorum Yok » // Delphi, Programlama

Absolute direktifi bir değişkenin kendisinden önce tanımlanmış bir başka değişken ile aynı hafıza bloğunu kullanmasını sağlar.

var
  iValue : Cardinal;
  iOther : Cardinal absolute iValue;
begin
 iValue := 250;
 ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther)); // 250-250

 iOther := 555;
 ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther)); // 555-555
end;

Yukarıda görüldüğü üzere iki değişken de aynı hafıza bölgesini paylaşıyorlar ve birinde yapılan değişiklik diğerine otomatikman yansıyor.Ancak absolute direktifini gösterdiği tip ile aynı tipte vermeyebilirsiniz.Şöyle ki:
Devamını Okuyun

Protected özellikleri Hack’leyelim ;)

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

Delphi sınıflarının benden çekeceği var :) Ne yapsalar nasıl saklasalar değişkenleri bir şekilde ulaşıyoruz. :) Private özellikleri değiştirme yönteminden sonra daha değişik bir konu olan protected özelliklere ulaşmayı anlatacağım bu makalemde..

Delphi’de en yaygın olarak kullanılan 4 adet erişim belirleyicisi vardır.Bunlar private, protected, public, ve published‘dır. Bunların ne işe yaradıklarından detaylıca bahsetmeyeceğim.Konumuz protected. Protected bloğunda tanımlanmış olan tüm üyeler sınıfın tasarımcısı tarafından sınıf kullanıcılarından gizlenmiştir. Ancak bu sınıfı miras alan sınıflarda erişime açıktırlar. Mesela bir formumuz olsun ve üzerinde 3 adet TEdit nesnemiz olsun. Edit bileşenlerimizin hepsinin OnClick yordamını aynı yere ayarlayalım ve OnClick yordamında aktif olan kontrolün rengini kırmızı yapmak isteyelim. Hadi bakalım kodlamaya başlayalım:

procedure TForm1.Edit1Click(Sender : TObject);
var
  cControl : TWinControl;
begin
  cControl := Screen.ActiveControl;
  cControl.Color := clRed;
end;

Yukarıdaki kodu çalıştırmayı denediğimizde “Undeclared identifier:Color” diye bir hata mesajı alıyoruz. İyide bu hata da ne ki şimdi..Hemen Delphi Help’i açıyoruz ve TEdit’e bakıyoruz..Hiyerarşiye bir bakıyoruz şöyle:
Devamını Okuyun