<?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>Utahcon.com &#187; PHP</title>
	<atom:link href="http://blog.utahcon.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.utahcon.com</link>
	<description></description>
	<lastBuildDate>Wed, 25 Jan 2012 14:18:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Get Your Advent On!</title>
		<link>http://blog.utahcon.com/uncategorized/get-your-advent-on?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=get-your-advent-on</link>
		<comments>http://blog.utahcon.com/uncategorized/get-your-advent-on#comments</comments>
		<pubDate>Thu, 15 Dec 2011 14:56:47 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[advent]]></category>
		<category><![CDATA[Christmas]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[planet]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=803</guid>
		<description><![CDATA[Learning is so important in my industry (programming and computers in general) that you can never look at a learning opportunity as wasted time. Also it is the Christmas season, and people do Advent things&#8230; so I present the Advent list. All these sites have Advents going on that teach tips and tricks for different [...]]]></description>
			<content:encoded><![CDATA[<p>Learning is so important in my industry (programming and computers in general) that you can never look at a learning opportunity as wasted time. Also it is the Christmas season, and people do Advent things&#8230; so I present the Advent list. All these sites have Advents going on that teach tips and tricks for different languages.</p>
<ul>
<li>PHP Advent - <a href="http://phpadvent.org/2011">http://phpadvent.org/2011</a></li>
<li>24 Ways &#8211; Design and Development<a href="http://24ways.org/">http://24ways.org/</a></li>
<li>Performance Planet - <a href="http://calendar.perfplanet.com/2011/">http://calendar.perfplanet.com/2011/</a></li>
<li>Ad Font - <a href="http://2011.adfont-calendar.com/">http://2011.adfont-calendar.com/</a></li>
<li>Mozilla Developer Network - <a href="http://thewebrocks.com/calendar/">http://thewebrocks.com/calendar/</a></li>
<li>Perl Advent - <a href="http://perladvent.org/2011/">http://perladvent.org/2011/</a></li>
<li>HTML5 and CSS3 - <a href="http://html5advent2011.digitpaint.nl/">http://html5advent2011.digitpaint.nl/</a></li>
<li>12 Devs of Christmas - <a href="http://www.12devsofxmas.co.uk/">http://www.12devsofxmas.co.uk/</a></li>
</ul>
<p>I hope you find these handy, and learn a thing of two!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/uncategorized/get-your-advent-on/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MyGeekScore++</title>
		<link>http://blog.utahcon.com/computers/code/mygeekscore?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mygeekscore</link>
		<comments>http://blog.utahcon.com/computers/code/mygeekscore#comments</comments>
		<pubDate>Fri, 15 Jul 2011 20:05:53 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[FuelPHP]]></category>
		<category><![CDATA[Fuel]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Oil]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[planet]]></category>
		<category><![CDATA[Source Control]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=742</guid>
		<description><![CDATA[Ah yeah! I have finally done it! I have forked, committed, pushed, sent a pull request and now&#8230; I HAVE BEEN MERGED! 12:25 &#60; Fuel-Bot&#62; [oil] philsturgeon pushed 2 new commits to master: https://github.com/fuel/oil/compare/a8e1387&#8230;4be84aa                                                   eighty4 12:25 &#60; Fuel-Bot&#62; [oil/master] Making more use of the Form::label() in the scaffold builds &#8211; Adam Barrett                                                                    el2ro 12:25 &#60; [...]]]></description>
			<content:encoded><![CDATA[<p>Ah yeah! I have finally done it! I have forked, committed, pushed, sent a pull request and now&#8230; I HAVE BEEN MERGED!</p>
<blockquote><p>12:25 &lt; Fuel-Bot&gt; [oil] philsturgeon pushed 2 new commits to master: https://github.com/fuel/oil/compare/a8e1387&#8230;4be84aa                                                   eighty4<br />
12:25 &lt; Fuel-Bot&gt; [oil/master] Making more use of the Form::label() in the scaffold builds &#8211; Adam Barrett                                                                    el2ro<br />
12:25 &lt; Fuel-Bot&gt; [oil/master] Merge pull request #18 from utahcon/master &#8211; Phil Sturgeon</p></blockquote>
<p>Today at 12:25MST <a href="https://github.com/fuel/oil/pull/18">my pull request for Oil</a> was <a href="https://github.com/fuel/oil/commit/4be84aaea6acb92464dbd92dda94a7b22478f8e1">merged into the master line</a>, which means it is gold!</p>
<p><strong>$geekScore++;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/computers/code/mygeekscore/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FuelPHP: My new favorite framework</title>
		<link>http://blog.utahcon.com/computers/code/frameworks/fuelphp/fuelphp-my-new-favorite-framework?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fuelphp-my-new-favorite-framework</link>
		<comments>http://blog.utahcon.com/computers/code/frameworks/fuelphp/fuelphp-my-new-favorite-framework#comments</comments>
		<pubDate>Wed, 06 Jul 2011 16:23:32 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[FuelPHP]]></category>
		<category><![CDATA[1 Tech Post Challenge]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[planet]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=693</guid>
		<description><![CDATA[I have posted on FuelPHP once before, and I think it is time I share more about it and why I have chosen it as my PHP Framework of choice. From FuelPHP.com: Fuel is a simple, flexible, community driven PHP 5.3 web framework based on the best ideas of other frameworks with a fresh start. [...]]]></description>
			<content:encoded><![CDATA[<p>I have posted on FuelPHP once before, and I think it is time I share more about it and why I have chosen it as my PHP Framework of choice.</p>
<p>From FuelPHP.com:</p>
<blockquote><p>Fuel is a simple, flexible, community driven PHP 5.3 web framework based on the best ideas of other frameworks with a fresh start.</p></blockquote>
<p>How much clearer can they get?</p>
<h2>The Geeks Behind FuelPHP</h2>
<p>Dan Horrigan, Phil Sturgeon, Jelmer Schreuder and Harro Verton. If those names mean nothing to you, let me shed some light.</p>
<p><strong>Dan Horrigan</strong></p>
<p>Coding in PHP for 10+ years Dan has contributed to projects like CodeIgniter and PyroCMS, as well as PancakeApp.</p>
<p><strong>Phil Sturgeon</strong></p>
<p>Another great mind behind CodeIgniter. Just look at <a href="http://philsturgeon.co.uk/blog">Phil&#8217;s blog</a>, he has done it all!</p>
<p><strong>Jelmer Schreuder</strong></p>
<p><strong></strong>Look through <a href="https://github.com/jschreuder">Jelmer&#8217;s Github</a> and you can see he is quite experienced as well. He is also super friend in the #fuelphp channel on Freenode.</p>
<p><strong>Harro Verton aka WanWizard</strong></p>
<p><strong></strong>After a long and sordid past as a mainframer he has found roots in programming and contributes a lot of support in #fuelphp as well. He has personally helped me through some of the beginning steps of using FuelPHP.</p>
<p>To all the geeks involved in FuelPHP, a huge thanks!</p>
<h2>What Make Fuel Different?</h2>
<p>Fuel is young, under a year as of this writing, but already it has seen support and contributions from 30+ developers. The maintainers are really open to anyone committing code cause they believe that since we all use it, we all deserve to support it. Or something like that. Basically if you use it and identify a bug, and you can fix it, then they will let you.</p>
<p>That is probably the best thing about this young framework is the amount of involvement everyone has. Being open source and hosted on GitHub anyone can get the source, and anyone can submit a pull request for changes to the code. I have personally been watching the commits in the IRC channel and I can attest that they are sincere in saying that things are getting done. And fast!</p>
<h2>What Make Fuel Awesome?</h2>
<p>Gleaming from other great frameworks (and languages) Fuel has been given some great tools. Like Oil.</p>
<p><strong>Oil</strong></p>
<p><strong></strong>Oil is a utility for the CLI that allows you to Generate code, Refine (run tasks, more on this later),  Package (install, update and remove packages) and Console (test code).</p>
<p><strong>Tasks</strong></p>
<p>Tasks are classes that can be run through the command line or set up as a cron job. They are generally used for background processes, timed tasks and maintenance tasks. Tasks can calls models and other classes just like controllers.</p>
<p>Because Tasks actually use the whole framework you can write scripts using the native language of FuelPHP and all things work. All the controllers, all the helpers etc are available to the user.</p>
<p><strong>Lightweight</strong></p>
<p>Autoloading is fun, and useful, but you don&#8217;t want to load everything everywhere. Fuel has an extensive (and configurable) configuration to allow you to only load what you want when you want.</p>
<p><strong>Docs</strong></p>
<p>The <a href="http://fuelphp.com/docs/">documentation</a> is a ongoing project, and no where near perfect right now, but it certainly is coming along. Don&#8217;t take that to mean it isn&#8217;t helpful, cause it absolutely is! Also you can update the docs and commit the changes to the project <img src='http://blog.utahcon.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>ORM and Active Record or just DB</strong></p>
<p>ORM has been done, and done again. FuelPHP has an ORM, or you can opt for ActiveRecord, or if you don&#8217;t like either of those you can just use good old SQL. Fuel is flexible and this is a great example of how flexible they really are.</p>
<h2>Why Not?!</h2>
<p>If you haven&#8217;t been sold by my simple blog post on Fuel, then perhaps you need to play with the framework yourself. You can get it from http://fuelphp.com or  from GitHub.</p>
<p><strong>What&#8217;s Next?</strong></p>
<p>I am working on a series of blog posts showing how to do things with FuelPHP, so keep tuned for those.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/computers/code/frameworks/fuelphp/fuelphp-my-new-favorite-framework/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>State of Zend Framework 2.0</title>
		<link>http://blog.utahcon.com/uncategorized/state-of-zend-framework-2-0?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=state-of-zend-framework-2-0</link>
		<comments>http://blog.utahcon.com/uncategorized/state-of-zend-framework-2-0#comments</comments>
		<pubDate>Fri, 04 Jun 2010 21:03:20 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[planet]]></category>
		<category><![CDATA[ZF2.0]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=497</guid>
		<description><![CDATA[Matthew Weier O&#8217;Phinney has posted about the State of Zend Framework 2.0: The past few months have kept myself and my team quite busy, as we&#8217;ve turned our attentions from maintenance of the Zend Framework 1.X series to Zend Framework 2.0. I&#8217;ve been fielding questions regularly about ZF2 lately, and felt it was time to [...]]]></description>
			<content:encoded><![CDATA[<p>Matthew Weier O&#8217;Phinney has posted about the State of Zend Framework 2.0:</p>
<blockquote><p>The past few months have kept myself and my team quite busy, as we&#8217;ve turned our attentions from maintenance of the Zend Framework 1.X series to Zend Framework 2.0. I&#8217;ve been fielding questions regularly about ZF2 lately, and felt it was time to talk about the roadmap for ZF2, what we&#8217;ve done so far, and how the community can help.</p></blockquote>
<p>He goes on to talk about the processes being taken to get Zf2.0 the exemplar of PHP 5.3 and to add namespaces to the project. He talks about his team, the road map and the struggles they have already expereienced:</p>
<blockquote><p>After completing this process, my entire team &#8212; all three of us &#8212; started the work of migrating the code to namespaces. <a href="http://ralphschindler.com">Ralph</a> wrote a tool that scanned the library and created a map file of existing classes and suggested namespace/classname combinations. We then used this tool as a launching point for the migration, each of us working on a component at a time. This work was by no means automated &#8212; we discovered very quickly that such a tool only took care of the most cursory work. <a href="http://weierophinney.net/matthew/archives/237-A-Primer-for-PHP-5.3s-New-Language-Features.html">I detailed some of our findings a couple months back</a>; we ran into a number of issues we never anticipated, and the progress has been far from speedy. At this point, however, we have migrated everything but the<code>Zend_Service</code> classes, the MVC, and those components that build on top of the MVC (Application, Navigation, Form, etc.).</p></blockquote>
<p>Finally he shares details about getting ZF2.0 available through Git and Github, and what the community can do to help:</p>
<blockquote><p>A number of contributors are also starting to discuss rewrites and refactoring of components. Much of this is being done on the zf-contributors mailing list, and some on the #zftalk.dev channel on Freenode. If you are interested in contributing, I highly recommend subscribing to the list and dropping into the channel when you can.</p></blockquote>
<p>You can read the post in it&#8217;s entirety at  <a href="http://weierophinney.net/matthew/index.php?url=archives/241-State-of-Zend-Framework-2.0.html&amp;serendipity[cview]=linear#comments" target="_blank">http://weierophinney.net</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/uncategorized/state-of-zend-framework-2-0/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP, Soap and WSDL Caching</title>
		<link>http://blog.utahcon.com/computers/code/php-soap-and-wsdl-caching?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-soap-and-wsdl-caching</link>
		<comments>http://blog.utahcon.com/computers/code/php-soap-and-wsdl-caching#comments</comments>
		<pubDate>Tue, 16 Feb 2010 15:27:10 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[planet]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[wsdl]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=367</guid>
		<description><![CDATA[Today I was offered a free lesson in how PHP handles Soap, and more specifically WSDL caching. When you instantiate a PHP Soap Class you pass it a WSDL (Web Services Description Language) and it looks like this: Depending on how your caching is setup, this will go out to the WSDL provided, pull in [...]]]></description>
			<content:encoded><![CDATA[<p>Today I was offered a free lesson in how PHP handles Soap, and more specifically WSDL caching.</p>
<p>When you instantiate a PHP Soap Class you pass it a WSDL (Web Services Description Language) and it looks like this:</p>
<pre class="brush: php; title: ; notranslate">

$client = new SoapClient('http://example.com/services/thescript.php?wsdl');
</pre>
<p>Depending on how your caching is setup, this will go out to the WSDL provided, pull in the document and store it in a cache. The default cache for PHP is 86400 seconds. If you are familiar with time in seconds you know that that is 24 hours. So by default you only actually read the WSDL once in a 24 hour period. Normally this is not a problem.</p>
<h2>What is a WSDL?<strong><br />
</strong></h2>
<p>For that answer let&#8217;s turn to the W3 site:</p>
<blockquote><p>WSDL is an XML format for describing network services as a set of endpoints operating on messages containing either document-oriented or procedure-oriented information.</p></blockquote>
<p>So in English that means it is a map to the services provided by the provider. Basically you get a copy of the map, and follow the endpoints to the answers you need.</p>
<p>One basic function of this is that it tells you want methods (services) are available on your fresh client.</p>
<h2>When WSDLs go bad</h2>
<p>So today one of my providers, without warning, updated their WSDL. This wreaked havoc on my system because I had cached the WSDL on my side for 24 hours (remember, the PHP default). The change was a super simple change, a change in URL for a service, that&#8217;s it!</p>
<p>The problem was that since PHP had already read the file within 24 hours it didn&#8217;t care that there was a new file, that the URLs had changed, and so it continued to work as it had before.</p>
<p>The real problem wasn&#8217;t that the URLs changed, that would have been fine if the provider hadn&#8217;t shut off the previously reported URLs.</p>
<h2>Turn off the cache</h2>
<p>So you are left with two options when something like this happens. First, you can sit and wait up to 24 hours for the problem to fix itself. This was not an option for us. The second is to clear your cache and try again.</p>
<p>Now PHP (on Linux) stores the cache for the Soap WSDL in /tmp and I wasn&#8217;t sure which one of the many files was the actual cache for this particular provider so I decided I would have to tell PHP to not cache the WSDL and try again.</p>
<p>Into php.ini I went, located the <em>soap.wsdl_cache_enabled</em> flag. I changed it from 0 to 1</p>
<pre class="brush: plain; title: ; notranslate">

soap.wsdl_cache_enabled=0
</pre>
<p>I saved the file and restarted Apache.</p>
<p>The service continued to fail. I was perplexed. I thought maybe I flubbed the save so I opened the php.ini again located my line and it was fine. So I looked around there to see if maybe I missed another important flag. The only thing I could find was <em>soap.wsdl_cache_ttl</em> listed as the &#8220;(time to live) Sets the number of second while cached file will be used instead of original one&#8221; I promptly changed this to 0 as well</p>
<pre class="brush: plain; title: ; notranslate">

soap.wsdl_cache_ttl=0
</pre>
<p>Restarted Apache, and finally my script stopped failing.</p>
<p>I have since re-enabled my cache ttl and enabled flags, as reading the WSDL every time is a resource hog that doesn&#8217;t need to be in place.</p>
<h2>The Lesson Learned</h2>
<p>The lesson learned by all today is be aware of your caching, and be aware of the changes you make to your live/production systems.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/computers/code/php-soap-and-wsdl-caching/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Matt announces WordPress Foundation is Live</title>
		<link>http://blog.utahcon.com/socialmedia/matt-announces-wordpress-foundation-is-live?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=matt-announces-wordpress-foundation-is-live</link>
		<comments>http://blog.utahcon.com/socialmedia/matt-announces-wordpress-foundation-is-live#comments</comments>
		<pubDate>Fri, 22 Jan 2010 13:16:56 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Matt Mullenweg]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[planet]]></category>
		<category><![CDATA[WordCamp]]></category>
		<category><![CDATA[WordPress Foundation]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=332</guid>
		<description><![CDATA[It looks like Matt and company have been busy getting things lined up for the WordPress Foundation, a non-profit with the goal: &#8220;to ensure free access, in perpetuity, to the projects we support&#8221; From the About page: The WordPress Foundation is a charitable organization founded by Matt Mullenweg to further the mission of the WordPress [...]]]></description>
			<content:encoded><![CDATA[<p>It looks like <a href="http://ma.tt/2010/01/wordpress-foundation/" target="_blank">Matt</a> and <a href="http://wordpress.org/development/2010/01/wordpress-foundation" target="_blank">company</a> have been busy getting things lined up for the <a href="http://wordpressfoundation.org/" target="_blank">WordPress Foundation</a>, a non-profit with the goal:</p>
<blockquote><p>&#8220;to ensure free access, in perpetuity, to the projects we support&#8221;</p></blockquote>
<p>From the About page:</p>
<blockquote><p>The WordPress Foundation is a charitable organization founded by Matt Mullenweg to further the mission of the WordPress open source project: to democratize publishing through Open Source, <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a> software.</p>
<p>The point of the foundation is to ensure free access, in perpetuity, to the projects we support. People and businesses may come and go, so it is important to ensure that the source code for these projects will survive beyond the current contributor base, that we may create a <strong>stable platform for web publishing for generations to come</strong>. As part of this mission, the Foundation will be responsible for protecting the WordPress, WordCamp, and related trademarks. A 501(c)3 non-profit organization, the WordPress Foundation will also pursue a charter to educate the public about WordPress and related open source software.</p></blockquote>
<p>I have long been a fan of WordPress, and now even more so. I am always amazed at the things that Matt and company come up with to move forward the power of WordPress.</p>
<p>For all those true WordPress geeks out there, the new site is running the WordPress 3.0 development version.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/socialmedia/matt-announces-wordpress-foundation-is-live/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP and Josso &#8211; Transparency Rocks!</title>
		<link>http://blog.utahcon.com/computers/code/php-and-josso-transparency-rocks?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-and-josso-transparency-rocks</link>
		<comments>http://blog.utahcon.com/computers/code/php-and-josso-transparency-rocks#comments</comments>
		<pubDate>Wed, 20 Jan 2010 22:15:38 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Josso]]></category>
		<category><![CDATA[planet]]></category>
		<category><![CDATA[Single Signon]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=315</guid>
		<description><![CDATA[Bogdan recently asked in my comments: I can&#8217;t seem to find a call like josso_authenticate($name, $pass), returning an array to be appended to user&#8217;s SESSION. I was expecting such a method, because SOAP is already used everywhere, so it shouldn&#8217;t be too hard implementing this. Has anyone had success implementing this kind of &#8220;transparent&#8221; login? [...]]]></description>
			<content:encoded><![CDATA[<p>Bogdan recently asked in my comments:</p>
<blockquote><p>I can&#8217;t seem to find a call like josso_authenticate($name, $pass), returning an array to be appended to user&#8217;s SESSION. I was expecting such a method, because SOAP is already used everywhere, so it shouldn&#8217;t be too hard implementing this.</p>
<p>Has anyone had success implementing this kind of &#8220;transparent&#8221; login?</p></blockquote>
<p>JOSSO simply doesn&#8217;t make it easy to log people in with a single call. Instead you need to make an interface to the API to do so. I just so happen to have an example of such a wrapper function.</p>
<p><span id="more-315"></span></p>
<h2>Logging In A User</h2>
<p>To do everything and make it easy for future reuse I built two classes. The first is a Login Class and the second a Josso Class (below). My Login Class is pretty sparse, but it includes a wrapper to handle all the tasks required to login a user through Josso and get back the Josso details for that user.</p>
<p>The full code of each class is down at the bottom of the post, just expand the code block, but here is the function that is really what you are looking for Login-&gt;authorize()</p>
<h2>Login-&gt;authorize()</h2>
<pre class="brush: php; title: ; notranslate">public function authorize($username, $password){

 # make sure we have a valid username
 if(empty($username)){
 # return invalid username
 throw new LoginException('Invalid username');
 } else {
 $this-&gt;username = $username;
 }

 # make sure we have a valid password
 if(empty($password)){
 # return invalid username
 throw new LoginException('Invalid password');
 }

 # check that user exists
 if( ! $this-&gt;josso-&gt;userExists($this-&gt;username)){
 throw new LoginException('Invalid username');
 }

 # check Josso with username and password
 $this-&gt;assertion = $this-&gt;josso-&gt;assertIdentityWithSimpleAuthentication($username, $password);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Invalid username/password combination');
 }

 # resolve Authentication Assertion
 $this-&gt;token = $this-&gt;josso-&gt;resolveAuthenticationAssertion($this-&gt;assertion);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;session = $this-&gt;josso-&gt;getSession($this-&gt;token);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;user = $this-&gt;josso-&gt;findUserInSession($this-&gt;token);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;cleanUpUser();

 $this-&gt;roles = $this-&gt;josso-&gt;findRolesByUsername($this-&gt;username);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;cleanUpRoles();

 $this-&gt;user-&gt;sosPermissions =&amp; $this-&gt;roles;
 }</pre>
<h2>What That Actually Did</h2>
<p>As you can see you simply pass the $username and $password to the function and it runs through a ton of work for you.</p>
<p>First it validates the input, make sure you aren&#8217;t working for no reason.</p>
<p>Next it makes sure the <strong><em>userExists()</em></strong>, this will save you heartache later when JOSSO pretends a user exists, but really doesn&#8217;t.</p>
<p>Then I <strong><em>asserIdentityWithSimpleAuthentication()</em></strong> which literally means I pass those to JOSSO and wait for an answer. The answer returned is an <strong>assertion_id</strong>, which really doesn&#8217;t mean anything.</p>
<p>You then take the <strong>assertion_id</strong> returned and call <strong><em>resolveAuthenticationAssertion()</em></strong>, this will return your <strong>session_id</strong> if the login was valid.</p>
<p>With the <strong>session_id</strong> you call <em><strong>getSession()</strong></em>. This returns all the details of the session that JOSSO now has open. This varies depending on who setup your JOSSO implementation but you should have an identifying is (user_id) if nothing else.</p>
<p>I go on to make sure that JOSSO hasn&#8217;t forgotten anything by calling <em><strong>findUserInSession()</strong></em>, which literally just tells me who I am supposed to be working with.</p>
<p>The <em><strong>cleanUpUser()</strong></em> you could probably ignore, but our system returns an object with dots ( . ) in the name and I can&#8217;t stand that, so I change them to underscores ( _ ).</p>
<p>Finally I call back to my JOSSO install to get any roles the user has, again this will vary if your JOSSO doesn&#8217;t handle roles.</p>
<h2>Login Class</h2>
<pre class="brush: php; collapse: true; light: false; title: ; toolbar: true; notranslate">

class Login {

 public $token;
 public $username;
 public $session;
 public $roles;
 public $user;
 public $request;
 private $assertion;
 # this will hold the instance of Josso Controller we need
 private $josso;

 function Login($request = null){

 $this-&gt;josso = new Josso;
 if(!empty($request)){
 $this-&gt;request = $request;
 }
 }

 #validate an existing token
 public function validateToken($user_token){
 $session = $this-&gt;josso-&gt;accessSession($user_token);

 /*
 * For whatever reason Josso returns nothing if the session is valid
 * and the operation has been completed.
 */
 if( empty($session)){
 return true;
 }

 if($this-&gt;josso-&gt;error){
 throw new LoginException('Internal Error [Login]: '. __LINE__);
 }
 return false;
 }

 # authorize a user with password
 public function authorize($username, $password){

 # make sure we have a valid username
 if(empty($username)){
 # return invalid username
 throw new LoginException('Invalid username');
 } else {
 $this-&gt;username = $username;
 }

 # make sure we have a valid password
 if(empty($password)){
 # return invalid username
 throw new LoginException('Invalid password');
 }

 # check that user exists
 if( ! $this-&gt;josso-&gt;userExists($this-&gt;username)){
 throw new LoginException('Invalid username');
 }

 # check Josso with username and password
 $this-&gt;assertion = $this-&gt;josso-&gt;assertIdentityWithSimpleAuthentication($username, $password);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Invalid username/password combination');
 }

 # resolve Authentication Assertion
 $this-&gt;token = $this-&gt;josso-&gt;resolveAuthenticationAssertion($this-&gt;assertion);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;session = $this-&gt;josso-&gt;getSession($this-&gt;token);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;user = $this-&gt;josso-&gt;findUserInSession($this-&gt;token);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;cleanUpUser();

 $this-&gt;roles = $this-&gt;josso-&gt;findRolesByUsername($this-&gt;username);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;cleanUpRoles();

 $this-&gt;user-&gt;sosPermissions =&amp; $this-&gt;roles;
 }

 public function createLoginFromToken($token){

 $this-&gt;user = $this-&gt;josso-&gt;findUserInSession($token);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;cleanUpUser();

 $this-&gt;roles = $this-&gt;josso-&gt;findRolesByUsername($this-&gt;user-&gt;name);
 if($this-&gt;josso-&gt;error){
 throw new LoginException('Interal Error [Login]: '. __LINE__);
 }

 $this-&gt;cleanUpRoles();

 $this-&gt;user-&gt;sosPermissions =&amp; $this-&gt;roles;
 }

 # get a Josso hashed version of a password
 public function getPassHash($password){
 $passhash = $this-&gt;josso-&gt;getPassHash($password);
 return $passhash;
 }

 # acquire roles for the user from josso
 public function getUserRoles(){
 return $this-&gt;roles;
 }

 # send the signal to Josso to signoff (closes all sessions)
 public function signoff($session_id = null){
 if( ! $session_id &amp;&amp; ! $this-&gt;session-&gt;id){
 return false;
 }

 if(!$session_id){
 if(!empty($this-&gt;session)){
 if($this-&gt;josso-&gt;globalSignoff($this-&gt;session-&gt;id)){
 return true;
 }
 } else {
 return false;
 }
 } else {
 if($this-&gt;josso-&gt;globalSignoff($session_id)){
 return true;
 }
 }
 return false;
 }

 private function cleanUpUser(){
 if(!empty($this-&gt;user)){
 foreach($this-&gt;user-&gt;properties as $prop =&gt; $details){
 $name = $details-&gt;name;
 if($pos = strpos($name, '.')){
 $name = explode('.',$name);
 $name = $name[0] . ucwords($name[1]);
 }
 $this-&gt;user-&gt;$name = $details-&gt;value;
 }
 unset($this-&gt;user-&gt;properties);
 }
 }

 private function cleanUpRoles(){
 if(!empty($this-&gt;roles)){
 foreach($this-&gt;roles as $key =&gt; $details){
 $tmpRoles[$key] = $details-&gt;name;
 }
 $this-&gt;roles = $tmpRoles;
 }
 }
}
?&gt;</pre>
<h2>Josso Class</h2>
<pre class="brush: php; collapse: true; light: false; title: ; toolbar: true; notranslate">
&lt;pre&gt;class Josso {

 var $SSOIdentityManager;
 var $SSOSessionManager;
 var $SSOIdentityProvider;
 var $JossoPashHash;
 var $error;

 function Josso(){

 // create the soapclients
 $this-&gt;SSOIdentityManager = new Soapclient(JOSSO_SERVER .'/josso/services/SSOIdentityManager?wsdl', array('Trace' =&gt; 1));
 $this-&gt;SSOSessionManager = new Soapclient(JOSSO_SERVER .'/josso/services/SSOSessionManager?wsdl', array('trace' =&gt; 1));
 $this-&gt;SSOIdentityProvider = new Soapclient(JOSSO_SERVER .'/josso/services/SSOIdentityProvider?wsdl', array('trace' =&gt; 1));
 }

 function accessSession($session_id){
 try{
 $accessSession = $this-&gt;SSOSessionManager-&gt;accessSession($session_id);
 // we expect a null
 return $accessSession;
 } catch(Exception $e){
 $this-&gt;error = $e;
 return false;
 }
 }

 // check if a user exists
 function userExists($username){
 try {
 $userExists = $this-&gt;SSOIdentityManager-&gt;userExists($username);
 return true;
 } catch (Exception $e){
 $this-&gt;error = $e;
 return false;
 }
 }

 // assert a login
 function assertIdentityWithSimpleAuthentication($username, $password){
 try{
 $loginAssertion = $this-&gt;SSOIdentityProvider-&gt;assertIdentityWithSimpleAuthentication($username, $password);
 return $loginAssertion;
 } catch (Exception $e){
 $this-&gt;error = $e;
 return false;
 }
 }

 // check assertion and get session
 function resolveAuthenticationAssertion($loginAssertion){
 try{
 $session = $this-&gt;SSOIdentityProvider-&gt;resolveAuthenticationAssertion($loginAssertion);
 return $session;
 } catch (Exception $e){
 $this-&gt;error = $e;
 return false;
 }
 }

 // get session details
 function getSession($session){
 try {
 $sessionDetails = $this-&gt;SSOSessionManager-&gt;getSession($session);
 return $sessionDetails;
 } catch (Exception $e){
 $this-&gt;error = $e;
 return false;
 }
 }

 // make sure the session we found belongs to our user
 function findUserInSession($session){
 try {
 $userInSession = $this-&gt;SSOIdentityManager-&gt;findUserInSession($session);
 return $userInSession;
 } catch (Exception $e){
 return false;
 }
 }

 // not used
 function findUser($username){
 try{
 $userDetails = $this-&gt;SSOIdentityManager-&gt;findUser($username);
 return $userDetails;
 } catch (Exception $e){
 return $e;
 }
 }

 // get a users roles
 function findRolesByUsername($username){
 try {
 $userRoles = $this-&gt;SSOIdentityManager-&gt;findRolesByUsername($username);
 return $userRoles;
 } catch (Exception $e){
 $this-&gt;error = $e;
 return false;
 }
 }

 function globalSignoff($session){
 try {
 $signoff = $this-&gt;SSOIdentityProvider-&gt;globalSignoff($session);
 } catch (Exception $e){
 $signoff = $e;
 }
 unset($_SESSION['josso']);
 return $signoff;
 }

 function getPassHash($password){
 try{
 $result = $this-&gt;JossoPashHash-&gt;hash($password);
 return $result;
 } catch (Exception $e){
 return $e;
 }
 }

}</pre>
<h2>That&#8217;s It!</h2>
<pre>I hope I have at least in part helped with your quest to make logging people in through JOSSO more bearable.</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/computers/code/php-and-josso-transparency-rocks/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Let&#8217;s Get Open!</title>
		<link>http://blog.utahcon.com/computers/code/lets-get-open?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lets-get-open</link>
		<comments>http://blog.utahcon.com/computers/code/lets-get-open#comments</comments>
		<pubDate>Mon, 11 Jan 2010 20:40:22 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Funny]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[CAD Comic]]></category>
		<category><![CDATA[Chrome OS]]></category>
		<category><![CDATA[Chrome OS Zero]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hexxeh]]></category>
		<category><![CDATA[planet]]></category>

		<guid isPermaLink="false">http://blog.utahcon.com/?p=278</guid>
		<description><![CDATA[Being that it is Monday and I am really not feeling it today I thought I would dig up what is happening around the nets and share with you. Chrome OS Zero Looks like Hexxeh has been hard at work getting a cleaned up version of Chrome OS called Chrome OS Zero out to the [...]]]></description>
			<content:encoded><![CDATA[<p>Being that it is Monday and I am really not feeling it today I thought I would dig up what is happening around the nets and share with you.</p>
<h2>Chrome OS Zero</h2>
<p>Looks like Hexxeh has been hard at work getting a cleaned up version of Chrome OS called <a href="http://chromeos.hexxeh.net/" target="_blank">Chrome OS Zero</a> out to the masses. Reading through the <a href="http://chromeos.hexxeh.net/wiki/doku.php" target="_blank">Wiki</a> and <a href="http://chromeos.hexxeh.net/wiki/doku.php?id=faq" target="_blank">FAQ</a> things look pretty nice and clean. I may take a stab at playing with this in the next week or so. Thanks <a href="http://blog.hexxeh.net/" target="_blank">Hexxeh</a>!</p>
<h2>Droids</h2>
<p>Tim at <a href="http://www.cad-comic.com/" target="_blank">CTRL-ALT-DEL Comic</a> has this silly for us today:</p>
<p><img class="alignnone" src="http://www.cad-comic.com/comics/sillies/20100111.gif" alt="" width="625" height="237" /></p>
<p>Thanks Tim!</p>
<h2>Nexus One</h2>
<p>We all know about <a href="http://www.google.com/phone" target="_blank">Google&#8217;s latest move in the Android</a> field by now, right? Well it looks like the Nexus One is selling well, and people are having<a href="http://www.informationweek.com/news/security/vulnerabilities/showArticle.jhtml?articleID=222300397" target="_blank"> problems with the 3G service that T-mobile is offering on the Nexus One</a>. Being a T-mobile customer myself I can tell you the problems are not limited to the Nexus One. My phone refused to stay on 3G this weekend too, oh well.</p>
<h2>PHP</h2>
<h3>References</h3>
<p><a href="http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html" target="_blank">Johannes Schluter discusses how references in PHP work</a>, and suggests that maybe we should not use them anymore.</p>
<blockquote><p>Last year I spoke at eight conferences and attended a few more multiple times at most of them I found myself in discussions about references and PHP as many users seem to have wrong understandings about them. Before going to deep into the subject let&#8217;s start with a quick reminder what references are and clear some confusion about objects which are &#8220;passed by reference.&#8221;</p></blockquote>
<h3>Patterns</h3>
<p><a href="http://giorgiosironi.blogspot.com/" target="_blank">Giorgio Sironi</a><em><a href="http://giorgiosironi.blogspot.com/" target="_blank"> </a></em><a href="http://giorgiosironi.blogspot.com/" target="_blank">has two new blog posts</a> about patterns in PHP. The first is on <a href="http://giorgiosironi.blogspot.com/2010/01/practical-php-patterns-abstract-factory.html" target="_blank">Abstract Factory patterns</a>:</p>
<blockquote><p>The major problem that creational patterns try to solve is that objects need collaborators: we often pass them in the constructor of a <strong>Client</strong> class to aid decoupling, as every class should know <em>only</em> what it really needs to get its job done. With the verb <em>know</em> I mean that they just know that the other part exist at all.</p></blockquote>
<p>The second is on <a href="http://giorgiosironi.blogspot.com/2010/01/practical-php-patterns-builder.html" target="_blank">Builder patterns</a>:</p>
<blockquote><p>The Builder pattern&#8217;s intent is to encapsulate the details (the <em>new</em> operators and other wiring) of the object creation process under a common interface. Though, the Builder can actually change the internal representation of an object, as it is not a black box.</p></blockquote>
<p>Both blog posts were great reads, and I suggest all my <a href="http://uphpu.org" target="_blank">UPHPU</a> buddies hit them up.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/computers/code/lets-get-open/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pro PHP: Patterns, Frameworks, Testing and More</title>
		<link>http://blog.utahcon.com/books/pro-php-patterns-frameworks-testing-and-more?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pro-php-patterns-frameworks-testing-and-more</link>
		<comments>http://blog.utahcon.com/books/pro-php-patterns-frameworks-testing-and-more#comments</comments>
		<pubDate>Tue, 16 Dec 2008 04:11:56 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Apress]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[Pro PHP]]></category>

		<guid isPermaLink="false">http://utahcon.com/blog/?p=65</guid>
		<description><![CDATA[Kevin McArthur is a self-taught entreperneur and opensource developer from Edmonton Alberta. Kevin has been running a very successful PHP application development studio for over 7 years. Additionally Kevin took time to write Pro PHP: Patterns, Frameworks, Testing and More, published by Apress. The book really lives up to the name. It disucsses in great [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignleft" style="width: 135px"><img title="Pro PHP: Patterns, Frameworks, Testing and More" src="http://apress.com/resource/bookcover/9781590598191?size=medium" alt="Pro PHP: Patterns, Frameworks, Testing and More" width="125" height="164" /><p class="wp-caption-text">Pro PHP: Patterns, Frameworks, Testing and More</p></div>
<p>Kevin McArthur is a self-taught entreperneur and opensource developer from Edmonton Alberta. Kevin has been running a very successful PHP application development studio for over 7 years. Additionally Kevin took time to write <a href="http://apress.com/book/view/1590598199">Pro PHP: Patterns, Frameworks, Testing and More</a>, published by <a href="http://apress.com/">Apress</a>.</p>
<p>The book really lives up to the name. It disucsses in great details the framworks that are most popular including Zend Framework. Kevin has what seems an infinite amount of knowledge on Zend Framework, and a quick <a href="http://www.google.com/search?rlz=1C1GGLS_en-USUS295US303&amp;sourceid=chrome&amp;ie=UTF-8&amp;q=Kevin+McArthur+PHP">Google search</a> will reveal he is quite active is sharing that information.</p>
<p>I was a little let down on the Testing and Code Control sections of the book. I felt like Kevin mearly skimmed, and could have really dug into more detail, espeically about testing.</p>
<p>In talking about patterns for PHP Kevin reinforces some of the basics of good programming, and explains the pros and cons of each style of framework. You can tell he has spent his fair share of time in each of the patterns discussed.</p>
<p>Overall if you are thinking about playing with patterns and frameworks this is the book for you. Don&#8217;t look for any golden knowledge about testing, but the rest is gold!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/books/pro-php-patterns-frameworks-testing-and-more/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review: RESTful PHP (Packt Publishing)</title>
		<link>http://blog.utahcon.com/books/book-review-restful-php-packt-publishing?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=book-review-restful-php-packt-publishing</link>
		<comments>http://blog.utahcon.com/books/book-review-restful-php-packt-publishing#comments</comments>
		<pubDate>Mon, 10 Nov 2008 17:05:33 +0000</pubDate>
		<dc:creator>utahcon</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[Packt]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://utahcon.com/blog/?p=43</guid>
		<description><![CDATA[This weekend I had the opportunity to read RESTful PHP, by Samisa Abeysinghe, published by Packt Publishing. The book is short, about 200 pages, but full of great information about what REST is, how it is used, how it is supposed to be used and how to use it with PHP. The book assumes you [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="RESTful PHP Web Services" src="http://images.packtpub.com/images/full/1847195520.jpg" alt="" width="300" height="369" /></p>
<p>This weekend I had the opportunity to read RESTful PHP, by Samisa Abeysinghe, published by <a href="http://www.packtpub.com">Packt Publishing</a>. The book is short, about 200 pages, but full of great information about what REST is, how it is used, how it is supposed to be used and how to use it with PHP.</p>
<p>The book assumes you have a working knowledge of PHP, and how to install extensions (or use existing ones). The concepts are clear and concise. Samisa is direct, but explains the reasons for why code is the way it is, or explains what can be done different.</p>
<p>The books runs through many examples using Yahoo! and Amazon APIs. Most of the book could be called a manual for use of CURL and SimpleXML, as well as some DOM work. Although you will not need to know any of those things before picking up this book.</p>
<p>In a short seven chapters Samisa explains what rest is, who uses it, why it is used, and what you can do with it. Samisa walks you through consuming (or using) REST APIs and also how to setup your own APIs using the REST style and architecture.</p>
<p>I would recommend this book to any beginning and middle tiers PHP developer as it is a quick reference to REST and APIs that you know you already want to be working with.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.utahcon.com/books/book-review-restful-php-packt-publishing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

