“Unit Testing” Sunumu

EFT Software’de çalışırken, “unit test” yazma konusundaki deneyimlerimizi geliştirme takımının geri kalanıyla paylaşmak için hazırladığımız “Unit Testing & Spring Test Framework – Testing Software From Developers’ Point-of-View” başlıklı sunuma aşağıdaki bağlantıdan erişebilirsiniz:

http://slides.com/ufukuzun/unit-testing-extended

Screen Shot 2017-04-19 at 00.30.54

 

Reklamlar

Başı-Boş Satırlar – IntelliJ ile Bahar Temizliği – Bölüm 2

Geçenlerde IntelliJ’de tek bir hamlede tüm Java kodumuzun biçimsel düzenini sağlamanın yöntemine göz atmıştık: Kodunuza İyi Bakın – IntelliJ ile Bahar Temizliği

Şimdi ise Java kodumuzdaki tüm gereksiz boş satırları silmenin yolarına göz atacağız. Birinci bölümdeki yöntemi uyguladıktan sonra “Edit > Find > Replace in Path…” özelliğini uygun regexler ile kullanarak şunlardan kurtulabiliriz:

Kodun herhangi bir yerinde yer alan ard arda iki boş satırdan…

Text to find:
\n\n\n

Replace with:
\n\n

Metot gövdesi başlangıcındaki boş satırdan…

Text to find:
\) \{\n\n

Replace with:
\) \{\n

Metot gövdesi sonundaki boş satırdan…

Text to find:
;\n\n    }

Replace with:
;\n    }

Kodunuza İyi Bakın – IntelliJ ile Bahar Temizliği

Java derleyicisi kodunuzu biçimsel olarak nasıl düzenlediğinize karışmaz, kodunuzun derlenebilmesi için Java söz dizim kurallarına uymanız yeterlidir. Ancak kodunuzun okunabilir olması için kodunuzun biçimlendirmesine (format) dikkat etmeniz gerekir. Özellikle birden fazla kişinin çalıştığı büyük/orta ölçekli projelerde okunabilir kod eşittir bakımı yapılabilir kod denebilir.

Elbette kodun biçimsel düzeni okunabilir/anlaşılabilir kodun tek ön koşulu değil, yine de özenli olma yolunda iyi bir başlangıç olacaktır. (Yeri gelmişken okunabilir/anlaşılabilir kod yazmak üzerine müthiş tavsiyelerde bulunan şu kitaba göz atmanızı şiddetle tavsiye ederim: Clean Code: A Handbook of Agile Software Craftsmanship. Ya da şu yazı dizisine bir bakın derim: Clean Code’dan Notlar: Bölüm 1 — Temiz Kod Derken?)

Özellikle birden fazla kişinin çalıştığı projelerde zaman zaman acele yetişmesi gereken işlerden, kafa dağınıklığından yada basitçe kişisel ihmalden kaynaklı olarak -kodun hacminin de büyümesiyle- kodun biçimsel düzeni bozulmaya başlar. İşte burada bu bozuklukları topluca düzenlemede kullanabileceğiniz basit bir yöntemden bahsedeceğim. Favori Java editörüm olan IntelliJ IDEA‘da şu iki adımla tüm *.java dosyalarımızı topluca düzene sokmamız mümkün:

Adım 1: Tüm Java sınıflarımızı barındıran “src” dizinine (başka türde dosyalar da içerebilir elbette) sağ tıklayıp “Reformat Code” seçeneği seçilir:

reformat-them-all-step-1

Adım 2: Açılan “Reformat Code” penceresinde aşağıdaki seçenekler uygulanıp “Run” denilerek, tüm *.java dosyalarımızın düzenlenmesi yanında kullanılmayan ‘import’ deyimlerinden de arındırılması sağlanır:

reformat-them-all-step-2

Redis Sertifikasyonu

Redis açık kaynak bir veri yapısı saklama çözümüdür/sunucusudur. “In-memory”dir, hızlıdır, ölçeklenebilir… kısaca candır.

redis-white

Dahili olarak List, Set, Hash, Sorted Set gibi veri yapılarını destekler, bunların üzerinde işlem yapabileceğiniz fonksiyonlar sunar. Pek çok dil için istemci kütüphanesi mevcuttur. Örneğin Java için Jedis tercih edilebilir. Jedis metot isimlerini Redis’teki fonksiyon isimleriyle benzer olacak şekilde belirlediği için, terminalden Redis istemcisinde veri yapılarını ve fonksiyonları biraz kurcaladıktan sonra hızlıca Java uygulamanızda kullanmaya başlayabilirsiniz.

Redis’in resmi dokümantasyonunu oldukça beğeniyorum: http://redis.io/documentation. Ancak benim gibi önce genel konsptlerden bahseden webiner ya da çevrimiçi video kurslarla başlamayı seviyorsanız sizleri Okumaya devam et

Java ve Apache Commons Email Kütüphanesi ile Gmail Hesabından E-posta Göndermek

Java ile e-posta göndermek istiyorsanız standart Java Mail API yerine onun kullanımı basitleştiren Apache Commons Email kütüphanesini kullanmak yerinde olacaktır.

Aşağıdaki bağımlılığı pom.xml’imize ekleyerek işe başlayalım:

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-email</artifactId>
   <version>1.4</version>
</dependency>

Kütüphanenin bu yazıyı okuduğunuz andaki güncel versiyonunu öğrenmek için: http://mvnrepository.com/artifact/org.apache.commons/commons-email

E-posta gönderimini gerçekleştirebileceğiniz kodumuz ise şu şekilde:

Email email = new SimpleEmail();
email.setHostName("smtp.gmail.com");
email.setSmtpPort(587);
email.setSSLOnConnect(true);
email.setAuthenticator(new DefaultAuthenticator("ufukuzun.ce@gmail.com", "** Gmail parolanız **"));
email.setFrom("ufukuzun.ce@gmail.com");
email.addTo("ufuk.uzun@hotmail.com");
email.setSubject("Test Subject");
email.setMsg("Test Message");
email.send();

DefaultAuthenticator kurucusuna kendi Gmail bilgilerinizi girmelisiniz.

Örnek e-posta içeriğim düz metin (“Test Message”) olduğu için Email nesnesi olarak bir SimpleEmail sınıfı örneği kullandım. E-posta içeriğiniz HTML içerik olacaksa basitçe HtmlEmail sınıfını örneklemelisiniz.

Her şey güzel ancak çalıştırdığınızda şöyle bir hata mesajı ile karşılaşacaksınız: Okumaya devam et

Java’da Multithreading – Bölüm 13: Threadlerin Yarıda Kesilmesi (Interrupting)

Bu zamana kadar ki örneklerimizde “InterruptedException” istisnası ile sıkça karşılaştık. Bu istisna bir threadin çalışması yarıda kesildiğinde fırlatılır. Peki çalışmakta olan bir threadin çalışması nasıl yarıda kesilir? Gelin yaptığı işlem uzun süren bir threadi belli süre geçtikten sonra durdurmayı deneyelim. Bunun için “Thread” sınıfının sağladığı “interrupt()” metodunu kullanacağız:

public class Application {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Başladı.");

        Thread t = new Thread(() -> {
            for (int i = 0; i < 1E8; i++) {
                Math.sin(new Random().nextDouble());
            }
        });

        t.start();

        Thread.sleep(500);

        t.interrupt();

        t.join();

        System.out.println("Bitti.");
    }

}

Programın çalışması bittiğinde çıktısının şu şekilde olduğunu göreceksiniz: Okumaya devam et

Java’da Multithreading – Bölüm 12: “Callable” ve “Future”

Thread havuzlarını incelediğimiz bölümde görmüştük: “ExecutorService” sınıfının “submit” metoduna yapılacak işleri birer “Runnable” nesnesi şeklinde geçeriz, o da her bir “Runnable” nesnesi için bir thread oluşturur ve başlatır. “submit” metodu eklediğimiz her bir “Runnable” için bir “Future” döndürür. Bu “Future” nesneleri sayesinde asenkron işletilen bu görevlerin tamamlanıp tamamlanmadığını, yoksa iptal mi edildiklerini kontrol edebilir, hatta o görevleri iptal edebiliriz. Ayrıca yine bu “Future” nesnelerini kullanarak threadlerin dönüş değerlerini elde edebiliriz. Şaşırmış olmalısınız, çünkü “Runnable” arabiriminin “run()” metodu değer döndürmez, yani “void”dir. Değer döndürme ihtiyacımız olduğu durumlarda Java eş zamanlılık kütüphanesinde yer alan “Callable” adlı arabirimi kullanabilir, “submit” metoduna görevlerimizi “Callable” nesneleri olarak geçebiliriz. “Callable” arabirimi jenerik tiplidir ve sahip olduğu tek metot olan “call()” metodu “Callable” jeneriği için belirtilen tipte bir değer döner.

Aşağıda “submit” metoduna rastgele bir sayı dönen bir “Callable” geçtik. Çıktı olaraksa “Future” nesnesi üzerinden elde ettiğimiz bu rastgele sayıyı yazdıracak:

public class Application {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();

        Future future = executorService.submit(new Callable() {
            @Override
            public Integer call() throws Exception {
                Random random = new Random();
                return random.nextInt();
            }
        });

        executorService.shutdown();

        try {
            Integer result = future.get();
            System.out.println("Sonuç: " + result);
        } catch (ExecutionException e) {
            System.out.println("Çalışma zamanı hatası!");
        } catch (InterruptedException e) {
        }
    }

}

Okumaya devam et