My Profile Photo

Mehmet Cem Yücel


Technical Writings.
Architecture, Security, Java, Golang, Devops, Microservices, Spring Boot, Kafka, Distributed Systems and Blockchain


  1. Java Final Keyword ve Performans Etkileri

    Bugün zaten bildiğimiz final anahtar kelimesine biraz farklı açılardan bakacağız. Hatırlamak için; final anahtar kelimesi kullanıldığı …


  2. Chain Of Responsibility Design Pattern

    Bugün behavioral(davranışsal) bir design pattern(tasarım şablonu) olan Chain of Responsibility(Sorumluluk Zinciri) inceliyor ve örnek yapıyor olacağız. Şablonu kısaca özetlememiz gerekirse, belirli fonksiyonları ardı sıra gerçekleştirmesini beklediğimiz sınıflarımıza bu yetenekleri sağlamak istediğimizde Sorumluluk Zinciri tasarım şablonunu kullanırız. Kalıtım hiyerarşisinde farklı davranışlar sergileyen subtype(alt tip)’ler için gayet kullanışlı ve genişleyebilir bir altyapı sunmaktadır. Örnek üzerinden ilerlemek daha verimli olacaktır diye düşünüyorum. O zaman hadi başlayalım. Senaryomuz bir araç yıkamacılarında geçiyor. Müşteriler araçlarını getirip yıkanması üzere yıkamacıya bırakıyor. Gelen her aracın tipine göre bazı farklı yıkanma adımları olacaktır, örneğin bir motosikletin iç yıkaması olmayacağı gibi bir otobüsün bagaj temizliği de herhangi bir arabanın bagaj temizliğinden farklı olacaktır. Peki bu farklı tipleri nasıl ayırt edecek sonrasında nasıl davranışlarımızı gerçekleştireceğiz? Hemen modellerimizi yaratarak işe başlayalım. Abstract bir Arac sınıfı ve bu sınıfı kalıtan Otobus, Araba ve Motosiklet sınıfları yaratıyorum. İlk adımda görüntümüz aşağıdaki şekilde; …


  3. Statik Kod Analiz Araçları

    İyi kod yazmak için dikkat edilmesi gereken bir çok detay var. Bazı zamanlar gereksiz döngülerde zaman harcarız kimi zaman da normalde yapmayacağımız hatalı kodlar yazarız. Hatta zaman zaman o hatalı kodlarımız çalışır, ta ki o kodun çalışmayacağı case gerçekleşene kadar. Bu hataları ve best practise’leri yakalayabilmek için 2. hatta 3. bir göz tarafından code review yaparız. Bizim gözümüzden kaçanları başkaları yakalar, kodu optimize ederiz. Ama hepimiz insanız, kimi küçük ayrıntıları gözümüzden kaçırabiliriz. Bu durumlarda kod analiz araçları imdadımıza yetişiyor. Kimi dinamik, kimi statik kurallarla çalışıyor. Kimisi best practice’leri, kimisi hatalı kodları, kimisi ise performans ölçümleri için iyi sonuçlar veriyor. Java için best practice ve hatalı kodları uyarmak için bulduğum kullanışlı bir tool örneği vereyim, FindBugs. Eclipse için plugini de bulunuyor, size uyarılar ve sebeplerini veriyor. Daha profesyonel bir çözüm için de SonarQube inceleyebilirsiniz. Ayrıca aşağıdaki adreste birçok dil ve ide için toolların bir listesi de bulunuyor. Kodunuzun kalitesini bu toollarla artırabilirsiniz. http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis …


  4. Mutable - Immutable Types

    Bugün bir çoğumuzun bildiği ama çoğu zaman dikkat etmediğimiz bir konuya dikkat çekmek istiyorum. Mutable(değişebilir) ve immutable(değişemez) tipler. Hangi veri tiplerimiz niçin bu özellikte, performansa etkileri ne şekilde bunlar üzerinde yorumlar yapacağız. Örneklerim java üzerinden olacak. Ufak bir örnekle başlamadan önce String tipinin aslında bir karakterler dizisi olduğunu, bu veri tipinin primitive(ilkel) bir tipi olmadığını hatırlatma gereksinimi duyuyorum. Bu örneğimizde string bir değişkenimize defalarca concatenating(bağlama) işlemi yapacağız. Iterasyon(tekrarlama) sayısını yüksek tuttum ki fark daha net anlaşılsın. Örnekte 100.000 kez, varolan bir stringin sonuna bir değer ekleme işlemi yapıyoruz. Bu işlem arasında geçen süreyi hesaplıyoruz. …


  5. java.lang.OutOfMemoryError

    Programlar bilgisayarlarımıza ilk kurulduklarında hangi argümanlara göre çalışacaklarına kendileri karar verirler. Default olarak gelen bu değerler her zaman uygulamamızın doğasına uygun olmayabilir. Örneğin enterprise uygulamalar üzerinde çalışıyorsak bu bu başlangıç değerleri projemizin isteğini karşılamıyor olabilir. Daha fazla bellek alanı tahsis etmemiz, işlemciyi isteklerimize uygun olarak kullanmak isteyebiliriz. Hatta belirlediğimiz uygulamaların bu kaynakları ne şekillerde paylaşacaklarını ayarlamamız da gerekebilir. Böyle durumlarda programların default olan değerlerini ihtiyacımıza göre değiştirmemiz gerekecektir. Bu gerek veritabanı, gerek uygulama çatısı olsun platformlar üzerindeki yönetimizi kolaylaştıran unsurlardır. Uygulamanızı uygulama sunucusunda deploy ederken, veya uygulamamız runtime’da iken bellek yetersizliği ile ilgili hatalar almış olabilirsiniz. Böyle durumlarda sunucuda kullanıma açılan bellek alanının yetersizliğinden dolayı uygulamamız kendisine gerekli olan alanı yaratamaz. Heap alanındaki aşırı doluluk durumu Garbage Collection ın temizliği sonrasında hafifletilebilmektedir. Ancak PermGen alanının statik olması uygulamaların ihtiyacı olan bellek alanının tahsis edilemediği durumlarda “ java.lang.OutOfMemoryError “ hatasına sebep olmaktadır. Java Sanal Makinası-JVM e dair bu bilgileri anlık kullanım verilerini elde etmek için JDK nızın içerisinde bulunan Java Virtual VM uygulamasını kullanabilirsiniz. C:/Program Files/Java/[ilgili jdk klasörü]/bin/jvisualvm altıdna uygulamaya erişebilirsiniz. Bilgisayarımdaki heap ve permgen kullanımınlarına dair görüntü aşağıdaki gibi. …


  6. C# ile DNS Degistirme Uygulaması

    Bildiğiniz gibi Youtube video paylaşım sitesine erişim ülkemizde engellendikten sonra bu kervana Google servisleri de eklenmişti. Bu durum elbette site ve servislere erişebilmeyeceğimiz anlamına gelmiyor. Erişebilmek için yöntemler de zaten birçoğumuz tarafından biliniyor. Bunlardan birisi tünel kavramı. Bazı siteler bizim ilgili siteyle kendi üzerinden bağlanmamız konusunda yardımcı oluyor. Bu sitelerden en popüler olanlarından birisi KTunnel mesela. Bir başka yol bilgisayarımızın sunucu dosyasını düzenlemekten geçiyor. Bizim bugün değineceğimiz yöntem ise DNS adresimizin değiştirilmesiyle alakalı. DNS’in ne olduğu ve bu sistemin nasıl çalıştığı hakkında bahsetmeyeceğim, isteyenler olursa buradan detaylı bilgi sahibi olabilir. Biz bilgisayarımızda bu adreslerin programatik olarak nasıl değiştirilebileceği üzerisinde duracağız. Kullandığımız dil C# olacak ve bir WPF uygulaması yaratacağız. Yavaş yavaş uygulamamıza giriş yapalım. Öncelikle bir bilgisayarda programatik olarak DNS değiştirmek için neler yapmak gereklidir? Internette epeyce araştırdıktan sonra bunun için iki farklı yöntemin olduğunu öğrendim. WMI (Windows Management Instrumentation) kullanarak yapılabildiği gibi bilgisayarımızda Registry ayarlarında oynamalar yaparak da bu işlemi gerçekleştirebiliyoruz. Biz 2. yöntemi tercih edeceğiz. Artık işin zevkli kısıma, kodlamaya, yavaştan giriş yapabiliriz. Programımızın arayüzü bu şekilde. Ağ bağdaştırıcısı seçildikten sonra var olan DNS IP’leri içerisinden istediğimizi seçerek DNS adresimizi değiştirebiliyoruz. İstersek bu adres listesine kendi istediğimiz sunucuların IP’lerini de aşağıdaki kısımdan ekleyebiliyoruz. Böylece kullanımı esnek bir yapıya taşımış oluyoruz. …


  7. Transaction marked as RollbackOnly

    Programlar bilgisayarlarımıza ilk kurulduklarında hangi argümanlara göre çalışacaklarına kendileri karar verirler. Default olarak gelen bu değerler her zaman uygulamamızın doğasına uygun olmayabilir. Örneğin enterprise uygulamalar üzerinde çalışıyorsak bu bu başlangıç değerleri projemizin isteğini karşılamıyor olabilir. Daha fazla bellek alanı tahsis etmemiz, işlemciyi isteklerimize uygun olarak kullanmak isteyebiliriz. Hatta belirlediğimiz uygulamaların bu kaynakları ne şekillerde paylaşacaklarını ayarlamamız da gerekebilir. Böyle durumlarda programların default olan değerlerini ihtiyacımıza göre değiştirmemiz gerekecektir. Bu gerek veritabanı, gerek uygulama çatısı olsun platformlar üzerindeki yönetimizi kolaylaştıran unsurlardır. Uygulamanızı uygulama sunucusunda deploy ederken, veya uygulamamız runtime’da iken bellek yetersizliği ile ilgili hatalar almış olabilirsiniz. Böyle durumlarda sunucuda kullanıma açılan bellek alanının yetersizliğinden dolayı uygulamamız kendisine gerekli olan alanı yaratamaz. Heap alanındaki aşırı doluluk durumu Garbage Collection ın temizliği sonrasında hafifletilebilmektedir. Ancak PermGen alanının statik olması uygulamaların ihtiyacı olan bellek alanının tahsis edilemediği durumlarda “ java.lang.OutOfMemoryError “ hatasına sebep olmaktadır. Java Sanal Makinası-JVM e dair bu bilgileri anlık kullanım verilerini elde etmek için JDK nızın içerisinde bulunan Java Virtual VM uygulamasını kullanabilirsiniz. C:/Program Files/Java/[ilgili jdk klasörü]/bin/jvisualvm altıdna uygulamaya erişebilirsiniz. Bilgisayarımdaki heap ve permgen kullanımınlarına dair görüntü aşağıdaki gibi. …


  8. Çanakkale 18 Mart Üniversitesi Gençsen Geleceksin 3.0

    Çarşamba günü bilgisayarımın başında yine tezimle cebelleşiyordum. Cebelleşme ne kelime, insan bir kütüphane yazar da bunun dökümasyonunu yazmaz mı !! Derken bir mail geldi, gençler “Gençsen Geleceksin” sunumu ellerinizden öper diye :) …


  9. Otomatik Fare Kontrolü

    Bugün interop servisleri aracılığıyla windows işletim sistemi üzerinde fare hareketlerini kontrol etme örneği yapacağız. …


  10. Buffer Nedir Niçin Kullanılır

    Buffer (tampon saha), verilerin IO işlemlerinden sonra belleğe yazılmadan önce uğradıkları bir sahadır. Bufferlar IO işlemi sırasında kullanıcının beklemesini engellemek için kullanılırlar. Bellekten okumak ve belleğe yazmak maliyetli bir işlemdir. Sistemi yorar ve hız olarak yavaştır. IO aygıtlarından gelen veriler bu sebeple önce bir havuzda toplanır. Böylece bu havuz belirli miktarlarda dolduktan sonra toplu olarak belleğe yazılır. Bu sisteme performans kazandıran bir harekettir. …