<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>yken.org &#187; software</title>
	<atom:link href="http://yken.org/tag/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://yken.org</link>
	<description>...it depends</description>
	<lastBuildDate>Sun, 07 Mar 2010 17:47:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Parsing the command line in Objective-C</title>
		<link>http://yken.org/2009/01/14/parsing-the-command-line-in-objective-c/</link>
		<comments>http://yken.org/2009/01/14/parsing-the-command-line-in-objective-c/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 00:40:42 +0000</pubDate>
		<dc:creator>ikendra</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://yken.org/?p=77</guid>
		<description><![CDATA[Decision into which platform to rewrite the shell script to retrieve the stock quotes using Google API was a simple one &#8211; I would like to use Objective-C to be able to run the program on a Mac (and later hopefully on my iPod touch too). I began exploring the Objective-C only recently so I [...]]]></description>
			<content:encoded><![CDATA[<p>Decision into which platform to rewrite the <a href="http://yken.org/2009/01/05/how-to-get-a-real-time-stock-quote-using-google-api/">shell script to retrieve the stock quotes using Google API</a> was a simple one &#8211; I would like to use Objective-C to be able to run the program on a Mac (and later hopefully on my iPod touch too). I began exploring the Objective-C only recently so I considered to be a good exercise to learn about basic Foundation classes by writing a class to parse command line arguments (instead of using the obvious <a href="http://www.gnu.org/software/libc/manual/html_node/Getopt.html">getopt</a> choice).</p>
<p><span id="more-77"></span><br />
&nbsp;<br />
<!--more--><a href="http://yken.org/hub/wp-content/CommandLineSample.tar.gz">Download the XCode project (CommandLineSample.tar.gz, 48kB) &#8211; including a sample</a><br />
<!--more--><br />
&nbsp;<br />
<!--more--></p>
<p>The CommandLine class is very simple and offers the following functionality:</p>
<ul>
<li>Validates and parses the command line arguments according to user defined struture of options (NSDictionary)</li>
<li>Options can be declared required or optional, followed by option value or not</li>
<li>Minimum number of expected parameters (beside options) can be set</li>
<li>When command line parsing fails, a message describing the error can be retrieved</li>
</ul>
<p><!--more--><br />
A sample use of the CommandLine class:</p>
<pre>
#import &lt;Foundation/Foundation.h&gt;
#import "CommandLine.h"

int main (int argc, char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    BOOL parseSuccess;

    CommandLine *commandLine =
        [[CommandLine alloc] initWithArgc: argc andArgv: argv];

    // This sample expects at least one parameter (other that options)
    int sampleMinNumberOfParams = 1;

    // Define the matrix describing expected options
    NSDictionary *sampleOptionsMatrix =
        [NSDictionary dictionaryWithObjectsAndKeys:
            CL_OPTION_REQUIRED, @"a",
            CL_OPTION_OPTIONAL, @"b",
            CL_OPTION_REQUIRED_WITH_VALUE, @"f",
            CL_OPTION_OPTIONAL_WITH_VALUE, @"x",
            nil];

    // Pass on required parameters to the parser and execute the parser
    [commandLine cL_setOptionsMatrix: sampleOptionsMatrix
    andMinNumberOfParams: sampleMinNumberOfParams];

    parseSuccess = [commandLine cL_parse];

    if (parseSuccess) {
        // Display the parsed options.
        for (NSString *key in commandLine.parsedCommandLine) {
        NSLog(
           [NSString stringWithFormat: @"Option: %@ Value: %@", key,
           [commandLine.parsedCommandLine valueForKey:key]]);
        }
        //And some more processing of a successfully parsed command line:
        if ([commandLine cL_optionIsSet: @"b"]) {
            NSLog(@"Option b was set");
        }
        NSLog(
            [NSString stringWithFormat: @"Value of the 1st parameter is %@",
            [commandLine cL_parameterGetValue: 1]]);
    } else {
        //Display the error message
        NSLog(commandLine.resultText);
    }

    [pool drain];
    [commandLine release];

    return 0;
}
</pre>
<p>A few notes:</p>
<ul>
<li>Alternative long option names are not supported</li>
<li>The options matrix appears to be somewhat verbose, hope it is not too much overhead</li>
<li>The CommandLine class source code enables some documentation to be generated using <a href="http://www.informatik.uos.de/elmar/projects/objcdoc/">objcdoc</a>
</ul>
<p><!--more--><br />
Feel free to use and modify the class in any way. Now off to the next step: learning the <a href="http://code.google.com/p/gdata-objectivec-client/">Google Data APIs Objective-C Client Library</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://yken.org/2009/01/14/parsing-the-command-line-in-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to get a real-time stock quote using Google API</title>
		<link>http://yken.org/2009/01/05/how-to-get-a-real-time-stock-quote-using-google-api/</link>
		<comments>http://yken.org/2009/01/05/how-to-get-a-real-time-stock-quote-using-google-api/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 22:39:28 +0000</pubDate>
		<dc:creator>ikendra</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[stocks]]></category>

		<guid isPermaLink="false">http://yken.org/2009/01/05/how-to-get-a-real-time-stock-quote-using-google-api/</guid>
		<description><![CDATA[After resolving the problem with authentication, I continued playing around with Google Finance API, using HTTP and XML. The API offers some nice functionality to retrieve user portfolio content, but it doesn&#8217;t take long to realize that there is no support for retrieving (real-time) stock quotes, probably for some good reason like licensing. But then, [...]]]></description>
			<content:encoded><![CDATA[<p>After resolving <a href="http://yken.org/2008/12/29/troubleshooting-401-with-googlelogin-authorization-header/">the problem with authentication</a>, I continued playing around with <a href="http://code.google.com/apis/finance/developers_guide_protocol.html">Google Finance API</a>, using HTTP and XML. The API offers some nice functionality to retrieve user portfolio content, but it doesn&#8217;t take long to realize that there is no support for retrieving (real-time) stock quotes, probably for some good reason like licensing. But then, there is a way of getting real-time stock quotes on your Google Spreadsheet using the GoogleFinance() formula. Can this fact get us closer to retrieving real-time stock quotes using Google Data API?</p>
<p><span id="more-71"></span><br />
Yes it can. It is relatively straightforward to write a simple program to retrieve real-time stock quote using just <a href="http://code.google.com/apis/spreadsheets/docs/2.0/developers_guide_protocol.html">Google Spreadsheet Data API</a>. Below is a simple proof-of-concept script which does the job. To make it work, create a new Spreadsheet on Google Docs and int the cell A1 fill in a formula for your favorite stock quote, something like:</p>
<pre>
=GoogleFinance("GOOG")
</pre>
<p>You will see the price in your spreadsheet:</p>
<p><img src="http://yken.org/wp-content/firefox-google-spreadsheet-sample.jpg" alt="Firefox Google Spreadsheet Sample" /></p>
<p>The script to retrieve the quote:</p>
<pre>
#!/bin/bash

wget -O ClientLogin.txt --no-check-certificate --post-file=post.txt \
"https://www.google.com/accounts/ClientLogin" &gt;/dev/null 2&gt;&amp;1

TOKEN=`cat ClientLogin.txt | grep Auth \
| sed "s#Auth=##" | xargs echo -n`

wget -O Spreadsheets.txt --header="Authorization: GoogleLogin auth=${TOKEN}" \
--header="GData-Version: 2" \
http://spreadsheets.google.com/feeds/spreadsheets/private/full &gt;/dev/null 2&gt;&amp;1

WORKSHEET=`cat Spreadsheets.txt | \
sed "s#\(.*\)src=\([']*\)\([^']*\)\([']\)\(.*\)#\3#"`

wget -O Worksheet.txt --header="Authorization: GoogleLogin auth=${TOKEN}" \
--header="GData-Version: 2" ${WORKSHEET} &gt;/dev/null 2&gt;&amp;1

cat Worksheet.txt | sed 's#\&gt;#\&gt;\
#g' &gt;WorksheetFormatted.txt

CELLSFEED=`cat WorksheetFormatted.txt | grep cellsfeed | \
sed "s#\(.*\)href=\([']*\)\([^']*\)\([']\)\(.*\)#\3#"`

wget -O Cells.txt --header="Authorization: GoogleLogin auth=${TOKEN}" \
--header="GData-Version: 2" ${CELLSFEED} &gt;/dev/null 2&gt;&amp;1

cat Cells.txt | sed 's#\&gt;#\&gt;\
#g' &gt;CellsFormatted.txt

REALTIMEQUOTE=`cat CellsFormatted.txt | grep numericValue | \
sed "s#\(.*\)numericValue=\([']*\)\([^']*\)\([']\)\(.*\)#\3#"`

echo "Quote = ${REALTIMEQUOTE}"
</pre>
<p>where post.txt is something like:</p>
<pre>
POST /accounts/ClientLogin HTTP/1.0
Content-type: application/x-www-form-urlencoded

accountType=HOSTED_OR_GOOGLE&amp;Email=__EMAIL__&amp;Passwd=__PASSWD__
&amp;service=finance&amp;source=yken.org-GoogleStockQuote-0.1
</pre>
<p><!--more--><br />
A few notes on the script:</p>
<ul>
<li>Replace __EMAIL__ and __PASSWD__ in post.txt with your Google credentials</li>
<li>This will only work when you have just one spreadsheet on your Google Docs</li>
<li>The script does not parse the XML replies, it just gets the values it needs using brute force (as it is just a proof of concept).</li>
<li>Three requests (four with login) just to get a quote is definitely over the top. The Google API allows batch operations, too.</li>
<li>I tried this on Max OS X 10.5 only</li>
</ul>
<p><!--more--><br />
To make the script actually useful, it would be good to modify it to take some parameters, for instance at least the desired stock symbol and then to use that stock symbol to write the =GoogleFinance() formula to A1. Google Data API allows it. This way, the script could be used for retrieving any quote (available on Google Finance), not only just the hardcoded one. Also, there are many <a href="http://code.google.com/apis/gdata/clientlibs.html">Google Data API Client Libraries</a> available, allowing to rewrite this script into something proper. I will try both and will post the result here.</p>
<p>Important note: all stock data obtained by the above script can be used for personal informational purposes only, see the <a href="http://www.google.com/intl/en/help/stock_disclaimer.html">Google disclaimer</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://yken.org/2009/01/05/how-to-get-a-real-time-stock-quote-using-google-api/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Troubleshooting 401 with GoogleLogin Authorization header</title>
		<link>http://yken.org/2008/12/29/troubleshooting-401-with-googlelogin-authorization-header/</link>
		<comments>http://yken.org/2008/12/29/troubleshooting-401-with-googlelogin-authorization-header/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 13:54:32 +0000</pubDate>
		<dc:creator>ikendra</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://yken.org/2008/12/29/troubleshooting-401-with-googlelogin-authorization-header/</guid>
		<description><![CDATA[I was writing a small script to retrieve some data from Google Finance using the relevant Google Data API. I&#8217;m writing a stand-alone, desktop application and have therefore used the ClientLogin username and password authentication. The login worked fine, I was receiving HTTP status 200 and the appropriate response with the authentication token. Yet any [...]]]></description>
			<content:encoded><![CDATA[<p>I was writing a small script to retrieve some data from <a href="http://finance.google.com/">Google Finance</a> using the relevant Google Data API. I&#8217;m writing a stand-alone, desktop application and have therefore used the ClientLogin username and password authentication. The login worked fine, I was receiving HTTP status 200 and the appropriate response with the authentication token. Yet any subsequent attempt to use the Data API (to insance to retrieve the portfolio data) failed with HTTP 401 Token Invalid error.</p>
<p><span id="more-70"></span><br />
It turned out hat the cause of getting the 401 error was in the way I set up the Authorization header sent with my requests. Unlike with AuthSub Authorization header used for web applications, the token value for ClientLogin authentication must not be enclosed in (double-)quotes. This is a mistake easy to make when switching from AuthSub to ClientLogin, resulting in HTTP status 401 reply for any Data API request. Remove the quotes around the token and the Data API request will work fine.<br />
<!--more--><br />
A small sample:</p>
<pre>
#!/bin/bash

if [ -e ClientLogin ]
then
&nbsp;&nbsp;rm ClientLogin
fi

wget --no-check-certificate --post-file=post.txt \
https://www.google.com/accounts/ClientLogin

TOKEN=`cat ClientLogin | grep Auth | \
sed "s#Auth=##" | xargs echo -n`

wget --header="Authorization: GoogleLogin auth=${TOKEN}" \
http://finance.google.com/finance/feeds/default/portfolios</span>
</pre>
<p>where post.txt is something like:</p>
<pre>
POST /accounts/ClientLogin HTTP/1.0
Content-type: application/x-www-form-urlencoded

accountType=HOSTED_OR_GOOGLE&amp;Email=__EMAIL__&amp;Passwd=__PASSWD__
&amp;service=finance&amp;source=yken.org-learningGoogleAPI-0.1</span>
</pre>
<p>Replace __EMAIL__ and __PASSWD__ with appropriate value. When the script is finished, you will have the relevant portfolio information saved in the &#8220;portfolio&#8221; file.</p>
]]></content:encoded>
			<wfw:commentRss>http://yken.org/2008/12/29/troubleshooting-401-with-googlelogin-authorization-header/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby, Rails and httpd on Fedora 8</title>
		<link>http://yken.org/2008/10/18/ruby-rails-and-httpd-on-fedora-8/</link>
		<comments>http://yken.org/2008/10/18/ruby-rails-and-httpd-on-fedora-8/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 22:18:54 +0000</pubDate>
		<dc:creator>ikendra</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://yken.org/2008/10/18/ruby-rails-and-httpd-on-fedora-8/</guid>
		<description><![CDATA[Just a short summary of how to install Ruby on Rails framework on Fedora 8 and how to configure it to work with Apache 2. Perhaps this might come handy to someone.
 1. Install Ruby programming language and Rails framework

$ sudo yum install ruby
$ sudo gem install rails  --include-dependencies

2. Install header files and libraries [...]]]></description>
			<content:encoded><![CDATA[<p>Just a short summary of how to install Ruby on Rails framework on Fedora 8 and how to configure it to work with Apache 2. Perhaps this might come handy to someone.</p>
<p><span id="more-68"></span> 1. Install Ruby programming language and Rails framework</p>
<pre>
$ sudo yum install ruby
$ sudo gem install rails  --include-dependencies
</pre>
<p>2. Install header files and libraries for building extension libraries for Ruby</p>
<pre>
$sudo yum install ruby-devel
</pre>
<p>3. Download and install <a href="http://www.modrails.com/">Passenger</a>, an Apache module for deployment Ruby on Rails applications on Apache. When running &#8220;passenger-install-apache2-module&#8221;, follow the instructions on the screen to solve any problems (the installer is friendly and helpful).</p>
<pre>
$ sudo gem install passenger
$ passenger-install-apache2-module
</pre>
<p>4. Create a sample Ruby on Rails application</p>
<pre>
$ cd ~/public_html
$ rails  demo
</pre>
<p>5. That&#8217;s it, you should now be able to access your Ruby on Rails application on localhost using web browser</p>
<p><!--more--></p>
<p><img src="http://yken.org/wp-content/ruby-on-rails-on-apache.jpg" alt="Ruby on Rails application on Apache" /></p>
]]></content:encoded>
			<wfw:commentRss>http://yken.org/2008/10/18/ruby-rails-and-httpd-on-fedora-8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Visualising a sprint</title>
		<link>http://yken.org/2007/04/22/visualising-a-sprint/</link>
		<comments>http://yken.org/2007/04/22/visualising-a-sprint/#comments</comments>
		<pubDate>Sun, 22 Apr 2007 00:01:53 +0000</pubDate>
		<dc:creator>ikendra</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[TomTom]]></category>

		<guid isPermaLink="false">http://yken.org/2007/04/21/visualising-a-sprint/</guid>
		<description><![CDATA[It&#8217;s been two weeks since the Scrum Master training by Jeff Sutherland. The freshly certified Scrum Masters returned back to the office and started spreading the knowledge (and enthousiasm) immediatelly. (The secret handskahe would not escape the attention of a careful observer, either).

 At Desktop &#38; Services department at TomTom we have been practicing the [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been two weeks since the <http:>Scrum Master training by Jeff Sutherland. The freshly certified Scrum Masters returned back to the office and started spreading the knowledge (and enthousiasm) immediatelly. (The secret handskahe would not escape the attention of </http:>a careful observer<http:>, either).</http:></p>
<p><span id="more-21"></span></p>
<p><img src="http://yken.org/wp-content/scrum_board_plus_team_2007_04.jpg" alt="A scrum board sample" /> At Desktop &amp; Services department at TomTom we have been practicing the agile approach to developing software for a while already. Morning stand-up meetings, timeboxed sprints&#8230; our team worked like this for nearly nine months. While we did get the basics more less right, some essentials we were still missing. So we started working on resolving them. Besides resolving the major issues, we also started changing small details of how we worked. One of such changes was the way we visualise a sprint. Seemingly a trivial change proved to be a quite important one. Until the last sprint, I&#8217;ve always been wondering how to administer the sprint tasks the way that (1) all team mebmers could get easy overview of the status of all tasks, (2) the product owners could review the status without having to talk to the Scrum Master, (3) Scrum Master could avoid mailing the information around or engage in daily task list printouts.</p>
<p><!--more--></p>
<p>We used to use the MS Project to plan the sprints. Using the MS Project proved to have many limitations: the waterfall Gantt chart being generated for anything we planned, sharing the status of the sprint always involved printouts and the printouts which were becoming obsolete in matter of hours. Editing the source file by more than one person at time was impossible. With the developers starting to use various flavors of operating systems on their work stations, we finally decided to ditch using this proprietary tool (and to save a tree, too!). A brief experience with using the MS Excel brought exactly the same problems. Jira served us well all that time to work with bugs, using it for documenting the spritns didn&#8217;t really work either.</p>
<p><!--more--></p>
<p>The answer to all above problems was&#8230; the Scrum Board! Jeff showed us some sample photographs and we also found great inspiration in Henrik Kniberg&#8217;s <a href="http://www.crisp.se/henrik.kniberg/ScrumAndXpFromTheTrenches.pdf">&#8220;Scrum and XP from the Trenches&#8221;</a>. We&#8217;ve confiscated an unused white board and turned it into a Scrum Board in no time. The result? Everyone can now clearly see the status of the work items. No print outs or status reports needed anymore. This really saves us a considerable deal of time. The burndown chart is a great velocity indicator and a good source of motivation, too. And last but not least &#8211; the developers are having fun working with it.</p>
<p><!--more--></p>
<p>We completed our first sprint using the Scrum Board. It is clear that we will continue using it for time being!</p>
]]></content:encoded>
			<wfw:commentRss>http://yken.org/2007/04/22/visualising-a-sprint/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Enpower the developer</title>
		<link>http://yken.org/2007/04/04/enpower-the-developer/</link>
		<comments>http://yken.org/2007/04/04/enpower-the-developer/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 22:01:51 +0000</pubDate>
		<dc:creator>ikendra</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[TomTom]]></category>

		<guid isPermaLink="false">http://yken.org/2007/04/04/scrum-master-training/</guid>
		<description><![CDATA[In the software development world there is one word which cannot be overlooked, especially in the past few years. The word is &#8220;agile&#8221;. Aiming to make the software development effective by freeing the spirit and fueling the talents and motvations of software developers, agile methods offer an alternative to the &#8220;tyranny of the waterfall&#8221; or [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://yken.org/wp-content/jeff-speaks-400.jpg" title="Jeff Sutherland" class="alignleft"><img src="http://yken.org/wp-content/jeff-speaks-400.thumbnail.jpg" alt="Jeff Sutherland" /></a>In the software development world there is one word which cannot be overlooked, especially in the past few years. The word is &#8220;agile&#8221;. Aiming to make the software development effective by freeing the spirit and fueling the talents and motvations of software developers, agile methods offer an alternative to the &#8220;tyranny of the waterfall&#8221; or the &#8220;illusion of command and controll&#8221; of the software development managers. Being a software team leader and developer myself, I&#8217;ve been for some time looking for the tools to fight the inherently unpredictible and unknowable factors in the software development. I&#8217;ve been looking until I learned the &#8220;a-word&#8221; a year ago and started trying it out soon after.</p>
<div style="clear:both;"></div>
<p><span id="more-13"></span>This week, I was lucky to be able to attend the Scrum sessions by <a href="http://en.wikipedia.org/wiki/Jeff_Sutherland">Jeff Sutherland</a>, agile systems architect and one of the co-creators of the Scrum software development processes. Jeff, currently travelling the globe with the Scrum Certification World Tour, proved to be a skilled expert and a charismatic speaker. There is no point to enumerate here what everything we&#8217;ve learned during the sessions &#8211; there are numerous books and papers out there. For me personally, two things were important to learn:</p>
<p><!--more--> (1) The success of using Scrum by a development team highly depends on whether the business (the product owners) understand how team works and why the team works the way it does. If the agile way of making software was introduced bottom-up, go ahead and talk to the business, educate them, argument, involve them! (2) A great deal of the agile methods is about people and about transparency. Enpower the people, forget about being directive, become the facilitator. Do not assign tasks, make the team to be hungry for them.</p>
<p><!--more-->Jeff had demonstrated that it might take as little as just a single Scrum Master to spark the rebuilding of whole organization to work in an effective, agile way. I wonder how successful can we be in such transformation of development processes at TomTom where I work, I look forward to the challenge.</p>
<p><!--more-->At the end of the Scrum sessions we learned one more important thing: the Scrum Master secret handshake. Now I can no doubt recognize the great Scrum Masters around. To learn what the secret handshake is, you&#8217;ve got to attend some of Jeff&#8217;s sessions &#8211; I highly recommend!</p>
]]></content:encoded>
			<wfw:commentRss>http://yken.org/2007/04/04/enpower-the-developer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
