Categories: Coding, Base Class Library, c#, Öfkeli Coder
VB.Net Üzerine
May 27th, 2009Bu tarihlerden yaklaşık 8 yıl öncesinde Microsoft .Net adında bir platform çıkaracağını duyurduğunda üzerinde en çok durulan konulardan biriside o zamanlarda var olan VB projelerinin yeni platform'a fazla değişiklik yapmadan upgrade edilebileceğiydi.
Ufak tefek problemler dışında bu sözlerinde durdular da, şu anda Microsoft'u bulunduğu yere getiren VB'ye sadık kalarak şu anda da .Net içerisinde VB kullanabiliyoruz.
Ancak VB'ye ait hafıza yönetimi, object oriented gibi kronik problemlerden bazıları da .Net içerisine taşınmış oldu. VB 6 üzerinde çok fazla proje yapmış birisi olarak bu tür problemlerden uzak durabilmek için başından beri .Net içerisinde VB kullanmaya pek sıcak bakmadım.
Bu 8 yıl içinde IDE içerisindeki bana garip gelen özellikler dışında üretilen kod gibi çok fazla detayına girmedim ancak yakın bir arkadaşımın VB.Net üzerindeki projesinde memory problemleri çıktığı için detaylarla uğraşınca boşuna endişelenmediğim ortaya çıktı.
VB ile 5-6'dan fazla form olan bir proje üzerinde çalışıyor iseniz benzer sorunlar sizinde kapınızda olabilir.
Neler oluyor ?
Öncelikle VB syntax'ına çok alışık olmadığım için örnekleri c# ile veriyorum, umarım anlaşılır olur.
VB ile yeni bir proje açtığınızda projenizde görmediğiniz MyProject adında bir class tanımlanıyor ve bu class ile proje içerisindeki kaynaklara erişiyorsunuz. Tanımı aşağıdakine benzer halde;
Code:
internal sealed class MyProject | |
{ | |
internal static MyApplication Application { get; } | |
internal static MyComputer Computer { get; } | |
internal static MyForms Forms { get; } | |
internal static User User { get; } | |
internal static MyWebServices WebServices { get; } | |
} |
Bu class sayesinde geliştirme yaparken gerekecek kaynaklara erişim sağlanıyor. Proje içerisindeki tanımlanan formlara da Forms üzerinden ismi ile erişilebiliyor. Örneğin "Login" isimli bir form'unuz var ise MyProject.Forms.Login.Show() diyerek login penceresinin gözükmesini sağlıyorsunuz.
Ancak sorun şu ki MyForms class'ı projeyi derlediğinizde otomatik üretilen bir class ve Login penceresi için aşağıdaki kod üretiliyor.
Code:
internal sealed class MyForms | |
{ | |
public frmLogin m_frmLogin; | |
public frmLogin Login | |
{ | |
get | |
{ | |
this.m_frmLogin = Create__Instance__<frmLogin>(this.m_Login); | |
return this.m_frmLogin; | |
} | |
set | |
{ | |
if (value != this.m_frmLogin) | |
{ | |
if (value != null) | |
{ | |
throw new ArgumentException("Property can only be set to Nothing"); | |
} | |
this.Dispose__Instance__<frmLogin>(ref this.m_frmLogin); | |
} | |
} | |
} | |
} |
Bu koddan anlaşılacağı üzere de Login penceresine 1 kez erişildiğinde uygulama kapanıncaya kadar hafızada kalmak zorunda ve bu class üzerinde referans'ı taşındığı için garbage collector tarafından da toplanamıyor.
Bu yüzden uygulama belirli bir süre kullanıldıktan sonra hafıza kullanımı giderek artmaya başlıyor. Bu sorunu çözmek adına uğraşsamda otomatik üretilen bir kod olduğu için müdehale edemiyorsunuz.
Çözüm
Henüz uygulamış değilim ancak olası tek çözüm MyForms üzerinde m_frmLogin public olarak tanımlanmış, henüz erişim olup olmadığı konusunda fikrim yok ancak olası tek çözüm reflection ile MyForms'u taramak gibi gözüküyor.
Biraz hack tipi bir çözüm ancak null olmayan ve ekranda gözükmeyen tüm m_frmLogin tipi değişkenleri zorla dispose edecek bir kod eklemeyi düşünüyorum. Eğer sorunsuz olarak çalışırsa bu yazıyı güncelleyerek buraya eklerim.
Sonuç
VB.Net eski uygulamaların yeni platform'a taşınması için bir kapı idi ancak bu kapıyı artık kullanan kimse kalmadı, yeni başlayan ve ortalama ve altı ağırlıkta uygulama geliştirmek için hazırlanmış bir dil, özet olarak hızlı sonuç gerektirmeyen ciddi uygulamalar için kullanılmasını tavsiye etmiyorum.
Evet syntax'ı biraz daha karışık ama eski alışkanlıkları bırakıp yerine daha ortak kullanımı olan c temelli, yazdığınız kodun gözüktüğü gibi çalışacağını bildiğiniz .Net'in doğal dili c# ile geliştirme yapmanızı tavsiye ederim.
bir sayının 2 üzeri olup olmadığını bulmak
May 16th, 2009Yetki kontrolleri için hazırladığımız kütüphanede ihtiyacımız olduğundan ve birazda enteresan bir problem olduğu için buraya da yazmak istedim.
elinizdeki herhangi bir sayının 2 üssü bir sayı olup olmadığını kontrol edecek bir fonksiyon yazın. hızlı çalışması için optimize edin.
örneğin;
8 (2 ^ 3) için true verecek.
128 (2 ^ 7) için true verecek.
132 için false ferecek.
not : hızlı çalışması gerektiği için logaritma gibi fonksiyonlar en son seçenektir.
Silver Bullet
February 26th, 2009"Silver Bullet" deyimi bir yazılımcının günlük hayatında hergün karşılaştığı problemlerden biridir. Zavallı yazılımcılardan hergün "Silver Bullet" istenir ve eğer yazılımcı gerçekte böyle bir şey olmadığını henüz öğrenmemiş ise sonuçlar çok kötü olabilir.
Silver bullet deyimi kurtadam, vampir, cadı, ve diğer benzer yaratıkların hepsi için etkili olan bilim kurgu'da geçen bir mermi türü demektir aslında.
Daha düzgün söylemek gerekirse maksimum efektiflik ile en basit ve doğru çözüm demektir.
Elbetteki bu tür silver bullet çözümleri gerçek hayatta çok nadir bulunur ve biz insanlar her türlü problemde bu mermilerden ararız.
Gerçek hayatımızdaki bulduğumuz çözümler aslında proje yönetiminde anlatılan Project triangle denilen bir üçgen'in içerisindeki bir noktadadır.

Bu üçgen üzerinde istediğiniz bir yada iki özelliği yüksek seçebilirsiniz ancak diğer 3. özellik diğerlerine göre eksik olacaktır.
Hızlı ve ucuz istiyorsanız iyi olmayacaktır.
Hızlı ve iyi istiyorsanız ucuz olmayacaktır. vs

Gerçek hayatta böyle bir denge olduğunu hepimiz biliriz ancak anlatmakta zorluk çekeriz, bir dahaki sefere sizden "silver bullet" isteyen beyaz show'daki psikopat'a bu üçgeni anlatabilirsiniz.
Breakpoint Donation
February 11th, 2009Link: http://www.scene.org/donate_breakpoint.php
2003 yılından beri her yıl düzenli yapılan en büyük demo partilerinden biri olan Breakpoint global kriz yüzünden sıkıntıya düşmüş.
Parti'yi ayakta tutmak için içinizden gelen tutar kadar bağışlamak için http://www.scene.org/donate_breakpoint.php sayfasını kullanabilirsiniz. PayPal sayesinde bir kaç saniye içinde bağış yapabiliyorsunuz.
Konuya yabancı olanlar için demo partileri bilgisayar meraklıları tarafından düzenlenen tamamen amatör bir organizasyon. Bu partilerde herbiri sanat eseri olabilecek multimedya yazılımları yarışıyor. Örnekler için www.pouet.net sayfasındaki demolara bakabilirsiniz.
Bedava dağıtılan bu demolardan geçen sene 4kb alanında birinci olan Atrium yada Metamorphosis için bağışlayacağınız 3-5 € önemsiz kalacaktır.
Gerçekten bir veritabanına ihtiyacınız varmı ?
December 22nd, 2008Muhtemelen sizinde başınıza gelmiştir. Müşteriniz sizden belirli bir işi yapacak küçük bir uygulama ister ve sizde işe veritabanı modellemek ile işe başlarsınız. Tam bu anda masanızdan geri çekilip, bir dakikalığına bu soruyu kendinize sormanızı tavsiye ederim.
Gerçekten bir veritabanına ihtiyacım varmı ?
Bu sorunun cevapları birazda aşağıdaki sorulara da cevap vererek ortaya çıkacaktır.
- Karmaşık bir veri yapısı varmı ?
- İndex olarak tanımlayabileceğim bilgiler varmı ?
- Saklanacak verilerin boyu binlerce adetlerde mi olacak ?
- Zamanım varmı ?
- İşlem yaparken tüm veri yerine sadece bazı parçalarla mı işim var ?
Bu soruların çoğunluğuna hayır diyorsanız muhtemelen bir veritabanı uygulaması kullanmanıza ihtiyaç yoktur.
Basit serialization tekniklerini kullanarak çok hızlı bir şekilde uygulamanızı tamamlayabilirsiniz. Böylece klasik yazılım geliştirme sorunlarından veritabanı bağımlılığı, uygulamanın karmaşıklığı vs gibi onlarca sorundan da kurtulursunuz.
Hatta bu soruları uygulama geliştirirken component bazında da düşünebilirsiniz. Örneğin yazdığınız uygulamada diyelimki kullanıcıların seçenekler ekranındaki bilgileri bir her bir seçenek için sütun açılmış bir tablo yerine tek bir sütun içinde xml bilgisi olarak saklamak mükemmel bir çözüm olacaktır. Bu tür bilgilerde kullanıcının Id numarası dışında index olarak kullanabileceğiniz pek bilgi olmaz. Seçenekleri yüklemek istediğinizde de genellikle tüm bilgilerin yüklenmiş olması gerekir.
Böylece veritabanı içerisinde onlarca sütun açıp, uygulamanın yeni versiyonunu çıkarttığınızda tablolar üzerinde güncelleme yapmak vs. gibi ihtiyaçlarınız olmayacaktır.