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

Java’da Multithreading – Bölüm 11: Semaforlar

Semaforlar (Semaphores) -genelde- bir kaynağa erişimi kontrol etmek için kullanılan sayaçlardır. Kilit mekanizmaları gibi threadlerin senkronizasyonu için kullanılırlar fakat kilitlerden farklı olarak bağımsız threadler tarafından serbest bırakılabilirler (release).

HATIRLATMA! Bir thread tarafından elde edilmiş kilidi başka bir thread serbest bırakmaya kalktığında ”IllegalMonitorStateException” istisnası fırlatılır.

Örneğin programımızın bir sunucuya eş zamanlı isteklerde bulunması, ancak programımızdan o sunucuya eş zamanlı maksimum üç bağlantı olmasını istiyoruz. Tam da semaforlarla çözülebilecek bir durum. Kısıtlı kaynağımız “bağlantı sayısı”, üst sınır değeri ise “3”. Öyleyse 3 izinli (permit) bir semafor işimizi görecektir.

“java.util.concurrent.Semaphore” sınıfı kurucusu “permit” (izin) adlı bir parametre almaktadır. Bu değer ilgili kısıtın üst sınır değerini ifade eder. Örneğimiz için ifade edecek olursak, her bir thread bağlantı oluşturdukça semaforun “acquire()” (elde et) metodu ile semafordan bir izin alacaktır. İki thread daha bağlantı oluşturduğunda izin değeri “0” olacağından yeni bir thread izin istediğinde verilecek izin kalmadığından yeni threadler bekletilecektir. Ta ki önceki threadler işlerini bitirip -semaforun ”release()” metodunu kullanarak- aldıkları izni iade edene kadar.

Örnek programımız sunucu bağlantısı kurmaya çalışan 10 adet threadi oluşturup başlatan bir “main” metodu ve kontrollü bir şekilde sunucu bağlantılarını gerçekleştiren bir “Connection” sınıfından meydana gelmekte:

public class Application {

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

        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                try {
                    Connection.getInstance().connect();
                } catch (InterruptedException e) {
                }
            });
        }

        executorService.shutdown();
    }

}

“Connection” sınıfı: Okumaya devam et