Personal Update

Hi everyone,

You may have noticed that I returned back to writing in English. You may have also noticed that I returned back to writing itself :). The thing is there are some major changes that I need to write off and I’m glad to be back to writing again. (I will most certainly continue writing in Turkish as well by the way)

So If I did not count wrong, there are three big changes on the way for me. Let’s start with respect to the importance of each change.

I quitted my job at Monitise MEA where I was currently a Software Development Manager. I’d worked 3.5 years at Monitise and loved the most part of it. Being a Team Leader and later a Manager was fun, but I had decided that I should continue for a while on the dev path and started looking for something more technical. As a result, I did quit last week and the first week as unemployed was fun (I’m not sure it would continue this way but I don’t plan to stay unemployed for long).

devops-pic-1

Another one of the changes is that I will be switching lanes in my career. Above I mentioned I’d like something more technical and I did get it. But due to some luck (I’m not sure at this point if it is good luck or bad luck) I will work as DevOps engineer starting September. It will be a really fun job I’m sure and I’ll learn so much on the way but nevertheless I’m kind of switching to a more ops position with this move.

ireland

The last and the biggest of the changes is that I’m moving to Dublin, Ireland! I have been thinking about a move to a European capital for one year and I think I am very content that the capital would be Dublin by now. I’ve seen Cape Town, Utrecht and Amsterdam and Berlin on the way and they were really nice cities, but Dublin is my destiny, It seems for now. Leaving Turkey behind, leaving my family and my friends and most importantly getting physically separated from my beloved girlfriend will be the toughest change that I will be facing this year. Fortunately Istanbul and London are only a short flight distance to Dublin.

I will write more about each change and especially about where I will work, but first I need to reach Dublin and start working actually.

Thanks for reading this far : )

JAX-WS Web Servisleri ve WSGEN

Herkese kısa bir yazıyla merhaba,

Yine daha sonra kendime not olması amacıyla yazdığım bir yazıyla karşınızdayım. 3. 4. kez bu hatayla karşılaşınca artık geri dönüp bir yerlere çözümü not etmek gerektiğine karar verdim.

Java’da web servislerinizi JAX-WS yordamıyla açmak diğer yöntemlere göre kısa ve kolay bir yol. Lakin bu şekilde çalışırken, SoapBinding özelliğini DOCUMENT olarak girerseniz yada boş bırakırsanız yapmanız gereken başka işlemler de var.

Bu durumda sadece derlemeyle oluşturduğunuz sınıflar yeterli olmuyor. JAX-WS için gerekli olan diğer sınıfları ve dosyaları(wsdl ve xsd) sizin üretmeniz gerekiyor. Aksi takdirde şu meşhur:

Wrapper class paket_ismi.jaxws.methodName is not found. Have you run APT to generate them?

Hatasını alıyorsunuz.

Bu dosyaları üretmek ise oldukça kolay. Tek yapmanız gereken wsgen aracıyla gerekli dosyaları oluşturmak ve projenizde gerekli paketin içine taşımak. Bundan sonra tek yapmanız gereken tekrar bir paket oluşturmak!

Gerekli wsgen komutu örneği:

wsgen -keep -cp . com.organizasyon.adi.ws.WebServiceEndpoint

PS: Bu arada hep benim düştüğüm hataya düşmeyin, bu işlemi .class dosyalarında çalıştırmanız gerekli, .java dosyalarında çalıştırırsanız ClassNotFound exceptionı alırsınız : ).

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.

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

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.

 

Bir kaç düşünce

Uzun süredir yazamıyorum arkadaşlar, herkeslerden özür dilerim. Ama bu rehavetin tek sorumlusu ben değilim, çok sıcak geçen yaz, yoğun iş temposu vs beni yazmaktan alıkoydu. Eylülü de yazısız geçirmeyeyim dedim ve son projemde kodlama yaparken aklıma daha önceki okumalarımdan gelen fikirleri sizlerle paylaşayım istedim.

Başlıyoruz:

Eğer yazdığınız kod, üzeride comment satırları olmadan anlaşılmıyorsa, o kod sizin başınıza çok belalar açabilir. Eğer ki yazdığınız kodun bir “hack” olduğunu düşünüyorsanız bunun iyi bir hack mi yoksa kötü bir hack mi olduğuna karar verin. Eğer kötü bir hackse düzeltmeniz gereken şeyler olabilir.

Başka bir nokta, eğer yazdığınız bir metoda isim vermekte zorlanıyorsanız, bu metodun ne iş yaptığına tekrar bir bakın derim. Büyük ihtimalle içeride birden çok iş yapıldığını göreceksiniz. Bu durumda metodunuzu daha küçük parçalara bölmeyi düşünebilirsiniz. Bu sayede metodun karmaşıklık seviyesini de düşürebilirsiniz. Açıkçası benim beynim küçük karmaşıklık seviyelerinde daha rahat yolculuk ediyor, adeta akıp gidiyor : p.

Son olarak, eğer sınıf tasarımını yaptıktan sonra kodlama esnasında, sınıflarınızın isimlerini hatırlayamıyorsanız, o zaman o tasarımı hemen bir gözden geçirin. Yada yeni bir metod yazmanız gerektiğinde bu metodu alacak sorumluluğun hangi sınıfta olması gerektiğini kestiremiyorsanız, tasarıma yeni bir arkadaş daha eklenme vakti gelmiş olabilir.

Havaların soğumasıyla beraber yazılarımızın ve okumalarımızın ısınması dileğiyle, herkese iyi günler!

IE7 name for id in Javascript??

Hi guys,

In a project I have been working on recenty, I have to deal with Internet Explorer 7 (can you believe it?). Anyway, the reason that we should work with Internet Explorer 7 is that most of the UI cannot work with anything other than IE7. I was curious of why that might be.

In a few days I understood the reason. For example a web page was unable to work with Chrome because it was giving a Javascript error for not finding an object specified by its id in the DOM. Then i checked and saw that there is really no sign of an object there. So when I tried it with IE7, i saw the horror :


 document.all['idthatisnotavailable'].value = 'some value'; <code>

As the name suggests, it was not an id, but a name for an input element of a form. So i saw that IE7 permits you to use the name field for the place of id fields in javascript code. Oh god!! What else do they have in store for us?

Stackoverflow’s Mediocrity of Experts

I love stackoverflow, I really do. Whenever I need a quick fix of a practical knowledge, I’m there. And most of the time I really find what I’m looking for. But there is another thing about this site. The owners of the site claims that here in this site there are mostly expert programmers hanging around. And the questions asked are from experts to experts. Alright I’m OK with that.

But you get to notice a pattern once you signed up and start to contribute to this site. There is this thing called reputation, basically the essence of all sites using some kind of gamification. You gain reputation by answering to other people’s questions or asking good questions. But how do you gain reputation? Other people vote on your answer because it is somehow helpful to them. Or other people vote on your question because they need to ask something very similar to your question. That’s OK and it’s kind of entertaining to run for the points. And they also show you how the community trusts you ;). Anyway so far so good. But once you come across some real problems in a really expert topic, you say “OK, I’ll post this to stackoverflow, and answers will fall like rain”. But unfortunately that’s not happening here.

You know every community consists of really good ones, average ones and really bad individuals (the bell curve basically). So the question asked will mostly be an average question, occasionally good questions(hard questions) and rarely really easy questions because they are also answered on other pages of web. So the answers will be mostly to average questions and they will get really high reputations. Why? Because the community is mostly average as I  mentioned before. So when average joe of a programmer (me for example) looks for something little bit practical about a language he/she doesn’t know about, the question is most likely already asked there and answered there. So what happens next? People start voting the questions and answers that have higher hits because they suit the needs of more average people.

Let me show you some examples of what I mean :

  1. http://stackoverflow.com/questions/65035/in-java-does-return-trump-finally : This question is a trick/game question in Java. And you can see the vote on the asker and the answerer. Is this an expert question? It is asked at 2008, when the site is relatively very young compared to its status now.
  2. http://stackoverflow.com/questions/503093/how-can-i-make-a-redirect-page-in-jquery-javascript : this is a really easy question you see. The guy who answered probably answered another of this easy question way back and look at the vote he got from it ; ).
  3. http://stackoverflow.com/questions/905222/javascriptenter-key-press-event : same guy edited the question and answered the question, cool!
  4. http://stackoverflow.com/questions/796482/steps-to-upload-an-iphone-application-to-the-appstore : this is a question which you can get the answer from an apple site. Nowadays if you ask something like that you will get a downvote and then your question gets closed.
  5. http://stackoverflow.com/questions/498970/how-do-i-trim-a-string-in-javascript : a very good introduction level knowledge about javascript.
  6. http://stackoverflow.com/questions/415602/set-value-of-textarea-in-jquery : WTF!! Are you serious? Oh I didn’t know we should use .val() in Jquery. That’s the expertise.
  7. And one exception : http://stackoverflow.com/questions/8479058/how-do-i-find-waldo-with-mathematica , there is an idiom in my language: “kill the brave man, dont take what he earned”. This is the question that really deserved all of its points both the asker and the receiver.

So does this high reputation thing show us an expert question? No, you have seen how average questions get more votes. Does it show that the guy who answered the question is an expert? Umm, maybe, or at least it shows that the guy knew a lot of basic stuff that most of us don’t have a clue. Or maybe he was just there at the right time, when the basic question is asked. Or he was just refreshing his browser over and over, then encountered this simple question. What a chance!

But what happened to your hardcore problem? It is probably forgotten by everyone because it needs time to research or come up with a good sound solution with the ready knowledge. You are lucky if someone really can point you in the right direction. You will probably thank the guys answered by voting them up, but that’s it. No one else will see the question because it’s special to your problem domain and it really needs expertise from the field you are working.

PhoneGap ve Mobil Geliştirme

Herkese merhaba,

Geçenlerde bir projenin analizini yaparken ne kadar çok farklı mobil client desteklemek zorunda olduğumuzu fark ettim. Buna çözüm olarak da XHTML kullanmaya karar verdik. Fakat daha sonra XHTML in bile hangi mobil cihaz browserı kadar desteklediğinden emin olamadığımızın farkına vardık.

Sonrasında aslında uzun zamandan beri geliştirmelerine devam eden bir gruptan haberimiz oldu. Bu grup (Nitobi Software adında www.nitobi.com) PhoneGap isimli bir proje üzerinde çalışıyor. Peki nedir bu PhoneGap?

HTML 5 ve CSS3 ün ortama salınması ve über gelişmiş Javascript kütüphaneleri ile herkes biraz çalıştıktan sonra çok güzel görünen web uygulamaları yazabilir. Bunlar neredeyse dünyada en çok uyulan standartlar bildiğiniz üzere. Fikir basit: Biz oturuyoruz güzelce bir HTML/CSS/Javascript uygulaması (diğer bir deyişle web sitesi) yazıyoruz. Sonrasında adamların wrapper fonksiyonlarını kullanıyoruz ve bu yardımcı sınıf ve metodlar sayesinde uygulamamız istediğimiz (istediğimiz dediğim şimdilik IOS/Android/Symbian/Blackberry vs ile sınırlı) mobil ortamda çalışabilecek özellikleri kazanıyor.

Esasında çok temiz olan mevzu şu ki, adamlar native uygulama çalıştırıyorlar. Amaa, bu büyük bir ama, bu native uygulama esasen sadece cihazın native browser ını çağırıyor ve sonrasında orada sizin hazırladığınız HTML uygulamasını çalıştırıyor.

İşin enteresan kısmı başlamak  oldukça kolay olmasına rağmen, adamlar parayı support kısmından bulma fikrinde olduklarından, kaynak bulmakta oldukça zorlanıyorsunuz. Ben de bu yüzden Android kısmında bir Hello World nasıl çıkartılıyor, kısaca bahsedeyim..

İlk olarak projemizi normal bir şekilde oluşturuyoruz :

Daha sonra projenin kok dizininde /libs ve /assets/www klasörlerini oluşturuyoruz. Bu klasörlere phonegap ile ilgili kütüphane ve dosyaları atacağız. phonegap.js dosyası /assets/www klasörüne, phonegap.jar dosyası da /libs klasörünün altına atılıyor. Ayrıca xml klasörünü de res klasörünün altına kopyalamanız gerekiyor.

Sonraki adımlarınızda ilk olarak activity sınıfını extend etmistik, oradaki Activity sınıfı DroidGap sınıfı ile değiştirmeniz,

setContentView metod çağrısını “super.loadUrl(“file:///android_asset/www/index.html”);” ile değiştirmeniz,

import.com.phonegap.*; cümlesini eklemeniz ve karşılığında Activity sınıfı ile ilgili import cümlesini çıkarmanız gerekiyor. Son görüntünün şuna benzer bir şey olmuş olması gerekiyor :

javaSrc

Bundan sonrası biraz daha düz gideceğiniz bir kısım, AndroidManifest.xml dosyamızı açıyoruz ve aşağıdaki bilgileri versionName kısmından sonra giriyoruz :

 

manifest

 

Şimdi gerçekten kodumuzu yazacağımız yere geldik, demin oluşturduğumuz assets/www dizininde index.html dosyamızı oluşturuyoruz. HTML dosyasında istediğiniz herşeyi koymakta serbestsiniz ama üstünde çalıştığınız telefonun özelliklerine erişmek istiyorsanız phonegap in javascript kütüphanesini şu satırla eklemeniz gerekiyor :

<script type=”text/javascript” charset=”utf-8″ src=”phonegap.js”>

Bunu da tamamladıktan sonra geriye sadece Android uygulamasını emülatörde çalıştırmak kalıyor. İyi kodlamalar! (Bu blog girdisini yazmaya başladıktan hemen sonra Titanium framework ünü keşfettik. Bu elemanların kodlarını öğrenmek başta ne kadar da zor olsa, hem tüm görseller native nesnelere çeviriliyor ve hem sadece javascript kodlayarak geliştirme yapıyoruz, tek dezavantajımız şimdilik sadece İOS ve Android desteği mevcut. Kim sallar zaten Blackberry i : p)

Design Patterns, An introduction

Today I would like to relate to a little research i have done on my
daily job. These abstracts will provide a path for us on the road
to further investigate these patterns. Also a turkish version of
this work will be published too.
	Recommended GOF Patterns

	1 - Abstract Factory
	    	     Abstract factory creates factories that produces
		     different classes. For example if we need a factory
		     that either creates win buttons or osx buttons, we
		     need a factory to create these factories.
		     Here we need to define what factory is by the way :
		     if we have more than one adapters for example,
		     we need to know which one to create in a given
		     situation, but if we give this responsibility to
		     any class in the system, we improve the dependency
		     of each object to another, so we need another class
		     to handle this responsibility. This class is the
		     factory class.
	2 - Factory Method
	    	     This pattern is used to put the creation method
		     to the class which will use the created object
	3 - Singleton
		     Singleton pattern is used to create the factory itself
		     . To implement a singleton pattern you have to define
		     the constructor as private and create a static method
		     for the class that cannot be overridden. This static
		     method will return an object of the class.
	4 - Adapter
	    	     Main function is to change the interface of a class to
		     match other classes, for example, there may be more
		     than one outside class that does the same operation
		     for our system but we don't want to change the inner
		     classes according to the outer class that we use
		     so we create adapters for each class and provide the
		     same interface to our inner classes, so the inner
		     classes dont have to know which class they are dealing with.
	5 - Composite
		     Sometimes an object should not know about the way a
		     method works. For example an object may work with a
		     single other object to accomplish some task and some
		     other time the same object may require to work with
		     multiple objects to do the same task. If the
		     implementor object knew about the objects it works,
		     this reduces low-coupling and flexibility. In order
		     to overcome this problem we use composite pattern.
		     A class is constructed with same interface as the
		     other classes, and the multiple objects work in that
		     class, so all other objects dont know anything about
		     the sub objects that does the work.
	6 - Facade
		     This pattern is used to hide complexity of a system
		     (either inside or outside) from other parts of the
		     system. For example you want to hide business logic
		     from representation logic because the representation
		     can change any time but business logic is more stable.
		     So a facade class is constructed to centralize the
		     operations done on a complex subsystem.
	7 - Observer
		     This pattern is used when a change of state in a
		     class requires the attention of many other classes.
		     If we write a function for every class about the
		     change, we have a highly coupled class system and
		     it will be very hard to make a change in the class
		     that does the changes.
		     So in Observer pattern as a solution to this problem
		     an interface is created, and the classes that want
		     to learn about the change, implements this interface.

	8 - Strategy
		     Over time an object may require different kinds of ways
		     to do the same operation. This can be examplified by a
		     a discount method, some conditions require different
		     discount methods, and some other conditions require
		     different methods. In order to cope with the complexity
		     this problem presents, we use the strategy pattern. In
		     strategy pattern, a method is abstracted using an
		     interface. Then different strategies are implemented
		     using this interface. As a result, implementor class
		     knows nothing of the strategy class, it just uses the
		     specified interface.