<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Craig Gjerdingen</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/" />
    <link rel="self" type="application/atom+xml" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/atom.xml" />
   <id>tag:blog.lib.umn.edu,2009:/gjer0005/craiggjerdingen//5485</id>
    <link rel="service.post" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485" title="Craig Gjerdingen" />
    <updated>2009-03-23T17:41:05Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.25</generator>
 

<entry>
    <title>Role of the &quot;Proxy Customer&quot; (Agile for: Business Analyst)</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2009/03/role_of_the_proxy_customer_agi.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=171909" title="Role of the &quot;Proxy Customer&quot; (Agile for: Business Analyst)" />
    <id>tag:blog.lib.umn.edu,2009:/gjer0005/craiggjerdingen//5485.171909</id>
    
    <published>2009-03-23T17:31:22Z</published>
    <updated>2009-03-23T17:41:05Z</updated>
    
    <summary>We all know that ideally you want a customer present at all times and involved in the project. That this yields the best results in the shortest time on any given project. But that there are times when the customer...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Agile" />
    
        <category term="Project Management" />
    
        <category term="Scrum" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>We all know that ideally you want a customer present at all times and  involved in the project. That this yields the best results in the  shortest time on any given project. But that there are times when the  customer is unwilling or unable to be available.<br /><br />
<strong>Reason for a Proxy Customer:</strong><br /><br />
The Proxy Customer can help fill a gap in projects where the Customer  is not always available when stories are being done in an iteration.  Then the Customers are happy to meet weekly or bi-weekly, but aren't  willing or able to be available through out the work day as new stories  arise; Or when the customers wants to be able to just send in terse  info and have it dealt with without learning any new tools are  processes. In a way you can look at the Proxy Customer and being a way  of scaling out the Product Owner role.<br /></p>]]>
        <![CDATA[<p><strong>How the Proxy Customer works with the Team</strong><br /></p>

<p><br />
<strong>Help in the creation of User Stories:</strong><br /><br />
  User stories serve the same purpose as use cases but are not the same. They are   used to create time estimates for the release   planning meeting. They are also used instead of a large requirements   document. User Stories are written by the customers as things that the system needs to do for them. They are in the format of about three sentences of text written by the customer   in the customers terminology. User stories should <strong>only </strong>provide enough detail to make a reasonably low risk   estimate of how long the story will take to implement.<br /><br />
  <br /><br />
  User Stories, and use scenarios can often easily be turned into  meaningful documentaiton. The Proxy Customer can aid in the tasks of  create this system documentition.<br /><br />
  <br /><br />
  One thing the Proxy Customer <strong>does not get to do</strong> is prescribe the  technology approach or weight in on, the order of magnitude of a story  size or how long a tasks will take.<br /><br />
  <br /><br />
  <strong>Help in the creation of Acceptance Tests:</strong><br /><br />
  User stories also drive the creation of the acceptance tests. One or more automated   acceptance tests must be created to verify the user story has been correctly   implemented. The Customer specifies scenarios to test when a user   story has been correctly implemented. A story can have one or many acceptance   tests, what ever it takes to ensure the functionality works.<br /><br />
  <br /><br />
  <strong>Release Planning:</strong><br /><br />
  A release planning meeting is used to create a release   plan, which lays out the overall project. The release plan is then used to   create iteration plans for each individual iteration. Release planning should be made a visible of a processes as possible.<br /><br />
  You may plan by time or by scope. The project   velocity is used to determine either how many stories can be implemented   before a given date (time) or how long a set of stories will take to finish   (scope). When planning by time multiply the number of iterations by the project   velocity to determine how many user stories can be completed.<br /><br />
  The Proxy Customer can also aid the Customer understanding the set of  features and bug fixes that make it into a given releases after they  move from dev to test or to production.<br /><br />
  <br /><br />
  One collaboration anti-pattern that will be <strong>very important to avoid</strong> is becoming a barrier between development and the Customer, so that the Customer doesn't   directly drive the functionality developed. <br /><br />
  <br /><br />
  <strong>Customer Meetings around User Stories:</strong><br /><br />
  As often as possible, when the Proxy Customer and the Customer meet.  They should do it in the vacinity of the Developers. That way, the  vicarious awareness of converations can take place and Developers can  easily be directly involved in converstaion where their experience and  clarity can help.<br /><br />
  <br /><br />
  <strong>Triaging Bugs and the Bug Lifecycle:</strong><br /><br />
  One of the most common areas of value the Proxy Customer can play is in  the area of traiging bugs on the way in (and completing incomplete work  item documentaiton) and testing the resolution of the resolved work  items.<br /><br />
  Often the Customers feel they have done enough to make you aware of the  defect and the adiquite testing of the resolution can go unchecked. The  Proxy Customer can take the place of the Customer, by running through  the scenarios that cause the bug and then review the results with the  Customer for sign-off on completion <br /></p>

<p></p>

<p><br /><br />
<strong>Warning Signs that a Proxy Customer role isn't working would be:<br /><br />
</strong>Rework of any Stories. We all learn and adjust to the learning as  we go with projects, but an increase in work that is being re-done is a  sure smell of the Proxy Customer role not working.<br /><br />
Developers rely on the Proxy Customer as their sole and single point of  contact and stop communicating directly with the Customers.<br /><br />
Developers feel like they aren't hearing from the customer. Even if it  feels more efficient to just leave the Developers out of meetings and  such it is a point of communication breakdown and should be avoided.<br /><br />
<br /><br />
After writing my take on this I found:&nbsp; http://www.agilemodeling.com/essays/businessAnalysts.htm<br /><br />
<br /><br />
Most of this looks like it jives with what I wrote.<br /><br />
<br /><br />
<br />Thank you,<br /><br />Craig Gjerdingen<br />Applications Development Manager<br />Office of Information Technology<br />Carlson School of Management<br />c. 612-242-8384<br />o. 612-625-6657</p>]]>
    </content>
</entry>

<entry>
    <title>A 15 minute primer on ASP.Net AJAX</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2008/10/a_15_minute_primer_on_aspnet_a.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=150048" title="A 15 minute primer on ASP.Net AJAX" />
    <id>tag:blog.lib.umn.edu,2008:/gjer0005/craiggjerdingen//5485.150048</id>
    
    <published>2008-10-21T19:20:00Z</published>
    <updated>2008-10-21T19:27:15Z</updated>
    
    <summary>I think I did this in the spring of 2007, the audio quality is very poor (sorry). Please enjoy one of the following formats: avi aspnetajax.avi - (@ 50 MB) flash aspnetajax-flash.swf - (@ 22 MB) wmv aspnetajax-high.wmv - (@...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="AJAX" />
    
        <category term="ASP.Net" />
    
        <category term="Microsoft" />
    
        <category term="Web 2.0" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>I think I did this in the spring of 2007, the audio quality is very poor  (sorry).</p>

<p>Please enjoy one of the following formats: <ul><br />
<li> avi <a href="https://wiki.umn.edu/pub/CraigGjerdingen/15MinutePresentationOnASPNetAJAX/aspnetajax.avi" target="_top">aspnetajax.avi</a> - (@ 50 MB) <br />
</li> <li> flash <a href="https://wiki.umn.edu/pub/CraigGjerdingen/15MinutePresentationOnASPNetAJAX/aspnetajax-flash.swf" target="_top">aspnetajax-flash.swf</a> - (@ 22 MB) <br />
</li> <li> wmv <a href="https://wiki.umn.edu/pub/CraigGjerdingen/15MinutePresentationOnASPNetAJAX/aspnetajax-high.wmv" target="_top">aspnetajax-high.wmv</a>  - (@ 14 MB) <br />
</li></ul> <br />
<p /><br />
<p /><br />
<h3><a name="Basic_Script_I_Followed"></a> Basic Squence I Followed</h3><br />
<p /><br />
This is the script I created to keep me moving for this video capture demo.<br />
<p /><br />
<strong><em>Create Default Web Page</em></strong><br />
<p /> <ul><br />
<li> Status : Dropdownlist <ul><br />
<li> Active : false : (default) <ul><br />
<li> Complete : true<br />
</li> <li> AutoPostBack<br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
<p /> <ul><br />
 <li><br />
 <ul><br />
<li> div : todoheader : "To-do List Items"<br />
</li></ul> <br />
</li></ul> <br />
<p /> <ul><br />
 <li><br />
 <ul><br />
<li> GridView <ul><br />
<li> ObjectDataSource<br />
</li> <li> Format GridView (or CssClass = gridview AltRow Style = even GridLines = None)<br />
</li> <li> Page, Sort, Edit<br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
<p /> <ul><br />
 <li><br />
 <ul><br />
<li> div : insertheader : "New To-do Item"<br />
</li></ul> <br />
</li></ul> <br />
<p /> <ul><br />
 <li><br />
 <ul><br />
 <li><br />
 <ul><br />
<li> DetailsView <ul><br />
<li> DataSource : ObjectDataSource1<br />
</li> <li> Enable Insert<br />
</li> <li> Properties : DefaultMode : insert<br />
</li> <li> Format DetailsView (or CssClass = detailsview Gridlines = None)<br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
<p /><br />
<p /><br />
<strong><em>Show the app</em></strong> <ul><br />
<li> Note full page refreshes (What we will fix)<br />
</li> <li> Add a new item or two<br />
</li></ul> <br />
<p /><br />
<strong><em>Ajax Enable Application</em></strong> <ul><br />
<li> Add ScriptManager (One and Only One)<br />
</li> <li> Add UpdatePanel (Partial Page update) <ul><br />
<li> Define Content Template <ul><br />
<li> Insert the GridView (PostBacks intercepted)<br />
</li> <li> Wire-up to Dropdown<br />
</li> <li> Define Triggers <ul><br />
<li> Async : Dropdown SelectedIndexChange<br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
<p /> <ul><br />
 <li><br />
 <ul><br />
<li> Add UpdatePanel <ul><br />
<li> Insert DetailsView <ul><br />
<li> Set UpdateMode to conditional<br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
<p /><br />
<strong><em>(If there is Time or Optional show more stuff in class)</em></strong> <ul><br />
 <li><br />
 <ul><br />
<li> Add Update Progress Control <ul><br />
<li> Define Progress Template <ul><br />
<li> div : progress<br />
</li> <li> img : "throbber"<br />
</li> <li> text : "Updating...."<br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
</li></ul> <br />
<p /></p>]]>
        
    </content>
</entry>

<entry>
    <title>Time Tracking has arrived with Web 2.0</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2008/10/time_tracking.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=149228" title="Time Tracking has arrived with Web 2.0" />
    <id>tag:blog.lib.umn.edu,2008:/gjer0005/craiggjerdingen//5485.149228</id>
    
    <published>2008-10-17T01:55:36Z</published>
    <updated>2008-10-17T05:01:32Z</updated>
    
    <summary>Before starting my career at the Carlson School of Management, I was an Applications Development Manager at Dorsey and Whitney, a massive Minnesota based law firm. Like all law firms billable time on clients matters was everyones top administrative concern....</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Project Management" />
    
        <category term="Web 2.0" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>Before starting my career at the <a href="http://www.carlsonschool.umn.edu">Carlson School of Management</a>, I was an Applications Development Manager at <a href="http://www.dorsey.com">Dorsey and Whitney</a>, a massive Minnesota based law firm. Like all law firms billable time on clients matters was everyones top administrative concern. We provided the attorneys with an application from Sage Software called <a href="http://www.sagespecialized.com/Products/CarpeDiem/index.asp">Carpe Diem</a>. It spoiled me on Time Tracking. Every other product I have seen seemed to be clunky and cumbersome after using it. You could easily call it "One-Click Time Tracking", a user would simply switch a few option boxes from one client to another, or one task, activity, project to another and the timer would reset and the time spent on the previous client and task would be logged in the billing system. It was beautiful. It even track email, phone, and idle. </p>

<p>Then today (2008-10-16) when my boss asked me about options for time tracking for an internal customer at the Carlson School I, being the <a href="http://www.belbin.com/">Resource Investigator from Belbin Team Roles Theory</a>, jumped on the Internet and started looking. And Oh My!, seems like the internet resurgence of the Web2.0 era has sprung up a host of solutions that work very similiarly to my dreamy Carpe Diem.</p>]]>
        <![CDATA[<p>So at the Carlson School we practice <a href="http://en.wikipedia.org/wiki/Agile_software_development">agile software development</a> methodologies  (I like illustrations, so see <a href="http://www.scrumforteamsystem.com/processguidance/v2/Scrum/Scrum.aspx">Scrum</a> or <a href="http://www.extremeprogramming.org/map/project.html">XP</a> if you are more visually inclined.) and thus we use a project management tool that fits our methodology, <a href="http://xplanner.org/">XPlanner</a>. Now their are many things I love about XPlanner and it's time tracking features aren't that bad. Recently we have begun a move to <a href="http://msdn.microsoft.com/en-us/vsts2008/default.aspx">Visual Studio Team System 2008</a> which includes much of the functionality that XPlanner does and vastly more besides. However, it also is not what I'd call a steller time tracker, and comes no where close to Carpe Diem when it comes to simplicity, easy of use, and speed of task/client switching. Now I know people will say that VSTS is not and should not be a time tracker, but I disagree. To capture velocity you must be creating estimates and then tracking against them to know what your projects velocity is and how your velocity units translate into time (see <a href="http://www.extremeprogramming.org/rules/velocity.html">velocity</a>).</p>

<p></p>

<p>Here a little of what I found:</p>

<p>Expensive:<br />
<a href="http://www.getharvest.com/widget">Harvest</a> (cool iPhone, and desktop widgets)<br />
<a href="http://www.clicktime.com/">ClickTime</a></p>

<p>Almost Free:<br />
<a href="http://www.88miles.net/">88Miles</a><br />
<a href="http://www.basecamphq.com/demos/time/">Basecamp</a><br />
<a href="http://www.tickspot.com/">Tick</a><br />
<a href="http://www.tsheets.com">TSheets</a> (So easy it works on the iPhone and smartphones)</p>

<p>Mostly Free:<br />
<a href="http://www.slimtimer.com/">Slim Timer</a> (and their cute solgans)<br />
<a href="http://www.toggl.com/"Toggl</a><br />
<a href="http://paymo.biz">Paymo timetacker</a><br />
<a href="http://time.onrails.org/">time onrails</a><br />
<a href="http://www.trackmypeople.com/">Track My People</a></p>

<p>Each of these offering has varying features and depth. What I'm guessing will make or break a choice of one over the other of these for most people is the granularity of clients, projects, task details needed and on the reporting and data output of these offerings.</p>

<p>But given that there are so many of these, it is a wonder that no one has yet made an XPlanner or Visual Studio Team System timer tacker widget or service. May be this will be my first CodePlex offering.  </p>

<p>Other links of note looked at while researching this topic:</p>

<p><a href="http://blogs.msdn.com/coding4fun/archive/2006/10/31/908509.aspx">http://blogs.msdn.com/coding4fun/archive/2006/10/31/908509.aspx</a><br />
<a href="http://msdn.microsoft.com/en-us/library/aa479337.aspx">http://msdn.microsoft.com/en-us/library/aa479337.aspx</a><br />
<a href="http://www.asp.net/downloads/starter-kits/time-tracker/">http://www.asp.net/downloads/starter-kits/time-tracker/</a></p>]]>
    </content>
</entry>

<entry>
    <title>Web 2.0 Flash Mash-Up Tricks on CMS systems help keep them flexible, open and lively.</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2008/09/open_web_20_mashups_tricks_wit.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=143166" title="Web 2.0 Flash Mash-Up Tricks on CMS systems help keep them flexible, open and lively." />
    <id>tag:blog.lib.umn.edu,2008:/gjer0005/craiggjerdingen//5485.143166</id>
    
    <published>2008-09-18T02:09:52Z</published>
    <updated>2008-09-18T13:49:01Z</updated>
    
    <summary>Well, while converting to Oracle&apos;s WCMS, dubbed UMContent here at the U of M, I&apos;ve discovered that even though they have a proprietary approach to building sites, and pages, that if they don&apos;t block mark up you can pretty well...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="CMS" />
    
        <category term="Flash" />
    
        <category term="Mash-Ups" />
    
        <category term="Web 2.0" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>Well, while converting to Oracle's WCMS, dubbed UMContent here at the U of M, I've discovered that even though they have a proprietary approach to building sites, and pages, that if they don't block mark up you can pretty well get a long working with the newest (circa Sept 2008) forms of mash-ups. </p>

<p>A couple in particular are, <a href="http://www.mikeindustries.com/blog/sifr/">sIFR</a>, <a href="http://code.google.com/p/swfobject/wiki/documentation">SWObject</a>, and  extending access via <a href="https://wiki.umn.edu/view/StellentWCM/FlashMP3Player">flash enabled media players</a>.</p>

<p>So Oracle's WCMS (our UMContent) has little to offer when it comes to doing things like podcasts or offering dynamic text to image conversion using specific typefaces, right out of the box.</p>

<p>But they don't block you from using these techniques to deliver content and formatting in ways that enhance your site.<br />
</p>]]>
        <![CDATA[<p><a href="http://www.mikeindustries.com/blog/sifr/">sIFR</a>, <a href="http://code.google.com/p/swfobject/wiki/documentation">SWObject</a>, and  extending access via flash enabled media players</p>

<p></p>

<p>So  I created a wiki post to show how one of these works. It uses a word-press Flash MP3 Audio Player to let users listen to podcasts directly from you web page, even if they don't have a MP3 player on thieir computer.<br />
 <br />
<a href="https://wiki.umn.edu/view/StellentWCM/FlashMP3Player">Embedded MP3 Audio Player for use in Oracle WCM (UMContent)</a>.</p>

<ul>
<li>Download the attached files on the bottom of the wiki page linked above 
<li>Upload them as "web assets" content into UMContent. 
<li><ul><li>player.swf (the flash based audio player, almost everyone can use this!) 
<li>audio-player.js (this is the JavaScript?)</ul>
<li>Upload your MP3 file into UMContent as "content" or "media" or whatever. 
<li>Copy and Paste the script/code below into your page (an .hcsp page, fragment or some other kind of page that can emit html into the page output) 
<li>Test it on desired browsers. 

<p><br />
&lt;strong&gt;Listen to this weeks podcast&lt;/strong&gt;<br />
&lt;object type=&quot;application/x-shockwave-flash&quot; data=&quot;&lt;!--$ssGetServerRelativePath(siteId, nodeId)--&gt;/groups/csom/@pub/@csom/documents/asset/flash_mp3_player_javascript.js&quot; id=&quot;audioplayer2&quot; height=&quot;24&quot; width=&quot;290&quot;&gt;<br />
&lt;param name=&quot;movie&quot; value=&quot;&lt;!--$ssGetServerRelativePath(siteId, nodeId)--&gt;<br />
/groups/csom/@pub/@csom/documents/asset/flash_mp3_player.swf&quot;&gt;<br />
&lt;param name=&quot;FlashVars&quot; value=&quot;playerID=2&amp;amp;soundFile=<br />
&lt;!--$ssGetServerRelativePath(siteId, nodeId)--&gt;<br />
/groups/csom/@pub/@csom/documents/asset/32138.mp3&quot;&gt;<br />
&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;<br />
&lt;param name=&quot;menu&quot; value=&quot;false&quot;&gt;<br />
&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;</p>

<p>&lt;/object&gt;  </p>

<p>&lt;!--[if !IE]&gt;--&gt; </p>

<p>&lt;embed src=&quot;&lt;!--$ssGetServerRelativePath(siteId, nodeId)--&gt;/groups/csom/@pub/@csom/documents/asset/flash_mp3_player.swf&quot; width=&quot;290&quot; height=&quot;24&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; flashvars=&quot;playerID=2&amp;amp;soundFile=&lt;!--$ssGetServerRelativePath(siteId, nodeId)--&gt;/groups/csom/@pub/@csom/documents/asset/32138.mp3&quot; /&gt;</p>

<p>&lt;!--&lt;![endif]--&gt; </p>]]>
    </content>
</entry>

<entry>
    <title>My Book Reading Journal</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2008/09/my_book_reading_journal.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=140249" title="My Book Reading Journal" />
    <id>tag:blog.lib.umn.edu,2008:/gjer0005/craiggjerdingen//5485.140249</id>
    
    <published>2008-09-03T14:01:31Z</published>
    <updated>2008-09-03T15:04:49Z</updated>
    
    <summary>I&apos;m keeping a reading journal on my wiki. I&apos;m trying as time permits to write some reactions and thoughts that are churned up by the reading in sub pages, but lately I&apos;ve just posted a link indicating that I&apos;ve read...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Reading" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>I'm keeping a <a href="https://wiki.umn.edu/view/CraigGjerdingen/ReadingsJournal">reading journal</a> on my wiki. I'm trying as time permits to write some reactions and thoughts that are churned up by the reading in sub pages, but lately I've just posted a link indicating that I've read something. </p>

<p>I'm posting some of my past readings to but only if I re-look at the book or find myself recalling/using the resource in some way.  I also sometimes reference a good article on the reading list, but I read so many of those I don't think I could manage listing them. </p>

<p>I found a nice little tool to pound material into my head when I don't have motivation to read an article. It is called <a href="http://www.spreeder.com">Spreeder</a> as in Speed/Reader. I usually turn it up to 450 word per minute and let'r rip. (my poor brain!)</p>]]>
        <![CDATA[<p><style><br />
.thumbnail<br />
{<br />
float: left;<br />
width: 120px;<br />
border: 1px dashed #999;<br />
margin: 0 15px 15px 0;<br />
padding: 5px;<br />
}<br />
IMG<br />
{<br />
border: 1px solid #000;<br />
}<br />
.clearboth { clear: both; }<br />
</style></p>

<p><br />
Here is a sampling for what you'll find on the wiki. (as of Sept 2007)  </p>

<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Lincoln on Leadership" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/lincoln_on_leadership.jpg" alt="lincoln_on_leadership.jpg" width='71' height='110' style="border: 1px solid #000;" /><br />Lincoln on Leadership by Donald T. Phillips</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Goose Girl" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/goose_girl.jpg" alt="goose_girl.jpg" width='67' height='110' style="border: 1px solid #000;" /><br />The Goose Girl  by Shannon Hale</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Enna Burning" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/enna_burning.jpg" alt="enna_burning.jpg" width='73' height='110' style="border: 1px solid #000;" /><br />Enna Burning by Shannon Hale</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="The Dun Cow" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/Dun_Cow.jpg" alt="Dun_Cow.jpg" width='74' height='110' style="border: 1px solid #000;" /><br />The Book of the Dun Cow by Walter Wangerin</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Getting to Yes" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/getting_to_yes_fisher.jpg" alt="getting_to_yes_fisher.jpg" width='72' height='110' style="border: 1px solid #000;"  /><br />Getting to Yes by Robert Fisher</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="7 Habits of Highly" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/7_Habits_Covey.jpg" alt="7_Habits_Covey.jpg" width='72' height='110' style="border: 1px solid #000;"   /><br />7 Habits of Highly Effective People by Steven Covey</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="SharePoint 2007 Administrators Companion" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/ms_sharepoint.jpg" alt="ms_sharepoint.jpg" width='85' height='110' style="border: 1px solid #000;" /><br />Office !SharePoint 2007 Administrators Companion by Microsoft Press</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="SharePoint 2007 The Definative Guide " category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/SharePoint_pyles.jpg" alt="SharePoint_pyles.jpg" width='84' height='110' style="border: 1px solid #000;" /><br />SharePoint 2007 - The Definative Guide by O'Reilly Press</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Castle on the Hill" category="books"><br />The Castle on the Hill by Elizabeth Goudge</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Mattimeo" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/mattimeo.jpg" alt="mattimeo.jpg" width='73' height='110'  style="border: 1px solid #000;" /><br />Mattimeo: A Tale From Redwall by Brain Jacques</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="The Rule of Benedict Joan Chittister" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/the_rule_chittister.jpg" alt="the_rule_chittister.jpg" width='75' height='110' style="border: 1px solid #000;" /><br />The Rule of Benedict by Joan Chittister</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Harry Potter and the Deathly Hallows" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/Deathly_Hallows.jpg" alt="Deathly_Hallows.jpg" width='73' height='110'  style="border: 1px solid #000;" /><br />Harry Potter and the Deathly Hallows by J.K. Rowling</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Golden Compass" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/golden_compass.jpg" alt="golden_compass.jpg" width='73' height='110' /><br />The Golden Compass by Philip Pullman</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Subtle Knife" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/Amber_SpyGlass.jpg" alt="Amber_SpyGlass.jpg" width='67' height='110' style="border: 1px solid #000;" /><br />The Subtle Knife by Philip Pullman</a></div>
<div class="thumbnail" style="float: left;width: 120px;border: 1px dashed #999;margin: 0 15px 15px 0;padding: 5px;"><a type="amzn" search="Amber Spyglass" category="books"><img src="https://wiki.umn.edu/pub/CraigGjerdingen/ReadingsJournal/Subtle_Knife.jpg" alt="Subtle_Knife.jpg" width='67' height='110' style="border: 1px solid #000;" /><br />The Amber Spyglass by Philip Pullman</a></div>]]>
    </content>
</entry>

<entry>
    <title>YouTube Mac wants to be a PC commercial Mash-up</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/12/youtube_mac_wants_to_be_a_pc_c.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=102439" title="YouTube Mac wants to be a PC commercial Mash-up" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.102439</id>
    
    <published>2007-12-13T17:31:34Z</published>
    <updated>2007-12-18T17:01:43Z</updated>
    
    <summary>I just posted a terrible, poorly editted, little video showing Mac (from the Get a Mac ads) trying to show how he is a PC. I through this together to try get something free from a contest. My friend Kevin...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Mash-Ups" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>I just posted a terrible, poorly editted, little video showing Mac (from the Get a Mac ads) trying to show how he is a PC. I through this together to try get something free from a contest. My friend Kevin Reynen once said the most useful app a Mac can run is Microsoft Windows and this is my omage to his intelligence.</p>

<p>This was created for a MaxiumPC contest to win a 8Gig Sansa Media Player</p>

<p>Enjoy <a href="http://www.youtube.com/gjer0005">Mac wants to be a PC!</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>OIT page on NetFiles</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/08/oit_page_on_netfiles.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=85407" title="OIT page on NetFiles" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.85407</id>
    
    <published>2007-08-22T12:26:39Z</published>
    <updated>2007-08-22T12:29:59Z</updated>
    
    <summary>In an attempt to raise the OIT search word ranking in the U of M g00gle appl1ance I&apos;ve created a file in NetFiles that point to the https://wiki.umn.edu/view/CraigGjerdingen/OfficeOfInformationTechnology page. Please ignore this shameless promotion....</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="OIT" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>In an attempt to raise the <a href="https://netfiles.umn.edu/users/gjer0005/www/">OIT</a> search word ranking in the U of M g00gle appl1ance I've created a file in NetFiles that point to the https://wiki.umn.edu/view/CraigGjerdingen/OfficeOfInformationTechnology page.  Please ignore this shameless promotion. </p>]]>
        
    </content>
</entry>

<entry>
    <title>OIT Alphabet Soup</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/06/oit_alphabet_soup.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=82658" title="OIT Alphabet Soup" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.82658</id>
    
    <published>2007-06-29T18:55:29Z</published>
    <updated>2007-06-29T19:02:28Z</updated>
    
    <summary>ADCS, ATAC, CESL, CITP, DMC, EFT, iFellow, iRoc, NTS, OIR, OIT, OVPR, TEL, UTELL, WebCT... Oh my, can you tell someone has let the Linux geeks run the shop for a while. To help short through the alphabet soup that...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="OIT" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>ADCS, ATAC, CESL, CITP, DMC, EFT, iFellow, iRoc, NTS, OIR, OIT, OVPR,  TEL, UTELL, WebCT... Oh my, can you tell someone has let the Linux geeks run the shop for a while. To help short through the alphabet soup that is the Office of Information Technology OIT at the U of M, I've added a section to my site, the unofficial guide to<a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">OIT</a> at the U of M.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Using OIT to Game the U of M Google Search Appliance</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/06/using_oit_to_game_the_u_of_m_g.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=81565" title="Using OIT to Game the U of M Google Search Appliance" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.81565</id>
    
    <published>2007-06-11T18:32:26Z</published>
    <updated>2007-06-11T18:40:37Z</updated>
    
    <summary>OIT So as of my last post, my standings in the Google appliance haven&apos;t moved one bit. Setting aside any narcissism and paranoia induced explanations, I have I have to conclude that simply naming the links in the blog to...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p><H1><a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">OIT</a></H1> So as of my last post, my standings in the Google appliance haven't moved one bit. Setting aside any narcissism and paranoia induced explanations, I have I have to conclude that simply naming the links in the blog to <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">OIT</a> had no noticeable effect on my pages standing.</p>

<p>Therefor, I decided to rename the page from Office of Information Technology - OIT to OIT - Office of Information Technology. I reflected this change in the Title element as well as in the first H1 element and the first normal body content.</p>

<p>Results should be processed in a week or so. (yes - this post about gaming the Google appliance is just another shameless promotion for the <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">OIT</a> page.)</p>]]>
        
    </content>
</entry>

<entry>
    <title>Gaming the U of M Google Appliance to Promote my OIT Page</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/05/gaming_the_u_of_m_google_appli.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=81036" title="Gaming the U of M Google Appliance to Promote my OIT Page" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.81036</id>
    
    <published>2007-05-29T15:32:52Z</published>
    <updated>2007-05-30T13:54:41Z</updated>
    
    <summary>I have a page that is about OIT, it pretty much contains everything you&apos;d want to know about OIT at the U of M if you are a new employee and trying to orientate and tap into the organization. So...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="OIT" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>I have a page that is about <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">OIT</a>, it pretty much contains everything you'd want to know about <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">OIT</a> at the U of M if you are a new employee and trying to orientate and tap into the organization. </p>

<p>So I posted on Friday (May 25th, 2007) a link the to <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology?cover=print">Unofficial Office of Information Technology</a> wiki and today (May 29th, 2007) it is on the first page of results. At about the 6th position. This post will link to a print version of the wiki page. Meaning it wont have all the standard wiki navigation to work through to find the real content. If it gets indexed it should push it up yet another spot or two.</p>

<p>However, one thing that could stop this is that typically the Google appliance wont follow querystring links. These tend to lead them into infinate search spaces. So I'll give it a few days and check back and review the results or lack of them. (I might give it a week).</p>

<p>But in gerenal I think the experiment worked.</p>

<p>(yes - this post about gaming the google appliance is just another shameless promotion for the <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">OIT</a> page.)</p>]]>
        
    </content>
</entry>

<entry>
    <title>Mash-Ups with the Office of Information Technology OIT Services and their relationships with Wikis and Blogs</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/05/mashups_with_the_office_of_inf.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=80928" title="Mash-Ups with the Office of Information Technology OIT Services and their relationships with Wikis and Blogs" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.80928</id>
    
    <published>2007-05-25T16:45:41Z</published>
    <updated>2007-05-25T20:01:07Z</updated>
    
    <summary>So here at the U of M, there are a bunch of sites and groups devoted to helping you teach, do research, learn and &quot;support the people&quot; who teach, research and learn. But they typically look at themselves organizationally rather...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Architecture" />
    
        <category term="OIT" />
    
        <category term="Opinion" />
    
        <category term="Personal" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>So here at the U of M, there are a bunch of sites and groups devoted to helping you teach, do research, learn and "support the people" who teach, research and learn. But they typically look at themselves organizationally rather than from their customers perspectives. This leads to confusion and the mistaken perception of less value in the services offered than really exists.</p>

<p>A byproduct of this organizational, rather than service approach to showcasing our wares, is a series of "Unofficial" pages that are popping up on UMWiki wikis and UThink blogs. I've started two <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/OfficeOfInformationTechnology">The Unofficial Guide to the Office of Information Technology (OIT)</a> and another is <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/UnofficialHowToGetYourMSDNSoftware">The Unofficial - How to get your MSDN Software</a> for Computer Science and Software Engineering Majors and Graduate Students. I was originally motivated to do this when I found the excellent <a href="https://wiki.umn.edu/twiki/bin/view/UmnItlabsUnofficialWeb/WebHome">UMN Itlabs Unofficial Web</a></p>

<p>This post falls into the category of being a "no one will officially tell you but..." post. See, by posting this blog entry I will elevate the rankings of the unofficial pages to which I just referred. This is because for some reason the folks behind the university google appliance have increase the value of items posted to UThink. [I however find the hypercard, simple DB structure of the UMWiki much more useful.] So posts like this and the information sites they referer to are just the start. This bit of "google gaming" info may seem like just a tiny bit of info that would help someone promote their site in the google rankings at the U of M, but I think it is leading to something much larger.</p>

<p><b>But where is this headed? Open Architectures and Mash-Ups</b><br />
I believe that over time issue like the lack of offering of certain servicesby OIT, like blackberry accessible email, or web standard calendaring, or a suppported secure research and development "LAMP" stack,  and other university service groups will be overcome by self interested individuals creating solutions to the barriers to information that exist in the technology choices implemented by OIT and unit areas. There is not enough knowledge and resources withing OIT (nor could there be), to pick the right emerging technologies, fund the efforts to create these mash-ups, and provide support to the population who would use them. It will be students, staff and faculty, satisfying their own self interests (scratching their itch), that will do it. Most of what is happening or will happen, will be unfunded, and unofficial efforts by all the smart people how call this home for some part of their life.</p>

<p>I think the scenario will go something like this.  Some ADCS employee, or lab asssistant, or EADs developer,  who will be in a degree program and have to do a capstone project, or will be a fellow in some innovation group, or have a grant, or who is just borded, will create a open SOA gateway from technology X, exposing it to all the potential mash-up applications that students and staff are becoming used to in the wider world of web 2.0</p>

<p>I think that project like the one started by Alexander Saint Croix <a href="https://wiki.umn.edu/twiki/bin/view/UMFoundry/WebHome">UMFoundry</a>will be the catalyst for this to occur. (I'm not banking on Alex's efforts being "the answer", although they may turn out to be) but eventually it will happen, or more correctly is already happening and we are just starting to see signs of it poking out here and there. (<a href="http://blog.lib.umn.edu/saintx/umfoundry/2007/05/why_hasnt_this_initiative_alre.html">A comment on why it is able to happen now.</a>) But without something like the UMFoundry or a knowledge base on the UMWiki it will never reach its full potential.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Wiki vs. Blog</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/04/wiki_vs_blog.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=77370" title="Wiki vs. Blog" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.77370</id>
    
    <published>2007-04-21T06:15:34Z</published>
    <updated>2007-05-22T17:15:46Z</updated>
    
    <summary>Well... for me, I guess there is no contest. A wiki is more of a knowledge store, card space, card file, hyperlink database, call it what you want... It stores and structures data in a way I find helpful and...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Opinion" />
    
        <category term="Personal" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>Well... for me,  I guess there is no contest. A wiki is more of a knowledge store, card space, card file, hyperlink database, call it what you want... It stores and structures data in a way I find helpful and manageable.</p>

<p>I think it is safe to say this blog has been abandon. More of the same but with more frequent posts and updates can be found here <a href="https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/WebHome">https://wiki.umn.edu/twiki/bin/view/CraigGjerdingen/WebHome</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>Chapter 7: Ruby on Rails</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/02/chapter_7_ruby_on_rails.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=68618" title="Chapter 7: Ruby on Rails" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.68618</id>
    
    <published>2007-02-16T15:06:33Z</published>
    <updated>2007-02-16T15:08:50Z</updated>
    
    <summary>Rails feels like just what it is, a reflective inspection and auto build (aka code generation) of a well designed Model View Controller connected to a nice implementation of Martin Folwers Active Record design pattern. I think the lession here...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Book" />
    
        <category term="Dynamic Languages" />
    
        <category term="Java" />
    
        <category term="Ruby on Rails" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>Rails feels like just what it is, a reflective inspection and auto build (aka code generation) of a well designed Model View Controller connected to a nice implementation of Martin Folwers Active Record design pattern. I think the lession here isn't how great Rails is, but how much can be gained by following well designed patterns...</p>]]>
        <![CDATA[<p>[This chapter is littered with syntaxical errors, and appearently Rails scaffolding writes different code than when the book was writen. Read carefully and watch the purals and you'll get through it. This chapter is also the most fun so far. Take Rails for a test drive.] <ul><br />
<li> Install Rails <ul><br />
<li> Starting a Rails Project <ul><br />
<li> Generating a Basic Application<br />
</li> <li> Running the Ruby webserver<br />
</li></ul> <br />
</li></ul> <br />
</li> <li> Install <span class="twikiNewLink">MySQL<a rel="nofollow" href="/twiki/bin/edit/CraigGjerdingen/MySQL?topicparent=CraigGjerdingen.BeyondJava" title="Create this topic"><sup>?</sup></a></span> <ul><br />
<li> Create a sample database and table<br />
</li></ul> <br />
</li> <li> Metaprogramming (Wire the app up to a <span class="twikiNewLink">MySQL<a rel="nofollow" href="/twiki/bin/edit/CraigGjerdingen/MySQL?topicparent=CraigGjerdingen.BeyondJava" title="Create this topic"><sup>?</sup></a></span> DB) <ul><br />
<li> Config the database.yml (yaml) file to work with your <span class="twikiNewLink">MySQL<a rel="nofollow" href="/twiki/bin/edit/CraigGjerdingen/MySQL?topicparent=CraigGjerdingen.BeyondJava" title="Create this topic"><sup>?</sup></a></span> database<br />
</li> <li> Restarting the server<br />
</li></ul> <br />
</li> <li> Generating the Model<br />
</li> <li> Using the Application Console<br />
</li> <li> Generating the Controller<br />
</li> <li> Managing Relationships<br />
</li> <li> Generating Scaffolding<br />
</li> <li> First look at WEBrick and <span class="twikiNewLink">ActiveRecord<a rel="nofollow" href="/twiki/bin/edit/CraigGjerdingen/ActiveRecord?topicparent=CraigGjerdingen.BeyondJava" title="Create this topic"><sup>?</sup></a></span> <ul><br />
<li> Automatic properties<br />
</li> <li> Association Management <ul><br />
<li>  belongs_to<br />
</li> <li> has_many<br />
</li></ul> <br />
</li> <li> Componsition<br />
</li> <li> Inheritance    * Modifying the Views    * Modifying the Controllers<br />
</li></ul> <br />
</li></ul> <br />
<p /><br />
[Rails feels like just what it is, a reflective inspection and auto build (aka code generation) of a well designed Model View Controller connected to a nice implementation of Martin Folwers Active Record design pattern. I think the lession here isn't how great Rails is, but how much can be gained by following well designed patterns. Imagine if they implement ten or twelve of the other classic patterns that fit the web app model. Good reflection and the dynamic nature of Ruby help them implement these, but Groovy or any other language can benefit from the same treatment.]</p>]]>
    </content>
</entry>

<entry>
    <title>Transformation: Ruby Smells</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/02/transformation_ruby_smells.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=67133" title="Transformation: Ruby Smells" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.67133</id>
    
    <published>2007-02-07T15:13:44Z</published>
    <updated>2007-02-07T15:17:28Z</updated>
    
    <summary>I keep hearing people say they couldn’t possibly use Ruby because it lacks automatic refactoring tools. Marting Fowler tells us that Refactoring is the art and science of turning smelly code into good code, in small, incremental steps. Provably correct,...</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Article Review" />
    
        <category term="Dynamic Languages" />
    
        <category term="Martin Fowler" />
    
        <category term="Opinion" />
    
        <category term="Reading" />
    
        <category term="Refactoring" />
    
        <category term="Ruby on Rails" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>I keep hearing people say they couldn’t possibly use Ruby because it lacks automatic refactoring tools.<br />
<p /><br />
<strong><a href="http://en.wikipedia.org/wiki/Martin_Fowler" target="_top">Marting Fowler</a></strong> tells us that <strong><a href="http://en.wikipedia.org/wiki/Refactoring" target="_top">Refactoring</a></strong> is the art and science of turning smelly code into good code, in small, incremental steps. Provably correct, by construction. Algorithms for giving your code a makeover without breaking it in the process.<br />
<p /><br />
</p>]]>
        <![CDATA[<p><iframe src="http://rcm.amazon.com/e/cm?t=wikcragje-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0201485672&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" align="right"></iframe> <ul><br />
<li> <a href="http://www.oreillynet.com/ruby/blog/2006/03/transformation.html" target="_top">Article</a><br />
</li></ul> <br />
<p /><br />
I keep hearing people say they couldn’t possibly use Ruby because it lacks automatic refactoring tools.<br />
<p /><br />
<strong><a href="http://en.wikipedia.org/wiki/Martin_Fowler" target="_top">Marting Fowler</a></strong> tells us that <strong><a href="http://en.wikipedia.org/wiki/Refactoring" target="_top">Refactoring</a></strong> is the art and science of turning smelly code into good code, in small, incremental steps. Provably correct, by construction. Algorithms for giving your code a makeover without breaking it in the process.<br />
<p /><br />
Some of these &#8220;refactoring&#8221; techniques are automatable. It seems Fowler and friends have stumbled on something real, something as big as OOP, almost. Thank you, Fowler and friends!<br />
<p /><br />
Refactoring is one of the first programming books that talks about the almost mystical act of writing code. It takes the process, exposes all the insides, revels in it, walks you line by line through oh so many little decisions that affect code quality. Most people talk about &#8220;architecture&#8221;. Refactoring talks about the idioms in the code we write every day. Real now-code, not planned someday-code.<br />
<p /><br />
It&#8217;s remarkable, really, that nobody talks about this. They leave all the so-called style choices to the programmer. <strong>Refactoring rubs our noses in the implications of our line-by-line style choices. Beautiful.</strong> This guy sounds like Kevin Reynen (<a href="http://www.sidewalktheory.com" target="_top">Sidewalk Theory</a>), I love him!<br />
<p /><br />
<h3><a name="Discovering_Refactoring"></a> Discovering Refactoring </h3><br />
<p /><br />
&#8220;Factoring&#8221;, sure, that&#8217;s a dictionary word. You can factor numbers, or polynomials. Factoring I know. Don&#8217;t know why you&#8217;d re-do it, though. What&#8217;s &#8220;re&#8221;-factoring?<br />
<p /><br />
I open the book. It says local variables are the root of all evil. Perhaps not exactly those words, but it&#8217;s the first discussion I stumble across. Local variables!? I plop down in a squashy armchair, <strong>outraged, to read more</strong>. I want to know if this guy is actually insane, or merely an idiot.<br />
<p /><br />
Horror sets in: he&#8217;s right. His explanation makes chilling sense. One of my cherished programming practices &#8212; caching intermediate values in local variables, as an inline performance optimization &#8212; is clearly demonstrated, before my very eyes in the squashy armchair, to be Evil. It explains why I have certain methods in my code base that keep growing and growing, and for reasons I&#8217;ve never been quite able to grok, the methods are unsplittable.<br />
<p /><br />
These big methods, they&#8217;re the Bad Places. The areas of the code base where I loathe to tread. Dark caves that grow more evil every time I visit them. Because add functionality I must, but the locals have threaded their way impenetrably through each function, spiderwebs that catch me and hold me.<br />
<p /><br />
The book shows me why they&#8217;re unsplittable, then gives me axes to split them. Sharp and precise tools. And the techniques make sense, right then and there.<br />
<p /><br />
I move on. Turning pages faster, now. Interested.<br />
<p /><br />
The book next tells me: don&#8217;t comment my code. Insanity again! But once again, his explanation makes sense. I resolve to stop writing one-line comments, and to start making more descriptive function and parameter names.<br />
<p /><br />
But the book is a landmark, and it made me a better programmer overnight. How often does that happen?<br />
<p /><br />
<p /><br />
[Having found that others he surveyed haven't read it he confesses.] I&#8217;m safe. I can study it, use it, not worry that everyone will know how foolish my code has been.<br />
<p /><br />
<h3><a name="Refactoring_Today"></a> Refactoring Today </h3><br />
<p /><br />
Everyone knows about Refactoring nowadays, because IDEs now have all of the automatable refactorings from the book, and a few extras to boot.<br />
<p /><br />
But despite its overnight popularity, most engineers have read Fowler&#8217;s book, not even a few chapters of it.<br />
<p /><br />
<h3><a name="Reprise"></a> Reprise </h3><br />
<p /><br />
I keep hearing people say they couldn&#8217;t possibly use Ruby because it lacks automatic refactoring tools. This, people say, is a show-stopper.<br />
<p /><br />
I wonder.<br />
<p /><br />
I read Fowler. I absorbed it. It&#8217;s the art and science of taking smelly code and turning it into better code, in small provable steps.<br />
<p /><br />
But he taught us something else, didn&#8217;t he?<br />
<p /><br />
Oh, but you wouldn&#8217;t know what that thing is, if you haven&#8217;t read his book. Have you? All of it? No skimming? C&#8217;mon now. Admit it. You skimmed.<br />
<p /><br />
Here&#8217;s the deal: to show us the paths from bad code to good, Fowler had to show us bad code. He showed us examples of what it looks like, and explained why it&#8217;s bad. He gave us a set of warning indicators and even called them &#8220;Code Smells&#8221;.<br />
<p /><br />
How did that code get smelly in the first place?<br />
<p /><br />
Well, we optimized prematurely. We stored too many intermediate values, for fear of recomputing them. We didn&#8217;t write small functions, for fear of virtual method-call overhead. We made bloated class heirarchies for the imagined benefits of reuse...<br />
<p /><br />
We were making dozens, hundreds of little mistakes that added up to some pretty smelly code. The book catalogued our mistakes, gave them names, elevated them to First-Class Mistakes.<br />
<p /><br />
[Understanding the basics of refactoring] you know what bad code smells like, and you know how it got that way. You&#8217;ve learned how to avoid writing it.<br />
<p /><br />
At what point did automated refactoring tools become the focus? The book&#8217;s original focus was about design, with tools for recovery. Now the focus is all on recovery, and specifically on the automatable subset of recovery techniques.<br />
<p /><br />
The implicit assumption here is that bad code just happens, inevitably. His book wasn&#8217;t just a catalog of 100-odd specific refactorings. It also presented themes. Once you get the core ideas, you can invent your own refactorings, and identify new code smells.<br />
<p /><br />
And now you know better how to write the code better the first time around.<br />
<p /><br />
Refactoring is zoomed way in. It&#8217;s focused on how you personally wrote this or that class or method, down at the level where you were making choices about local variables, control-flow constructs, and other micro-design decisions.<br />
<p /><br />
Refactoring can&#8217;t really be discussed in a vacuum; it&#8217;s interdependent with other modern development ideas, including &#8220;don&#8217;t repeat yourself&#8221;, &#8220;once and only once&#8221;, unit testing, and others.<br />
<p /><br />
<h3><a name="Push_button_Productivity"></a> Push-button Productivity </h3><br />
<p /><br />
<p /><br />
Automated code-refactoring tools work on big set of entities &#8212; objects, methods, names, anything patterned. All nearly identical. You have to change them all in a coordinated way, like a caterpillar&#8217;s crawl, moving all the legs or lines this way or that.<br />
<p /><br />
How did our code get that way to begin with? We wrote it badly. Refactoring to the rescue. Good design may be a lost cause, but we can recover, because we have automated servants to go fix all those little segments for us. They never get tired, and all we have to do is push buttons.<br />
<p /><br />
Well then. How could you possibly live without automated refactoring tools? How else could you coordinate the caterpillar-like motions of all Java&#8217;s identical tiny legs, its thousands of similar parts?<br />
<p /><br />
I&#8217;ll tell you how:<br />
<p /><br />
<strong>Ruby is a butterfly.</strong></p>]]>
    </content>
</entry>

<entry>
    <title>Beyond Javas: Chapter 6. Ruby in the Rough</title>
    <link rel="alternate" type="text/html" href="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/2007/02/beyond_javas_chapter_6_ruby_in.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.lib.umn.edu/cgi-bin/mt-atom.cgi/weblog/blog_id=5485/entry_id=67030" title="Beyond Javas: Chapter 6. Ruby in the Rough" />
    <id>tag:blog.lib.umn.edu,2007:/gjer0005/craiggjerdingen//5485.67030</id>
    
    <published>2007-02-06T22:09:59Z</published>
    <updated>2007-02-06T22:11:20Z</updated>
    
    <summary>Java&apos;s leadership run, at least for applications, might be drawing to an end. This book points out one language and two frameworks (one in Ruby and one in Smalltalk) that have something special to offer. One possible alternative language, Ruby....</summary>
    <author>
        <name>Craig Gjerdingen</name>
        <uri></uri>
    </author>
    
        <category term="Book" />
    
        <category term="Dynamic Languages" />
    
        <category term="Java" />
    
        <category term="Reading" />
    
        <category term="Ruby on Rails" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.lib.umn.edu/gjer0005/craiggjerdingen/">
        <![CDATA[<p>Java's leadership run, at least for applications, might be drawing to an end. This book points out one language and two frameworks (one in Ruby and one in Smalltalk) that have something special to offer. One possible alternative language, Ruby. It improves on Java, but that doesn't mean that Ruby will succeed, or that it's the best possible alternative. Dynamic Languages...</p>]]>
        <![CDATA[<p>Java's leadership run, at least for applications, might be drawing to an end. This book points out one language and two <br />
frameworks (one in Ruby and one in Smalltalk) that have something special to offer. One possible alternative language, Ruby. <br />
It improves on Java, but that doesn't mean that Ruby will succeed, or that it's the best possible alternative. <br />
<h3><a name="About_Ruby"></a> About Ruby </h3><br />
Ruby is a dynamic, fully object-oriented language that's usually grouped with scripting languages. The scripting term, for <br />
languages like Ruby, Smalltalk, and Python, is a little too limited, so I'll use the term applications language . <br />
Install it and type along. It comes with a primitive IDE, but the command line works well.<br />
<p /><br />
<h4><a name="Ruby_Is_Fully_OO"></a> Ruby Is Fully OO </h4><br />
From here, you can evaluate Ruby statements. You'll frequently use irb to answer those tiny questions that come up often in <br />
programming. <br />
<p /><br />
You don't have to worry about primitives or wrappers at all. More importantly, you don't have to deal with those cases in an <br />
API. Ruby's reflection, persistence engines, and XML frameworks are all much simpler, because you don't have to deal with all <br />
the edge cases related to primitives and arrays of primitives.<br />
<p /><br />
<h4><a name="Typing"></a> Typing </h4><br />
Try to do an assignment without a declaration:if it works that's a strong hint that Ruby is dynamically typed. The type in <br />
Ruby is bound to the object, but not the thing that contains it. So Ruby is dynamically typed. But Ruby won't break its <br />
typing rules by coercing one type to another. That means Ruby is strongly typed. Actually, strongly typed is an <br />
oversimplification. Since you can change Ruby types indiscriminately, some might consider Ruby to have weaker typing.<br />
You've read that dynamic typing lets you focus on the right part of the problem at the right time. It eases your refactoring <br />
burden, and reduces the amount of code that you have to write and maintain.<br />
<h4><a name="Conditionals"></a> Conditionals </h4><br />
Ruby's conditionals will remind you more of C than Java. Ruby also has a few conventions that you should know about. ? and ! <br />
are both valid in method names. By convention, methods ending in ? are tests. For example, nil? would test to see if a value <br />
is Nil. Methods ending in ! are potentially dangerous, because they have side effects. Ruby has an if statement. Ruby also <br />
supports an unless statement that works the same way. You can use if or unless in block form, as you do in Java. You can also <br />
tack them onto the end of a line, to conditionally execute a single line of code.<br />
<p /><br />
<h4><a name="Looping"></a> Looping </h4><br />
Ruby has two conditional loops. The loop continued until I entered the end-of-file character. Until, the other looping construct. <br />
<p /><br />
<h4><a name="Ranges"></a> Ranges </h4><br />
Ruby supports first-class range support. Ranges introduce = = =, another type of comparison. Also third type of comparison, <br />
called match, which you'll use with regular expressions .<br />
<h4><a name="Regular_Expressions"></a> Regular Expressions </h4><br />
Ruby builds regular expressions into the syntax. Some like regular expressions and others do not. They're a critical part of <br />
dealing with strings. In Ruby, you'll define a regular expression between slashes.<br />
Ruby returns the index of the character at the match. Ruby regular expressions are  pattern matching, such as regular <br />
expressions and ranges. <br />
<h4><a name="Containers"></a> Containers </h4><br />
Ruby containers are like Java's collections. Everything in an array is also an object. Ruby uses a Hash. Like Java's <span class="twikiNewLink">HashMaps<a rel="nofollow" href="/twiki/bin/edit/CraigGjerdingen/HashMaps?topicparent=CraigGjerdingen.BeyondJava" title="Create this topic"></a></span>, a Ruby Hash is an object. Unlike Java's <span class="twikiNewLink">HashMap<a rel="nofollow" href="/twiki/bin/edit/CraigGjerdingen/HashMap?topicparent=CraigGjerdingen.BeyondJava" title="Create this topic"></a></span>.<br />
<p /><br />
Like Java collections, Ruby containers hold objects, and they need not be homogeneous. <ul><br />
<li> Since there's no distinction between primitives and other objects, you can put literally anything into any given container, and you can nest them easily.<br />
</li> <li> Since everything inherits from object, everything has a hash code.<br />
</li> <li> The language gives you the same syntactic sugar for hashes as for arrays.<br />
</li> <li> Code blocks make iteration tighter and easier.<br />
</li></ul> <br />
Similarly, you can use Hash whenever you need a set, dictionary, or any type of unordered collection. You'll find yourself <br />
doing more with collections, and less customized iteration.<br />
<h4><a name="Files"></a> Files </h4><br />
Using Ruby Grep.rb you're effectively using a library that specifies everything on the outside of a control loop that <br />
iterates through a file. Ruby does the repetitive dirty work for you, and you customize the inside of the control loop with a <br />
code block.<br />
<p /><br />
<h4><a name="Why_Should_You_Care"></a><a name="Why_Should_You_Care_"></a> Why Should You Care? </h4><br />
By now, you should be getting a feel for the power and simplicity of Ruby. You can probably see how the lines of code go down <br />
and the abstraction goes up.  <ul><br />
<li> You still have to understand anything that your tools generate.<br />
</li> <li> The more code you have, the more bugs it can hide. Unit testing can take you only so far.<br />
</li> <li> Writing code is not the only cost, training, maintaining, and extending your code factor in also.<br />
</li> <li> Each code generation technique that you use limits your flexibility.<br />
</li> <li> Java developers rely increasingly on XML for configuration. Remember, configuration is still code. Developers from other languages often find Java's over-reliance on XML configuration annoying. Meanwhile, configuration in Ruby is usually clean <br />
</li></ul> <br />
and comfortable.<br />
<p /><br />
With Ruby, you wind up building the iteration strategies into your containers and reusing that logic.<br />
In dynamic languages like Ruby and Smalltalk, this programming strategy gives you tremendous intellectual freedom, both in <br />
the frameworks that you use and in the frameworks that you build.<br />
<h3><a name="Applying_Some_Structure"></a> Applying Some Structure </h3><br />
Both Ruby and Java are object-oriented languages. Both support object models with single inheritance. Still, you're going to <br />
see some differences between Ruby and Java: <ul><br />
<li> In Java, the smallest application is a class. In Ruby, everything is an object, so you can evaluate primitives, expressions, code blocks, and scripts. They all are objects, and all are valid Ruby.<br />
</li> <li> In Java, class definitions are static. In Ruby, you can modify your classes on the fly. When you see a class definition, if the class already exists, the new definition will modify the class that's already there.<br />
</li> <li> Ruby supports mixins and Java does not. Think of a mixin as an interface, plus an implementation, that you can attach to a class.<br />
</li> <li> In Ruby, everything returns some value, and that value is typed dynamically, so you won't see a return in the method definition.<br />
</li> <li> In Ruby, method parameters and instance variables are not typed; but the instances themselves are typed.<br />
</li></ul> <br />
<p /><br />
<h4><a name="David_Heinemeier_Hansson_Ruby_Cr"></a> David Heinemeier Hansson: Ruby - Creator of Ruby on Rails </h4><br />
<p /><br />
David Heinemeier Hansson (DHH) is the programmer of Base-camp, Backpack, and Ta-da List under the commercial banner of <br />
<p /><br />
37signals,  <ul><br />
<li> Q: What are the three most important features in Ruby that you use in Rails?	<br />
</li> <li> DHH: <strong>First</strong>, meta-programming. You can manipulate a class while it's being defined. You can create domain-specific <br />
</li></ul> <br />
<p /><br />
languages, because you've got hooks everywhere into the life cycle of classes and objects... <strong>Second</strong>, open classes. Active <br />
<p /><br />
Record consists of around 10 layers that are all applied to the base class... <strong>Third</strong>, everything is an object, with <br />
<p /><br />
exceptions. You can work procedurally on top of the object orientation, but that's the order of business. It makes for an <br />
<p /><br />
incredibly consistent experience that really makes "The Principle of Least Surprise" come true. You can guess the names and <br />
<p /><br />
behavior of Ruby classes more often than not.<br />
<p /><br />
<h4><a name="Classes"></a> Classes </h4><br />
Ruby is object-oriented. In Ruby, instance variables start with @, class variables start with @@, and global variable start <br />
<p /><br />
with $.  Ruby developers take advantage of open classes . You can change the class definition of an existing class. That's a <br />
<p /><br />
useful capability for debugging, iterative programming, and metaprogramming. Ruby also lets you subclass. To subclass, you <br />
<p /><br />
use the &lt; operator. These concepts should look familiar to you. Classes package instance data and methods together. An <br />
<p /><br />
instance of a class is an object. All classes have single parents, and eventually inherit from Object, with the exception of <br />
<p /><br />
Object.<br />
<p /><br />
<h4><a name="Using_Mixins"></a> Using Mixins </h4><br />
To implement a mixin, Ruby uses a concept called a module. A module lets you group together methods and classes. You can't <br />
<p /><br />
instantiate a module, and a module doesn't stand alone. A module isn't a class, but it does have its own namespace. Modules <br />
<p /><br />
form the foundation of classes and mixins. Recall that a mixin is an interface with an implementation. That means you can <br />
<p /><br />
group together a set of methods that many classes may need to use. You can separate an aspect, or a capability, into a mixin. <br />
<p /><br />
What makes mixins so powerful is this: you can also access an objects class methods in your module. In fact, we used an <br />
object propery in the module, before we had even defined the object. <br />
<p /><br />
<h4><a name="Interceptors"></a> Interceptors </h4><br />
With Ruby, interception is easy. You simply take a method, rename it, and put another method in its place <br />
<p /><br />
<h4><a name="Aspect_Oriented_Programming_AOP"></a><a name="Aspect_Oriented_Programming_AOP_"></a> Aspect Oriented Programming (AOP) </h4><br />
AOP lets you add services to your POJOs without modifying any code. AOP helps you control the flow of your application, such <br />
as adding custom methods at interesting points&#8212;for instance, before or after a method executes. In particular, you'll often <br />
see AOP for: <ul><br />
<li> Debugging or logging<br />
</li> <li> Declarative services<br />
</li> <li> Mixins<br />
</li></ul> <br />
A standardized AOP framework has never really taken off in Ruby because the language itself already supports most of the <br />
desirable functionality of AOP. The next version of Ruby will take this a step further by including AOP-like constructs right <br />
in the language with pre, post, and wrap conditions. The meta-programming capabilities of Ruby lie so close to the surface <br />
and are quite accessible to the average Ruby programmer. Most of the problems addressed by AOP are addressed by meta-programming in Ruby.<br />
Of course, AOP is a much broader tool, and if it is successful, the typical use cases obviously will grow in scope and power. <br />
<p /><br />
For Ruby developers, AOP is not quite as urgent, because you've already got robust tools to deal with these kinds of concerns: <ul><br />
<li> You can use interceptors. These let you add services to any object at any time. It's as easy as renaming one method and introducing another.<br />
</li> <li> You can use mixins, even attaching them at runtime. You could easily make all of the methods on a domain model secure, for example.<br />
</li> <li> You can use hooks . Ruby provides hooks so that you can inject custom code at certain well-defined locations. The next version of Ruby will support hooks called _ _before, _ _after, and _ _wrap.<br />
</li></ul> <br />
In short, Ruby can already solve many AOP-like problems without AOP, and will add AOP-like features in the very near future. <br />
<p /><br />
<p /><br />
<h4><a name="Dependency_Injection"></a> Dependency Injection </h4><br />
The difference dependency injection in Java and Ruby is a little tougher to understand for Java developers. In Java, <br />
dependency injection is rapidly changing the way that we build applications. It's a relatively simple concept:<br />
A few things come up right off the bat when you look at dependency injection in Ruby. First, Java's not very good at <br />
configuration, but Ruby lets you represent structured data quite well, often with far less invasive syntax than XML. You also <br />
can solve many of the coupling problems by changing the definition of a class on the fly. <br />
Some developers in Ruby seem to think dependency injection is important and that the idea will have a place in the Ruby <br />
mainstream, given time. It should come as no surprise to you that Ruby has an outstanding dependency injection framework <br />
called Needles.<br />
<p /><br />
Others tend to think that dependency injection should happen in spots, instead of with a single, general-purpose framework. <br />
Since it's easy to change a class definition on the fly, you can easily inject the behavior that you need without adding <br />
another layer of complexity, across the application. Most of the Ruby programming community seems to be converging on the <br />
idea that Ruby's overall dynamic design makes dependency injection unnecessary for all but the most complex applications<br />
<h3><a name="Breaking_It_Down"></a> Breaking It Down </h3><br />
Ruby makes some of the hard things in Java easy. More and more of the top independent consultants are looking for ways to make more money <br />
working in Ruby, or other languages that are more dynamic. The Java community is spending an amazing amount of money and <br />
brainpower on making Java more dynamic. Dependency injection and aspect-oriented programming are groundbreaking ideas for <br />
Java, and they are only now getting serious commercial traction. <br />
<h4><a name="Collapsing_Under_the_Weight_of_A"></a> Collapsing Under the Weight of Abstraction? </h4><br />
As we stretch Java in increasingly unnatural directions, <br />
there's a cost. AOP and dependency injection are near-trivial exercises in Ruby, but they force Java developers to learn new <br />
programming models, deal with XML, and introduce increasingly complex syntax. With each new meta-programming concept that we <br />
bake into Java, it's looking more and more like all of that complexity is trying to drive us somewhere. The net effect is to <br />
push Java further and further into the enterprise niche, and make it less and less accessible to the average Joe. Contrast <br />
that situation with Ruby, where dependency injection and AOP don't consume your focus; you're free to apply those ideas in <br />
spots right where you need them.</p>]]>
    </content>
</entry>

</feed> 

