<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9126833299707184203</id><updated>2011-09-08T10:08:45.346-07:00</updated><category term='J2ME'/><category term='education'/><category term='multiple auto-complete'/><category term='JavaEE'/><category term='scala'/><category term='workflow'/><category term='Streamlined Object Modeling'/><category term='software abstraction'/><category term='WCIT'/><category term='Java'/><category term='Jonathan Schwartz'/><category term='netbeans'/><category term='JavaFX'/><category term='crud'/><category term='rest'/><category term='JavaME'/><category term='woodstock'/><category term='hateos'/><category term='Message Driven Bean (MDB)'/><category term='pattern'/><category term='JMS'/><category term='CLDC'/><category term='business process'/><category term='Object Oriented Programming'/><category term='agent'/><category term='multi-agent'/><category term='MIDP'/><title type='text'>Enterprise Java Nut 3  [EJN3]</title><subtitle type='html'>Java, IT, MSC, Malaysia, business process, design patern</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-9133540825041839564</id><published>2011-07-11T21:01:00.000-07:00</published><updated>2011-07-11T21:04:32.102-07:00</updated><title type='text'>My GPars slide deck</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-JYEz5MBtahE/ThvHYvBVpNI/AAAAAAAAATA/kt4xT_ffHgw/s1600/slides-01.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 118px;" src="http://1.bp.blogspot.com/-JYEz5MBtahE/ThvHYvBVpNI/AAAAAAAAATA/kt4xT_ffHgw/s320/slides-01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5628311387082433746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;I delivered, for the third time a talk on GPars at the Malaysia Open Source Conference (MOSC) 2011  last week. My slide deck can be found here [&lt;a href="http://www.slideshare.net/azrulhasni/concurrency-for-dummies"&gt;http://www.slideshare.net/azrulhasni/concurrency-for-dummies&lt;/a&gt;]&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-9133540825041839564?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/9133540825041839564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=9133540825041839564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/9133540825041839564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/9133540825041839564'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2011/07/my-gpars-slide-deck.html' title='My GPars slide deck'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JYEz5MBtahE/ThvHYvBVpNI/AAAAAAAAATA/kt4xT_ffHgw/s72-c/slides-01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-1206466931810744018</id><published>2011-02-28T03:24:00.000-08:00</published><updated>2011-02-28T03:30:15.374-08:00</updated><title type='text'>Java is still big!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-MeedYLVN_TI/TWuGmW33RKI/AAAAAAAAAQo/l7qIgN7ZhuM/s1600/salary.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 194px; height: 320px;" src="http://2.bp.blogspot.com/-MeedYLVN_TI/TWuGmW33RKI/AAAAAAAAAQo/l7qIgN7ZhuM/s320/salary.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5578700556961531042" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"&gt;&lt;u&gt;&lt;a href="http://thestar.com.my/news/story.asp?file=/2011/2/28/nation/8151490&amp;amp;sec=nation"&gt;The Star&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-MeedYLVN_TI/TWuGmW33RKI/AAAAAAAAAQo/l7qIgN7ZhuM/s1600/salary.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hear yea! Hear yea!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Java is the king maker again. Apparently, from this stats pulled from The Star, as far as tech jobs are concerned, Java engineers are almost as highly paid as a Business Analyst Manager. I would consider Business Analyst Manager as someone who is deeply entranched in domain knowledge and also is a Manager (basically 8-10 years of experience) .&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Look at that figure again, a plain Java engineer makes almost as much as a domain expert manager. Sure, security is there also but security is multi-disciplinary field. It's hard to quantify what their skill sets are. It could be a simple "pen test"er to a full blown SSO-Multi-tenant engineer, unlike Java engineers which is more narrow. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;All and all, it confirms what I've been saying before. Java is the key to IT innovation and it has been growing a hell lot despite the total lack of attention from MDeC. Don't believe me? Just google for 'MDeC Java' and my rant 2 years ago is the first entry you'll see. There some other entries but mostly outdated stuff. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The question is: What the heck is MDeC doing to encourage people to explore the king maker of IT?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I know Cybersecurity is doing a lot on Security stuff, What about MDeC?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Judging by the lack of any reference I think they are doing... wait for it... NOTHING!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If MDeC wants our developers to earn high-value income, they have to promote Java like no body's business! They have to, no other choice! Java is here to stay and stay rich at least for another decade or so. Or is MDeC being happy that most of our coders just know PHP (no offense of the PHPers but PHP does not figure on that chart).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Sure, Mark Zuck became filfthy rich because of PHP, but the average guy (at least in Malaysia that is) is not Mark Zuck. They are Joe Developer doing development because they are passionate about it, but Software development is just one aspect of their lives. My question is , what has MDeC done to raise the income of Mr. Joe Developer? The obvious answer is that, MDeC could promote Java to them. Promote it like Java is the national agenda, but nooooo. I don't know what MDeC is doing but if you're expecting MDeC to help you to become a java developer and hence earn RM110 k per year, do look else where. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Either that, or let us throw water baloons at MDeC until it wakes up from its sleep.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-1206466931810744018?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/1206466931810744018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=1206466931810744018' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1206466931810744018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1206466931810744018'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2011/02/java-is-still-big.html' title='Java is still big!'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-MeedYLVN_TI/TWuGmW33RKI/AAAAAAAAAQo/l7qIgN7ZhuM/s72-c/salary.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-3276580301374529992</id><published>2010-12-10T01:34:00.000-08:00</published><updated>2010-12-11T05:39:26.396-08:00</updated><title type='text'>You brought this upon yourselves</title><content type='html'>&lt;div&gt;[&lt;a href="http://java.dzone.com/news/apache-backs-its-threat-leaves-0"&gt;Apache to leave the JCP&lt;/a&gt;]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When Sun was around, it was the ugly duckling. No one liked it despite all the things it did for the community. Being the largest open Source contributor was not enough for the bullying community. Sun tried and tried haplessly to do what it can to please everyone and yet, a lot of people were unhappy. Sure, Sun was not perfect, it was the ugly duckling after all, but, for what Sun had done it did not deserve the treatment it received. Every one hated Sun and pounded Sun to pulp since it is ugly and ugly duckling deserved our outmost hatred.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And one fine day, Sun finally died. The people cheered and toasted its death. Unknown to them that Sun was now replaced by a GIANT with an I-don't-give-a-crap-what-the-community-wants-since-I've-never-do-and-yet-I'm-still-filthy-rich attitude. Blazzing the country side with its fist, smacking all that were protected by Sun before.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alas, the community wept but they wept too late. Sun, the gentle  giant is dead. if only they would have liked Sun a bit better it would probably still be around. If only  ...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-3276580301374529992?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/3276580301374529992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=3276580301374529992' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3276580301374529992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3276580301374529992'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2010/12/you-brought-this-upon-yourself.html' title='You brought this upon yourselves'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-3730674669668839405</id><published>2010-07-06T00:26:00.000-07:00</published><updated>2010-12-10T02:04:25.177-08:00</updated><title type='text'>My take on MOSC 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8JZVzSKQmZc/TDLbvfbW75I/AAAAAAAAAPk/NoT6Q25P7Ew/s1600/mosc.PNG"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 97px;" src="http://4.bp.blogspot.com/_8JZVzSKQmZc/TDLbvfbW75I/AAAAAAAAAPk/NoT6Q25P7Ew/s320/mosc.PNG" alt="" id="BLOGGER_PHOTO_ID_5490692504654638994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Just like I said in my lightning talk, this is not a rant, a fault-finding or a bitching piece. This is a sincere advice from a friend to the community.&lt;br /&gt;&lt;br /&gt;Now, with an opening like that you can already guess I'm not going to say anything nice :). But you are wrong, there are some nice things about MOSC 2010. The talks were quite good. We have everything from mobile to server to desktop stuff. Things are practical and "actionable" and rarely we have philosophical talk. Which is good.&lt;br /&gt;&lt;br /&gt;Food is another area worth praising. Food was never ending. On the first day, just when I thought they were serving lunch in the lobby I was suprised to know that what was served was not really lunch (well, at least not for the speakers and the business attendees). The real lunch was at the hotel's buffet. Unfortunately I was too full for the buffet ... (BTW, just between us, it takes a lot to make me full)&lt;br /&gt;&lt;br /&gt;Now we talk about the bad stuff.&lt;br /&gt;&lt;br /&gt;First, there was too much marketechture (did I spell that rght?) going around. The Microsoft keynote paid lips service to PHP and Java (by mentioning them once each).&lt;br /&gt;Now Microsoft was there last year too, but last year we have Google, Mozilla and the now defunct Sun Microsystem to balance that out somewhat. Plus, we really put Microsoft in their place last year. You can really feel fear in their eyes. This year it was different. Sure, Microsoft's presence was not felt as much but you can see that they are grining from ear to ear. All that they fear is gone. They have the "community" eating from their hands. They feel their victory already. So much so, their keynote does not even bother to "suck up" to geeks like last year. At least last year, the apps created during the competition is open sourced. Now this year? I have no idea, it says that those apps are open sourced in the first place, where can i get it? I can't find it on the official competition page [http://conf.oss.my/mtc/].&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Secondly, where the f*cking hell is Oracle? You know, Oracle, the company who bought the largest contributor to open source... yeah that Oracle. Why can't MDeC bring them to the table? Sure Oracle stuffs are mostly boring but they do have a few open source gems. Things like EclipseLink implementing the new JPA 2, or... they could talk about, oh i dunno... MySQL maybe? Now that they own it. I mean, gosh, a debate between Colin Charles and some Oracle "consultant" would be really cool to watch. Heck, I'm sure we can find a bookie or two easily in the crowd now that the World Cup is on :) ... my bet is on Colin KO-ing the Oracle consultant by round 2... any takers?). Or JSF 2/ MyFaces / Trinidad (is that out yet?). And since we're all about cloud, what about  a talk on BerkeleyDB, one of the first key-value DB out there.&lt;br /&gt;&lt;br /&gt;Tons of stuff from Oracle and MDeC could not even get them to come... heck, not even a booth. Now some of you might notice and shout "MDeC is no longer the organizer of MOSC you dolt!", well they are not and yet they bring Microsoft with them (yeah, sure, I'm sure it's OSDC who brings Microsoft in). They could bring Microsoft but not Oracle? Who's the dolt now.&lt;br /&gt;&lt;br /&gt;And last but not least, where are the freakin' shouting and raving geeks we saw last year? Did they all decided to drop PHP/Phyton/Java and decided to go to the dark side? Or did all of them somehow got married (what has marriage got to do with this?). Somehow, someway, MOSC is being invaded by soulless business types who will clap everytime they hear a hype word ... you know like "cloud" ...  clap clap clap.&lt;br /&gt;Don't get me wrong, we need these soulless people because they are the one who pay the most &gt;:) but last year, their effect are being countered by the geeks coming to the conference too. This time, it's just them and no geeks. So they can do all the freakin clapping they want. It's unbelievable.&lt;br /&gt;&lt;br /&gt;I really hope, next year, we focus on "our" stuff, and real open source. We should classify the talks into 3: business, my own opensource project/projects I've contributed to and experiences. And to the academics presenting their papers. Do note that this is not a strictly academic conference. I.e. just because you can apply your artificial neural network to yet another non-existing problem doesn't mean we want to hear about it. (Actually, come to think of it, we don't). Your talk need to be special in a way and not just spew random buzzword du jour. It would be great if your stuff is open sourced, if not then it is ok, but in that case do talk more on how open source stuff is used. And open source stuff should be used fairly extensively in your project to be qualified as an MOSC talk... (btw, just because you use putty to connect to your server doesn't even make your project, even remotely, use open source "extensively"... no matter how you define "extensively").&lt;br /&gt;&lt;br /&gt;It' a great lost that a whole bunch of geeks are not present during MOSC, citing reasons such as being busy, in between jobs and of such. (BTW, to those geeks who are present and contribute their time and energy, especially Fazli, Harris and the gang - kudos to you guys. You've done an amazing job indeed) My own experience says that being a geek the last 1 year or so was painful at best and almost destroyed me at worst. Heck, I almost did not submit a paper this year. It is unfortunate that MDeC has no one looking after the developer community. The guys who are present at MOSC (Ritz and his team - you guys are the best) are not directly responsible for community. Heck, I'm sure that they have to fight their way to get some form of "community" support from MDeC. I sincerely hope that this year's MOSC would make MDeC realize that they can do all the "transformation driving" that they want, but if the community is not following them... or worse, the community is going on a whole different direction (like, you know, down south), at one point, they won't have any passanger to drive anymore.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-3730674669668839405?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/3730674669668839405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=3730674669668839405' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3730674669668839405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3730674669668839405'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2010/07/my-take-on-mosc-2010.html' title='My take on MOSC 2010'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8JZVzSKQmZc/TDLbvfbW75I/AAAAAAAAAPk/NoT6Q25P7Ew/s72-c/mosc.PNG' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-843608986204940547</id><published>2010-02-10T19:21:00.000-08:00</published><updated>2010-02-10T19:30:38.199-08:00</updated><title type='text'>Agile is not an excuse to be lazy!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8JZVzSKQmZc/S3N50epI4gI/AAAAAAAAAIg/IOmxHw07PDA/s1600-h/images.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 209px; height: 198px;" src="http://3.bp.blogspot.com/_8JZVzSKQmZc/S3N50epI4gI/AAAAAAAAAIg/IOmxHw07PDA/s320/images.jpg" alt="" id="BLOGGER_PHOTO_ID_5436823117652091394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;What if you have 9 scrum teams trying to implement a piece of software. To make things challenging, the scrum teams are supposed to work on components that are interrelated and depends on each other. Imagine scrum team A's component needs a service from a component still under development by team B? Now of course team A can just wait until team B finish their component and just sip coffee and write tech. blogs (like this one) all day long. But I'm sure the business types would be pulling their hair out (and note that they don't have that much to pull out anyway) when they hear that. Heck, they might even force you to use *gulp* CMMI processes from now on.&lt;br /&gt;&lt;br /&gt;Another option is for team A to mock the team B's component and go to work with that. That is a better solution but here's the kicker, what do you mock?&lt;br /&gt;&lt;br /&gt;The answer is team A and B need to sit down and properly design the boundry and contract of their components up front so that work can be done properly and team A does not need to bother team B every 3 days because they need a new service. Things could be worse if team A and B are located halfway across the world working in different time zone and whatnot.&lt;br /&gt;&lt;br /&gt;But you see, I'm shivering here while typing this because "sit down and properly design the boundry and contract of their components up front" does not sound "agile".&lt;br /&gt;&lt;br /&gt;Somehow, there is this meme that has been going around saying,&lt;br /&gt;&lt;br /&gt;anything up front != agile&lt;br /&gt;Bullsh*t&lt;br /&gt;&lt;br /&gt;There are to ways of looking at this:&lt;br /&gt;&lt;br /&gt;1) If it's not agile, who cares! I just need to get my work done! If it's not agile. I don't give a rat's *toot*&lt;br /&gt;&lt;br /&gt;2) Agile is about easily making changes and not about "being lazy". You can design "enough" up front without making your system brittle and crack under load of changes, can't you? Sure you can. The only reason that you do not want to do it is the plain old sin of sloth. Not the agile philosophy.&lt;br /&gt;&lt;br /&gt;It's is bad enough that when the agile movement starts, developers embraces it because they're just lazy to think through what they do and just want to code. And thus this meme where agile is seen as a holy war againts anything upfront, even planning, sometimes, was born. Oh we don't plan, we're agile. Bullsh*t!&lt;br /&gt;&lt;br /&gt;Could the upfront stuff change? sure, that is what agile is all about. But team A and B might need to sit down together again maybe once in the next 2 months. But if things are not defined up front, you may have to poke that nasty evil-eyed team lead from team B for his help every 3 days. Do you really want to do that? *Now please voluntarily imagine his evil-eye... yup, not pleasing isn't it*&lt;br /&gt;&lt;br /&gt;Things could get worse when A depends on B, B depends on C and C depends on A. This circular dependency is sooo going to kill your project if not managed properly.&lt;br /&gt;&lt;br /&gt;So, as a conclusion: agile is good, being lazy, whatever excuse you tag it with is just evil.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-843608986204940547?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/843608986204940547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=843608986204940547' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/843608986204940547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/843608986204940547'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2010/02/agile-is-not-excuse-to-be-lazy.html' title='Agile is not an excuse to be lazy!'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8JZVzSKQmZc/S3N50epI4gI/AAAAAAAAAIg/IOmxHw07PDA/s72-c/images.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-6149504364407165709</id><published>2010-01-25T22:53:00.000-08:00</published><updated>2010-01-25T23:07:26.931-08:00</updated><title type='text'>What's troubling our PM</title><content type='html'>&lt;div align="justify"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8JZVzSKQmZc/S16UcZ81qGI/AAAAAAAAAIY/e_ojWPuRgJ0/s1600-h/images.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 117px; height: 118px;" src="http://3.bp.blogspot.com/_8JZVzSKQmZc/S16UcZ81qGI/AAAAAAAAAIY/e_ojWPuRgJ0/s320/images.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5430941416378706018" /&gt;&lt;/a&gt;&lt;br /&gt;Wow, it's almost February and I have not rant nothing yet this year (yeah yeah, double negatives yada yada yada). I must be getting soft. Anyway. Here's a quick one:&lt;br /&gt;&lt;br /&gt;PM says: We must move fast&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="justify"&gt;The rest of the gov says in order to move fast you have to:&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div align="justify"&gt;1) Fill in form A, D11 and E&lt;br /&gt;&lt;br /&gt;2) Write a 50 page business plan (anything less will be rejected)&lt;br /&gt;&lt;br /&gt;3) Make 10 copies of said business plan plus 3 soft copies burned to DVDs (plain CDs will be rejected) marked "Moving fast program"&lt;br /&gt;&lt;br /&gt;4) An Excel file stating the projection of profits for the next 10 years (yeah yeah, we know you made those numbers up but we really enjoy playing with Excel)&lt;br /&gt;&lt;br /&gt;5) Should not have a prototype - if we as much as smell the flatulence of a prototype, your proposal will be rejected&lt;br /&gt;&lt;br /&gt;6) 6 certified-true-copies of your SPM certificate (why 6 copies... well we just made that up ). BTW, only the Ketua Kampung at which your school was situated would have the authority to certify those copies.&lt;br /&gt;&lt;br /&gt;7) 7 copies of your IC (again, must be certified true copy - again, we made the number 7 up... wow this IS fun).&lt;br /&gt;&lt;br /&gt;8) Satu dulang hati nyamuk&lt;br /&gt;&lt;br /&gt;9) And don't forget, stamp duty RM 10&lt;br /&gt;&lt;br /&gt;10) You should have never ever fail before. What? You got third place in that 'Lari dalam guni' competition at kindergarden? Next!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-6149504364407165709?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/6149504364407165709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=6149504364407165709' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/6149504364407165709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/6149504364407165709'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2010/01/whats-troubling-our-pm.html' title='What&apos;s troubling our PM'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8JZVzSKQmZc/S16UcZ81qGI/AAAAAAAAAIY/e_ojWPuRgJ0/s72-c/images.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7916311480734685216</id><published>2010-01-12T23:01:00.001-08:00</published><updated>2010-01-13T18:09:31.323-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object Oriented Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='Streamlined Object Modeling'/><title type='text'>Recurring patterns in application II : Streamlined object modeling to the rescue</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8JZVzSKQmZc/S01wTGiXlBI/AAAAAAAAAHw/B-asWFZF93k/s1600-h/som_cover.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 113px; height: 150px;" src="http://3.bp.blogspot.com/_8JZVzSKQmZc/S01wTGiXlBI/AAAAAAAAAHw/B-asWFZF93k/s320/som_cover.jpg" alt="" id="BLOGGER_PHOTO_ID_5426116599525905426" border="0" /&gt;&lt;/a&gt;I'm still on my quest to find basic patterns in most (if not all) software systems [read my first attempt &lt;a href="http://ejn3.blogspot.com/2009/12/recurring-patterns-in-applications.html"&gt;here&lt;/a&gt;] when I stumbled upon &lt;a href="http://www.streamlinedmodeling.com/"&gt;Streamlined Object Modeling&lt;/a&gt; (SOM) by Jill Nicola, Mark Mayfield and Mike Abney. This book really blows my mind as it answers my calling with a bang! This book is really a superbly good reference book, on par with Domain Driven Design (DDD) and even the GOF book and yet it is so unknown (it was written back in 2002 - I just graduated in 2002 - and it took me all these years to find it). This must be the most underappreciated IT book ever!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;The style of the book does not make it an easy read. It is full of Principles (98 of them) and a bunch of Rules (which I did not count). Also, the fact that they put the diagrams on either the top or the bottom of a page (instead of in the middle of a paragraph where you really need to see it) really seems too "academicy" to me. I guess the style could work for IEEE papers but not so much on a book.&lt;br /&gt;&lt;br /&gt;Otherwise, the patterns shown in the book are really Earth-shattering. It echoes back some of the patterns I've suspected in my earlier post. (Which is nice since it does confirm my observation).&lt;br /&gt;&lt;br /&gt;Some of the similarities between what I have observed and SOM patterns:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What I call User is called Actor in SOM&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;What I call Context is called Role in SOM&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;What I call Event is called Transaction in SOM&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;What I call Item is also called Item in SOM&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;What I call Item can have links to other Item, SOM qualifies this further by stating the realtionship of type 'Container-Content', 'Group-Member', 'Assembly-Part' and 'OuterPlace-Place'&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;One thing I did not capture in my patterns is the Object inheritance part (not to be confused with class inheritance)&lt;/li&gt;&lt;/ul&gt;Both my patterns and SOM agrees that Events should be fired when properties are changed.&lt;br /&gt;&lt;br /&gt;So, why don't I just take the SOM patterns and be done with it?&lt;br /&gt;&lt;br /&gt;Well... (oh here it comes)&lt;br /&gt;One of my objective in identifying patterns is to create, at the very least, a GUI generator that will create interface based on the patterns present(instead of just CRUD). That is not so simple with SOM. For example, a SOM pattern always starts with an Actor having a Role and a bunch of Transactions are associated with the Role. This represents the subject-verb relationship in which Actor-Role represents the Subject and Transaction represents the verb. Of course, you must also have the Object part too. This is represented by Item. So, in a SOM setup, you will usually have :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8JZVzSKQmZc/S01yqb809wI/AAAAAAAAAH4/ayvWEHFz1cg/s1600-h/som.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 154px;" src="http://1.bp.blogspot.com/_8JZVzSKQmZc/S01yqb809wI/AAAAAAAAAH4/ayvWEHFz1cg/s320/som.jpg" alt="" id="BLOGGER_PHOTO_ID_5426119199434274562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now imagine that I create (using your off-the-shelf CRUD generator) an interface for this setup, I will have a Role page, in it I have things that have happened (Transactions) and only when clicking on things that have happened that I will have a bunch of objects that I can browse. Which is a bit counter intuitive)  There is no concept of direct Item ownership by a Role (or an Actor) in SOM.&lt;br /&gt;&lt;br /&gt;Now to mediate this, I can just look at Transaction as a 'wrapper' for Item. From Role I would regard transaction as a see through object and can pierce through it like a glass to see its Items directly. But, would my typical CRUD generator support this piercing? (It does look somewhat like a master-detail setup).&lt;br /&gt;&lt;br /&gt;Another problem with CRUD generators is that CRUD generators typically follow DDD, in which you would have DAO (or Services + Repositories in DDD parlance) and GUI codes are created for you in function of your domain model. In DDD, verbs are represented by Services and they are on a separate layer from the domain model. In SOM on the other hand, verbs are modeled as objects integrated with other objects in the domain model. To use CRUD generators with SOM would require a marriage (as if we don't have enough of that already during the last school holidays :) ) between SOM and DDD. Hmmm... how would you do that? For example, in DDD, to create an Item, you would request the repository (which is totally disassociated from your object model) to create it for you. In SOM, a Role, through a Transaction (both of which are intricately part of the domain model) might create it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hmm... I will investigate and update this blog again. Stay tune&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7916311480734685216?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7916311480734685216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7916311480734685216' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7916311480734685216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7916311480734685216'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2010/01/recurring-patterns-in-application-ii.html' title='Recurring patterns in application II : Streamlined object modeling to the rescue'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8JZVzSKQmZc/S01wTGiXlBI/AAAAAAAAAHw/B-asWFZF93k/s72-c/som_cover.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-3035027441968046345</id><published>2009-12-22T22:21:00.000-08:00</published><updated>2009-12-28T21:00:34.377-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pattern'/><title type='text'>Recurring patterns in applications</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8JZVzSKQmZc/SzG8J4gASVI/AAAAAAAAAHI/LrQGvNAuFOo/s1600-h/6a00d834515c6d69e200e54f9b0c218833-640wi.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 180px; height: 241px;" src="http://3.bp.blogspot.com/_8JZVzSKQmZc/SzG8J4gASVI/AAAAAAAAAHI/LrQGvNAuFOo/s320/6a00d834515c6d69e200e54f9b0c218833-640wi.png" alt="" id="BLOGGER_PHOTO_ID_5418318704674883922" border="0" /&gt;&lt;/a&gt;I was just doodling around the architecture of my latest project when I suddenly realize that I have done the same thing over and over again for every project. I'm sure anyone of you who has successfully delivered more than ,say ,5 projects would realize that there is a pattern  to almost 80-90% of stuff out there.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;I started to scribble some of the recurring patterns I have seen again and again in many projects. I'm putting it here and am very greatful if anyone could add more to this. Now to verify what I'm saying is in fact recurring, I'm going to examine the presense of these patterns in three different context a) A social network ala facebook b) A workflow application c) A content management system (CMS)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) All system must have Users&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a) Social network : Yes&lt;br /&gt;b) Workflow app: Yes&lt;br /&gt;c) CMS: Yes&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Users live in a Context (for example, roles, location etc.)&lt;/span&gt;&lt;br /&gt;a) Social network: Yes. Two very obvious context: logged in logged out.&lt;br /&gt;b) Workflow app: Definately yes. Swimlanes (roles) can be considered context&lt;br /&gt;c) CMS: Yes. There are plain old users, there are admins, there uploaders, there are downloaders etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Given a User and a Context, there are a few Lists of Items. &lt;/span&gt;&lt;br /&gt;a) Social network: YES. When you log in to facebook or twitter there is a list of entries/microblog&lt;br /&gt;b) Workflow app: YES, you would have a list of tasks (either done, pending, kiv, delegated etc.&lt;br /&gt;etc.)&lt;br /&gt;c) CMS: YES. You would have a list of contents&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) An Item can contain either basic data: texts, numbers, links, images, videos, file  attachments or links to other Items&lt;/span&gt;&lt;br /&gt;a) Social network: Yes. You have all the classic types of data but also replies and "retwitts" etc.&lt;br /&gt;b) Workflow app: Yes, you would have tasks descriptions and attachments for example. If the item is delegated, you will also see the delegated items&lt;br /&gt;c) CMS: Yes. You will see the content and if you have "folders", you can have links to other data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) An item is aware of whom (Users) and how (Contexts) it should be accessed&lt;/span&gt;&lt;br /&gt;a) Social network: Yes, only users and probably their friends could access certain photos for example&lt;br /&gt;b) Workflow app: It is obvious with swimlanes, certain users canonly access certain data. What is more interesting is that certain users can access part of an item while others can only access other parts (think of government forms where you have "For Office Use Only" part)&lt;br /&gt;c) CMS: Yes, folders have rights much like a Unix file system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6) A User could be in a Relationship with N other Users. We call this relationship Contact.&lt;/span&gt;&lt;br /&gt;a) Social network: Yes, obviously&lt;br /&gt;b) Workflow app: Yes. In most workflow applications I've seen, Contacts are amed 'Supervisors', 'Subordinate' or 'Team member'.&lt;br /&gt;c) CMS: You can certainly share content with other people. Not formally a Contact but still uses the same principles.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) User should be able to log in to the system and eventually log out&lt;/span&gt;&lt;br /&gt;a,b,c) Yes, obviously&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8) A user can create Item and make it accessible to other Users (either from within his Contact or not)&lt;/span&gt;&lt;br /&gt;a,b,c) Yes, obviously. This puts the responsibility of creating an Item on the User's hand.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9) User who creates an Item is responsible for the lifecycle (CRUD) of that Item&lt;/span&gt;&lt;br /&gt;a,b,c) Yes, obviously&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10) User who has access to an Item should be able to Read and optionally Update an Item&lt;/span&gt;&lt;br /&gt;a,b,c) Yes, obviously&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;11) A system should be able to listen to the lifecycle of Items. User defined filters could be defined at each lifecycle action. &lt;/span&gt;&lt;br /&gt;a) Social network: Yes. This is similar to Facebook email alerts when people reply to your post. The reply can be considered an Item, creating a reply is an event listened to by the system.&lt;br /&gt;b) Workflow app: Yes. At every stage of a workflow, a filter can be triggered (I think Adempiere works this way to update its account database).&lt;br /&gt;c) CMS: Yes. Again, email alerts can be sent when items are uploaded/created/deleted&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;12) There are 2 types of lifecycle action 1) Rules: To validate the lifecycle action&lt;/span&gt;&lt;br /&gt;a) Social network: Yes. An email alert should only be sent if the new item created is a response to an existing item.&lt;br /&gt;b) Workflow app: Yes. A rule is always attached to every "decision path" (&lt;a href="http://www.workflowpatterns.com/patterns/control/basic/wcp4.php"&gt;the exclusive choice pattern&lt;/a&gt;) in a workflow.&lt;br /&gt;c) CMS: Yes. A rule for example that states when a non-empty forlder cannot be deleted. Or a content viewed by another user cannot be deleted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;13) Type 2) Events that could trigger lifecycle actions on other objects.&lt;/span&gt;&lt;br /&gt;a) Social network: Yes, adding a Contact (I.E. adding another person into your Contact) triggers an event that will add you to the contact of that other person. (I add u as friend implies, you will also add me as a friend).&lt;br /&gt;b) Workflow app: Yes, for example in Adempiere, a workflow that creates an Invoice triggers the modification of Account.&lt;br /&gt;c) CMS: Yes. Recursively deleting a non empty forlder might delete all its contents.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;14) Users can do CRUD lifecycle on their Contacts. These actions will also generate Events.&lt;/span&gt;&lt;br /&gt;a,b,c) Yes, obviously. You can always delete and add new people to your contact.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now why are these patterns important? Well imagine now I've created a bare bone application (call it a framework if you will) and imagine that I want to create a Social Network. All I have to do is customised that "framework" and within a short time, tada~ a social network. I have only to define what is Item in my application context (which is social network), what is a User, what Events need to be generated and what Rules need to be triggred and I'm done. Someone else might define Items as Account, Activity, Invoice, Inventory etc. They might define Events as CreditToAccount and DebitFromAccount etc. and define Rules such as "When Inventory is low, start Procument process" and bam!, the framework is now an ERP.&lt;br /&gt;&lt;br /&gt;Now let us take this further, what if this framework define not just bare bone stuff but also things like open persistence policy (which allows you to connect your app to any database), a well thought out GUI, a caching mechanism out of the box, a clustering facility , a reporting and BI facility and some security enhancement here and there. Suddenly, I can focus on creating my latest shiny new social network or create my own ERP focusing mainly on what the application should do rather than all the nitty gritty stuff like scalability.&lt;br /&gt;&lt;br /&gt;Of course, what is defined here is probably incomplete at best and naive at worst. There are overlaps I'm sure (like Rules and Context could be the same thing). If you do have other stuff to add, please do enlighten me. (Or if you think certain things are just superflous). Maybe creating this framework could be my next big FOSS project :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-3035027441968046345?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/3035027441968046345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=3035027441968046345' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3035027441968046345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3035027441968046345'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/12/recurring-patterns-in-applications.html' title='Recurring patterns in applications'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8JZVzSKQmZc/SzG8J4gASVI/AAAAAAAAAHI/LrQGvNAuFOo/s72-c/6a00d834515c6d69e200e54f9b0c218833-640wi.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-2255948464867635984</id><published>2009-12-12T01:21:00.000-08:00</published><updated>2009-12-12T01:28:12.756-08:00</updated><title type='text'>Weld DI and Glassfish Example</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scribd.com/doc/24005727/Look-Ma-No-XML"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 227px;" src="http://1.bp.blogspot.com/_8JZVzSKQmZc/SyNh1sAFfuI/AAAAAAAAAHA/fWj4_4LlFSU/s320/lookma.jpg" alt="" id="BLOGGER_PHOTO_ID_5414278752001949410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Last Thursday I gave a presentation to a few Experian staffs on Weld DI. You can find the presentation here:&lt;br /&gt;&lt;a href="http://www.scribd.com/doc/24005727/Look-Ma-No-XML"&gt;&lt;br /&gt;http://www.scribd.com/doc/24005727/Look-Ma-No-XML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Examples can be found here:&lt;br /&gt;&lt;a href="http://www.freedrive.com/member/viewfolder/250059"&gt;&lt;br /&gt;http://www.freedrive.com/member/viewfolder/250059&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-2255948464867635984?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/2255948464867635984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=2255948464867635984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/2255948464867635984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/2255948464867635984'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/12/weld-di-and-glassfish-example.html' title='Weld DI and Glassfish Example'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8JZVzSKQmZc/SyNh1sAFfuI/AAAAAAAAAHA/fWj4_4LlFSU/s72-c/lookma.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7059452537893797377</id><published>2009-12-08T19:25:00.000-08:00</published><updated>2009-12-09T00:13:40.923-08:00</updated><title type='text'>Message Driven POJO with Java Content and Dependency Injection API (Weld) a.k.a Look ma! No XML!</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8JZVzSKQmZc/Sx8aaA2w49I/AAAAAAAAAG4/zRO3Fr4sAac/s1600-h/250px-SMAW.welding.af.ncs.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 250px; height: 282px;" src="http://2.bp.blogspot.com/_8JZVzSKQmZc/Sx8aaA2w49I/AAAAAAAAAG4/zRO3Fr4sAac/s320/250px-SMAW.welding.af.ncs.jpg" alt="" id="BLOGGER_PHOTO_ID_5413074311331242962" border="0" /&gt;&lt;/a&gt;I am supposed to be presenting 'Something new and exiting in Java' to staff of Experian Malaysia. Looking around, it seems that I am frekin lucky since we have a few new and exciting things in the Java world. Java EE 6 is finally here! (Phew!~), Netbeans 6.8 RC 1 is out! (with support for Java EE 6 - you can create a session bean right in your war file - I kid you not!) and finally Java CDI (I think, JSR-299) is finally here too!.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;I decide to play around with CDI implementation by JBoss (called Weld). There are other implementations out there notably CanDI by Caucho and OpenWebBeans by Apache.&lt;br /&gt;&lt;br /&gt;Anyway, CDI allows you to do strong typing dependency injection without XML (of course, XML is still there just in case you need it). Weld can be downloaded here [&lt;a href="http://seamframework.org/Download"&gt;http://seamframework.org/Download&lt;/a&gt;]. A full tutorial by JBoss teamcan be found here [&lt;a href="http://docs.jboss.org/webbeans/reference/current/en-US/html/index.html"&gt;http://docs.jboss.org/webbeans/reference/current/en-US/html/index.html&lt;/a&gt;]. Note that the tutorial was created about a year ago [on the internet scale, that is the equivalent of the time between the Triasic era and the French Revolution], so some things are not up to date. A better approach is to learn stuff off the examples in weld zip file.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Here's an example of CDI:&lt;br /&gt;&lt;br /&gt;With CDI, we can create Java Beans with a particular scope. In this example we have a Singleton scope. This means that there will be a single instance of SomeService for the whole application.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@Singleton&lt;br /&gt;public class SomeService{&lt;br /&gt;public String doSomething(String parameters){&lt;br /&gt;//do something here&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To access the service, we can just inject it to a class&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Client{&lt;br /&gt;@Inject SomeService someService;&lt;br /&gt;&lt;br /&gt;public void run(){&lt;br /&gt;//use someService&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that we do not need to invoke any constructor or factory of SomeService in Client. The lifeCycle of SomeService is managed directly by Weld.&lt;br /&gt;&lt;br /&gt;Anyone who uses Spring before knows that Spring can also do much of the same thing. Its just that Weld can do all this while being strongly typed and xml-less (Maybe Spring does make XML optional these days, I have not checked)&lt;br /&gt;&lt;br /&gt;Now the big finale, one use case of Spring that I find fascinating is Message Driven POJO (MDP). So, I wanted to create one using Weld.&lt;br /&gt;&lt;br /&gt;OK, since I don't have much time, I 'cheated' a bit by using ActiveMQ libraries and by making my MDP works only with ActiveMQ... but hey, it works &gt;:) [Maybe I should call it Message Driven ActiveMQ Producer/Consumer instead ;) ]&lt;br /&gt;&lt;br /&gt;I based my implemetation on this [&lt;a href="http://developers-blog.org/blog/default/2008/10/28/A-simple-ActiveMQ-example"&gt;http://developers-blog.org/blog/default/2008/10/28/A-simple-ActiveMQ-example&lt;/a&gt;]  (Thanks Gisbert) .&lt;br /&gt;&lt;br /&gt;After much toiling (my first implemetation uses Spring libraries... a pile of fun that turn out to be), I manage to create an MDP using Weld.&lt;br /&gt;&lt;br /&gt;An MDP looks like this:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@Consumer&lt;br /&gt;public class Processor {&lt;br /&gt;&lt;br /&gt;  public void processRequest(RunnableMessage runnable){&lt;br /&gt;      runnable.run();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void doSomething(String string){&lt;br /&gt;      System.out.println("Received string="+string);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Consumer annotation indicates that this object is ready to receive messages. The messages are in fact POJOs themselves, so when a message arrives, depending on the type of the message (or rather the type of the payload of the message), a method within the Processor object is chosen.&lt;br /&gt;&lt;br /&gt;To send a message, I just do this:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;RunnableMessage r = new RunnableMessage(); //r here is just another POJO&lt;br /&gt;activeMQService.sendMessage(r);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And processRequest will be invoked.&lt;br /&gt;If I do:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;activeMQService.sendMessage("If you type google into google, you will break the internet");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then I will invoke the method doSomething instead.&lt;br /&gt;Cool eh :)&lt;br /&gt;&lt;br /&gt;Anyway, the source code with all its dependencies are here [&lt;a href="http://www.freedrive.com/file/1045164,weldmessage.zip"&gt;http://www.freedrive.com/file/1045164,weldmessage.zip&lt;/a&gt;]. To run this, you need to download ActiiveMQ&lt;br /&gt;[&lt;a href="http://activemq.apache.org/download.html"&gt;http://activemq.apache.org/download.html&lt;/a&gt;] and run it. (Unzip the file and run the executable in the bin directory). Next, just run the example.&lt;br /&gt;&lt;br /&gt;Have fun!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7059452537893797377?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7059452537893797377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7059452537893797377' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7059452537893797377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7059452537893797377'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/12/message-driven-pojo-with-java-content.html' title='Message Driven POJO with Java Content and Dependency Injection API (Weld) a.k.a Look ma! No XML!'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8JZVzSKQmZc/Sx8aaA2w49I/AAAAAAAAAG4/zRO3Fr4sAac/s72-c/250px-SMAW.welding.af.ncs.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-1183784346022884106</id><published>2009-11-30T22:45:00.001-08:00</published><updated>2009-11-30T22:45:53.373-08:00</updated><title type='text'>Will JavaFX die?</title><content type='html'>Will JavaFX die? I really hope so because it will teach the next RIA wannabe to not dump another scripting language to the masses and hope, with the sincerest of hope, that GUI designers will become coders over night. How on God blue Earth does an RIA does not have a visual editor? (And BTW, no matter how good you are,... wishing that a text editor somehow, through the magic of Christmas, becomes a "visual editor" will not make it so .. you hear me Exadel!) . JavaFX need 2 concrete things to survive: 1) An Android runtime 2) A visual (you know, like Flex Builder visual, not XEmacs visual) editor&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-1183784346022884106?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/1183784346022884106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=1183784346022884106' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1183784346022884106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1183784346022884106'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/11/will-javafx-die_30.html' title='Will JavaFX die?'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7046276101236882004</id><published>2009-11-22T22:50:00.000-08:00</published><updated>2009-11-22T22:50:51.301-08:00</updated><title type='text'>Upgrading (kids and adults)</title><content type='html'>&lt;div style="TEXT-ALIGN: center; MARGIN: 0px auto 10px"&gt;&lt;a href="http://1.bp.blogspot.com/_8JZVzSKQmZc/SwowyjsGQ5I/AAAAAAAAAGs/fXBLyHDz2W4/s1600/New+Folder.jpg"&gt;&lt;img border="0" alt="" src="http://1.bp.blogspot.com/_8JZVzSKQmZc/SwowyjsGQ5I/AAAAAAAAAGs/fXBLyHDz2W4/s320/New+Folder.jpg" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;It was a fine weekend to do a seminar + upgrading.  Kids upgrading was load of fun. Most of them work hard for the upgrading and it shows. It's quite a revelation to see how much these kids grow over the years.&lt;br /&gt;&lt;br /&gt;The seminar was a success. So many people attend that we had to work with limited space but it was worth it.&lt;br /&gt;&lt;br /&gt;Congratulations to all!&lt;div style='clear:both; text-align:CENTER'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7046276101236882004?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7046276101236882004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7046276101236882004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7046276101236882004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7046276101236882004'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/11/upgrading-kids-and-adults.html' title='Upgrading (kids and adults)'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8JZVzSKQmZc/SwowyjsGQ5I/AAAAAAAAAGs/fXBLyHDz2W4/s72-c/New+Folder.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7473107723064665257</id><published>2009-11-17T21:05:00.000-08:00</published><updated>2009-11-17T21:22:19.684-08:00</updated><title type='text'>Adempiere references in Plain Old Java</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.adempiere.com/index.php/ADempiere"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 150px; height: 155px;" src="http://1.bp.blogspot.com/_8JZVzSKQmZc/SwOEXhZ9NGI/AAAAAAAAAGk/zGCGh9jQq2o/s320/Untitled.jpg" alt="" id="BLOGGER_PHOTO_ID_5405309517413823586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Right now, I'm learning Adempiere and finding ways on how to hack it apart (and put it together again). I'll be "reporting" my findings on this blog on how things are done and how some of these concepts can actually be used in Java in general.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;One thing that interests me in Adempiere is the Rapid Application Development feature, especially when building rich CRUD based stuff. Adempiere has this concept of "everything must have metadata". By manipulating this metadata, CRUD based application can easily be done.&lt;br /&gt;&lt;br /&gt;In the general Java world, metadata manipulation used to create CRUD based apps is not new. Frameworks such as OpenXava (who claim to have beaten RoR development record time - apparently that article is not accessible anymore) is attracting much attention. One thing Adempiere does differently is by qualifiying relationships between Domain Objects (of course in Adempiere, the Domain Objects are Relational Database Tables since Adempiere uses direct / semi-direct SQL access). Disclaimer - I'm not an OpenXava expert, so if OpenXava does these stuff too, please do tell.&lt;br /&gt;&lt;br /&gt;Imagine if we can port this to the Java world in general&lt;br /&gt;&lt;br /&gt;[If you are not familiar with the concept of Reference in Adempiere, I would like to redirect you to my good friend, Red1's, &lt;a href="http://www.adempiere.com/index.php/Reference_Table_with_Dynamic_Validation"&gt;tutorial&lt;/a&gt; ]&lt;br /&gt;&lt;br /&gt;In Adempiere you can qualify a reference (a link from one table to another table). For example you can say that a reference is "Searchable". When the reference is rendered, you would see a "search box" that is linked to data from the reference table. You can type away a search term and the reference table will be searched.&lt;br /&gt;&lt;br /&gt;How can we do this in Java in general?&lt;br /&gt;&lt;br /&gt;To demonstrate this, we'll look at an example: Imagine that I have 3 entities, User (plain old User - ok, maybe not so old :) ) , PurchaseRecord (a record of a purchase made by the user) and Product (the actual product the user purchase)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Using JPA or Hibernate I could have codes representing the entities as:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class User{&lt;br /&gt;  @OneToMany&lt;br /&gt;  private Set&lt;purchaserecord&gt; purchaseRecords;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class PurchaseRecord{&lt;br /&gt;  private Product product;&lt;br /&gt;  private int number;&lt;br /&gt;  private Date purchaseDate;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Product{&lt;br /&gt;  private String name;&lt;br /&gt;  private String unitPrice;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/purchaserecord&gt;&lt;div style="text-align: justify;"&gt;&lt;purchaserecord&gt;If I'm using plain old CRUD generator , I would create a User list. Clicking on a User from the list would give me the details of that particular user and a list of PurchaseRecords. That list is presented as is. If I'm lucky, the CRUD generator will allow me to page or sort the data. One thing I do not have is a quick access to a particular record and the subsequent Product attached to that Record. But, imagine if I can do this:&lt;/purchaserecord&gt;&lt;br /&gt;&lt;purchaserecord&gt;&lt;/purchaserecord&gt;&lt;/div&gt;&lt;purchaserecord&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class User{&lt;br /&gt;  @OneToMany&lt;br /&gt;  @Display(qualifier="PurchaseRecord.product.name")&lt;br /&gt;  @Searchable(by="PurchaseRecord.product.name")&lt;br /&gt;  @DefaultFilter(qualifier="PurchaseRecord.purchaseDate=DateQualifier.TODAY")&lt;br /&gt;  private Set&lt;purchaserecord&gt; purchaseRecords;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;div style="text-align: justify;"&gt;&lt;purchaserecord&gt;&lt;purchaserecord&gt;Automatically, when I click on a user, I would still see a list (but this time a list of names of products, which is more palatable) and also a text box, a dropdown list and a button.&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;br /&gt;&lt;purchaserecord&gt;&lt;purchaserecord&gt;&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;br /&gt;&lt;purchaserecord&gt;&lt;purchaserecord&gt;The textbox represents a search term box. You can search your PurchaseRecord by its name. Enter your search term and click on the button. The dropdown list represents filters. By default, PurchaseRecord will be filtered by date=TODAY (only today's entry is displayed). The user can always choose any other available filters.&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;br /&gt;&lt;purchaserecord&gt;&lt;purchaserecord&gt;&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;br /&gt;&lt;purchaserecord&gt;&lt;purchaserecord&gt;Of course I'm just imagining stuff here and I'm sure there are some gaps that need to be filled in (for example, does having a @Display tag violates MVC)  but the concept of Reference in Adempiere is really powerful. Hopefully someone could bring this concept to the JPA/Hibernate world.&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;br /&gt;&lt;purchaserecord&gt;&lt;purchaserecord&gt;&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;/div&gt;&lt;purchaserecord&gt;&lt;purchaserecord&gt;&lt;br /&gt;&lt;/purchaserecord&gt;&lt;/purchaserecord&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7473107723064665257?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7473107723064665257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7473107723064665257' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7473107723064665257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7473107723064665257'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/11/adempiere-references-in-plain-old-java.html' title='Adempiere references in Plain Old Java'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8JZVzSKQmZc/SwOEXhZ9NGI/AAAAAAAAAGk/zGCGh9jQq2o/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-4427281872525466343</id><published>2009-11-08T22:15:00.000-08:00</published><updated>2009-11-08T22:53:38.707-08:00</updated><title type='text'>What is wrong with Malaysian IT scene</title><content type='html'>&lt;div style="text-align: justify;"&gt;Before reading this, please see the disclaimers at the bottom.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What is wrong wth the Malaysian IT scene can be dully observed from one of the most significant ICT event here in this country called the MSC Malaysia International Advisory Panel (or IAP) meeting.  Here's the website of said event: http://iap-portal.msc.com.my/ .Surf the website and you'll see what I mean.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1)It's the the people, stupid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Browsing through the IAP website, we have the impression that it is just a &lt;span style="font-weight: bold;"&gt;business event&lt;/span&gt;. Nothing "techie" about it. In fact, asking around, it seems that the Malaysian tech communities are blissfully unaware of such event is going on right now under our collective hairy noses in PICC this week.&lt;br /&gt;&lt;br /&gt;How on earth can the most important part of the tech. industry (i.e. the tech. people) are not even informed, heck, are not even welcomed to the biggest MSC event this year?!&lt;br /&gt;&lt;br /&gt;Is it just me or is MSC a place where techies are regarded as second class citizens compared to quote unquote businessmen? How on earth can MDeC justify limiting their allocation for tech. employees under their pre-seed and iconity grant to only RM 1500 per month (irregardless of qualifications or experiences)? BTW, just to put things in perspective, the government of Malaysia recently declared that families earning RM 3000 or less per month and are living in cities are called the &lt;span style="font-weight: bold;"&gt;urban poor&lt;/span&gt;. If two techies, a boy and a gal, working for a preseed or iconity recipient companies decide get married, they superchalafragilisticexpiallodociously become&lt;em&gt; &lt;/em&gt;the urban poor. And MDeC lament about the lack of talents in ICT, who wants to work hard during their University days and end up being declared poor!&lt;br /&gt;&lt;br /&gt;Have these guys never learn?!&lt;br /&gt;&lt;br /&gt;Build a strong community and business will come. That's the lesson of Silicon Valley that has somehow escape the collective brains of our policy makers. Silicon Valley started with the universities in the area. These universities have been building tech communities and when the electronic/transistor revolution came into the picture BAMM!!, the magic happens. But it started with communities. Not businesses.&lt;br /&gt;&lt;br /&gt;The MSC brand has been a failure because it was attached to companies.   MSC companies are known today as companies that do not pay EPF, do not give salary on time, try to treat their employees as slaves (gee, I wonder where they learn &lt;span style="font-weight: bold;"&gt;that&lt;/span&gt; from) by asking them to do extra hours and not getting paid for it. Companies are soulless money making machines. They would cut corners and take advantage of any loophole just to get another dime on their balance sheet. This can be seen by companies opening up "ghost branches" in MSC status area (such as Cyberjaya) just to escape paying taxes.&lt;br /&gt;&lt;br /&gt;Communities on the other hand live and die by the spirit of its people. They rely on people being truthful, honest and willing to sacrifice. And yet, MDeC is blind to these sacrifices. In fact, some of our community leaders are so pissed poor, they can't even afford to buy LRT tickets. Some have to beg for jobs and some got so upset they left the country for good (good for them, bad for Malaysia). Those who bite their lips and  stay are riddled with redtapes and unfulfilled promises that its not even funny anymore.&lt;br /&gt;&lt;br /&gt;If MDeC would have spent as much on building the soulless MSC companies as they would on building communities, we would have gone further by now!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) The locals are just as good&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Looking at the talks and the programs listed on the website, I was really wondering "Gee, I can do that talk too. Heck, I can even do it better since I know the local context".&lt;br /&gt;&lt;br /&gt;I mean gosh!, it says "international" but are the  locals too stoopeed to advise MSC and how to go about doing things? Isn't Dr. Mahathir's main message to the world is that &lt;span style="font-weight: bold;"&gt;we want to be strong, but we will do it OUR WAY! &lt;/span&gt;Somehow that message, that twitt, does not reach MDeC.&lt;br /&gt;&lt;br /&gt;Are our collective brains still clogged with the imperialist white-men fetish that we can't even see how much our own people have grown over the years?. Somehow, just because you're white, no matter how stupid , incompetent or evil minded you are, you are always correct. "Yes sir Mr. Balmer sir, you can rob my country and kick my butt to boot. It's ok because you're an American and you're the CEO of Microsoft"&lt;br /&gt;&lt;br /&gt;Stop this stupid nonsense! I can give more relevant advices to MSC and I'll do it for free (heck, I even said it outloud &lt;a href="http://ejn3.blogspot.com/2009/09/cybermerdeka-in-finally-crazy.html"&gt;here&lt;/a&gt; and &lt;a href="http://ejn3.blogspot.com/2009/06/to-mdec-java-should-be-national-agenda.html"&gt;here&lt;/a&gt;) and yet, just because my butt is the wrong color, no one gives a crap!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) So much more&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have so much more to rant but tears are running through my eyes watching how much my beloved country is wasting yet again an oppurtunity to turn things around. I really hope our future leaders would have enough insight to consider my rant. Hopefully, things will get better. We have no other choice, we either get better... or die ...&lt;br /&gt;&lt;br /&gt;DISCLAIMERS&lt;br /&gt;&lt;br /&gt;If you are an MDeC employee, please do not think of my rant as an attack on you personally. I do think that people in MDeC are also individuals (and thus part of the community) who choose to work with MDeC when they can pour their talent somewhere else (and probably get better pay). Heck, I know a few good people in MDeC who were courted by oversea companies and yet they decline the offer for the love of the country. If anything, they are more into it then us developers. I believe that people in MDeC are heroes but some of the policies are real time-wasters.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-4427281872525466343?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/4427281872525466343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=4427281872525466343' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/4427281872525466343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/4427281872525466343'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/11/what-is-wrong-with-malaysian-it-scene.html' title='What is wrong with Malaysian IT scene'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-8349998541172882205</id><published>2009-09-27T19:25:00.000-07:00</published><updated>2009-09-27T19:53:18.404-07:00</updated><title type='text'>Why hate design patterns?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8JZVzSKQmZc/SsAk66K6swI/AAAAAAAAADs/qa412N1-Uzk/s1600-h/19032008028_1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_8JZVzSKQmZc/SsAk66K6swI/AAAAAAAAADs/qa412N1-Uzk/s320/19032008028_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5386345748801172226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here we go again. First and foremost, I know that every one and their &lt;a href="http://blog.objectmentor.com/articles/2009/09/24/the-duct-tape-programmer"&gt;uncle&lt;/a&gt; :) is writig a response to Joel's "&lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;Duct tape programmer&lt;/a&gt;" post. Is it just me or from time to time Joel just spew some controversial stuff just to measure his influence on the world. Anyway I'll bite...&lt;br /&gt;&lt;br /&gt;Now I'm not going to bite the whole thing (obviously, some people who are more capable than I am are already replying), I just want to say this: what's up with all these "design pattern haters" out there?! Joel associate design patterns with astronout architect... really now? (or maybe he's just associating design patterns meetups with astronout architect ... I can't really tell).&lt;br /&gt;&lt;br /&gt;Here's a quote from the GOF book:&lt;br /&gt;&lt;br /&gt;"A design pattern systematically &lt;span style="font-weight: bold;"&gt;names&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;motivates&lt;/span&gt;, and&lt;span style="font-weight: bold;"&gt; explains&lt;/span&gt; a general design that addresses a recurring design problem in object-oriented systems. It &lt;span style="font-weight: bold;"&gt;describes&lt;/span&gt; the problem, the solution, when to apply the solution, and its consequences. It also gives implementation hints and examples. The solution is a general arrangement of objects and classes that solve the problem. The solution is customized and implemented to solve the problem in a particular context"&lt;br /&gt;&lt;br /&gt;Notice the words names, motivates, explains and describes in the book. These words refer to the action of communication. And frankly, at least for me, design patterns are first and foremost a tool for communication. Sure just like everything else in this frekin' world, design patterns can and have been abused... but do you tell your junior programmer who tests every setters and getters that he should never ever write unit tests anymore while he shall live so help him God? No, you teach and coach. The same goes with design patterns, you have to (suprise suprise) teach people to use them properly.&lt;br /&gt;&lt;br /&gt;Of course there is also the " lets us just cobbled some code together and if we see a design pattern fits somewhere, we just intergrate one in the next refactoring exercise" camp. My question is... why?&lt;br /&gt;&lt;br /&gt;If you know that you need to traverse a collection of stuff in Java and do different things to different objects depending on its type...  why not just use the visitor pattern straight away? Sure, you can kick off some cobbled together something and then decide to refactor to the visitor pattern later, but what if the programmer that did the first solution left the company and a new programmer is hired and you are stuck having to explain what has been done. SUre, that's a boatload of fun... or rather, you can just say that you use the visitor pattern... which you, the last programmer and the current programmer already understand. Now that facilitates communication and saves a whole lot of time.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the end it is neither technology (COM, or CORBA) nor methodology (agile or design pattern or "duct taping") that is going to win the battle, but rather, its people. The more good people you have, either they are duct tape programmers or not, you will win. I think Joel knows this already. He talked about this in one of his &lt;a href="http://www.joelonsoftware.com/articles/fog0000000024.html"&gt;old article&lt;/a&gt;. To get enough good people, you need good teachers. Now, duct tape programmer or not, if you cannot pass down your art, then you are just as useless as a used duct tape.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-8349998541172882205?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/8349998541172882205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=8349998541172882205' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/8349998541172882205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/8349998541172882205'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/09/why-hate-design-patterns.html' title='Why hate design patterns?'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8JZVzSKQmZc/SsAk66K6swI/AAAAAAAAADs/qa412N1-Uzk/s72-c/19032008028_1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-6465447760997061832</id><published>2009-09-27T06:31:00.000-07:00</published><updated>2009-09-27T06:45:31.625-07:00</updated><title type='text'>Cybermerdeka in finally online!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=4MrUtR-Unz8"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 218px;" src="http://4.bp.blogspot.com/_8JZVzSKQmZc/Sr9q2_lvLPI/AAAAAAAAADk/zdFjyuoZHuY/s320/cybermerdeka.jpg" alt="" id="BLOGGER_PHOTO_ID_5386141172373597426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Finally, my Cybermerdeka talk is &lt;a href="http://www.youtube.com/watch?v=4MrUtR-Unz8"&gt;online&lt;/a&gt;. The slides are available &lt;a href="http://www.scribd.com/doc/16094325/Cyber-Merdeka-Cyber-Sovereignity"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-6465447760997061832?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/6465447760997061832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=6465447760997061832' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/6465447760997061832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/6465447760997061832'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/09/cybermerdeka-in-finally-crazy.html' title='Cybermerdeka in finally online!'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8JZVzSKQmZc/Sr9q2_lvLPI/AAAAAAAAADk/zdFjyuoZHuY/s72-c/cybermerdeka.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-3177439147886521416</id><published>2009-08-23T19:09:00.000-07:00</published><updated>2009-08-23T19:22:28.393-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crud'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='hateos'/><category scheme='http://www.blogger.com/atom/ns#' term='business process'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>CRUD vs. HATEOS</title><content type='html'>Of late there has been a few blog post on HATEOS vs. CRUD as the underlying architecture (if I can say that) for RESTful services. I think it was started by Arnon's post [http://www.rgoarchitects.com/nblog/2009/06/23/CRUDIsBadForREST.aspx]. I know infoq has a summary somewhere but I couldn't find it right now. [Please read Arnon's post for background on HATEOS vs. CRUD]&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Here's my contribution on the whole thing.&lt;br /&gt;&lt;br /&gt;First of all, we should know that what Arnon suggested was not "CRUD is evil and should rot in garbage landfil somewhere ... " or anything near that. [So the CRUD proponents should not get so worked up about it]. He is suggesting that CRUD is OK but you can do better. Especially if you need control - I.E. if the business process that you run is super critical, like some baby seal is going to be devoured by Bernie Maddox if you don't execute things in order, than HATEOS is the way to go.&lt;br /&gt;&lt;br /&gt;In fact, HATEOS is just that :  RESTful workflow&lt;br /&gt;&lt;br /&gt;Note to self: investigate if HATEOS can replace BPEL just like REST replaces SOAP&lt;br /&gt;&lt;br /&gt;Now, I believe that HATEOS is superior to plain old CRUD because of one thing:&lt;br /&gt;&lt;br /&gt;Long Running Transaction (LRT)&lt;br /&gt;&lt;br /&gt;LRT is a way to do transaction in a long running processes (typically, a transaction that involves people somewhere should be considered long running). In LRT, due to time constraint, it is impossible to lock an object (a database row, a resource, etc.) for the whole transaction. ACIDity is assured only on single operations but not the whole transaction. What happen when failure occurs? Well, you run another ACID operation to undo transaction.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Quoting wikipedia : "Long-running transactions are computer database transactions that avoid locks on non-local resources, use compensation to handle failures, potentially aggregate smaller ACID transactions (also referred to as atomic transactions), and typically use a coordinator to complete or abort the transaction. In contrast to rollback in ACID transactions, compensation restores the original state, or an equivalent, and is business-specific. The compensating action for making a hotel reservation is canceling that reservation, possibly with a penalty."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;Given an e-commerce business process:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8JZVzSKQmZc/SpH23n2CuYI/AAAAAAAAACM/v0-8b74vkVE/s1600-h/ecommerce.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 311px;" src="http://4.bp.blogspot.com/_8JZVzSKQmZc/SpH23n2CuYI/AAAAAAAAACM/v0-8b74vkVE/s320/ecommerce.jpg" alt="" id="BLOGGER_PHOTO_ID_5373347265878604162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If the user cancel the order mid-way:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8JZVzSKQmZc/SpH43ApI9TI/AAAAAAAAADU/0moRB8v2Wog/s1600-h/ecommerce2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 284px;" src="http://4.bp.blogspot.com/_8JZVzSKQmZc/SpH43ApI9TI/AAAAAAAAADU/0moRB8v2Wog/s320/ecommerce2.jpg" alt="" id="BLOGGER_PHOTO_ID_5373349454378759474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;... We might need to fire another business process to compensate the original business process.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8JZVzSKQmZc/SpH5NNtkiEI/AAAAAAAAADc/9ItLPLeIr6w/s1600-h/ecommerce3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 276px;" src="http://4.bp.blogspot.com/_8JZVzSKQmZc/SpH5NNtkiEI/AAAAAAAAADc/9ItLPLeIr6w/s320/ecommerce3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373349835844126786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now, here is where HATEOS really shines: Note that the compensation business process in this example is going to be fired by  say, a call center receiving the user's cancellation request whereas the "Item has arrive" activity is probably going to be fired by some delivery service.&lt;br /&gt;&lt;br /&gt;When the call center request the state of the business process, we will send an xml object and also includes a link to cancel the order.&lt;br /&gt;&lt;br /&gt;When the delivery service request the state of business process, we will send an xml object and also includes a link to indicate that delivery is completed.&lt;br /&gt;&lt;br /&gt;With plain old CRUD on the other hand, well, you will not know what API to invoke and what are our options. Heck, user might even invoke things that they should not.&lt;br /&gt;&lt;br /&gt;Also note that, each activity within the business process actually has a corresponding "compensation" activity. This compensation activity will certainly undo the real business process activity. A link to the compensation activity is always available at each business process activity and can be invoked if needed. Unlike plain old CRUD where the user has to figure out at each stage of the business process what to do in case things go wrong, in HATEOS the user do not have to figure out what to do in case of exception: just invoke the compensation URL and all should go well.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-3177439147886521416?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/3177439147886521416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=3177439147886521416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3177439147886521416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3177439147886521416'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/08/of-late-there-has-been-few-blog-post-on.html' title='CRUD vs. HATEOS'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8JZVzSKQmZc/SpH23n2CuYI/AAAAAAAAACM/v0-8b74vkVE/s72-c/ecommerce.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-2695690298514053198</id><published>2009-06-22T21:36:00.000-07:00</published><updated>2009-06-23T20:04:20.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaME'/><title type='text'>To MDEC: Java should be a national agenda</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8JZVzSKQmZc/SkBfTic-ItI/AAAAAAAAAB0/JLiio_QR7_Y/s1600-h/DukeWithHelmet.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 269px; height: 269px;" src="http://3.bp.blogspot.com/_8JZVzSKQmZc/SkBfTic-ItI/AAAAAAAAAB0/JLiio_QR7_Y/s320/DukeWithHelmet.png" alt="" id="BLOGGER_PHOTO_ID_5350381146586620626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I had a meeting with MDEC a few weeks before OSCONF and they reveal some startling statistics: Apparently 50.6 % of MSC companies are in need... no... are dying to find good Java programmers. So much so, they don't mind going to Indonesia, the Philippines and many other places, to recruit programmers there (offshore). These companies are willing to train them and&lt;br /&gt;pay them a handsome fee just so that they can have decent Java programmers.&lt;br /&gt;&lt;br /&gt;Now, 50.6 % is a big number. It's bigger than the need for .Net, for Ruby, for Phyton,, for PHP, for SAP.&lt;br /&gt;&lt;br /&gt;Heck, it's bigger than .Net, Ruby, Phyton, PHP and SAP  &lt;span style="font-weight: bold;"&gt;COMBINED!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In other words, most (and that's a big "most") of the projects within MSC now are Java based.&lt;br /&gt;&lt;br /&gt;Now here's a short reality check, what if we (as a nation) do not provide our MSC companies with these much needed Java programmers? Do you think the jobs will switch to PHP? No way&lt;br /&gt;Jose. What will happen is that jobs are going to go away. In this case, it'll be roughly 50% of the jobs. I've read somewhere that we want to outdo China as the second largest outsourcing destination... well, if 50% of the jobs here are going to Indonesia... good luck with that.&lt;br /&gt;&lt;br /&gt;So what should we do. Here's a few sugestion to MDEC:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Take over Java education in Malaysia and don't leave it to &lt;/span&gt;  &lt;span style="font-weight: bold;"&gt;Sun&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... Heck, don't even leave it to Oracle. In my experience, Oracle is sooo not interested in small markets (where most of the jobs dwindle) They care for big multi-million dollar accounts but Oracle is almost invisible in smaller arenas. The fact that Oracle is going to buy over Sun (and thus become the steward of Java) will mean less resources will be dedicated towards Java education (and it was already bad under Sun).&lt;br /&gt;&lt;br /&gt;OK, I know a few people in Microsoft and the Ruby/Phyton/PHP group are so going to whack me on this but listen up: MDEC has to take over Java education, not because MDEC is favouring Java over other platforms or languages, not because MDEC is some Sun/Oracle/Java/Obama hugger. No!  but because &lt;span style="font-weight: bold;"&gt;it makes business sense to do so&lt;/span&gt;. If MDEC is not doing this, good bye 50 or so % of MSC jobs. Besides, if you are a Ruby/Phyton/PHP developer, these language s run well on the JVM too so this call make sense to all (well, almost all :P )&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Revamp the Java sylabus&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8JZVzSKQmZc/SkBgG8fd4yI/AAAAAAAAAB8/FSONBGo2S0M/s1600-h/1245732871_mobile_phone.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 128px; height: 128px;" src="http://3.bp.blogspot.com/_8JZVzSKQmZc/SkBgG8fd4yI/AAAAAAAAAB8/FSONBGo2S0M/s320/1245732871_mobile_phone.png" alt="" id="BLOGGER_PHOTO_ID_5350382029749740322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Sun's objective in Java education is to ram a dead horse down the programmers throat... and that dead horse is called "applet programming". Ask any university student who has studied Java and they will equate Java to ugly applets.&lt;br /&gt;&lt;br /&gt;Gosh! stop it already!. Applet is dead, get over it Sun... wait a minute, they did. That is why they introduce JavaFX. So, what is with this rubbing of people's face with applet anyway? because&lt;br /&gt;people are lazy ... especially to update sylabus.&lt;br /&gt;&lt;br /&gt;We need to revamp the sylabus. Sun will not do it for us. MDeC has to do it (On a side note, I'm more than willing to volunteer my time to revamp the Java sylabus).&lt;br /&gt;&lt;br /&gt;In my opinion, to teach basic Java and OOP, Java ME should be a better platform. First off, I can just imagine how students feel if the "Pong" game they created can run on their own phones. It's&lt;br /&gt;something to show off about, it's cool, it's something to twitt about...&lt;br /&gt;&lt;br /&gt;Game is a perfect environment to teach OOP. Objects become natural (in form of sprite and what not).&lt;br /&gt;&lt;br /&gt;Next, come basic networking. Heck, ask them to create a twitter client. That'll be cool too eh?. Next come bluetooth, GPS and what not. Mesh that up with Google Map and voila, Java becomes cool again!&lt;br /&gt;&lt;br /&gt;Another point about revamping the sylabus is this: stop "protecting" the students. I know lecturers who say "We can't teach them JavaEE. It's just too complex, the students will become demotivated"... puhleeezzz.&lt;br /&gt;&lt;br /&gt;The truth is, JavaEE is intimidating to the lecturers, not the students. JavaEE (Servlet 3, JSF 2, EJB 3.1, basic security, messaging... heck, even SOA) should be taught to final year students because if you do not know basic ORM you're practically useless as a Java programmer.&lt;br /&gt;&lt;br /&gt;If the lecturers are inadequate in terms of experience and knowledge, we need to bring in the professionals into the universities. And thus my third point....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Bring in Java pros into the universities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;During that meeting with MDEC, I can really feel the dire need by the companies to get good Java programmers. Now, if these companies are willing to travel in Indonesia to train people there, I'm sure they are more than willing to contribute to our local universities.&lt;br /&gt;&lt;br /&gt;Sure, these Java pros might not have a PhD and, I guess, according to univerisities, they are somehow "muggles" and "has no right to take a podium at our distinguished ivory towers".&lt;br /&gt;&lt;br /&gt;Here's what I have to say to that: Bulls**t!&lt;br /&gt;&lt;br /&gt;Knowledge is knowledge. If it comes not from a research work but rather from the grudge of waking up at 3 in the morning debugging a JBOSS classloader, it is still knowledge worth propagating, worth teaching. And thus these Java pros need to be integrated into universities despite their lack of a PhDs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) MDeC needs to work closely with the universities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... on how to teach Java. Work closely with the council of Dean of IT faculties. Get them to commit on Java BIG TIME!. Bring Neal Gafter and Josh Bloch here to teach our lecturers on the intricacies of Java. Have an unconference where any lecturer can propose his approach to teach Java. (Heck, Microsoft did it for Windows, now MDeC has to do it for Java... remember the 50.6% )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is not too late to act if we act now... I mean like now, this very second. To my friends in MDeC, please push for this. Not for Sun, IBM or Oracle but the sake of the nation.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-2695690298514053198?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/2695690298514053198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=2695690298514053198' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/2695690298514053198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/2695690298514053198'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/06/to-mdec-java-should-be-national-agenda.html' title='To MDEC: Java should be a national agenda'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8JZVzSKQmZc/SkBfTic-ItI/AAAAAAAAAB0/JLiio_QR7_Y/s72-c/DukeWithHelmet.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-8260667130161174953</id><published>2009-06-09T10:26:00.001-07:00</published><updated>2009-06-09T19:53:19.659-07:00</updated><title type='text'>Did we get MVC wrong?</title><content type='html'>&lt;div style="text-align: justify;"&gt;Every computer science major and their iguanas have heard of the MVC pattern. It's being used by everyone from Sun to Microsoft.&lt;br /&gt;&lt;br /&gt;Here's a diagram showing how MVC is suppose to work (shamelessly copied from wikipedia)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/ModelViewControllerDiagram.svg/321px-ModelViewControllerDiagram.svg.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 321px; height: 151px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/ModelViewControllerDiagram.svg/321px-ModelViewControllerDiagram.svg.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now quoting from Wikipedia's entry on MVC [http://en.wikipedia.org/wiki/Model-view-controller] "Successful use of the pattern (i.e. MVC)&lt;span style="font-weight: bold;"&gt; isolates&lt;/span&gt; &lt;a href="http://en.wikipedia.org/wiki/Business_logic" title="Business logic"&gt;business logic&lt;/a&gt; from &lt;a href="http://en.wikipedia.org/wiki/User_interface" title="User interface"&gt;user interface&lt;/a&gt; considerations, resulting in an application where it is easier to modify either the visual appearance of the application or the underlying business rules without affecting the other."&lt;br /&gt;&lt;br /&gt;Now here's what Reenskaug has to say about MVC (BTW,  &lt;a href="http://heim.ifi.uio.no/%7Etrygver/themes/mvc/mvc-index.html" class="external text" title="http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html" rel="nofollow"&gt;Trygve M. H. Reenskaug&lt;/a&gt; is the inventor of MVC) [http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html] and I quote "The essential purpose of MVC is to bridge the gap between the human   user's mental model and the digital model that exists in the computer. The   ideal MVC solution supports the user illusion of seeing and manipulating the   domain information directly. The structure is useful if the user needs to see   the &lt;span style="font-weight: bold;"&gt;same model element simultaneously in different contexts&lt;/span&gt; and/or from   different viewpoints."&lt;br /&gt;&lt;br /&gt;Wait a minute, that's different: The inventor of MVC emphasises the ability of MVC to give different views of the same data, while the wikipedia entry somehow talks about isolating (i.e. modularising - is there such a word?) application. Those two things are not the same!&lt;br /&gt;&lt;br /&gt;The rub is, if you allow me to repeate: MVC was not created to modularise application,   repeate after me. It was not for isolation people! It was created to give different views of the same big gianourmous data (c.f. Reenskaug's definition).&lt;br /&gt;&lt;br /&gt;Sure, things are seperated into model, view and controller but that is just a consequences and not the main goal of MVC.&lt;br /&gt;&lt;br /&gt;Confusing the goal of MVC with some other goals is actually detrimental to software development. Let us see how.&lt;br /&gt;&lt;br /&gt;A typical MVC flow is like this:&lt;br /&gt;&lt;br /&gt;User input --&gt; Controller --&gt; Update model--&gt; View, observing the model has changed, updates itself&lt;br /&gt;&lt;br /&gt;A typical non-MVC flow would be like this:&lt;br /&gt;&lt;br /&gt;User input --&gt; Controller --&gt; (Update model and Update view)&lt;br /&gt;&lt;br /&gt;The non-MVC is the model followed by say a typical Java Swing application, JSF and Struts. The problem is that the view is really inactive. The vision of multiple views being in sync with the huge data in the back-end becomes more difficult. Say, for example I want to add a new field in the view. The field already exist in the database, just a matter of displaying it. With MVC, I just query the model (from the view) when the view is "waken up" by the observation event. I need to change the view and that's that. With non-MVC approach, I have to update both the &lt;span style="font-weight: bold;"&gt;view and the controller&lt;/span&gt; to get the same effect.&lt;br /&gt;&lt;br /&gt;The problem lies in the fact that, even in the non-MVC approach, my code is isolated and compartmentalised, if I stick with the definition given by wikipedia, I would therefore&lt;span style="font-weight: bold;"&gt; have the impression of doing MVC without actually doing it. &lt;/span&gt;Whereas with MVC, I'm reaping the benefit of MVC and at the same time getting my modularity, its like having my cake and eat it too.&lt;br /&gt;&lt;br /&gt;Given how fast interface technology (RIA, Flex, JavaFX, Silverlight, your-hoot-n-nanny-of-the-day) is evolving, having multiple, insync views of a large data is inevitable. You would probably need to cater for, at least, the web and the mobile audience. Having a real MVC framework would help enormously... if and only if MVC is done correctly.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-8260667130161174953?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/8260667130161174953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=8260667130161174953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/8260667130161174953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/8260667130161174953'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/06/did-we-get-mvc-wrong.html' title='Did we get MVC wrong?'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7700747119191733785</id><published>2009-06-05T00:40:00.000-07:00</published><updated>2009-06-05T02:11:15.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Message Driven Bean (MDB)'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala Actor + Message Driven Bean (MDB) using JMS</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What I wanted to do is to integrate Scala Actor and MDBs. The reason to do so is because Scala actors, as good as they are, are :&lt;/p&gt;  &lt;p&gt;1) Not transactional &lt;/p&gt;  &lt;p&gt;2) Cannot send message through&amp;#160; a network&lt;/p&gt;  &lt;p&gt;This leads me to investigate what Java EE has to offer: Java Messaging Service. &lt;/p&gt;  &lt;p&gt;Now in many implementation of JMS that I see, it will always end up in some Message Driven Bean (an EJB). So that is what I’m going to do. An actor will send a message in an MDB and the MDB replies back.&lt;/p&gt;  &lt;p&gt;&lt;img height="274" src="http://img231.imageshack.us/img231/4139/jmsactor.png" width="396" /&gt; &lt;/p&gt;  &lt;p&gt;To use JMS with Scala actors, we need to use Spring. Spring offers a utility to create Message Driven Pojos (meaning, any Java object can be transformed into a message receiving object) Since Scala actors are actually Java objects on steroid, I figure that we can use Spring to equip plain old Scala actors with message (as in JMS message) receiving capability. This receiving actor will be called a “wormhole actor” as it bridge the JMS world and the Scala world.&lt;/p&gt;  &lt;p&gt;OK, let us start: First we need to create a Spring xml file. This file contains several beans:&lt;/p&gt;  &lt;p&gt;This bean helps us to find the JNDI engine of our Java EE server where the MDB resides.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font face="Arial" color="#000080"&gt;&amp;lt;bean id=&amp;quot;myJndiTemplate&amp;quot; class=&amp;quot;org.springframework.jndi.JndiTemplate&amp;quot; scope=&amp;quot;singleton&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;environment&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;map&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;entry key=&amp;quot;java.naming.factory.initial&amp;quot; value=&amp;quot;com.sun.appserv.naming.S1ASCtxFactory&amp;quot;/&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;entry key=&amp;quot;java.naming.provider.url&amp;quot; value=&amp;quot;iiop://127.0.0.1:3700&amp;quot;/&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/map&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;This bean defines the queue factory&lt;/p&gt;    &lt;p&gt;&amp;#160; &lt;font face="Arial" color="#000080"&gt;&amp;#160; &amp;lt;bean id=&amp;quot;jmsQueueFactory&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; abstract=&amp;quot;false&amp;quot; lazy-init=&amp;quot;default&amp;quot; autowire=&amp;quot;default&amp;quot;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dependency-check=&amp;quot;default&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;jndiName&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;value&amp;gt;jms/QueueFactory&amp;lt;/value&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;resourceRef&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;jndiTemplate&amp;quot; ref=&amp;quot;myJndiTemplate&amp;quot;/&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt; &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;These beans define the request and the response queue respectively:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font face="Arial" color="#000080"&gt;&amp;lt;bean id=&amp;quot;jmsRequestQueue&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; abstract=&amp;quot;false&amp;quot; lazy-init=&amp;quot;default&amp;quot; autowire=&amp;quot;default&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dependency-check=&amp;quot;default&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;jndiName&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;value&amp;gt;jms/RequestQueue&amp;lt;/value&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;resourceRef&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;jndiTemplate&amp;quot; ref=&amp;quot;myJndiTemplate&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font face="Arial" color="#000080"&gt;&amp;lt;bean id=&amp;quot;jmsResponseQueue&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; abstract=&amp;quot;false&amp;quot; lazy-init=&amp;quot;default&amp;quot; autowire=&amp;quot;default&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dependency-check=&amp;quot;default&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;jndiName&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;value&amp;gt;jms/ResponseQueue&amp;lt;/value&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;resourceRef&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;jndiTemplate&amp;quot; ref=&amp;quot;myJndiTemplate&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;We then customise Spring’s JmsTemplate with the beans configured above. Note that we will use JmsTemplate to send JMS messages later:&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;font face="Arial"&gt;&lt;font color="#000080"&gt;&amp;lt;bean id=&amp;quot;jmsTemplate&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class=&amp;quot;org.springframework.jms.core.JmsTemplate&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connectionFactory&amp;quot; ref=&amp;quot;jmsQueueFactory&amp;quot;&amp;#160; /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;defaultDestination&amp;quot; ref=&amp;quot;jmsRequestQueue&amp;quot;/&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt;&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Last but not least, we create a Message Driven Pojo which is the WormholeActor. Note that the WormholeActor is listening to the reponse queue.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&amp;#160; &lt;font face="Arial" color="#000080"&gt;&amp;#160; &amp;lt;bean id=&amp;quot;messageListener&amp;quot; class=&amp;quot;org.azrul.osconf.jmsActors.WormholeActor&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;bean id=&amp;quot;jmsContainer&amp;quot; class=&amp;quot;org.springframework.jms.listener.DefaultMessageListenerContainer&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connectionFactory&amp;quot; ref=&amp;quot;jmsQueueFactory&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;destination&amp;quot; ref=&amp;quot;jmsResponseQueue&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;messageListener&amp;quot; ref=&amp;quot;messageListener&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Next, we create a WormholeActor class in Scala&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;class WormholeActor extends Actor with MessageListener{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; def act:Unit = {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loop      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; react      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case msg:String =&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; val context&amp;#160; = new ClassPathXmlApplicationContext(Array[String](&amp;quot;/org/azrul/osconf/jmsActors/client-context.xml&amp;quot;));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; val jmsTemplate = context.getBean(&amp;quot;jmsTemplate&amp;quot;).asInstanceOf[JmsTemplate]; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jmsTemplate.send(new MessageCreator() {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def createMessage(session:Session):Message={      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; val message =&amp;#160; session.createMapMessage;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; message.setString(&amp;quot;MESSAGE&amp;quot;, msg);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return message;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160; def onMessage(message:Message):Unit={     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; val responseMsg = message.asInstanceOf[MapMessage];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; println(&amp;quot;-------From Listener------&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; println(responseMsg.getString(&amp;quot;MESSAGE&amp;quot;));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Basically it has two primary functions: act that reacts to Scala actor messages and onMessage that reacts to JMS messages. Note that when we receive a Scala message, we automatically send it to the JMS world (via our request queue created through our Spring config.)&lt;/p&gt;  &lt;p&gt;Here is the MDB: &lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;@MessageDriven(mappedName = &amp;quot;jms/RequestQueue&amp;quot;, activationConfig = {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; @ActivationConfigProperty(propertyName = &amp;quot;acknowledgeMode&amp;quot;, propertyValue = &amp;quot;Auto-acknowledge&amp;quot;),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; @ActivationConfigProperty(propertyName = &amp;quot;destinationType&amp;quot;, propertyValue = &amp;quot;javax.jms.Queue&amp;quot;)      &lt;br /&gt;})      &lt;br /&gt;public class MyMDBQueueBean implements MessageListener { &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160; public MyMDBQueueBean() {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160; public void onMessage(Message message) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MapMessage requestMsg = (MapMessage) message;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;-------From MDB------&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(requestMsg.getString(&amp;quot;MESSAGE&amp;quot;));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;----------------------&amp;quot;); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Context ctx = new InitialContext();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup(&amp;quot;jms/QueueFactory&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Queue queue = (Queue) ctx.lookup(&amp;quot;jms/ResponseQueue&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; javax.jms.Connection connection = connectionFactory.createConnection();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; javax.jms.Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageProducer producer = session.createProducer(queue);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MapMessage responseMsg = session.createMapMessage(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; responseMsg.setString(&amp;quot;MESSAGE&amp;quot;,&amp;quot;READ:&amp;quot;+requestMsg.getString(&amp;quot;MESSAGE&amp;quot;));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; producer.send(responseMsg); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } catch (NamingException ex) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Logger.getLogger(MyMDBQueueBean.class.getName()).log(Level.SEVERE, null, ex);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } catch (JMSException ex) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Logger.getLogger(MyMDBQueueBean.class.getName()).log(Level.SEVERE, null, ex);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt; The MDB listens to the request queue and forward any message to the response queue. Of course in your application, you may want to do some business logic between request and response. In our case, we just do this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;System.out.println(&amp;quot;-------From MDB------&amp;quot;);       &lt;br /&gt;System.out.println(requestMsg.getString(&amp;quot;MESSAGE&amp;quot;));        &lt;br /&gt;System.out.println(&amp;quot;----------------------&amp;quot;);&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To bootstrap it all, we need a Scala main function that will send a message to the wormhole actor:&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;object Main { &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Arial" color="#000080"&gt;main(args : Array[String]) : Unit =     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var wormholeActor = new WormholeActor;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wormholeActor.start      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wormholeActor ! &amp;quot;I’m John Connor and if you’re listening to this you are the RESISTANCE!&amp;quot;      &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Next, just run the MDB and run the Main object. &lt;/p&gt;  &lt;p&gt;Note:Use Netbeans to easily create an MDB . Follow this &lt;a href="http://www.netbeans.org/kb/60/javaee/ejb30.html"&gt;tutorial&lt;/a&gt; under the topic Creating the &lt;tt&gt;NewMessage&lt;/tt&gt; Message-Driven Bean&lt;/p&gt;  &lt;p&gt;Complete &lt;a href="http://www.juststored.com/file/6V45O5"&gt;source code&lt;/a&gt; for Actor (password: qwerty)&lt;/p&gt;  &lt;p&gt;Dependencies:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://img507.imageshack.us/img507/2323/filesactors.png" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7700747119191733785?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7700747119191733785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7700747119191733785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7700747119191733785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7700747119191733785'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/06/scala-actor-message-driven-bean-mdb.html' title='Scala Actor + Message Driven Bean (MDB) using JMS'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7952900661979346916</id><published>2009-06-03T20:14:00.001-07:00</published><updated>2009-06-03T20:33:28.504-07:00</updated><title type='text'>OSCONF 2009: Awesomeness just got a new name!!</title><content type='html'>&lt;p&gt;As if the world’s total awesomeness converged for 4 days , OSCONF was totally awesome (more awesome then some conf that starts with Tech and end with Ed). The community rocks!!&lt;/p&gt;  &lt;p&gt;Ubuntu guys rocks!!&lt;/p&gt;  &lt;p&gt;PHP guys (Joomla guys too) rocks!!&lt;/p&gt;  &lt;p&gt;Sun guys rocks (although not as much, yeah yeah, I know, the Oracle thingy is probably in their mind)&lt;/p&gt;  &lt;p&gt;Python guys rock soliidd!!&lt;/p&gt;  &lt;p&gt;BSD guys rocks and are horny too (no no, not the other kind of horny :)) )&lt;/p&gt;  &lt;p&gt;ADempiere guys manage to maintain their cool :P&lt;/p&gt;  &lt;p&gt;And best of all, the lightning talks really really rock!! with total awesomeness that rocks can have :))    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Everyone just plain awesome !! Yeah, everyone! Even the OpenSUSE guys. :))&lt;/p&gt;  &lt;p&gt;Please please please make this a yearly event&lt;/p&gt;  &lt;p&gt;Anyway, I delivered my Scala talk too. Here’s the slide&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.scribd.com/doc/16094125/azrulosconfkickingbuttenterprisescala" href="http://www.scribd.com/doc/16094125/azrulosconfkickingbuttenterprisescala"&gt;http://www.scribd.com/doc/16094125/azrulosconfkickingbuttenterprisescala&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I’ve also done a lightning talk called Cyber Merdeka (Cyber Sovereignty)&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.scribd.com/doc/16094325/Cyber-Merdeka-Cyber-Sovereignity" href="http://www.scribd.com/doc/16094325/Cyber-Merdeka-Cyber-Sovereignity"&gt;http://www.scribd.com/doc/16094325/Cyber-Merdeka-Cyber-Sovereignity&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I’ll make the video available if I can get it from MDeC&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img src="http://img134.imageshack.us/img134/8883/03062009198small.jpg" /&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Me and Anthony Baxter of Google&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7952900661979346916?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7952900661979346916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7952900661979346916' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7952900661979346916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7952900661979346916'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/06/osconf-2009-awesomeness-just-got-new.html' title='OSCONF 2009: Awesomeness just got a new name!!'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-3903084632195335275</id><published>2009-02-19T01:32:00.001-08:00</published><updated>2009-02-19T01:32:25.341-08:00</updated><title type='text'>Unintentional user created content</title><content type='html'>A few years ago, I stumbled upon a dialog featuring Sun Microsystems' Johnathan Shwartz and a few other names (sorry too lazy to look it up).&lt;br /&gt;In the dialog, one of the participants ask this question:&lt;br /&gt;&lt;br /&gt;"Would you write a book for someone for free"&lt;br /&gt;&lt;br /&gt;If you ask me, then my answer is no. Then come the next question.&lt;br /&gt;&lt;br /&gt;"What about a paragraph... for free"&lt;br /&gt;&lt;br /&gt;Well, probably,&lt;br /&gt;&lt;br /&gt;"What about a word, just one word"&lt;br /&gt;&lt;br /&gt;Sure.&lt;br /&gt;&lt;br /&gt;Well, that is what Google (and Microsoft and Yahoo etc.) is doing. Google is asking all of us to write a "book". A few words a person. &lt;br /&gt;This book contains the combined knowledge of all of us... well at least it contains to combined "intention" from all of us. My question is this,&lt;br /&gt;are we aware that we are creating content for Google? Some of us do, most don't. This is waht I call "unintentional user created content"&lt;br /&gt;&lt;br /&gt;Imagine now, if we have a video cam that will take movie of every aspect of our lives. Couple that video cam with a sound recorder and you can&lt;br /&gt;express yourself whenever you feel like it. It will also capture your interaction with people around you. Couple that with a GPS receiver and&lt;br /&gt;your location, your image, your interaction will automatically be your blog: an autoblog if you prefer.&lt;br /&gt;&lt;br /&gt;No more messing around with computers and no more having to type things. All you have to do is ... welll ... nothing. Everything becomes a blog.&lt;br /&gt;(Of course there are time when you want to shut off such device.) Now, of course all these are voluntary. Now before you dismiss this as some&lt;br /&gt;fantasy I cooked up, just watch your next season American Idol. You'll see that people LOVE to put their live online. (And also, the hordes of&lt;br /&gt;idiotic videos on youtube  substantiate this also).&lt;br /&gt;&lt;br /&gt;I do belive that unintentional user created content is the future. Today,  we do have youtube and blogspots and twitter and whatnot, but these&lt;br /&gt;"intentional" web 2.0 stuff are small fry compared to what is coming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-3903084632195335275?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/3903084632195335275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=3903084632195335275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3903084632195335275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3903084632195335275'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2009/02/unintentional-user-created-content.html' title='Unintentional user created content'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7032689481655844362</id><published>2008-06-22T16:19:00.000-07:00</published><updated>2008-06-22T16:24:26.856-07:00</updated><title type='text'>The perils of HR</title><content type='html'>&lt;p style="text-align: justify;" class="MsoNormal"&gt;Every working adult and their cats would have a story about how much they dislike, nay, abhor, HR (and in some places, things are so bad that even HR folks have their own HR story to tell and I kid you not). So is it a wonder that someone actually writes “Why They Hate HR? [http://www.fastcompany.com/magazine/97/open_hr.html]”.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;Just like everyone else I have my story to tell and I also have my own theory why HR just doesn't work. Mind you that this story is not my worst brush with HR, but it demonstrates, with simplicity, the abysmal state of HR. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;      &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;This happens to me on one of my previous job. The story starts when my project team applied to go to this one training. You see, my team uses this software platform in our project. The platform (let us call it Platform X) is ubiquitously present all along the system we are developing. I.E. the GUI guys would be interacting with Platform X as much as the database guys or the middleware guys. Due to that, we all applied to go Platform X training and guess what, we got rejected because... wait for it... the policy says only one person from one project can go to a particular training. &lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;Apparently, a few years ago (before I joined the company), a group of 5 employees from the same project applied to go to a 5 day training. Now instead of staying for the whole 5 days, each one of them would take turn to go to the training while the others enjoyed a 'paid vacation'. The HR director found out and decrees a law that 'hence forth, thy projects can only send one soul to training’. I guess, in some projects in makes sense, furthermore it does save the company a few cents on training expenses. But in my case (and I'm sure the same goes with many other projects) this law just doesn't make sense. If we send a GUI guy to the training, as much as he would like to understand how Platform X interact with our distributed multi agent based high performance cache system, I don't think he can. The same goes if we send a middleware guy, he would be clueless on how Platform X interact with the GUI stuff. Now to make matters worse, there was a change of requirement and we now need to include mobile devices components in our project and guess what? The mobile stuff are also ... going to interact with Platform X.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;      &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;We wrote an appeal letter to HR saying that if we don't get this training, there's a high probability that the project will fail. The lady officer assigned to our case informed us that there's nothing she can do, apparently the decreed law has made its way into our HR system as a 'business rule' and it'll take a whole lot more than our collective pretty faces to change that. Sure we can make the appeal go all the way to the CEO but that'll take too much time and that is a luxury we didn't have.&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;All and all, due to the importance of the project, the client agreed to sponsor the training (with a huge reduction in fee and a large red line going through our Gantt chart cutting our timeline by almost half) and it was worth it. The training went well, we learnt a lot about Platform X but things could be better. Due to the reduction in fees, we had to let go of a few engineers (some of them are quite good) and due to the reduction in time, we need to rush like crazy. (In fact we were a bit off schedule in the end) What if HR would just swallow its pride and help let us go to that training we asked, Ok so what is some of our project team skip a day of the training... I'm sure that would actually cost less that what we have to 'pay' in the end.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;      &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;And herein lies the problems with HR.&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;1) Business Process Over-Automation&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;How many times have you been to HR to complaint about something and they would simply dismiss you by saying 'it is already in the system, I can't do anything about it'. Well, if you're anything like me, that is almost the single most quoted excuse ever... OK, I lied, the single most quoted excuse is actually 'The manager's on leave' but 'it is the system' excuse must be one of the top 10 if anything.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;I call this over-automation. Don't get me wrong, I'm all for automation but when the business rule goes something like: 'If the employee has been working less than 2 years and the project's duration is less than a year and the employee's mother is a keen supporter of Manchester United and the employee don't like sushi, then deny him any access to training'. You know that there's something wrong. Over automation is when rules 'hard coded’ into the HR system just doesn't make sense and yet it is religiously enforced because it's 'policy'. Now, over automation in itself is still OK, what makes things worse is over-automation plus paranoia. This brings us to the second problem.&lt;/p&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;      &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;2) Assuming the worst in your employee&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;How are HR business rules created? Simple, they just observe the employees, find the worst thing that they can do, assume everyone else will also be as bad and create rules against that. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;Stupid HR rules is all about assuming that you are evil somehow, that you will abuse the system and you will run the company bankrupt with your lofty 'paid vacations' and 'non-cost-saving' attitude. Will there be abuses? Sure. Will the collective cost of failed projects and low morale make up to the cost of those abuses? I don't know; in fact, don't ask HR, they won't know either. And therein lies a problem. To concretely study each business rule in the system and find out its actual cost has never been attempted. In fact, everyone assumes that HR is omnipotent and will not make mistakes. Well, here's news for you HR does make mistakes, again and again.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;Now what should HR do instead? Shouldn’t they have business rules? They should but HR officers should be given enough authority to make exceptions. In fact they should be encouraged to make exceptions because we are all different! We have different talents and different needs. Ned in accounting has a baby boy who suffers from thalassaemia. He should get more 'emergency leave' than Sue from engineering who is single. Consideration should be given on a case by case basis because HR stands for HUMAN resource and not HIGHLY AUTOMATED resource. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;But how do you avoid abuses? Now since HR has this system in place, couldn't they measure how much a decision improves or not a project for example? You cannot improve what you cannot measure so HR should start making exceptions and start measuring if things are really abused or if it is just plain paranoia of some lonely HR manager still clinging tightly to his pillow, scared stiffed that the boogeyman is going to come out of the closet tonight.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="text-align: justify;" class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7032689481655844362?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7032689481655844362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7032689481655844362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7032689481655844362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7032689481655844362'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2008/06/perils-of-hr.html' title='The perils of HR'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-8832346163544041155</id><published>2008-05-21T19:57:00.000-07:00</published><updated>2008-05-21T22:05:10.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCIT'/><title type='text'>World Congress On IT -- WCIT</title><content type='html'>&lt;div style="text-align: justify;"&gt;I went o WCIT 2008 at KL Convention Center as a delegate and had to suffer a few days of "ye old boring diatribe and ego venting" almost all the way through the seminar. I mean, come on!,  if you're an avid IT blog reader (and writer) and you read forums such as dzone, zdnet, theserverside, or even slashdot every single day, there is nothing new here.  There are a few gems though,  the "Future of the Internet" forum was really something else. The WCIT Great Debate (well, it's not much aof a debate since all the debaters agree with each other all the time) was also insightful. The final keynote by  Vonton Cerf  (the interplanetary internet googler) was also very interesting&lt;br /&gt;&lt;br /&gt;My real beef is that most of the presentations touch only the surface of any particular issue and use up all the time given to retouch the same surface over and over again (and desperately hoping that the audiences would get some kind of an orgasm from this). I mean, there wasn't really a session where things are scrutinized to the nearest atom and problems are disected like dead frogs on some 15 year old science students lab table (and yeah those 15 year olds can really disect frogs). Even the CIO breakout sessions (well I attended the FIS session) didn't really go that deep.&lt;br /&gt;&lt;br /&gt;Another dispointing thing is that, no technical session was done AT ALL. I mean, come on!. It's World Congress of Information &lt;span style="font-weight: bold;"&gt;Technology&lt;/span&gt;  and no "technology related track was done. Couldn't they run a few tracks on some general tech issues. You know things like building next the generation of internet apps or whatever. But nothing at all, rien, nada.&lt;br /&gt;Now before you jump your guns and say, "hey Azrul, this is a business seminar, get over it!" I would like to remind you that they have a PC Fair going on downstairs at the convention center.  (Of course WCIT was co sponsored by PICOM whose hammer (read PC Fair) is applied to every single problem they have... What? earthquake in China? let's do a fundraiser... and throw in  a PC Fair for good measure). Now, is PC Fair, full of pimple head bloggers wannabe drolling over some MP4 player, is more business related than "Tools and techniques to build the next generation of internet application"?  Yeah... of course... NOT!&lt;br /&gt;&lt;br /&gt;I was also a bit disappointed by the chief ministers trying to lure investors to their respective states. During their speeches, they were reading from a text... I mean, come on, reading?! Gosh! you guys are politicians for God sake. Use your public speaking skills (how on earth did you guys win the last election anyway?). Throw away the freaking text your secretary made the night before and speak from your heart. What can we expect from you. You track record. Your resources etc. If things are lacking what do you do to improve the situation, and last but not least... give us your phone number and email so that we can contact you. If I want to invest in a company, I want speak to the boss. Not some "account manager" you hired yesterday. The same goes with investing to a state.&lt;br /&gt;&lt;br /&gt;Lastly, why the heck did they call WCIT as "the Olympics of IT" anyway? . Well, if the Olympics of IT consist mostly of sitting down, snorring, chatting and eating good food (and the food was good), should one wonder why &lt;a href="http://entertainment.slashdot.org/article.pl?sid=08/05/20/211233"&gt;IT workers are getting fatter?&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-8832346163544041155?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/8832346163544041155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=8832346163544041155' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/8832346163544041155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/8832346163544041155'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2008/05/wcit.html' title='World Congress On IT -- WCIT'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-3373957919842905809</id><published>2008-04-23T02:01:00.000-07:00</published><updated>2008-04-23T23:52:02.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jonathan Schwartz'/><category scheme='http://www.blogger.com/atom/ns#' term='CLDC'/><category scheme='http://www.blogger.com/atom/ns#' term='MIDP'/><category scheme='http://www.blogger.com/atom/ns#' term='J2ME'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaME'/><title type='text'>To Mr. Jonathan Schwartz: Please make JavaFX work on plain CLDC</title><content type='html'>This entry is half an open-letter and half a rant-blog so if I run with it a bit too far, please bear with me.&lt;br /&gt;&lt;br /&gt;Last year Sun introduces JavaFX as a rich multimedia platform for Java (Applet 2.0 ?) , at that time I was busy finding a way to run Flash animations on as many mobile phones as possible. Yes I know about Flashlite but the support of Flashlite are not that extensivise, especially if you include low end / old phones that only support MIDP 2.0. I was jumping up and down when they showed how rich multimedia app can actually run "unharmed" on a phone.&lt;br /&gt;&lt;br /&gt;To my dismay, I found out later on that JavaFX only works on CDC (read high-end, almost PDA type phones) and totally ignore CLDC - Ok, that's not really true, they do plan cover CLDC (some time in the future?) but the CLDC phone's JVM must support SVG. (OK that's a whole bunch of acronymes but in short, JavaFX only supports the latest greatest phones).&lt;br /&gt;&lt;br /&gt;To add salt to injury, I heard (ok this is only rumours - but it still hurts) that Sun is coming up with a design tool much like Abode Flash to help designers use JavaFX.&lt;br /&gt;&lt;br /&gt;Now here's a news for Sun, designers don't use Java or JavaFX or any tool related to them. Designers are trained in schools to use Flash and AI and Photoshop. Heck, even Microsoft had a hard time dethroning Adobe as a design tool company. JavaFX only covers high-end newest-latest phones that already has Flashlite runtime: Why do I as a designer wants to create a JavaFX content when I can just run my swf (read flash) files unchanged on these latest phones?&lt;br /&gt;&lt;br /&gt;So, here are a few things I think Sun should do instead:&lt;br /&gt;&lt;br /&gt;1) Create a CLDC JavaFX runtime but do not insist on any extra JSR/MSA or whatever. Now how do I know that this is doable? Well because tons of rich multimedia games are already created on plain CLDC phones. Couldn't Sun just leverage the game APIs to create a JavaFX runtime? These APIs are already tried and true stuff and have been shown to be flexible enough to run the most complexe of games: let alone JavaFX content.&lt;br /&gt;&lt;br /&gt;2) If Sun is itching to create a designer tool then please do so, but please please create an SWF to JavaFX translator. There are tons of Flash based content out there and IF this SWF to JavaFX tool comes along AND these content can run on any CLDC phone THEN JavaFX will make a killing.&lt;br /&gt;&lt;br /&gt;Now, some might say, "hey Azrul, Sun is a server company, why the heck would they want to invest fulfilling your little wet dream". Let me answer that with a story of Sara. Sara is a designer living in Kuala Lumpur, Malaysia. She designs content for mobile phones. With the current technology, Sara could create around 4-5 contents per week (enough to pay her rent and to put food on the table). She uses Flash because that is the tool they taught her in designer school and Flash is flexible enough for her to create really cool stuff. But she has a huge problem: most phones does not support Flashlite. She saved some money and buy a software that converts Flash's swf files to 3gp files (mobile video) and send these 3gp files through MMS to her clients. Unfortunately, her MMS provider informed her that Telco's only supports MMS up to 100kb only. She knows about an alternative to MMS which is WAP push, but Sara allows her clients to include their own text in her content and MMS is the only way to do that right now. Because of this limitation on the size of the files, Sara needs to be extra careful on things like, the number of colors she uses and cool stuff like gradients are next to impossible to do.&lt;br /&gt;&lt;br /&gt;Now, Mr. Schwartz, CEO of Sun, after reading a blog by some unknown guy, decided to  make JavaFX runtime as standard compliant as possible (read independent of any optional JSR or MSA etc.) by leveraging MIDP's game API. Furthermore, Sun has also created an swf to JavaFX converter. Sara was thrilled when she found out that she can now create Flash content, convert it to JavaFx and run it on almost any phone out there. Her programmer boyfriend told her that JavaFX is based on JavaFX script (i.e. text based ) and therefore can be modified easily. He created for her a software to allow her clients to customise her content on the fly. She was very happy, now that customization can be done on the content itself, she doesn't need to use MMS anymore. Her MMS provider also supports WAP push and she can easily move from one delivery mechanism to another. As a bonus, WAP Push is inherently international. So now Sara can sell her content to Singapore, Philippines and the rest of the world.&lt;br /&gt;&lt;br /&gt;What really makes Sara a happy girl is that she can now concentrate on being creative instead of having to count how many colors she is using in her content. Instead of creating 4-5 contents per week, she's now creating tens of them. She even hired a few interns to help her out. Together they create a few hundred contents per month.&lt;br /&gt;&lt;br /&gt;One fine day she got a call from her server provider saying that her server just couldn't take the load anymore: too many people are downloading her content, then she remembers Mr. Schwartz's company, Sun Microsystem. They make powerful servers with gazilion of cores embedded inside. (Her programmer boyfriend, who is now her fiancee, just couldn't stop talking about how good those servers are). She call her server provider and ask them if they can use a Sun server instead. They inform her that Sun servers are a bit expensive but she has enough money now.&lt;br /&gt;&lt;br /&gt;So Sara uses Sun server to serve her JavaFX mobile content and all thanks to Mr. Schwartz and all those nice people at Sun who made it all possible.&lt;br /&gt;&lt;br /&gt;And Sara lives happily ever after...&lt;br /&gt;&lt;br /&gt;So you see, making JavaFX work CLDC phones without any extra baggage and making swf to javafx transition to be as smooth as possible actually pays off... even for Sun Microsystems, the server company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-3373957919842905809?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/3373957919842905809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=3373957919842905809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3373957919842905809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/3373957919842905809'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2008/04/to-mr-jonathan-schwartz-please-make.html' title='To Mr. Jonathan Schwartz: Please make JavaFX work on plain CLDC'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-2784198371936086829</id><published>2008-04-17T21:44:00.000-07:00</published><updated>2008-04-17T21:48:23.303-07:00</updated><title type='text'>Scenario Driven Testing</title><content type='html'>&lt;a href="http://beust.com/weblog/archives/000382.html"&gt;Cedric's recent (ok, it's not that recent) blog&lt;/a&gt; on ROR prompted me to write this entry. No, I'm not about to become a RORing ROR advocate, instead I'm going to talk about testing. An interesting point raised by CEdric was this: JUnit actually holds back Java testing scenario and therefore Java is stucked with unit testing as the ultimate and unquestionable master of test and anything less (or more) is frowned upon with so much prejudice it makes "think of the children" slogan sounds holy (dramatization is mine).&lt;br /&gt;&lt;br /&gt;Ok, unit testing is in and on itself is not evil, but it's not enough. Functional testing, in my opinion is waaayy more important and yet functional test has been like that uncle everyone despises: can't live with him, can't throw him out of the boat while you pretend going fishing with him at 3:00 AM in the morning.&lt;br /&gt;&lt;br /&gt;But how do you do functional test?&lt;br /&gt;&lt;br /&gt;Here's my take on it:&lt;br /&gt;&lt;br /&gt;When you start your software development you would have scenarii (of course unless you're doing Agi-hi-le development where you code as soon as the client opens his mouth -- just joking, I know agile folks have user stories :) ). The scenarios are not and can never be comprehensive but it gives you the ability to cover the usual usage of your software (which is probably 90% of the time - give or take). All you have to do now is to create&lt;span style="font-weight: bold;"&gt; scripts mimicking the scenarii &lt;/span&gt;and that's it.&lt;br /&gt;&lt;br /&gt;Scenario driven testing coupled with unit test would be a great tool for developers: unit testing covers the nitty gritty part of your system and scenario driven testing covers the large picture.&lt;br /&gt;&lt;br /&gt;Of course, most of the time you will need to do scenario driven testing through an interface so tools like httpunit would help. But what if you need (or forced) to use an interface toolkit that has no testing framework in sight? *cough* woodstock *cough* (BTW, if anyone knows a good interface based woosdtock testing tool, please show me the light) Well, apart from testing manually, I'm still working on a way to automate things a little. So stay tune...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-2784198371936086829?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/2784198371936086829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=2784198371936086829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/2784198371936086829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/2784198371936086829'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2008/04/scenario-driven-testing.html' title='Scenario Driven Testing'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-1515980161609112312</id><published>2008-04-17T07:38:00.001-07:00</published><updated>2008-04-17T07:44:21.879-07:00</updated><title type='text'>Multiple Auto-complete for Woodstock (Netbeans Visaul Web Pack (VWP))</title><content type='html'>I have been searching around for multiple autocomplete but couldn't really find one that works seamlessly with Netbeans VWP. There is of course the work of Dimitry [http://blogs.sun.com/dmitry/entry/creating_autocomplete_entry_field_with] but this is limited to a single entry auto-complete (i need a multiple one). So just like any good hacker, I decided to see if I can improve Dimitry's code and come up with my own and le voila:&lt;br /&gt;&lt;br /&gt;Basically, the flow of things are exactly like the one used by Dimitry, except that&lt;br /&gt;&lt;br /&gt;1) When editing the textfield, not only that I refresh the listbox, but also see if the user is typing a comma, in which case, I will reset the filter in Page1. The filter will only contain words typed after the comma.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;//in Page1 setFilter&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;int index = value.lastIndexOf(',');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;if (index &gt;= 0){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;       this.filter = value.substring(index+1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;       this.filter = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;listbox1DefaultOptions.filter(filter);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) Also, the user could type the down arrow key while typing in the textfield, this will bring our focus to the listbox.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;//in tf's OnKeyUp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;var evtobj=event? event : window.event //distinguish between IE's explicit event object (window.event) and Firefox's implicit. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;var unicode=evtobj.charCode ? evtobj.charCode : evtobj.keyCode &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;if (unicode==40){ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;    document.getElementById('form1:listbox1').getSelectElement().focus(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;document.getElementById('form1:listbox1').refresh('form1:tf'); &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Just to complete things, the user could also type a comma while browsing the listbox, this will be detected in the OnKeyUp event of the listbox&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;//OnKeyUp of listbox1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;var evtobj=event? event : window.event &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;var unicode=evtobj.charCode ? evtobj.charCode : evtobj.keyCode&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;var character=String.fromCharCode(unicode)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;if (unicode==44){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;    var text = document.getElementById('form1:tf').getProps('value').value + ',';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;    document.getElementById('form1:tf').setProps( {value: text } );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;    document.getElementById('form1:tf').getInputElement().focus();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;    var text = document.getElementById('form1:tf').getProps('value').value + character;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;    document.getElementById('form1:tf').setProps( {value: text } );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:arial;" &gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Of course if the listbox change, we need to append the listbox selecte entry to the textfield. (Note that We will replace any entry that is after the last comma.)&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;//OnChange event of listbox&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;var text = document.getElementById('form1:tf').getProps('value').value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;var index = text.lastIndexOf(',');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;if (index &gt;=0){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    var stext = text.substring(0,index+1)+document.getElementById('form1:listbox1').getSelectedValue();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    document.getElementById('form1:tf').setProps({value: stext});&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    var stext = document.getElementById('form1:listbox1').getSelectedValue();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    document.getElementById('form1:tf').setProps({value: stext});&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Please download the complete code here [http://www.mewit.net/codes/autocomplete.zip]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-1515980161609112312?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/1515980161609112312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=1515980161609112312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1515980161609112312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1515980161609112312'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2008/04/multiple-auto-complete-for-woodstock_17.html' title='Multiple Auto-complete for Woodstock (Netbeans Visaul Web Pack (VWP))'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-7480740752017709331</id><published>2008-04-17T07:38:00.000-07:00</published><updated>2008-04-17T07:42:13.247-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='woodstock'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple auto-complete'/><title type='text'>Multiple Auto-complete for Woodstock (Netbeans Visaul Web Pack (VWP))</title><content type='html'>I have been searching around for multiple autocomplete but couldn't really find one that works seamlessly with Netbeans VWP. There is of course the work of Dimitry [http://blogs.sun.com/dmitry/entry/creating_autocomplete_entry_field_with] but this is limited to a single entry auto-complete (i need a multiple one). So just like any good hacker, I decided to see if I can improve Dimitry's code and come up with my own and le voila:&lt;br /&gt;&lt;br /&gt;Basically, the flow of things are exactly like the one used by Dimitry, except that&lt;br /&gt;&lt;br /&gt;1) When editing the textfield, not only that I refresh the listbox, but also see if the user is typing a comma, in which case, I will reset the filter in Page1. The filter will only contain words typed after the comma.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;//in Page1 setFilter&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;int index = value.lastIndexOf(',');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;if (index &gt;= 0){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;       this.filter = value.substring(index+1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;       this.filter = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;listbox1DefaultOptions.filter(filter);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) Also, the user could type the down arrow key while typing in the textfield, this will bring our focus to the listbox.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;//in tf's OnKeyUp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;var evtobj=event? event : window.event //distinguish between IE's explicit event object (window.event) and Firefox's implicit. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;var unicode=evtobj.charCode ? evtobj.charCode : evtobj.keyCode &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;if (unicode==40){ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;    document.getElementById('form1:listbox1').getSelectElement().focus(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: arial; color: rgb(51, 51, 255);"&gt;document.getElementById('form1:listbox1').refresh('form1:tf'); &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Just to complete things, the user could also type a comma while browsing the listbox, this will be detected in the OnKeyUp event of the listbox&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;//OnKeyUp of listbox1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;var evtobj=event? event : window.event &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;var unicode=evtobj.charCode ? evtobj.charCode : evtobj.keyCode&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;var character=String.fromCharCode(unicode)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;if (unicode==44){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;    var text = document.getElementById('form1:tf').getProps('value').value + ',';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;    document.getElementById('form1:tf').setProps( {value: text } );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;    document.getElementById('form1:tf').getInputElement().focus();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;    var text = document.getElementById('form1:tf').getProps('value').value + character;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;    document.getElementById('form1:tf').setProps( {value: text } );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-family: arial;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Of course if the listbox change, we need to append the listbox selecte entry to the textfield. (Note that We will replace any entry that is after the last comma.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;//OnChange event of listbox&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;var text = document.getElementById('form1:tf').getProps('value').value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;var index = text.lastIndexOf(',');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;if (index &gt;=0){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    var stext = text.substring(0,index+1)+document.getElementById('form1:listbox1').getSelectedValue();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    document.getElementById('form1:tf').setProps({value: stext});&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    var stext = document.getElementById('form1:listbox1').getSelectedValue();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;    document.getElementById('form1:tf').setProps({value: stext});&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-7480740752017709331?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/7480740752017709331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=7480740752017709331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7480740752017709331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/7480740752017709331'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2008/04/multiple-auto-complete-for-woodstock.html' title='Multiple Auto-complete for Woodstock (Netbeans Visaul Web Pack (VWP))'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-5429100077924198848</id><published>2008-04-14T03:52:00.000-07:00</published><updated>2008-04-14T03:53:45.911-07:00</updated><title type='text'>Should MDeC be writing software</title><content type='html'>Now if you're a Malaysian, you probably heard of the MSC initiative launched by our previous PM to boost Malaysia into the information age. Well MDeC (formally known as MDC) is the (goverment linked) company tasked as being the steward of MSC. (www.mdec.com.my)&lt;br /&gt;&lt;br /&gt;Being a steward of MSC is a blur job description. So MDeC does everything from managing real estates, managing gov. grants, making sure that IT talents are always available etc.&lt;br /&gt;&lt;br /&gt;Should MDeC write software? Yes they should!&lt;br /&gt;&lt;br /&gt;Ok, I know that all the business folks who make up MDeC's higher echelon is all eyeful and ready to grab their guns and shoot this idea to kingdom come... but please, hear me out.&lt;br /&gt;&lt;br /&gt;Whay is Malaysian IT isn't taking off, despite what we do. Every single day, we have more and more Indian nationals working in Cyberjaya instead of the locals. Our IT graduates are not performing and lack way behind in either skills or theory. Our IT enterpreneur are afraid to speak out, our venture capitalist should just be called capitalist since most of them are even worse than banks, our IT shops, diligent and hardworking as they are, have to resort to selling computers since no one is helping them to create and monetize their IPs. We are the third outsourcing destination after India and China and yet we do nothing to at least maintain that or, God forbid, improve our ranking.&lt;br /&gt;&lt;br /&gt;I'm matured enough and knowledgable enough to understand that not all these problems are MDeC's fault. The problem is that MDeC is, intentinally or not, blissfully unaware of these problems. Ok, that is not entirely true. A lot of people in MDeC are aware of these problems but the processes put in place to solve these problems are so out of touch with the reality of things its not even funny anymore.&lt;br /&gt;&lt;br /&gt;I'm not about to hang MDeC by the neck without offering some way to improve things. How to improve?, why, MDeC should create its own software and "suffer" like we suffer, experience the pain that we experience at every tick of the clock. Now don't just write software, market it, find investors for it, find clients to back it up etc. And MDeC will surely know where to put the dollars of their next budget to.&lt;br /&gt;&lt;br /&gt;Now before we dismiss the possibility of this, do know that MDeC is already creating creative contents (www.saladin.tv) and I guess that is why support for creative contents are quite extensive because they did go through the pain of actually creating something. But do know that a lot of MSC companies create software too (heck, by my account, there are a lot more software shops compared to creative content shops).&lt;br /&gt;&lt;br /&gt;To MDeC, unless you experience things that we, the Malaysian software industry, had to go through, you will never truely understand the pain. No matter how many dialogs you run, no matter how many face to face, heart to heart meetings you have with the local software shops, experience is and will always be the best teacher.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-5429100077924198848?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/5429100077924198848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=5429100077924198848' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/5429100077924198848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/5429100077924198848'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2008/04/should-mdec-be-writing-software.html' title='Should MDeC be writing software'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9126833299707184203.post-1911524522868132373</id><published>2007-12-30T22:47:00.000-08:00</published><updated>2007-12-30T23:14:49.423-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multi-agent'/><category scheme='http://www.blogger.com/atom/ns#' term='software abstraction'/><category scheme='http://www.blogger.com/atom/ns#' term='agent'/><title type='text'>Software agent research</title><content type='html'>I was reading an entry on slashdot [http://slashdot.org/article.pl? sid=07/12/29/0447236&amp;amp;from=rss] and subsequently an old paper [http://agents.umbc.edu/introduction/hn-dn-ker99.pdf] on the state of multi-agent research.&lt;br /&gt;&lt;br /&gt;I have to admit that multi-agent technology was one of my pet peeves as I worked on one during my Masters degree industrial project. Heck, I almost proposed multi-agent technology as my PhD research title.&lt;br /&gt;&lt;br /&gt;I am in agreement with the research paper and also most of the comments on slashdot that multi-agent research is somewhat "dead". Sure, occasionally you have papers written on multi-agent and stuff but nothing really ground breaking. The same old problem is stil lurking around.&lt;br /&gt;&lt;br /&gt;In my opinion, [and this is my opinion only, this does not mean to offend any multi-agent researchers, practioners etc. - some of whom are good friends of mine] the whole problem with multi-agent technology is when researchers start making multi-agent as a software abstraction above objects in which intelligence, "selfishness", high-level semantic communication and other agency characteristics are integrated.&lt;br /&gt;&lt;br /&gt;Now, as appealing as this concept is, creating such an abstraction is:&lt;br /&gt;&lt;br /&gt;1) Very very difficult -- Finding common ontology alone is a daunting task.&lt;br /&gt;2) Not very useful to software engineers -- Most software engineering challenges reside in creating highly scalable and performant system. Even in systems that need intelligence (such as game), basic concepts such as A* algorithm, decision tree and finite state machine are usually enough.&lt;br /&gt;&lt;br /&gt;So, what am I suggesting as a solution?&lt;br /&gt;&lt;br /&gt;Quite some time ago, when multi-agent technology was the hype of the century, there were two different school of multi-agent research: One trying to create a software abstraction, the other try to use multi-agent to study the behaviour of and reason about real world agents (one type of such agent is the human being). There were some research (using multi-agent as a model) on animal behaviour under attack from predators, on crowd control and crowd behaviour, on traffic management etc. They show some promising result but alas, researchers tend to be interested more in software agent rather than real-world agents. I suspect the reason behind this is because most multi-agent researchers have their roots grounded in the field of CS or IT and thus their tendency towards creating software abstraction agents instead.&lt;br /&gt;&lt;br /&gt;In my opinion, we need to revamp this trend. Multi-agent technology would probably be more useful in the hand of a sociologist than a computer scientist. (Thus highlighting one of the most severe problem in academics today -- single minded research). Modeling human as multi-agents, simulating the behaviour and reasoning about the future actions would be very much useful and this is probably the future of multi-agent research.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9126833299707184203-1911524522868132373?l=ejn3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ejn3.blogspot.com/feeds/1911524522868132373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9126833299707184203&amp;postID=1911524522868132373' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1911524522868132373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9126833299707184203/posts/default/1911524522868132373'/><link rel='alternate' type='text/html' href='http://ejn3.blogspot.com/2007/12/software-agent-research.html' title='Software agent research'/><author><name>Azrul</name><uri>http://www.blogger.com/profile/15364549816446982502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm2.static.flickr.com/1018/889202537_df65786091_m.jpg'/></author><thr:total>1</thr:total></entry></feed>
