diff options
| author | Paul Buetow <paul@buetow.org> | 2023-04-30 13:10:43 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2023-04-30 13:10:43 +0300 |
| commit | c17bb3b75fc6630a30922554e7d9094bb56faa2e (patch) | |
| tree | 99b0e157e1cf2828f6776d8d6a2c03cf187d6c9a /gemfeed/atom.xml | |
| parent | cda340885fdac7bcb3e6c899dd8894d20f02a321 (diff) | |
Update content for html
Diffstat (limited to 'gemfeed/atom.xml')
| -rw-r--r-- | gemfeed/atom.xml | 228 |
1 files changed, 180 insertions, 48 deletions
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml index e95b43e4..4f41c4ab 100644 --- a/gemfeed/atom.xml +++ b/gemfeed/atom.xml @@ -1,12 +1,190 @@ <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - <updated>2023-04-26T22:47:49+03:00</updated> + <updated>2023-04-30T13:10:26+03:00</updated> <title>foo.zone feed</title> <subtitle>To be in the .zone!</subtitle> <link href="https://foo.zone/gemfeed/atom.xml" rel="self" /> <link href="https://foo.zone/" /> <id>https://foo.zone/</id> <entry> + <title>Unveiling `guprecords.raku`: Global Uptime Records with Raku</title> + <link href="https://foo.zone/gemfeed/2023-05-01-unveiling-guprecords:-uptime-records-with-raku.html" /> + <id>https://foo.zone/gemfeed/2023-05-01-unveiling-guprecords:-uptime-records-with-raku.html</id> + <updated>2023-04-30T13:10:26+03:00</updated> + <author> + <name>Paul Buetow</name> + <email>hi@paul.cyou</email> + </author> + <summary>For fun, I am tracking the uptime of various personal machines (servers, laptops, workstations...). I have been doing this for over ten years now, so I have a lot of statistics collected.</summary> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + <h1 style='display: inline'>Unveiling <span class='inlinecode'>guprecords.raku</span>: Global Uptime Records with Raku</h1><br /> +<br /> +<pre> ++-----+-----------------+-----------------------------+ +| Pos | Host | Lifespan | ++-----+-----------------+-----------------------------+ +| 1. | dionysus | 8 years, 6 months, 17 days | +| 2. | uranus | 7 years, 2 months, 16 days | +| 3. | alphacentauri | 6 years, 9 months, 13 days | +| 4. | *vulcan | 4 years, 5 months, 6 days | +| 5. | sun | 3 years, 10 months, 2 days | +| 6. | uugrn | 3 years, 5 months, 5 days | +| 7. | deltavega | 3 years, 1 months, 21 days | +| 8. | pluto | 2 years, 10 months, 30 days | +| 9. | tauceti | 2 years, 3 months, 22 days | +| 10. | callisto | 2 years, 3 months, 13 days | ++-----+-----------------+-----------------------------+ +</pre> +<br /> +<h1 style='display: inline'>Introduction</h1><br /> +<br /> +<span>For fun, I am tracking the uptime of various personal machines (servers, laptops, workstations...). I have been doing this for over ten years now, so I have a lot of statistics collected.</span><br /> +<br /> +<span>As a result of this, I am introducing <span class='inlinecode'>guprecords.raku</span>, a handy Raku script that helps me combine uptime statistics from multiple servers into one comprehensive report. In this blog post, I'll explore what Guprecords is and some examples of its application. I will also add some notes on Raku.</span><br /> +<br /> +<span>Guprecords, or global uptime records, is a Raku script designed to generate a consolidated uptime report from multiple hosts:</span><br /> +<br /> +<a class='textlink' href='https://codeberg.org/snonux/guprecords'>https://codeberg.org/snonux/guprecords</a><br /> +<br /> +<span>A previous version of Guprecords was actually written in Perl, the older and more established language from which Raku was developed. One of the primary motivations for rewriting Guprecords in Raku was to learn the language and explore its features. Raku is a more modern and powerful language compared to Perl, and working on a real-world project like Guprecords provided a practical and engaging way to learn the language.</span><br /> +<br /> +<span>Over the last years, I have been reading the following books and resources about Raku:</span><br /> +<br /> +<ul> +<li>Raku Guide (at raku.guide)</li> +<li>Think Perl 6</li> +<li>Raku Fundamentals</li> +<li>Raku Recipes</li> +</ul><br /> +<span>And I have been following the Raku newsletter, and sometimes I have been lurking around in the IRC channels, too. Watching Raku coding challenges on YouTube was pretty fun, too. However, nothing beats actually using Raku to learn the language. After reading all of these resources, I may have a good idea about the features and paradigms, but I am by far not an expert.</span><br /> +<br /> +<h2 style='display: inline'>How Guprecords works</h2><br /> +<br /> +<span>Guprecords works in three stages:</span><br /> +<br /> +<ul> +<li>1. Generating uptime statistics using <span class='inlinecode'>uptimed</span>: First, I need to install and run <span class='inlinecode'>uptimed</span> on each host to generate uptime statistics. This tool is available for most common Linux and *BSD distributions and macOS via Homebrew.</li> +<li>2. Collecting uptime records to a central location: The next step involves collecting the raw uptime statistics files generated by <span class='inlinecode'>uptimed</span> on each host. It's a good idea to store all record files in a central git repository. The records file contains information about the total uptime since boot, boot time, and the operating system and kernel version. Guprecords itself does not do the collection part, but have a look at the <span class='inlinecode'>README.md</span> in the git repository for some guidance.</li> +<li>3. Generating global uptime stats: Finally, run the <span class='inlinecode'>guprecords.raku</span> script with the appropriate flags to create a global uptime report. For example, I can use the following command:</li> +</ul><br /> +<!-- Generator: GNU source-highlight 3.1.9 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre>$ raku guprecords<font color="#990000">.</font>raku --stats<font color="#990000">=</font><font color="#009900">dir</font><font color="#990000">=</font><font color="#009900">$HOME</font>/git/uprecords/stats --all +</pre> +<br /> +<span>This command will generate a comprehensive uptime report from the collected statistics, making it easy to review and enjoy the data.</span><br /> +<br /> +<span>Guprecords supports the following features:</span><br /> +<br /> +<ul> +<li>Supports multiple categories: Host, Kernel, KernelMajor, and KernelName</li> +<li>Supports multiple metrics: Boots, Uptime, Score, Downtime, and Lifespan</li> +<li>Output formats available: Plaintext, Markdown, and Gemtext</li> +<li>Provides top entries based on the specified limit</li> +</ul><br /> +<h2 style='display: inline'>Example</h2><br /> +<br /> +<span>You have already seen an example at the very top of this post, where the hosts were grouped by their total lifespans (uptime+downtime). Here's an example of what the global uptime report (grouped by total host uptimes) might look like:</span><br /> +<br /> +<pre> +Top 20 Uptime's by Host + ++-----+-----------------+-----------------------------+ +| Pos | Host | Uptime | ++-----+-----------------+-----------------------------+ +| 1. | *vulcan | 4 years, 5 months, 6 days | +| 2. | uranus | 3 years, 11 months, 21 days | +| 3. | sun | 3 years, 9 months, 26 days | +| 4. | uugrn | 3 years, 5 months, 5 days | +| 5. | deltavega | 3 years, 1 months, 21 days | +| 6. | pluto | 2 years, 10 months, 29 days | +| 7. | tauceti | 2 years, 3 months, 19 days | +| 8. | tauceti-f | 1 years, 9 months, 18 days | +| 9. | *ultramega15289 | 1 years, 8 months, 17 days | +| 10. | *earth | 1 years, 5 months, 22 days | +| 11. | *blowfish | 1 years, 4 months, 20 days | +| 12. | ultramega8477 | 1 years, 3 months, 25 days | +| 13. | host0 | 1 years, 3 months, 9 days | +| 14. | tauceti-e | 1 years, 2 months, 20 days | +| 15. | makemake | 1 years, 1 months, 6 days | +| 16. | callisto | 0 years, 10 months, 31 days | +| 17. | alphacentauri | 0 years, 10 months, 28 days | +| 18. | london | 0 years, 9 months, 16 days | +| 19. | twofish | 0 years, 8 months, 31 days | +| 20. | *fishfinger | 0 years, 8 months, 17 days | ++-----+-----------------+-----------------------------+ +</pre> +<br /> +<span>This table ranks the top 20 hosts based on their total uptime, with the host having the highest uptime at the top. The hosts marked with <span class='inlinecode'>*</span> are still active, means stats were collected within the last couple of months. </span><br /> +<br /> +<span>My up to date stats can be seen here:</span><br /> +<br /> +<a class='textlink' href='../uptime-stats.html'>My machine uptime stats</a><br /> +<br /> +<span>Just recently, I decommissioned <span class='inlinecode'>vulcan</span> (the number one stop from above), which used to be my CentOS 7 (initially CentOS 6) VM hosting my personal NextCloud and Wallabag (which I modernised just recently with a brand new shiny Rocky Linux 9 VM). This was the last <span class='inlinecode'>uptimed</span> output before shutting it down (it always makes me feel sentimental decommissioning one of my machines <span class='inlinecode'>:'-(</span>):</span><br /> +<br /> +<pre> + # Uptime | System Boot up +----------------------------+--------------------------------------------------- + 1 545 days, 17:58:15 | Linux 3.10.0-1160.15.2.e Sun Jul 25 19:32:25 2021 + 2 279 days, 10:12:14 | Linux 3.10.0-957.21.3.el Sun Jun 30 12:43:41 2019 + 3 161 days, 06:08:43 | Linux 3.10.0-1160.15.2.e Sun Feb 14 11:05:38 2021 + 4 107 days, 01:26:35 | Linux 3.10.0-957.1.3.el7 Thu Dec 20 09:29:13 2018 + 5 96 days, 21:13:49 | Linux 3.10.0-1127.13.1.e Sat Jul 25 17:56:22 2020 +-> 6 89 days, 23:05:32 | Linux 3.10.0-1160.81.1.e Sun Jan 22 12:39:36 2023 + 7 63 days, 18:30:45 | Linux 3.10.0-957.10.1.el Sat Apr 27 18:12:43 2019 + 8 63 days, 06:53:33 | Linux 3.10.0-1127.8.2.el Sat May 23 10:41:08 2020 + 9 48 days, 11:44:49 | Linux 3.10.0-1062.18.1.e Sat Apr 4 22:56:07 2020 + 10 42 days, 08:00:13 | Linux 3.10.0-1127.19.1.e Sat Nov 7 11:47:33 2020 + 11 36 days, 22:57:19 | Linux 3.10.0-1160.6.1.el Sat Dec 19 19:47:57 2020 + 12 21 days, 06:16:28 | Linux 3.10.0-957.10.1.el Sat Apr 6 11:56:01 2019 + 13 12 days, 20:11:53 | Linux 3.10.0-1160.11.1.e Mon Jan 25 18:45:27 2021 + 14 7 days, 21:29:18 | Linux 3.10.0-1127.13.1.e Fri Oct 30 14:18:04 2020 + 15 6 days, 20:07:18 | Linux 3.10.0-1160.15.2.e Sun Feb 7 14:57:35 2021 + 16 1 day , 21:46:41 | Linux 3.10.0-957.1.3.el7 Tue Dec 18 11:42:19 2018 + 17 0 days, 01:25:57 | Linux 3.10.0-957.1.3.el7 Tue Dec 18 10:16:08 2018 + 18 0 days, 00:42:34 | Linux 3.10.0-1160.15.2.e Sun Jul 25 18:49:38 2021 + 19 0 days, 00:08:32 | Linux 3.10.0-1160.81.1.e Sun Jan 22 12:30:52 2023 +----------------------------+--------------------------------------------------- +1up in 6 days, 22:08:18 | at Sat Apr 29 10:53:25 2023 +no1 in 455 days, 18:52:44 | at Sun Jul 21 07:37:51 2024 + up 1586 days, 00:20:28 | since Tue Dec 18 10:16:08 2018 + down 0 days, 01:08:32 | since Tue Dec 18 10:16:08 2018 + %up 99.997 | since Tue Dec 18 10:16:08 2018 +</pre> +<br /> +<h2 style='display: inline'>Conclusion</h2><br /> +<br /> +<span>Guprecords is a small, yet powerful tool for analyzing uptime statistics. While developing Guprecords, I have come to truly appreciate and love Raku's expressiveness. The language is designed to be both powerful and flexible, allowing developers to express their intentions and logic more clearly and concisely.</span><br /> +<br /> +<span>Raku's expressive syntax, support for multiple programming paradigms, and unique features, such as grammars and lazy evaluation, make it a joy to work with. The language's strong emphasis on readability and maintainability allows for the creation of elegant code that is easy to understand and modify.</span><br /> +<br /> +<span>Working on Guprecords in Raku has been an enjoyable experience, and I've found that Raku's expressiveness has significantly contributed to the overall quality and effectiveness of the script. The language's ability to elegantly express complex logic and data manipulation tasks makes it an excellent choice for developing tools like these, where clarity and efficiency are of the utmost importance.</span><br /> +<br /> +<span>So far, I have only scratched the surface of what Raku can do. I hope to find more time to become a regular Rakoon (a Raku Programmer). I have many Ideas for other small tools like Guprecords, but the challenge is finding the time. I'd love to explore Raku Grammars and also I would love to explore writing concurrent code in Raku (I also love Go (Golang), btw!). Ideas for future Raku personal projects include:</span><br /> +<br /> +<ul> +<li>A log file analyzer, for generating anonymized <span class='inlinecode'>foo.zone</span> visitor stats for both, the Web and Gemini.</li> +<li>A social media sharing scheduler a la <span class='inlinecode'>buffer.com</span>. I am using Buffer at the moment to share posts on Mastadon, Twitter, Telegram and LinkedIn, but it is proprietary and also it's not really reliable.</li> +</ul><br /> +<span>Other related posts are:</span><br /> +<br /> +<a class='textlink' href='./2023-05-01-unveiling-guprecords:-uptime-records-with-raku.html'>2023-05-01 Unveiling <span class='inlinecode'>guprecords.raku</span>: Global Uptime Records with Raku (You are currently reading this)</a><br /> +<a class='textlink' href='./2022-06-15-sweating-the-small-stuff.html'>2022-06-15 Sweating the small stuff - Tiny projects of mine</a><br /> +<a class='textlink' href='./2022-05-27-perl-is-still-a-great-choice.html'>2022-05-27 Perl is still a great choice</a><br /> +<a class='textlink' href='./2011-05-07-perl-daemon-service-framework.html'>2011-05-07 Perl Daemon (Service Framework)</a><br /> +<a class='textlink' href='./2008-06-26-perl-poetry.html'>2008-06-26 Perl Poetry</a><br /> +<br /> +<span>E-Mail your comments to hi@paul.cyou :-)</span><br /> +<br /> +<a class='textlink' href='../'>Back to the main site</a><br /> + </div> + </content> + </entry> + <entry> <title>Algorithms and Data Structures in Go - Part 1</title> <link href="https://foo.zone/gemfeed/2023-04-09-algorithms-and-data-structures-in-golang-part-1.html" /> <id>https://foo.zone/gemfeed/2023-04-09-algorithms-and-data-structures-in-golang-part-1.html</id> @@ -2724,6 +2902,7 @@ v = 008 [v = p*c*(s != c ? 2 : 1)] Total logical CPUs <br /> <span>Other related posts are:</span><br /> <br /> +<a class='textlink' href='./2023-05-01-unveiling-guprecords:-uptime-records-with-raku.html'>2023-05-01 Unveiling <span class='inlinecode'>guprecords.raku</span>: Global Uptime Records with Raku</a><br /> <a class='textlink' href='./2022-05-27-perl-is-still-a-great-choice.html'>2022-05-27 Perl is still a great choice (You are currently reading this)</a><br /> <a class='textlink' href='./2011-05-07-perl-daemon-service-framework.html'>2011-05-07 Perl Daemon (Service Framework)</a><br /> <a class='textlink' href='./2008-06-26-perl-poetry.html'>2008-06-26 Perl Poetry</a><br /> @@ -8073,51 +8252,4 @@ my_filter f l = foldr (make_filter_fn f) [] l </div> </content> </entry> - <entry> - <title>Using my Nokia N95 for fixing my MTA</title> - <link href="https://foo.zone/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.html" /> - <id>https://foo.zone/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.html</id> - <updated>2008-12-29T09:10:41+00:00</updated> - <author> - <name>Paul Buetow</name> - <email>hi@paul.cyou</email> - </author> - <summary>The last week I was in Vidin, Bulgaria with no internet access and I had to fix my MTA (Postfix) at host.0.buetow.org which serves E-Mail for all my customers at P. B. Labs. Good, that I do not guarantee high availability on my web services (I've to do a full time job somewhere else too). </summary> - <content type="xhtml"> - <div xmlns="http://www.w3.org/1999/xhtml"> - <h1>Using my Nokia N95 for fixing my MTA</h1> -<p class="quote"><i>Published at 2008-12-29T09:10:41+00:00; Updated at 2021-12-01</i></p> -<pre> - - _ - |E] - .-|=====-. - | | mail | - ___|________| - || - || - || www - ,;, || )_(,;;;, - <_> \ || \|/ \_/ - \|/ \\|| \\| |// -_jgs_\|//_\\|///_\V/_\|//__ - Art by Joan Stark -</pre><br /> -<p>The last week I was in Vidin, Bulgaria with no internet access and I had to fix my MTA (Postfix) at host.0.buetow.org which serves E-Mail for all my customers at P. B. Labs. Good, that I do not guarantee high availability on my web services (I've to do a full time job somewhere else too). </p> -<p>My first attempt to find an internet café, which was working during Christmastime, failed. However, I found with my N95 phone lots of free WLAN hotspots. The hotspots refused me logging into my server using SSH as I have configured a non-standard port for SSH for security reasons. Without knowing the costs, I used the GPRS internet access of my German phone provider (yes, I had to pay roaming fees). </p> -<a href="https://foo.zone/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta/nokia-n95.jpg"><img alt="Picture of a Nokia N95" title="Picture of a Nokia N95" src="https://foo.zone/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta/nokia-n95.jpg" /></a><br /> -<p>With Putty for N95 and configuring Postfix with Vim and the T9 input mechanism, I managed to fix the problem. But it took half of an hour:</p> -<ul> -<li>First, getting a shell prompt</li> -<li>Second, use the "tail" command to analyse the Postfix logs</li> -<li>Third, use the "sed" command to fix a syntax error in the Postfix config</li> -<li>Fourth, restart Postfix</li> -</ul> -<p>It was a pain in the ass. My next mobile phone MUST have a full QWERTY keyboard. This would have made my life lots easier. :)</p> -<p>At the moment I am in Sofia, Bulgaria. Here I can use at least an unprotected WLAN hotspot which belongs to one of the neighbours which I don’t know in person, and it is not blocking any port at all :)</p> -<p>E-Mail your comments to hi@paul.cyou :-)</p> -<a class="textlink" href="../">Back to the main site</a><br /> - </div> - </content> - </entry> </feed> |
