<?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-2534024747783979675</id><updated>2012-02-16T09:27:08.558-08:00</updated><title type='text'>Anthony on Software</title><subtitle type='html'>Contributing thoughts and expanding knowledge in software awareness.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-8111299967403260480</id><published>2009-08-24T04:22:00.000-07:00</published><updated>2009-08-24T06:07:52.908-07:00</updated><title type='text'>[GSoC09] Devcathlon &amp; GSoC</title><content type='html'>&lt;span style="font-style: italic; font-weight: bold;"&gt;Reflecting on GSoC&lt;/span&gt;&lt;br /&gt;The summer has ended for most of us and I'm glad to say that lots of progress has been made since my last entry. Devcathlon has given me lots of ups and downs in the past week. After successfully building the system with a persistent layer using Hibernate, many items such as the UI and game functionality still needed to be dealt with. Although not all objectives were accomplished in the last iteration of Devcathlon, I did have a chance to touch face with many of the issues that will need to be resolved in the next upcoming release of Devcathlon. They seem minor but can sometimes prove to be quite tedious and lots of code digging. This summer's venture has been the most time consuming, yet an overall rewarding experience. I felt that this program has given me greater insight into what development is in a larger based environment. The project at times could get very lonesome, though I did find ways to get motivated again. Many long afternoons and late nights have given me a real appreciation for time. During the last week of GSoC, I granted myself "time" to dedicate myself to the last moments of Devcathlon for this summer. It was difficult since my coding was usually compressed into one weekend which consisted of two days and a lot of distractions. The difficulty of clearing my mind from one project to the other proved to push me to my limitations. Something had to give; so I gave my last focus this summer to Devcathlon (I know it should have been my first and foremost focus). I know that it's too late to turn back the clock, but I've learned a valuable lesson and something about myself along the way.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Devcathlon's beginnings&lt;br /&gt;&lt;/span&gt;The starting of Devcathlon was a very hodgepodge of wicked Wicket fun. People were still getting used to the framework's concept of MVC and Wicket's flexibility and support of components. The building blocks of Devcathlon centered around exploring these new grounds. I felt that this Summer was to pay homage to what I've learned from using Wicket and my previous encounters with other frameworks. I did incorporate changes to the workings of the profile and team sections, but others were left out due to time constraints. Using models is a must in the MVC framework. And using them correctly shows that you really know your stuff. I had to spending many moments re-reading the chapter on models and detachable models. They are very important in the development process and I wished it had been used more frequently in Devcathlon's 1.0 release. Also reusing views and controller functions ensure that you are also being DRY. I could  see that some of those concepts were being injected late into Devcathlon, but others were still very traditional. I honestly saved what I could, and some were forgiven. &lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Working with Devcathlon&lt;/span&gt;&lt;br /&gt;When getting along with an existing system (like Devcathlon) which had multiple people before you developing; you tend to see bits and pieces of the puzzle that fit together. Once you fit those pieces together then the next piece becomes a search. I felt that many of the things I didn't understand from the beginning was an inevitable search to find that missing link. After a while I got used to seeing the patterns people made in their code and what they would often do. I would also tend to have my opinions on certain paths people took when coding. I can't say that Devcathlon was entirely me, because it isn't. For this reason, it was difficult to make hasty changes to the code base. I wanted to respect the code done before me even though some things could have been done better and much more efficiently. I'll suggest some later, but the point is that Devcathlon had a personality to it as do any open source project out there. I've begun to notice how difficult it is for teams to collaborate and come to terms with what is standard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Technical Review of Devcathlon (pre v2.0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;If you've got a class (model) then use it!&lt;/span&gt;&lt;br /&gt;There are many instances when creating a form that I would see no models ever being used. Variables that can be easily referenced using the binding of an existing class model would have relieved the purpose of recreating them again in the form class.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Panels are great, but don't go overboard!&lt;/span&gt;&lt;br /&gt;Following the DRY concept, one could really go overboard into drilling everything down to a label component is reusable and can be turned into a panel. Unfortunately this could lead to unnecessary growth of files which would make it much harder to manage. Just know that things can always be re-factored eventually after knowing that they are  needed in more than one place.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Keep our styles clean yet explicit.&lt;br /&gt;&lt;/span&gt;CSS files were all over the place and some still are and will need to be removed. A little helpful note on what the style pertains to would give nice clues as to where to find it in the markup. I found this to be difficult when certain styles were overriding others. Please make up you mind!&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;Find the project, here along with all the main updates:&lt;/span&gt;&lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/"&gt; http://code.google.com/p/hackystat-ui-devcathlon/&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Closing thoughts&lt;br /&gt;&lt;/span&gt;&lt;span&gt;The overall experience was quite a journey from start to finish. I had an absolute pleasant time, keeping my mind busy this Summer. Hopefully as school starts my mind will start to cool off... NOT! ;)&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;Also many thanks to my mentors who tried desparately to help motivate me and to keep me on track. Apologies to anyone I may have offended during the course of this Summer (I meant every word). And I wish the best of luck to future GSoCers&lt;span style="font-weight: bold; font-style: italic;"&gt;.&lt;br /&gt;Long live the code and tradition! Cheers!&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/2534024747783979675-8111299967403260480?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/8111299967403260480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=8111299967403260480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8111299967403260480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8111299967403260480'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/08/gsoc09-devcathlon-gsoc.html' title='[GSoC09] Devcathlon &amp; GSoC'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-8202659979758890364</id><published>2009-08-12T01:48:00.000-07:00</published><updated>2009-08-19T15:43:44.624-07:00</updated><title type='text'>[GSoC09] Overcoming a hurdle</title><content type='html'>If you were wondering why I haven't been blogging lately, then it's because I hit a "wall." I thought after taking the first few blocks off I would be free of trouble, another layer gets built, but only stronger and thicker than the last. I have to say that this project, in addition  to this summer's workload has had a profound impact on my performance as a programmer. I've essentially realized my limits and as usual would draw insight from these experiences.&lt;br /&gt;So I cleared my head this past week and started to extract what I had done on the branch copy (for db development) and slowly transitioned to the main interface in the trunk of our repository.&lt;br /&gt;&lt;br /&gt;Below are some notes for myself and to future developers of Devcathlon:&lt;br /&gt;Issues building a DB with a pre-existing system designed by multiple users:&lt;br /&gt;These are the issues I ran into with Devcathlon that seemed to really give me the most problems.&lt;br /&gt;The integrity of our DB:&lt;br /&gt;There were many places in the application where (when we would test) that checks were made by the DB and not by the application before hand. This was mainly due to how DevcathlonTestHelper was built, to create and immediate delete a record, without concerning itself with other dependent constraints. In some instances, this would occur while testing team resignations which required two teams with a user being the team owner of one team and a member of the other. So by deleting one of the teams, this would cause a constraint error which is totally valid but not handled by our initial test helpers. Modifications were needed in this area.&lt;br /&gt;*A special note on a test db: It would be beneficial to setup a Devcathlon test db for creating and dropping tables while developing in Devcathlon. This would keep your tests cleaner and ensures the integrity of all records.&lt;br /&gt;In addition to changes to the DevcathlonTestHelper, the DevcathlonConfiguration needed to be initialized for all events defined in the configuration.xml file. This was needed in order for all event subclasses to properly map with the abstract event class upon declaring any particular event. Errors would occur when an event was not initialized by the ConfigurationManager.&lt;br /&gt;The other problem relied on the fact that certain classes needed to be mapped (mirrored) that were originally built via JAXB. I.e.: The Project JAXB generated class needed to be mirrored in Devcathlon and renamed as TeamProject for persistence.&lt;br /&gt;&lt;br /&gt;Thankfully seeing the "BUILD SUCCESSFUL" message (noted @ 5:45am this morning) appear after running 'ant -f verify...,' I finally felt a large weight lifted off of me. I'm now happy to know that the DB is settled  and I'll be able to sleep better tonight.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;This week:&lt;/span&gt;&lt;br /&gt;Test events and  single matches (08/19-20)&lt;br /&gt;Work on UI improvements (08/19-21)&lt;br /&gt;Clean-up old wicket panels (08/19-21)&lt;br /&gt;Documentation: Installation &amp;amp; Issue notes (08/22)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-8202659979758890364?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/8202659979758890364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=8202659979758890364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8202659979758890364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8202659979758890364'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/08/gsoc09-overcoming-hurdle.html' title='[GSoC09] Overcoming a hurdle'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3567553346314543844</id><published>2009-07-12T22:20:00.000-07:00</published><updated>2009-07-14T13:11:43.143-07:00</updated><title type='text'>[GSoC09] Devcathlon UI and other random thoughts</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Past week:&lt;/span&gt;&lt;br /&gt;This week was more targeted in testing and running Devcathlon's game events. I got a chance to look over a few of the events as well as make improvements to the user interface. I honestly had more fun with the UI, since it gave me the chance to be creative. Also this past week was mostly angled towards packaging for GSoC's mid-term release.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UI Improvements:&lt;/span&gt;&lt;br /&gt;The first time you visit Devcathlon, you are presented a functional, yet not very pleasing UI that included a conglomerate of panels and links that semi-worked correctly. I decided that if I needed to start somewhere, then it had to be this very initial page. From here, I devised a new scoreboard, that updates frequently as the visitor sits back and watches things change on screen. It's more dynamic, much more intuitive and incredibly fun to look at.&lt;br /&gt;In the process of creating this component, there are some things that were notably noted for future reference and eventually documented.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dependencies:&lt;/span&gt;&lt;br /&gt;Wicket's date-time package extension requires a tool called, &lt;a href="http://joda-time.sourceforge.net/"&gt;Joda&lt;/a&gt;. It took a while to figure out the reason why the page could not initialize when coding a date-time picker with the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private final Date date = new Date();&lt;br /&gt;...&lt;br /&gt;DateTextField dateTextField = new DateTextField("dateTextField", new PropertyModel(this, "date"), new StyleDateConverter("-S", true));&lt;br /&gt;...&lt;br /&gt;form.add(dateTextField);&lt;br /&gt;dateTextField.add(new DatePicker());&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://markmail.org/message/6q5bgn5oho2dcfub#query:igor%20maven%20joda+page:1+mid:5re2zt7emy4vku2x+state:results"&gt;Igor&lt;/a&gt; was quick to notify someone else with the similar problem by concluding that it would be easier to use a project management tool, called &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;. It's probably the most reasonable thing to do in the future since Wicket projects are now more geared towards using this to properly manage project builds, documentation and resolving dependencies. However, Devcathlon is quite comfortable now in just using Ant as a building tool. Ant serves to be flexible and less standardized than Maven, yet Maven does enforce good practices in folder structures and offers other great project organizations.&lt;br /&gt;** (07-2009) UPDATE - All projects for Hackystat will be switched to integrating with &lt;a href="http://ant.apache.org/ivy/"&gt;IVY&lt;/a&gt; soon.**&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;This week:&lt;/span&gt;&lt;br /&gt;- Resolve issues with mapping JAXB classes via &lt;a href="https://hyperjaxb.dev.java.net/"&gt;HyperJAXB&lt;/a&gt;. (Complete DB)&lt;br /&gt;- Setup and install Devcathlon to public (test) server&lt;br /&gt;- Test game events and pull live data&lt;br /&gt;- Incorporate new UI&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other notes:&lt;/span&gt;&lt;br /&gt;Since other tools were needed to properly build the project through our continuous integration, via Hudson, I didn't want to risk failing a build. I'm keeping things in-house with my mentors until Monday when we set up a proper test server where I could install exactly what I need and want on it. Currently testing will be done by one user (myself) and eventually by my fellow Hackystat GSoCers.&lt;br /&gt;I also mentioned earlier last week about switching to Netbeans 6.7, but my project mentor, Philip suggested that I should stick with Eclipse since we currently only have one sensor that supports Eclipse. On that note, this would make for a great plugin idea for Netbeans to support sending Hackystat sensor data via the IDE. Hopefully someone with the time could venture this avenue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3567553346314543844?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3567553346314543844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3567553346314543844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3567553346314543844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3567553346314543844'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/07/gsoc09-devcathlon-ui-and-other-random.html' title='[GSoC09] Devcathlon UI and other random thoughts'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3520242814701321000</id><published>2009-07-03T00:47:00.000-07:00</published><updated>2009-07-07T06:36:00.901-07:00</updated><title type='text'>[GSoC09] Closing into Devcathlon v2.0</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;In this blog entry, I'll point out the improvements and near completion of Devcathlon v2.0. I know that mid-term evaluations are coming up for GSoC, so I'll need this week to concentrate on the core features. The things I hope to accomplish from now on are almost purely aesthetic, along with minor tweaks to the functionality here and there. I must apologize for my absence last week due to some personal health issues.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hibernate and me:&lt;/span&gt;&lt;br /&gt;For the last two weeks, I've been working on the database through the use of Hibernate. I got a chance to encounter some pretty neat, hidden surprises along the way; one of which deals with performance issues, due to the fact that Hibernate is so "lazy." Hibernate uses this to preserve memory space by not loading the entire objects from the database, but rather proxies at run-time instead. So I ran into some Lazy initialization errors that seemed very annoying at the time. For simplicity, I decided to lift the burden by just disabling this feature on certain mapped entities. However, I did take the precaution to apply some fetching strategies (join rather than a select) for an implicit get() or load() data retrieval. Overall the database is coming along, I did have some questions about class entities that require mappings, such as generated classes from JAXB, Project.class. This is required by most of the other class models (Team and Match), and I'm wondering if the class would need to be moved out as a User defined Type (by extension of Hibernate's UserType) or a custom subclass. Since this is a generated Java class from XML, I'm afraid to take either steps. Considering the time I have left, and mid-term evaluations are right around the corner, I've decided to move onto the UI goodness.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;The Good Stuff:&lt;/span&gt;&lt;br /&gt;I went back to some elements of our first designs of Devcathlon and took the time to rethink about certain areas. Everything is starting to come into perspective, as far as the design goes and we will be seeing some evidence of this in the following 2.0 release. Below is a list of in-progress features being worked on:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Key features:&lt;/span&gt;&lt;br /&gt;Search engine (browse for entities: User/Profile, Team, Match)&lt;br /&gt;Calendar selection&lt;br /&gt;Improved Scoreboard main page - total revamp with live updated listings&lt;br /&gt;CSS improvements to inherited Panels and Base pages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Trying something new:&lt;br /&gt;&lt;/span&gt;At the mist of an update, my Eclipse IDE went a-wal. It just stopped liking itself, or rather hating me... I had difficulty with start-ups, error messages would pop-up saying NoClassDef, and editors could not open up anymore. I got frustrated with trying to remedy this problem, since it has happened before. I like Eclipse and all, but It has given me a history of some disappointment. I can't blame it entirely, since I know that most of this is due to the fact that I install other third-party vendors (plugins) in Eclipse.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;This is the reason why I made my recent move over to using NetBeans 6.7. In all honesty, Eclipse is perfect for a lot of situations but it calls for other resources that might not be perfectly integrated with itself natively. On the other hand, NetBeans almost feels a lot like developing on an enterprise IDE, like MS Visual Studios, etc. It has all the languages I develop in on a daily basis built-in, offers additional services like connecting to databases, creating custom web services, and most importantly it's still FREE.&lt;br /&gt;As for racking up dev-time, I'll have to resort to using Hackystat's Tickertape UI for now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;In the final mid-term week of GSoC, I'll attempt to update the documentation, make improvements to the UI and ready the package off to my mentors. It's been quite a ride and I hope this project satisfies a need to many developers and project managers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3520242814701321000?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3520242814701321000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3520242814701321000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3520242814701321000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3520242814701321000'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/07/gsoc09-glimpes-of-devcathlon-v20.html' title='[GSoC09] Closing into Devcathlon v2.0'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-8220039667027478899</id><published>2009-06-22T13:47:00.001-07:00</published><updated>2009-06-23T01:44:27.283-07:00</updated><title type='text'>[GSoC09] Hibernate + Devcathlon</title><content type='html'>&lt;span style="font-weight: bold; font-style: italic;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;This past weekend I had the chance to dive into implementing Devcathlon's database back-end (Derby) by using Hibernate. I, unfortunately ran into some issues while applying these changes. They seem very pin-pointed since changes were recently made using Hibernate, but there were other confounding factors that hindered a smooth application. After last week's implementation, I was sure that the issue seemed small and easily doable. However the common, 1001 timeout error (which occurs during a Devcathlon's call out to Hackystat's SensorBaseClient) proved to be more of a challenge than I thought. In this entry I'll describe the issues I ran into, and the many solutions leading up to resolving this problem. I'll also mention about next week's goals and a timeline for Devcathlon's first milestone deliverable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;What was the issue?&lt;br /&gt;&lt;/span&gt;SensorBaseClient 1001 timeout error&lt;span style="font-style: italic; font-weight: bold;"&gt; - &lt;/span&gt;This happens due to the increase complexity of the application and heavy call loads out to Hackystat's SensorBaseClient server. This occurred while running the JUnit test cases against recent modifications while applying Hibernate. Another possible problem may arise due to the increase size of the application, which causes an overload memory usage on the contained JVM's heap size.&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;Resolving the issue:&lt;/span&gt;&lt;br /&gt;I went through dismantling many of the previous code implementations. It wasn't awful, though I felt that changing the current state of the application was too obtrusive. I was prone to just keeping my changes reserved to just my additions. Any modifications to the actual code base would need to be reasonably thought out. So the (temporary) remedy for this matter happened to reside in modifying the DevcathlonTestHelper class. The error mostly occurs while trying to make multiple calls out to the SensorBase, along with calling out to Hibernate. The calls to Hibernate happens to stall (exactly at the same spots) and the connection to the SensorBaseClient apparently times out. I tried various ways to remedy the problem, a few of which that were clearly suggested by Johnson in this &lt;a href="http://csdl.ics.hawaii.edu/%7Ejohnson/screencasts/Hackystat.Programming.04.mov"&gt;videocasting&lt;/a&gt;. If you ever run into this error, I would suggest to first watch that video and try out each solution, if all else fails then it's safe to assume that the problem must be you! The work around was applied yesterday, and I was thrilled that the build finally passed verify. The code has been unloaded to SVN and I would like some kind of code review from my mentors.&lt;br /&gt;Changes for this past week.&lt;br /&gt;&lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/source/detail?r=903"&gt;r903&lt;/a&gt; &amp;amp; &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/source/detail?r=904"&gt;r904&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Next week's work load:&lt;/span&gt;&lt;br /&gt;Just a reiteration, the primary goal at this point is to clearly implement a DB for Devcathlon. Considering how much I've endured this past week, It'll hopefully support a faster development time, now identifying those issues. Along with finishing the database, I will get the ball rolling next week for the user interface.&lt;br /&gt;The first delivery date will be within two weeks from now, which will include a solid database implementation using Hibernate (with all/any kinks worked out), UI improvements mentioned in earlier blog posts and suggestions made by peers, and finally a mailing system using JavaMail. Look out for the official beta release of Devcathlon v2.0 on July 6, 2009.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-8220039667027478899?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/8220039667027478899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=8220039667027478899' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8220039667027478899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8220039667027478899'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/06/gsoc09-hibernate-devcathlon.html' title='[GSoC09] Hibernate + Devcathlon'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-1274297547699293801</id><published>2009-06-12T08:14:00.000-07:00</published><updated>2009-06-16T02:59:09.618-07:00</updated><title type='text'>[GSoC] Derby race to the finish...</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Purpose&lt;/span&gt;&lt;br /&gt;In my last posting, I mentioned about ditching BDB for Apache Derby DB as Devcathlon's database back-end. I'm glad to say that that was a reasonable choice and most likely a better one in the long run. For this entry, I'll mention about my progress with the application and what I have in store for the next few weeks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Starting out...&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;At first I decided to create the database using traditional SQL dialects for building the tables necessary for Devcathon. Below is the necessary Derby configurations and the resulting db schema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Derby configuration:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Installed and included an environment variable for Derby.&lt;br /&gt;Created DevcathlonDerbyClient.java class (within the same directory of Devcathlon's Jetty-server Start class). The class includes the connection details and initialization of Devcathlon's database. It was implemented using Derby's included JDBC client driver, &lt;span style="font-style: italic;"&gt;ClientDriver &lt;/span&gt;class. Next I included the client driver &lt;/span&gt;&lt;span&gt;for the start of Devcathlon's application in &lt;span style="font-style: italic;"&gt;Start.java.&lt;/span&gt; Then I started Derby's Network Server, (ran &lt;span style="font-style: italic;"&gt;startNetworkServer&lt;/span&gt;[sh|bat]) on port &lt;span style="font-style: italic;"&gt;1527&lt;/span&gt;. The application fired fine, and Devcathlon was able to communicate successfully with its database. &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;SQL DB Schema 'Devcathlon':&lt;br /&gt;&lt;/span&gt;The full schema file can be found, &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/source/browse/branches/devcathlon-derbydb/src/org/hackystat/devcathlon/engine/db/create-devcathlon.sql?spec=svn901&amp;amp;r=901"&gt;here&lt;/a&gt;. This includes my quick implementation of Devcathlon's database schema for the following tables: Profile, Team, Project, Match and Event.&lt;br /&gt;For convenience, the file is read in by the DevcathlonDerbyClient driver, then parsed and finally executed to initialize the database.&lt;br /&gt;&lt;br /&gt;After spending some time reading up on ORMs, I decided to give it a try. I last mentioned about ORMs in my last few postings; this week was the real test and eventual implementation of an ORM, called Hibernate. I had a few other choices for a JPA + EJB standards (OpenJPA), but I think that Hibernate makes for an advanced extension to these APIs. Considering the immense support (online tutorial/manual) and popularity (in forums), I was able to get up and running with Hibernate within less than an hour.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Hibernate-Devcathlon configuration:&lt;/span&gt;&lt;br /&gt;I downloaded the distribution (v3.3.1) and extracted it into to my local namespace. I also included an environment variable that links to the root directory of Hibernate, called HIBERNATE_HOME. Next, I modified the Ant &lt;span style="font-style: italic;"&gt;build.xml&lt;/span&gt; to include Hibernate's required jars for compilation. Then I created a Hibernate configuration file, called &lt;span style="font-style: italic;"&gt;hibernate.cfg.xml&lt;/span&gt;. The configuration file defines the SessionFactory settings, which includes the database connection(s), hibernate.cfg.xml files, pool connectivity, and debug options. Below is one possible rendering of an hibernate.cfg.xml file for Devcathlon. *Note that Devcathlon will default to looking for this configuration file under the ~/.hackystat/devcathlon/db/hibernate/hibernate.cfg.xml. This is intended so that system administrators can define their own configurations that may require a different database, or whatever is most optimal to their settings.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;hibernate-configuration&gt;&lt;br /&gt;&amp;lt;session-factory&gt;&lt;br /&gt;&amp;lt;property name="hibernate.connection.driver_class"&amp;gt;org.apache.derby.jdbc.ClientDriver&amp;lt;/property&gt;&lt;br /&gt;&amp;lt;property name="hibernate.connection.url"&gt;jdbc:derby://localhost:1527/devcathlonDB;create=true&amp;lt;/property&gt;&lt;br /&gt;&amp;lt;property name="hibernate.default_schema"&gt;Devcathlon&amp;lt;/property&gt;&lt;br /&gt;&lt;!-- JDBC connection pool (use the built-in) --&gt;&lt;br /&gt;&amp;lt;property name="connection.pool_size"&gt;1&amp;lt;/property&gt;&lt;br /&gt;&amp;lt;!-- SQL dialect --&gt;&lt;br /&gt;&amp;lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.DerbyDialect&amp;lt;/property&gt;&lt;br /&gt;&lt;!-- Enable Hibernate's automatic session context management --&gt;&lt;br /&gt;&amp;lt;property name="current_session_context_class"&gt;thread&amp;lt;/property&gt;&lt;br /&gt;&lt;!-- Disable the second-level cache  --&gt;&lt;br /&gt;&amp;lt;property name="cache.provider_class"&gt;org.hibernate.cache.NoCacheProvider&amp;lt;/property&gt;&lt;br /&gt;&lt;!-- Echo all executed SQL to stdout --&gt;&lt;br /&gt;&amp;lt;property name="show_sql"&gt;true&amp;lt;/property&gt;&lt;br /&gt;&lt;!-- Drop and re-create the database schema on startup --&gt;&lt;br /&gt;&amp;lt;property name="hbm2ddl.auto"&gt;create-drop&amp;lt;/property&gt;&lt;br /&gt;&amp;lt;/session-factory&gt;&lt;br /&gt;&amp;lt;/hibernate-configuration&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Loading this configuration file, required a basic HibernateUtil.java class to handle creating thread-safe, session-per-request SessionFactory. This class is intended to handle initializing one global session, providing pool connections for less overhead on the database, and closing a session. Most importantly, this will be the main communication between our data objects and Devcathlon's database. *Note on property, "hbm2ddl.auto" will be switched to a value of "create-drop" for testing purposes only. On an actual production server, this configuration file should just include a "create" value (without the quotes) for permanence.&lt;br /&gt;&lt;br /&gt;Since I started out with building the db schema manually, it really benefited in creating the relational mappings for Hibernate. I could have gone with Hibernate's bottom-up approach by reverse engineering the process to get generated (Java annotated) mappings, but I wanted to see how close my schema was compared to the Hibernate's interpretation of Devcathlon's related classes, and mainly since all the Java persistent classes (ordinary POJOs) have already been built. Thus this is more of a top-down strategy that requires developers to build these relational mappings first, and finally have Hibernate auto-generate and apply its interpreted database schema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Structural pattern to defining and applying relations:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Define the relational mapping of a persistent class entity, ex: User, Profile, Team, etc.&lt;br /&gt;Add these relational mappings (*.hbm.xml) to the session configuration, by simply adding them programmatically in HibernateUtil.java.&lt;br /&gt;All *.hbm.xml relations-per-entity will reside next to their declared entities and within the same folder.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Creating first relational mappings:&lt;br /&gt;&lt;/span&gt;For initial testing purposes, I applied my first relational mappings for the User-Profile class&lt;span style="font-weight: bold; font-style: italic;"&gt; &lt;/span&gt;&lt;span&gt;models. The two class models have a one-to-one relation, or simply explained: A User &lt;span style="font-style: italic;"&gt;has-one&lt;/span&gt; &lt;/span&gt;&lt;span&gt;Profile and a Profile &lt;span style="font-style: italic;"&gt;belongs-to&lt;/span&gt; a User.&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt; &lt;/span&gt;&lt;span&gt;For a technical explanation, a Profile model would contain the primary key constraint, which 'references' the User model. The relationship will be represented as a bi-directional relationship, for equal referencing by both models.&lt;br /&gt;Below is one way of creating the relational mappings through Hibernate. I could have also followed JPA standards and included some supportive Annotations, but that would eventually become too obstrusive (adding annotations) and more work (removing annotations) if we ever decide to use another ORM. Plus, using these xml configuration files is simple and easy to interpret.&lt;br /&gt;&lt;br /&gt;Defining the user.hbm.xml:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;hibernate-mapping package="org.hackystat.devcathlon.engine.user"&gt;&lt;br /&gt;&amp;lt;class name="User" table="ACCOUNT"&gt;&lt;br /&gt;&amp;lt;id name="id" column="USER_ID"&gt;&lt;br /&gt;&amp;lt;generator class="native"/&gt;&lt;br /&gt;&amp;lt;/id&gt;&lt;br /&gt;&amp;lt;property name="username" type="string"&gt;&lt;br /&gt;&amp;lt;column name="USERNAME"&lt;br /&gt;length="16"&lt;br /&gt;not-null="true"&lt;br /&gt;unique="true"/&gt;&lt;br /&gt;&amp;lt;/property&gt;&lt;br /&gt;&amp;lt;property name="email" type="string"&gt;&lt;br /&gt;&amp;lt;column name="EMAIL"&lt;br /&gt; length="20"&lt;br /&gt; not-null="true"&lt;br /&gt; unique="true"/&gt;&lt;br /&gt;&amp;lt;/property&gt;&lt;br /&gt;&amp;lt;one-to-one name="profile"/&gt;&lt;br /&gt;&amp;lt;property name="password" type="string"/&gt;&lt;br /&gt;&amp;lt;property name="firstName" type="string"/&gt;&lt;br /&gt;&amp;lt;property name="lastName" type="string"/&gt;&lt;br /&gt;&amp;lt;/class&gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Defining the profile.hbm.xml:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;hibernate-mapping package="org.hackystat.devcathlon.engine.profile"&gt;&lt;br /&gt;&amp;lt;class name="Profile" table="PROFILE"&gt;&lt;br /&gt;&amp;lt;id name="id" column="USER_ID"&gt;&lt;br /&gt;&amp;lt;generator class="foreign"&gt;&lt;br /&gt;&amp;lt;param name="property"&gt;user&lt;br /&gt;&amp;lt;/generator&gt;&lt;br /&gt;&amp;lt;/id&gt;&lt;br /&gt;&amp;lt;one-to-one name="user" constrained="true"/&gt;&lt;br /&gt;&amp;lt;set name="emailAddresses" table="PROFILE_EMAIL_ADDR"&gt;&lt;br /&gt;&amp;lt;key column="PROFILE_ID"/&gt;&lt;br /&gt;&amp;lt;element type="string" column="EMAIL_ADDR"/&gt;&lt;br /&gt;&amp;lt;/set&gt;&lt;br /&gt;&amp;lt;property name="screenName" type="string"/&gt;&lt;br /&gt;&amp;lt;property name="firstName" type="string"/&gt;&lt;br /&gt;&amp;lt;property name="lastName" type="string"/&gt;&lt;br /&gt;&amp;lt;property name="bioInfo" type="text"/&gt;&lt;br /&gt;&amp;lt;property name="gender" type="string"/&gt;&lt;br /&gt;&amp;lt;property name="avatar" type="string"/&gt;&lt;br /&gt;&amp;lt;/class&gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Applying the db store:&lt;br /&gt;&lt;/span&gt;Since Devcathlon's folder architecture is quite organized, and well thought out for future implementations of a database in mind. It was almost an effortless job on my part, considering that all I needed to do was send a create, read/load, update or delete to Derby's database. Each CRUD function was beautifully built and implemented within each entity's engine manager. So rather than storing everything in the Devcathlon session store, everything gets applied to Hibernate's SessionFactory. Below is a usage template for applying this SessionFactory:&lt;br /&gt;&lt;pre&gt;[User | Profile | Team | Match]Manager class:&lt;br /&gt;public function foo() {&lt;br /&gt;...&lt;br /&gt;Session session = HibernateUtil.getSessionFactory();&lt;br /&gt;session.beginTransaction();&lt;br /&gt;// regular java program logic, here&lt;br /&gt;// create the query to communicate with our database.&lt;br /&gt;session.createQuery("..."); //DML statements&lt;br /&gt;session.getTransaction().commit();&lt;br /&gt;...&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Running JUnit tests.&lt;/span&gt;&lt;br /&gt;I ran into some issues recently after running JUnit tests with my implementation, caused a SensorBaseClient timeout 1001 error. The error only occurs while running 'testNoData' for the very first test Event implementation (TestBestCoverage). It's not an intermittent issue, rather I know exactly where it's bombing out. However, I couldn't understand why the SensorBaseClient would timeout after my committed SQL transactions. The transaction that seems to be causing the problem resides in deleting Hackystat-Devcathlon test users defined in the unit test. It might have something to do with deleting a non-existing row and returning an unhandled Warning from Derby. Anyhow, I'll try to dig something up from the db log files and hopefully resolve this situation soon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Code:&lt;/span&gt;&lt;br /&gt;All source code changes for this milestone can be found, &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/source/list"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The code distribution for this implementation can be retrieved with SVN. This distribution is a branch of the current trunk distribution, which will be merged onto later.&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;svn checkout \&lt;br /&gt;&lt;strong&gt;&lt;em&gt;https&lt;/em&gt;&lt;/strong&gt;://hackystat-ui-devcathlon.googlecode.com/svn/branches/&lt;/tt&gt;&lt;span style="font-size:100%;"&gt;devcathlon-derbydb&lt;/span&gt; \&lt;br /&gt;&lt;tt&gt; hackystat-ui-devcathlon-derbydb --username &amp;lt;your-user-name&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;pre&gt;&lt;tt&gt;svn checkout \&lt;br /&gt;&lt;strong&gt;&lt;em&gt;http&lt;/em&gt;&lt;/strong&gt;://hackystat-ui-devcathlon.googlecode.com/svn/branches/&lt;/tt&gt;&lt;span style="font-size:100%;"&gt;devcathlon-derbydb&lt;/span&gt; \&lt;br /&gt;&lt;tt&gt; hackystat-ui-devcathlon-derbydb&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Plans...&lt;br /&gt;&lt;/span&gt;Finish building database schema and get started on UI improvements. Here are some thoughts on UI improvements:&lt;br /&gt;- Search query for User-profiles, teams and matches (browse pages)&lt;br /&gt;- Add a 'challenge' button for each opposing team profile page. This button will trigger an appendTeam method for appending teams for a new match. The user then navigates over to the Match page to see 'pending' match creations with all teams selected from visiting each team profile page. A user is limited to one pending list per session, and will be able to either accept the new pending match creation, or discard it for an entirely new form.&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/2534024747783979675-1274297547699293801?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/1274297547699293801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=1274297547699293801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1274297547699293801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1274297547699293801'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/06/gsoc-derby-race-to-finish.html' title='[GSoC] Derby race to the finish...'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-6834005223515364222</id><published>2009-06-07T13:55:00.000-07:00</published><updated>2009-06-09T17:06:36.204-07:00</updated><title type='text'>[GSoC09] Further DB Investigations and Vision updates</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Purpose&lt;/span&gt;&lt;br /&gt;This entry will be a brief progress report about what I've done thus far. Currently, I have no new discoveries except for coming to terms with using some kind of database.  I've also put out a wiki document for Devcathlon's vision, &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/wiki/VisionDocument"&gt;here&lt;/a&gt; (in progress).&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Thinking about what's best...&lt;/span&gt;&lt;br /&gt;Dur&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;g the past week I did some further &lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;vestigations and decided to revisit Derby's RDBMS. A comment from my last post&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;g, by Aust&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt; Ito made me realize the potential flaw to us&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;g a non-SQL embedded database. Consider&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;g the long-term effects of us&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;g a non-SQL DB would likely attribute to less flexibility and portability of a DB system. Especially if future developers of Devcathlon decide on port&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;g its DB to another enterprise DB, this could be a very pa&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;stak&lt;span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;in&lt;/span&gt;g and undocumented process. Austin also mentioned about using an ORM, and I might also consider implementing Hibernate. I've been doing a lot of investigative work (mostly reading) on the topic of ORM's and so far I've noted on some benefits. By definition an object/relational mapping supports full object modeling, including the composition, inheritance, polymorphism and peristence. ORM's, like Hibernate are totally transparent (persistent layer), since ordinary classes do not require any special base class or interface implementations. Its also vendor independent, because it abstracts the underlying SQL database and similar SQL dialects out of the application. Although capabilities of a database may differ between systems, you can expect building a more cross-platform application using ORM.&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Plans for this week...&lt;/span&gt;&lt;br /&gt;Finish Vision document to include technical review and goals for Devcathlon v2.0.&lt;br /&gt;Continue implementing Derby DB and read up on Hibernate. Hibernate and ORM's itself is still a new topic for me, and I'll be interested to hear about any other comments that attribute to using this persistence framework with Derby DB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-6834005223515364222?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/6834005223515364222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=6834005223515364222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6834005223515364222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6834005223515364222'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/06/gsoc09-further-db-investigations-and.html' title='[GSoC09] Further DB Investigations and Vision updates'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-7475656779596177367</id><published>2009-05-21T02:12:00.001-07:00</published><updated>2009-06-02T19:29:47.478-07:00</updated><title type='text'>[GSoC09] DB tryouts (Derby &amp; BDB)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise&lt;/span&gt;&lt;br /&gt;In this entry, I'll describe my experience in installing, configuring and applying of both database management systems, including &lt;a href="http://db.apache.org/derby/"&gt;Apache Derby&lt;/a&gt; and Oracle (SleepyCat) &lt;a href="http://www.oracle.com/technology/products/berkeley-db/je/index.html"&gt;Berkeley DB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background Info&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Derby&lt;br /&gt;&lt;/span&gt;Derby is one of Apache's many successful entities known in the community of Java developers. It is a Java-based, embedded, JDBC driven SQL database. It also includes a client and Network Database server for client/server implementations.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Berkeley DB (BDB)&lt;/span&gt;&lt;br /&gt;SleepyCat's Berkeley DB is Oracle's attempt at a fully embedded non-SQL database, including no ad hoc queries, but many quick indexing remedies for querying records. It's targeted for application environments that want to quickly implement an object-relational database management system with very little footprint and less dependent on DB administration. It has everything that you would expect of a database system and promises optimal solutions to retrieval and transactional operations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Installation &amp;amp; Configuration&lt;/span&gt;&lt;br /&gt;*Both platforms require some form of JRE ~v1.5 or above.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Derby&lt;br /&gt;&lt;/span&gt;The retrieval and installation process of Derby was easy, simply download the tar/zip file, e&lt;span&gt;xtract it to the location you want, then update your environment variables to include DERBY_HOME, and add a path to the executables (DERBY_HOME/bin).&lt;span style="font-weight: bold;"&gt; &lt;a href="http://db.apache.org/derby/docs/dev/getstart/"&gt;&lt;span style="font-style: italic;"&gt;more&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;BDB&lt;br /&gt;&lt;/span&gt;&lt;span&gt;The download and installation process of BDB wasn't difficult &lt;/span&gt;&lt;span&gt;either. It only required &lt;/span&gt;&lt;span&gt;an additional environment variable (JE_HOME) pointing to the path of the downloaded package.&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.oracle.com/technology/documentation/berkeley-db/je/installation.html"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;more&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Comparison&lt;br /&gt;Derby&lt;br /&gt;&lt;/span&gt;Derby provides an internal interactive SQL scripting tool, called 'ij'&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;used &lt;/span&gt;&lt;span&gt;to connect to an existing database, or create a new database. Coding in Derby is very SQL scripting heavy and it requires a planned out schema. Loading and connecting to Derby DB is simple, you just load the appropriate embedded or client driver (depending on your application). You can also pass ad hoc queries, basic SQL statements for creating, updating, or deleting (all fundamental CRUD). &lt;/span&gt;Derby is a great RDBMS for settings that require ad hoc queries, and for optimal access to SQL databases.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;BDB&lt;br /&gt;&lt;/span&gt;&lt;span&gt;BDB is a whole different approach, in that it implements a Java DB without the need of SQL. This object-relational database approach offers more direct interactions of object based models. Actually BDB is stored by object values, rather than by traditional object reference&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;which models similar benefits from EJB persistance APIs.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;Programming in BDB is quite intuitive and requires that you have strong knowledge in manipulating Java objects via understanding of Java APIs, especially with the Java Collections framework (since this applies to 'Cursor ' iterations through records stored in BDB). I have to agree, in theory with BDB's storage and indexing approach, since it does provide a low cache way of retrieving raw data and instantiating objects seem seamless.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;I wonder how BDB&lt;span&gt; memory caching features perform once it goes against more storage data input. If I do decide to use BDB, I hope that I won't need to roll out my own solution for tuning the cache. Of course, this over bloating of memory depends solely with the complexity of the application and my usage of BDB. After coding a little in BDB, I also noticed some similarities to Hibernate since they have similar implementations using EJB and Java's Persistence APIs.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;Although BDB isn't a standard with most developers, since its approach to an embedded database requires no SQL seems &lt;/span&gt;&lt;span&gt;unorthodox; I feel that its structural aspect and its targeted purpose of increasing performance in object relational coding feels much more natural.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;The Verdict&lt;/span&gt;&lt;br /&gt;At this point in time, I'm falling towards using BDB since the solution is quite simple and unobtrusive to the network environment setting. It will require less configuration on the administrative side, yet it gives more control over the configuration directly through the application itself. The other reason is that the class file structure is already in good standing for a BDB implementation. There will be no need for creating a client driver connection or bringing up a Network Server, as I previously planned on doing by using Derby.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The 'Vision' Document (unofficial)&lt;br /&gt;&lt;/span&gt;The &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/wiki/VisionDocument"&gt;vision&lt;/a&gt; hasn't changed much since my first entry about Devcathlon. We are still pushing for a workable application that can be used by developers as an interactive assessment tool to better software project environments. At the moment no changes have been made to the current code base, rather more planning and testing have occured locally for assurance. &lt;/span&gt;Right now, deciding on a preferable DB is the question at hand. Considering my research and tests, I would recomend using BDB as a possible DB implementation for Devcathlon. The DB implementation is pretty much a way of incorporating a persistent back-end for Devcathlon. I've yet to apply any specifics on future improvements, but I feel the need to get most of the targeted functions to work first in Devcathlon v1.0.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Plans&lt;br /&gt;&lt;/span&gt;I'll need some time to develop a 'spike solution' of BDB with our current implementation of Devcathlon. This shouldn't be difficult considering that most of our models built in Wicket for Devcathlon are neatly separate object entities, so it makes for a perfect setting for using BDB.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;I'll also be revising my vision document, since little has been put into &lt;span&gt;making this a 'viral' record.&lt;/span&gt;&lt;br /&gt;Also, since I'll be revising the application many times over, the use of a review (summary) at this time will not be committed until after a DB solution for Devcathlon is released.&lt;br /&gt;*Notes on development environment: Since the project code base is housed via Google's Project Host, I've decided that we should create a branch for our DB solution. In addition to our branch, we should have a live development box that mimicks a production environment for shared consistency and remote testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-7475656779596177367?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/7475656779596177367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=7475656779596177367' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7475656779596177367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7475656779596177367'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/05/gsoc09-db-tryouts-derby-vs-bdb.html' title='[GSoC09] DB tryouts (Derby &amp; BDB)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-5110116673805771266</id><published>2009-05-21T02:12:00.000-07:00</published><updated>2009-05-25T11:52:07.613-07:00</updated><title type='text'>[GSoC09-Devcathlon] Tentative Plans</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Welcome to GSoC&lt;/span&gt;&lt;br /&gt;Hello, GSoC!&lt;br /&gt;I'm glad to announce my induction to Google's 2009 Summer of Code. This is a belated entry about my pre-dated acceptance back in April. I've yet to talk much about it, but it's never too late. This series will be targeted for people interested in the progress of Devcathlon and my personal experiences along the way. Each title in this series will be prefixed with "[GSoC09...]" as a convenient indication to you, myself and to my fellow, GSoC mentors. In this entry I'll refresh about the project Devcathlon and outline my plans for this summer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;About Devcathlon&lt;/span&gt;&lt;br /&gt;Devcathlon is a web application to help better software engineering practices and to assist in improving project management settings. &lt;span&gt;&lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/"&gt;&lt;i&gt;Devcathlon&lt;/i&gt;&lt;/a&gt; was a three month project started by 8 students and 1 professor from the University of Hawaii at Manoa. This project is intended to simulate a software engineering environment along with the benefits of a game. If you're looking for a place to compete with other software development teams, or to see where you stand as a developer, then &lt;i&gt;Devcathlon&lt;/i&gt; is the place to be. The motivation behind this project was spawned from the possibility of creating a fun and easy to use game, targeted towards software developers who feel the need for a competitive edge or want to be recognized by their community of peers. Besides having to see where you rank amongst your colleagues, this application also looks to help improve the ethics and recommended practices of an ideal software development environment. &lt;i&gt;Devcathlon&lt;/i&gt; encourages continuous development procedures that should come second nature to most developers, such as commit early and often, separate but equal ownership, and test before you drive.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Below are my summer plans and related responsibilities for this year's GSoC.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summer outline&lt;/span&gt;&lt;br /&gt;1. Fix any discrepancies on the Devcathlon v1.0 release.&lt;br /&gt;2. Design Database schema&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Build relational model using a DBMS (MySQL, SQL Server, or the critically acclaimed Apache's Derby)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; 3. Future enhancements for Devcathlon v2.0.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Integrate Wicket with Spring's application framework and Java-based persistent object-relational model framework, called Hibernate. Apply questions about using such a framework, like What is AOP? DAO? DI &amp;amp; IoC? How does applying a multi-tiered or layered application benefit from traditional coding styles in its robustness, simplicity, etc.?&lt;/li&gt;&lt;/ul&gt;So far, I've done some investigations about &lt;a href="http://db.apache.org/derby/"&gt;Apache's Derby&lt;/a&gt; and played around with it during my spare time. In my next posting I'll describe my experiences using Derby as a possible (embedded) persistent database for a simple Wicket application. Next week I'll attempt at designing the database schema for Devcathlon along with resolving any problems with Devcathlon v1.0. Hopefully, I'll also put out an official Devcathlon code review sometime during the course of the week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-5110116673805771266?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/5110116673805771266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=5110116673805771266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5110116673805771266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5110116673805771266'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/05/gsoc09-wicket-with-spring-hibernate.html' title='[GSoC09-Devcathlon] Tentative Plans'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-8576685686084806641</id><published>2009-05-15T00:34:00.000-07:00</published><updated>2009-05-16T23:45:55.675-07:00</updated><title type='text'>[ICS 499] It's Only the Beginning</title><content type='html'>This semester was surely an exciting roller coaster ride full of many bent turns, unexpected loops, and some worthwhile air time. The goal of this project was to gain minimal insight into electronic health record systems (EHR), and to explore the possibilities of developing an open source component to enable greater extensibility and interoperability for development platforms. It turned out that a big competitor in the medical health record industry, Medsphere had developed just that tool for creating a Java-based linker solution, called OVID (OpenVistA Interface Domain). The OVID project is still very young, yet they've pushed through great lengths recently to have it on a fully open repository. Medsphere also released a front-end patient record dashboard along with OVID, which was built using OpenLaszlo, called lzVistA. After realizing the potential of building such a dynamic front-end GUI using such expressive component based and XML driven-development of RIA's, I started looking for alternative RIA's that could help shape my own patient dashboard. This began the exploration of finding the right RIA that I'm most comfortable with. After giving OpenLaszlo a try, I thought to myself, "Yes, I'm impressed." Then I realized the hassle of not having a dedicated IDE for editing and building OpenLaszlo applications. This led me back to the road, where I would eventually reunite with my all time favorite Flash platform. It's been a long time since the Macromedia days, and Adobe's done a great job in marketing the trend of Flash now being used on practically every browser. Adobe is also well caught up with the open source community, since they recently released a full open source version of their XML/MXML development language kit, called Flex. Flex serves as an innovative way of producing web-based applications in a much more rich and multi-platform environment. In my recent discoveries, I mentioned that Flex provides many different ways to capture and retrieve data via data services, such as web services, HTTP and remote objects (including server-based Java objects). Flex is also accompanied by an IDE built on Eclipse, called Flex Builder. This makes for an easy migration, since I'm able to switch between developing environments with ease.&lt;br /&gt;It's interesting as to how large the scope of the project has become since the introduction of OVID. I'm now hoping to build a web-based EHR client using Flex and Java's back-end server connection to OpenVistA via OVID. I'm glad to say that this has been a progressive project, including the immense time spent on getting used to Flex's component-based development, and refreshing my skills in the new ActionScript v3.0. The experience was well worth it, but I've yet to close this road permanently. I'm simply putting this project on hold in promises that I'll be able to continue down this path with more added time and consistency. I'm still actively supportive in the project and I've taken the necessary steps in order to keep up-to-date. Since OVID isn't a perfected system yet, I hope to give my helping hands on their development team. This would mean that MUMPS is back to haunt me again, but at least I'll have Java to accompany me along the way. As far as this semester goes, I'm probably more satisfied with what I've learned rather than what I've produced. Along with understanding how to self-manage myself, I've also learned to become more engaging as a programmer. This has opened me up to the possibilities of how many things still need to be invented, or needs improvement in this world. I'm thrilled to know that I'm stuck somewhere in between having thought of something with the right resources to do it, and realizing the proximity of a real-life product.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-8576685686084806641?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/8576685686084806641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=8576685686084806641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8576685686084806641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8576685686084806641'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/05/ics-499-closure.html' title='[ICS 499] It&apos;s Only the Beginning'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-4360319969933981266</id><published>2009-05-10T23:09:00.000-07:00</published><updated>2009-05-13T14:51:18.463-07:00</updated><title type='text'>Devcathlon Evaluation</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Devcathlon has been a three month project intended to simulate a software engineering environment in hopes to improve development team practices, and to promote overall project health. In this entry, I'll evaluate the application through my personal perspective as a developer, along with the evaluations of outside testers. I'll also mention about my experiences in building this project, and the future of this application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A programmer's perspective:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;The journey through markup...&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Most of my development time was spent on building the profile section of Devcathlon. It wasn't difficult, but there's still room for lots of improvement. I kept this first version of Devcathlon's profile page simple, in order to focus on the teams, matches and scoreboard pages. Devcathlon underwent through many physical and functional changes since its first conceptual designs. We started out with basic HTML mock-ups which looked and felt very web 2.0-ish; considering that it had some Javascript, some signs of pagination and an array of CSS layouts. By separating ourselves into three separate teams of three, we were able to generate some very inspirational designs and structures that would eventually be inherited into the "final" product. Although some design elements were put away as future enhancements, due to being labeled as aesthetic gains rather than functional gains, we did provide, in this version, an intuitive, yet simple user experience. The gains of taking this conservative approach would rather benefit ourselves in the long-run, since we built a strong foundation of our application and left plenty of room for advance UI's to take place later. Of course, we've only scratch the surface of Wicket's abilities to render some "pretty," and dynamic markup, but I'll see to it in our future implementation that we have an eye-candy application. At this point, I'm very pleased with what we have, as far as the look and feel goes. The application has a conformed look and layout; we made good use of our CSS to standardize our information in reusable "panels," and we also preserved colors and fonts similar to Hackystat's UI. I'm willing to put energy during this summer to make improvements in this area by incorporating more AJAX-y alternatives to necessary parts of the web application.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Functionality in design...&lt;/span&gt;&lt;br /&gt;Below is a list of my likes and dislikes, and some possible way of improving each portion of the web application. I'll also mention the difficulties and challenges in making these sections possible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Front page review:&lt;/span&gt;&lt;object width="800" height="600"&gt;&lt;br /&gt;&lt;embed src="http://sites.google.com/site/anthonymdu/Home/downloads/devcathlon-frontpage-tour-2009-05-13.swf?attredirects=0" width="800" height="500"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;The front page contains a basic login and password form, along with a preview version of our scoreboard. Although, this idea of putting the scoreboard on the front page came late in the game, we found it useful to help advertise the current status of our application with regards to providing evidence of user traffic and ratings. The front-page version of the scoreboard is not all that different from the actual scoreboard, except that some links are not featured unless you have logged in with an account. The gray panels and use of reusable components makes the composition of this page very useful in context, by providing information on match events, teams events and individual player's scoring. A future improvement would be to provide a live scoring data provider that would emulate statistics on the fly through 5 minute increments or whenever it spots a new change in the system. This would be beneficial by reducing the number of whole-page refreshes and enhancing the user experience by providing a persistent way of retrieving data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Profile page review:&lt;/span&gt;&lt;object width="800" height="600"&gt;&lt;br /&gt;&lt;embed src="http://sites.google.com/site/anthonymdu/Home/downloads/devcathlon-profile-tour-2009-05-11.swf?attredirects=0" width="800" height="500"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;span&gt;The profile page went through minimal amounts of change due to its limited usages other than finding out more about the player participating in the game. Although, the profile page makes for very little use, I've come to find that there are many ways of approaching this section. I looked around on mostly social networking sites, including TechHui, Facebook and Twitter to gain some inspiration and possible commonalities. I narrowed down some details of a user profile to only include, the user's first and last name, location, contact number, email address and biographical information. The only required field is the email address, since it serves the purpose of your login name and our source of sending out game match invitations and updates. The main profile page also replicates information regarding a listing of user's team affiliates and current team events. The profile page successfully makes use of the qualified standard gray panels, and a simple-to-read 3-column layout. The profile section also includes "manage" and "browse" sub-pages.  The Profile Manage section gives the player the ability to make changes to their profile information. The only ability that it lacks at this point is a way to add additional social networking aliases, modifiy email address, and the choice of choosing a different profile avatar. The addition of other social networking aliases is as simple as creating a textfield. At this point, there is no "right" way of changing a user's email address since the user's account information is dependent on it as an identifier in the system. Hopefully in future enhancements, we'll incorporate an interface to attribute to this feature of changing a user's email, and getting a email notification of the account being modified. Of course to preserve the integrity of our system, we'll need to require a primary email address to send that account modification. Another neat enhancement would be to enable a user the ability to modify their avatar on the system by providing a local image upload. This would require a persistent storage location on our public servers and a limited file size.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Team page review:&lt;/span&gt;&lt;object width="800" height="600"&gt;&lt;br /&gt;&lt;embed src="http://sites.google.com/site/anthonymdu/Home/downloads/devcathlon-team-tour-2009-05-11.swf?attredirects=0" width="800" height="500"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;The team management section is in itself very functional and simple to use. The team creation process is straightforward, users will not have very much difficultly in getting the hang of things here. I could only point out certain enhancements rather than any noticeable flaws in this section. Although, the co-creator of this section did indicate in the issues listing about a potential "&lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/issues/detail?id=211&amp;amp;colspec=ID%20Type%20Status%20Component%20Owner%20Summary"&gt;weakness&lt;/a&gt;" to the user-to-team invitations handling. This may be a confounding factor that needs to be addressed in the next implementation stages of Devcathlon, but as for now, it sits deep under the covers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Match page review:&lt;/span&gt;&lt;object width="800" height="600"&gt;&lt;br /&gt;&lt;embed src="http://sites.google.com/site/anthonymdu/Home/downloads/devcathlon-match-tour-2009-05-11.swf?attredirects=0" width="800" height="500"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;The match management section gives a listing of all involving team matches. It gives you the ability to create, update and destroy matches. The only disadvantage is through the ease of finding an existing match. There is no mechanism to browse for matches, but it would help to supply a way to immediately find a match rather than scrolling through a large column listing. Maybe we can incorporate similar pages implemented by the user profile and team management sections. This would require two additional pages, called "Match Browse" and "Match Profile." The match browse page will include a table listing all matches, and on each row a link to its respected match profile page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scoreboard page review:&lt;/span&gt;&lt;object width="800" height="600"&gt;&lt;br /&gt;&lt;embed src="http://sites.google.com/site/anthonymdu/Home/downloads/devcathlon-scoreboard-tour-2009-05-12.swf?attredirects=0" width="800" height="500"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;The scoreboard page includes a listing of all matches, team line-ups and their respective members, match events, comments, and top developers for that match. This page did a good job of portaying that information in a clear way. My only problem is that it would be difficult to display multiple team match line-ups, where matches can consist of more than one participating team. The Hall of Fame page is included as a scoreboard sub-page that gives an overview listing of wins, losses, points accumulated per match, and most valuable players. I only wished that this page had more visual references rather than just plain-old text and links.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Top 5 lessons learned:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Time management &lt;/span&gt;&lt;span&gt;- Time is the quintessential factor in everyone's life. I found it difficult in many cases, but had to ground myself to accepting the fact that I do have issues in this area. I have learned through this experience to be patient and better plan out ahead of what needs to get done. This holds a large part in my leadership skills too, since managing other people calls for good planning and time management skills.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Leadership skills&lt;/span&gt;&lt;span&gt; - I think that I've become a better person from being given the title of a "leader." In many ways, it has improved my outlook of managing a small team in such a large setting. At first I was somewhat doubtful that I could accomplish it, but I eventual grew out of the fear and simply started to care. I started to care for the project and its respected team members. This helped bring me closer to the individuals in my team as well as other project members.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Control &lt;/span&gt;&lt;span&gt;- I think that controlling that programmer's ego is a must in a large project setting. It's very different from critiquing your own work as oppose to being able to endure criticism from others. I've learned to respect others opinions to find a common solution. Eventually once you've set aside your ego, you'll notice a difference in the mood that you bring to the atmosphere. I learned to control that atmosphere through just being lightly assertive, but straight to the point.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Collaboration&lt;/span&gt;&lt;span&gt; - Collaborating with my team members weren't very difficult, but it had some confounding factors such as its frequency and effectiveness. The effective route is to meet as often as possible. It's very simply stated, but it turned out to work in our situation with a group of eight people. We also incorporated pair programming as a way to keep each individual on their toes.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Forgive and forget &lt;/span&gt;&lt;span&gt;- Sometimes you just gotta forgive and forget. Its difficult already that this project posed a challenge for many of us, but adding to that tension could have led to some adverse effects. I'm glad that this group had that notion of forgiveness. It was quite evident during those milestones that just did not work out as we planned. We would rarely hold personal grudges towards another individual. It was sometimes nice to just talk about it rather than tuning out the whole problem.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Reflecting...&lt;/span&gt;&lt;br /&gt;Now, for some people, this is the time to put up their hardhats and salute to a good year of eventful meetings, to staying up late coding, and to enduring all those emails with the subject line starting with "[Devcathlon] ..." I'm not sure about others, but I'll sure be missing that feeling of being needed for a project and looking forward to just doing something the next day. This project brought in a mixed set of individuals with different skills and backgrounds, but with one common goal of making this project the best it could be. I could not have asked more from these group of highly talented people. Their dedication and hard work has paid off, and I hope that everyone takes something from this into their own personal endeavors in life. I know that I'll take this experience and be able to apply what I've learned into any setting. The time we sacrificed; those bloody hours at the keyboard; those late nights sipping on energy drinks, and those times when all you could think about was "Devcathlon" will now become a memory. Even as unfortunate as that may sound to a few, it has made a profound impact on what I see in a large team setting. The beginnings were difficult, but over time we progressed from novices to experts in our own way. This experience has challenged myself and others mentally and somewhat physically. This project has given me ways to express myself more freely than I usually do in any other class related setting. It has taught me to be ethical, respectful, resourceful and passionate about goals. It has also taught me to become a better person by encouraging me to open up to all sorts of people. I'll honestly miss that energy, and all those who made this project what it is today. I hope to find that same spark during my attempt at enhancing this project for this year's Google Summer of Code. I'm sorry that not all original members of the team will be participating, but I am grateful for their respectful input and support. Good luck to everyone, and thanks for all the hard work!&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/2534024747783979675-4360319969933981266?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/4360319969933981266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=4360319969933981266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4360319969933981266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4360319969933981266'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/05/devcathlon-evaluation.html' title='Devcathlon Evaluation'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-7293965142114397653</id><published>2009-05-01T17:27:00.001-07:00</published><updated>2009-05-12T01:56:53.808-07:00</updated><title type='text'>[ICS 499] Java + Flex Hybrid</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;In this blog entry, I'll discuss my experiences of hybridizing Java, Actionscript, and Flex into forming what could possibly be a perfect ingredient for success. Well not absolute success, since I will not be building anything in this entry, but it will leave you with some ideas that could work in your setting. I'll also mention the ease of migrating between Java and Actionscript, and give you some insight into the possible technologies that surround Flex.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contextual definitions:&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Flex&lt;/span&gt; - front-end client-server application&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Java&lt;/span&gt; - back-end object oriented language for building an enterprise server for channeling data&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Actionscript&lt;/span&gt; - object oriented and script-base language used to construct logic in controlling our Flex client application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Actionscript &amp;amp; Java:&lt;/span&gt;&lt;br /&gt;Actionscript is an object oriented, free form, functional language used to build logic into creating Flash rendered content. The language follows the standards of &lt;a href="http://en.wikipedia.org/wiki/ECMAScript"&gt;ECMAScript&lt;/a&gt; and recently, in version 3.0 has been enhanced to support &lt;a href="http://en.wikipedia.org/wiki/E4X"&gt;E4X&lt;/a&gt; for ease of processing XML.&lt;br /&gt;Java is an object oriented language that has been widely accepted for its cross-platform, and strong emphasis in creating server-side technologies.&lt;br /&gt;ActionScript 3 is different from Java when it comes to properties, dynamic behavior, and some                         very convenient aspects of functional programming. However, the move between Java to Actionscript was not all that difficult and it makes for a beneficial switch once you get the hang of things.&lt;br /&gt;If you need a quick comparison chart between Java &amp;amp; Actionscript, then check out &lt;a href="http://flexblog.faratasystems.com/?p=115"&gt;this&lt;/a&gt; posting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java &amp;amp; Flex:&lt;/span&gt;&lt;br /&gt;Java and Flex provides the perfect marriage between two things that just mix well. One, you have a strong server-side back-end and two, a simple, near real-time data rendering front-end with very high refresh rates on large data sets and almost 100% deployable on any browser.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How it all fits together?&lt;/span&gt;&lt;br /&gt;Figure 1.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://learn.adobe.com/wiki/download/attachments/5701661/FlexAndJava_sm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 575px; height: 425px;" src="http://learn.adobe.com/wiki/download/attachments/5701661/FlexAndJava_sm.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Figure 1: &lt;/span&gt;&lt;a style="font-style: italic;" href="http://learn.adobe.com/wiki/display/Flex/Flex+and+Java"&gt;http://learn.adobe.com/wiki/display/Flex/Flex+and+Java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A successful marriage calls for good communication:&lt;/span&gt;&lt;br /&gt;Flex's ability to communicate with a Java EE back-end using HTTP or SOAP-based Web services is highly useful, but you're not                         limited to those communication approaches.&lt;br /&gt;Adobe provides an open source alternative, called &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/"&gt;Blaze DS&lt;/a&gt; -- a server based Java remoting and web messaging technology that enables developers to easily connect to back-end distributed data and push data in real-time to Flex and Adobe's Air application front-ends. BlazeDS lets you use &lt;a href="http://www.javaworld.com/jw-02-2000/jw-02-jmsxml.html"&gt;Java Messaging Service JMS&lt;/a&gt; for communicating through XML-based transactions and allows you to use &lt;a href="http://www.javaworld.com/community/node/2181"&gt;object remoting&lt;/a&gt; with Java. BlazeDS also adds potential performance benefits because it uses the binary AMF3 format for faster communication                         than is normally experienced with XML.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;Conclusion:&lt;br /&gt;&lt;/span&gt;Sorry to leave you with such limited content. I'm just excited now to test out the logic and theory, in order to get one step closer into hybridizing Java with Flex.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;In my next posting, I'll be concluding my research into a report that summarizes what I've accomplished and my experiences during the course of this study.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Resources:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-02-2009/jw-02-actionscript1.html"&gt;Java &amp;amp; Actionscript 3 (Part 1)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-03-2009/jw-03-actionscript2.html?page=1"&gt;Java &amp;amp; Actionscript 3 (Part 2)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-01-2009/jw-01-javaee-flex-1.html"&gt;Java &amp;amp; Flex Integration (Part 1)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-02-2009/jw-02-javaee-flex-2.html"&gt;Java &amp;amp; Flex Integration (Part 2)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-7293965142114397653?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/7293965142114397653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=7293965142114397653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7293965142114397653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7293965142114397653'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/05/ics-499-flex-comm.html' title='[ICS 499] Java + Flex Hybrid'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-6302170078498972533</id><published>2009-04-27T15:31:00.000-07:00</published><updated>2009-05-01T17:05:35.616-07:00</updated><title type='text'>[ICS 499] My tour de Flex!</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;Considering the commotion about OpenLaszlo and all things RIA, I decided this week to also speak about my experiences with trying out Flex 3. Flex is an open source Flash development framework designed from the ground up to facilitate the creation of Rich Internet Applications (RIAs) on the Flash platform (Flash 9). The Flex 3 SDK framework utilizes a mixture of a custom XML format called "MXML" and the OOP language, called ActionScript (3). ActionScript 3 is required in the recent release of the Flex 3 platform, as well as the Flash 9 platform.&lt;br /&gt;In this blog entry I'll walk through my experiences developing in Flex by building a fun looking authentication application form.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tools and requirements:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java Runtime Environment&lt;/li&gt;&lt;li&gt;Flex 3 SDK&lt;/li&gt;&lt;li&gt;Flex Builder (IDE) - The Eclipse-based IDE for the creation of Flash RIAs. Not only does the presence of an IDE significantly aid in the creation of Flex applications, but Flex Builder also has a design view and a code view, each with its own benefits, further improving ease-of-use and application development workflow. The only downfall is a hefty price after the 60-day trial of using the product. Of course you could either pay the fee, or switch to a light weight editor, such as vim, emacs, textpad, notepad, etc..&lt;/li&gt;&lt;li&gt;Flash 9&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Optional Tools and Mentions:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Flex Charting: Aset of charting and graphing components, capable of generating Excel-style data representations, to aid in the visualization of data through Flex RIAs. &lt;/li&gt;&lt;li&gt;Live Cycle Data Services (LCDS): Aserver-side application that expedites the speed of data synchronization between your middleware and your Flex application SWF (formerly, Flex Data Services). &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;All of the latest Flex related downloads can be found &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.adobe.com/products/flex/flexdownloads/"&gt;here&lt;/a&gt;&lt;span style="font-style: italic;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;So instead of starting out with the usual "Hello World!" application, I'll just start diving into the fun stuff and we'll go from there. I'll first build a simple version of the Login form, and then we'll apply Flex magic to create a more exciting user experience. All elements below were built using Flex Builder's. I would recommend snagging a copy for yourself, but you can always resort to using any text-editor of your choosing.&lt;br /&gt;&lt;br /&gt;Applying the basic Flex Framework:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;LogMeIn.mxml:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;This code is the basic container for all your components and the basis of any Flex application. Flex Builder should also generate two important files in order to make this internet application work: first the embedded &lt;span style="font-style: italic;"&gt;LogMeIn.swf&lt;/span&gt; and second, the &lt;span style="font-style: italic;"&gt;LogMeIn.html&lt;/span&gt; itself. Run this in your favorite browser (Firefox for me) and you should see a blue-green colored background that fills the entire page.&lt;br /&gt;&lt;br /&gt;Building the basic Login in form:&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" &lt;span style="font-weight: bold;"&gt;horizontalAlign="center" verticalAlign="middle"&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  &amp;lt;mx:Panel id="loginPanel" width="309" height="182" title="Login Form" horizontalAlign="center" verticalAlign="middle"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    &amp;lt;mx:Form verticalCenter="true"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &amp;lt;mx:FormItem required="true" label="Username" width="215"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        &amp;lt;mx:TextInput id="loginTI"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &amp;lt;/mx:FormItem&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &amp;lt;mx:FormItem required="true" label="Password" width="215"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        &amp;lt;mx:TextInput id="passwordTI" displayAsPassword="true"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &amp;lt;/mx:FormItem&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &amp;lt;mx:FormItem horizontalAlign="right" width="215"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        &amp;lt;mx:Button id="loginButton" label="Login" click=""/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      &amp;lt;/mx:FormItem&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    &amp;lt;/mx:Form&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  &amp;lt;/mx:Panel&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 370px; height: 261px;" src="http://sites.google.com/site/anthonymdu/Home/downloads/loginform00.png?attredirects=0" alt="" border="0" /&gt;Here, we have a basic form with a submit button contained within a labeled panel. It's starting to look good so far, but nothing exactly works yet. Lets add some functionality to this component.&lt;br /&gt;&lt;br /&gt;Adding some authentication logic:&lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;  &amp;lt;![CDATA[&lt;br /&gt;    import mx.controls.Alert;&lt;br /&gt;&lt;br /&gt;    private function login():void {&lt;br /&gt;      if (loginTI.text == "admin" &amp;amp;&amp;amp; passwordTI.text == "admin") {&lt;br /&gt;        Alert.show("Hurray!", "Login Message");&lt;br /&gt;      }&lt;br /&gt;      else {&lt;br /&gt;        Alert.show("Incorrect login and password combination.", "Login Error");&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&lt;/pre&gt;For an incorrect login info...&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 349px; height: 222px;" src="http://sites.google.com/site/anthonymdu/Home/downloads/loginform01.png?attredirects=0" alt="" border="0" /&gt;And a successful login message...&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 349px; height: 213px;" src="http://sites.google.com/site/anthonymdu/Home/downloads/loginform02.png?attredirects=0" alt="" border="0" /&gt;Now that sure is one sexy Alert message, much better than those generated by Javascript's alert prompts. I'm somewhat impressed with this so far, but the interface can be improved to test out the power of Flex's physics engine. We can make the UI much more intuitive and surprisingly different from anything else. From here on, I'll be mimicking code produced by &lt;a href="http://dougmccune.com/blog/"&gt;Doug Mccune&lt;/a&gt;, a fellow Flex developer.&lt;br /&gt;The rest of the code is beyond the scope of this blog entry and will be featured as a download. I replaced the original form components within the panel to what was indicated in Doug's demo. Also the modified text input labels are enclosed in a "PhysicsContainer" class in order to provide that feeling of falling and manipulable objects.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;panel ... &amp;gt;&lt;br /&gt;  &amp;lt;containers:PhysicsContainer id="canvas" width="100%" height="100%"&amp;gt;&lt;br /&gt;  &amp;lt;!-- Original login form --&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;  &amp;lt;flexlib:PromptingTextInput id="loginTI" prompt="username" x="50" y="35"/&amp;gt;&lt;br /&gt;  &amp;lt;flexlib:PromptingTextInput id="passwordTI" prompt="password" x="50" y="75" displayAsPassword="true"/&amp;gt;&lt;br /&gt;  &amp;lt;mx:Button label="Login" x="158" y="115" click="login()"  /&amp;gt;&lt;br /&gt;  &amp;lt;/containers:PhysicsContainer&amp;gt;&lt;br /&gt;&amp;lt;/panel&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 337px; height: 213px;" src="http://sites.google.com/site/anthonymdu/Home/downloads/loginform03.png?attredirects=0" alt="" border="0" /&gt;&lt;br /&gt;When a person attempts to login with the wrong credentials, then the components would fall from their initial position due to some applied physics. These components are also draggable objects that can be manipulated and oriented however way you want.&lt;br /&gt;&lt;br /&gt;Overall, these RIA platforms, including Flex have proven to be the next step in building a more interactive and responsive application for simple or complicated web interfaces. Flex, for instance, is an open source framework. This means that Adobe builds a bunch of "stuff" into the structure, which you can utilize in your applications seemlessly. What makes Flex so special is that it makes things incredibly easy to assemble through its component based framework—far, far easier than authoring custom applications in the Flash authoring tools presented in Adobe's Flash Professional. Flex comes with these essential UI components (Text input, labels, buttons, etc.), as well as additional ones to assist in laying out content. Flex also makes it incredibly simple to create your own custom components out of these components and has robust CSS support, making it quite easy to style your applications and even consume the same CSS files that you might use elsewhere on your website. And of course, it's easily portable. Just see for your self below.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;This week's plans...&lt;/span&gt;&lt;br /&gt;Flex is on my good side this week, so I'll be spending some time testing a prototype interface with OVID's VistA connector. My next blog entry will further expose the technology that Flex has to offer, with regards to its support for many data source providers, including HTTPService, WebServices and Remote Objects.&lt;br /&gt;&lt;br /&gt;Just for fun, here's the embedded app for you to play with. It sure looks like another Flash application, but it's built using Flex!&lt;br /&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" id="LogMeIn" align="middle" height="100%" width="100%"&gt;&lt;br /&gt;&lt;param name="movie" value="LogMeIn.swf"&gt; &lt;param name="quality" value="high"&gt; &lt;param name="bgcolor" value="#333399"&gt; &lt;embed src="http://4477052289606474746-a-1802744773732722657-s-sites.googlegroups.com/site/anthonymdu/Home/downloads/LogMeIn.swf?attredirects=1&amp;amp;auth=ANoY7co1DT_Z2jAl6wp0C9mq-Coojg3WLfWmKgffu-8Cxval6LRSgaqFz3H6UrVUZzT9hXBMYCIO0PqiLqaelXXl_6LS-enFs0MG5L_Ls5x9VDW1bhAFWK1uHrNzAhfwRklBeqi9Vemkn8feO_WXebBq84eDed7FjHK9JDNPiypxUACifQYQu_QCT7B3utH-R8eGWiP2YuyJZ1Q3EbpQElT9CVx_CvqLlg%3D%3D" quality="high" bgcolor="#333399" name="LogMeIn" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" align="middle" height="500" width="80%"&gt;&lt;/embed&gt; &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Resources:&lt;br /&gt;&lt;a href="http://www.adobe.com/devnet/flex/videotraining/"&gt;Learn Flex in a week&lt;/a&gt;&lt;br /&gt;Adobe AIR application: &lt;a href="http://www.adobe.com/devnet/flex/tourdeflex/"&gt;Tour de Flex&lt;/a&gt;&lt;br /&gt;Featured download: &lt;a href="http://sites.google.com/site/anthonymdu/Home/downloads/LogMeIn.zip?attredirects=0"&gt;LogMeIn.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-6302170078498972533?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/6302170078498972533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=6302170078498972533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6302170078498972533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6302170078498972533'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/04/ics-499-my-tour-de-flex.html' title='[ICS 499] My tour de Flex!'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-1985703895792803983</id><published>2009-04-11T17:00:00.000-07:00</published><updated>2009-04-21T12:04:32.283-07:00</updated><title type='text'>[ICS 499] OpenLaszlo...simply wow</title><content type='html'>It looks and feels like Flash, but its not necessarily that. OpenLaszlo is a Rich Internet Application (RIA) platform targeted for building desktop-like web applications. Its component based syntax for declarative programming provides an array of supported outputs, such as Flash, and recently, DHTML. In this entry, I'll give what seems to be a very clear cut example of a simple OLZ application. &lt;div&gt;&lt;br /&gt;Please note that this application is a derivative of Adam Wolff's &lt;a href="http://weblog.openlaszlo.org/archives/2007/05/openlaszlo-4-programming-tutorial/"&gt;screencast&lt;/a&gt; for OpenLaszlo 4 programming.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Defining and porting our data...&lt;/span&gt;&lt;br /&gt;Laszlo follows the strong standard XPath data-binding API's, as well as components to facilitate communication with the back-end. XML is used as the standard representation format of every LZX application file. Any data source that negotiates with Laszlo applications are quite capable of generating XML dynamically. Such sources may include: JavaServer Pages, Servlets, Microsoft Active Server Pages, ColdFusion             pages, CGI applications, PHP scripts, etc. To keep things simple for this example, I'll provide the raw XML file for my LZX application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Here's my XML file, called places.xml:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;places&amp;gt;&lt;br /&gt;&amp;lt;place street="750 Keeaumoku St" description="Walmart store"&lt;br /&gt;name="Walmart" city="Honolulu, HI 96814"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;place street="1450 Ala Moana Blvd" description="Ala Moana Shopping Center"&lt;br /&gt;name="Ala Moana Center" city="Honolulu, HI 96814"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;place street="1527 Keeaumoku St" description="Makiki District Park"&lt;br /&gt;name="Makiki Park" city="Honolulu, HI 96822"/&amp;gt;&lt;br /&gt;&amp;lt;/places&amp;gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Creating an LZX application file:&lt;/span&gt;&lt;br /&gt;Simply create a file and name it with the extension of ".lzx", then place the following inside it: &lt;pre&gt;&amp;lt;canvas&gt;&amp;lt;/canvas&amp;gt;&lt;/pre&gt;There you have it, your very first Laszlo application! I know it's not very impressive, but it only gets better.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data source retrieval in LZX app:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;canvas&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;lt;dataset src="places.xml" name="dsPlaces"&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;lt;window title="Places" width="200" height="250"&amp;gt;&lt;br /&gt;  &amp;lt;simplelayout/&amp;gt;&lt;br /&gt;  &amp;lt;view&amp;gt;&lt;br /&gt;    &amp;lt;text&amp;gt;&lt;br /&gt;      &lt;b&gt;&amp;lt;datapath xpath="dsPlaces:/places/place/@name" replication="lazy"/&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;/text&amp;gt;&lt;br /&gt;  &amp;lt;/view&amp;gt;&lt;br /&gt;&amp;lt;/window&amp;gt;&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;/pre&gt;In this bit of code, I introduced a data set tag referencing to my local "places.xml" file, with a name tag of "dsPlaces." Next, "window" is a simple way of creating a draggable window panel with an optional fixed width and height. The window is the container object for our data set output. By following standard XPath for XML styled notation (/places/...), we can simply list all the names of places from the xml file. Also a special note on "lazy" replication: It simply is built into the OLZ runtime and acts as a catalyst for retrieving data faster and efficiently (similar to Google Maps rendering).&lt;br /&gt;&lt;pre&gt;&amp;lt;canvas&amp;gt;&lt;br /&gt;&amp;lt;dataset src="places.xml" name="dsPlaces"&amp;gt;&lt;br /&gt;&amp;lt;window name="main" title="Places" width="200" height="250" resizable="true"&amp;gt;&lt;br /&gt;  &amp;lt;simplelayout/&amp;gt;&lt;br /&gt;  &amp;lt;view&amp;gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;text onmouseover="this.setBGColor(0xDDDDFF)"&lt;br /&gt;             onmouseout="this.setBGColor(null)&amp;gt;&lt;/b&gt;&lt;br /&gt;      &amp;lt;datapath xpath="dsPlaces:/places/place/@name" replication="lazy"/&amp;gt;&lt;br /&gt;      &lt;b&gt;&amp;lt;handler name="onClick"&amp;gt;&lt;br /&gt;        details.datapath.setFromPointer(this.datapath)&lt;br /&gt;      &amp;lt;handler&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;/text&amp;gt;&lt;br /&gt;  &amp;lt;/view&amp;gt;&lt;br /&gt;  &amp;lt;scrollbar/&amp;gt;&lt;br /&gt;&amp;lt;/window&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;lt;window name="details" title="$path{'@name'}" x="${main.x + main.width}" width="400" height="250"&amp;gt;&lt;br /&gt;  &amp;lt;datapath/&amp;amp;gt&lt;br /&gt;  &amp;lt;text datapath="@description" fontsize="14" width="100%" multiline="true"/&amp;gt;&lt;br /&gt;&amp;lt;/window&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;/pre&gt;Added a little OLZ syntactic sugar for Javascript to allow mouse over effects to the text data.&lt;br /&gt;Created a handler for when a user clicks on a data text --the data set that was clicked on would  sync with the details window.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Defining your own window class:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;canvas&amp;gt;&lt;br /&gt;&amp;lt;dataset src="places.xml" name="dsPlaces"&amp;gt;&lt;br /&gt;&amp;lt;window name="main" title="Places" width="200" height="250" resizable="true"&amp;gt;&lt;br /&gt;&amp;lt;simplelayout/&amp;gt;&lt;br /&gt; &amp;lt;view&amp;gt;&lt;br /&gt;   &amp;lt;text onmouseover="this.setBGColor(0xDDDDFF)"&lt;br /&gt;            onmouseout="this.setBGColor(null)&amp;gt;&lt;br /&gt;     &amp;lt;datapath xpath="dsPlaces:/places/place/@name" replication="lazy"/&amp;gt;&lt;br /&gt;     &amp;lt;handler name="onClick"&amp;gt;&lt;br /&gt;       &lt;b&gt;var details = new detailswindow(canvas);&lt;/b&gt;&lt;br /&gt;       details.datapath.setFromPointer(this.datapath);&lt;br /&gt;     &amp;lt;handler&amp;gt;&lt;br /&gt;   &amp;lt;/text&amp;gt;&lt;br /&gt; &amp;lt;/view&amp;gt;&lt;br /&gt;&amp;lt;scrollbar/&amp;gt;&lt;br /&gt;&amp;lt;/window&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;lt;class name="detailswindow" extends="window" title="$path{'@name'}"&lt;br /&gt;   x="${main.x + main.width}" width="400" height="250" closeable="true"&amp;gt;&lt;br /&gt; &amp;lt;datapath/&amp;amp;gt&lt;br /&gt; &amp;lt;method name="close"&amp;gt;&lt;br /&gt;    putAway.doStart();&lt;br /&gt; &amp;lt;/method&amp;gt;&lt;br /&gt; &amp;lt;animatorgroup name="putAway" process="sequential" duration='300' start="false"&amp;gt;&lt;br /&gt;   &amp;lt;animator attribute="height" to="50"/&amp;gt;&amp;lt;animator attribute="y" to="-50"/&amp;gt;&lt;br /&gt; &amp;lt;/animatorgroup&amp;gt;&lt;br /&gt; &amp;lt;text datapath="@description" fontsize="14" width="100%" multiline="true"/&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;/pre&gt; Added extensible window class, called "detailswindow."&lt;br /&gt;Demonstrated a named method handler for closing a window (animator).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing this app by embedding a Google map via the GoogleMaps API:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;canvas&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;lt;href="htmlview.lzx"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;lt;dataset src="places.xml" name="dsPlaces"&amp;gt;&lt;br /&gt;&amp;lt;window name="main" title="Places" width="200" height="250" resizable="true"&amp;gt;&lt;br /&gt;  &amp;lt;simplelayout/&amp;gt;&lt;br /&gt;  &amp;lt;view&amp;gt;&lt;br /&gt;    &amp;lt;text onmouseover="this.setBGColor(0xDDDDFF)"&lt;br /&gt;             onmouseout="this.setBGColor(null)&amp;gt;&lt;br /&gt;      &amp;lt;datapath xpath="dsPlaces:/places/place/@name" replication="lazy"/&amp;gt;&lt;br /&gt;      &amp;lt;handler name="onClick"&amp;gt;&lt;br /&gt;        var details = new detailswindow(canvas);&lt;br /&gt;        details.datapath.setFromPointer(this.datapath);&lt;br /&gt;      &amp;lt;handler&amp;gt;&lt;br /&gt;    &amp;lt;/text&amp;gt;&lt;br /&gt;  &amp;lt;/view&amp;gt;&lt;br /&gt;  &amp;lt;scrollbar/&amp;gt;&lt;br /&gt;&amp;lt;/window&amp;gt;&lt;br /&gt;&amp;lt;class name="detailswindow" extends="window" title="$path{'@name'}"&lt;br /&gt;     x="${main.x + main.width}" width="400" height="250" closeable="true"&amp;gt;&lt;br /&gt;  &amp;lt;datapath/&amp;amp;gt&lt;br /&gt;  &lt;b&gt;&amp;lt;method name="close"&amp;gt;&lt;br /&gt;    putAway.doStart();&lt;br /&gt;  &amp;lt;/method&amp;gt;&lt;br /&gt;  &amp;lt;animatorgroup name="putAway" process="sequential" duration='300' start="false"&amp;gt;&lt;br /&gt;    &amp;lt;animator attribute="height" to="50"/&amp;gt;&amp;lt;animator attribute="y" to="-50"/&amp;gt;&lt;br /&gt;  &amp;lt;/animatorgroup&amp;gt;&lt;/b&gt;&lt;br /&gt;  &amp;lt;text datapath="@description" fontsize="14" width="100%" multiline="true"/&amp;gt;&lt;br /&gt;  &amp;lt;handler name="ondata"&amp;gt;&lt;br /&gt;    var fullAddress = datapath.xpathQuery('@street');&lt;br /&gt;    fullAddress += ", " + datapath.xpathQuery('@city');&lt;br /&gt;    map.setSrc("map.html?addr=" + fullAddress);&lt;br /&gt;  &amp;lt;/hander&amp;gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;htmlview name="map" width="100%"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Here's a sample of an htmlview.lzx:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;canvas&amp;gt;&lt;br /&gt;&amp;lt;window width="600" height="600" resizable="true" oninit="this.htmlview.setSrc('http://maps.google.com')"&amp;gt;&lt;br /&gt;&amp;lt;html name="htmlview" xoffset="8" yoffset="25" widthoffset="-20" heightoffset="-45"&lt;br /&gt;oninit="this.bringToFront()"/&amp;gt;&lt;br /&gt;&amp;lt;/window&amp;gt;&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;/pre&gt;This displays a map beneath the selected address of interest.&lt;br /&gt;&lt;br /&gt;So as you can see, OpenLaszlo gives new meaning to web "mashups" by inherently being able to consume all sorts of data sources. RIAs do a very good job at utilizing an intuitive standard, like XML to bring many of these hierarchical components to life. Tomorrow, I plan on testing out yet another RIA platform, which went open source back in 2007, known as Adobe's &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt;.&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/2534024747783979675-1985703895792803983?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/1985703895792803983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=1985703895792803983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1985703895792803983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1985703895792803983'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/04/ics-499-openlaszlosimply-wow.html' title='[ICS 499] OpenLaszlo...simply wow'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-5828311518141498557</id><published>2009-04-11T14:35:00.000-07:00</published><updated>2009-04-12T06:11:32.264-07:00</updated><title type='text'>[ICS 499] Setting up shop...</title><content type='html'>My fellow colleague and I began configuring our working server this past weekend for the &lt;a href="http://medsphere.org/community/project/ovid"&gt;OVID&lt;/a&gt; project. Just to reiterate from my previous &lt;a href="http://anthonymdu.blogspot.com/2009/04/ics-499-ovid-is-checking-in.html"&gt;post&lt;/a&gt;, OpenVistA Interface Domain (OVID) is a Medsphere project that interfaces a layer for communication between applications and OpenVistA data. We checked out a copy on both of our machines without a hitch. The code builds successfully on both &lt;a href="http://www.eclipse.org/"&gt;Eclipse &lt;/a&gt;and &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt;, though some of the jar classes are meant to run correctly on Java 1.5.x -- class build number should be '49'. We were planning this week to speak to two other people regarding the configuration and setup of our environment. One person being a long-time Medsphere associate, Andy Pardue, and the other a head developer of the lzVistA project, Wally Cash. Although communication was a bit limited due to the Easter weekend, we were still able to get Apache's Tomcat running, OpenLaszlo installed, and the OVID code to build.&lt;br /&gt;&lt;br /&gt;Here are some notes for the upcoming releases of the OVID project from Medsphere. I'm excited to see that they're planning on putting out a central codebase repository. It'll be interesting to see which route they'll take as a choice of their SCM system. Hopefully if we get in contact with Andy Pardue, then we'll have some say in the matter of its open release to the public.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a comprehensive set of acceptance tests.  Right now, our tests are spread out and not validated.  Having these tests will allow us to quickly add new classes while validating current functionality.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Refactor the connection logic to make it easy to choose between RPCBroker and VistaLink.  RIght now, we are reliant on VistaLink.  RPCBroker would be a better choice for some platforms.&lt;/li&gt;&lt;li&gt;Refactor the FM logic to enable richer queries.&lt;/li&gt;&lt;li&gt;We're readying the codebase to be placed in an online repository to make it easier to collaborate.&lt;/li&gt;&lt;/ul&gt;I'll be spending some time looking over examples on developing in OpenLaszlo, along with putting up the sample Patient Dashboard on our web server. In my opinion, I think we are getting off on the right foot, and it seems that it's the perfect time to hop into this project early on during its development stages. Hopefully with enough support from the community, especially from those who may benefit from this cause, we should indeed witness a strong push into the spotlight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-5828311518141498557?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/5828311518141498557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=5828311518141498557' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5828311518141498557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5828311518141498557'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/04/ics-499-setting-up-shop.html' title='[ICS 499] Setting up shop...'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-6892343956622739226</id><published>2009-04-08T03:00:00.000-07:00</published><updated>2009-04-09T18:37:39.811-07:00</updated><title type='text'>[ICS 499] OVID is checking in...</title><content type='html'>In recent news, &lt;a href="http://www.blogger.com/medsphere.org"&gt;Medsphere&lt;/a&gt; released an open source tool set, called OpenVistA Interface Domain (&lt;a href="http://medsphere.org/community/project/ovid"&gt;OVID&lt;/a&gt;) which equips developers with tools for messaging with OpenVistA (OV) data. To my surprise, it had basically achieved all that I had hoped for for my &lt;a href="http://anthonymdu.blogspot.com/2009/03/ics-499-planning.html"&gt;BMXNet conversion to Java&lt;/a&gt;. This release enables developers the ability to communicate with OpenVistA data through either Remote Procedure Calls (RPC) or directly through FileMan (FM) calls by way of constructed Java bindings. Since this piece of the puzzle has finally made its way into the open source community for medical health record software systems, developers are now relieved of many cross-cutting concerns regarding support for multi-data providers, OS platform support and web-based integrations. Members of this project team have taken it to the next level by demonstrating a web application comprised of intricate web services (built in Java). Their demo release is packaged with this Web Service Definition Lanaguage (WSDL) driven application (&lt;a href="http://medsphere.org/docs/DOC-1423"&gt;Patient Dashboard&lt;/a&gt;, a.k.a. lzDashboard) made entirely in OpenLaszlo (&lt;a href="http://www.blogger.com/openlaszlo.org"&gt;OLZ&lt;/a&gt;).  OLZ is an event-driven, object-oriented programming language for creating dynamic, data-driven applications. OLZ serves as one good candidate for building formal interfaces that access real patient health record databases. Since information management is a vital essence in the distribution and viewing of patient records, seeking for these resourceful tools will hold greater value and support to the community of users.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;New plan...&lt;/span&gt;&lt;br /&gt;So rather than going with my original plan of rebuilding this exact tool layer, I've decided to consume this resource by including it in a live source code management environment. Obviously, Medsphere isn't absolutely there with providing a central repository due to strict litigation and licensing. However, their open source awareness is pretty much their lively hood. Medsphere has gone through many changes recently and some of which have had an enormous impact on myself and others. They recently updated their website which now looks very much like a Web2.0 site, and are now participants of the popular social networking service, called &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;. As for the rest, they are still considered the high-end advocates of health and technology related informatics. So, I've decided, with granted permissions from Medsphere associates (Ben Mehling) to allow me to migrate OVID to some suggested SCM (&lt;a href="http://code.google.com/"&gt;Google Project&lt;/a&gt;s or &lt;a href="http://github.com/"&gt;Github&lt;/a&gt;). I'm not sure about when the planning will take place, but in the mean time I'll be trying out the OVID library classes and possibly implementing my own extensions or participate in the continuation of Medsphere's OLZ application, called &lt;a href="http://medsphere.org/community/project/lzvista"&gt;lzVistA&lt;/a&gt;. I'll elaborate more on the Rich Internet Application (RIA), lzVistA in a later post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-6892343956622739226?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/6892343956622739226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=6892343956622739226' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6892343956622739226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6892343956622739226'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/04/ics-499-ovid-is-checking-in.html' title='[ICS 499] OVID is checking in...'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-5883620011957411111</id><published>2009-03-22T20:41:00.000-07:00</published><updated>2009-03-23T05:31:52.619-07:00</updated><title type='text'>Devcathlon 1st Milestone: Mockups</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;I'll be expressing my feelings for this first increment of Devcathlon and the status of the project. The difference between this entry and my past entries regarding Devcathlon is that this time we are really going full speed on this application. My colleagues and I only have a span of 6 weeks left to accomplish what would seem like a prototype for Devcathlon 1.0. Here, I will also list my workings on the profile management section and my experiences being a co-coordinator for this project.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Devcathlon Project Hierarchy&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Each section consists of 4 members, including a designated team leader.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;User &amp;amp; Team Management - user profile and team management sections.&lt;br /&gt;Matches &amp;amp; Scoreboard - team matches and scoreboard management sections.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;TeamUT - User and Team Management&lt;/span&gt;&lt;span style="font-style: italic;"&gt;:&lt;/span&gt;&lt;br /&gt;Since Wednesday, I was assigned as project leader of the user profile and team management sections for our web application. The profile management section will be responsible for providing personal and account details of a user. This section contains the user's home page, when they first sign in, easy links to edit personal and profile information, upload an image (avatar) and ways to manage teams and view related matches.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Planning and accomplishments...&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Since we were placed in groups of four, I decided to split my team in half and assign each to either the user or team management section.&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;Scheller Sanchez and I were responsible for the user profile management section. While John Ly and Philip Lau were assigned to the team management portion.&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;I devised a shared Google doc that serves as a task summary of all involving elements for our user and team management. Of course our tasks and issues will be managed through Google's issue tracker, but this gives a hard copy evidence of our work. It's also backed with version control and makes for a very beneficial asset to our team collaboration.&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Here's a quick summary of each individual's tasks taken from Google's issue tracker:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Profile Management&lt;/span&gt; (../hackystat/devcathlon/ui/page/profile)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Anthony Du:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/issues/detail?id=51"&gt;Profile&lt;/a&gt; menu (started) ~mockup completed in &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/source/detail?r=399"&gt;r399&lt;/a&gt;&lt;br /&gt;Profile &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/issues/detail?id=50"&gt;submenu&lt;/a&gt; links (done) ~ completed in &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/source/detail?r=391"&gt;r391&lt;/a&gt;&lt;br /&gt;Profile submenus: &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/issues/detail?id=45"&gt;manage&lt;/a&gt; and browse (started)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Scheller Sanchez:&lt;/span&gt;&lt;br /&gt;Added wicket ids for profile menu page (started)&lt;br /&gt;Profile submenu: commentary (accepted)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Team Management&lt;/span&gt; (../hackstat/devcathlon/ui/page/team)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Phillip Lau:&lt;/span&gt;&lt;br /&gt;Initial Team Main menu (done)&lt;br /&gt;Initial Team Browse page (done)&lt;br /&gt;Populate Team Main (new)&lt;br /&gt;Populate Team Browse (new)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;John Ly:&lt;/span&gt;&lt;br /&gt;Add mockup of manage team submenu (done)&lt;br /&gt;add mockup of teams invitations submenu (done)&lt;br /&gt;implement creating team form (accepted)&lt;br /&gt;implement team invitation (accepted)&lt;br /&gt;&lt;br /&gt;We met up twice within the first week, the first day and eventually once on Friday. We also met online on several occasions and had two official group chat sessions involving everyone. This proved to be quite beneficial for keeping team members in check, draw new ideas, express opinions, concerns and debug issues. Conducting these meetings weren't difficult and everyone was very willing to cooperate from the start. I gave my team members lots of flexibility, due to everyone's personal schedules in order to work on their parts. I also sent out frequent reminders of opened issues and chat sessions going on. This team from the start seemed to be very self-motivated and easy going. I had a great time contributing all I can to my team members, as well as reciprocating that relationship through this learning process.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;ICU&lt;/span&gt; &lt;span style="font-style: italic; font-weight: bold;"&gt;does not see me&lt;/span&gt;...&lt;br /&gt;One of my team members notified me that Hackystat wasn't picking up on my data telemetry through sensorbase. This is quite unfortunate and I needed to attend to the matter quickly, except it seemed that Eclipse's Preference menu had gotten rid of the Hackystat Sensor. This totally got me confused. So I attempted to reinstall the plugin by copying the jar from the hackystat.sensor.eclipse folder to the eclipse/plugins directory, but nothing worked. Hopefully I'll resolve this before our next increment. As of right now, I'm coding anonymously for Devcathlon...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Loose design process...&lt;/span&gt;&lt;br /&gt;I know that we've all been here before with designing a mockup for a website on a text editor, or paper and pencil. This process should indeed be very quick and fast with all sketches being simple and straight to the point. What I've noticed so far in this project is that we've been stressing too much about the placement of things, rather than the functional aspects of our web application. Of course a web application's looks are 90% of the user's experience, but we haven't had a decent amount of time spent on the class design itself. I might be a bit harsh, since this is our "first milestone," but some people are really missing the point on what needs to get done. Generally stated, sometimes "less is more." So I think in our first increment, we should follow a semi-"loose" design in our mockups. Since a lot of these form elements are dynamic and can be changed ever so often, they need not to be overworked into our mockups. For example, a simple div tag can serve as a placeholder for an image or any other element. As for those elements that contain multiples, they can be done once and left alone. We don't need to exercise the fact that we can copy and paste with our mouse, instead seeing that one row is working is quite sufficient enough.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Concern&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;s...&lt;/span&gt;&lt;br /&gt;Wicket is still fairly new to most people and I don't know how much REAL experience anyone has had with it yet, but it shows very much in this application that we really need to start reading up on the basics of building a Wicket application. I'm pretty sure that we can code in Java, but can we code in Wicket? Wicket has only received 3 books published and they all have great introductions. I would recommend "Wicket In Action" as a great resource to building and deploying Wicket applications. The first and foremost understanding of Wicket's framework would be highly beneficial. We must understand the MVC structure and how Wicket distinguishes itself from other frameworks through separation of views and code. This separation greatly helps us focus on our programming without having to deal with heavy html markup. I would like to see that we plan out a class design of what needs to be implemented without Wicket first. For example,  the UserProfile.java and not the UserProfilePage.java/html. Next we can focus on attaching these abstractions to our page components.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;In this first increment, we were mostly concerned about the markup html of Devcathlon. I hope this experience has given us all sufficient time in experimenting with the possibilities of using CSS in html and incorporating simple label elements through Wicket. There will be more interesting things to come when our team starts to dive into the workings of Devcathlon. Hopefully all of our previous preparations will help this applicaion flourish into success.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-5883620011957411111?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/5883620011957411111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=5883620011957411111' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5883620011957411111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5883620011957411111'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/03/devcathlon-1st-milestone-mockups.html' title='Devcathlon 1st Milestone: Mockups'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-1598091184385014564</id><published>2009-03-16T02:27:00.001-07:00</published><updated>2009-03-18T10:26:49.469-07:00</updated><title type='text'>CSS - Wicket Menu bars</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;To get re-acquainted with Wicket and CSS, and to become familiar with an implementation of menu bars for the Devcathlon project.&lt;/span&gt;&lt;br /&gt;To follow along with this entry, I'm assuming that you are familiar with Wicket. You may checkout a read-only copy of ics-wicket-example-5 from &lt;a href="http://code.google.com/p/ics-wicket-examples/"&gt;here&lt;/a&gt;. There you will also find previous introductory examples to Wicket and various easy to access links to required libraries for Wicket.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dissecting CSS of &lt;span style="font-style: italic;"&gt;"menu.css"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;1. Set &lt;/span&gt;&lt;span style="font-style: italic;"&gt;list item tab &lt;/span&gt;&lt;span style="font-style: italic;"&gt;as active: &lt;pre&gt;body.section-1 #menu li#nav-1 a, ... { background: white; ... }&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;2. Hide inactive sub navigation links: &lt;pre&gt;#menu #subnav-1 { display: none; ... }&lt;/pre&gt;3. Left-justified unordered sub navigation list:&lt;br /&gt;&lt;pre&gt;body.section-1 #menu ul#subnav-1 { display: inline ... }&lt;/pre&gt;4. Set sub navigation list tab as active:&lt;br /&gt;&lt;pre&gt;body.section-1 #menu ul#subnav-1 a { background: white; border: none ... }&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Add new entries to the Wicket menu bar&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;BasePage.java:&lt;br /&gt;1. Create third menu and include 10 more sub menus beneath it.&lt;br /&gt;&lt;pre&gt;add(new Link("Menu3Link") { public void onClick() { setResponsePage(new Menu3Page())}});&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;2. Add sub menu links&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;pre&gt;add(new Link("SubMenu5Link") { public void onClick() { setResponsePage(new &lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;SubMenu5Link&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;())}});&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4D3mzI8EcZA/ScEsq4CKPrI/AAAAAAAAACE/V02_uS4Juo4/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 316px; height: 127px;" src="http://1.bp.blogspot.com/_4D3mzI8EcZA/ScEsq4CKPrI/AAAAAAAAACE/V02_uS4Juo4/s320/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5314578150381469362" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Modifying CSS attributes&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span&gt;via Wicket&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;One of my collegues from class suggested using a "get" resource request to retrieve the resource link, then modifying its CSS class attribute with the following code:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;pre&gt;get("menuLink").add(new SimpleAttributeModifier("attribute", "value"));&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;This code does exactly what its intended to do, but after looking over the &lt;a href="http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/index.html"&gt;Wicket 1.3.x API's&lt;/a&gt;, I found this interesting bold text in all caps, "&lt;/span&gt;&lt;/span&gt;THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT USE IT. " This was to address the "get" method which is documented &lt;a href="http://people.apache.org/%7Etobrien/wicket/apidocs/org/apache/wicket/SharedResources.html#get%28java.lang.String%29"&gt;here&lt;/a&gt;. So I did a quick Google search and came across &lt;a href="http://www.systemmobile.com/?p=183"&gt;this&lt;/a&gt; posting which, if applied, should have the same effect. Here's the code if it were applied to this CSS experiment in file Menu1Page.java&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-style: italic;"&gt;... WebMarkupContainer menuLink = new WebMarketContainer("Menu1Link");&lt;br /&gt;menuLink.add(new AttributeModifier("class", new Model("selected")));&lt;br /&gt;addOrReplace(menuLink); ...&lt;/span&gt;&lt;/pre&gt;Note: Entire code segments are included within the distribution file below.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;Although this experiment was fairly short, the CSS and Wicket refresher will be duly noted.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;Distribution file: &lt;a href="http://sites.google.com/site/anthonymdu/Home/downloads/wicket-example05-1.0.318.zip?attredirects=0"&gt;wicket-example05-1.0.318.zip&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-1598091184385014564?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/1598091184385014564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=1598091184385014564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1598091184385014564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1598091184385014564'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/03/wicket-menu-bars.html' title='CSS - Wicket Menu bars'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4D3mzI8EcZA/ScEsq4CKPrI/AAAAAAAAACE/V02_uS4Juo4/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-7767493199343865357</id><published>2009-03-12T13:44:00.000-07:00</published><updated>2009-03-24T04:10:42.142-07:00</updated><title type='text'>[ICS 499] Planning</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;This entry is a continuation of the long awaited plan of what my thoughts are on building my custom BMXNet component in Java. I took forth this project to provide higher-level interoperability between serviced applications for RPMS’s electronic health records system. I will review the facts regarding the tools and intention of this project, but further details regarding the background of IHS's RPMS can be found in my previous post, here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A quick re-interation:&lt;/span&gt;&lt;br /&gt;Why use BMXNet? Just a refresher, BMXNet is a subset of tools provided by RPMS that enables .NET applications to exchange data via standard ADO.Net data tables. At this point in time RPMS only supports Windows applications written in the .Net 2.0 framework. My goal is to expand this by adding other supportive data providers across multiple platform environments for RPMS to communicate with.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements:&lt;/span&gt;&lt;br /&gt;* Installation of InterSystem's Cache on a Windows operating system.&lt;br /&gt;* Net 2.0 framework.&lt;br /&gt;* BMXNet20.dll – handles the conversion between BMXNet to the .Net framework.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tools:&lt;/span&gt;&lt;br /&gt;* Eclipse IDE ~3.4&lt;br /&gt;* Microsoft Visual Studio&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Plan:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Finding a home...&lt;/span&gt;&lt;br /&gt;The crowd approval of a project is somewhat difficult to obtain but it isn't hard to include a new project within the neighborhood of other potentials.&lt;br /&gt;Create an open source project using Google's project hosting.&lt;br /&gt;* Place an introduction and produce a good subset of examples supporting the proposal.&lt;br /&gt;* Mention about involving companies or schools.&lt;br /&gt;* Licensing: Since this project is somewhat in its dwarf stages, I'll attach an ordinary GPL to it. Perhaps in the future we will do a dual licensing and reciprocal term.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Benefits of using Google’s project hosting:&lt;/span&gt;&lt;br /&gt;* Supports version control, easy navigation or browsing of code, connects well with other Google components, such as Google’s discussion groups, etc.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Other source code management (SCM) option(s):&lt;/span&gt;&lt;br /&gt;* What about Github? Due to Git’s full-repository cloning, fast and easy branching and merging of repos, more software developers are seeking it out as an alternative SCM to Subversion. Github combines the goodness of a powerful SCM and ships with the abundance of collaborative software (Campfire &amp;amp; Lighthouse) to help developers stay focus and aware of their community involvements.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Putting BMXNet on the chopping block…&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BMXNet details:&lt;/span&gt;&lt;br /&gt;Below are three different ways to retrieve data from [M]umps FileMan utility. Each will be the focus of my application as I recreate these components using Java.&lt;br /&gt;&lt;pre&gt;&lt;ol style="font-family: Trebuchet MS;" type="I"&gt;&lt;li&gt;  &lt;i&gt;Custom Remote Procedure Calls (RPC’s) returned from BMXNet’s M utilities. &lt;/i&gt;RPC routines in M are categorized into two record schemas, minimal and full.&lt;ol&gt;&lt;li&gt;  Schema Record Structure&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol style="font-family: Trebuchet MS;"&gt;&lt;ol&gt;&lt;ol type="i"&gt;&lt;li&gt;  Minimal Schema - contains enough information in the RPC for a read-only ADO.Net Data Table.&lt;/li&gt;&lt;li&gt;  Full Schema – contains sufficient metadata for a fully updatable Data Table via BMXNet ADO SS.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;  Record Delimiters&lt;ol type="i"&gt;&lt;li&gt;  Field separations with ‘^’&lt;/li&gt;&lt;li&gt;  ASCII 30 for End-Of-Record (EOR) &amp;amp; ASCII 31 for End-Of-File (EOF).&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;  All schema structures are stored in the BMX ADO SCHEMA file.&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;ol start="2" style="font-family: Trebuchet MS;" type="I"&gt;&lt;li&gt;  &lt;i&gt;SQL-like calls&lt;/i&gt;. Rather than having to create custom RPC’s in the M language, BMXNet supports quick retrieval of any read-only DataTable easily through familiar SQL statements.  &lt;/li&gt;&lt;li&gt;  &lt;i&gt;BMX ADO SS&lt;/i&gt;.&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Simplifies calls by generalizing RPC routines written in &lt;i&gt;M&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;  Generates an updatable DataTable&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Understand Java and RPMS's Networking capabilities:&lt;/span&gt;&lt;br /&gt;Java is the first major programming language to be built from the ground up with networking in mind. It has built-in supportive classes to enable Java applications with networking capabilities to easily communicate across the Internet. This task pertains to the first phase of this project and is certainly a vital prerequisite for this application. I'll be focusing on the first phase within the next day or two. Here's a quick outline of what's to come:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phase I: Communication&lt;/span&gt;&lt;br /&gt;* Create a simple Java client to test connecting to Cache's RPMS server environment.&lt;br /&gt;  - Use basic TCP/IP socket connections&lt;br /&gt;  - Test sending and retrieving data packets&lt;br /&gt;* Accomplish bi-directional relationship&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phase II: Building Custom RPCs&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* Learn to create custom RPCs from RPMS&lt;br /&gt;* Learn to invoke custom RPCs from within my custom data provider in Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phase III: Provide SQL support&lt;br /&gt;&lt;/span&gt;* Learn about Java Persistence API&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phase IV: Creating Updatable Data Tables&lt;br /&gt;&lt;/span&gt;...TBD&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-7767493199343865357?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/7767493199343865357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=7767493199343865357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7767493199343865357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7767493199343865357'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/03/ics-499-planning.html' title='[ICS 499] Planning'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-7324697882043906270</id><published>2009-03-09T11:11:00.000-07:00</published><updated>2009-03-09T11:44:17.290-07:00</updated><title type='text'>Devcathlon Event Implementation</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;br /&gt;&lt;/span&gt;This past week I teamed up with one of my colleagues to implement an event for our semester project, called &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/"&gt;&lt;span style="font-style: italic;"&gt;Devcathlon&lt;/span&gt;&lt;/a&gt;. We were in charge of developing the &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/wiki/Events#Collective_ownership"&gt;&lt;span style="font-style: italic;"&gt;CollectiveOwnership&lt;/span&gt;&lt;/a&gt; event which entails the following:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Reward developers for ensuring that most files are worked on by multiple developers for a certain number of time.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Process:&lt;/span&gt;&lt;br /&gt;My colleague and I had very ample time to work on this event. Given the prior experience with working on our mock events, we were semi-comfortable with the &lt;a href="http://code.google.com/p/hackystat/"&gt;&lt;span style="font-style: italic;"&gt;Hackystat&lt;/span&gt;&lt;/a&gt; APIs. Fortunately enough we had a very distinct plan from day one and that was to finish early. A lot of the code was taken from the same context as our starter events. Eventually those same concepts, such as calling to the remote hosting server, retrieving data from the host, specifying sensor data types, and sending data to our test server became second nature to us. I also corrected myself during many instances while building this event. One of my main difficulties was understanding what was was being accepted by Hackystat as valid input and what was being spit back. I was a bit trapped by this and had to resort to some old debugging techniques that may seem out of style in today's standards, but worked out just fine for certain situations. In many of our preliminary test cases, we did various "System.out.println..." to see if the accepted values were generated correctly by our black box (Hackystat). Yes, I basically thought of Hackystat as a big "black box." Although the code is open source and can easily be read from Google's browsing tool, I was compelled to see how much can be inferred from the details of the Javadocs without digging through code manually. However, in one instance my colleague found a code section for determining a user's developing time by a simple class called DevTimeCounter. The name is quite obvious and it simply did what it needed to do flawlessly. This incredible, yet hard to find class simplified the code even further from what we had started out with. We also ran into a little difficulty in building test cases, so my colleague expanded the DevcathlonHelper class method for making dev time, by adding the ability to specify a file name the user or owner has been working on. This helper was a necessary change to the test helper methods and it greatly came in handy for what we needed to test out in our event.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;The experience was very rewarding, since I became more familiar with the Hackystat API and much more comfortable building Devcathlon events. Although we hit some road blocks along the way, they were minor and worth noting for future reference. Considering the rate at which we are going, we should be on our way with getting some kind of GUI for our application soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-7324697882043906270?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/7324697882043906270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=7324697882043906270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7324697882043906270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7324697882043906270'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/03/devcathlon-event-implementation.html' title='Devcathlon Event Implementation'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-34218960488594990</id><published>2009-02-18T09:03:00.000-08:00</published><updated>2009-02-19T12:38:04.938-08:00</updated><title type='text'>Hackystat Programming 101</title><content type='html'>&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Purpose:&lt;/span&gt;&lt;div&gt;In this blog entry I'll describe my experiences working with  &lt;a href="http://code.google.com/p/hackystat/"&gt;Hackystat&lt;/a&gt; services and building my first Hackystat program.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Installation:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The installation of the Hackystat services and sensor binaries were fairly straightforward, given the aid of the Hackystat wiki pages and Professor Johnson's very helpful screencasts. All links and provided show notes for the screencasts can be found &lt;a href="http://code.google.com/p/hackystat/wiki/Screencasts"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Building my very first Hackystat App:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The following are two code snippets taken from my first Hackystat driven application which returns back the number of instances for each day of the given month and year, and my test-driven application for determining the max number of instances in a given month:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;public class HackyProg1 {&lt;br /&gt;&lt;br /&gt;/* Constants */&lt;br /&gt;public static final String SENSORBASE_URL = "http://dasha.ics.hawaii.edu:9876/sensorbase";&lt;br /&gt;public static final String PROJECT_NAME = "Default";&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @param args&lt;br /&gt;* @throws Exception&lt;br /&gt;*/&lt;br /&gt;public static void main(String[] args) throws Exception {&lt;br /&gt;boolean isHost = SensorBaseClient.isHost(SENSORBASE_URL);&lt;br /&gt;System.out.println("Try to contact host is: " + isHost);&lt;br /&gt;SensorShellProperties properties = new SensorShellProperties();&lt;br /&gt;String user = properties.getSensorBaseUser();&lt;br /&gt;String password = properties.getSensorBasePassword();&lt;br /&gt;System.out.println("U/P: " + user + "/****");&lt;br /&gt;&lt;br /&gt;/* Check to see if the user is registered with provided host */&lt;br /&gt;boolean isValidUser = SensorBaseClient.isRegistered(SENSORBASE_URL, user, password);&lt;br /&gt;System.out.println("Check to see if this user is valid: " + isValidUser);&lt;br /&gt;&lt;br /&gt;/* SensorBaseClient simulates a client instance */&lt;br /&gt;SensorBaseClient client = new SensorBaseClient(SENSORBASE_URL, user, password);&lt;br /&gt;/* Authenticate sensor base client instance */&lt;br /&gt;client.authenticate(); // Is valid if returns client instance back.&lt;br /&gt;&lt;br /&gt;/* Display the number of instances per day of the given month and year. Finally give the total # of instances for that month. */&lt;br /&gt;int totalInstances = 0;&lt;br /&gt;for (ProjectSummary projectSummary : client.getMonthProjectSummary(user, PROJECT_NAME, 2008, 11).getProjectSummary()) {&lt;br /&gt;  for (SensorDataSummary dataSummary : projectSummary.getSensorDataSummaries().getSensorDataSummary()) {&lt;br /&gt;    System.out.println(String.format("%s - %s : %s instances", projectSummary.getStartTime(), projectSummary.getEndTime(), dataSummary.getNumInstances()));&lt;br /&gt;    totalInstances += dataSummary.getNumInstances().intValue();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;System.out.println("Total instances for the month: " + totalInstances);&lt;br /&gt;System.out.println("--END--");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This was my attempt at determining the max day of instances for a given year and month. Unfortunately I ran into an issue specifying the project for a user given raw sets of data. Because of this, the test application is incomplete.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class MaxMonth {&lt;br /&gt;private String host, user, password, project;&lt;br /&gt;&lt;br /&gt;public MaxMonth(String host, String user, String password, String project) {&lt;br /&gt; this.host = host;&lt;br /&gt; this.user = user;&lt;br /&gt; this.password = password;&lt;br /&gt; this.project = project;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public SensorBaseClient loginUser() throws Exception {&lt;br /&gt; /* Check to see if the user is registered with provided host */&lt;br /&gt; boolean isValidUser = SensorBaseClient.isRegistered(host, user, password);&lt;br /&gt; System.out.println("Check to see if this user is valid: " + isValidUser);&lt;br /&gt;&lt;br /&gt; /* SensorBaseClient simulates a client instance */&lt;br /&gt; SensorBaseClient client = new SensorBaseClient(host, user, password);&lt;br /&gt; /* Authenticate sensor base client instance */&lt;br /&gt; return client.authenticate(); // Is valid if returns client instance back.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Returns the day containing the the maximum number of sensor data instance give the month and year.&lt;br /&gt;* @param m - month&lt;br /&gt;* @param y - year&lt;br /&gt;* @return&lt;br /&gt;* @throws Exception&lt;br /&gt;*/&lt;br /&gt;public int getMaxMonth(int month, int year) throws Exception {&lt;br /&gt; int maxDay = 1; // 1-31&lt;br /&gt; SensorBaseClient client = loginUser();&lt;br /&gt; int totalInstances = 0;&lt;br /&gt; for (ProjectSummary projectSummary : client.getMonthProjectSummary(user, project, year, month).getProjectSummary()) {&lt;br /&gt;   for (SensorDataSummary dataSummary : projectSummary.getSensorDataSummaries().getSensorDataSummary()) {&lt;br /&gt;     System.out.println(String.format("%s - %s : %s instances", projectSummary.getStartTime(), projectSummary.getEndTime(), dataSummary.getNumInstances()));&lt;br /&gt;     totalInstances += dataSummary.getNumInstances().intValue();&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; return totalInstances;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class TestMaxMonth {&lt;br /&gt;/* SensorBase test instance 'overwrites' SensorBase properties */&lt;br /&gt;&lt;br /&gt;/* Test server host name */&lt;br /&gt;private String host = "";&lt;br /&gt;private String user = "anthony@hackystat.org";&lt;br /&gt;private SensorBaseClient client = null;&lt;br /&gt;&lt;br /&gt;@Before&lt;br /&gt;public void setUp() throws Exception {&lt;br /&gt; Server server = Server.newTestInstance();&lt;br /&gt; host = server.getHostName();&lt;br /&gt; /* Registration test will do the following:&lt;br /&gt;  * Create the user and not send an email&lt;br /&gt;  * Set the password equal to the user name.&lt;br /&gt;  * */&lt;br /&gt; SensorBaseClient.registerUser(host, user);&lt;br /&gt; assertTrue("Testing registration", SensorBaseClient.isRegistered(host, user, user));&lt;br /&gt; /* Test will fail if JAVA MAIL is NOT installed properly */&lt;br /&gt;&lt;br /&gt; /* Authenticate newly created user client with test sensorbase server */&lt;br /&gt; client = new SensorBaseClient(host, user, user);&lt;br /&gt; client.authenticate();&lt;br /&gt; /* Send data from client to host with new user */&lt;br /&gt; /* Setting raw sensor data fields */&lt;br /&gt; SensorData data = new SensorData();&lt;br /&gt; data.setOwner(user);&lt;br /&gt; XMLGregorianCalendar tstamp = Tstamp.makeTimestamp();&lt;br /&gt; tstamp.setDay(3);&lt;br /&gt; tstamp.setYear(2008);&lt;br /&gt; tstamp.setMonth(2);&lt;br /&gt; data.setTimestamp(tstamp);&lt;br /&gt; data.setResource("/Users/hackystattest/TestHackystat.java");&lt;br /&gt; data.setSensorDataType("Build");&lt;br /&gt; data.addProperty("TypeOfBuild", "Development");&lt;br /&gt; data.setTool("Eclipse");&lt;br /&gt; client.putSensorData(data);&lt;br /&gt; tstamp = Tstamp.incrementHours(tstamp, 1);&lt;br /&gt; data.setTimestamp(tstamp);&lt;br /&gt; client.putSensorData(data);&lt;br /&gt;&lt;br /&gt; tstamp.setDay(15);&lt;br /&gt; data.setTimestamp(tstamp);&lt;br /&gt; client.putSensorData(data);&lt;br /&gt; tstamp = Tstamp.incrementHours(tstamp, 1);&lt;br /&gt; data.setTimestamp(tstamp);&lt;br /&gt; client.putSensorData(data);&lt;br /&gt; tstamp = Tstamp.incrementHours(tstamp, 1);&lt;br /&gt; data.setTimestamp(tstamp);&lt;br /&gt; client.putSensorData(data);&lt;br /&gt;&lt;br /&gt; tstamp.setDay(20);&lt;br /&gt; data.setTimestamp(tstamp);&lt;br /&gt; data.setSensorDataType(null);&lt;br /&gt; client.putSensorData(data);&lt;br /&gt;&lt;br /&gt; /* Return data given user and timestamp */&lt;br /&gt; SensorData returnedData = client.getSensorData(user, tstamp);&lt;br /&gt; assertEquals("Testing returned data", tstamp, returnedData.getTimestamp());&lt;br /&gt;}&lt;br /&gt;@After&lt;br /&gt;public void tearDown() throws Exception {&lt;br /&gt; /* Delete the user */&lt;br /&gt; client.deleteSensorData(user);&lt;br /&gt; client.deleteUser(user);&lt;br /&gt; assertFalse("Testing deletion", SensorBaseClient.isRegistered(host, user, user));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testGetMaxMonth() throws Exception {&lt;br /&gt; int numInstances = client.getSensorDataIndex(user).getSensorDataRef().size();&lt;br /&gt; assertEquals("Testing number of sensor data instances", 6, numInstances);&lt;br /&gt;&lt;br /&gt; String project = "Default";&lt;br /&gt; MaxMonth maxMonth = new MaxMonth(host, user, user, project);&lt;br /&gt;//    assertEquals("Testing getMaxMonth", 6, maxMonth.getMaxMonth(3,2008));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Overall, I still have very much to learn about using the provided Hackystat API's. Hopefully in the course of a few more days, I'll gain a better grasp on resolving my earlier issues.&lt;/div&gt;&lt;div&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/2534024747783979675-34218960488594990?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/34218960488594990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=34218960488594990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/34218960488594990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/34218960488594990'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/02/hackystat-programming-101.html' title='Hackystat Programming 101'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-4328434717714713343</id><published>2009-02-05T10:59:00.000-08:00</published><updated>2009-02-10T01:02:15.226-08:00</updated><title type='text'>ICS 499 - BMXNET, the next step</title><content type='html'>&lt;span class="Apple-style-span"  style=" ;font-family:'Times New Roman';"&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;u&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Purpose:&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The purpose of this proposal is to gain minimal insight into electronic health record systems (EHR), and to explore the possibilities of developing an open source component to enable greater extensibility and interoperability for development platforms.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;u&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Introduction:&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The Indian Health Service (&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.ihs.gov/index.asp"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;IHS&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;) is an organization under the U.S. Department of Health &amp;amp; Human Services (HHS) that provides health care services for American Indians and Alaskan Natives through federal IHS, tribal, urban-operated facilities and programs. The scope of its health care services have expanded into over 500 health care facilities composed of hospitals, health centers, school health centers, health stations, satellite clinics, and Alaskan village clinics. IHS and the U.S. Department of Veteran Affairs (&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.va.gov/"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;VA&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;) are long time collaborators in the tradition of health information and technology advance sharing. In 1984, IHS picked up on the VA's very own "VistA" medical health information software (not to be confused with Windows Vista) and renamed their version of the system to "Resource and Patient Management System" (&lt;/span&gt;&lt;/span&gt;&lt;a href="http://tinyurl.com/cl5te3"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;RPMS&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;). RPMS is one of the most notable and successful adaptations of VistA health information systems. RPMS is a decentralized, conglomerate application composed of 60 plus applications fitted to work independently or in unison. The software modules can be broken up into three main categories: 1) Practice management applications that consist of patient registration, billing, scheduling, etc., 2) Clinical applications that directly support health care planning, delivery, management, and research, and 3) Infrastructure applications that consists of the management, development and communication tools of RPMS. Our main focus will be on the infrastructure of RPMS by utilizing the tools associated with it, including VA's Kernel package manager system, and the all important VA's FileMan as RPMS's database management system.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;b&gt;&lt;u&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Problem: &lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;Currently hospitals and clinics pay millions (in Hawaii $20-50 million) just to implement a commercial enterprise medical health record software. What can we do to reduce the cost and increase support for our hospital clients? Also, developing GUI tools for medical health record systems require prior knowledge of old languages like &lt;/span&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/MUMPS"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;MUMPS&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; or clunky looking GUI's for reporting patient data built in Delphi. How can we increase the support and ease the pain for future developers planning to write Electronic Health Record systems (EHR) but have to adapt to decades of tradition?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;u&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Solution and Goal:&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Amongst the various tools and applications written for RPMS, there is one with the sole purpose to communicate to a level of .Net supportive applications. This component is called BMXNET. BMXNET is a .Net specialty tool that provides disconnected row set technology for linking .Net applications with RPMS. This built in library gives the ability to communicate with RPMS by simple query statements (SQL data definition language) to access patient records and returns them in a familiar .Net data structure. So with that fact in mind, why don't we build a component that utilizes BMXNET to support multiple runtime engines such as Mono and Java. By doing this we will improve the interoperability of development platforms and give developers a greater range of environments to develop GUIs for EHR systems. Simply, no more looking at dirty, old 60's code written MUMPS. Let's eliminate the thousand lines of code that you know can be done better in another language more comfortable to you as a developer and meets todays expectations of Object Oriented Programming. This will also save hospitals millions in costs for purchasing the EHR software (plus tech support) and hopefully create a more aware community of open source developers for bettering the health care industry.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;u&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The next step:&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;In the past week, I've had the chance to dive into two documents regarding the setup and running of BMXNet. These user, technical/developer guides can be found directly from IHS's home site &lt;/span&gt;&lt;/span&gt;&lt;a id="alfm" href="http://tinyurl.com/b2v27v" title="here"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;here&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;. The user guide helps first time developers new to BMXNET get started in using the classes of ADO.NET and integrate them with BMXNET (now .NET 2.0 framework supportive) technologies, while the technical guide gives the infrastructure of BMXNET. I will begin within the next few days by rolling out a test/development server for installs of RPMS and &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.fidelityinfoservices.com/FNFIS/Markets/NonFinancialIndustries/Healthcare/GTM/"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;GT.M's&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; compiler for the standard M (MUMPS) language. Hopefully by then I'll be able to communicate from a .NET application (written in C#) to RPMS via BMXNET. The next steps will be to figure out a way to translate these exchangeable commands to be consumed by another runtime engine besides C# and the .NET environment platform (the conversion and eventual goal). At this point, Mono seems to be the easiest but we can't rule out that its fully .NET compatible since it merely provides a portal for Windows .NET applications to be ran in Linux.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-4328434717714713343?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/4328434717714713343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=4328434717714713343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4328434717714713343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4328434717714713343'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/02/ics-499-bmxnet-next-step.html' title='ICS 499 - BMXNET, the next step'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-6201950159143126864</id><published>2009-02-04T14:45:00.000-08:00</published><updated>2009-02-09T03:19:31.648-08:00</updated><title type='text'>Devcathlon Code Reviews</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY_gCV-OMBI/AAAAAAAAABU/z0lgKpEfv4U/s1600-h/time-lapse.png"&gt;&lt;/a&gt;&lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;b&gt;Premise: &lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: Verdana; font-size: 13px;"&gt;In this blog entry I'll be reviewing three code bases (including my own) for the mock up implementation of our game project, called Devcathlon. In the following reviews, I will pin-point the good and the bad of each code base and hopefully that will give certain insight into future designs for this project. Although not all issues will be addressed, I will certainly mention ones from my experiences in building these mock ups and my understanding of the game.&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;b&gt;The Reviews:&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: Verdana; font-size: 13px;"&gt;I will try to section off each review with the following outline:&lt;/p&gt; &lt;p style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: Verdana; font-size: 13px;"&gt;&lt;i&gt;Functionality and Features:&lt;/i&gt;&lt;/p&gt; &lt;ul style="list-style-type: disc;"&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Can the user login?&lt;/li&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Does the user have the ability to create or edit form elements, such as personal, team or team member information?&lt;/li&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Is there a way to create event matches between two or more teams?&lt;/li&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Is it possible to make record of or reputable proof of pair programming?&lt;/li&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Are the points properly assessed and clear?&lt;/li&gt; &lt;/ul&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:13px;"&gt;&lt;i&gt;Aesthetics:&lt;/i&gt;&lt;/p&gt; &lt;ul style="list-style-type: disc;"&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Did they embed useful technologies, such as Javascript, CSS or XML? (also including external widgets or libraries)&lt;/li&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Are the points nicely displayed and easy to the human eye? &lt;/li&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Does the user interface (UI) make effective use of screen real estate? &lt;/li&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Does the user interface provide a logical structure?  Is the organization consistent from page to page, or do different pages have completely different layout.&lt;/li&gt; &lt;/ul&gt; &lt;p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:13px;"&gt;&lt;i&gt;Ease and seamless:&lt;/i&gt;&lt;/p&gt; &lt;ul style="list-style-type: disc;"&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Does the user interface enable the user to accomplish common Devcathlon tasks efficiently?  How many "clicks" does it take to accomplish common tasks?  Is the information you need to accomplish a task available on the screen? &lt;/li&gt; &lt;/ul&gt; &lt;ul style="list-style-type: disc;"&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Do the data input mechanisms facilitate correct entry?  For example, if a date is required, does the UI provide a calendar widget, or does it require the user to type the date in as text?&lt;/li&gt; &lt;/ul&gt; &lt;p face="Verdana" size="13px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;i&gt;Overall summation:&lt;/i&gt;&lt;/p&gt; &lt;ul style="list-style-type: disc;"&gt; &lt;li style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Does all the above information give the website cohesive enjoyment of a game? Also, does the website leave room for possibilities outside of its initial domain?&lt;/li&gt; &lt;/ul&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p face="Verdana" size="13px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;b&gt;Mock up 4:&lt;/b&gt;&lt;/p&gt; &lt;p face="Verdana" size="13px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Mock up 4 was certainly a round up of many things experimental. It worked out like a sandbox for possible fun changes and re-works of existing features. I, along with two other members had a personal involvement in this implementation of Devcathlon's mock up 4. We based our implementation off of the unique design employed by one of our members' previous mock ups. This initial mock up had everything needed, including drop-down menus and an overall social network-like feel for design. In many aspects, the implementation in its "mock up" stages felt almost like a real world web 2.0 website. &lt;/p&gt; &lt;p face="Verdana" size="13px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;Functionality and Features:&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p face="Verdana" size="13px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Mock up 4 has all the features expected for any website. It has a login and sign up page, home page for introductions, and help pages for hints and usages. It also strengthens its features by utilizing its fully expandable drop-down menus, making it easier to navigate through the site and finding its subsequent pages. Along with signing up for an account with the website, this mock up enables reusable forms for creating/editing a user's personal, team, project or match information. Upon logging into the site with proper authentication fields (login and password), the user is presented a welcome screen and their common functions, including links to the user's public/private profile, a team, match creation page, match invites, self-report requests, and site-wide announcements beneath it all. The public/private profile page provides an abundant set of information about a user and their involvements in teams, projects, and matches. This profile page is the center of every Devcathlon user's life. It provides information on the user's standing (system wide rank), recent achievements and matches, currently associated teams and ability to post/reply to comments underneath. To the right of all of that, the user is given email notifications in a personal inbox. This functionality of an inbox is still debatable amongst other designers, but it is a feature that has no bounds for possibilities. The only reason to include a personal inbox for Devcathlon is to provide convenience to the user, but hinders the fact that the information is repetitive and can sometimes be annoying if a person sees it both in their email and upon logging in. Also, beneath that is a list of the possible actions the user can take for interacting with Devcathlon (similar to the welcome page: create team, match, self report, etc.). The forms are in fact very reusable and encompasses the full gist of user interaction within Devcathlon. So it is important to get these forms to seem quick and convenient for the user. All the action links mentioned early will be representing in a form field-set fashion. For the team creation page, a user is able to search for existing teams, other members and projects. The parameters for the team creation page includes all relevant text to get the user started, including the team name, team type (appropriating members relations by organization, friends, etc.), team project definition, and an about section. Although this page needs more work in functionality, the intent is quite clear that we would want a dynamic page rendering both a search for existing teams, members and projects, and the ability to create a fresh new team on-the-fly. The match creation page also provides a comprehensive coverage of all required inputs for creating a match. It intelligently populates a drop-down of options including all your team and project involvements. There is a section to invite teams, but it doesn't follow the organizational structure of rendering a search for existing teams. In actuality it has a text area box for text input separating each team name with a semicolon. I feel that this is a bit ineffective and inconsistent with the team creation page which included the search. Other parameters for the match include the time period of the match (start and end dates), minimal score settings for commits, builds, and test coverage (which can be expanded for more customizable settings). Self-report request is another debatable matter that needs further nurturing for full acceptability in our game. However, in mock up 4, we dealt with this problem by asking the user to provide a brief description and picture for proof of the project being worked on. A neat product of this is that you can challenge other teams for self-reporting, as well as submit your own for pending assessments. This idea still needs valuable time to test in order to resolve issues involving point assignments and ethic values (the integrity of the feature to no be used to ones advantage through malicious means). The last action is for accepting or declining match offerings. This accept/decline match page provides a quick summary of the match for the team member who chooses to "accept" or "decline." Now, moving along the top navigation bar, a user is also able browse Devcathlon user profiles. This is another iteration of the technique in utilizing some kind of search for our persistent display of records. This will provide better "coverage" in linking our site together by means of relations and/or associations. Each page, including the gallery, match, team, or hall of fame features areas for knowledgeable information of awarded/deducted points of a team and its members. &lt;/p&gt; &lt;p face="Verdana" size="13px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;Aesthetics&lt;/i&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p face="Verdana" size="13px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;Admittedly, this is the most acceptable looking Devcathlon mock up from our first initial mock ups. It is evidently so, since the mock ups here on after utilize this very same CSS and navigation bar. Initially, the first thing they will see is the site's initial home page (public view). This page provides information regarding the motivation of our site and link to forms for account authentication (log in) or sign up. At this stage, the public view is quite elementary and not very elaborate in design. The layout simply has a header, a logo area, navigation bar, main content, and footer for notes. The public view also limits the information and access to certain pages of the site.&lt;/p&gt; &lt;p style="margin: 0px; text-align: center; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4D3mzI8EcZA/SY-70SUd-FI/AAAAAAAAAAc/1xQELOgfeMY/s1600-h/home_login_signup.png"&gt;&lt;img src="http://4.bp.blogspot.com/_4D3mzI8EcZA/SY-70SUd-FI/AAAAAAAAAAc/1xQELOgfeMY/s320/home_login_signup.png" alt="" id="BLOGGER_PHOTO_ID_5300661793383643218" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 68px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4D3mzI8EcZA/SY-7RgNSvhI/AAAAAAAAAAU/lVu1d8MgmuA/s1600-h/home_login_signup.png"&gt;&lt;/a&gt;&lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;/p&gt;&lt;p   style="margin: 0px; text-align: left; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;font-family:Verdana;font-size:13px;"&gt;When the user signs into the website, the first thing they will notice as they hover their mouse over the navigation bar is the very responsive drop-down menus and sub-menus. The chromed-like tabs have a significant depth as you hover over it, and makes for a fairly readable and fun user interaction. The font settings are also readable and it makes some use of titling, large or small text, and bullet-points. Links are also distinguishable by underlining the link text as you hover your mouse over it. The color scheme somewhat conforms to the Hackystat look with a few tid-bits here and there. Each page uses up the real estate fairly well, by populating information where it is needed or centering the content through divs. When you navigate over to the "My Team" page, you'll notice the compactness of all teams related to the logged in user. As you hover over a team, the element is highlighted, indicating some user interaction and implying a click-able object on the page. When the user clicks on the tab it expands out listing quick information about the team and team members. The magic behind this features lies in the classes written in Javascript by Adobe's Spry Framework. This JS includes the timed effects for the collapse and expansion of each tabbed panel. The motivation behind this is to increase user focus in interaction, save real estate, and to minimize users from scrolling up and down a page too excessively.&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; text-align: center; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY-8eC4V5BI/AAAAAAAAAAk/od6GGZ-LAZA/s1600-h/collapse_expand.png"&gt;&lt;img src="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY-8eC4V5BI/AAAAAAAAAAk/od6GGZ-LAZA/s320/collapse_expand.png" alt="" id="BLOGGER_PHOTO_ID_5300662510793647122" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 83px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4D3mzI8EcZA/SY-70SUd-FI/AAAAAAAAAAc/1xQELOgfeMY/s1600-h/home_login_signup.png"&gt;&lt;/a&gt;&lt;p face="Verdana" size="13px" style="margin: 0px; text-align: left; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;As you navigate further, following the clickable links you will notice again the usage of this collapse and expand feature for displaying multi-formed information that's nested per person, team, and match. You might think, what if the tab panels get to be too long and excessive themselves? Yes this could happen, thus we will propose a simple anchor system for referencing page content elements (like chapters in a book). This will enable users to jump back and forth between sections of a page.&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; text-align: center; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY-8ypkZ3mI/AAAAAAAAAAs/hcHIZxvzoJQ/s1600-h/anchors.png"&gt;&lt;img src="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY-8ypkZ3mI/AAAAAAAAAAs/hcHIZxvzoJQ/s320/anchors.png" alt="" id="BLOGGER_PHOTO_ID_5300662864776388194" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 66px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY-8eC4V5BI/AAAAAAAAAAk/od6GGZ-LAZA/s1600-h/collapse_expand.png"&gt;&lt;/a&gt;&lt;p face="Verdana" size="13px" style="margin: 0px; text-align: left; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;On the match page, there is a nice fight-card line-up for players to easily compare teams in a match. The only flaw behind this is the possibility of having lots and lots of teams per match. Because of this, the real estate of our page will grow out of the scope of the content and will most likely make it harder for users to navigate or compare.&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0px; text-align: center; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY-9FbNOVqI/AAAAAAAAAA0/cMTOn6wWEGo/s1600-h/match_fight_card.png"&gt;&lt;img src="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY-9FbNOVqI/AAAAAAAAAA0/cMTOn6wWEGo/s320/match_fight_card.png" alt="" id="BLOGGER_PHOTO_ID_5300663187338581666" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 171px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY-8ypkZ3mI/AAAAAAAAAAs/hcHIZxvzoJQ/s1600-h/anchors.png"&gt;&lt;/a&gt;&lt;p face="Verdana" size="13px" style="margin: 0px; text-align: left; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;Also, the rows of each table have hover interactions indicated by color changes as the user passes over the top of it.&lt;/p&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY-9S22KUpI/AAAAAAAAAA8/0NJu3GL66Y8/s1600-h/table_row_hovers.png"&gt;&lt;img src="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY-9S22KUpI/AAAAAAAAAA8/0NJu3GL66Y8/s320/table_row_hovers.png" alt="" id="BLOGGER_PHOTO_ID_5300663418096341650" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 102px;" border="0" /&gt;&lt;/a&gt;&lt;p face="Verdana" size="13px" style="margin: 0px; text-align: left; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;Ease and seamless:&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;The overall navigation is fairly self-explanatory. Links are easily distinguishable with underlines, borders, and color highlights as the mouse hovers over the text/object. The effectiveness of each page is quite seamless and comforting for any first-time user visiting the page. Information is linked wherever the sub-pages are needed and can be previewed using the collapse/expand feature of the tabbed panels. When the user commits to viewing a certain page (eg: team or match) then there is a separate page for it as well, thus giving the content of each page enough air to breath within its subject matter.&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;Overall summation:&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;/p&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;span style="font-style: normal;"&gt;I think it is safe to say that this, and all the other mock ups have intentional room for expansion. The difficulty in saying that is in the consequence of not knowing exactly which path to take for expansion. There are multiple routes to consider and they might not all lead to extraordinary UI's. &lt;/span&gt; &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;i&gt;**Please note that a lot of the analysis in the first mock up will carry similar descriptions in both mock ups 5 and 6. Thus they will be shorter, and will only expresses dissimilar features from the first.&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;br /&gt;&lt;b&gt;Mock up 5:&lt;br /&gt;&lt;/b&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;i&gt;Functionality and Features:&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;span style="font-style: normal;"&gt;When browsing over to the "My Matches" page under "My Profile" there is a clear list of all matches associated to the user. The listing also indicated which match is currently marked "active" or "complete." After clicking on a match for extended details, you'll also notice a nifty table showing all recent points. On the same page, if you click on "see details" then it will display a history of &lt;/span&gt;&lt;i&gt;all&lt;/i&gt; points between each team in the match. It also gives a time stamp of each event and its corresponding points gained or deducted.&lt;br /&gt;&lt;i&gt;Aesthetics&lt;/i&gt;:&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;All lot of the CSS and page layouts were fairly similar to the previous mock up. &lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;i&gt;Ease and seamless:&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;i&gt;&lt;span style="font-style: normal;"&gt;The links were very clear and simple to follow.&lt;/span&gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;Overall summation:&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;span style="font-style: normal;"&gt;The history of points received for each match and team is a great feature and must be incorporated in a similar fashion for our future Devcathlon game.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4D3mzI8EcZA/SY_ZoHXmzYI/AAAAAAAAABE/ctzoGZ-v8SU/s1600-h/point_history.png"&gt;&lt;img src="http://4.bp.blogspot.com/_4D3mzI8EcZA/SY_ZoHXmzYI/AAAAAAAAABE/ctzoGZ-v8SU/s320/point_history.png" alt="" id="BLOGGER_PHOTO_ID_5300694569634418050" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 135px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY-9S22KUpI/AAAAAAAAAA8/0NJu3GL66Y8/s1600-h/table_row_hovers.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Mock up 6:&lt;br /&gt;&lt;/b&gt;&lt;i&gt;Functionality and Features:&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Mock up 6 employs a very strict set of levels for player achievements. The level definitions follow a military standard of badge ranks.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY_fcwLiw3I/AAAAAAAAABM/KQdDAcXJSiY/s1600-h/military_badges.png"&gt;&lt;img src="http://3.bp.blogspot.com/_4D3mzI8EcZA/SY_fcwLiw3I/AAAAAAAAABM/KQdDAcXJSiY/s320/military_badges.png" alt="" id="BLOGGER_PHOTO_ID_5300700971501011826" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" border="0" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style=";font-family:Verdana;font-size:13;"  &gt;Another unique feature lies in the "My Matches" page. This page includes history listings with weekly reports of team accumulated points. This could prove to be a better way than simply listing a full history and time stamp of each consecutive event in one long table. We could break things up in the weeks and months depending on the elapse of the project and its total project life span.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY_gCV-OMBI/AAAAAAAAABU/z0lgKpEfv4U/s1600-h/time-lapse.png"&gt;&lt;img src="http://1.bp.blogspot.com/_4D3mzI8EcZA/SY_gCV-OMBI/AAAAAAAAABU/z0lgKpEfv4U/s320/time-lapse.png" alt="" id="BLOGGER_PHOTO_ID_5300701617300844562" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 132px;" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;i&gt;Overall summation:&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;b&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;font-family:Verdana;" &gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Mock up 6 also made an attempt to explore the possibilities of integrating Devcathlon with Hackystat. This idea seems great, yet it takes away the pure independence of this game. By placing Devcathlon as just a tab in Hackystat, then we are confined within the territories of Hackystat. On the flip side, the concept of using the data records of Hackystat should be supported for our application. I think that by reusing the account information supplied in Hackystat, we can possibly pre-populate the team and project definitions automatically for our Devcathlon players.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:georgia;font-size:100%;"  &gt;&lt;b&gt;UI Suggestions:&lt;br /&gt;&lt;/b&gt;Provided the three mock ups, I will make some recommendations regarding the design and function of Devcathlon. I will base my design off of my own Mock up 4. All of my previous comments will still apply. The only thing that still bothers me is the fact that pair programming is in all difficult to track due to consequent ethics of the game. To solve this issue of pair programming, I would like to implement a system of discussions per code event or issue. This will be recorded by our google discussion board (created for Devcathlon projects or teams) and assessed either amongst group members or members of another team. So by following good programming practices, every programmer is required to code on part of a particular issue or task. If the user confines to those guidelines as they are assigned to them by the team, then the user is considered "on task," otherwise "not on task" (for point deductions). Other than the issue raised about pair programming, the design patterns in Mock up 4 makes for a good starting point for our future implementations regarding UI's. One thing that lacked from Mock up 4 was a system for levels. We had an idea of using human evolution as a way to advance or mature a player, but it has hidden implications that might offend a few people. Because of this concern, I would consider Mock up 6's standard for leveling a player through military ranks. It sounds more formal, yet it gets to the point and seems to feel more natural. Another neat detail given in Mock up 6 is the way of sectioning timed events by months, weeks, and days. This way, we can store and retrieve our data records more easily in these timed archives. The idea is very similar to how Blogger organizes each blog post by month, year and/or by subject.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Conclusion:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;I'm still tempted to say that the overall enjoyment of the game is still up in the air, since there are still little interactions between players and possibly gameplay. Plus, this observation is only from my perspective of creating these mock ups. Perhaps, getting into the game and actually experiencing the behavior of each functional feature will give better rise to the actual game as oppose to just pure speculation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;b&gt;--&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;b&gt;Resources:&lt;/b&gt;&lt;/p&gt; &lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;Mock up code bases: &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/"&gt;http://code.google.com/p/hackystat-ui-devcathlon/&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;Monitor code changes: &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/source/list"&gt;http://code.google.com/p/hackystat-ui-devcathlon/source/list&lt;/a&gt;&lt;/p&gt;&lt;p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 16px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-6201950159143126864?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/6201950159143126864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=6201950159143126864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6201950159143126864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6201950159143126864'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/02/devcathlon-code-reviews.html' title='Devcathlon Code Reviews'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4D3mzI8EcZA/SY-70SUd-FI/AAAAAAAAAAc/1xQELOgfeMY/s72-c/home_login_signup.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3996075984703272246</id><published>2009-02-04T05:59:00.001-08:00</published><updated>2009-02-04T14:44:17.104-08:00</updated><title type='text'>Devcathlon Mockup Part 2</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise: &lt;/span&gt;&lt;br /&gt;In continuation of the previous two blog entries regarding &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Devcathlon&lt;/span&gt;, I will again review my experiences and concerns in this second part iteration of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Devcathlon's&lt;/span&gt; mock up site. I will also briefly mention additions to our events list, the concept of "badges", and levels.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Designer &lt;=&gt; Developer:&lt;/span&gt;&lt;br /&gt;This is my second iteration of mocking up the interface design for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Devcathlon's&lt;/span&gt; site. I noticed that the first mock up proved to be a challenge since it used to be easier to just pass the design stuff over to a professional designer, and not have to worry about it. This kept the designing and coding schema separate and provided production boosts (through specialization) for the overall project. However, in these past two mock ups I was able to wear both hats of being a developer and designer. First and foremost, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;CSS&lt;/span&gt; is a prevalent skill. I say this with confidence, because any markup text in this day and age requires the usage of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CSS&lt;/span&gt;. Do whatever you can to muster the basics of elements, tags, descendants, etc. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;CSS&lt;/span&gt; will be heavily used in your HTML and it's a proven to simplify a lot of styling out of your markup (keeping HTML basically what its good for, which is rendering text and links). I think the terms of a "developer" or "designer" can be interchanged and used similarly in certain situations. Considering the objective, problem or solution, either a designer or developer will look at it in terms that are not all that distinct. When a programmer programs, he or she technically has to "design" themes from real world entities that can be classified as classes (in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;OOP&lt;/span&gt; languages today). Even though when the programmer thinks that he's "programming," in fact, he's actually designing before even writing a single line of code. On the other side of the coin, designers are faced with the fact of creating something usable, appealing to a user, and seem less. So, designers simply create &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;GUIs&lt;/span&gt; in the front-end of the spectrum, yet they transmit some work flow details of a user. The work flow of a user is the interesting part of being a designer. At the stage of getting the "look" down, a designer must also take into consideration for the "feel" of what they are building (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;eg&lt;/span&gt;: buttons, links, forms, etc.). These interactions are crucial and play a large part in the functionality and behavior of a site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Eventful" Additions&lt;/span&gt;:&lt;br /&gt;My team and I came up with two other simple events regarding the basic units of building and coverage. A team member can build to success or failure depending on circumstances of frequency and trend relations. If a person builds frequently, and does so over a certain period of time without significant changes to the code, then that person gets penalized for "&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;unnecessary&lt;/span&gt; building" (vice-versa). The other concept deals with the almighty relation between writing test code and coverage. Instead of just looking for an increase or decrease in the level or percent of coverage, we will also include the relational trend of the graph. Some relational dependencies to this event include: early test cases and incremental coverage gains. The trend (provided by Hackystat) should help in determining early built test cases for basic class or method functionality. From there on, we detect any fragments of change in coverage (gains or loss). If the user continues following the good practice of writing his tests before integrating the app any further (test driven development), then he'll benefit in the long run of the game. As for those who don't change much in coverage and remain stagnant throughout will suffer penalties.&lt;br /&gt;The concept of "badges" is not a new topic, but it has been highly mentioned when dealing with determining valuable players in the game or team. Badges are awards (almost like mini trophies) given out to individual players who achieve certain number of plus points.&lt;br /&gt;Another concept was the idea of "levels" for a player or team to achieve a certain number of points to advance. A player or team can advance to levels through a system of recognized achievements. Just to add some kicks and giggles, we followed the concept of human evolution with imposed implications of software engineering as the end point of the time line.&lt;br /&gt;&lt;br /&gt;The code and other resource materials can be found here: &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/"&gt;http://code.google.com/p/hackystat-ui-devcathlon/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3996075984703272246?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3996075984703272246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3996075984703272246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3996075984703272246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3996075984703272246'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/02/devcathlon-mockup-part-2.html' title='Devcathlon Mockup Part 2'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-761599820287472473</id><published>2009-01-26T02:06:00.000-08:00</published><updated>2009-01-26T04:55:07.322-08:00</updated><title type='text'>Devcathlon site mockup</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Overview:&lt;/span&gt;&lt;br /&gt;This past week my group and I were tasked with mocking up the general features of our game, called Devcathlon. To learn more about Devcathlon, please read the blog &lt;a href="http://anthonymdu.blogspot.com/2009/01/whats-in-game.html"&gt;post &lt;/a&gt;prior to this one or head on over to &lt;a href="http://code.google.com/p/hackystat-ui-devcathlon/"&gt;http://code.google.com/p/hackystat-ui-devcathlon/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Planning:&lt;/span&gt;&lt;br /&gt;Generally, I approached the mock up of Devcathlon like any other website. The parts that go into a website are apparent and can be easily modeled by notable ones like Google, Blogger, or Facebook. It seems to be a must, in today's standards of Web 2.0 to have Ajax functionality and dynamic webpage access and retrieval. Unfortunately, our mockup didn't express those characteristics physically, but the idea is still quite enforced. I thought of the application as more of a social website. So the basis of this application is very much that, it had to be socially adept and capable of growing. Users should be able to communicate with others in a personal or public matter depending on what the situation calls for. Designing the structure of the site wasn't very specific, but it had to be standardized. We simply broke the site into two parts, the public and private domains. The public section of our site is a simple "tour" for any outside user who is willing or just curious to explore our site without a direct account. Of course, for any alien who comes near our site, we restrict them access to certain elements or retract any links that only should be seen by registered users.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Site work flow:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; * Public user enters site's home page. He or she is prompted for a login/password.&lt;br /&gt; * User enters a valid login/password, then gets redirected to his or her's profile page.&lt;br /&gt; * The logged in user is able to edit their profile as they please, add/remove/update teams and matches.&lt;br /&gt; * Registered user could also search and associate with existing teams or matches.&lt;br /&gt; * Every user is provided a personal and public profile.&lt;br /&gt; * When a match is declared then it is marked as a user event and should message the user under their recent activities.&lt;br /&gt; * When a user gets prompted by an administrator, then that information is displayed under notifications.&lt;br /&gt;&lt;br /&gt;Besides dealing with site administrative tasks, such as creating a user account and modifying profile settings, we also focused on important questions dealing with how the game should work. One idea that I posed (as mentioned in my previous entry) is to possess every user/player the ability to create stories/tasks for themselves as the project/game progresses to a goal/objective. Creating these special “stories” is another way of saying a developer creates an issue on an issue tracking system (Google Project Hosting). Upon generating these stories, other players can either interact or discuss (Google’s issue discussion groups) about a particular subject and trade off ideas through post entries. This way players will interact with other players and thus resolve some obtainable “mini” goals. Mini goals can also be known as a milestones or phases in a project development (stages or levels in games) that give players awarded advances and points for their achievement. All of these aspects are simply ideas, but we have yet to encounter the facts of reality in creating such a world for them to exist in. Hopefully in our next increment of this project, we will dive into those concerns in more detail.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mocking an entire website from scratch is particularly difficult since website designers need to anticipate every move. Every form built was either doodled out or envisioned multiple times before getting it right. Most likely changes will be made after the mock up, so I wouldn’t be surprise that we would keep or discard certain elements from the current design. Unfortunately, the only regret I had during this process of mocking was the lack of “mock tools.” I wish we had more open source mock-supported development tools for web development. Maybe they won’t reach the same standards such as high competing tools from Adobe’s Creative Suite, but we need to start somewhere to ease the process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-761599820287472473?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/761599820287472473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=761599820287472473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/761599820287472473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/761599820287472473'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/01/devcathlon-site-mockup.html' title='Devcathlon site mockup'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3136224166983452741</id><published>2009-01-17T12:45:00.000-08:00</published><updated>2009-01-17T14:01:19.871-08:00</updated><title type='text'>What's in a game?</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;b&gt;Overview:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;In this brief blog entry, I'll explain the concepts of game designing and utilize these tactics to enable a better understanding of my new venture into a project called &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Devcathlon&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Devcathlon&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Devcathlon&lt;/span&gt; is a computer game designed to help improve software development and developers while rating the health of their project. The players include the developers, tech managers, etc, game pieces include the code, quality assurance (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;QA&lt;/span&gt;) tools, etc. Continuous integration is a software engineering practice to help teams speed up their implementation and expected delivery date by providing automation of redundant tasks (such as building code, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;QA&lt;/span&gt; builds, maintaining a code repository, etc.). The concept of the game is derived from a collection of continuous integration practices that should be second nature to most software engineers/developers. The goal of this game is to provide an educational way of keeping a developer on task with such practices. Once the developer sees that the game is not just a way of racking up points and envelop in certain bragging rights, but it also fuels the notion that you are really just competing with yourselves. The self-&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;improvement&lt;/span&gt; of an individual will contribute to the overall success and health of a project.&lt;br /&gt;&lt;br /&gt;So far, we understand the motivation of the game we are trying to create, but we have yet to capture the attention of what a game really is and how to go about from creating a successful one.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;b&gt;Designing a game&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;What's in a game? What is the effective game design? The methodology behind the creation of a game is undoubtedly its high standards in the designing process. Let's first define the meaning of a game and the essence of a computer game. A game is basically a contest of rules designed to have multiple players making strategic decisions to achieve a specific outcome (winning). In computer games, the definition is not all that different, it is a software program in which one or more players make decisions through the control of game objects and resources, in pursuit of a goal. The make-ups of a game is fairly simple, yet the complexities lie in the makings of the game. Every computer game consists of players that interact with or against each other to obtain or reach an objective/goal. The players provide a variety in a game. Each player has a personality and it shows as they make decisions in the game. Another resource that's &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;prevalent&lt;/span&gt; in this game is the game objects. Game objects or resources are the tools that equip a player in the game. These objects are either given or obtained as the process of the game continues. Every game needs an obtainable goal and objectives leading up the climatic conclusion of a game. The interesting part about the goal of our project is that it is fairly non-&lt;span id="query" class="query"&gt;aesthetic&lt;/span&gt;, very virtual, because it is meant to educate a developer and his team. That is the higher logic of our goal, yet it sets apart from the "mini" goals needed to achieve a higher standing in the game. In a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;competitive&lt;/span&gt; thinking process, you are trying to out think your opponents, and gain an edge in winning the game. In our situation, getting an edge is a matter of how motivated you are to keep up with tasks relating to your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;dev&lt;/span&gt;elopment environment. Some questions would be: Is the user doing daily builds like he should?, or Did he make his 1 of three commits for the week?, etc. Is it possible to have a competitive edge in our game without tiring the player? Can we relieve a team by rewarding them for good behavior? In every good game, there is a matter of aptitude decision making on the part of the player. They make decisions to either square against a demon from hell or choose to run away and find shelter to level up. These questions are posed to the player and in relation to the outcome of the game. How will decision making be incorporated with our game? What will we need to give developers a crux in the game where they would have to choose routes? Another matter is the dealing of balance in a game. For example as players play the game, they are ranked on the games scoring report, and from that we rank #1 as the winner of the game. But in our situation ranks are not set, in that I mean there will be times when other development teams who play &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Devcathlon&lt;/span&gt; will have a succeeding or lost for one day. So to say that balance is in the game, then we have achieve at least that much in the process of effective game designing. The other hot topic goal of gaming is the feeling that the player feels mentally "immersed" in the game. Every successful game gives us that feeling of importance for a character and its relation to its environment. As players become more involved to the grounds of what they are trying to achieve, then the soul purpose of the game becomes more apparent.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Conclusion:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;When it comes to creating a game then every detailed manner has to be addressed clearly and reasonably. The design process is a key aspect in developing a coherent game. The pieces and the overall concept or objective is primary to when drawing an audience of players. Once a developer has a product concept in mind, the next part is to involve drilling into the details of each subset piece of the game, then analyzing how each piece will integrate with each other as a whole.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open issues and ideas for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Devcathlon&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;One of my main concerns is regarding the blind processing of pair programming. How will this issue be dealt with? We can probably create options for pair programming and delegate points depending on the difficulty of tasks (changes via code base) and number of participating members. Another interesting topic not mentioned heavily above is the concept of artificial intelligence. Possibly in a more stylized situation will we need such a component where the computer itself will challenge our players rather than just having our players go against themselves. However, one situation would be to supply a "tutorial" of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Devcathlon&lt;/span&gt; to simulate a good, bad, and okay development project environment given a default sample program event. The process will detail the scoring and correct moves to be successful in the scoring high in the game. Player interaction with other players are somewhat limited to the design of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Devcathlon&lt;/span&gt;. Possibly communication is dealt with elsewhere from the system, but there is no good way of knowing that. One way to solve this is to have conversational story boards, where each developer is required to write a "story" before hand, to describe his/her intention in a very technical manner (using bullets etc.). Each story will be in &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;conjunction&lt;/span&gt; of a task (provided by issue tracking). For every story there is a twist, given exceptions where the story teller doesn't know the ending. So another team member jumps into provide a more complete "ending" to the story. These &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;interactions&lt;/span&gt; will be mapped out via issues and marked as "dependent on" another issue number. We can score a project on their &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;effectiveness&lt;/span&gt; of communicating with each other and issue management! Of course, this is only a very rough draft of what's to come. Hopefully when our development team gets into the nuts and bolts of this project, only then will we know exactly what is effective or not.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resources:&lt;/b&gt;&lt;br /&gt;&lt;span&gt;&lt;a title="http://code.google.com/p/hackystat-ui-devcathlon/wiki/References" href="http://code.google.com/p/hackystat-ui-devcathlon/wiki/References" id="h7e2"&gt;http://code.google.com/p/hackystat-ui-devcathlon/wiki/References&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Other resources:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;The Art of Computer Game Design by: Chris Crawford&lt;/i&gt;&lt;br /&gt;&lt;a href="http://tinyurl.com/dmug"&gt;http://tinyurl.com/dmug&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This online book explains the artistry of creating a game. Although the time period of which this book was written seems old, I have to still consider this a good starting point for any game developer or gamer to grasp. The thing that drew my attention the most was that it provided history about the evolution of gaming and the growth of the gaming industry and users. He starts out giving a good two chapters worth of information about what a game really is and different gaming genres. The author also speaks about the future of gaming and its implications on our world's society. He also addresses many predictions that are very true in our community today. The book also describes the game design sequence which lays out a general sense of what computer game developers can do. The author merely presents his generalizations and habits as suggestions rather than a strict set of processes which readers will find very coping.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;A Primer for the Design Process, Part 1&lt;/i&gt;&lt;br /&gt;&lt;a href="http://gamasutra.com/features/20000630/huntsman_01.htm"&gt;http://gamasutra.com/features/20000630/huntsman_01.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This interesting, yet incomplete article dives into the concerns of gaming and the market as to inter-relating things. It follows a more business approach for real world game developers, and makes you pose questions prior to implementing your game. The article serves as a simple planner for effective game designing in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;pre&lt;/span&gt;-production stages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gamasutra&lt;/span&gt;&lt;br /&gt;&lt;a href="http://gamasutra.com/"&gt;http://gamasutra.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Good place to learn and contribute the gaming community.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Java Game Development&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.gamedev.net/reference/programming/features/javagame1/"&gt;http://www.gamedev.net/reference/programming/features/javagame1/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Describes the technical details of creating a full-fledged game using Java as the platform for development.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;GameDev.net &lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.gamedev.net"&gt;http://www.gamedev.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Is yet another great place to attribute the philosophy of game designing and further education of games.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3136224166983452741?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3136224166983452741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3136224166983452741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3136224166983452741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3136224166983452741'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2009/01/whats-in-game.html' title='What&apos;s in a game?'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-1938525696489366006</id><published>2008-11-24T02:25:00.000-08:00</published><updated>2008-12-08T13:17:22.040-08:00</updated><title type='text'>DueDates 2.0 Wicket App</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;We've been working on the project DueDates since the early month of October. Since then I've had my eye set to get to this stage of our application. I'm excited to say the least that this application has just achieved status as a genuine web application. In this 2.0 release of DueDates, it has been re-factored many times, re-designed for expandability, and fixed to interact more effectively. I'll explain the process that brought us to this point in our application and what features you'll find different from previous increments of DueDates.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Project's page:&lt;/span&gt; &lt;a href="http://code.google.com/p/duedates-polu/"&gt;&lt;span style="font-weight: bold;"&gt;DueDates-polu&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Group Members:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://jnancheta.blogspot.com/"&gt;John Ancheta&lt;/a&gt;,&lt;br /&gt;Anthony Du,&lt;br /&gt;&lt;a href="http://yasu-kaneshige.blogspot.com/"&gt;Yasu Kaneshige&lt;/a&gt;,&lt;br /&gt;&lt;a href="http://erinjuneilkim.blogspot.com/"&gt;Erin Kim&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Process:&lt;/span&gt;&lt;br /&gt;I sometimes have to remind myself that the process is just as (or even sometimes more) important than the end result. It is especially applicable in group projects such as these. I'm proud to say that this time around I was grouped with some very strong and talented individuals. By being surrounded with this kind of environment, I felt that the knowledge sharing was much more of a solid ritual rather than an obligation. It was easy to get in touch with one another and no one felt left out. Everyone had an equal set of tasks, and we frequently spoke outside of class about the project. I also felt a sense of security, since we started very early on in this project. It felt great since the project had fresh new faces and ideas regarding the application. It was easier to communicate our ideas and worries effectively since we chatted on Google talk and Gmail (thank you Google!). So we often sat around the camp fire and discussed about which tasks needed to be done and accomplished, and for which days they needed to be integrated. We followed the concept of working fast to get things done to achieve functionality, and save room for later enhancements. I have to admit that we didn't follow the agile approach of Test-Driven Development, but eventually our testing and coverage caught up to us. It was inevitable that testing was a key aspect, but we kept it in the shadows for awhile since we were predicting a quick end-time for this application. Practically the first week was pushing to finish all required tasks needed for this web app. We did so, since we all wanted an enjoyable Thanksgiving holiday. As the days progress, there on after we kept on improving the look and feel of the application, little by little we also added new features and stripped out unnecessary pieces to enable a more defined product.&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;Setting goals:&lt;/span&gt;&lt;br /&gt;One of our group members made a very nice calendar describing our jobs during the span of two weeks. This made it easier to see what we had planned ahead of time and what things were tasked to who. The breakdown of the project was very clear. Each set of tasks were derived from these milestones:&lt;br /&gt;R1) Support an XML configuration file.&lt;br /&gt;R2) Basic DueDates functionality&lt;br /&gt;R3) Basic DueDates functionality w/ CSS.&lt;br /&gt;R4) Provide sorting&lt;br /&gt;R5) Filtering&lt;br /&gt;R6) Email Alerts&lt;br /&gt;Since we have an even group of 4, it was easier to just have two pairs working on a couple of milestones. Although the pairs were established, we still looked to each others skills to accomplish certain tasks that were related. I had the pleasure to work on R1, R2, &amp;amp; R4. Possibly the coolest thing out of this whole project is just the idea of building a web application using Wicket. Initially we imported a previous project DueDates-blue-v1.2 as our base code, but many aspects in the design needed to change in order to suit the needs of building a Wicket application. More things needed to be added, but basic functions enabling the features were pretty much solid. It was safe to say that we almost had everything needed to finish this application. We simply needed to provide a GUI for what we had previously built in DueDates-v1.2! The online Wicket example apps and Wicket API was a good place to absorb knowledge and derive simple practices for common tasks. I enjoyed looking at the API as a resource guide to understanding the structure and formation of components/models/markup. Soon after assimilating the facts and concepts, the transition from novice Wicket developer to intermediate Wicket developer was easy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Layout:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Index page - contains the user login prompt.&lt;/li&gt;&lt;li&gt;Home page - contains the listings and the core purpose of the application.&lt;/li&gt;&lt;li&gt;Alerts Preference page - contains a set of options to enable a user to set alert processes.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Features:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Currently we support user authentication in a localized setting for users. In later enhancements, we will start looking into creating a database back-end using &lt;a href="http://db.apache.org/derby/"&gt;Derby&lt;/a&gt;'s Embedded/Network Server engines which will require the user to register upon first visiting the page.&lt;/li&gt;&lt;li&gt;Support libraries, including: University of Hawaii @ Manoa Library &amp;amp; Hawaii State Library.&lt;/li&gt;&lt;li&gt;Customizable alerts and options to filter results of due dates listing. Background processing is another topic that would enhance our alert system.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Capable of retrieving and updating multiple libraries at once.&lt;/li&gt;&lt;li&gt;Easy navigation links.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;ICU of our project:&lt;br /&gt;&lt;/span&gt;I can't rule out that our project was properly assessed by &lt;a href="http://code.google.com/p/hackystat/"&gt;Hackystat&lt;/a&gt;. We each had problems with it not sensing our data, or not reading our number of commits, builds, etc.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;Overall, the data does somewhat describeseach individual's participation in a fairly accurate manner. Currently it's the closest thing we have to gain statistical evidence about the health of a project and its affecting members.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;br /&gt;&lt;/span&gt;Everyday meant progress, someone was either working on the css, the html simultaneously, or spicing up a functionality for a page. We each had a hand in the making of this application. I'm very proud to say that I could be a part of it. Although we didn't successfully pull off the database back-end or background-processing, I hope that we'll revisit them sometime in the near future. As for now, the application is in good shape for general use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resources:&lt;/span&gt;&lt;br /&gt;DueDates Project Page: &lt;a href="http://code.google.com/p/duedates-polu/"&gt;http://code.google.com/p/duedates-polu/&lt;/a&gt;&lt;br /&gt;User's guide: &lt;a href="http://code.google.com/p/duedates-polu/wiki/UsersGuideWiki"&gt;http://code.google.com/p/duedates-polu/wiki/UsersGuideWiki&lt;/a&gt;&lt;br /&gt;Developer's guide: &lt;a href="http://code.google.com/p/duedates-polu/wiki/DeveloperGuide"&gt;http://code.google.com/p/duedates-polu/wiki/DeveloperGuide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Resources:&lt;/span&gt;&lt;br /&gt;Hackystat Project Page: &lt;a href="http://code.google.com/p/hackystat/"&gt;http://code.google.com/p/hackystat/&lt;/a&gt;&lt;br /&gt;Apache's Derby Home Page: &lt;a href="http://db.apache.org/derby/"&gt;http://db.apache.org/derby/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-1938525696489366006?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/1938525696489366006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=1938525696489366006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1938525696489366006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1938525696489366006'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/11/duedates-20-wicket-app.html' title='DueDates 2.0 Wicket App'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-7618240872057173929</id><published>2008-11-21T14:38:00.000-08:00</published><updated>2008-11-23T11:53:29.642-08:00</updated><title type='text'>Stack on Wicket</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;The purpose of this entry is to explain my experiences on creating my very first wicket web application written in Java. Wicket is a web framework written in Java and its sole purpose is to create web applications. More information regarding wicket and the tools I used to deploy my application can be found below:&lt;br /&gt;&lt;br /&gt;Apache's Wicket Framework &lt;a href="http://wicket.apache.org/"&gt;WICKET&lt;/a&gt;&lt;br /&gt;Tools and dependencies:&lt;br /&gt;&lt;a href="http://www.mortbay.org/jetty/"&gt;JETTY&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.slf4j.org/"&gt;SL4J&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stack-wicket:&lt;/span&gt;&lt;br /&gt;My very first wicket application is very similar to my earlier blog entries about stack. This application proved to be a good starting point to get to know Wicket's framework. I started out by creating a Wicket Form, and made the subsequent labels, an input field and submit buttons (push, pop, and clear), and results table to layout my application. After successfully starting the Jetty server and running the application through the browser, then my next step was to add functionality to the buttons I had previously created. Before adding the functions to the buttons, I created a session class to handle multiple user's by keeping a copy of the user's stack and variables (input field) in a session. Next comes the easy part, adding functionality to the buttons by creating anonymous ("on-the-fly") classes. I never knew there was a name for on-the-fly classes that really comes in handle when you need to just tweak a few override methods (&lt;span style="font-style: italic;"&gt;onSubmit()&lt;/span&gt;) without having to create a new subclass.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Issues&lt;/span&gt;:&lt;br /&gt;Upon creating this application, I ran into a few bumps and annoyances. One thing that bothered me the most was configuring my environment to support wicket and its subsequent dependencies (.classpath, build.xml). A lot of these issues were minor, but it's quite detrimental in a sophisticated application like this. Other than configuration issues, I also had ones that involved coding. Many of the coding issues were reported back from running "ant -f verify.build.xml," one of which involved serializing the Stack class. This, along with a few other modifications were made to the Stack class. After trickling down and resolving all errors from FindBugs and PMD (they're best buddies), I was able to pass verify and run the application successfully.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Download Distribution&lt;/span&gt;:&lt;br /&gt;The copy of my distribution of stack-wicket can be found &lt;a href="http://sites.google.com/site/anthonymdu/Home/downloads/stack-wicket-adu-1.0.1121.zip?attredirects=0"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;Overall the application was quite self-explanatory. You create a stack and you have only a few options to operate a stack (push, pop or clear). The knowledge I gained from this experience was basically figuring out a good work-flow for creating web applications using Wicket. I now have a better understanding, along with a process of thinking when creating these kinds of applications. It's something to get used to, and the concept can be easily assimilated into other similar web frameworks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-7618240872057173929?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/7618240872057173929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=7618240872057173929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7618240872057173929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/7618240872057173929'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/11/stack-on-wicket.html' title='Stack on Wicket'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-4962920867124205459</id><published>2008-11-20T21:00:00.000-08:00</published><updated>2008-11-22T00:54:29.561-08:00</updated><title type='text'>ICS Industry Day '08</title><content type='html'>Today I had the pleasure to catch the last hour of a presentation given by Concentris. I came out of the presentation feeling very impressed about the concept of "meshing." Especially in the military environment and infrastructure, concepts like these are extremely useful in creating applications like video surveillance, intricate sensors, unmanned ground vehicles (bots), VoIP communications, IED response and avoidance, and lots more. The presenter was also reaching out for higher end programmers, such as front-end web developers. I thought, "well yes I have some experience in that... but do I really wanna stick to just doing that for the rest of my career,  after just being exposed to all those other possibilities? No, of course not!" So one of the greatest things taken from this experience was my pure sense of escapism from my usual norm. I felt that after being here with my colleagues that I need to diversify myself and branch out to other topics that are foreign to me. Data security and networking have always lingered on the tip of tongues of many of my work associates, and I'm beginning to see its importance in my being an ICS student to know these things. I also had the pleasure to meet with some people from Referentia. Referentia was glad to speak with me first. They couldn't help but see a young face and wanting to talk to them. I'm used to the gesture, given being at job fairs like these, you are forced to shake hands and become engaged. I did that exactly, but it was less hectic since the hallway wasn't heavily packed. Unfortunately I didn't have the chance to witness their presentation, but they were quite informative in giving me a brief talk about what they do and what possibilities they hold within their company. I spoke with one of their interns, who has been working for them for about two years. Come to find out, the intern is actually an Electrical Engineering major but started working on many software-related things. He explained a lot of the tools used in his development environment that matched exactly to tools enforced in my ICS 413 class. It was incredible to see how things like quality assurance tools and continuous software development tools were being applied to real world applications. The main thing I took from this experience was the goals and expectations of companies. I wanted to get to know the skillset neccessary to obtain jobs similar or just like these. Of course, these job descriptions don't scare me since they do also offer internships which prove to be a great way to gain valuable experiences in the work field. I also experienced the notion that diversity in the field of ICS is a must, to gain full knowledge of areas supportive in real life applications. I'll be sure to carry on these experiences into my continuation as a student and future computer scientist.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-4962920867124205459?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/4962920867124205459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=4962920867124205459' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4962920867124205459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4962920867124205459'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/11/ics-industry-day-08.html' title='ICS Industry Day &apos;08'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-6237365791329377993</id><published>2008-11-17T13:39:00.000-08:00</published><updated>2008-11-17T14:23:57.568-08:00</updated><title type='text'>DueDates: ICU downtime (postponed v1.2 release)</title><content type='html'>Premise&lt;span style="font-style: italic;"&gt;:&lt;br /&gt;&lt;/span&gt;This entry is to describe the efforts put out to releasing our next iteration of DueDates. Unfortunately this entry will be a sad one, since we have not yet released the entry and that things currently suffering from issues. &lt;span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;The ol' time constraint came back to bite us...&lt;/span&gt;&lt;br /&gt;This will be a very short entry regarding my experiences this past week of working on DueDates. I will assure you that it was not a pleasant one. Considering the time constraints and last minute changes to arrive to an "elegant" solution. I took the time yesterday to work on refactoring my custom class parser called Argument. The plan went well in separating the options and options with parameters. By separating the two and making them extensible, I made them into separate classes. This made it easier to keep track of options with parameters since now the parameters are contained within a list of the option. I also refactored the LibraryParser class since I felt that it was too overbloated with things and it went against the name of the class being a called "parser". So I stripped it down into two separate classes, one being called DueDatesParser which dealt with argument parsing (extends from Argument abstract class) and the other being called LibraryManager which handled the manipulation of options being passed from DueDatesParser (sort and within functions, etc.).&lt;br /&gt;&lt;span style="font-style: italic;"&gt;PMD vs. FindBugs&lt;/span&gt;&lt;br /&gt;After testing this fine on my local machine, it was finally time to build the stuff through ant -f verify.build.xml. It came to my attention how much things can break when you think you've got a solid idea going. My utter frustration was over how PMD and FindBugs would not come to an agreement when it came down to overriding equals &amp;amp; hashcode methods. I have a superclass, Option and a subclass of OptionParam. Option implements the comparable interface thus forcing me to override methods of equals and hashcode. In FindBugs, it would complain about the equals and hashcode methods not being overridden in the subclass. So I defined the two methods and just called its super methods (eg: super.equals(obj)).  Now when I run ant verify again, it doesn't pass PMD, since PMD is now complaining about "UselessOverridingMethod."&lt;br /&gt;Currently the project is at a halt and I will need to attend to this matter with my partner to resolve this issue. Hopefully we'll get something out and running by the end of today.  Newly awaited features such as "-console", "-email" and "-wakeup" are still going to be featured on this next release. However we'll need the time now to resolve these issues first. Sorry for the inconvenience of this release and thank you for your patience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-6237365791329377993?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/6237365791329377993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=6237365791329377993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6237365791329377993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6237365791329377993'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/11/duedates-icu-downtime-postponed-v12.html' title='DueDates: ICU downtime (postponed v1.2 release)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3867356264191750355</id><published>2008-11-07T11:58:00.000-08:00</published><updated>2008-11-07T20:28:33.193-08:00</updated><title type='text'>DueDates on HackyStat</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;After the release of our DueDates v1.1 project, we've been sitting back while waiting to see how our implementation is being tested and used. So far we haven't had any responses (weren't expecting them), but we will be graded for it as a class project. The purpose of this week's blog entry is to detail my experiences working up to using a software auditing system started by a professor and a group of alumni, called HackyStat. I took the time this week to explore its features and understand its impact in continuous development. HackyStat is truly optimized to help you and your team members better the "health" and quality of your product.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setup:&lt;/span&gt;&lt;br /&gt;Setting up the "ICU" program called HackyStat wasn't such a difficult task. I could understand that it might be more of a challenge for newcomers getting used to using quality assurance tools, but at this point we've surpassed those tasks. Most of my efforts were directed towards getting to know what each of the product's dependencies did. I was also more interested in knowing how it was put together. Yet this blog entry is about my experience using the product, so I won't digress any further from the topic. For long time Eclipse users, Hackystat provides a workable plugin suited to cope with settings in Eclipse. This neat looking .jar file (provided from the project's home page) contains the necessary module to easily install HackStat onto your local machine. Once you install the plugin on Eclipse, navigate over to the server hosting HackyStat. Once you are there, register as a member, verify your email and eventually log in to host your project. HackyStat project browser is the home for all the projects you may have hosted on the live server. You may take advantage of the numerous tools used to assess your project's health, and assists in understanding your project's level of efficiency or defficiency.  In many ways it could show the path or direction your team is heading. This notion of knowing what your project looks like underneath a microscope has made me more cautious (but not too cautious) to the details of my enviroment. Of course, this tool does a good job at pin pointing the areas your project lacks and what areas it is excelling at, but it still needs that extra human element to interpret the data coming back. After getting through installing all sensor on your machine and successfully building and sending data to the HackyStat sensor server, what's left for you to do? It is up to your team members to address those issues to better the weak links or connecting factors relating to your project's health.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Experience:&lt;/span&gt;&lt;br /&gt;I have yet to explore all the neat features of HackyStat, but in my short experience, I could see the potential of the product. In some ways, HackyStat seems to have this ghostly feel to it. I sometimes feel like I'm being watched, well of course I am, but it creeps me out more knowing that these sensors are constantly doing updates about my progress and assessing my activities. This may be intrusive and a violation of my privacy, but if its intensions are to assess the project as a whole, then my contribution as a programmer and team member of this project is necessary. HackyStat as a whole is a good project assessment tool, used primarily as an "ICU" monitor for your hosted projects. However, HackyStat doesn't assess the matters of the team members individually. As a whole the team members make up the team, but areas that are beyond the reach of HackyStat's sensors are not accounted for. I'm prone to say that these factors can and will inhibit dangers and warnings to the health of your project. You should use HackyStat as an indicator to pick out these flaws and to fix them within the confines of your project group.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3867356264191750355?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3867356264191750355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3867356264191750355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3867356264191750355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3867356264191750355'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/11/duedates-on-hackystat.html' title='DueDates on HackyStat'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-4756871401161226334</id><published>2008-11-03T11:48:00.000-08:00</published><updated>2008-11-03T13:18:39.986-08:00</updated><title type='text'>DueDates Project (Part 3)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;Surprise! We just released our DueDates-v1.1 this morning. The project has had numerous breakdowns and rebuilds since its first code release last month. In many ways we've accomplished some new features and have enhanced a few old features. I'll explain some of the changes (including self changes) and some of the difficulties that we endured during the past two weeks to release this third increment of our implementation of DueDates.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Re-design and Enhancements:&lt;/span&gt;&lt;br /&gt;After the first two increments of this project, I've come realize how much planning and thought is needed to get a good, concise and obtainable goal. In my last posting, I mentioned about using a MS Visio-like diagramming tool, called OmniGraffle (only for macs) which assisted me in my planning and development. Likewise, I would like to emphasize how much help this tool, along with all the quality assurance tools, such as JUnit, CheckStyles, and EMMA has helped us in the continuation of our development for this project. This is almost like a thank you note to those building tools which automated the process of that us humans lack naturally. In some ways it has influenced me to program more diligently and carefully. Here's a quick rundown of the changes in design and class structure, and how it has impact the project outlook as a whole.&lt;br /&gt;So I sat down one day to quickly draw out the current stages of our application. It was nothing fancy just a lot of holes to fill in and extra spaces that weren't needed. It was easy to say that a rework would be the easiest. Meaning I could say that working from a clean slate would help clear the pallete of confusion, but I knew from the back of my head that not everything will go as plan if I didn't approach the problem the right way. So I put aside all old tactics and really, in a sense, reworked the way I processed a problem. I thought more about the small steps I needed to take (not too long of course). Every step had its kinks to be worked out and every event thereafter was followed by a branch in another direction. I was more concerned by the path of the project rather than succeeding at the next step. This methodology I built myself gave me some room for errors, but also enhanced my skills in reasoning. "Have I made the right choice to place this method here, or is it better to not have it at all." Sometimes the best solution is not the solution. I felt almost like a sculpture, breaking down the pieces of clay, smoothening the edges, molding the sides, and continuously deciding and critiquing. Finally a masterpiece starts to unravel, and something that I've envisioned in my head comes to life. Following this notion of obtaining what is necessary and discarding what is useless has resulted in our new design. In this new design, I focused mostly on the command line arguments because it serves as our vessel to communicate to our users and it is the most prone to errors. I felt that without this interface being perfect/semi-effective then we would have no functional application. We've extracted more abstract classes, made use of more subclasses, and made room for other possibilities for future developers. The thing I'm most proud of is the Argument abstract class. What brought on this simple abstraction was its wide generalization in other systems. I've seen arguments in Linux/Unix or even Windows DOS that work the same way via terminal/command prompt. I broke down arguments (user input) into three essential categories: 1) options, 2) options with parameters, &amp;amp; 3) and essentially parameters. The creation of this class has spawned off numerous "parser" classes that utilize the same idea. This gives more room for future developers to create their own interpretation of an argument parser and make it work for themselves. I'm almost confident to say that, 80 % of the dedicated features for this project can be found in our LibraryParser class. The LibraryParser (which extends from Argument) holds most of the essential makeup of our functions. Some other enhancements worth mention are the new options: "-sort" and "-within". To get a better grasp of these two options, I would recommend visiting our project page, &lt;a href="http://code.google.com/p/duedates-violet/"&gt;here&lt;/a&gt;. There you'll find links to our user and developer guides. Hopefully you'll find the project useful and interesting. However, I would be more happy to see developers voice their opinions toward the details of some classes and how they can improve/extract. If a developer comes out saying, "Oh this looks useful, maybe I might be able to use this for my app." then I've somewhat served my duty as a open source developer. Also, I believe this passing of knowledge is beneficial for everyone and shouldn't be confined. Although there might be mistakes, those mistakes are much more beneficial by learning from them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reflection:&lt;/span&gt;&lt;br /&gt;During this third part of our DueDates project, I've helped myself revitalize my process of development and in turn, given a better insight on how I code as a programmer. I've never in my past 2 years as a ICS student realize the beauty of coding. The marriage of art and coding has made me become more open minded to the possibilities of a joyous application. Of course to balance the experience, I've also stumbled upon some mishaps and fluctuations in my coding path, but that has only enhanced the fun in it. Again the past few weeks developing on this project has been very rewarding for myself and the team. I've become more adept to develop using Google's Project Hosting site (SVN), quality assurance tools, and coding in teams. Hopefully,  sometime in the future I'll aspire to newer projects that challenge me (in this kind of level) as an ICS student and developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-4756871401161226334?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/4756871401161226334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=4756871401161226334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4756871401161226334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4756871401161226334'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/11/duedates-project-part-3.html' title='DueDates Project (Part 3)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3723141717851359412</id><published>2008-11-01T18:54:00.000-07:00</published><updated>2008-11-01T19:57:23.882-07:00</updated><title type='text'>DueDates Project Review (Part 2)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;In this third increment of our DueDates project, we've been given the chance once again to review and get reviewed by our fellow colleagues for this application. Along the way I'll also explain about my experiences gained from this review and during this past week.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GPH Review:&lt;/span&gt;&lt;br /&gt;We've managed to, at this point, do everything through Google's Project Hosting (GPH) site. Again, Google has given us the tools to code effectively in a real world environment setting. If you navigate over to the source of any project (that's hosted by GPH) there will be a new featured link next to the "search trunk" called "Request code review." The new feature makes it easy to request a code review amongst your team members or outside code reviewers. You are able to note a description of the review, branch path, marked issue status, and labels.&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;Overall the reviews from team duedates-red were positive and fairly short. There were still a few things we needed to provide to accompany our code, such as our wiki's. We've managed to well document our code in JavaDocs but have yet to utilize the GPH's homepage and wiki's features. Hopefully by the end of this review, we'll have a better and more concise explaination of our project on our project's homepage.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A positive experience:&lt;/span&gt;&lt;br /&gt;In this third increment of our Duedates implementation, we've gotten a chance to better understand the structure and hierarchy of our program. Though it was difficult to grasp a clear plan in the beginning, we began to see the path lit up as the programming process progressed. It became much more beneficial to use programs beyond the use of Eclipse and quality assurance tools. Personally, I resorted to using a modeled approach to plan out our class structure. If anyone owns a mac or just wants to learn more about mac software, then I would recommend something called OmniGraffle. It is almost like Microsoft's Visio, but for the mac. After experiencing this newfound tool, I've come to realize the power of organizing my ideas, in a sense, on "paper". The program also gave me the ability to quickly implement an idea, and if i decide that the idea blows or doesn't live up to the overall design, then I could simply discard it and update my program in the same matter. This helped me develop a sense of awareness of the project's path and direction and it even provided me a clearer perspective in coordinating myself in a project like this. It also coerced me to program in a TDD fashion. Speaking of TDD, I became very TDD this past weekend. I actually got reacquainted with two very familiar friends, JUnit and EMMA. Yes, can you believe it? I actually used EMMA! EMMA proved to be very helpful in cases where I needed to better sculpt the usefulness of some functionality. Maybe a statement that wasn't being tested via JUnit, really turns out to be unnecessary for the overall application. I questioned that to myself when I had a low percent coverage. Could this mean i could do just the same amount of work with less code and more coverage. Well in some cases, yes! You can pick out certain things that can't be detected by other QA tools, because EMMA forces you to review those statements you think are needed to test the overall application. If you look deeper, then you'll see that maybe sometimes it's best to not even have that subject there in the first place. JUnit on the otherhand would not tell you that you need a test case for missing arguments. So the marriage of JUnit and Emma makes a good team in assuring better quality and sensible units of code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;After taking this time to review other projects and assessing our own, I have gained new knowledge in the process of developing in a test driven environment. I have also gained the ability to strengthen my overall model (class) organization and program structure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3723141717851359412?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3723141717851359412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3723141717851359412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3723141717851359412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3723141717851359412'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/11/duedates-project-review-part-2.html' title='DueDates Project Review (Part 2)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-9134541629520086567</id><published>2008-10-23T23:24:00.000-07:00</published><updated>2008-10-24T10:32:24.171-07:00</updated><title type='text'>DueDates Project Review</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt; In this posting, I’ll continue from last week’s first iteration of our class project called DueDates. This week I was tasked to evaluate three DueDates project groups and also receive seven reviews of my implementation of the same project. Again I’ll be using Google’s Project Hosting site as my primary source code versioning and issue tracking system tool.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setup for Review:&lt;/span&gt; So how do I put out a package to the world for developers to critique and annotate my work without interfering with my main code-line? Well, SVN provides a concept of creating snapshots of your production line code, called “tags”. Tags are meant for production version-labeled releases of a project. It provides a workable copy of the file-system at a certain point in time of your project. This can be easily done by the commands below. *Note that this would be exactly what a reviewer needs to do prior to evaluating your work. *Also to get the BASE_URL, you may try using the command: svn info - displays the details of the current svn repo. Or &lt;span style="font-style: italic;"&gt;svn info | grep URL &lt;/span&gt;for just the base url.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;svn copy BASE_URL/trunk BASE_URL/tags/review_release&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;-m “Tagging a review release of main line”&lt;/span&gt;&lt;original_url style="font-style: italic;" trunk=""&gt;&lt;destination_url tags="" review_release=""&gt;&lt;/destination_url&gt;&lt;/original_url&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;My Review Process:&lt;/span&gt; Google’s Project Hosting review tools provide developers the essentials to annotate and evaluate project source code in an effective and efficient manner. It gives reviewer’s, who must first be members of the project, the ability to leave comments within the actual project source file. When the source file is finalized and the reviewer is satisfied by their comments, then they can easily publish those results to the project. After the comments are published, the owners of the project are notified by email(s) of those comments. This definitely made my job as a reviewer better, since I’ll be able to optimize my time to focus on reviewing the project code, and it gives the owners of the project immediate feedback.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reflecting on Results:&lt;/span&gt; During this review process I’ve gained insight into how to improve my code as well as learn the mistakes that I’ve made throughout the course of my implementation. In many ways, I could say “I approached it all wrong,” but by the indication of some feedback, I was also doing something right. Documentation was the main thing I knew that would have to be sacrificed due to our time constraints. Therefore, people were totally oblivious as to what my project expected as an input and output. The project was a total black box, in the front, middle and back. Since I did not pay close attention to my audience, it was difficult for people (both users and developers) to use or expand my system. However, I’m glad to say that there were some people who reached out to support. It was evidently helpful and gratifying to us both. During this process, I also found a way to “switch” between production lines. The reason for this was that I needed to repair the broken tag distribution for review. Before doing this, I sent out a mass email detailing the reasons.  Here are the commands to switch between the trunk and tags (it also goes the same for any directory layout that you build through SVN):&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;svn switch &lt;/span&gt;&lt;base_url tags="" review_tag=""&gt;&lt;span style="font-style: italic;"&gt;BASE_URL/tags/review_release&lt;/span&gt;&lt;/base_url&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Pretty nifty, huh? Indeed, I thought so too. After I got done making changes to the review_release version, I quickly switched back to the trunk's main code line to continue coding on the trunk. I was surprised to notice one reviewer who really felt inspired by my implementation of an error logger &lt;span style="font-style: italic;"&gt;(ErrorLogger.java)&lt;/span&gt;. My first intent for this class was to just parse out the command line arguments, but it became something more along the lines of a stack dump error logging tool. It currently parses out the arguments, separates them by [args] =&gt; [&lt;span style="font-style: italic;"&gt;options&lt;/span&gt; - prefixed with a hyphen] [&lt;span style="font-style: italic;"&gt;parameters&lt;/span&gt; - non-hyphen parameters (actual values)]. Options are pre-populated with somewhat of a unix/linux inspired command, "-v" or "-verbose". The final feature was the ol' error handling messages (friendly or verbose)                                                                                                                                                                                                                                                  depending on the passed options. Overall there were lots of small details that needed to be worked out of the beta stages of this increment. My goal from this point on is to sculpt out the essentials of the application, make it more abstract or general, and extended upon new ideas.&lt;br /&gt;&lt;/div&gt;&lt;base_url tags="" review_tag=""&gt;&lt;/base_url&gt;&lt;/div&gt;&lt;base_url tags="" review_tag=""&gt;&lt;span style="font-weight: bold;"&gt;A lesson learned: &lt;/span&gt;I wanted to express this on my last posting but it was difficult to express matters under certain time constraints. I’ll start off by mentioning about what went wrong in my group’s implementation and then how we are currently going about to improving ourselves for future increments. I would like to tag this project during this point in time, called “death by email”. My group partner and I only had one official meet outside of class during the first week of working on this project. In my opinion it was horrifying to communicate with someone for the first time and barely knowing them. We both made the mistake by not getting to know each other better outside of class. Due to this slight alienation, we caused each other to have flawed predictions of one another. These preconceptions proved to be inaccurate and misleading. It was very difficult to see whether or not a team member was having a hard time with the project or if they were suffering from other external issues. During the course of this project, I learned that you are only as strong as your weakest link. Apparently we both had strengths and weaknesses. If we had communicated better straight from the get-go, and came together to pick at our flaws, then the project would have turned out better as a whole. My project group member and I have been taking the time out of our busy schedules to do regular fact-to-face meetings that last at least 30 minutes long. We’ve started to put this into practice rather than having to deal with just emailing each other progress reports. Hopefully we’ll be better off in our next increment, this coming week.&lt;br /&gt;&lt;br /&gt;&lt;/base_url&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-9134541629520086567?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/9134541629520086567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=9134541629520086567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/9134541629520086567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/9134541629520086567'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/10/duedates-project-review.html' title='DueDates Project Review'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-5833237839250917274</id><published>2008-10-15T19:30:00.000-07:00</published><updated>2008-10-28T00:54:47.806-07:00</updated><title type='text'>DueDates Project (Part 1)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;I have been tasked this past week to assist in the creation of a project called DueDates. DueDates is currently a program that enables a user the ability to check the status of items they may have borrowed from one or more library systems. It is meant to generalize the interface between the user and their list of items, whether they be books, bills, tasks and etc. For this project, I will be accompanied by the following tools and source code: &lt;a href="http://code.google.com/hosting/"&gt;&lt;span style="font-weight: bold;"&gt;G&lt;/span&gt;oogle's &lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;roject &lt;span style="font-weight: bold;"&gt;H&lt;/span&gt;osting&lt;/a&gt;,&lt;a href="http://svn.collab.net/"&gt; SVN&lt;/a&gt;, &lt;a href="http://www.eclipse.org/"&gt;Eclipse,&lt;/a&gt; &lt;a href="http://httpunit.sourceforge.net/"&gt;HTTPUnit&lt;/a&gt;, and sample code, &lt;a href="http://groups.google.com/group/ics-software-engineering-fall-2008/web/DueDateBootstrap-1.0.1010.zip"&gt;&lt;span style="font-style: italic;"&gt;DueDatesBootstrap.zip&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Process:&lt;/span&gt;&lt;br /&gt;The hardest part in any project is the process. I found it difficult at first to plan out a reasonable and consistent plan. Many times a plan might backfire or doesn't go as you'd expect, but after a few moments of reading up on the project's needs and wants, I finally came to conclude some possible project enhancements:&lt;br /&gt;User Interface:&lt;br /&gt;End-users are left with a couple of command line options that makes too many assumptions as to what is required by them. Another problem was that the resulting error dumps (Java Exceptions) were being outputted in a very cryptic manner. To solve this, we could suppress the messages and also provide an extra parameter to display other misc stack dumps for developers.&lt;br /&gt;Functionality:&lt;br /&gt;The sample code, DueDatesBootstrap only provides sufficient code to initialize, connect and grab responses over the network to a fixed number of supported library systems. We could provide general library system templates, and pass required parameters to them. This might not solve all internal problems, such as HTTP parsing, but it will provide a step in the right direction.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Execution:&lt;/span&gt;&lt;br /&gt;Setup:&lt;br /&gt;Even some practices needed to be re-iterated. I found myself needing to take the time just to refresh on the syntax of SVN. I keep getting this notion that I need to do a "svn import", but that's only when I'm locally hosting my SVN repositories. Google's Project Hosting site skips one step in the common "svn import" and "svn checkout" process that I'm used to. Another minor problem was knowing which folder(s) needed to be included on revision. In most common development environments, only the source, custom libraries and configuration files are worthy of inclusion to the repository.&lt;br /&gt;Plan:&lt;br /&gt;The first thing I noticed about the initial DueDateBoostrap program was its lack of "friendly" error handling. It occurred to me that possibly building an ErrorLogger for this system would be most beneficial not only for this project but also for others. My goal from here on was simple, build an error logger that simply takes in at least one (supported) option and deal with auditing the errors. Although my approach is simple, it does the job with a few left out features. This error logging system lacks the ability to audit with level of warning types. In future enhancements I would like to incorporate a more sophisticated level system that weighs the severity of an error/exception.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;I enjoyed taking the time to get my hands on a new project again. Here I can step back and think about new ideas that I have yet to explore and hopefully, along the way make changes to better the application as a whole. Its always important to know that there are some ideas that work for certain situations and some ideas that work for others.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;I have learned from the past &lt;/span&gt;that large projects like these amounts to the overall effort and not only the ability of one individual. I believe that in this high collaborative society, esp. for software engineers, that we are only as strong as our weakest link.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Learning &lt;/span&gt;&lt;span&gt;to accept the fact that you are not the lone programmer these days will better you for the actual development setting.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;The setting is ever changing, people come and go, while many of us still have to learn to adapt rapidly. This project proved to be quite a learning experience for both me and my team member.&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/2534024747783979675-5833237839250917274?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/5833237839250917274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=5833237839250917274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5833237839250917274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5833237839250917274'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/10/duedates-project-part-1.html' title='DueDates Project (Part 1)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-8940779001555566965</id><published>2008-10-08T02:16:00.001-07:00</published><updated>2008-10-08T09:20:56.602-07:00</updated><title type='text'>Stack on Google's Project Hosting + SVN (Part 2)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;In this posting I will attempt to build upon where I left off from my &lt;a href="http://anthonymdu.blogspot.com/2008/10/stack-on-googles-project-hosting-svn.html"&gt;previous&lt;/a&gt; entry regarding SVN and Google's Project Hosting (GPH). My experience portrayed here will both reflect the ease and comfortableness of using SVN in a group oriented setting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Experience:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/stack-anthonydu/"&gt;My project&lt;/a&gt; is currently being hosted by Google's Project Hosting and all members of the project have SVN command privileges to add, delete, or commit changes. Likewise, I could also do a checkout of someone else's project using the same command ("svn checkout...") under "Source" tab in GPH. If I've been given membership to this person's main code line, then I'll also have full write access to their master repository. This means that the changes I make locally will reflect on the live repository once I perform a "svn commit -m...". I will attempt this very concept on a group &lt;a href="http://code.google.com/p/stack-ronnreeves/"&gt;member's project&lt;/a&gt;. After checking out the source from the member's repository, I am given a local copy of the project. Before attempting to run the program or make any changes of my own, I ran "Ant" to assure the code that I've just checked in, integrates well without error. If errors do occur, then I'll either have to notify the discussion group or make the changes myself.&lt;br /&gt;Currently the project appears to be at a solid state without any conflicts or obvious errors. The actual error didn't occur until I used Eclipse and Ant simultaneously to execute tests and run verifications. It turns out that the given build.xml file provided by this project conflicts with Eclipse's class build directory path. Eclipse assumes ownership over a folder while Ant secretly writes to that directly after each build. Eclipse complains by throwing a "ClassNotFoundException". The easiest way to fix this is to create a folder in the project directory called "bin" and modify the default classpath in Eclipse to point to this directory. You can make this slight modification in Eclipse by going to "Project&gt;Properties", under "Source" tab and  change "Default output folder". At this stage, the current changes I make here are done locally and will not yet affect the main code line until I've committed. Now I will verify if my changes work for this issue by simply replicating the steps which brought on the error. Once everything seems to work with both Ant and Eclipse, then it should be safe to commit my changes. But before committing my changes, I'll first do an "svn update" to see if the project has changed since the time I was working on my fixes. This should be done before and after every commit to ensure that your code integrates well with other project member's code and to relieve later efforts of having to resolve more difficult conflicts.&lt;br /&gt;Systematic procedures to keep integrity of code in-sync with master repository:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;svn update&lt;/span&gt; - brings your current local copy up-to-date with the current revision&lt;/li&gt;&lt;span style="font-style: italic;"&gt;If conflicts need to be merged, then resolve these problems before continuing on.&lt;/span&gt;&lt;li&gt;Make your changes on your local machine&lt;/li&gt;&lt;li&gt;Run Ant's build tools to verify your code changes.&lt;/li&gt;&lt;li style="font-style: italic;"&gt;svn update&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;svn status &lt;/span&gt;- to see if the files you've modified are correctly marked with 'M'&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;svn commit &lt;/span&gt;&lt;filename&gt;&lt;span style="font-style: italic;"&gt; -m "some informative message about the changes"&lt;/span&gt; - post changes to master codeline&lt;/filename&gt;&lt;/li&gt;&lt;li&gt;&lt;filename&gt;Continue the process again.&lt;/filename&gt;&lt;/li&gt;&lt;/ul&gt;&lt;filename&gt;&lt;span style="font-weight: bold;"&gt;Other tidbits:&lt;/span&gt;&lt;br /&gt;You can run the command, "svn log" to view the history of revisions made on the current project. Notice the last revision is listed first and its corresponding comments regarding the changes are made right below it. Also note that the optional commands like "svn log", "svn diff -r M:N filename", or etc. can be done easily on GPH's site. Its much more convenient and easy to read compared to using terminal. In my opinion, the most useful operation is svn's diff command. GPH provides a complete visual, including a side-by-side view of both files under different revisions. I only wish that GPH had a feature to produce patches along with having the ability to do diff's. Patches would be pretty useful for situations when you do not have full control over the master repository. So rolling out your own set of "diff" changes to fix a general project issue would be useful when you need to send it to a user group or mailing list to explain about your changes. From there your patches can be determined by the owners or other members, as to whether or not your patch should be applied to the main system. GPH solves the problem of communicating with members of the group project (via Google Groups), but does not make it easy for current members of the project to apply these patches/changes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;Subversion is a code-management repository that enables you to keep your source code stored on a remote server (in this case Google's Project Hosting Server) that can be accessed by multiple members/users. Subversion makes collaborating with multiple users a breeze because users can checkout copies of the source code to their local machines, make edits, and then send the changes back to the SVN server. At that point, team members can update their local copies with all the team's changes. SVN manages the changes made to each file so that you aren't automatically overwriting your co-worker's work! Even if you are the sole developer, storing your project source under Subversion is a great way to keep a remote "backup" of your code in case your development machine is compromised or if you fall victim to a situation resulting in data loss.&lt;/filename&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-8940779001555566965?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/8940779001555566965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=8940779001555566965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8940779001555566965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/8940779001555566965'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/10/stack-on-googles-project-hosting-svn_08.html' title='Stack on Google&apos;s Project Hosting + SVN (Part 2)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-6434948763078643106</id><published>2008-10-07T17:04:00.000-07:00</published><updated>2008-10-08T09:21:34.993-07:00</updated><title type='text'>Stack on Google's Project Hosting + SVN</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;The purpose of this post is to experience the process of building your own source code management system by using both a live server (Google's Project Hosting) and Subversion (SVN). Source code management enables project teams to effectively share and collaborate with each other while keeping track of their development process. A part of the construction process consists of using good foundation practice tools, such as SVN to help ease the pain of manual code tracking and tasking.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setup:&lt;/span&gt;&lt;br /&gt;1. Install Subversion&lt;br /&gt;You'll need to have a copy of Subversion installed on your local machine. If you're running Mac OSX or Linux/Unix, then that'll be all you'll need. You can simply download the binaries/source straight from Subversion's site, here. Otherwise, If you're a Windows user, then I would recommend installing the latest version of CollabNet's TortoiseSVN. TortoiseSVN is an easy to use GUI version of SVN for Windows that can be interfaced (in version control) to support any filesystem item (files, folders, etc). Although the subsequent steps follow the basis of a Linux based platform, the process of login in and setting up the first checkout, add, commit, and update are conceptually the same.&lt;br /&gt;2. Create a Google Project&lt;br /&gt;Google's Project Hosting (GPH) is a service which enables team-project members to collaborate in an effective development environment. GPH provides project workspaces with easy to use UI member controls, issue tracking, mailing group lists (via Google groups), and most importantly Subversion. Although you are not restricted to use Google's Project Hosting, I would recommend it if you want to quickly get something up and running for your co-workers or the world to see. If your intentions are to use some other advanced remote server, then you'll have to look elsewhere for that. I'm simply portraying the use of one possible solution. If you'd rather take another approach, then here are some of my recommendations on how to approach the same level of likeness to Google's: 1) Get and install Subversion, 2) Install Apache on your server, 3) Configure Subversion to work with SSL and Apache, and 4) Install Trac - issue/task management software. The more detailed instructions can be found &lt;a href="http://www.yolinux.com/TUTORIALS/LinuxSubversionAndTracServer.html"&gt;here&lt;/a&gt;.&lt;br /&gt;3. Initialize: Revision 1&lt;br /&gt;To get started with GPH, you're required to obtain/already own a Google account (as with anything from Google). Next, redirect yourself to GPH's site &lt;a href="http://code.google.com/hosting/"&gt;here&lt;/a&gt; and click on "create a new project." This will instantly create a project and provide you the necessary parameters needed to describe your project. Once all the forms are out of the way, navigate over to the "Source" tab. Here, you'll be presented by Google's nicely suggested commands to run SVN. You could now just copy and paste the following into a terminal window.&lt;br /&gt;"svn checkout https://stack-anthonydu.googlecode.com/svn/trunk/ stack-anthonydu --username anthony.m.du"&lt;br /&gt;Quick explanation of these commands:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"svn checkout" - pulls the SVN tree structure (svn&gt;(tags)/(branches)/(trunk)) from the specified server. This will only need to be done once.&lt;/li&gt;&lt;li&gt;"https://.../svn/trunk/" - url of source code. It can be a remote or local server&lt;/li&gt;&lt;li&gt;"stack-anthonydu" - project folder name&lt;/li&gt;&lt;li&gt;"--username anthony.m.du" - google account username for server access.&lt;/li&gt;&lt;/ul&gt;Once you hit return, the GPH server will verify your credentials with a pre-generated key. You may generate a new one or use the one pre-generated key under the "googlecode.com password" link. After you successfully checkout, SVN will display a message noting your very first revision. This marks the end of possibly the hardest part of setting up your repository.&lt;br /&gt;4. Adding &amp;amp; Committing files&lt;br /&gt;Now switch to your project directory. Notice that their is a hidden ".svn" folder in your directory which stores information about the current state of your repository. The next logical step is to add files to your main code line. Use "svn status" to see which files have not yet been added or added but not yet committed. The files that have been added will be prefixed with the letter 'A', and one's that have not been added will be prefixed with '?'. Unfortunately there is no easy way to recursively add all files and subdirectories using a terminal/command line. You might think that a simple svn add * would do the trick, but this command is NOT recursive. So I looked around for a quick and dirty script that will simply add all newly, non-committed files to svn. Here's the script in its most rawest form: "svn status | grep "^\?" | awk '{print $2}' | xargs svn add"&lt;br /&gt;I have made this into a command of my own to simply be called anywhere called "svnadd." This can be done by saving the one-liner script into a file and storing it into the "/usr/bin/" directory (only under Unix/Linux platforms).&lt;br /&gt;For a list of commands provided by svn, you may simply type "svn help". Now that you've made changes to your repository by adding files, the next step is to commit your changes to the main repository. This can be simply done with the command "svn commit", followed by a meaningful message describing the changes you've made. In this initial process, you can name it along the lines of "project initialization."&lt;br /&gt;Transmitting file data .............................................&lt;br /&gt;Committed revision 2.&lt;br /&gt;This marks the end of Revision 2.&lt;br /&gt;&lt;br /&gt;I have applied these instructions to my first GPH, called "stack-anthonydu" (same project from previous blog posts). This project can be accessed, viewed/downloaded, but not modified by public users. The master repository goes unchanged unless you own or are a member of the project. Here is a link to my &lt;a href="http://code.google.com/p/stack-anthonydu/"&gt;stack-anthonydu&lt;/a&gt; in all its glory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;I learned that version control should be part of your daily-standard arsenal. After this brief introduction to configuring and getting a feel for Subversion commands, I was quick to appreciate its vast potential for sharing and publishing source code. In my &lt;a href="http://anthonymdu.blogspot.com/2008/10/stack-on-googles-project-hosting-svn_08.html"&gt;next&lt;/a&gt; blog post I'll further explain my experiences using my newly committed stack project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-6434948763078643106?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/6434948763078643106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=6434948763078643106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6434948763078643106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/6434948763078643106'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/10/stack-on-googles-project-hosting-svn.html' title='Stack on Google&apos;s Project Hosting + SVN'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3635445623599555869</id><published>2008-10-01T23:45:00.000-07:00</published><updated>2008-10-09T02:24:37.877-07:00</updated><title type='text'>Stack Overflow - Programmer's Q &amp; A Haven</title><content type='html'>&lt;span style="font-weight: bold;"&gt;What is Stack Overflow?&lt;/span&gt;&lt;br /&gt;Stack Overflow is a web application written by collaborative programmers for programmers with programming questions. The site initially requires nothing when you first visit, but to be able to gain further editing privileges, then you must sign-in using a new or existing OpenID account. OpenID is a one-stop sign-in or sign-up account used to help ease the pain of remembering login names for different sites. Upon successfully registering for the site, you’ll be immediately given the ability to edit your personal account info, easily search for a question or answer (either by tags or textual search), and post questions or answers. Soon, after you make your first post, moderators, or users who have gained high reputation will rate the prevalence of your post given the appropriateness and popularity. You’ll be given points depending on these factors, which then will correspond to your abilities on the site. If you gain higher status in your reputation, then the site awards you the ability to edit yours and other’s posts almost like a wiki. At times you might feel that Stack Overflow is giving you a hard time, but it does it for good reasons. The most popular attraction of this site is its strict rules on postings. Since posters must stay on topic, the site’s reputation and purpose gets further established in the community. The simplicity and specificity gives Stack Overflow a name in the community of programmers as a “programming FAQ” site, rather than a sub-category amongst other contending search topics. Also, it helps eliminate the trouble of irrelevant or duplicate questions. In my opinion, this proves to be a good strategy than most other social networking sites that deal with a conglomerate set of topics, like Digg or SlashDot. Its unique moderation and rating system makes it an ideal example for newer social networking sites to follow.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What were my Stack Overflow experiences?&lt;br /&gt;&lt;/span&gt;Stack Overflow is a "programmer's haven" for Q &amp;amp; A's. I have posted one question regarding the goods and bads of using more than one level nesting in Ruby on Rails. Hopefully, the question will get picked up by the community and I'll get an answer that will suit my needs.&lt;br /&gt;Here's a direct link to the question:&lt;a href="http://stackoverflow.com/questions/164520/to-nest-or-not-to-nest"&gt; http://stackoverflow.com/questions/164520/to-nest-or-not-to-nest&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Overall, I think the service will be a good addition for programmer related sites. I've definitely given this a good rating on my StumbleUpon and bookmarked it for future visits.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3635445623599555869?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3635445623599555869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3635445623599555869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3635445623599555869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3635445623599555869'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/10/stack-overflow-programmers-last-and.html' title='Stack Overflow - Programmer&apos;s Q &amp; A Haven'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-1521907878620226900</id><published>2008-09-29T22:06:00.000-07:00</published><updated>2008-10-01T02:44:25.947-07:00</updated><title type='text'>Stack + Emma + JUnit</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Premise:&lt;/span&gt;&lt;br /&gt;In this experiment I'll take a look at testing techniques and programming coverage using both &lt;a href="http://www.junit.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JUnit&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://emma.sourceforge.net/"&gt;Emma&lt;/a&gt;. All programs in this experiment will be edited and tested using Eclipse with built-in integration of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;JUnit's&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;plugin&lt;/span&gt;. Emma is an open source Java coverage tool that integrates well with Ant. I will be running Emma and building my subsequent tests from command prompt (using Ant), while making changes that reflect improving coverage in Eclipse. The program below is the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;remanence&lt;/span&gt; of my previous "Stack" post. I will be using the Stack program as the basis of running my unit tests.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Improving Coverage:&lt;/span&gt;&lt;br /&gt;The goal of this experiment is to improve code line coverage. Emma makes this very easy to accomplish by using a few commands from my previous setup of Ant. After executing the following build command: "&lt;span style="font-style: italic;"&gt;ant -f emma.build.xml&lt;/span&gt;," Emma conveniently gives quantified metrics for class, method, block and line converage. Emma is also nice enough to provide an html &lt;span style="font-style: italic;"&gt;(emma/coverage.html) &lt;/span&gt;summary describing the covered, partially covered and uncovered code line executions. It also indicates the file and highlights each line with a neat color scheme: green - fully covered, yellow - partially covered and red - uncovered.&lt;br /&gt;Initial Emma Coverage Metrics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;class:   100% (3/3)&lt;/li&gt;&lt;li&gt;method:  73%  (8/11)&lt;/li&gt;&lt;li&gt;block:   69%  (65/94)&lt;/li&gt;&lt;li&gt;line:    75%  (15/20)&lt;/li&gt;&lt;/ul&gt;Analysis of uncovered lines are specified by filename, percentage of coverage and methods containing non-executed code lines:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;ClearStack.java, (50%), getTop() &amp;amp; isEmpty()&lt;/li&gt;&lt;li&gt;Stack.java, (79%), toString() &amp;amp; top()&lt;/li&gt;&lt;/ol&gt;I proceeded to first improve the most trivial test cases indicated by Emma for files Stack.java and ClearStack.java. I was able to raise the line-level coverage to 99.8%. However, I was stuck at a partially uncovered item in the isEmpty() method of the ClearStack class. In this case Emma has no further input other than to say that this is a line that needs more tests. It took me a while to notice that the isEmpty method needed to thoroughly be tested for both true and false cases, when initially I only had one. This minimal unit test boosted my line-level status to 100% and thus achieving what looks to be good code, right? Unfortunately, I was drawn to notice a couple flawed attributes that adhere from my tests and the confluence of using Emma as a fully trustworthy tool. Although my first intentions of this experiment is to improve code coverage, I've also come to realize Emma's vita flaw that could potentially separate good testers from the bad. I've also notice how Emma's tricks the programmer into thinking about only achieving code coverage, rather than helping the coder gain greater insight into their code analysis. Even at 100% coverage, my tests are not completely tested in terms of its context. For example, one unit test required that I needed to test the toString() method in the Stack class. In my TestStack class, I did the toString() method test by simply asserting the expected output while having prior knowledge of what toString() must express.&lt;br /&gt;Here's my test case: &lt;span style="font-style: italic;"&gt;assertEquals("Testing stack toString", "[Stack []]", stack.toString());&lt;/span&gt;&lt;br /&gt;I found that this test builds upon the assumption that &lt;span style="font-style: italic;"&gt;stack.elements&lt;/span&gt; works. I needed to conclude to myself that this statement truely executes without flaw, so I tested the List's toString method.&lt;br /&gt;2nd test case: &lt;span style="font-style: italic;"&gt;assertEquals("Testing list toString", "[]", stack.elements.toString());&lt;/span&gt;&lt;br /&gt;It turns out that my curiousity only led me to remember that Collections have a default format of outputing elements in a form of an array-like string, enclosed with square-brackets. The point of this assertion was to distinguish the mindset of good and bad testers. Good being the ones who take it a further step by objectively analyzing the hidden points being made by their program, and bad ones who leave after the 100% coverage which may or may not be truely 100% valid.&lt;br /&gt;Overall, Emma is still a great tool that should be used continuously in pre-development to production stages. However, I would not recommend using Emma in the middle of a project, unless the task is minimally affected by the program as a whole.&lt;br /&gt;&lt;br /&gt;Here's a link to the final Stack code: &lt;a href="http://sites.google.com/site/anthonymdu/Home/downloads/stack-anthony.m.du-6.0.930.zip?attredirects=0"&gt;stack-anthony.m.du-6.0.930.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;I learned the importance of building my programs using some sort of coverage tool. Although, coverage tools evidently determines if our code is tested for certain conditions, it limits us from determining the thorough aspects of what our program is truly expressing in terms of context. Upon questioning the effectiveness of converage tools, such as Emma, I've come to realize that there is no better tool than human analysis. Sure we can ease the pain of manually checking whether or not our code is executing like it should, but we must also take into account for its lack of human ingenuity and influence. Since we wrote the program using our own patterns and processes, we should also rely on our instinct when it comes to assessing our own work. I feel that the usage of Emma should go hand-in-hand in the beginning stages of developing test cases. Again, the concept of incremental programming should be exercised for assuring the quality of your code. As for future use, I would recommend using the integrated plugin called: &lt;a href="http://www.eclemma.org/index.html"&gt;EclEmma&lt;/a&gt; for Eclipse. It works very much like Emma. It also gives visual highlights of what code has been tested or "covered," as well as the usual quantified metrics provided after every build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-1521907878620226900?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/1521907878620226900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=1521907878620226900' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1521907878620226900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/1521907878620226900'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/09/stack-emma-junit.html' title='Stack + Emma + JUnit'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-5057222073394901741</id><published>2008-09-24T08:08:00.000-07:00</published><updated>2008-09-24T09:31:26.785-07:00</updated><title type='text'>Automated vs Manual QA (CodeRuler)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Overview:&lt;/span&gt;&lt;br /&gt;Simply compare the validity of human QA and automated QA tools on previous &lt;a href="http://anthonymdu.blogspot.com/2008/09/lessons-learned-from-coderuler.html"&gt;CodeRuler&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Running Ant + CodeRuler&lt;/span&gt;:&lt;br /&gt;QA Tool:    QA Violation    (Comments)&lt;br /&gt;&lt;br /&gt;CheckStyle:    Line Type Javadoc comment is missing an @author tag.    (JavaDoc issue)&lt;br /&gt;CheckStyle:    Line contains a tab character.    (Format issue)&lt;br /&gt;CheckStyle:    Unused @param tag for 'int'.    (Logic issue)&lt;br /&gt;CheckStyle:    Expected @param tag for ‘x’ or ‘y’    (Logic issue)&lt;br /&gt;CheckStyle:    Line is longer than 100 characters.    (Format issue)&lt;br /&gt;CheckStyle:    Type Javadoc comment is missing an @author tag.   (JavaDoc issue)&lt;br /&gt;CheckStyle:    'static' modifier out of order with the JLS suggestions.    (Logic issue)&lt;br /&gt;CheckStyle:    Missing a Javadoc comment.    (JavaDoc issue)&lt;br /&gt;CheckStyle:    '}' should be alone on a line.    (Format issue)&lt;br /&gt;CheckStyle:    First sentence should end with a period.    (Format issue)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;**CheckStyle errors: 101152 errors across 10 files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PMD:  Avoid if (x != y) ..; else ..;&lt;br /&gt;PMD:  Avoid unnecessary comparisons in boolean expressions&lt;br /&gt;PMD: Private field 'castle' could be made final; it is only initialized in the declaration or constructor.&lt;br /&gt;PMD:  Avoid using if statements without curly braces&lt;br /&gt;PMD: Avoid using implementation types like 'ArrayList'; use the interface instead&lt;br /&gt;PMD: Substitute calls to size() == 0 (or size() != 0) with calls to isEmpty()&lt;br /&gt;PMD: These nested if statements could be combined&lt;br /&gt;&lt;span&gt;PMD: &lt;/span&gt;Document empty constructor&lt;br /&gt;PMD: An empty method in an abstract class should be abstract instead&lt;br /&gt;PMD: Return an empty array rather than null.&lt;br /&gt;PMD: Document empty method&lt;br /&gt;PMD: All methods are static. Consider using Singleton instead. Alternatively, you could add a private constructor or make the class abstract to silence this warning.&lt;br /&gt;PMD: Return an empty array rather than null.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;**PMD errors: 60 errors across 3 files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;FindBugs: 439 lines of code analyzed,  in 11 classes,   in 2 packages.&lt;br /&gt;**FindBugs errors: 0 errors and 0 warnings!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;Obviously, this would have been a nightmare without some kind of automated tool system for checking styles and coding rules. Upon receiving the numerous style errors, these QA tools give a descriptive audit of exactly when and where each error occurs. Using QA tools helps our code exist in one or many standards depending on the situation. After seeing what a mess things could be when we go against the standard, I'm now leaning more toward coding in a much safer and higher quality standard environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-5057222073394901741?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/5057222073394901741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=5057222073394901741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5057222073394901741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5057222073394901741'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/09/automated-vs-manual-qa-coderuler.html' title='Automated vs Manual QA (CodeRuler)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-5853554849151441073</id><published>2008-09-19T11:05:00.000-07:00</published><updated>2008-09-24T08:06:07.060-07:00</updated><title type='text'>Software Quality Assurance</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Overview&lt;/span&gt;&lt;span style="font-size:130%;"&gt;:&lt;/span&gt;&lt;br /&gt;Quality Assurance (QA) of code is the basis of source code analysis development. The quintessential part of distributing your code with high quality production standards is that it ensures a good product (reliable,  maintainable, and manageable) and enables other organizations to easily pickup your software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;System Requirements:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Java:&lt;/span&gt;&lt;/span&gt; JDK 1.4 or higher&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;OS: &lt;/span&gt;&lt;/span&gt;Windows, Linux, Unix, or Mac OS X&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;QA Tools:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ant&lt;span style="font-style: italic;"&gt; &lt;/span&gt;- "Anther Neat Tool" used to assist programmers in scripting custom automated build process similar to that of "make" for C/C++.&lt;/li&gt;&lt;li&gt;CheckStyle - used to help ensure that your Java code adheres to a set of coding standards.  (static analysis)&lt;/li&gt;&lt;li&gt;PMD - used to enforce certain coding rules. (static analysis)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;FindBugs - is another static analysis tool that examines your class or JAR files looking for potential problems by matching your bytecodes against a list of bug patterns.&lt;/li&gt;&lt;li&gt;JUnit - used to incrementally assert test conditions/statements that presumably matches an expected outcome.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Installation:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The installation process is quite simple once you get the hang of it. Below is a quick walk through of installing the above QA tools on both Mac OS X/Linux platforms:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Mac OS X (Unix) / Linux Users:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;** the instructions below can also be tailored for Linux users too, but just with slight differences.&lt;br /&gt;&lt;br /&gt;Fortunately for mac users, Java and Ant come pre-installed with the latest version of  Mac OS X (10.5.4). All I ended up doing was export the path variables (JAVA_HOME &amp;amp; ANT_HOME) to point to the installed locations on the system. *If you need to install it manually, then you can consult to instructions &lt;a href="http://www.asceticmonk.com/blog/?p=388"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;$ cd &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;$ emacs .profile&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;edit file by adding the following:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;export JAVA_HOME="/Library/Java/Home"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;export ANT_HOME="/usr/share/ant"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;save and close the file&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;$ source .profile&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;you can also check to see if your environment variables have been added by typing:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;$ env&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;Once you get the hang of just installing one tool, the rest follow the same methodology for both Unix and Linux platforms. Below is a generalized version of installing and updating the environment variables&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;Download and extract: qa_tool (e.g. checkstyle, pmd, findbugs, etc.)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;$ cd downloads/&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;$ wget qa_tool_url &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;$ &lt;/span&gt;unzip qa_tool_version.zip -d /usr/local&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Update environment variables&lt;/span&gt;&lt;/li&gt;&lt;li&gt;$ cd&lt;/li&gt;&lt;li&gt;emacs .profile&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;add the following env variables&lt;/span&gt;&lt;/li&gt;&lt;li&gt;export QA_TOOL_HOME&lt;span style="font-style: italic;"&gt;="/usr/local/qa_tool"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;save and close file&lt;/span&gt;&lt;/li&gt;&lt;li&gt;$ source .profile&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Stack + QA:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;The program called stack will help us test our newly installed QA tools.&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Setup project:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Download project source code here: stack.zip&lt;/li&gt;&lt;li&gt;Extract source project into development directory (workspace in Eclipse)&lt;/li&gt;&lt;li&gt;Open Eclipse and select &lt;span style="font-style: italic;"&gt;File&gt;Import&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;General&gt;Existing Projects into Workspace&lt;/span&gt;, select &lt;span style="font-style: italic;"&gt;root directory&lt;/span&gt; by &lt;span style="font-style: italic;"&gt;browsing&lt;/span&gt; to where the stack source was extracted, and click on &lt;span style="font-style: italic;"&gt;Finish&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Right-click&lt;/span&gt; on stack project, &lt;span style="font-style: italic;"&gt;Refactor&gt;Rename&gt;stack-(username)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Edit&lt;span style="font-style: italic;"&gt; &lt;span style="font-style: italic;"&gt;build.xml &lt;/span&gt;&lt;/span&gt;file by renaming the project name to match "stack-(username)"&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Running Ant + QA tools:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;At the command prompt/terminal, switch to the location of your stack project folder and run the following &lt;span style="font-style: italic;"&gt;Ant&lt;/span&gt; commands:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;ul style="font-family: arial;"&gt;&lt;li&gt; ant clean compile   &lt;/li&gt;&lt;li&gt; ant -f checkstyle.build.xml   &lt;/li&gt;&lt;li&gt; ant -f dist.build.xml   &lt;/li&gt;&lt;li&gt; ant -f findbugs.build.xml   &lt;/li&gt;&lt;li&gt; ant -f javadoc.build.xml   &lt;/li&gt;&lt;li&gt; ant -f junit.build.xml   &lt;/li&gt;&lt;li&gt; ant -f pmd.build.xml   &lt;/li&gt;&lt;li&gt; ant -f verify.build.xml   &lt;/li&gt;&lt;/ul&gt;The last statement should render a &lt;span style="font-style: italic;"&gt;BUILD FAILED &lt;/span&gt;plus something similar:&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;:stack-anthony.m.du directory&lt;br /&gt;$ ant -f verify.build.xml &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Buildfile: verify.build.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;clean:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [delete] Deleting directory /Users/admin/Develop/java/stack-anthony.m.du/build&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;compile:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/classes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [javac] Compiling 5 source files to /Users/admin/Develop/java/stack-anthony.m.du/build/classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;junit.tool:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/junit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Running edu.hawaii.stack.TestClearStack&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.071 sec&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Running edu.hawaii.stack.TestStack&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Tests run: 2, Failures: 1, Errors: 0, Time elapsed: 0.031 sec&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;BUILD FAILED&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;/Users/admin/Develop/java/stack-anthony.m.du/junit.build.xml:18: Test edu.hawaii.stack.TestStack failed&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Stack + QA tool fixes:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;**description of errors can be found in build directory under tool directory subfolder in html format.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;JUnit errors:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;code style="font-family: arial;"&gt;junit.framework.AssertionFailedError: Testing stack top of three expected same:&lt;3&gt; was not:&lt;1&gt;&lt;br /&gt;at edu.hawaii.stack.TestStack.testNormalOperation(TestStack.java:37)&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;**edited top() logic in file: Stack.java&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Checkstyle errors:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;[checkstyle] /Users/admin/Develop/java/stack-anthony.m.du/src/edu/hawaii/stack/Stack.java:52: Expected an @return tag.&lt;br /&gt;[checkstyle] /Users/admin/Develop/java/stack-anthony.m.du/src/edu/hawaii/stack/Stack.java:79:3: '{' should be on the previous line.&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;**made fixes to those minor style checks in file: Stack.java&lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;PMD errors:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;5 total:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;Private field 'one' could be made final; it is only initialized in the declaration&lt;/span&gt;&lt;br /&gt;... again for both 'two' and 'three'&lt;br /&gt;**&lt;span style="font-style: italic;"&gt;added final to all three declaration statements in file: TestClearStack.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Avoid using implementation types like 'ArrayList'; use the interface instead &lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:100%;"  &gt;**replaced with List interface declaration in file: Stack.java&lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;Consider simply returning the value vs storing it in local variable 'obj' &lt;/span&gt;&lt;br /&gt;**&lt;span style="font-style: italic;"&gt;replaced with returning top value instead of storing in file: Stack.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FindBugs errors:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Method new edu.hawaii.stack.TestClearStack() invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Method new edu.hawaii.stack.TestStack() invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;**replaced declaration with "Integer.valueOf(int)&lt;/span&gt;" &lt;span style="font-style: italic;"&gt;in file: TestClearStack.java &amp;amp; TestStack&lt;/span&gt;.java&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Final Stack + Ant Run:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;amd:stack-anthony.m.du admin$ ant -f verify.build.xml &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Buildfile: verify.build.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;clean:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [delete] Deleting directory /Users/admin/Develop/java/stack-anthony.m.du/build&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;compile:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/classes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [javac] Compiling 5 source files to /Users/admin/Develop/java/stack-anthony.m.du/build/classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;junit.tool:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/junit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Running edu.hawaii.stack.TestClearStack&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.105 sec&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Running edu.hawaii.stack.TestStack&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.015 sec&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;checkstyle.tool:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/checkstyle&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;[checkstyle] Running Checkstyle 5.0-beta01 on 5 files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;pmd.tool:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/pmd&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     [echo] PMD found ${pmd.failure.count} problem(s).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;findbugs.tool:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/findbugs&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; [findbugs] Executing findbugs from ant task&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; [findbugs] Running FindBugs...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; [findbugs] Error: The path /usr/share/findbugs-1.3.5/plugin does not seem to be a directory!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; [findbugs] No FindBugs plugins could be loaded&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; [findbugs] Output saved to /Users/admin/Develop/java/stack-anthony.m.du/build/findbugs/findbugs.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;emma.tool:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [mkdir] Created dir: /Users/admin/Develop/java/stack-anthony.m.du/build/emma&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [instr] processing instrumentation path ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [instr] instrumentation path processed in 90 ms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [instr] [3 class(es) instrumented, 0 resource(s) copied]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [instr] metadata merged into [/Users/admin/Develop/java/stack-anthony.m.du/build/emma/metadata.emma] {in 2 ms}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Running edu.hawaii.stack.TestClearStack&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.261 sec&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Output:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] EMMA: collecting runtime coverage data ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Running edu.hawaii.stack.TestStack&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.254 sec&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] Output:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] EMMA: collecting runtime coverage data ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    [junit] &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [report] processing input files ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [report] 2 file(s) read and merged in 7 ms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [report] writing [xml] report to [/Users/admin/Develop/java/stack-anthony.m.du/build/emma/coverage.xml] ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [report] writing [html] report to [/Users/admin/Develop/java/stack-anthony.m.du/build/emma/coverage.html] ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [delete] Deleting directory /Users/admin/Develop/java/stack-anthony.m.du/build/classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;emma.echo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     [xslt] Processing /Users/admin/Develop/java/stack-anthony.m.du/build/emma/coverage.xml to /Users/admin/Develop/java/stack-anthony.m.du/build/emma/coverage.brief.txt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     [xslt] Loading stylesheet /Users/admin/Develop/java/stack-anthony.m.du/lib/emma/echo.emma.xsl&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [concat] Emma Coverage summary&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [concat] class:   100% (3/3)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [concat] method:  73%  (8/11)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [concat] block:   69%  (65/94)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;   [concat] line:    75%  (15/20)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;verify:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;BUILD SUCCESSFUL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Total time: 7 seconds&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;**Here's a link to the new build: &lt;a href="http://sites.google.com/site/anthonymdu/Home/downloads/stack-anthony.m.du-6.0.921.zip?attredirects=0"&gt;stack-anthony.m.du-6.0.921.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Conclusion:&lt;/span&gt;&lt;br /&gt;I learned that functional software products must also have high quality attributes to pass being labeled a legitimate software product. Besides meeting your company's functional requirements, your software must also verify with quality assurance guidelines. In doing so, software products will be more reliable, maintainable, manageable and even distributed in a timely matter with functionality. In another exploration, I would like to find ways to quantify the quality assurance of source code. The elements of benchmarking your QA is most likely related to process aspects and operations. Perhaps, we could benchmark the number of errors or unsuccessful builds using &lt;span style="font-style: italic;"&gt;Ant &lt;/span&gt;or some other tool&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-5853554849151441073?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/5853554849151441073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=5853554849151441073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5853554849151441073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/5853554849151441073'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/09/qa-experience.html' title='Software Quality Assurance'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-2259079755306197671</id><published>2008-09-12T13:08:00.000-07:00</published><updated>2008-09-15T12:46:27.415-07:00</updated><title type='text'>CodeRuler Review</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;First look:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I was assigned to review Daniel and Erin's CodeRuler implementation. In the first trial their ruler outperformed against the migrate ruler by a large margin. Unfortunately they weren't too successful against either smart-splitter or gang-up rulers. In both trials (smart and gang) their ruler performed the same way by killing all enemy peasants before capturing its castle. But by the time they captured the enemy's castle, their first castle gets occupied by knights of the opposing team. While they attempt to re-capture their first castle, no peasants are being produced in their second castle. The opposing ruler keeps producing knights after every turn, thus covering and protecting its castle. Their ruler consistantly battles the knights, but unsuccessfully captures back their first castle. For every battle lost between their knights and the opposing team, the enemy gains battle points and they lose precious points from not claiming land. Although the end result is not fully desired, there is much to learn from this implementation. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Review:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Besides what the CodeRuler strategy implies, this review is based on the creators' coding style and class logic structure. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;JavaDocs:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The provided JavaDocs for this MyRuler is quite clear and concise. The method summary is descriptive and easy to follow. You can almost get the gist of what each method is intended to do without looking at any code. However, I would like to see a better introduction to their MyRuler class by describing more of their strategy rather than listing the resulting trial matches. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Class logic and structure:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The overall class structure is simple and easy to follow. Each method provides a readable description that matches the code segments. Method references are nicely encapsulated and broken down into smaller reusable routines. I found it much easier to read each function due to the fact that this group followed good naming conventions. As for the effectiveness of their code, I would have to disagree with one routine called: &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;buildUnits (line # 231)&lt;/span&gt;&lt;/span&gt;. I found this method to be less effective in the process of replicating more peasants at each captured castle. This method stops the production of peasants when the team has only one aquired castle. Due to this limitation, other methods relating to the movement of peasants, such as: &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;optimizePeasantMove (line #413)&lt;/span&gt;&lt;/span&gt; was wasted during gameplay. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Coding style:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Below are some minor code style violations within the MyRuler class. Most of these errors can be set to fix automatically (format) or easily avoided the next time around.&lt;/div&gt;&lt;div style=""&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="3" width="100%"&gt;  &lt;col width="26"&gt;  &lt;col width="43"&gt;  &lt;col width="46"&gt;  &lt;col width="141"&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;th width="10%"&gt;    &lt;p align="center"&gt;File&lt;/p&gt;   &lt;/th&gt;   &lt;th width="17%"&gt;    &lt;p align="center"&gt;Lines&lt;/p&gt;   &lt;/th&gt;   &lt;th width="18%"&gt;    &lt;p align="center"&gt;Violations&lt;/p&gt;   &lt;/th&gt;   &lt;th width="55%"&gt;    &lt;p align="center"&gt;Comments&lt;/p&gt;   &lt;/th&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="10%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MyRuler&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;93-94,&lt;br /&gt;100-101,&lt;br /&gt;143-144, *&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="18%"&gt;    &lt;p style="margin-bottom: 0.2in;" align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;EJS - 5,&lt;/span&gt;&lt;/p&gt;    &lt;p align="center"&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;ICS-SE-Eclipse-2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="55%"&gt;    &lt;p align="left"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;opening brace should be at end of the line that    introduced the block.&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="10%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MyRuler&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;87, 88, 175, *&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="18%"&gt;    &lt;p align="center"&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;ICS-SE-Eclipse-2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="55%"&gt;    &lt;p align="left"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Some lines exceed the 100 column max limit.&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="10%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MyRuler&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;155, 159, 177, *&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="18%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;EJS – 7&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="55%"&gt;    &lt;p align="left"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Increase white spaces by placing them between    keywords (if, for, while, switch) and parenthesis or braces to    better readability of code.&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="10%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MyRuler&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;4&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="18%"&gt;    &lt;p align="center"&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;ICS-SE-Java-2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="55%"&gt;    &lt;p align="left"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Must explicitly specify each class import rather    than using a wildcard “*”.&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="10%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MyRuler&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;130, 133, 146, *&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="18%"&gt;    &lt;p align="center"&gt;&lt;span style="font-family:'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;ICS-SE-Java-10&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="55%"&gt;    &lt;p align="left"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Needs to pluralize names of collection objects.&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="10%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;MyRuler&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="17%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;96, 117, 168, *&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="18%"&gt;    &lt;p align="center"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;EJS - 49&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="55%"&gt;    &lt;p align="left"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Omit subject in method description to reduce    redundancy.&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Final thoughts:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;After reviewing the coding style and class structure of this CodeRuler implementation, I learned that documenting your code is just as hard as implementing it. Maybe a better approach to programming would be to self document first and then extract code statements and method functions from that as you build the application. The all important methodologies of "Top-Down" programming would be an essential skill to practice for even the simplest of classes or methods. This should be applied also to the way we program and document our work. Overall, Daniel and Erin did a good job and I hope they take away as much from this as I did.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's a link back to each member's blog. There you can also find a link to their source code.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dmarakaki.blogspot.com/2008/09/lessons-learned-from-code-ruler.html"&gt;Daniel Arakaki&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://erinjuneilkim.blogspot.com/2008/09/coderuler.html"&gt;Erin Kim&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-2259079755306197671?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/2259079755306197671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=2259079755306197671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/2259079755306197671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/2259079755306197671'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/09/coderuler-review.html' title='CodeRuler Review'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-4681768225822013633</id><published>2008-09-07T23:37:00.000-07:00</published><updated>2008-09-08T05:17:03.006-07:00</updated><title type='text'>Lessons learned from Code Ruler</title><content type='html'>&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Overview:&lt;/span&gt; &lt;a href="http://www.alphaworks.ibm.com/tech/coderuler"&gt;CodeRuler&lt;/a&gt; is a Java programming game based on the Eclipse IDE. It is intended for testing skills in Java programming as well as strategic reasoning. The basic idea of the game is to capture other opponents' castles and claim the most land resources. In doing so, the player with the highest score wins the game!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;MyRuler Group Members:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jnancheta.blogspot.com/"&gt;Ancheta, John&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://creightonokada.blogspot.com/"&gt;Okada, Creighton&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Strategy Outline:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Break knights and peasants into smaller groups with specific objectives.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;InsideCastleGuards&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will stay and move around inside the castle.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will capture any opponent knight inside the castle.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;OutsideCastleGuards&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will attempt to capture any knight that moves too close to the castle.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will roam around the castle area capturing opponents peasants.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they are the first line of defense against opponent knights.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;KnightCastleInvaders&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will attempt to capture opponents' castle.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will attempt capture of opponents' peasants that they encounter, but they will not chase them.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will avoid contact with opponents' knights.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;LandCapturePeasants&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will attempt to capture unoccupied land and opponents' land.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will attempt to avoid capture from opponents' knight.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;KnightDistractionPeasants&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;they will attempt to get opponents' knight to chase them, leading the opponents' knight away from the castle.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;Sample Game Results:&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th align="center"&gt;MyRuler vs Migrate&lt;/th&gt;&lt;th align="center"&gt;MyRuler vs Gang-up&lt;/th&gt;&lt;th align="center"&gt;MyRuler vs Split-up&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td align="center"&gt;503-36&lt;/td&gt;&lt;td align="center"&gt;455-117&lt;/td&gt;&lt;td align="center"&gt;412-182&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td align="center"&gt;540-32&lt;/td&gt;&lt;td align="center"&gt;455-140&lt;/td&gt;&lt;td align="center"&gt;513-119&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td align="center"&gt;462-40&lt;/td&gt;&lt;td align="center"&gt;370-156&lt;/td&gt;&lt;td align="center"&gt;466-234&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Lessons learned:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;Eclipse &lt;/span&gt;became a good companion for this project. I consider it an all-purpose IDE and has well lived up to its expectations for all backgrounds of developers. The built-in JavaDocs generator has proven to give ease and painless professional documentation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;Java&lt;/span&gt; still surprises me with its wealth of runtime exceptions. Here's one that I found annoying and difficult to fix: &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ConcurrentModificationException.html"&gt;"&lt;/a&gt;&lt;span class="Apple-style-span"  style=" font-weight: bold; font-family:'times new roman';"&gt;&lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ConcurrentModificationException.html"&gt;ConcurrentModificationException"&lt;/a&gt; &lt;span class="Apple-style-span" style="font-style: italic; "&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;-&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'times new roman';"&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;impermissible &lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'times new roman';"&gt;&lt;span class="Apple-style-span" style="font-style: italic; "&gt;for one thread to modify a Collection while another thread is iterating over it.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I learned that large projects such as this requires a large amount of effort from each person. It was difficult to have long continuous meetings due to our conflicting schedules, but we found other ways (email or online-chat) to communicate efficiently. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Improvements:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;My first recommendation for future projects that require the service of more than just one person would be to use some kind of source code version control like &lt;a href="http://subversion.tigris.org/"&gt;SVN &lt;/a&gt;or &lt;a href="http://git.or.cz/"&gt;GIT&lt;/a&gt;. It seems cleaner to do it under version control rather than passing back and forth document copies through email, which requires you or your team member to patch-up manually. I also would recommend a task tracker such as Edgewall's &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; for project management software. A handy project or task management software (preferably open source) would be helpful for keeping track of project goals, tasks and progress.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Reflection:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I enjoyed taking the time to experience programming this Java based strategy game. It proved to be well worth my time and a great learning experience for myself and my group members.&lt;br /&gt;&lt;br /&gt;CodeRuler source: &lt;a href="http://www2.hawaii.edu/~adu/ICS413/coderuler/du-okada-ancheta.zip"&gt;du-okada-ancheta.zip&lt;/a&gt;&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/2534024747783979675-4681768225822013633?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/4681768225822013633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=4681768225822013633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4681768225822013633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/4681768225822013633'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/09/lessons-learned-from-coderuler.html' title='Lessons learned from Code Ruler'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-2954976595866178162</id><published>2008-09-01T12:03:00.000-07:00</published><updated>2008-09-01T21:14:06.499-07:00</updated><title type='text'>Sun's GlassFish: Application Server Review</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Overview:&lt;/span&gt;&lt;br /&gt;&lt;a href="https://glassfish.dev.java.net/"&gt;&lt;span style="font-style: italic;"&gt;GlassFish&lt;/span&gt;&lt;/a&gt; is an opensource project held under a dual-license agreement by both CDDL &amp;amp; Apache's GPL licenses. It is an application server meant to service in deploying web applications. GlassFish is now certified and included by &lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;E&lt;/span&gt;nterprise &lt;span style="font-weight: bold;"&gt;E&lt;/span&gt;dition v&lt;span style="font-weight: bold;"&gt;5&lt;/span&gt;&lt;span&gt; (SDK). GlassFish provides enterprise quality features including support for high scalability of applications, robust clustering and advanced administration w/ GUI interface for management. The project also has a large growing community of developers/users and solid documentation/API (quick-start tutorials, roadmaps &amp;amp; architecture documents).&lt;br /&gt;Since its 2005 release, GlassFish has gained monumental support for both independent and commercial distributions.  In recent news, GlassFish will be announcing its v3 release. It claims to have made numerous improvements including, simplified Web 2.0 style applications, better optimization for version specific Java applications, and a useful notifiable update center for GlassFish's new components. Currently, you can try out &lt;a href="http://wiki.glassfish.java.net/Wiki.jsp?page=PlanForGlassFishV3"&gt;GlassFish v3&lt;/a&gt; under Technology Preview 2 (TP2) and test it out on your local machine. WARNING: As noted on the Tech Preview site,  the code is still in its raw experimental stages and should not be used to deploy production applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Satisfying Prime Directives:&lt;br /&gt;PD#1 (Useful functionality): &lt;/span&gt;GlassFish provides an open source referential implementation for developing high quality enterprise applications. Its support for Java EE v5 enables developers and companies to integrate with ease and to deploy business standard applications. The administration section is fully featured with a strong sense of security and management. I found that logging into the Admin Console  to be very easy to configure and use. The Admin Console features tools that provide you a great deal of control over your serviced application(s). Admin Console also provides common administrator tasks through a straightforward web-interface which include: 1) Easy enable/disable applications, 2) service logs on applications currently running, 3) configurable Java Database Connectivity (&lt;a href="http://java.sun.com/javase/technologies/database/"&gt;JDBC&lt;/a&gt;) - module for wide range of database support and 4) many server side settings. GlassFish also provides scalable clustering techniques for rendering multiple in-memory state sessions. Although a great feature, I will need more time to find a better/suitable comparative data for cluster instances and its impact on scalability.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;PD#2 (Ease of Installation &amp;amp; Deployment): &lt;/span&gt;&lt;span&gt;GlassFish has a number of resources including the very straightforward quickstart guide &lt;a href="https://glassfish.dev.java.net/downloads/quickstart/index.html"&gt;here&lt;/a&gt;. The quickstart guide helps you verify your server needs, gives you instructional steps into deploying your first web application, and using the administrative tools. I tested GlassFish on Eclipse v3.4 (on mac osx 10.5.4) using these &lt;a href="https://glassfishplugins.dev.java.net/eclipse33/index.html"&gt;instructions&lt;/a&gt; for installing the application server as a plugin and deploying my first Java EE application. There are also other supportive IDE's that make it just as easy to install GlassFish (as a plugin) and can be found &lt;a href="https://glassfishplugins.dev.java.net/"&gt;here&lt;/a&gt;. As for deploying my first Java EE application, I also found &lt;a href="http://download.java.net/javaee5/screencasts/glassfish-in-europa/"&gt;this&lt;/a&gt; great screencast created by a fellow Sun developer named &lt;/span&gt;&lt;/span&gt;Arun Gupta. The screencast has a bit of an audio glitch, but I found myself just turning the volume down and mimicking his actions.&lt;br /&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;PD#3 (Accessbility for Future Enhancements): &lt;/span&gt;&lt;span&gt;GlassFish's popularity has grown since Sun released its Binary (.jar) in 2005, where countless number of people in the millions tried it for the first time. The project has up to date news, discussion boards/&lt;a href="http://forums.java.net/jive/forum.jspa?forumID=56&amp;amp;start=0"&gt;forums&lt;/a&gt;, and RSS supportive &lt;a href="https://glassfish.dev.java.net/servlets/ProjectMailingListList"&gt;mailing lists&lt;/a&gt;. Although GlassFish's licence agreements are semi-proprietary, in that some of its components are given out as binaries rather than pure source code, the community of active developers are still able to contribute to the development future of the project. Again, GlassFish is under CDDL agreement which authorizes anyone to make changes, fix bugs, and contribute new features. You can visit &lt;a href="https://glassfish.dev.java.net/public/CDDL%2BGPL.html"&gt;this&lt;/a&gt; site for more information on CDDL and GPL licenses. I also found this &lt;a href="http://wiki.java.net/bin/view/Projects/GlassFishCodeDependencies"&gt;wiki&lt;/a&gt; page useful for having a general overview of which components are under which licensing term.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Final Thoughts: &lt;/span&gt;&lt;br /&gt;In my brief experience with GlassFish v2, I've found myself more aware of the possibilities and power of one application server. Considering that this was my very first application server written in Java and for Java EE applications, I will need to give it more tests to verify its specifications. I've also heard of other application server alternatives to GlassFish, such as &lt;a href="http://www.jboss.org/"&gt;JBoss&lt;/a&gt;, Apache's &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt; and &lt;a href="http://geronimo.apache.org/"&gt;Geronimo&lt;/a&gt;. Its a good possibility that I will post a comparison chart displaying its pros and cons. But I'm actually more tempted to wait for the highly acclaimed release of v3 for GlassFish.&lt;br /&gt;After seeing that open source communities are now driving the market of consumers by its free price and popularity, I wouldn't be so surprised that big companies like Microsoft will start to become more open source.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-2954976595866178162?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/2954976595866178162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=2954976595866178162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/2954976595866178162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/2954976595866178162'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/09/suns-glassfish-application-server.html' title='Sun&apos;s GlassFish: Application Server Review'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2534024747783979675.post-3050023983926296866</id><published>2008-08-26T13:31:00.000-07:00</published><updated>2008-08-29T18:57:10.389-07:00</updated><title type='text'>FizzBuzz (JUnit + Eclipse)</title><content type='html'>Premise: Testing out JUnit's test case features on Eclipse.&lt;br /&gt;Application: FizzBuzz&lt;br /&gt;Description: Print out the numbers from 1-100 on each line. If a number is divisible by 3 then print out "Fizz", else if a number is divisible by 5 then print "Buzz", else if the number is divisible by both 3 and 5 then print "FizzBuzz", otherwise print the numeric value.&lt;br /&gt;&lt;br /&gt;Why JUnit?&lt;br /&gt;JUnit provides immediate feedback based on YOUR tests. It lets you have a taste of the pie rather than the whole thing all at once. JUnit provides safe and time saving software engineering practices for both small or large production software. And of course JUnit is FREE and included when you download Eclipse.&lt;br /&gt;&lt;br /&gt;JUnit design procedures:&lt;br /&gt;1. Create a JUnit Test Case in your current project folder. Your test case classes will extend from JUnit's TestCase object class. In here, you can utilize the following methods provided by TestCase: setUp() - to initialize test objects, tearDown() - to destroy test objects. Next, write your test case methods with their names prefixed with 'test'&lt;br /&gt;2. Create a JUnit Test Suite in your existing project folder. Eclipse provides a convenient way to add test classes to your test suite upon creation. The test suite is intended to encapsulate all test classes provided in your project folder.&lt;br /&gt;3. Implement the component/class for your project and test away! Remember that your program is validating itself with incremental test units, so start out with just a piece of your program and work your way up the chain.&lt;br /&gt;&lt;br /&gt;---Source---&lt;br /&gt;Test class: TestFizzBuzz.java&lt;br /&gt;- Declare the object FizzBuzz to be tested and an integer as our test case input value.&lt;br /&gt;- Create methods: setUp() initialize variables/objects &amp; tearDown() destruction of variables/objects&lt;br /&gt;- Implement test case method: testGetValue()&lt;br /&gt;&lt;pre class="textmate-source blackboard"&gt;&lt;span class="source source_java"&gt;&lt;span class="meta meta_import meta_import_java"&gt;&lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;import&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_import entity_name_type_import_java"&gt;junit.framework.TestCase&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="meta meta_definition meta_definition_class meta_definition_class_java"&gt;&lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;class&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_java"&gt;TestFizzBuzz&lt;/span&gt; &lt;span class="meta meta_definition meta_definition_class meta_definition_class_extends meta_definition_class_extends_java"&gt;&lt;span class="storage storage_modifier storage_modifier_java"&gt;extends&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;TestCase&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;OBJECT/PRIMATIVE DATA DECLARATIONS&lt;br /&gt;&lt;/span&gt;    &lt;span class="storage storage_modifier storage_modifier_access-control storage_modifier_access-control_java"&gt;private&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;FizzBuzz&lt;/span&gt; fb; &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;object class being tested&lt;br /&gt;&lt;/span&gt;    &lt;span class="storage storage_modifier storage_modifier_access-control storage_modifier_access-control_java"&gt;private&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;int&lt;/span&gt; num; &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;test value&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;FIXTURES&lt;br /&gt;&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;protected &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;void&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;setUp&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;        num = &lt;span class="constant constant_numeric constant_numeric_java"&gt;3&lt;/span&gt;;&lt;br /&gt;        fb = &lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;FizzBuzz&lt;/span&gt;();&lt;br /&gt;        fb.setNum(num);&lt;br /&gt;    }&lt;br /&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;protected &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;void&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;tearDown&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;        num = &lt;span class="constant constant_numeric constant_numeric_java"&gt;0&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;TEST CASES (prefix method names with 'test')&lt;br /&gt;&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;void&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;testGetValue&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;        &lt;span class="keyword keyword_control keyword_control_java"&gt;if&lt;/span&gt; (num&lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;==&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_java"&gt;3&lt;/span&gt;) {&lt;br /&gt;            assertEquals(&lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;Fizz&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;, fb.getValue());&lt;br /&gt;        } &lt;span class="keyword keyword_control keyword_control_java"&gt;else&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_java"&gt;if&lt;/span&gt; (num&lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;==&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_java"&gt;5&lt;/span&gt;) {&lt;br /&gt;            assertEquals(&lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;Buzz&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;, fb.getValue());&lt;br /&gt;        } &lt;span class="keyword keyword_control keyword_control_java"&gt;else&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_java"&gt;if&lt;/span&gt; (num&lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;==&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_java"&gt;15&lt;/span&gt;) {&lt;br /&gt;            assertEquals(&lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;FizzBuzz&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;, fb.getValue());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Test suite: AllTests.java &lt;br /&gt;- Test all test case methods in class 'TestFizzBuzz'&lt;br /&gt;&lt;pre class="textmate-source blackboard"&gt;&lt;span class="source source_java"&gt;&lt;span class="meta meta_import meta_import_java"&gt;&lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;import&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_import entity_name_type_import_java"&gt;junit.framework.Test&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_import meta_import_java"&gt;&lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;import&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_import entity_name_type_import_java"&gt;junit.framework.TestSuite&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="meta meta_definition meta_definition_class meta_definition_class_java"&gt;&lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;class&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_java"&gt;AllTests&lt;/span&gt; &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public static &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;Test&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;suite&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;        &lt;span class="storage storage_type storage_type_java"&gt;TestSuite&lt;/span&gt; suite = &lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;TestSuite&lt;/span&gt;(&lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;Test for default package&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;$JUnit-BEGIN$&lt;br /&gt;&lt;/span&gt;        suite.addTestSuite(&lt;span class="storage storage_type storage_type_java"&gt;TestFizzBuzz&lt;/span&gt;.&lt;span class="storage storage_type storage_type_java"&gt;class&lt;/span&gt;);&lt;br /&gt;        &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;$JUnit-END$&lt;br /&gt;&lt;/span&gt;        &lt;span class="keyword keyword_control keyword_control_java"&gt;return&lt;/span&gt; suite;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public static &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;void&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;main&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;span class="support support_type support_type_built-ins support_type_built-ins_java"&gt;String&lt;/span&gt;[] args&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;        &lt;span class="storage storage_type storage_type_java"&gt;junit.textui.TestRunner&lt;/span&gt;.run(suite());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Application: FizzBuzz.java&lt;br /&gt;- Attempt to implement the getValue method&lt;br /&gt;- Output the desired results&lt;br /&gt;&lt;pre class="textmate-source blackboard"&gt;&lt;span class="source source_java"&gt;&lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;FizzBuzz.class&lt;br /&gt;&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_class meta_definition_class_java"&gt;&lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;class&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_java"&gt;FizzBuzz&lt;/span&gt; &lt;/span&gt;{&lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;PRIMATIVE DATA&lt;br /&gt;&lt;/span&gt;    &lt;span class="storage storage_modifier storage_modifier_access-control storage_modifier_access-control_java"&gt;private&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;int&lt;/span&gt; num;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;DEFAULT CONSTRUCTORS&lt;br /&gt;&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_constructor meta_definition_constructor_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="entity entity_name entity_name_function entity_name_function_constructor entity_name_function_constructor_java"&gt;FizzBuzz&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;    }&lt;br /&gt;&lt;span class="meta meta_definition meta_definition_constructor meta_definition_constructor_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="entity entity_name entity_name_function entity_name_function_constructor entity_name_function_constructor_java"&gt;FizzBuzz&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;span class="storage storage_type storage_type_java"&gt;int&lt;/span&gt; n&lt;/span&gt;) &lt;/span&gt;{ &lt;br /&gt;        num = n; &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;GETTERS/SETTERS&lt;br /&gt;&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;void&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;setNum&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;span class="storage storage_type storage_type_java"&gt;int&lt;/span&gt; num&lt;/span&gt;) &lt;/span&gt;{ &lt;br /&gt;        &lt;span class="variable variable_language variable_language_java"&gt;this&lt;/span&gt;.num = num; &lt;br /&gt;    }&lt;br /&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;int&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;getNum&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;/span&gt;) &lt;/span&gt;{ &lt;br /&gt;        &lt;span class="keyword keyword_control keyword_control_java"&gt;return&lt;/span&gt; num; &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;RETRIEVE CORRECT VALUE&lt;br /&gt;&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;String&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;getValue&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;        &lt;span class="keyword keyword_control keyword_control_java"&gt;if&lt;/span&gt;((num &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_java"&gt;%&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;3&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;==&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;0&lt;/span&gt;) &lt;span class="keyword keyword_operator keyword_operator_logical keyword_operator_logical_java"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (num &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_java"&gt;%&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;5&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;==&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;0&lt;/span&gt;)) { &lt;br /&gt;            &lt;span class="keyword keyword_control keyword_control_java"&gt;return&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;FizzBuzz&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;; &lt;br /&gt;        } &lt;span class="keyword keyword_control keyword_control_java"&gt;else&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_java"&gt;if&lt;/span&gt; (num &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_java"&gt;%&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;3&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;==&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;0&lt;/span&gt;){&lt;br /&gt;            &lt;span class="keyword keyword_control keyword_control_java"&gt;return&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;Fizz&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;        } &lt;span class="keyword keyword_control keyword_control_java"&gt;else&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_java"&gt;if&lt;/span&gt; (num &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_java"&gt;%&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;5&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;==&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_java"&gt;0&lt;/span&gt;) {&lt;br /&gt;            &lt;span class="keyword keyword_control keyword_control_java"&gt;return&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;Buzz&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;        } &lt;span class="keyword keyword_control keyword_control_java"&gt;else&lt;/span&gt; {&lt;br /&gt;            &lt;span class="keyword keyword_control keyword_control_java"&gt;return&lt;/span&gt; &lt;span class="support support_type support_type_built-ins support_type_built-ins_java"&gt;Integer&lt;/span&gt;.toString(num);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;MAIN METHOD&lt;br /&gt;&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_method meta_definition_method_java"&gt;    &lt;span class="storage storage_modifier storage_modifier_java"&gt;public static &lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;void&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_java"&gt;main&lt;/span&gt;&lt;span class="meta meta_definition meta_definition_param-list meta_definition_param-list_java"&gt;(&lt;span class="support support_type support_type_built-ins support_type_built-ins_java"&gt;String&lt;/span&gt;[] args&lt;/span&gt;) &lt;/span&gt;{&lt;br /&gt;        &lt;span class="storage storage_type storage_type_java"&gt;FizzBuzz&lt;/span&gt; fb = &lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;FizzBuzz&lt;/span&gt;();&lt;br /&gt;        &lt;span class="keyword keyword_control keyword_control_java"&gt;for&lt;/span&gt; (&lt;span class="storage storage_type storage_type_java"&gt;int&lt;/span&gt; i=&lt;span class="constant constant_numeric constant_numeric_java"&gt;1&lt;/span&gt;; i&lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_java"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_java"&gt;100&lt;/span&gt;; i&lt;span class="keyword keyword_operator keyword_operator_increment-decrement keyword_operator_increment-decrement_java"&gt;++&lt;/span&gt;) {&lt;br /&gt;            fb.setNum(i);&lt;br /&gt;            &lt;span class="support support_type support_type_built-ins support_type_built-ins_java"&gt;System&lt;/span&gt;.out.println(fb.getValue());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;FizzBuzz app results:&lt;br /&gt;&lt;pre class="textmate-source blackboard"&gt;&lt;span class="text text_plain"&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;1&lt;br /&gt;2&lt;br /&gt;Fizz&lt;br /&gt;4&lt;br /&gt;Buzz&lt;br /&gt;Fizz&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;Fizz&lt;br /&gt;Buzz&lt;br /&gt;11&lt;br /&gt;Fizz&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;FizzBuzz&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;Fizz&lt;br /&gt;19&lt;br /&gt;Buzz&lt;br /&gt;Fizz&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;Fizz&lt;br /&gt;Buzz&lt;br /&gt;26&lt;br /&gt;Fizz&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;FizzBuzz&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;Fizz&lt;br /&gt;34&lt;br /&gt;Buzz&lt;br /&gt;Fizz&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;Fizz&lt;br /&gt;Buzz&lt;br /&gt;41&lt;br /&gt;Fizz&lt;br /&gt;43&lt;br /&gt;44&lt;br /&gt;FizzBuzz&lt;br /&gt;46&lt;br /&gt;47&lt;br /&gt;Fizz&lt;br /&gt;49&lt;br /&gt;Buzz&lt;br /&gt;Fizz&lt;br /&gt;52&lt;br /&gt;53&lt;br /&gt;Fizz&lt;br /&gt;Buzz&lt;br /&gt;56&lt;br /&gt;Fizz&lt;br /&gt;58&lt;br /&gt;59&lt;br /&gt;FizzBuzz&lt;br /&gt;61&lt;br /&gt;62&lt;br /&gt;Fizz&lt;br /&gt;64&lt;br /&gt;Buzz&lt;br /&gt;Fizz&lt;br /&gt;67&lt;br /&gt;68&lt;br /&gt;Fizz&lt;br /&gt;Buzz&lt;br /&gt;71&lt;br /&gt;Fizz&lt;br /&gt;73&lt;br /&gt;74&lt;br /&gt;FizzBuzz&lt;br /&gt;76&lt;br /&gt;77&lt;br /&gt;Fizz&lt;br /&gt;79&lt;br /&gt;Buzz&lt;br /&gt;Fizz&lt;br /&gt;82&lt;br /&gt;83&lt;br /&gt;Fizz&lt;br /&gt;Buzz&lt;br /&gt;86&lt;br /&gt;Fizz&lt;br /&gt;88&lt;br /&gt;89&lt;br /&gt;FizzBuzz&lt;br /&gt;91&lt;br /&gt;92&lt;br /&gt;Fizz&lt;br /&gt;94&lt;br /&gt;Buzz&lt;br /&gt;Fizz&lt;br /&gt;97&lt;br /&gt;98&lt;br /&gt;Fizz&lt;br /&gt;Buzz&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Conclusions: &lt;br /&gt;The program took me about 15 minutes to accomplish. Having been equipped with the power of Eclipse and JUnit tool, I've been able to code with confidence. JUnit takes away the remedial debug breakpoints/backtrace of code (which requires that you make a mistake first), but rather helps you build from ground up with a solid assurance of functionality. It also helps prevent you from fixing a bug later down the line that may be too heavily nested in your code to find. In the essence of incremental programming, I would recommend further exploring the possibilities of JUnit in any aspect of development for Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2534024747783979675-3050023983926296866?l=anthonymdu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anthonymdu.blogspot.com/feeds/3050023983926296866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2534024747783979675&amp;postID=3050023983926296866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3050023983926296866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2534024747783979675/posts/default/3050023983926296866'/><link rel='alternate' type='text/html' href='http://anthonymdu.blogspot.com/2008/08/fizzbuzz-junit-eclipse.html' title='FizzBuzz (JUnit + Eclipse)'/><author><name>Anthony Du</name><uri>http://www.blogger.com/profile/15595267395425062968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
