<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>WoogaLog &#187; Rant</title>
	<atom:link href="http://camz.wordpress.com/category/rant/feed/" rel="self" type="application/rss+xml" />
	<link>http://camz.wordpress.com</link>
	<description>Various Ramblings &#38; Commentary</description>
	<lastBuildDate>Wed, 18 Jun 2008 18:10:51 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='camz.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/88347e88432a6a88c9ff93ef9b462f6e?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>WoogaLog &#187; Rant</title>
		<link>http://camz.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://camz.wordpress.com/osd.xml" title="WoogaLog" />
		<item>
		<title>Anything but Cheap</title>
		<link>http://camz.wordpress.com/2008/06/14/when-cheap-isnt/</link>
		<comments>http://camz.wordpress.com/2008/06/14/when-cheap-isnt/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 15:04:36 +0000</pubDate>
		<dc:creator>camz</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://camz.wordpress.com/?p=18</guid>
		<description><![CDATA[I often hear statements in the form of &#8220;X is cheap, don&#8217;t worry about it&#8221;.  This usually comes up in design sessions, software or infrastructure, it doesn&#8217;t matter, you can usually find or hear a statement in this form in either type of design session.
The most common versions would be in reference to disk [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=camz.wordpress.com&blog=431845&post=18&subd=camz&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I often hear statements in the form of <em>&#8220;X is cheap, don&#8217;t worry about it&#8221;</em>.  This usually comes up in design sessions, software or infrastructure, it doesn&#8217;t matter, you can usually find or hear a statement in this form in either type of design session.</p>
<p>The most common versions would be in reference to disk space, bandwidth, and CPU.</p>
<p>I suppose this type of thinking is a result of the effects of <a href="http://www.intel.com/technology/mooreslaw/">Moore&#8217;s Law</a>.  One of the troubling things about this sort of thinking is that it is frequently wrong and is indicative of someone with a closed mind, an inability to see the big picture, lack of insight, short-sightedness, or any other similar phrases.  In all cases, when someone makes an X is cheap statement it&#8217;s a safe bet that they haven&#8217;t really thought things through.  These statements are very dangerous, particularly if you happen to be in a design session when someone says this and is of particular concern if that someone is a team leader or manager.</p>
<p>The most dangerous aspect of these statements is that on the surface they may appear to be accurate and correct.  Unfortunately, unless we are designing as system that people will only look at (ie. the surface), rather than actually <em>use</em>, it is rarely correct.</p>
<p><span id="more-18"></span>I&#8217;ll make an attempt to examine the most common of these statements to show how and why they are incorrect and assumptions.  The analysis will be from a business/enterprise perspective rather than a personal/consumer one.  You might be surprised to see how inter-related these can be!  Let&#8217;s start with:</p>
<p><strong>Disk is cheap, don&#8217;t worry about size</strong></p>
<p>I will have to start by conceding the fact that disk storage has gotten very cheap indeed.  The average consumer can put a <a href="http://en.wikipedia.org/wiki/Terabyte">terabyte</a> of disk into their PC for less than $200.  So how can that NOT be cheap?</p>
<p>We first need to understand what is <em>really</em> being said here.  This usually isn&#8217;t a reference to disks and storage in general, it will be in reference to data files or databases.</p>
<p>So lets talk about files&#8230; in the past files weren&#8217;t that big, they were text files or word documents, and although the word documents were bigger, the size was still reasonable.  This is no longer true, text files are rarely used anymore, the same information is now in a PDF file, or word document, an image, or a multi-media file.  Those PDF and word files usually have graphics in them too, and to ensure that they look good when they print the graphics are stored at full resolution, even if they are only displayed thumbnail-sized in the document itself.  The average document size is now measured in MB instead of KB, and for media files, GB is becoming more and more common.</p>
<p>So, what am I trying to say?  The amount of storage that is available at a reasonable cost has increased by orders of magnitude, but so has the average size of the files that we store.  The net result is that we can store about  the same number of files as we used to before.</p>
<p>Even if we can store more files there is another cost involved. The more files and directories we have on our disks, the more difficult it becomes to find a file when we need it.  If a user can&#8217;t remember where they put a file on a file server and they have to search for it, that potentially ties up a lot of I/O and CPU resources as the server scans all the files.  That results in slower performance for all the other users relying on that server.  That same server could be hosting a database, or a VM, or even just the virtual disk of a VM, and each of those would be affected by this search.   Even if you don&#8217;t search for files very often because you are so well organized&#8230; those files are getting scanned anyway a couple times a day by your anti-virus and anti-spyware software.</p>
<p>Now lets look at databases&#8230;  Modern database servers make them easy to use, quick to access, all those good things.  So where is the problem.  Let&#8217;s look at how a real production database gets used.  To start with, you don&#8217;t just put a production database on disk, that&#8217;s too risky, disks can fail.  You put it on a raid array instead, using mirroring, or striping, or whatever.  The end result is that we now have two or possibly three (depending on the level of raid) copies of that database.  We need to back up the database, that&#8217;s another copy&#8230; but in today&#8217;s web-enabled global economy, we can&#8217;t take the database server offline to back it up.  So we have to take a snapshot to another disk so that we can make a backup of it without it changing while we write to tape, that&#8217;s another copy.  Add some developers into the mix, any system that has a database probably has some developers working on new versions of the software and they need working copies of those databases to use for testing and development.  That&#8217;s another copy (per developer) for each database.  What are we up to now? 5 or 6 copies?  Once again, the way we use that so-called cheap disk space quickly changes the cost per MB when each MB that we use is actually stored multiple times.</p>
<p>Backups become important too.  Bigger databases take longer to backup, which also means they take longer to restore too.  That can be crucial when the database for a web-commerce site goes down and we need to restore it.   The companies that chose to believe the &#8220;disk is cheap&#8221; myth will be offline waiting for the restore a lot longer than the company that chose to use their disk space more wisely.</p>
<p>Storage in general is no longer local in a business environment.  Files get shared on file servers, as well as through the use of SAN and NAS devices.  This means that accessing the data on those &#8220;cheap&#8221; disks is now over a network and now bandwidth enters into the equation.  A perfect segue into&#8230;</p>
<p><strong>Bandwidth is cheap, don&#8217;t worry about the size of your data</strong></p>
<p>Once again, we start with trying to understand what is really being said here.  This is typically the speed of the available network rather than the cost of the network, although it can easily refer to both.</p>
<p>The speed and cost of networks has improved dramatically over the years.  They have gone from 300 baud modems to 1200, and on and on up to 14400 and 56Kbps only to be replaced by broadband connections anywhere from 128Kbps to 10Mbps.  Local networks went from proprietary systems to 10Mbps Ethernet, then 100Mbps, and now 1Gbps or wireless networks that started at 11Mbps and are now 54Mbps or 108Mbps.</p>
<p>What was once inconceivable to transmit over a network is now commonplace.  So where is the problem here?</p>
<p>The first misconception comes from a single user perspective of the network.  This is easiest to explain with an example.  A typical office will have a 100Mbps network, providing 100Mbps of network bandwidth to each user.  Sounds pretty good and we don&#8217;t use hubs anymore everyone uses switches, so user A doesn&#8217;t get impacted by what user B is doing on his segment of the network.  Or does he?  That depends, although in most cases the answer is yes, they are affected.  Those network switches only isolate traffic between two end points.  So, I might have 100Mbps between me and the switch, but ultimately I don&#8217;t need anything from the switch, I need it from some resource on the network.  That resource might be a file server, or a database, or a website.  There is a significant chance that I&#8217;ll be competing with the other user to connect to the same end point.  So while we both have 100Mbps to the switch, we are sharing the 100Mbps from the switch to the common end point, so we&#8217;ve effectively been reduced to 50% of the &#8220;perceived&#8221; bandwidth.  Chances are that it won&#8217;t be just two users connecting to that common end point, but a lot more.  In a small company, you are probably competing will ALL the other users, so divide that 100Mbps by 10 or 20, bringing us down to 10Mbps or 5Mbps, certainly not the amount of bandwidth that you expected to get.</p>
<p>I will admit that I&#8217;m not being completely fair in my calculation, its far to primitive to be accurate, everyone would have to be accessing the same server at the same time for those numbers to be correct.  Statistically we will get much better performance, exactly how much better is harder to predict since it depends on what is being accessed.  Of course, the bigger the files we are after, the longer we send transferring their data, the more likely we are to be affected.  This is where we can start to see the impact of the &#8220;disk is cheap&#8221; mindset on other (seemingly unrelated) areas of computing.</p>
<p>So, I haven&#8217;t proven anything other than you won&#8217;t see 100% of your bandwidth.  We&#8217;ve only been talking about an typical office LAN, lets examine networked applications.</p>
<p>There are two typical varieties of networked applications.  Those that explicitly use the network by implementing some form of protocol, and those that indirectly use a network through file sharing, web-services, SOA, or database connections.  If a protocol is designed with the &#8220;bandwidth is cheap&#8221; thinking, you&#8217;ll probably find that it sends and receives lots of data.  The networks are indeed fast enough to make this appear to be a non-issue.  Unless you happen to be the the sysadmin or the hosting provider.  More efficient use of bandwidth translates directly into more users, which translates directly into revenue.  Once you max out your bandwidth with users, you might also need to buy/build new servers to handle more customers.</p>
<p>The more customers you can fit into the same bandwidth, the fewer servers and infrastructure you need, which directly affects the capital investment required (which again, affects Time-To-Revenue, since you have to recoup the infrastructure cost to become profitable).</p>
<p>More and more often you will find servers running in VMs, which wind up aggregating network traffic from all VMs to a single physical network.  Applications running in VM servers that don&#8217;t make efficient use of the network could find the VMs running out of available network bandwidth before they run out of available CPU.  If we have network traffic between two VMs, it never hits the physical network, but it does wind up consuming additional CPU possibly impacting performance of the other VMs.</p>
<p>When we introduce wireless and cellular networks to the mix the impact is more easily observed.  Sure that new 802.11n wireless is fast, but when you have an office full of users streaming video over the same shared wireless bandwidth&#8230;</p>
<p>So if you encounter someone that suggests<em> &#8220;X is cheap, don&#8217;t worry about it&#8221;</em> in your next design session or troubleshooting discussion, you will know that what they are really saying is that they probably don&#8217;t understand the issue at all.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/camz.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/camz.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/camz.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/camz.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/camz.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/camz.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/camz.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/camz.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/camz.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/camz.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/camz.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/camz.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=camz.wordpress.com&blog=431845&post=18&subd=camz&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://camz.wordpress.com/2008/06/14/when-cheap-isnt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c0f9ae6afbe7d95ff1107cdd09781c9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">camz</media:title>
		</media:content>
	</item>
		<item>
		<title>SQL Server Suckage</title>
		<link>http://camz.wordpress.com/2007/04/14/sql-server-suckage/</link>
		<comments>http://camz.wordpress.com/2007/04/14/sql-server-suckage/#comments</comments>
		<pubDate>Sun, 15 Apr 2007 05:54:18 +0000</pubDate>
		<dc:creator>camz</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://camz.wordpress.com/2007/04/14/sql-server-suckage/</guid>
		<description><![CDATA[I&#8217;ve been working on a system written in .Net/C# that uses SQL Server, my database experience prior to SQL Server included Oracle, Ingress, Sybase, Postgresql, and some MySql.  Each had their quirks, but I&#8217;m learning more and more of the SQL Server quirks, and at times seriously having to wonder how Microsoft gets off [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=camz.wordpress.com&blog=431845&post=21&subd=camz&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;ve been working on a system written in .Net/C# that uses SQL Server, my database experience prior to SQL Server included Oracle, Ingress, Sybase, Postgresql, and some MySql.  Each had their quirks, but I&#8217;m learning more and more of the SQL Server quirks, and at times seriously having to wonder how Microsoft gets off calling this an enterprise class product.  I will fully admit that some of my complaints are with how .Net communicates with SQL Server, and these probably are not Sql Server&#8217;s fault.</p>
<p>Here is my short list of gripes (in no particular order):<br />
<span id="more-21"></span></p>
<ol>
<li><b>No Sequences</b><br />
Yes, I know, you can use IDENTITY columns, but they are not the same, and SQL Server places some foolish restrictions on their use.  Instead of an IDENTITY column being a &#8220;normal&#8221; scalar column it is special and you can never update the column, although you can insert, but only after additional SQL directives.  The IDENTITY implementation is close to a sequence, but Microsoft just didn&#8217;t implement it quite right.  I do wonder why they didn&#8217;t introduce proper sequences with SQL Server 2005, they could have done this quite easily, a proper sequence could peacefully co-exist with the existing IDENTITY nonsense.
</li>
<li><b>Inconsistent Parsing</b><br />
I was creating query that needed to run properly against two versions of a table, one version had an additional column to simplify the query.  Using the IF EXISTS statement, I wrote a query similiar to the following:<br />
<code>IF EXISTS (<br />
  SELECT NULL<br />
  FROM sysobjects so, syscolumns sc<br />
  WHERE so.id = sc.id<br />
  AND so.name = 'table_name'<br />
  AND so.xtype = 'U'<br />
  AND sc.name = 'column_name'<br />
) SELECT column_name FROM table_name</code><br />
When I ran it against a database that had the column it worked, when I ran it against one that didn&#8217;t have the column, I got an error of it complaining that column_name didn&#8217;t exist.  I shouldn&#8217;t have even tried, that is the whole idea behind using the IF EXISTS&#8230;  The following query:<br />
<code>IF EXISTS (<br />
  SELECT NULL<br />
  FROM sysobjects<br />
  AND name = 'table_name'<br />
  AND so.xtype = 'U'<br />
) SELECT * FROM table_name</code><br />
Works as expected when run against a database that does not have the table.</p>
<p>So, in one case it parses the statement inside the IF EXISTS and does some checking, in another case it does not.
</p>
</li>
<li><b>NOCHECK Constraints</b><br />
The ability to temporarily disable constraint checking can be quite convenient, particularly while bulk loading data.  What I don&#8217;t like about this is that this &#8220;WITH NOCHECK&#8221; state can actually stick around indefinitely, and is included in backups of the database.  The constraint appears to be present, but is not actually being enforced.
</li>
<li><b>Escaping Reserved Words &amp; Special Characters</b><br />
This is one of those things that looks reasonably useful until you actually take a couple moments to think about it.  SQL Server will let you use special characters like spaces, periods, and even reserved words when defining your schema, all you need to to is enclose them in square brackets.  The following is valid:<br />
<code>CREATE TABLE [Table] (<br />
[hard.to.use.column] varchar(20),<br />
[also hard to use] varchar(10),<br />
[null] varchar(10)<br />
)</code><br />
There are good reasons why we have reserved words, and why spaces and such are not allowed in table or column names.  While it is admirable that Microsoft provided such a convenient way to differentiate the real reserved words from the ones we want to use, it&#8217;s horribly misguided.  No one should do this, <i>ever</i>, it&#8217;s just plain confusing, not to mention non-portable, foolish, and, oh yeah&#8230; stupid.
</li>
<li><b>Inconsistent context from .Net/C#</b><br />
I will admit that I do not know if this is a SQL Server thing, or a .Net/C# thing.  This is related to the debate about using parameters or not (which I won&#8217;t get into), the issue is that .Net/C# does not execute these in the same way.  Here is a code sample to help demonstrate this:<br />
<code>public Query1( SqlConnection cnx, int id )<br />
{<br />
   cmd = cnx.CreateCommand();<br />
   cmd.CommandText = String.Format( "SELECT * FROM myTable WHERE id = {0}", id );<br />
   SqlDataReader r = cmd.ExecuteReader();<br />
   if( r.Read() ) { /* read result */ }<br />
   r.Close()<br />
}</p>
<p>public Query2( SqlConnection cnx, int id )<br />
{<br />
  cmd = cnx.CreateCommand();<br />
  cmd.CommandText = "SELECT * FROM myTable WHERE id = @id";<br />
  cmd.Paramaters.AddWithValue( "@id", id );<br />
  SqlDataReader r = cmd.ExecuteReader();<br />
   if( r.Read() ) { /* read result */ }<br />
   r.Close()<br />
}</p>
<p></code><br />
Query1 will be sent to SQL Server as a normal query.  If you were to build another query in the same program it would execute in the same context.  In other words, you can do a transaction by issuing the raw SQL as multiple statements using a combination of cmd.ExecuteReader() and cmd.ExecuteNonQuery().  You could also issue the sql to allow IDENTITY INSERTS, and then loop through some in-memory data and create multiple INSERT statements from that data.</p>
<p>Query2 should be identical, but it is not.  It executes in it&#8217;s own context as a side-effect of the fact that a stored procedure is actually used to execute the actual query.  The parameters are defined and their initial value set as arguments to the stored procedure, with the actual parameterized query being passed un-altered from .Net to the stored procedure as one of the arguments.</p>
<p>While it seems a bit excessive to invoke a stored procedure to deal with the parameters, this is not what bothers me.  What bothers me is that a parameter-less query and a parameterized query are not handled in an identical manner by .Net/C#, especially with the nice side effect of the difference in execution context of the two.  Code that produces valid SQL without parameters can break without explanation simply by implementing parameters.</p>
<p>Another issue related to this is that .Net/C# appears to always parse the sql before deciding how to execute it.  In an attempt to reduce potential errors where you might build a query with undefined parameters, it actually makes it impossible to create a stored procedure or user defined function from C#.  Since these things will use parameters in T-SQL, they conflict with how C# handles parameters, the following code snippet will produce a .Net exception:<br />
<code>cmd.CommandText = "CREATE PROCEDURE foo @id int AS SELECT * FROM myTable WHERE id = @id";<br />
cmd.ExecuteNonQuery();</code><br />
The exception will be that you have not defined @id with a cmd.Parameters.AddWithValue() statement.  Of course, you didn&#8217;t do that because you are not trying to use a parameter, you are issuing DDL SQL to create a stored procedure that will use one.  I have yet to find out how to tell .Net/C# to stop doing this so that this SQL can be executed.  I means you can&#8217;t programatically create a database schema from within a C# application.
</p>
</li>
<li><b>Column Aliases <i>not</i> Available to ORDER BY</b><br />
This one should be a bug, the fact that if you define an alias for a column you should be able to use that alias in the ORDER BY clause.  You can&#8217;t.  This is particularly annoying for a calculated column or one that transforms the data using CASE or by concatenating text results.  You wind up having to duplicate the calculation in the ORDER BY clause.  Silly.
</li>
<li><b>Default Collation Sequence is Case-Insensitive</b><br />
When you install SQL Server (2000, MSDE, 2005, 2005 EE) the default collation sequence is case-insensitive.  I&#8217;d never seen this before when working with other databases.  I only discovered it by accident when looking at a client&#8217;s data and discovered that data being inserted into a column with an FK constraint was allowing lower-case when I knew the referenced table was all upper case.  I was shocked.  This might make some sense for some other alphabets, but it certainly produced some unexpected results for me.</p>
<p>You can actually create each table and column with a different collation sequence.  This might be flexible, but I suspect it breaks several rules of design and should be avoided.
</p>
</li>
</ol>
<p>So there you go.  Some of the reasons why I dislike SQL Server.  I&#8217;m sure I will think of some more&#8230; I&#8217;ll add some of them to the list as I think of them.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/camz.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/camz.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/camz.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/camz.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/camz.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/camz.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/camz.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/camz.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/camz.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/camz.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/camz.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/camz.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=camz.wordpress.com&blog=431845&post=21&subd=camz&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://camz.wordpress.com/2007/04/14/sql-server-suckage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c0f9ae6afbe7d95ff1107cdd09781c9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">camz</media:title>
		</media:content>
	</item>
	</channel>
</rss>