Javascript ve HTML Dom element etkileşimleri

8 Ara

Javacsript kodu ile HTML Dom elementler arasındaki etkileşimleri genelde elementin ID değeri üzerinden sağlarız. Javascript kodu ile document.getElementById(“elementId”) şeklinde ID aracılığıyla elementin seçilebilmesi mümkündür. Bu aşamadan sonra ise element üzerindeki bir değerin değiştirilmesi veya bir olayın(event) tetiklenmesi gibi işlemeri yapmak daha kolay hale gelmektedir.

HTML elementleri üzerinde tanımlı mevcut nitelikler(attributes), javascript tarafından elemente erişmemizi sağlarlar. Mevcut elementlerin kullanılabildiği gibi kendi tanımlayacağımız özel elementler üzerinden de bağlantı kurmamız mümkündür. Günümüzde kullanılan birçok Javascript kütüphanesi kendi tanımladığı nitelikler üzerinden işlemlerini yürütmektedir. Örneğin AngularJS ile çelışırken “ng-*” şeklinde veya JQuery ile çalışırken “data-*” şeklinde nitelikleri görürüz.

Şimdi bir senaryo geliştirerek biz de kendi tanımladığımız HTML nitelikler aracılığı ile bir uygulama geliştirmeye çalışalım. Bir buton elementi üzerine ekleyeceğimiz netelikleri(attribute) javascript tarafında kullanmaya çalışalım.

<button type="submit"
         data-get-async="true"
         data-url="/products.txt"
         data-attr-target="#getasyncresult">Getir
 </button>

Buton üzerinde data-get-async, data-url, data-attr-target şeklinde tanımladığımız nitelikleri anlamlandırmamız gerekmektedir.

data-get-async: işlemin asenkron gerçekleştirileceğini,
data-url: talebin gönderileceği adresi,
data-attr-target: talep sonrasında dönen cevabın hengi elementi etkileyeceğini belirtiyoruz.

Javascript dosyasını (deneme.js) ise şu şekilde düzenliyoruz:

<script type="text/javascript">

   $(function() {
       var buttonRequest = function () {
       var $button = $(this);
       var options = {
           url: $button.attr("data-url")
      };

      $.ajax(options).done(function(data) {
        console.log(data);
        var $target = $($button.attr("data-attr-target"));
        $target.html(data);
      });
  };

  $("button[data-get-async='true']").click(buttonRequest);
})
</script>

javascript tarafında gerçekleştirdiğimiz işlemi kısaca özetleyecek olursak, yaptığımız şey data-get-async niteliğini barındıran buton tıklandığında yapılacak işlemi belirlemektir.

$(“button[data-get-async=’true’]”).click(buttonRequest);

Bu örnekte “data-*” şeklinde nitelikler tanımlamamın sebebi yardımcı olarak JQuery kütüphanesini kullanıyor olmamdır.

JQuery ajax sorgusu için gerekli url gibi seçenekleri de yine buton üzerinde tanımlanan niteliklere tanımlıyoruz. Geriye kalan ise javascript işlemleridir.

Bu şekilde bir uygulama ile HTML tarafı ile Javascript kod tarafı birbirinden ayrılmış olmaktadır. Yani ön yüz(front end) geliştirme tarafında, Model ve View şeklinde bir ayrım yapılmış olmaktadır. Javascript MVC geliştirme araçlarının yaptığı işlem de bu şekildedir aslında. Direktifleri HTML nitelikeri(attributes) aracılığı ile alır ve komutları çalıştırırlar.

Bir sonraki yazıda görüşmek dileğiyle.

Ubuntu üzerinde Eclipse JEE menü sorunu

24 Kas

Ubuntu üzerinde java çalışmak isteyenlerin kurduğu Eclipse JEE versiyonu  üzerinde yaşayacakları bir sorunun çözümü üzerinde durmak istiyorum. Sanal makinemde kurulu olan ubuntu-13.10-desktop-amd64 sürümlü işletim sistemi üzerine Eclipse JEE versiyonunu kurarak işe başladım. Masaüstüne eclipse kısayolunu oluşturdum. Programı çalıştırdığımda aynı sorunla bende karşılaştım. Sorun, Eclipse açıldığında menülerin gözükmemesiydi.

Eclipse JEE
Eclipse JEE

Resimde de görüldüğü şekliyle üst(File, Edit,…) menü gelmemişti. İnternetten çözüm yollarını biraz araştırdıktan sonra sonuca ulaştım.

Öncelikler Terminal’i çalıştırarak Desktop dizinine geçtim. Yönetici yetkileri ile Eclipse masaüstü dosyasını açtım. Aşağıdaki komut ile masaüstü kısayolu dosyasını açabiliyoruz.

sudo gedit EclipseJEE.desktop
Eclipse Menu Onarımı
Eclipse Menu Onarımı

Açılan desktop dosyası içerisine şu komutu girdim: Ecex=env UBUNTU_MENUPROXY=0 /opt/eclipse-jee/eclipse

Dosyayı kaydedip programı yeniden çalıştırdığımda üst menü göründü.

Yazılım Sistemlerinde Soyutlamalar

13 Kas

Bir arabaya bindiğimizde aracı hareket ettirebilmek için gerekli bilgilere sahipsek aracı çalıştırıp yolumuza gidebiliriz. Aracı hareket ettirebilmemiz için bize öğretilen kurallar dizisi, aracın hareketini sağlayan mekanik aksamlardan arındırılmıştır. Yani şoför koltuğuna oturduğumuzda motordan tekerlere iletilen gücün, motora giden yakıtın veya aküde ki elektrik dağılımının yönetimi ile ilgilenmeyiz. Bu süreçler mühendisler tarafından tasarlanmış ve sürücüden soyutlanmıştır. Sürücüye sadece sisteme gerekli komutları vermek kalmıştır.

Arabaların donanımsal özelliklerinde yapılan değişiklikler sürücüleri etkilemez . Örneğin benzinli bir araç LPG yakıta dönüştürüldüğünde sürücüler, yeniden araç kullanma eğitimi almak zorunda kalmazlar.

Soyutlama işlemi, karmaşık sistemlerin uygulama alanındaki detaylarını kullanıcılardan gizlemek için uygulanır. Ayrıca karmaşık sistemlerin basitleştirilmesi ve kolayca anlaşılması için benimsenmiş ilkelerden biridir.

Yazılım sistemlerinde soyutlamalar mimari düzeyde yapılabildiği gibi kod düzeyinde de yapılabilmektedir.

Bir yazılım sisteminde mimari düzeyde yapılan soyutlamalar, yazılımı mimari katmanlar şeklinde sorumluluklara ayırarak yapılır. Böylece bir katman diğeri ile birlikte çalışır, fakat biri diğerinin çalışma alanını etkilemez. Hem de Separation of Concerns diye adlandırılan tasarım prensibine de uyulmuş olur. (Concern kelimesini burada “katmanlar” veya “işlevler” olarak değerlendirebiliriz).

Mimari Soyutlamalar
Mimari Seviyede Soyutlama

 

Yukarıdaki resimden de anlaşılacağı üzere, bir kullanıcı sadece Presentation Layer ile etkileşir. Bütün isteklerini bu katman üzeriden talep eder. Diğer katmanlardan haberdar değildir. Bu katmanların her birini farklı takımların geliştirdiğini varsayacak olursak, geliştiricilerin de sadece sorumlu olduğu katman içerisinde sorumlu olduğunu söyleyebiliriz. Bu şekilde izolasyon sağlanmış olur. Yazılım sistemlerinde kod seviyesinde yapılan soyutlamalar, nesneye yönelik programlama teknikleri ve tasarım desenlerinin doğru bir şekilde uygulanarak kod birimlerinin sınıflar şeklinde sorumluluklara ayrılması ile gerçekleştirilir. Örneğin üst seviye sınıfların alt seviye sınıflara bağımlı olması kodun gelişime kapalı olmasına yol açar.

 

Somut Nesne Kullanımı
Somut Nesne Kullanımı

 

Bunun yerine üst seviye sınıfları alt seviye sınıflara soyut nesnelerle bağlarız. Bu sayede üst seviye sınıflar alt seviye sınıfları tanımazlar. Interface, Abstract Class gibi soyut nesneleri tanırlar.

Soyut Nesne Kullanımı
Soyut Nesne Kullanımı

 

Bu örnek, kod seviyesinde yapılan soyutlamalara verilebilecek örneklerden sadece biridir. Kod seviyesinde yapılan soyutlamalarla nesneler arasındaki ilişkilerin ve bağımlılıkların düzenlenmesi de sağlanmış olur. Programcı, iş birimlerini somut sınıflara kodlarken, somut sınıfları soyut tipler aracılığı ile kullandırırlar. Bu sayede kullanıcılar, işleyiş detaylarını bilmeden ihtiyaçlarını karşılayabilirler.

Soyutlama kavramı, yazılım geliştirme sırasında oluşan bazı Anti-Pattern durumlarını da bertaraf eder. Aceleci ve plansız yaklaşımlar ile her şeyin birbirine girdiği projeler Anti-Pattern durumları doğurur. Yazılımda Anti-Pattern durumları, bir gömleğin ilk düğmesinin yanlış iliklenip diğerlerinin de yanlış iliklenmesine benzetirim. Yani başlangıçta düzensiz ve plansız başlanan işlerin zamanla, birikmiş hatalar yığınına dönüşeceği açıktır.

Anti-Pattern durumlardan arınmış projeler dileğiyle, tekrar görüşmek üzere.

Yaygın Olarak Kullanılan Javascript MVC Çatıları

25 Eki

Yazılım dünyasında en popüler tasarım şablonlarından olan MVC(Model View Controller) tasarım şablonu, geleneksel programlama dillerinin yanında Javascript tarafında da yaygın olarak kullanılmaya başlamıştır. MVC bir uygulamada yapılması gereken işlerin üç sınıfta birbirinden ayrılmasıdır.

Model: Modellenen verinin tipi olarak düşünülebilir. Örneğin; ürün, kullanıcı, sipariş, v.s

View: Uygulamanın ön yüzü oalrak düşünülebilir. Örneğin; temalar, css, resimler.

Controller: Uygulamadaki eylemleri karşılar. Örneğin; Tıklamalar, istekler, cevaplar.

Javascript dili, kullanıcı(client) taraflı bir dil olduğundan ve internet tarayıcısı(browser) tarafından yorumlandığından bir ön yüz geliştirme aracıdır. MVC tasarım şablonunun ön yüzde yani View tarafında uygulanması biraz ilginç gelebilir. Fakat her ne kadar View tarafında olsak da ortada bir programlama aracı vardır ve bu programlama aracı ile yani javascript ile ön yüzde MVC şablonunu uygulamak mümkündür. Model ve Controller olarak javascript nesnelerini, View olarak ise HTML elemntlerini düşünebiliriz. Bu sayede MVC şablonunu ön yüz geliştirme ortamına uygulayabiliriz.

Neden MVC çatıları kullanılır?

Javascript MVC çatısı altında DOM etkileşimleri yanı sıra Sunucu ve Kullanıcı arası iletişimleri sağlamak mümkündür. Bu iletişim sırasında alınan ve gönderilen veriler üzerinde bazı mantıksal işlemleri uygulamak gerekebilir. MVC çatılarını kullanarak bu mantıksal işlemleri View tarafından ayırabiliriz.

Bir uygulama çatısı geliştirmek çok külfetli ve maliyetli olduğundan sıfırdan kütüphaneler yazmak yerine güven kazanmış açık kaynak kütüphaneleri kullanabiliriz.

Seçerken Dikkat

Bir MVC çatısını seçerken dikkat edilmesi gereken bazı hususlar vardır. Bunlar:

  • İhtiyacımızı gerçekten karşılayacak yapıda olması.
  • Destek alabilecek bir topluluğun olması.
  • Dökümantasyonunun iyi yapılmış olması.
  • Küçük uygulamalarla kullanım kolaylığının test edilmiş olması.

Javascript MVC Çatıları

MVC tasarım şablonunun javascript tarafında rahatça kullanılabilmesi için birçok çatı(framework) geliştirilmiştir.

Benim tecrübe ettiğim javascript MVC araçları Knockout, AngularJS, giriş seviyesinde de Backbone olmuştur. Fakat yaygın olarak kullanılarn Javascript MVC araçlarını şu şekilde listeleyebiliriz:

  • AngularJS
  • BackboneJS
  • KnockoutJS
  • EmberJS
  • AgilityJS
  • CanJS


Bir sonraki yazıda görüşmek dileğiyle.

Javascript ile sunucuya dosya yükleme işlemi

13 Eki

Javascript dili son yıllarda yaygın bir ön yüz(front end) geliştirme aracı haline gelmiştir. Farklı problemlere çözüm üreten kütüphanelerin sayısı gün geçtikçe artmakta ve “front end” geliştiricilerin işi de epeyce kolaylaşmaktadır.  Bazı durumlarda hazır kütüphanelerin dışına çıkıp kontrolü elimize almak istediğimizde Javascript kodları ile birebir haşır neşir olmak durumunda kalırız.

Javascript ile ağırlıklı olarak DOM (Document Object Model) işlemeleri yapılmaktadır. DOM Türkçe olarak “Belge Nesnesi Modeli” şeklinde çevirilebilir. Sunucu tarafından oluşturulup(render) bize gönderilen internet sayfasını bir belge olarak düşünebiliriz. Bu internet sayfasında gördüğümüz yazı, resim, video, form gibi elemanları birer nesne olarak düşünebiliriz. Javascript dili ile bu nesneler üzerinde işlemler yapabilmekteyiz. Bunun yanı sıra Javascript dili bize sunucu ile iletişim kurmamızı da sağlamaktadır. Sunucudaki bir URL üzerinden veri istemek veya sunucuya veri göndermek mümkündür.

Javascript bize, sunucuya düz metin (plain text) verisi göndermenin yanı sıra bir de dosya gönderme imkanı sunmaktadır. Bu yazının konusu da dosyaların sunucuya gönderimi sırasında işlemleri takip etmektir.

Javascript ile arka plandan sunucu ile bilgi alışverişi yapmak istediğimizde XMLHttpRequest nesnesini kullanırız. XMLHttpRequest nesnesi ile;

  • Sayfa yenilemeden bilgi alışverişi yapmak mümkündür.
  • Veri alışverişi arka planda gerçekleşir.
  • Veri alışverişi asenkron veya senkron olarak belirlenebilir.

Sunucuya bir istek göndermek için XMLHttpRequest nesnesinin Open() ve Send() metodları kullanılır.

  • open() Metodu: Gönderilen isteğin(request) türünü(GET, POST), URL adresini ve isteğin asenkron olup olmadığını belirler.
  • send() Metodu: İsteği sunucuya gönderir.

XMLHttpRequest nesnesinin çalışma prensibini incelemek için bir kaç örnek vermeden geçmek olmaz.

Örnek: Senkron çalışan yöntem

Senkron Yöntem
Senkron Yöntem

Senkron yöntemlerde open() metodunun son parametresi false olarak belirlenir ve send() metodu ile istek sunucuya gönderilir. İşlem asenkron olmadığından istek gönderildikten sonra cevap gelene kadar beklenir. Yani send() metodundan sonra gelen kodlar çalışmaz.

Örnek: Asenkron çalışan yöntem

Asenkron Yöntem
Asenkron Yöntem

Asnekron isteklerde open() medodunun son parametresi true olarak belirlenir ve request nesnesinin readystatechange olayına(event) bir metod bağlanır. Sunucudan cevap geldiğinde bu metod tetiklenir. İsteği göndermek için send() metodu çalıştırılır.  İşlem asenkron olduğundan send() metodu çalıştırıldıktan sonra başka kod satırları varsa onlar da çalıştırılır.

Bu örneklerde sunucudan GET metodu ile düz metin sonucu almak için uygulamalar yaptık.

Asıl konumuz, bir dosyanın bir isteğe(request) eklenerek sunucuya gönderilmesi işlemidir. Dosyalar büyük veriler olabildiği için, uzak sunucuya gönderilmeleri sırasında takip grektiren bir durum durum ortaya çıkmaktadır. İsteğin sunucuya ulaşıp ulaşmadığı, dosyanın bir T anında yüzde kaçının yüklendiği ve işlemin tamamlanıp tamamlanmadığı gibi durumların kullanıcıya bildirilerek belirsizliğin ortadan kaldırılması gerekmektedir.

Dosya gönderim işlemleri sırasında XMLHttpRequest nesnesinin upload özelliğinden faydalanırız. upload özelliği üzerindeki olaylar(events) sayesinde yükleme işlemlerini takip edebiliriz.

Upload Javascript Kodu
Upload Javascript Kodu

upload özelliğinin;

  • loadstart olayı: yükleme işlemi başladığında tetiklenir.
  • progress olayı: yükleme işlemi sırasında her giden byte grubu sunucuya aktarıldığında tetiklenir.
  • load olayı: yükleme işlemi başarıyla tamamlandığında tetiklenir.

request.open() metodu çalıştırıldıktan sonra setRequestHeader metodu ile gönderilecek olan isteğe(request) dosya bilgileri eklenir. Dosya bilgileri, file tipindeki input elementinden alınır. send() metodu ile istek POST tipinde sunucuya gönderilir. Burada send netodunun parametre alan çeşidi kullanılmış ve parametre olarak POST edilecek bilgi send metoduna eklenmiştir.

Dosya Upload İşlemi
Dosya Upload İşlemi

Dosya yükleme sırasında işlem takibini konsola yazarak gerçekleştirdim. Siz isterseniz HTML elementlerine yazarak gerçekleştirebilirsiniz. Hatta daha önceki yazılarımdan birinde css aracılığı ile durum çubuğu yapmayı işlemiştim. Dosya upload işlemini bu yöntemle bir durum çubuğuna bağlamak mümkündür.

Bir sonraki yazıda görüşmek üzere.

Private Metodlar Test Edilebilir mi?

11 Eyl

Bu yazıda, sosyal topluluklarda karşılaştığım sorulardan biri üzerinde durmak istiyorum. Private erişim belirleyicili metodların test edilmesi mümkün mü? Ya da private metodların test edilmesine gerek var mı? Bu sorular Test Driven Development(TDD) konusunu ilk incelemeye başladığım zamanlarda benim de sürekli aklıma takılırdı.

TDD yaklaşımı ile geliştirme yapmak aslında test öncelikli(test first) geliştirme yapmaktır. Amacımız önce testlerin yazılmasıdır. Testler başarılı bir şeklide sonuçlandıkça çalışan kodun ortaya çıkmasıdır.

Bir sınıfın TDD yaklaşımı ile üretilmesi demek sınıfın ilk önce farklı bir test sınıfı yardımı ile üretilmesi, ardından da üyelerinin üretilmesi demektir. Sınıf üyeleri metod, property veya field şeklinde olabilir. Bir sınıf üyesine başka bir sınıf tarafından erişilebilmesi için, bu üyenin public erişim belirleyicisine sahip olması gerektiğini biliyoruz. Bu sebeple test sırasında üretilen sınıf üyelerinin erişim belirleyicileri de public şeklinde olacaktır. Test sınıfını ve test sırasında üretilen kodu görmek için basit bir örnek gösterim üzerinden ilerleyelim.

Test Sınıfı

[TestFixture]
public class MathOperationsTests
{
    [Test]
    public void Pow_ReturnResult()
    {
         MathOperations operations = new MathOperations();

         double result = operations.Pow(3, 4);

         Assert.AreEqual(81, result);
    }
 }

Üretim Kodu

public class MathOperations
{
     public double Pow(int number, int pow)
     {
         double result = 1;

         for (int i = 0; i < pow; i++)
             result = result * number;

         return result;
     }
 }

Önce test sınıfı oluşturuldu. Daha sonra erişim belirleyicileri public olan MathOperations sınıfı ve Pow metodu oluşturuldu. Pow metodu tam sayılarda üs alama işlemini yapmak üzere basit bir şekilde tasarlandı. Şimdi Pow metodu için bütün işlemlerin tamamlandığını varsayalım ve  MathOperations sınıfında bir takım kod iyileştirmesi yapalım.

public class MathOperations
{
    public double Pow(int number, int pow)
    {
        var result = calculate(number, pow);

        return result;
    }

    private double calculate(int number, int pow)
    {
        double result = 1;

        for (int i = 0; i < pow; i++)
           result = result*number;

        return result;
    }
 }

Üretim kodunu yeniden gözden geçirerek kodumuzun çalışmasını etkilemeden basit bir değişiklik yaptık. Bu değişiklik sonucunda üs alma işlemini private erişim belirleyicili başka bir metoda yüklemiş olduk. MathOperations sınıfında test edilmesi gereken tek metod şu anda Pow metodudur. calculate metodu, sadece sınıf içerisinde kullanılacağı için private olarak belirlenmiştir. Bu sebeple calculate metodunun test edilmesine gerek yoktur. Pow metodunun test edilmesi sırasında zaten calculate metodu çalışmaktadır. Yani zaten test sürecinden geçirilmektedir.

TDD yaklaşımını ilk öğrenmeye başladığım sıralarda benim de kafamı kurcalayan bir mesele olan private metodların testleri, aslında var olan bir sınıfın test edilmesi sırasında kafa karışıklığına yol açıyor. Yani var olan bir sınıfı test ederken, sınıf üyelerinden private erişim belirleyicisine sahip olan üyelerin de test edilmesi gerektiği, kafalarda bir soru işareti yaratabilir. Var olan bir sınıfın testinden kastım, daha önceden geliştirilmiş ve her hangi bir test sürecinden geçmemiş bir sistemdir.

Sonuç

TDD yaklaşımının doğru bir şekilde uygulanması, yani test öncelikli geliştirmenin doğru bir şekilde işletilmesi, private metodların test edilmesine gerek olmadığını ortaya koymaktadır.

SSL Güvenliği

9 Eyl

SSL Nedir?

SSL (Secured Sockets Layer), ağ üzerinde veri taşıma işleminin güvenli güvenli bir şekilde yapılabilmesi için Netscape tarafından geliştirilmiş ve standartlaşmış bir protokoldür.

SSL Sertifikası Nedir?

SSL sertifikası, bir kuruluşu tanıtan bilgileri, şifrelenmiş bir dijital anahtara bağlayan ufak veri dosyalarıdır. Bir SSL sertifikası üçüncü parti sertifika otoritsi tarafından üretilen ve şirketin web sitesinin o şirkete ait olduğunu doğrular. Gönderilen bilginin sadece doğru adreste deşifre edilmesini sağlar. SSL genellikle e-ticaret, bankacılık ve sosyal medya gibi veri güvenliğinin önemli olduğu sistemlerde kullanılır.

Bir web sayfasının kullanıcılar ile güvenli iletişim kurabilmesi için SSL sertifikasının WEB sunucusuna yüklemesi gerekmektedir. Sertifika yüklendikten sonra, WEB sayfasına https://www.domain.com şeklinde https protokolü kullanan bir adresten bağlanmak mümkündür. Güvenli bağlantı kurulduktan sonra WEB sunucusu ve WEB tarayıcısı arasındaki tüm trafik güvenli olacaktır.

WEB tarayıcıları, bir WEB ayfasının SSL güvenliğini, kullanıcılara bir kaç farklı yolla bildirir. Bunlar:

Genişletilmiş SSL Sertifika Doğrulaması (Extended Validation SSL Certificate)

Bu doğrulamayı yapan sitelere girdiğimizde adres çubuğunda aşağıdakine benzer bir görüntü ile karşılaşırız.

Adsız

Sarı ile işaretlenen bölgede kuruluş adınının adres çubuğunda gözükmesi, Extended Validation SSL olduğunu gösterir.

Adres çubuğunda kırmızı ile işaretlenen asma kilit ise sunucu ile kurulan bağlantının güvenli olduğunun işaretidir.

Standart SSL Sertifika Doğrulaması

Bu bağlantıda adres çubuğunda kuruluş adı gözükmez. Sadece güvenli bağlantının sembolü olan asma kilit gözükür.

Adsız2

Asma kilit işaretine tıkladığınızda kuruluşa ait sertifika bilgilerine ulaşabilirsiniz.

SSL Sertifikası Nasıl Temin Edilir?

Bir SSL sertifikasını sertifika sağlayıcı şirketlerden(Certificate Authority) temin edebileceğimiz gibi kendi bilgisayarımızda da oluşturabiliriz. Kendi bilgisayarımızda oluşturuduğumuz sertifikalar kullanıcı bilgisayarlar tarafından güvenilir sertifikalar olarak görülmez. Bunun sebebi sertifikayı oluşturanın güvenilir olup olmadığının bilinmemesidir. Ancak üçüncü parti sertifika otoriteşirketleri(CA)  tarafından temin edilen sertifikalar WEB tarayıcıları tarafından güvenilir sertifikalar olarak algılanır. Üçüncü parti sertifika otoritelerinin kök sertifikaları kullanıcı tarafında önceden yüklüdür. Tarayıcı ayarlarından yola çıkarak önceden yüklü kök sertifikaları görebilmekteyiz.

Sertifika Geçerliliği

Bir sunucuya yüklenen sertifika https protokolü üzerinden kullanıcı bilgisayarın WEB tarayıcısına gönderilir. Kullanıcının web tarayıcısı sertifikanın doğruluğunu denetler. Tarih ve zaman doğrulaması gerçekleştirir. Burda bir örnek vermek gerekirse, bilgisayarınızın tarih saat ayarlarını 100,200 sene geri veya ileri alın ve https kullanan bir siteye girmeyi deneyin. Bakalım ne ile karşılaşacaksınız.

Sertifika İsteği Oluşturmak

Bir sunucu üzerinde SSL sertifika isteği oluşturmak, Windows işletim sistemleri için IIS üzerinden kolayca yapılabilmektedir. IIS kullanıcı panelinden Sunucu Sertifikaları penceresinden sağ paneldeki Sertifika İsteği Oluştur sekmesinden sertifika isteği kolayca oluşturulabilir. Oluşturulan sertifika isteği, üçüncü parti bir sertifika otoritesine gönderilerek onaylı bir sertifika edinebiliriz.

SSL Sertifika İsteği
SSL Sertifika İsteği

Sertifika Yüklemesi

Edindiğimiz sertifikayı yine IIS üzerinden sunucuya Sertifika İsteğini Tamamla sekmesinden yükleyebiliriz. Sunucuya yüklenen sertifikayı bir web sitesine bağlamak için ise IIS üzerinde şu yolu izleyebiliriz.

Web Sitesine Sertifika Bağlama
Web Sitesine Sertifika Bağlama

Burada dikkat edersek bağlantı noktası(portu) olarak 443 numaralı bağlantı noktası verilmiştir. Çünkü https protokolü, 443 numaralı bağlantı noktası üzerinden iletişim kurabilmektedir.

Kitap – Head First Design Patterns

21 Ağu
Head First Design Patterns
Head First Design Patterns

Kitaplar serisine ait bu yazıda Hear First Design Patterns isimli kitabı incelemeye çalışacağız. Kitabın yazarları Eric Freeman ve Elisabeth Freeman‘dır. O’REILLY yayınlarından çıkmıştır. Amazon üzerinden bu kitaba ulaşabilirsiniz.

Kitap 638 sayfa olup dili İngilizcedir. İngilizce seviyesi ortanın üstünde olmayanlara bu kitabı önermem.

Head First Design Patterns tasarım şablonlarını nesneye yönelik programlama teknikleri ile harmanlayarak işlemiştir. Anlatımı gayet akıcıdır ve anlaşılması kolaydır. Konuları düz metin ağırlıklı değil, resimlerle ve şekillerle güçlendirerek görsellik üzerinde anlatımını yoğunlaştırmıştır. Bu sayede konuların kolay anlaşılması sağlanmıştır.

Bu kitabı okurken Java bilgisine sahip olmanız gerekir. Örnekler Java programlama dili ile geliştirilmiştir. Ancak C# programlama dilini bilenlerin de okuyabileceği bir kitaptır. Java veya C# dillerinde uzmanlaşmış olmanıza gerek yoktur, nesneye yönelimli programlama tekniklerini bilmeniz yeterlidir.

Kitabı okurken hiç sıkılmadım. Örnekler gayet sade ve anlaşılır geldi bana. Tasarım şablonlarını öğrenmek ve uygulamak isteyenlere kesinlikle öneririm. Tabi ki bu kitap sihirli bir değnek değil. Okuyan herkes tasarım şablonlarının en iyi uygulayıcısı olacak diye bir kaide koymuyorum. Kitaptan aldıklarını kendi problemlerinize uygulamak size kalmış. Umarım faydalı olur. Tekrar görüşmek dileğiyle.

TDD Sizi Yavaşlatmaz

19 Ağu

TDD(Test Driven Development) yaklaşımı için ortaya atılan eleştirilerden biri kod geliştirmeyi yavaşlattığı yönündedir.  TDD yaklaşımı, yöntem olarak şelale(waterfal) tarzı yaklaşımdan çok farklıdır. Dolayısıyla şelale tarzı geliştirmeyi bırakmak demek eski alışkanlıklardan vazgeçmek demektir. Ben TDD yaklaşımını ilk uygulamaya başladığımda, kendimi sanki sağ ayakla futbol oynarken sol ayakla oynamaya alıştıran oyuncu gibi hissetim. Çünkü alışkanlığımın tersi bir durum söz konusuydu. Önce kodu yazıp sonra test etmeye alışmışken, önce testin yazılıp sonra kodun üretildiği bir ortamda buldum kendimi.

Eski yöntemde yazdığım kodu test etmek için kullanıcı arayüzü (form, console) hazırlamam gerekirdi. Bu da hayli bir zaman kaybı demekti. Test edilecek sınıfa ait üyeleri test etmek için kullanıcı arayüz hazırlamak zahmetli ve uzun süren bir işlemdir. Test arayüzünü hazırladıktan sonra, ilgili forma kritik test parametrelerini elle tekrar tekrar girip denemek gerekir. Örneğin matematiksel bir fonksiyonu hesaplayan bir metodu test etmek için önce parametrenin sıfırdan küçük, sonra sıfır, sonra sıfırdan büyük olması durumunu sürekli test etmek gerekebilir. Metodun özellikleri arttıkça test sayısı da artar. Arada bir hata alırız ve hatayı düzelttikten sonra testleri tekrar yapmamız gerekir. Test senaryoları arttıkça, elle yapılan işlem sayısı da doğru orantılı olarak artar.

Testlerin elle yapılmasının gereksiz yere zaman harcadığını fark eden yazılımcılar, test sürecinin otomatik işletilmesi gerektiğine karar vermiştir. Tek bir tuşa basarak yazılımın bütün testlerini çalıştırıp kısa bir süre içinde geliştiriciye sonucu veren araçlar geliştirilmiştir. Bu araçlar sayesinde testler hızlı bir şekilde yapılmaktadır.

TDD yaklaşımı testlerin otomatik bir şekilde çalıştırılması anlamına gelmez. Çalışan koddan önce testin yazılması anlamına gelir. Test öncelikli(Test First) yaklaşım olarak da adlandırılır. TDD yaklaşımında kodu yazan kişi, kodunu kullanıcı gözü ile görerek geliştirmeye çalışır. Bu yazdığım API veya Framework’ün kullanıcısı olsam nasıl bir sınıf ve metod yazardım diye düşündürür geliştiriciyi. Bu geliştiriciyi yavaşlatmaz. Kodlama yapan kişinin koduna olan güvenini arttırır. Kişi geliştirdiği koda hükmetmeyi öğrenir. Testler başarıyla gerçekleştiğinde kişi güvenilir bir kod ürettiğini bilir.

TDD yaklaşımında uzmanlar hızdan ziyade kaliteli ürün geliştirmenin önemli olduğuna vurgu yapmaktadır. Yani müşteri sizin hangi yöntemlerle geliştirme yaptığınıza değil ortada düzgün çalışan bir uygulamanızın olup olmadığına bakar. Puanınızı buna göre alırsınız. Kötü uygulamalar demek hata oranı yüksek, kullanımı zor ve zaman kaybettiren uygulamalar demektir. Kötü uygulamaların üzerine yeni özelliklerin eklenmesi veya mevcut özelliklerinin değiştirilmesi zordur. Test edilmeden hızlı bir şekilde geliştirip teslim edilen uygulamaların bakımı ve ilerletilmesi sonraki aşamalarda zaman kaybettirici olacaktır. Değişimin zamanında yapılamaması da müşteri memnuniyetini önemli ölçüde azaltacaktır. Hiçbir müşteri binlerce satır boş koda para harcamak istemez. Binlerce satır kod yazmış olmak kişiyi iyi bir geliştirici yapmaz. (Ancak bazı kariyer ilanlarında aranan programcı kriterleri arasında “10000 bin satır kod yazmış olmak” şeklinde komik maddelere rastlarız)

TDD ile geliştirme yaparken çalıştırdığınız testlerin sonucunu almak çok uzun sürüyorsa bu durum, kodunuzu direkt olarak bir veritabanına veya bir dosya sistemine veya bir ağa bağımlı olmasından kaynaklanıyordur. Testlerin hızlı çalışması açısından kodların bu tür ortamlardan izole edilmesine dikkat edilmelidir. Test ortamında bu şekilde hız kazanmak mümkündür. Gerçek veritabanı ile dakikalarca sürecek testleri izole edilmiş ortamlarda saniyeler içinde gerçekleştirmek mümkündür.

TDD yaklaşımı genel olarak uygulamanın geliştirme sırasında ve ömrü boyunca devamlılığının sağlanabilmesi açısından size hız katar. Bir  çok firmanın sonraki versiyonlarını çıkaramadığı için çöpe giden uygulamaları vardır. Bir kurumda çalışan bir tanıdığımın anısıyla sözümü bitirmek istiyorum. Kurumuna yazılım yapan firmadan, mevcut yazılıma yeni bir özellik eklemesini istemiş. Firmanın verdiği cevap ise şu olmuş:  “Sen şimdi bir binanın aradaki bir katını kır ve araya bir kat ekle diyorsun, bu çok zor”.

Blog sayfam 2 yaşında

19 Ağu

19.08.2011 tarihinde web dünyasına açtığım blog sayfam artık 2 yaşında. 2 yıl önce kişisel bilgisayarımda metin dosyalarında biriken notlarıma her yerden ulaşabilmek ve onları unuttuğumda hatırlayabilmek için açtığım bir sayfadır blog sayfam. Zamanla gelen olumlu yorumlar bana yazılar yazmanın insanlara da faydalı bir aktivite olduğunu öğretmiş oldu. Bunun mutluluğunu da burada ayrıca paylaşmak istedim. Okuyuculardan gelen bir teşekkür bile içimde yeni yazılar yazma isteği uyandırıyor. İkinci yılı geride bıraktığım bu günlerde tüm okuyucularıma da teşekkürlerimi sunuyorum.