Compare commits

...

6 Commits

Author SHA1 Message Date
~lucidiot 8543240e54 Post about Service Status 2024-03-10 17:53:37 +01:00
~lucidiot 2644f596f2 Post about Sweet Home 3D 2024-03-10 17:48:22 +01:00
~lucidiot 3807f3137f Fix point+radius examples of circles in GeoRSS 2024-03-10 17:48:22 +01:00
~lucidiot dff26c4992 Fix typos in older posts 2024-03-10 17:48:21 +01:00
~lucidiot 836630e8b2 Use figure tags 2024-02-27 08:49:32 +01:00
~lucidiot 5f749610c8 Typo in windows93 post 2024-02-27 08:47:46 +01:00
1 changed files with 121 additions and 16 deletions

137
feed.xml
View File

@ -15,6 +15,7 @@
xmlns:icbm="http://postneo.com/icbm"
xmlns:nhc="https://www.nhc.noaa.gov"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:ss="http://purl.org/rss/1.0/modules/servicestatus/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:webfeeds="http://webfeeds.org/rss/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@ -27,6 +28,7 @@
http://www.opengis.net/gml https://schemas.opengis.net/georss/1.0/schema-1.1/gmlgeorss.xsd
http://postneo.com/icbm xsd/icbm.xsd
https://www.nhc.noaa.gov xsd/nhc.xsd
http://purl.org/rss/1.0/modules/servicestatus/ xsd/servicestatus.xsd
http://purl.org/rss/1.0/modules/syndication/ xsd/syndication.xsd
http://webfeeds.org/rss/1.0 xsd/webfeeds.xsd
"
@ -53,6 +55,8 @@
<dc:format>application/rss+xml</dc:format>
<ss:aboutStats>https://envs.net/~lucidiot/rsrsss/feed.xml#servicestatus</ss:aboutStats>
<sy:updatePeriod>weekly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<sy:updateBase>1990-01-01T12:00+01:00</sy:updateBase>
@ -1347,7 +1351,8 @@
<link>https://web.archive.org/web/20130307033513/http://postneo.com/icbm/</link>
<description><![CDATA[
<p>One of the most primitive ways you can specify geospatial information within an RSS feed is also one of the oldest, and it is supported by the W3C validator among others. The <code>icbm</code> XML namespace allows you to specify an <a href="https://en.wikipedia.org/wiki/ICBM_address" target="_blank">ICBM address</a> in either the <code>&lt;channel&gt;</code> or the <code>&lt;item&gt;</code> elements, allowing you to relate a location to either the entire RSS feed or a single specific item on that feed.</p>
<pre>
<figure>
<pre>
&lt;rss version="2.0" xmlns:icbm="http://postneo.com/icbm"&gt;
&lt;channel&gt;
&lt;!-- ... --&gt;
@ -1362,6 +1367,8 @@
&lt;/channel&gt;
&lt;/rss&gt;
</pre>
<figcaption>Example of a point added to an RSS channel and item using the ICBM namespace</figcaption>
</figure>
<p>With this method, you can therefore specify a location where someone may send a nuke if they have been particularly angered by something you published on that feed. Or more commonly, you might want to set a location relevant to the feed, like the location of the <a href="https://xkcd.com/703/" target="_blank">tautology club</a> whose blog has a feed for, or the location of something mentioned within the feed.</p>
<p>There are other, more recent and more standard methods to refer to geographic coordinates in an RSS feed, and not just specific points. We will go over those some other time.</p>
]]></description>
@ -1379,7 +1386,8 @@
<description><![CDATA[
<p>In <a href="https://envs.net/~lucidiot/rsrsss/feed.xml#icbm">the previous post on geospatial stuff in RSS</a>, I showed how to define an <a href="https://en.wikipedia.org/wiki/ICBM_address" target="_blank">ICBM address</a>, to which heads of states may send a nuke if they did not appreciate your post. At around the same time as the <code>icbm</code> namespace got created in a blog post for RSS 2.0, the Semantic Web Interest Group of the W3C devised a <a href="https://www.w3.org/2003/01/geo/" target="_blank">Basic Geo Vocabulary</a> that allows for something very similar to ICBM addresses, but that does not require missiles and is integrated into RDF. It also adds the ability to specify an optional altitude, in meters.</p>
<p>This is meant to be used in RDF, so you would probably normally use this in a <abbr title="RDF Site Summary">RSS</abbr> 1.0 feed, but as with many other RDF namespaces, nothing really stops you from integrating that into RSS 2.0 or Atom, and many people have done so already.</p>
<pre>
<figure>
<pre>
&lt;rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"&gt;
&lt;channel&gt;
&lt;!-- ... --&gt;
@ -1396,6 +1404,8 @@
&lt;/channel&gt;
&lt;/rss&gt;
</pre>
<figcaption>Example of a point added to an RSS channel and item using the W3C Geo namespace</figcaption>
</figure>
<hr />
<p>Two years later, in April 2005, GeoURL.org, a service that used to allow finding websites by their associated geographical location, <a href="https://web.archive.org/web/20070323023116/http://geourl.org:80/news/2005/04/26/rssplus.html" target="_blank">introduced the <code>geourl</code> namespace</a>, adding another duplicate namespace on top of <code>icbm</code> and <code>geo</code>. I mention it here too because the W3C validator supports all three namespaces!</p>
<p>You can use it with <code>xmlns:geourl="http://geourl.org/rss/module/"</code> and the <code>&lt;geourl:latitude&gt;</code> and <code>&lt;geourl:longitude&gt;</code> elements. I would however advise against using it as it increases the complexity for feed parser and feed reader developers; prefer the RDF <code>geo</code> namespace instead, which is more widely known.</p>
@ -1420,10 +1430,11 @@
<p>The initial goal for designing and documenting GeoRSS was to keep the encoding of geography on the Web from fracturing into various encodings the way RSS ended up, with multiple similar implementations.</p>
<footer><a href="https://docs.ogc.org/cs/17-002r1/17-002r1.html" target="_blank"><cite>OGC GeoRSS Encoding Standard</cite></a>, 2017-08-18</footer>
</blockquote>
<p>Considering that the three namespaces we saw in the previous post appeared before GeoRSS, and that georss.org <a href="http://web.archive.org/web/20190602115923/http://www.georss.org/w3c.html" target="_blank">mentions the W3C Geo namespace</a>, it doesn't seem like they were starting well. However, the few remaining feeds that I know of that include geospatial information do use GeoRSS only, so I guess they won in the end. The fact that only geospatial experts would be using geospatial coordinates within RSS feeds, and that most GIS software only supports GeoRSS or name all of their RSS support GeoRSS, must have helped.</p>
<p>Considering that the three namespaces we saw in the previous posts appeared before GeoRSS, and that georss.org <a href="http://web.archive.org/web/20190602115923/http://www.georss.org/w3c.html" target="_blank">mentions the W3C Geo namespace</a>, it doesn't seem like they were starting well. However, the few remaining feeds that I know of that include geospatial information do use GeoRSS only, so I guess they won in the end. The fact that only geospatial experts would be using geospatial coordinates within RSS feeds, and that most GIS software only supports GeoRSS or name all of their RSS support GeoRSS, must have helped.</p>
<p>GeoRSS defines two so-called "serializations", called <em>Simple</em> and <em>GML</em>. In this post, we will only consider GeoRSS Simple; GML requires us to delve deeper into the mess that is geospatial information, so we'll see that at some other point in time. The goal is to have most feed producers, those that are not geospatial experts, use GeoRSS Simple, which is simple enough to be understandable by them, and have geospatial experts use GML, which they probably prefer. You can convert from GeoRSS Simple to GeoRSS GML, but not necessarily the other way around.</p>
<p>Here's an example of yet another way to represent a point in an RSS feed, but using GeoRSS Simple this time:</p>
<pre>
<figure>
<pre>
&lt;rss version="2.0" xmlns:georss="http://www.georss.org/georss"&gt;
&lt;channel&gt;
&lt;!-- ... --&gt;
@ -1435,7 +1446,9 @@
&lt;/channel&gt;
&lt;/rss&gt;
</pre>
<p>Where the other namespaces use two distinct tags to represent both coordinates of a point, GeoRSS uses only one tag, which is defined as a list of real numbers. While using one or two tags does not matter much whether you use one form or the other when using GPS coordinates, it does start to matter when you care a lot about altitude or work with other coordinate systems. GeoRSS Simple requires WGS84 (GPS) coordinates and represents elevation separately, so it won't ever matter in this serialization, but with GML, it will!</p>
<figcaption>Example of a point added to an RSS channel and item using GeoRSS Simple</figcaption>
</figure>
<p>Where the other namespaces use two distinct tags to represent both coordinates of a point, GeoRSS uses only one tag, which is defined as a list of real numbers. While using one or two tags does not matter much when using GPS coordinates, it does start to matter when you care a lot about altitude or work with other coordinate systems. GeoRSS Simple requires WGS84 (GPS) coordinates and represents elevation separately, so it won't ever matter in this serialization, but with GML, it will!</p>
<p>You may also note that in the first <code>point</code>, I used a space to separate both coordinates, whereas in the second one I used a comma. <a href="https://schemas.opengis.net/georss/1.0/schema-1.1/georss.xsd" target="_blank">The official <abbr title="XML Schema Definition">XSD</abbr></a> for GeoRSS Simple defines the point as holding a list of doubles (decimal numbers stored in 8 bytes) using the XSD <code>&lt;xs:list&gt;</code> element, which defines a list of items as being space-separated only. But <a href="https://docs.ogc.org/cs/17-002r1/17-002r1.html#20" target="_blank">section 7.3</a> of the OGC standard states that a comma is also acceptable, so anyone wishing to parse GeoRSS will have to take that into account.</p>
]]></description>
<georss:point>18.5166670 33.6666670</georss:point>
@ -1450,7 +1463,8 @@
<link>https://docs.ogc.org/cs/17-002r1/17-002r1.html#26</link>
<description><![CDATA[
<p><a href="https://envs.net/~lucidiot/rsrsss/feed.xml#georss-simple-1" target="_blank">In a previous post</a>, I introduced GeoRSS Simple, a subset of GeoRSS, and described a fourth way to point to a location in your RSS feeds. With the W3C Geo namespace, we could add altitude information as well, but with GeoRSS, we can go even further beyond that:</p>
<pre>
<figure>
<pre>
&lt;rss version="2.0" xmlns:georss="http://www.georss.org/georss"&gt;
&lt;channel&gt;
&lt;item&gt;
@ -1466,6 +1480,8 @@
&lt;/channel&gt;
&lt;/rss&gt;
</pre>
<figcaption>A point added to an RSS item using GeoRSS Simple, with optional elements</figcaption>
</figure>
<p>Here's a description of all of those intriguing optional elements:</p>
<dl>
<dt><code>&lt;<dfn>georss:featureName</dfn>&gt;</code></dt>
@ -1512,7 +1528,8 @@
<dd>This is the geometric, and not the geospatial definition of a polygon. In <abbr title="Geographical Information Systems">GIS</abbr>, a polygon has multiple linear rings: one exterior ring, and zero or more interior rings that draw holes inside of the polygon. A linear ring is the more common definition of a polygon: a line that starts and ends at the same point. Here, we can only have the exterior ring of a polygon, so this is actually a linear ring. It is represented just like a line, as pairs of coordinates. There are at least three points per polygon, and the first and last must be equal.</dd>
</dl>
<p>Here are some examples of each of those tags:</p>
<pre>
<figure>
<pre>
&lt;!-- Part of Haaldersbroekerdwarsstraat, a long street name in the Netherlands --&gt;
&lt;georss:line&gt;52.4718867,4.8277792 52.4721926,4.8275892 52.4729501,4.8270419&lt;/georss:line&gt;
@ -1534,6 +1551,8 @@ because astronomers need coffee to go through the night --&gt;
-24.6273416,-70.4045081
&lt;/georss:polygon&gt;
</pre>
<figcaption>A line, a rectangle and a polygon represented with GeoRSS Simple</figcaption>
</figure>
<p>You can only specify one of these geometries at once, along with all the optional elements that I described in the previous post. Those new shapes enable some new interesting use cases for feeds:</p>
<ul>
<li>Blogging about a cross-country hike, with the GPS track of each day as a <code>&lt;georss:line&gt;</code>.</li>
@ -1691,12 +1710,12 @@ because astronomers need coffee to go through the night --&gt;
<category domain="https://envs.net/~lucidiot/rsrsss/">Tip</category>
<category domain="https://envs.net/~lucidiot/rsrsss/">Geospatial/GeoRSS</category>
<description><![CDATA[
<p>In <a href="https://envs.net/~lucidiot/rsrsss/#georss-gml" target="_blank">yet another incredibly niche blog post</a>, I described GeoRSS GML. While working on this, I got quite confused by circles, eenough to decide to just remove any mention of circles in all of the previous GeoRSS posts.</p>
<p>The <a href="https://docs.ogc.org/cs/17-002r1/17-002r1.html" target="_blank">OGC standard</a>, which is the only currently active standard, and the original archived pages for <a href="https://web.archive.org/web/20200629173428/http://www.georss.org/simple.html" target="_blank">GeoRSS Simple</a> and <a href="https://web.archive.org/web/20200629173624/http://www.georss.org/gml.html" target="_blank">GeoRSS GML</a> do not define any specific element to describe a circle. If you want to represent a circle, you can do so using the &lt;georss:radius&gt; element, which will create a <a href="https://wiki.gis.com/wiki/index.php/Buffer_(GIS)" target="_blank">buffer</a> around a point.</p>
<p>In <a href="https://envs.net/~lucidiot/rsrsss/#georss-gml" target="_blank">yet another incredibly niche blog post</a>, I described GeoRSS GML. While working on this, I got quite confused by circles, enough to decide to just remove any mention of circles in all of the previous GeoRSS posts.</p>
<p>The <a href="https://docs.ogc.org/cs/17-002r1/17-002r1.html" target="_blank">OGC standard</a>, which is the only currently active standard, and the original archived pages for <a href="https://web.archive.org/web/20200629173428/http://www.georss.org/simple.html" target="_blank">GeoRSS Simple</a> and <a href="https://web.archive.org/web/20200629173624/http://www.georss.org/gml.html" target="_blank">GeoRSS GML</a> do not define any specific element to describe a circle. If you want to represent a circle, you can do so using the <code>&lt;georss:radius&gt;</code> element, which will create a <a href="https://wiki.gis.com/wiki/index.php/Buffer_(GIS)" target="_blank">buffer</a> around a point.</p>
<figure>
<pre>
&lt;!-- GeoRSS Simple --&gt;
&lt;gml:point&gt;-24.62759969859908 -70.40503541618583&lt;/gml:point&gt;
&lt;georss:point&gt;-24.62759969859908 -70.40503541618583&lt;/georss:point&gt;
&lt;georss:radius&gt;14.74038882&lt;/gml:radius&gt;
&lt;georss:featureName&gt;Antu, VLT-UT1&lt;/georss:featureName&gt;
&lt;georss:featureTypeTag&gt;telescope&lt;/georss:featureTypeTag&gt;
@ -1705,9 +1724,9 @@ because astronomers need coffee to go through the night --&gt;
&lt;!-- GeoRSS GML --&gt;
&lt;georss:where&gt;
&lt;gml:CircleByCenterPoint&gt;
&lt;gml:Point&gt;
&lt;gml:pos&gt;-24.62759969859908 -70.40503541618583&lt;/gml:pos&gt;
&lt;/gml:CircleByCenterPoint&gt;
&lt;/gml:Point&gt;
&lt;/georss:where&gt;
&lt;georss:radius&gt;14.74038882&lt;/gml:radius&gt;
&lt;georss:featureName&gt;Antu, VLT-UT1&lt;/georss:featureName&gt;
@ -1717,7 +1736,7 @@ because astronomers need coffee to go through the night --&gt;
</pre>
<figcaption>Examples of a circle represented as a center point and a radius in GeoRSS</figcaption>
</figure>
<p>However, <a href="https://schemas.opengis.net/georss/1.0/schema-1.1/gmlgeorss.xsd" target="_blank">the <abbr title="XML Schema Definition">XSD</abbr> defining the GeoRSS GML Profile</a> and <a href="https://schemas.opengis.net/georss/1.0/schema-1.1/georss.xsd" target="_blank">the one for GeoRSS Simple</a>, both include ways to specify a circle separately. The OGC standard <a href="https://docs.ogc.org/cs/17-002r1/17-002r1.html#7" target="_blank">has links to the schemas</a> and does not state that those schemas are not non-normative, as many other specifications do. That means that in theory, it is completely legal to use them.</p>
<p>However, <a href="https://schemas.opengis.net/georss/1.0/schema-1.1/gmlgeorss.xsd" target="_blank">the <abbr title="XML Schema Definition">XSD</abbr> defining the GeoRSS GML Profile</a>, and <a href="https://schemas.opengis.net/georss/1.0/schema-1.1/georss.xsd" target="_blank">the one for GeoRSS Simple</a>, both include ways to specify a circle separately. The OGC standard <a href="https://docs.ogc.org/cs/17-002r1/17-002r1.html#7" target="_blank">has links to the schemas</a> and does not state that those schemas are not non-normative, as many other specifications do. That means that in theory, it is completely legal to use them.</p>
<h3>Reference</h3>
<dl>
@ -1728,7 +1747,7 @@ because astronomers need coffee to go through the night --&gt;
<dt><code>&lt;<dfn>gml:radius</dfn>&gt;</code></dt>
<dd>The radius of a circle. This can have an <code>uom</code> attribute to specify the unit of measurement, which is by default <code>m</code> to represent meters.</dd>
<dt><code><dfn>uom</dfn></code></dt>
<dd>A unit of measurement. <a href="https://portal.ogc.org/files/?artifact_id=20509" target="_blank">OGC GML 3.2.1 specification</a> defines its value under section 8.2.3.6. It can be either a string, without any colons, spaces, tabs, carriage returns or line breaks, or a URL. When using strings, following the <a href="https://ucum.org/" target="_blank">Unified Code for Units of Measure</a> is recommended. For example, you could use <code>m</code> for meters, <code>cm</code> for centimeters, <code>[ft_i]</code> for feet (international definition) or <code>[ft_us]</code> for U.S. feets. It is highly likely that most systems will only support meters.</dd>
<dd>A unit of measurement. The <a href="https://portal.ogc.org/files/?artifact_id=20509" target="_blank">OGC GML 3.2.1 specification</a> defines its value under section 8.2.3.6. It can be either a string, without any colons, spaces, tabs, carriage returns or line breaks, or a URL. When using strings, following the <a href="https://ucum.org/" target="_blank">Unified Code for Units of Measure</a> is recommended. For example, you could use <code>m</code> for meters, <code>cm</code> for centimeters, <code>[ft_i]</code> for feet (international definition) or <code>[ft_us]</code> for U.S. feets. It is highly likely that most systems will only support meters.</dd>
</dl>
<h3>Examples</h3>
@ -1758,7 +1777,7 @@ because astronomers need coffee to go through the night --&gt;
<h3>Notes</h3>
<p>The <a href="https://doc.arcgis.com/en/arcgis-online/reference/georss.htm" target="_blank">GeoRSS documentation on ArcGIS Online</a> mentions supports for circles on GeoRSS Simple, but excludes them from GeoRSS GML. I would therefore advise against trying to use a <code>CircleByCenterPoint</code>. It is likely that the few GeoRSS implementations out there will only support <code>&lt;georss:circle&gt;</code>, if they support circles at all.</p>
<p>The <a href="https://validator.w3.org/feed/" target="_blank">W3C Feed Validation Service</a> does not support circles in either its <a href="https://github.com/w3c/feedvalidator/blob/ff89646c3f6869058dfcf5a3cf9b6ead49bbe42d/src/feedvalidator/extension.py#L211-L239" target="_blank">GeoRSS Simple validator</a> nor its <a href="https://github.com/w3c/feedvalidator/blob/ff89646c3f6869058dfcf5a3cf9b6ead49bbe42d/src/feedvalidator/extension.py#L732-L740" target="_blank">GeoRSS GML validator</a>.
<p>The <a href="https://validator.w3.org/feed/" target="_blank">W3C Feed Validation Service</a> does not support circles in either its <a href="https://github.com/w3c/feedvalidator/blob/ff89646c3f6869058dfcf5a3cf9b6ead49bbe42d/src/feedvalidator/extension.py#L211-L239" target="_blank">GeoRSS Simple validator</a> or its <a href="https://github.com/w3c/feedvalidator/blob/ff89646c3f6869058dfcf5a3cf9b6ead49bbe42d/src/feedvalidator/extension.py#L732-L740" target="_blank">GeoRSS GML validator</a>.
<p>Circles were probably either added before <code>&lt;georss:radius&gt;</code> was introduced, or added, then partially removed when someone noticed <code>&lt;georss:radius&gt;</code> could already do the job. Another possibility is that circles and curves are far less supported by GIS software than linear geometries, so they wouldn't be that usable anyway. This raises interesting questions: what happens if you use a circle, but also add a radius around it? Do you get a larger circle? Is the radius ignored? Does it become an approximation of a circle as a polygon, as is common with GIS software that doesn't support circles? Those questions will definitely remain unanswered, as with most things about RSS, the answer of most organizations nowadays will be "who cares?". This is why we can't have nice things.</p>
]]></description>
@ -2150,7 +2169,7 @@ return &lt;type id="{$i}" name="{$type}" count="{$count}" /&gt;
<p>A few years later, I had found eyeOS, yet another WebOS, but that you could self-host this time. It had more applications available, but they were less interesting—the whole thing was more meant to be a demo of what apps you could create with it. They had something akin to an app store. I tried both their own demo instance and hosted my own, as I had learnt a bit more about webservers by that time.</p>
<p>I now tend to be wary of large piles of JavaScript like those as the current state of the JavaScript ecosystem tends to make everything worse, so I don't generally care much about the current attempts at making a new WebOS, like <a href="https://www.os-js.org/" target="_blank">OS.js</a>… unless they are fun.</p>
<p>Windows 93 is a pretty well done recreation of the Windows 95 user interface that started in 2014. It has a community that provided plenty of new apps to give the system a lot of content and fill it with weird jokes and "viruses". This is definitely not meant to be a replacement for a desktop OS like Desktoptwo or eyeOS attempted, and just a weird bundle of apps and games that mix the modern web and 30-year-old designs.</p>
<p>Their RSS feed gives some rare status updates about the project. I thought the project had been pretty much dead by now, since the feed had gotten no updates at all in a long while, but they announced that they working on a full rewrite. Version 3 will be open source, and it will be based on <a href="https://github.com/windows93dotnet/sys42" target="_blank">Sys42</a>, their own custom framework that skips one of the worst parts of modern JavaScript (Webpack) and allows building any web OS, not just a whimsy Windows 95 clone.</p>
<p>Their RSS feed gives some rare status updates about the project. I thought the project had been pretty much dead by now, since the feed had gotten no updates at all in a long while, but they announced that they are working on a full rewrite. Version 3 will be open source, and it will be based on <a href="https://github.com/windows93dotnet/sys42" target="_blank">Sys42</a>, their own custom framework that skips one of the worst parts of modern JavaScript (Webpack) and allows building any web OS, not just a whimsy Windows 95 clone.</p>
<p>I am impressed by how much effort people sometimes put into these projects.</p>
]]></description>
</item>
@ -2355,6 +2374,92 @@ $ printf hunter2 | md5sum
<p>The comic updates less regularly now, but it is not dead at all, and the occasional comic showing up in my feedreader never fails to make me laugh at least a little. A nice addition to a large pile of feeds if you want a break from reading news articles from time to time.</p>
]]></description>
</item>
<item>
<title>Sweet Home 3D</title>
<pubDate>Tue, 05 Mar 2024 14:19:28 +0100</pubDate>
<guid isPermaLink="false">sweethome3d</guid>
<category domain="https://envs.net/~lucidiot/rsrsss/">Feed</category>
<link>https://www.sweethome3d.com/blog/rss.xml</link>
<description><![CDATA[
<p>In 2008, while I was in <em>collège</em> (the French middle school) and before I even knew about the concept of open source software, I discovered Sweet Home 3D on a laptop that my cousins had recovered from a nearby dump.</p>
<p>That laptop was running Windows XP Pro. My cousins knew about the trick where you can reboot into Safe Mode and get access to a usually passwordless <em>Administrator</em> account, but they were only used to the Home Edition login screen where you can just click into the account, not to the Pro login screen where you have to type the username and password. I tried typing in <kbd>Administrator</kbd> without a password, and did get into the laptop, so we could play games on that laptop during our holidays.</p>
<p>I brought that laptop to a skate park and drew a scooter on Paint, then put it into an <abbr title="Rich Text Format">RTF</abbr> documentation next to a cookie recipe, making this the oldest document that I created and still have in my archives.</p>
<p>A few months later, I stumbled upon it again, during a time where I was playing the Sims 2 and 3 with a classmate, and played with it and other 3D software to design random homes. I say design homes, but really I was just creating a new plan, drawing a house, and giving up halfway through or just making Sweet Home 3D render complete nonsense. I think more houses should have all of their furniture upside down, that sounds much more practical.</p>
<p>Anyway, I still do occasionally play with it nowadays. I found out that it was made by a French developer, and that the French forensics service got them to add more models, so you can now put shotguns in your houses! And most importantly of course, it has a blog with an <a href="https://www.sweethome3d.com/blog/rss.xml" target="_blank">RSS feed</a> and an <a href="https://www.sweethome3d.com/blog/atom.xml" target="_blank">Atom feed</a>.</p>
]]></description>
</item>
<item>
<title>Build a service status page as an RSS feed</title>
<pubDate>Sun, 10 Mar 2024 17:48:57 +0100</pubDate>
<guid isPermaLink="false">servicestatus</guid>
<category domain="https://envs.net/~lucidiot/rsrsss/">XSD</category>
<link>https://envs.net/~lucidiot/rsrsss/xsd/servicestatus.xsd</link>
<description><![CDATA[
<p>It is quite common nowadays for websites, or just any Internet-powered application or service, to have a webpage somewhere reporting on the status of said service, to the extent that many companies and other services exist just to provide those. Those status services often include e-mail alerts that you can subscribe to to get notified of an outage or a planned maintenance on the service. <a href="https://www.atlassian.com/software/statuspage" target="_blank">Statuspage</a> is one such service, one of the most well known due to it having been vored by Atlassian. Statuspage doesn't just provide e-mails though, it also has feeds! An <a href="https://metastatuspage.com/history.rss" target="_blank"><abbr title="Really Simple Syndication">RSS</abbr> feed</a> and an <a href="https://metastatuspage.com/history.atom" target="_blank">Atom feed</a> are available, providing a history of the planned maintenances or incidents.</p>
<p>Unfortunately, those feeds are annoying to deal with for machines. If you want to tell anything about the service's status somewhere else, scraping data from the feeds will be just as annoying, if not more, than the HTML document. We can do better though, and we have been able to do better for over twenty years.</p>
<p>The <a href="https://web.resource.org/rss/1.0/modules/servicestatus/" target="_blank"><abbr title="Resource Description Framework">RDF</abbr> Site Summary 1.0 Service Status module</a> is one of many forgotten extensions to <abbr title="RDF Site Summary">RSS</abbr> 1.0. In an incredible plot twist you could never expect from its name, it is meant to report on a service's status, and provides some extra XML elements to help with that.</p>
<figure>
<pre>&lt;rss
version="2.0"
xmlns:ss="http://purl.org/rss/1.0/modules/servicestatus/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://purl.org/rss/1.0/modules/servicestatus/
https://envs.net/~lucidiot/rsrsss/xsd/servicestatus.xsd
"
&gt;
&lt;channel&gt;
&lt;!-- ... --&gt;
&lt;ss:aboutStats&gt;https://envs.net/~lucidiot/rsrsss/feed.xml#servicestatus&lt;/ss:aboutStats&gt;
&lt;item&gt;
&lt;!-- ... --&gt;
&lt;ss:responding&gt;true&lt;/ss:responding&gt;
&lt;ss:lastChecked&gt;1970-01-01T00:00:00+00:00&lt;/ss:lastChecked&gt;
&lt;ss:lastSeen&gt;1970-01-01T00:00:00+00:00&lt;/ss:lastSeen&gt;
&lt;ss:availability&gt;100&lt;/ss:availability&gt;
&lt;ss:averageResponseTime&gt;0.5&lt;/ss:availableResponseTime&gt;
&lt;ss:statusMessage&gt;Everything is fine.&lt;/ss:statusMessage&gt;
&lt;/item&gt;
&lt;/channel&gt;
&lt;/rss&gt;</pre>
<figcaption>Example of an <abbr title="Really Simple Syndication">RSS</abbr> 2.0 feed with every optional Service Status module element in use</figcaption>
</figure>
<p>Using those extra elements, you can report in a more machine-readable format on how your service is doing. Every element in this namespace is optional, and you can use them to report on whether your service is working, when that was last checked, when the server last worked, how well it is working, how fast it is working, and leave a message for human consumption, usually to report about how you are doing on fixing a specific issue.</p>
<p>The above example uses the <a href="https://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation" target="_blank"><code>xsi:schemaLocation</code></a> attribute to point <abbr title="XML Schema Definition">XSD</abbr> validators to <a href="https://envs.net/~lucidiot/rsrsss/xsd/servicestatus.xsd" target="_blank">the schema</a> I wrote to validate this namespace, if you want to validate your feed very hard. The <a href="https://validator.w3.org/feed/" target="_blank">W3C Feed Validation Service</a> is aware of the existence of this namespace, so it won't warn about an unknown namespace, but it does not do any validation on its elements, so you'll need that schema to do any interesting validation.</p>
<p>The overengineered <a href="https://envs.net/~lucidiot/rsrsss/xsl/style.xsl" target="_blank"><abbr title="Extensible Stylesheet Language Transformation">XSLT</abbr></a> used to display this feed in HTML in modern browsers has been updated and supports this namespace, so you could use it directly to roll a status page that is nothing but an RSS feed, if you don't want to duplicate information. You can <a href="https://envs.net/~lucidiot/rsrsss/feed.xml#servicestatus" target="_blank">open this post in a compatible browser</a> to get a preview.</p>
<h3>Reference</h3>
<dl>
<dt><code>&lt;<dfn>ss:aboutStats</dfn>&gt;</code></dt>
<dd>
<p>An <abbr title="Resource Description Framework">RDF</abbr> resource that should describe how the <code>availability</code> and <code>averageResponseTime</code> statistics are calculated in this feed. This should be used only on a <code>channel</code> element.</p>
<p>Note that <a href="https://stackoverflow.com/a/48195644/5990435" target="_blank">anything is an RDF resource</a>, and there are many ways to serialize an RDF resource as XML. However, <a href="https://web.resource.org/rss/1.0/modules/servicestatus/" target="_blank">the official specification</a> only uses the form where the element just contains a URL, therefore this form is recommended. Feed generator implementers that do not know about RDF and its <a href="https://www.w3.org/TR/rdf-syntax-grammar/" target="_blank">XML representation</a> are likely to only use this form, and feed parser implementers are likely to only support this form.</p>
</dd>
<dt><code>&lt;<dfn>ss:responding</dfn>&gt;</code></dt>
<dd>Whether or not the service is responding.</dd>
<dt><code>&lt;<dfn>ss:lastChecked</dfn>&gt;</code></dt>
<dd>The most recent time a check was performed, as a <a href="https://www.w3.org/TR/NOTE-datetime" target="_blank">W3C datetime</a>, a subset of ISO&nbsp;8601. You may want to have both the usual <code>&lt;pubDate&gt;</code> element and this element to share the same values. When the <code>responding</code> element is set to <code>true</code>, this should be exactly equal to <code>lastSeen</code>, meaning that this should be the end time of the last check, not the start time. If this was the start time, then <code>lastSeen</code> would be the end time, and they would not be equal.</dd>
<dt><code>&lt;<dfn>ss:lastSeen</dfn>&gt;</code></dt>
<dd>The most recent time a check was successful, as a <a href="https://www.w3.org/TR/NOTE-datetime" target="_blank">W3C datetime</a>, a subset of ISO&nbsp;8601. When the <code>responding</code> element is set to <code>true</code>, this should be exactly equal to <code>lastChecked</code>. When it is <code>false</code>, the difference between <code>lastSeen</code> and <code>lastChecked</code> should give an estimate of how long the service was down for.</dd>
<dt><code>&lt;<dfn>ss:availability</dfn>&gt;</code></dt>
<dd>An integer representing the percentage of availability, between 0 and 100. How this availability is calculated is left up to the implementer and should be described by the <code>aboutStats</code> element.</dd>
<dt><code>&lt;<dfn>ss:averageResponseTime</dfn>&gt;</code></dt>
<dd>A decimal number representing the average response time of the service in seconds. How this availability is calculated is left up to the implementer and should be described by the <code>aboutStats</code> element.</dd>
<dt><code>&lt;<dfn>ss:statusMessage</dfn>&gt;</code></dt>
<dd>A message intended for human consumption giving further details about the service's status. This could for example warn of a planned outage, or give updates on how an ongoing issue is being worked on.</dd>
</dl>
]]></description>
<ss:responding>true</ss:responding>
<ss:lastChecked>2024-03-10T17:48:57+0100</ss:lastChecked>
<ss:lastSeen>2024-03-10T17:48:57+0100</ss:lastSeen>
<ss:availability>100</ss:availability>
<ss:averageResponseTime>0.42</ss:averageResponseTime>
<ss:statusMessage>If you can read this, then RSRSSS is definitely working.</ss:statusMessage>
</item>
</channel>
<access:restriction relationship="allow" />
</rss>