nedjelja, 14. listopada 2012.

Andorid - Augmented Reality

Topic of the day is Augmented Reality for Android. It will be a a lot of talking and little to no code in this post. But that can change in the future posts. Actually it isn't only for Android, almost all frameworks that I will discuss are multi-platform so they can be easily used in iOS and other.

First of all what is Augmented Reality and what can it do? Quick look at Wikipedia will give you all your answers, but a better way of learning is if you see it. Just type Augmented Reality in YouTube and see for your self.

I was amazed that more people hasn't heard about it. I'm not talking about your Average Jo, I'm talking about developers. I thought that more programmers at least heard about it, if they didn't use it.

The biggest effort of people hearing about it was that of Google with Google Goggles.

It's basically combination of virtual and normal reality - so the name Augmented Reality was a natural selection.You are basically using your smartphone to display 3d models or object in real time mapped to a image or a marker or even to a geographical coordinates. One of the most popular Android apps for AR is Google Sky Map and it's free (like most of AR stuff). You can download almost identical app for iOS called Star Walk.

When I show someone one a AR apps the reaction is the same - amazing. And AR is just that - amazing, and the options of what you can do with it are endless.

So let's take a look at some frameworks so you can do develop AR apps:

There are others but for now I will leave at this. I tried 4 of the mentioned 5, so I have some idea what I'm talking about. Vuforia was the one that I didn't try. But I don't see nothing about it that wasn't available from the other 4. Among the 4 that I tried only one - AndAR is open source under the GNU license.The other 3 are also free but with some down side to it. Let me explain.

Junaio is to be used by non programers to develop AR applications. It has a nice feature that you can publish a channel to their app so no need for a full development if you just want to try something, but that has it's limitation. And between Metaio and Layar i choose Meatio.
It free but you have a watermark Powered by Meataio when you run your app. If you want to get rid of it you have to pay. A lot (http://www.metaio.com/products/mobile-sdk/pricing/). But if a watermark is no problem I say go for it. It's a really good framework.

I made a app that uses ID markers, but you can use picture markers LLA markers, markerless, markerless 3d. Let me explain:
ID markers are 512 id markers that look similar to QR code and each has a ID of 1 - 512. You put it on things and in your app you bind a 3d model to a ID, and when you scan a ID marker the 3d model that you assigned to a marker id renders. It's easy as that.

Steps to making a ID marker Android app:
  1. You need to make a 3d model in 3ds Max Studio or Blender. I used 3ds Max, and exported the model to md2 format (because Metaio uses md2 format, you can use this to export: http://thegreystudios.com/blog/?p=278)
  2. Make a tracking file. It's a simple XML file where you define what ID markers you will use, or pictures that will serve as markers.
  3. Write some boilerplate code to set up the configuration for the camera and other things. Don't forget to add this permissions:                                                                                                                                          <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  4. And in the activity class bind the tracking xml file to models and that is it
You can even export animations from 3ds Max and load them in Metaio, so you can get a touch sensitive models that start a animation when you touch them.

Beside ID and picture markers you can use LLA Markets (Langitude longitude altitude markers) and bind a model to a coordinated so it will show up if you point your app at a certain location. So you can make 3d models of famous people and bind it to locations in your town where they were born or lived so you would point you phone and see who lived there. It is just a idea, you don't have to do it ;)

This is just a basic post to get to know you with AR, if I intrigued you and you would like to know more I suggest you visit http://dev.metaio.com/sdk/getting-started/  and download the Meataio SDK which contains the example app. You will have to build the example app (note it will not work with the emulator since the emulator doesn't work with a camera. The app will just crash) and in the bin folder you will find a apk file to install. Also note that if you make changes to the example you will need to manually uninstall the previous version of the app because otherwise you will get a error while installing the new app and you will thing that you did something wrong - I'm talking from experience ;). 

srijeda, 16. svibnja 2012.

Trouble with SQL Server JDBC

First of all, it's been a wile since my last post. There is no good reason, but I have been busy, real busy.
I have a new job, new town, a lot of new responsibilities and challenges. But enough with the excuses. Anyone can make excuses but only a few have what it takes to do something.

Now back to my post topic. Today at work I encountered a problem, and it was a SQL Server kind of a problem. JDBC problem to be accurate! I'm doing a Spring RESTful  web service that uses Hibernate ORM as a persistence layer and SQL Server 2008 as my database. I'm also using Maven as my build tool, and I started to add dependencies and got to SQL Server. My first awakening was that there is no official maven dependency for SQL Server! Once again Microsoft has no love for the Java people. There are a couple of work-arounds for solving this problem but for some reason I wasn't able to get it working. The easiest one that was suppose to work was using the open source jdbc driver for SQL Server, but it didn't seem to do the trick for me.

I ended up doing the following thing, maybe no the best thing to do but it got the job done. I excluded the sql server jdbc dependency form the pom file, and added the SQL 4 JDBC as a external library. Now the surprising part for me - you have to install the JDBC driver on you computer (I run Windows 7 on my office computer. Actually, now when I remember when I installed PostgreSQL I remember there was a option to install the JDBC driver for it, but for the life of me I can't remember if I checked it!), and it's not a simple next-next-next kind of installation.

Anyway I had the problem of installing the JDBC driver. I followed this blog post to the letter:
http://www.harlansmith.net/2012/01/installing-microsoft-jdbc-for-sql.html

You have to unpack it, then run the following in your cmd:
set CLASSPATH=.;JDBC_install_path\sqljdbc_version\language\sqljdbc4.jar

Remember:You can set only one driver for the classpath. It can be sqljdbc.jar OR sqljdbc4.jar (I recommend 4 - because at first I used the sqljdbc.jar and got the error that I need to use sqljdbc 4 with 1.7 JDK)

And don't forget to copy the sqljdbc_auth.dll to your System32 folder. If you follow the blog post that I mentioned then you will see a sample code to see if the driver is working. Try it out, just don't forget to add sqljdbc4.jar to your Build Path. And that is it, so I thought.

For some reason the sample code worked, but when I was deploying the war file to Tomcat I got the error that the underlying database could not be accessed (or something like that). It was the end of the work day so I had no patience to go on one more discovery adventure. I ended up setting the ODCB for the SQL Server I wanted to connect to. And than the JDCB url was not in the format of: jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

But in a format of:
jdbc:odbc:odbc_name

 And it worked! Not the best solution, but finally I could finally test my web server. Perhaps I made a simple writing error when defining my jdbc url, so it didn't work, but I will try that our tomorrow, because tomorrow is another day. Perhaps tomorrow I will be smarter about the whole SQL Server JDCB thing.


nedjelja, 12. veljače 2012.

e-knjiga Spring In Practice - early access edition

Prije nekoliko dana sam naletio na tweet od Spring Sourcea gdje su dali link na njihov tjedni pregled vijesti: http://www.springsource.org/node/3466

Hrpa korisnih linkova, informacija i ostalog što ti srce poželi. Premda jedan paragraf mi je odvukao pozornost. Spring In Practice - upcoming book! Hmm dali to postoji knjiga o Springu koja je prošla nezamijećena ispod mog radara?!? Nemoguće, ali ipak moguće. Ono što me tješi je da je knjiga još uvijek u nastajanju i da se može nabaviti kao early edition. Hmmm za ovo nikad nisam čuo. Otišao sam na stranice izdavača Manninga da saznam nešto više.

http://www.manning.com/wheeler/

Ono što sam saznao me nadasve oduševilo. Knjiga sadrži 14 poglavlja i sva su više manje gotova. Gledajući poglavlja vidim da je to knjiga koja veoma obećava. Ali još uvijek sam oprezan (ipak iskustvo me naučilo nešto), jer previše knjiga obećava, ali jako mali broj i ispuni obećanja. Zato sam odlučio baciti oko na besplatno poglavlje, za što se treba dati svoju e-mail adresa. Poglavlje je stiglo na mail uz dodatak - kod koji mi odobrava 35% popusta kod kupnje.

Još malo googlanja po netu o recenzijama i odluka je pala. Kupujem knjigu! Na originalnu cijenu od 35.99$ sam odlučio primijeniti svoj popust od 35% i konačna cijena je pala na 23.39$ što je super cijena. Plus kupnjom knjige sam dobio 35% popusta na svoju sljedeću kupnju :)

Pošto je e-knjiga dostupna preko Manning Early Access Programa za sad je dostupna samo e-knjiga i to u tekućem izdanju. Ono što to zapravo znači ako kupite takvu knjigu dobivate ona poglavlja koja su do tada napisana, a kod svake promjene/izmjene/dodavanja novih poglavlja ista automatski dobivate na svoj mail. Spring In Practice ima sva poglavlja manje više završena, ali ipak nedostaje uvod, sadržaj, index... i još neke stitnice. Onoga dana kada knjiga bude završena dobiti ću i gotovu verziju.

A sada ono što me navelo da kupim knjigu, a to je njen sadržaj. Kreće se od neke osnovne web stranice i sa svakim poglavljem se uči nešto novo.

     1 Introducing Spring: the dependency injection containe
     2 Data persistence, ORM & transactions
     3 Building web applications with Spring Web MVC 

 Part 2 Application Recipes

    4 Basic web forms
    5 Enhancing Spring MVC applications with Web Flow
    6 Authenticating users 
    7 Authorizing user requests 
    8 Communicating with users and customers 
    9 Creating a rich text comment engine 
  10 Integration testing
  11 Product search and image management 
  12 Building an article delivery engine 
  13 Enterprise integration
  14 Create a Spring-based "site-up" framework

Razlog zbog čeka sam kupio knjigu je zato što je knjiga puna primjera, a ti primjeri nisu tipa "hello world". Pokriven je Hibernate, web forme, validacija, Spring Security, pa čak i Hibernate Search što me jako iznenadilo i razveselilo.

Još jedna stvar me iznimno oduševila, a to je da knjiga ima i svoj forum. Forum održavaju sami autori knjige, pa ako uočite bilo kakvu pogrešku slobodno im javite, a prema onome što sam našao oni uvijek to u najkraćem roku poprave. Čak je netko napisao da zašto je source kod dostupan sa hrpom jar-ova a nije napravljen pomoću Mavena. Zato si je jedan autor dao truda i napravio zavisnosti pomoću Mavena i sav source kod stavio na GitHub (od sada tog autora pratim na GitHubu) tako da ću o svakoj promjeni biti pravovremeno obaviješten.

Jedan zanimljiv detalj je onaj o načinu kojim su se odlučili zaštiti od piratstva. U footeru knjige je otisnuto moje ime i moja e-mail adresa, pa ako bi se netko odlučio podijeliti knjigu vrlo lako bi se pronašao "krivac". Dobar trik, u ovo doba piratstva, ali imajući na umu da sam knjigu platio 23$ dolara potpuno se slažem s njima. Više ćete platiti 2 pizze i sok nego ovu knjigu. A ako je svladate napraviti ćete vrlo veliki korak za svoju karijeru i moći ćete kupiti više pizza :D

Jedino što mi sada preostaje je i pročitati knjigu pa prenijeti cijelu i detaljnu recenziju. Premda imam neki osjećaj da će mi knjiga dati puno materijala za postove.

ponedjeljak, 6. veljače 2012.

HTTP Status 500 - pa ti pogoditi što je pošlo po krivu?

Upravo sam se igrao sa errorom HTTP Status 500. Naslov koji sam stavio proizlazi iz ovog objašnjenja na webu:

"This is a 'catch-all' error generated by the Web server. Basically something has gone wrong, but the server can not be more specific about the error condition in its response to the client..."

To je prvi rezultat koji je prikazao google, objašnjenje je malo poduže od ovoga, ali ove dve rečenice su mi se urezale u rožnicu! Na svu sreću otklonio sam svoj problem, ali sam išao istražiti što to znači taj status 500. Sva sreća da sam išao tim putem i da tomcat osim statusa 500 ispiše i root cause.  Zamislite samo situaciju gdje bi morali naći bug na samo osnovi ovog statusa 500 - vjerojatno netko može, ali to ipak ulazi u kategoriju hard core mazohizma.

Sada da objasnim kako sam se uopće našao u ovoj situaciji. Naime pošto je ovaj petak počela opsada snijegom i nije baš bilo preporučljivo izlaziti u duge šetnje pejzažom, odlučio sam napraviti nešto što sam jako dugo odgađao - instalirati Mac OS na svoj PC. Malo googlanja, malo youtube, malo blogova i wiki i par sati kasnije imao sam verziju 10.6.6. na svom PC-u. Samo mogu reći da sam oduševljen i da mi je žao što ovo nisam prije napravio. Zašto nije padao snijeg tako malo ranije. :D
Šalu na stranu, to sam napravio kako bih proširio svoje znanje. Naime sav svoj development (oko 90%) uvijek radim na Windowsima 7, pa je došlo vrijeme da vidim kako se to radi i na Mac OS. Linux sam probao, Mac je jedini preostao.
Oduševljen sam svime što najnapredniji OS na svijetu nudi. Ali trebalo je instalirati neke stvari koje su mi od iznimne važnosti - MySQL, PosgreSQL, Eclipse, Tomcat...
PostgreSQL i Eclipse dio je odrađen s lakoćom, s MySQL-om sam se malo pomučio. Ali jedno gledanje youtube clipa je sve riješilo. Naime nisam znao da se mora paliti pod System Preferences. Jedini pravi problem i taj problem bi trebao biti pod navodnicima, je bio instalacija Tomcata. Malo truda i malo prčkanja po terminalu je dalo ploda. Još jedna stvar koja postoji za Mac je Tomcat controller, genijalni mali besplatni programičić s kojim se lako pokreće ili stopira tomcat.


Kažu da slika vrijedi 1000 riječi, pa nadam se da je i s ovom tako. Imate 3 gumba koji sami sebe objašnjavaju. Gumb View vas odvodi na http://localhost:8080. Jednostavno i savršeno radi! Obožavam jednostavne stvari, kao npr. program Skitch pomoću koga je i nastao ovaj screen capture. Ali o tom i sličnim programima bez kojih ne znam kako sam do sada živio u nekom drugom postu.

Vrijeme je da se vratim statusu 500. Ovako je izgledao jedan dio:

Pomoću strjelica sam označio neke stvari na koje treba obratiti pozornost kod traženja bugova koji su doveli do errora.  Prva strijelica nam govori da nije otvoren session od hiberante, što nam daje do znanja da je problem u ORM dijelu aplikacije a ne sa Spring MVC-om. Druga strjelica nam govori da ne može otvoriti konekciju što me je uvelike dovelo do rješenja. Da bi se konekcija otvorila moramo imati dobar url definiran za JDBC, imati ispravne podatke za username i password te moramo imati napravljenu bazu na MySQL serveru (jer kao što sam već pisao u blogu, Hibernate ne može stvoriti bazu na serveru. Tablicu može ali bazu ne, u protivnom baca exception). Treća i četvrta strjelica potvrđuju prve dvije. Nakon druge mi je bilo jasno u čemu je problem. Aplikaciju sam razvijao na Window 7 gdje mi je MySQL server imao root password, a kod instalacije MySQL na Mac OS-u po defaultu on je nema.
Tako je i bilo. Maknuo sam navedeni password u konfiguraciji hibernatea, napravio Maven build, stavio war na Tomcat i voila, aplikacija radi! Zanimljivo kako mala sitnica može izazvati veliki exception report :)

Mislim da bi si svako toliko trebao napraviti neki namjerni bug tipa ovoga passworda da si istreniram oko u pronalaženju i otklanjanju errora. Naime prije nekoliko dana krenuo sam raditi 2 klase koje ću mapirati pomoću Hibernatea. Istina napravio sam obadvije, ali kada sam krenuo raditi prvu uspio sam staviti samo @Entity anotaciju i ništa više. Zaključio sam da je logičnije da prvo napravim drugu klasu do kraja pa da se onda vratim na prvu, nekakav zakon logike mi je to nalagao. Zaboravio sam uopće na prvu klasu, i smaknuo sam je s uma. Kada sam krenuo pokrenuti aplikaciju dobio sam veliki error report gdje sam morao tražiti i iščitavati sve i svašta. Brza google pretraga mi je dala polovični odgovor, ali mi se onda upalila lampica. Stavio sam @Entity anotaciju a nisam @Id, naime Hiberante ove dve anotacije smatra minimum koji mora postojati u suprotnom baca error. Nevjerojatno kako mala stvar može stvoriti veliki problem ako se ne pazi. Doduše ja to sve smatram dobrim treningom.

subota, 28. siječnja 2012.

Hibernate i Spring MVC integracija

Napokon! Kažem ja. Napokon malo zabavniji dio cijele ove priče. Napokon ću se dotaknuti teme hibernatea i spring mvc-a, ili kako mi je netko nedavno rekao - to je pod mus!
Hibernate je briljantan ORM, Spring MVC je briljantan framework za web i šta nalaže logika - da se to dvoje spoje. I to rade super, štoviše jedno drugoga nadopunjavaju.

Treba od nekud početi. Zašto uopće sve to? Ako niste spavali zadnjih 10.godina, trenutno je vrlo teško naći web stranicu koja svoj sadržaj ne sprema u bazu podataka. Naravno iznimke postoje i uvijek će ih biti, ali ako generaliziramo, ne znam tko više uopće odabire obične HTML stranice? Odgovor je vrlo lak - moderni hrvatski "biznismen" koji je dao nešto novaca susjedovom malom da mu napravi web stranicu za njegov "biznis". Ali čak i svaki napredniji "susjedov mali" bira bazu kao osnovu za spremanje podataka. Razlog je jednostavan - lakše je! Podatci su dostupni zauvijek, ti podatci se mogu pretraživati, raditi nešto s njima, a da ne pričam koliko je lako dodavanje novih sadržaja kad se ima iole dobar cms. Imajući sve to u vidu, vrijeme je da se vratim na naslov posta.

Ima nekoliko načina na koji se može naučiti ova tema, pa ću i nabrojati nekoliko:
  • Službena dokumentacija Spring frameworka (http://static.springsource.org/spring/docs/2.5.x/reference/orm.html)
  • Tutrorijali na webu (linkovi u daljnjem tekstu)
  • Pisana riječ u obliku knjige - Spring Persistence with Hiberante  (http://www.amazon.com/Spring-Persistence-Hibernate-Beginning-Tepper/dp/1430226323)
Napisani redoslijed nije slučajan, smatram da je to najbolji način za naučiti. Službenu dokumentaciju obavezno pročitajte ali nemojte previše ni pokušavati shvatiti iz nje. Je, super je napisana i sve to stoji ali pokušavati sve to zapamtiti - ne vidim smisla. Zato pročitajte dokumentaciju, neki važniji pojmovi će vam ostati u glavi, što je i najvažnije i pređite na tutorijale. Nema smisla raditi tutorijale dok ne prođete dokumentaciju jer neće znati o čemu se radi. A nakon što prođete tutorijale vratite se još jednom na dokumentaciju i sve će vam sjesti na mjesto - vjerujte me.
I dolazimo do knjige. (moj veliki uzdah - brz pretjerivanja!) Cijenim trud autora, ali nikako ni pod koji slučajem nemojte pokušati naučiti ovu temu preko ove knjige tj. nemojte napraviti istu pogrešku kao ja. U životu nisam našao knjigu koja ima više bugova. Skidanjem zipa sa službene stranice knjige i pokušavanje pokretanja builda na istim projektom je urodilo plodom od 63 errora?!? Čovjek bi pomislio da ako nešto prodaješ da ćeš i stajati iza toga. Istina za volju, nisu oni krivi. Kad su tiskali knjigu url od mavenovog repozitorija je bio drugačiji, ali tko se može sjetiti da to provjeri godinu dana kasnije? Malo traženja po googlu mi je dalo riješenje, ali to je samo vrh sante errora u knjizi.
Premda knjiga nije za početnika i nakon što se se uhvatili u koštac sa temom nemojte raditi primjere iz knjige. Knjigu uzmite kao lagano štivo gdje ćete vidjeti neke principe kako se nešto radi. Što se toga tiče knjiga ima neprocjenjivo znanje za prenijeti čitaocu.

I dolazimo do tutorijala, ruku na srce, od njih ćete najviše naučiti. Dati ću 2 linka na 2 turorijala a na vama je da odlučite koji vam se više sviđa. Napominjem da postoje još tutorijala na web, ali ja vam predlažem one koje sam ja prošao i što je važnije - znam da rade. Pošto svaki nudi čitatelju oduzimanje života na jedno minimalno sat vremena, ako ne i više, nema smisla raditi nešto što neće raditi ili što vas uči krivo.
Pa da dam i linkove:
  1. http://viralpatel.net/blogs/2010/11/spring3-mvc-hibernate-maven-tutorial-eclipse-example.html
  2. http://krams915.blogspot.com/2011/01/spring-mvc-3-hibernate-annotations.html
Nisu isti ali uče istu stvar na 2 načina. Redoslijed ostavljam vama, ali pojasnit ću što vam svako donosi/odnosi. Oba tutorijala se zasnivaju na MySQL bazi podataka, ali možete odabrati bilo koju.

Virapatel - ovo je ujedno i moj prvi tutotorial na koji sam naišao da radi. Što nije mala stvar. Treba imati na umu da je ovaj tutorial odrađen pomoću Mavena. Ovaj tutorial bi nazvao "lakšim" tj. napraviti ćete CRD dijelova od CRUD aplikacije. Naime u primjeru nije napravljen dio za editiranje zapisa. Druga stvar koja ga čini "lakšim" je da je kod rascijepkan u više klasa i na prvi pogleda samim time lakši za čitanje. Ali u drugom primjeru ćete vidjeti da je ovo duži način i da se sve može odraditi u manje linija koda. Glavni nedostatak je što nema komentara u kodu.
Skinite primjer, pokušajte pratiti i prepisati kod i pokušajte shvatiti kako cijela stvar radi. I zatim pređite na drugi tutorial.

Krams - koliko je ovaj tutorial dobar govori činjenica da Spring framework daje ovaj tutorial na svojim službenim stranicama kao tutorial za naučiti integraciju hiberante i springa. Još jedna stvar koja mu ide u prilog je da je nakon uočenih pogrešaka u kodu, autor je isti popravio na webu ali i u kodu te ponovni zip projekta stavio na web. Mogli bi se ugledati na njega momci koji pišu knjige na istu temu :)
Sad da kažem zašto je ovaj tutorial dobar: dobro objašnjen, hrpa komentara tako da kad gledate kod jasno vam je šta je šta. Ovaj tutorijal nudi i editiranje zapisa, tako da imate sve dijelove CRUD aplikacije.
Kada su nabrojane prednosti dolaze ne red nedostatci: nema ih! Dobro uvijek se može naći nešto, pa ako moram birati onda ću kao nedostatak navesti upotrebu loggera. S jedne strane je super jer daje priliku pregledavanja logova na serveru, a da s druge strane je to nedostatak jer uz sve silne komentare dodavanje loggera i komentara za njih kod je prenatrpan. Kad sam prolazio kod, brisao sam logger i komentare da vidim samo kod. Ali to sam ja.

Naravno jedna stvar na koju treba imati na umu je da oba primjera koriste MySQL bazu podataka, tako da ako hoćete koristiti neku drugu potrebno je napraviti promjene u jdbc.properties datoteki za Virapatel, te spring.properties datoteci za Krams. Ne zaboravite napraviti baze u MySQL-u pod imenima koja su navedena u tim properties datotekama, te ne zaboravite unjeti svoj username i password  za root  vašeg MySQL. Ako vam primjeri koje skinete ne budu radili onda niste napravili ove korake koje sam zadnje opisao.
S time svime na umu, sretno! Mislim da ću uskoro i ja dati neki praktičniji primjer ovoj temi, a do tada prođite ova dva tutotorijala i dokumentaciju.

subota, 21. siječnja 2012.

Lista Hibernate anotacija

Nešto sinoć surfam bespućima internetskih valova i kad mi na um nešto padne. Ne nije knjiga s police, nego ideja. Bacim se u pretragu, te potvrdim ono što sam i mislio. Na netu ne postoji (barem ja nisam mogao naći) listu hibernate anotacija. Samo onako prosta lista gdje s jedne strane su anotacija, a s druge kratko objašnjenje anotacije. Čak, što me i začudilo, ne postoji ništa slično ni na RefCardz?!? Najbliže što se tome može naći je na jbossovoj dokumentaciji o hiberanteu u ovom formatu:
http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

Ali to nije ono što ja želim. Samo kada vidim scrollbar koliko je mršav u gornjem desnom uglu - muka mi je. To definitivno nije ono što ja želim i trebam. Meni treba lista anotacija (bez primjera primjenjivanja istih) kada nešto radim da bacim pogled u nadi da mi dođe inspiracija kako nešto napraviti.
Pogledao sam i knjigu Hibernate Recepies, A Problem-Solution-Approach koju imam. Ni tamo ne postoji ništa takvo, možda sam i naivan što sam išao i gledati kad naslov kaže kakva je knjiga i s kojim pristupom obrađuju teme. Ali da ne bude - nismo znali. Pa evo da i ja dodam koji centimetar znanja u metre valova u bespuću interneta.
Napominjem da neću stavljati anotacije za Hibernate Search i ako uspijem za Cashing. To su područja koja su nauke same za sebe i mogli bi se pisati blogovi, knjige i sl. samo za njih. Pa da počnem:

  • @Entity - osnovna antacija kojom označavamo klasu koju želimo mapiratu u bazu
  • @Id - uz entity minimum potreban za mapiranje klase. Označava primarni ključ
  • @GeneratedValue - automatska inkrementacija id-a
  • @Table - služi za definiranje imena tablice, kataloga i scheme za vašu klasu
  • @Version - dodavanje "verzije" u dodatnu kolonu radi uspoređivanja kontaktirajućih updateva 
  • @Transient - po defaultu sva polja u klasi će biti mapirana u bazi, ako neko polje ne želimo mapirati koristimo ovu anotaciju
  •  @Lob - po defaultu npr. za String Hibernate će pretvoriti to u bazi u VarChar s dužinom od 255 znakova, tako da je Lob oznaka za tkz. velike oznake. 
  • @Embeddable - umetanje i spajanje komponenti u klasu
  • @OneToOne - mapiranje jedan naprama jedan
  • @OneToMany - mapiranje jedna naprema više
  • @ManyToMany - mapiranje više naprema više
  • @JoinColumns - na kojoj osnovi će se vršiti mapiranje
  • @PrimaryKeyColumn i @PrimaryKeyColumns - definiraju primarni ključ subklasa
  • @SecondaryTable - mapiranje klase u nekoliko tablica
  • @Cashable - oznaka da ćemo koristiti cashing u entitiju
  • @NamedQuery i @NamedQueries - stvaranje upita (ne znam kako da to prevedem na Hr) - stvaranje named queries
  • @NotNull - ne dopuštanje null vrijednosti
  • @Size.max - definiranje veličine polja
  • @Min, @Max - definiranje raspona
Naravno ovo nisu sve anotacije, niti se trudim ih sve napisati. Neke je jednostavno bez primjera ili poviše rečenica nije lako opisati. Npr. ne znam kako da prevedem named query osim imenovanog upita?!? Ujedino sam i dobio ideju za neki budući post - izgubljeni u prijevodu, koliko se "prevođenjem" programerskih izraza gubi u prijevodu. Za sada toliko, s vremenom proširit ću ovaj popis.

četvrtak, 19. siječnja 2012.

Validacija?

Validacija - što je to u uopće i zašto nam treba? Kako je kvalitetno napraviti? I tako dalje i tako dalje.... o ovim potpitanjima bi se dalo raspravljati. Kao i sve malo bolje/važnije stvari u programiranju postoji nekoliko načina kako se može napraviti validacija. Na programeru je da odebere svoj "otrov", ja ću navesti načine koje ja znam i umijem:
  1. Java Script validacija - znači dobri stari js
  2. moderniji pristup je pomoću jQuery-a tj. Do more write less pristupom
  3. najnovije čudo "tehnike" HTML5 i svog konja za utrku ima
  4. Spring naravno nije bez aduta
  5. i ako koristite Hibernate i on ima svog asa u rukavu
Sve je to lijepo i krasno ali treba se odlučiti za jedan pristup i napraviti ga. Sad je pitanje koji??? I tu nastaje dilema koja će razdvojiti dječake od muškaraca ili kako je govorila vještica iz popularne tv igrice Hugo - izaberi jedan broj sigurno ćeš pogriješiti!
Svaka od navedenih metoda nudi svoje nedostatke i prednosti. Navest ću neke od njih. Naravno Java Script će raditi samo ako je js omogućen u browseru, ali ni to nije bez lijeka - jednostavna poruka se da ispisati ako je kojim slučajem napravio disable js u svom browseru (mislim da 90% korisnika ni ne znam kako se ovo radi). Ne znanje korisnika nekad može biti velika prednost. Ali budimo realni pisanje validacije u običnom js nije baš najlakši posao na svijetu. Ako se baš odlučite na js pristup možda je ipak jQuery put kojim bi se trebali uputiti. Premda jQuery ne smatra validaciju kao primarnu djelatnost, ali zato je nudi kao plug in. Mali pogled na službenu dokumentaciju će zadovoljiti i najizbirljivije (http://docs.jquery.com/Plugins/Validation). Ako vam to ne odgovara probajte više infa naći ovjde: http://speckyboy.com/2009/12/17/10-useful-jquery-form-validation-techniques-and-tutorials-2/

Sada dolazimo do html dijela. Potez da HTML5 uključi validaciju je genijalni potez. Premda još uvijek postoje ljudi koji koriste stare verzije browsera koji ne podržavaju HTML5, ne smije se potpuno oslanjati na nju. Uvijek treba imati na umu da se nađe onaj jedan! A pošto je internet globalno selo s najviše stanovnika taj jedan se vrlo lako multiplicira na nekoliko stotina. Nekoliko stotina (a i manje nije ništa bolje) je dovoljno da napravi podosta štete vašoj savršenoj isplaniranoj aplikaciji/bazi... Ono što ide ovom načinu validacije u prilog je vrijeme! S vremenom neće biti browsera na netu koji ne podržava HTML5 tj. i oni ljudi koji su imali prastare verzije firefoxa (moja tetka), IE (verzija koja je došla sa windowsima)... će biti zamijenjena nekom novijom. Plus HTML5 se za razliku od js ne može isključiti :-)

E sada je na redu više "Java" dio validacije. Spring ima jako dobrog konja za utrku, po meni i najboljeg, ako se pravilo odradi. Pošto je Spring vrlo naklon lokalizaciji pa sve naše labele možemo staviti u .properties fileove, tamo možemo i sve moguće erorre u validaciji staviti u jedan takav file i naravno u nekoliko svjetskih jezika. Taj dio je jako važan! Inače, ako se ovo ne napravi, validacija će raditi ali će korisnik dobiti jako ružan error ispisan crvenim slovima. Ali ako errore stavimo u propeties file onda dobivamo validaciju jednaku onoj navedenim u prethodnim koracima. Veliki plus ovoj validaciji je da se također vrlo lako napravi i reprezentacija unesenih podataka. Za one koji ne znaju reprezentacija je kada korisnik nešto unese, klikne na submit i recimo ima 4 točna unešena polja od 5, ispravni podatci će mu ostati dok kod krivog unešenog će dobiti ispisani error. Mislim da je korist i više nego očigledna.

Zadnji, a ujednio i zadnji dio obrane je hibernateova validacija. Ovo je više kao nekakav "good practice" nego potreba. Stavljanje anotacije @NOT NULL, određivanje dužine polja itd... Samim time ako kojim slučajem spring ne odradi svoj dio imamo još jednu razine obrane. Ovaj dio uvijek obavezno radite radi sebe. Učite se raditi pravilno, a ako kojim slučajem spring, js, html5 validacija zakaže imate još nešto što neće.

I nakon cijele ove priče opet počinjemo od početnog pitanja - koju odabrati? Moj savijet je odaberite dve ako možete, više od toga vam ne treba jer u protivnom samo si radite višak posla bez efekta. Ako koristite hiberante, obavezno koristite njegovu validaciju plus još jednu po vašem odabiru. Ako ne koristite orm, odaberite one dve koje smatrate da možete dobro provesti u praksi. Naravno treba procijeniti kolika vam je i važnost podataka koji vam se unose. Koliko je šteta ako se unesu krivo itd. ako nije neka velika vrijednost, jedna je i više nego dovoljna. Uglavnom odlučite sami. Pogledajte koje uopće mogu zajedno raditi. Za Hiberante i Spring govorim iz iskustva i prema meni je najbolja kombinacija. U velikoj većini jedna validacija je sasvim dovoljna.

utorak, 17. siječnja 2012.

Dobivanje JSON-a u Spring MVC-u

Ovo je jako važna tema i nadogradnja u Spring MVC-u. Spring MVC ima puno prednosti, a pored jednostavnog renderiranja alternativnih pogleda tipa pdf, vraćanje JSON-a je po meni sljedeća najveća prednost.

Prije verzije 3 Springa ovaj cijeli postupak je bio dosta kompliciraniji, ali sada je čisti "mačji kašalj". Dovoljna je samo jedna anotacija - @ResponseBody. Točniji primjer ću napraviti malo kasnije, a prije toga ću navesti šta nam je sve potrebno da bi "upogonili" cijelu stvar.

Ovu divnu stvar nam je omogućio Jackson (http://jackson.codehaus.org/). Jason je java json parser... Najbolje je otići na njihovu stranicu i vidjeti cijelo objašnjenje. Uglavnom ako nećete koristiti Maven onda obavezno odite u download dio i skinute jar i dodajte ga u build path.
Ako koristite Maven i njegove zavisnosti onda u pom dodajte sljedeću zavisnost:

<dependency>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-mapper-asl</artifactId>
          <version>1.7.1.</version>
</dependency>

Naravno, verzija zavisi o verziji Jacksona koji ćete koristiti. Šta vam točno koja verzija donosi/odnosi pogledajte na njihovoj službenoj stranici.

Sada imamo sve preduvjete za početak, još nam samo preostaje dodati samo anotaciju @ResponseBody. A to se radi na ovaj način.
  • u metodi od koje želimo dobiti json dodamo @ResponseBody anotaciju
  • u jsp ili html stranici dohvatimo dobiveni json
Pravilo kojeg se trebamo pridržavati kod anotacije je da anotaciju @ResponseBody dodamo iza tipa pristupa metode (privat, public...) a prije vrste metode. Naravno ovu anotaciju stavljamo u naš kontroler. Ono što stavimo u naš return će biti sadržano u našem json-u. I to je to! Vrlo jednostavno.

Na netu sam našao dva super primjera na ovu temu. Jedan koristi Maven, a drugi ne ali je zato kompliciraniji.
Primjer koji koristi Maven:
http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/
Napredniji primjer:
http://krams915.blogspot.com/2011/01/spring-mvc-3-and-jquery-integration.html
 

četvrtak, 12. siječnja 2012.

Hibernate - up and running

Vrijeme je da posvetim malo pažnje Hibernatu. Inače smatram da treba dignuti spomenik osobi koja je došla uopće na ideju da napravi ORM. Mislim da osoba koja je pokušala se povezati na bazu u bilo kojem jeziku jednom kad upozna ORM, se ne vraća se nazad. Odnosno kao što sam ja rekao Once you go ORM, you never go back :)

JDBC je super stvar, ali u usporedbi sa bilo kojim ORM-om (MyBatis, Hibernate...), JDBC gubi i to za puno. Samo kada se upoređuje gdje sve kod klasičnog povezivanja putem JDBC-a gdje se sve može dogoditi exception - sve bi trebalo biti jasno. Kod otvaranja veze, kod konfirmacije usernamea i passworda, kod izvršavanja SQL naredbe, zatvaranja veze....

U ovom postu ću objasniti što je sve potrebno (znači min. konfiguracija) da bi se koristio Hibernate. Prvo što se treba napraviti je otići na http://www.hibernate.org/downloads.html i skinuti verziju Hibernate koja nam treba. Ako se koristi Maven, onda je ovaj korak nepotreban jer nam ne trebaju jar-ovi nego samo dodamo zavisnosti u pom.xm. U ovom primjeru ću koristiti jarove a ne maven zavisnosti. Još treba naglasiti da ću koristiti verziju 3.6 Hibernate.

Kad je zip skinut i odzipan, naravite novi projekt u Eclipsu. Znači obični Java Project (ništa više) jer ćemo napraviti program koji rezultat prikazuje u konzoli. Nakon što je napravljen novi projekt, desni klik na folder projekta i pod Build Pathom dodamo jarove koji su nam potrebni. Jednostavno dodate sve jarove koji se nalaze u odpakiranom hibernate zip folder pod folderom lib/required. Što je i logično :) još dadajte i jar koji se nalaze u folderu lib/jpa. Još jedan jar se ne smije zaboraviti, a to je jar od JDBC drivera baze podataka koju ćemo koristiti u projektu. Ja ću koristiti MySql bazu pa mi zato treba i pripadajući driver koji se može naći ovdje:
http://www.mysql.com/products/connector/

Hibernateu stvarno ne predstavlja nikakav problem koji ćete bazu podataka koristiti. Možete koristiti MySQL, PostgreSQL, Derby DB... samo dodate u build path pripadajući jdbc driver i to je to, sve ostalo je isto za sve.

Pa da krenemo. Da bi program mogao raditi uz pomoć Hiberatea, potrebne su 3 stvari:
  1. Potrebno je kreirati bazu na serveru koju ćemo koristiti. Hibernate može stvarati tablice, ali ne može stvoriti bazu
  2. Potrebno je u projektu definirati hiberante.cfg.xml što je zapravo konfiguracijski xml gdje definiramo koji su korisnički podatci za bazu (korisničko ime i password), koje ćemo klase definirati kao tablice u bazi i još neke postavke
  3. i zadnje ali ni pod kojim slučajem ne najmanje važno postaviti Entity i Id  anotacije u klasi koju ćemo koristiti.
Naravno postoji još neke stvari koje trebamo napraviti u main klasi, ali o tome kad dođemo do toga.
Napravim novu klasu pod imenom Automobil. Ono što je velika koristi i prednost Hibernatea je da on koristi POJO klase.

@Entity
@Table(name="VOZILA")
public class Contact {
   
    @Id
    private int id;
     private String ime;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getIme() {
        return ime;
    }
    public void setIme(String ime) {
        this.ime = ime;
    }
}
  
Kao što je vidljivo ovo je obična POJO klasa sa geterima i seterima. Uz dodatak anotacija.
Ono na što treba točnije trebalo bi se raditi je paziti kod importa. Kaže se da je good practice (pogotovo kod ovih POJO klasa) importe raditi iz javax persistenca, a ne iz hiberantea. Importi iz hiberantea se rade za query, session factory i ostalo što je specifično za Hibernate, dok velika većina anotacija koje se stavljaju u POJO klase su postale dio standarda tj. javax persistenca. Naravno ništa vašem programu neće faliti ako napravite importe iz hibernatea, ali razlog zašto bi ih trebalo raditi iz javax persistenca jer su oni dio standarda i ako nam se pokaže potreba da npr. prebacimo se na neki drugi orm, moramo promijeniti samo importe u main klasi, dok POJO klase ostaje kakve jesu. A sada da objasnim anotacije i što su one zapravo.

Kada je hiberante kao ORM izašao na svjetlo dana nisu postojale anotacije nego se koristilo xml mapiranje. Znači za svaku klasu se radio zasebni xml u kojem su se pisali properties. Uglavnom isto kao anotacije samo uz puno više pisanja nepotrebnog koda. Anotacije su utoliko bolje jer su brže za napraviti, a da ne pričam da se nalaze u klasi koju nam treba. Ne trebamo otvarati xml file mapiranja i uspoređivati xml s klasom. Pomoću anotacija govorimo Hiberanteu šta mi točno želimo od klase i podataka koji se nalaze u njim.
Tako npr. jedna od glavnih anotacija je @Entity jer pomoću nje govorimo Hibernateu da ta klase je klasa koju on treba pretvoriti u tablicu i onda on može odraditi taj posao za nas. Sljedeća anotacija koja je potrebna da bi stvar radila je @Id anotacija. Ona jednostavno govori orm-u koje polje će biti primarni ključ u tablici, jer kao što svi znamo svaka tablica mora imati primarni ključ. I to je to što se anotacija tiče. Naravno postoji cijeli niz anotacija koje možemo uključiti i koje ćemo koristiti ako radimo išta ozbiljnije od običnog Hello world primjera, ali za sada toliko. U nekom sljedećem postu ću obraditi samo anotacije.

Nakon što smo odredili koje će klase orm koristiti potrebni je podesiti postavke, a one se rade u hiberante.cfg.xml file. Jednostavno ne pišete cijeli kod napamet ili iz početka odite u odzipani folder koji ste skinuli i pretražite za datoteke cfg.xml i iskoristite već postojani xml kao predložak. Dobro provjerite rezultate pretrage jer postoje cfg xml-ovi koji nisu potpuni.

A sada da objasnim par stvari:
Pod <!-- Database connection settings --> naravno unosite podatke koje se odnose na vezu, te tu unesite podatke koje odgovaraju vašim potrebama. Malo zbunjujući pojam je tag dialact. To nije ništa drugo nego sintaksa koju ćete koristiti u pisanju vašeg koda koji se bavi upitima. Postoji čitav niz dijalekata, ali ako koristite MySQL odaberite MySQL dialekt. Ta opcija postoji ako želite koristiti dialekt koji se koristi isključivo u određenoj bazi podataka a npr. nije definiran u standardnoj SQL sintaksi  i na to je jedini način na koji možete koristiti taj dialek.
<property name="hbm2ddl.auto">create</property> je vrlo važan tag! I jedna vrlo moćna funkcija ORM-a. Ovo zapravo govori Hiberanteu da kada pokrenete program ako on ne nađe tablicu da je stvori, a ako postoji već on je dropa i ponovo stvori sa novim podatcima. A ako stavimo vrijednost umjesto create na update, onda pri pokretanju (ako postoji već tablica sa istim imenom) on je neće dropati pa ponovo kreirati nego će samo zapisati novonastale promjene. Tako da se kaže da u development fazi se ovo postavi na create a kad se isporučuje program onda se ova vrijednost postavi na update.
Još nam je jedno svojstvo ostalo za podesiti, a to je sljedeće:
<mapping class="com.punoimepaketa.ImeKlase"/> Ovdje jednostavno stavimo puno ime paketa i klase koju želimo da Hiberante pretvori u tablicu, tj. sve one klase u kojima smo stavili @Entity anotaciju. Naime nije dovoljno staviti anotaciju, jer ako ovaj korak ne odradimo neće se dogoditi ništa.


Još nam samo preostaje da napravimo našu main klasu i to je to. Pošto je ovaj post namijenjen više kao teorijski a ne kao praktični primjer, tj. post koji će vam skrenuti pažnju na neke stvari koju su potrebne, neću sada ovdje pisati main klasu. Ujednimo imam osjećaj da pišem preduge postove i da će se teško naći osoba koja će ih cijele pročitati. Još jedna činjenica je da nitko neće doći na moj blog naučiti Hibernate, naime ovo sve može poslužiti kao dobar podsjetnik ili kao dobra smjernica.
Zato ću u jednom u sljedećih postova napraviti praktični primjer gdje ću u detalje objasniti main klasu i gdje ću dati cijeli kod. Do tada pozdrav

utorak, 10. siječnja 2012.

Virtual pairs programmers iliti kako sam uložio 129$ u svoje znanje

Virtual pairs programmers je jedna odluka koju sam vagao i razmišljao dali da ili ne, ali koju nisam požalio. Štoviše svakome bi preporučio da isto napravi.

www.virtualpairprogrammers.com


Obično su Amerikanci ti koji radi video materijale za  e-learning, tako da sam bio ugodno iznenađen što su autori ovih materijala Englezi. Ako išta mogu reći, oni su pokazali kako se to radi premda sam bio skeptičan.

Prvo što ću objasniti je razlog zašto sam odlučio uložiti 129$ u svoje znanje. Smatram da je znanje jedina stvar koju ti nikad nitko ne može oduzeti i ne može osporiti, tako da svaki dolar, euro, kuna uložena se može samo vratiti. Osnovni razlog zašto sam se odlučio za Spring MVC je jer želim se baviti web developmentom a nakon Hibernatea, Spring MVC je logičan izbor, posebno radi dobre integracije njih skupa.
Naravno tražio sam po netu tutoriale, ali osim osnovih Hello Worlda ništa pametnije nisam našao. Ponuda knjiga na tu temu je i više nego očajna. Postoji knjiga od Apressa od Spring MVC-u i WebFlowu ali koja se bazira na verziji 2.0. Ako ste i malo upućeni u Spring znat ćete da je to verzija prije anotacija. Znači svaka klasa je nasljeđivala nešto i hrpu nekih metoda i ... uglavnom anotacije - BOG VAS BLAGOSLOVIO!!!
Za verziju 3.0 ne postoji jedna knjiga neko se može naći po poglavlje u knjiga Spring in Action i Spring Recepies.
Premda Spring slovi kao framework s najboljom dokumentacijom ikad, čak i od verzije 1.0. nije ni tu sve bajno. Postoji stvarno opsežna dokumentacija, čak i Spring MVC izrada aplikacije step-by-step ali za verziju 2.5. Nešto im i nije na listi prioriteta da isto naprave za 3.0. ili sad već za 3.1. Očito je da guraju svoj najnoviji projekt koji će kad tad možda i u potpunosti izgurnutu Spring MVC iz samostalne upotrebe, a to je Spring Roo.

Odlutao sam previše od orginale teme, pa da se vratim. Odluka je pala, kupujem! Brza transakcija preko pay pala i na mail dolazi link. Skidam 15 lekcija o Spring MVC-u i Web Flowu.
Svaka lekcija je super objašnjenja! Bez pretjerivanja. Čak se autor i potrudio pošto se sve bazira na verziji 3.0 da objasni kako bi stvari i izgledale u 2.5 na mjestima gdje se razlikuju tako da ako se ikad nađete bačeni u kod od 2.5 da znate o čemu se radi.
Još jedan plus je njihova služba podrške. Na moj upit oko jednog poglavlja (prije bilo kakve moje kupnje uopće) odgovor mi je došao u rekordnom brzom roku, premda je bila subota popodne. A da ne pričam kada sam naletio na pogrešku u poglavlju sa Spring MVC-om i JSON-om.
Naime autor sve primjere kada su gotovi prikazuje u google chrome, a ja u firefoxu. I na moje iznenađenje (radio se primjer o autocomplete u search boxu) prateći i prepisujući isti kod koji autor piše, njegov primjer radi, a moja doSearch funkija ne radi, štoviše dobivam error da funkcija u js nije definirana???
Posalao sam im mail, i u rekordnom roku mi je autor poslao mail da mu pošaljem cijeli war file jer prema ovome što on vidi iz mojeg jsp filea je da bi sve trebalo raditi ali ne radi. Nekoliko sati kasnije mi autor odgovara da mu je ovo bio pravi brain teaser :) ali da je uspio to na kraju riješiti. Naime on je kod snimanja materijala koristio verziju Chromea koja podržava ne zatvaranja tagova u html-u. tj ako ga vi zaboravite zatvoriti on će to sam napraviti za vas, a moj firefox, a i verzija Chromea (premda novija) koju sam ja koristio to ne podržavaju - vjerovatnost kao i dobitak na lotu!
Uglavnom mi smo u početnom script tagu isti tag i zatvorili, a da bi jquery include radio mora se imati otvarajući script tag, prazno mjesto pa zatvarajući tag. Čak mi je poslao i link na stackoverflow zašto je važno da se taj script tag tako zatvori, te da sam ja bio prvi koji je uočio taj problem i da je sve to stavljeno u erraratu. Svi sretni i zadovoljni, ja bogatiji za znanje, a oni siromašniji za error.

Sve u svemu njih moram preporučiti svakome, ako se dvoumite svakako kupite jer nećete požailiti

Indijac koji znanje znači!

Na prvi pogled naslova neki bi se mogli zbuniti, ali dobro vas oči služe. U ovom postu ću pažnju posvetiti jednom indijcu koji mi je puno pomogao. Naime on je svoje znanje odlučio podijeliti s ostalima na YouTubu, za besplatno.

Njegovo je ime Koushik i možete ga naći na:
http://javabrains.koushik.org/

On je napravio čitave serijale o popularnim Java EE tehnologija. Moja preporuka je da se krene sljedećim redom, a ako pogledate datume dodavanja pojedinih videa mislim da je i autor to tako naumio:

  1. Za početak Maven, uz jednu primjedbu da njegove materijale trebate malo proširiti. Pročitajte knjigu Apache Maven 3 Cookbook i na konju ste.
  2. Sljedeće što bi trebali naučiti su JSP i Servleti, nema ih puno ali ako ne znate osnovne pojmove, momak to jako dobro objašnjava.
  3. I dolazimo do onoga za što amerikanci u žargonu kažu - what seperates men form the boys, tj. Hibernate ORM. 34 tutorijala koji će vas postaviti na pravi put. Nakon toga čitanje knjiga i nadograđivanje znanja je vrlo lako.
  4. Naravno nakon toga slijedi Spring. Vrlo dobro objašnjeni, samo nepotpuni. Mislim vrlo lako se to moglo nadograditi sa još hrpom tutorijala, ali tko zna možda i bude jednog dana. Naravno moja najveća zamjerka je što nije napravio web dio Springa (meni i najvažniji), a da ne govorim da je mogao napraviti i neki realni primjer. Neka me netko krivo ne shvati, momak je napravio sjajnu stvar ali da je odlučio napraviti nekakvu web aplikaciju gdje primjenjuje znanje naučeno u tutorijalima, to bi bio pravi pogodak.
Zadnje što je počeo je Struts 2 tutorijala, koje ja ne mislim učiti. Nikad ne reci nikad, ali kako stvari stoje za sada ne mislim. Naravno pogledati ću ih da vidim kako framework radi, ali ipak je moj izbor Spring MVC.

Prvi problem na koji se nailazi s velikom većinom samo-prozvanih tkz. Java "gurua" je jezik, točnije engleski. Ne želim generalizirati, ali njima engleski jezik baš i ne ide. Znam da nisu svi nadareni za jezike, ali naći ovu kombinaciju kao što je Koushin na YouTubu je pravi dragulj. Ali ima jednu manu čak i on. Ne znam zašto mu to nitko nikad nije rekao ali u engleskom se h u sredini riječi ne čita :) Tako kada slušate 20-ak tutorijala i on stalno izgovara ime klase pod nazivom Vehicle sa h, malko zbunjuje. Možda ga je engleskom poučavao netko iz Texasa koji na sličniji način izgovaraju vehicle, tko će ga znati.
Velika većinu njih nikada se neće razumiti, premda imaju potrebno znanje, plus mora se uzeti u obzir da nisu svi u mogućnosti tj. pri znanju da prenesu svoje znanje na drugoga. Neki jednostavno pričaju previše, neki premalo, neki pre nerazumljivo... i lista se tako nastavlja.

Osobno sam više tip osobe koji više voli nešto vidjeti kako se radi nego čitati stranice i stranice knjiga te pokušavati razumjeti šta je pisac mislio. Naravno, zavisi o čemu se radi. Kada svladam nešto, knjige su neophodni alat, koji s lakoćom čitam jer imam znanje koje je potrebno samo usmjeriti u pravo smislu.
Zato živim u nekom utopijskom snu da jednoga dana će sav materijal koji mi je potreban biti u video obliku.

ponedjeljak, 9. siječnja 2012.

Maven & Eclipse i prva web aplikacija pomoću njih

 Sve što se radi u Mavenu je orginalno namjenjeno da se radi iz command prompta i može se raditi, ali si obzirom da se velika većina (uzeti za zadrškom) java web alplikacija radi pomoću Eclipsea rodila se potreba za eclipse pluginom za maven.

Instalacija je krajnje jednostavna. Potrebno je odraditi korake instalacije mavena na računalo koje sam objasnio u prošlom postu. Zatim u eclipsu se maven dodaje kao svaki drugi plugin.
Help -> Install New Software i dodajte ovaj url: http://download.eclipse.org/technology/m2e/releases i odaberite m2e - Inetgration for Eclipse te next, agree i finish. Nakon svega toga još samo jedan restart eclipse i to je to!

 

Sada prelazimo na praktični dio (ujedinio i onaj zabavniji). Ništa se spektakularno nije dogodilo, na prvi pogled. Ali ako idemo napraviti novi projekt može se primjeti da imao novu opciju Maven i nekoliko odabira. Za ovaj slučaj odaberite Maven Project, kao što je prikazano na slici i Next:


Na prvom prozoru se može sve slobodno ostaviti defaultno i next jer sljedeći prozor je bitan. Možemo odabrati filter jer Maven nudi hrpu, ali doslovno hrpu templatea. Avanturisti slobodno pregledajte šta se sve nudi. Ali ako ćemo raditi web aplikaciju u filter upišite webapp i odaberiti mavenov archetype. Archetype je nešto najsličnije templateu ali maven to zove archetype.


Ima i drugih webapp archetypova i prema potreba aplikacije slobodno odaberite onaj koji vam treba ali ja ću odabrati mavenov web app, te zatim Next. To nas dovodi do jako važnog prozora:





Potrebno je popuniti nekoliko opcija. Group Id je id po kojemu ćemo raspoznavati naš projekt, može biti ime paketa ili neko smisleno ime. Artifact Id je ime projekta koje će se prikazivati u Project Exploreru. Verzija sama objašnjava, ali treba imati na umu da maven će stvoriti naš war file, ali u sljedećem obliku: ArtifactId + Verzija, znači u mom slučaju DemoWebApp-0.0.1-SNAPSHOT
I zadnje ime baznog paketa, zatim nam još jedino preostaje Finish.
Maven je za nas stvorio projekt s rasporedom svih potrebnih fileova za web aplikaciju. Plus bio je toliko dobar da nam generira i web.xml te jedan Hello World jsp. Kako divno od njega! 
Jedino što razlikuje maven projekt na prvi pogled od običnog web projekta stvorenoga u eclipsu je malo plavo slovo m iznad imena projekta i nešto potpuno novo ako se niste sreli do tada sa mavenom, a to je pom.xml


Ako otvorimo pom.xml vidjet ćemo naše opcije i ako bolje pogledamo tag: <packaging>war</packaging>
Znači kada pokrenemo build dobit ćemo war, u slučaju da radimo Java SE aplikaciju umjesto war tu bi stajalo jar.
Još jedan je novi tag ali i pojam -> Dependencies
Unutar toga stavljamo sve naše zavisnosti koju su nam potrebni za našu aplikaciju. Zavisnosti nisu ništa drugo nego jar-ovi koju su nam potrebni za izradu aplikacije. Npr. JDBC jar, spring, junit....
Zavisno što nam treba to unosimo, a to se može napraviti na nekoliko načina. Nakon otvorenog pom filea možemo vidjeti na dnu dokumenta nekoliko tabova. Pa ako kliknemo na tab Dependencies možemo dodati novu zavisnost pomoću Add. Drugi način je ako odaberemo pod tabovima pom.xml tako da možemo uređivati xml ili ako kliknemo desnom tipkom na project pa pod Maven odaberemo Add Dependecy.
Naravno nitko ne očekuje da netko zna napamet sve zavisnosti i kako ih točno napisati. Zato postoje čak i posebne web stranice. Brza pretraga googlom za Maven Repository Search će nam dati brdu rezultat, ja koristim http://mvnrepository.com
Pomoću searcha nađite šta vam treba, u mom slučaju PostgreSQL te odaberite verziju koja vam treba, u mom slučaju verzija 9. Može se uočiti da se vidi dali je verzija beta, release... Odaberite jednu i vidite sljedeće:


Jednostavno prekopirajte xml na stranici u pom.xml unutardependencies tagova i to je to. Možete početi koristiti ih koristiti u svojim programima.
Važna činjenica je da Maven zahtjeva stalno vezu s internetom. Može se koristiti i off-line verzija ali moramo imati zavisnosti skinute u naš lokalni repozitorij. Ako koristimo off-line verziju samo uz svaku opciju dodamo -o. Npr. install -o
Ono što se dogodi kada pokrenemo build, Maven skine sve zavisnosti u naš lokalni repozitorij (ako se zavisnost već ne nalazi tamo), imajte na umu da ako prvi put pokrećete build to bi moglo malo potrajati, što je sasvim normalno.

No dosta priče, potrebno je ovo dovesti k war-u :D
Način na koji se izvršavaju Maven naredbe je da se pod desnim klikom odabere Run As i Maven build... Naglasak tri točkice nisu moja kreativna sloboda, nego ono na što trebate kliknuti. Jer nam to daje mogućnost da utipkamo naredbu koja nam je potrebna.





Pod Goal utipkamo naredbu koju trebamo. Ovdje sada koristimo install (više o mogućim naredbama u mom prvom postu). Ako to radimo iz command promta onda bi utipkali mvn install, ali pošto to radimo u Eclipsu mvn prefix je nepotreban. Još nam samo preostaje klinuti na Run i obratite pozornost na Console tab u Eclipsu. Ono što tražimo je sljedeće:




S tim da nam mora pisati BUILD SUCCESS. I pogledajte cijeli zapis u konzoli i vidjet ćete da se odradi i svi buildovi prije installa. Još jedna važna stvar je gdje možemo naći naš novi novostali war file, a to nam piše neposredno BUILD SUCCESS. Ali uglavnom naš novi projekt će se promjeniti utoliko što će Maven stvoriti novi file pod imenom Targer u kojem će staviti novonastali war file.
Jedino što nam preostaje je naš war file staviti u webapps folder u Tomcat serveru (ili koji već server koristite) ili ako koriste npr. Jetty, onda postoji jedna zanimljiva naredba za vas. Umjesto da napište install možete dodati Jetty zavisnosti (potražite koje su to točno) u pom.xml i kod Run As -> Maven build... napišite Jetty run
Možete i koristiti deploy naredbu u kombinaciji s putanjom gdje želiti smjestiti vaš war file pa ne morate ručno uploadti war u Tomcat.

Ako želite koristiti Maven obavezno pročitajte knjigu Apache Maven 3 Cookbook. Vrlo dobro objašnjeno i napisano. Knjiga ima samo jedan tipfeler, a taj se nalazi na str.98 na ispisu xml-a koji se nalazi How it works. Ispod <plugin> taga vam fali tag: <groupid>org.apache.maven.plugins</groupid>
Mala sitnica ali bi vas mogla koštati nervoze, pošto je to poglavlje gdje kreće iz početka napraviti web aplikaciju i odmah na početku je nećete moći pokrenuti. Zadalo mi je malo problema do to nisam uočuio.

Još jedan dobar resurs za Maven a i ostale stvari za Javu je YouTube. Naročito Koushik (http://javabrains.koushik.org) odite nahttp://javabrains.koushik.org/p/maven.html i pogledajte njegove video tutorijale. Jako dobro objašnjava stvari, s tim da više radi u terminalu, a ne u Eclipsu. Ali kada ih pogledate, prelazak na Eclipse je mačji kašalj.
Toliko od mene za ovaj post

Maven - šta, kako i zašto?

Apache Maven je ... Ove tri točkice bi trebale biti nastavak definicije na hrvatskom jeziku ali pošto neku pametnu nisam našao, engleska će biti i više nego dovoljna. Uostalom netko tko ikad želi raditi bilo šta vezano uz programiranje a aktivno se ne koristi engleskim jezikom je poprilično osuđen na propast :D
Uglavnom prenosim definiciju prenesenu iz engleske verzije Wikipedije:

"Maven is a buil automation and softwere comprehension tool..."
Detaljniji opis se može naći ovdje: http://en.wikipedia.org/wiki/Apache_Maven

Zavisno od autora do autora, članka do članka, knjige do knjige postoji varijacija o broju dijelova "lifecyle" kod razvoja s Maven-om. Vodeći se knjigom Apache Maven 3 Cookbook od Pack Publishinga koju obavezno svakom preporučujem! Knjiga u svojih 200+ stranica objašnjava sve što će vam ikad biti potrebno znati o radu s Maven-om. Uglavnom default lifecycle prema toj knjizi:

  • Validate - validates that all project information is available and correct
  • Compile - compiles the source code
  • Test - runs unit tests within a suitable framework
  • Package - packages the compiled code in its distribution format
  • Integration-test - processes the package in the integration-test enviroment
  • Verify - runs checks to verify that the package is valid
  • Install - installs the package in the local repository
  • Deploy - installs the final package in a remote repository
Ono što obavezno treba imati na umu je da kada izvodimo bilo koju fazu builda, sve faze koje se nalaze prije nje će također biti izvršene. Tako npr. ako odaberemo mvn package - prije package biti će izvršeno validate, compile, test i tek onda package. To je ujedini i jedna od osnovih prednosti Mavena. Ako radite aplikaciju i prije deploya naravno treba provjeriti dali sa zadnjim promjenama nije nešto poremećeno, odaberemo mvn deploy i Maven nam izvrši sve build faze, što znači i naše testove, pa ne moramo to zasebno raditi.
Koliko god Eclipse IDE bio dobar on to ne može! Ali zato postoji inegracija Mavena u Eclipse (ali o tome malo kasnije).
Ovo je nešto ukratko što je potrebno znati prije nego se krene, ali ako niste došli ovdje s točnim znanjem šta je Maven točno, vjerovatno vam nije još sve jasno. Ali kada osoba odradi prvi primjer sve će mu biti jasno, a da bi to mogli napraviti, potrebno ga je instalirati.

Postupak instalacije:

  1.  http://maven.apache.org/download.html sa ovog linka skine se zip file i odapkira se negdje na hardu (u mom primjeru D:\Java\apache-maven-3.0.3)
  2. Još nam preostaje jedna stvar prije nego počnemo raditi, a to je postavljanje sistemskih varijabli za maven. Ja koristim Windows 7, postupak za Linux je malo drugačiji i radi se isključivo iz terminala, vrlo lagano i provjereno s moje strane u Ubuntu. Jedina stvar koju trebate znati je gdje se odzipali maven ( u mom slučaju home/zoki/java/apache-maven-3.0.3). Otvorite Shell i utipkajte sljedeće: export M2_HOME=/home/zoki//java/apache-maven-3.0.3 te stisnite enter, zatim utipkajte sljedeće export PATH=${PATH}:${M2_HOME}/bin
  3. Ide se na Start, te lijevi klik na MyComputer pa Properties -> Advanced System Settings
  4. Nakon toga u Advance tabu se klikne na Enviroment Variables
  5. I sada "najteži dio" - Pod System variables kliknite na New i unesite sljedeće: Pod Variable name: MAVEN_HOME , a pod Variable value: D:\Java\apache-maven-3.0.3 (lokacija gdje ste odzipali)
  6. Pod istim System variable nađite varijablu Path te dodajte %MAVEN_HOME%\bin . Varijeble odvajate s ;
  7. Treba imati na umu da bi Maven radio da treba imati i definiranu varijablu JAVA_HOME (ali to ću pretpostaviti da imate)
  8. Nisam radio screen shotove ali ako imate poteškoća progledajte ovo: http://www.mkyong.com/maven/how-to-install-maven-in-windows/
Pošto je sve instalirano, potrebno je provjeriti dali je sve ispravno instalirano. Pokrenite Command Promt i utipkajte sljedeće (nije bitno u kojem se folderu nalazite):  mvn --version
Ako je sve instalirano dobit ćete nešto slično ovome kao rezultat:

C:\>mvn --version
Apache Maven 3.0.3 (r1075438; 2011-02-28 18:31:09+0100)
Maven home: D:\Java\apache-maven-3.0.3\bin\..
Java version: 1.7.0_02, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_02\jre
Default locale: en_US, platform encoding: Cp1250
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

Ako niste dobili to, to znači da niste dobro napravili sistemske varijable.
Pošto ovo pišem na laptopu na kojem nemam nikakvog programa za obradu sliku (za sada) toliko od mene za ovaj post.Sljedeće što treba napraviti je zapravo i napraviti web projekt pomoću mavena ali to u sljedećem postu