summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2022-01-29 22:15:04 +0000
committerPaul Buetow <paul@buetow.org>2022-01-29 22:15:04 +0000
commit1ba0614e451168bc703df1c7b59730d3a83b7703 (patch)
tree6128d898e2cfa80efb2301b94ad276406c16d2a3
parent6a4d1327077b08167ef852631582afce24f30c16 (diff)
Publishing new version
-rw-r--r--computer-operating-systems-i-use.html128
-rw-r--r--gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.html (renamed from gemfeed/2016-11-20-methods-in-c.html)36
-rw-r--r--gemfeed/atom.xml46
-rw-r--r--gemfeed/index.html2
-rw-r--r--index.html2
5 files changed, 183 insertions, 31 deletions
diff --git a/computer-operating-systems-i-use.html b/computer-operating-systems-i-use.html
new file mode 100644
index 00000000..95fdf6af
--- /dev/null
+++ b/computer-operating-systems-i-use.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Computer operating systems I use</title>
+<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
+<link rel="stylesheet" href="style.css" />
+</head>
+<body>
+<h1>Computer operating systems I use</h1>
+<pre>
+ /( )`
+ \ \___ / |
+ /- _ `-/ '
+ (/\/ \ \ /\
+ / / | ` \
+ O O ) / |
+ `-^--'`&lt; '
+ (_.) _ ) /
+ `.___/` /
+ `-----' /
+ &lt;----. __ / __ \
+ &lt;----|====O)))==) \) /====
+ &lt;----' `--' `.__,' \
+ | |
+ \ /
+ ______( (_ / \______
+ (FL) ,' ,-----' | \
+ `--{__________) \/ "Berkeley Unix Daemon"
+</pre>
+<p class="quote"><i>Published by Paul at ????-??-??</i></p>
+<p>This is a list of Operating Systems I currently use. The list is in no particular order. This site might gets updated over time. Once in a while I try to out new things and switch forth- and back from one to anther. I prefer free and open source software over proprietary software. I didn't manage to libreboot my devices yet, though. That's mostly due to the lack of time I have.</p>
+<a class="textlink" href="https://libreboot.org/">https://libreboot.org/</a><br />
+<h2>Fedora Linux</h2>
+<p>Fedora Linux is the operating system I use on my primary (personal) laptop. It's a ThinkPad X1 Carbon Gen. 9. Lenovo officially supports Fedora Linux on this Laptop (I already saw hardware firmware updates being installed directly through Fedora from Lenovo). Fedora is a real powerhouse, cutting-edge and reasonably stable at the same time (well, it's baked by Red Hat after all). </p>
+<p>I also use Fedora on my Microsoft Surface Go 2 convertible tablet. Fedora works quite OK (and much better than Windows) on this device. It's also the perfect travel companion.</p>
+<p>I use the GNOME Desktop on my Fedora boxes. I have memorized and customized a bunch of keyboard shortcuts. But the fact that I mostly work in the terminal (with tmux) makes the Desktop environment I use only secondary.</p>
+<h2>EndeavourOS</h2>
+<p>I had to make a choice what to do with my old ThinkPad X240. I could have sold it on eBay, but I decided to try out another Linux distribution instead.</p>
+<p>Until 2021, I never used Arch as my main Desktop OS. There was a lot talking about Arch and Arch-based distros and I wanted to know what's the fuzz all about. However, I was lazy performing an Arch install from scratch. As a result I decided to give EndeavourOS a shot, as it comes with an easy installer and is still as close as you can get to plain Arch without actually using plain Arch.</p>
+<p>So far, It's not bad. While working form home, I always have my X240 next to my work laptop for things like playing music and online radio, for personal note taking and occasional emailing and instant messaging. </p>
+<p>Other than Fedora, Arch Linux and EndeavourOS are purely backed by the community. So there is no big corporation in the backyard lurking around. They won't give you the firmware updates out of the box, though. But they are still a very good choice, especially for hobbyist and also for older hardware where future firmware updates are less likely required.</p>
+<p>As the Desktop environment I use Xfce here, which feels very snappy and fast on the X240 which I purchased back in 2014.</p>
+<a class="textlink" href="https://endeavouros.com/">https://endeavouros.com/</a><br />
+<h2>FreeBSD</h2>
+<p>I have run FreeBSD in many occasions. One of my former employers even allowed me to install FreeBSD on my main workstation (which I actually did and used it for a couple of years).</p>
+<p>FreeBSD always had a place somewhere in my life:</p>
+<ul>
+<li>On a Desktop PC (personal and work)</li>
+<li>On a Laptop</li>
+<li>On a webserver, FTP server, DNS server, mail server</li>
+<li>On a server offering FreeBSD jails for rent</li>
+<li>As an experiment running Debian GNU/kFreeBSD inside of jails</li>
+</ul>
+<p>Debian GNU/kFreeBSD is now dead (same is my experiment).</p>
+<a class="textlink" href="https://www.debian.org/ports/kfreebsd-gnu/">https://www.debian.org/ports/kfreebsd-gnu/</a><br />
+<p>But I still have saved and old uname output :-):</p>
+<pre>
+[root@saturn /usr/jail/serv14/etc] # jexec 21 bash
+root@rhea:/ # uname -a
+GNU/kFreeBSD rhea.buetow.org 8.0-RELEASE-p5 FreeBSD 8.0-RELEASE-p5 #2: Sat Nov 27 13:10:09 CET \
+ 2010 root@saturn.buetow.org:/usr/obj/usr/srcs/freebsd.src8/src/sys/SERV10 x86 64 amd64 Intel(R) \
+ Core(TM) i7 CPU 920 @ 2.67GHz GNU/kFreeBSD
+</pre>
+<p>Currently, I use FreeBSD only on my home NAS server for storing all of my personal data (which is a regular PC with a bunch of hard drives and a ZFS RAIDZ (with 4x2TB drives) + a couple of external backup drives) but I have plans to replace the CentOS 7 box (see below) with FreeBSD soon.</p>
+<a class="textlink" href="https://www.FreeBSD.org">https://www.FreeBSD.org</a><br />
+<h2>CentOS 7</h2>
+<p>While CentOS 8 is already out of support, I still use CentOS 7 (which still gets security updates until 2024). CentOS 7 runs in a cloud VM and is the home to my personal NextCloud and Wallabag installations. You probably know already NextCloud. About Wallabag: It is a great free and open source alternative to Pocket. Yes, you can pay for a Wallabag subscription, but you can also host it for free on your own server.</p>
+<a class="textlink" href="https://nextcloud.com">NextCloud</a><br />
+<a class="textlink" href="https://www.wallabag.it/en">Wallabag</a><br />
+<p>The reason I use Linux for these is Docker. With Docker, it's straightforward to get these up and running. Before CentOS 7 runs out of support, I will have to switch to another OS. It might be CentOS Stream, Rocky Linux, or, more likely, I will use FreeBSD. On FreeBSD there isn't Docker, but what can be done is to create a self-contained Jail for each of the web-apps. </p>
+<p>I have been operating FreeBSD Jails for fairly complex LAMP stacks before I started to use CentOS. The reason why I switched to CentOS (it was still CentOS 6 at that time) some years back here was that I wanted to try out something new. It doesn't hurt to switch OSes once in a while. FreeBSD is so convenient: When something goes wrong with an update, just roll back to a previous ZFS snapshot. That's especially convenient for PHP based web-apps. :-)</p>
+<a class="textlink" href="https://www.centos.org">https://www.centos.org</a><br />
+<h2>OpenBSD</h2>
+<p>I use two OpenBSD boxes for my "public facing internet frontends". The services I run there are:</p>
+<ul>
+<li>HTTP server (serving this site via https://foo.zone)</li>
+<li>Gemini server (serving this site via gemini://foo.zone)</li>
+<li>MTA server (for receiving E-Mails to my hosts)</li>
+<li>Authorative DNS server (for all of my hosts)</li>
+<li>Some personal/private git repositories (accessible only via SSH)</li>
+</ul>
+<p>OpenBSD is a complete operating system. I love it due to it's "simplicity" and "correctness" and the good documentation (especially the manual pages). OpenBSD is also known for its innovations in security. I must admin, thought, that most Unix like operating system would be secure enough for my personal needs and that I would not need to use OpenBSD in particular here. But nevertheless, I think it's the ideal operating system for what I am using it.</p>
+<p>The only software which are not part of the base system and I had to install additionally were the Gemini server (vger) and Git (both were available as pre-compiled OpenBSD binary packages). So, besides of these two packages, it is indeed a pretty complete operating system for my use case (mainly httpd, OpenSMTPD, nsd, relayd, inetd, cron).</p>
+<a class="textlink" href="https://www.openbsd.org">https://www.openbsd.org</a><br />
+<h2>macOS (proprietary)</h2>
+<p>I have to use a MacBook Pro with macOS for work. What else can I say but that this would have never been my personal choice. At least macOS is a UNIX under the hood and comes with a decent terminal and there are plenty of terminal apps available via Brew. And it's better than Windows (I suppose). Some of the inner workings of macOS were actually forked from the FreeBSD project.</p>
+<a class="textlink" href="https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/BSD/BSD.html">developer.apple.com: BSD in macOS/Darwin</a><br />
+<h2>LineageOS (mobile)</h2>
+<p>At some point I got fed up with big tech, like Google and Samsung (or Apple, but personally I don't use Apple), spying on me. So I purchased a Google phone (a midrange Pixel phone) and installed LineageOS, a free and open source distribution of Android, on it. I don't have anything from Google installed on it (not even the play store, I install my apps from F-Droid). It's my daily driver since mid 2021 now. </p>
+<p>So far the experience is not great but good. The main culprits are not having Google Maps, Google Gboard and the camera app. The latter lacks some features on LineageOS (e.g. No wide angle lens support). Also, I can't use my banking apps anymore.</p>
+<p>But the whole point of switching to LineageOS was to get away of big tech and therefore I should not complain :-). What I do like is that 95% the things I used to do on a mobile phone also can be done with LineageOS.</p>
+<a class="textlink" href="https://lineageos.org/">https://lineageos.org/</a><br />
+<h2>Samsung's Stock Android (mobile proprietary)</h2>
+<p>Unfortunatley, I still have to keep my proprietary Android phone around. Sometimes, I really need to use some proprietary apps which are only available form the Google play store and also require the Google services installed on the phone. I don't carry this phone around all the time and I only use it intentionally for very specific use cases. I think this is the best compromise I can make.</p>
+<h2>iOS (mobile proprietary)</h2>
+<p>I have to use an iPhone for work. I like the hardware but I hate the OS (you can also call it spyOS), but it's the necessary's evil, unfortunately. I don't have it usually with me and shut off or in airplane mode when I don't need it. I also find it quite unintuitive to use.</p>
+<h2>Other OSes</h2>
+<h3>InfinyTime (smartwatch)</h3>
+<p>I use it on my PineTime smartwatch. Not much to write about it yet, as I just got started with it recently and am only using it because of its fancy watch face and also I use it as a pedometer. AstroidOS seems also interesting for smartwatches nowadays, but I haven't looked into it yet. I will list it here anyway in case you want to check it out.</p>
+<a class="textlink" href="https://www.pine64.org/pinetime/">https://www.pine64.org/pinetime/</a><br />
+<a class="textlink" href="https://infinitime.io/">https://infinitime.io/</a><br />
+<a class="textlink" href="https://asteroidos.org/">https://asteroidos.org/</a><br />
+<h3>motionEyeOS</h3>
+<p>Before I travel, I always install an army of RaspberryPi 3's in my house. All are equipped with an camera and have motionEyeOS (Linux based video surveillance system) installed. There's a neat Android app in the F-Droid store (also in Google Play Store) which let's me keep an eye on everything. I make the Pi's accessible from the internet via reverse SSH tunnels though one of my frontend servers.</p>
+<a class="textlink" href="https://github.com/ccrisan/motioneyeos">https://github.com/ccrisan/motioneyeos</a><br />
+<h3>Kobo OS (proprietary)</h3>
+<p>I use a Kobo Forma as my e-reader device. I have disabled the Wifi and I only sideload ePubs on it. Otherwise, it would call home to Rakuten. I would like to replace it one day with an open source e-reader device like the PineNote. There are also some interesting attempts installing postmarketOS Linux on Kobo devices. It boots already, but is far from being usable as a normal e-reader.</p>
+<a class="textlink" href="https://www.pine64.org/pinenote/">The PineNote</a><br />
+<a class="textlink" href="https://liliputing.com/2021/07/kobo-clara-hd-becomes-an-e-ink-linux-tablet-with-the-help-of-postmarketos.html">Kobo Clara HD becomes an e-link Linux tablet</a><br />
+<h3>NetBSD</h3>
+<p>I have been using NetBSD on an old Sun Sparcstation 10 as a student. I also have run NetBSD on a very old ThinkPad with 96MB!!! of RAM (even with X and ratpoison WM). I also installed (but never really used) NetBSD on an HP Jornada 680. But that's all more than 10 years ago. I haven't looked at NetBSD for long time. I want to revive it on an "old" ThinkPad T450 of mine which I currently don't use.</p>
+<a class="textlink" href="https://netbsd.org">https://netbsd.org</a><br />
+<h3>Android TV (proprietary)</h3>
+<p>A Android TV box is used for watching Netflix. Currently in the process of being replaced by OSMC.</p>
+<a class="textlink" href="https://osmc.tv/">https://osmc.tv/</a><br />
+<h3>SailfishOS (mobile proprietary)</h3>
+<p>Before switching to LineageOS, I gave SailfishOS a shot. To some degree it works. It can even run Android apps. But I don't like that SailfishOS also includes closed source components.</p>
+<a class="textlink" href="https://sailfishos.org/">https://sailfishos.org/</a><br />
+<p>E-Mail me your comments to paul at buetow dot org!</p>
+<a class="textlink" href="../">Go back to the main site</a><br />
+<p class="footer">
+Generated with <a href="https://codeberg.org/foozone/gemtexter">Gemtexter</a> |
+served by <a href="https://www.OpenBSD.org">OpenBSD</a>/<a href="https://man.openbsd.org/httpd.8">httpd(8)</a> |
+<a href="https://www.foo.zone/site-mirrors.html">Site Mirrors</a>
+</p>
+</body>
+</html>
diff --git a/gemfeed/2016-11-20-methods-in-c.html b/gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.html
index 072abd76..0ed5a4c0 100644
--- a/gemfeed/2016-11-20-methods-in-c.html
+++ b/gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.html
@@ -2,15 +2,23 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>Methods in C</title>
+<title>Object oriented programming with ANSI C</title>
<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
-<h1>Methods in C</h1>
-<p class="quote"><i>Published by Paul at 2016-11-20</i></p>
-<p>You can do some sort of object-oriented programming in the C Programming Language. However, that is very limited. But also very easy and straightforward to use.</p>
-<h2>Example</h2>
+<h1>Object oriented programming with ANSI C</h1>
+<pre>
+ ___ ___ ____ ____
+ / _ \ / _ \| _ \ / ___|
+| | | | | | | |_) |____| |
+| |_| | |_| | __/_____| |___
+ \___/ \___/|_| \____|
+
+</pre>
+<p class="quote"><i>Published by Paul at 2016-11-20, updated 2022-01-29</i></p>
+<p>You can do a little of object-oriented programming in the C Programming Language. However, that is, in my humble opinion, limited. It's easier to use a different programming language than C for OOP. But still it's an interesting exercise to try using C for this.</p>
+<h2>Function pointers</h2>
<p>Let's have a look at the following sample program. All you have to do is to add a function pointer such as "calculate" to the definition of struct "something_s". Later, during the struct initialization, assign a function address to that function pointer:</p>
<pre>
#include &lt;stdio.h&gt;
@@ -45,7 +53,7 @@ int main(void) {
printf("%s(%f, %f) =&gt; %f\n", div.name, a, b, div.calculate(a,b));
}
</pre>
-<p>As you can see, you can call the function (pointed by the function pointer) the same way as in C++ or Java via:</p>
+<p>As you can see, you can call the function (pointed by the function pointer) with the same syntax as in C++ or Java:</p>
<pre>
printf("%s(%f, %f) =&gt; %f\n", mult.name, a, b, mult.calculate(a,b));
printf("%s(%f, %f) =&gt; %f\n", div.name, a, b, div.calculate(a,b));
@@ -57,20 +65,24 @@ printf("%s(%f, %f) =&gt; %f\n", div.name, a, b, (*div.calculate)(a,b));
</pre>
<p>Output:</p>
<pre>
-pbuetow ~/git/blog/source [38268]% gcc methods-in-c.c -o methods-in-c
-pbuetow ~/git/blog/source [38269]% ./methods-in-c
+pbuetow ~/git/blog/source [38268]% gcc oop-c-example.c -o oop-c-example
+pbuetow ~/git/blog/source [38269]% ./oop-c-example
Multiplication(3.000000, 2.000000) =&gt; 6.000000
Division(3.000000, 2.000000) =&gt; 1.500000
</pre>
<p>Not complicated at all, but nice to know and helps to make the code easier to read!</p>
-<h2>The flaw</h2>
+<h2>That's not OOP, though</h2>
<p>However, that's not really how it works in object-oriented languages such as Java and C++. The method call in this example is not a method call as "mult" and "div" in this example are not "message receivers". I mean that the functions can not access the state of the "mult" and "div" struct objects. In C, you would need to do something like this instead if you wanted to access the state of "mult" from within the calculate function, you would have to pass it as an argument:</p>
<pre>
mult.calculate(mult,a,b));
</pre>
-<p>How to overcome this? You need to take it further.</p>
-<h2>Taking it further</h2>
-<p>If you want to take it further, type "Object-Oriented Programming with ANSI-C" into your favourite internet search engine, you will find some crazy stuff. Some go as far as writing a C preprocessor in AWK, which takes some object-oriented pseudo-C and transforms it to plain C so that the C compiler can compile it to machine code. This is similar to how the C++ language had its origins.</p>
+<h2>Real object oriented proramming with C</h2>
+<p>If you want to take it further, hit "Object-Oriented Programming with ANSI-C" into your favourite internet search engine or follow the link below. It goes as far as writing a C preprocessor in AWK, which takes some object-oriented pseudo-C and transforms it to plain C so that the C compiler can compile it to machine code. This is similar to how the C++ language had its origins.</p>
+<a class="textlink" href="https://www.cs.rit.edu/~ats/books/ooc.pdf">https://www.cs.rit.edu/~ats/books/ooc.pdf</a><br />
+<h2>OOP design patterns in the Linux Kernel</h2>
+<p>Big C software projects, like Linux, also follow some OOP techniques:</p>
+<a class="textlink" href="https://lwn.net/Articles/444910/">https://lwn.net/Articles/444910/</a><br />
+<p>C is a very old programming lanuage with it's quirks. This might be one of the reasons why Linux will also let Rust code in.</p>
<p>E-Mail me your comments to paul at buetow dot org!</p>
<a class="textlink" href="../">Go back to the main site</a><br />
<p class="footer">
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml
index a24c268f..d31eac3d 100644
--- a/gemfeed/atom.xml
+++ b/gemfeed/atom.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
- <updated>2022-01-23T22:20:22+00:00</updated>
+ <updated>2022-01-29T22:10:52+00:00</updated>
<title>foo.zone feed</title>
<subtitle>To be in the .zone!</subtitle>
<link href="https://foo.zone/gemfeed/atom.xml" rel="self" />
@@ -1986,21 +1986,29 @@ Total time: 1213.00s
</content>
</entry>
<entry>
- <title>Methods in C</title>
- <link href="https://foo.zone/gemfeed/2016-11-20-methods-in-c.html" />
- <id>https://foo.zone/gemfeed/2016-11-20-methods-in-c.html</id>
- <updated>2016-11-20T18:36:51+01:00</updated>
+ <title>Object oriented programming with ANSI C</title>
+ <link href="https://foo.zone/gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.html" />
+ <id>https://foo.zone/gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.html</id>
+ <updated>2016-11-20T22:10:57+00:00</updated>
<author>
<name>Paul Buetow</name>
<email>comments@mx.buetow.org</email>
</author>
- <summary>You can do some sort of object oriented programming in the C Programming Language. However, that is very limited. But also very easy and straight forward to use.. .....to read on please visit my site.</summary>
+ <summary>You can do a little of object-oriented programming in the C Programming Language. However, that is, in my humble opinion, limited. It's easier to use a different programming language than C for OOP. But still it's an interesting exercise to try using C for this.. .....to read on please visit my site.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <h1>Methods in C</h1>
-<p class="quote"><i>Published by Paul at 2016-11-20</i></p>
-<p>You can do some sort of object-oriented programming in the C Programming Language. However, that is very limited. But also very easy and straightforward to use.</p>
-<h2>Example</h2>
+ <h1>Object oriented programming with ANSI C</h1>
+<pre>
+ ___ ___ ____ ____
+ / _ \ / _ \| _ \ / ___|
+| | | | | | | |_) |____| |
+| |_| | |_| | __/_____| |___
+ \___/ \___/|_| \____|
+
+</pre>
+<p class="quote"><i>Published by Paul at 2016-11-20, updated 2022-01-29</i></p>
+<p>You can do a little of object-oriented programming in the C Programming Language. However, that is, in my humble opinion, limited. It's easier to use a different programming language than C for OOP. But still it's an interesting exercise to try using C for this.</p>
+<h2>Function pointers</h2>
<p>Let's have a look at the following sample program. All you have to do is to add a function pointer such as "calculate" to the definition of struct "something_s". Later, during the struct initialization, assign a function address to that function pointer:</p>
<pre>
#include &lt;stdio.h&gt;
@@ -2035,7 +2043,7 @@ int main(void) {
printf("%s(%f, %f) =&gt; %f\n", div.name, a, b, div.calculate(a,b));
}
</pre>
-<p>As you can see, you can call the function (pointed by the function pointer) the same way as in C++ or Java via:</p>
+<p>As you can see, you can call the function (pointed by the function pointer) with the same syntax as in C++ or Java:</p>
<pre>
printf("%s(%f, %f) =&gt; %f\n", mult.name, a, b, mult.calculate(a,b));
printf("%s(%f, %f) =&gt; %f\n", div.name, a, b, div.calculate(a,b));
@@ -2047,20 +2055,24 @@ printf("%s(%f, %f) =&gt; %f\n", div.name, a, b, (*div.calculate)(a,b));
</pre>
<p>Output:</p>
<pre>
-pbuetow ~/git/blog/source [38268]% gcc methods-in-c.c -o methods-in-c
-pbuetow ~/git/blog/source [38269]% ./methods-in-c
+pbuetow ~/git/blog/source [38268]% gcc oop-c-example.c -o oop-c-example
+pbuetow ~/git/blog/source [38269]% ./oop-c-example
Multiplication(3.000000, 2.000000) =&gt; 6.000000
Division(3.000000, 2.000000) =&gt; 1.500000
</pre>
<p>Not complicated at all, but nice to know and helps to make the code easier to read!</p>
-<h2>The flaw</h2>
+<h2>That's not OOP, though</h2>
<p>However, that's not really how it works in object-oriented languages such as Java and C++. The method call in this example is not a method call as "mult" and "div" in this example are not "message receivers". I mean that the functions can not access the state of the "mult" and "div" struct objects. In C, you would need to do something like this instead if you wanted to access the state of "mult" from within the calculate function, you would have to pass it as an argument:</p>
<pre>
mult.calculate(mult,a,b));
</pre>
-<p>How to overcome this? You need to take it further.</p>
-<h2>Taking it further</h2>
-<p>If you want to take it further, type "Object-Oriented Programming with ANSI-C" into your favourite internet search engine, you will find some crazy stuff. Some go as far as writing a C preprocessor in AWK, which takes some object-oriented pseudo-C and transforms it to plain C so that the C compiler can compile it to machine code. This is similar to how the C++ language had its origins.</p>
+<h2>Real object oriented proramming with C</h2>
+<p>If you want to take it further, hit "Object-Oriented Programming with ANSI-C" into your favourite internet search engine or follow the link below. It goes as far as writing a C preprocessor in AWK, which takes some object-oriented pseudo-C and transforms it to plain C so that the C compiler can compile it to machine code. This is similar to how the C++ language had its origins.</p>
+<a class="textlink" href="https://www.cs.rit.edu/~ats/books/ooc.pdf">https://www.cs.rit.edu/~ats/books/ooc.pdf</a><br />
+<h2>OOP design patterns in the Linux Kernel</h2>
+<p>Big C software projects, like Linux, also follow some OOP techniques:</p>
+<a class="textlink" href="https://lwn.net/Articles/444910/">https://lwn.net/Articles/444910/</a><br />
+<p>C is a very old programming lanuage with it's quirks. This might be one of the reasons why Linux will also let Rust code in.</p>
<p>E-Mail me your comments to paul at buetow dot org!</p>
</div>
</content>
diff --git a/gemfeed/index.html b/gemfeed/index.html
index 00d95c6c..c0c0ab8b 100644
--- a/gemfeed/index.html
+++ b/gemfeed/index.html
@@ -22,7 +22,7 @@
<a class="textlink" href="./2021-04-24-welcome-to-the-geminispace.html">2021-04-24 (0802 words) - Welcome to the Geminispace</a><br />
<a class="textlink" href="./2021-04-22-dtail-the-distributed-log-tail-program.html">2021-04-22 (2122 words) - DTail - The distributed log tail program</a><br />
<a class="textlink" href="./2018-06-01-realistic-load-testing-with-ioriot-for-linux.html">2018-06-01 (2176 words) - Realistic load testing with I/O Riot for Linux</a><br />
-<a class="textlink" href="./2016-11-20-methods-in-c.html">2016-11-20 (0318 words) - Methods in C</a><br />
+<a class="textlink" href="./2016-11-20-object-oriented-programming-with-ansi-c.html">2016-11-20 (0385 words) - Object oriented programming with ANSI C</a><br />
<a class="textlink" href="./2016-05-22-spinning-up-my-own-authoritative-dns-servers.html">2016-05-22 (0512 words) - Spinning up my own authoritative DNS servers</a><br />
<a class="textlink" href="./2016-04-16-offsite-backup-with-zfs-part2.html">2016-04-16 (0248 words) - Offsite backup with ZFS (Part 2)</a><br />
<a class="textlink" href="./2016-04-09-jails-and-zfs-on-freebsd-with-puppet.html">2016-04-09 (0425 words) - Jails and ZFS with Puppet on FreeBSD</a><br />
diff --git a/index.html b/index.html
index 038225c4..ccd20c2e 100644
--- a/index.html
+++ b/index.html
@@ -58,7 +58,7 @@
<a class="textlink" href="./gemfeed/2021-04-24-welcome-to-the-geminispace.html">2021-04-24 - Welcome to the Geminispace</a><br />
<a class="textlink" href="./gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.html">2021-04-22 - DTail - The distributed log tail program</a><br />
<a class="textlink" href="./gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.html">2018-06-01 - Realistic load testing with I/O Riot for Linux</a><br />
-<a class="textlink" href="./gemfeed/2016-11-20-methods-in-c.html">2016-11-20 - Methods in C</a><br />
+<a class="textlink" href="./gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.html">2016-11-20 - Object oriented programming with ANSI C</a><br />
<a class="textlink" href="./gemfeed/2016-05-22-spinning-up-my-own-authoritative-dns-servers.html">2016-05-22 - Spinning up my own authoritative DNS servers</a><br />
<a class="textlink" href="./gemfeed/2016-04-16-offsite-backup-with-zfs-part2.html">2016-04-16 - Offsite backup with ZFS (Part 2)</a><br />
<a class="textlink" href="./gemfeed/2016-04-09-jails-and-zfs-on-freebsd-with-puppet.html">2016-04-09 - Jails and ZFS with Puppet on FreeBSD</a><br />