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ı

Scala 101 gibi bir yazı

Selam arkadaşlar,

İşyerinde yine bir teknolojik atılım gerçekleştirdik ve JVM üzerinde çalışan fonksiyonel ve nesne yönelimli dil olan Scala’yı projelerimizde kullanmaya başladık.

Açıkçası ne zamandır fonksiyonel dilleri kullanmak istiyordum ama fırsatım olmuyordu, javascriptte jquery kullanmaktan öteye gidememiştik. Sonuç olarak Scala kullanmaya başlayarak zihinsel haritamızda büyük bir atılım yapmış olduk.

Peki fonksiyonel programlama nedir? Çok kısa bir tanımla açıklama gerekirse, programlarınızı statementlar yerine fonksiyonlar olarak düşünmektir. Yani mümkün olduğu kadar en küçük birimlerin fonksiyonlardan oluşması olarak adlandırabiliriz. Bu tanımdan hareketle fonksiyonel dillerin bunu sağlayabilmesi için fonksiyonları temel veri yapılarından sayması gerekir. Bu sağlandığında fonksiyonları parametre olarak kullanabilir, değişkenlere atayabilir, gerektiğinde çağırabilirsiniz. Bir diğer gerekli özellik ise, fonksiyonların sadece aldığı parametrelere göre dönüş değerleri üretmesidir. Yani gönderdiğiniz parametrelerde değişiklik yapılmamalıdır.

Bunlardan yola çıkarak Scala’daki (diğer fonksiyonel dillerde de kullanılmakta olan) bir kaç temel özellikten bahsedeyim.

  1. Fonksiyon literalleri : Scala da sadece fonksiyon tanımlamak zorunda değilsiniz, şunu da yapabilirsiniz: val ekle = (x: Int, y: Int) => x + y . Bu aşamada fonksiyonu istediğiniz zaman çağırabilir, diğer fonksiyonların içinde kullanabilirsiniz, parametre olarak geçebilirsiniz.
  2. map fonksiyonu : Bir liste üzerindeki tüm elemanlar üzerinde çalışıp, yeni bir liste üreten fonksiyon.
  3. filter fonksiyonu : Bir liste üzerindeki tüm elemanlar üzerinde çalışıp, verilen teste uygun olanlardan yeni bir liste üreten fonksiyon.

Bu 3 temel özellik ile yazdığınız programlar hem çok kısalır hem de anlaşılması daha kolay olur. Ufak tefek fonksiyonları birbirleriyle kullanarak çok anlamlı ve işlevsel programlar yazabilirsiniz. (Tıpkı Unix command line araçları gibi)

Map ve fonksiyon literallerine bir örnek :

scala> val l = List(1,2,3,4,5)

scala> l.map( x => x*2 )

res60: List[Int] = List(2, 4, 6, 8, 10)

Bunların üzerine daha çok gideceğiz ilerideki yazılarda, takibe devam!

Ne var ne yok

Gençler selam, ne zamandır yazmıyordum kısa da olsa bugün iki yazı ile karşınızdayım.

Bu yazımda sizlere Özyeğin üniversitesinde yaptığımız etohum sunumunu geç de olsa haber vermek istiyorum.

Temel programlama ve ilkeler üzerinden gerçekleştirdiğimiz sunumumuz programlamaya giriş ve orta seviye advanced konulara giriş için güzel bir çalışma oldu. Sunumda kısaca

Basics
– Version Control Systems (svn/hg/git)
– Build Automation (ant/maven) and Daily Builds (jenkins)
– Change/Issue Tracking
– Eliminating Duplication (Code, Representation)
– Basic Data Structures and Algorithms
– Resource Pooling and Error Handling
– How Computer Networks and HTTP really works
Infrastructural Components and Patterns
– Databases / RDBMS / NoSQL
– Load Balancer / Web Server / App Server
– Integration Patterns: Web Services, SOAP, XML, JSON
– Local and Distributed Caching
– Messaging Systems and Job Scheduling
– Cloud Computing: AWS and Heroku
Cryptography Basics
– How to protect sensitive data: Symmetric and Asymmetric Encryption
– How to check passwords: Hash Functions
– How to check data integrity: Message Authentication Code
– How HTTPS/TLS works

Konularından bahsettik. Sunumun web sitesine şu adresten ulaşabilirsiniz :

http://www.etohum.com/etkinlik/etohum-gelistirici-gunleri-15-11-2012

ayrica sunum da yakında şu adresten sunulacak :

https://github.com/metebalci

Adamlar bir de facebook uzerinden foto paylasmislar: http://www.facebook.com/media/set/?set=a.556647201017361.143942.114988941849858&type=3&l=0e42b9ffd3

Herkese iyi geliştirmeler.

Spring Web Serviceleri ve Spring Namespace Handler not found hatasi

Gençler selam,

Uzun aradan sonra bir kaç cümle yazayım dedim, baktım ki evvelden iki madde not almışım bunlardan bahsedeyim diye. Yeri gelmişken sizlere de aktarayım.

Spring süper bir framework, kabulümüzdür. Fakat arada sırada kullanıcıya yardımı dokunmayan hata mesajları da verebiliyor, sonucunda da çokca vakit kaybedebiliyoruz. Ben geçenlerde benzer bir vakit kaybı yaşadım, sizlerle de paylaşayım da mümkün olduğu kadar siz aynı vakti kaybetmeyin.

Spring Namespace Handler not found diye bir hatası var, bu genelde aynı spring jarinin farklı versiyonlar üzerinden birden fazla şekilde uygulamaya katmaktan oluyor, keşke Spring kendisi bunu bize söyleyebilseydi. : )

Ayrica jax-ws spring eklentisini kullanmaya gerek yok, springin SimpleJaxWsServiceExporter sınıfı inanılmaz kullanışlı. Tek sıkıntısı, bu exporter web servisinizi ayri bir port üzerinden sunuyor. Bu durumda aynı uygulama içinden web servisi de sunmak imkansız hale geliyor, denediğinizde orada zaten bir uygulama olduğu hatasını alıyorsunuz.

Herkese iyi geliştirmeler.

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!

PHP SOAP geliştirme için ufak bir tüyo

Merhabalar,

PHP de WSDL üzerinden geliştirme yapıyorsanız, bilmeniz gereken küçük bir ayrıntı var : PHP hızdan kazanmak için, wsdl dosyanızı cacheliyor. Bunun için de uzun sayılabilecek bir timeout süresi belirliyor.

Bu durumda siz developmentta wsdlleri değiştiriyorsunuz ama hedefte bir değişiklik göremiyorsunuz. Sinir krizi eşiklerine gelebilirsiniz, benden söylemesi.

Çaresi çok basit, php.ini den wsdl cachelemeyi kapatmanız yeterli. Ayar şu şekilde :

soap.wsdl_cache_enabled=1

Bunu 0 yaptınız mı artık kafanız rahat : )).

Herkese iyi geliştirmeler!

IOS – tablo yapılarına “daha çok göster” alanı eklenmesi

Herkese merhaba,

Başlıktan da gördüğünüz gibi bu aralar boş vakitlerimde ; ) IOS development takılıyorum. Geçenlerde de bir tableview kasıyordum ki, zor bir problemle karşılaştım : sayfalama. Bir şekilde çözmeyi başarınca, bunu diğer arkadaşlarla da paylaşayım, hem bana da sonradan hatırlatma olur diye sizler için not düşüyorum.

İlk olarak bu fazladan eklenecek table view cell için bir xib dosyası hazırlıyorsunuz. Bu dosyaya artık button mu eklersiniz label mı yapıştırırsınız orası sizin bileceğiniz iş. Hücrenize fonksiyonalite de ekleyecekseniz, UITableViewCell den türemiş bir subclass da yazmanızı öneririm.

Hazırladığınız görselin identifierını bir kenara not edin ve ondan sonra tableview u handle edeceğiniz sınıfın uygulama dosyasına gelin. Burada bildiğiniz gibi tablonuzda kaç satırınız var ve bu satırlar için hangi hücreleri kullanacaksınızı belirlediğiniz iki metodunuz var. İşte bu metodlarda bazı değişiklikler yapacağız.

İlk olarak eleman sayımızı belirlediğimiz metodumuzu aşağıdakine benzer şekilde güncelleyebiliriz :


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

if ( isJsonData == YES ){

return [postData count] + 1;

}

else {

//TODO we will put a loading sign here afterwards

return 1;

}

}

Burada gördüğünüz gibi elimizdeki eleman sayısından bir fazla yer aldık. E bunu da demin hazırladığımız xib dosyasındaki cell ile kullanacağız. O kısımda da şöyle bir hareket yapıyoruz :


- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

...

if ( isJsonData == YES ) { //normal operation

...

}

else {

UITableViewCell* cellLoadMore = [tableView dequeueReusableCellWithIdentifier:loadMoreIdentifier];

if ( cellLoadMore == nil ) {

NSArray* nib = [ [ NSBundle mainBundle ] loadNibNamed:@"loadMoreCell" owner:self options:nil ];

cellLoadMore = [ nib objectAtIndex:0 ];

}

return cellLoadMore;

}

...

}

İşte bu şekilde artık tablomuzun sonunda daha fazla satır getirmemiz için bağıran bir table cellimiz oldu. Table cell için özel olarak bir xib dosyası hazırladık, üzerine de bunu kenar koşul oluştuğu anda kullandık.

Bu doldurma tuşuna basınca ne olacağını da bir sonraki seferde konuşuruz artık.

İyi çalışmalar

Tomcat – Çıldırmaya devam

Çok enteresan bir sorunum var son günlerde. Tomcat ve Java’da enteresan olmayan gün zaten geçmiyor. Neyse soruna dönelim.

Büyük ihtimalle memory leak sahibi bir uygulama var elimde. Bunu sağlıklı bir uygulama ile birlikte kullanmam gerekiyor. Herşeyi anlarım da, neden tüm uygulamaları undeploy ettikten sonra, hatta webapps altından bile dizinlerini kaldırdıktan sonra tekrar bir uygulama deploy etmeye kalktığımda patlarsın Tomcat, işte onu anlamam. Yani ne ilgisi var?

E hani garbage collection hani üstün alman teknolojisi?

PHP – Değişken Fonksiyonlar

Herkese merhaba,

Uzun bir aralıktan sonra tekrar yazma fırsatı buldum. Evet eve hırsız girdi ve herşeyi altüst etti ama bizler tekrar ayağa kalkmaya başladık. Uzun aradan sonra da sizlerle bu yazıda teknik bir konuda konuşmaya karar verdim. Yazıda konuşmak.. hmm.

Evet başlayalım. PHP bildiğiniz gibi dinamik olduğu iddiasında olan bir betik yüksek seviye fonksiyonel ve aynı zamanda nesneye yönelimli bir dil(birilerinin burnuna kötü kokular geldi mi?). Bu dilin enteresan özelliklerinden birisi de metod isimlerinin de değişkenler gibi değişebilmeleri ve bunların istenildiği zaman çağrılabilmeleri. Tek yapmanız gereken fonksiyon/metodun ismini bir değişkene atamak ve daha sonra o değişkenin sonuna parantezleri yerleştirmek. Aşağıdaki örneğimize buyrun..


public function baseMethod(){
$db = DBOperation::getInstance();
try

{

$array_len = func_num_args();

if( $array_len == 0){

throw new Exception();

}

$args = func_get_args();



$function = $args[0]; //first param is always the functionname

$parameters = array();



for($i = 1; $i < $array_len ; $i++){

$parameters[] = $args[$i];

}

$this->$function($parameters, $db);

}

catch(WJException $e){

echo json_encode(array("returnValue"=>"false", "error" => $e->error()));

return false;

}

}

Burada bir kaç numara durum var, bunlardan birincisi func_num_args fonksiyonu. Bu fonksiyon size o anki metodunuza/fonksiyonunuza kaç adet parametre geçildiğini bildiriyor. İkincisi ise func_get_args fonksiyonu, bu fonksiyon da bize geçilmiş olan parametreleri bir dizi şeklinde dönüyor. Aslında PHP ne kadar garip bir dil değil mi? Çok basit bir şekilde bizler de count fonksiyonunu çağırıp, metodumuza geçilmiş parametre sayısını bulabilirdik. Ama neyse yazmış adamlar işte: ). Biz bu sayede parametre listesini boş dahi bıraksak, istediğimiz kadar parametre geçebiliyoruz istediğimiz fonksiyona.

Bu metotta, çağırılacak olan metod ismi ve parametreleri dışardan alınıyor ve tamamen kendi seçimimize kalmış durumda. Mesela bu metodu artık şu şekillerde kullanabiliriz.


$this->baseMethod("getMoreSpecificMessages", $_POST['username'], $_POST['lastDate']);

$this->baseMethod("readMessage", $receiver->getId(), $_POST['readMsgId']);

Görüldüğü gibi istediğimiz metodu istediğimiz parametrelerle çağırabiliyoruz. Tabii bu uygulamada bunu neden yaptık diye sorarsanız, söz konusu sınıfımızın çoğu metodunda benzer işlemler yapılıyor, metodun ortasında küçük bir kısımda ise metoda özgü hareketler oluyordu. Bu durumda DRY prensibine uyalım dedik ve ortak olan hareketleri tek noktada topladık. İçeriden de o anki işimize özgü metodumuzun çağrılabilmesi için de bu yapıyı kurduk. Aslına bakarsanız çok mu güzel oldu bu yapı? sorusuna şu an için cevap veremiyorum. : ) Onu da başka bir zaman tartışırız. Herkese iyi çalışmalar!