Ahmet Oğuz Koca

Sosyal olaylar.

Kodlog çalışmalarına kaldığımız yerden devam

3 yıl kadar önce projelerde karşılaştığım sorunların çözümlerini paylaşmak üzere açtığım kodlog'a aradan geçen onca zaman sonra tekrar eğilme kararı aldım. Bu kararı almamdaki en büyük etken başka insanlara faydalı olmak için aradığım yollar arasında en kolay ve etkili olanının en fazla uzman olduğum konuda çaba harcayarak çalışmak olduğunu anlamam oldu. 

Bu kapsamda sitedeki aksaklıkları gidererek ve iki yazı seri başlatarak çalışmalara başladım.

İlk fazda da bu yazıları hazırladım

1) Google Chrome ile bildirim gönderme

2) c# uygulamalarında FFmpeg kullanımı

İlerleyen zamanlarda site üzerinde daha fazla içerik paylaşmayı planlıyorum, belirli bir seviyeye getirdikten sonra community üzerinde çalışmaya planlıyorum. Benzer kaygıları olan herkesi içerik paylaşmaya devam ediyorum.



TniyMCE kullanırken script ve link tag'lerini içeriğinize nasıl eklersiniz?

TinyMCE editörünü kullanırken içeriğinize script ve link tag'leri eklemeniz mümkün değil. Bu işlem güvenlik açıklarına sebep olmamak adına kapatılmış durumda. Eğer yönetim panelinde TinyMCE kullanıyorsanız bu etiketlerin kullanılmasına izin verebilrisiniz. Bunun için TinyMCE'yi init ettiğiniz bölüme (general options) şu iki ifadeyi giriniz. Böylelikle script ve link etiketlerini artık girebilirsiniz.

extended_valid_elements : "script[src|type|language]",

extended_valid_elements : "link[href|rel]",

Entity Framework'te Jenerik Repository kullanımı

Bilindiği üzere büyük ölçekli (multi tier/layer) uygulamalarda DRY (don’t repeat yourself/kendini tekrar etmeme) prensibini etkin şekilde kullanarak proje içindeki kod tekrarlarının önüne geçmek çoğu zaman mümkün olamayabiliyor. Özellikle de veri tabanı merkezli (database centric) uygulamalarda farklı entityler (tablo/class) üzerinde işlemler yaparken sık sık kod tekrarları (çoğu zaman where ve orderby sorguları) yapmak durumunda kalabiliyoruz. Bu durumda da proje sonunda elimizde onlarca benzer fonksiyon ve class’tan oluşan yapılar kalabiliyor. Bu da projelerde hem kodlama (harcanan zaman ve emek) hem de bakım (maintenance) maliyetini arttıran bir faktör olarak karşımıza çıkıyor.

Aslında C# dilinin gelişimi sürecinde dile eklenen yeni yöntem ve isim uzaylarını (namespace) etkin şekilde kullanarak bu tekrarların önüne geçmek mümkün. İlk bakışta dilin temel söz diziminin (syntax) ötesine geçmesinden dolayı okunabilirlik konusunda zorlukları olsa da bir kaç alıştırmadan sonra siz de bu yöntemleri öğrenip projelerinize kolaylıkla entegre edebilirsiniz.

Ben de bu yazıda linq ve jenerikler yardımıyla bir repository sınıf oluşturucak ve modelimizdeki tüm entitylerimiz üzerinde başka bir sınıfa ihtiyaç duymadan istediğimiz işlemleri nasıl yapabileceğimizi anlatıyor olacağım. Konuyu oldukça basit tutmak amacıyla iki farklı sınıf (entity) üzerinde duracağız ancak jenerik repository kullanmanın faydalarının farkına projemizdeki entity sayısı arttıkça daha fazla varabiliriz.


Basitleştirilmiş iki entitymiz şu şekilde olsun

Fazlası...

Linq aracılılığıyla basit bir DRY (don't repeat yourself) yöntemi

Programlama dünyasında aynı veya benzer amacı taşıyan kod bloklarının uygulamanızın farklı yerlerinde defalarca yer alması istenen bir durum değildir (don't repeat yourself). Özellikle çok katmanlı uygulamalarda bu problemden kaçınmak malesef oldukça zor olabilmekte. Bugün bir projenin kaynak kodları üzerinde araştırma yaparken programcının bu sorunun üstünden gelmek için güzel bir yöntem izlediğini gördüm ve sizlerle de paylaşmak istedim. Ben burada konuyu mümkün olduğu kadar basit tutmak amacıyla çok küçük bir örnek ile konuyu anlatmaya çalışacağım. 

Şekildeki gibi bir Member Class'imiz olsun

 

Öncelikle DB üzerinde işlem yaptığımız bir Reposiyory class'imiz olsun (örnekte MemberRepository) Class'imiz ile site üyelerimiz arasında isim ve email adreslerini kullanarak arama yapıyoruz.

İlk iki fonksiyonumuzda klasik yöntemle iki ayrı fonksiyon oluşturuyoruz. Bunlardan birincisi ile Nick üzerinden ikincisinde ise email adresi üzerinden ilgili kullanıcının veritabanımızda yer alıp yer almadığını kontrol ediyoruz. Üçüncü fonksiyonumuzda ise Linq expression'lar arayıcılığıyla daha esnek bir GetMember fonksiyonu oluşturuyoruz ve hangi parametre üzerinden arama yapılacağını sınıf örneğini oluşturan client kodumuza bırakıyoruz. Bu sınıf üzerinden işlem yapan istemci kodlarımız ise şöyle

Görüldüğü üzere linq expression ile oluşturduğumuz GetMember fonksiyonumuz sayesinde kod tekrarından kurtulmuş olduk ve uygulamamıza müthiş bir esneklik kattık. Nick ve EMail Adresinin yanında aynı fonksiyon sayesinde Member Class'imizin bir çok fieldi üzerinde arama işlemi yapabileceğimizi de unutmayalım. Ben burda sadece where fonksiyonu üzerinden örnek yaptım ancak tahmin edebileceğiniz üzere order sorgularından group'lama işlemelerine kadar bir çok yerde bu esnekliği siz de kullanabilirsiniz. Görüş ve önerilerinizi yorum olarak bırakabilirsiniz. Kolay kodlamalar...

Asp.Net MVC3'te Recaptcha (güvenlik kodu) kullanımı

Asp.net MVC3 projelerinizde form alanlarınız için güvenlik kodu uygulamasına ihtiyaç duyarsanız, NuGet üzerinden Microsoft-Web-Helpers dağıtımıyla dağıtılan google'ın recaptcha uygulamasını kullanabilirsiniz.

Projenize Recaptcha eklemek için öncelikle Nuget'ten "microsoft-web" araması yapıp resimdeki paketi projemize dahil ediyoruz.

Daha sonra captcha uygulamamıza sayfalarımızdan direkt olarak ulaşabilmek için web.config dosyamıza Microsoft.Web.Helpers namespace'imizi ekliyoruz.


Sadece bir tek formda ihtiyaç duyorsanız ilgili sayfada using ile de referans da verebilirsiniz.

Daha sonra kendimize http://www.google.com/recaptcha üzerinden bir hesap açıyor ve Domain alanına ilgili alanadını girdikten sonra bize sağlanan private ve public key değerlerini projemizde kullanmak üzere saklıyoruz. Formumuzda captcha alanını göstermek için form taglarımızda istediğimiz alana bu kodları giriyoruz.

Form verilerimizi aldığımız Controller'imizde bu kodlarla girilen değeri kontrol ediyoruz

Asp.net MVC ile GooglePlus Api kullanımı

Google bu hafta içinde Google+ (google plus) için API desteğini kısıtlı özelliklerle de olsa açınca bende .net developerlar için basit bir client yazma gereği duydum.  Google'ın API'ye ek özellikler eklemesiyle birlikte paylaştığım kodları geliştirmeyi planlıyorum. Görüş ve önerilerinizi benimle paylaşırsanız kodların geliştirilmesine katkıda bulunabilirsiniz.

Şu an paylaştığım kodlarda Oauth2 ile yetki alıp bu yetkiyi kullanarak basit bir get sorgusu yapıyoruz. Bir çok arkadaşın konuya yabancı olduğunu düşünerek adım adım ilerleyeceğimiz bir yazı hazırladım.

Adım 1. API Başvurusu

Öncelikle Google'ın kendi uygulamaları için sağladığı API'lere erişim için Google Console aracılığıyla bir API projesi başlatıyoruz Link => https://code.google.com/apis/console

 Fazlası...

Asp.net MVC projelerinde ViewModel kullanımı.

 

Asp.net MVC'de Controller sınıflarınızdan view sayfalarınıza istediğiniz nesneleri geçebilmeniz için bir çok yöntem olsada (viewbag, viewdata, entity classları v.s.) kanımca bu imkanların efektif olarak kullanımı neredeyse mümkün değil. Özellikle çalışma zamanı sırasında tip dönüşümü hatalarından ve controller'da bu bilgileri doldurma sırasından oluşan problemlerden (null değer v.s.) dolayı dynamic viewbag yapısı zamanla sadece çile kaynağı haline gelebiliyor. Özellikle unit testing kullanmıyorsanız view tarafında oluşan hataları gidermek proje geliştirme sürecinizin büyük bir bölümünü oluşturabiliyor.

Bütün bu problemlerin üzerinden gelebilmek amacıyla çeşitli tasarım desenlerinden kotarımlar yaparak bir yapı geliştirdim ve bu yapı sayesinde proje geliştirme sürecimi hayli kısaltabildim. Aslen bu yapı endüstri standartlarına çok uygun olmasada özellikle hızlı projeler geliştirmek adına size de bir çok avantaj sağlayabileceğinden sizlerle paylaşmak istedim. Açıklamamı fazla uzatmadan direkt ilgili kodları paylaşıyorum.

 

Öncelikle bütün ViewModel'lerimizi türeteceğimiz bir ViewModel classi oluşturuyoruz. 

http://pastebin.com/ehdsFwtT

 

Bir eticaret sitesi anasayfası yaptığımızı varsayaraktan basit bir AnasayfaViewModel Class'i oluşturuyoruz. 

Class'in içinde view tarafınfa ihtiyaç duyacağımız çeşitli classların liste tipinde örnekleri bulunuyor

http://pastebin.com/vPNFpv1M

 

Controller da ViewModel içinde tanımladığımız listelerimizi dolduruyoruz. 

http://pastebin.com/wD8QXxBT

 

View'imize geçtiğimiz ViewModel class'imiz üzerinden ihtiyaç duyduğumuz işlemleri gerçekleştiriyoruz.

http://pastebin.com/zrp8Jdkk

 

Pastebin üzerinden verdiğim kodlara gerekli açıklama satırlarını ekledim ancak sorularınız olursa bana sosyal medya kanalıyla ulaşabilirsiniz.

twitter.com/aokocax ,friendfeed.com/aokocax

 

 

 

İyi Unit Testlerinin sahip olduğu özellikler

 

Fransız yazılım mühendisi bir arkadaş iyi 'unit test'leri yazmak için izlediği yöntemleri listelemiş, ben de faydalı olacağını düşünerekten paylaşmak istedim

  • Test classları sadece bir tek class'i test eder.
  • Test metodları sadece bir tek metodu test eder.
  • Değişken ve method isimleri açıktır.
  • Test durumlarının okunabilirliği yüksektir.
  • Testler beklenen exceptionları test eder.
  • Testler direkt veritabanı erişimi yapmazlar.
  • Testler direkt network erişimi yapmazlar.
  • Test için kullanılan kodlar kod standartlarına uyar temiz, okunabilir ve anlaşılabilirdir.
  • Testler olası etkileri (side effect), limit değerleri ve null değerleri kontrol eder (bir exception oluşoyor olsa bile)
  • Herhangi bir konfigürasyon yapmadan testler her an çalşabilir durumdadır.
  • Testler compleks yapı ve metodları simüle etme için 'mock' (taklit etme) kullanır.

 

Sql Server LocalDB tanıtımı

 

 
Microsoft bir kaç hafta kadar önce SQL Server Denali CTP3’ün duyurusunu yaptı ve yeni sürümle birlikte Sql Server Express’e developer ihtiyaçları gözetilerek yeni bir ekleme yapıldığını duyurdu. LocalDB olarak adlandırılan bu ekleme ile developerlar geliştirme yaptıkları makinalara bütün bir sql server örneği (instance) yükleme zahmetinden kurtulabilecekler.

Bilindiği gibi Sql Server Express, ücretli Sql Server versiyonlarının çeşitli limitlerle sınırlandırılmış bir versiyonu ancak bu sürüm diğer ücretli versiyonlar ile tamamen uyumlu çalışmakta. Öyleki gerekli lisans anahtarlarıyla bile Sql Server’inizi daha üst versiyonlara taşıyabiliyor ve limitleri kaldırabiliyorsunuz. Bu imkan aynı zamanda developerların geliştirme yaptıkları makinaların sistem kaynaklarını sql server’a ayırma problemi ile birlikte geliyordu. LocalDB ile Microsoft, Sql Server'a API seviyesinde uyumluluk getirerek bu kaynak problemini ortadan kaldırmak adına yeni bir yaklaşım getirmiş oldu.

LocalDB hakkında bazı bilgiler.

1) LocalDB, diğer Sql Server versiyonları gibi sqlsevr.exe’yi kullanmaya devam ediyor. Uygulama Sql Server’da olduğu gibi bütün client side provider’ları ile çalışabilmekte (ado.net,odbc v.s.).

2) Windows Servisi olarak değil Proses(Process) olarak çalışmakta (servis olarakta çalıştırılabiliyor), bağlantının kopması ile birlikte bir kaç dakika içinde kendi kendini kapatmakta.

3) AttachDbFileName Property’si ile veritabanı dosyanızı spesifik bir konuma koyma imkanı sağlıyor.

4) Veritabanı servisleri bulunmamakta.

5) Şu an için LocalDb kurmak için Sql Serrver Expres kurup LocalDb özelliğini seçmelisiniz ancak daha sonra bu zorunluluk daha sonra ortadan kaldırılacak.

Kaynaklar