Kimi zaman uygulamalarımızda ihtiyaç gereği (örneğin plugin tabanlı bir mimari kullanılarak uygulama geliştirilirken) çalışma zamanında Reflection tekniklerini kullanarak dinamik assembly dosyalarını ilgili application domaine yükler ve kullanırız. Bu kısımda dikkat edilecek noktalardan birisi de biribirini kullanan assembly'ler varsa bağımlı olunan diğer assembly'lerin de yüklenmesini sağlamak gerekmetedir.




Kısa bir örnek üzerinden inceleyelim. Örneğimizde üç proje yer almakta.

cl1.dll : Ana uygulama tarafından kullanılacak assembly
cl2.dll : cl1.dll in bağımlı olduğu diğer dll
Diğer uygulama da test kodlarımızın yer aldığı projemiz.

cl1.dll içerisinde Class1.cs isimli kod dosyamız bulunuyor. İçeriği aşağıdaki gibidir. Tabiki cl2.dll i de referans edildiğini dikkate alıyoruz.

namespace cl1
{
    public class Class1
    {
        public int Test()
        {
            cl2.Class2 c2 = new cl2.Class2();
            return 2 * c2.Test();
        }
    }
}
cl2.dll içerisinde de Class2 isimli bir dosya bulunmakta ve içeriği de aşağıdaki gibidir.
namespace cl2
{
    public class Class2
    {
        public int  Test()
        {
            return 10;
        }
    }
}
Görüldüğü gibi Class1 sınıfının Test metodu çağrıldığında Class2 sınıfından bir nesne yaratılmakta ve onun da Test metodu çağrılmaktadır. Bu durumda eğer cl1.dll dinamik olarak yüklenir ve Test metodu kullanılmak istenirse cl2.dll in de application domaine yüklenmesi zorunluluğu ortaya çıkmaktadır. Bunun için de AppDomain sınıfının AssemblyResolve eventine kendi metodumuzu yazarak bir assembly application domaine yüklendiğinde eğer bağlı olduğu başka bir assembly var ise bu event ateşlenecek ve metodumuzda da ilgili assembly yi yükleme imkanı bulacağız. Örnek kod aşağıdaki gibidir.

  private void button1_Click(object sender, EventArgs e)
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            Assembly asm = Assembly.LoadFile(@"C:\temp\WindowsFormsApplication9\cl1\bin\Debug\cl1.dll");
            Type t = asm.GetType("cl1.Class1");
            object o = Activator.CreateInstance(t);
            MethodInfo mi = t.GetMethod("Test");
            int sonuc = (int)mi.Invoke(o,null);
        }

        Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            Assembly asm = Assembly.LoadFile(@"C:\temp\WindowsFormsApplication9\cl1\bin\Debug\"+args.Name.Split(',')[0]+".dll");
            return asm;
        }


 
Categories: .NET | C#

June 19, 2009
@ 05:22 PM
Gemiş zaman içinde bir blog girdisinde -ado.net takımının blog'u - artık OR/M konusunda baya yol alındığını .net ile OR/M  yapılacaksa bunun için Ado.net Entity Framework kullanılmasının tavsiye edildiğini LINQ to SQL konusunda ise duruma göre bakacaklarını müşterilerden gelen geribildirimlere göre de ilgileneceklerini içeren bir yazı okumuştuk. Maşallah iyi de etmişler yazmışlar çizmişler. Baştan söyledik, olmadı, hata ettiniz, gitmez bu böyle, düzeltin vs. diye. Yerine Ado.net Entity Framework getirdiler de biz daha "acaba mı? oldu mu ?" bir bakalım diyerek eleştirilerimize başlamadan Microsoft bize " But not Perfect" demişti bile. (Resim için Sefer Hoca'ya teşekkür ederim)



Neyse sağlık olsun dedik.Geliştirilmesi durduruldu, linq to sql öldü mü? ( google'da bir arayalım bakalım ?) diye herkes bişiler söylerken -ki herkes öldü diyor - Microsoft takımı yine sağ gösterip sol vurdu gibi geliyor bana. .NET 4.0 ile beraber oldukça fazla yenilikler ile değişerek karşımıza çıkmaya hazırlanıyor. Değişiklikleri ve iyileştirmeleri merak edenler şurdaki linkden - çok uzun olduğu için buraya kopyala yapıştır yaparak yazıyı boğmak istemedim - detayları inceleyebilirsiniz. Yani ne diyelim şimdi Linq to SQL ölmedi mi ?


 
Categories: .NET | Inceleme

April 13, 2009
@ 02:28 PM

Yine bir OOP Principles & Design Patterns (Tasarım Kalıpları)  eğitimini daha sonlandırdık. Güzel geçen 32 saat sonunda ( sanırım daha mı fazla sürdü ne ;) ) tüm tasarım kalıplarını çiçek böcek araba'dan ziyade gerçek hayat örnekleri ile inceledik.

Her yazılımcı için "kesinlikle öğrenilmeli, bilinmeli" dediğimiz bu eğitimin detaylarını şurdaki linkten inceleyebilirsiniz.


 
Categories: C# | Yasam

January 30, 2009
@ 03:27 PM

Uzun zamandır dost sohbetlerinde bazı konuların herzamankinden daha sık konuşulması dikkatimi çekiyor. Her konuşmada aslında farklı fikirler farklı yaklaşımlar da ortaya çıkmıyor değil. Ben de sizleri özetle bu konuya ortak etmeye çalışarak, biraz olsun belirli sorular sordurmak niyetindeyim.

Yaklaşık bundan 11 yıl önce programlamaya adım atmak istediğimde ilk yaptığım iş çevremde ilk bulduğum "iyi" programcıya yapışmak ve beni programlama konusunda yönlendirmesini istemem oldu. Elimde bir Delphi 3 CD’si ve almam gereken bir kitabın isminden başka birşey yoktu. Hemen sahaflardan kitabi edindikten sonra yaklaşık 3 – 4 ay uğraştım ve kitapdaki örnekleri çok güzel anlamama rağmen kendim birşeyler yapmak istediğimde takıldığımı farkettim. Sorunun bende olduğunu düşünürken yapmak istediklerim çok temel bilgilerle yapılabilmesi gerektiğini arkasından da aslında bu bilgilerin kitapta olmadığını farkettim. Kitap sadece sürükle bırak işlemleri ve IDEnin sunduğu imkanlarla en kolay şekilde nasıl bazı uygulamaların geliştirildiğinden bahsetmek öte gitmiyordu.Kullanılan dil ile ilgili çok yüzeysel bilgilerle geçiştirilmiş – ki şimdi o kitap elimde olsa o bilgilerin doğru olup olmadığına bakardım , bir ton yanlışlık içerdiğine eminim - işin mantığından uzak sadece birbiri ile bağlantısız problemleri çözen bilgiler içeren, kısaca "buton altı programcılar" yetiştiren bir kitapdan ibaret olduğunu belirli bir aşama kat ettikden sonra anlamam zor olmadı. Bu arada konu ile ilgili başka kitapları da incelediğimde benzer durumların olduğunu görmem beni üzdü açıkcası. 2 – 3 sene sonra ise bu "sevgili" yazarlarımızın aslında her konuya oldukça hakim olduklarını ve kitap yazabilecek seviyede de bilgili olduklarını gördüm.Oldukça ironik bir durum açıkcası!. Ama bu ironi, zaman içerisinde meslek arkadaşlarım ile konuşmalarımda ya da kullanıcı grubu sitelerindeki forumlarda yazılanları ve sorulan soruları gördükçe bende trajediye dönüştü. Artık yazılım dünyasında öyle bir kitle oluşmuştu ki – o zamanlarda kaynak sıkıntısının olması ve ne yazıkki bilgiye erişimin alternatiflerinin yeterli olmamasındanbahsettiğim kitapları okuyarak programcılık yapıyorlardı. Eminim o yıllarda programlamay başlayan ve bu yazıyı okuyan meslektaşlarım hangi yazarlardan ve kitaplardan bahsettiğimi çok iyi biliyorlardır. Ve inanır mısınız ben hala bundan 2 sene öncesine kadar bir umut kitapçılara "iyi bir kitap bulayım da gerek öğrenci arkadaşlarıma tavsiye edeyim gerekse de kendim için başka bir meslektaşımın konulara bakış açısından faydalanayım" mantığı ile ara ara uğrardım. Ama malesef artık onu da yapmıyorum. Tabi ki zaman içerisinde kaliteli ve özgün kitaplar da çıktı ve hala bu kitapların 8., 9., 10. baskılarını görmekteyiz, teşekkürlerimi sunarım bu yazarlarımıza. Ve işin en üzücü yanı da bu gidişatın son 2 yıl içinde yine başa dönmesi.
.
Yani aktörlerin değişmesine rağmen senaryoların aynı kalması. Sonuç ; yine bilgiden yoksun, mantıkdan yoksun, kurulum ve ekran görüntüleri resimleri ile yarısı dolmuş , tamamen saçma ve anlamsız basit örneklerle dolu ,fiyatı gramajından ağır ve kendisini her konuda bilgili sanan yazdığı içerikler iyi okunduğunda aslında konudan bihaber yazarların yazdığı kitaplar yine vitrinleri süslemekte.İşin kötüsü de yine programlamaya yeni başlayan arkadaşlarımızın elinde bu kitaplar dolanmakta. Bu konu ile ilgili çevremde " ya bu kitapları onaylayan birileri olsun, belirli bir kontrolden geçsin öyle yayınlansın" gibi yöntemler duyuyorum. Peki bu kitapları basanların işine gelmeyecektir. Hatta iyi ya da kötü bir şekilde kitap basımı için "sevgili yazarlarımız" teşvik bile ediliyor malesef.

Bahsi geçen yıllar ile günümüz arasında oldukça farklar oluştu zaman içerisinde. Örneğin o zamanlarda kitap yazmak kitabı olmak oldukça etkili bir işken şimdi isteyen istediği gibi kitap yazabiliyor.İşin ilginç yanı kısa metrajlı filmler de yani makaleler de günümüzde kitaplar kadar rağbet görebiliyor. Bilgiye erişim aracı olarak belki de artık günümüzde kitaplardan çok makaleler kullanılıyor gibi. Kitaplardan daha kolay bir şekilde ve ücertsiz olarak makalelere erişilebilmesi bence korkutucu bir durum oluşturuyor.Bu kitaplarda ya da makalelerde anlaşılır eğitici örneklerin ve yazıyı yazanın edindiği deneyimlerin okuyucuya aktarılmasını geçtim doğru bilgi bulmak artık mesleğe ve konulara o kadar uzak ki "sevgili yazarımız" , yazı yazmak için esinlendiği kaynakları okurken tam anlayamadığından olsa gerek – bile oldukça zor artık. Yani bilgiye erişimin kolaylaşması aslında doğru bilginin değil de kirli ve ne amaçla yazıldığı "belli olmayan" – aslında bilen bilir ne amaçla yazıldığı da - yazıların ya da kitapların "Türkçe içerik az! çok olsun!","Bilgi paylaştıkça çoğalır!" naraları ile bilgi çöplüğüne dönüştürüldüğü ve bu çöplükte programlamaya yeni başlayan arkadaşları düşündükçe kendimi önceden içinde bulunduğum ortamı göz önüne alarak daha şanslı hissediyorum. En azından etkileneceğim ya da yanlış şeyleri öğreneceğim kaynak kısıtlı iken şimdiki durum... Üzücü.Yazımın başında da bahsettiğim gibi şu sıralar bu konular üzerine sohbetlerin sıklığının artmasının bir açıklayıcı nedeni olduğunu umarım anlatabiliyorumdur. Lütfen bu yazıdan sonra ya da şimdi http://ileriseviye.org/arasayfa.php?inode=programmingtenyears.html linkindeki yazıyı okuyunuz. Oldukça güzel ve insanın kafasında soru işaretleri oluşturacak bir yazı.

Günümüzde kişisel gelişim için ya da mesleki bilginin artması için yapılması gereken bir eğitim kurumdan eğitim almak ya da seminerlere katılmak da bir başka artarak tercih edilen yoldur. Eğitimdeki amaç bilgili ve en önemlisi deneyimli birisinden programalama sanatını öğrenmektir. Eğitimdeki geçirilen 100 dk içerisindeki edinimlerin 1000dk makale okumakla edinilemeyeceğini düşünüyorum. Çünkü eğitim kurumundaki "eğitmen" size deneyimlerini aktaracaktır. Sizin öğrenmek istediklerinizi o çok uzun zaman önce öğrenmiş bunları kullanmış neyin nasıl olacağını çok iyi biliyordur. Örneğin neden buton altına veritabanına bağlantı sağlayan kodların yazılmayacağını bunun ayrı bir katman olarak tasarlanması gerektiği vs vs.... Çünkü eğitmen buton altına yazıldığında ilerde neler olabileceğini proje büyüdükçe ne gibi sıkıntılar oluşturabileceği konusunda deneyim edinmiştir, lütfen dikkat edin deneyim edinmiştir, yaşamıştır, görmüştür, sonuçları ile karşılaşmıştır.Bunlar çok ama çok önemli edinimlerdir. Ve o eğitime gelenlerin sorularına da daha önceden edindiği deneyimlerden yola çıkıp "yorumlayarak" cevap verebilecektir. Oysaki piyasadaki eğitim kurumlarını ve eğitmenleri incelediğinizde durumun ne kadar vehamet vereceğini göreceksiniz. Eğitim artık ticari bir meta olmuş olduğunu, eğitim içeriklerinin sadece belirli sınavları geçmeye yönelik olduğunu, eğitim kurumlarının gelen talepleri değerlendirmek için eğitmen eksikliğine rağmen eğitimi açmak için bir önceki sınıflarda öğrenci olanların eğitmen olarak sınıflara sokulduğunu, yazılım ve proje deneyimi olmayanların eğitmen yapıldığını, hayatında hiçbir şekilde eğitim verdiği konu ile ilgili proje deyimi yaşamamış - E be adam sen de! Yeni işte hemen projede kullanıp deneyim mi edinmek lazım diye sorarsanız şunu derim : daha önce deneyim sahibi ise bu yenliklerin amacını algılayıp kısa sürede konuya hakim olabilir. Oysaki her yenilik sanki çok büyük bir olaymış, sanki ilk defa keşfedilmiş gibi anlatılıp yine kitleler yanlış yönlendirilmektedir.- olması dikkate alınmadan eğitim ceya seminer verebildiğini göreceksiniz. Malesef üzülerek belirtmek isterim ki Türkiye’deki eğitim sektöründeki eğitmenler tam tersi bir durum içerisindedirler. Hiçbir deneyime sahip değilken "eğitim vereyim deneyim sahibi olurum sonra da yazılım yapmaya başlarım" mantığı içerisindedirler ya da yönlendirilmektedirler. Peki bu durumda sizden eğitim almak için gelen katılımcıların emekleri, paraları ve daha da önemlisi zamanları ne olacak ? Bazı ortamlarda ayak üstü sohbetlerde anlaıyoruz ki bu şekilde eğitim kazasına uğramış kitle hiç de küçümsenemeyecek kadar büyüktür. Peki siz görmüyüyor musunuz çevrenizde birçok sertifika sahibi ama proje yapmaya başlayınca eli ayağına karışan kişileri ? Bu kişiler nerden çıkıyor, nasıl bu hale geliyor ? Umarım açıklayabilmişimdir. Herzaman – kendi öğrencilerim de dahil olmak üzere şunu söylerim; eğitim kurumu, yeri , şartları, olanakları vs vs önemli değildir, yeter ki eğitmen deneyimli ve bilgili olsun. Emin olabilirsiniz ki o eğitim size düşünemeyeceğiniz kadar faydalı olacaktır.

Gelelim seminere!Seminer, ne kadar kolay değil mi? Birisi çıkar bir konu hakkında 1 bilemedin 2 saat konuşur, yeniliklerden bahseder. Tabi konular yenilik olduğu için biz de öyle ağzımız açık dinleriz. Çünkü yeniliktir, sorulacak çokşey yoktur. Basit bir iş, ürün tanıtımı. Ha ben bu olmasın demiyorum kesinlikle. Bu da olması gereken bir iş, vizyon kazanmak için güzel bir imkan. Amma velakin, nereye kadar be kardeşim! Sen o yenilikleri gördün ettin kullanmaya karar verdin, peki ya sonrası ? Aldın projede kullanacaksın, sağdan soldan bilgilere eriştin, peki o bilgilere biraz dikkat ettiğimizde ne kadar yüzeysel olduğunu görüyor muyuz ? Onu al sürükle bu var bunu da şuna koy, ordan hazırı var al onu...Yok artık! Bir süre sonra bunları "bir bilene" sorma ihtıyacı çekip bilenlerin kullanıcı grupları ile buluştuğu etkinliklere baktığınızda yeniliklerden başka birşey görebiliyor musunuz ? Oysaki seminerlerden biraz da olsun beklenen kullanılan teknoljilerin ve ürünleri gerçek hayat uygulamarında kullanılırken yaşanan sorunlar ve bu sorunların aşımı üzerindeki edinilen deneyimlerin paylaşılmasıdır. Ama malesef bu düzeyde seminerler gerçekleştirebilecek kişi sayısı ne kadar az değil mi ? Çok uzatmadan bu konudaki beni üzen kısım bu yenilik anlatan deneyimsiz, bir gecede slayt hazırlayıp insanların karşısına çıktıkdan sonra "sektörün önde gidenleri", "her şeyi yalamış yumuş adam","adama bak her şeyi biliyor" .... şeklindeki etiketlerle insanları yanlış yönlendirmelerinden kaynaklanan sorunlardır. Inanın arkadaşlar siz onlardan daha çok şey biliyorsunuz! Çünkü siz onları kullanıyor, onlarla ürünler çıkarıyor neyin ne olduğunu çok daha iyi biliyorsunuz!

Sonuç olarak kötü bir nesil yetişmekte, bu nesli eğitecek kurum ve kuruluşlar da dibe vurmuş durumda malesef. Benim yaşadığım olayları bu işlere yeni başlayanlar yada henüz başında olanlar yaşamasın istiyorum! İş görüşmelerinde elinde setifikalarla gelip birkaç soru sonrası temel özelliklere bile sahip olamayan ve yüzü kızarark iş görüşmelerinden ayrılan arkadaşlarımız olmasın istiyorum. Kral çıplak mı bilemiyorum ama şapkamızı lütfen önümüze koyalım ve yanlış yetişen bir yazılımcı kitlemiz olmasın, olmaması için elimizden geleni yaplım, seçici olalım, birşeylerin farkına varalım!.


 
Categories: Inceleme | Internet | Yasam

Şurda duyurusunu yaptığımız etkinlik gerçekleşti. Kendi adıma oldukça zevkli ve eğlenceli geçen (umarım katlımcılar da aynı fikirdedir ;) ) güzel sorunların geldiği ASP.NET Application Life Cycle ve Page Life Cycle konulu seminerimin slayt ve örneklerini
sunum.rar (125.63 KB) linkinden indirebilirsiniz.

Birbaşka etkinlikte görüşmek üzere.

   


   
 
Categories: .NET | Asp.net | Yasam

January 21, 2009
@ 10:00 AM

 


Havuza dalmak için atlamadan önce derin bir nefes alınır ve uzun bir dalmadan sonra kafa suyun üstüne çıkarıldığında alınan o derin nefesin kıymetini dalanlardan iyi bilen olamaz. Ve ilk suyun yüzüne çıkıp arkaya bakıldığında alınan mesafenin çokluğu oldukça sevindiricidir.

Sevgili dnabahar sınıfı; umarım aldığınız mesafe sizleri beklediğiniz noktalara erişmenizi sağlamıştır. Bu dalma zamanında edinilen deneyimlerin sonraki dalmalarınızda size kolaylıklar sağlamasını dilerim.

Not : Bana henüz " hocam son ders 100 tane şey göndereceğinizi söylediniz ama hala elimizde bişi yok! " konulu mail gelmediği için tembellik yaptığımı burdan halka arz ederim:)

 

 

 


 
Categories: .NET | Yasam

January 21, 2009
@ 02:26 AM

Zaman içerisinde oldukça fazla gelişim gösteren .NET Framework irili ufaklı birçok problem için hazır altyapılar sağlayarak gerek zaman kazandırması gerekse de test edilmiş kodların kullanılması sonucunda hata oranının azalması sonucunda kolay bir şekilde uygulama geliştirilmesini sağlamaktadır. Şu günlerde bile hızla genişleyen bu altyapı habersiz birçok yeni özellikler kazanmakta biz geliştiriciler de elimizden geldiği kadarı ile bunları takip ederek belki yazdığımız kodları güncelleriz ( çalışıyorsa dokunmamak mı lazım yoksa :)) ) ya da bundan sonraki yazılan kodlarda bu yenilikleri kullanmaya özen gösteririrz. Ama sanki ipin ucu kaçıyor gibi. .NET 3.5 ile gelen yenilikleri incelemek için biraz zaman ayırdığımda ilk karşıma çıkan yeniliklerden birisi de (System.Collections.Generic isim alanı içerisinde) HashSet<T> isimli generic bir kolleksiyonun List<T>'e alternatif olarak framework'ün içerisinde yer alması idi.


Tabi isminde geçen Hash kelimesinden de anlayabileceğimiz gibi bu kolleksiyon içinde tutulan verilere erişme yöntemi oldukça hızlı. Ama msdn den bu sınıfın detay bilgileri incelendiğinde List<T>'e göre oldukça değişik bir kullanımı olduğunu görüyoruz. Ilk göze çarpan önemli bir özellik HashSet<T>'in aynı veriyi ikinci defa kolleksiyon içerisine koymaması. Örneğin ;

HashSet<int> h = new HashSet<int>();
h.Add(7);
h.Add(11);
h.Add(7);

Console.WriteLine(h.Count); // nesenin içerdiği eleman sayısı ekrana yazılmak istendiğinde 2 değeri yazacaktır.

şeklinde bir kod ile veriler eklenmeye çalışıldığında 7 değeri ikinci kez eklenmek istendiğinde aslında bu işlem yapılmayacaktır. Add metodunun geri dönüş değerine dikkat edersek bool türünden bir değer döndüğünü bundan da eklenmek işleminin başarılı olup olmadığını rahatlıkla anlayabiliyoruz. Eğer eklemek istediğimiz verilerin birbirinden farklı olduğuna eminsek bu kolleksiyonu kullanabiliriz. Peki bu kolleksiyonun bize faydası ne olacak ? Tabi ki verilere erişme hızımızda oldukça çok hız kazandıracaktır. Silme (Remove) ve Arama (Contains) işlemlerinde List<T>
O(n) karmaşıklığı gösterirken HashSet<T> O(1) karmaşıklığı göstereceğinden hız oldukça artacaktır.

 


 
Categories:

January 21, 2009
@ 01:23 AM

.NET ya da başka diğer geliştirme ortamlarında kullandığımız diller gerek ihtiyaçlardan gerek diğer dillerdeki gelişmelerden etkilenerek zaman içerisinde ya radikal değişikliklere ya da geliştiricinin daha kolay bir şekilde kod yazabilmesi için eklentilerle gelişme sürecini yaşarlar. 70 lerde geliştirilen C bile zaman içerisinde gelişim gösterebilmekte ve yanılmıyorsam en son 99 standartları ile de eklentiler yapılmıştır. C# kullanarak uygulama geliştiren programcılar 8 9 yıllık süreçte c# dilinin 1.0 ,1.1, 2.0 ve 3.0 sürümlerini kullanmışlardır. Bu yazıyı okuyanlardan birisi hala 1.1 veya 1.0 ile uygulama geliştiriyorsa nedenlerini bizimle paylaşırlarsa sevinirim. Acaba neden hala 2.0 ve üstü bir sürümü ile kodlama yapmıyorlar.

Gerek eğitim ve seminerlerde gerek dost sohbetlerinde bu yeniliklerin programcı tarafından kolay bir şekilde kabullenilemediğini görmekteyim .Oysaki bu yeniliklerin bir çoğu programıcının kolay bir şekilde kodlama yapabilmesi (mesela generics) ya da dilin imkanları ile kodlama yapıldığında yaşanan sorunların (örneğin nullable tipler ) aşılması için dile kazandırılmıştır. Oysa ilk gelen cevap " ben bu yenilik olmadan da ben zaten yapabiliyordum, ne gerek var ki bu yenilikleri öğrenmek için harcadığım performansa ya da zamana" şeklindedir. Tamamen karşı olduğumu belirterek bir örnek üzerinden açıklamaya çalışacağım.

Azçok haberimiz vardır c# 3.0 ile birlikte gelen Lambda ifadelerinden. Çok zor anlaşılan ve kullanılmak istenmeyen kullanma ihtiyacını bile düşünmek istemeyen (mesela bir düşünün) birçok meslektalım  olduğuna eminim ;) Oysaki uyuglama geliştirirken yerinde kullanıldığında mükemmel derecede temiz ve anlamlı kodlama yapılabiliyor.
Şimdi c# dili ile farklı yollardan çok basit bir şekilde generic List<T> nesnesinin belirtilen şekilde taşıdığı değerleri filitrelemeye çalışalım.(sıfırdan büyük olan sayıları bulsun)

Ilk akla gelen foreach ile listeyi dönerek filitrelemek olacaktır.

private static List<int> Filitrele(List<int> liste)
{
   
List<int> _temp = new List<int>();
   
foreach (int sayi in liste)
    {
        
if (sayi > 0)
             _temp.Add(sayi);
    }
   
return _temp;
}

Oysaki çok daha kısa ve anlaşılır olan .net framework'ün de nimetlerinden faydalanarak aynı işi yapabileceğimiz yöntem aşağıdaki gibi olabilir.
Bu örnekte C# 2.0'ın getirdiği anonymous metodlardan da faydalanılmıştır.

private static List<int> Filitrele(List<int> liste)
{
  
return liste.FindAll(delegate(int sayi)
   {
      
return sayi > 0;
   }
   );
}


Peki bundan daha temiz ve anlaşılır bir kod yazabilir miyiz ? Eğer lambda ifadeleri ile uğraşmış isek sorunun cevabı oldukça basittir " Tabi ki evet!"
private static List<int> Filitrele(List<int> liste)
{
   
return liste.FindAll(sayi => sayi > 0);
}

Bu örnekle anlatmak istediğim aslında kullanılan dilin yeniliklerini kullanmadan da sorunlara çözüm bulunabilineceği gibi gelen yenilikleri öğrenerek aslında daha az zaman alıcı ve temiz kodlar yazabileceğimizi, bu nedenle öncelikle gelen bu yeniliklerin ne işe yaradığını ne amaçla dile eklendiğini ve bu özellik olmadan yaşanan zorluklar ya da sorunların neler olduğunu iyice kavramak gerektiğini düşünüyorum. Yoksa kullanması zaten kolay! ;)

C# 4.0 'ın resmi olarak yayınlanmasından sonra bu konu hakkında tekrar konuşalım.


 
Categories: .NET | C# | Inceleme

Görüşmek üzere ;)


Uzun bir aradan sonra tekrar İstanbul'da güzel bir etkinlik ile karşınızdayız. Ankara ve İzmir derken biraz İstanbul'u boşladığımızı kabul ediyorum. Ama önümüzdeki dönemde bolca telafilerimiz olacak. Gelelim konumuza; INETA Professional Hit!

İki günlük bir etkinlik dizisi ile bu sefer Microsoft binasında buluşuyoruz. Fakat farklı bir şeyler var! Türkiye'de ilk defa tamamen Level 300 ve üstü oturumlardan oluşan halka açık bir aktivite yapıyoruz. Gelin bu konuyu biraz açıklığa kavuşturalım ve şu Level konusuna göz atalım.

  • Level 100: Bahsi geçen konuya giriş ve genel anlatım içerir. Katılımcıların oturumun konusu ile ilgili herhangi bir bilgi birikimine sahip olmadıkları ön görülür.
  • Level 200: Level 100 bilgisine sahip olunduğunu ve buna ek olarak anlatılacak konu ile ilgili genel bir bilgi birikiminin katılımcılarda olduğu var sayılır. Genelde bu oturumlarda anlatılan teknolojilerin detayları ve kullanım alanları ile ilgili gerçek hayat senaryoları işlenir.
  • Level 300: Anlatılacak konu ile ilgili Level 200 bilgisine sahip olunduğu düşünülür. Bu oturumlarda bahsi geçen teknolojilerin uç noktada kullanımına dair örnekler derinlemesine işlenir.
  • Level 400: Bu oturumlar uzmanından uzmanına oturumlardır. Anlatılan teknoloji ile ilgili en gelişmiş ve üst seviyeli bilginin aktarıldığı bu oturumlar ürünlerin üst sınırlarını zorlayan oturumlardır.

Gördüğünüz gibi normal şartlarda bizim INETA tarafındaki etkinliklerimiz ağırlıklı olarak Level 100 ile Level 200 arasında dolaşıyor. Genel olarak baktığımızda bu seviyenin üzerinde etkinliklerin eksikliğini sizler de değerlendirme formlarında defalarca dile getirdiniz. INETA Professional Hit tamamen uzmanlara hitap eden Level 300 ve Level 400 oturumlar içeriyor. Bu kapsamda giriş seviyesi bir beklenti ile etkinliğe gelmemekte fayda var. Giriş seviyesi için yakın zamanda bir etkinliğimiz daha olacak.

Program içeriğimiz ve oturumların seviyeleri şu şekilde;

24 Ocak

10.00-12.30 Silverlight ile Veri Uygulamaları - Daron Yöndem - Level 300
13.00-16.00 ADO.NET Data Services -
Burak Selim Şenyurt - Level 300
16.30-18.00 SharePoint üzerinde özel kolon geliştirmek -
Nezih Tınas - Level 400

25 Ocak

10.00-12.30 Derinlerde C# 3.0 - Burak Selim Şenyurt - Level 300
13.00-15.00 ASP.NET AJAX 4.0 -
Daron Yöndem - Level 300
15.30-18.00 Asp.Net Application ve Page LifeCycle -
Oğuz Yağmur - Level 300

Etkinlik Microsoft İstanbul ofisinde olacak. Adres şu şekilde; Bellevue Residence, Levent Mahallesi Aydin Sokak, No: 7 Levent

Etkinliğe katılabilmeniz için aşağıdaki adresten kayıt olmanız gerekiyor.

http://daron.yondem.com/kayit/

Çok yakında giriş seviyesi etkinliklerde de görüşmek üzere.


 
Categories: .NET | Yasam

Uzun süre .net ortamında uygulama geliştirenler gerek assembly yapısı gerek metadata yapısı gerekse de IL ile azçok ilgilenecekleri olaylarla karşılaşmışlardır. Bundan önceki bazı blog girdilerinde bu amaca yönelik çeşitli çözüm yolları ve araçlardan (Reflector, Fox , CFF Explorer gibi) bahsetmiştik. Yine benzer bir araç ile var olan exe ya da dll leri (biz kısaca kaynak kodu bizde olmayan assembly ler diyelim) açıp kendi kaynak kodlarımızı ekledikten sonra (bir nevi patched işlemi diyebiliriz) değişiklikleri assembly üzerine kaydedip kullanmaya devam edebiliriz.

Eminim herkesin anlayacağı bir örnek ile ne anlatmaya çalıştığımı kısaca özetleyeyim. Bir arkadaşımız bir uygulama yazmış, size göndermiş kullanmanız için. Ama ne hikmetse uygulama başlamadan önce şifre , serial, activation key vs ... istiyor.Siz de birazdan bahsedeceğim yol ile bu assemblyyi açıp şifre soran kod kısmını istediğiniz gibi değiştirip kaydettiğinizde artık aynı uygulamayı şifresini bilmeden de kullanabilirsiniz ;)

Örnek uygulamamızın ekran görüntüsü aşağıdaki gibidir. Program, textbox'a istenilen değeri girdikden sonra buton'a basıldığında eğer girilen değer doğru ise sihirli sayıyı göstermekte, yanlış ise hata mesajı vermektedir. Biz de şu işe bakın ki textbox'a ne yazacağımızı bilmiyoruz ;)

Koddan da görebileceğimiz gibi basit bir string karşılaştırma işlemi yapılmaktadır. O zaman bu kısmı değiştirdiğimizde sorunumuz hallolacaktır. Ha bu arada kodlar bizde değildi nasıl gördük ki kodları diyorsanız Fox Decompiler ve Reflector uygulamaları hakkında bilgi edinmeniz gerekecektir.

Şimdi kolları sıvadıktan sonra reflector uygulamamıza assembly'yi resmen bir text dosyasıymış gibi editleten bir plug-in kuracağız ve bu da Reflexil sayesinde gereçekleştirebiliriz. Reflexil'i şurdaki adresten indirdikten sonra zipli dosya içerisindeki reflexil.dll'i Reflector uygulamasına  plug'in olarak kurabiliyoruz.

Plug-ini ekledikten sonra Reflector ile uygulamamızı açıp, CheckKey() metodunu disassemble ediyoruz. Reflector'un Tools menüsünden az önce exlediğimiz Reflex'il plug-in nin çıktığı göreceğiz.Buna tıkladığımızda ise hemen alt kısımda ilgili kodun IL'ini görebiliriz.Bu kısıma sağ tıkladığınızda gelen menüden editleme, silme ve kod ekeleme işlemlerinin yapıladığı menülerden yapacağımız işleme göre hareket edebiliriz.

Aslında burda editleme işlemi için iyi bir IL bilgisi gerektiğini görmekteyiz. Ama context menüdeki "Replace all with code" menüsü tüm bu sorunları ortadan kaldırıyor. Reflector'ün ürettiği kodun sadece metodun içindeki kodu kopyaladıkdan sonra Replace all with code menüsünü tıklayalım.Aşağıdaki gibi kopyaladığımız kodu metodun içine kopyaladıkdan sonra istediğimiz değişiklik ve eklemeleri yapalım.Sol alt kısımdakı "Preview IL" butonuna tıkladıkdan sonra Sağ alt kısımdakı Ok butonu aktifleşecektir. Ok dedikten sonra Reflexil yeni kodlarimizi artık injecte etmiştir.

Görüldüğü gibi uygulamaya yeni bir satır eklendi ve metod da eğer "huh!" girilirse false "huh!" dışında bir değer girildiğinde ise true değeri üretecektir :) umarim şifreyi doğru tahmin edecek kadar şanslı değilsinizdir :)

Soldaki ağaçtan assembly mizi seçtiğimizde Reflexil bize uygulamayı kaydetme imkanını verecektir.

Düzenlediğimiz exe'yi kaydedip çalıştırdiğimizda ise aşağıdaki gibi bir sonuç alabiliriz.

 

      

Umarım faydalı amaçlara hitap edecek çalışmalar için sizlere kolaylık sağlayacaktır bu yazı ;)

 Örnek uygulama :

blog_codeinjection.rar (33.98 KB)
 
Categories: .NET | C# | Inceleme

December 31, 2008
@ 10:06 AM

SharePoint konusunda Turkiye MVP'lerinden Evren Ayan ve Oktay Sert'in çalışmaları sonucunda hayata geçen SharepointTurkıye.org 'a başarılar diliyorum.

 

2001 yılından bu yana çeşitli versiyonlar ile kurumların intranet, içerik yönetimi, arama hizmetleri, form yönetimi gibi konulardaki ihtiyaçlarına çözüm bulmak amacıyla Microsoft tarafından sürekli yenilenen Sharepoint uygulaması 2006 yılının sonu itibariyle lanse edilen Windows Sharepoint Services 3.0 ve Microsoft Office Sharepoint Server 2007 ile beraber çok daha kullanışlı ve pek çok kurum tarafından tercih edilir bir yapıya kavuştu.

 

Yine aynı tarihler Sharepoint konusunda paylaşımların da arttığı, bu konuda organizasyonların kurulduğu, etkinliklerin düzenlendiği bir yapının oluşturulmaya başlamasına, bu konuda uzmanlaşmış insanların bLogger, vLogger gibi etiketlerle paylaşım piyasalarındaki yerlerinde bu ürüne de yer vermeye başlamalarına karşılık geldi.

 

Bu konuda gerçekleşen en büyük girişimlerden biri olan ISPA(International Sharepoint Professionals Association) aracılığı ile tüm dünyada kullanıcı grupları ve portaller oluşturuldu.

 

ISPA üyesi ve Türkiye'nin ilk Sharepoint Kullanıcı grubu olan SharepointTurkiye.Org'da tüm dünyada olduğu gibi ülkemiz kurumsal IT yapılanmasında da önemli yer teşkil etmeye başlayan Windows Sharepoint Services 3.0 (WSS v3) ve Microsoft Office Sharepoint Server 2007 (MOSS 2007) konusunda bilginin paylaşımı, pek çok verinin tek bir adresten ve mümkün oldukça Türkçe bir şekilde sunulabilmesi amacıyla oluşturuldu.

 

Bugün itibariyle resmen açık olan ve ziyaretçi kabul etmeye başlayan bu platform aracılığı ile Sharepoint hakkında merak ettiğiniz pek çok konuya açıklık getirmek, pek çok bilgiye tek adresten erişiminizi sağlamak, Türkiye ve dünyadaki Sharepoint etkinlikleri hakkında bilgi sahibi olmak ve ürünün gelişimini beraber takip etmek, haberdar etmek, farkındalık yaratmak hedeflenmiştir.

 

Genel anlamda Sharepoint platformu hakkında sürekli elinizin altında olması gereken bilgilere ulaşabileceğiniz bu platform, blog yapısıyla dinamik içeriklerden ve yeniliklerden de haberdar olmanızı sağlayacak bir yapıya kavuşmayı hedeflemektedir.

 

Hayırlı olması, bilgilerin işinize yaraması dileklerimizle...


 
Categories: Inceleme | Yasam

December 1, 2008
@ 01:49 AM
Şu sıralar C# 3.0 ve LINQ ile ilgili  birçok dökümanda pek rastlamadığım bir anahtar kelimeyi (keyword) paylaşmak istedim.
Eğer LINQ ifadeleriniz içinde bir değişkene ihtiyacınız olursa - kimsenin ihtiyacı olmuyor da ondan mı kullanmıyor nedir ? ;) -
let ile tanımlayabiliriz  - bu let bir yerlerden tanıdık geliyor mu ne :)) -

Misal ;

string[] bolumler = { "matematik", "fizik", "kimya" };
Random r = new Random();

var sonuc = from c in new[]{ new {Ad="ali",Yas=21},
                                        new {Ad="murat",Yas=22},
                                        new {Ad="ismail",Yas=25}}

let bolum = bolumler[r.Next(0,bolumler.Length)]
select new
{
    Person = c,
    Bolum = bolum
};

foreach (var s in sonuc)
    listBox1.Items.Add(s.Person.Ad + " " + s.Bolum);




 
Categories: C# | Code

Diyelim ki bir uygulama geliştirdiniz. Belirli uzantıdaki dosyalar üzerinde işlem yapıyor. Ve kullanıcı bu uzantıdaki dosyaya tıkladığında uygulamanızın otomatik olarak açılmasını sağlamak istiyorsanız aşağıdaki kod işinize yarayacaktır.

RegistryKey key = Registry.ClassesRoot.CreateSubKey(".dna");
key.SetValue(null, "DnaFile.dna");
RegistryKey subkey = Registry.ClassesRoot.CreateSubKey("DnaFile.dna");
subkey.CreateSubKey("DefaultIcon").SetValue(null, @"%SystemRoot%\system32\msxml3.dll,0");
RegistryKey hedekey = subkey.CreateSubKey(@"shell\open\command");
hedekey.SetValue(null, "\"C:\\dna210506\\dnaPad\\dnaPad\\bin\\Debug\\dnaPad.exe\" \"%1\"");

subkey.CreateSubKey("DefaultIcon").SetValue(null, @"%SystemRoot%\system32\msxml3.dll,0");

kod ile *.dna uzantılı dosyanın kendisine özel bir icona sahip olmasını sağlıyor.

Yukardaki kod ile *.dna uzantılı dosyaya tıklandığında C:\...\dnaPad.exe yolundaki dnaPad.exe windows tarafından otomatik olarak çalıştırılır. Peki dosyayı uygulamaya parametre olarak windows geçiriyor da biz nasıl alacağız ?
Çözüm : string[] args = Environment.GetCommandLineArgs();
args[1] size ilgili dosyayı verecektir.


 
Categories: Code

C# 3.0'ın getirdiği güzel özelliklerden birisi olan İsimsiz Tipler'in bazı kısıtlamaları bulunmakta. Özellikle de metodlara parametre olarak geçirilme konusunda sıkıntı yaratıyor. Örneğin

static void Main(string[] args)
{
    var
v = new
    {
       
Ad = "oğuz",
        No = 44,
        Miktar = 122.2
    };
    BirDost(v);
}

şeklindeki bir tipi metoda parametre olarak geçirmek isteyelim.Amacımız bu tipin özelliklerindeki - property - değerleri almak ve işlem yapmak olsun.

public static void BirDost(var belirsizTip)
{
...
}

hmmm..işler düşündüğümüz gibi gitmeyecek ve derleyici şöyle bir  hata verecek.

Error 1 The contextual keyword 'var' may only appear within a local variable declaration

Tamam o zaman herşey object'tir mantığından yola çıkarak metodumuzu aşağıdaki gibi değiştirelim.

public static void BirDost(object belirsizTip)
{
 // belirsizTip. (???)
}

Tamam oldu gibi..Ama belirsizTip nesnesi üzerinden Ad,No,Miktar gibi özelliklere nasıl erişebilir ki? Seni seviyorum .NET diyerek biraz reflection uyguluyoruz ve sonuç.

public static void BirDost(object belirsizTip)
{
   
Type t = belirsizTip.GetType();
    PropertyInfo[] ps = t.GetProperties();

   
foreach (PropertyInfo p in ps)
    {
       
Console.WriteLine(p.Name + " => " + p.GetValue(belirsizTip,null));
    }
}

Artık isimsiz tiplerimizi gönül rahatlığı ile - çok mu duygusal oldu nedir? - metodlara parametre olarak aktarbiliriz ;)


 
Categories: C# | Code

November 26, 2008
@ 05:22 PM

 
Categories:

Debug işlemleri yaparken yeri geldiğinde bir o kadar yararlı ve zaman kazandırıcı özellikleri  çoğunlukla gözden kaçırıyoruz. Oysa yapmamız gereken breakpoint üzerine sağ tıklamak ve özellikleri incelemek.

Condition : Eğer belirli bir duruma göre debug işlemini gerçekleştirmek istediğinizde bu özelliği aktif hale getirebilirsiniz. Aşağıdaki kod üzerinden örnek vermek gerekirse; Do metodunda dummyValue değişkenin değeri 22 ise debug işleminin aktif hale gelmesini istersem ;

gibi bir Condition eklemem yeterli olacaktır. Eğer dummyValue 22 den farklı bir değer ise debug işlemi sırasında breakpoint yokmuş gibi işlem görecektir. BreakPoint'e bir Condition eklediğinizde breakpoint'in ikonunun değiştiğini göreceksiniz. Bu kısımda da  otomatik isim tamamlama özelliğinin aktif olması harika birşey!

Hit Count : Debug işlemi sırasında o ana kadar kaç defa breakpoint'e gelindiğini takip edebiliriz.İsterseniz de "eğer bu breakpoint'e x kadar gelindiğinde artık debug işlemi yapılmasın" da diyebilirsiniz. (Açılan dialog penceresindeki combobox'dan diğer seçenekleri inceleyiniz.)

Filter : Belirli filitreler koyarak debug işlemlemini aktif hale getirebiliriz. Aşağıdaki resimde hangi filitreleri uygulayacağımız açıklanıyor zaten. Bunlar dışında bir filitre uygulamak istediğinizde buna izin verilmediğini göreceksiniz.Örneğimizdeki filitrede eğer bu metod "debugTest" isimli Thread tarafından çağrılmışsa debug işlemi aktif hale gelecektir.

When Hit... : Debug işemi aktif hale geldiğinde isterseniz Output Window'a durum bilgilerini yazdırabilir, isterseniz de VS.NET 2005'e ait çeşitli makrolardan birini çağırabilirsiniz. Örneğimizde breakpoint'in hangi metod içinde olduğunu ve bu metodu kimin çağırdığını yazdırıyoruz. Ardından da o satırı yorum satırı haline getiren bir makroyu çalışrırıyoruz.

 

Tanımlamarımızı yapıp debug modunda uygulamamızı çalıştırdığımızda aşağıdaki gibi bir sonuç alıyoruz.

public Form1()
{
    InitializeComponent();
    CheckForIllegalCrossThreadCalls =
false;
}
private void button1_Click(object sender, EventArgs e)
{
    DoOp();
}

public void DoOp()
{
   
Thread th = new Thread(Do);
    th.Name =
"debugTest";
    th.Start();
}

int dummyValue = 22;
public
void Do()
{
   
for (int i = 0; i < 5; i++)
    {
         Text = i.ToString(); //Breakpoint konulan satır
    }
}

 


 
Categories: .NET | C# | Inceleme

November 3, 2008
@ 10:22 PM

Debug işlemleri yaparken işimize yarayacak 3 adet Attribute'ü aşağıdaki örnek üzerinden incelersek ;

DebuggerDisplay attribute'ü ilgili sınıfdan nesne örneğini incelediğimizde debug penceresinde istediğimiz şekilde görünmesini sağlayabiliriz.

DebuggerStepThrough  attribute'ü ile de F11 ile kod debug edildiğinde bu kod satırların debug işlemi sırasında dikkate alınmayacağını belirtir. Örneğin

Ogrenci o = new Ogrenci();
o.Name = "ali";
o.No = 22;

gibi bir kod satırında o.Name="ali"; satırında iken F11 'e bastığımızda Name özelliğinin set metoduna dallanacağını biliyoruz. Fakat DebuggerStepThrough attribute'ü set için uygulandığından bu dallanma gerçekleşmeyecek o.No=22 satırından itibaren debug işlemi devam ecektir. (Laf aramızda süper bir atrribute'müş kendisi yahu ;) )

DebuggerBrowsable isminden de açıkça belli olduğu üzere bu attibute'ün uygulanmış olduğu nesnenin X özelliği debug ekranında görüntülenmeyecektir.

 

[DebuggerDisplay("Ad ={Name},No = {No}")]
public class Ogrenci
{

   private string _name; 
   public string Name
   {
      [DebuggerStepThrough]
      get { return _name; }

      [DebuggerStepThrough]
      set { _name = value; }
   }

   private int _no;
   public int No
   {
      get { return _no; }
      set { _no = value; }
   }
   private int _x;
   [DebuggerBrowsable(DebuggerBrowsableState.Never)]
   public int X
   {
      get { return _x; }
      set { _x = value; }
   }
}


 
Categories: .NET | C#

November 3, 2008
@ 12:04 AM
Birçoğuz biliyoruz ki, kimi zaman belirli bir classdan çalışma zamanında sadece tek bir nesne oluşturulmasını isteriz. Aynı sınıfa ait ikinci bir nesne oluşmasını engellemek isteriz. Bu durumda Singleton Tasarım Kalıbını (Alper Hoca'nın kulakları çınlasın)  uygularız. Fakat birçok class için bu durum geçerli ise her defasında bunu uygulamak bizim gibi üşengeç programcılar için can sıkıcı hal alır. Çözüm ise,
    
class GenericSingleton<T> where T : class, new()
{
    private static object lockObject = new object();
    private static T m_Instance;

    public static T GetInstance()
    {
        if( m_Instance != null)
            return m_Instance;
        lock ( lockObject)
        {
            if (m_Instance == null)
            {
                m_Instance = new T();
            }            
        }
        return m_Instance;
    }
}

Bu generics süper bişi! - ben bu lafı bir yerden hatırlıyorum ama -


 
Categories: C# | Code

October 28, 2008
@ 10:03 AM
MVP Global Summit 2008'de lanse edilen ve önemli özelliklerinden bahsedilen Dev10 yani vs.net 2010'un  CTP haberini sonunda gördük :)

Evet evet, şaka gibi ama değil, şunun şurasında 2010'a ne kadı ki :) değil mi ?

Aşağıdaki adresten indirebilir

http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&DisplayLang=en

şurdaki adresten de

http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx

detaylı bilgi edinebilirsiniz.


 
Categories: .NET

October 24, 2008
@ 07:00 PM

public IEnumerable<int> GetRandomNumbers(int min, int max, int count)
{
    Random r = new Random();
    for (int i = 0; i < count; i++)
    {
        yield return r.Next(min, max);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    listBox1.Items.Clear();
    foreach (int x in GetRandomNumbers(10, 50, 15))
        listBox1.Items.Add(x);
}


 
Categories: C#

September 25, 2008
@ 05:11 PM
Madem kampanya baslamis ben de destegimi veriyorum.
Oldum olasi ukala tipli Elmalardan  hoslanmadim, hele de anlamsiz reklam kampanyalarindan hic!

iyisi kotusuyle "I'm a PC and  I'm a Developer" diyorum.


Burdan da diger videolara erisebilir indirip izleyebilirsiniz. Ozellikle Jerry'nin rol aldigi reklamlar oldukca eglenceli.


 
Categories: Internet

September 22, 2008
@ 01:06 PM

C# 2.0 ile birlikte gelen isimsiz metodları  (anonymous methods) hepimiz biliyoruz. Peki ya bu isimsiz metod kendi kendini - recursive - nasıl çağıracak ? Malum adı üstünde metodun ismi yok.
Aşağıda isimsiz bir metodun - klasik faktöryel hesaplayan -  kendi kendini nasıl çağırdığına dair kodu inceleyebilirsiniz.

delegate T Func<T>( T a );

static void Main( string[] args )
{

    Func<int> f = delegate( int a )
    {

        MethodBase m = new StackTrace().GetFrame(0).GetMethod();
        return a > 1 ? a * (int)m.Invoke(null, new object[] { a - 1 }) : a;

    };
    Console.WriteLine(f(4));
}

Sevgili DnaPromat sınıfı öğrencileri ile yaptığımız diğer güzel bir yaklaşım.

Hedele d = null;
d = delegate(int x)
{
   
Console.WriteLine(x);
   
if (x == 0 || x == 1)
       
return 1;

    return x * d(x - 1);
};
Console.WriteLine(d(5));


 
Categories: Code

September 17, 2008
@ 12:00 AM
Olur da windows service yazmak istersiniz, olur da bir başka uygulamadan bu servise komut göndermek için ServiceController'ın ExecuteCommand(int command) metodunu kullanırsınız, olur da parametre olarak metoda 128 den küçük 256 dan büyük bir sayı göndermeyi isteyebilirsiniz. İşte orda duracakmışız. Neden ? Çünkü alınan hata "bu servis bu bilgisayarda yönetilemez"dir. MSDN şurada der ki; bir servise komut gönderecekseniz bu komut 128 ila 256 arasındaki değerler olmalıymış.O zaman işlerimiz tıkırında gidermiş.

(The only values for a custom command that you can define in your application or use in OnCustomCommand are those between 128 and 256. Integers below 128 correspond to system-reserved values.)
 
Categories: C#

August 26, 2008
@ 10:35 PM
Bazen aynı database içindeki tablolar ya da farklı database lerdeki tabloları ya da farklı sunuculardaki farklı databaselerdeki tabloları karşılaştırmak isteyebiliriz. Sql 2005'i kurduğunuz da C:\Program Files\Microsoft SQL Server\90\COM dizininde tablediff.exe isimli bir araç ile bu karşılaştırmaları yapabiliyoruz. Aşağıdaki resimde gördüğünüz gibi aynı sunucu üzerinde diffTest ve difftest1 isimli iki farklı database oluşturdum. Her iki database'e de kullanicilar isimli tablo ekledim. Ve her ikisine de farklı veriler girdim.

   

Şimdi geldi tablediff.exe yi kullanmaya. Bu araç ile ilgili detaylı bilgiyi şurdan edinebilirsiniz. Göreceğiniz üzere bir hayli fazla parametre alarak çok kapsamlı işler yapabilen bir araç. Ben sadece çok basit olarak iki tabloyu karşılaştıran ve farkları bana ismi "fark" olan bir tablo şeklinde vermesini istedim. Bunun için komut satırından aracı aşağıdaki gibi kullandım.

C:\Program Files\Microsoft SQL Server\90\COM>tablediff.exe -sourceserver ".\sql2005" -sourcedatabase "difftest" -sourcetable "kullanicilar" -destinationserver "
.\sql2005" -destinationdatabase "difftest1" -destinationtable "kullanicilar" -et "fark"

Bu kullanımda difftest1 database'inde fark isimli bir tablo oluşturuyor.

Birbaşka örnek olarak da, her iki tablodaki farkları giderecek bir sql sorgusu üretmek için yine komut satırından aracı aşağıdaki gibi kullanmak gerekiyor.

C:\Program Files\Microsoft SQL Server\90\COM>tablediff.exe -sourceserver ".\sql2005" -sourcedatabase "difftest" -sourcetable "kullanicilar" -destinationserver "
.\sql2005" -destinationdatabase "difftest1" -destinationtable "kullanicilar" -f "farklari_gider.sql"

Bu işlem sonucunda oluşan dosyanın içeriği aşağıdaki gibi oldu.

-- Host: .\sql2005
-- Database: [difftest1]
-- Table: [dbo].[kullanicilar]
SET IDENTITY_INSERT [dbo].[kullanicilar] ON
UPDATE [dbo].[kullanicilar] SET [ad]='osman1' WHERE [id] = 2
UPDATE [dbo].[kullanicilar] SET [ad]='murat1' WHERE [id] = 3
SET IDENTITY_INSERT [dbo].[kullanicilar] OFF

Bu T-SQL'i çalıştırdığınızda her iki database'deki tabloların içerikleri eşitlenmiş olacaktır. Aracın geniş kullanımını yukarda belirttiğim linkten detaylı inceleyebilirsiniz.



 
Categories: Inceleme

Microsoft klasiği olan bir klasik olan Service Pack haberi ile yine karşınızdayız :)

Özellikle WPF ile ilgili çalışmalar yapanların şiddetle kurmalarını tavsiye ediyorum.Şurdaki linkden bu service pack ile neleri tamir ettikleri hakkında detaylı bilgi mevcut.

Burdan Vs.NET 2008 ( 831.3 MB lik iso dosyasi da şurda) ve burdan da .NET Framework 3.5 için gerekli Service Pack leri indirebilirsiniz.

Overview kısmına gözatmanızda fayda var derim. Kurulumdan önce de readme dokümanını okuyunuz. Örneğin vista kullanıcıları için

Visual Studio 2008 SP1 installation fails when the Windows Vista sidebar is on.

To resolve this issue:

1. Right-click the Sidebar icon in the notification area, at the far right of the taskbar.
2. Click "Exit".

açıklaması ile beni benden almıştır :)))))

 


 
Categories: .NET

1.YOL Extension metodları ve lambda expression kullanarak

foreach (IGrouping<string, string> group in Directory.GetFiles(Path.GetTempPath()).GroupBy(file => Path.GetExtension(file)))
{
    listBox1.Items.Add("--- " + group.Key + " ---");
    foreach (string file in group)
    {
        listBox1.Items.Add(file);
    }
}

2.YOL LINQ Expression Kullanarak

var sonuc = from c in Directory.GetFiles(Path.GetTempPath())
                
group new
                        
{
                             DosyaAd = c
                         }
                 by Path.GetExtension(c);

foreach (var  group in sonuc)
{
    listBox1.Items.Add("--- "+group.Key+" ---");
    foreach (var s in group)
       
listBox1.Items.Add(s.DosyaAd);
}

3.YOL LINQ Expression Kullanarak (Tipler Biliniyor)

IEnumerable<IGrouping<string,string>> sonuc = from c in Directory.GetFiles(Path.GetTempPath())
                                                               
group c
                                                               
by Path.GetExtension(c);

foreach (IGrouping<string,string> group in sonuc)
{
   
listBox1.Items.Add(group.Key);
   
foreach (string file in group)
       
listBox1.Items.Add(file);
}


 
Categories: C# | Code

August 5, 2008
@ 11:22 AM
C# 3.0 dili ile birlikte gelen yeni özellikleri şimdiye kadar duymayan kalmadı denebilir. Gerek seminerler olsun gerekse Türkçe içerikli makalelerde bunlara değinildi.
Yeniliklerden birisi olan Lambda Expressionlar ile artık C# 3.0 bir "fonksiyonel programlama dilidir" diyebiliriz. İlerki zamanlarda bunlarla ilgili kod örneklerine de yer vereceğim.

Belirsiz Tiplerle (Anonymous Types) ilgili bir örnek kod olarak belirsiz tiplerden oluşan bir dizi nasıl oluştururuz buna bakalım.

	  var bilinmeyenTipdenDizi = new[] 
          {
              new {Ad="oguz",Soyad="yagmur"},
              new {Ad="sefer",Soyad="algan"},
          };

          foreach (var bilinmeyenTip in bilinmeyenTipdenDizi)
          {
              MessageBox.Show(bilinmeyenTip.Ad +" " + bilinmeyenTip.Soyad);
          }
Burda dikkat edilecek nokta dizinin bilinmeyen tipli elemanlarının aynı imzaya sahip olması. Nihayetinde bildiğimiz gibi belirsiz tiplerde IL de belirli bir tipe dönüştürülüyor ;)




 
Categories: C# | Code

Orta çaplı ya da büyük boyutlu uygulamalarda genellikle uygulama birçok kişi ya da birden fazla takım tarafından geliştirilmekte ve kayank kod kontrolü programları ile ( source safe, cvs, svn gibi ) projelerini yönetmektedirler.Asp.net uygulamalarında, web.config dosyasında  kişilerin ya da takımların kendilerine özel appSettings altında tutacak değerleri veya connectionStrings altında tutacak farklı veritabanı bağlantı bilgileri olabilir. Kimi durumlarda "check out" edilen web.config üzerinde degişiklik yapıldıkdan sonra ( ki bu bazen ekleme bazen de düzenleme olabilir ) "check in" yapılarak tekrar güncellenir. Bu kimi durumlarda birçok hataya ve aksaklığa neden olabiliyor. Bu durumda ilk akla gelen çözüm tüm uygulamada ortak kullanılacak değerler web.config dosyasına konur, test amaçlı, kişiye özel ya da takıma özel kısımlar ise harici bir dosyada tutulara web.config dosyası ile ile ilişkilendirilebilir.

Örneğin A takımının tüm projeden bağımsız kendisine özel bazı değerleri ve yine kendisine özel veritabanı bağlantısı bilgilerini harici olarak tutmak istediğini ama tüm projedeki ortak değerleri ve veritabanı bağlantı bilgilerini de kulanmak istediğini düşünelim. Bu durumda kendisine ait özel verileri web.config haricinde başka bir dosyada tutup, web.config dosyasında da bazı düzenlemelerden sonra diğer takım arkadaşlarının ya da aynı web.config'i kullanan diğer takımların başını ağrıtmayacaktır :)

Resimden de görüldüğü gibi projeme connectionstring lerimi ve appsetting lerimi yerleştirmek için iki ayrı dosya ekledim ( dosya isim ve uzantilarında zorunluluk yoktur. )

Ateam_local_connections.config dosyasının içeriği aşağıdaki gibi;

<connectionStrings>
  <add name="Atakiminaozelbaglanti" connectionString="Atakimi baglanti bilgileri..."/>
</connectionStrings>

Ateam_local_settings.config dosyasının içeriği de

<appSettings>
  <add key="Atakiminaozel" value="beniAtakimiOkur"/>
  <add key="exts" value="jpg,png"/>
</appSettings>

gibidir. web.config dosyamızı da aşağıdaki gibi düzenledikten sonra test edebiliriz.

<appSettings file="Ateam_local_settings.config">
    <add key="globalValue" value="Beni herkes bilir!"/>
</appSettings>
<connectionStrings  configSource="Ateam_local_connections.config">
</connectionStrings>

bu kısımda dikkat edilecek nokta connectionStrings kısmına eğer harici bir dosya kullanacağınızı tanımlarsanız <connectionStrings> tagları arasına başka bir connectionstring tanımlaması yapamıyor oluşunuzdur.

Test kodumuz aşağıdaki gibidir.

    protected void Page_Load(object sender, EventArgs e)
    {
        //genel appSettings okunuyor
        Response.Write(ConfigurationManager.AppSettings["globalValue"]);
        
        //A takimina ozel degerler okunuyor
        Response.Write("<br>"+ConfigurationManager.AppSettings["Atakiminaozel"]);

        //A takimina ozel connectionString okunuyor
        Response.Write("<br>"+ConfigurationManager.ConnectionStrings["Atakiminaozelbaglanti"].ConnectionString);
    }
 

Saç baş yolduran problemsiz çalışma ortamları dilerim :)


 
Categories: Asp.net | Code | Inceleme

July 30, 2008
@ 09:54 AM

BT Akademi 3. yaşına girdi. Gelişen yapısı ve büyüyen iş hacmi ile sektördeki kalitesini daha da artırarak 3. yaşına giren BT Akademi ailesini tebrik ediyorum. Nice nice senelere.

 

 

 

 

 
 
Categories: Yasam

July 30, 2008
@ 09:17 AM

Sevgili Sefer Algan ve Burak Selim Şenyurt ile kısa bir süre önce beğeni ile takip edilen  .NET Radyo'nun 3. ve 4. bölümlerini c#nedir?com da yayınlandı.

3. bölümde ORM ve LINQ konusunda merak edilen ve  sıkça hakkında soru aldığımız Object Relational Mapping kavramı ve LINQ to SQL yaklaşımı üzerinde duruldu. ORM araçlarının amaçları, kullanım alanları , avantaj ve dezavantajları üzerinde durduk.

4.bölümde ise Yeni .Net Kavramları konulu söyleşiyi gerçekleştirdik. .Net Framework 3.0, 3.5, Asp.Net 3.5, Futures, Volta, WCF, WPF, Silverlight, Astoria gibi pek çok kavram üzerinde kısaca durmaya çalıştık. Amaç Microsoft ürünleri ile uygulama geliştiren uzman ya da yeni başlayan geliştiricileri kavram kargaşısından bir nebze de olsa kurtarmayı amaçladık.

Çok kısa bir süre sonra diğer .NET Radyo'ların hazırlanmasına başlayacağımızı belirteyim.


 
Categories: .NET | Inceleme | Yasam

HttpHandler ile sunucuya gelen istekler üzerine işlemler yapabiliyoruz. Eğer belirli bir uzantı üzerinde işlem yapmak istersek ilk akla gelen HttpHandler yazıp uzantıya özel işlemlerimizi yapmaktır. Eğer aynı uzantıya göre birden fazla tanımlanmış HttpHandler'lardan birisinin çalışması istendiğinde (örneğin bir aspx sayfasına gelen isteğe göre birden fazla httphandler tanımlanmış olabilir) ise HttpHandlerFactory ile bunu kolayca halledebiliyoruz. (Factory Design Pattern 'in iyi bir örneği) Örneğin bir site yaptık http://hede/musteriler/x.aspx 'e bir istek geldiğinde ilgili HttpHandler'im, http://hede/urunler/z.aspx 'e bir istek geldiğinde ise birbaşka ilgili HttpHandler'in devreye girmesini isteyebiliriz.

Bu durumu incelemj  için aşağıdaki örneği inceleyebiliriz.

public class Customers : IHttpHandler
   {

       public bool IsReusable
       {
           get { return true; }
       }

       public void ProcessRequest(HttpContext context)
       {
           context.Response.Write("müşteriler sayfaları");
       }
   }
public class Products : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("ürünler sayfaları");
        }
    }

 

Görüldüğü gibi iki adet httphandler'imiz var. Birisi müşteriler ile iglili aspx sayfaları üzerinde diğeri de ürünlerle ilgili sayfalar üzerinde işlem yapmak amacı ile tasarlanmış httphandler'larımız. Şimdi bizim işimiz gelen isteğe göre hangi httphandler'i devreye sokacağımıza karar vermek.Bu durumda yapacağımız bir IHttpHandlerFactory arayüzünü implemente etmiş sınıf hazırlamak. Örnek aşağıdaki gibidir.

public class facto : IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            if (url.Contains("/musteriler/"))
                return new Customers();
            else if (url.Contains("/urunler/"))
                return new Products();
            else
                return new DefaultHttpHandler();
        }
        public void ReleaseHandler(IHttpHandler handler)
        {

        }
    }

Bu interface'i uygulamadığımızda iki metodu implemente etmemiz gerekecek. GetHandler metodu bir aspx (Web.config içinde gerekli ayarlamaların yapıldığını düşünerek) sayfasına istek geldiğinde ilgili HttpHandler'i oluşturup geriye bu nesneyi döndürmeye yarıyor.

Web.config dosyamızda aşağıdaki gibi HttpHandler'imizi eklemeliyiz.

<httpHandlers>
   <add path="*.aspx" type="hndLib.facto" verb="*"/>
</httpHandlers>
      
httphandlerfactory.rar (12,46 KB) (ilgili örnek ektedir)
 
Categories: Asp.net | Code | Inceleme

Kaynak kodları sizde olmayan bir dll'inizin olduğunu düşünün (.net frameworkdeki tüm dll lerin kaynak kodu yok ki zaten bizde) içinde onlarca tip ve bu tiplere ait metodlar, özellikler vs vs. Peki siz " yahu şu xxx tipinin yyy metodu private değil de public olsaydı oh ne güzel tak tak çağırır kullanırdım" diye aklınızdan geçirdiğinizde ilk yapılacak iş Reflection ile private metodu çağırmak olurdu ki, hem kullanması biraz karşık - parametrelerin uyum kontrolu, tip kontrolü, koddaki kirlilik de cabası - hem de performans sorunundan dolayı tam düşüncelerimizdeki o "sadeliği :) " gerçekleyemiyor :))  o zaman yapılacak iş dll'i açık private metodu public yapıp sonra aynı dll'i bozmadan tekrar kaydetmek... Bu işi yapan çok güzel bir aracı sizlere tanıtmak istiyorum...

Şurdaki adresten edinebileceğimiz aracı kurdukdan sonra test amaçlı bir dll projesi oluşturup public ve private üye elemanlar içeren bir tip ekleyip dll'i oluşturalım.

using System;
using System.Collections.Generic;
using System.Text;

namespace DllEditTest
{
    public class DummyObject
    {
        public string GetXml()
        {
            return "<xml>";
        }

        private void Cagiramazsinki()
        {

        }
    }

    class SecretObject
    {
        private int _price;
        public int Price
        {
            get { return _price; }
            set { _price = value; }
        }
    }
}

Örnek Dll'i test edecek bir uygulama oluşturup, kullandığımızda SecretObject isimli tipe beklediğimiz gibi erişmediğimizi görürüz.

Yine beklediğimiz gibi DummyObject sınfından bir nesne oluşturduğumuzda  Cagiramazsinki isimli private metodun görünmediğini görürüz.

 

Şimdi CFF Explorer uygulamasını başlatıp ilgili dll'i bu uygulama ile düzenlemek için ( File -> Open ) açalım. Aşağıdaki resimdeki gibi dll'in içerisindeki erişilebilen tipin metod bilgilerine erişelim.Dikkat ederseniz sadece erişilebilen public metodlarının listelendiğini göreceksiniz. Listeden Cagiramazsinki isimli private metodu seçtip sağ kısımda Flags satırının en sonunda "Click Here" yazan yere tıkladığınızda metodun özellikleri çıkacaktır. Bu kısımda "public" seçeneğini seçip dialog penceresini kapatıp, dll'imizi kaydediyoruz.

Tekrar dll'i test ettiğimz örnek uygulamamıza dll i eklediğimizde artık bu metodun da çağrılabildiğini göreceğiz.

 

Yine benzer şekilde TypeDef node'undan SecretObject'i seçip Flags kısmından sınıfımızı public olarak işaretleyip dll imizi kaydettikden sonra bu sınıfa da test projemizden erişilebildiğini görürüz.

Böylelikle bir dll in tüm özelliklerini değiştirirek kendimize özel hale getirip kullanabiliriz. Tabi ki iyi niyetle, tüm bu çabaların daha iyi uygulama geliştirme amaçlı olduğunu aklımızdan çıkarmadan değil mi ? :))))) Daha fazla bilgi için bu yararlı aracın sayfasından yararlanabilirsiniz.

Bir sonraki yazımda da yine iyi niyetli düşüncelerimizi gerçekleştirmek için neler yapabileceğimizi inceleyeceğiz.


 
Categories: .NET | Inceleme

Kod yazarken mouse kullanmayı sevmyenler için klavye kısa yolları önem kazanmaktadır( ayrıca kod yazmakda hız kazandırdığı da gayet açıktır) Hoşuma giden bir o kadar da az bilinen bazı kısayolları sizlerle paylaşmak istedim.

1- Kod yazarken birçok kez kopyalama işlemi yapıyoruz. Daha önce kopyalanan kodu,  2. kopyalama (ctrl + c) işleminden sonra kaybetmiyormuşuz :) yani vs arkaplanda kopyalanan kodları tutuyormuş. Ctrl + Shift + V ile bu kopyalanan kodlar arasında gezebiliyoruz.

Daha önceden kopyalanmış bir kodu yapıştırmak istediğimizde ctrl + shift +v tuş kombinasyonuna birden çok kez bastığımızda daha önceden kopyalanmış kodları da görebiliyoruz

2- Namespace'ini bilmediğimiz ya da o anda hatıryalamadığımız bir Type'in ismini doğru şekilde yazdığımızda type'in isminin hemen altında küçük kırmızı bir simge çıkararak, vs.net bize iki öneride bulunmaktadır. İster o anda direk namespace ismi ile kullanmayı, istenirse de using ifadesi ile kodun başına namespace'i eklemeyi önermekedir. Bu menüyü klavyeden elinizi kaldırmadan görebilmek için Ctrl + . tuş kombinasyonunu kullanabilirsiniz. (Teşekkürler Mustafa Güven :) )

 

3- Uzun metodlarda ya da sınıf tanımlamarında açılan ve kapanan küme parantezleri (braces) arasında dolaşmak için Ctrl + ] tuş kombinasyonunu kullanabilirsiniz.


 
Categories: .NET | Inceleme

Oluşturduğumuz assemblyleri Global Assembly Cache'e (GAC) yüklemek için gerek gacutil konsol uygulamasını gerekse de Control Panel\Administrative Tools altındaki Microsoft .NET Framework 2.0 Configuration aracını kullanarak manuel yükleme işlemini gerçekleştirebiliyoruz.

Peki bu işlemi yardımcı araçlar ile manuel olarak değil de bazı ihtiyaçlardan dolayı :) programatik olarak gerçekleştirmek isteyebilirsiniz. Reflector ile biraz .NET'i kurcaladığımda - eh! .net framework kendi içinde böyle bir desteği mutlaka sağlıyordur mantığından yola çıkarak - aşağıdaki resimden de görebileceğiniz GacUtil isimli bir sınıf ile karşılaştım.



Aşağıdaki basit bir reflection işlemi ile kendi assembly'imizi GAC'a yükleyebiliriz.

   1:  namespace BTAkademi.TestCodes
   2:  {
   3:      class Program
   4:      {
   5:          static void Main(string[] args)
   6:          {
   7:              //GAC'dan System.Web dll'i yükleniyor
   8:              Assembly asm = Assembly.Load(@"System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
   9:   
  10:              // Type bilgisi alınıyor
  11:              Type t = asm.GetType("System.Web.Configuration.GacUtil");
  12:              // Metodu invoke edebilmek için GacUtil türünden nesne oluşturuluyor
  13:              object o = Activator.CreateInstance(t);
  14:   
  15:              //Metod bilgisi alınıyor
  16:              MethodInfo mi = o.GetType().GetMethod("GacInstall");
  17:   
  18:              //metod çağrılıyor
  19:              mi.Invoke(o, new object[] { "C:\\gacTest.dll" });
  20:   
  21:          }
  22:      }
  23:  }


Not : GAC'a yüklenmek istenen assembly'nin public key token'a sahip olması gerekmektedir.

 

13/7/2008 tarihli düzenleme :

try
{
    System.EnterpriseServices.Internal.Publish gac = new System.EnterpriseServices.Internal.Publish();
    gac.GacInstall(yuklenecekassemblyadi);
}
catch (System.Security.SecurityException se)
{

}

şeklinde de yüklenebiliniyormuş :))) Eh azmetmek gibisi yok.


 
Categories: .NET | C# | Code | Inceleme

C# 3.0 ile birlikte gelen yeniliklerden, otomatik özellikler ile artık kolay ve hızlı bir biçimde standart özellikler (property) tanımlayabiliyoruz.

Örneğin;

class Person
{
   public int No { get; set; }
   public string Ad { get; set; }
   public FizikselOzellik Ozellik { get; set; }
}

class FizikselOzellik
{
   public int Kilo { get; set; }
   public int Boy { get; set; }
   public string Cinsiyet { get; set; }
}

gibi. Aslında IL kodlarını incelersek, derleyicinin C# 2.0 daki gibi (arka planda bir field oluşturup, get ve set erişimcilerini otomatik kendisi yazıyor) özellik tanımladığını görebiliriz. Yeni gelen diğer bir özellik ise Nesneye Ilk Değerini verme ile ilgili. Aşağıdaki sentaks ile artık nesneleri oluştururken özelliklerine de ilk değerlerini vererek nesneyi oluşturabiliriz.


Person nesnemiz içerisinde özellik olarak FizikselOzellik isimli başka bir nesne içeriyor. Bu durumda da aşağıdaki sentaks ile Person nesnemize ilk değerini verebiliriz.,

Person p = new Person {
               
Ad="oguz",No=169,
               Ozellik = new FizikselOzellik{Kilo=120,Boy=173,Cinsiyet="E"}
};

Görüldüğü gibi C# 3.0 ile gelen yenilikleri dili kullanmayı daha hızlı, zevkli ve kolay bir hale getiriyor ;)

 
Categories: C# | Code

Bazen bir aspx sayfasının çıktısı üzerinde işlemler yapmak isteyebilirisiniz. Örneğin sayfadaki yasaklı kelimelerin - genelde forumlarda ihtiyaç duyulur :)  - düzenlenmesi, ya da bazı bilindik kelimeler üzerinde işlem yapmak isteyebiliriz. Mesela ben sayfamda BT Akademi ve oğuz kelimelerine rastladığımda ilgili kelimelerin yerine sanki linki verilmiş gibi yer almasını isteyebilirim. Bu durumda yapmamız gereken çıktının - Response - Filter özelliğinden yararlanmak. Filter özelliğini - property- incelediğimizde aslında bunun bir Stream nesnesi olduğunu görürüz. Bu durumda yapmamız gereken görüntülenmesini istediğimiz çıktıyı kendimiz oluşturmak. Bunu da kendi Filter - aslında Stream'dan türemiş bir class oluşturmak - nesnemizi oluşturup Response.Filter özelliğine bu kendi nesnemizi vermekten ibaret.

Stream sınıfı abstract bir class olduğundan abstract - özet kelimesini pek sevmesem de Türkçe'de başka kelime anlamını tam veremiyor- olarak bildirilmiş metodlarını kendi sınıfımızda uygulamamız - implement - gerekiyor. Bunları ekteki dosyadan inceleyebilirsiniz. Asıl üzerinde durulması gereken konu ise bu oluşturduğumuz sınıfın Write(...) metodu. Bu metod içinde sayfamızda görünmesini istediğimiz çıktıyı kendimizin oluşturması. Örneğimizi incelersek

class AFilter:Stream
{

     Stream _originalStream = null;

     public AFilter(Stream ResponseFilter)
     {
         _originalStream = ResponseFilter;
     }

     ...........

     ...........

     public override void Write(byte[] buffer, int offset, int count)
     {
         string text = Encoding.UTF8.GetString(buffer);

         //Regex de kullanılabilir...
         text = text.Replace("oğuz", "<a href=http://www.oguzyagmur.com>oguz</a>");
         text = text.Replace("BT Akademi", "<a href=http://www.btakademi.com>BT Akademi</a>");

         // istenilen ek işlemler yapılabilir.
         text = text.Replace("\r\n", "");

         //eklemeler yapılabilir cıktıya...
         text += "<br>tüm hakkı saklı falan değildir. tepe tepe kullanın";
 
         buffer = Encoding.UTF8.GetBytes(text);
        _originalStream.Write(buffer, 0, buffer.Length);
     }
}

Write metodunda sayfaya çıktı gönderilmeden önce çıktıyı alıp üzerinden işlemler yapıp daha sonra çıktıyı sayfaya gönderiyorum. Bu sınıf oluşturdukdan sonra yapmamız gereken sayfanın OnPreInit metodunda hazırlamış olduğumuz bu filitrenin sayfa çıktısı üzerine uygulanmasını sağlamak.

protected override void OnPreInit(EventArgs e)
{
    Response.Filter = new AFilter(Response.Filter);
}

Bu durumda sitedeki her sayfa için bu işlemi tekrarlamak olacaktır ki çok da iyi bir yöntem değil. Belki MyCustomPage isimli Page den türemiş olan bir sınıf oluşturup tüm sayfalarımızı bu - MyCustomPage - sayfadan türeterek bir nevi çözüm geliştirsek de  -sizin çok daha iyi fikriniz olabilir - size önerim bu işi üstlenecek bir HttpModule hazırlamanız olacaktır.

Burda da ilk akla gelen soru hazırlamış olduğum bu filitreyi HttpModule de hangi event'te sayfanın çıktısına uygulamak. msdn'i biraz kurcaladığımda sayfanın çıktısı üzerine filitre ReleaseRequestState eventi sırasında uygulandığını öğrendim. Bu durumda aşağıdaki kısacık kod ile sitemizdeki tüm sayfalar üzerinde hazırladığımız bu filitreyi etkin kılabiliriz.

public class HrefFilter : IHttpModule
{

     public void Dispose()
     {
     }

     public void Init(HttpApplication context)
     {
         context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
     }

     void context_ReleaseRequestState(object sender, EventArgs e)
     {
         if (HttpContext.Current.Response.ContentType == "text/html")
         {
              HttpContext.Current.Response.Filter = new AFilter(HttpContext.Current.Response.Filter);
         }
     }
}


filter_dosyalar.rar (24.57 KB)
 
Categories: Asp.net

Linq To SQL de, bir nesne ( Personel ) yüklendiğinde ( from c in DB.Personels select c ) ilişkili olduğu ( Telefon ) tablodaki veriler ( Personele ait Telefonlar )
belleğe yüklenmezler. Aşağıdaki resime bakacak olursak ;




kisi nesnesine ait Ad özelliğinin değeri okunmak istendiğinde zaten bellekte olduğu için yeniden bir işlem yapılmamakta. Ama bu kisi nesnesine ait telefonlar - tablolar arasında ilişki olduğunu biliyoruz - Telefons isimli bir koleksiyon türünden özellik  ile ifade ediliyor. Bu kişiye ait telefon bilgilerinden ilkine erişmek istediğimizde kisi nesnesine ait telefon bilgilerini alıp nesneyle ilişkilendirmek için ikinci bir T-SQL sorgusu veritabanı sunucusuna gönderiliyor. Aslında performans açısından bakıldığında istenen durum budur.

Peki ama ben kisi nesnesini oluşturduğumda buna ait telefon bilgileri de - dikkat edin o kişiye ait adres bilgileri de olabilir ama biz sadece telefon bilgilerinin de - tamamen belleğe yüklensin ikinci bir select işlemi yapılmasın istersek. Bu durumda kodumuza  aşağıdaki gibi eklemeler yapmamız  gerekecektir.



Görüldüğü gibi DataLoadOptions sınıfı ile  nesnenin ilişkili olduğu verilerin de nesne ile birlikte belleğe yüklenmesini sağlayabiliyoruz.  LoadWith Generic metoduna tip olarak Kisi sınıfını verip, lambda Expression ile de Kisi türünden bir nesne yüklendiğinde buna ait telefon bilgilerinin de yüklenmesini ( c => c.Telefons ) belirtebiliyoruz (Immediately Load). DataContext nesnemizin de LoadOptions özelliğine değeri atayarak şekilde görüldüğü gibi iki ayrı select sorgusu ile istediğimiz senaryoyu gerçeklemiş olduk.

 
Categories: C# | Code | Inceleme

April 3, 2008
@ 01:07 AM
Microsoft Türkiye tarafından Visual C# kategorisinde Microsoft MVP ödülüne layık görüldüm. Beni bu ödüle layık gören ve destekleyenlere teşekkür ediyorum.


 
Categories: Yasam

Yazılım geliştirme sırasında  ya da bazı durumlara anlam vermek için kimi zamanda araştırma geliştirme işlemleri sırasında çeşitli araçlar düşüneceğimizden daha çok yardımıcı olabileceğini görüyoruz. Yeri geldiğinde gördüğüm hoşuma giden araçları sizlerle paylaştım.

Ama farkettim ki sıklıkla kullandığım 3 aracı sizlerle paylaşmamışım :)

-Fiddler
-LinqPad
-FireBug

Fiddler

Web Debugger olarak nitelendirebileceğimiz bu uygulama web geliştiricileri için olmazsa olmazlardandır diyebilirim.Bilgisayarınızdan herhangi bir yolla internet üzerinden bir yere eriştiğinizde ya da ie ile herhangi bir websitesine requestte bulunuduğunuzda ya da localinizde geliştirdiğiniz asp.net projelerinde Fiddler hemen devreye girerek tüm trafiği analiz eder ve size gösterir. HTTP protoklündeki tüm detayları size göstererek gerek keşleme olsun gerek sitenizin yüklenme süresi olsun gerek yüklenme sırasında tüm response ve requestlerin tüm detaylarına kadar izlemek olsun sayamayacağım bir çok özelliği ile yeri geldiğinde web uygulamarında karşımıza çıkacan sorunlara karşın can simidiniz olabilir.
http://www.fiddlertool.com/dl/Fiddler2Setup.exe linkinden bu aracı indirebilirsiniz.


Birkaç özelliğinden bahsedecek olursak TimeLine özelliği bir sitenin ne kadar sürede yüklendiği sitenin yüklenmesi sırasında hangi parçanın ne kadar zaman sürdüğü gibi bilgileri grafiksel olarak görebilirsiniz. Hiç tahmin etmediğiniz bir script dosyası ya da bir resim sitenin yüklenme süresini artırıyor olabilir.Bu sayede sorunlu içereği tespit etmek çok kolay olacaktır. (Resimlerin büyük hali için resmin üzerine tıklayınız)

Diğer önemli bir özellik ise, göndermiş olduğunuz Request'in ve size gelen Respons'un tüm ayrıntılarını gözlemleyerek arabelleğe alma (cache) gibi işlemleri ya da ajax işlemleri sırasında response detaylarını görebilir, buna göre istemci tarafli arabelleğe alma işlemlerinizi birkez daha gözden geçirebilirsiniz ;)

Diğer güzel bir özelliği ise sunucudan sıkıştırılmış (Gzip ya da deflate formatlarından birisi) olarak gönderilen içeriği çözerek (https istekleri ve sonuclarını da Fiddler ile incelemenizi tavsiye ederim ;) ) anlanlı şekilde gösterebiliyor. Google içeriğini Gzip ile sıkıltırarak istecilere gönderiyormuş meğersem ;)

Alernatif bir araç olarak HttpWatch'ı da inceleyebilirsiniz.
http://www.httpwatch.com/


LinqPad

Linq ile uğraşanlar için yardımcı bir araç olarak kullanılaiblir. En azından yazılan linq query'lerinin C# Expression karşılıklarının görülerek - ya da tam tersi - kod yazma becerinizin artmasını veya bazı durumlara anlam verebilmenizi sağlar. Bunların yanında herhangi bir geliştirme ortamına ihtiyac duymadan sorgularanızı yazabilir, sonuclarını güzel bir şekilde göstererek projenizi bozmadan testler yapabilirsiniz.Kurulum gerekmeden kullanabileceğiniz uygulamayı http://www.linqpad.net/ adresinden indirebilirsiniz.

 

FireBug

Özelliklerinin saymakla bitirilmeyeceği, kısaca HTML,CSS ve Javascript Debugger olarak nitelendirebileceğimiz bu FireFox eklentisi web geliştiricilerinin olmazsa olmazlarındandır.
http://www.getfirebug.com/ adresinden temin  edebileceğiniz bu eklenti ile herhangi bir site üzerinde istediğiniz değişiklikleri yaparak "acaba burası şöyle olsa idi, acaba şu tag'ın arka plan rengi şöyle olsa nasıl görünürdü, şimdi şu div'in class'ı şu değil de bu olsa sayfa ne hale gelirdi" gibi içinizdeki araştırma geliştirme ve test dürtülerinizi gerçekleştirmek için sonuna kadar imkan veren harika bir eklenti.

 

Eğer sizlerin de kullandığı yararlı araçlarınız varsa incelemek için sabırsızlanıyorum!


 
Categories: Inceleme

.net dünyasına ilk adım atanlardan sıkça duyduğum soruların başında "bu namespace'leri nerden bileceğim, bu class'ın var olduğunu nerden bileceğim, ya da hangi namespace içerisinde olduğunu nerden bileceğim" şeklinde sorular geliyor. Ben de "zamanla ve kullandıkça, ihtiyacınız oldukça" diye cevaplıyorum.

Şu ve şurdaki linklere dikkat edersek aslında .net framework'ün ne kadar geniş bir dünya olduğunu, hatta biraz abartırsak da "dibsiz bir kuyu" olduğunu da söyleyebilirim ;)

Gün geçmiyor ki yeni assembly'ler, yeni namespaceler ve type'larla karşılaşmayalım sayın programcılar :)


 
Categories: .NET | C# | Inceleme

Alper Hocam ile sık sık "yahu bu http'nin değişmesi lazım, browserların değişmesi lazım, geri kaldı birçok gelişmeye göre..." diye başlayan birçok sohbetimiz olmuştur. Ben de boş zamanlarımda "acaba değiştirsek neresinden nasıl başlardım?, dur bakalım şu HTTP'nin ince ne detayları varmış" diyerek HTTP'nin birçok detayını inceleme kararı almıştım. Araştırmalarım sırasında şu link biraz şaşırttı beni açıkcası.

Dökümanın dediğine göre bir resim dosyası base64 formatına çevrilip <img> tagına verildiğinde standartlara göre browserların bunu görüntülemesi gerekiyor ( bilin bakalım kim desteklemiyor olabilir ? ;) ). Küçük bir test kodu ile bunu denedim. Herhangi bir resim dosyasını base64 formatındaki bir string'e çeviren kod aşağıda.
 public string GetStringFromImage(string path)
{
return Convert.ToBase64String(File.ReadAllBytes(path));
}
Görüntülenmesi istediğim resim ise ;



HTML kodum ise aşağıda. Formata dikkat ederseniz - aslında şemaya -
data:[<mediatype>][;base64],<data>
şeklinde.

<img src="data:img/gif;base64,R0lGODlhYQAWAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD//////
wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wD
MAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADN
mMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmY
AmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMm
WbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM
5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswz
mcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz/
//8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZ
v/Mmf/MzP/M////AP//M///Zv//mf//zP///ywAAAAAYQAWAAAI0gAfCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsmRDAAAoosy
48iTKlwNfykx5sGVMmhJtWtSp0CZPngZ/4owIdKTPoQ+K3tTZ8ijMpU+TyrwplWZUpUFxCu0ZVarXmla1hqVaVeDTpkgTztyKEC3UgmvNipVL9mj
dtG2HMsVL92tVvXP9op3ZV/BYlwT35o3r1W5fx0Udf8UKF3BivoonH9Ysd7Pbwp8ZrkWqNDNkwp0NXw3M2aTr17Bjy55Nu7bt2xQDAgA7" />

Eğer yukardaki şekilde değil de kod ile base64 string'ini direk <img> tagına atamak istiyorsanız aşağıdaki kod sorunu çözecektir.

<img src="data:img/gif;base64,<%Response.Write(Convert.ToBase64String( System.IO.File.ReadAllBytes("C:\\vs.gif"))); %>" />

Sonuç; ie7 - yamulmuyorsam -  desteklemez iken, Firefox bunu başarılı bir şekilde görüntülüyor.



Tabi bu yöntemle resim göstermek neye yarar, limitleri var mıdır, yok mudur tarzında sorularınız için şu linkden faydalanabilirsiniz.

 
Categories: Asp.net | Inceleme

Bilişim alanında güçlü bir beyin fırtınası estirmek ve fırtınadan öğrencilerin ve bölüm akademisyenlerinin azami derecede faydalanmasını sağlamak amacıyla 28-29 Şubat 2008'de, Bucak Hikmet Tolunay MYO Oğuzhan Kampusü'nde, "2.Bilişim Fırtınası" düzenlendi.

29 Şubat' günü sevgili Sefer Algan ile etkinlikte yer aldık. Açıkcası tam bir süprizler günüydü.Etkinlikte de bahsettiğim gibi gerçekten yürekten "Hoşbulduk" dedirtecek kadar misafirperver ve ilgili öğretim görevlileleri bizi karşılayarak Bucak'a gittik.

Gerek yerel halktan yazılıma gönül verenler, gerek universitenin öğrenciler, gerek öğretim görevlileri dinleyiciler arasındaydı. Ama bundan çok daha önemlisi ilçenin yazılım ile ilgili dersleri olan "lise"lerden de öğrenciler gelmişlerdi. Bu öğrencilerden bir kız "ben bir uygulama yapacağım ama web demi yapsam yoksa windows da mı karar veremedim?" sorusu vardı ki bu beni benden aldı diyebilirim.

Gerek gösterilen ilgi gerek gelen sorulardan katılımcıların yazılıma ne kadar gönül verdikleri ortadaydı. Belki büyük şehirde olmamız belki bilgi paylaşımının bol olduğu bir şehirde yaşıyor olmamızdan mıdır nedir tam anlamış değilim ama bizim gibi yazılımı sevip yazılım alanında ilerlemek isteyen Bucak'lı öğrencilerimizin bizler kadar bilgiye erişme fırsatı olmuyor. Bu yazılıma gösterilen ilgi karşısında inanın "yahu istanbul, ankara ... gibi illerde yapılan seminerlere katılmayan, ya da iş olsun diye katılan, ya da aman dinleneyim ne semineri şimdi" diyenler aklıma geliyor da susmakla yetinmek sanırım daha iyi olacak.

Öğrenciler için faydalı olmak adına elinde gelen tüm özveriyi gösteren ,Tekrardan Okul Müdür Sayın Doç. Dr. Hüseyin DALGAR'a ,Hasan MAZLUM'a, misafirperverliğinden ve ilgisinden dolayı İlker UNAL'a, Recep ÇOLAK'a, yemek tercihlerindeki önerileri ve bizi havaalanına son dakikada yetiştiren sevigili Şeref ÇALKAYA Hocam'a (Kusura bakmayın vedalaşamadık) ve ismini hatırlayamadığım Hoca'larıma teşekkür ediyorum.


 
Categories: Inceleme | Internet | Yasam

16 Şubatta Çankaya üniversitesinde daha önce iki kez Istanbulda düzenlemiş olduğumuz etkinliğimizi gerçekleştirdik. Tüm katılımcılara faydalı olduğumuzu umarım. Etkinliğin düzenlenmesinde başta İlker Acar olmak üzere, diğer MSP arkadaşlara teşekkür ederiz.

Not : Berk sana ayrıca teşekkür ederim ;) o güzel kahvaltı mekanı ile bizleri buluşturduğun için :)




 
Categories: .NET | Yasam

February 8, 2008
@ 03:07 PM
İki tabloyu birlikte sorgulamak için inner join kullanırız. Bunu Linq To Sql ile yaparken aşağıdaki gibi bir Linq Query yazarak çözüyoruz
(Kisi, Telefon ve Adres tablolarımız olduğunu, bir kişinin de birden çok adresi ve telefonu olduğunu düşünüyoruz )
Bu sorgu sonucunda bana kişiler tablosundaki isimler ve bunlara ait telefon numaraları gelecektir.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID
select new
{
    Ad = kisi.Ad,
    Tlf = tlf.Numara
}

T-Sql çıktısı
SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
INNER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis.Join ( Telefons, kisi => kisi.ID, tlf => tlf.KisiID, (kisi, tlf) => new { Ad = kisi.Ad, Tlf = tlf.Numara } )



Senaryomuzu değiştirelim ;
Kişiler tablosundaki tüm kayıtlat gelsin, telefon numarası olmayanlar da gelsin telefonu yoksa null değer gelsin. Bunun içinde Left Outer Join ile çözeriz. Linq sorugumuzu şu şekilde değiştirmemiz yeterli olacaktır.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID into data
from x in data.DefaultIfEmpty()
select new
{
   Ad = kisi.Ad,
   Tlf = x.Numara
}

T-SQL çıktısı

SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
LEFT OUTER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis
.GroupJoin (
Telefons,
kisi => kisi.ID,
tlf => tlf.KisiID,
(kisi, data) =>
new
{
kisi = kisi,
data = data
}
)
.SelectMany (
temp0 => temp0.data.DefaultIfEmpty (),
(temp0, x) =>
new
{
Ad = temp0.kisi.Ad,
Tlf = x.Numara
}
)

 
 
Categories: C# | Code

January 30, 2008
@ 11:21 PM
Linq to Sql de veritabanı sunucusuna giden sorguları SQL Profiler ile izleriz. Fakat daha kolay bir yol var. Aşağıdaki resim gayet açıklayıcı ;)
Tek yapmamız gereken DataContext türünden nesnemizin Log özelliğine istediğimiz çıktıyı vermek olacaktır.



Eğer kodumuzu aşağıdaki gibi düzenlersek bu defa da üretilen T-SQL istediğimiz herhangi bir fiziksel dosyaya kaydedilecektir.

testDataContext db = new 
db.Log = new StreamWriter("C:\\l2s.log"); var v = from p in db.Persons where p.Surname == "asma" select p.Name; Text = v.First(); db.Log.Close();
l2s.log dosyasının içeriği aşağıdaki gibidir.

SELECT TOP (1) [t0].[Name]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[Surname] = @p0
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [asma]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

 
Categories: .NET | C# | Code | Inceleme

C#nedir?com ekibi olarak çok güzel bir etkinliğin dah altına imzamızı atmış olduk.

Tüm arkadaşlarıma ve katılımcılara teşkkür ediyorum.

16 Şubatta Ankara'da görüşmek üzere.


  
 
Diğer tüm resimler için buyrun.

 
Categories: .NET | Internet

January 25, 2008
@ 03:49 PM
1999 'dan bu yana kullandığımız HTML 4 eklenen yeni özellikler ve değişen kavramları ile HTML 5 olarak karşımıza çıktı.
Kısa süre önce W3C tarafından duyrulan HTML 5 de dikkat çekici birçok yeni eklenmiş özellik mevcut.
Görsellik verme yönden birçok eksikliği olan HTML 4'ün - css ile kastıranlar bilir - getirilen yenilikler ile görsellik tarafı zenginleştirilmiş. Özellikle yeni gelen input kontrolleri ile - rakam girilebilen textbox, tarih girilebilen kontrol, sadece url ya da e-mail girilebilen kontrol - çok daha kolay bir şekilde formlarımızı tasarlayabiliriz.

İlgi çekici kontrollerden birisi de datagrid ve datalist kontrolleri. HTML API leri ile ilginç uygulamalar çıkarabileceğimizin işaretleri gibi ;)

En kısa sürede bu yenilikleri - HTML 5 - destekleyen tarayıcılara kavuşmak istiyoruz :) Ama daha da önemlisi tarayıcılardan ricamız html 5'i doğru bir şekilde yorumlamaları. Bıktık tarayıcıların farklı algılamalarından :)

 
Categories: Internet

Ekim ayında şu adresten .net kaynak kodlarının bir kısmının ilerde geliştiriciler için açılacağını duymuştuk. Geçen zaman sonunda ScottGu şu linteki güzel haberi bizlerle paylaştı. Kendisi bile mutlu olmuş bu haberi duyurmaktan ;)

Sadece VS.NET 2008 için geçerli olan bu işlem, debug yaparken aşağıdaki .net kütüphanelerinin kodlarını göreceğiz. Ençok da System.Threading,  System.Reflection, System.Windows.Forms kısımlarını merak ediyorum!

  • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)

En kısa zamanda C#nedir?com da konu ile ilgili bir video hazırlamaya çalışacağım.


 
Categories: .NET | Inceleme

January 20, 2008
@ 09:01 PM

İlk başlayanlar için zor sonrasında alışanlar için de sıkıcı gelen web.config dosyasını kolay birşekilde editleyeceğimiz güzel bir aracı sizlerle paylaşmak istedim. Kullanması çok kolay olan ASPhere çok güzel bir arayüz ile sıkıcı ve zor editleme işlemlerini eğlence haline getiriyor. Bakarsınız bilmediğimiz ayarları bile görebiliriz ;)

 


 
Categories: Asp.net

January 15, 2008
@ 08:47 PM

Değerli Arkadaşlar, biliyorsunuz bu ay sonunda Visual Studio.NET 2008 ve SQL Server 2008 in lansmanı yapılacak. SQL Server 2008 ile güzel bir yeniliği sizlerle paylaşmak istiyoruz. Veri tabanında BLOB (Binary Large Object) nesnelerini özellikle veritabanında dosya tutmak istediğimizde kullanıyoruz.  Özellikle iş akışı ve döküman yönetimi sistemlerinde veritabanında dosya tutmaya başladığımızda veritabanı gün geçtikçe dosya sistemi gibi büyümeye başlıyor, ve yedekleme işlemi işkenceye dönmeye başlıyordur. SQL Server 2008 dosya sistemi ve ilişkisel veritabanı sistemini kullanarak hibrid bir model sunuyor bizlere. Yani 2008 den itibaren artık BLOB işlemleri veritabanında bir kolon şeklinde tanımalanabilecek ancak istersek dosya içeriğini file system'de tutabileceğiz. Böylece ilişkisel veri modelinden vazgecmeden geniş binary içerkli dosyaları fiziksel olarak diskte saklayabileceğiz.  Veritabanı ise fiziksel dosya sistemine bir nevi referans gibi çalışacak. Bu işlem tamamen opsiyonel olacağı için eski mantıklada çalışmak mümkün olabilecek.


 
Categories: .NET | Code