Yazar Arşivi

Okuduğum & Okumaya Çalıştığım & Okuyacağım Kitaplar

// 7 Eylül 2014 // 11 Yorum » // Delphi

Ne kadar zor ve ne kadar da güzel bir meslek yazılımcılık. Zor, çünkü bir kere öğren hayatın boyunca bildiklerin ile devam et mantığı bu meslekte hiç bir işe yaramıyor. Güzel, çünkü öğrenmeyi sevenler için, mesleğin doğasında bir mecburiyet olarak bu kavram var.

Şu aralar, işlerimin çok yoğun olması nedeni ile hem mesleğime hem de kendime “öğrenme” alanında ihanet ediyorum, çok uzun süredir, öğrendiklerimi başkaları ile paylaşamadığımı da biliyorum. Ama fırsat bulabildiğim zamanlarda, kısa denilebilecek tatillerde, tuvalette, orada burada, okumaya çalıştığım kitaplarımı sizlerle paylaşmak istedim. Belki siz benden daha şanslı bir evredesinizdir ve öğrenmeye yeterli zamanı ayırabilirsiniz.

Amazondan sipariş ettiğim ve okumaya çalıştığım kitaplarım:

  1. Windows via C/C++ (5th Edition) (Developer Reference)
  2. Programming in Objective-C (5th Edition) (Developer’s Library)
  3. iOS Programming: The Big Nerd Ranch Guide (3rd Edition) (Big Nerd Ranch Guides)
  4. UNIX Network Programming: Networking APIs: Sockets and XTI; Volume 1
  5. Essential Jni: Java Native Interface (Essential Java)
  6. UNIX Network Programming, Volume 2: Interprocess Communications, Second Edition
  7. TCP/IP Illustrated, Vol. 1: The Protocols (Addison-Wesley Professional Computing Series)
  8. SQL Server MVP Deep Dives
  9. C# in Depth, 3rd Edition
  10. Effective Java (2nd Edition)
  11. Java, A Beginner’s Guide, 5th Edition
  12. The Advanced iOS 6 Developer’s Cookbook (4th Edition) (Developer’s Library)
  13. iOS 6 Programming Pushing the Limits: Advanced Application Development for Apple iPhone, iPad and iPod Touch
  14. Book 1: Diving In – iOS App Development for Non-Programmers Series: The Series on How to Create iPhone & iPad Apps
  15. Book 2: Flying With Objective-C – iOS App Development for Non-Programmers: The Series on How to Create iPhone & iPad Apps
  16. Objective-C Programming: The Big Nerd Ranch Guide (Big Nerd Ranch Guides)
  17. The Java Native Interface: Programmer’s Guide and Specification (The Java Series)
  18. Developing Drivers with the Windows Driver Foundation (Developer Reference)
  19. TCP/IP Illustrated: The Implementation, Vol. 2
  20. TCP/IP Illustrated, Vol. 3: TCP for Transactions, HTTP, NNTP, and the UNIX Domain Protocols
  21. Advanced Windows Debugging
  22. Android NDK Beginner’s Guide
  23. Professional Android 4 Application Development
  24. Professional Android Sensor Programming
  25. The Busy Coder’s Guide to Advanced Android Development
  26. Windows Internals, Part 1 (6th Edition) (Developer Reference)
  27. Windows Internals, Part 2 (6th Edition) (Developer Reference)
  28. Windows System Programming (4th Edition) (Addison-Wesley Microsoft Technology Series)
  29. Defensive Database Programming with SQL Server
  30. The Rootkit Arsenal: Escape and Evasion: Escape and Evasion in the Dark Corners of the System
  31. FireMonkey Development for iOS and OS X with Delphi XE2
  32. Delphi in Depth: ClientDataSets
  33. Delphi XE2 Foundations
  34. Advanced Programming in the UNIX Environment, 3rd Edition
  35. Modern Operating Systems (3rd Edition)
  36. Programming with POSIX Threads
  37. Concurrent Programming on Windows

Amazondan sipariş ettiğim, Türkiye’ye gelen ama henüz teslim alamadığım kitaplarım:

  1. The Art of Computer Programming, Volumes 1-4A Boxed Set [Hardcover]
  2. Operating System Concepts [Hardcover]
  3. Computer Networks (5th Edition) [Hardcover]
  4. Writing Secure Code: Practical Strategies and Proven Techniques for Building Secure Applications in a Networked World [Paperback]
  5. Securing SQL Server, Second Edition: Protecting Your Database from Attackers [Paperback]
  6. The Windows 2000 Device Driver Book: A Guide for Programmers (2nd Edition) [Paperback]
  7. The Linux Programming Interface: A Linux and UNIX System Programming Handbook [Hardcover]
  8. Computer Systems: A Programmer’s Perspective (2nd Edition) [Hardcover]
  9. SQL Server MVP Deep Dives, Volume 2 Paperback
  10. Pro MSMQ: Microsoft Message Queue Programming
  11. Pro SQL Server 2008 Service Broker (Books for Professionals by Professionals) [Paperback]
  12. What Makes It Page?: The Windows 7 (x64) Virtual Memory Manager Paperback
  13. Hacking: The Art of Exploitation, 2nd Edition [Paperback]
  14. Write Great Code, Volume 2: Thinking Low-Level, Writing High-Level [Paperback]
  15. Reversing: Secrets of Reverse Engineering [Paperback]
  16. The Shellcoder’s Handbook: Discovering and Exploiting Security Holes [Paperback]
  17. A Guide to Kernel Exploitation: Attacking the Core [Paperback]
  18. Mac OS X and iOS Internals: To the Apple’s Core [Paperback]
  19. Mac OS X Internals: A Systems Approach Hardcover
  20. Linux Kernel Development (3rd Edition) [Paperback]
  21. Understanding the Linux Kernel, Third Edition [Paperback]
  22. Rootkits: Subverting the Windows Kernel Paperback
  23. Windows NT/2000 Native API Reference [Paperback]
  24. Subclassing and Hooking with Visual Basic Paperback
  25. Programming Windows Security [Paperback]
  26. SQL Injection Attacks and Defense, Second Edition [Paperback]
  27. Inside Windows Debugging: A Practical Guide to Debugging and Tracing Strategies in Windows®
  28. Win32 System Services: The Heart of Windows 98 and Windows 2000 (3rd Edition) [Paperback]
  29. Writing Security Tools and Exploits [Illustrated] [Paperback]
  30.  Buffer Overflow Attacks: Detect, Exploit, Prevent [Illustrated] [Paperback]
  31. Sockets, Shellcode, Porting, and Coding: Reverse Engineering Exploits and Tool Coding for Security Professionals [Illustrated] [Paperback]
  32. Professional Rootkits [Paperback]
  33. Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software Paperback
  34. Malware Analyst’s Cookbook and DVD: Tools and Techniques for Fighting Malicious Code [Paperback]
  35. The Intel Microprocessors (8th Edition) [Paperback]
  36. x86 Instruction Set Architecture Perfect Paperback
  37. Tomes of KYLIX: The Linux API (Wordware Delphi Developer’s Library) Paperback
  38. Tomes Of Delphi: Basic 32-BIT Paperback
  39. Tomes of Delphi: WIN 32 CORE API Windows 2000
  40. Win 32 Multimedia Api (Tomes of Delphi) Paperback
  41. Tomes of Delphi: Alogrithm and Data Structure (Wordware Delphi Developer’s Library) Paperback
  42. Tomes of Delphi: WIN32 SHELL API Windows 2000 Edition Paperback
  43. Programming the Microsoft Windows Driver Model [Paperback]
  44. Developing Windows NT Device Drivers: A Programmer’s Handbook [Hardcover]
  45. Windows NT Device Driver Development Paperback
  46. Windows NT File System Internals: A Developer’s Guide Paperback
  47. Undocumented Windows NT [Paperback]
  48. WIN32 API Programming with Visual Basic Paperback
  49. Undocumented Windows 2000 Secrets: A Programmer’s Cookbook Paperback
  50. Windows 95 System Programming Secrets (The Secrets Series) Paperback
  51. Inside Windows NT (Microsoft Programming Series) [Paperback]
  52. Programming Server-Side Applications for Microsoft Windows 2000 (Microsoft Programming) Paperback
  53. Crackproof Your Software: Protect Your Software Against Crackers (With CD-ROM) Paperback
  54. Windows NT File System Internals : OSR Classic Reprints Paperback
  55. Network Programming for Microsoft Windows, Second Edition (Microsoft Programming Series)
  56. Write Great Code: Volume 1: Understanding the Machine Paperback
  57. Writing Secure Code for Windows Vista® (Pro – Step By Step Developer) [Paperback]

 

İyi okumalar.

Bu kitabı almak lazım.. Ama ondan önce mümkünse dilimize kazandırmak lazım..

// 4 Aralık 2012 // 5 Yorum » // Delphi, Programlama

Threading için bulunmaz kaynak..

Threading için bulunmaz kaynak..

Pek çok programcı arkadaşımızın Thread kütüphanesini kullandığı Primož Gabrijelčič ile geçen gün bir e-Mail sohbetimiz oldu. Kendisine kitabını Türkçe’ye çevirmek isteyip istemediğini sordum. Özetle bana; “bundan memnuniyet duyacağını, bu hususta kendisine yardımcı olmak isteyeceklere kapısının her daim açık olduğunu ve kazançtan %50 kâr vereceğini” ifade etti.

Delphi bilgisine ve daha da önemlisi İngilizcesi ve Türkçesine güvenen arkadaşların kendisi ile iletişime geçmeleri hem Türkçemize değerli bir kaynağı kazandıracaktır, hemde uzun uğraşlar neticesinde zorluklarla yapılan kaliteli bir ürünü ve bu ürünü geliştireni de takdir etmemize vesile olacaktır.

Kendisine primoz@gabrijelcic.org mail adresinden yada; Forum sitesinden ulaşabilirsiniz.

Ingilizce bana yeter Türkçe’ye çevrilmesini bekleyemem diyorsanız son derece cüzi bir ücrete sahip olan kitabı bu adresten temin edebilirsiniz.

Hem siz kazanın, hem mükemmel bir ürünü bizlere kazandıran Primoz kazansın hem de ülkemiz kazansın.

Not: Bu işten benim herhangi bir maddi beklentim yahut kazanımım yoktur.

Çeviri süreci bir arkadaşımızın özverili tutumu ile başlamış bulunuyor. Bu husustaki gelişmeleri buradan takip edebilirsiniz.


Ramazan GÜLBAHAR arkadaşımız sayesinde çeviri süreci ciddi bir şekilde ilerlemektedir. Primoz’un sitesinde bu husus hakkında yazdığı makaleye buradanerişebilirsiniz. Aynı zamanda, kitabın Türkçe çevirisi hakkında bilgi bulabileceğiniz ve ön sipariş verebileceğiniz linke ise buradan ulaşabilirsiniz.

DBX & DataSnap Hakkında Destek Talebi..

// 9 Mayıs 2012 // 2 Yorum » // Delphi

Web servisleri hakkında açılan destek talebi ve bu hususa ilgisini eksik etmeyen arkadaşlarımızın varlığı benim de yaşadığım bazı sorunlara istinaden QC’de açtığım başlıklar için sizlerden destek talebinde bulunmama neden oldu.

Bu başlıklar ve linkleri kısaca aşağıdaki gibidir;

TJSONTrue & TJSONFalse Problemi

TJSONTrue ve TJSONFalse sınıfları TJSONValue sınıfından türetilmişlerdir ve TJSONValue sınıfı da TJSONAncestor sınıfından türetilmiştir. TJSONAncestor sınıfı içinde Value isminde virtual olarak tanımlanmış olan bir fonksiyonun; TJSONTrue ve TJSONFalse sınıfları içinde ezilmesi(override) unutulmuştur. Bu bağlamda, TJSONTrue ve TJSONFalse sınıflarından ürettiğiniz nesneler üzerinde Value fonksiyonunu çağırdığınızda maalesef TJSONAncestor sınıfı içinde tanımlı olan Value fonksiyonu çağrılacak ve geri dönüş değeri olarak beklediğiniz “true” yada “false” yerine NullString sabiti yani “” dönecektir.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXBoolean.SetAsString Problemi

procedure TDBXBooleanValue.SetAsString(const Value : UnicodeString);
begin
SetBoolean(Value <> 'False');
end;

Bu metodun içinde dışarıdan geçilen Value isimli parametrenin karşılaştırılması sırasında bir problem oluşmaktadır. Bu metoda dışarıdan, “false” yada “FALSE” biçiminde geçilen parametreler beklendiği gibi false sonucunu doğurmayıp true ile neticelenmektedir. Metodun doğru implemente edilmiş hali;

procedure TDBXBooleanValue.SetAsString(const Value : UnicodeString);
begin
SetBoolean(UpperCase(Value) <> 'FALSE');
end;

olmalıdır.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXReader Sınıfı RecordCount Eksikliği

Bilindiği gibi DBX ile veritabanlarından veri çekmek için Command nesnelerinden istifade ediyoruz. Bu Command nesneleride veri setlerini TDBXReader üzerinden bizlere sunuyorlar. Datasnap uygulamaları geliştirirken, uygulamanızın hemen hemen her platformda çalışan bir versiyonunu istiyorsanız muhtemelen JSON sınıfları ile çalışmak isteyeceksiniz. Bu bağlamda metodlarınızın, TDBXReader yerine TJSONObject türevi nesneler döndürmesini isteyeceksiniz. Bu isteğinizi yerine getirmek için muhtemelen TDBXReader’ı bir TJSONObject’e çeviren hazır metodlar kullanacaksınız. Ancak, eğer TDBXReader’ınız içinde hiç bir kayıt yok ise yani boş bir dataset olarak veritabanınızdan döndü ise, bu durumda TDBXReader’ı TJSONObject’e çevirirken bir hata ile karşılaşacaksınız. Bu hatayı bertaraf etmek için TDBXReader’ın içinde kayıt olup olmadığını bilmek isteyeceksiniz. Ancak hepimizin bildiği gibi DBX unidirectional olduğu için böyle bir metodla yada property ile maalesef karşılaşamayacaksınız. TDBXReader üzerinde *while Next* ile dönüp kayıt sayısını bulabilirsiniz ancak bu durumda da TDBXReader’ın son kaydına erişmiş olacak ve başka problemlerle karşılaşacaksınız. Bu bağlamda, TDBXReader üzerinde RecordCount gibi bir property yada fonksiyonun programcılara sunulması son derece faydalı olacaktır.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

Native DBX SQL Server Driver’ı “Application Name” Özelliğini Desteklemiyor Problemi

Bazen SQL Server tarafında uygulamamıza bağlanan kullanıcının kim olduğu bilgisine ulaşmak isteriz. Örneğin pek çoğumuz, veritabanı sunucusunun sunduğu kullanıcı, login imkanlarını kullanıp; GRANT , REVOKE ile o kullanıcıları nesneler üzerinde haklar vermek yerine; Users gibi bir tablo oluşturup kullanıcılarımızı oraya girer ve UserRights gibi tablolarda da hakları belirleriz. Uygulamalarımızda ise programa girerken kullanıcıdan isim ve şifre girmesini bekler, doğruluğunu yine Users tablosunu sorgulayarak yaparız. Durum bu ahvalde iken, SQL Server içinde T-SQL dilini kullanırken, veritabanına hangi kullanıcı ile bağlandığımızı göremeyiz. Dolayısı ile kullanıcı işlemlerini loglamak istediğimizde bunu başaramayız. Ancak; eğer veritabanı sunucusuna bağlanırken connection nesnemiz üzerindeki Connection String’de “Application Name” özelliğine kullanıcı adını yazarsak, SQL Server’da istediğimiz her yerde APP_NAME() T-SQL metodu ile bağlı olan kullanının isim bilgisine erişebiliriz. İşte ADO’da mevcut olan bu fonksiyonalite maalesef native DBX SQL Server driver’ında bulunmuyor.
Not: DevArt’ın driver’ında bu özellik sunuluyor.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

Otomatik Parametre Oluşturma Problemi

Veritabanı tarafında eğer sizde benim gibi sık sık stored procedure kullanıyorsanız ve bu stored procedure’lerinizde birden çok parametreniz var ise TDBXCommand ile bu parametreleri sürekli oluşturmaktan bıkmış olmalısınız. Muhtemelen ADO’daki gibi Parameters.Refresh isimli bir metod neden yok diye içinizi geçirmişsinizdir. Benim buna bulduğum geçici çözümü raporun linkinden takip edebilirsiniz.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXParameterList & ParamByName Problemi

Pek çoğumuz DBX ile programlamaya başlamadan önce muhtemeldir ki ADO kullanıyorduk. Dolayısı ile alışılagelmiş bazı kullanımlarımız var. Örneğin, ADO üzerinden bir stored procedure’nin parametresine ulaşmak için hepimiz genelde ParamByName fonksiyonunu kullanırız. Maalesef DBX’de bu fonksiyonda yok, onun yerine GetParameterByName isimli bir metod sunulmuş. Evet bu metod istediğimizi yerine getiriyor ama alışkanlıklarımıza pek de uygun olmuyor. Ben bu sorunu bertaraf edebilmek adına geçici bir çözüm olarak helper sınıflardan istifade ettim.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXParameter.Value & Set.. Metodları Problemi

Yine bir stored procedure’nin parametrelerine değer atamak istediğin,zde muhtemelen Value property’sine başvuracaksınız. TDBXParameter sınıfın Value property’si TDBXWritableValue türünde tanımlanmıştır ve TDBXWritableValue sınıfının birden fazla Set ile başlayan ve nerede ise her veri türü için metodu vardır. Integer tipli bir parametre için SetAsInteger, Double için SetAsDouble, String için SetAsString ve buna benzer metodları çağırmanız gerekir. Bunun yerine TDBXWritableValue sınıfının TValue tipinde bir değişkeni parametre olarak kabul eden bir Set.. metodu olsa idi işimiz ne kadar kolay olurdu değil mi ? Artık SetAsString, SetAsDouble, SetAsInteger metodlarını çağırmak yerine her veri türünü tutabilen SetAsValue metodunu çağırabilirdik. Bu sorunu aşmak için uyguladığım yöntemi raporun linkinden takip edebilirsiniz.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

Burada sizinle paylaştığım sorunları ben bir şekilde aştım sizlerinde linklerden görebileceği gibi. Ancak bu sorunların Delphi içinde düzeltilmesi hepimiz için daha yararlı olacaktır. Bazı raporlarımı sorun olarak adletmeyip belki de istek olarak görebilirsiniz, bu konuda haklı da olabilirsiniz ama bence sorun olabilme ihtimali onlar için bile yüksektir.

Sizlerden ricam sunduğum raporlara oylarınız ile destek vermeniz. Kimbilir belki de önümüzdeki update’de sorunları aşmış olabiliriz sizlerin sayesinde.

Yazılım Uzmanı Arayışı Hk.

// 2 Nisan 2011 // 18 Yorum » // Delphi

Market sektörüne hitap eden firmamız bünyesinde geliştirilmekte olan projelerimizde yardımcı olabilecek, mevcut projelerimiz üzerinde çeşitli modifikasyonlar yapabilecek takım arkadaşları aramaktayız.

Aranan Nitelikler
—————
* Üniversitelerin Bilgisayar Mühendisliği yada Bilgisayar Programcılığı bölümlerinden mezun.
* İlişkisel veritabanı kavramına aşina, Stored Procedure, Trigger, User Defined Function & T-SQL konusunda bilgi sahibi.
* Delphi programlama dilinde en az 2 yıl tecrübe sahibi, OOP terminolojisine hakim.
* İstanbul’da ikamet eden.

Yukarıdaki nitelikleri taşıdığına inanan arkadaşlarımızın ozen@sekompos.com mail adresine CV’lerini göndermeleri rica olunur.

Yeni Veri Tipleri ve Operator Overloading

// 13 Haziran 2010 // 15 Yorum » // Delphi

Bir önceki makalemizde Interface’ler ile ilgili bilgi vermiş ve Operator Overloading namı diğer operatör aşırı yükleme hususuna değineceğimizden bahis açmıştık. Bu makalemizde; Operator Overloading hakkında yazacağız ve .Net framework’te olduğu gibi çalışan yeni bir String ve DateTime veri türü oluşturacağız. Ancak öncelikle, aslında hepimizin bildiği operatör kavramına bir göz gezdirmekte fayda var sanırım.

Operatörler; belirli veri türleri arasında ilişki kuran, onları bir sonuca ulaştıran yapılardır. Hemen hemen hergün kullandığımız aritmetik işlemlerdeki toplama(+), çıkartma(-), çarpma(*) ve bölme(/) işlemlerini ifade ettiğimiz simgeler; yada mantıksal işlemlerde kullandığımız or(veya), and(ve), not(değil) vb. gibi simgesel ifadelere operatörler denilebilir. Bildiğiniz gibi; operatörler veri türleri üzerinde üstlerine düşen mantıksal yada matematiksel işlemleri yaparak bir sonucun üretilmesini sağlarlar. Operatörlerin bu vazifelerini, gerek günlük yaşantımızda; gerekse de programlama hayatımızda sıklıkla kullanırız. Programlama ortamlarında yaşadığımız tecrübeler gereği operatörlerimizi düzgün veritipleri ile kullanırız. Örneğin toplama operatörü; sağındaki ve solundaki verilerin toplanması amacına hizmet eder. Ancak; toplama operatörünün sol ve sağındaki değerlerin sayısal olması yada alfasayısal olması durumlarında toplamanın neticesi farklılık arzeder. Basit bir örnek verelim;

var
  iLeft, iRight, iTotal : Integer;
  sLeft, sRight, sTotal : String;
begin
  iLeft := 10;
  iRight := 20;
  iTotal := iLeft + iRight;

  sLeft := 'Operator ';
  sRight := 'Overloading';
  sTotal := sLeft + sRight;
end;

Yukarıda gördüğünüz basit örnekte, aynı operatör(+) farklı sonuçlara hizmet etmektedir. Birinci durumda sonucumuz “30″ olurken; ikinci durumda sonuç “Operator Overloading” olmaktadır. Hemen hemen hiçbirimiz; iki farklı veri türünü aynı operatöre vermeyiz. Örneğin hiçbirimiz; bir sayı ile bir string ifadeyi toplamayız. Ancak bazı durumlarda, bir veri türü ile bir başka veri türünü herhangi bir operatöre vererek işlemek isteyebiliriz. Bu gibi durumlarda, genellikle derleyicimiz bizleri uyaracak bir warning vermekle yetinir. Ancak bazı durumlarda yaptığımız işlemlerde beklediğimizin dışında sonuçlar gördüğümüz de olur. Örneğin;

var
  bLeft, bRight, bTotal : Byte;
  wLeft,wRight,wTotal : Word;
begin
  bLeft := High(Byte); // 255
  bRight:= High(Byte); // 255
  bTotal:= bLeft + bRight; // ??

  wLeft := High(Word); // 65.535
  wRight:= High(Word); // 65.535
  wTotal:= wLeft + wRight; // ??
end;

(more…)

Interface Nedir, Nerelerde ve Neden Kullanırız ?

// 30 Mayıs 2010 // 22 Yorum » // Delphi

Şu son bir kaç gündür, Delphi 2010 ve getirdiği yenilikler ile ilgileniyorum. Bu bağlamda; Generic Liste sınıfları ve bu liste sınıflarının özelleştirilmesi ve çeşitli yeteneklerle zenginleştirilmesi üzerine geliştirmeler yapıyorum. Sizlerle bu yaptıklarımı paylaşabilmem için öncelikle bazı temel hususları izah etmek gerektiğini düşündüm. Bu bağlamda; ilk olarak Interface’ler hakkında bir makale, ardından operator overloading konusu ve nihayet generic’ler ve kendi kendini yoketme becerisine sahip bazı özel mekanizmaları işleyeceğiz. Aslında tüm bu hususlara girmeden, özetle nelerin yapılabileceğini paylaşıp örneğimi verebilir ve geçebilirdim. Ancak bu yaklaşım tarzı; benim programlamaya bakış açıma aykırı olduğu ve sizlere pek bir şey kazandıracağına inanmadığım için kendi adıma zor olanı seçip, mümkün mertebe en derinlere kadar inmeye gayret edeceğim.

Hedefimize ilerlerken ilk durağımız olan Interface’lerde biraz durup soluklanalım ve bu kavramın ne olduğu yada ne olmadığı; neleri başarıp neleri başaramayacağı; neden var olduğu ve nerelerde kullanabileceğimiz hakkında nacizane bilgilerimiz ile konunun karanlık köşelerine ışık tutmaya gayret edelim.

Interface kelimesi dilimizde genellikle “Arayüz” yada “Arabirim” olarak kullanılmaktadır. Pek çok programcımız için Interface’ler ya çok basit bir yapı olarak ya da COM programlamanın fıtratı gereği çok karmaşık bir yapı olarak algılanır. Aslında her ikisi de doğrudur. Yapısal görünümü itibari ile son derece basit görünen Interface’ler aslında yapabildikleri ve nasıl yaptıkları itibarı ile de son derece kompleks yapılardır. Bir interface görünüm ve yapı itibari ile bir sınıfa çok benzer. Ancak elbette bu makaleye konu olan pek çok farklılıkları da mevcuttur. Arzu ederseniz makalemizde ilerlemeden önce çok basit bir interface tanımının Delphi’deki yapısını görelim ve ardından ilerlemeye devam edelim:

  IFlyable = interface
  end;

Gördüğünüz gibi bir sınıf tanımına son derece benziyor. Ancak bazı farklılıkları var. IFlyable(uçabilen) arabiriminin tanımlamasında “class” ayrılmış sözcüğü yerine “interface” sözcüğünün geçtiğini gözlemliyoruz. Şu anda gözlemleyebildiğimiz başka bir fark bulunmuyor. Aslında interface’ler özet sınıf adını verdiğimiz abstract sınıflara çok benzerler. Abstract sınıflar, kendisini miras alacak sınıflar için ileride kullanılmasının zorunlu olduğu metodların birer özetlerini içerirler. Ancak bu sınıflar aynı zamanda gerçek kod bloklarına da ev sahipliği yapabilirler. Interface’lerin ve abstract(özet) sınıfların ortak özellikleri; kendilerini kullanacak olan alt sınıflarda tanımlanması gereken metodların şablonlarına ev sahipliği yapmaktır.
(more…)

Derinlemesine Threading..(3)

// 3 Nisan 2010 // 13 Yorum » // Delphi, İşletim Sistemi, Win32

Threading ile ilgili bir önceki makelemizde Event ve WaitableTimer senkronizasyon mekanizmalarını anlatmış ve konuya ışık tutabilmesi adına örnekler paylaşmıştık. Makalemizin sonunda ise; bir thread’i normal yollarla durdurabilmek için(TerminateThread API’sini kullanmadan) bir makale yazacağımdan bahsetmiştim. Bu makalemizin konusu verdiğim söz gereği; bir thread’i sonlandırma seçenekleri ile ilgili olacak.

Ancak, sizlerden ricam bu makalede ilerlemeden önce Threading ile ilgili yazılmış olan diğer makaleleride okumanızdır. İlgili makalelere aşağıdaki linklerden erişebilirsiniz:

Nedir bu Thread’lerden çektiğimiz..!
Derinlemesine Threading..(1)
Derinlemesine Threading..(2)

Şimdi tüm bu makaleleri okuduğunuzu ve threading hakkında fikriniz olduğunu varsayarak, bir thread’i neden durdurmak isteyebileceğimizi ve karşımıza ne gibi sorunların çıkabileceğini biraz izah etmeye çalışalım. Bildiğiniz gibi thread’leri genellikle paralel programlama yapabilmek, iş yükünü dağıtabilmek, ana uygulamamızın kilitlenmesine mani olabilmek adına kullanırız. Ve bazen, thread’lerimizin içindeki kodlar uzun süreli ve hatta kullanıcı ile interaktif çalışıyor da olabilir.

Bazı durumlarda, yazdığımız thread’lerin içinde çalışan kod bloklarını sonlandırmak isteriz. Buna sanırım en güzel örnek, veritabanına bağlanıp büyük bir sonuç seti çekmeye çalıştığımız zamanlarda programımızın kullanıcısının isteği ile rapor alımını durdurmak verilebilir.

Pek çok programcı bu gibi durumlarda, çalışan thread’ini durdurabilmek için TThread sınıfının Terminated özelliğini kontrol eder. Terminated’in true olması durumunda thread çalışma kodundan çıkılmasını sağlar. Buna küçük bir örnek verebiliriz;

procedure TMyThread.Execute;
begin
  inherited;

  while not Terminated do
  begin
     //...
     //...
  end;
end;

Yukarıdaki örnek, sıklıkla kullanılan çok genel bir örnektir. Malumunuz olduğu üzere; TThread sınıfının Terminate metodu bir thread’i durdurma işini yapmaz. Terminate metodu; Terminated isimli property’nin True olarak set edilmesini sağlar. Programımız içerisinde herhangi bir yerde TThread sınıfının Terminate metodunun çağrılması yukarıdaki kod örneği için ilgili thread’in sonlanması anlamını taşır.

Buraya kadar anlattıklarımızda bir sıkıntı ve bu makaleye hayat verecek bir neden de yok gibi görünüyor. Ancak; bizler her zaman thread’lerimiz içinde yukarıdaki kısa kod örneğinde olduğu gibi Terminated property’sinden istifade edemeyiz. Bu hususta da kısa bir örnek verip devam etmek sanırım daha açıklayıcı olacaktır:
(more…)

Derinlemesine Threading..(2)

// 20 Temmuz 2009 // 10 Yorum » // Delphi, İşletim Sistemi, Programlama, Win32

Bir önceki makalemizde thread’ler konusuna giriş yapmış, işletim sisteminin thread’leri nasıl yönettiğini ve thread’lerin senkronizasyon mekanizmalarını anlatmaya çalışmıştık. Bu bağlamda Critical Section, Mutex, Semaphore senkronizasyon mekanizmalarını izah etmiştik. İlk makalemizde değinmediğimiz 2 adet senkronizasyon mekanizmasına da bu makalede temas etmeye çalışacağız. Event ve Waitable Timer adı verilen bu mekanizmalar da tıpkı diğer senkronizasyon mekanizmaları gibi çalışırlar. Bu iki sekonronizasyon mekanizması da WaitForSingleObject yada WaitForMultipleObjects vasıtası ile thread’lerimizin belirli kod bloklarında belirli bir şart sağlanana kadar beklemesi için vardırlar.

Hatırlayacağımız üzere, critical section’lar belirli bir kritik kod bloğuna aynı anda birden fazla thread’in girmesine müsaade etmiyordu. Mutex’ler ise critical section’lara son derece benzemelerine rağmen birden fazla uygulamanın(process) thread’lerinin de aynı kod bloklarına girişlerini senkronize ediyordu. Ardından temas ettiğimiz semaphore’ler ise biraz daha farklı bir yaklaşım ile kritik bir kod bloğuna bizim belirlediğimiz sayıda thread’in girmesini sağlıyordu.

Event mekanizmaları da yukarıda sayılan thread senkronizasyon mekanizmaları gibi çalışırlar. Ancak elbette kendine özgü tarafları da vardır. Programlarımızda hangi thread senkronizasyon mekanizmasını kullanacağımız tamamen ihtiyaçlarımız ile doğru orantılıdır. Birinin bir diğerine üstünlüğü gibi bir şey söz konusu değildir. Tüm bu bahsedilen mekanizmaların asıl amacı, işletim sistemindeki thread geçişlerinin 20 ms. olduğu bir ortamda veriye hatasız bir şekilde erişmek ve kullanabilmektir.

Event mekanizmaları, birden fazla thread’in ortaklaşa çalışması söz konusu olduğunda anlamlı olurlar. Bir thread’in bir diğer thread’i beklemesi gerektiğinde, kısaca bir ekip ruhunun gerektiği noktalarda bu mekanizma son derece kullanışlıdır. Eğer kodlarınızın bir ekip ruhu ile çalışması gerekiyor ise, aralarında bir imece söz konusu ise o halde bu mekanizmayı bilmeniz faydalı olacaktır.
(more…)

Derinlemesine Threading..(1)

// 5 Temmuz 2009 // 31 Yorum » // Delphi, İşletim Sistemi, Win32

Hâla programlama aleminde threading uzak kalınası bir mesele gibi gözlemleniyor. Aslında belli başlı kurallar bilindiğinde bu konunun korkulacak bir konu değil ancak dikkatle ele alınması gereken bir konu olduğu anlaşılacaktır. Genellikle thread dediğimiz mekanizmayı yazdığımız kodların paralel çalışabilmesi için kullanırız. Ancak kullandığımız işletim sistemleri gerçek mânada multi-threaded olmadıkları için hepimizin başına bir ton sorun gelmiştir ve thread’lere lanetler okumuşuzdur. Dolayısı ile onlardan uzak kalmaya mümkün mertebe gayret etmişizdir. Bu makalede amacım, siz değerli okuyucularımı bu mekanizmaya yaklaştırmak, varsa çekincelerinizi bilgim dahilinde gidermeye çalışmak olacaktır.

Thread’lerle düzgün şekilde çalışabilmek için öncelikle çok derin olmasa da orta seviyede işletim sistemi çalışma mekanizmasına aşina olmalıyız. Bu bağlamda işletim sistemleri üzerinde nispeten az bilinen hususlara değinmeye çalışacağım.

İyi bir programcı, üzerinde çalıştığı işletim sistemini tanıyan, onun neleri yapabileceğini ve neleri yapamayacağını bilen programcıdır. Bu öngörü, her zaman düşük seviyeli işletim sistemi bilgilerine müracaat etmeniz gerektiği anlamına gelmez. Yüksek seviye bir dil de kullanabiliyor olabilirsiniz, ancak her zaman olayın arka planında neler olduğunu bilen bir programcı diğerlerine oranla basamaklarca önde olacaktır. Tercih tamamen sizlere aittir. “Çok derin bilgilere girmem, bildiklerim bana yeter, ekmeğimi kazanırım keyfime bakarım” düşüncesinde iseniz, bildiklerinizin size yetmeyeceği gerçeği ile birgün karşılaşacağınızı üzülerek ifade etmek zorunda kalacağım. Her geçen gün sürekli değişen bir bilişim dünyasında kalıcı olabilmeniz; temel seviye bilgilerinizin yüksekliği ile doğrudan orantılıdır.

Yüzyüze karşılaştığım, yada bir şekilde derinlemesine programlama alemi ile ilgili muhabbete girdiğim arkadaşlarıma verdiğim tavsiyeler hep bu yönde olmuştur. Benim kişisel kanım, iyi bir programcının her zaman üzerinde çalıştığı sistem hakkında bilgiye haiz olması üzerinedir. Hemen hemen her programcı, günümüz popüler dillerinde nesneye yönelik programlamayı, pointer’ları ve daha pek çok low level teknolojiyi farkında olarak yada olmayarak kullanmaktadır. Dileğim odur ki, sizler farkında olanların safında olun. Bu farkındalık, sadece şahsınıza değil; şahsınız nezdinde pek çok insana ve hatta ülkenize de faydanız olacağı mânasına gelir.

Blog’umuz genel mânada Delphi üzerine olduğu için vereceğim örnekler Delphi üzerine olacaktır ama bu söylemler programlama ile uğraşan herkesi ilgilendirir. Delphi’ye yeni başlayan birisi dahi olsanız, farkında olmadan pointer’ları kullanıyor, nesneye yönelik programlama dünyasının avantajlarından sonuna kadar istifade ediyor, design pattern denilen popüler programlama konseptlerini programlarınızda kullanıyorsunuz demektir. Delphi, bu derin bilgi gerektiren hususların kullanım zorluklarını, kullanıcılarından gizleme konusunda son derece maharetlidir. Makalemde ilerlemeden evvel, her programcı arkadaşıma Delphi’nin kaynak kodlarında dolaşmasını öneriyorum.
(more…)