Test Driven Developmant uygulamalarında karşılaştığımız kalıp terimlerden biri olan birim testlerin(unit tests) sahip olması gereken bazı temel özelliklerden bahsetmeye çalışacağız.
Birim test(unit test), bir kod parçasını çağırarak o kod parçasının istenen davranışı sergileyip sergilemediğini kontrol eden başka bir kod parçasıdır. “Birim” kavramı bir metod veya bir fonksiyon olarak düşünülebilir.(osherove – The Art of Unit Testing)
Birim testlerde bulunması gereken bazı ortak özellikler vardır. Bunlar:
Atomik
Deterministik
Tekrarlanabilir
Bağımsız
Hız
Atomik: Birim test metodu tek bir işlevselliği test etmelidir. Birden fazla işlevi test etmek, anlaşılabilirliği azaltacağı gibi süreçte karmaşıklığa yol açar.
Deterministik: Bir test metodu ya başarıyla testten geçer(pass) ya da geçemez(fail). Yani sonuçsuz bir durum söz konusu değildir.
Tekrarlanabilirlik: Bir kere başarıyla geçen birim test, test metodunda veya test edilen kodda bir değişiklik yapılmadığı sürece her çalıştırıldığında aynı davranışı sergiler. Bazen geçip bazen geçmeyen testler tekrarlanabilir değildir.
Bağımsız: Birim testin çalışması için herhangi bir başka teste, uygulamaya veya dış kaynağa(veri tabanı, mail sunucu v.b) bağımlı olmaması gerekir.
Hız: Birim testler olabildiğince hızlı çalışmalıdır. Bir birim test, dakikalar, saniyeler değil milisaniyeler içinde sonuçlanmalıdır.
Bu yazımızda kullanıcı arayüzü geliştirme(frontend development) sürecinde uygulanan ve performans arttırma yöntemi olan dosya içeriklerinin azaltılması işlemi üzerinde duracağız. Bu işlem yabancı kaynaklarda minification olarak geçer. Javascript minification ya da css minification olarak karşılaşabiliriz.
Kodun okunabilirliğini arttırabilmek içi geliştiriciler olarak Javascript kodlarını düzgün biçimlendirerek ve anlamlı isimlendirmeler kullanarak yazarız. Değişken isimleri anlaşılır ve mümkün olduğunca uzun olur. Her satıra ayrı tanımlamalar yapılır. Kodda karmaşa oluşmaması için ne gerekiyorsa yapılır. Bu durumda dosyada boşluk karakterlerin sayısı ve değişken isimlendirmelerinden dolayı gereksiz karakter sayısı artar. Tabi gereksiz karakter kavramı kodu yorumlayan mekanizmaya göredir bize göre değil. Hal böyle iken dosya boyutu da doğal olarak büyür. Hele ki modüler yapıda bir uygulama geliştiriyorsak modüller arttıkça kodlar da artacaktır. Nihayetinde uygulamamızın yüklenmesi uzun sürecektir. Bu gibi durumlarda dosyadaki gereksiz boşluklar ve uzun isimlendirmelerin küçültülerek dosya boyutunun azaltılması gerekmektedir.
Örneğin aşağıdaki javascript kodu açık ve anlaşılır şekilde yazılmıştır.
var getProduct = function(productCode){
var productList = GetProductFromService(productCode);
return productList;
}
Bu kodun küçültülmüş hali şu şekilde olacaktır:
var getProduct=function(e){var t=GetProductFromService(e);return t}
Bu şekilde yüzlerce satırlık kodlar tek satır haline getirilir. Ağ üzerinden indirilen dosyaların boyutu küçüleceği için kullanıcı tarafına kolayca yüklenebilir.
Javascript dosyalarının küçültülmüş halleri gelenek olarak dosyaadi.min.js şeklinde adlandırılır. Yani dosya adında min ifadesini görünce dosyanın minimize edilmiş hali olduğunu anlayabiliriz.
Javascript dosya boyutlarının küçültülmesi işlemini manuel olarak yapmak çok zor bir işlemdir. Bu işlemin otomatik olarak yapılması gerekmektedir. Geliştirme yaptığımız IDE özelliklerinde minification özelliğinin olması bize avantaj sağlar. Ancak piyasada bu işlemi yapan araçlar da mevcuttur. Bu yazı da YUIcompressor aracı ile dosya küçültme işlemini gerçekleştirmeye çalışacağız. Geliştirme ortamı olarak ise Webstorm kullanılmıştır.
YUIcompressor yüklemek için nodejs komutunu kullanıyoruz. Yükleme komutu şu şekildedir:
npm install -g yuicompressor
Webstorm eklentilerinden File Watcher yüklü olması gerekmektedir. Bu eklenti javascript dosyalarımızın takibini yaparak otomatik olarak *.min dosyalarını oluşturacaktır.
File Watcher Plugin
Daha önce yüklediğimiz YUIcompressor aracını Webstorm tarafına tanıtmak işlemi aşağıdaki ekran çıktısında gösterilmiştir. Program kısmında
C:\Users\{user}\AppData\Roaming\npm\yuicompressor.cmd şeklinde dosya seçilmelidir.
YUI Compressor File Watcher
Bu işlemden sonra javascript dosyalarımız YUIcompressor tarafından takibe alınmıştır. Herhangi bir javascript dosyasında işlem yapıp kaydettiğimizde aşağıdaki gibi bir görüntü oluşacaktır.
min.js
Görüldüğü üzere otomatik olarak min dosyalarımın oluşturulmaktadır. Artık HTML dosyalarımızda kullanabiliriz.
Bir domain model için en önemli yapı taşlarından biri servislerdir. Servisler, modele ait Entity ve Value nesnelerinin yapısına aykırı davranışları kendi bünyesinde taşıması için tasarlanırlar. Böylelikle Entity ve Value nesnelerinin vazifesi olmayan işleri yüklenmesini önlemiş olurlar.
Eric Evans‘a göre iyi tanımlanmış bir servisin belli karakteristik özellikleri vardır. Bunlar:
Domain nesnelerinin doğal bir parçası olmayan işlemleri yönetir.
Domain modelin diğer elemanları açısından Interface’ler tanımlanır.
Servis işlemler belli bir yerde tanımlanmak zorunda değildir.
Servisler test edilebilir olması ve birbirine bağlı işlemleri belirleyici olması açısından mutlaka bir Interface çatısı altında bulunmalıdır. Interface’ler servislerin sözleşmeleridirler.
Servisler Application, Domain, Infrastructure gibi birçok katmanda bulunabilir.
Infrastructure servisleri IEmailSernder gibi dış kaynaklarla iletişimi sağlayan servislerdir. Dış kaynaklar dosya sistemleri, SMTP, veritabanı, SMS gibi yapılar olabilir. Domain katmanı bir bildirimin kullanıcılara nasıl iletildiği ile ilgilenmez, sadece iç süreci tamamlar ve bir olayı(Event) tetikler.
Domain servisleri, küçük parçalar arasında üst seviye işlevselliği sağlayan kooordinatör vazifesindedir. Örneğin sipariş işlemi için OrderProcessor servisi, para transferi için FundTransferService gibi. Domain servisleri model için çok önemli olduğundan isimleri ve kullanımları Ubiquitous Language diye adlandırılan ve kavramsal bir ifade olan domain dilinin bir parçası olmalıdır. Anlamları ve sorumlulukları müşteri ve domain uzmanı tarafında tutarlı ve mantıklı olmalıdır.
Application servisleri dış ortama açılan servislerdir. Dış ortamdakiler bizim Entity nesnelerimizle doğrudan iletişime geçemez. Fakat bunları temsil eden nesnelerle iletişime geçebilir. Katmanlar arasında iletişimi doğrudan domain nesneleri ile yaparsak diğer katmanlar domain yapımız hakkında çok fazla bilgi sahibi olurlar. Application servisleri dış ortamdan gelentalepleri mesaj şeklinde model içindeki süreçlere aktarır. Bu noktada Messaging Pattern diye adlandırılan yeni bir kavram karşımıza çıkıyor. Messaging Pattern Application servislerinin kuralı gibidir. Dış ortamdan taleper mesaj olarak alınır ve iç süreç tamamlandıktan sonra sonuç dış ortama servisler aracılığı ile mesaj olarak verilir. Application servisleri herhangi biriş kuralı içermezler. İş kuralları Domain katmanı için yürütülür.
Tasarıma başlarken genellikle öncelikle Domain ve Applicaiton servislerin oluşturlması ve kullanıcılara sunulacak olan Interface tiplerinin belirlenmesi daha sonra da Test Driven Development ile dış davranışların test edilmesi uygun olacaktır. Kullanıcı bakış açısından senaryoları oluşturup test etmek bize büyük katkılar sağlar. Çünkü yazdığımız kod sonuçta bir kullanıcıya sunulacaktır.
Özet
Domain Service: Domain nesnelerinin doğal yapısına sığmayan işletme mantığını kapsar. Bunlar CRUD işlemleri değildir. CRUD işelmeri repository bünyesinde gelişir.
Application Service: Sistem dışı kullanıcılar için oluşturulur. Örneğin Web servisleri veya Web arayüzleri bu servislerle haberleşirler. Kullanıcılara sunulan CRUD işlemleri burada tanımlanabilir.
Infrastructure Service: Dış kaynaklarla yapılan iletişimler için oluşturulur. (File, SMS, SMTP, MSMQ).
Kaynak:
Eric Evans, Domain Driven Design Tackling Complexity in The Heart of Software
Bu yazıda Visual Studio eklentisi olan Resharper kodlama aracına bir göz atalım istedim. Bugüne kadar gördüğüm en akıllı eklentidir diyebilirim. Resharper aracı kod denetimlerini yaparak bize rehberlik eden bir uygulamadır. Yazdığımız kodu kontrol ederek hata, uyarı, eksik referans, gereksiz satır, işletilemeyen satır gibi eksiklikleri bize bildirir. Bir diğer özelliği refactoring konusunda geliştiriciye yardımcı olmasıdır. Kodun yerinden düzenlenmesi için yol gösterici özelliklere sahiptir. Ayrıca navigasyon özelliği sayesinde tüm solution bünyesinde aradığımızı bulma konusunda çok etkilidir. Kendi bünyesinde bulunan unit test aracı sayesinde testleri de çalıştırabilmektedir. Gelen olarak başlıca özelliklerini liste halinde verecek olursak:
Kod analizi
Navigasyon ve arama
Kodun yeniden yapılandırılması (Refactoring)
Kod düzenleme ve temizleme
Kod üretimine yardımcı olma
Visual Studio proje tiplerinden C#, VB.NET, ASP.NET, Javascript, Typescript gibi proje türlerine destek vermektedir.
Programcılar açısından bir baş ucu aracıdır diyebilirim. Ancak şunu belirtmeliyim, sizi kendine çok kolay bir şekilde bağlar ve bir süre sonra Resharper olmadan kod yazmak size çok sıkıcı gelebilir.
FakeItEasy açık kaynak kodlu bir .Net mocking Framework’dür Bu framework sayesinde istediğimiz tipe ait dinamik fake nesneler oluşturabiliriz. Kolay anlaşılır ve uygulanabilir bir altyapıya sahiptir. Kullanımı ise basit bir şekilde şöyledir:
IMemberService service = A.Fake<IMemberService>();
A.CallTo(()=>service.IsValid("validUser")).Returns(true);
A.CallTo(()=>service.IsValid("invalidUser")).Returns(false);
MemberController controller = new MemberController(service);
bool isValid = controller.ValidateUser("validUser");
Yukarıda IMemberService türünden türetilmiş somut bir fake sınıf yazmamıza gerek kalmadı. Çünkü bu işlemi bizim yerimize FakeItEasy gerçekleştirdi. A.Fake<IMemberService>() şeklinde yeni bir somut nesne oluşturdu. Yine service nesnesinin metotlarına ait davranışları da biz veriyoruz. IsValid() metoduna hangi parametre ile çağrıldığında nasıl davranacağını A.CallTo() metodu ile bildiriyoruz. Artık MemberController sınıfı dışarıdan almaya ihtiyaç duyduğu IMemberService hazır.
FakeItEasy aracı Test Driven Development geliştirme için çok kullanışlı bir üründür. Eğer önceden aşina olduğunuz bir mocking framework yoksa kullanmaya değecek bir üründür.
Yazılım sektörünün önde gelen isimlerinden biri olan yazılım Martin Fowler, hepsiburada.com şirketinin sponsorluğunda düzenlenen “Contunious Delivery and Design” isimli etkinlik için 10-11 Eylül tarihlerinde İstanbul’daydı.
Martin Fowler’ın üzerinde çalıştığı kurumsal mimari ve prensipler birçok yazılımcı tarafından kabul görmüş ve standart olarak uygulanır hale gelmiştir. Bu da Fowler’ı sektörde öne çıkarmıştır. Kendisi şu anda ThoughtWorks adlı bir yazılım danışmanlık şirketinde “Chief Scientist” pozisyonunda çalışmaktadır. Yazdığı kitaplar ve verdiği seminerlerde çok önemli konulara değinir. Bu yüzden İstanbul’daki etkinliğe katılmak istedim. Etkinliğe yaptığım ilk başvuruda yer olmadığı şeklinde olumsuz cevap gelmişti ancak 4 gün kala yer açıldı diye bir davetiye aldım ve katıldım.
Etkinlikte ThoughtWorks şirketinin İstanbul ofisinin açılmış olduğu duyuruldu. Aynı zamanda hepsiburada.com şirketi, çevik(Agile) süreçlerin ve sektördeki yenilikçi birçok deneyimin uygulanması için ThoughtWorks ile beraber çalıştığını duyurdu.
Fowler’ın sunumunda genel olarak çevik süreçlerin işleyişi üzerinde duruldu. Günümüzde artık yazılım ürünlerinin girdileri arasında insan iş gücü maliyetinin sadece yazılımı ilk oluştururken değil daha sonraki aşamalarda dönüşüm ve bakımların yapılmasının da dahil olduğu ortaya çıkmaktadır. Dönüşümün rahatça yapılabilmesi ve kaynakların israfını önlemek için çevik prensiplerin uygulanmasının gerekliliği vurgulanmıştır.
Uygulanan prensipler ve yenilikçi bazı teknik çözümlere başlıklar halinde değinilmiştir. Bunlar:
Continuous delivery
Continuous deployment
CAP Teorem
NoSQL
Microservices
Etkinlikte söz alan diğer konuşmacılar:
David Elliman
Emre Ekmekçi
Cengiz Han
İsa Göksu
Ben Kappler
Etkinlikte ayak üstü sohbetlerde çeşitli şirketlerin çalışanlarıyla sohbet imkanım oldu. Merak ettiğim bir numaralı konu olan çevik süreçlerin uygulanıp uygulanmadığıydı ve sordum. Genel olarak aldığım cevap “Türkiş Agile” yapıyoruz oldu. Yani işin başında prensipleri uygulamaya karar verip işler yetişmediğinde hadi bakalım eski düzene dön şeklinde devam eden bir sürecin uygulandığını öğrendim. Aslında farkındalığın olması bile iyi bir seviye. Bir gün mutlaka taşlar yerine oturacaktır. Martin Fowler’ın da dediği gibi yazılımda tecrübe çalışırken öğrenme şeklinde olur.
Dünyaca ünlü yazılım şirketlerin ülkemize ilgi göstermeye başlamasını şahsen çok önemsiyorum. Yıllar önce kurulan şirketlerin coğrafyamızda bu günlerde yüzünü göstermeye başlaması sanırım bir şeylerin değiştiğinin göstergesidir. Bugün Martin Fowler geldi. Kim bilir yarın Robert Cecil Martin, başka bir gün Kent Beck, Eric Evens, Erich Gamma gelir.
Bir PHP uygulamasına gelen GET, POST gibi talepler eğer Javascript üzerinden geliyorsa bunu anlamak bazı durumlarda işimizi kolaylaştırmaktadır. GET taleplerini karşılamakta bir sorun yaşamayız fakat POST taleplerinde Javscript ile giden Header bilgisinde $_POST[‘name’] şeklinde query string değerini alamayabiliyoruz.
O halde duruma göre işlem yapabilmek için önce talebin Javascript yani XMLHttpRequest olup olmadığını anlamalıyız. Bunun için örnek bir sınıf yazarak durumu anlamaya çalışalım. Örnek bir app.php dosyasının içeriğini aşağıdaki şekilde belirleyelim.
class Request{
public static function IsAjaxRequest(){
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
$_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest' ;
}
}
if(Request::IsAjaxRequest())
echo("Ajax");
else
echo("Not");
Bu PHP uygulamasını internet tarayıcımızdan direkt olarak çağırdığımızda ekrana “Not” şeklinde çıktı verecektir. Eğer bir Javascript uygulamasından talep gönderecek olursak “Ajax” şeklinde sonuç alırız.
DİKKAT: Eğer IIS üzerinden PHP uygulaması çalıştırıyorsanız bu yöntem çalışmayacaktır. Windows ortamında IIS üzerinden PHP 5.3 ile yaptığım denemede bunu fark ettim. Bunun sebebi $_SERVER içindeki değişkenlerin PHP tarafından değil HTTP sunucusu tarafından oluşturulmasıdır. IIS HTTP sunucusu HTTP_X_REQUESTED_WITH başlığını oluşturmadığından IIS üzerinde çalışmaz. Apache HTTP sunucusu HTTP_X_REQUESTED_WITH değerini oluşturmaktadır.
Windows platformu üzerinde PHP çalıştırmak için birkaç farklı yöntem vardır. Windows üzerine Apache, XAMPP gibi uygulama sunucuları kurmak bu yöntemlerden bazılarıdır. Ancak bir diğer yöntem, Windows platformunun kendi Web sunucu uygulaması olan IIS üzerinden PHP uygulamalarını çalıştırmaktır. Bu işlem için windows üzerine PHP yazılımının son sürümünü kurmak gerekmektedir. Bu işlemi Web Platform Installer aracı ile kolayca gerçekleştirebiliriz.
Microsoft Web Platform Installer aracını buradan indirebilirsiniz.
Web Platform Installer yüklendikten sonra IIS penceresinde Yönetim bölümünde logosu görünecektir.
IIS Logo
Uygulamayı çalıştırdığımızda açılan pencerede arama kutusundan “PHP “şeklinde bir arama yaparak yüklenebilir durumdaki son sürümleri listeleyebiliriz.
PHP Son Sürüm
Listeden istediğimiz versiyonu seçip kurulumu yaptıktan sonra PHP uygulamalarımız IIS üzerinden çalıştırabilir hale gelmiş olacaktır. Her ne kadar otomatik olarak yükleme yapılmış olsa da bazı kontrolleri yapmamız gerekmektedir. Bunlardan biri IIS ana penceresinden “İşleyici Eşleşmeleri” veya “Handler Mapping” menüsünden PHP handler eşleşmesi kontrol edilir. Grekli eşleşme yapılmışsa IIS artık PHP taleplerini yakalayıp çalıştırabiliyor demektir.
Windows üzerinde IIS çalıştırdığımız dizin (inetpub/www) içerisine bir php dosyası atarak testimizi gerçekleştirebiliriz.
NOT: Burada dikkat etmemiz gereken konulardan biri PHP ile daha önceden Apache gibi sunucularda çalışmış olanlar Apache’ye özgü özellikleri IIS üzerinde çalıştıramayacak olmasıdır. Örneğin .htaccess dosyası IIS üzerinde değerlendirilmez çünkü Apacahe tarafına ait bir özelliktir. Yada Apache HTTP sunucusu üzerinde oluşturulan bazı başlık (Hearder) bilgileri IIS üzerinde oluşturulmayabilir. Bu gibi konulara dikkat etmek gerekmektedir.
Bugün 19 Ağustos 2014. Bilgisayarımın tozlu arşivlerinde kaybolup gitmesin diye paylaşmayı amaçladığım yazılarımı yayınladığım sayfam www.bayramucuncu.com artık 3 yaşında. Geride bıraktığım üç yılda sayfamı takip eden okuyuculara teşekkürlerimi sunuyorum.
Gün geçtikçe artan ziyaretçi sayısı, yazılarımı her yönüyle iyileştirmeye itiyor beni. Türkçe dil kurallarına uygun, doyurucu, sade ve anlaşılabilir içerik oluşturmaya artık daha çok dikkat etmeye başladım. Her ne kadar dikkat etsem de sürç-i lisan eylediysek affola.
Önümüzdeki yılda yeni yazılarda buluşmak dileğiyle hoşçakalın.
GeoServer, coğrafi verilerin dış dünyaya sunulması için hazırlanmış açık kaynak kodlu bir java uygulamasıdır. GeoServer ile coğrafi verileri işlemek, paylaşmak ve düzenlemek mümkündür. GeoServer ile paylaşılan verileri Google Earth gibi masaüstü uygulamalarda kullanmak mümkün olduğu gibi Open Layers, Google Maps ve Bing Maps gibi
web tabanlı haritalara da kullanmak mümkündür.
GeoServer uygulaması, OGC(Open Geospatial Consortium) uyumlu olup OGC standartlarında Web Map Service(WMS), Web Feature Service(WFS) ve Web Coverage Service(WCG) gibi hizmetleri sunabilmektedir. Bu sayede platform bağımsızlığı sağlanıp farklı uygulamaların birbiri ile konuşması mümkün hale gelmektedir.
GeoServer, birçok coğrafi veri kaynağı ile uyumlu çalışabilecek şekilde tasarlanmıştır. Örneğin:
PostGIS
Oracle Spatial
ArcSDE
DB2
MySQL
Shapefiles
GeoTIFF
ECW
Geoserver ile birçok standartta veriler üretmek de mümkündür. Örneğin:
KML
GML
GeoRSS
PDF
GeoJSON
JPEG
GIF
SVG
PNG
Yukarıda bahsettiğimiz bileşenlerin düzgün işleyen bir iş kuralına göre konumlandırılması gerekmektedir. Üretilen coğrafi verileri depolanmasından, bir uygulamada vücut bulmasına kadar ilerleyen bir dizi adım söz konusudur. Peki o halde Geoserver bu sistemin neresinde durur?
Geoserver Uygulama Mimarisi
Şemada ifade edildiği üzere Geoserver, veri kaynağı ile uygulama arasında konumlanmış bulunuyor. Tabi arada bir de GeoWebCache denilen sistem iyileştirme eklentisi bulunmaktadır.
Coğrafi veri kaynağına herhangi bir CBS(Coğrafi Bilgi Sistemleri) Masaüstü uygulaması ile erişmek mümkündür. Bu uygulama açaık kaynak kodlu QGGIS olabileceği gibi ticari ürünlerden ArcGIS v.s de olabilmektedir. Masaüstü uygulamaları kullanılırken Geoserver kullanmamıza gerek yoktur.
Web tabanlı harita uygulamalarında verilerimizi kullanmak için piyasada bulunan açık kaynak veya ticari uygulamalardan faydalanabiliriz. Örneğin OpenLayers, Esri API, Google Maps, Bing Maps gibi haritalar üzerinde coğrafi verilerimizi kullanabilmekteyiz.
Geoserver WMS Yayını ve OpenLayers
Nerelerde Kullanılır?
Geoserver uygulamasını coğrafi veri depolama ve bu veriyi paylaşma ihtiyacı olan şirketler veya kamu kurumları kullanabilir. Ülkemizde en yoğun kullanım alanları olarak bazı bakanlıklar, belediyeleri ve altyapı kurumlarını görmekteyiz. Belediyelerde imar, yol, numarataj ve adres bilgisi gibi birçok coğrafi veri depolanmaktadır. Altyapı kurumlarında da tüm altyapı bilgisi koordinatlı bir şekilde saklanmakta ve sunulmaktadır.
(CBS)Coğrafi Bilgi Sistemleri’nde Geoserver’ın Yeri
Dünyada ve ülkemizde hızla yaygınlaşan Coğrafi Bilgi Sistemlerine karşı ilgi giderek artmaktadır. Üniversitelerde bu konu üzerine önlisans, lisans ve yüksek lisans programları açılmaktadır. CBS uygulamalarının yaygınlaşmasıyla ürün kullanım ihtiyacı da belli bir maliyeti beraberinde getirmektedir. Ticari ürünleri satın alma gücü olmayan kurum ve şirketler doğal olarak açık kaynak kodlu Geoderver veya benzeri ürünlere yönelmektedir. Geoserver bu nedenle azımsanmayacak oranda bir kullanıcıya sahiptir.
Özet
Eğer coğrafi verilerinizi para harcamadan OGC standartlarında dış dünya ile paylaşmak istiyorsanız Geoserver sizin için çok pratik bir çözüm olacaktır.