Delphi cross platforma destek verecegini soylediginde acikcasi bunu vcl ile yapacagini dusunmustum. mevcut vcl uygulamalarini az bir gayretle cross platforma uygun olacak hale getirip baska platformlar icin derlemek guzel olurdu ama biraz mantikli dusundugumde windowsla bu kadar icice olan bir kutuphanenin bu hale gelmesi pekte mumkun gozukmuyordu. Simdi cross platform icin firemonkey kutuphanesi olusturuldu vcl olmasada delphinin rtl gibi vcl harici kutuphaneleri de cross platformu destekler hale getirildi. Ilk basta pek icacici gibi gorunmesede uzun vadede delphi ile yazilim gelistiren programcilara gercek manada yazilim gelistirmeyi ogretecek bir zorunluluk meydana gelmesi benim acimdan cok sevindirici bir olay oldu.
Continue Reading...
Uzun zamandir Delphi ile ilgili bir makale , yazi vs. yazmadim. Birkac kere elim gider gibi oldu ama nedense sonunu getiremedim. Delphi ile ilgili yazilar yazdigim blogu kapattim , kisisel blogumda oylesine duruyor cok ellemiyorum. Biryerlerde insanin login olabilecegi baska wordpressler olmasi guzel sey
Evet yine belki bir makale yazmadim ama guldururken dusunduren 10 tane soru hazirladim. Sorular statik ve dinamik metodlarin calisma mantiklarini birebir gormenizi saglayan cinsten sorular. Gercekten sorulari teker teker programa koyup calistirip ciktilarina baktiginizda insana cok seyler ogretebiliyor. Hatta sorulardan bir tanesini Access Violatin verecegini dusunurek hazirlamistim , calisitirinca Access violation hatasi vermeyince bir kac saniyeligine sok olmustum
Once sorulari bir calistiralim , ciktilara bakalim , sonrasin da ise ciktilarin nasil olupta boyle sonuclar urettigi ile ilgili hep beraber burda kafa patlatalim
Continue Reading...
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.
Continue Reading...
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;
Continue Reading...
Ş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.
Continue Reading...
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:
Continue Reading...
EDIT DISTANCE
Aşağıdaki 2 fonksiyon size stringler arasındaki benzerlik oranlarını vermekte en benzer olanların sonuçları en küçük olanlar çıkacaktır. Yani fark arttıkça dönen sayı artmakta bunu unutmayın.
Continue Reading...
Full-Text Search ile Arama İşlemleri
Full Text Search servisi ile SQL Server”da karakter bazlı alanlarda arama yapılarak daha verimli arama sonuçları elde edilebilir, ancak arama yapılacak olan alanlar üzerinde ilk olarak Full-Text Index”ler tanımlanmalıdır. Full Text Index”ler belirtilen alanın verisini fiziksel olarak belirtilen alana indeksleyerek bu alan içerisinde arama yapılmasını kolaylaştırır. Full Text Index tanımlamak için indeksin tanımlanacak olduğu tablo üzerine sağ tıklayarak Full Text Index seçeneği üzerinden Define Full Text Index seçeneği seçilmelidir. Full-Text Index tanımlarken bu Full-Text Indexler”in gruplanacağı yeni bir Full-Text Catalog tanımlanacağı gibi var olan bir kataloga da eklenmesi sağlanabilir. Full-Text Index tanımlanırken dikkat edilmesi gereken bir nokta da indeksin tanımlanacak olduğu tabloda en azından bir tane UniqueKey tanımlanmış olması gerekliliğidir. Tabi bu ayarı yapabilmek için DataBase”de Full Text Indexing özelliğinin aktif olarak ayarlanmış olması gerekmektedir. Eğer üzerinde arama yapılmak istenilen DataBase”in Full-Text Indexing özelliği aktif değilse DataBase”in özelliklerinden Files bölümünde bulunan CheckBox seçili hale getirilerek aktif yapılabilir. Full-Text Index”ler char, varchar, text, ntext, nchar ve nvarchar veri tipinde tanımlanmış olan alanlar üzerinde tanımlanabilir ve Full Text Search servisi bu alanlarla kullanılabilir.
Arama yapılacak olan sütun ya da sütunlar üzerinde Full-Text Search servisi kullanılarak arama yapmak için kullanılabilecek bir kaç farklı SQL sözcüğü vardır bu yazımda bunlardan CONTAINS ve FREETEXT sözcükleri üzerinde örnekleme yapıyor olacağım.
Continue Reading...
Hayatimiz boyunca kim bilir kac defa Showmessage komutunu kullandik ve kim bilir kac defa IntToStr , DateToStr , TimeToStr gibi komutlari kullanarak gostermek istedigimiz degeri string tipine donusturup islemi gerceklestirdik. Bu durumdan kurtulmanin elbet bazi yollari mevcuttu , showmessage komutunu overload etmek , variant tipini kullanmak vs. Bunlardan kimisi delphi icinde standart olmadigindan astari yuzunden pahali olan cozumlerdi kimiside yavasliklari nedeniyle tercih edilmiyordu ve bizde en basit islemlerde bile tip cevrimlerini manuel yaparak yolumuza devam etmek zorunda kaliyorduk.
Continue Reading...
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.
Continue Reading...