tag:blogger.com,1999:blog-5927699972796043092024-03-13T07:46:17.690-07:00Judd SolutionsRandom thoughts about my interests in Java, consulting, scripting in Java and software development (especially for small and medium size organizations).Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.comBlogger79125tag:blogger.com,1999:blog-592769997279604309.post-58062385243051583992022-08-31T12:27:00.002-07:002022-08-31T12:27:26.679-07:00AWS EC2 Hibernate Java SDK v2 Example<p>I recently wanted to automate the creation of developer VMs in AWS using EC2 instances. To improve the developer experience (DX), I didn't like the developers having to shut down their instances to save money and lose their work. I wanted them to be able to hibernate their instances and return to where they left off. Unfortunately, I couldn't find an example of this using the AWS Java SDK v2. So after some experimentation, I created this example.</p><p>There are two requirements for hibernating an EC2 instance. First, the EBS drive must be encrypted. Second, the hibernate option must be enabled. Both of these requirements must be met when the instance is created.</p><pre style="background-color: white; color: #080808; font-family: 'JetBrains Mono',monospace; font-size: 9.8pt;"><span style="color: black;">Ec2Client ec2 </span>= <span style="color: black;">Ec2Client</span>.<span style="font-style: italic;">builder</span>()<br /> .region(<span style="color: black;">Region</span>.<span style="color: #871094; font-style: italic;">US_EAST_2</span>)<br /> .build();<br /><br /><span style="color: black;">RunInstancesRequest runRequest </span>= <span style="color: black;">RunInstancesRequest</span>.<span style="font-style: italic;">builder</span>()<br /> .imageId(<span style="color: #067d17;">"ami-081f2c86d8b025c4b"</span>)<br /> .instanceType(<span style="color: black;">InstanceType</span>.<span style="color: #871094; font-style: italic;">T3_MEDIUM</span>)<br /> .maxCount(<span style="color: #1750eb;">1</span>)<br /> .minCount(<span style="color: #1750eb;">1</span>)<br /> .keyName(<span style="color: #067d17;">"dev-key"</span>)<br /> .blockDeviceMappings(<span style="color: black;">BlockDeviceMapping</span>.<span style="font-style: italic;">builder</span>()<br /> .deviceName(<span style="color: #067d17;">"/dev/xvda"</span>)<br /> .ebs(<span style="color: black;">EbsBlockDevice</span>.<span style="font-style: italic;">builder</span>()<br /> .volumeSize(<span style="color: #1750eb;">40</span>)<br /> .deleteOnTermination(<span style="color: #0033b3;">true</span>)<br /> .encrypted(<span style="color: #0033b3;">true</span>)<br /> .build())<br /> .build())<br /> .hibernationOptions(<span style="color: black;">HibernationOptionsRequest</span>.<span style="font-style: italic;">builder</span>().configured(<span style="color: #0033b3;">true</span>).build())<br /> .securityGroups(<span style="color: #067d17;">"devvm-default-sg"</span>)<br /> .build();<br /><br /><span style="color: black;">RunInstancesResponse response </span>= <span style="color: black;">ec2</span>.runInstances(<span style="color: black;">runRequest</span>);<br /><span style="color: black;">String instanceId </span>= <span style="color: black;">response</span>.instances().get(<span style="color: #1750eb;">0</span>).instanceId();<br /><br /><span style="color: black;">software.amazon.awssdk.services.ec2.model.Tag nameTag </span>= <span style="color: black;">software.amazon.awssdk.services.ec2.model.Tag</span>.<span style="font-style: italic;">builder</span>()<br /> .key(<span style="color: #067d17;">"Name"</span>).value(<span style="color: #067d17;">"hibernate example"</span>)<br /> .build();<br /><br /><span style="color: black;">CreateTagsRequest tagRequest </span>= <span style="color: black;">CreateTagsRequest</span>.<span style="font-style: italic;">builder</span>()<br /> .resources(<span style="color: black;">instanceId</span>)<br /> .tags(<span style="color: black;">nameTag</span>)<br /> .build();<br /><br /><span style="color: black;">ec2</span>.createTags(<span style="color: black;">tagRequest</span>);<br /></pre><pre style="background-color: white;"><span style="color: black; font-family: Times; font-size: medium; white-space: normal;">You can find a complete example at </span><span style="font-family: Times;"><span style="white-space: normal;"><a href="https://github.com/cjudd/ec2hibernate">https://github.com/cjudd/ec2hibernate</a>.</span></span></pre><pre style="background-color: white;"><span style="font-family: Times;"><span style="white-space: normal;"><br /></span></span></pre>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-41964121193466493152016-02-10T13:43:00.002-08:002016-02-10T13:43:42.116-08:00The Ultimate Enterprise Java Build Solution RevisitedIn May of 2009, I wrote the blog post <a href="http://juddsolutions.blogspot.com/2009/05/ultimate-enterprise-java-build-system.html">The Ultimate Enterprise Java Build Solution</a>. Over the past 7 years since I wrote the post I have helped half a dozen clients set this system up and had several more tell me they also implemented it after seeing the post or listening to me talk about it at a user group or conference. In the post I talked about using <a href="http://maven.apache.org/">Maven</a> on the developers laptop for local builds, <a href="https://subversion.apache.org/">Subversion</a> to store the code, Hudson to grab the code and run the same Maven build that ultimately pushed artifacts to Nexus and code quality metrics to Sonar. Surprisingly this hasn't changed much over the years. In addition to Maven, today you might use <a href="http://gradle.org/">Gradle</a> for the builds and in addition to Subversion you might use <a href="https://git-scm.com/">Git</a> and/or <a href="http://github.com/">Github</a> for version control. Instead of Hudson you probably would use Jenkins which use to be Hudson and you probably use sonarqube instead of Sonar which is just a name change. You might still use Nexus or one of the other artifact repositories.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Q8k2jjKSLGY/Vrusp1oxwkI/AAAAAAAAAO4/lRjJPBUrcoc/s1600/2016-02-10_16-21-31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="130" src="https://1.bp.blogspot.com/-Q8k2jjKSLGY/Vrusp1oxwkI/AAAAAAAAAO4/lRjJPBUrcoc/s320/2016-02-10_16-21-31.png" width="320" /></a></div>
One of the things that has changed though is how you might deploy the solution. Instead of installing <a href="https://jenkins-ci.org/">Jenkins</a>, <a href="http://www.sonatype.org/nexus/">Nexus</a> and <a href="http://www.sonarqube.org/">sonarqube</a> individually by hand, now you can use <a href="https://www.docker.com/">Docker</a> to get you up and going even faster. I have also created a <a href="https://github.com/cjudd/ultimateenterprisejavabuildsystem/blob/master/docker-compose.yml">docker-compose.xml</a> file so you can get all of them and their dependencies up and running with once simple command of docker-compose up -d.<br />
<br />
I love progress.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com37tag:blogger.com,1999:blog-592769997279604309.post-68449313359469005832011-06-12T12:40:00.000-07:002011-06-12T12:41:32.837-07:00iPad is the perfect conference device<div>As a software developer that relies on heavy duty hardware, I have been reluctant to attend any of the many tech conferences without my full size and capable laptop. This weekend I decided not to break my back caring my 17in MBP. This weekend, I only carried my first gen WIFI iPad to the No Fluff Just Stuff conference. I was pleasantly surprised it was all I needed. I even attended a git hands-on workshop by Matthew McCullough and was able to complete all the labs.</div><div><br /></div><div>There were several things that enabled me to do this. First NFJS provides a great iPad app for the conference. It sets the bar really high for other conferences because it includes the schedules, evals, and presentation slides you can make notes on. I personally choose to get the PDFs and use GoodReader to annotate them so I could use them on my Mac later. Second I kept Textastic in the back ground to make notes that had nothing to do with the presentation or something I wanted to do immediately when I get back to the office. Third I used iSSH to ssh into my server for the git workshop. Finally the hotel offered free Internet and for a tech conference it worked surprisingly well.</div><div><br /></div><div>I am alway surprised at how many people say the iPad is just a consumption device. After this weekend I am convinced the iPad is the perfect conference device. This is probably why NFJS is getting rid of paper next year and will be loaning devices out to all the attendees for the weekend.</div>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1tag:blogger.com,1999:blog-592769997279604309.post-49476171474878963762011-02-26T07:51:00.000-08:002011-02-26T07:57:51.601-08:00Free Mobile Development Lunch and LearnsJudd Solutions is offering free one hour mobile development lunch and learns for companies or groups in the Columbus Ohio area with 5 or more attendees. The three offerings are:<div><ul><li>Beginning iOS development</li><li>Beginning Android development</li><li>Beginning mobile web development</li><li>Developing Android apps with Google App Inventor</li></ul><div>If you are interested in learning more, please contact cjudd at juddsolutions.com.</div></div>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com5tag:blogger.com,1999:blog-592769997279604309.post-91637549727167115462010-06-03T19:01:00.000-07:002010-06-03T19:36:23.251-07:00Your Phone is so much more than a PhoneI have been developing mobile apps since 2002. Ever since I started, I listened to people talk about the potential of cellphones especially in the area of marketing. Ok, even I have talked about the great potential. But the reality is even though I have written some really cool mobile applications I just have not seen these predictions come to reality until now. I think within in the last year we have seen mobile platforms take center stage and become the ultimate personal and convergent device. Most of this is due to rise of the iPhone and Android platforms. Let me show some of my observations.<br /><br />Digital Wallet<br /><ul><li>Payment System (<a href="http://thenextweb.com/apple/2010/05/18/visa-tries-to-take-on-square-with-iphone-payment-system/">Visa</a> & <a href="http://thenextweb.com/apps/2010/05/11/square-peg-that-fits-into-a-round-credit-card-hole/">Square</a>)</li><li>Proof of Insurance Cards (<a href="http://itunes.apple.com/us/app/nationwide-mobile/id311627534?mt=8">Nationwide Insurance</a>)</li><li>Grocery Store Requard Cards (<a href="http://itunes.apple.com/us/app/cardstar/id301460311?mt=8">CardStar</a>)</li><li>Photos of kids</li></ul>Ultimate Communication Device<br /><ul><li>Voice</li><li>SMS</li><li>Email</li><li>Video Conferencing<br /></li><li><a href="http://itunes.apple.com/us/app/facebook/id284882215?mt=8">Facebook</a></li><li><a href="http://itunes.apple.com/us/app/twitter/id333903271?mt=8">Twitter</a></li></ul>Connectivity Device<br /><ul><li>Always connected Internet device</li><li>Portable hotspot (<a href="http://www.engadget.com/2010/03/23/htc-evo-4g-is-sprints-android-powered-knight-in-superphone-armo/">Sprint HTC EVO</a>) for connecting all your devices<br /></li></ul>Entertainment Device<br /><ul><li>Movies</li><li>TV (<a href="http://itunes.apple.com/us/app/abc-player/id364191819?mt=8">ABC</a>)</li><li>Music</li><li>Books<br /></li><li>YouTube</li><li>Games, Games and more Games</li></ul>Location Aware<br /><ul><li>GPS apps</li><li>Compasses</li></ul>Production<br /><ul><li>Camera and photo software</li><li>Video</li></ul>And the list keeps going. Combined with the ease of portablity it is the only thing I always leave home with besides my wallet and hopefully someday I will be able to leave my wallet home too.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-55608291971625090252010-03-25T17:50:00.000-07:002010-03-25T18:14:48.999-07:00How iPad and iPhone/iPod Touch Interactions Could Effect GamingI am very much anticipating April 3rd and the arrival of the iPad. The more I think about it the more I think about the impacts it will have. I have recently been spending a lot of time thinking about the new interaction opportunities we can have by combining the iPad with an iPhone or iPod Touch. I think these interactions become even more interesting in the context of gaming.<br /><br />With the dimentions of the iPad, I can imagine placing it on a table facing up with four people surrounding it like a board game. Each person holding an iPhone or iPod Touch. For simplicity sake, imagine a game like Scrabble. On each person's iPhone or iPod Touch they can view their own tiles. On their turn, they can flick the tiles off their device and they could land on the iPad where the tiles can be moved into place. This type of interaction could work with anything somebody wanted to keep private like cards but then shared at the approriate time on the iPad. This interaction could also be used for photos much like the Microsoft Surface demos.<br /><br />Now imagine turning the iPad up on its side or strapping it to the back of a car seat. Now you have a video game console. An iPhone or iPod Touch could be used as a game controller for a first person shotter , a stearing wheel for a driving or simulator game where tilting it could be the accelorator or finally a Nintendo Wii style remote for games including vibrating feedback and two sounds sources. So, instead of swing your iPhone around to make it sound like a light sabor, you can also make your first person game character wield a light sabor.<br /><br />Now my son is sure to shatter my iPhone.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1tag:blogger.com,1999:blog-592769997279604309.post-38089430410431476432010-02-03T18:11:00.000-08:002010-02-03T18:24:06.859-08:00iPad LongevityLike many people, I was a little disappointed by some of the glaring omissions from the Apple iPad announcement. However, as somebody who develops for the iPhone platform, I do feel I need to at least get a version of the cheapest model for testing purposes. At least that is what I am telling my CFO ;) But as I think about the decision of buying a first generation device now and realizing Apple will probably release the version I really want next year, I started think about the longevity of the iPad especially compared to a netbook or the Kindle. Even if I upgrade a year from now, I think the iPad's form factor and weight make it increadibly useful for the long hall. As iPad's retire, I can definately see them become dedicated reading devices next to the bed or dedicated gaming devices for the kids. But I can also imagine them being mounted on kitchen walls. Maybe even mounted within a frame to hid the black borders. It could be used to display a calendar, digital photos, the current local weather, a clock or all of the above. In addition, it could be a convient means to store or look up recipes. Hmm... Maybe I should create a Kitchen App.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1tag:blogger.com,1999:blog-592769997279604309.post-46643337918585098852010-02-02T17:48:00.000-08:002010-02-03T17:04:31.178-08:00Magic Mouse ExperienceThe last two days I have been working a booth at a conference which included 4 rented 27 inch iMacs and they are just amazing. Each iMac included a Magic Mouse. I have to admit, I was very skeptical of the Magic Mouse and I have heard a fair amount of complaints but I found it enjoyable and it just got out of my way. It struck me when I heard somebody walk by and tell their friend that those are the mice with only one button. I got a chuckle since that is reason I use a Microsoft Mouse attached to my MacBook. I have just been conditioned to use the right mouse click after all my years on Windows. On my MacBook, I have also configured the touch pad so if two fingers are on the pad, it treats the button click as a right click. So, I wanted to see if the two finger gester could be configured to do a right click with the Magic Mouse. When I looked at the preferences, I realized the right click was already configured. That is when I realized I had been using the right click on the Magic Mouse for two days on a device the only has one button and it was just natural and seamless. That is how a consumer device should work.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com2tag:blogger.com,1999:blog-592769997279604309.post-70612578083639851132010-02-01T03:33:00.001-08:002010-02-01T03:44:30.191-08:00Announcing Remarkable Ohio iPhone AppIf you are interested in history, the Ohio Historical Center has erected over 1,300 physical markers around the state representing historical locations. You can learn more about these marker by visiting <a href="http://www.remarkableohio.org">http://www.remarkableohio.org</a> or by using the iPhone app I just developed for the join venture of eTech Ohio and the Ohio Historical Center. This free application identifies on a map where the 600 markers containing geo codes are. It also provides details about each of the markers. So, check out the app, I think you will be surprised how much history actually surrounds you. You can check it out in the Apple App Store at <a href="http://itunes.apple.com/us/app/remarkable-ohio-app/id351524303?mt=8">http://itunes.apple.com/us/app/remarkable-ohio-app/id351524303?mt=8</a>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_5kHMhX_WWU4/S2a9T648OLI/AAAAAAAAADk/MJJTJd2_rNA/s1600-h/Screenshot+2010.01.19+23.03.12.png"><img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_5kHMhX_WWU4/S2a9T648OLI/AAAAAAAAADk/MJJTJd2_rNA/s200/Screenshot+2010.01.19+23.03.12.png" alt="" id="BLOGGER_PHOTO_ID_5433238150392330418" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_5kHMhX_WWU4/S2a9ajnlRAI/AAAAAAAAADs/ljGdRev7LLk/s1600-h/Screenshot+2010.01.19+23.04.04.png"><img style="cursor: pointer; width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_5kHMhX_WWU4/S2a9ajnlRAI/AAAAAAAAADs/ljGdRev7LLk/s200/Screenshot+2010.01.19+23.04.04.png" alt="" id="BLOGGER_PHOTO_ID_5433238264404591618" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5kHMhX_WWU4/S2a9nAUG2KI/AAAAAAAAAD0/hVgDoUKPEJQ/s1600-h/Screenshot+2010.01.19+23.05.21.png"><img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_5kHMhX_WWU4/S2a9nAUG2KI/AAAAAAAAAD0/hVgDoUKPEJQ/s200/Screenshot+2010.01.19+23.05.21.png" alt="" id="BLOGGER_PHOTO_ID_5433238478265964706" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5kHMhX_WWU4/S2a9wp_0n9I/AAAAAAAAAD8/L_nIUF_1u9o/s1600-h/Screenshot+2010.01.19+23.04.56.png"><img style="cursor: pointer; width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_5kHMhX_WWU4/S2a9wp_0n9I/AAAAAAAAAD8/L_nIUF_1u9o/s200/Screenshot+2010.01.19+23.04.56.png" alt="" id="BLOGGER_PHOTO_ID_5433238644073996242" border="0" /></a>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-88859003174071702292009-12-16T17:19:00.000-08:002009-12-16T17:21:58.321-08:00Nationwide's New Cartopia iPhone AppColumbus based Nationwide Insurance just released their second iPhone app to help car buyers with the car buying experiencing by offering free vehicle history summaries, monthly payment calculators and dealer invoice pricing. Check it out at <a href="http://itunes.apple.com/us/app/cartopia/id344956427?mt=8">http://itunes.apple.com/us/app/cartopia/id344956427?mt=8</a>.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-58223868673655953582009-12-09T18:10:00.000-08:002009-12-09T18:22:57.597-08:00More Great Columbus iPhone AppsRecently more great iPhone apps have come out of Columbus. They include the following:<br /><br />Games:<br /><ul><li><a href="http://itunes.apple.com/us/app/springshot/id339343272?mt=8">Springshot from FourthFrame Technologies</a> - Fun and reminds me of a combination of shuffle board and put put golf.<br /></li><li><a href="http://itunes.apple.com/us/app/jiggle-balls-spikes/id337551567?mt=8">Jiggle Balls: Spikes from Funky Visions</a> - Surprisingly addictive.<br /></li><li><a href="http://itunes.apple.com/us/app/air-hockey-face-off/id329336004?mt=8">Air Hockey: Face Off from Sad Robot Software</a> - Have not played it yet since it requires two devices but it looks awesome.<br /></li></ul>Photo:<br /><ul><li><a href="http://itunes.apple.com/us/app/geophoto-albums/id337462572?mt=8">GeoPhoto from C.Y.borg's Neural Net</a> - Great way to Geo Tag your photos taken with your iPhone.</li></ul>Keep up the great work Columbus iPhone developers.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-84767671159288027352009-08-16T17:51:00.000-07:002009-08-16T18:02:29.024-07:00Cloud Application Achitectures Book ReviewI just finished reading <a href="http://www.amazon.com/Cloud-Application-Architectures-Applications-Infrastructure/dp/0596156367/?tag=wwwjuddsoluti-20">Cloud Application Architectures: Building Applications and Infrastructure</a> in the Cloud by George Reese and published by O'Reilly. I enjoyed the book but think it should have been named "Amazon Cloud Computing for Managers".<br /><br />I thought it did a great job of<br /><br /><ul><li>giving an S3 and EC2 tutorial<br /></li><li>explaining the different persistence options in Amazon Web Service (AWS) offerings </li><li>identifying things to think about in regards to security in the cloud<br /></li><li>providing thoughts on disaster recovery in the cloud</li><li>making a business case for the cloud<br /></li></ul>If you are new to the Amazon Cloud this is the book for you. If you are experienced in the cloud or an experienced application or infrastructure architect the book might be a little lite for you.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-85975449105260372332009-08-06T17:52:00.000-07:002009-08-06T18:12:25.056-07:00Columbus taking over the iPhone game marketOver the past year, I have been reading articles about how Columbus is becoming a hot bed for game and 3D movie development. This week was an especially exciting for Columbus since two Columbus based game companies release iPhone games. <a href="http://www.jufti.com/">JUFTI</a> released their <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=320784523&mt=8">Cornhole All*Star</a> game. The first and only true 3D cornhole game. The second is <a href="http://www.freshgames.com/">Fresh Games</a> with their release of <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321158715&mt=8">Ranch Rush</a>. A really fun farming game. They both have awesome graphics and great game play.<br /><br />Another fun game produced here in Columbus a little while ago is <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=305920596&mt=8">Jiggle Balls</a> from <a href="http://www.funkyvisions.com/">Funky Visions</a>.<br /><br />I own all three and they are a lot of fun.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1tag:blogger.com,1999:blog-592769997279604309.post-89081731082870784392009-07-08T19:52:00.000-07:002009-07-08T20:15:37.322-07:00Grails Read-Only Plugin RepositoryOne of my favorite enhancements to Grails 1.1 is the automatic transitive plugin resolution. This feature is great for team development. When a new plug-in is introduced to a project only one developer needs to install it. When they do, the application.properties is updated with the plugin name and version numbers like Listing 1 which shows an application.properties containing the hibernate, image-tools and jsecurity plugins.<br /><br />Listing 1 - application.properties file with plugin references.<br /><br /><span style="font-family:courier new;">app.version=0.1</span><br /><span style="font-family:courier new;">app.servlet.version=2.4</span><br /><span style="font-family:courier new;">app.grails.version=1.1</span><br /><span style="font-family:courier new;">plugins.hibernate=1.1.1</span><br /><span style="font-family:courier new;">plugins.image-tools=1.0.4</span><br /><span style="font-family:courier new;">app.name=pfj</span><br /><span style="font-family:courier new;">plugins.jsecurity=0.3</span><br /><br />When other members of the team get the updated application.properties file they just run <span style="font-family:courier new;">grails run-app</span> and the plugins will automatically be downloaded and installed on their machine. Life couldn’t be easier. Well, maybe it could be. See for this to work, the plugin must be installed in the central grails plugin repository found at http://plugins.grails.org/ or you can use another one of my favorite new features of Grails 1.1, multiple repositories. To configure multiple repositories just create a <span style="font-family:courier new;">BuildConfig.groovy</span> in your application’s <span style="font-family:courier new;">grails-app/conf</span> directory and add a new entry for your additional repository like Listing 2.<br /><br />Listing 2 - Additional plugin repository entry in BuildConfig.groovy.<br /><br /><span style="font-family:courier new;">grails.plugin.repos.discovery.myRepository="http://company.com/grails"</span><br /><br />The only problem with this is it assumes the repository is hosted in Subversion (SVN). This is not always the case. With the popularity of git many of the plug-in developers have gone to using github for hosting their plugins. One example is the popular <a href="http://www.grails.org/ImageTools+plugin">image-tools plugin</a>.<br /><br />Another important use case takes advantage of my second favorite feature of Grails 1.1, the Apache Ant and Apache Ivy integration which enables you to do a continuous integration builds in something like Hudson by executing the Ant <span style="font-family:courier new;">build.xml</span> without even having to have Grails installed on the build machine. Everything required is installed as a bootstrap. Now that is awesome. Of course this assumes the plugins are in a configured repository that is backed by SVN.<br /><br />To simplify developer setup and continuous integration, I looked for documentation to setup a custom Grails plugin repository for plugins I did not maintain but I still want to access using the new Grails 1.1 features. All I found were instructions on how to do it if you are the plugin provider or using the Grails central repository. If that is your goal it can not be easier. For deploying to the central repository you first need to request permission to the Grails plugin SVN repository. Then to deploy the plugin just type <span style="font-family:courier new;">grails release-plugin</span>. For a custom plugin repository, you will need an additional configuration in your <span style="font-family:courier new;">BuildConfig.groovy</span> file to point to your SVN repository like the one found in Listing 3 and type <span style="font-family:courier new;">grails release-plugin -repository=myRepository</span> where the repository parameter is the last part of the property name. That’s it.<br /><br />Listing 3 - BuildConfig.groovy with an entry to a repository for distribution.<br /><br /><span style="font-family:courier new;">grails.plugin.repos.distribution.myRepository="https://company.com/grails/"</span><br /><br />I could not find any documentation about creating a custom read-only repository for third party plugins you don’t want to maintain or if you just don’t want to have to maintain a SVN repository just for those third-party plugins. So after a little bit of exploring the central repository and some trial and error, this is how I created my own read-only repository saving time and simplifying my team setup.<br /><br /><span style="font-weight: bold;">Note:</span> for a read-only repository you don’t need SVN all you need is an HTTP based server that can serve files.<br /><br />1. Create a <span style="font-family:courier new;">BuildConfig.groovy</span> file in your application’s <span style="font-family:courier new;">grails-app/config</span> directory containing <span style="font-family:courier new;">grails.plugin.repos.discovery.myRepository="http://company.com/grails/"</span> entry where the URL is addressable via HTTP and is the root of the plugin repository.<br /><br />2. Create a <span style="font-family:courier new;">plugins-list.xml</span> file in a <span style="font-family:courier new;">.plugin-meta</span> data directory under the repository root. This file needs to contain your plugin(s) meta data like the following for image-tools: <br /><br /><pre><br /><plugins revision="2"><br /> <plugin release="1.0.4" name="image-tools"><br /> <release tag="RELEASE_1_0_4" type="svn" version="1.0.4"> <br /> <title>Image Tools</title><br /> <author>Arquetipos Software</author> <br /> <authoremail>projects@arquetipos.co.cr</authoremail> <br /> <description>Images Tools</description><br /> <documentation>http://www.grails.org/ImageTools+plugin</documentation> <br /> <file>http://www.arquetipos.co.cr/blog/files/grails-image-tools-1.0.4.zip</file><br /> </release><br /> </plugin><br /> </plugins><br /></pre><br /><br />3. Create a <span style="font-family:courier new;">grails-<plugin>/trunk</plugin></span> directory under the repository root and copy the zipped plugin package there with the name <span style="font-family:courier new;">grails-<plugin>-<version>.zip</version></plugin></span>.<br /><br />Implementing these 3 steps made my third-party plugins available to the list-plugin and install-plugin commands but more importantly to the automatic transitive plugin resolutions for developer and continuous integration servers.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com10tag:blogger.com,1999:blog-592769997279604309.post-21008303335142950682009-05-08T18:10:00.000-07:002009-05-08T18:30:00.935-07:00Continuous Integration Lessons LearnedI got a lot of interested from my most recent post about <a href="http://juddsolutions.blogspot.com/2009/05/ultimate-enterprise-java-build-system.html">The Ultimate Enterprise Java Build Solutions</a> and it motivated me to find one of my favorite blog posts I posted somewhere else originally back in December 2004. I found some of my lessons still relevant so since I could only find it on the wayback at <a href="http://web.archive.org/web/20050528062417/blogs.apress.com/authors.php?author=Christopher+Judd">http://web.archive.org/web/20050528062417/blogs.apress.com/authors.php?author=Christopher+Judd</a>. So, I thought I would repost portions of it.<br /><p>During the process of using CC, I learned the following valuable lessons I wanted to share. </p><p> <b>First, once every 24 hours is not frequent enough for continuous integration.</b> As mentioned above, I use to set up CI environments to build once every 24 hours. When I initially set up CI, I was asked to set the builds to run every 4 to 6 hours. There were skeptics who believed any more frequent builds triggered by repository activity would interfere with a team so new to CI and cause unnecessary anxiety. However, every 4 to 6 hours was a problem when trying to set up and configure CI initially so I set the CI to check the repository every minute and if something changed to wait for 5 minutes of inactivity before starting the build. Fortunately, I forgot to change it to a less frequent iteration and the minute check made into the final configuration. We discovered that the short frequencies actually provided the best results by giving everybody comfort since they got immediate feedback. Plus without a frequent build, one bad build could cause the red lava lamp to be lit all day. </p><p><b>Second, there are multiple audiences for the builds so there is a need for a continuous integration build and a nightly build.</b> The audience of a continuous build should be the developers themselves. Developers need quick feedback to provide confidence. They need to know what they checked in to the repository works outside their development environment and what they check out of the repository works. So, this build should focus on code compiling, passing the unit tests and being able to be packages and possibly deployed. The second audience is management and architects. Managers are often trying to collect metrics from frameworks like NCSS and JUnit (number of unit tests). Architects are often interested in code quality reports such as PMD and unit test code coverage. These types of reports take longer to produce and don’t need to run continuously. A separate build that runs at midnight is perfect for executing metric and code quality reports. Of course developers should be able to run these reports at any point in time in their development environments since the same build scripts should be used by both the developers and CI environment. </p><p> <span style="font-weight: bold;">Third</span><b>, a CI web site like the one already in Hudson and provided by Sonar is a very valuable communication tool.</b> While developers need to be notified immediately of build problems via email, IM or lava lamps, other such as managers do not. A website can provide the information they need at their convenience. </p><p> <span style="font-weight: bold;">Forth</span><b>, lava lamps are a fun way to provide a visual indicator of the build.</b> I initially thought the idea was rather hokey but I was wrong. If you want to learn how to integrate lava lamps with CruiseControl check out Mike Clark's Pragmatic Automation web site (<a href="http://web.archive.org/web/20050528062417/http://www.pragmaticautomation.com/cgi-bin/pragauto.cgi/Monitor/Devices/BubbleBubbleBuildsInTrouble.rdoc">http://www.pragmaticautomation.com/cgi-bin/pragauto.cgi/Monitor/Devices/BubbleBubbleBuildsInTrouble.rdoc</a>). </p>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1tag:blogger.com,1999:blog-592769997279604309.post-41277648355779985742009-05-05T18:18:00.000-07:002009-05-13T03:59:42.426-07:00The Ultimate Enterprise Java Build SolutionEarly in my career I took on the role of setting up and operating the build infrastructure of many of the projects I have consulted on. I started in this role before Apache Ant released its 1.0 version. I have struggled with using Cruise Control as my continuous integration server including lava lamps for broken builds. Finally, I have also used and configured just about every code quality tool for Java and built a dashboard to try to combind all the results.<br /><br />Now after all these years, I think I found the right solutions for Enterprise Java Builds. The solution involves 5 open source projects: <a href="http://maven.apache.org/">Maven</a>, <a href="http://subversion.tigris.org/">Subversion</a>, <a href="https://hudson.dev.java.net/">Hudson</a>, <a href="http://nexus.sonatype.org/">Nexus</a>, <a href="http://sonar.codehaus.org/">Sonar</a>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5kHMhX_WWU4/SgDxDJdfNfI/AAAAAAAAAC8/khKV0oLOfnk/s1600-h/Enterprise+Java+Builds.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 415px; height: 171px;" src="http://2.bp.blogspot.com/_5kHMhX_WWU4/SgDxDJdfNfI/AAAAAAAAAC8/khKV0oLOfnk/s320/Enterprise+Java+Builds.png" alt="" id="BLOGGER_PHOTO_ID_5332526995188168178" border="0" /></a>At the core of the solutions is Apache Maven, a build, project, dependency management framework. Maven makes it easy to declaratively describe a project or collection of projects that generate artifacts like binary jars, source jars, doc jars, dependency lists and other artifacts. All these artifacts can be versioned to ensure all developers are using the right artifacts. These artifacts can also be published to a Maven repository making distribution of the artifacts seamless.<br /><br />In order for developers to collectively own code and integrate often, a source code repository is necessary. Subversion has been a proven enterprise scale repository which integrates well with may tools like Eclipse, Hudson and Maven. But there are many other quality source code repositories that could fit in Subversion's place such as Git. The exact source code repository for this solutions is not as important as having one and having one that integrates well with the choosen tools.<br /><br />One of the biggest challenges in developing software with a team of people is integrating the software so the practice of continiously integrating has become a staple in many enterprises. After every developer check-in, a continious integration server will check the code out, compile and run all the unit tests. Hudson is possibly the easiest and most powerful continious integration server available for Java. It has a very simple web console that makes creating and configuring build jobs a cinch especially Maven jobs. Just incase that is not enough, it has a very nice plug-in system and community making it very flexible and robust.<br /><br />After Hudson builds artifacts (jars) that developers need it must publish them to a Maven repository hosted within the enterprise. Nexus is that Maven repository. It enables you to publish both release and snapshot artifacts, provides different views into the respository and includes searching for artifacts even their contents. In addition, it can act as a proxy to external public Maven repository providing traceablity into where artifacts came from as well as improve download performance. Both developers and Hudson can use Nexus to keep their local artifacts up to date providing continious integration for everybody all the time.<br /><br />Finally, it is valuable to keep metrics about code quality. This can help show if code is improving or declining. This can help easily identify problems, risky areas and bad pratices. Sonar is a server that provides a dashboard into your code quality. It integrates with many common code quality tools like PMD, Checkstyle and FindBugs. It include metrics for code coverage, unit testing and lines of code. The trending capabilities make it easy to identify patterns.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com15tag:blogger.com,1999:blog-592769997279604309.post-27279537186689290352009-04-08T18:58:00.000-07:002009-04-08T19:31:52.571-07:00Startup Weekend Columbus 2 (SWCII) ExperienceI can’t believe it is the Wednesday night after <a href="http://www.swcolumbus.eventbrite.com/">SWCII</a> already. I am still riding on the high of the weekend. Not only did I get to start a new company this and meet some new friends I also got to geek out too by writing an iPhone application.<br /><br />Ok, let me start back at the beginning. Friday, April 3, 2009 about 130-140 people meet at <a href="http://www.techcolumbus.org/">TechColumbus</a> to pitch ideas for companies and products. There were 73 or so pitches. They ranged from the absurd to the brilliant. Then we voted on which ideas we liked the most. After the cream of ideas rose to the top we formed groups around our favorite ideas.<br /><br />I feel blessed that at the end of the evening I had a great team of six very talented developers and business men excited about implementing one of my two pitches. I have been thinking about this idea for over two years and this weekend gave me the kick in the pants and the team I need to make it real.<br /><br />The team itself is very tech heavy and age light. The three senior members of the team were:<br /><br /><a href="http://www.linkedin.com/in/ddlucas">Dave Lucas</a> - President/Consultant at <a href="http://www.lse.com/">Lucas Software Engineering</a><br /><a href="http://joshuatbrown.blogspot.com/">Josh Brown</a> - Senior Consultant at <a href="http://us.sogeti.com/">Sogeti</a><br /><a href="http://www.linkedin.com/in/hraju">Harish Raju</a> - Software Development Manager at <a href="http://www.hp.com/">HP</a><br /><br />The team also included three very multi talented and tireless college students that provided major contributions. All three of them would make great interns or employees so if you are looking for some check them out. I want to see this type of talent stay in the Central Ohio market.<br /><br /><a href="http://www.trebligstudios.com/">Ben Gilbert</a> - Computer Science and Engineering/Entrepreneurship student at OSU<br /><a href="http://www.linkedin.com/in/ankane">Andrew Kane</a> - Computer Science and Engineering Student at OSU<br /><a href="http://www.linkedin.com/in/mhill426">Matt Hill</a> - Economics at OSU<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_5kHMhX_WWU4/Sd1d8OlwRQI/AAAAAAAAAC0/9eEZe_EzUIA/s1600-h/PFJ_200904.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_5kHMhX_WWU4/Sd1d8OlwRQI/AAAAAAAAAC0/9eEZe_EzUIA/s320/PFJ_200904.JPG" alt="" id="BLOGGER_PHOTO_ID_5322513623911777538" border="0" /></a><br />I did not get any sleep on Friday night because I had so many ideas racing through my mind and I was so excited to get started.<br /><br />Saturday and half of Sunday, we spent building a functional prototype which included an iPhone application and website. We also spent time putting together a business plan and presentation for the final program. During our software and business development efforts we used an agile process called Scrum. We conducted 2 hour iterations and performed a stand up (meeting where you literally stand up to encourage a short meeting in which you answer the three questions of what have you done since the last meeting, what do you plan to accomplish before the next meeting and do you have any road blocks) after each one. We all felt this made us feel extremely productive and increase our communications. It also encouraged accountability and helped us to tack concerns very early before they become problems. We also found Google docs and Google Groups very helpful. With such short timelines, Google docs gave a way of sharing and even simultaneously make changes to spreadsheet, word processing and presentation documents. Google Groups enabled to send communications out to the whole group at one time making sharing information quick and easy.<br /><br />We were also glad we set up subversion repository before we started doing any development. This gave us a convenient way of sharing code and managing the rapid development.<br /><br />I also got to evangelize and make some converts to some of my favorite technologies, Groovy and Grails. While most of the team had not had the opportunity to work with these technologies before, they picked it up extremely quickly which was great since I was pretty much heads down in iPhone development. I think that is a huge testament to Groovy and Grails. I really don’t think we could have put something together in a weekend using standard Java technologies since just downloading all the projects and getting them configured would have taken an immense amount of the valuable time we had.<br /><br />Finally, we found the book <a href="http://www.amazon.com/Presentation-Zen-Simple-Design-Delivery/?tag=wwwjuddsoluti-20">Presentationzen</a> Book an invaluable tool for putting together a compelling presentation.<br /><br />The whole weekend TechColumbus and the sponsors provided a great facility and kept us well fed (when we actually tore ourselves a way from our work to eat) and caffeined which helped provide the perfect condition for productivity.<br /><br />You maybe wondering by now what our company is. Well, I am going to keep you in suspense a little longer. We are hoping to have a beta start within two months. I will post more when that happens.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1tag:blogger.com,1999:blog-592769997279604309.post-52579299347356465282009-03-19T19:04:00.000-07:002009-03-19T19:17:02.526-07:003D Modeling ClassI love learning new things and 3D animations. So, I combined these passions this winter by taking a 3D modeling class at Columbus State. It was very different than what I do on a daily bases with computers and quite a challenge. I had tried learning 3D modeling on my own with the open source Blender tool but never got the hang of it. So I thought I would see if a structured class would provide be a better learning environment for me and I think it did. I have come a long way in a short period of time. I think I understand the concepts and terms now and I can create a pretty convincing model. However, there is still much more to learn. I hope to continue 3D modeling as a hobby and I hope I have time to take the advanced modeling and the animation classes next winter.<br /><br />Our project was to model, texture and light a room and render 4 still images of it, 2 up close and 2 from a distance. I chose my son's room so I could make 3D toys. I also add a little bit of a Star Wars theme which he loved. Below is my final project.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5kHMhX_WWU4/ScL6KP4VuyI/AAAAAAAAACs/awZH8W8qRA0/s1600-h/IMMT236+Project+3+Christopher+Judd.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 234px;" src="http://2.bp.blogspot.com/_5kHMhX_WWU4/ScL6KP4VuyI/AAAAAAAAACs/awZH8W8qRA0/s320/IMMT236+Project+3+Christopher+Judd.jpg" alt="" id="BLOGGER_PHOTO_ID_5315085564219079458" border="0" /></a>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-21961254149085141392009-03-10T20:29:00.000-07:002009-03-10T20:39:27.869-07:00Groovy and Grails Overview Slides updatedOver the past year, I have been presenting a free 1 1/2 hour Groovy and Grails Overviews to any group or company who will listen. Each presentation includes a copy of my book <a href="http://www.amazon.com/gp/product/1430210451?tag=wwwjuddsoluti-20">Beginning Groovy and Grails</a> for the organizer. This presentation has been so popular, I have forgotten how many times I have presented it.<br /><br />In preparation for presenting it two more times this week, I updated my slides to reflect the new releases of Groovy 1.6 and Grails 1.1. I also had to update the resources since so many great new books are also available. You can find copies of the slides <a href="http://www.juddsolutions.com/downloads/Agile%20Development%20with%20Groovy%20and%20Grailsx.pdf">here</a>.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com2tag:blogger.com,1999:blog-592769997279604309.post-7233847418527257132009-03-10T20:27:00.000-07:002009-03-10T20:29:02.916-07:00Groovy and Grails at Cleveland User GroupI will be speaking about Groovy and Grails at tomorrow night's Cleveland Ohio Java Users Group. If you are in the area please come on out.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1tag:blogger.com,1999:blog-592769997279604309.post-64689015480066142412009-02-26T19:06:00.000-08:002009-02-26T19:08:36.193-08:00Chmod iPhone ApplicationI am excited to announce my first iPhone app is now available in the Apple App Store. The apps name is Chmod and it can be used to help determine the appropriate Mac OS X, Linux and Unix file and directory permissions. Check it out, it's free.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5kHMhX_WWU4/SadZGD5XxlI/AAAAAAAAACc/gokqoOazXJo/s1600-h/screen+shot.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 222px; height: 320px;" src="http://1.bp.blogspot.com/_5kHMhX_WWU4/SadZGD5XxlI/AAAAAAAAACc/gokqoOazXJo/s320/screen+shot.jpg" alt="" id="BLOGGER_PHOTO_ID_5307308646539445842" border="0" /></a>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com2tag:blogger.com,1999:blog-592769997279604309.post-29494212463668999022009-02-25T03:30:00.000-08:002009-02-25T03:38:13.395-08:00First CIDUG (Columbus iPhone Developer User Group) MeetingThe first CIDUG (Columbus iPhone Developer User Group) meeting was a huge success. We had 50 people in attendance. In addition to a presentation on how to get started in iPhone development we also talked about the future of the group and what we want to do from a meeting and website perspective. There is a strong desire to meet frequently even monthly and some of those meetings to just be coding events where we can help each other.<br /><br />Most importantly, we officially desided CIDUG is pronounced sigh-dug.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5kHMhX_WWU4/SaUteMB7ySI/AAAAAAAAACU/247fVRkL2dw/s1600-h/cidug_small.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 434px; height: 166px;" src="http://3.bp.blogspot.com/_5kHMhX_WWU4/SaUteMB7ySI/AAAAAAAAACU/247fVRkL2dw/s320/cidug_small.jpg" alt="" id="BLOGGER_PHOTO_ID_5306697732574660898" border="0" /></a>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-14609534369292034742009-02-02T19:30:00.000-08:002009-02-02T19:51:01.511-08:00Creating a simple iPhone checkboxI was disappointed to discover the iPhone SDK did not include a Checkbox component. Yes, I know there is the UISwitch component. But sometimes that is just to big and does not look right for your design.<br /><br />After googling, I could not find a checkbox component that somebody else had made or a good tutorial. So below are the steps I did to create a simple checkbox.<br /><br />I began by adding a UIButton to my view and setting its Type to custom and its background to my unchecked png image with transparent background. Then I implemented the auto generated viewDidLoad method to set my background image if the button state was selected to the checked png image.<br /><br />- (void)viewDidLoad {<br /> [super viewDidLoad];<br /> [checkButton setBackgroundImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];<br />}<br /><br />Finally, I attached a changeSeletected method to the button's Touch Up Inside event that changed the selected state of my button.<br /><br />- (IBAction) changeSelected: (id) sender {<br /> UIButton *button = (UIButton *) sender;<br /> button.selected = !button.selected;<br />}<br /><br />I think the final outcome turned out pretty nice.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_5kHMhX_WWU4/SYe9xDV2DgI/AAAAAAAAACA/fWHGaduW2Rg/s1600-h/iphone+checkbox.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 166px; height: 320px;" src="http://4.bp.blogspot.com/_5kHMhX_WWU4/SYe9xDV2DgI/AAAAAAAAACA/fWHGaduW2Rg/s320/iphone+checkbox.png" alt="" id="BLOGGER_PHOTO_ID_5298412137032846850" border="0" /></a>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com5tag:blogger.com,1999:blog-592769997279604309.post-41578178697273493222009-01-11T18:22:00.000-08:002009-01-11T18:36:54.258-08:003D InternetI am taking a 3D Modeling course at Columbus State starting this week. Several people have asked me why I am taking such a course. The simple answer is I find 3D fascinating. The long answer is I think 3D is the future. 3D is currently playing an important role in movies, games and even mobile applications like those found on the iPhone. But I also think 3D will be the future of the Internet. I think our children will look back at today's two dimensional Internet like I look back on black and white TV. Every time I see a B&W movie or TV program, I ask how could they watch this when they live in a colored world. I think our children will ask how could you live with a 2D Internet when you live in a 3D world. I think <a href="http://secondlife.com/">Second Life</a> is a glimpse into this future. So I think at some point 3D skills will be an important skill to have if not a required one.Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com0tag:blogger.com,1999:blog-592769997279604309.post-63614179040447077772009-01-10T06:49:00.001-08:002009-01-11T18:22:04.785-08:00CodeMash 2009 Presentations - Groovy and Grails Precompile and iPhone Web Development with Grails and iUII thoroughly enjoyed attending and presenting at CodeMash 2009. My co-author of <a href="http://www.amazon.com/gp/product/1430210451?tag=wwwjuddsoluti-20">Beginning Groovy and Grails</a>, Jim Shingler and I presented a Groovy and Grails Precompile which is CodeMash speak for preconference tutorial. The presentation went well and we had 27 people in attendance. If you are interested, you can view the slides at <a href="http://www.slideshare.net/jshingler/gg-code-mash2009-20090106-presentation/">http://www.slideshare.net/jshingler/gg-code-mash2009-20090106-presentation/</a>.<br /><br />I also presented a regular session on iPhone Web Development with Grails and iUI. Most of the presentation is about iPhone Web Development but there are several Grails introductory slides and several more on integrating iUI with Grails. I am glad I included the Grails introductory material since this was the first exposure to Grails for most of the developers attending my session. If you are interested, you can view the slides at <a href="http://www.slideshare.net/cjudd/iphone-web-development-with-grails-from-codemash-2009-presentation/">http://www.slideshare.net/cjudd/iphone-web-development-with-grails-from-codemash-2009-presentation/</a>Christopher M Juddhttp://www.blogger.com/profile/01944788969587609655noreply@blogger.com1