2013’te neler oldu?

Herkese merhaba,

Bu ay ne yazık ki bir blog yazamadım, bu sebeple çok kısa şekilde bu senenin ortaya karışık bır özetini/listesini paylaşmak isterim. Oldukça enteresan bir sene oldu, kabul edelim:

  1. Scala öğrenmeye başladım ve bir ticari projede Play framework kullanarak geliştirme yaptık. Bu proje şu anda canlı ortamda kullanıcılara hizmet vermektedir.
  2. Londra’daki QCON konferansına katıldım, gerçekten yazılım açısından etrafta neler oluyor bitiyor görebilmek adına inanılmaz faydalı bir konferans oldu. Buradaki izlenimlerimi elimden geldiğince başkalarıyla da paylaştım.
  3. Dünya’nın en güzel kızı için ardarda İtalya,Çek Cumhuriyeti,Hollanda ve Fransa’ya seri ziyaretler düzenledim. Hayatımın en güzel zamanıydı sanırım şu ana kadar. (Terhis olduğum anı her zaman ayrı tutarım)
  4. www.sporapp.com açıldı ve belirli bir kullanıcı sayısına ulaştı, emeği geçen herkesin eline sağlık : )
  5. Gezi direnişi gerçekleşti ve Türkiye’de siyasi bir dönüşümün başladığına artık herkes hemfikir. Hayal gibi olan bu olayların içinde tarihi yaşamış olmanın değerini şu anda bile tam olarak anlayabildiğimi zannetmiyorum.
  6. Uzun süredir uğraştığımız emek verdiğimiz BKM Express Mobil projesi hayata geçti. İki faz halinde projenin iPhone,Android ve HTML5 istemcileri piyasaya çıktı.
  7. Senenin ortasında ünite testi kullanmaya başladım, ardından da Kent Beck’in Test Driven Programming kitabını okudum. Artık yazılım geliştirmeye daha rahat ve daha sağlam bir açıdan baktığımı düşünüyorum.
  8. Arada Erlang öğrenmeye başlamıştım ama Coursera’dan mükemmel bir Scala dersi almaya başlayınca o yalan oldu, ona devam etmek istiyorum 2014’te.
  9. Sene sonunda Türkiye yine altına üstüne geldi, 2014’te hayırlısı diyoruz bakalım. : )

Kendimce baktığımda 5 üzerinden 4 verdiğim bir sene oldu. Umarım 2014 de güzel geçer diyeyim ve herkese iyi yıllar dileyeyim!!

Play Framework Sinir Stresleri – 1

Herkese merhaba,

Uzun aradan sonra play framework kullanarak birşeyler yapmam gerekti ki, yeni bir versiyonu çıkmış ve arkadaşlar  base versiyonu güncellemişler. Bunun sonucu olarak hepinizin eninde sonunda alacağı bir hata olan aşağıdaki güzellikle karşılaştım:

[error] (*:update) sbt.ResolveException: download failed: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
[info] Updating {file:/path/to/your/workspace/}asante...
[warn]  [NOT FOUND  ] org.slf4j#slf4j-api;1.6.6!slf4j-api.jar (0ms)
[warn] ==== local: tried
[warn]   /path/to/your/play/home/play-2.1.1/repository/local/org.slf4j/slf4j-api/1.6.6/jars/slf4j-api.jar
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::              FAILED DOWNLOADS            ::
[warn]  :: ^ see resolution messages for details  ^ ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
 İnternette aradığımda karşıma saçma sapan blog yazıları çıktı. Bu sebeple bu yazıyı yazma ihtiyacı duydum. Arkadaşlar bu hatanın sebebi, makinanıza kurulu olan Play versiyonu ile projenin Play versiyonunun farklı olmasıdır!!!! Bunu plugins.sbt den düzelttiğinizde sorun ortadan kalkacak.
Satir atlama
Örneğin sizde 2.1.1 vardı ve uygulama 2.1.3 kullanıyorsa bu hatayla karşılaşacaksınız demektir. Versiyonunuzu güncelleyin ve ilerlemeye devam edin.
Satir atlama : )
Web’de de karşınıza çıkan yok efendim 2.0.7 yap geçer, 2.1.5 te bu sorun yok gibi izansız ifadelere de önem vermeyin.
Satir atlama
İyi kodlamalar!

Bitcoin Üzerine Birkaç Not

Herkese selamlar,

Son günlerde oldukça konuşulan bir konu oldu Bitcoin. Silkroad olayında adını oldukça duyduğumuz bir konu, bir olgu oldu Bitcoin. Çok seven early adopterlar da var, bütün gücüyle karşı çıkan statükocular(heeey! sonunda ben de entel bir kelime kullandım) da. Ben de sizlere bir kaç izlenimimi aktarmak isterim. Merkez bankası olmayan bir para birimini ilerleyen günlerde de sıkça konuşacağımızı düşünüyorum.

Evet, Bitcoin’in ilk göze çarpan özelliği merkezi bir para birimi olmaması. Ne demek bu? Bu, Bitcoin’in hiç bir kuruluş,maden vs ile desteklenmediği demek. Yani kimse Bitcoin’ın stabil kalacağını garanti etmiyor veya arkasına belirli bir miktar altın veya başka az bulunan bir maden eklemiyor. Bu Bitcoin’in hem en çok övülen özelliği hem de en çok saldırı altında kaldığı noktalarından birisi. Yalnız şu unutulmasın ki, bankacılık sistemi hayata geçtikten çok sonra merkez bankaları kurulmuştur. Ve de bilenler bilir, ne hileler ve ne kumpaslar kullanılarak! Amaç, bir ülkenin kendi halinde olan para birimini, kontrol edecek bir yapı oluşturmak! E zaten merkez bankası olmadan varolabilmişse ekonomiler, neden tekrar varolamasınlar?

Bitcoin’i eleştirenlerin unuttuğu noktalardan biri de serbest piyasa mekanikleri. Bitcoin’in fiyatı değişkenlik gösterebiliyormuş! Bu yüzden güvenilir değilmiş! Bu parayı kim kontrol ediyormuş? Unutulan en temel noktalardan biri paranın da satın alınabilen bir meta olduğudur. E durum böyleyken, her şey için serbest piyasayı savunan kalantorlar, neden paranın kendisinin serbest fiyatını savunmazlar? Borsadaki hisselerin değerlerinin bir gün içinde ne kadar değişebildiğini farkedersek, Bitcoin’in fiyatının değişmesine de fazla şaşırmamak gerek. Sonuçta güven verdiği sürece fiyatı artar, güvensizlik yarattığında da düşer, bu kadar basit. He siz serbest piyasaya karşısınızdır, orası ayrı.

Hükümetlerin en çok sinirlendiği noktalardan biri de Bitcoin’in takip edilmesi zor bir para birimi olduğu. Bu yüzden teröristlerin, suç organizasyonlarının yaptığı işlemleri kontrol edemeyeceklerini iddia ediyorlar. Teröristlerin hareketlerini sadece para transferleri üzerinden kontrol edebiliyorlarsa zaten vay hallerine. Diğer yandan şaka gibi bir olay, Forbes’a göre FBI piyasadaki Bitcoin’lerin %1.5’unu kontrol ediyor. Buna rağmen Bitcoin’in anonimliği ise tamamen sizin özgürlüğünüz anlamına geliyor. Tabii ki her işlemde tek bir adres kullanırsanız. Arada işlemi doğrulayan bir Bitcoin madencisi dışında kimse olmaması kimsenin sizi izleyemediği anlamına gelmekte. Peki nedir bu Bitcoin madencisi?

Burası açıkçası benim de en az bildiğim kısımlardan. Henüz inceleme şansım olmasa da Bitcoin yazılımı en azından açık kaynak. Fakat çalıştırmanız için özel bir donanıma ihtiyacınız var. En azından sağlam bir GPU’nuz olmalı. Bitcoinler 50’şerlik paketler halinde dolaşıma açıldığından basit bir bilgisayarla bu Bitcoinlerin sizden çıkması ihtimali düşük oluyor. Burada yapılan şey esasında basit algoritma çözümleri, fakat hepsini tek bir işlemciyle yapmaya kalktığınızda sorun yaşayabilirsiniz. Diğer yandan bu sorunu çözmek adına Bitcoin maden havuzları oluşturulmuş. Bu gibi oluşumlarla insanlar işlemci güçlerini birleştirerek kazanılan Bitcoin’den kendilerine düşen küçük payları alabiliyorlar. Bu ve bunun gibi teknikler aslında sistemin güvenilirliğini de artırıyor, çünkü madenciler aynı zamanda işlemleri kriptografik olarak da onaylıyorlar. Bunun karşılığında da para kazanıyorlar. Bir nevi İsmet İnönü’nün namusluların cesurluğu ilkesine benziyor. (Burada da bir cehape zihniyeti söz konusu yani : p)

Neyse uzun lafın kısası, oldukça enteresan bir dijital para birimimiz olmuşa benziyor. Bu konuda daha çok bilgi edindikçe gerek bu yazının güncellemeleri gerek de yeni yazılarla sizleri bilgilendiriyor olacağım.

Görüşmek üzere.

Mercurialda repoları web üzerinden paylaşıma açmak

Merhabalar,

Bu yazımda Linux üzerindeki bir Apache sunucusu üzerinden mercurial repolarının paylaşımını açıklamaya çalışacağım. Basit bir sırası var, aşağıdaki maddeleri takip edin lütfen.

  • İlk olarak gerekli klasörleri oluşturun, bunlar sırayla : /var/hg/repositories ve /var/hg.
  • Daha sonra /var/hg altında hgweb.config isimli bir dosya oluşturun. Dosyanın içine şunları yazın:

[web]
style = gitweb

[collections]
/var/hg/repositories = /var/hg/repositories

  • Ayar dosyasını oluşturduktan sonra Apache sunucusunun hgweb i çalıştırabilmesi için hgwebdir.cgi dosyasını oluşturun. Bu dosyanın içeriğine aşağıdakileri yazdırın.

#!/usr/bin/env python
from mercurial import demandimport; demandimport.enable()

import cgitb
cgitb.enable()

import os
os.environ["HGENCODING"] = "UTF-8"

from mercurial.hgweb.hgwebdir_mod import hgwebdir
import mercurial.hgweb.wsgicgi as wsgicgi

application = hgwebdir('hgweb.config')
wsgicgi.launch(application)

  • CGI betiğini hazırladıktan sonra apachenin kendi klasörüne dönüyoruz. Ubuntu da bu klasör /etc/apache2 şeklinde oluyor. Burada bir mercurial klasörü oluşturuyoruz. mkdir mercurial
  • Bu klasörün içine girip, mercurial.conf dosyasını oluşturuyoruz. Bu dosyanın içine şunları yazıyoruz:

ScriptAliasMatch ^/mercurial(.*) /var/hg/hgwebdir.cgi$1
<Directory "/var/hg/">
Options Indexes FollowSymlinks MultiViews ExecCGI
AllowOverride All
Order allow,deny
Allow from all
AuthType Basic
AuthName "Mercurial Repositories"
AuthUserFile /var/hg/hgusers
Require valid-user
</Directory>

Bu sayede demin oluşturduğumuz klasörün apache üzerinden servis edilmesini sağlıyoruz.

  • Mercurial’ın dışarı açılması için gerekli bir adım daha: apachenin içindeki sites-available klasöründe, az önce oluşturduğumuz ayar dosyasının sunulmasını sağlamak. Bunun için sites-available klasörüne girip, örneğin default dosyasına şu satır eklenmelidir: Include /etc/apache2/mercurial/mercurial.conf
  • Herşeyin normal olduğunu kontrol etmek için su komutu çalıştırın: sudo apache2ctl configtest
  • Daha sonra apacheyi tekrar başlatalım; eğer bir sorun olmazsa siteniz/mercurial adresine girdiğinizde güzei bir görüntü olmalı 🙂 :
$ sudo apache2ctl stop
$ sudo apache2ctl start

Unit Testing

Selamlar,

Bu aya da bir yazı yetiştirdim. Sayılır : )

Çalıştığım şirket için bir Unit Testing eğitimi hazırlamam gerekti. Bunun için kurguladığım sunumun dosyasını SlideShare üzerinden paylaşıyorum. Umarım başlangıç yapmak isteyen arkadaşlara bir yol açmış olurum.

İyi çalışmalar.

Link: Slide Share sunumu

Web sayfasından iPhone uygulaması açmak

Selam arkadaşlar,

Ne zamandır yazamıyorum, malum ülkenin gündemi aşırı yoğun. Haliyle insanların dikkati de başka yönlere çekiliyor ister istemez. Bu sebeple iki yazı arasına bayağı bir süre geçti kusura bakmayın.

Bir web sayfasından nasıl iPhone uygulamasının açıldığını gösteren örnek bir kod paylaşmak istiyorum bu yazıda sizlerle.


<script language="javascript">

$(document).ready(function () {

var time = (new Date()).getTime();

var url = "your_app://functionality?someparam";
 window.location = url;

setTimeout(function () {

now = (new Date()).getTime()

console.log( "opened time:" + time);
 console.log( "now: " + now);

if ( now - time < 2500 ){
 //if the interval is bigger than 2500 ms, user probably opened the app
 window.location = "download_link";
 }
 }, 2000); //will wait for 2seconds before going to itunes
 });

</script>

Burada çok basit bir şekilde url scheme belirtmiş bir uygulamanın web siteden açılma denemesini görüyorsunuz. Burada önemli bir nokta, uygulama açılmazsa download_link adresine yapılan yönlendirme. Bu yönlendirmede zamanın önemi var çünkü her hangi bir kontrol yapmadığınız takdirde, uygulamanız açılsa bile indirme adresine yönlendirme oluyor. Bu yüzden zaman kontrolüne dikkat etmekte fayda var.

Mobil tarayıcıdan uygulamasının açılmasını isteyen arkadaşların işine yaraması dileğiyle,

Herkese iyi çalışmalar

Scala’da case classes, pattern eşleştirme ve exception handling

Evet arkadaşlar selamlar,

Bu blogda arada sırada Scala yazmaya çalışıyorum. Bu ay da Scala’nın bazı özelliklerinden kısaca bahsedeyim istedim. Bu yazıda case classes, kısaca pattern matching ve exception mantığından bahsedeceğim sizlere.

Case classes, normal class mantığından bir kaç sentaktik şeker vererek ayrılan bir olgu. Case class kullandığınız zaman constructorda verdiğiniz parametreler için otomatik olarak içerde private alanlar oluşturuluyor ve bu alanlara yine constructorda verdiğiniz parametre isimlerinden erişebiliyorsunuz. Bu sayede basit POJO lar oluşturmak oldukça kolay hale geliyor. Basit bir örnek vermek gerekirse:

case class Person(firstName: String, lastName: String)

val me = Person("Erkan", "Ahmet")
val first = me.firstName
val last = me.lastName

if (me == Person(first, last)) {
  println("Found myself!")
  println(me)
}

Gördüğünüz gibi bütün sınıf tek bir satırdan oluşmakta. Gerçi bu kavramın adındaki Case nedir diye düşünenleriniz vardır, az bekleyin.

Gelelim pattern matching’e. Java da bu mantık switch case ler üzerinden yürüyor bildiğiniz gibi. Yalnız bu yapı sadece primitif tipleri kontrol edebiliyor. Bu da sizi eninde sonunda bir integer a yada bir enum değerine kadar indirebiliyor. O kadar karmaşık sınıflar yazıyor ama karşılaştıramıyoruz.

Bu soruna Scala’da amcalar neşter atmışlar. Temelde Java’dan ayrıldığı bir kaç noktayı aktaralım:

  1. Case statementları birbiri içine girmezler, yani gidip de hepsine break yazmak zorunda değilsiniz.
  2. Case statementları bir değer dönerler, bunu olduğu gibi kullanabilirsiniz, bu sayede daha az satır kod yazmış olursunuz.
  3. Case statementlar, patternleri eşleştirebilirler, bunun en güzel örneği ise case class kullanımında görülür.

object Scenario{
def apply(user: String, action: GameElement) = {
action match {
case workout: Workout => new WorkoutScenario( workout, user )
case like: Like => new SocialScenario( like, user )
}
}
 }

 

 
Örnekte gördüğünüz üzere, action nesnesi match blokuna sokuldu. Match blokunda, bu action sınıfından türemiş diğer sınıflarla karşılaştırıldı. Bunlar Workout ve Like. Bunlardan hangisi ile eşleştiyse de, buna uygun bir nesne üretildi ve geri dönüldü. İşte ben buna factory pattern derim. Hatta demem, çünkü ortada pattern denecek kadar bir kod parçası yok. : )

Peki gelelim exception handlinge. Scala bu işe de el atmış durumda. Normalde bir noktadan exception throw ederdiniz. Burada sorun yok. Fakat yakalayacağınız yerde, her bir exception tipi için ayrı ayrı blok açar ve ne yapacağınızı şaşırdınız. Scala ise exception handling’de de pattern matching kullanarak, işimizi bir adım daha kolaylaştırıyor.

Örnek vermek gerekirse

</pre>
<address>try{

workoutItems.foreach(item => {
...
if (repeat <= set.repeat_number.toInt) {</address><address>              ....
throw BadgeWon("pushup badge won!")
}

})
}
})

}
catch {
case e:BadgeWon => println("found the badge: " + e.message)
case e => {
println("general exception" + e.getMessage )
e.printStackTrace()
}
}</address><address>
Gördüğünüz gibi çok daha kısa bir kod parçası ile, exceptionlarınızı da yönetmeyi başardınız. Scala kullandıkça özelliklerini daha da çok seveceksiniz.
Önümüzdeki yazıda function literals konusuna değinmek istiyorum, herkese iyi günler!

QCON 2013

Herkese merhaba,

Bu sene çalıştığım şirket tarafından QCON 2013’ü izlemek üzere Londra’ya gönderildim, dönüşte izlenimlerimizi bir blog yazısı olarak aktarmamız istendi, bu amaçla aşağıdaki yazıyı kaleme aldım, umarım beğenirsiniz.

What happened at QCON 2013 London?

This year I was one of the two engineers that my company sent to attend to QCON London. We tried to split as we encounter interesting presentations that seem useful to us and our company’s main line of work. Below you will find the main summary and the trending topics of the event.

One of the main line of topics was Best Practices in Web Development, we have seen so many things that we feel in our guts when we are developing but yet did not find its way into our practice somehow. Most prominent examples were anti-patterns like sessions and cookies, usage of javascript and css, semantic html and web sockets. Session usage being an anti-pattern was the most important aspect of those talks. Now I am really convinced that sessions must only be used in development mode, then must be switched to something else, like databases or memory cache structures in the software life cycle.

 

Another interesting aspect of the conference was the real world scenarios. Those were the cases where big companies or big projects encounter problems that can take companies/projects down. It was a very useful series, we have seen NOSQL products in action. Also we have seen a trend where people are migrating to JVM and started to use functional languages like Scala and Clojure.

 

Agile Practices was another interesting topic in the series. Everyone knows that they must be followed, but none follows them well in Turkey. Especially Pair Programming, Retrospection and Iterative Development models are practices which every development team that calls itself agile must follow. Companies that calls themselves agile and customer-driven must also follow these, at least as guidelines.

Key Notes were very successful in my opinion. Barbara Liskov’s entry to conference was really refreshing about where the software came from and where it must go. Damian Conway was a real presentation expert and inspired a lot of people. His main theme was also a very important one that programming languages determine the way you think, therefore more powerful and abstract languages make your thinking more powerful. By the way I must add that he wrote a Latin interpreter just for the sake of the presentation!! There was also a key note called 8 Lines of Code that changed my view of Spring frameworks. It was very inspiring and challenging.

REST was also a very important topic at the conference. Because everyone talks about how they do their API’s in REST, but no one actually does it right. I know that because I was not doing it right. We get the chance to learn the powers of REST and after this conference, will try to use it at every opportunity. I also inspected that the simplicity of REST does not mean it is easy.

Last but maybe the most important topic of the conference was NOSQL technologies. A lot of NOSQL companies were sponsors of the conference so it is logical to see so many presentations. But the numbers and the use cases shows us that this technology is here to stay. And it is powerful. And it is useful. And the beauty is, everyone can break their own motherships to use new technologies piece by piece. The challenge and the beauty lies in this situation.

As for the summary, QCON really showed us great trends and useful presentations. Many of the presentations were also a lot of fun so we did not dose of sleep in any of the presentations : ). Every competing software company needs to follow this conference every year if it wants to stay competitive and succeed.

 

Exception Handler ve rahatlığı

Arkadaşlar merhaba,

Sizlere bu yazıda kısaca Spring MVC frameworkteki Exception Handler annotationından bahsedeceğim. Bu konu özellikle REST arayüz yazan arkadaşların işine gelebilecek bir teknik.

spring

spring

Malum bir REST arayüz yazdığınız zaman esasen bir API yazmış oluyorsunuz. Haliyle API nizin bir çok metodu oluyor. Bu metodların hepsinde exception handle etmek de can sıkıcı bir durum. Bir süre sonra her metodda exception handle ederseniz ortaya ciddi miktarda tekrarlayan kod çıkacaktır.

Bunu önlemek için geliştirilen çözümlerden biri filtreleri kullanarak fırlatılan exceptionların filtre seviyesinde yakalanması ve işlenmesidir. Ama bu çözüm bütün web trafiğiniz üzerinde  çalışacağından, tüm kodunuzun buna uyumlu olmasına özen göstermeniz gerekiyor.

Diğer yandan yine Spring’in önerdiği bir çözüm ise, hata durumlarına karşı çözücüler yazarak kullanıcıyı istenilen hata sayfalarına yönlendirmek. Fakat bu da REST arayüz yazan  arkadaşların işine pek gelmez çünkü bizim dönmek istediğimiz değerler genellikle JSON nesneleri oluyor.

Bu durumda ortaya ExceptionHandler annotation ı çıkıyor. Bu annotation ı kullanmak için ilgili controllerin, yakalayacağı exception tipini vermeniz gerekli. Kullanacağı metodun içerisinden de istediğiniz loglamaları yaparak gerekli hata nesnesini dönebilirsiniz. Bu bir JSON nesnesi de olabilir, istediğiniz her hangi bir model ve view nesnesi de olabilir.

@ExceptionHandler(AddressNotFoundException.class)
   @ResponseStatus(value=HttpStatus.NOT_FOUND)
public ModelAndView handleAddressNotFoundException(AddressNotFoundException exception) {
ModelAndView modelAndView = new ModelAndView(“nocontact”);
modelAndView.addObject(“message”, exception.getMessage());
return modelAndView;
}

Bu örnekte ModelAndView sınıfı kullanılmış ama burada pek ala ResponseBody annotation ile birlikte bir POJO dönülebilirdi. Bu metodun güzelliği olayı inheritance ile birlikte kullanınca ortaya çıkıyor. Sadece tek bir exception handler metoduyla bütün bir REST apinin exception sorununu çözebilirsiniz. Tek yapmanız gereken Exception Handler metodunu, kullanacağınız base bir controllerın içine yerleştirmek ve işte sağlam yapınız artık hazır!!

Exception ve Throwable Ayrımı

Herkese merhaba,

4-5 saattir bir hatayla uğraşıyorum. wsimport marifetiyle bir web service clientı oluşturdum ve endpoint interface ini alarak çalışmaya başladım. Fakat kodu çalıştırdığımda, ne zaman endpoint interfaceini almaya kalksam kod sessiz bir şekilde hata veriyordu. Sadece bir controllerımdaki finally’e yakalanıyor, sonra da başarısız cevap dönüyordu.

Nasıl olur da hiç bir exceptiona yakalanmaz diye düşünürken, Java’da sadece Exception fırlatılmadığını, Throwable da fırlatıldığını hatırladık bir şekilde. Bu durumda Throwable aradık ve sonuca ulaştık, en azından yaşadığımız hatayı bulabildik. Aklıma iyice kazınsın diye de sizlerle paylaşıyorum arkadaşlar, dikkatli olun ;).

java throwable yapısı

java throwable yapısı