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.