Erik Meijer’e Göre “Reactive” Olmak

Erik Meijer “Reactive” denildiğinde şu yan etkileri (side effects) ele alacak şekilde tasarlanmış arabirimler kullanarak programlama yapılmasının anlaşılması gerektiğini vurguluyor:

  • Değerin “null” olup olmama durumu (Optional)
  • İstisna/hata durumları (Exception)
  • Gecikmeler (Latency)

Reklamlar

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

Uzaktan Çalışmak (Remote Working)

Projenin başlamasının birinci ayından itibaren dahil olduğum n11.com ailesine 2 yıl 9 ayın ardından geçen ay veda ettim.

Ve geçen haftadan itibaren Infoowl‘da çalışmaya başladım. Infoowl’ın gayet eğlenceli ve bol “context switch”li bir çalışma tarzı var. Bolca yeni şeyler deneyip gerçekleştiriyoruz.

Infoowl’da çalışmanın diğer bir güzel yanı ve bu yazıyı yazma sebebim ise uzaktan çalışabilme kültürü. Eğer yapacağın işler belliyse ve müşteriye değmen gereken durumlar yoksa evden çalışabilme esnekliğin var. Geçen Perşembe ve Cuma günleri evdeydim. (Elbette yöneticimin teşvikiyle)

İstanbul trafiği düşünüldüğünde uzaktan çalışmak adeta bir nimet. Fakat benim gibi daha önce uzaktan çalışma tecrübeniz yoksa evde çalışırken konsantre olmakta zorluk yaşayabilirsiniz. Bu duruma kendimce bir çözüm buldum. Çözümüm çok basit; 8 saatten geriye sayan bir sayaç kullanıyorum. Sabah kalkıp çalışmak üzere masama oturduğumda sayacı başlatıyorum, ve her mola verdiğimde sayacı duraklatıyorum. Tekrar çalışmaya başladığımda ise devam ettiriyorum. Sayacın varlığı çalışmam gerektiğini bana hatırlatıyor, böylece konsantrasyonum çabucak dağılmıyor. Sayacı sürekli görmem gerekmiyor. Zaten öylesi sıkıcı ve daha dikkat dağıtıcı oldurdu sanırım. Dikkat edilmesi gereken tek nokta her molada sayacı duraklatmayı unutmamak. Bunun sayesinde öğle arasında film izlemek istediğimde film bittikten sonra kaç saat daha çalışmam gerektiğini biliyorum. 8 saatlik çalışma maratonum bittiğinde ise iş verenime karşı sorumluluğumu yerine getirdiğim için vicdanımın rahat oluyor.

Infoowl’daki uzaktan çalışma sürekli değil, bahsettiğim koşullar sağlandığında mümkün olan bir esneklik. Ancak ülkemizde ve dünyada “sürekli” uzaktan çalışmayı destekleyen firmalar da var:

Türkiye’den (benim bildiklerim, umarım başkaları da vardır)

  • Startup Kitchen: Önceden Tart New Media adıyla anılan firma önce ismini Startup Kitchen yaparak yeni bir yapılanmaya gitti, daha sonra ofisi mofisi kapatarak tümüyle uzaktan çalışma modeline geçti. SlideShare’deki şu sunumları ile uzaktan çalışmanın nasıl mümkün olabileceğini ve uzaktan çalışmalarının nedenlerini güzelce özetlemişler. Sunumda bahsi geçen bir kitap var: Remote – Office Not Required. Yukarıdaki basit çözümümün ötesine geçip biran önce bu kitabı okusam iyi olacak sanırım.
  • Enver Altın‘ın şurada bahsettiği çalışma modeli. Startup Kitchen gibi bu modelde de çalışmak isteyenlerin ek iş olarak yapmasına sıcak bakılmıyor. Uzaktan çalışmanın bir güzelliği olarak farklı illerden çalışmak mümkün hale geliyor. Ayda bir iki kere düzenlenecek yüzyüze toplantılarda farklı illerden çalışanlar da unutulmamış: “ayda en az bir-en cok iki defa guzel bi yerde yuzyuze toplaniyoruz, gelebilirseniz iyi olur ama sart degil (uzaktan geliyorsaniz yol masraflarinizi karsiliyoruz).”

Dünya’dan

  • teamed.io: Daha önce şu yazıda bahsetmiştim. CV’niz ile başvuruyorsunuz. Size saat ücreti bazında bir teklifte bulunuyorlar ve kabul ederseniz size atanan ısındırma “issue”su ile kodlamaya başlıyorsunuz. Size atanan işler saat üzerinden puanlanmış durumda. Örneğin iş “3 saatlik” diye belirlenmişse siz işi teslim ettiğinizde (ve yaptığınız geliştirme kabul edildiğinde) siz gerçekte kaç saatte tamamlamış olursanız olun (elbette bir son teslim tarihi var) size saatlik ücretiniz çarpı 3 kadar bir ücret ödeniyor. Ücretlendirme bu şekilde olduğu için ek iş olarak da yapmanız mümkün. Son olarak, kod kalitesine çok önem veriyorlar. Hatta teamed.io kurucusunun açık kaynak projeler için para ödüllü (4096 dolar) bir “kod kalitesi yarışması” dahi var: http://www.yegor256.com/award.html. teamed.io’ya Türkiye’den başvuran ve kabul edilen bir kaç tanıdığım var. Saatlik ücret olarak 30 dolar teklif aldılar.
  • Stack Overflow Jobs yurtdışında iş arıyorsanız oldukça güzel bir başlangıç noktası olabilir. Arama yaparken “Allow Remote” kriterini seçili hale getirirseniz uzaktan çalışma imkanının da olduğu ilanlara çabucak erişebilirsiniz.

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