Arda Çetinkaya Yazılım ve arada kendim ile ilgili saçmaladıklarım…

Erik Meijer‘ın bu seneki Reaktor Dev Day’deki keynote konuşması sabah sabah bayaa şaşırttı beni. Yazılım ile ilgili bir etkinlikte bir keynote konuşması ne kadar ilginç olabilir de şaşırtabilir ki, dimi… Öyle demeyin ama, Erik Meijer olunca ve keynote’u biraz sert olunca, blog yazısı yazacak kadar ilginç bir keynote olabiliyormuş…Öncelikle Erik Meijer’ı bilmeyenler için kısa bir özet; kendisi 2000’lerin başından 2013’e kadar, Microsoft’da yazılım mimarı olarak hatırı sayılır ciddi projeler yaptı. Azure ve .NET tarafında ciddi katkıları olan biri. Bilgisayar bilimi dalında da akademik olarak oldukça başarılı biri diyebilirim. Dolayısıyla yakından takip ettiğim biri…

Keynote’unda Agile ile ilgili söyledikleri oldukça dikkatimi çekti. Ki aslında çoğunlukla Agile ve Agile yöntemler ile ilgili konuştu. Gerçi pek konuştu demek doğru değil, bildiğin giydirdi… “Agile” yaklaşımları yerden yere vurup, duvardan duvara atıyor. Agile ile ilgili söylediklerine kesinlikle katılmasam da, yazılımın, kod yazmanın çok ama çok önemli olduğunun altını çizmesi ve kod yazmaya daha da fazla önem verilmesi gerekliliğini bağıra bağıra söylemesi oldukça hoşuma gitti.

Bu arada videoyu mutlaka izleyin…45 dakika ama oldukça sürükleyici bir gerilim dizisi kıvamında.

“Agile is a cancer that we have to eliminate from the industry”

Agile yani çevik yaklaşımların, yazılım üretkenliğine ve kalitesine, değişen dünya ve ihtiyaçlarına çözüm üretebilmek için çok fazla fayda sağladığına inanıyorum. Yani ortaya çıkan ürünlere, oluşumlara bakıldığında zaten bu gerçekten çok kaçmanın bir anlamı yok. Yazılımın soyut yanının, Agile yaklaşımlar ile somutlaşarak, iletişim kanalları ile anlamlı hale geldiğini düşünüyorum. Agile yaklaşımların en büyük faydası, getirisi “iletişim”. Yazılımcı ya da IT sektörü insanı genellikle asosyal olarak betimlenir. Üretkenlikleri kendi içlerinde oldukça yüksek olmasına rağmen, geleneksel yazılım geliştirme yöntemlerinden dolayı, dış dünyaya fayda sağlama konusunda oldukça yetersiz olduğumuzu söyleyebilirim. Eminim kod yazan herkesin, bilgisayarında bir yerde, yazdığı küçük projeler hala duruyordur. Belki bir çok problemi çözecek, bir sürü işi kolaylaştıracak projeler, kodlar…

Agile kavramı ve Agile metodlar, bu kodların dış dünya ile iletişime geçmesini ve fayda sağlayabilecek şekilde üretkenliklerinin artmasını sağlayan yaklaşımlar. Open Source kod depoları, Scrum, XP ve Kanban gibi anahtar kelimeler bu yaklaşımda iletişim kapılarını açan anahtarlar. Çok haddime olmasada Erik Meijer’ın bu açıdan bakmayı atladığını ve Agile’ı bir “araç” olarak yorumladığını düşünüyorum. Agile’ı bir araç olarak görmek yerine, bir kültür olarak yorumlamak, daha anlamlı kodlar yazmayı sağlayacaktır. Daha anlamlı kodlar da, zaten daha fazla çözüm üretmek için daha fazla kod yazmamızı gerektirecek…Yani umarım… (:

 

 

Uzun bir aradan sonra, şu günlerde sıkça uğraştığım Entity Framework‘ün yeni versiyonuyla gelen bir özellik ile ihmal ettiğim blog’u biraz hareketlendirmek istedim… Uzun süre yazmayınca, insan nasıl giriş yapacağını da bilemiyor. Neyse…Fazla uzatmadan konumuza gelelim.

Entity Framework’ün yeni versiyonu dedim ama 6.x çıkalı sanırım oldu bayaa. Hatta geçen hafta, en son 6.1.2 versiyonu yayınlandı. Entity Framework ilk çıktığında, genişletilebilirliği ve yaratılan sorgulara müdahale edilebilirliği çok konuşulmuştu. 4.x versiyonu ile beraber, çeşitli wrapper’lar ile belli noktalara müdahale etmek mümkün hale geliyordu. Resmi olarak EF ekibi tarafından geliştirilmiş olmasa da, eski o ekipde çalışan kişilerin geliştirdiği ve yayınladığı Provider Wrapper’lar kısmen de olsa çok hayat kurtarmıştı. Kısaca EF kullanan kişilerin, bazı noktalarda ciddi şekilde aralara girip müdahale etme ihtiyacı oluyordu.

Entity Framework 6.x ile built-in gelen “Interception” yaklaşımı bu ihtiyacı gerektiren durumlarda güzel bir çözüm olarak bizlere sunuldu. Interception yaklaşımı ile artık Entity Framework’ün veritabanına gittiği son noktalarda araya girmek ve müdahale etmek mümkün olabiliyor.

IDbCommandInterceptor interface’inden oluşturacağımız sınıfın ilgili metodlarını yazdığımız zaman, tüm “Execution” noktalarında müdahale etmek oldukça kolay.

Neden böyle bir şeye ihtiyacımız olsun ki?

Biraz daha gerçek dünya örneği vermek sanırım netleşmesi adına daha doğru olacaktır. Mesela EF ile yaptığınız sorguları kendi formatınızda istediğiniz yere log’lamak isteyebilirsiniz ya da en çok hangi parametreler ile veritabanına gidildiğini log’layıp, veritabanı tarafında buna göre INDEX çalışması yapabilirsiniz. Ya da sorgulanmaması gereken tablolar var ise bunlara çeşitli kontroller yaparak kısıtlamalar getirebilirsiniz.

Biraz daha net olması için, EF ile uğraşan herkesin ve hatta özellikle SQL Admin’lerin rahatsız olduğu alias ile ilgili bir örnek vermek isterim. Aşağıdaki sorgunun çıktısını eminim herkes tahmin edebilir.

    var result = context.Students.Where(s => s.FirstName== "Arda").FirstOrDefault();

EF sorguları oluştururken, tablolara [Extendx] şeklinde bir alias verip bunlara göre sorguları oluşturmakta bildiğiniz üzere. Mesela [Extendx]’i bu Interception yaklaşımı sayesinde kaldırıp, istediğimiz değer ile değiştirmemiz mümkün.

internal class DatabaseAccessInterceptor : IDbCommandInterceptor
{

        public void NonQueryExecuted(System.Data.Common.DbCommand command,
                                     DbCommandInterceptionContext<int> interceptionContext)
        {

        }

        public void NonQueryExecuting(System.Data.Common.DbCommand command,
                                      DbCommandInterceptionContext<int> interceptionContext)
        {

        }

        public void ReaderExecuted(System.Data.Common.DbCommand command,
                                   DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
        {

        }

        public void ReaderExecuting(System.Data.Common.DbCommand command,
                                    DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
        {
            var alias = new Dictionary<string, string>();
            var commantText = command.CommandText;

            var pattern = @"\[dbo\]\.\[([\w\d]*)\] AS \[(Extent\d*)\]";

            var matches = Regex.Matches(commantText, pattern);

            foreach (Match match in matches)
            {

                if (match.Groups.Count == 3)
                {
                    alias.Add(match.Groups[2].Value, match.Groups[1].Value);
                }
            }

            foreach (var pair in alias)
            {
                command.CommandText = command.CommandText.Replace(String.Format("[{0}]", pair.Key),
                                                                  String.Format("[{0}]", pair.Value));
            }
        }

        public void ScalarExecuted(System.Data.Common.DbCommand command,
                                   DbCommandInterceptionContext<object> interceptionContext)
        {

        }

        public void ScalarExecuting(System.Data.Common.DbCommand command,
                                    DbCommandInterceptionContext<object> interceptionContext)
        {

        }
}
Not: Yukarıdaki kod, tüm extend ifadelerini değiştirmez. Sadece örnek olması adına basitçe yazmak istedim. Genişletip kullanmak ödev olsun…

Yukarıdaki kodda dikkat ederseniz Scalar,Reader,NonQuery gibi ADO.NET’den tanıdık gelen ifadeler var. Bunlar Entity Framework’ün oluşturduğu sorgulara göre araya girebileceğimiz metodları temsil ediyor. Bunların içerisinde istediğimiz işlemleri yapabiliyoruz.

Peki bu yarattığımız sınıfları, EF Context’inde nasıl tanımlıyoruz? Bunun için EF 6.x ile beraber yine oldukça gelişen konfigürasyon özelliklerinden faydalanabiliyoruz. Kod tarafında context sınıfımız içerisinde aşağıdaki gibi bir tanımla, yazmış olduğumuz “Interception”nın kullanılacağını belirtebiliyoruz.

        public SchoolContext(): base("SchoolContext")
        {
            DbInterception.Add(new DatabaseAccessInterceptor());
        }

Ya da app.config/web.config içerisinde de aşağıdaki gibi belirtebiliyoruz.

      <entityFramework>
        <interceptors>
          <interceptor type="{namespace.classname}, {assembly}">
            </interceptor>
        </interceptors>
      </entityFramework>

Umarım bu basit ve kolay özellik, EF kullanıyorsanız yeni ve farklı çözümler yaratmanızda faydalı olur. Biraz hızlı oldu farkındayım ama takıldığınız ya da sormak istediğiniz bir şey olursa, yorum yazarak ya da e-mail atarak bana iletebilirsiniz.

Senenin son seyahatini uzun zamandır gitmek isteyip de, fırsat bulamadığım Lizbon ile geçen hafta tamamladım. Mevsim olarak daha iyi bir zaman tercih edilebilirdi belki. Yine de hava oldukça güzeldi. Hatta tam kıvamında, ne soğuk, ne sıcak, yer yer hafif yağmurlu ama mutlaka güneşi gördüğüm bir zaman dilimine denk geldim. Son baharda gidilir mi tereddütü yaşayan varsa, yaşamasın…Gidilir.

Lizbon

Bayaa önceden ayarladığımız için, direkt merkezde, Baixa(bayşa)’da kaldık. Ulaşım ve belli başlara yerlere yakınlığı konusunda Baixa kesinlikle süper bir tercih olmuş. Kaldığımız otelin reklamını da yapmazsam olmaz, Brown’s Downtown… Reklamını yapmazsam olmaz diyorum çünkü cidden değişik ve güzel bir oteldi. Önceden de ayarladığımız için oldukça güzel bir ücret ödedik. şiddetle tavsiye ederim. şahane bir ücret demişken, Lizbon’nun diğer Avrupa şehirlerine göre oldukça ucuz olduğunun altını çizmek isterim, ahaa da çizdim…

Lizbon, İstanbul’a çok benziyor…Büyük bir ihtimal giden herkes bunu direkt fark edecektir. İstanbul’un daha makul bir kalabalığa sahip halinin, geliştirilmemiş ama korunduğunu düşünün…Ahaaa da işte Lizbon. Lizbon oldukça eski bir şehir. Zaman kavramından ayrı olarak, yaşanmışlıkların yarattığı bir eskilik şehrin genel havasına hakim. 1700’lerin ortasında gerçekleşen büyük depremin bir çok binayı yıkmış olmasına rağmen, bir çok şey de korunmuş. “Yenilemek” kavramı yerine “korumak” kavramını seçen bir şehir olmuş. Bir çok Avrupa ülkesi gibi, Lizbon’da da şehri yenilemek yerine korumayı tercih etmişler. Olması gereken de bu zaten… Biz ise, korumak yerine, yenileme ayağına şehirlere tecavüz ediyoruz…Neyse…Lizbon

Çok tarihi özelliğini bilmiyorum ama seramik kaplamalar, Lizbon’nun mimarisinde oldukça önemli yer kaplıyor. Bir çok eski binanın cephesi seramik taşlar ile kaplanmış. Her Avrupa şehri gibi, Lizbon’da da çeşitli meydanlar mevcut. Ama ilginçdir ki, meydanlarında kilise ve kathedral yok. Kocaman bir kaç heykel ile yetinmişler… Meydan ve kilise ikilisi ile standart Avrupa havasından uzak olması açıkcası hoşuma gitti. Farklı geldi… Bu meydanlardan en büyüğü ve en ünlüsü Praça do Comércio. Etrafı binalar ile çevrili bu meydan, Tagus nehrine bakıyor. Bir ıstanbul Boğazı gibi olmasa da, manzarası andırıyor diyebilirim. Evetttt, her gittiği yeri Türkiye ile kıyaslayan turist görevimi tamamladım. Artık daha rahat devam edebilirim sanırım.

Rossio ve Praça da Figueria, kıyıdan içeriye doğru girdiğinizde karşınıza çıkan diğer büyük meydanlar. Metroyu çok kullanacağım derseniz zaten, Rossio ister istemez çok çıkacağınız bir meydan olacak. Ayrıca Sintra’ya gitmek isterseniz,-ki isteyin, Rossio’dan trene biniyoruz…Buraya yeniden geleceğiz yani Sintra‘ya gitmek için.

Read More

İstanbul’da AngularJS ile ilgili en kapsamlı etkinlik VNGRS‘ın organizasyonu ile 22-23 Kasım tarihlerinde YTÜ Beşiktaş kampüsünde gerçekleşiyor. AngularJS’yi tanımak ya da uzmanlaşmak isteyen kişiler için oldukça dolu bir programa sahip olan bu ücretsiz etkinliği kaçırmamaınızı tavsiye ederim. Katılım ve diğer ayrıntılar için http://bootcamp.vngrs.com adresini ziyaret edebilirsiniz.

AngularJS

22 Kasım – AngularJS Hakkında Temelleri Oluşturma Günü

Başlangıç: Temeller
•09:00 – 09:24 Bootcamp programı, Pomodoro, Angular Dev Tools
•09:30 – 09:55 Web Uygulamaları ve AngularJS’in Getirdiği Çözüm
•10:00 – 10:25 Basit olarak AngularJS’i Oluşturan Parçalar

AngularJS ile Mikro Proje: Kitapcim
•10:40 – 11:05 1/3 Bölüm Projeyi oluşturma ve Routing
•11:10 – 11:35 2/3 Bölüm Dataları Listeye Dökme, Arama, Tarama vs.
•11:40 – 12:05 3/3 Bölüm Animasyonlarla Zenginleştirme

Öğlen Yemek Molası (12:05 – 13:00)

Direktifler Dünyasının Derinlerine Doğru
•13:00 – 13:25 Ne la bu Direktif Dedikleri?
•13:30 – 13:55 İzole Skoplar ve Direktiflerin Derinlikleri
•14:00 – 14:25 Controllerları Direktifler içinde Kullanmak

AngularJS için Voltran’ı Oluşturmak
•14:40 – 15:05 Projenin Hammaliyesini Gruntjs’e Yüklemek
•15:10 – 15:35 UI-Router ile Zincirlenmiş Ekranlar Oluşturmak
•15:40 – 16:05 AngularJS ve Ionic Framework ile Mobil Uygulama Geliştirmek

AngularJS ile Backend Entegrasyonu
•16:20 – 16:45 Nodejs ve Express ile Hızlı Backend Oluşturmak
•16:50 – 17:15 Parse ile Backend Servisleri Oluşturmak
•17:20 – 17:45 Firebase ile Backend Servisleri Oluşturmak

23 Kasım – AngularJS Profesyoneller Günü

•09:00 – 09:50 AngularJS’in Farklı Projelere Uygun Doğru Kullanım Tarzları
•10:00 – 10:50 AngularJS ile Çoklu Dil Desteği İçeren Web Uygulamaları Yapmak
•11:00 – 11:50 AngularJS ve Firebase ile BackendSİZsiniz
Öğlen Yemek Molası (11:50- 13:00)
•13:00 – 13:50 AngularJS’i Büyük Projelerde Kullanırken İzlenecek Yol Haritası
•14:00 – 14:50 AngularJS Projelerinin Yükünü Gulp.js ile Hafifletin!
•15:00 – 15:50 Jquery’den AngularJS’e geçiş
•16:00 – 16:50 Web Sitesinden Web Uygulamasına: Sahibinden Frontend
•17:00 – 17:50 Temel Phonegap Eklentilerine Giriş ve Ionic Framework Entegrasyonu
•18:00 – 18:50 Panel: Web Uygulamaları, SPA, MV Frameworkleri ve AngularJS’in Geleceği

Geçen ay, İstanbul’da gerçekleşen Yazılım Teknolojileri Seminerleri‘nin yeni bir ayağı, bu sefer 29 Kasım 2014 tarihinde Ankara‘da gerçekleşecek. Windows Programlama Topluluğu’nun daveti ile gerçekleşen bu etkinlikte, Muhammed Cuma Tahiroğlu’ nun Fonksiyonel Programlama, Ercan Bozkurt’ un Sanal Gerçeklik ve Burak Selim Şenyurt’un NoSQL ile ilgili sunumlarına ek ben de  SCRUM ile ilgili bir şeyler paylaşıyor olacağım. Ücretsiz gerçekleşecek olan etkinliğe bu adresten kayıt olmanız gerekmekte.

ankaraseminer

 

 

Daha önce yine buradan duyurduğum, NedirTV Yazılım Teknolojileri etkinliğini bugün oldukça keyifli bir şekilde gerçekleşti. Microservices ile ilgili benim de küçük bir sunumum vardı. Umarım, az biraz da olsa faydalı olmuştur. Buradan tüm katılan arkadaşlara bir kez daha teşekkür etmek isterim. Açıkcası ummadığım bir şekilde, çok güzel bir kalabalık vardı. Teşekkürler…

Etkinlikteki sunumumu aşağıda bulabilirsiniz. Başka bir etkinlikte görüşmek üzere.

 

Microservices Sunumu NedirTV etkinliği

Code Contracts‘ın, uzun bir süredir .NET platformunda da olan ancak çok fazla kullanılan bir kavram olmadığını, ama oldukça önemli bir özellik olduğunu düşünüyorum. Alışkanlıkların ve kolayı tercih ediyor olmamız, avantajlarının önüne geçtiğinden öneminin çok farkında olmuyoruz sanırım bu tarz özelliklerin.

Code Contracts, temelinde yazdığımız koda, adından da anlaşılacağı üzere, statik kontratlar belirlememizi sağlıyor. Bu kontratlar, pre-condition ve post-condition olarak kodun belirtilen yerlerinde derlenme aşamasından sonra(statik analiz) ya da belirtilirse run-time sırasında da çalışıyor. “Pre-Condition” ve “Post-Condition”  dışında, koddaki sınıfların durumlarını da kontrol etmek için Code Contracts’dan faydalanabiliyoruz. Ayrıca test otomasyonu ve test edilebilir kod yazmak için, Code Contracts oldukça önemli bir özellik ve hatta kolaylık.

contracts_Yazdığımız metotların aldığı parametreleri doğrulamak ya da parametrelerin durumlarını kontrol etmek, bir yazılım geliştirirken mutlaka yaptığımız bir şey. Bu, iş kurallarının oluşturulması ve kodun sağlıklı çalışması için olarak iki açıdan yorumlanabilir. Örnek olarak, kodun sağlıklı çalışması için null kontrolünün yapılması ya da iş kurallarını oluşturmak için yaşın 18’inden büyük olmasını kontrol etmeyi verebilirim.

Bu tarz kontroller daha doğrusu ihtiyaçlar yazdığımız birim testleri ile zaten sağlanacak ya da sağlanması gerekliliği ortaya çıkacaktır. Bu noktada Code Contracts bu gerekliliğin ortaya çıkmasında oldukça faydalı.

Sizden başka kişilerin de geliştirme yapması için sunacağınız, API, kütüphane falan tarzı şeyler geliştiriyorsanız da ayrıca Code Contracts oldukça faydalı olacaktır. IsAgeValid(int age) şeklinde sunduğunuz bir metoda, statik olarak verilecek parametrelerin kontrolünü, Code Contracts ile gerçekleştirirseniz, bu metodu kullanan yazılımcı, 18’den küçük bir değer girdiğinde, derleme aşamasında hata/uyarı alacağından ilerleyen adımlarda oluşacak hataların önüne geçilebilir.

Neleri, nasıl yapıyoruz kısaca kod üzerinden de bakalım. System.Diagnostics.Contracts namespace’indeki sınıfları Visual Studio ile entegre olacak şekilde kullanabilmek için öncelikle Code Contracts Tools’u kurmak gerekiyor. Bu adresten ilgili kurulumu hemen yapabilirsiniz. Code Contracts, proje seviyesinde ayarlanabilen, açılıp, kapatılan bir özellik. Proje özelliklerini açarsanız aşağıdaki gibi bir ekran ile istediğiniz ayarı yapabilirsiniz.

CodaContracts

Sarı ile belirttiğim ayarları özellikle yapmanızı tavsiye ederim. Bu ayarlar kodunuzun statik olarak analiz edilmesi ve kontratların işletilmesini, eğer bir uygunsuzluk var ise de Error olarak çıkmasını sağlıyor. Eğer Fail build on warnings seçili olmaz ise, uygunsuzluklar Warning olarak gözükecektir.

Code Contracts’ları peki nasıl tanımlıyoruz?

Aşağıdaki gibi AddUser(User user) şeklinde bir metodumuz var diyelim. Ve bunu metodun parametresindeki User sınıfının hangi özelliklerinin tanımlanması ve nasıl tanımlanması gerektiği, metodu çağıran kişi tarafından bilinemez, -eğer farklı bir şekilde belirtilmediyse. Contract.Requires() metodu ile metotların input’larını yani parametrelerini, belli koşulları(pre-conditions) sağlıyor mu diye kontrol edebiliriz.

Read More