{"id":369,"date":"2008-09-16T02:02:09","date_gmt":"2008-09-16T01:02:09","guid":{"rendered":"http:\/\/www.wmaus.net\/wordpress\/?page_id=369"},"modified":"2025-10-19T09:56:33","modified_gmt":"2025-10-19T08:56:33","slug":"downloads","status":"publish","type":"page","link":"https:\/\/www.wmaus.net\/?page_id=369","title":{"rendered":"My life in professional IT"},"content":{"rendered":"<figure id=\"attachment_16\" aria-describedby=\"caption-attachment-16\" style=\"width: 480px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-16\" src=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2008\/04\/buran-5.jpg\" alt=\"\" width=\"480\" height=\"318\" srcset=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2008\/04\/buran-5.jpg 480w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2008\/04\/buran-5-300x198.jpg 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><figcaption id=\"caption-attachment-16\" class=\"wp-caption-text\">(The Russian Space Shuttle Buran on her way to the Technikmuseum Speyer. Picture taken on the rooftop of the United Nations tower in Bonn, Germany.)<\/figcaption><\/figure>\n<h2>Sic parvis magna<\/h2>\n<p>I&#8217;m blessed that I started using computers at a very young age and in a time where home computers had just arrived and only had one kilobyte of RAM. That allowed me to be part of the PC revolution from the start.<\/p>\n<p>I know what&#8217;s happening underneath the graphical user interfaces and how machines communicate with each other over a global network.<\/p>\n<p>I have commercially and professionally used multiple programming languages in my life and as far as operating systems are concerned, I am platform agnostic. I use a combination of tools that get the job done and that won&#8217;t break the bank.<\/p>\n<h2>360\u00b0 Communication<\/h2>\n<p>I can feel and read the room and translate C-level visions into budgets and projects and customer requirements into working implementations &#8211; and I can translate tech talk and jargon into language that non-technical people can understand.<\/p>\n<h2>Platform Development, Integration and Automation<\/h2>\n<p><span class=\"css-1jxf684 r-bcqeeo r-1ttztb7 r-qvutc0 r-poiln3\"><span class=\"css-1jxf684 r-bcqeeo r-1ttztb7 r-qvutc0 r-poiln3 r-1wl4xqv\">I understand complex IT systems, their architecture, and how their components communicate. <\/span><\/span><\/p>\n<p><span class=\"css-1jxf684 r-bcqeeo r-1ttztb7 r-qvutc0 r-poiln3\"><span class=\"css-1jxf684 r-bcqeeo r-1ttztb7 r-qvutc0 r-poiln3 r-1wl4xqv\">During my time working in commercial satellite communications, I have repeatedly proven that I can build custom solutions that enable otherwise incompatible systems to communicate with each other.<\/span><\/span><\/p>\n<p>Network Weather Maps, Monitoring, Alerting and Automation, including triggering scripts for self-healing actions, have been my bread &amp; butter for over a decade.<\/p>\n<h2>Networking, Systems and Infrastructure<strong><br \/>\n<\/strong><\/h2>\n<p>I used to be a certified Mikrotik Certified Network Associate (MTCNA) and a Microsoft Certified Professional (MCP) for Windows Server.<\/p>\n<p>Such certificates are &#8220;time-bombed&#8221; and expire after three years or so, which is a nice business model to get the customers to pay for the <em>exact same<\/em> certification again and again and again.<\/p>\n<p>When I was still in commercial satellite communications, I worked on a daily basis with:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Cisco IOS,<\/li>\n<li>Mikrotik RouterOS,<\/li>\n<li>Juniper Junos OS,<\/li>\n<li>Ubuntu Linux,<\/li>\n<li>Windows Server,<\/li>\n<li>VMware vSphere and ESXi,<\/li>\n<li>ProxMox VE,<\/li>\n<li>PowerEdge Servers,<\/li>\n<li>EqualLogic Storage Arrays,<\/li>\n<li>iSCSI and NFS,<\/li>\n<li>TCP\/IPv4,<\/li>\n<li>Subnetting and Supernetting,<\/li>\n<li>Switching,<\/li>\n<li>Static Routing,<\/li>\n<li>BGP and OSPF,<\/li>\n<li>BIND9 DNS servers,<\/li>\n<li>CACTI and PHP Network Weathermaps (Graphing),<\/li>\n<li>WhatsUp Gold (Monitoring, Alerting, Triggering of Actions and Automation Scripts).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Trainings<\/h2>\n<figure id=\"attachment_5249\" aria-describedby=\"caption-attachment-5249\" style=\"width: 1024px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-5249 size-full\" src=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/09\/Grok-TCPIP-Course.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/09\/Grok-TCPIP-Course.jpg 1024w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/09\/Grok-TCPIP-Course-300x225.jpg 300w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/09\/Grok-TCPIP-Course-768x576.jpg 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption id=\"caption-attachment-5249\" class=\"wp-caption-text\">Illustration by Grok.<\/figcaption><\/figure>\n<p>I can explain deeply technical topics to non-technical people so they will understand the subject and won&#8217;t feel stupid or patronized while attending my training sessions.<\/p>\n<p>I have experience giving<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Programming (Lua, Basic dialects, Xbase++),<\/li>\n<li>System Integration (OPC Classic &amp; UA, MQTT, ODBC, Custom Scripting and Data transformation) and<\/li>\n<li><a href=\"https:\/\/www.wmaus.net\/WinfriedMaus-TCPIPv4_Network_Training.pdf\" target=\"_blank\" rel=\"noopener\">TCP\/IPv4 Networking (including DNS, BGP, OSPF, SNMP, Graphing &amp; Monitoring)<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>trainings.<\/p>\n<h2>Programming<\/h2>\n<p>I wrote my first line of code in 1982 on a Casio PB100 in BASIC.<\/p>\n<p>I wrote a book on natural language parser programming in Pascal for interactive fiction games in the year I finished the Gymnasium\/High School, 1989\/90. I also had a version of that parser written in PowerBASIC. It could understand rather complex German and English sentences.<\/p>\n<p>I have learned COBOL, JCL and DB2 SQL on an actual IBM mainframe.<\/p>\n<p>I have worked for the company and with the team that created the Xbase++ programming language.<\/p>\n<p>Since Xbase++, I know how multi-threading works.<\/p>\n<p>In a previous job, I used Lua on a daily basis and also gave Lua trainings.<\/p>\n<p>Programming, query and domain specific languages that I&#8217;ve learned (most of them self-taught) and used in my career:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>BASIC: Too many dialects to count, from the ZX81 over the Apple ][ to PowerBasic to modern multi-threaded, object-oriented dialects like BlitzMax,<\/li>\n<li>6502 Assembler,<\/li>\n<li>UCSD Pascal, Turbo Pascal, object-oriented Borland Pascal,<\/li>\n<li>C and C++,<\/li>\n<li>COBOL,<\/li>\n<li>JCL,<\/li>\n<li>DB2 and MySQL SQL,<\/li>\n<li>HTML,<\/li>\n<li>Xbase++,<\/li>\n<li>Flash\/Actionscript,<\/li>\n<li>C#,<\/li>\n<li>Python,<\/li>\n<li>Go,<\/li>\n<li>Lua.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Ancient history<\/h2>\n<p>One of my first tasks at Alaska Software was to write a parser that extracted all code samples from the documentation and checked if they could compile properly. This led to a second project, the <em>Sample Inspector<\/em>, that provided a GUI interface to a library of useful code samples &#8211; an extension to the technical documentation of the product.<\/p>\n<figure id=\"attachment_5315\" aria-describedby=\"caption-attachment-5315\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-5315 size-full\" src=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/si.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/si.jpg 1024w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/si-300x225.jpg 300w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/si-768x576.jpg 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption id=\"caption-attachment-5315\" class=\"wp-caption-text\">The Sample Inspector during early development.<\/figcaption><\/figure>\n<p>Later, I also implemented client-side parts of the NNTP protocol for a News Reader GUI client that I had written in Xbase++ (as a pet project) &#8211; it was later shipped under the name <em>Baumbart<\/em>.<\/p>\n<figure id=\"attachment_5313\" aria-describedby=\"caption-attachment-5313\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-5313\" src=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/baumbart.jpg\" alt=\"\" width=\"800\" height=\"604\" srcset=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/baumbart.jpg 800w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/baumbart-300x227.jpg 300w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/baumbart-768x580.jpg 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption id=\"caption-attachment-5313\" class=\"wp-caption-text\">Baumbart 1.0. Oh, the nostalgia.<\/figcaption><\/figure>\n<p>In another pet project, I had implemented the IRC protocol to write an Internet Relay Chat bot that also included a very basic natural language parser, so it could interact with human users. It was called <em>Xenia B<\/em>, but it as never released or shipped with the product.<\/p>\n<figure id=\"attachment_5316\" aria-describedby=\"caption-attachment-5316\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-5316 size-full\" src=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/xeniab1.jpg\" alt=\"\" width=\"640\" height=\"493\" srcset=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/xeniab1.jpg 640w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/xeniab1-300x231.jpg 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-5316\" class=\"wp-caption-text\">The bot connecting to an IRC server.<\/figcaption><\/figure>\n<figure id=\"attachment_5317\" aria-describedby=\"caption-attachment-5317\" style=\"width: 768px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-5317 size-full\" src=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/xeniab2.jpg\" alt=\"\" width=\"768\" height=\"634\" srcset=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/xeniab2.jpg 768w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/xeniab2-300x248.jpg 300w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption id=\"caption-attachment-5317\" class=\"wp-caption-text\">The bot acting as an interactive fiction game for its users.<\/figcaption><\/figure>\n<p>During my work on the Alaska ADSDBE reference documentation, I also wrote a GUI management interface for the Advantage Database Server.<\/p>\n<figure id=\"attachment_5321\" aria-describedby=\"caption-attachment-5321\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-5321\" src=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/adscons.jpg\" alt=\"\" width=\"800\" height=\"600\" srcset=\"https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/adscons.jpg 800w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/adscons-300x225.jpg 300w, https:\/\/www.wmaus.net\/wordpress\/wp-content\/uploads\/2024\/10\/adscons-768x576.jpg 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption id=\"caption-attachment-5321\" class=\"wp-caption-text\">ADSDBE Management Console.<\/figcaption><\/figure>\n<h2>Archeological Dig Site<\/h2>\n<p>Most of the code that I have written is owned by my previous employers and I no longer have access to any of that work.<\/p>\n<p>The downloads below were hobby projects of mine which I have abandoned in the meanwhile and they come with no warranty or support whatsoever. Follow the instructions (if there are any), respect the licenses and hopefully you will have some fun with the stuff or find some use for it.<\/p>\n<h3>BlitzMax thread class module<\/h3>\n<p><a href=\"https:\/\/www.wmaus.net\/BlitzMax\/wmaus.mod.zip\">A thread class for BlitzMax<\/a>.<\/p>\n<p>This BlitzMax module contains an (abstract) class for OOP-style multithreading and multi-threading\/multi-processing related helper functions. Since I&#8217;ve given up on BlitzMax and the language&#8217;s creator has also abandoned it, there won&#8217;t be any further development of this module. (BSD license.)<\/p>\n<h3>GUICoffee<\/h3>\n<p>The following sample code is a remake of the old Alaska Software Xbase++ &#8216;coffee&#8217; sample application. I haven&#8217;t used Xbase++ in quite a few years now, so I had to rewrite it based upon what I could remember of the coffee sample. Basically, it is about ten programmers who drink coffee while they are working and when their cups run empty, they go to a coffee machine and get themselves a refill. When the coffee machine runs empty, too, the guy who needs coffee has to cook some fresh one first. I&#8217;ve added to this simple scenario a button that will &#8216;close the office&#8217; for the day and send the developers home. Before they do that, they finish their coffees and return their cups. The last one to do so turns off the coffee machine.<\/p>\n<p>This idea is implemented using ten worker threads, one for each developer. They share one resource, namely the coffee machine. The purpose of the sample is to demonstrate mutexes as a means of synchronizing access to shared resources by concurrently running threads. As you probably already know, not synchronizing the access to shared resources is a perfect way to crash your application and giving you a hell of time to find the bug.<\/p>\n<p>Here is the code, written on OS X, but it also works on Windows:<\/p>\n<pre class=\"vb\">'GUI Coffee, Inc.\nSuperStrict\n\n'Put something on the screen.\n\nImport MaxGui.Drivers\nImport MaxGui.CocoaMaxGui\nImport Pub.Threads\nImport BRL.Random\nImport BRL.Event\nImport BRL.Eventqueue\n\nAppTitle = \"Coffee, Inc.\"\n\nGlobal x:Int = 0\nGlobal y:Int = 0\nGlobal width:Int = 640\nGlobal height:Int = 480\n\nGlobal AppWindow:TGadget = CreateWindow (AppTitle, x, y, width, height)\n\nGlobal fileMenu:TGadget = CreateMenu (\"&amp;File\", 0, WindowMenu (AppWindow))\nGlobal xit:TGadget = CreateMenu (\"E&amp;xit\", 1, fileMenu)\n\nGlobal helpMenu:TGadget = CreateMenu (\"&amp;Help\", 2, WindowMenu (AppWindow))\nGlobal about:TGadget = CreateMenu (\"&amp;About...\", 3, helpMenu)\n\nUpdateWindowMenu AppWindow\n\nGlobal devStatus:TGadget[10]\n\nFor Local n:Int = 0 To 9\n\tdevStatus[n] = CreateTextField (4, 4 + n*30, ClientWidth (AppWindow) - 8, 24, AppWindow)\nNext\n\nGlobal goHome:TGadget = CreateButton (\"Go home, guys!\", 240, 400, 140, 24, AppWindow, BUTTON_OK)\n\n'Setup the office environment.\n\nConst cupSize:Int = 200\n\n'Your simple Italian coffee machine. One load is good for eight cups.\nType CoffeeMachine\n\n\tField hasCups:Int = 10\n\tField hasCoffee:Int\n\tField isCooking:Int\n\tField myMutex:Int\n\n\tMethod Create()\n\t\thasCoffee = 0\n\t\tmyMutex = CreateMutex()\n\tEnd Method\n\n\tMethod giveCoffee:Int( name: String, nPos:Int )\n\t\tLockMutex( myMutex )\n\t\tIf hasCoffee &lt;= 0\n\t\t\tLocal boiler:String = \"\"\n\t\t\tFor Local n:Int = 1 To 8\n\t\t\t\tboiler :+ \"+++\"\n\t\t\t\tSetGadgetText( devStatus[nPos], name + \" is cooking fresh coffee: \" + boiler )\n\t\t\t\tDelay 300\n\t\t\tNext\n\t\t\thasCoffee = 8 * cupSize\n\t\tEnd If\n\t\tSetGadgetText( devStatus[nPos], name + \" takes coffee.\" )\n\t\thasCoffee :- cupSize\n\t\tDelay 750\n\t\tUnlockMutex( myMutex )\n\t\tReturn cupSize\n\tEnd Method\n\n\tMethod giveCup( name: String, nPos:Int )\n\t\tLockMutex( myMutex )\n\t\tSetGadgetText( devStatus[nPos], name + \" takes a cup.\")\n\t\thasCups :- 1\n\t\tDelay 400\n\t\tUnlockMutex( myMutex )\n\tEnd Method\t\t\n\n\tMethod returnCup( name: String, nPos:Int )\n\t\tLockMutex( myMutex )\n\t\tSetGadgetText( devStatus[nPos], name + \" returns his cup to the kitchen.\")\n\t\thasCups :+ 1\n\t\tDelay 1000\n\t\tIf hasCups = 10\n\t\t\tSetGadgetText( devStatus[nPos], name + \" is last, he turns off the coffee machine.\")\n\t\t\tDelay 3000\n\t\t\tHideGadget( goHome )\n\t\tEnd If\n\t\tUnlockMutex( myMutex )\n\tEnd Method\n\nEnd Type\n\n'A very simple software developer. He only works as long as he has coffee.\nType Developer\n\tField Name:String\n\tField Position:Int\n\tField hasCoffee:Int\n\tField machine:CoffeeMachine\n\tGlobal EOB:Int = False\n\n\tMethod Create:Developer( name:String, pos:Int, machine:CoffeeMachine )\n\t\tSelf.Name = name\n\t\tSelf.Position = pos\n\t\tSelf.hasCoffee = 0\n\t\tSelf.machine = machine\n\t\tReturn Self\n\tEnd Method\n\n\tFunction SignalEOB()\n\t\tSetGadgetText( goHome, \"Office is closing!\" )\n\t\tDisableGadget( goHome )\n\t\tEOB = True\n\tEnd Function\n\n\tMethod Working()\n\t\tmachine.giveCup( name, Position )\n\t\tRepeat\n\t\t\thasCoffee :- Rand(1, Int(cupSize\/4) )\n\t\t\tIf hasCoffee &lt;= 0\n\t\t\t\tSetGadgetText( devStatus[Position], name + \" needs coffee !!!\")\n\t\t\t\thasCoffee = machine.GiveCoffee( name, Position )\n\t\t\tElse\n\t\t\t\tLocal cupContents:String = \"\"\n\t\t\t\tFor Local n:Int = 1 To Int( 1 + hasCoffee\/10)\n\t\t\t\t\tcupContents :+ \"#\"\n\t\t\t\tNext\n\t\t\t\tSetGadgetText( devStatus[Position], name + \" is happily working. Coffee left: \" + cupContents + \" ( \" + hasCoffee + \" ml).\" )\n\t\t\tEnd If\n\t\t\tDelay 600\n\t\tUntil EOB\n\t\tmachine.returnCup( name, Position )\n\t\tSetGadgetText( devStatus[Position], name + \" went home.\")\n\tEnd Method\nEnd Type\n\n'The thread factory\nFunction BuildThread:Object( data:Object)\n\tLocal myDev:Developer = Developer(data)\n\tmyDev.Working()\nEnd Function\n\n'Start the coffee machine\nGlobal Luigi:CoffeeMachine = New CoffeeMachine\nLuigi.Create()\n\n'Get the guys to work\nGlobal DevTeam:Developer[10]\nGlobal devName:String[] = [ \"Mark\", ..\n\"Brucey\", ..\n\"Skidracer\", ..\n\"SebHoll\", ..\n\"SimonH\", ..\n\"SimonA\", ..\n\"FlameDuck\", ..\n\"MarkT\", ..\n\"RobH\", ..\n\"Woz\"]\n\nFor Local n:Int = 0 To 9\n\tDevTeam[n] = New Developer\n\tDevTeam[n].Create( devName[n], n, Luigi )\nNext\n\n'Ready, steady, go!\nGlobal handles:Int[10]\n\nFor Local n:Int = 0 To 9\n\thandles[n]=CreateThread( BuildThread,  Object(DevTeam[n]) )\nNext\n\n'Send the boys home\nFunction ShutDown()\n\tDeveloper.SignalEOB()\n\tFor Local n:Int = 0 To 9\n\t\tDetachThread( handles[n] )\n\tNext\nEnd Function\n\n'Your good old fashioned GUI event loop\nRepeat\n\tSelect WaitEvent ()\n\t\tCase EVENT_GADGETACTION\n\t\t\tIf (EventSource () = goHome)\n\t\t\t\tShutDown()\n\t\t\tEnd If \n\n\t\tCase EVENT_WINDOWCLOSE\n\t\t\tShutDown()\n\t\t\tEnd\n\n\t\tCase EVENT_MENUACTION\n\t\t\tIf EventData () = 1 Then\n\t\t\t\tShutDown()\n\t\t\t\tEnd\n\t\t\tEnd If\n\n\t\t\tIf EventData () = 3 Then Notify (\"Coffee, Inc. only works with coffee!\")\n\n\tEnd Select\nForever<\/pre>\n<p>Application bundle for <a href=\"https:\/\/www.wmaus.net\/GUICoffee.zip\">Mac OS X\/Intel<\/a>.<\/p>\n<p>Application bundle for <a href=\"https:\/\/www.wmaus.net\/GUICoffeePPC.zip\">Mac OS X\/PPC<\/a>.<\/p>\n<p>Executable for <a href=\"https:\/\/www.wmaus.net\/GUICoffeeWin.zip\">Windows<\/a>.<\/p>\n<h3>Digital Nomad NNTP Server<\/h3>\n<p>As mentioned earlier, back at Alaska Software, I had written the first version of an NNTP desktop GUI client called <em>Baumbart<\/em>. This here is a multi-threaded NNTP\/News server written in C#. I wrote it a couple of years ago to get familiar with the C# language. (GPL.)<\/p>\n<p><a href=\"https:\/\/www.wmaus.net\/MonoNomad.zip\">Digital Nomad for Mono\/MySQL<\/a><br \/>\n(C# Source Code only, compatible with OS X.)<\/p>\n<p><a href=\"https:\/\/www.wmaus.net\/nomad.zip\">Digital Nomad for Windows<\/a><br \/>\n(Installer bundled with MSDE 2000, Windows only. This was created in Windows XP times and it probably won&#8217;t run on current versions of Windows, but I won&#8217;t be investing time in this build anymore to fix or update it.)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sic parvis magna I&#8217;m blessed that I started using computers at a very young age and in a time where home computers had just arrived and only had one kilobyte of RAM. That allowed me to be part of the PC revolution from the start. I know what&#8217;s happening underneath the graphical user interfaces and &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.wmaus.net\/?page_id=369\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;My life in professional IT&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":20,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"class_list":["post-369","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.wmaus.net\/index.php?rest_route=\/wp\/v2\/pages\/369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wmaus.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.wmaus.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.wmaus.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wmaus.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=369"}],"version-history":[{"count":107,"href":"https:\/\/www.wmaus.net\/index.php?rest_route=\/wp\/v2\/pages\/369\/revisions"}],"predecessor-version":[{"id":6247,"href":"https:\/\/www.wmaus.net\/index.php?rest_route=\/wp\/v2\/pages\/369\/revisions\/6247"}],"wp:attachment":[{"href":"https:\/\/www.wmaus.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}