2010-12-30

K/Ubuntu i Windows 7 poređenje

Ovih dana sam dobio laptop sa instaliranim Win7. Bio je to povratak korenima (sad će me prozivati win ovisnici) jer je ipak 3.11 moj prvi OS :) Ali isto tako XP je bio poslednji a sa njima nisam imao dodir od 2007. godine.

Utisci su pomešani. Win nije ružan OS. Task bar je promenjen, više nije tako lako primetiti program koji vam treba jer se ne ispisuju imena, ali bar deluje preglednije, no samo dok se ne otvori više instanci istog programa jer tad radi grupisanje. Očigledno je takav pristup iznuđen nepostojanjem više desktopa.

Tako dođosmo do prve stvari za koju mi se čini da je Linux bolji: postojanje više desktopa. Mislio sam da je moguće srediti problem instalacijom dodataka. Čini mi se da je čak u XP postojao Power Toys dotatak za to... No više ga nema, a programe iz drugih izvora nisam stavljao jer sam u komentarima viđao da uzrokuju nestabilnost.

Druga stvar koja me je nervirala a koju sam rešio je zamena z i y u layoutu za naš jezik. Kubuntu ima za svaki jezik više layouta. Npr. za našu latinicu ima postavka koja imitira ćirilicu tj. jednom tipkom se dobijaju digrafi nj, lj i dž. Takođe ima i layout u kojem su y i z na istom mestu kao i na US layoutu. Takvu postavku koristim i u latinici i u ćirilici. Srećom uz probanje 2 programčića problem je rešen.

Windows je bolji kod instalacije nekih IBM programa. Neke od njih nije ni moguće koristiti na linux-u, neke je moguće ali treba da se čovek pomuči... VMWare Player je takođe lakše instalirati, s obzirom na to da je za najnoviji kernel potrebno patchovati distribuciju. Problem sa Playerom je ispravljen u verziji 3.1.3 :D. No sve su to vlasnički programi, ili se moraju kupiti ili se moraš pomučiti da se prijaviš i ručno skidaš instalaciju (što je u linuxu krajnje neobično) za razliku od npr. VirtualBox-a koji radi savršeno.

Po pitanju resursa... Linux tu dere Win-a. Prvo Win ne vidi više od 3 giga rama. Nešto sam tražio po netu, znam da ima PAE (physical address extension) za win, mislio sam da je to ugrađeno podrazumevano. Ipak komp koji imam je došao sa licenciranim win-om i to najnovijim i to Professional verzijom. Očekivao sam da vidi svu memoriju sa kojom je komp isporučen... Toliko sam verovao da nije do win-a da sam čačkao po netu, video neke 3 opcije koje se dodaju prosleđuju kernelu kod boot-a na MS sajtu. Ali su objašnjenja bila štura. Osim toga pročitao sam da je moguće da grafička uzima giga rama, te sam ne želeći da krivim win okrivio grafičku.

Međutim kad sam na isti komp stavio Ubuntu videlo se da nije do grafičke. I dalje mi nije jasno kako je Linux toliko "pametniji" da sam instalira PAE kernel i vidi svih 4 giga a win ne? Koji je smisao da neko prodaje komp sa 4 giga a da se sa jednim možeš slikati?

I to nije kraj. Na win-u sam terao VMWare image, a image ima gomilu servisa na sebi (uključujući 3 klastera). Image sam pojede preko 3 giga. Zato sam morao da u winu skrešem sve što se skresati da: uključim max performance u Advanced System Settings (i time dobijem win95 lnf), pogasim sve što čuči u SysTray-u, pogasim sve programe osim VMWare Player-a, čak i neke servise koji su mi nepotrebni sam gasio. I opet Win posle boot-a uzme oko 900 MB! Toliku memoriju a ne radi ništa...

Za poređenje:
1) moj Kubuntu uzme 814 MB pri tome: u pitanju je 64-bitna verzija koja inače troši više, podignut je KDE4 najglomazniji GUI od svih GUI-a u lin svetu, radi Akregator (rss čitač), radi Okular (učitana 2 pdf file), pokrenuto 3 deskopa, pokrenut twitter klijent, pokrenut clipboard menadžer, otvoren command prompt, otvoren file menadžer, podignut PostgresSQL ORDMS, DynamicDNS client, apache http server, ssh server, peerguardian ;), applet koji pokazuje vremensku prognozu i mnoge druge stvari kojih klot win nema.
2) Ubuntu 32-bit: troši 360 MB sa upaljenim chat i twitter klijentom, 4 desktopa i Firefoxom u kojem pišem ovaj tekst :) On sam troši preko 60 MB.

Dakle račun je jasan: 300MB od 4GB >> 900MB od 3GB. Na ovu informaciju treba dodati i činjenicu da linux mnogo bolje upravlja memorijom i procesima (nema zakovanu poziciju u fizičkoj memoriji u koju učitava biblioteke, duplo manji mu je deo memorije rezervisan za kernel) da bi priča bila potpuna.

Na kraju mogu reći da mi je drago što sam ponovo došao u kontakt sa Win-om i uvideo sve njegove prednosti i mane. Imao sam priliku da direktno i merljivo uporedim 2 sistema i izvučem koliko-toliko nepristrasne zaključke. Eto da me ne bi zvali linux zilotom. A upravo me tako zovu MS ziloti. Kažem MS a ne win jer su svi oni profesionalno upleteni u win i njegovo okruženje: razni MS Office korisnici, VB i C# programeri, SQL server admini... Nikad nisam čuo java programera da toliko brani win jer java programer ničim nije vezan za MS okruženje, naprotiv što više napreduje u java mastera to se više druži sa unixoidima.

2010-10-13

If Operating Systems Ran The Airlines...

If Operating Systems Ran The Airlines...

UNIX Airways

Everyone brings one piece of the plane along when they come to the airport. They all go out on the runway and put the plane together piece by piece, arguing non-stop about what kind of plane they are supposed to be building.

Air DOS

Everybody pushes the airplane until it glides, then they jump on and let the plane coast until it hits the ground again. Then they push again, jump on again, and so on...

Mac Airlines

All the stewards, captains, baggage handlers, and ticket agents look and act exactly the same. Every time you ask questions about details, you are gently but firmly told that you don't need to know, don't want to know, and everything will be done for you without your ever having to know, so just shut up.

Windows Air

The terminal is pretty and colourful, with friendly stewards, easy baggage check and boarding, and a smooth take-off. After about 10 minutes in the air, the plane explodes with no warning whatsoever.

Windows NT Air

Just like Windows Air, but costs more, uses much bigger planes, and takes out all the other aircraft within a 40-mile radius when it explodes.

Windows XP Air

You turn up at the airport,which is under contract to only allow XP Air planes. All the aircraft are identical, brightly coloured and three times as big as they need to be. The signs are huge and all point the same way. Whichever way you go, someone pops up dressed in a cloak and pointed hat insisting you follow him. Your luggage and clothes are taken off you and replaced with an XP Air suit and suitcase identical to everyone around you as this is included in the exorbitant ticket cost. The aircraft will not take off until you have signed a contract. The inflight entertainment promised turns out to be the same Mickey Mouse cartoon repeated over and over again. You have to phone your travel agent before you can have a meal or drink. You are searched regularly throughout the flight. If you go to the toilet twice or more you get charged for a new ticket. No matter what destination you booked you will always end up crash landing at Whistler in Canada.

Linux Air

Disgruntled employees of all the other OS airlines decide to start their own airline. They build the planes, ticket counters, and pave the runways themselves. They charge a small fee to cover the cost of printing the ticket, but you can also download and print the ticket yourself.

When you board the plane, you are given a seat, four bolts, a wrench and a copy of the seat-HOWTO.html. Once settled, the fully adjustable seat is very comfortable, the plane leaves and arrives on time without a single problem, the in-flight meal is wonderful. You try to tell customers of the other airlines about the great trip, but all they can say is, "You had to do what with the seat?"

Izvor: UbuntuForums

2010-10-12

#ubuntu channel dijalog :)

Danas sam radio upgrade KUbunta 10.04 na 10.10 pa sam napravio par grešaka i trebala mi je pomoć. Najlakše je do pomoći stići preko irc.freenode.net na #ubuntu kanalu. Pomoć sam dobio :) Ali ono što mi je bilo zanimljivo je sledeći dijalog:

[12:21] malicai: Thanks, I'll go there and never use ubuntu again, it deleted most of my porn anyways, cya all, thanks again!
[12:22] liquid: Malici, porn means little in the grand scheme

:))))

2010-10-09

Ubuntu, scalability, java i baze

Nisam pisao duže vreme pa se nakupilo dosta dobrog materijala kojeg bi podelio sa vama.

Sutra je veliki dan za linux jer izlazi xUbuntu 10.10, već godinama najpopularnija distribucija linuxa. Zato vam predstavljem 12 razloga zašto da ga instalirate. A ime sledećeg izdanja (11.04) će biti Natty Narwhal

Ako ste se odlučili za instaliranje novog Ubuntu-a tekst Top things to do after installing Ubuntu 10.10 Maverick Meerkat će vam biti od pomoći

9 Ways to Instantly Code Faster, kako poraditi na svojoj produktivnosti u IT poslovima

7 Most Useful Regular Expression Snippets, gotovi regexi za različite prilike

Map Reduce: A really simple introduction, bez linije koda na vrlo lak način objašnjen algoritam koji se danas koristi svuda gde je potrena skalabilnost

Example how to model your data into nosql with cassandra, za one koji su bili na predavanju koje je organizovala Scalability grupa i kojima se dopalo Dedino predavanje o Cassandra-i. Prikazan je način na koji bi se modelovali podaci za chat aplikaciju.

An Array of Reasons to not use Arrays in Java, koji su problemi sa Array klasom i zašto dati prednost Collection implementacijama

Mockito - Pros, Cons, and Best Practices, tekst o alatu za pravljenje Mock objekata pri testiranju sistema

Spring 3 MVC, tutorijal o Spring-ovim klasama za web programiranje

Android 101: The Basics, serija tekstova o programiranju za Android. Trenutno je izašlo 2 nastavka

Log4j Enterprise, tekst o upotrebi najpoznatije biblioteke za logovanje u java svetu

DB blok:

Optimizing SQL: Removing queries inside loops Hibernate hard facts

Revving Up Your Hibernate Engine, fino podešavanja hibernate-a

SQL Problems and solutions, SQl napredni tutorijal

Hibernate hard facts, najčešče greške u radu sa Hibernate-om

2010-09-30

Vreme je za Linux

Godinama ranije su izlazili tekstovi koji su se pitali da li je ovo godina
linux-a ili predviđali da će naredna to biti. I svi su omašili :) Iako
isključivo koristim linux već godinama mogu reći da je pitanje godine linux-a
stvar prošlosti. Linux je tu među nama i više nije nikakav stranac kog čekamo da
se pojavi. Pogledajte IT oglase. Uopšte nije neuobičajeno da se u njima kao
jedna od stavki pominje i linux. Web programiranje je usko vezano s njim. Uz
programiranje na java platformi često ide linux. Android se ne može zamisliti
bez njega. Kad se doda iPhone i Mac OSX, deca Unix-a nikad nisu bila bliža nama.

U narednih mesec dana očekuju nas dve velike premijere. Prvo 10.10.'10.
izlazili Ubuntu i drugari u verziji 10.10 :) I ne samo da se igra na foru
poklapanja datuma i verzije, nego kad se verzija pročita binarno dobija se čista
desetka! Taman kad se uhodamo sa Ubuntom a ono već početkom novembra pojaviće se
drugi linux div: Fedora 14.

Šta nam donosi novi Ubuntu pročitajte u izveštaju: Ubuntu 10.10 Preview: Steady Progress for Maverick

Par linkova za linux početnike:
40 Must Know Linux Terminologies

40 Basic Linux Command-line Tips and Tricks

40 Linux Shell Commands for Beginners

Hm, moram priznati da ni sam ne znam sve ove komande i trikove :)

Za napredne pingvine prilažem tekst o 6 one linera: http://www.thegeekstuff.com/2010/09/linux-one-liners/

Kako da instalirate sopstveni DNS i time smanjite tromost interneta: Setting up and Using Bind. Ja sam probao i mogu odmah da vam kažem da nije sve kao u tekstu. Fajlovi se na Ubuntu nalaze na drugoj lokaciji i ne postoji jedan conf fajl za BIND već je on podeljen. Ali da se sve srediti :)

Izašao je Ubuntu 10.10 RC i njegovi drugari pa ih testirajte dok ne izađu finalne verzije: https://wiki.ubuntu.com/MaverickMeerkat/TechnicalOverview

A za one koji razmišljaju da instaliraju Linux od nule nek pogledaju PinguyOS, Ubuntu koji je fino ispoliran.

2010-09-29

The state of Java

Stephen Colebourne je u tekstu The next big JVM language izneo nekoliko vrlo zanimljivih opaski i ideja. Prvo se kritički osvrće na javu i nabraja šta u njoj ne valja i na osnovu toga postavlja kriterijume za savršeni JVM jezik. Potom prolazi kroz sve nove JVM jezike i ocenjuje ih na osnovu postavljenih kriterijuma. Na kraju zaključuje da ni jedan jezik ne zadovoljava sve kriterijume.

To ga dovodi do ideje da ne treba tražiti novi jezik već popraviti samu javu. Tolika popravka bi svakako značila raskid kompatibilnosti sa ranijim kodom. Ali Colebourne predlaže upotrebu konvertora koda, nešto što je već primenjeno u Pythonu :)

Jedna od njegovih kritka jave su Exception klase koje ne nasleđuju RuntimeException (tzv. checked exceptions). U tekstu Checked exceptions dalje razrađuje tezu

U vezi sa ovim je i tekst For those naysayers who say Java will be dead…, u kojem se tvrdi

Java will be the money-maker for cloud computing over the next few years.

i to pokazuje najnovijom pohvalom Oracle-a da je oborio rekord u performansama na svom Exalogic Elastic Cloud. Takođe se pominje i VMWare koji se sve više fokusira na javu i javine tehnologije kupovinom Spring frameworka. Izgleda da će to biti dobro i za Groovy i Grails. Oba su vlasništvo VMWara preko Springa, a Grail za razliku od sličnih projekata (Rails, Django) koristi JVM i Spring tehnologiju. Spring već sad nudi svoj framework spakovan sa Tomcate-om napucanim do nivoa app servera i sve to cloud ready!

Side by side poređenje Jave EE 6 i Springa 3.0. Java EE se tek u poslednje 2 verzije pronalazi i kreće putem koji je Spring utabao mnogo, mnogo pre. Zato se procenjuje da broj korisnika Springa mnogostruko nadmašuje broj korisnika EE: Java EE 6 and Spring 3.0

Top Java programming tools, pregled 4 razvojna okruženja za javu, njihova ocena i poređenje

NetBeans and Maven – A quick start guide, u slici i reči, autor je čitajući istu knjigu kao i ja prošao kroz isto iskustvo :)

Oracle je usvojio plan B za Javu 7. Dakle odustaje se od nekih ranije najavljivanih dodataka za Javu 7 ali se zato ne pomera njen izlazak: http://www.baptiste-wicht.com/2010/09/jdk-7-features-updated-plan-b-is-apparently-here/

Takođe i za Javu ME se predstavljaju planovi. Tu je Java najviše ugrožena od strane Googlovog Androida, pa sve sevaju varnice između ove 2 kompanije, sa sve tužbom Oracla i Googlovim bojkotovanjem JavaOne konferencije: Oracle finally outlines roadmap for mobile Java

2010-09-28

Bazno o bazama

Objašnjenje u slici, reči i tabelama šta su indeksi, čemu služe i kako da znamo na koju kolonu da ih postavimo u tekstu: An Absolute Beginner’s Introduction to Database Indexes

Na istom blogu se nalazi i objašnjenje šta je B-tree indeks pomenut u prethodnom postu: A Simple Explanation on How B-Tree Database Indexes Work

Pisao sam o korišćenju connection pool-a u Tomcat-u. U toku razvoja se vrlo često mesto Tomcat-a koristi Jetty, a kako se u njemu koristi connection pool i kako se podešava možete pročitati na: http://docs.codehaus.org/display/JETTY/DataSource+Examples

Pošto se Jetty uglavnom korisiti u Maven-u preko plugin-a, pročitajte kako da podesite DataSource za tu priliku: http://java.dzone.com/articles/jetty-maven-plugin-running

Šta se dešava sa db transakcijama ako se bazi ne pristupa direktno JDBC-om već preko JPA u tekstu Transactions in a JPA World

2010-09-27

U slavu naše profesije

Peter Denning u tekstu The Great Principles of Computing koji je napisan za American Scientist razmatra mesto i ulogu računarstva i infromatike. Njegova misao je da infromatika i računarstvo može predstavljati jednu od četiri osnovne oblasti nauke:
Computing may be the fourth great domain of science along with the physical, life and social sciences
Zato budimo ponosni na našu profesiju :)

12 stvari koje svaki programer treba da zna, brzo, kratko i tačno:

Ovo pokazuje kako naša profesija nije ni malo naivna ;)

Projektni obrasci i principi

John Lindquist je došao na genijalnu ideju kako da objasni projeknte obrasce (design patterns) preko screencasta. Upotrebio je analogiju sa igricom StarCraft da pokaže razlog za upotrebu obrazaca. Potom je u screencastu krenuo da rešava razlog na klasičan način i time ukaže na problem, a potom nudi rešenje u obrascu. Fantastično očigledno. Ovo bi trebalo emitovati na Projektovanju softvera na FON-u :) Za sada je opisao 5 obrazaca: http://johnlindquist.blogspot.com/search/label/design%20patterns

Kad smo kod obrazaca, evo jednog prostog a vrlo korisnog, pri tom nije toliko poznat jer ne pripada grupi GOF pattern-a: Null object pattern

Dobar sajt sa opisom GOF obrazaca kao i projektnih principa na kojima svi obrasci počivaju: http://www.oodesign.com/

2010-09-26

Vim - imperator

Pročitao sam jedan izuzetan tekst o Vim editoru. Do tada sam razmišljao o njemu kao arhaičnom editoru iz doba monohromatskih monitora i rada iz konzole, te da je za editovanje bolje koristiti editor sa GUI-om (moja višegodišnja pretraga za dobrim editorom se završila sa jEdit-om). A ako je potrebno nešto editovati iz konzole tu je MC, nano i joe editor.

Izgleda da je uz vežbu moguće jako produktivno koristiti vim editor, daleko produktivnije nego druge koji se koriste mišom, eventualno sa par shortcutova i prolaskom kroz menije preko mnemonika sa tastature. Podešavanjem i instaliranjem dodataka može se svašta uraditi sa Vim-om. Pri tom se troši malo resursa (za razliku od jEdita :)) a stabilnost garantuje to što se Vim razvija skoro 20 godina!

Naravno, editor je samo editor. IDE će za neke zadatke ipak biti daleko lakše za korišćenje. No znanje rada sa Vim-om i tu se može iskoristiti. Jer svaki dobri IDE i editor mora da ima Vim mode. Tako je u Eclipse, NetBeans, IDEA, čak i jEdit ima vi plugin :)

Tekst koji me je potakao na sve ovo: Coming Home to Vim
Još dobirh tekstova o Vimu:
How I boosted my Vim
Essential Vim
Graphical vi-vim Cheat Sheet and Tutorial
Vim Movement Shortcuts Wallpaper

2010-09-23

Ćirilični slobodni fontovi

Ako vam se čini da nema dovoljno lepih ćiriličnih fontova ili vam je dosadilo da se naša slova p i t u kurzivu ćirilicom ispisuju kao ruska, postoji rešenje! Poslužite se sa 8 naših ćiriličnih fontova koja su potpuno slobodni za korišćenje:


Resavska BG
Resavska BG Sans
Adamant BG
Neoplanta BG
Lovely BG
ПЛАТАН БГ
Ниоки БГ
Адамант Санс БГ

Fontovi su tesitrani na mom linuxu uveženi u OpenType obliku

2010-09-22

Tekstovi o skalabilnosti

Stonebraker pionir u razvoju relacionih sistema za upravljanje bazama podataka priča o novinama u polju njegovog rada i o svom novom sistemu kojeg predstavlja kao postrelacioni. Želja mu je da dobije prednosti NoSQL baza a da ne žrtvuje ACID. SciDB: Relational daddy answers Google, Hadoop, NoSQL

Malo NoSQL igrarija:
Cassandra cluster in a single machine with Ubuntu and VirtualBox

Applying Scalability Patterns to Infrastructure Architecture

Nešto iz Google kuhinje: Sibyl - Lage scale machine learning

NoSQL sistem za upravljanje bazama dokumenata. Learning Mongodb

2010-09-14

Blogeri studentima

Predavanja koja povezuje maksima „Open source pristup znanju“ održaće se u oktobru, novembru i decembru. Predavaće Dragan Varagić, Bogdan Kecman, Goran Rakić, Milan Stojanov, Nebojša Radović - Eniac, Stefan Jocić i Istok Pavlović.

Organizator ovog događaja je FONIS – udruženje studenata informatike FON-a.

Više o predavačima i rasporedu predavanja na: http://b2s.fonis.rs/#b2shome

IT vestii

J2EE transactions explained

Oracle set to merge Java virtual machines

Why Android Is Stealing Share from iOS

Drools JBoss Rules 5.0: Complex Event Processing

Ten Things I Hate About Object-Oriented Programming

Bilo je i komentara ovih linkova, ali je glupi blogspot to pojeo...

2010-09-11

IT vesti

PostgreSQL korača krupnim koracima napred. Posle verzije 8.3 u kojoj je značajno unapređena brzina, verzije 8.4 koja je donela windowing funkcije i neke uobičajene operacije na tabelama pretvorene u izraze, predstojeće verzije 9.0 sa Straming Replication i Hot Standby već je krenulo da se radi na verziji 9.1: PostgreSQL 9.1 Alpha Arrives Ahead of 9.0 GA

Nadam se da će ove promene i poboljšanja uz Oracle-ovo preuzimanje MySQL-a doprineti većoj popularnosti ovog sjajnog rdbms.

Tekst iz oblasti IT menadžmenta, napisan iz teorije i prakse, a zanimljiv u pristupu i povezivanju sa radovima japanskih stručnjaka iz organizacije u Toyota fabrici (čuveni Šigeo Šingo koji je jednom gostovao na Fakultetu organizocionh nauka): The Seven Wastes of Software Development

Mark Reinhold, glavnokomandujući razvojnog tima java platforme u Oracle, objavio je na svom blogu da će doći do odlaganja u planovima za izdavanje JDK u verziji 7. U tekstu se navode 2 mogućnosti: prva da se izdavanje 7. verzije pomeri za sa sredine 2011. na sredinu 2011. i druga da se deo planiranih dodataka za verziju 7 u JDK objavi sredinom 2011. kao JDK 7 a ostatak za kraj 2012. kao JDK 8.

Jedna od ozbiljnijih reakcija na ovu vest u tekstu JDK 7 delayed again... how bad is that?

Scalability udruženje

Grupa entuzijasta, koji vole da rešavaju aktuelne probleme u softverskoj industriji, okupila se na sajtu http://scalability.rs/. Kao što se iz imena može pretpostaviti najveći deo tema kojim se bave proizilazi iz rešavanja problema obrade ogromne količine podataka u uslovima ograničenih resursa: vremena, procesora, memorije...

Scalability grupa je već održala 3 susreta. Možete na blog sekciji sajta videti šta ste propustili, a da se to ne bi više dešavalo prijavite se na mailing listu.

2010-09-10

Reddit oglas sa zagonetkom :)

Reddit, sajt za postavljanje linkova ka zanimljivim vestima (vrsta social bookmarking Web 2.0 aplikacije), je objavio vrlo zanimljiv oglas za prijem novih stručnjaka.

U oglasu se traži da kandidat za posao reši par izuzetnih mozgalica od kojih je najveća dokaz P = ili != NP. Više o problemu na http://en.wikipedia.org/wiki/P%3DNP

A kao šlag na tortu dolazi mail na koji treba poslati CV. On je zadat u vidu zadatka! Pa hajmo ga rešiti :)

Adresa konkursa: http://blog.reddit.com/2010/08/reddit-is-hiring.html

DevProTalk roštilj - IT professionals meets[sic] BBQ

Internet forum DevProTalk organizuje susret (čitaj roštilj i pivo) ove subote (11. sep.) od 10 sati na Adi Ciganliji mesto za roštilj kod restorana Oaza.

Više o susretu na: http://www.devprotalk.com/t9082-devprotalk-rotilj--it-professionals-meets-bbq.html

2010-09-08

Tomcat connection pooling

Dobavljanje konekcije je skupo. Pravljenje globalne konekcije je loše rešenje u uslovima kad postoji više niti (npr. u web aplikaciji) jer se po jednoj konekciji obavlja jedna transakcija, što znači da ako više niti deli istu konekciju one će sa conn.commit() i conn.rollback() da smetaju međusobno. Rešenje je da se ima Connection Pool da kad se zahteva konekcija da se ne prvi novi objekat, a kad se povozove conn.close() da se konekcija ne zatvori već se vrati u pool i reciklira.

Tomcat ima ugrađenu podršku za poolove. U webapp/WEB-INF/web.xml (webapp ako je projekat pravljen pomoću Maven-a) fajlu se definiše resurs preko sledećeg taga:


<resource-ref>
<res-ref-name>jdbc/bankDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


Ovde se definiše ime resursa, njegov tip i da će autentifikaciju obaviti servlet container (tomcat)

Zatim se u webapp/META-INF/context.xml daje definicija resursa:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyApp-1.0-SNAPSHOT">
<Resource
name="jdbc/bankDataSource"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.h2.Driver"
url="jdbc:h2://home/zlatan/test.h2;MODE=PostgreSQL"
username="sa"
password="sa"
maxActive="1"
maxIdle="1"
defaultAutoCommit="false"
testOnBorrow="true"
validationQuery="select 1"/>

</Context>


Prva 3 atributa Resource elementa su prepisana iz web.xml fajla. Zatim ide ime drajvera, url, uname, pass kao i kod ručnog pravljenja konekcije na bazu. Zatim se postavlja maksimalni broj konekcija u pool-u i maksimalan broj besposlenih konekcija. Isključuje se autoCommit za konekcije u pool-u. Poslednje 2 opcije uključuju ispitivanje da li je konekcija živa. Ispitivanje se radi pri pribavljanju konekcije iz pool-a a poslednja opcija je upit kojim se testira konekcija.

Postoje mnoge druge opcije koje nisam prikazao a među njima su najkorisnije removeAbandoned sa podešavanjima removeAbandonedTimeOut i logAbandoned, zatim opcija defaultTransactionIsolation i defaultTransactionIsolation.

U kodu se konekcija pribavlja na sledeći način:


Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup(
"java:comp/env/jdbc/bankDataSource");
Connection conn = ds.getConnection();
// jer se u prethodnoj liniji konekcijaproverava pozivom select 1
// pa ako bi posle select 1 pozvali setTransactionIsolation() dobili
// bi gresku da se izolacija ne moze postaviti u sred transakcije
conn.commit();
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// . . .


Napomena: za više o context.xml pogledati Tomcat dokumentaciju

Iako je ovde predstavljen Tomcatov način za definisanje connection pool-a on se može definisati i na aplikacionim serverima (Glassfish, IBM WebSphere...) no svaki od njih ima drugačiji način za definisanje poolova.

2010-09-07

JPA2/Hibernate kao fil na torti ili kao temelj kuće

JPA je Java persistence API, zvanični standard (ili kako ga oni zovu specifikacija) za objektno-relaciono mapiranje u Javi. Deo je JEE 5 specifikacije iako se može koristiti i u običnoj javi (JSE). Kao svaki standard JPA je tu da uvede red među različitim specifičnim ORM bibliotekama i pruži jedinstven način za rad s njima na dobrobit programera koji sad mogu na isti način da rade sa Hibernate i sa TopLink ORM biblotekama.

Prva JPA verzija kao deo JEE 5 je bila prilično siromašna u mogućnostima. Od svih velikih ORM biblioteka uzeto je samo ono što je zajedničko, najveći zajednički sadržalac. Uz JEE6 6 je izašlo drugo izdanje JPA standarda a već je implementiran u Hibernate 3.5+ i EclipseLink 2.0+ (bivšem TopLinku). Nova verzija je donela dosta novina ali i par razočarenja (o tome više u nekom drugom postu).

E sad da pokažemo kako nam JPA preko Hibernate (JPA/Hibernate) može pomoći. Nastavljam se na prethodni post. Pokazao sam kako se treba aplikacija podeliti u slojeve i kako se sa Springom pojednostavljuje sistem. Uvođenje JPA/Hiberate u takav sistem ima vrlo mali uticaj na arhitekturu. Ako je sve urađeno po JUS-u prelazak sa JDBC na JPA način rada sa bazom će uticati samo na sloj perzistencije. Eventualno će uticati ali minimalno na domenski sloj ako se podaci o tome kako se klase povezuju sa tabelama stave u kod u vidu anotacija. Drugi pristup je da se ti podaci smeste u xml fajl a kod ostavi netaknut. Ovolika izmena sa tako fino lociranim mestom menjanja pokazuje kvalitet višeslojnosti. Da je aplikacija loše podeljena preomena bi se prenosila u gomilu klasa.

Pošto smo u prošlom primeri imali samo jednu klasu u sloju perzistencije dajem njen izgled kad se radi preko JDBC-a:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceUtils;

public class CustomersInDB implements Customers {
  private DataSource dataSource;

  public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
  }

  private Connection getConnection() {
    return DataSourceUtils.getConnection(dataSource);
  }

  @Override
  public Customer loadCustomer(String customerId) {
    try {
      PreparedStatement st = getConnection()
          .prepareStatement("select * from customers where id=?");
      try {
        st.setString(1, customerId);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
          throw new RuntimeException("Customer has been deleted");
        }
        return new Customer(
            customerId,
            rs.getString("name"),
            rs.getString("address"));
      } finally {
        st.close();
      }
    } catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  public void saveCustomer(Customer customer) {
    try {
      PreparedStatement st =
          getConnection().prepareStatement(
              "update customers set name=?, address=? where id=?");
      try {
        st.setString(1, customer.getName());
        st.setString(2, customer.getAddress());
        st.setString(3, customer.getId());
        st.executeUpdate();
      } finally {
        st.close();
      }
    } catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }
}


Prelaskom na JPA dobija se sledeći izgled klase:

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

public class CustomersInDB implements Customers {
  @PersistenceContext
  private EntityManager entityManager; // Spring će uraditi dependency injection

  @Override
  public Customer loadCustomer(String customerId) {
    TypedQuery<Customer> q = entityManager
        .createQuery("select c from Customer as c where c.id=:id",
            Customer.class);
    q.setParameter("id", customerId);

    return q.getSingleResult();
  }

  @Override
  public void saveCustomer(Customer customer) {
    entityManager.merge(customer);
  }
}


U ovom kodu samo je TypedQuery deo JPA2. U JPA1 bi koristili Query interface koji nije generički pa bi morali Object referencu da pretvorimo u Customer prilikom poziva getSingleResult metode.

A da bi sve ovo radilo potrebo je u klasi u domenskoj klasi Customer ili u persistence.xml datoteci opisati povezivanje klasa i tabeli. Primer za opisivanje u domenskoj klasi preko antotacije:

@Entity
public class Customer implements Serializable, Cloneable {

  @Id
  @GeneratedValue
  private long internId;
  private String id;
  private String name;
  private String address;

  public Customer() {
  }

  public Customer(String id, String name, String address) {
    this.id = id;
    this.name = name;
    this.address = address;
  }

  // getters, setters, equals, hash, clone kao i ranije

}


Tabela sličnosti pojmova u JDBC i JPA:

JDBC JPA
database persistence unit
DataSourceEntityManagerFactory
Connection EntityManager


Mogli smo promene da izvedemo i na drugi način. Mogli smo da uopšte ne menjamo CustomersInDB klasu nego napravimo novu implementaciju Cusotmers interfejsa, recimo JPACustomersInDB i da u xml config datoteci za Spring DefaultCusotmersService beanu podmtnemo preko dependency injectiona tu novu implementaciju. To pokazuje kako je dependenci injection moćna stvar. Možemo izmeniti sistem a da ne menjamo postojeći kod!

Ako ste zainteresovani za JPA pogledajte tutorijal na http://www.vogella.de/articles/JavaPersistenceAPI/article.html Iako se tu obrađuje JPA 1 i to u Java SE, mislim da je za početak sasvim odgovarajuć i pošto se radi o običnoj javi nema dependency injection-a, Springa, aplikacionog servera, web programiranja i ostalih zbunjujućih stvari.

Staleži u java svetu

Htedoh dati naslov Klasne podele u java svetu u smislu podele na slojeve kako smo učili iz istorije da je svako društvo bilo podeljeno, ali reč klasa ima posebno značenje u programiranju.

Čitajući jednu dobru knjigu po prvi put sam video kako se na moderan način vrši raslojavanje programa u nivoe i čime se programeri pomažu da bi to raslojavanje uradili na najbolji način. Svi smo učili da savremena softverska arhitektura podrazumeva najmanje 3 sloja:

  1. korisnički interfejs
  2. sloj poslovne logike
  3. DB orijentisani sloj

U praksi se sve klase sistema dele u 4 kategorije:

  • Klase domenskog sloja koje predstavljaju objekte i veze izmađu objekate u poslovnom domenu (npr. u bankarstvu bi to bili računi, korisnici...). Te klase ne treba da znaju ništa o klasama drugih slojeva. Tako da npr. klasa Kupac ne treba da zna ništa o tome kako će se ona predstaviti korisniku sistema (kao web, swing, konzolno i kako u okviru tih mogućnosti). Takođe ne treba da zna kako će se čuvati u bazi niti kako će se koristiti transakcije za kontrolu paralelnog izvršavanja. Svaka klasa iz ovog domena se preslikava u jednu ili više tabela u bazi.
  • Aplikacioni sloj (naziva se i business transaction layer ili service layer) modeluje ponašanje sistema. Koristi sistemske transakcije da bi mogao omogućiti ispravan paralelni pristup. Klase ovog sloja treba da znaju samo za domenski sloj zato što manipulišu domenskim objektima (npr. klasa koja vrši novčane transfere mora imati pristup Račun objektu).
  • Sloj perzistentnosti čuva objekte u nekim trajnim skladištima (bazi uglavnom, ali može to biti i fajl ili EJB) i na zahtev ih uzima iz skladišta. Takođe omogućava sistemske transakcije za pristup skladištu (commit, rollback, transaciton isolation). Treba da zna samo za domenski sloj jer npr. mora da sačuva i pronađe Kupac objekat, i za aplikacioni sloj. Dozvoljeno je da se ima veza sa aplikacionim slojem ali je boljne izbeći takve veze. Upravo nam pomoć aplikacionih frameworkova omogućava da izbegnemo te veze.
  • Sloj korisničkog interfejsa treba da zna samo za domenski sloj jer treba da prikaže korisniku domenske objekte (prikaže Račun) i aplikacioni sloj jer taj sloj dobavlja i prihvata domenske objekte od interfejsa.

Primetite da se sloj poslovne logike podelio na aplikacioni i domenski.

Kako ovo funkcioniše pokazaću na primeru proste Wicket aplikacije koja omogućava izmenu podataka o korisniku. Sastoji se iz 3 stranice: prva prikaže formu za unos šifre korisnika, druga koja prikaže podatke korisnika čija je šifra uneta i treća koja prikaže da je izmena uspešno obavljena. Sva logika se nalazi iza 2. stranice jer ona mora da pronađe i prikaže korisnika za unetu šifru a da zatim snimi izmenu podataka o korisniku.

Ako bismo radili u čistom Wicket-u i JDBC-u dijagram klasa za ovaj primer bi izgledao ovako:




Ovde su korišćeni projektni obrasci: service pattern za Business transacition sloj i Data Access object (dobar opis DAO patterna: Core J2EE Pattern Catalog) za perzistenciju (klase: Customers i CustomersInDB).

Kao što se vidi krše se neka pravila razdvajanja sloja. Klasa DefaultEditCustomerService iz service sloja ima vezu sa DBTranasactionFactory i CustomersInDB iz peristence sloja. Osim toga i na drugim mestima postoji direktna veza sa implementacijom. Npr. EditCustomer bi trebalo samo da komunicira sa EditCustomerService interfejsom i da ne zna koja je implementacija u pitanju, međutim postoji direktna veza sa DefaultEditCustomerService implementacijom.

Ovaj problem se rešava preko Dependency injection-a recimo korišćenjem Spring frameworka. Dijagram klasa za to rešenje izgleda ovako:




Na dijagramu primećujete da su ostale samo veze ka interfejsima što znači da klase ne znaju sa kim komuniciraju, nestala je jaka spregnutost među njima upotrebom Springove podrške za dependency injection. Ali nestale su i klase koje se tiču transakcija jer smo upotrebili Springov transakcioni bean i na njega preusmerili metode iz aplikacionog sloja.

Kada se uporede ova dva dijagrama jasno se vidi koji je prostiji i lakši za razumevanje i održavanje.

Više o Dependenci Injectionu: članak Martina Fowlera i sažetiji članak na Wikipediji
Wikipedija o Springu: Spring Framework

2010-07-06

Baza znanja

Ova tema mi se nametnula od kad sam počeo da radim, Gomila je novih stvari koje treba naučiti, Pamćenje je najbolja baza, ali količina novih informacija i gustina B/s je prevelika.

U prvoj firmi smo koristili trac project management alat. Wiki stranice su sastavni deo tog alata i u njima smo pisali dokumentaciju, pravila itd. U drugoj je korišćena MediaWiki aplikacija, ista ona koja pokreće Wikipediju.

To mi je dalo ideju da probam sa nekim desktop ili ličnim wiki aplikacijama. Probao sam neku gnomovu ali mi nije išlo, pa sam instalirao DokuWiki, wiki za dokumentovanje. To je aplikacija koja se vrti na Apache serveru, Podatke organizuje u fajlove te za razliku od MediaWiki ne mora da se instalira baza. DokuWiki nije lični wiki ali može i tako da se koristi, a može da se omogući pristup mnoštvu ljudi. Ima opcije pretrage, zna da farba primere koda (syntax highlighting), moguće je kod zakačiti kao datoteku a da se sadržaj ipak prikaže uz dodatno dugme za skidanje datoteke, prati korake kojima se došlo do određene stranice... Može se instalirati preko apt-get-a na Ubuntu.

Eksperimentisao sam sa aplikacijama za hvatanje beleški (note taking). Najviše sa Basket-om. Dobar je za neke prostije beleške, ali za nešto trajnije i organizovanije wiki se pokazao kao uspešniji.

Uvek imam instalirano 2-3 programa za pravljenje mapa uma, ali priznajem da iako mi se sviđa ideja, nisam se upuštao u eksperiment. Nameravam to ispraviti.

UML dijagrame koristim da objasnim neke složene stvari. Slika nosi najgušću informaciju.

Sad mi padoše na pamet i programi za organizovanje ebookova, video treninga, audio predavanja. Probaću da ispitam čega ima.

Od eknjiga najviše volim pdf format. U Okularu postoji alat za komentarisanje, označavanje stranica. Koristim ga da zapišem neke napomene, da ispravim uočene greške ili zastarele podatke, da označim ono što je važno...

Možda bi mogao i da iskoristim sistem tagovanja, pa da preko Nepomuka lakše nalazim ono što mi treba...

Kako organizujete svoje znanje? Šta koristite od alata?