January 30, 2009
@ 03:27 PM

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

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

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

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

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

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


 
Categories: Inceleme | Internet | Yasam

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

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

   


   
 
Categories: .NET | Asp.net | Yasam

January 21, 2009
@ 10:00 AM

 


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

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

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

 

 

 


 
Categories: .NET | Yasam

January 21, 2009
@ 02:26 AM

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


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

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

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

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

 


 
Categories:

January 21, 2009
@ 01:23 AM

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

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

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

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

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

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

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


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

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

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


 
Categories: .NET | C# | Inceleme

Görüşmek üzere ;)


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

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

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

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

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

24 Ocak

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

25 Ocak

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

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

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

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

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


 
Categories: .NET | Yasam

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

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

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

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

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

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

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

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

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

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

 

      

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

 Örnek uygulama :

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