Ice's blog

 

Developing smarter GWT code


Google Web Toolkit (GWT) is a development toolkit for building and optimizing complex browser-based applications. GWT is used by many products at Google, including Google Wave and Google AdWords. It's open source, completely free, and used by thousands of developers around the world.Since the first release, some 2 years ago, a lot of applications have been developed in GWT and lots of bad code has been developed and hopefully, lessons were learned.

In a nutshell, the Lego Framework is a framework easing the process of making GWT applications by using intuitive concepts, proven best practices and conventions. If you have already developed a GWT application, you probably know that GWT code tends to tangle up and weight down the capability of the extensibility and scalability with the growing complexity. The Lego Framework combines the following:

- 'Lego' like approach of building screens in a GWT application
- Intuitive MVC paradigm with simple concepts like Screens, Components, Events and Monitors
- Component-oriented & event driven code, resulting in high decoupling
- Embedded usage of free and open source rich widget library (SmartGWT)
- Simple to use support for internationalization

Not familiar with GWT development?

Do not worry. The Lego Framework is not only intended for people familiar with GWT, it can be also a perfect place for you to start building your GWT applications; you have everything in place.

Take a look at the following links for complete usage, demo application, code and explanation of the Lego Framework:

Google Code Project Page

User Guide (HTML, PDF)

Browse Source Code

Online Demo Application

 
 
 
 

Developing smarter JPA code


If you have worked with persistence in Java, and the chances are very high that you have worked, you probably know that it is the responsibility of the developer to manually take care of the bidirectional relationships between the entities.

As the JPA specification mandates:

It is the developer’s responsibility to keep the in-memory
references held on the owning side and those held on the inverse
side consistent with each other when they change.

Furthermore:

It is particularly important to ensure that changes to the
inverse side of a relationship result in appropriate updates on
the owning side, so as to ensure the changes are not lost when
they are synchronized to the database.

The above means that the developer will need to handle and update the references between the entities himself, instead of primarily focusing in business logic implementations.

It would be nice for the persistence provider or some utility library to take care of the wirings and re-wirings of the entity reference relationships and let the developer to focus on the business logic.

Most importantly, by moving away this responsibility from the developer, you’re moving away the potential of introducing bugs and inconsistencies in your code.

JpaToolbox is just the library that does the above. This simple lightweight library came out as a by-product of the first time I encountered the situation to manually take care of the entity relationships.

I have been using it since in my projects. Hope you will find it useful too.

Take a look at the following links for complete usage, code and explanation of the JpaToolbox library:

Google Code Project Page
User Guide (HTML, PDF)
Browse Source Code

 
 
 
 

JUGMK@Java2Days


Few days ago, the Java2Days conference (http://java2days.com) ended. Was held in Sofia, Bulgaria at the Inter Expo center for the first time and JUGMK was present with 14 of its members.

As the name says, the duration of the conference was 2 days, with the first one splitted in two parallel tracks and the second day was in a single presentation track.

As a first-timer, the conference was pretty well organized and in overall we were pleased with the presented materials. We hope that the conference with grow over the coming years and JUGMK will continue to support it.

Some of the presenters:

Reza Rahman - Member of the Java EE expert group, author of EJB in Action

Rob Harrop - Lead Engineer on SpringSource DM server

Andrew Lombardi - Founder of Mystic Coders, creator of Apache Wicket

Josh Long, Talip Ozturk, Heath Kessler, ....

and least, but not last yours trully with a presentation titled Building Scalable GWT Applications about one of my side projects about a framework for GWT.

Because pictures tend to say more that lines, here's some of them:

Off We Go

Off We Go!

Off We Go

The Premise

Off We Go

The main hall

Off We Go

Absorbing Info...

Off We Go

Trying to explain a few things.

Off We Go

The JUG Factor

Off We Go

Java2Nights :)

Off We Go

JUGMK Rules!

Hold on Java2Days, we're coming the next year, bigger, better and more experienced :)

PS., blogging while you're connecting flights really takes the pain away...

 
 
 
 

Jazoon '09 - Day 3 (Update 3)


Pomina i poslednata prezentacija na Linda Cureton od NASA.

Iako dosta najavuvana i ochekuvana spored moe mislenje ne gi ispolni ochekuvanjata. Barem jas ochekuvav da slushnam za upotrebata na Java tehnologijata vo vselenskite misii na NASA i upotrebata vo internite proekti.

Namesto toa, od CIO-to na nekojsi space center na NASA, dobivme generalno overview na IT infrastrukturata vo NASA, od koe shto 'najvpechatliva' informacija beshe toa deka NASA imale interen Spacebook, kako pandan na Facebook (zashto go izmisluvale trkaloto nanovo i so koja cel, kje si ja prashate Linda :)).

Kako i da, barem zboreshe nekoj od NASA, i plus imashe cool inspirativno video na kraj.

 
 
 
 

Jazoon '09 - Day 3 (Update 2)


Vo vtoriot del od posledniot den na Jazoon '09, interesnite i informativni prezentacii prodolzhija.

Mike Keith od Oracle,  kako Spec Lead na JPA 2.0, ne brifirashe za novinite vo novata verzija za defakto-standardot za persistence vo Java svetot. Kako shto samiot kazha, nema neshto drastichni izmeni, poradi toa shto ovoj del od tehnologijata e dobro poznat (persistence e tuka od mnogu odamna), pa nema nekoi revolucionerni raboti.

Sepak, za izdvojuvanje e voveduvanjeto na Criteria API-to, koe dava alternativa na JP QL za pravenje queri-ja kon persistence provider-ot. Ova API vsushnost predstavuva nekoj tip na DSL napishav vo Java, so deklarativna sintaksa. Isto taka, voveden e i nov strong static typing nachin za specificiranje na parametrite na querijata, za da se izbegnat greshki na runtime i da se skrati loop-ot za dobivanje na feedback za greska vo queri-to.

Od drugite prezentacii, za izdvojuvanje e izlaganjeto na Ed Burns, za integracijata na JavaFX kako frontend vo enterprise aplikaciite. Zakluchokot mu beshe deka JavaFX ima prednost shto kako shto e povekje pati observirano ima prednost poshto raboti na povekje uredi ili kako shto im e mototo 'accross the screens of your life'. I za kraj, go pozdravi zalaganjeto na Larry Ellison za prodolzhuvanje na inovacijata vo JavaFX.

Dobra exekucija na prezentacijata imaa dvajca dechki od Aspect Security za bezbednosta na web aplikaciite, osobeno koga potpagjaat pod agile procesot. Poznatiot pristap od OWASP za prevencija beshe reafirmiran, so zalaganje na koristenje na standardiziranu security biblioteki. Jas tuka kje gi preporacham esapi java bibliotekite (http://code.google.com/p/owasp-esapi-java/) basic bibliotekite se dovolni.

Od Jazoon ostanuvaat ushte cutting edge prezentaciite, kade kje odam i na prezentacijata za novitetite vo Eclipse Galileo i zavrshnata sesija na Linda Cureton od NASA, sesija koja bi trebalo da bide mnogu interesna, shto se odnesuva do upotrebata na Java tehnologiite vo NASA.

Normalno kje ve izbrifiram nabrzina preku blogov i za toa.

Pozdrav, Ice

Jazoon '09 - Day 3 (Update 1)


Zapochna i posledniot den od ovogodineshniot Jazoon '09. Spored najavata pred keynote-ot, ne ochekuva ushte eden interesen den ispolnet so heterogeni prezentacii.

Keynote-ot beshe na Andreas Colyer od SpringSource so naslov tipichen za nekoj koj doagja od SpringSource, "The Changing Nature of Enterprise Java Development"

Prezentacijata pochna so premisata deka ne ochekuva interesna tranzicija na nachinot na kojshto razmisluvame za enterprise Java, aludirajki na ekplozijata na dinamichki jazici koi izrasnaa vrz JVM, i akvizicijata na Sun od strana na Oracle.

Andreas misli deka sme na pragot na tranzicionen period vo IT industrijata, osobeno vo Java i OpenSource delot i proba da prognozira kako toa kje se odviva.

Specifichno se vrza za dinamichkite jazici koi rabotat vrz JVM, ili Java.Next languages kako shto gi narekuvashe. Tuka gi nabroi ochiglednite kandidati, Groovy, JRuby, Jython, Scala, Clojure, Erlang kako potencijalni kandidate na sledniot main-stread language koj kje se koristi vrz JVM, koj kje sorabotuva dobro so Java.

Posle odredena diskusija, izborot go svede na dva kandidati, Groovy i JRuby, za na kraj kako pobednik da go izvleche Groovy, shto i ne e taka za iznenaduvanje imajki vo predvid deka SpringSource stoi pozadi Groovy i Grails framework-ot.

Iako vo prezentacijata imashe golema subjektivnost, shto e totalno razbirlivo, sepak imashe dobri poenti, osobeno deka industrijata se dvizhi kon novi raboti i inovacii od povekje subjekti, shto e totalno dobra rabota.

Do sledniot pat.

Jazoon '09 - Day 2 (Update 2): Modularity


Vtoriot del od vtoriot den od Jazoon '09 pomina vo duhot na eden buzzword: modularity.

Beshe dadeno mislenjeto za neminovnost na odenje kon modularnost na Java, neshto shto OSGi go propagirashe vekje 10 godini. Sega so novite izmeni vo Java 7, mislejki na JSR 294, se stvara sporedba pomegju OSGi pristapot i pristapot na Sun preku ovoj JSR.

Interesno beshe mislenjeto na Peter Kriens pretstavuvajki go pristapot na OSGi, dade osvrt i na potegot od Sun kon nosenje na Java kon modularnost.

Kako za potsetuvanje, vo Java 7 se voveduvaat novi konstrukti koi kje ovozmozhat grupiranje na paketite vo modules (ili bundles) koi si pretstavuvaat logichki entiteti koi si komuniciraat pomegju sega preku strogo definirani kanali.

Poentata na OSGi e ustvari, da ne postojat monolitni aplikacii shto sodrzhat se i seshto vo sebe, tuku nezavisni bundles koi si komuniciraat megju sebe. Takvata grupacija na nezavisni entiteti grupiraat edna logichka celina koi nie ja percepirame kako aplikacija.

Interesna mu beshe konstatacijata deka ako go zemesh brojot na JSR-ot za modularizacijata 294 i go podelish so brojot na noviot release na Java 7, kje go dobiesh brojot 42 shto ako barem nekoj shto slushnal za Douglas Adams znae deka toa e odgovorot na The Life, Universe and Everything Else :)

Kako i da e, modularizacijata doagja vo Java, i vo IT industrijata voopshto, bez razlika dali preku OSGi ili JSR 294; pravat muabet za isti raboti.

Do sledniot pat.

 
 
 
 

Jazoon '09 - Day 2 (Update 1)


I pochetokot na vtoriot den go zadrzha tempoto shto go postavi konferencijata prethodniot den. Keynote speech-ot na Danny Coward, Chief Architect in Sun, gi prezentira rabotite koi ne ochekuvaat vo noviot release na Java 7 i JavaFX 1.2.

Sumirano top 5 feature-ite koj gi smesti kako noviteti vo Java 7:

1.Modulatiry ili Project Jigsaw

Java SE stana ogromna platforma. Postojat mnogu API i klasi koi mozhat da se grupiraat vo logichki moduli i megjusebno da ne si prechat na classpath-ot. Voveden e nov language construct module koj e ustvari gi grupira paketite, na istiot nachin kako shto paketite gi grupiraat klasite. Kje postoi i specijalen fajl, module-info.java koj kje gi definira modulite i soodvernite zavisnosti shto tie gi imaat megju sebe.

Edna golema prednost na ovaa modularizacija e inkrementalnoto on-demand downloadiranje na del od kernelot na JVM kako shto e potrebno na aplikacijata.

2. Widening up the language support over JVM (DaVinci Machine)

Mislam deka ednash zboruvavme za ova...Ovaa DVM pretstavuva proshiruvanje na podrshkata na JVM za besprekorna podrshka na povekje dinamichki jazici koi kje rabotat vrz JVM. Primer. Groovy, Ruby, JavaScript, JavaFX, Scala...

3. Enhanchements to the language (Project Coin)

Mali no bitni izmeni vo sintaksata na jazikot ili kako shto Neil Ford miluva da gi kazhe syntactital sugars  :

- switch/case so string values, namesto so integer values. Najverojatno povekje od vas kje kazhat aleluja :)

- Multiple exception handling. Mozhno e ova da se napravi

try {
...
} catch (final ExceptionOne | ExceptionTwo e) {
//handle the exception
}

- The 'Elvis' operator ?: and ?.

Ova e totalno pozajmeno od Ruby. Primer ova nema da frli exception nikogash:

mayBeNull?.toString() kje pomine iako mayBeNull e null.

ima i ternary extenzija na ova kako:

mayBeNull?.toString() ?: "default"

shto kje vrati default vrednost ako myBeNull ima null za vrednost.

- Improved type inference.

Ima i nekoi poednostavuvanje na type inference-ot vo Java, napr.

Map<String, List<Person>> myMap = new HashMap<String, List<Person>>();

stanuva:

Map<String, List<Person>> myMap = new HashMap<>();

t.e. nema potreba da se parametrizira source implementacijata, tipovite se ochigledni.

4. Garbage Collector improvements (garbage 1st)

Ova e dostapno od Java 6 Update 16, kako experimental feature. Vo Java 7 kje bide turned-on by default.

5. New I/O

Najizmenuvaniot sistem vo Java, se izmeni ushte ednash. Novi podobruvanje, kje vidime kako kje se pokazhat.

Osven Java 7, imashe i osvrt vrz podobruvanjata na JavaFX 1.2, od koi mozhe da se izvadat:

- Multiple platform support extension

JavaFX raboti na PC hardware, mobilni uredi (vekje ima modeli kako HTC Diamond koi doagjaat nativno so JavaFX
runtime, Sony Ericsson i LG imaat uredi koi za nekolku meseci kje se komercijalno dostapni).

Drugi raboti spomeneti bea novi UI komponenti, novi layout-i, improved performance i novi API-a za data access.

Do sledniot pat.

Jazoon '09 - Day 1 (Update 2)


Na krajot od ovoj den, slushnavme ushte dosta kvalitetni prezentacii, od koi zavrshnite 2 ending keynote govori, bea ednostavno fenomenalni.

Prvata prezentacija beshe na Neil Ford od Thoughtworks, so naslov Smithying the 21st century beshe filozovski osvrt na rabotite koi se sluchuvaa od tehnoloshki aspekt vo 20 vek i prognoza vrz baza na toa sobrano iskustvo na rabotite koi doprva kje sledat vo ovoj 21 vek. Iako ushte pod svezhi impresii na ovaa ednochasovna prezentacija, sepak mislam deka beshe edna od podobrite na koja sum prisustvuval. Se nadevam deka kje uspeete da ja poglednete na parleys.com

Vtorata prezentacija na Ivar Jacobson, so naslov What they don't teach you at school about software: Be Smart! beshe zhivopisen i pragmatichen osvrt na chovek koj ima ogromno iskustvo so procesot na kreiranje na softver, vrz evolucijata na metodologiite na vodenje na proekti pochuvajki od RUP, CMMI, XP, zavrshuvajki so akcent na Agile.Osven toa, prilichno interesen mu beshe i osvrtot na nachin na vodenje na proekti od povekje aspekti, developers, enterprise architect, project management i slichno. Osobeno vpechatok mi ostavi terminot Executive Enterprise Architect t.e. chovek koj aktivno ja gradi arhitekturata na proektot vo celiot tek na proektot.


Iako gornite dve prezentacii bea highlight za ovoj den, sepak i vo vtoriot del od ovoj prv den od Jazoon '09 imashe interesni i informativni prezentacii. Tuka kje gi izdvojam dobriot voved i iskustva vo iPhone development svetot od Ognen Ivanovski, kako i informativnata prezentacija za Java Rules engines, so osvrt na Drools i iLog.

Posebno kje ja izdvojam i prezentacijata za GridGain, alatka koja ti ovozmozhuva na ednostaven nachin da osposobish del of tvojata logika da rabti na povekje jazli vo grid.

 Pozdrav do sledniot pat.

 
 
 
 

Jazoon '09 - Day 1 (Update 1)


Дечки,

 Како што најверојатно сте слушнале, Jazoon '09 започна и денес во тек е првиот ден од тридневната конференција.

Ќе се обидам помеѓу паузите да би пренесам дел од атмосферата и по неколку збора од тоа што се случуваше денес во Цирих. Презентациите се одвиваат нон-стоп со пауза од 10 мин и една двочасовна пауза за ручек. Исто така, одеднаш конкурентно одат по 5 презентации, така да е многу тешко да се избере вистинската :)

Отворачката сесија ја имаше James Gosling попознат како 'the father of Java' со презентација која опфаќаше повеќе моменти почнувајќи од што се случуваше на JavaOne, активностите и новитетите на Java 7, како и моменталниот статус на JavaFX со 1.2 верзијата. Најбитно тука е да се спомене дека JavaFX похрабро се отвара према мобилните платформи, со подобра имплементацијата и перформански врз Ј2МЕ платформата.

И нормално, James не би бил James ако не би презентирал нешто ептен geek, со презентирање на LinkVolt (http://www.lincvolt.com/) custom made машина сопственост на Neil Young која е врзана со Јава виртуелна машина преку која нуди live-data online.

Прилично информативна беше сесијата на Роберто Чинчини, Spec Lead na J2EE 6, со која се оди во поголеми детали на измените во новата Ј2ЕЕ платформа. Најбитно од структурен план е воведувањето на профили на платформата кои би таргетирале и би се концентрирале на специфични групи. Пример, Web Profile која вклучува Servlet 3.0, EJB 3.1 Lite, JSP 2.2, Bean Validation 1.0...

Од порадикалните промени се воведувањето на подршката за асинхроно однесување на самите сервлети, целосна употреба на анотации, и web fragmenti (делови од web.xml кои се независни меѓу себе). Исто воведувањето на Bean Validators и посебна спецификација за REST базирано експозирање на самите сервлети према надвор со едноставни анотации го прават овој release интересен.

Neal Ford од Thoughworks, човек со исклучителна способност за out-of-the-box размислување, ревизитира дел од стандардните патерни на Gang of Four, но од аспект на динамичките јазици, специфично Groovy и Ruby. Генералната порака што ја испрати е дека додека функционалните јазици пристапуваат со креирање на структури со дефинирање на петерни, динамичките јазици имаат language constructs и syntactical fineses со кои ги решаваат овие проблеми на елегантен начин.

До следниот пат, поздрав од Zürich.

 
 
 
 

Keep Tomcat up with a simple script


Goal: You want to detect when your servlet container (Tomcat) is down (due to various reasons - mainly because of not enough memory resources), and bring it up again refreshed.

 Idea: make a simple shell script to check periodically (using cron job) whether the container is present in the processes or the server OS was forced to cut it off because of not enough resources. If down  (not present) bring it up again.

 The script:

#!/bin/sh

STATUS=`ps -ef | grep /opt/mytomcat6 | grep -v "grep" | wc -l`
DATETIME=`date`
if [ $STATUS -lt 1 ]; then
/opt/mytomcat6/bin/shutdown.sh
sleep 1
/opt/mytomcat6/bin/startup.sh
echo "$DATETIME - Tomcat was down..Again. (Told you not to use
magnolia on 280 MB RAM server :)). Bringing it up again...">>/scripts/log
exit 0
else
exit 0
fi

/opt/mytomcat6 is the location on my target tomcat installation. You can use CATALINA_HOME or some other path identifier if you like.

Now place this script in a crontab:

Type in a console crontab -e , and place this line:

*/1 * * * * /scripts/checktomcat

This will run the above script (name as checktomcat into the /scripts/ directory) every minute checking if Tomcat is up. Running this script every 1 minute is not an overhead for the server (it's fast and its basically few comands piped together); the OS will barelly notice it :)

That's it. Place the scripts under /scritps/checktomcat, make it executable (chmod +x) and type the above crontab syntax.  When Tomcat goes down, the script will pick the change within a minute (1 minute is the worst case) and will bring it up again, logging the occurence of the event using a timestamp.

Note: this script can be easilly adapted to check for anything else then Tomcat.

Hope you will find this useful.

 
 
 
 

JUGMK became a member of the JCP


Starting from today, the Java User Group Macedonia became a member of the Java Community Process. What this means?

By being a participant in the JCP, you can influence the path of the  Java Technology by having early access and giving suggestions and reiviews to JSR's proposed by the Expert Groups. It is an organisation of about 1200 corporate and individual participants that steer the Java technology in its path.

Additional benefits for us include getting access to speakers for our events and logistics support from Sun.

Here's the official site of the JCP: http://jcp.org/en/home/index

Cheers.

 
 
 
 

JUGMK Session featured a presenter from Adobe


As usual, last Wednesday, JUGMK had another technical session on the latest trends and popular subjects in the interest of the Java community in Macedonia. The presentations were given in the premises of the Faculty of Electrical Engineering and Information Technologies.

This session, we've had a special guest Mr. Cornel Creanga, Technical Lead and evangelist from Adobe, Romania. He was here to give us a thorough introduction into Flex, Air and the integration with a Java backend.

Two presentations were part of this session:

In the first presentation, given by myself, we had a look into the one of my pet projects, which is to discover the pattern of a usual business process, using the machinery behind the Intalio Tempo Framework (http://tempo.intalio.org). By combining the guys behind the Intalio Framework (Apache DS, Apache ODE, Apache Axis, Orbeon's XForms and Intalio's BPEL Designer) and complementing it with the tools I build SmartUI (frontend and backend management office tool) built in SmartGWT (http://www.smartclient.com/smartgwt/showcase) and using XForms to the maximum, I depicted my idea of the system that can fit into most businesses with a role and action based way, in a workflow-like context.

Basically, the goal is to have all the tools and environment to describe your business processes in a visual way and deploy them into the system and manage them by using the SmartUI frontend and backend features.

The slides of the presentation:


The second presentation, given by Mr. Creanga, covered the Flex & Air technology in pretty informative way, by balancing between the features of the technologies and by looking under the hood of those technologies.

For the ones, unfamiliar with Flex/Air, Flex is an Open Source RIA development toolkit based on the Adobe Flash Player, working both in browser and desktop environment (through Adobe AIR platform). You can check out their showcase application Tour de Flex (http://flex.org/tour) for the best look-and-feel of the nature of the technology.

After we got ourselves familiar with Flex and Air, we started looking about the many ways of how we can connect the Flex fronend with a Java backend system. Starting from Remoting and Web Services we learned about the way of connecting these two technologies. The features like offline-synchonization, push-pull request and security we're also covered.

All on all, the members of the Java community got a good overview of the Adobe RIA open-source technologies.

See you next time.

 
 
 
 

JUGMK Technical Session (28.01.2009)


Once again, this Wednesday, JUGMK held a technical session on popular and interesting subjects, in the interest of the Java community in Macedonia.

In the presence of 50+ Java professionals and enthusiasts, the presentations were held in the premises of the Faculty of Electrical Engineering and Information Technologies.

The conference room was too small to accomodate the audience, which makes it easy for us to continue organize and give even better presentations, in the interest of the Java community.

Let's now go to the presentations themselves.

The first presentation, given by myself, explored a new and exciting build tool for Java applications, called Buildr, which after the experience and usage of the most popular tools Ant and Maven, tried to get the best of the both worlds by having the power and flexibility of Ant while retaining the Maven philosophy in the background.

The whole fundamentals of the entire build lifecycle were presented throughout the presentation, with the intent to excite you about the tool and maybe provide an alternative to your current build system which will solve your Ant or Maven headaches.

The slides from the presentation:

 The second presentation, given by Nikolche Mihajlovski, explored the world JavaFX. This newest addition on the pallete of Java technologies from Sun, offers the creation of user friendly & appealing GUIs, independant of the platform (from Desktop, Web to Mobile, even TVs and other househeld appliances are planned in the future).

We are witnessing a craze from the market for impressive frontend GUIs, and following the previous presentation of Google Web Toolkit, this presentation explores another way of doing those visually appealing interfaces in your Java applications.

The slides from the presentation:

The third and final presentation for this session, given by Aleksandar Nikov, explored the powerfull and easy way of creating visual applications using the Graphical Editing Framework. The domain of these application can be various from simple diagram builders to complex representation and manipulation business systems.

By abstracting the most common need of this kind of applications (like dragging, dropping, selection, outline...) and providing an easy extending model, it gives you a big head start when developing such an applications. You just need to worry of your specific business domain and inherit and re-use the rest of 'middleware common services' from this framework.

The platform is entirely open-source, which enables you develop and easilly to package it as your final product.

The slides from the presentation:

 

Thanks for coming for the ones present, for the rest: be sure not to miss it the next time.


 
 
 
 

JUGMK Technical Session (24.12.2008)



[Read More]
 
 
 
 
 

« февруари 2012
нед.пон.вт.сре.чет.пет.саб.
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   
       
Today

Valid XHTML or CSS?

[This is a Roller site]
Theme by Rowell Sotto.
 
© ipenov