<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>&amp;lt;blog&amp;gt;Matt Osentoski&amp;lt;/blog&amp;gt;</title>
    <link>http://matt.osentoski.com/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Webservices using Axis</title>
      <description>This article is a howto that describes setting up a web service using the 'Bottom Up' approach.
&lt;br /&gt;&lt;br /&gt;
&lt;h3&gt;Intro&lt;/h3&gt;
The first step to building web services is to figure out which method
to start with.  (Top down or Bottom up)
&lt;br /&gt;
&lt;h3&gt;Bottom Up Development&lt;/h3&gt;
Creating a web service from a Java Bean.
This method creates a WSDL file automatically from Java code.  To get this
type of system to work, you will have to create a WSDD file which describes
which java objects should be exposed as webservices. This approach is easier 
in the sense that you don't have to create a WSDL file, however the 
downside is that there is a greater risk that the WSDL file generated will 
not work with other systems.  I would recommend trying Bottom Up development first.  You can switch to Top Down development if you run into
severe interoperability problems.
&lt;br /&gt;
&lt;h3&gt;Top Down Development&lt;/h3&gt;
This approach starts with the WSDL file.
Java files are then generated from WSDL using a utility (WSDL2Java).  This method has the highest
chance of interoperability, but requires that you create a WSDL file from 
scratch, which can be very difficult and error prone process without the help of 
tools.
&lt;br /&gt; 
&lt;h3&gt;Bottom Up Development (Using JWS files)&lt;/h3&gt;
Create a web service from a Java Bean that is renamed with the .jws extension
This method creates a web service from a Java bean without the need to 
create a WSDD or WSDL file.  It is the easiest approach to use, but also
the most limiting in terms of functionality and interoperability.  &lt;strong&gt;This
method should NOT be used!!&lt;/strong&gt;


&lt;br /&gt;
&lt;h3&gt;Development (Bottom Up) - Server &lt;/h3&gt;
Assuming you've chosen to develop using the Bottom Up approach, begin by 
creating your Java Objects.  I generally create three layers:&lt;br /&gt;
1) &lt;strong&gt;Business Object Layer.&lt;/strong&gt;  This layer consist of the Beans that make up my model&lt;br /&gt;
2) &lt;strong&gt;DAO layer for database persistance.&lt;/strong&gt;  (Using Hibernate or JDBC)&lt;br /&gt;
3) &lt;strong&gt;Service Layer.&lt;/strong&gt;  This is the loosely grained layer used for making the 
web service calls (Ex: getCustomerByName(String name)).  This is also the 
layer that will generate the WSDL file(s).&lt;br /&gt;
&lt;br /&gt;
(NOTE: Save yourself a lot of pain and write some tests.  There's
nothing worse than trying to resolve an obscure Hibernate error while end-to-end
testing your services)
&lt;br /&gt;&lt;br /&gt;
Now that your Java code has been written (and hopefully tested ;) ) you can
begin to write your WSDD file.  The purpose of the WSDD file is to describe
which java class will be exposed using web services.  See &lt;a href="/files/server-config.wsdd"&gt;this WSDD&lt;/a&gt; file as an
example.  The most important part is the comment section, I included, called 'Put your service definitions here'.  Follow the example to add your own classes.  If you're deploying your web
services as a web application, the WSDD file should be called 'server-config.wsdd'
and placed under your /WEB-INF directory.  The Axis servlet will look for this
file on startup. (This also saves you the annoyance of using the Axis admin tools for 
service startup.)
&lt;br /&gt;&lt;br /&gt;
Now you will need to add the following Axis 1.2 library dependencies under /WEB-INF/lib:&lt;br /&gt;
axis.jar&lt;br /&gt;
commons-discovery.jar&lt;br /&gt;
commons-logging.jar&lt;br /&gt;
jaxrpc.jar&lt;br /&gt;
log4j-1.2.8.jar  (your version may vary)&lt;br /&gt;
saaj.jar&lt;br /&gt;
wsdl-4j-1.5.1.jar  (again.. your version may vary)&lt;br /&gt;
&lt;br /&gt;
All of these libraries are included with Axis. &lt;br /&gt; 
&lt;br /&gt;
Next, you will have to modify your web.xml file to startup the Axis servlet
and services.  See &lt;a href="/files/web.xml"&gt;this web.xml&lt;/a&gt; file as an example.
&lt;br /&gt;&lt;br /&gt;
At this point you can compile all of your Java code into /WEB-INF/lib (as a jar) or
/WEB-INF/classes and deploy the War file.  Your web services should now be running.&lt;br /&gt;
To check, try accessing your services from a web browser:&lt;br /&gt;
http://localhost:8080/yourAppName/services/SomeService?wsdl
&lt;br /&gt;&lt;br /&gt;
(Note: 'YourAppName' is the name of your application context.  'SomeService'
will be the name of your service as defined in the WSDD file.)
&lt;br /&gt;&lt;br /&gt;
This will display the WSDL file that is dynamically created.  To call a method
use: &lt;br /&gt;
http://localhost:8080/yourAppName/services/SomeService?method=aMethodThatDoesCoolStuff
&lt;br /&gt;&lt;br /&gt;
(NOTE: 'aMethodThatDoesCoolStuff' would be the name of a method in your service layer.
You can also set method params by adding paramName=paramValue pairs at the end
of the URL)
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Development - Client &lt;/h3&gt;
The client code is automatically created using a utility called WSDL2Java.
See &lt;a href="/files/wsdl_run.bat"&gt;this wsdl_run.bat&lt;/a&gt; script for an example that creates client code.  A simple example
for creating client stubs is also below:&lt;br /&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;java -cp %CLASS_PATH% org.apache.axis.wsdl.WSDL2Java -o .\src -d Session -p test.ws http://localhost:8080/myapp/services/MyService?wsdl&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
This command will create all the model objects and SOAP bindings.  There will
be a class called MyServiceSoapBindingStub that you will instantiate using another
class called MyServiceImplServiceLocator to make web service calls.  Compile all the generated code
then call the web service using the example below.
&lt;br /&gt;&lt;br /&gt;
Example:&lt;br /&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;MyServiceImplServiceLocator locator = new MyServiceImplServiceLocator();
MyServiceSoapBindingStub soapCall = (MyServiceSoapBindingStub) locator.getMyService();
String coolText = soapCall.aMethodThatDoesSomethingCool();
System.out.println(&amp;quot;Output from WS: &amp;quot; + coolText + &amp;quot;\n\nYes! It works!!&amp;quot;);&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 23 Feb 2007 09:56:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:fb219bdd-cdf8-4f29-b35a-41d8ce554538</guid>
      <author>Matt Osentoski</author>
      <link>http://matt.osentoski.com/articles/2007/02/23/webservices-using-axis</link>
      <category>Web Services</category>
      <category>Axis</category>
      <category>wsdl</category>
      <category>Java</category>
    </item>
    <item>
      <title>Problems with WSDL2ruby</title>
      <description>The other day, I was trying to create a quick and dirty SOAP client for my Axis server,  when I encounter the following error: 
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;
uninitialized constant SOAP::Mapping::EncodedRegistry (NameError)
&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;
Let me start from the beginning..  I installed soap4r using:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;gem install soap4r&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
After soap4r was installed, I ran WSDL2ruby to create the SOAP client stubs.
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;wsdl2ruby.rb --wsdl http://localhost:8080/axis/services/someCoolService?wsdl --type client --force&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Now that the client code had been generated, I launched the client and received the error message above.  The problem was caused by Ruby grabbing the soap4r classes that are included in the distribution and not the gem.  To fix this, explicitly point to the soap4r gem libary.
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;br /&gt;
Open up the &lt;strong&gt;defaultMappingRegistry.rb&lt;/strong&gt; file and make sure the require statements look like:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;require 'default.rb'
require 'rubygems'
require_gem 'soap4r'
require 'soap/mapping'&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt;&lt;br /&gt;
require 'rubygems'  --and--&lt;br /&gt;
require_gem 'soap4r'
&lt;br /&gt;were added.</description>
      <pubDate>Mon, 12 Feb 2007 16:04:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:ebaef2c5-6395-4e89-a40e-c03a3cb63c72</guid>
      <author>Matt Osentoski</author>
      <link>http://matt.osentoski.com/articles/2007/02/12/uninitialized-constant-soap-mapping-encodedregistry-nameerror</link>
      <category>Ruby</category>
      <category>Ruby</category>
      <category>soap4r</category>
      <category>wsdl2ruby</category>
      <category>wsdl</category>
    </item>
    <item>
      <title>Creating dynamic WHERE clauses with ActiveRecord</title>
      <description>Hibernate has a class called Criteria that's used to help eliminate the logic in dynamic queries.  I was building a Ruby on Rails application recently and wanted similar functionality, but didn't see the equivalent of a Criteria object in ActiveRecord.   I searched around for a 3rd party library and found a few, but wasn't interested in a heavy API.  So, I rolled my own Class to create dynamic WHERE clauses.
&lt;br /&gt;
&lt;br /&gt;
The class is called SqlBuilder and works on the principle that the ActiveRecord find() method can accept a String and Hash of parameters in the :conditions clause.  What my class does is create the SQL string, inserting symbols in place of values.
&lt;br /&gt;
&lt;br /&gt;
To use my class in your own code, grab the sql_builder.rb file &lt;a href="/files/sql_builder.rb"&gt;here&lt;/a&gt; and follow the sample code below:
&lt;br /&gt;&lt;br /&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;require 'sql_builder'
 
builder = SqlBuilder.new
builder.where_helper('division', params['division'], 'divisions.id')
builder.where_helper('vehicle', params['vehicles'], 'vehicles.id')
builder.where_helper('notes', params['notes'].strip, 'claims.notes', 'AND', 'LIKE')
sql_conditions, sql_conditions_hash = builder.get_sql_conditions()

@claims = Claim.find(:all, :include =&amp;gt; [:divisions, :vehicles],
 :conditions =&amp;gt; [sql_conditions, sql_conditions_hash])&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;Disclaimer:&lt;/strong&gt;
This is a very, very simple Class and probably won't work for every scenerio.  If you have very complex needs you should check out some of the other libraries, that are out there.</description>
      <pubDate>Wed, 24 Jan 2007 14:58:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0c729aa1-8bf3-498b-94e0-a991519edf2c</guid>
      <author>Matt Osentoski</author>
      <link>http://matt.osentoski.com/articles/2007/01/24/creating-dynamic-where-clauses-in-active-record</link>
      <category>Rails</category>
      <category>Rails</category>
      <category>ActiveRecord</category>
      <enclosure length="4175" type="application/octet-stream" url="http://matt.osentoski.com/files/sql_builder.rb"/>
    </item>
    <item>
      <title>Ruby named language of the year by Tiobe</title>
      <description>Ruby has been named language of the year by Tiobe and is now ranked in the top 10 languages.  Follow the link below to read the article:
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.tiobe.com/tpci.htm"&gt;http://www.tiobe.com/tpci.htm&lt;/a&gt;</description>
      <pubDate>Mon, 08 Jan 2007 10:25:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1f1e3315-d139-4e7c-a191-59413e521cce</guid>
      <author>Matt Osentoski</author>
      <link>http://matt.osentoski.com/articles/2007/01/08/ruby-declared-language-of-the-year-by-tiobe</link>
      <category>Ruby</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>Installing Typo in the root of your domain on Site5</title>
      <description>Site5 has an automated process for adding Typo blogs to your website.  This works fine except the blog is created in a directory off of the domain.  For example:  www.test.com/blog instead of www.test.com.  Follow the steps below to install Typo into the root of your domain. This process should also work for your own custom Rails apps.
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;1. Setup SSH access on your Site5 account. &lt;/strong&gt; Contact: shared@site5.com.
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;2. Download the latest version of Typo&lt;/strong&gt; at: http://rubyforge.org/projects/typo/
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;3. Create a directory for your Rails applications&lt;/strong&gt;.  SSH into your account and create a &lt;strong&gt;rails_apps&lt;/strong&gt; directory.  
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;	&amp;gt; cd ~
	&amp;gt; mkdir rails_apps&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;strong&gt;4. SFTP your Typo file&lt;/strong&gt; into the rails_apps directory you just created.  The 
directory should be something like: /home/your_site_name/rails_apps
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;5. Expand the Typo file. &lt;/strong&gt; SSH back into your account and issue the following 
commands:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;	&amp;gt; cd rails_apps
	&amp;gt; gunzip -c typo-4.0.3.tar | tar xvf -&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;	
(NOTE: replace typo-4.0.3.tar with the name of the file you grabbed from 
rubyforge.org.)
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;6. Rename the original public_html directory.&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;	&amp;gt; cd ~
	&amp;gt; mv public_html public_html_orig&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;strong&gt;7. Create a symbolic link&lt;/strong&gt; to typo's public directory.
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;	&amp;gt; cd ~
	&amp;gt; ln -s /home/your_site_name/rails_apps/typo-4.0.3/public public_html&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;strong&gt;8. Create the Typo database and database user.&lt;/strong&gt;
Login to the SiteAdmin for your account	and create a new database user and database.
Make sure you give the user the appropriate rights to the database you just created.
&lt;br /&gt;&lt;br /&gt;	
&lt;strong&gt;9. Prepopulate the typo database.&lt;/strong&gt;  (NOTE: This can also be accomplished using
the import function in phpMyAdmin from SiteAdmin.)
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;	&amp;gt; mysql -u sitename_username -p
	use your_database_name
	source /home/your_site_name/rails_apps/typo-4.0.3/db/schema.mysql.sql&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;strong&gt;10. Modify the environment.rb file.&lt;/strong&gt;  This file should be located at:&lt;br /&gt;
/home/your_site_name/rails_apps/typo-4.0.3/config/environment.rb
&lt;br /&gt;
Uncomment the following line:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="constant"&gt;ENV&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;production&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Then add the RAILS_ROOT after:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="constant"&gt;RAILS_ROOT&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/home/your_site_name/rails_apps/typo-4.0.3&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;strong&gt;11. Modify the database.yml file.&lt;/strong&gt;  This file should be located at:&lt;br /&gt;
/home/your_site_name/rails_apps/typo-4.0.3/config/database.yml
&lt;br /&gt;&lt;br /&gt;
Modify the entries for the production application using the database information
from Step 8.
&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;12. Verify your .htaccess file.&lt;/strong&gt; Located at: /home/your_site_name/rails_apps/typo-4.0.3/public/.htaccess
&lt;br /&gt;
This file should contain the following lines:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="constant"&gt;RewriteEngine&lt;/span&gt; &lt;span class="constant"&gt;On&lt;/span&gt;

&lt;span class="constant"&gt;RewriteRule&lt;/span&gt; ^&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;QSA&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
&lt;span class="constant"&gt;RewriteRule&lt;/span&gt; ^&lt;span class="punct"&gt;([^.]+)&lt;/span&gt;&lt;span class="global"&gt;$ $1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;QSA&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
&lt;span class="constant"&gt;RewriteCond&lt;/span&gt; &lt;span class="punct"&gt;%{&lt;/span&gt;&lt;span class="string"&gt;REQUEST_FILENAME&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="punct"&gt;!-&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;
&lt;span class="constant"&gt;RewriteRule&lt;/span&gt; ^&lt;span class="punct"&gt;(.*)&lt;/span&gt;&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="ident"&gt;dispatch&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fcgi&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;QSA&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="constant"&gt;L&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;strong&gt;13. Restart dispatch.fcgi.&lt;/strong&gt;  From a command prompt, run the following line:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&lt;notextile&gt;	&amp;gt; pkill -9 -u your_username_here -f dispatch.fcgi&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;	
(NOTE: replace your_username_here with the username you used to SSH into 
the server.)
&lt;br /&gt;&lt;br /&gt;
You should be all set!  Try to access your domain, you should be greeted with the
Typo setup screen.</description>
      <pubDate>Tue, 02 Jan 2007 14:42:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e6b0f27b-d922-4f88-b01b-6d420fe20ee1</guid>
      <author>Matt Osentoski</author>
      <link>http://matt.osentoski.com/articles/2007/01/02/installing-typo-in-the-root-of-your-domain-on-site5</link>
      <category>Rails</category>
      <category>Site5</category>
      <category>Typo</category>
      <category>Rails</category>
    </item>
    <item>
      <title>Welcome</title>
      <description>Hello, my name is Matt Osentoski.  I've been in the IT industry for over nine years.  My career has spanned a broad range of areas including:
&lt;ul&gt;
&lt;li&gt;Novell, NT, Unix Administration&lt;/li&gt;
&lt;li&gt;Networking (Switches, routers, etc)&lt;/li&gt;
&lt;li&gt;Digital Circuits (t1, t3, Oc3, etc)&lt;/li&gt;
&lt;li&gt;Java Development&lt;/li&gt;
&lt;li&gt;PHP / Ruby on Rails Development&lt;/li&gt;
&lt;/ul&gt;

Today I'm a software developer building and maintaining J2EE applications.  I've been working with Java since 1998.  Recently, I've been having a bit of a falling out with Java and have been moving toward more scripting based development methodologies using Ruby on Rails and PHP.   Ruby on Rails especially has been a great experience compared to my years working with Java and I will probably write about my experiences here at great length.
&lt;br /&gt;&lt;br /&gt;
Over the years I have compiled a large amount of HOWTOs and just general information for solving a wide variaty of problems.  My goal with this website is to share these solutions and examine the future direction of the computer industry.</description>
      <pubDate>Sun, 31 Dec 2006 17:12:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:d9a3a172-a2c5-416f-8fb7-c6e21f778c19</guid>
      <author>Matt Osentoski</author>
      <link>http://matt.osentoski.com/articles/2006/12/31/welcome</link>
    </item>
  </channel>
</rss>
