Categories: Coding, Öfkeli Coder, Base Class Library, c#
Yazılımcı Araçları
April 15th, 2008Yaptığınız işte daha iyi olmak için neler yapabilirsiniz?
Notepad kullanın
Normalde nerde kod yazıyor olursanız olun, kod dosyalarını çift tıkladığınızda notepad ile açılır hale getirin.
Bu hem dosyalara bakmak istediğinizde size hız sağlar hemde IDE olmadığı durumlarda eliniz ayağınıza dolaşmaz.
Notepad2 kullanın
Windows ile standart gelen notepad temel işlerinizi görecektir ama kod üzerinde hafif düzeltmeler yapmanız gereken durumlarda syntax hilighting gibi cici şeylere ihtiyaç duyabilirsiniz.
Ben notepad'e benzediği için notepad2 kullanıyorum, ultraedit gibi daha gelişmiş olanları var ama editor konusunda minimum ihtiyaçları karşılaması yeterli. Böylece kendi makinanız dışında başka yerde çalışırken tekrar eliniz ayağınız dolaşmaz.
Araç Seti Oluşturun
Sık kullandınız araçları bir dizinde toplayın, böylece bir sorun yaşadığınızda elinizde ne olduğunu unutmazsınız.
Kullandığınız araçlara sadece bir tıklama ile uzak olacak şekilde kısayollar oluşturun. Benim yolum desktop'da bir toolbar açarak tüm kısayolları buraya yerleştirmek. Böylece ekranda daima karşımda olan bir araç seti olur. Unutmadan desktop'unuzdaki kaldırabildiğiniz herşeyi kaldırırsanız tüm pencereleri minimize ettiğinizde rahat bir nefes alabilirsiniz.
Araç olarak kullandıklarım;
- regmon
- Registry'e erişimleri loglayan bir araçtır. Programların registry üzerinde ne işe yaptıklarını izlemek için kullanılır
- filemon
- RegMon gibi ancak dosya sistemi üzerinde yapılan işlemleri izlemeyi sağlar
- CSS Reference
- Herhangi bir CSS Reference sayfasına link. Internet olmadığı durumlarda kullanabilmek için ben kendi diskimde tutuyorum.
- DbgView
- DbgView (DebugView) uygulamaların hataları bulmak için yazdığı logları görmek için kullanabileceğiniz bir uygulama. Çoğu uygulama buraya kayıt atmaz ancak kendi uygulamanız içinde System.Diagnostics.Debug yada Trace classlarını kullanarak buraya çıktı gönderebilirsiniz.
- ProcessXp
- Windows ile standart gelen Task Manager'a alternatif olarak kullanabilirsiniz. Bunun yanında .Net processleri ile ilgili bazı bilgilerde veriyor.
- Internet Information Services
- Normalde Control Panel\Administrative Tools altında bulunan bu kısayol web altında geliştirme yaptığınız durumlarda en çok kullanacağınız araçlardan biridir.
- HexEdit
- HexEdit text dışındaki formatlardaki dosyaların içeriğini görmek için kullanabilirsiniz. Gayet minik ve göstermek için dosyanın tamamını okumadığı için gayet kullanılabilir bir araçtır.
- Reflector
- Reflector hem .net kütüphanelerini gezmek hemde içeride ne yapıldığını görmek için kullanabileceğiniz bir decompiler. Çoğu hatanın asıl nedenini bulmak için yardımcı olacaktır.
- Managed Spy
- .Net uygulamarının içeriğini kurcalayabileceğiniz bir uygulamadır. Uygulamanın penceresi içerisindeki nesnelerin özelliklerini çalışırken değiştirmenize izin verir.
- TcpView
- Network bağlantısı yapmış yada yapan uygulamaları izlemek için kullanabilirsiniz.
Bu araçların dışında kendi yazdığım diğer bir sürü uygulamalarda (XmlFormat, Base64Decoder..) ve yıllardır kullandığım bir Dopus uygulaması varki, windows'un içinde preinstalled gelsin istiyorum.
Firefox Kullanın
Web uyumluğuğu, performans, açık kaynak konularını bir kenara bırakın sadece FireBug için bile bu browser'ı kullanabilirsiniz. Internet Explorer nedense gittikçe daha yavaş daha tuhaf daha bişeyler oldukça bu böyle kalacak.
Firefox ile aşağıdaki addonları mutlaka kullanmanızı tavsiye ederim.
- Firebug
- IE Tab
- Linkification
- PDF Download
Beyond Compare Kullanın
Beyond Compare kod dosyalarını karşılaştırmak için para veripde karşılığını alabileceğiniz az adetteki araçlardan biridir. TortoiseSVN ile birlikte kullanma imkanınızda var.
Source Monitor ile istatistiklerinizi izleyin
Source Monitor kodlar üzerinde statik analiz yapmanızı sağlayan bir araçtır. Bu araçla satır adedi, karmaşıklık gibi detaylı raporları görebilirsiniz.
Fiddler
Web üzerinde uygulama geliştiriyorsanız arkada neler olduğunu görmek için kullanabileceğiniz en iyi ve tek uygulama. Kendisini browser'a proxy olarak tanıtıyor ve http işlemlerini izlemenizi sağlıyor.
Serialization nedir, nerede kullanılır ?
February 13th, 2008Biraz uzun bir yazı oldu ancak halen yeterli olduğunu düşünmüyorum ancak konuyu bilmeyenler için hızlı bir giriş ve önemli konuları anlatabilirim umarım.
Serialization tanımladığınız class'ları memory, disk, network gibi katmanlardan geçirmek için kullandığınız teknolojidir. .Net içinde Remoting, WebServices gibi geniş alanlarda siz farkında olmadan sessiz sedasız çalışırlar.
Tanımladığınız class serialize edilirken kullanacağınız formata göre farklı şekillerde formatterlar kullanılır. Format olarak .Net içerisinde Xml ve Binary olarak temel 2 format için formatter tanımlanmıştır.
Serialization'da temel olarak yöntem bir obje üzerinden diğer tüm obje ilişkileri çözülerek bir hedef kaynağa tüm özellikler yazılır. Karşı tarafta da aynı işlemin tersi yapılarak obje yeniden hayata geri döndürülür.
Serialization sırasında objeniz üzerindeki Method, Property gibi özellikler kaydedilmez, sadece ve sadece private olarak tanımlanmış class üzerindeki tüm yer kaplayan bilgiler (string, datetime, başka bir class) kaydedilir. Bu işlem system.reflection ile class üzerinde tüm değişkenler taranarak yapılır. Bu yüzden class'ı yeniden hayata geçirek olan tarafda o class'ın biliniyor olması gereklidir, yani client ve server tarafında aynı class'ın tanımlanmış olması (dll yada farklı yöntemlerle) gerekli.
Bu arada System.Reflection kullanıldığı ve genel bir sistem için tasarlandığından standart class yaratıp kullanmaya göre biraz daha yavaş çalışır ama korkulacak seviyede bir yavaşlıktan bahsetmiyorum.
Binary Formatter
Binary formatter çoğunlukla hız gereken yerlerde (Remoting) gibi kullanılılır. Mesela Client/Server bir uygulama yazmak istediğinizde classlarınızın çok hızlı şekilde client ve server arasında dolaşmasını istiyorsanız bu format sizin için uygun olacaktır.
Aynı şekilde bir class'ı diske kaydetmek istediğinizde .Net size itiraz etmez ancak pratikte bunun bazı yan etkileri olacaktır. Bu detaylara ilerleyen kısımda geliriz.
Xml Formatter
Bu formatda class xml formatına dönüştürülerek yapılır. Üretilen Xml formatı açık olduğu için herhangi bir başka uygulama yada platform tarafından okunabilir. Böylece web servislerinin tüm kapıları açılır.
Örnek olması için başka bir blog'dan aldığım örnek;
Code:
public class Person | |
{ | |
[XmlElement("FirstName")] | |
public string Name { get; set; } | |
public List<Pet> Pets { get; set; } | |
} | |
| |
public class Pet | |
{ | |
[XmlAttribute("Name")] | |
public string Name { get; set; } | |
[XmlAttribute("Breed")] | |
public string Type { get; set; } | |
} |
class'larını serialize etmek isteğinizde;
XML:
<PetClub xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> | |
<Members> | |
<Person> | |
<FirstName>Jon</FirstName> | |
<Pets> | |
<Pet Name="Chester" Breed="Savannah Cat" /> | |
<Pet Name="Abby" Breed="Domestic Miniature Panther" /> | |
</Pets> | |
</Person> | |
<Person> | |
<FirstName>Dan</FirstName> | |
<Pets> | |
<Pet Name="Lucy" Breed="Semi-sweet Chocolate Lab" /> | |
</Pets> | |
</Person> | |
</Members> | |
</PetClub> |
bir xml dosyası oluşacaktır. Bunu yapmak için;
Code:
public static string ConvertToXml(object item) | |
{ | |
XmlSerializer xmlser = new XmlSerializer(item.GetType()); | |
using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) | |
{ | |
xmlser.Serialize(ms, item); | |
UTF8Encoding textconverter = new UTF8Encoding(); | |
return textconverter.GetString(ms.ToArray()); | |
} | |
} |
metodunu kullanabilirsiniz.
Dikkat
Serialization dikkatli kullandığınız sürece her zaman için işinize yarayacak bir araçtır. Ancak yanlış kullanımlarda başınıza ciddi sorunlar açabilir.
Diske kayıt işlemleri için ASLA binary formatter kullanmayın. Aksi halde class'larınız üzerinde değişiklik yaptığınızda yada versiyon'u numarasını değiştirdiğinizde eski verileri okuyamazsınız. (Bunu atlatmanın yolları var ancak pratikte pek işinize yaramaz)
Client/Server konuşmaları için ASLA xml formatter kullanmayın. Aksi halde ciddi performans sorunları yaşayabilirsiniz. Web servisleri içinde xml formatter kullanılsa da bu servisler zaten yavaş çalışacağı bilinerek tasarlandığından sorun olmaz ancak client server tipi uygulamalarda kabul edilen sınırı aşan bir yavaşlık yaşarsınız.
Yeterli zamanınız varsa xml için kendi mekanizmanızı oluşturun. Bu xml verisini okumak ve class'ları başlatmak için çok daha hızlıdır.
Code:
public interface IXmlSerializable | |
{ | |
void XmlParse(XmlNode node); | |
void XmlCompile(XmlWriter writer); | |
} |
şeklinde bir interface tanımlayarak kendi serialize metodlarınızı tanımlayabilirsiniz. Bu sayede reflection olmadan hızlı yollarla ve versiyon değişikliklerinden etkilenmeden yola devam edebilirsiniz.
button1_click
July 31st, 2007arayüz geliştirme ile ilgili her ne çeşit uygulama olursa olsun uzak durulması gereken bir ifadedir bu. görünüş olarak çok masum olarak dursada ne zaman bu ifadeyi görsem kafamda yüzlerce sorun belirir. bu ifadeden neden bu kadar nefret ettiğimin nedenleri aşağıda ama bu nedenlerden bir kaç tanesini kendinizde görüyorsanız çalışma düzeninizi gözden geçirmenizde fayda vardır.
mimari sorunları
uygulamanın mimarisi ile ilgili bir component based geliştirilmemiş, arayüz üzerindeki bileşenler arasında bağımlılığın son derece yüksek olduğunun işaretidir ve yapılacak en ufak değişiklikte yan etkilerinin ne olacağı kestirilemez. geliştiren kişinin command pattern'in ne olduğunu bildiğini varsayarak bu konuları pekte takmadığı söylenebilir. yaş olarak 2-3 ay'ı geçmiş kodlarda sistemin diğer kısımlarında dailywtf'dakilerle yarışabilecek yamalar görmeniz beklenmeyecek bişey değildir.
kod kalitesi
bu metod (yada event handler) içerisindeki satır adedi direkt olarak kod kalitesini gösterir. "button1_click" ifadesinden kodu okuyan kişinin hiç bir şey anlamayacağı üzerinden gidersek devam eden satırlarda "combox37_SelectedValueChanged" gibi bir başka bir metod çağrısı beklenebilir ve önünüzde duran kodun ne iş yaptığı konusunda hiç bir fikriniz yoktur. bu durumda uygulamaya bakım yapan kişinin kodu anlamaktan öte random testlerle "allahın belası uygulamayı çalıştırmak" gibi bir derdi vardır. test'lerden birinin istenilen sonucu vermesi sonucunda öncekinden daha kötü bir harabe ile sistem production'a alınır.
geliştiren ekip
uygulamadan sorumlu "lead developer" arayüz ile ilgili kodları pek umursamıyor yada "lead developer" yoksunluğundan uygulamanın modülleri ekip içerisinde paylaşılmış, herkesin kafasına göre takıldığı bir ortam sezilebilir. bu tür kodlar bulunan bir uygulamanın yazıldığı şirkette genellikle 3-9 ay arasında tüm ekip değiştiği için her 1 yıl içerisinde uygulama yeniden yazılır. yeni gelenlerinde bu yolu takip etmeleri durumunda bir osmanlı yürüyüşü (2 ileri 1 geri) uzaktan bakıldığında görülebilir.
en iyi durumda stress altında yazılmış bir koddur ve takvime göre gecikmiş bir uygulamadır. süregelen bu tür kodlar uygulamayı daha kötü bir hale sokar ve uygulama bitse bile herkesin dokunmaya korktuğu bir doğarken ölmüş bir uygulama olarak şirket tarihine geçer.
arge & re-enginerring
arge faaliyetleri olmadan geliştirilmiş yada ekip içerisindeki en az 1 kişinin bile (bazı durumlarda "lead developer") kod kalitesi gibi konuları üstlenmediği söylenebilir. ekip geliştirilen uygulama hakkında gün içerisindeki 1 saat bile "daya iyi" konusu etrafında düşünmek yerine "make it work" hedefiyle ilerler. optimizasyon kod yazılırken on-the-fly yapıldığı için uygulamanın vereceği performans cpu&ram gibi değerler yerine bilinmezliklerle doludur.
en iyi ihtimalle geliştirilen kodlar source control tool'u olarak projenin başlangıcında bir kaç kez commit yapılmış source safe üzerinde durur ancak şu an pek kimse kullanmıyordur.
neden ?
şu anda üzerinde çalıştığınız uygulama sizin eserinizdir. tüm bu maddelerin hiç birinin iyi tarafı yok ve dönüp dolaşıp sizin başınızı ağrıtacaktır.
bu eziyeti kendinize yapmanızın anlamı yok, bu yüzden işe kodunuz içerisindeki "button1_click"leri kaldırarak başlayın.
arge faaliyetlerine önem verin, ofis içerisinde zaman ayıramıyorsanız akşam eve gittiğinizde televizyonda bülent ersoy'u seyretmek yerine 1 saatinizi ayırarak dünyadaki diğer bu işi yapanların bu işi nasıl çözdüğünü öğrenmeye çalışın.
tüm bunlar için geç olduğunu düşünüyor olsanız bile bir sonraki yapacağınız projede bu hataları tekrar etmemeniz şirketiniz bir yana sizin için iyidir.
Equals ve ==
July 3rd, 2007![]()
Kullandığınız objenin tipi ne olursa olsun .NET'de iki objenin eşit olup olmadığını karşılaştırmanın iki yolu vardır.
if ( a == b )
yada
if ( a.Equals(b) )
Görünüşte aynı işi yapıyor gibi olsalarda gerçekte oldukça farklıdırlar.
VS2005 Araçları
April 14th, 2007
Daima plugin delisi birisi olduğum için, her VS2005 (Visual Studio 2005) kurduğumda mutlaka yanında kurduğum araçlar vardır, IDE'nin kendisi güzel olsada bu tool'lar olmadan kalkansız savaşa girmiş hissederim hep.
VS2005 Team Edition
* Professional edition'dan farklı olarak içerisinde Code Analysis (yani FxCop) ve Profiling bulunur. Sadece Code Analysis için herşeye değer.
TortoiseSVN
* SVN kullanıyorsanız kullanabileceğiniz tek ve en güzel svn client'dır. Ücretsizdir.
VisualSVN
* IDE içerisinden TortoiseSVN komutlarını kullanmak için geliştirilmiş ama benim kullanım amacım sadece dosyaları rename ettiğimde svn'i haber vermesi. Ücretlidir.
NCover
* Coverage için kullandığım şahane. Ücretsizdir.
testdriven.net
* IDE içerisinden unit test rutinlerini çalıştırmak için kullanırım. NCover ile arkadaş olduğu için daha bir güzel. Ücretsizdir.
Bu araçları yanınıza aldıktan sonra "life is beatiful" şarkısını söylemeye başlayabilirsiniz.