<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx</link><description>Version numbers. Very important. And so many people check them wrong. This is why Windows 95's GetVersion function returned 3.95 instead of 4.0.
A lot of code checked the version number like this: UINT Ver = GetVersion(); UINT MajorVersion = LOBYTE(uVer);</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72503</link><pubDate>Fri, 13 Feb 2004 15:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72503</guid><dc:creator>Wayne</dc:creator><description>The best version number API I've seen returns the version numbers as a string AND provides a strcmp-like function for comparing version numbers. That way you can perform calculations like so: &lt;br&gt;&lt;br&gt;if (Version_Cmp(GetVersionStr(), &amp;quot;3.11&amp;quot;) &amp;gt;= 0) { &lt;br&gt;Do something &lt;br&gt;} </description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72506</link><pubDate>Fri, 13 Feb 2004 15:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72506</guid><dc:creator>Raymond Chen</dc:creator><description>Returning the version as a string is no good either. People would do&lt;br&gt;&lt;br&gt;if (strcmp(GetVersionStr(), &amp;quot;3.11&amp;quot;) &amp;gt;= 0) ...&lt;br&gt;&lt;br&gt;and then they would fail once the OS reached version 10.&lt;br&gt;&lt;br&gt;The function VerifyVersionInfo is essentially the Version_Cmp function above.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72543</link><pubDate>Fri, 13 Feb 2004 17:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72543</guid><dc:creator>Jason Doucette</dc:creator><description>In light of these mentioned problems, I would return the value as a 16.16 fixed point number.  So, 3.11 would be 3 &amp;lt;&amp;lt; 16 + 11 (which is 3 * 65536 + 11 or 0x0003 000B).  Then it is a simple compare of two integers.&lt;br&gt;&lt;br&gt;Does anyone see any problems with this?</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72544</link><pubDate>Fri, 13 Feb 2004 17:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72544</guid><dc:creator>Jack Mathews</dc:creator><description>It just sucks how much you have to pander to the stupidest common denominator.  It also is bad that you can't pull an Apple and just start off fresh every so often.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72550</link><pubDate>Fri, 13 Feb 2004 17:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72550</guid><dc:creator>Raymond Chen</dc:creator><description>Jason: You can certainly use the MAKELONG macro yourself to pack the versions into a single integer in order to simplify the comparison. But sometimes people have need to check the sub-minor versions, too, and then you start to run out of space in a 32-bit integer. (For example, Windows XP Service Pack 1 is version 5.1.2600.1106.)</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72564</link><pubDate>Fri, 13 Feb 2004 17:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72564</guid><dc:creator>Strong Sad</dc:creator><description>I've seen the very bug that Raymond points out on plenty of Microsoft's own source code, internally, although in every case I saw, the problem got scrubbed out long before release (usually within days of the first checked-in, bogus, version comparison).&lt;br&gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72599</link><pubDate>Fri, 13 Feb 2004 18:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72599</guid><dc:creator>Cooney</dc:creator><description>&amp;lt;p&amp;gt;Raymond: For example, Windows XP Service Pack 1 is version 5.1.2600.1106.&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;p&amp;gt;In this case, why not just compare the build number (2600)?&amp;lt;/p&amp;gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72601</link><pubDate>Fri, 13 Feb 2004 18:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72601</guid><dc:creator>Raymond Chen</dc:creator><description>That's still not good enough, because Windows XP RTM is 5.1.2600.0 (same build number).</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72611</link><pubDate>Fri, 13 Feb 2004 18:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72611</guid><dc:creator>Dylan Greene</dc:creator><description>Why not 4.2 instead of 3.95? </description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72612</link><pubDate>Fri, 13 Feb 2004 18:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72612</guid><dc:creator>Matt</dc:creator><description>It's absolutely stunning how much poor quality software is out there.  Just stunning.&lt;br&gt;&lt;br&gt;What constantly frustrates me are applications that won't run on newer operating systems... yet drivers that WILL allow themselves to be installed on newer operating systems.&lt;br&gt;&lt;br&gt;Maybe the industry could come up with a highly visible &amp;quot;hall of shame&amp;quot; for these instances.  (Hey, I can dream.)</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72613</link><pubDate>Fri, 13 Feb 2004 18:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72613</guid><dc:creator>BuckChuckNorris to the 23rd power</dc:creator><description>So you quit shimming every program that had bugs, and stuck a shim between the API and the app.&lt;br&gt;&lt;br&gt;=)&lt;br&gt;&lt;br&gt;sorry, couldn't help my self...&lt;br&gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72670</link><pubDate>Fri, 13 Feb 2004 21:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72670</guid><dc:creator>scott lewis</dc:creator><description>I've always liked Apple's implementation of versioning: they return a 16-bit Binary Coded Decimal representation of the verson number. The fist two digit are the major number, the last two the minor and subminor, respectively. Thus if you want to require System 7.5.2 for example you write:&lt;br&gt;&lt;br&gt;if (version &amp;lt; 0x0752) {&lt;br&gt;       fail();&lt;br&gt;}&lt;br&gt;&lt;br&gt;Which still works with 10.3.2 (0x1032). Although, it will break when they get past Mac OS 99.9.9. ;-)</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72673</link><pubDate>Fri, 13 Feb 2004 21:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72673</guid><dc:creator>Dylan Greene</dc:creator><description>&amp;gt; I've always liked Apple's implementation &lt;br&gt;&amp;gt; 10.3.2 (0x1032). &lt;br&gt;&lt;br&gt;What if minor or subminor version happen to be greater than 9?&lt;br&gt;&lt;br&gt;10.10.3.4 &amp;gt; 10.1.3.4&lt;br&gt;10.1034 &amp;lt; 10.134&lt;br&gt;&lt;br&gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72675</link><pubDate>Fri, 13 Feb 2004 21:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72675</guid><dc:creator>scott lewis</dc:creator><description>Obviously, under the Apple scheme they can't be. :)&lt;br&gt;&lt;br&gt;However, the general concept can be extened out to any number of BCD digits, and the invariant (old version &amp;lt; new version) will hold as long as the format of the BCD encoded number remains the same. That is, the number of digits allocated to each version, subversion, etc. doesn't change.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72695</link><pubDate>Fri, 13 Feb 2004 22:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72695</guid><dc:creator>Jordan Russell</dc:creator><description>Why does Windows XP return 1 as its minor version number instead of 10? Someone made a mistake, I take it?</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72696</link><pubDate>Fri, 13 Feb 2004 22:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72696</guid><dc:creator>Jack</dc:creator><description>&amp;quot;It just sucks how much you have to pander to the stupidest common denominator. It also is bad that you can't pull an Apple and just start off fresh every so often. &amp;quot; &lt;br&gt;&lt;br&gt;You can, its called .NET.&lt;br&gt;&lt;br&gt;[Note: This entry has been edited by the blog maintainer.]</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#72817</link><pubDate>Sat, 14 Feb 2004 01:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72817</guid><dc:creator>Adrian Oney</dc:creator><description>Things get even more exciting when you include service packs into the mix.&lt;br&gt;&lt;br&gt;XP can be said to be a superset of Win2K. Therefore we could say VerXP &amp;gt; Ver2K. Likewise, XP-SP1 can be said to be a superset of XP-Gold, so VerXP_SP1 &amp;gt; VerXP.&lt;br&gt;&lt;br&gt;But now the test: is WinXP-SP1 a superset of Win2K-SP4? In other words, is VerXP_SP1 &amp;gt; Ver2K_SP4? And the answer is... not necessarily. &lt;br&gt;&lt;br&gt;Win2K-SP4 might contain some bug fixes and backported features (hardware support, etc) that will only arrive in the XP line as of XP-SP2. Therefore, WinXP-SP1 couldn't be said to be a superset of Win2K-SP4. Whether VerXP_SP1 &amp;gt; Ver2K_SP4 is true depends entirely on the reason you are asking (bug fix, etc). &lt;br&gt;&lt;br&gt;As such, version numbers are best thought of as describing *code lineages*. There is a main lineage where Win2K, WinXP, and Win2003 lie. But each major OS forms the base of a fork containing their service packs. Thus versioning could be modeled using trees. You can ask how far down a given branch you are, but that doesn't tell you anything about the branches that aren't between you and the root.&lt;br&gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73219</link><pubDate>Sun, 15 Feb 2004 07:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73219</guid><dc:creator>Centaur</dc:creator><description>The guides on Javascript available in the Internet say, “Don’t check for versions; check for objects.” Which is essentially checking for capabilities. Which means &lt;br&gt;try { &lt;br&gt;LoadLibrary foo(&amp;quot;foo.dll&amp;quot;); GetProcAddress&amp;lt;BarProc&amp;gt; barProc(foo, &amp;quot;BarProc&amp;quot;); baz = barProc(quux); &lt;br&gt;} &lt;br&gt;catch (LoadLibrary::Exception) &lt;br&gt;{ &lt;br&gt;// something&lt;br&gt;}&lt;br&gt;catch (GetProcAddress::Exception)&lt;br&gt;{&lt;br&gt;// something else&lt;br&gt;}&lt;br&gt;&lt;br&gt;I’m imagining some C++ wrappers around LoadLibrary and GetProcAddress here, but you get the idea.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73238</link><pubDate>Sun, 15 Feb 2004 08:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73238</guid><dc:creator>Peter Torr</dc:creator><description>I've always wondered why we don't just reverse the version checking pattern: instead of the app asking the OS for its version number and (incorrectly) deciding if it is good enough, why doesn't the app give the expected minimum version to the OS and it does the work to figure out if the current OS is good enough? Eg:&lt;br&gt;&lt;br&gt;if (IsWindowsVersionAtLeast(3, 1) != TRUE)&lt;br&gt;{&lt;br&gt;  printf(&amp;quot;You need to upgrade&amp;quot;);&lt;br&gt;  exit(1);&lt;br&gt;}&lt;br&gt;&lt;br&gt;Then version checking -- rather than version reporting -- becomes a base function of the OS.&lt;br&gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73248</link><pubDate>Sun, 15 Feb 2004 08:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73248</guid><dc:creator>Raymond Chen</dc:creator><description>It's already there there. Just nobody uses it.&lt;br&gt;&lt;br&gt;&lt;a target="_new" href="http://msdn.microsoft.com/library/en-us/sysinfo/base/verifying_the_system_version.asp"&gt;http://msdn.microsoft.com/library/en-us/sysinfo/base/verifying_the_system_version.asp&lt;/a&gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73257</link><pubDate>Sun, 15 Feb 2004 09:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73257</guid><dc:creator>Sven</dc:creator><description>VerifyVersionInfo&lt;br&gt;&lt;br&gt;Client: Requires Windows XP or Windows 2000 Professional.&lt;br&gt;Server: Requires Windows Server 2003 or Windows 2000 Server.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73317</link><pubDate>Sun, 15 Feb 2004 16:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73317</guid><dc:creator>Centaur</dc:creator><description>&amp;gt; if (IsWindowsVersionAtLeast(3, 1) != TRUE)&lt;br&gt;&lt;br&gt;Is it moral to compare for equality against TRUE? :) I mean, the general convention for BOOL is that 0 is FALSE, and everything else is TRUE, and the TRUE define or constant is usually defined as some arbitrary non-FALSE value, like 1 or -1. 2 is as TRUE as 1, but will fail the comparison against 1.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73322</link><pubDate>Sun, 15 Feb 2004 16:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73322</guid><dc:creator>Raymond Chen</dc:creator><description>Centaur's right. Checking for equality against TRUE is asking for trouble.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73456</link><pubDate>Mon, 16 Feb 2004 00:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73456</guid><dc:creator>Shane King</dc:creator><description>This bug is pretty understandable. It's a code path that can't be tested. When a program was released under windows 3.1, there was no windows version greater than 3, so the code path never would have run, and hence never noticed.&lt;br&gt;&lt;br&gt;Everyone makes mistakes, so I don't really blame the devs of such a bug. It's just one of those things.&lt;br&gt;&lt;br&gt;Although you can probably avoid it by pushing your code into a function IsVersionOK(currentVersion), and unit testing that function. However, lack of unit testing usually comes from impossible deadlines and such imposed from above, and hence the managers, not the programmers, are most likely the reason why such code reaches the wild.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73484</link><pubDate>Mon, 16 Feb 2004 01:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73484</guid><dc:creator>Karan Dhillon</dc:creator><description>Shane, Application Verifier has a test called HighVersionLie to test for this sort of thing.&lt;br&gt;&lt;br&gt;&lt;a target="_new" href="http://www.microsoft.com/windows/appcompatibility/appverifier.mspx"&gt;http://www.microsoft.com/windows/appcompatibility/appverifier.mspx&lt;/a&gt;</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#73618</link><pubDate>Mon, 16 Feb 2004 08:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:73618</guid><dc:creator>"Ivana"</dc:creator><description>Why not have an enum for known versions. &lt;br&gt;&lt;br&gt;public enum WindowsVersions &lt;br&gt;{ &lt;br&gt;2000, &lt;br&gt;XP, &lt;br&gt;Server &lt;br&gt;} &lt;br&gt;&lt;br&gt;BLAH, its not going to change at runtime. Saves all the parsing errors and counting.&lt;br&gt;&lt;br&gt;[Note: Edited by blog maintainer.  This is getting really boring really fast. Will &amp;quot;Jack&amp;quot;/&amp;quot;Ivana&amp;quot; please stop misrepresenting yourself as a Microsoft employee. This is your last warning.]</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#74340</link><pubDate>Mon, 16 Feb 2004 20:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:74340</guid><dc:creator>Michael Grier [MSFT]</dc:creator><description>Re: capabilities:&lt;br&gt;&lt;br&gt;Nobody likes these.  Some Highly Placed Folks working on the Big Reset Thingie mentioned simply rejected the idea and said that they would only consider a version numbering based approach.&lt;br&gt;&lt;br&gt;Oh well, maybe the Next Really Big Thing after this current Really Big Thing will get it right</description></item><item><title>bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#77142</link><pubDate>Fri, 20 Feb 2004 17:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:77142</guid><dc:creator>TrackBack</dc:creator><description>I got thinking about how easy we have it sometimes in Linux. In a similar situation, we seem to favour fixing the app rather than the kernel. Then I thought some more, and remembered the painful disaster that is the version number checking in agpgart.</description></item><item><title>Another solution</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#77542</link><pubDate>Sat, 21 Feb 2004 09:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:77542</guid><dc:creator>KH</dc:creator><description>A version number is actually a list of integers, which we happen to write with dots between them, like 5.1.2600.1106.  On one level, comparing version numbers by comparing strings like &amp;quot;5.1.2600.1106&amp;quot; seems as silly as comparing floating point numbers by comparing their string representations.&lt;br&gt;&lt;br&gt;What you really want is a data structure (call it, oh, Version) that consists of a list of integers.  Operations you'd want include converting to and from strings, comparing versions (by finding the leftmost numbers that differ), and asking what the version of the OS/library/whatever is.&lt;br&gt;&lt;br&gt;Can you tell I'm up late fixing bugs in C++ code?  :-)  This sounds like a CS 101 assignment to me.</description></item><item><title>re: Bad version number checks</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#77575</link><pubDate>Sat, 21 Feb 2004 13:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:77575</guid><dc:creator>Lennie</dc:creator><description>That's why in the (D)HTML-world we atleast _try_ to do capabilities-checking, instead of browser-strings and scrary things like that.&lt;br&gt;&lt;br&gt;Well, we try to do the right thing anyway, there are still cornercases that need extra checking.&lt;br&gt;</description></item><item><title>VBA Take Two: Responding to some comments</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#119630</link><pubDate>Sun, 25 Apr 2004 02:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:119630</guid><dc:creator>Office Development, Security, Randomness...</dc:creator><description /></item><item><title>Using the powers of mathematics to simplify multi-level comparisons</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#407836</link><pubDate>Wed, 13 Apr 2005 15:56:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:407836</guid><dc:creator>The Old New Thing</dc:creator><description>What a boring title.</description></item><item><title>Manifesting for Compatibility on Windows 7</title><link>http://blogs.msdn.com/oldnewthing/archive/2004/02/13/72476.aspx#9515461</link><pubDate>Sat, 28 Mar 2009 05:35:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9515461</guid><dc:creator>Chris Jackson's Semantic Consonance</dc:creator><description>&lt;p&gt;Normally, I’m talking about how to fix applications here, but I want to digress and instead talk about&lt;/p&gt;
</description></item></channel></rss>