September 23, 2010
@ 04:31 PM

İnce ama etkili  ;)

Siteye bakılır, beklenmeyen bir nedenden ötürü bazı durumlarda ölümcül olmayan bir performans sıkıntısı yaşanır/yaşandığından şüphe edilir.
Kollar sıvanır, uğraşılır pek birşey gözlemlenemez. Artık requestlerin analizine kadar inilmiştir, keep-alive requestlerin bazılarında görünmez.
Ha, işleri kolaylaştıralım derseniz de şurdan LogParser'i indirip kullanabilirsiniz.

Bu durumda clinet sayfadaki her bir request ( örneğin sayfa içindeki resim, .js, .css dosyaları ) için yeni bir connection açmak için kasmakta server ise bu connectionlara cevap vermek için elinden geleni yapmakta,
CPU ve memory'de bir artışa neden olmaktadır. Tahmini oranlar çıkarılmaya çalışıldığında ise her connection için IIS 1KB kadar ( çıkarım ) memory kullanmakta olduğu sonucuna varılmıştır.

Detaylar için okunası bir kaynak.
Aman irtibatı koparmayalım Mr. Spock.

Az sonra gelen edit : Yahu oldu olacak X-Powered-by ve Server bilgisini de silelim header'dan ne gerek var kopleksliğe rahatlasın paketler.
Server header bilgisini silerken IIS'i rahatsız edebilirsiniz, o durumda modül yazmanız gerekebilir. PreSendRequestHeader eventinde HttpContext.Current.Response.Headers.Remove("Server"); yazmak yeterli olur umarım.Yok yetmedi temizlik az daha derseniz de X-Aspnet-Version bilgisini de silebiliriz header'dan. Web.config'de <httpruntime enableVersionHeader= "false"> düzenlemesi ile yapılabilir
.

 


 
Categories: Asp.net | Inceleme | Internet

November 9, 2009
@ 11:00 PM

Berlin, soğuk soğudukça da soğuyor. Pazar günü sanırım hiçbir "Berlin"li dışarı çıkmıyor! 
Pazartesi insan yüzü görebildik. Sony Center küçük, ünlü meydanlarında 5 6 kişi var.

Berlin Metrosu, Peh! karışık değil gözünüzü korkutmasınlar. Üç dakikalık arge çalışması yeterli anlamak için.

David Chappell, iyi bir konuşmacı. Azure konusunda kafamdakı "cloud" ları kaldırdı diyebilirim.

Tech-ed, Katılım oldukça fazla. İçerik konusunda daha doğrusu sunum ve kalite konusunda sıkıntı olduğu kanaatindeyim. Yemekler ve ikramlar berbat!

Anı, Visual Studio 2010 ultimate Beta 2 den bahseden konusmacı "Choose a Defaul Collections of Settings" ekranına yeni gelen "Web Development (Code Optimized) " seçeneğinden bahsederken kimlerin "Visual Basic Development Settings" kullandığını sorar. Salon yaklasık 300 400 kişiliktir. Sadece iki veya üç el kalkar. Ardından "Visual C# Development Settings" kullnanları sorar ve hemen hemen tüm eller kalkmıştır. Sonra hafif bir sessizlik sonrasında ise salon kahkahalar içinde kopmaya başlar.

ASP.NET 4.0 daki yenilikler çok da iç açıcı değil. Ama çoğu kimsenin yaralarına merhem olacabileceğini düşündürüyor.

-Html içerisinde snippet kullanımı güzel. (VS 2010 ile)
-Dinamik javascript intellisence özelliği ile javascript kodlamak çok kolaylaşıyor (VS  2010 ile)

Performans
- Session State Compression Options
- Auto Start Web Applications
- Per Application Performance Monitor
Extensibility
-
Extensible Output Cache
- Extensible HTML / URL Encoding
- Extensible Request Validations

Minimized Web.config (cidden minimize olmuş ama)

ListView, CheckBoxList, FormView , Menü gibi kontrollerde gelişmeler olmuş. ViewStateMode artık inherit değer alabiliyor. ClientIDMode sayesinde artık karman çorman kontrol isimlerinden kurtulabiliyoruz istersek.

<%:  sayesinde XSS ler önleyebiliyoruz.

Page.Keywords ve Page.Descriptions sayesinde SEO daha da etkin kullanılabilinecek.

Önümüzdeki etkinlikleri bekliyoruz.

 


 
Categories: .NET | Inceleme | Yasam

July 23, 2009
@ 01:34 PM

Yukardaki resimden de göreceğiniz üzere media player (Windows 7) bana bin küsür tane mp3 doyası için bilmem kaç milyon saat süre çıkardı. Süper! ölene kadar dinlesem yine de bitmez. Buraya kadar herşey güzelken aklıma bir soru takıldı. Acaba x tane mp3 dosyasının sürelerinin toplamda kaç saat edeceğini bulan bir kod yazılması istense kaç tanemiz hatalı kod yazacağız ?

Yok dedim bir istisna oluşmuştur diyerek listeden bir kayıt sildim düzelir umudu besleyerek. Evet düşündüğüm gibi olmuştu malesef! Aklım daha da karıştı. Acaba liste ilk oluşturulduğu anda hesaplama yapan kod ile listeden bir kayıt silindiğinde süre hesaplama yapan kod farklı mı? Yok tabi ki aynıdır.O zaman uygulamalar kompleksleştikçe basit kodlar da kompleksleşmeye mi başlıyor? Yoksa senelerdir geliştirilen herkesin bir şekilde kullandığı bir uygulama yetersiz testlerden mi geçiyor ? yoksa bu bir uygulama ihmal edilebilecek küçücük bir hata mı?
Böyle olaylarla karşılaştıkça anti-patternlere daha bir sıkı sarılasım geliyor :)) Yahu bu özelliği uygulamaya kazandırmasak ne olurdu? Basit gibi görünen küçücük bir kodun bile "belki" uygulamanın yanlış sonuçlar üretmesine neden olabileceğini düşünüyor muyuz ?

Siz de benim gibi, basit, kullanımı kolay, sadece amacına uygun tek bir iş yapan o eski uygulamaları ( * ) özleyenlerden misiniz ?


 
Categories: Inceleme

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

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

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

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

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

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

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: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

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

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

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

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

December 11, 2007
@ 10:31 AM

Evet, birçoğumuz alışır olduk son zamanlarda Microsoft'un ürünü çıkarmadan önce kodadı ile bizlere tanıyor olmasına. Katmai, Orcas, Longhorn,Whidbey,Atlas vs vs..

Aslında şu linke bakıldığında hiç de küçümsenemeyecek kadar çok sayıda kodadları listesini görebilirsiniz.Örneğin Windows 95 'in kodadının Chicago,Windows 98'in Memphis, Microsoft Office Communicator 2005'in Istanbul  , Windows Mobile 5.0'ın Magneto imiş :)


 
Categories: Inceleme | Internet

Şu sıralar Visual Studio 2008 ile birlikte gelecek olan, debug işlemleri sırasında framework'ün kodlarını da debug edebileceğimiz haberi herkesi heycanlandırıyor. E güzel gelişme tabiki.

Peki bu yenilik gelmeden önce napıyorduk ? Ya da debug işlemlerine açılması planlanan DLL'ler dışında bir Dll'i debug etmek istersen ne yapabiliriz? Diğer bir amaç ise projemizde kullandığımız 3. parti Dll'leri - kodları bizde olmayan- debug etmemiz olabilir.

Bildiğiniz üzere nerdeye dünyanın ençok kullanılan decompiler aracı olan Reflector AddIn altyapısı sayesinde birçok geliştirici eklemeler yapabiliyor bu uygulamaya. Bunların arasında en güzellerinden bir tanesi de Deblector. Kısa deblector sayesinde reflector'ü kullanarak bir uygulamayı debug edebiliyoruz.

İlgili linklerden Reflector ve Deblector uygulamarını indirdikten sonra reflector uygulamasının View->Add Ins.. menüsünden ilgili plugin'i eklememiz gerekiyor.

Şimdi küçük bir uygulamayı debug etmeye çalışalım. Örnek olması açısında aşağıdaki basit kod üzerinden açıklamay yapmaya çalışacağım

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("data source=.;database=Northwind;user id=sa;pwd=1");
            SqlCommand cmd = new SqlCommand("select * from Categories",con);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            MessageBox.Show(dt.Rows[0][1].ToString());

        }

Amacımız Debug işlemi sırasında SqlDataAdapter nesnesinin varsayılan yapıcı metodunu (Default Constructor) incelemek (Bunu Visual Studio kullanarak yapabilmemiz imkansız). Reflector uygulaması açıp Tools menüsünden Deblector'ü aktif hale getirdiğimizde sağ tarafda yeni bir bölüm, toolbar da debug işleminde kullanacağımız butonları görebiliriz.

Şimdi File->Open menüsünden debug etmek istediğimiz uygulamayı seçip işlemlerimize başlayabiliriz.

Sol tarafdaki Tree'den reflector_text.exe yi seçip F7 ile uygulamayı - ya da toolbardan ilgili butona tıklayarak - debug işlemini başlattımızda (aynı zamanda reflector_test.exe nin çalıştırıldığına da dikkat edelim)yukardaki gibi bir ekran ile karşılaşıyoruz. Sarı ile işaretlenmiş IL kısmı o anda hangi satırı debug ettiğimizi göstermekte, istenirse yukardaki kısımdan ilgili kod bloğunun C#  karşılığını da görebilmekteyiz. Alltaki siyah - Shell - kısımda ise o anda hangi satırın debug edildiğini görebilmekteyiz. Visual Studio'dan alışık olduğumuz  F10 ile satır satır ilerleyebilir, F11 ile de o anda debug edilen metodun içerisine girerek işlemlerimize devam edebiliriz.

Sol Tree'den button1_click metodunu seçip breakpoint - toolbardaki kırmızı ikon - koyarak debug işlemini başlatalım.

Çalışan uygulamamızda button1 e tıkladığımızda breakpoint koyduğumuz yerde bizden komut beklemeye hazır durumda olduğunu göreceksiniz.Artık F10 ya da F11 ile kodları debug etmeye başlayabiliriz.

 


 
Categories: .NET | Inceleme

Uygulamamızda debug yaparken nesnelerimizi daha anlaşılır şekilde görmek için çeşitli Visualizerları kullanırız. Örneğin bir DataTable ya da DataSet'in içeriğini debug işlemi sırasında Visualizer yardımı ile çok daha anlaşılır bir şekilde inceleyip, doğru datalarla çalışıp çalışmadığımıza karar verebiliriz. Yeri geldiğinde XML dosyalarımızın içeriğini de daha anlaşılır şekilde görüntülemek için XML Visualizer'den faydalanırız.

Visual Studio 2005, belirli tipler için visualizerlardan yararlanabilmemizi sağlıyor. Ama bu harika IDE istenildiğinde kendi nesnelerimizi de debug işlemi sırasında özel geliştirdiğimiz bir visualizer ile gösterebilme imkanı da sağlıyor. Senaryomuz şöyle;

Uygulamamız içinde Person isimli bir türümüz var. Debug işlemi sırasında kendi geliştirdiğim Visualizer ile (aşağıdaki resimde görüldüğü üzere) bu nesneyi görüntülemek istiyorum.

Bunun için yapmamız gereken projemize yeni bir Debugger Visualizer Item'ı eklemek olacaktır. Örnek projemiz ,geliştirğimiz Visualizer'i test edecek bir Windows uygulaması (PersonVisualizerTest), Person ve türeyen nesnelerimizi barındıran bir dll (EntityObjects), ve daha sonra da kullanmak amaçlı geliştireceğimiz içerisinde kendi visualizer'imizin bulunduğu bir başka dll (PersonVisualizerLib) projesinden oluşacak.

Person nesnemiz aşağıdaki gibidir. Dikkat edecek olursanız Serializable Attribute'ü uygulanmıştır nesnemize.Yani nesnemizin geliştirdiğimiz visualizer tarafından görüntülenebilmesi için nesne serileştirilebilir olmalı.

   [Serializable()]
    public class Person
    {
        Bitmap _picture;
        public Bitmap Picture
        {
            get { return _picture; }
            set { _picture = value; }
        }

        private int _no;
        public int No
        {
            get { return _no; }
            set { _no = value; }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

    }
 

Gelelim visualizer'imizin geliştirilmesine. DLL Projemize (PersonVisualizerLib) sağtıklayıp Add->New Item... menüsünden "Debugger Visualizer"'i şeçip tamam diyoruz.Personel nesnemizin içinde olduğu dll i projemize ekledikten sonra Visualizer'imizin kodunu aşağıdaki gibi tasarlıyoruz.

[assembly: DebuggerVisualizer(typeof(PersonVisualizerLib.PersonVisualizer),
Target = typeof(EntityObjects.Person),
 Description = "Personel Debug Ekaranı ile Göster")]

namespace PersonVisualizerLib
{
  
    public class PersonVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
           
            Person person = (Person)objectProvider.GetObject();
            using (PersonForm displayForm = new PersonForm())
            {
                displayForm.person = person;
                windowService.ShowDialog(displayForm);
            }
        }
    }
}

assembly attribute'ü ile visualizer'in tip bilgisi, hangi türden nesnelerin visualizer'da görüntüleneceği, ve debug esnasında visualizer'imizin görüntülenecek adını belirtiyoruz. Show metodunun içerisinde de debug esnasında görütülenmesini istediğimiz nesneyi alıp person türüne dönüştürdükten sonra Form'a bu nesneyi görüntülemesi için veriyorum

PersonForm, nesnemin görsel olarak gösteriminde kullanacağım form nesnem. Form'un üzerinde, person nesnesini gösterecek  PropertyGrid , person nesnesinin resmini gösterecek Picturebox , person nesnesinin Name ve No  özelliklerini gösterecek iki adet Label controlü içermekte.Form'un kodu da aşağıdaki gibidir.

        public Person person;
        public PersonForm()
        {
            InitializeComponent();
        }

        private void PersonForm_Load(object sender, EventArgs e)
        {
            label1.Text = person.Name;
            label2.Text = person.No.ToString();
            pictureBox1.Image = person.Picture;

            propertyGrid1.SelectedObject = person;
        }

Tüm bu hazırlıklardan sonra visualizer'i test edeceğim projeme Person nesnesinin içinde olduğu Dll'i ekliyorum. Visualizer'imizin VS.NET 2005 tarafından işlem görebilmesi için oluşan PersonVisualizerLib.dll 'ini C:\Documents and Settings\{user_name}\My Documents\Visual Studio 2005\Visualizers dizinine kopyalıyoruz. Artık kendi geliştirdiğimiz tüm uygulamalarda bu visualizer'i kullanabiliriz. Ama makina düzeyinde tüm kullanıcıların'da bu visualizer'den yararlanmasını istiyorsak ilgili dll'i C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\Visualizers dizinine kopyalamanız yeterli olacaktır.

Artık debug esnasında oluşturğumuz visualizer ile Person nesnemizi tasarladığımız şekilde görebilmek mümkün olacaktır.

Tabiki bu örnek dışında, örneğin geliştirdiğiniz bir asp.net uygulamasında ürün sepeti'nizi bir grid içinde görüntülemekten tutun, bir stream nesnesini istediğiniz formatta görüntülemeye kadar birçok özel visualizer geliştirerek debug işlemlerini hem kolaylaştırıp hem de daha zevkli hale getirmek mümkün :=)

PersonVisualizerTest.rar (43,77 KB) (Bahsi geçen örnek uygulama ektedir.)
 
Categories: .NET | C# | Inceleme

Msdn'de soldaki TreeView'de StackTrace sınıfını incelemek isterken hemen altında bulunan StopWatch sınıfı isminden dolayı baya bir gözüme battı. Neymiş diye incelerken çoğumuzun bir kodun ne kadar süre çalıştığını test etmek için DateTime.Now ile o anki zaman değerini alıp kod bitiminde Datetime.Now ile zaman değerinden bir önceki değeri çıkarma işlemini yaparız. StopWatch sınıfı ile çok daha hassas ve kesin ( Daha alt sistem API'lerini kullandığınu söyledi google ;) ) değer alabiliyormuşuz. Kullanımına dair örnek kod aşağıda.

private void button1_Click(object sender, EventArgs e)
{
   System.Diagnostics.Stopwatch diff = new System.Diagnostics.Stopwatch();
   diff.Start();
   for (int i = 0; i < 2000000; i++)
   {
      int x = i >> 2 << 22 >> 222 << 2222 >> 22222 << 222222;
   }
   diff.Stop();
   label1.Text = diff.Elapsed.ToString();
}       

DateTime ile aynı kodu şu şekilde test ettim.

long t = DateTime.Now.Ticks;
for (int i = 0; i < 2000000; i++)
{
   int x = i >> 2 << 22 >> 222 << 2222 >> 22222 << 222222;
}
long t1 = DateTime.Now.Ticks;
label1.Text = (t1 -t).ToString();

Sonuç ya 0 (yazı ile sıfır) ya da 156250 iken aynı kodu StopWatch sınıfını kullanarak test ettiğimde 28400 ile 28800 arasında sonuçlar verdi.
 
Categories: C# | Code | Inceleme

Kimi projelerde sürekli aynı pencere yapılarına sahip ekranlar ile karşılaşırız. Ya da kendi oluşturduğumuz bir ürünümüz vardır Visual Studio 2005 için, kullanıcı File->New Project dediğinde bizim ürünümüze ait standart bir projenin seçilip (ilgili dll'ler ve resource dosyaları eklenmiş) hızlı bir şekilde projeyi oluşturması imkanını kullanıcıya vermek isteyebilirz.

Örneğin ASP.NET Ajax Extention'u kurduğumuzda artık File->New WebSite dediğimizde açılan dialog penceresinde "Ajax Enabled Website" isimli bir proje şablonu karşımıza çıkar ve seçip projeyi oluşturduğumuzda artık tek yapmamız gereken kodumuzu yazmaktır. İlgili Dll'ler, tüm ayarları yapılmış web.config dosyası hazır haldedir.

Benze bir uygulamayı geliştirmek VS.NET 2005 de oldukça kolaydır. Örneğimizde ben "MyModule" isimli örnek bir windows projesi hazırladım.Menüleri, ToolStrip'i, DataGridView ve StatusStrip'den oluşan standart basit bir windows formu. Örnek olması açısından da StatusStrip deki linke tıkladığımızda ilgili linke yönleniyor (amaç hazır kodların bulunması.) Diğer bir detay da projemizde kendi oluşturduğumuz bir dll'inde ekli olması.

Amacımız artık File->New Project işlemi yapıldığında Project Template ekranında hazırlamış olduğumuz örnek projenin bir şablonunun çıkması vr Kullanıcı bu şablonu seçip projeyi oluşturduğunda bizim hazırladığımız projenin aynısının oluşturulmasının sağlanması. Bunun için yapmamız gereken File menüsünden Export Template... menüsüne tıklamak.

İlk olarak "Project Template" seçeneğini işaretleyip Next ile devam ediyoruz.

Template icon kısmından project Templates ekranında görünmesini istediğimiz resmi, eğer beğenmediyse Template name kısmından ismi değiştirebilir, Template description kısmında ise templatimizi kullanacak kişiye gerekli açıklama bilgisini verebilirsiniz.  "Automatically import ..." seçeneğinin aktif olması gerekli dizinlere oluşturulacak proje şablonunuzun ( kendisi bir zip dosyası olmaktadır ) otomatik olarak kaydedilmesini, "Display an explorer ..." seçeneğinin aktif olması da işlem bittikden sonra ilgili klasörün açılmasını sağlayacaktır. Finish diyerek işlemimizi bitiriyoruz. Bu işlemleden sonra C:\Documents and Settings\{kullanıcı}\My Documents\Visual Studio 2005\My Exported Templates dizinine ve C:\Documents and Settings\{kullanıcı}\My Documents\Visual Studio 2005\Templates\ProjectTemplates dizinlerine MyModule.zip isimli dosyayı kopyalayacaktır.

Artık Vs.NET'te Project Templates Dialog penceresinde "My Templates" kısmında MyModule isimli bir proje şablonun oluştuğunu göreceksiniz.

 Seçip projeyi oluşturduğumuzda ise hazırlamış olduğumuz şablonun birebir aynısını karşımızda göreceğiz.

 

MyModule.rar (36,44 KB) (Anlatımda kullanılan örnek proje ektedir.)
 
Categories: .NET | Inceleme

Debug işlemleri yaparken sıklıkla karşılşatığımızın durumların başında nesnemiz başka bir nesneyi içeriyorsa bu nesneyi ancak hiyeraşik bir biçimde inceleme şansına sahip oluyoruz. Aşağıdaki resimde daha net birşekilde ne demek istediğim belli oluyor.

Görüldüğü gibi Report nesnemiz içerde List<int> türünden Results özelliğine (property) sahip. Bu özelliğin hangi değerlerini tuttuğunu görmek için + ile detayına inip bakmamız gerekiyor. Bu özellik baska bir nesneyi temsil ediyor, ve o nesne de içerisinde iç içe (nested ) başka değerleri tutuyor olabilir. Bu durumda + lar ile detaylara inip boğulabilirsiniz ;-) Ama çoğumuz bu iç içe nesnelerin aslında sadece işimize yarayacak kısmını debug işlemi sırasında görmek isteyebilir, hatta bu kısımları özelleştirerek istediğimiz gibi bir görüntü sağlayabiliriz. Aşağıdaki resim ile bir önceki resimi kıyaslayarak debug işlemi sırasındaki görüntüleri karşılaştırabilirsiniz.

Bu görüntünün sağlabilmesi için yapmamız gereken Report nesnemizin debug işlemi sırasında görünmesini isteyeceğimiz şekilde bir proxy class'ını hazırlamak.

[DebuggerTypeProxy(typeof(ReportDebuggerProxy))]
    public class Report
    {
        private DateTime _date;
        public DateTime ReportDate
        {
            get { return _date; }
            set { _date = value; }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private List<int> _results = new List<int>();
        public List<int> Results
        {
            get { return _results; }
            set { _results = value; }
        }

        private int _dummy;
        public int Dummy
        {
            get { return _dummy; }
            set { _dummy = value; }
        }

    }

Report nesnemize DebuggerTypeProxy attribute'nün uygulandığı dikkatinizi çekmiştir. Bu atrribute sayesinde Report nesensi debug işlemi sırasında sanki Report türünden bir nesne değil de ReportDebuggerProxy nesnesinin bir görüntüsüymüş gibi karşımıza çıkacaktır. Şimdi proxy görevini görecek sınıfımızı yazalım.

public class ReportDebuggerProxy
    {
        Report _report;
        public ReportDebuggerProxy(Report report)
        {
            _report = report;
        }

        public string ReportDate
        {
            get { return _report.ReportDate.ToLongDateString();}
        }
        public string Name
        {
            get { return "Raport Name : " + _report.Name; }
        }

        public string Results
        {
            get
            {
                StringBuilder sb = new StringBuilder();
                foreach (int result in _report.Results)
                {
                    sb.Append("(");
                    sb.Append(result.ToString());
                    sb.Append(") ");
                }
                return sb.ToString();
            }
        }
    }

Görüldüğü gibi debug sırasında görmek istediğimiz özellikleri belirtiyoruz. Proxy sınıfında dikkat ederseniz Report sınıfındaki Dummy özelliğine yer verilmemiş ve diğer özellikler ise görülmek istendiği şekilde özelleştirilmiş.

 


 
Categories: .NET | C# | Inceleme

September 11, 2007
@ 01:10 AM

Tools->Options dan çıkan pencerede Environment->Start Up'ı şeçiyoruz,bu kısımdaki At startup seçeneklerinden show empty environment i seçerek açılışta VS.NET 2005'i yavaşlatan Start Up Page'i kaldırabiliyoruz.

Diğer tercihimiz de açılışta karşımıza çıkan splash screen'i kaldırmak. Bunun için de VS.NET 2005 için masa üstünüzde bir kısayol oluşturun.Sağ tıklayıp properties dediğimizde açılan pencereden Shortcut Tab'ını seçip, Target kısmındaki bölüme /nosplash parametresini ekleyerek biraz olsun VS.NET 2005'in açılışını hızlandırabiliriz.


 
Categories: .NET | Inceleme

September 3, 2007
@ 10:06 PM
Ctrl+F ile VS.NET 2005'de gelişmiş şekilde arama işlemleri yapabiliyoruz. Bir başka arama şekli de şöyle (Incremental Search demiş MS)

Ctrl + I tuş kombinasyonunu uyguluyoruz açık bir kod penceresinde. Ikon değiştikten sonra (dürbün ve aşağı ok şeklinde bir ikon beriliyor) sonra aramak istediğimiz kelimeyi yazıyoruz. O ana kadar yazdığımız kelime ile eşleşen bir kelime bulunduğunda şeçili hale getiriliyor.( Firefox kullananlar için yabancı gelmeyecektir bu arama şekli ;) ) Tekrar Ctrl + I ya bastığımızda bir sonraki eşleşen bulunur. ESC ile aramdan çıkılır, Ctrl + Shift + I ile de bir önceki bulunana gidilir.




Ha unutmadan editörde belirli bir alanı seçmek istiyorsanız da Alt tuşuna basarak seçim işlemini gerçekleştirin.



 
Categories: .NET | Inceleme

August 22, 2007
@ 08:52 AM

Sevgili mesai arkadaşım Alper ASMA, 27 Ağustos Pazartesi günü 14:30 - 16:00 saatleri arasında BT Akademi'de ücretsiz WCF semineri verecek. Hem konunun önemli olması hem de bu kadar deneyimli birisinin semineri veriyor olması, seminerin kaçırılmasını olanaksız kılıyor.


 
Categories: .NET | Inceleme

July 22, 2007
@ 02:45 AM
Bir mail ile gelen soru üzerine verdiğim cevabımı buraya da yazayım dedim. Az çok - istesek de istemesek de - asp.net uygulamarında javascript kodları ile haşır neşir oluyoruz.
Şimdi çok basit bir örnek ile giriş yapalım. Bir aspx sayfası bir button ve bir textbox. Button'a tıklağımızda textbox'a birşey yazsın istiyoruz.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('txt');
txt.value = "BT Akademi";
}

</script>
</head>
<body>
<form id="form1" runat="server">
<input id="Button1" type="button" value="button" onclick="Yaz()" />
<asp:TextBox ID="txt" runat="server"></asp:TextBox>
</form>
</body>
</html>

Görüldüğü gibi zor bir tarafı yok daha önce ilgilenenler için. getElementById javascript fonksiyonuna butona tıklandığında içerisine "BT Akademi" yazmasını istediğimiz kontrolümüzün ( dikkat edin bu kontrol asp.net webserver kontrolü) ID'sini veriyoruz.Şimdi ise aynı olayı bir User Control içersinde gerçekleştirelim. Öncelikle çok basit bir user kontrol oluşturacağız ve bunu asp.net sayfamıza ekleyeceğiz. Bakalım neler oluyor.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucTest.ascx.cs" Inherits="ucTest" %>
<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('ucTxt');
txt.value = "BT Akademi";
}

</script>

<asp:TextBox ID="ucTxt" runat="server"></asp:TextBox>
<br />
<input id="ucBtn" type="button" value="Uc Tıkla" onclick="Yaz()" />

Dikkat ediniz. Yukardaki kodlar ucTest isimli user kontrolümüzün kodlarıdır.Bu user kontrolü asp.net sayfasına ekleyip sayfamızı çalıştırdığımızda hata alacağız. Nedeni ise: Javascipt kodumuza baktığımızda direk ucTxt yazdığımızı fark edeceksiniz. Bu user kontrol render edildiğinde html çıktısına bakacak olursak bizim ucTxt Textbox kontrolümüzün adının "UcTest1_ucTxt" şekline dönüştürüldüğünü yani ,ilk olarak user kontrolünün adı (UcTest1) , araya "_" eklenmiş ve sonra da  kontrolün adı (ucTxt) eklenmiştir. Oysaki biz javascript kodunda kontrolümüzün adını "ucTxt" olarak belirtmiştik. Şimdi hatamızın kaynağını bulduk. Çözüm :

1- javascipt kodunu bu bilgiler ışığında şu şekilde güncelleyebiliriz.

var txt = document.getElementById('UcTest1_ucTxt');

Pek iyi bir fikir değil gibi. Çözüm müdür? Evet. Ama kontrolümüzün ismi değiştiğinde gidip js kodları ile de oynamak gerekiyor.

2- En iyisi biz bu oluşacak yeni ismi küçük bir kod ile asp.net ten alalım ve js kodumuz ile bir daha hiç uğraşmayalım...user kontrol eklendiğinde
ilgili kontrolün ismini hiç düşünmeyelim ve kendisinden alalım. İşte asp.net webserver kontrolümüzün ClientID özelliği sayfa render edildikten sonra kontrolün clientdaki id sini bize verecektir.Son olarak js kodunu aşağıdaki gibi değiştirirsek sorun hallolacaktır.

<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('<%=ucTxt.ClientID %>');
txt.value = "BT Akademi";
}
</script>


Örnek uygulamayı indirebilirsiniz WebSite4.zip (2,34 KB)

 
Categories: Asp.net | Code | Inceleme

Bitmiyor...Bitmiyor... gelişmeler bitmiyor. İşte bitanesi daha. Web uygulamaları geliştirenler için istemciler ile data arasında URI tabanlı iletişim kuran kütüphane.

Efendim hadise şuymuş ; Silverlight ( güzel bir açıklama için bu linke bir gözatın), Flash gibi araçlar ile istemci tarafında etkili arayüzler sağlayabiliyormuşuz.Ama bu arayüzler ile datalara erişlemiyormuşuz. Ajax gibi teknolojiler ile erişiyormuşuz da işte render idi şuydu buydu tam istediğimiz olmuyormuş. Napacakmışız özel URI'ler ile data tarafına istekde bulunarak XML dosyaları şeklinde dataları alıp client tarafında işleri halledecekmişiz. Misal;

http://myserver/data.svc/Customers dediğimiz de Northwind deki Customers dataları gelecekmiş.. Yok ben where ile şart koşmak istiyorum derseniz http://myserver/data.svc/Customers[ALFKI] diyecekmişiz. Olmadı kardeşim Orders ile de bir ilişki kurmak lazım diyorsanız http://myserver/data.svc/Customers[ALFKI]/Orders buyrun :) Yetmedi mi ? http://myserver/data.svc/Customers[ALFKI]/Orders[Active eq true] işte bi tane daha... Hoppala nerde bunun order by'ı diyenler için http://myserver/data.svc/Customers[ALFKI]/Orders[Active eq true]?$orderby=OrderDate işte bir imkan daha... Bunların yanında da sayfalama yapmak isteyenler için bedava olarak şu şekilde bir URI mevcut : http://myserver/data.svc/Customers?$skip=30&$take=10 

http://myserver/data.svc/Customers[ALFKI] gibi  sorgu sonucunda da aşağıdaki gibi XML sonucları elde ediliyor.

<DataService xml:base="http://myserver/data.svc">

 <Customers>

  <Customer uri="Customers[ALFKI]">

   <CustomerID>ALFKI</CustomerID>

   <CompanyName>Alfreds Futterkiste</CompanyName>

   <ContactName>Maria Anders</ContactName>

   <ContactTitle>Sales Representative</ContactTitle>

   <Address>Obere Str. 57</Address>

   <City>Berlin</City>

   <Region />

   <PostalCode>12209</PostalCode>

   <Country>Germany</Country>

   <Phone>030-0074321</Phone>

   <Fax>030-0076545</Fax>

   <Orders href="Customers[ALFKI]/Orders" />

  </Customer>

 </Customers>
</DataService>

Henüz CTP aşamasında olan bu proje hakkında detaylı bilgiyi burdaki linkten edinebilirsiniz.

 


 
Categories: .NET | Asp.net | Inceleme

Sevgili Sefer Algan'ın blogunda şu yazıyı okuduğumda baya bir gülmüştüm. Sayın Gürkan Yeniçeri bizim senseyi mimlemiş. Böylece Sefer Hocam, Gürkan Bey'in blogunu eleştirmekle yükümlü hale geliyor moda kuralınca:) Kimse alınmasın güncenmesin de ben mimleyemem kimseyi. Blog'u ben yazmadım,tasarımını da ben yapmadım - ha temayı ben seçtim, eleştirilmeye açık :p -  bilindik dasBlog işte. Ha içerik bakımından eleştirilirsem zaten yorumlar kısmının kapısı herkese açık :)) Sevgili Caner'in de beni mimlediğini şurdaki yorumundan öğrendim. Eh davate icabet etmemek ayıp olur dedim :

1- Sevgili Caner'cim, Blog'un gayet güzel ve kullanışlı.  Amma velakin  nedir şu Türkçe karekter problemin. Girdilerindeki konu başlıklarında,üstteki tablarda - eğer benim browserlarımın dil probleminden kaynaklanmıyorsa - ı-i karmaşası bariz göze batıyor.
2- Sen de sonunda benim gibi birçok blog denemenden sonra bir blogda karar vermiş gibi görünüyorsun. Amma yahu o tema renklerini sen mi seçtin? nasıl renkler öyle ciyak ciyak! bağırıyorlar. Yok sen mühendis adamsın. UI, renkler, göz, ışık, gözü yormadan yazı okuma gibi konuları neden dikkate almadın ? Hele bir pembe var ki, bence bir şekilde girenin erkek olduğunu anla ve pembe temanı o kullanıcıdan bir şekilde sakla. İnsan hakkında yanlış düşüncelere varabilir.
3- Çoklu dil hizmeti vermen gayet şık olmuş. En kısa zamanda diğer dillerdeki yazılarını da artırmalısın. Sönük kalmış Türkçe yazılarının yanında.
4- Kategoriler kısmındaki .NET kategorisi dikkatimi çekti de. Yahu bir başlık altında mı toplayacaksın koskoca .Net dünyasını. Bence detaylandırmalısın.Ayrıca kategorilerdeki girdi sayıların yok. Mesela ben kaç tane .Net ile ilgili yazın var nasıl öğreneceğim ? Saydırma millete :)
5- En kısa zamanda bir takvim bekliyorum bloguna. Sormadan edemedim de o Devamı butonu ne işe yarıyor? :))))
6- İçerik bakımından da gayet güzel olduğunu düşünüyorum. Daha fazla deneyimlerini paylaşacağını biliyorum.

diye yazdım. Söyleyenin bir yüzü kara kodlamayanın bloguna TürkTelekom erişim yasağı koysun diyorum.




 
Categories: Inceleme

BT Akademi'nin değerli eğitmenlerinden Özcan Değirmenci'nin BT Akademi'de verdiği WinForm 2.0 Akademideki örnekleri incelerken  bol bol  StructLayout  attribute'leri ile  karşılaşıyorum . Malum  Windows API seviyesinde kod  yazmayan  geliştiricilerin pek ihtiyaç duymadığı hatta birçoğunun haberi dahi olmadığı ama kontrol geliştiren, ciddi manada detaylı windows uygulamaları geliştirenlerin - örneğin .NET Framework'ün desteklemediği sistem fonksiyonlarının kullanıldığı - sıklıkla kullandığı bu attrribute sayesinde class'ların yada structların - kısaca Type'ların - memory'de istenilen şekilde yerleşmesini sağlayabiliyoruz.

Herhangi bir Type bildirimi yapıldığında CLR performans sağlanması adına bu Type'ın üye elemanlarının memory'deki yerleşim düzenini kendisi ayarlamaktadır. Bu şekilde hem daha az memory kullanımı optimize ediyor hem de ilgili Type'ın üye elemanlarına erişim hızının artırılmasını sağlıyor. Fakat bazı Windows API fonksiyonları bizden parametre olarak özel bir şekilde memory'de  dizilmiş struct isteyebiliyor. Bu durumda memory'deki dizilimini CLR'nin değil de bizim yapmamız gerekiyor. İşte burda StructLayout attribute'ü tüm ihtiyacımızı karşılıyor. LayoutKind numaralandırıcısını (Enumeration) kullanarak dizilimi kendimiz beliryebiliyoruz.

Not : Struct tanımladığınızda otomatik olarak bu özellik Sequential'dir. Ama bu attribute'ü bir class için kullanmak isterseniz mutlaka LayoutKind.Sequential numaralandırıcısını kullanmalısınız.

Auto : CLR'nin yaptığı gibi
Sequential : Sıralı bir şekilde aynen bildirimdeki sıraya göre
Explicit : Biz nasıl istiyorsak öyle.

[StructLayout(LayoutKind.Sequential)]
public struct Coord
{
     int x;
     int y;
}

gibi..Eğer bu dizilimin bizim isteğimize göre olmasını istersek de LayoutKind.Explicit numaralandırıcısını aşağıdaki gibi kullanmalıyız.

[StructLayout(LayoutKind.Explicit)]
struct Coord
{
     [FieldOffset(0)]
     public int x;
     [FieldOffset(4)]
     public int y;
}

Üye elemanlarına FieldOffset attribute'ünün uygulandığını görüyoruz. Bu sayede memory'de hangi elemanın hangi offsetten -kaçıncı byte'dan - itibaren yerleşeceğine karar  verebiliyoruz. Yukardaki örnekte yapımızın 0. byte'ından itibaren x'in yerleşeceğini, 4.byte'dan itibaren de - sizeof(int) de kullanabilirsiniz. int'in büyüklüğü kadar memoryde ilerlemek için - y'nin yerleştirileceğini belirtebiliyoruz. Bu özellik sayesinde aslında çok az memory kullanarak struct yapımızın içinde çok sayıda üye eleman tanımlayabiliriz. Yapmamız gereken tekşey tüm üye elemanlarımızın 0. offsetten itibaren memory'ye yerleşmelerini sağlamak.

[StructLayout(LayoutKind.Explicit)]
struct Coord
{
    [FieldOffset(0)]
    public int x;
    [FieldOffset(0)]
    public int y;
    [FieldOffset(0)]
    public long z;
}

---- x
---- y
---- ---- z
Bu sayede 8 byte'lık bir alanda 2 int bir de long türünden değişken saklayabiliyoruz ;) C 'deki union yapısına baya bir benzedi değil mi? Ha dersiniz ki ben gittim z ye 12 değerini atadım sonra gittim x'e 22 değerini atadım z'nin değeri şimdi ne oldu ? Bilmem ne oldu ? :) Aşağıdaki kodu biraz kurcalamakda fayda var.

public class Test
{
     static void Main(string[] args)
     {
         Coord c = new Coord();
         c.z = 2000000000;
         c.x = 20;
         Console.WriteLine(c.z);
     }
}

[StructLayout(LayoutKind.Explicit)]
struct Coord
{
     [FieldOffset(0)]
     public int x;
     [FieldOffset(0)]
     public int y;
     [FieldOffset(0)]
     public long z;
}



 
Categories: .NET | C# | Code | Inceleme

March 22, 2007
@ 04:27 PM
Yeni günlükten merhaba. En kısa zamanda içeriği yükleyeceğim.
Bu mecaramın da kısa bir öyüküsünü dasBlog'u beğenenler ve kullanmak isteyenler için yazacağım.


 
Categories: Inceleme

Sevgili dostum Sefer Algan, Amerika dönüşü getirdiği hediyeler ile resmen beni mest etmiş bulunuyor. Kendisine burdan bir kez daha teşekkür ediyorum. Tam da mouse'umun ömrü tükenmişken hediyeler içinde ferrari görünümlü mouse'yi görünce gözlerim fal taşı gibi açıldı. Efendim bu mouse cidden harika birşey. Laptopumda Bluetooth özelliğinin olmaması - Cep telefonu ile Laptop arasında resim vs. alıp verme için - biraz sıkıntıya sokuyordu. Ama bu mouse'u demek için takıp sürücülerini kurduğumda Bluetooth iconu belirince şaşırdım kaldım. Meğersem kendisi aynı zamanda bir Bluetooth aygıtı imiş. En güzel özelliklerinden birisi de derslerde ve seminerlerde işimi kolaylaştıracak olan sunumları yönetebilme özelliği. Powerpoint'i altta tuşları ile çok rahat (ileri, geri, ekran karatması, tam ekran özelliği, kırmızı lazeri) yönetebiliyor olmam. Ve o kadar güzel tasarlanmışki tuşlar ve tekerlek elimin altında resmen kayıyıor :) Diğer USB üzerinden çalışan mouse'lara göre çok rahat kullanımı var ve çok az hareket ile ekranda fır fır dolaşabiliyorum - ilk başlarda ekrandaki cursor'ü kontrol etmek için baya zorlandım -



Detaylı incelemeyi burdan yapabilirsiniz.


 
Categories: Inceleme

February 23, 2007
@ 10:14 PM

Buyrun burdan yakın.Detaylarını da burdan inceleyebilirsiniz.



 
Categories: Inceleme

February 9, 2007
@ 04:12 AM

En son öğrencilerimiz ile kurs sonrası tekrar buluşup sohbet esnasında  "neden ms sql de mySql'deki LIMIT gibi birşey yok.. olması lazım" içerikli konuşmaya kulak kabartmıştım. Tabi bilenler hemen MsSQL 2005 de bu iş için ROW_NUMBER anahtar kelimesinin geldiğini bunla paging - sayfalama - yapılabildiğini söylediler. Ama birçok kişinin hala benzer problemler yaşadığını görüp işitiyoruz. Projemiz hala MsSql 2000 üzerinde ise ne yapabiliriz ? Tabi gecici tablolardan tutun da SP ler yazarak değişik çözümler üretmek mümküm. Ama bir yöntem var ki cidden çok tatlı ve zekice.


Diyelim ki her sayfada 50 eleman göstermek istiyorsunuz. Buna PS dielim ki bu herzaman sabit kalacaktır.Sürekli değişen ise kaçıncı PS den itibaren PS kadar kayıt alacağınız. Buna da OS dersek;


Select Top PS * from TblHede where tblHede.ID not in ( select TOP OS TblHede.ID from TblHede)   gibi bir sorgu işimizi görecektir.



Eğer ilk PS kaydi almak istiyorsak OS = 0, ikinci PS i almak istiyorsak OS = PS * 2 şeklinde ... OS = PS *n şeklinde OS'a değerler vererek sayfalama yaptırabiliriz.(PS in 50 olduğunu düşünürsek, OS ; 0, 50, 100... şeklinde artacaktır)

içerdeki sorgu (select top os ....) bir imleç olarak ya da indeks olarak düşünürsek, OS = 50 dediğimizde; tblHede tablosundaki ilk 50 kayıt dışındaki - not in  sayesinde - kayıtlardan ilk 50 kayıtı al demiş oluyoruz. OS  = 100 dediğimizde de tblHede tablosundaki ilk 100 kayıt dışında kalan kayıtlardan ilk 50 tanesini getir demiş oluruz ki burda PS'in değişmediğine değişenin OS olduğuna dikkat etmemiz gerekir.



Büyük datalarda ne kadar efektif sonuç üretir tartışılır :)


 
Categories: Inceleme

January 28, 2007
@ 02:52 PM

Office 2007 ile birlikte gelen OneNote'u inceledikten sonra Notepad'e veda etme zamanı - tüm notlarımı notepad kullanarak saklardım - geldiğinin farkına vardım. Sağı solu kurcalarken Notepad de bug olduğuna dair bazı yazılara rastladım. Kısa bir araştırmadan sonra birkaç video ve blog yazılarına rastladım. Bir an bunların süpriz yumurta olduğunu düşünsem de  - yahu notepad işte, derslerde biz onun MDI halini öğrencilerle birlikte geliştiriyoruz. Nasıl bug olabilir ki ? - içimden "Microsoft, her zamanki işleri" diyerek bunun gerçekten bir bug olduğuna kanaat getirdim. Sorun ASCII Unicode karşmaşası.


Hafif.org daki ilgili yazı. Gayet güzel açıklıyor olanı biteni. Bu videodan da izleyebilirsiniz.


 


 
Categories: Inceleme

January 27, 2007
@ 02:32 AM

Her .NET uygulama geliştiricisinin olmazsa olmazı - gerçi eğitimlerde notepad ve csc.exe ile neler yapılabilineceğini gösteriyoruz - VS.NET 2005'in özelliklerini ve uygulama geliştirirken - kah debug özellikleri, kah intellicence, kah refactoring - sağladığı kolaylıkları düşünüyorum. Bir yandan da bu kadar gelişmiş editörler ile uygulama geliştirmenin programlamaya yeni başlayanlar için iyi olmadığını kod yazmayı körelttiğini ( bazen ToString() metodunda S büyük müydü küçük müydü diye sorgulayanları görüyorum - okuruz.


Hah şimdi dedikodu başlıyor. Efendim bazı haber gruplarında ya da mail gruplarında Java camiasından arkadaşların, java dünyasına yeni girmiş mühendislerin "neden java tarafında VS.NET 2005 gibi bir editör yok" sorularına "boş verin o dandik editörü",  "java ile uygulama geliştirener bu tarz editörler ile uygulama geliştirmeyi pek sevmezler"," bizim tarzımız değil o şekilde uygulama geliştirmek" gibi cevaplarını okuduğumda hem gülüyorum hem de üzülüyorum.


İş editörde olsa idi... neyse efendim işte böyle...İnsanın "sizin de böyle bir editörünüz olsun.Kullanmayın. Ondan sonra bu sözleri söyleyin yahu!" diyesi geliyor.


     


 
Categories: Inceleme

Evet başlık biraz garip değil mi? Mesela ben C#nedir?com a girdim. Baktım tasarımı şöyle olsa nasıl olurdu dediniz. Napardınız ?


Ben olsam çok uğraşmam aşağıdaki kodu herhangi bir site açıkken ie' de adres çubuğuna yazıp enter'a basardım.Saol google!


javascript:document.body.contentEditable='true'; document.designMode='on'; void 0



ve artık sayfa internet explorerda design modunda karşınızda. Editleyin sayfayı!!!.


Not : Birkaç arkadaşıma yaptığım pis şakadan dolayı özür diliyorum burdan.Ehehe ;)


 
Categories: Inceleme

November 30, 2006
@ 12:00 AM

Televizyonda "Her eve hızlı Internet" reklamlarının haldır haldır yayınlandığı şu günlerde, bir haberi okurken gördüğüm durum biraz şaşırttı beni. Acaba bizler interneti hangi amaçlar için kullanıyoruz. İlgi alanlarımız neler ? Acaba genel eğilimlerden hangi nedenler için interneti kullandığımıza dair bir fikir edinebilir miyiz?


Şu haberi okurken yan tarafda "Haftanın Ençok Okunanları" diye bir bölüm dikkatimi çekti. Durum vahim!. Yok eleştiriden ziyada merak ? Acaba diğer ülkelerde de durum böylemi ?


 



 
Categories: Inceleme

November 2, 2006
@ 12:00 AM

Sürekli medyanın yanlı tutumundan birilerinin sesi olduğundan, bağımsız olmadığından bahsederiz. Kimilerine de geyik gelir o ayrı mevzu.


Gerçekten de medya bağımsız mı? Gerçekten de tarafsız mı? Daha doğrusu yansız olması doğru mu değil mi? Bağımsız olması su götürmez bir gerçek.Ama  bir duruşu olmalı, fikri olmalı. Ama yönlendirilmesi asla kabullenecek bir tutum değildir.Tamam satılık kalemlerin olduğunu senelerdir duyarız okuruz, para karşılığı haberlerin yer aldığı "devasa"? gazetelerimizin, ihaleler öncesi ihaleye girenlerin yine "devasa"? gazetelerimizin manşetlerinden inmediğini - son zamanlarda YIMPAŞ ile ilgili haberler adı başını gidiyor. Hükümete bu konuda indirmeler, bindirmeler yapılıyor. Amaç? tabi ki kokusu çıkar yakında. Vardır yine bir bildikleri "devasa"? medyamızın - gerçekten  gazeteleri takip eden okuyucular! bilirler. Ya da medya patronları arası dizi savaşları sırasında TV kanallarının ana haber bültenlerinde dahi "şu dizi böyledir kötüdür zararlıdır"  haberlerini izledikten birkaç hafta sonra aynı kanalda o kötü, zararlı, izlenmemesi gereken dizinin yer aldığını gördüğümüz de oldu bu medyamızda.. Yazmakla biter mi bu temiz?, bağımsız?, öngörülü?, halkın çıkarlarını düşünen büyük medyamızın? yediği ..........


Efendim köşe yazımız bu. Başlık da gayet ilginç "Patronum yerine ben konuşuyorum".. Nasıl yani ilk defa mı oldu bu!!! Sadece patronunun adına mı konuştun şimdiye kadar diye sorası geliyor insanın.

Yazıda başlık kadar ilginç bir cümle daha:


...

"Bunun üzerine patronum Aydın Doğan’ı arayıp, "Ne diyorsunuz" dedim.

"Gazeteyi yapan ben değilim, sizlersiniz. Sizler ne düşündüğünüzü anlatın" dedi

...


Süper cevap. Hatta şöyle de demiş midir diye merak ettim doğrusu : "yahu öztürk işini ben mi yapacağım senin, sana boşuna mı maaş veriyoruz senelerdir? bir kere de kendin bişiler yaz da okusun millet"...


Evet... Bir köşe yazısı yazmadan önce bağımsız bir medya yöneticisi patronunu arıyor düşüncelerini soruyor... Maşallah efendim maşallah... Allah herkese böyle bir çalışan nasip eylesin!!!


Haa ben de ekleyeyim de sonradan laf söz olmasın : "Kesinlikle "medyanın? üzerine gitmek, onu güç duruma sokmak" gibi bir art niyetim yoktur ve olamaz."


İlginç bir haber daha.


 
Categories: Inceleme

October 23, 2006
@ 12:00 AM

Efendim yenilikleri takip edelim diye google ile birlikte sağa sola bakıyordum ki XAML yazıp kaza eseri "türkçe sayfalar" seçeneğini tıkladığımda "güzide" bir XAML içerikli sitenin ana sayfasında aşağıdaki hata mesajlarını görünce çok şaşırdım.



Warning: mysql_pconnect(): Can't connect to MySQL server on 'localhost' (10061) in C:\Domains\xxxx.com\wwwroot\Connections\xaml.php on line 9

Fatal error: Can't connect to MySQL server on 'localhost' (10061) in C:\Domains\xxxx.com\wwwroot\Connections\xaml.php on line 9


Söylenecek o kadar çok şey varki. Ne ben yorulayım ne de siz.




 
Categories: Inceleme

October 16, 2006
@ 12:00 AM
Burdaki 90 saniyelik flash animasyonu gayet güzel açıklıyor.
 
Categories: Inceleme

October 12, 2006
@ 12:00 AM

Siz buna siyaset deyin, oyun deyin ne derseniz deyin..


Bu GERI'liktir. Bu acizliktir. Bu Türkiye'nin meclisine hakarette bulunan, küçümseyen, avrupa .ıç yalayıcıları için ne ifade ediyor merak ediyorum ama benim için satılmış, özgüvensiz,bağımlı ,aşağılık bir Fransız meclisinden başka birşey ifade etmiyor.


Hadi biraz daha avrupalı olun, biraz daha onlara benzeyin... Bakın yalanacak GERI beyinli .ıçlarınız artıyor.


Burdan o insan kılıklı mahlukatlara en kallavi kötü sözleri listelemek yerine tek diyebileceğim ; Alayınız GERI'siniz. Beyinleriniz de ahlak ve insanlığınız gibi GERI.


Evet avrupa özentisi .ıç yalayıcılar.. Buyrun sahne sizde.


Nobel de alındı. Aman aman ne tesadüf değil mi ?


 
Categories: Inceleme

Şuradaki linkde geleceğin laptopları ile ilgili bir izlenim edinebiliriz. Yok yine çekik gözlü birisi ya yanarım da ona yanarım.


Ha bu arada çekik gözlülerin bu küçük şeylere merakı nerden geliyor acaba? Yok küçük olsun, kompakt olsun... nedir yani tüm dünyaya küçük iyidir mi demek istiyorlar? Nedir bu küçüklük saplantıları acaba ;)


 
Categories: Inceleme

September 27, 2006
@ 12:00 AM

Dün Google Toolbar 4.0 'ı kurdum. İncelerken kişisel buttonlar özelliğinin olduğunu yani istersem toolbarda yer alacak butonlarımı hazırlayabileceğimi keşfettim.Biraz tırtıklama ve incelemeden sonra kendim için de bir buton hazırladım..Şimdilik test amaçlı hazırladığım butonu şurdan toolbarınıza ekleyebilirsiniz.


Bu arada Google 8. doğum gününü kutluyor. Eh ne diyelim nice yıllara hep beraber diyor tebrik ediyoruz.


iyiki doğdun google
 
Categories: Inceleme

September 25, 2006
@ 12:00 AM

İğne battı Canımı yaktı Tombul kuş Arabaya koş Arabanın tekeri İstanbul'un şekeri Hop Hop altın top Bundan başka oyun yok


İğ-ne bat-tı Ca-nı-mı yak-tı Tom-bul kuş A-ra-ba-ya koş A-ra-ba-nın te-ke-ri İs-tan-bul-'un şe-ke-ri Hop Hop al-tın top Bun-dan baş-ka o-yun yok


Şurdan


 
Categories: Inceleme

September 18, 2006
@ 12:00 AM

Sağa sola bakarken şöyle bir ankete rastladım. Sizin de ilginizi çekeceğini düşündüm...Çok .NET değil mi?












Sizce Dünya da en çok tercih edilen yazilim dili hangisidir?



















 
Categories: Inceleme

August 12, 2006
@ 12:00 AM

Fibonacci serisini az çok matematik ile haşır neşir olanlarımız bilir. 1,1, 2, 3, 5, 8, 13, 21, 34, 55, 144 ... diye giden kendisinden 1 ve 2 önceki sayıların toplamı kendisini veren yani 3. sayıyı bulmak için kendisinden önceki iki sayının toplamından oluşan dizidir.


f(x) = f(x - 1) + f(x - 2)
f(1) = 1
f(2) = 2
2 < x < sonsuz

İlk bakışta pek de önemsiz gayet basit bir mantığı olan dizi gibi duruyor değil mi? Oysa pek de öyle değil. Bir de görmek için şu linkleri inceleyebilirsiniz. Linklere sırası ile baktığınızda (1,2,3,4,5,6,7) (google image da fibonacci )aslında doğada karşımızda duran bir dizi.
Daha da önemlisi bu sayıların oranı sozsuza giderken altın oranı vermektedir. Altın oran insan gözüne ne güzel gelen orandır. Da Vinci nin birçok eserinde, eski romalıların tarihi yapılarında, doğada göze güzel gelen birçok çiçekte bu orana ( 1.618..  )rastlanmaktadır.
Peki gelelim monitörlerimizin çözünürlüğüne. En çok kullanılan çözünürlükler 1024/768 = 1.33333.. 1280/800 =1.6 1680/1050=1.6 ... Eğer bu çözünürlükteki ekranlara bakma fırsatınız olursa bir kıyaslayın derim. Acaba hangisi gözünüze güzel görünecek. Yoksa altın orana yakın olan mı?
Programlarımızın kullanıcı arayüzünü (HID) bu oranlara göre düzenlesek nasıl görünür acaba? Web sitelerini tasarlarken kullanıcının gözüne sokmak istediğimiz önemli bir öğeyi acaba bu oranı uygulayarak sayfadaki yerini hesaplayıp oraya koysak daha mı dikkat çekici olurdu?


Pardon PI isimli filmi izlemiş miydiniz?


 
Categories: Inceleme

August 2, 2006
@ 12:00 AM

İşletim sisteminin tanımını hatırlayın? Bilgisayarın kaynaklarını yönetir ve bu sayede uygulamalar çalışır. İnsanlar işletim sistemlerine değil, işletim sisteminin çalıştırabildiği uygulamalara dikkat ederler. Kelime İşlemcileri. Anında Mesajlaşma Programları. Eposta. Paris Hilton resimlerine sahip web siteleri. Tek başına, işletim sistemleri işe yarar değildir. İnsanlar, işe yarar uygulamaları çalıştırmak için işletim sistemlerini alırlar.Ve işte bu yüzden, en işe yarar işletim sistemi en fazla sayıda işe yarar uygulama çalıştırabilendir.


Bunun mantıksal sonucu olarak, eğer işletim sistemi satmak istiyorsanız, yapmanız gereken en önemli şey yazılımcıların sizin işletim sisteminiz için yazılım geliştirmelerini sağlamaktır. Steve Ballmer'ın sahnede zıplayarak "Yazılımcılar, yazılımcılar, yazılımcılar, yazılımcılar" diye bağırmasının da sebebi budur. Bu Microsoft için o kadar önemlidir ki, yazılım geliştirme araçlarını Windows'un yanında açık açık vermiyorlarsa eğer, bunun tek sebebi ters bir tepki yaratarak yazılım geliştirme aracı üreticilerine(tabii, hala kaldıysa) giden oksijeni kesmemektir, çünkü kendi platformlarında çalışan değişik yazılım geliştirme araçlarının olması yazılımcılar için son derece caziptir. Fakat, gerçekte ise Microsoft bu araçları bedavaya vermek istemektedir. Empower ISV(Bağımsız Yazılım Üreticilerini Güçlendirme) programlarında, beş adet tam sürüm MSDN Universal(başka bir deyişle Flight Simulator dışındaki tüm Microsoft ürünleri) paketini sadece 375$'a alabilirsiniz. .NET dilleri'nin komut satırı derleyicileri ücretsiz .NET çalışma birimine dahildir... üstelik de bedava olarak. Aynı zamanda, C++ derleyicileri de ücretsizdir. Borland gibi şirketleri tamamen ortadan kaldırmadan, yazılımcıları .NET platformunda yazılım geliştirmeleri için, gereken her konuda teşvik etmektedir.


....


devamı burda.


 
Categories: Inceleme

Emek değerlidir. Hele de bu emek bir düşünce ürünü ise çok daha değerlidir. Düşünmek zordur. Düşünceyi uygulamaya dökmek çok daha zordur.


Birşeyleri yapmaya çalışmak ki ne olduğu önemli değil emekdir, değerlidir. Ama ya çalmak. Kibarca buna halk arasında "esinlenmek" deniyor. 
Üyesi olmakdan gurur duyduğum C#nedir?com ekibi ile bir araya geldiğimizde sürekli yeni fikirler üretip bunları uygulamaya dökmek için emek harcarız.
Hele bir de emeklerinizin karşılığını okurlarınızdan bir teşekkür ile geri aldığınızda en mutlu insanlardan biri oluyorsunz. Bu da sizi bir sonraki fikiri hayata geçirmek için sabırsızlandırıyor.


Ama ya emeklerinizin bir şekilde taklit edilmesi ? Artık alıştık diyebilirim. Türkiye'de yazılım sektöründe birçok topluluk var.Yazılım sektörünün her  alanında hemen hemen her konuda bir topluluk bilgilerini paylaşıp sektörü bilgilendirmeye çalışıyor. Ama bunlar arasında C#nedir?com çok ama çok farklı. Nedeni editörlerin kalitesi ve çalışmaları, üretip ürettiklerini paylaşmasından kaynaklanmaktadır. Birçok ilki C#nedir?com hayata geçirmiştir. Gerek .NET Video projesi gerek .NET Radyo projesi gerek geliştirdiği kullanıcıya yönelik yazılımlar Türkiye de hep ilkleri oluşturmuştur.... Ama birçok yerde bu fikirlerimizin çalındığını görüyoruz. Evet çalınması. Neden mi? Ben eğer birşeyi çok beğenip kendim yapmaya kalksam o işin adını değiştirmem, kılıf bulmam, ben yaptım ben buldum demem. Üstelik esinlendiğimi de belirtirim. Fakat  bizim ürettiğimiz uygulamaya döktüğümüz fikirlerimizin bizi takip edenler tarafından beğenilip takdir edildiğini görünce aman şuna bir yeni isim bulalım, şunu şu kılıfa sokalım dedikten sonra "Buyrun biz düşündük biz yaptık. Takdir edin şimdi bizi" derseniz bu esinlenme değil çalmaktır.


Evet, sayın fikir hırsızları! Çalmak yerine biraz olsun fikir üretmek zamanı gelmedi mi? Hadi bekliyorum sizi takip ediyorum bizi taklit ettiğiniz eserlerinizi. Sizden ricam kalitesini artırın. Her ne kadar taklit olsa da fikir C#nedir?com'un. O iğrenç taklitlerinizle fikirlerimizi baltalamayın.


Okurlarımızın bilinçlendiği gerçeğini ne zaman hatırlayacaksınız? Artık gülüyoruz size gülüyoruz. Komik kaçıyorsunuz.


 
Categories: Inceleme

linaks degil işte değil...
dikkat kaynak sahibinden!!!

Dinleyiniz


 
Categories: Inceleme

September 20, 2005
@ 12:00 AM

 
Cok değişti çok!
İyimi oldu dersiniz.
çok şeker oldu çok.
 
Burada tüm değişiklikleri bulabilirsiniz.
 
Destekleyen bir derleyici mi lazımdı?. Buyrunuz.

 

Categories: Inceleme

September 18, 2005
@ 12:00 AM

Efendim Sevgili Burak Şenyurt'un 7 KasIm 2005 tarihinde INETA sponsorluğunda ücretsiz Visual Studio .NET 2005 Semineri var.
Harıl harıl bu seminere hazırlanmakta. Tabiki her başarIlI erkeğin yaptığı gibi o da sıcacık, içi sevgi dolu, mercimek corbası içerek gücüne güç katmakta. Eh herzamanki gibi başarılı bir seminer olacak. Zamanınız olursa kaçırmayın derim.
 
Haberin kaynagi burda


 
Categories: Inceleme