<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>Elmar Klausmeier's Blog</title>
	<description>Elmar Klausmeier's Blog on Computers, Programming, and Mathematics</description>
	<lastBuildDate>Sun, 19 Oct 2025 10:57:50 +0000</lastBuildDate>
	<link>https://eklausmeier.goip.de</link>
	<atom:link href="https://eklausmeier.goip.de/feed.xml" rel="self" type="application/rss+xml" />
	<generator>Simplified Saaze</generator>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/10-06-readings-in-quantum-computing</link>
		<guid>https://eklausmeier.goip.de/blog/2025/10-06-readings-in-quantum-computing</guid>
		<title>Readings in Quantum Computing</title>
		<category>mathematics</category>
		<pubDate>Mon, 06 Oct 2025 21:00:00 +0200</pubDate>
		<description><![CDATA[
<p>Below is a list of good readings regarding quantum computing.</p>
<ol>
<li><a href="https://arxiv.org/pdf/1907.09415">Quantum Computing: Lecture Notes, by Ronald de Wolf</a></li>
<li><a href="https://simonapers.github.io/sorbonne/sorbonne-primer.pdf">Advanced Quantum Algorithms: Primer on Circuits, QFT and Grover, by Simon Apers</a></li>
<li><a href="https://www.scottaaronson.com">Scott Aaronson: Lecture Notes, blog, courses</a></li>
<li><a href="https://scirate.com">SciRate</a></li>
</ol>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/09-09-clear-cache-in-brave-for-android</link>
		<guid>https://eklausmeier.goip.de/blog/2025/09-09-clear-cache-in-brave-for-android</guid>
		<title>Clear Cache in Brave for Android</title>
		<category>Android</category>
		<category>web-browsing</category>
		<pubDate>Tue, 09 Sep 2025 12:40:00 +0200</pubDate>
		<description><![CDATA[
<p>Problem statement: How to clear the cache in the <a href="https://brave.com">Brave browser</a> on Android.</p>
<p>The Brave browser attracted some interest as it provides protection against malware, and blocks annoying ads, like flickering images, popups, which want you to download shady and harmful software.
You can download the Brave browser in the <a href="https://play.google.com/store/apps/details?id=com.brave.browser&amp;hl=en">Google playstore</a>.</p>
<ol>
<li><a href="#short">Short story</a></li>
<li><a href="#long">Long story</a></li>
</ol>
<p>Clearing the cache in the desktop version of Brave is easy: Go to the settings menu, then search for &quot;clear cache&quot;.
Done.</p>
<h2>1. Short story<a id=short></a></h2>
<p>On Android the settings menu for Brave does <em>not</em> offer any method to clear the cache.
Instead, use the App info to clear the cache.</p>
<p>Long press on the Brave icon.</p>
<p><img src="https://eklausmeier.goip.de/img/Android-Brave-Info.webp" alt=""></p>
<p>Press on the encircled <em>i</em>.</p>
<p><img src="https://eklausmeier.goip.de/img/Android-Brave-App-info.webp" alt=""></p>
<p>Press &quot;Clear data&quot;.</p>
<p><img src="https://eklausmeier.goip.de/img/Android-Brave-Clear-cache.webp" alt=""></p>
<p>Finally, press &quot;Clear cache&quot;.</p>
<h2>2. Long story<a id=long></a></h2>
<p>The above short story solves the problem.
However, it does not tell, <em>why</em> this might be necessary.</p>
<p>In a particular case for me I had the need to clear the cache, when I upgraded <a href="https://eklausmeier.goip.de/blog/2023/10-23-pagefind-searching-in-static-sites">Pagefind</a> 1.3 to 1.4.
Apparently, the two version were not compatible, and Pagefind 1.4 was no longer able to search.
I solved this by clearing the cache in Brave.</p>
<p>The reason behind the cache problem was that in the NGINX configuration I had:</p>
<pre><code class="language-conf">location ~ \.(js|css|jpg|jpeg|png|webp|mp4|pdf)$ {
    add_header Cache-Control &quot;public, max-age=7776000&quot;;
}
</code></pre>
<p>JavaScript is advertised by the web-server to be cached by the browser for 90 days: 90 * 60 * 60 * 24 = 7,776,000.</p>
<p>The ordinary user can see this header either in his browser, or using <code>curl</code>:</p>
<pre><code class="language-bash[data-line=10]">$ curl -I https://eklausmeier.goip.de/pagefind/pagefind-ui.js
HTTP/1.1 200 OK
Server: nginx/1.28.0
Date: Tue, 09 Sep 2025 10:26:46 GMT
Content-Type: text/javascript
Content-Length: 84597
Last-Modified: Mon, 08 Sep 2025 17:05:18 GMT
Connection: keep-alive
ETag: &quot;68bf0cce-14a75&quot;
Cache-Control: public, max-age=7776000
Accept-Ranges: bytes
</code></pre>
<p>For images, videos, and PDF that caching interval is adequate.
For Pagefind 1.4 it was not.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/08-25-slides-on-simplified-saaze</link>
		<guid>https://eklausmeier.goip.de/blog/2025/08-25-slides-on-simplified-saaze</guid>
		<title>Slides on Simplified Saaze</title>
		<category>blogging</category>
		<pubDate>Mon, 25 Aug 2025 21:30:00 +0200</pubDate>
		<description><![CDATA[
<p>This very blog is using <a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a> as a static site generator.
I.e., I write my blog posts in Markdown, then <em>Simplified Saaze</em> converts them to plain HTML and CSS.</p>
<p><strong>1. Brief history:</strong> In May 2021 I moved from WordPress to the static site generator <a href="https://saaze.dev">Saaze</a>.
See post <a href="https://eklausmeier.goip.de/blog/2021/05-18-moved-blog-to-eklausmeier-goip-de">Moved Blog To eklausmeier.goip.de</a>.
I was particularly attracted by the simplicity of Saaze.
However, a number of features were missing:</p>
<ol>
<li>being able to move the blog around under different root directories</li>
<li>showing math formulas using MathJax</li>
</ol>
<p>I added those two mssing features to Saaze.</p>
<p>I noticed that I could improve the speed of Saaze quite significantly.
Furthermore, the code of Saaze could be stripped of unnecessary complexities, but still retaining the old logic.
This led to a modified version of Saaze, which I called <em>Simplified Saaze</em>.
<em>Simplified Saaze</em> has fewer lines of code than Saaze.
Despite this, it is almost two orders of magnitude faster than the original.</p>
<p>See</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2021/10-19-making-static-site-generator-30-times-faster">Making Static Site Generator 30-Times Faster</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2021/11-12-making-static-site-generator-500-times-faster">Making Static Site Generator 500-Times Faster</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2021/11-13-performance-comparison-saaze-vs-hugo-vs-zola">Performance Comparison Saaze vs. Hugo vs. Zola</a></li>
</ol>
<p>Just out of curiosity I wanted to know how much slower <em>Simplified Saaze</em> is than <a href="https://gohugo.io">Hugo</a>.
Hugo self advertises itself as &quot;The world’s fastest framework for building websites&quot;.
Hugo is written in the compiled language Go, while <em>Simplified Saaze</em> is written in the interpreted language PHP.
I expected that Hugo would blow <em>Simplified Saaze</em> out of the water.</p>
<p>To my great surprise the opposite was the case.
<em>Simplified Saaze</em> was one order of magnitude <em>faster</em> than Hugo.
I didn't expect that.</p>
<p>I tested against <a href="https://www.getzola.org">Zola</a>.
Still, <em>Simplified Saaze</em> was faster by a factor than Zola.</p>
<p>There are at least two other static site generators, which are also faster than Hugo and Zola: they are called</p>
<ol>
<li><a href="https://www.getblades.org">Blade</a></li>
<li><a href="https://nift.dev">Nift</a></li>
</ol>
<p>So my findings are not entirely surprising.</p>
<p><strong>2. Conferences.</strong> Besides reporting about my findings on this very blog, I offered slides to the following conferences:</p>
<ol>
<li>PHP conference in Berlin in 2021</li>
<li>Dutch PHP conference in 2022</li>
<li>IPC Berlin 2022</li>
<li>Forum PHP 2022</li>
<li>Frontmania 2022</li>
<li>Longhorn PHP 2022 in Texas</li>
<li>PHP UK Conference 2023</li>
<li>Build Stuff conference 2022</li>
<li>Infobip Shift 2023</li>
</ol>
<p>All the conferences rejected the slides.
This is not entirely uncommon, as the presenter is paid all traveling and hotel costs for the conference.
However, the organizers of PHP conference in Berlin asked me to publish my findings in their magazine called &quot;PHP Magazin&quot;.
It was published there.</p>
<p><strong>3. Slides.</strong>
Here are the slides.</p>
<p><a href="https://eklausmeier.goip.de/pdf/PHP-Conf-2022-Saaze2.pdf">A Static Site Generator in PHP, Faster Than Hugo or Zola</a></p>
<p><strong>4. Themes.</strong>
There are a number of themes for <a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a>:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/saaze-example">Saaze example</a>, a pure example theme, simple to use and modify</li>
<li><a href="https://eklausmeier.goip.de/jpilot">J-Pilot</a>, showcasing an open-source software project and having a hierarchical menu</li>
<li><a href="https://eklausmeier.goip.de/koehntopp">Koehntopp</a>, a blog for a computer scientist</li>
<li><a href="https://eklausmeier.goip.de/nukeklaus">NukeKlaus</a>, a blog for a nuclear power engineer</li>
<li><a href="https://eklausmeier.goip.de/mobility">Mobility</a>, a multilingual site for promoting software for battery management used in electric vehicles</li>
<li><a href="https://eklausmeier.goip.de/vonhoff">Vonhoff</a>, a German site for a doctoral student</li>
<li><a href="https://eklausmeier.goip.de/paternoster">Paternoster</a>, a blog of a web developer</li>
<li><a href="https://eklausmeier.goip.de/panorama">Panorama</a>, a site for a restaurant showing their rooms and their menu</li>
<li><a href="https://eklausmeier.goip.de/lemire">Lemire</a>, a site for a computer science professor</li>
<li><a href="https://eklausmeier.goip.de/wendt">Wendt</a>, a German political blog</li>
<li><a href="https://eklausmeier.goip.de/myrawest">Myra West</a>, a personal blog about psychology, friendship, and personal journaling</li>
</ol>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/08-13-invalid-mit-magic-cookie-1-key</link>
		<guid>https://eklausmeier.goip.de/blog/2025/08-13-invalid-mit-magic-cookie-1-key</guid>
		<title>Invalid MIT-MAGIC-COOKIE-1 key</title>
		<category>X11</category>
		<pubDate>Wed, 13 Aug 2025 20:00:00 +0200</pubDate>
		<description><![CDATA[
<p><strong>1. Problem statement:</strong> You can no longer start any X applications.
You just get something like</p>
<pre class="line-numbers"><code class="language-bash">$ xclock
Invalid MIT-MAGIC-COOKIE-1 key
Error: Can't open display: :0
</code></pre>
<p>You cannot even run</p>
<pre class="line-numbers"><code class="language-bash">$ xhost +
Invalid MIT-MAGIC-COOKIE-1 key
xhost:  unable to open display &quot;:0&quot;
</code></pre>
<p>So, you are stuck.</p>
<p><strong>2. Solution.</strong>
Copy current X11 cookie to <code>.Xauthority</code> file, like so:</p>
<pre class="line-numbers"><code class="language-bash">$ cp -p /tmp/serverauth.wBYidy7HBj .Xauthority
</code></pre>
<p>The actual serverauth filename varies.</p>
<p>This was documented here:
<a href="https://unix.stackexchange.com/questions/649651/invalid-mit-magic-cookie-1-keyxhost-unable-to-open-display-0">Invalid MIT-MAGIC-COOKIE-1 keyxhost: unable to open display</a>.</p>
<p>Check with</p>
<pre class="line-numbers"><code class="language-bash">$ xauth list
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/08-04-installing-simplified-saaze-on-oracle-cloud</link>
		<guid>https://eklausmeier.goip.de/blog/2025/08-04-installing-simplified-saaze-on-oracle-cloud</guid>
		<title>Installing Simplified Saaze on Oracle Cloud</title>
		<category>Linux</category>
		<pubDate>Mon, 04 Aug 2025 16:30:00 +0200</pubDate>
		<description><![CDATA[
<p>This blog runs on <a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze">Simplified Saaze</a>.
<em>Simplified Saaze</em> is a static site generator written in PHP.
I use <em>Simplified Saaze</em> to generate all ca. static 700 HTML files.</p>
<p>I recently configured a minimal Oracle cloud instance, see <a href="https://eklausmeier.goip.de/blog/2025/08-02-first-impressions-on-oracle-cloud">First Impressions on Oracle Cloud</a>.
This blog post shows how to install <em>Simplified Saaze</em> on that instance running on Oracle Linux 9.</p>
<p>I had already written about some installations of <em>Simplified Saaze</em>:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze#installation"><em>Simplified Saaze</em></a></li>
<li><a href="https://eklausmeier.goip.de/blog/2023/01-03-installing-simplified-saaze-on-windows-10">Installing Simplified Saaze on Windows 10</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2023/01-31-installing-simplified-saaze-on-windows-10-p2">Installing Simplified Saaze on Windows 10 #2</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2024/12-15-installing-simplified-saaze-on-android">Installing Simplified Saaze on Android</a></li>
</ol>
<h2>1. Installing packages</h2>
<p>Install <code>php-cli</code>.</p>
<pre><code class="language-bash">dnf --disablerepo=ol9_oci_included install php-cli
</code></pre>
<p>Packages <code>php-common</code> and <code>php-opcache</code> are automatically installed as dependency as well.</p>
<p>The much large package <code>php</code> contains an httpd-server, which we do not want.
We already have chosen NGINX.
So, we did not install package <code>php</code>, but just <code>php-cli</code> which is way smaller.</p>
<p>We need to compile two PHP PECL extensions:</p>
<ol>
<li><a href="https://pecl.php.net/package/md4c">MD4C</a></li>
<li><a href="https://pecl.php.net/package/yaml">Yaml</a></li>
</ol>
<p>Therefore we need some development libraries.</p>
<pre><code class="language-bash">dnf --disablerepo=ol9_oci_included install php-devel
</code></pre>
<p>This in turn installs dependencies.</p>
<pre><code>autoconf                  noarch       2.69-39.el9                 ol9_appstream           741 k
automake                  noarch       1.16.2-8.el9                ol9_appstream           794 k
cmake-filesystem          x86_64       3.26.5-2.el9                ol9_appstream            11 k
gcc-c++                   x86_64       11.5.0-5.0.1.el9_5          ol9_appstream            13 M
keyutils-libs-devel       x86_64       1.6.3-1.el9                 ol9_appstream            88 k
krb5-devel                x86_64       1.21.1-8.0.1.el9_6          ol9_appstream           187 k
libcom_err-devel          x86_64       1.46.5-7.el9                ol9_appstream            24 k
libkadm5                  x86_64       1.21.1-8.0.1.el9_6          ol9_baseos_latest        75 k
libselinux-devel          x86_64       3.6-3.el9                   ol9_appstream           338 k
libsepol-devel            x86_64       3.6-2.el9                   ol9_appstream            87 k
libstdc++-devel           x86_64       11.5.0-5.0.1.el9_5          ol9_appstream           3.1 M
libtool                   x86_64       2.4.6-46.el9                ol9_appstream           606 k
libverto-devel            x86_64       0.3.2-3.el9                 ol9_appstream            15 k
libxml2-devel             x86_64       2.9.13-11.el9_6             ol9_appstream           1.1 M
m4                        x86_64       1.4.19-1.el9                ol9_appstream           333 k
openssl-devel             x86_64       1:3.2.2-6.0.1.el9_5.1       ol9_appstream           4.0 M
pcre2-devel               x86_64       10.40-6.0.1.el9             ol9_appstream           669 k
pcre2-utf16               x86_64       10.40-6.0.1.el9             ol9_appstream           213 k
pcre2-utf32               x86_64       10.40-6.0.1.el9             ol9_appstream           202 k
perl-File-Compare         noarch       1.100.600-481.1.el9_6       ol9_appstream            12 k
perl-Thread-Queue         noarch       3.14-460.el9                ol9_appstream            28 k
perl-threads              x86_64       1:2.25-460.el9              ol9_appstream            65 k
perl-threads-shared       x86_64       1.61-460.el9                ol9_appstream            50 k
</code></pre>
<p>The PHP Yaml extension needs the yaml C header.</p>
<pre><code class="language-bash">dnf --disablerepo=ol9_oci_included --enablerepo=ol9_codeready_builder install libyaml-devel
</code></pre>
<p>This strange looking <code>--disablerepo=ol9_oci_included</code> was explained in <a href="https://eklausmeier.goip.de/blog/2025/08-02-first-impressions-on-oracle-cloud">First Impressions on Oracle Cloud</a>.
The <code>--enablerepo</code> adds the repo such that <code>dnf</code> finds <code>libyaml-devel</code>.
See <a href="https://docs.oracle.com/en/graalvm/jdk/22/docs/reference-manual/ruby/InstallingLibYAML/">Installing LibYAML</a>.</p>
<h2>2. Compiling extensions</h2>
<p><strong>1. MD4C extension.</strong> Copy the tar-file:</p>
<pre><code class="language-bash">scp -i ~/.ssh/ssh-key-2025-08-02-dl8dbo-opc.key -p md4c-1.1.tgz opc@oracle-cloud-instance:/tmp/
</code></pre>
<p>Unpack, go to to the directory, then run</p>
<pre><code class="language-bash">phpize
./configure
make
</code></pre>
<p><strong>2. Yaml extension.</strong> Copy the tar-file:</p>
<pre><code class="language-bash">scp -i ~/.ssh/ssh-key-2025-08-02-dl8dbo-opc.key -p yaml-2.2.5.tgz opc@oracle-cloud-instance:/tmp/
</code></pre>
<p>Unpack, then run</p>
<pre><code class="language-bash">phpize
./configure
make
make test
</code></pre>
<p>Both modules are then copied to <code>/usr/lib64/php/modules</code>:</p>
<pre><code class="language-bash">cd /usr/lib64/php/modules/
cp -p ~opc/D/md4c-1.1/modules/md4c.so .
cp -p ~opc/D/yaml-2.2.5/modules/yaml.so .
chown root:root md4c.so yaml.so
</code></pre>
<p>Finally, <code>php.ini</code> needs adjustment.
Add the following new file to <code>/etc/php.d/90-md4c-yaml.ini</code>:</p>
<pre><code>extension=md4c
extension=yaml
</code></pre>
<p>Check results with:</p>
<pre><code class="language-bash">php -m
</code></pre>
<p>Result should be:</p>
<pre><code>[PHP Modules]
bz2
calendar
Core
ctype
curl
date
exif
fileinfo
filter
ftp
gettext
hash
iconv
json
libxml
md4c
openssl
pcntl
pcre
Phar
readline
Reflection
session
sockets
SPL
standard
tokenizer
yaml
Zend OPcache
zlib

[Zend Modules]
Zend OPcache
</code></pre>
<h2>3. Installing composer</h2>
<p>There is a lot of <a href="https://en.wikipedia.org/wiki/Tohu_wa-bohu">Tohu wa-bohu</a> around the installation of PHP composer.
I followed the instructions in the <a href="https://gitlab.archlinux.org/archlinux/packaging/packages/composer/-/blob/main/PKGBUILD?ref_type=heads">PKGBUILD</a> from the Arch Linux package <a href="https://archlinux.org/packages/extra/any/composer/">composer</a>.</p>
<p>Here is a simple installation recipe.</p>
<ol>
<li>Download <code>composer.phar</code> from <a href="https://github.com/composer/composer/releases">composer Releases</a>.</li>
<li>Rename: <code>mv composer.phar /usr/local/bin/composer</code></li>
<li><code>chown root:root /usr/local/bin/composer</code></li>
<li>Make it executable: <code>chmod 775 /usr/local/bin/composer</code></li>
</ol>
<p>Checking that it actually works, let's fetch <a href="https://eklausmeier.goip.de/saaze-example">Saaze example</a>.</p>
<pre><code class="language-bash">cd
composer create-project eklausme/saaze-example
</code></pre>
<p>Output is:</p>
<pre><code class="language-bash">$ time composer create-project eklausme/saaze-example
Creating a &quot;eklausme/saaze-example&quot; project at &quot;./saaze-example&quot;
Installing eklausme/saaze-example (v1.4)
  - Downloading eklausme/saaze-example (v1.4)
  - Installing eklausme/saaze-example (v1.4): Extracting archive
Created project in /home/opc/saaze-example
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking eklausme/saaze (v2.5)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading eklausme/saaze (v2.5)
  - Installing eklausme/saaze (v2.5): Extracting archive
Generating optimized autoload files
No security vulnerability advisories found.

real    0m2.132s
user    0m0.467s
sys     0m0.210s
</code></pre>
<h2>4. Using Simplified Saaze</h2>
<p>Now the static HTML files can be generated.</p>
<pre><code class="language-bash">$ time php saaze
Building static site in /home/opc/saaze-example/build...
        execute(): filePath=/home/opc/saaze-example/content/auxil.yml, nSIentries=0, totalPages=0, entries_per_page=20
        execute(): filePath=/home/opc/saaze-example/content/music.yml, nSIentries=11, totalPages=1, entries_per_page=20
        execute(): filePath=/home/opc/saaze-example/content/blog.yml, nSIentries=35, totalPages=2, entries_per_page=20
Finished creating 3 collections, 3 with index, and 47 entries (0.06 secs / 756kB)
#collections=3, parseEntry=0.0020/47-3, md2html=0.0009, toHtml=0.0002/47, renderEntry=0.0054/47, renderCollection=0.0007/6, content=47/0

real    0m0.092s
user    0m0.019s
sys     0m0.035s
</code></pre>
<p>Looking at the result in the <code>build</code> directory.</p>
<pre><code class="language-bash">$ ls -alF build/
total 8
drwxr-xr-x.  4 opc opc   49 Aug  4 13:47 ./
drwxr-xr-x.  7 opc opc  184 Aug  4 13:47 ../
drwxr-xr-x. 38 opc opc 4096 Aug  4 13:47 blog/
-rw-r--r--.  1 opc opc  965 Aug  4 13:47 index.html
drwxr-xr-x.  4 opc opc   48 Aug  4 13:47 music/
</code></pre>
<p>To actually deploy the web-site the following simple shell script will do.
Beforehand, create <code>mkdir /srv/http/oldblogs</code>.</p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Saaze-Example

cd /home/opc/php/saaze-example
time RBASE=&quot;/saaze-example&quot; php saaze -b /tmp/build

cd /tmp/build
rm index.html
ln -s blog/index.html
cp -p /home/opc/php/saaze-example/public/blogklm.css .

cd /srv/http/
rm -rf oldblogs/saaze-example/
mv saaze-example/ oldblogs/

mv /tmp/build/ saaze-example
</code></pre>
<p>To enable NGINX to read all subdirectories in <code>/srv/http</code> you must <a href="https://serverfault.com/questions/131105/how-do-i-get-selinux-to-allow-apache-and-samba-on-the-same-folder">instruct</a> SELinux:</p>
<pre><code class="language-bash">chcon -R -t public_content_rw_t /srv/http
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/08-02-first-impressions-on-oracle-cloud</link>
		<guid>https://eklausmeier.goip.de/blog/2025/08-02-first-impressions-on-oracle-cloud</guid>
		<title>First Impressions on Oracle Cloud</title>
		<category>Linux</category>
		<pubDate>Sat, 02 Aug 2025 22:10:00 +0200</pubDate>
		<description><![CDATA[
<ul>
<li><a href="#InstanceSetup">1. Instance Setup</a></li>
<li><a href="#dnfProblem">2. Problem with <code>dnf</code></a></li>
<li><a href="#SetupNGINX">3. Setup NGINX</a></li>
<li><a href="#SporadicDropouts">4. Problem with sporadic dropouts</a></li>
</ul>
<p>I read about the Oracle <a href="https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm">Always Free Instance</a> here:</p>
<ol>
<li><a href="https://prozak.org/005-oracle-cloud-always-free-instance-ubuntu-debian-conversion/">Oracle Cloud Always Free Instance Ubuntu -&gt; Debian Conversion</a></li>
<li><a href="https://www.cflee.com/posts/oci-first-look/">Oracle Cloud: first impressions</a></li>
</ol>
<p>I registered for <a href="https://en.wikipedia.org/wiki/Oracle_Cloud">Oracle cloud</a>.</p>
<p>The registration requires:</p>
<ol>
<li>a credit card</li>
<li>a smartphone with the <a href="https://play.google.com/store/apps/details?id=oracle.idm.mobile.authenticator">Oracle Mobile Authenticator</a> app</li>
</ol>
<h2>1. Instance Setup<a id=InstanceSetup></a></h2>
<p>The credit card will be debited with 0.93 EUR, but this sum will be refunded.</p>
<p>The <a href="https://play.google.com/store/apps/details?id=oracle.idm.mobile.authenticator">Oracle authenticator</a> app is known to be problematic, as it seems there is no way to transfer the credentials to another phone, in case you upgrade your phone.</p>
<p>The setup of a virtual Linux machine on Oracle cloud is quite confusing, but clicking through all the endless dialogues will finally provide you with a simple virtual machine and a public IP.</p>
<p>You can then connect to this public IP giving ssh keys, which were generated during the dialogues.</p>
<pre><code class="language-bash">ssh -l opc -i ssh-key-2025-08-02.key 144.24.181.149
</code></pre>
<p>The machine itself is fast, although it uses a now no longer produced <a href="https://en.wikipedia.org/wiki/Epyc">AMD EPYC</a> 7551 (&quot;Naples&quot;) processor.
This <a href="https://en.wikipedia.org/wiki/Epyc">AMD EPYC</a> 7551 was produced in 2017.</p>
<pre><code class="language-bash">$ lscpu
Architecture:                x86_64
  CPU op-mode(s):            32-bit, 64-bit
  Address sizes:             40 bits physical, 48 bits virtual
  Byte Order:                Little Endian
CPU(s):                      2
  On-line CPU(s) list:       0,1
Vendor ID:                   AuthenticAMD
  Model name:                AMD EPYC 7551 32-Core Processor
    CPU family:              23
    Model:                   1
    Thread(s) per core:      2
    Core(s) per socket:      1
    Socket(s):               1
    Stepping:                2
    BogoMIPS:                3992.49
    Flags:                   fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe
                             1gb rdtscp lm rep_good nopl xtopology cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcn
                             t tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw
                              topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xg
                             etbv1 clzero xsaveerptr virt_ssbd arat npt nrip_save vgif overflow_recov succor arch_capabilities
Virtualization features:
  Virtualization:            AMD-V
  Hypervisor vendor:         KVM
  Virtualization type:       full
Caches (sum of all):
  L1d:                       64 KiB (1 instance)
  L1i:                       64 KiB (1 instance)
  L2:                        512 KiB (1 instance)
  L3:                        16 MiB (1 instance)
NUMA:
  NUMA node(s):              1
  NUMA node0 CPU(s):         0,1
Vulnerabilities:
  Gather data sampling:      Not affected
  Indirect target selection: Not affected
  Itlb multihit:             Not affected
  L1tf:                      Not affected
  Mds:                       Not affected
  Meltdown:                  Not affected
  Mmio stale data:           Not affected
  Reg file data sampling:    Not affected
  Retbleed:                  Mitigation; untrained return thunk; SMT vulnerable
  Spec rstack overflow:      Vulnerable: Safe RET, no microcode
  Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:                Mitigation; Retpolines; IBPB conditional; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected
  Srbds:                     Not affected
  Tsa:                       Not affected
  Tsx async abort:           Not affected
</code></pre>
<p>Memory is not opulent, one GB:</p>
<pre><code class="language-bash[data-lines=6]">$ lsmem
RANGE                                 SIZE  STATE REMOVABLE BLOCK
0x0000000000000000-0x000000003fffffff   1G online       yes   0-7

Memory block size:       128M
Total online memory:       1G
Total offline memory:      0B
</code></pre>
<p>SSD storage is 30 GB:</p>
<pre><code class="language-bash">$ df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    4.0M     0  4.0M   0% /dev
tmpfs                       252M     0  252M   0% /dev/shm
tmpfs                       101M  2.8M   99M   3% /run
efivarfs                    256K   35K  217K  14% /sys/firmware/efi/efivars
/dev/mapper/ocivolume-root   30G  5.6G   24G  19% /
/dev/sda2                   2.0G  623M  1.4G  32% /boot
/dev/mapper/ocivolume-oled   15G  202M   15G   2% /var/oled
/dev/sda1                   100M  7.2M   93M   8% /boot/efi
tmpfs                        51M     0   51M   0% /run/user/989
tmpfs                        51M     0   51M   0% /run/user/1000
</code></pre>
<p>Partitions are:</p>
<pre><code class="language-bash">$ lsblk -af
lsblk -af
NAME               FSTYPE      FSVER    LABEL UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1             vfat        FAT16          AE3C-806E                                92.6M     7% /boot/efi
├─sda2             xfs                        dd88872e-0527-4193-8282-b8281f1ae6fd      1.3G    31% /boot
└─sda3             LVM2_member LVM2 001       13gBAf-puy6-RFhI-zAfe-nNzD-sYAi-3zKEWn
  ├─ocivolume-root xfs                        3aa327e4-ce2d-4637-9f24-7687e2c0e8b9     23.8G    19% /
  └─ocivolume-oled xfs                        1a046f0c-bfff-4334-baf3-32b6db923a8a     14.7G     2% /var/oled
</code></pre>
<p>After I installed NGINX:</p>
<pre><code class="language-bash">[root@instance-20250802-1100 ~]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:44321         0.0.0.0:*               LISTEN      2410/pmcd
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6307/nginx: master
tcp        0      0 127.0.0.1:4330          0.0.0.0:*               LISTEN      3296/pmlogger
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2230/sshd: /usr/sbi
tcp        0      0 10.0.0.138:49994        169.254.169.254:80      ESTABLISHED 3356/runcommand
tcp        0      0 10.0.0.138:53180        169.254.169.254:80      ESTABLISHED 3356/runcommand
tcp        0      0 10.0.0.138:47106        147.154.152.55:443      ESTABLISHED 2421/gomon
tcp        0      0 10.0.0.138:38010        169.254.169.254:80      ESTABLISHED 2421/gomon
tcp        0      0 10.0.0.138:45260        169.254.169.254:80      ESTABLISHED 3356/runcommand
tcp        0    196 10.0.0.138:22           149.172.93.57:60574     ESTABLISHED 4872/sshd: opc [pri
tcp        0      0 10.0.0.138:58454        169.254.169.254:80      ESTABLISHED 3356/runcommand
tcp        0      0 10.0.0.138:51840        169.254.169.254:80      ESTABLISHED 3356/runcommand
tcp        0      0 10.0.0.138:40406        169.254.169.254:80      ESTABLISHED 3356/runcommand
tcp        0      0 10.0.0.138:46170        169.254.169.254:80      ESTABLISHED 3356/runcommand
tcp6       0      0 ::1:44321               :::*                    LISTEN      2410/pmcd
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd
tcp6       0      0 :::80                   :::*                    LISTEN      6307/nginx: master
tcp6       0      0 ::1:4330                :::*                    LISTEN      3296/pmlogger
tcp6       0      0 :::22                   :::*                    LISTEN      2230/sshd: /usr/sbi
</code></pre>
<h2>2. Problem with <code>dnf</code><a id=dnfProblem></a></h2>
<p>Just using <code>dnf</code> or <code>yum</code> will essentially hang the machine.</p>
<p>User Any_Working3520 figured out in <a href="https://www.reddit.com/r/oraclecloud/comments/1bb3iip/dnf_install_is_very_slow_on_my_oci_compute/">dnf install is very slow on my OCI compute instances</a>, that you have to <em>disable</em> one particular repo for dnf/yum:</p>
<pre><code class="language-bash">yum --disablerepo=ol9_oci_included ...
dnf --disablerepo=ol9_oci_included ...
</code></pre>
<p>With that you can update the machine:</p>
<pre><code class="language-bash">dnf --disablerepo=ol9_oci_included update
</code></pre>
<h2>3. Setup NGINX<a id=SetupNGINX></a></h2>
<p>The help center post <a href="https://docs.oracle.com/en/learn/lab_compute_instance/index.html#introduction">&quot;Create a web server on a compute instance&quot;</a> was helpful.</p>
<p>Installing NGINX:</p>
<pre><code class="language-bash">dnf --disablerepo=ol9_oci_included install nginx
systemctrl enable nginx
systemctrl start nginx
</code></pre>
<p>You have to specifically allow incoming TCP traffic for port 80:</p>
<pre><code class="language-bash">firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload
</code></pre>
<p>Then head to <em>Virtual Cloud Networks</em>.</p>
<p><img src="https://eklausmeier.goip.de/img/OracleCloudVCN1.webp" alt="Photo"></p>
<p>Click on the <em>Default Security List for vcn-xyz</em>.
Then <em>Security rules</em>.</p>
<p><img src="https://eklausmeier.goip.de/img/OracleCloudVCN2.webp" alt="Photo"></p>
<p>Create an ingress rule:</p>
<ol>
<li>Source Type: CIDR</li>
<li>Source CIDR: 0.0.0.0/0</li>
<li>IP Protocol: TCP</li>
<li>Source Port Range: All (it's really important to choose <em>All</em>, not just 80)</li>
<li>Destination Port Range: 80</li>
</ol>
<p>Both ports, 22 and 80, must have <em>Source Port Range</em> set to <em>All</em>.
This is somewhat counterintuitive, but required.</p>
<p><img src="https://eklausmeier.goip.de/img/OracleCloudVCN2.webp" alt="Photo"></p>
<p>Check in a browser:</p>
<p><img src="https://eklausmeier.goip.de/img/OracleCloudNGINX.webp" alt="Photo"></p>
<p>If you want to change the NGINX root directory, you <em>must</em> also change the SELinux security context.
See <a href="https://docs.oracle.com/en/learn/ol-nginx/">Install the NGINX Web Server and Proxy on Oracle Linux</a>.
Assume your new root is <code>/srv/http</code>.
Then</p>
<pre><code class="language-bash">chcon -Rt httpd_sys_content_t /srv/http
</code></pre>
<p>Check with ```ls -lZ /srv/http`.</p>
<h2>4. Problem with sporadic dropouts<a id=SporadicDropouts></a></h2>
<p>If you experiment with the above <em>Security Lists</em> be prepared to get yourself disconnected.</p>
<p>However, for unknown reasons the connection to the instance drops completely, i.e., no ssh connection and no HTTP connection.
You have to wait an hour to get it back again.</p>
<p>This happens regularly.</p>
<p>The default <code>iptables</code> rules are:</p>
<pre><code class="language-bash"># iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N BareMetalInstanceServices
-A OUTPUT -d 169.254.0.0/16 -j BareMetalInstanceServices
-A BareMetalInstanceServices -d 169.254.0.2/32 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.2.0/24 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.4.0/24 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.5.0/24 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.0.2/32 -p tcp -m tcp --dport 80 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.169.254/32 -p udp -m udp --dport 53 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.169.254/32 -p tcp -m tcp --dport 53 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.0.3/32 -p tcp -m owner --uid-owner 0 -m tcp --dport 80 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.0.4/32 -p tcp -m tcp --dport 80 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.169.254/32 -p udp -m udp --dport 67 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.169.254/32 -p udp -m udp --dport 69 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.169.254/32 -p udp -m udp --dport 123 -m comment --comment &quot;Allow access to OBMCS local NTP service&quot; -j ACCEPT
-A BareMetalInstanceServices -d 169.254.0.0/16 -p tcp -m tcp -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j REJECT --reject-with tcp-reset
-A BareMetalInstanceServices -d 169.254.0.0/16 -p udp -m udp -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Bare Metal documentation for security impact of modifying or removing this rule&quot; -j REJECT --reject-with icmp-port-unreachable
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-20-php-stuttering-under-load</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-20-php-stuttering-under-load</guid>
		<title>PHP stuttering under load</title>
		<category>PHP</category>
		<category>web-server</category>
		<pubDate>Sun, 20 Jul 2025 23:00:00 +0200</pubDate>
		<description><![CDATA[
<p>This very blog is run by <a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a>.
<em>Simplified Saaze</em> is a static site generator, i.e., it reads Markdown files and produces HTML files, which are then served from a web-server.
This is called static mode.</p>
<p><em>Simplified Saaze</em> can also be used in a dynamic mode.
In that mode the Markdown file is converted to HTML on the fly, i.e., in the exact moment when the web-server receives a request, <em>Simplified Saaze</em> produces the required HTML.</p>
<p>This blog post describes why I moved back from dynamic mode to static mode.</p>
<ul>
<li><a href="#currentSetup">A. Current setup</a></li>
<li><a href="#deploymentScripts">B. Deployment scripts for static sites</a></li>
<li><a href="#runningDeployments">C. Running deployment scripts</a></li>
<li><a href="#nginx">D. NGINX configuration</a></li>
</ul>
<h2>A. Current setup<a id=currentSetup></a></h2>
<p><strong>1. File processing in <em>Simplified Saaze</em>.</strong>
<a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a> is written in PHP.
It does the following for every Markdown file:</p>
<ol>
<li>reads collection file with <a href="https://www.php.net/manual/en/function.file-get-contents.php"><code>file_get_contents()</code></a></li>
<li>recursively traverses the directory for all Markdown files with <a href="https://www.php.net/manual/en/function.scandir.php"><code>scandir()</code></a></li>
<li>read entire file with <a href="https://www.php.net/manual/en/function.file-get-contents.php"><code>file_get_contents()</code></a></li>
<li>parses the file with <a href="https://www.php.net/manual/en/function.yaml-parse.php"><code>yaml_parse()</code></a></li>
<li>file content is checked against keywords (like '[youtube]' or <code>$$</code> for math)</li>
<li>content is then converted to HTML using MD4C</li>
<li>excerpt is computed from HTML using <a href="https://www.php.net/manual/en/function.strip-tags.php"><code>strip_tags()</code></a></li>
<li>content is word counted on original Markdown</li>
<li>the (output) template PHP is run on the HTML, which in turn calls <a href="https://www.php.net/manual/en/function.eval.php"><code>eval()</code></a> on the entire HTML</li>
<li>that is then written to a file using <a href="https://www.php.net/manual/en/function.file-put-contents.php"><code>file_put_contents()</code></a>, or directly fed back to the web-server</li>
</ol>
<p>Quite some file I/O and string processing.</p>
<p>The last few blog posts regarding <a href="https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer8">stability mountains</a> were quite <em>large</em> Markdown files:</p>
<pre><code class="language-bash">-rw-r--r-- 1 klm klm 415K Jul 15 10:21 07-14-stability-mountains-for-bdf1.md
-rw-r--r-- 1 klm klm 810K Jul 15 10:30 07-14-stability-mountains-for-bdf2.md
-rw-r--r-- 1 klm klm 1.2M Jul 15 10:32 07-14-stability-mountains-for-bdf3.md
-rw-r--r-- 1 klm klm 1.6M Jul 15 10:36 07-14-stability-mountains-for-bdf4.md
-rw-r--r-- 1 klm klm 2.0M Jul 15 10:38 07-14-stability-mountains-for-bdf5.md
-rw-r--r-- 1 klm klm 2.4M Jul 15 10:39 07-14-stability-mountains-for-bdf6.md
-rw-r--r-- 1 klm klm 1.3M Jul 15 10:43 07-14-stability-mountains-for-tendler3.md
-rw-r--r-- 1 klm klm 1.7M Jul 15 10:44 07-14-stability-mountains-for-tendler4.md
-rw-r--r-- 1 klm klm 2.1M Jul 15 10:45 07-14-stability-mountains-for-tendler5.md
-rw-r--r-- 1 klm klm 2.5M Jul 15 10:46 07-14-stability-mountains-for-tendler6.md
-rw-r--r-- 1 klm klm 3.0M Jul 15 10:47 07-14-stability-mountains-for-tendler7.md
-rw-r--r-- 1 klm klm 1.2M Jul 15 10:51 07-14-stability-mountains-for-tischer3.md
-rw-r--r-- 1 klm klm 1.6M Jul 15 10:55 07-14-stability-mountains-for-tischer4.md
-rw-r--r-- 1 klm klm 2.0M Jul 15 10:56 07-14-stability-mountains-for-tischer5.md
-rw-r--r-- 1 klm klm 2.4M Jul 15 10:58 07-14-stability-mountains-for-tischer6.md
-rw-r--r-- 1 klm klm 2.8M Jul 15 10:59 07-14-stability-mountains-for-tischer7.md
-rw-r--r-- 1 klm klm 3.2M Jul 15 11:00 07-14-stability-mountains-for-tischer8.md
</code></pre>
<p><strong>2. NGINX caching.</strong>
I had NGINX configured such that a once generated HTML file will be cached using <a href="https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_no_cache"><code>fastcgi_no_cache</code></a>.</p>
<pre><code class="language-ini">http {
    root   /srv/http;

    fastcgi_cache_path /var/cache/nginx/ keys_zone=nginxpc:720m inactive=720m;
    fastcgi_cache_key &quot;$request_method$request_uri&quot;;
    fastcgi_cache nginxpc;
    fastcgi_cache_valid 720m;
    ...
}
</code></pre>
<p>I.e., files are cached for 720 minutes, that is 12 hours.</p>
<p>Caching is activated for below files:</p>
<pre><code class="language-ini">    server {
        set $no_cache 0;
        #Don't cache POST requests
        if ($request_method = POST) {
                set $no_cache 1;
        }
        if ($request_uri !~ &quot;^/(aux|blog|music|gallery|jpilot|koehntopp|lemire|mobility|myrawest|nukeklaus|panorma|paternoster|saaze-example|vonhoff|wendt)&quot;) {
                set $no_cache 1;
        }
        ...
        fastcgi_cache_bypass $no_cache;
        fastcgi_no_cache $no_cache;

    }
</code></pre>
<p>I had hoped that I can get the best of both worlds:</p>
<ol>
<li>speed of static files served by the web-server</li>
<li>dynamic generation of HTML</li>
</ol>
<p>The cache directory is quite full:</p>
<pre><code class="language-bash">[root@ryzen /var/cache/nginx]# ls -l | wc
   1110    9983   87565
</code></pre>
<p><strong>3. All sub-blogs via a single index.php.</strong>
Below <code>index.php</code> served <em>all</em> sub-blogs:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog">my own blog</a></li>
<li><a href="https://eklausmeier.goip.de/jpilot">J-Pilot</a></li>
<li><a href="https://eklausmeier.goip.de/koehntopp">Koehntop</a></li>
<li><a href="https://eklausmeier.goip.de/lemire">Lemire</a></li>
<li><a href="https://eklausmeier.goip.de/mobility">Mobility</a></li>
<li><a href="https://eklausmeier.goip.de/myrawest">Myra West</a></li>
<li><a href="https://eklausmeier.goip.de/nukeklaus">Nukeklaus</a></li>
<li><a href="https://eklausmeier.goip.de/panorama">Panorama</a></li>
<li><a href="https://eklausmeier.goip.de/paternoster">Paternoster</a></li>
<li><a href="https://eklausmeier.goip.de/saaze-example">Saaze-Example</a></li>
<li><a href="https://eklausmeier.goip.de/vonhoff">Vonhoff</a></li>
<li><a href="https://eklausmeier.goip.de/wendt">Wendt</a></li>
</ol>
<p>The PHP source code for <code>index.php</code> is as follows.</p>
<pre><code class="language-php[data-line=47]">&lt;?php
    $blog = array(
        // prefix =&gt; array( directory with content, flag for cutting prefix, default sub-URL )
        '/aux' =&gt; array('/home/klm/php/sndsaaze',0),
        '/blog' =&gt; array('/home/klm/php/sndsaaze',0),
        '/gallery' =&gt; array('/home/klm/php/sndsaaze',0),
        '/music' =&gt; array('/home/klm/php/sndsaaze',0),
        '/jpilot' =&gt; array('/home/klm/php/saaze-jpilot',1),
        '/koehntopp' =&gt; array('/home/klm/php/saaze-koehntopp',1),
        '/lemire' =&gt; array('/home/klm/php/saaze-lemire',1,'/blog'),
        '/mobility' =&gt; array('/home/klm/php/saaze-mobility',1),
        '/myrawest' =&gt; array('/home/klm/php/saaze-myrawest',1),
        '/nukeklaus' =&gt; array('/home/klm/php/saaze-nukeklaus',1),
        '/paternoster' =&gt; array('/home/klm/php/saaze-paternoster',1,'/posts'),
        '/panorama' =&gt; array('/home/klm/php/saaze-panorama',1),
        '/saaze-example' =&gt; array('/home/klm/php/saaze-example',1,'/blog'),
        '/vonhoff' =&gt; array('/home/klm/php/saaze-vonhoff',1),
        '/wendt' =&gt; array('/home/klm/php/saaze-wendt',1),
    );

    $query_string = isset($_SERVER['QUERY_STRING']) ? '/' . ltrim($_SERVER['QUERY_STRING'],'/') : '/blog';
    if ($query_string === '/') $query_string = '/blog';
    $dir = '/home/klm/php/sndsaaze';
    foreach ($blog as $prefix =&gt; $dirFlag) {	// linear search in blog[] array
        if (str_starts_with($query_string,$prefix)) {
            $dir = $dirFlag[0];
            if ($dirFlag[1]) {	// cut prefix and set rbase
                $query_string = substr($query_string,strlen($prefix));
                $GLOBALS['rbase'] = $prefix;
            }
            // Set default within the respective blog
            if (strlen($query_string) &lt;= 1 &amp;&amp; isset($dirFlag[2])) $query_string = $dirFlag[2];
            break;
        }
    }
    //if (!isset($dir)) { echo &quot;/srv/http/index.php: Not found in blog-array.\n&quot;; return; }

    // Composer is very slow, see https://eklausmeier.goip.de/blog/2023/10-29-simplified-saaze-monitored-with-phpspy
    require '/home/klm/php/sndsaaze/vendor/eklausme/saaze/CollectionArray.php';
    require '/home/klm/php/sndsaaze/vendor/eklausme/saaze/Collection.php';
    require '/home/klm/php/sndsaaze/vendor/eklausme/saaze/Config.php';
    require '/home/klm/php/sndsaaze/vendor/eklausme/saaze/Entry.php';
    require '/home/klm/php/sndsaaze/vendor/eklausme/saaze/MarkdownContentParser.php';
    require '/home/klm/php/sndsaaze/vendor/eklausme/saaze/Saaze.php';
    require '/home/klm/php/sndsaaze/vendor/eklausme/saaze/TemplateManager.php';

    (new \Saaze\Saaze($dir))-&gt;run($query_string);
</code></pre>
<p><strong>4. NGINX configuration for dynamic mode.</strong>
For above <code>index.php</code> to work, NGINX needs to have some <code>rewrite</code> rules.</p>
<pre><code class="language-ini">rewrite &quot;^/(jpilot|koehntopp|lemire|mobility|myrawest|nukeklaus|panorama|paternoster|vonhoff|wendt)/(assets|img|jscss|pagefind|pkg)/(.*)&quot;  &quot;/rewrite/saaze-$1/public/$2/$3&quot; last;
rewrite &quot;^/(saaze-example)/(.*)(\.ico|\.css)&quot;  &quot;/rewrite/$1/public/$2$3&quot; last;
rewrite &quot;^/(jpilot|paternoster)/(.*)(\.ico|\.css)&quot;     &quot;/rewrite/saaze-$1/public/$2$3&quot; last;
rewrite &quot;^/(|aux|blog|music|gallery|404\.html|feed\.xml|sitemap\.html|sitemap\.xml|jpilot|koehntopp|lemire|mobility|myrawest|nukeklaus|panorama|paternoster|saaze-example|vonhoff|wendt)($|/.*)&quot;  &quot;/index.php?$1$2&quot; last;
rewrite &quot;^/lemire(/*)$&quot; &quot;/lemire/blog/&quot; last;
rewrite &quot;^/(aux|blog|music|gallery|jpilot|koehntopp|lemire|mobility|myrawest|nukeklaus|panorama|paternoster|saaze-example|vonhoff|wendt)/(.*[^/])$&quot;  &quot;$1/$2/index.html&quot; last;
</code></pre>
<p>Add to these <code>rewrite</code> rules below symbolic links under <code>/srv/http</code>:</p>
<pre><code class="language-bash">$ /srv/http: ls -l rewrite
total 8
lrwxrwxrwx  1 klm  klm    27 Jun 18  2024 saaze-example -&gt; /home/klm/php/saaze-example/
lrwxrwxrwx  1 klm  klm    26 Aug 14  2023 saaze-jpilot -&gt; /home/klm/php/saaze-jpilot/
lrwxrwxrwx  1 klm  klm    29 Aug 14  2023 saaze-koehntopp -&gt; /home/klm/php/saaze-koehntopp/
lrwxrwxrwx  1 klm  klm    26 Dec 17  2023 saaze-lemire -&gt; /home/klm/php/saaze-lemire/
lrwxrwxrwx  1 klm  klm    28 Aug 14  2023 saaze-mobility -&gt; /home/klm/php/saaze-mobility/
lrwxrwxrwx  1 klm  klm    28 Nov 11  2024 saaze-myrawest -&gt; /home/klm/php/saaze-myrawest/
lrwxrwxrwx  1 klm  klm    29 Aug 14  2023 saaze-nukeklaus -&gt; /home/klm/php/saaze-nukeklaus/
lrwxrwxrwx  1 klm  klm    28 Aug 14  2023 saaze-panorama -&gt; /home/klm/php/saaze-panorama/
lrwxrwxrwx  1 klm  klm    31 Aug 14  2023 saaze-paternoster -&gt; /home/klm/php/saaze-paternoster/
lrwxrwxrwx  1 klm  klm    27 Aug 14  2023 saaze-vonhoff -&gt; /home/klm/php/saaze-vonhoff/
lrwxrwxrwx  1 klm  klm    25 Mar  7  2024 saaze-wendt -&gt; /home/klm/php/saaze-wendt/
lrwxrwxrwx  1 klm  klm    22 Aug 14  2023 sndsaaze -&gt; /home/klm/php/sndsaaze/
</code></pre>
<p><strong>5. Problem statement.</strong>
I received the following e-mail from Ahrefs:</p>
<p><img src="https://eklausmeier.goip.de/img/AhrefsTimedOut1.webp" alt="Photo"></p>
<p>The load time was larger than five seconds:</p>
<p><img src="https://eklausmeier.goip.de/img/AhrefsTimedOut2.webp" alt="Photo"></p>
<p>That's quite alarming.</p>
<p><a href="https://ahrefs.com">Ahrefs</a> is a valuable commercial offering to evaluate your web presence with regard to:</p>
<ol>
<li>backlinks</li>
<li>broken backlinks</li>
<li>site audits</li>
<li>outgoing links</li>
<li>performance</li>
<li>and many more</li>
</ol>
<p>They provide a free tier for hobbyists.
That's what I use and find very helpful.
Ahrefs is particularly remarkable as they <a href="https://eklausmeier.goip.de/blog/2023/04-22-website-checking-with-ahrefs">scan your website</a> <em>more frequently</em> than Google!</p>
<p><strong>6. OpCache trickery.</strong>
In return in <a href="https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.memory-consumption"><code>php.ini</code></a> I enlarged from 256M</p>
<pre><code class="language-ini">opcache.memory_consumption=512
</code></pre>
<p>I also activated in PHP-FPM's configuration file <code>php-fpm.d/www.conf</code> the slowlog option:</p>
<pre><code class="language-ini">slowlog = /var/log/nginx/$pool.log.slow
request_slowlog_timeout = 1
</code></pre>
<p>And, alas, this produced log entries like so:</p>
<pre><code class="language-log">[19-Jul-2025 13:52:45]  [pool www] pid 38567
script_filename = /srv/http/index.php
[0x00007fed1f813100] run() /srv/http/index.php:47

[19-Jul-2025 13:52:58]  [pool www] pid 38568
script_filename = /srv/http/index.php
[0x00007fed1f813100] run() /srv/http/index.php:47

[19-Jul-2025 21:09:18]  [pool www] pid 52660
script_filename = /srv/http/index.php
[0x00007fed1f813100] run() /srv/http/index.php:47
</code></pre>
<p>Similar messages in PHP-FPM log:</p>
<pre><code class="language-log">Jul 19 11:45:30 ryzen systemd[1]: Started The PHP FastCGI Process Manager.
Jul 19 13:52:45 ryzen php-fpm[38565]: [WARNING] [pool www] child 38567, script '/srv/http/index.php' (request: &quot;GET /index.php?blog/2025/07-14-stability-mountains-for-bdf6&quot;) executing too slow (1.067383 sec), logging
Jul 19 13:52:45 ryzen php-fpm[38565]: [NOTICE] child 38567 stopped for tracing
Jul 19 13:52:45 ryzen php-fpm[38565]: [NOTICE] about to trace 38567
Jul 19 13:52:45 ryzen php-fpm[38565]: [NOTICE] finished trace of 38567
Jul 19 13:52:58 ryzen php-fpm[38565]: [WARNING] [pool www] child 38568, script '/srv/http/index.php' (request: &quot;GET /index.php?blog/2025/07-14-stability-mountains-for-tendler7&quot;) executing too slow (1.160562 sec), logging
Jul 19 13:52:58 ryzen php-fpm[38565]: [NOTICE] child 38568 stopped for tracing
Jul 19 13:52:58 ryzen php-fpm[38565]: [NOTICE] about to trace 38568
Jul 19 13:52:58 ryzen php-fpm[38565]: [NOTICE] finished trace of 38568

Jul 19 21:09:18 ryzen php-fpm[38565]: [WARNING] [pool www] child 52660, script '/srv/http/index.php' (request: &quot;GET /index.php?feed.xml&quot;) executing too slow (1.209205 sec), logging
Jul 19 21:09:18 ryzen php-fpm[38565]: [NOTICE] child 52660 stopped for tracing
Jul 19 21:09:18 ryzen php-fpm[38565]: [NOTICE] about to trace 52660
Jul 19 21:09:18 ryzen php-fpm[38565]: [NOTICE] finished trace of 52660

Jul 20 04:17:53 ryzen php-fpm[38565]: [WARNING] [pool www] child 52660, script '/srv/http/index.php' (request: &quot;GET /index.php?wendt/sitemap.html&quot;) executing too slow (1.013112 sec), logging
Jul 20 04:17:53 ryzen php-fpm[38565]: [NOTICE] child 52660 stopped for tracing
Jul 20 04:17:53 ryzen php-fpm[38565]: [NOTICE] about to trace 52660
Jul 20 04:17:53 ryzen php-fpm[38565]: [NOTICE] finished trace of 52660
</code></pre>
<p>This was due to the following bots reading the blog:</p>
<pre><code class="language-log">147.135.128.94|19/Jul/2025:13:52:36 +0200|200|698|GET /robots.txt HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:37 +0200|200|106356|GET /blog/2025/07-14-stability-mountains-for-bdf3 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:40 +0200|200|137803|GET /blog/2025/07-14-stability-mountains-for-bdf4 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:41 +0200|200|162942|GET /blog/2025/07-14-stability-mountains-for-bdf5 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:45 +0200|200|189812|GET /blog/2025/07-14-stability-mountains-for-bdf6 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:47 +0200|200|94930|GET /blog/2025/07-14-stability-mountains-for-tendler3 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:49 +0200|200|133534|GET /blog/2025/07-14-stability-mountains-for-tendler4 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:51 +0200|200|163925|GET /blog/2025/07-14-stability-mountains-for-tendler5 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:54 +0200|200|186668|GET /blog/2025/07-14-stability-mountains-for-tendler6 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:52:58 +0200|200|214906|GET /blog/2025/07-14-stability-mountains-for-tendler7 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|
147.135.128.94|19/Jul/2025:13:53:00 +0200|200|109667|GET /blog/2025/07-14-stability-mountains-for-tischer3 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|klm.l5.ca:80|

17.241.75.159|13/Jul/2025:21:09:13 +0200|200|14206|GET /blog/2013/04-27-brian-koberlein-on-google-astronomy-blog HTTP/1.1|-|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15 (Applebot/0.1; +http://www.apple.com/go/applebot)|klm.us.to:80|
184.73.68.20|15/Jul/2025:21:09:10 +0200|200|22987|GET /blog/2013/09-12-dramatic-faster-sorting-in-linux-using-nsort HTTP/1.1|-|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36|149.172.93.57:443|on
54.157.84.74|15/Jul/2025:21:09:12 +0200|200|1331|GET /jpilot/blog/1999-05-23-this-site-goes-live HTTP/1.1|-|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36|klm.ddns.net:443|on
34.227.234.246|15/Jul/2025:21:09:14 +0200|200|17473|GET /blog/2023/06-27-performance-remarks-on-publicomag-website HTTP/1.1|-|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36|149.172.93.57:443|on
18.205.91.101|15/Jul/2025:21:09:17 +0200|200|14573|GET /music/2024/01-12-music-from-ricardo-castro HTTP/1.1|-|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36|eklausmeier.mywire.org:443|on
3.208.146.193|15/Jul/2025:21:09:18 +0200|200|1419|GET /jpilot/blog/2021-04-02-fixed-bugs-and-crashes HTTP/1.1|-|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36|149.172.93.57:443|on
23.23.180.225|16/Jul/2025:21:09:18 +0200|200|14201|GET /blog/2017 HTTP/1.1|-|Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36|klm.ix.tc:80|
194.233.171.60|17/Jul/2025:21:09:16 +0200|200|2184498|GET /feed.xml HTTP/2.0|-|Mozilla/5.0 (compatible; Miniflux/v2.2.10; +https://miniflux.app)|eklausmeier.goip.de:443|on
65.21.149.1|18/Jul/2025:21:09:16 +0200|200|2109321|GET /feed.xml HTTP/2.0|-|Mozilla/5.0 (compatible; Miniflux/v2.2.10; +https://miniflux.app)|eklausmeier.goip.de:443|on
80.71.159.94|19/Jul/2025:21:09:16 +0200|200|2109370|GET /feed.xml HTTP/2.0|-|Mozilla/5.0 (compatible; Miniflux/v2.2.10; +https://miniflux.app)|eklausmeier.goip.de:443|on

135.181.79.106|20/Jul/2025:04:17:51 +0200|200|214928|GET /blog/2025/07-14-stability-mountains-for-tendler7 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|eklausmeier.mywire.org:443|on
135.181.79.106|20/Jul/2025:04:17:54 +0200|200|109676|GET /blog/2025/07-14-stability-mountains-for-tischer3 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|eklausmeier.mywire.org:443|on
135.181.79.106|20/Jul/2025:04:17:56 +0200|200|131549|GET /blog/2025/07-14-stability-mountains-for-tischer4 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|eklausmeier.mywire.org:443|on
135.181.79.106|20/Jul/2025:04:17:59 +0200|200|160833|GET /blog/2025/07-14-stability-mountains-for-tischer5 HTTP/1.1|-|Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)|eklausmeier.mywire.org:443|on
</code></pre>
<p>This shows that quick successions of reads can trigger a <em>slow</em> response.</p>
<p>So, despite the OpCache trickery we have <em>sporadic</em> slow response times.</p>
<p><strong>7. Back to static files.</strong>
Above results lead to the conclusion that the dynamic mode of <a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a> is not performant enough, when there are many large files involved.
The 17 new blog posts about <a href="https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf1">stability mountains</a> triggered this.
But any other significant increase in data would have done the same.
So, my various static blogs are converted to static.</p>
<h2>B. Deployment scripts for static sites<a id=deploymentScripts></a></h2>
<p>Below are the very simple shell scripts to deploy each of the above static sites.
The <code>time</code> command included in those scripts is only for measuring how long it takes.</p>
<p><strong>1. My blog.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Automate the steps to deploy content from Saaze to my eklausmeier.goip.de blog

cd /home/klm/php/sndsaaze
time php saaze -mortb /tmp/build

cd /tmp/build
time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=en
ln -s blog/index.html

cd /srv/http
rm -rf oldblogs/klmblog/
mkdir -p oldblogs/klmblog
mv 404.html aux blog feed.xml gallery index.html music pagefind sitemap.html sitemap.xml oldblogs/klmblog/

cd /tmp/build
mv 404.html aux blog feed.xml gallery index.html music pagefind sitemap.html sitemap.xml /srv/http/
</code></pre>
<p><strong>2. J-Pilot.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy J-Pilot website

cd /home/klm/php/saaze-jpilot
time RBASE=&quot;/jpilot&quot; php saaze -morb /tmp/build

cd /tmp/build
cp -pr /home/klm/php/saaze-jpilot/public/jpilot.css .
cp -pr /home/klm/php/saaze-jpilot/public/img .
cp -pr /home/klm/php/saaze-jpilot/public/pkg .
rm index.html
ln -s blog/index.html

cd /srv/http/
rm -rf oldblogs/jpilot/
mv jpilot/ oldblogs/
mv /tmp/build/ jpilot
</code></pre>
<p><strong>3. Koehntopp.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Kristian Koehntopp's blog

cd /home/klm/php/saaze-koehntopp/
time RBASE=&quot;/koehntopp&quot; php saaze -mrtb /tmp/build
cd /tmp/build
time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=en

cd /srv/http/
rm -rf oldblogs/koehntopp/
mv koehntopp/ oldblogs/
mv /tmp/build koehntopp
</code></pre>
<p><strong>4. Lemire.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Daniel Lemire's blog, assuming static build is in /tmp/build

cd /home/klm/php/saaze-lemire/
time RBASE=&quot;/lemire&quot; php saaze -rmb /tmp/build

cd /tmp/build
time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=en
cp -pr /home/klm/php/saaze-lemire/public/jscss .
ln -s blog/index.html

cd /srv/http
rm -rf oldblogs/lemire/
mkdir -p oldblogs/lemire
mv lemire oldblogs/

mv /tmp/build/ /srv/http/lemire
</code></pre>
<p><strong>5. Mobility.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Mobility website

cd /home/klm/php/saaze-mobility
time RBASE=&quot;/mobility&quot; php saaze -morb /tmp/build

cd /tmp/build
cp -pr /home/klm/php/saaze-mobility/public/img .

cd /srv/http/
rm -rf oldblogs/mobility/
mv mobility/ oldblogs/
mv /tmp/build/ mobility
</code></pre>
<p><strong>6. Myra West.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Myra West's blog

cd /home/klm/php/saaze-myrawest
time RBASE=&quot;/myrawest&quot; php saaze -morb /tmp/build

cd /tmp/build
time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=en
cp -pr /home/klm/php/saaze-myrawest/public/img .

cd /srv/http/
rm -rf oldblogs/myrawest/
mv myrawest/ oldblogs/
mv /tmp/build/ myrawest
</code></pre>
<p><strong>7. Nukeklaus.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy nukeklaus's blog: build directory is in /tmp/build (for speed reasons)

cd /home/klm/php/saaze-nukeklaus/
time RBASE=&quot;/nukeklaus&quot; php saaze -mortb /tmp/build

cd /tmp/build
time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=de
cp -pr /home/klm/php/saaze-nukeklaus/public/img/ .

cd /srv/http
rm -rf oldblogs/nukeklaus/
mv nukeklaus/ oldblogs/
mv /tmp/build/ /srv/http/nukeklaus
</code></pre>
<p><strong>8. Panorama.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Panorama's restaurant blog

cd /home/klm/php/saaze-panorama
time RBASE=&quot;/panorama&quot; php saaze -morb /tmp/build

cd /tmp/build
cp -pr /home/klm/php/saaze-panorama/public/img .

cd /srv/http
rm -rf oldblogs/panorama
mv panorama/ oldblogs/
mv /tmp/build/ panorama
</code></pre>
<p><strong>9. Paternoster.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Paternoster's blog

cd /home/klm/php/saaze-paternoster
time RBASE=&quot;/paternoster&quot; php saaze -morb /tmp/build

cd /tmp/build
cp -pr /home/klm/php/saaze-paternoster/public/img .
cp -pr /home/klm/php/saaze-paternoster/public/paternoster.css .
ln -s posts/index.html

cd /srv/http
rm -rf oldblogs/paternoster
mv paternoster/ oldblogs/
mv /tmp/build/ /srv/http/paternoster
</code></pre>
<p><strong>10. Saaze-Example.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Saaze-Example

cd /home/klm/php/saaze-example
time RBASE=&quot;/saaze-example&quot; php saaze -b /tmp/build

cd /tmp/build
rm index.html
ln -s blog/index.html
cp -p /home/klm/php/saaze-example/public/blogklm.css .

cd /srv/http/
rm -rf oldblogs/saaze-example/
mv saaze-example/ oldblogs/

mv /tmp/build/ saaze-example
</code></pre>
<p><strong>11. Vonhoff.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Dr. Rolf Vonhoff's blog: build directory is in /tmp/build (for speed reasons)

cd /home/klm/php/saaze-vonhoff/
time RBASE=&quot;/vonhoff&quot; php saaze -b /tmp/build
cp -pr public/img/ /tmp/build/

cd /srv/http
rm -rf oldblogs/vonhoff/
mv vonhoff/ oldblogs/
mv /tmp/build/ vonhoff
</code></pre>
<p><strong>12. Wendt.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Deploy Wendt

cd /home/klm/php/saaze-wendt
time RBASE=&quot;/wendt&quot; php saaze -morb /tmp/build

cd /tmp/build
time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=de

cd /srv/http/
rm -rf oldblogs/wendt/
mv wendt/ oldblogs/
mv /tmp/build/ wendt
</code></pre>
<p><strong>13. All munged together.</strong></p>
<pre><code class="language-bash">#!/bin/bash
# Do all the blog deployments

time blogdeploy
time blogjpilotDeploy
time blogkoehntoppDeploy
time bloglemireDeploy
time blogmobilityDeploy
time blogmyrawestDeploy
time blognukeklausDeploy
time blogpanoramaDeploy
time blogpaternosterDeploy
time blogsaazeexampleDeploy
time blogvonhoffDeploy
time blogwendtDeploy
</code></pre>
<h2>C. Running deployment scripts<a id=runningDeployments></a></h2>
<p>Running the munged together scripts.</p>
<p>Runtime environment is Arch Linux as depicted in below table.</p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>CPU</td>
<td>AMD Ryzen 7 5700G</td>
</tr>
<tr>
<td>RAM</td>
<td>64 GB</td>
</tr>
<tr>
<td>OS</td>
<td>6.15.7-arch1-1 #1 SMP PREEMPT_DYNAMIC</td>
</tr>
<tr>
<td>PHP with JIT</td>
<td>PHP 8.4.10 (cli), Zend Engine v4.4.10 with Zend OPcache v8.4.10</td>
</tr>
<tr>
<td><em>Simplified Saaze</em></td>
<td>Version 2.5, 02-Dec-2024</td>
</tr>
</tbody>
</table>
<p><strong>1. My blog.</strong></p>
<pre><code class="language-bash">$ time blogAllDeploy | tee /tmp/blogAllDeploy.log
Building static site in /tmp/build...
        execute(): filePath=./content/error.yml, nSIentries=0, totalPages=0, entries_per_page=20
        execute(): filePath=./content/music.yml, nSIentries=89, totalPages=5, entries_per_page=20
        execute(): filePath=./content/gallery.yml, nSIentries=16, totalPages=1, entries_per_page=20
        execute(): filePath=./content/blog.yml, nSIentries=528, totalPages=27, entries_per_page=20
        execute(): filePath=./content/aux.yml, nSIentries=8, totalPages=1, entries_per_page=20
Finished creating 5 collections, 4 with index, and 676 entries (0.69 secs / 191.97MB)
#collections=5, parseEntry=0.0310/676-5, md2html=0.1314, toHtml=0.1347/676, renderEntry=0.1374/676, renderCollection=0.0040/38, content=676/0

real    0m0.718s
user    0m0.532s
sys     0m0.184s

Running Pagefind v1.3.0
Running from: &quot;/tmp/build&quot;
Source:       &quot;&quot;
Output:       &quot;pagefind&quot;

[Walking source directory]
Found 715 files matching **/*.{html}

[Parsing files]
Did not find a data-pagefind-body element on the site.
↳ Indexing all &lt;body&gt; elements on the site.

[Reading languages]
Discovered 1 language: en

[Building search indexes]
Total:
  Indexed 1 language
  Indexed 715 pages
  Indexed 51664 words
  Indexed 0 filters
  Indexed 0 sorts

Finished in 3.101 seconds

real    0m3.146s
user    0m2.731s
sys     0m0.552s

real    0m4.119s
user    0m3.274s
sys     0m0.977s
</code></pre>
<p><strong>2. J-Pilot.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-jpilot/content/pages.yml, nSIentries=0, totalPages=0, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-jpilot/content/doc.yml, nSIentries=10, totalPages=1, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-jpilot/content/blog.yml, nSIentries=18, totalPages=1, entries_per_page=20
Finished creating 3 collections, 3 with index, and 29 entries (0.01 secs / 1.2MB)
#collections=3, parseEntry=0.0005/29-3, md2html=0.0008, toHtml=0.0006/29, renderEntry=0.0008/29, renderCollection=0.0002/5, content=29/0

real    0m0.033s
user    0m0.018s
sys     0m0.014s

real    0m0.051s
user    0m0.022s
sys     0m0.029s
</code></pre>
<p><strong>3. Koehntopp.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-koehntopp/content/aux.yml, nSIentries=3, totalPages=1, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-koehntopp/content/posts.yml, nSIentries=964, totalPages=49, entries_per_page=20
Finished creating 2 collections, 2 with index, and 967 entries (0.16 secs / 23.82MB)
#collections=2, parseEntry=0.0187/967-2, md2html=0.0267, toHtml=0.0142/967, renderEntry=0.0248/967, renderCollection=0.0098/52, content=967/0

real    0m0.186s
user    0m0.133s
sys     0m0.052s

Running Pagefind v1.3.0
Running from: &quot;/tmp/build&quot;
Source:       &quot;&quot;
Output:       &quot;pagefind&quot;

[Walking source directory]
Found 1019 files matching **/*.{html}

[Parsing files]
Did not find a data-pagefind-body element on the site.
↳ Indexing all &lt;body&gt; elements on the site.

[Reading languages]
Discovered 1 language: en

[Building search indexes]
Total:
  Indexed 1 language
  Indexed 1019 pages
  Indexed 58550 words
  Indexed 0 filters
  Indexed 0 sorts

Finished in 4.394 seconds

real    0m4.459s
user    0m3.863s
sys     0m0.738s

real    0m4.880s
user    0m4.010s
sys     0m1.006s
</code></pre>
<p><strong>4. Lemire.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-lemire/content/blog.yml, nSIentries=2771, totalPages=139, entries_per_page=20
Finished creating 1 collections, 1 with index, and 4483 entries (0.52 secs / 95.75MB)
#collections=1, parseEntry=0.0673/4483-1, md2html=0.0904, toHtml=0.0576/4483, renderEntry=0.0563/4483, renderCollection=0.0128/140, content=4483/0

real    0m0.552s
user    0m0.358s
sys     0m0.190s

Running Pagefind v1.3.0
Running from: &quot;/tmp/build&quot;
Source:       &quot;&quot;
Output:       &quot;pagefind&quot;

[Walking source directory]
Found 4623 files matching **/*.{html}

[Parsing files]
Did not find a data-pagefind-body element on the site.
↳ Indexing all &lt;body&gt; elements on the site.

[Reading languages]
Discovered 1 language: en

[Building search indexes]
Total:
  Indexed 1 language
  Indexed 4623 pages
  Indexed 60265 words
  Indexed 0 filters
  Indexed 0 sorts

Finished in 11.176 seconds

real    0m11.351s
user    0m10.005s
sys     0m1.936s
        real 12.96s
        user 10.42s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p><strong>5. Mobility.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-mobility/content/auxil.yml, nSIentries=21, totalPages=2, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-mobility/content/blog.yml, nSIentries=9, totalPages=1, entries_per_page=20
Finished creating 2 collections, 1 with index, and 31 entries (0.01 secs / 1.41MB)
#collections=2, parseEntry=0.0006/31-2, md2html=0.0008, toHtml=0.0014/31, renderEntry=0.0010/31, renderCollection=0.0002/2, content=31/0

real    0m0.033s
user    0m0.018s
sys     0m0.015s

real    0m0.068s
user    0m0.019s
sys     0m0.049s
</code></pre>
<p><strong>6. Myra West.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=./content/blog.yml, nSIentries=40, totalPages=2, entries_per_page=20
Finished creating 1 collections, 1 with index, and 41 entries (0.01 secs / 3.07MB)
#collections=1, parseEntry=0.0009/41-1, md2html=0.0016, toHtml=0.0017/41, renderEntry=0.0018/41, renderCollection=0.0002/3, content=41/0

real    0m0.036s
user    0m0.023s
sys     0m0.013s

Running Pagefind v1.3.0
Running from: &quot;/tmp/build&quot;
Source:       &quot;&quot;
Output:       &quot;pagefind&quot;

[Walking source directory]
Found 45 files matching **/*.{html}

[Parsing files]
1 page found without an &lt;html&gt; element.
Pages without an outer &lt;html&gt; element will not be processed by default.
If adding this element is not possible, use the root selector config to target a different root element.
Did not find a data-pagefind-body element on the site.
↳ Indexing all &lt;body&gt; elements on the site.
  * &quot;/sitemap.html&quot; has no &lt;html&gt; element

[Reading languages]
Discovered 1 language: en

[Building search indexes]
Total:
  Indexed 1 language
  Indexed 44 pages
  Indexed 3158 words
  Indexed 0 filters
  Indexed 0 sorts

Finished in 0.236 seconds

real    0m0.244s
user    0m0.212s
sys     0m0.039s

real    0m0.305s
user    0m0.238s
sys     0m0.074s
</code></pre>
<p><strong>7. Nukeklaus.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-nukeklaus/content/aux.yml, nSIentries=4, totalPages=1, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-nukeklaus/content/blog.yml, nSIentries=164, totalPages=9, entries_per_page=20
Finished creating 2 collections, 1 with index, and 178 entries (0.05 secs / 11.2MB)
#collections=2, parseEntry=0.0048/178-2, md2html=0.0055, toHtml=0.0063/178, renderEntry=0.0110/178, renderCollection=0.0013/10, content=178/0

real    0m0.079s
user    0m0.055s
sys     0m0.023s

Running Pagefind v1.3.0
Running from: &quot;/tmp/build&quot;
Source:       &quot;&quot;
Output:       &quot;pagefind&quot;

[Walking source directory]
Found 189 files matching **/*.{html}

[Parsing files]
Did not find a data-pagefind-body element on the site.
↳ Indexing all &lt;body&gt; elements on the site.

[Reading languages]
Discovered 1 language: de

[Building search indexes]
Total:
  Indexed 1 language
  Indexed 189 pages
  Indexed 23135 words
  Indexed 0 filters
  Indexed 0 sorts

Finished in 1.556 seconds

real    0m1.578s
user    0m1.370s
sys     0m0.225s

real    0m1.715s
user    0m1.430s
sys     0m0.301s
</code></pre>
<p><strong>8. Panorama.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-panorama/content/auxil.yml, nSIentries=2, totalPages=1, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-panorama/content/blog.yml, nSIentries=8, totalPages=1, entries_per_page=20
Finished creating 2 collections, 2 with index, and 10 entries (0.01 secs / 745kB)
#collections=2, parseEntry=0.0002/10-2, md2html=0.0002, toHtml=0.0013/10, renderEntry=0.0006/10, renderCollection=0.0001/4, content=10/0

real    0m0.030s
user    0m0.017s
sys     0m0.013s

real    0m0.068s
user    0m0.021s
sys     0m0.046s
</code></pre>
<p><strong>9. Paternoster.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-paternoster/content/aux.yml, nSIentries=3, totalPages=1, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-paternoster/content/posts.yml, nSIentries=210, totalPages=11, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-paternoster/content/notes.yml, nSIentries=470, totalPages=10, entries_per_page=50
        execute(): filePath=/home/klm/php/saaze-paternoster/content/links.yml, nSIentries=249, totalPages=5, entries_per_page=50
Finished creating 4 collections, 4 with index, and 932 entries (0.08 secs / 6.56MB)
#collections=4, parseEntry=0.0149/936-4, md2html=0.0074, toHtml=0.0041/932, renderEntry=0.0113/932, renderCollection=0.0044/31, content=932/0

real    0m0.105s
user    0m0.065s
sys     0m0.040s

real    0m0.241s
user    0m0.073s
sys     0m0.166s
</code></pre>
<p><strong>10. Saaze-Example.</strong></p>
<pre><code class="language-bash">Building static site in /srv/http/saaze-example...
        execute(): filePath=/home/klm/php/saaze-example/content/auxil.yml, nSIentries=0, totalPages=0, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-example/content/music.yml, nSIentries=11, totalPages=1, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-example/content/blog.yml, nSIentries=35, totalPages=2, entries_per_page=20
Finished creating 3 collections, 3 with index, and 47 entries (0.01 secs / 882kB)
#collections=3, parseEntry=0.0006/47-3, md2html=0.0003, toHtml=0.0006/47, renderEntry=0.0007/47, renderCollection=0.0005/6, content=47/0

real    0m0.035s
user    0m0.021s
sys     0m0.013s
        real 0.04s
        user 0.02s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p><strong>11. Vonhoff.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=/home/klm/php/saaze-vonhoff/content/blog.yml, nSIentries=4, totalPages=1, entries_per_page=20
        execute(): filePath=/home/klm/php/saaze-vonhoff/content/auxil.yml, nSIentries=1, totalPages=1, entries_per_page=20
Finished creating 2 collections, 2 with index, and 5 entries (0.01 secs / 745kB)
#collections=2, parseEntry=0.0001/5-2, md2html=0.0004, toHtml=0.0030/5, renderEntry=0.0004/5, renderCollection=0.0002/4, content=5/0

real    0m0.030s
user    0m0.018s
sys     0m0.012s

real    0m0.043s
user    0m0.019s
sys     0m0.024s
</code></pre>
<p><strong>12. Wendt.</strong></p>
<pre><code class="language-bash">Building static site in /tmp/build...
        execute(): filePath=./content/alexander.yml, nSIentries=770, totalPages=39, entries_per_page=20
        execute(): filePath=./content/alte-weise.yml, nSIentries=131, totalPages=7, entries_per_page=20
        execute(): filePath=./content/archi-bechlenberg.yml, nSIentries=5, totalPages=1, entries_per_page=20
        execute(): filePath=./content/bernd-zeller.yml, nSIentries=332, totalPages=17, entries_per_page=20
        execute(): filePath=./content/cora-stephan.yml, nSIentries=1, totalPages=1, entries_per_page=20
        execute(): filePath=./content/david-berger.yml, nSIentries=1, totalPages=1, entries_per_page=20
        execute(): filePath=./content/fake-news.yml, nSIentries=28, totalPages=2, entries_per_page=20
        execute(): filePath=./content/film.yml, nSIentries=1, totalPages=1, entries_per_page=20
        execute(): filePath=./content/hansjoerg-mueller.yml, nSIentries=2, totalPages=1, entries_per_page=20
        execute(): filePath=./content/hausbesuch.yml, nSIentries=2, totalPages=1, entries_per_page=20
        execute(): filePath=./content/joerg-friedrich.yml, nSIentries=2, totalPages=1, entries_per_page=20
        execute(): filePath=./content/mag.yml, nSIentries=1235, totalPages=62, entries_per_page=20
        execute(): filePath=./content/matthias-matussek.yml, nSIentries=1, totalPages=1, entries_per_page=20
        execute(): filePath=./content/medien-kritik.yml, nSIentries=123, totalPages=7, entries_per_page=20
        execute(): filePath=./content/politik-gesellschaft.yml, nSIentries=486, totalPages=25, entries_per_page=20
        execute(): filePath=./content/redaktion.yml, nSIentries=112, totalPages=6, entries_per_page=20
        execute(): filePath=./content/samuel-horn.yml, nSIentries=3, totalPages=1, entries_per_page=20
        execute(): filePath=./content/spreu-weizen.yml, nSIentries=596, totalPages=30, entries_per_page=20
        execute(): filePath=./content/wolfram-ackner.yml, nSIentries=6, totalPages=1, entries_per_page=20
Finished creating 19 collections, 19 with index, and 1248 entries (5.16 secs / 1.82GB)
#collections=19, parseEntry=0.7782/23712-19, md2html=1.2083, toHtml=1.2890/23712, renderEntry=0.1177/1248, renderCollection=0.0420/224, content=23712/0

real    0m5.193s
user    0m4.426s
sys     0m0.734s

Running Pagefind v1.3.0
Running from: &quot;/tmp/build&quot;
Source:       &quot;&quot;
Output:       &quot;pagefind&quot;

[Walking source directory]
Found 1473 files matching **/*.{html}

[Parsing files]
Did not find a data-pagefind-body element on the site.
↳ Indexing all &lt;body&gt; elements on the site.

[Reading languages]
Discovered 1 language: de

[Building search indexes]
Total:
  Indexed 1 language
  Indexed 1473 pages
  Indexed 133262 words
  Indexed 0 filters
  Indexed 0 sorts

Finished in 18.948 seconds

real    0m19.155s
user    0m17.431s
sys     0m1.890s

real    0m24.780s
user    0m21.878s
sys     0m3.027s
</code></pre>
<p>The total runtime.</p>
<pre><code class="language-bash">        real 49.78s
        user 41.82s
        sys 0
        swapped 0
        total space 0

        real 49.77s
        user 0.00s
        sys 0
        swapped 0
        total space 0
</code></pre>
<h2>D. NGINX configuration<a id=nginx></a></h2>
<p>All the <code>rewrite</code> rules, which were in place to generate HTML on the fly, can now be removed.
I added one <code>rewrite</code> rule to <em>not</em> to redirect to the URL with a slash appended.
This spares one roundtrip due to a HTTP 301 return code.</p>
<pre><code class="language-ini"># NGINX configuration for chieftec
# Elmar Klausmeier, 22-Aug-2023
# Elmar Klausmeier, 21-Jul-2025

#user http;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

load_module /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so;
load_module /usr/lib/nginx/modules/ngx_http_brotli_static_module.so;


events {
    worker_connections  1024;
}


http {
    root   /srv/http;
    index  index.html;
    client_max_body_size 15900M;

    http2 on;
    gzip  on;
    brotli on;
    brotli_comp_level 10;
    brotli_types application/xml image/svg+xml text/css text/csv text/javascript text/markdown text/plain text/vcard text/xml application/rss+xml;
    gzip_types application/xml image/svg+xml text/css text/csv text/javascript text/markdown text/plain text/vcard text/xml application/rss+xml;

    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '
    #                  '$status $body_bytes_sent &quot;$http_referer&quot; '
    #                  '&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;';
    log_format hiawatha_format '$remote_addr|$time_local|$status|$bytes_sent|$request|$http_referer|$http_user_agent|$host:$server_port|$https';

    access_log  /var/log/nginx/access.log hiawatha_format;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    http3 on;
    http3_hq on;
    types_hash_max_size 4096;

    server {
        listen       80;
        server_name  localhost;

    #  Umkehrung von https://timmehosting.de/blog/nginx-trailing-slash-zu-urls-hinzufuegen-rewrite-rule
    rewrite &quot;^/(aux|blog|music|gallery|jpilot|koehntopp|lemire|mobility|myrawest|nukeklaus|panorama|paternoster|saaze-example|vonhoff|wendt)(/*|[^\.]*[^/])$&quot;  &quot;/$1/$2/index.html&quot; last;

    #charset koi8-r;
        #error_page  404              /rewrite/sndsaaze/public/index.php?/404.html;

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        location ~ \.(jpg|jpeg|png|webp|mp4|pdf)$ {
            add_header Cache-Control &quot;public, max-age=7776000&quot;;
    }

        location ~ \.php$ {
            try_files $fastcgi_script_name =404;

            # default fastcgi_params
            include fastcgi_params;

            # fastcgi settings
            fastcgi_pass			unix:/run/php-fpm/php-fpm.sock;
        #fastcgi_index			index.php;
            fastcgi_buffers			8 16k;
            fastcgi_buffer_size		32k;

            # fastcgi params
            fastcgi_param DOCUMENT_ROOT	$realpath_root;
            fastcgi_param SCRIPT_FILENAME	$realpath_root$fastcgi_script_name;
        }

        location ~ ^/ttyd(.*)$ {
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection &quot;upgrade&quot;;
        proxy_pass http://eklausmeier.goip.de:7681/$1;
        #proxy_pass http://84.119.108.23:7681/$1;
        }
        location ~ ^/nucttyd(.*)$ {
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection &quot;upgrade&quot;;
            proxy_pass http://192.168.0.24:7681/$1;
        }
    }


    # HTTPS server
    #
    server {
        listen       443 quic;
    listen       443 ssl;
        server_name  localhost;

        ssl_certificate      /etc/letsencrypt/live/eklausmeier.goip.de-0002/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/eklausmeier.goip.de-0002/privkey.pem;

    # From https://blog.qualys.com/product-tech/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers &quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&quot;;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

        #location / {
            # used to advertise the availability of HTTP/3
            add_header Alt-Svc 'h3=&quot;:443&quot;; ma=86400';
        #}

    # Umkehrung von  https://timmehosting.de/blog/nginx-trailing-slash-zu-urls-hinzufuegen-rewrite-rule
    rewrite &quot;^/(aux|blog|music|gallery|jpilot|koehntopp|lemire|mobility|myrawest|nukeklaus|panorama|paternoster|saaze-example|vonhoff|wendt)(/*|[^\.]*[^/])$&quot;  &quot;/$1/$2/index.html&quot; last;

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location ~ \.(jpg|jpeg|png|webp|mp4|pdf)$ {
            add_header Cache-Control &quot;public, max-age=7776000&quot;;
    }

        location ~ \.php$ {
            try_files $fastcgi_script_name =404;

            # default fastcgi_params
            include fastcgi_params;

            # fastcgi settings
            fastcgi_pass			unix:/run/php-fpm/php-fpm.sock;
        #fastcgi_index			index.php;
            fastcgi_buffers			8 16k;
            fastcgi_buffer_size		32k;

            # fastcgi params
            fastcgi_param DOCUMENT_ROOT	$realpath_root;
            fastcgi_param SCRIPT_FILENAME	$realpath_root$fastcgi_script_name;
        }

        location ~ ^/ttyd(.*)$ {
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection &quot;upgrade&quot;;
            proxy_pass http://eklausmeier.goip.de:7681/$1;
        }
        location ~ ^/nucttyd(.*)$ {
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection &quot;upgrade&quot;;
            proxy_pass http://192.168.0.24:7681/$1;
        }
    }

}
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-19-asrock-deskmeet-x300-with-amd-ryzen-5700g</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-19-asrock-deskmeet-x300-with-amd-ryzen-5700g</guid>
		<title>ASRock DeskMini X300 with AMD Ryzen 5700G</title>
		<category>CPU</category>
		<category>hardware</category>
		<pubDate>Sat, 19 Jul 2025 18:00:00 +0200</pubDate>
		<description><![CDATA[
<p>I ordered the following parts from Mindfactory and Amazon.</p>
<table>
<thead>
<tr>
<th>Part</th>
<th>#</th>
<th align="right">EUR</th>
</tr>
</thead>
<tbody>
<tr>
<td>ASRock <a href="https://www.asrock.com/nettop/AMD/DeskMini%20X300%20Series/index.us.asp">DeskMini X300</a> AM4</td>
<td>1</td>
<td align="right">140.98</td>
</tr>
<tr>
<td>AMD Ryzen 7 5700G 8x 3.80GHz So.AM4 BOX</td>
<td>1</td>
<td align="right">134.99</td>
</tr>
<tr>
<td>1TB Crucial E100 M.2 2280 PCIe 4.0 x4 3D-NAND QLC (CT1000E100SSD8)</td>
<td>1</td>
<td align="right">54.89</td>
</tr>
<tr>
<td>Crucial RAM CT2K32G4SFD832A 64GB (2x32GB) DDR4 3200MHz CL22 (2933MHz oder 2666MHz) Laptop Arbeitsspeicher Kit</td>
<td>1</td>
<td align="right">125.11</td>
</tr>
<tr>
<td><strong>Sum</strong></td>
<td></td>
<td align="right"><strong>455.97</strong></td>
</tr>
</tbody>
</table>
<p>Compare this with the &quot;previous&quot; model <a href="https://eklausmeier.goip.de/blog/2020/07-07-asrock-deskmini-a300m-with-amd-ryzen-3400g">ASRock A300M with Ryzen 3400G</a>, which I bought five years ago and costed twice as much.
More so, the 3400G only has half the cores of the 5700G.</p>
<p><a href="https://www.pcgameshardware.de/CPU-CPU-154106/News/AMD-dominiert-die-CPU-Verkaufzahlen-1476777/">PCGH</a> wrote:</p>
<blockquote>
<p>CPU-Monopol: AMD übernimmt Mindfactory nahezu vollständig</p>
<p>Die aktuellen CPU-Verkaufszahlen des deutschen Online-Händlers <a href="https://www.pcgameshardware.de/mindFactory-Firma-220667/">Mindfactory</a>, welche wie gewohnt von <a href="https://x.com/TechEpiphanyYT/status/1942650430703522085">TechEpiphany</a> über X - vormals Twitter - veröffentlicht wurden, verdeutlichen die Dominanz von AMDs Ryzen-Prozessoren. Im DIY-Geschäft beläuft sich der CPU-Marktanteil von AMD bei Mindfactory auf mehr als 95 Prozent, während rund 97 Prozent der CPU-Umsätze auf Zen-Prozessoren entfallen. Damit erreicht AMDs &quot;CPU-Monopol&quot; auf Mindfactory jetzt einen neuen Rekordstand.</p>
</blockquote>
<h2>1. Hardware setup</h2>
<p>On 12-Jul-2025 the packets arrived.</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-01.webp" alt="Photo"></p>
<p>The AMD Ryzen 5700G CPU.</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-02.webp" alt=""></p>
<p>Mounted the CPU on the board.</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-03.webp" alt=""></p>
<p>Inserted SODIMM modules.</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-04.webp" alt="Photo"></p>
<p>Inserted harddrive and CPU fan.</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-05.webp" alt="Photo"></p>
<p>Booting into BIOS.</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-06.webp" alt="Photo"></p>
<p>Comparison to typical smartphone standing next to the entire ASRock.</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-08.webp" alt="Photo"></p>
<p>With a wattmeter I checked the power consumption: it is 9-10 Watts in idle mode.
That's exactly what was expected.</p>
<h2>2. Installation of Arch Linux</h2>
<p><strong>1. Installation.</strong> I followed my own blog posts:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2022/05-02-copy-archlinux-to-ssd">Copy Arch Linux to SSD</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2014/06-01-setting-up-luksdm-crypt-for-external-usb-drive">Setting-Up LUKS/dm-crypt for External USB-Drive</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2020/08-29-configure-boot-settings-in-uefi">Configure boot settings in UEFI</a></li>
</ol>
<p>The hard drive is partitioned using <a href="https://man.archlinux.org/man/gparted.8"><code>gparted</code></a> into 750MB FAT32 (vfat) and the rest for LUKS, which hosts ext4.</p>
<p>UEFI was setup using <a href="https://man.archlinux.org/man/efibootmgr.8"><code>efibootmgr</code></a>.
UEFI shell is <a href="https://archlinux.org/packages/extra/any/edk2-shell/"><code>/usr/share/edk2-shell/x64/Shell_Full.efi</code></a>.</p>
<p>Forgetting to sym-link <code>sbin</code> results in:</p>
<p><img src="https://eklausmeier.goip.de/img/ASRockX300-07.webp" alt="Photo"></p>
<p><strong>1. Booting via ssh.</strong>
To boot the machine from remote use the following <code>HOOKS</code> line in <code>mkinitcpio.conf</code>:</p>
<pre><code class="language-ini">HOOKS=&quot;base udev block keymap keyboard autodetect consolefont modconf netconf dropbear encryptssh filesystems fsck&quot;
</code></pre>
<p>Modules <code>netconf</code> is in Arch Linux package <code>mkinitcpio-netconf</code>.
<code>encryptssh</code> is contained in package  <code>mkinitcpio-utils</code>.</p>
<p><strong>2. <code>xdm</code> annoyances.</strong>
File <code>initramfs-linux.img</code> needs <code>amdgpu</code> and <code>radeon</code> drivers included via <code>MODULES</code> in <code>mkinitcpio.conf</code>.</p>
<pre><code class="language-ini">MODULES=(amdgpu radeon)
</code></pre>
<p>After that run <code>mkinitcpio -p linux</code>.
Without that <code>xdm</code> would not start automatically via systemd.</p>
<p>I would normally set keyboard and deadkey handling directly in <code>/etc/X11/xorg.conf.d/00-keyboard.conf</code>:</p>
<pre><code class="language-ini">Section &quot;InputClass&quot;
        Identifier &quot;system-keyboard&quot;
        MatchIsKeyboard &quot;on&quot;
        Option &quot;XkbLayout&quot; &quot;de&quot;
        Option &quot;XkbVariant&quot; &quot;nodeadkeys&quot;
EndSection
</code></pre>
<p>In this case I used the <code>setxkbmap</code> command in <code>.xinitrc</code>:</p>
<pre><code class="language-bash">setxkbmap -layout de -variant nodeadkeys
</code></pre>
<p>In doing so, every user can individually set his language preferences.</p>
<p>Install <code>glxgears</code> via</p>
<pre><code class="language-bash">pacman -S mesa-utils
</code></pre>
<p><strong>3. Disable pipewire.</strong>
I noticed that pulseaudio and pipewire in combination to not work together.
So I disabled pipewire.</p>
<pre><code class="language-bash">systemctl --global mask pipewire
systemctl --global mask pipewire.socket
</code></pre>
<p>Unfortunately, pipewire cannot be easily uninstalled.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-donelson-hansen1-6</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-donelson-hansen1-6</guid>
		<title>Stability Mountains for Donelson &amp; Hansen 1-6</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:41:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/07-06-stability-regions-for-mihelcics-formulas">Stability Regions for Mihelčić's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/07-09-stability-regions-for-donelson-hansen-formulas">Stability Regions for Donelson and Hansen Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">rm /tmp/x9; for i in 1 2 3 4 5 6; do stabregion -D$i -o3 -r30 &gt;&gt; /tmp/x9; done
</code></pre>
<p>Honestly, all charts look weird.</p>
<p>Donelson &amp; Hansen 1:</p>
<div id="container_DonelsonHansen1" class="chartarea"></div>
<p>Donelson &amp; Hansen 2:</p>
<div id="container_DonelsonHansen2" class="chartarea"></div>
<p>Donelson &amp; Hansen 3:</p>
<div id="container_DonelsonHansen3" class="chartarea"></div>
<p>Donelson &amp; Hansen 4:</p>
<div id="container_DonelsonHansen4" class="chartarea"></div>
<p>Donelson &amp; Hansen 5:</p>
<div id="container_DonelsonHansen5" class="chartarea"></div>
<p>Donelson &amp; Hansen 6:</p>
<div id="container_DonelsonHansen6" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-mihelcics-formulas</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-mihelcics-formulas</guid>
		<title>Stability Mountains for Mihelčić's Formulas</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:34:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/07-06-stability-regions-for-mihelcics-formulas">Stability Regions for Mihelčić's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/07-09-stability-regions-for-donelson-hansen-formulas">Stability Regions for Donelson and Hansen Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -m4 -o3 -r50
stabregion -m5 -o3 -r30
stabregion -m6 -o3 -r26
stabregion -m7 -o3 -r30
</code></pre>
<p>Mihelcic4:</p>
<div id="container_Mihelcic4" class="chartarea"></div>
<p>Mihelcic5:</p>
<div id="container_Mihelcic5" class="chartarea"></div>
<p>Mihelcic6:</p>
<div id="container_Mihelcic6" class="chartarea"></div>
<p>Mihelcic7:</p>
<div id="container_Mihelcic7" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer8</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer8</guid>
		<title>Stability Mountains for Tischer8</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:28:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -s8 -o3 -r600
</code></pre>
<p>Tischer8:</p>
<div id="container_Tischer8" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer7</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer7</guid>
		<title>Stability Mountains for Tischer7</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:27:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -s7 -o3 -r600
</code></pre>
<p>Tischer7:</p>
<div id="container_Tischer7" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer6</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer6</guid>
		<title>Stability Mountains for Tischer6</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:26:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -s6 -o3 -r600
</code></pre>
<p>Tischer6:</p>
<div id="container_Tischer6" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer5</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer5</guid>
		<title>Stability Mountains for Tischer5</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:25:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -s5 -o3 -r600
</code></pre>
<p>Tischer5:</p>
<div id="container_Tischer5" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer4</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer4</guid>
		<title>Stability Mountains for Tischer4</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:24:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -s4 -o3 -r600
</code></pre>
<p>Tischer4:</p>
<div id="container_Tischer4" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer3</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tischer3</guid>
		<title>Stability Mountains for Tischer3</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:23:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -s3 -o3 -r600
</code></pre>
<p>Tischer3:</p>
<div id="container_Tischer3" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler7</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler7</guid>
		<title>Stability Mountains for Tendler7</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:17:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -t7 -o3 -r600
</code></pre>
<p>Tendler7:</p>
<div id="container_Tendler7" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler6</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler6</guid>
		<title>Stability Mountains for Tendler6</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:16:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -t6 -o3 -r600
</code></pre>
<p>Tendler6:</p>
<div id="container_Tendler6" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler5</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler5</guid>
		<title>Stability Mountains for Tendler5</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:15:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -t5 -o3 -r600
</code></pre>
<p>Tendler5:</p>
<div id="container_Tendler5" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler4</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler4</guid>
		<title>Stability Mountains for Tendler4</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:14:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -t4 -o3 -r600
</code></pre>
<p>Tendler4:</p>
<div id="container_Tendler4" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler3</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-tendler3</guid>
		<title>Stability Mountains for Tendler3</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:13:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -t3 -o3 -r600
</code></pre>
<p>Tendler3:</p>
<div id="container_Tendler3" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf6</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf6</guid>
		<title>Stability Mountains for BDF6</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:06:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -b6 -o3 -r600
</code></pre>
<p>BDF6:</p>
<div id="container_BDF6" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf5</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf5</guid>
		<title>Stability Mountains for BDF5</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:05:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -b5 -o3 -r600
</code></pre>
<p>BDF5:</p>
<div id="container_BDF5" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf4</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf4</guid>
		<title>Stability Mountains for BDF4</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:04:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -b4 -o3 -r600
</code></pre>
<p>BDF4:</p>
<div id="container_BDF4" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf3</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf3</guid>
		<title>Stability Mountains for BDF3</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:03:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -b3 -o3 -r600
</code></pre>
<p>BDF3:</p>
<div id="container_BDF3" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf2</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf2</guid>
		<title>Stability Mountains for BDF2</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:02:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -b2 -o3 -r600
</code></pre>
<p>BDF2:</p>
<div id="container_BDF2" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf1</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-14-stability-mountains-for-bdf1</guid>
		<title>Stability Mountains for BDF1</title>
		<category>mathematics</category>
		<pubDate>Mon, 14 Jul 2025 18:01:00 +0200</pubDate>
		<description><![CDATA[
<p>Beware, this three-dimensional graphic needs some time to load. You can rotate the graphic around any axis.</p>
<p>This is in continuation of:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Stability Regions for Tischer's Formulas</a></li>
</ol>
<p>Below is the output of:</p>
<pre><code class="language-bash">stabregion -b1 -o3 -r600
</code></pre>
<p>BDF1:</p>
<div id="container_BDF1" class="chartarea"></div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-09-stability-regions-for-donelson-hansen-formulas</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-09-stability-regions-for-donelson-hansen-formulas</guid>
		<title>Stability Regions for Donelson and Hansen Formulas</title>
		<category>mathematics</category>
		<pubDate>Wed, 09 Jul 2025 22:15:00 +0200</pubDate>
		<description><![CDATA[
<p>In the seminal paper <a href="https://doi.org/10.1137/0708018">Cyclic Composite Multistep Predictor-Corrector Methods</a> the two authors Donelson and Hansen derive cyclic multistep methods of high order and break the <a href="https://en.wikipedia.org/wiki/Linear_multistep_method#First_Dahlquist_barrier">first Dahlquist barrier</a>.</p>
<p>Their formulas have the following properties.</p>
<table>
<thead>
<tr>
<th>Method</th>
<th>stages ℓ</th>
<th>steps <em>k</em></th>
<th>order <em>p</em></th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>3</td>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
<td>3</td>
<td>6</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>3</td>
<td>6</td>
</tr>
<tr>
<td>4</td>
<td>2</td>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>4</td>
<td>4</td>
<td>7</td>
</tr>
<tr>
<td>6</td>
<td>4</td>
<td>4</td>
<td>8</td>
</tr>
</tbody>
</table>
<pre><code class="language-C">typedef struct {
    const char *name;
    const int p;	// order (for information only)
    const int k;	// number of start steps, 2*(k+l) = number of rows of a[]
    const int l;	// cycle length, i.e., column count of a[]
    double *a;	// transpose of A_i and B_i matrices in a single matrix
} formula_t;

formula_t F[] = {
    . . .
    {
        &quot;DonelsonHansen1&quot;, 5, 3, 3,	// name, p, k, l
        (double[]){
        0, 0, 0,
        -57, 1083, 0,
        24, -456, 0,
        33, -1347, -57,
        0, 720, 24,
        0, 0, 33,
        // --------
        -1, 0, 0,
        24, -350, 0,
        57, -1347, -1,
        10, 456, 24,
        0, 251, 57,
        0, 0, 10 }
    },
    {
        &quot;DonelsonHansen2&quot;, 6, 3, 3,	// name, p, k, l
        (double[]){
        -11, 0, 0,
        -27, 188, 0,
        27, -36, 25,
        11, -252, -63,
        0, 100, -9,
        0, 0, 47,
        // --------
        3, 0, 0,
        27, -60, 0,
        27, -252, -9,
        3, 36, -9,
        0, 36, 63,
        0, 0, 15 }
    },
    {
        &quot;DonelsonHansen3&quot;, 6, 3, 3,	// name, p, k, l
        (double[]){
        0, 0, 0,
        -57, 136, 0,
        24, -117, -283,
        33, -144, -306,
        0, 125, 531,
        0, 0, 58,
        // --------
        -1, 0, 0,
        24, -45, 0,
        57, -144, 84,
        10, 117, 531,
        0, 42, 306,
        0, 0, 9 }
    },
    {
        &quot;DonelsonHansen4&quot;, 5, 3, 2,	// name, p, k, l
        (double[]){
        0, 0,
        -57, 31,
        24, -12,
        33, -39,
        0, 20,
        // --------
        -1, 0,
        24, -10,
        57, -39,
        10, 12,
        0, 7 }
    },
    {
        &quot;DonelsonHansen5&quot;, 7, 4, 4,	// name, p, k, l
        (double[]){
            0,      0,      0,      0,
        -1360,  13409,      0,      0,
        -1350,  30384,   3653,      0,
         2160, -55026, -22752,   4550,
          550,   2224, -45792,  14160,
            0,   9009,  49888, -14850,
            0,      0,  15003,  -5360,
            0,      0,      0,   1500,
        // ---------------------------
           -9,      0,      0,      0,
          456,  -3585,      0,      0,
         2376, -32904,  -1182,      0,
         1656, -19008,   1440,  -1191,
          141,  16008,  49032, -12456,
            0,   2529,  42144, -13176,
            0,      0,   3906,    744,
            0,      0,      0,    459 }
    },
    {
        &quot;DonelsonHansen6&quot;, 8, 4, 4,	// name, p, k, l
        (double[]){
            0,      0,         0,         0,
        -1360,   4603,         0,         0,
        -1350,   1008,  -3455657,         0,
         2160, -28242, -28102272,     59160,
          550,  15728,  -5942052,    175440,
            0,   6903,  31623488,   -201690,
            0,      0,   5876493,    -55920,
            0,      0,         0,     23010,
        // ---------------------------------
           -9,      0,         0,         0,
          456,  -1293,         0,         0,
         2376,  -8136,    789744,         0,
         1656,   9936,  15276816,    -15543,
          141,  16968,  40314888,   -159048,
            0,   1845,  20558640,   -156168,
            0,      0,   1449972,     20232,
            0,      0,         0,      6867 }
    }
}
</code></pre>
<p><strong>1. Stability regions.</strong>
None of the formulas is <em>A</em>(α)-stable or <em>A</em>-stable.
In particular, the graph for <em>p=2</em> looks weird.</p>
<div id="container_DonelsonHansen1" class="chartarea"></div>
<div id="container_DonelsonHansen2" class="chartarea"></div>
<div id="container_DonelsonHansen3" class="chartarea"></div>
<div id="container_DonelsonHansen4" class="chartarea"></div>
<div id="container_DonelsonHansen5" class="chartarea"></div>
<div id="container_DonelsonHansen6" class="chartarea"></div>
<p><strong>2. Error constants per stage.</strong>
The C program <a href="https://github.com/eklausme/c/blob/master/stabregion.c"><code>stabregion</code></a> performs a check on the order of each stage.
Below are the results of these checks for the Donelson &amp; Hansen methods.</p>
<pre><code class="language-text">DonelsonHansen1, p=5, k=3, l=3
           0.0000       0.0000       0.0000
         -57.0000    1083.0000       0.0000
          24.0000    -456.0000       0.0000
          33.0000   -1347.0000     -57.0000
           0.0000     720.0000      24.0000
           0.0000       0.0000      33.0000
          -1.0000       0.0000       0.0000
          24.0000    -350.0000       0.0000
          57.0000   -1347.0000      -1.0000
          10.0000     456.0000      24.0000
           0.0000     251.0000      57.0000
           0.0000       0.0000      10.0000
rho_0	           0.000000000           0.000000000           0.000000000
rho_1	           0.000000000           0.000000000           0.000000000
rho_2	           0.000000000           0.000000000           0.000000000
rho_3	           0.000000000           0.000000000           0.000000000
rho_4	           0.000000000           0.000000000           0.000000000
rho_5	           0.000000000           0.000000000           0.000000000
rho_6	        -132.000000000       -7212.000000000        -132.000000000	&lt;-----
DonelsonHansen2, p=6, k=3, l=3
         -11.0000       0.0000       0.0000
         -27.0000     188.0000       0.0000
          27.0000     -36.0000      25.0000
          11.0000    -252.0000     -63.0000
           0.0000     100.0000      -9.0000
           0.0000       0.0000      47.0000
           3.0000       0.0000       0.0000
          27.0000     -60.0000       0.0000
          27.0000    -252.0000      -9.0000
           3.0000      36.0000      -9.0000
           0.0000      36.0000      63.0000
           0.0000       0.0000      15.0000
rho_0	           0.000000000           0.000000000           0.000000000
rho_1	           0.000000000           0.000000000           0.000000000
rho_2	           0.000000000           0.000000000           0.000000000
rho_3	           0.000000000           0.000000000           0.000000000
rho_4	           0.000000000           0.000000000           0.000000000
rho_5	           0.000000000           0.000000000           0.000000000
rho_6	           0.000000000       -1152.000000000        -288.000000000	&lt;-----
rho_7	        -108.000000000      -19728.000000000       -7164.000000000	&lt;-----
DonelsonHansen3, p=6, k=3, l=3
           0.0000       0.0000       0.0000
         -57.0000     136.0000       0.0000
          24.0000    -117.0000    -283.0000
          33.0000    -144.0000    -306.0000
           0.0000     125.0000     531.0000
           0.0000       0.0000      58.0000
          -1.0000       0.0000       0.0000
          24.0000     -45.0000       0.0000
          57.0000    -144.0000      84.0000
          10.0000     117.0000     531.0000
           0.0000      42.0000     306.0000
           0.0000       0.0000       9.0000
rho_0	           0.000000000           0.000000000           0.000000000
rho_1	           0.000000000           0.000000000           0.000000000
rho_2	           0.000000000           0.000000000           0.000000000
rho_3	           0.000000000           0.000000000           0.000000000
rho_4	           0.000000000           0.000000000           0.000000000
rho_5	           0.000000000           0.000000000           0.000000000
rho_6	        -132.000000000       -1044.000000000         900.000000000	&lt;-----
rho_7	       -1548.000000000      -18216.000000000       20376.000000000	&lt;-----
DonelsonHansen4, p=5, k=3, l=2
           0.0000       0.0000
         -57.0000      31.0000
          24.0000     -12.0000
          33.0000     -39.0000
           0.0000      20.0000
          -1.0000       0.0000
          24.0000     -10.0000
          57.0000     -39.0000
          10.0000      12.0000
           0.0000       7.0000
rho_0	           0.000000000           0.000000000
rho_1	           0.000000000           0.000000000
rho_2	           0.000000000           0.000000000
rho_3	           0.000000000           0.000000000
rho_4	           0.000000000           0.000000000
rho_5	           0.000000000           0.000000000
rho_6	        -132.000000000        -204.000000000	&lt;-----
DonelsonHansen5, p=7, k=4, l=4
           0.0000       0.0000       0.0000       0.0000
       -1360.0000   13409.0000       0.0000       0.0000
       -1350.0000   30384.0000    3653.0000       0.0000
        2160.0000  -55026.0000  -22752.0000    4550.0000
         550.0000    2224.0000  -45792.0000   14160.0000
           0.0000    9009.0000   49888.0000  -14850.0000
           0.0000       0.0000   15003.0000   -5360.0000
           0.0000       0.0000       0.0000    1500.0000
          -9.0000       0.0000       0.0000       0.0000
         456.0000   -3585.0000       0.0000       0.0000
        2376.0000  -32904.0000   -1182.0000       0.0000
        1656.0000  -19008.0000    1440.0000   -1191.0000
         141.0000   16008.0000   49032.0000  -12456.0000
           0.0000    2529.0000   42144.0000  -13176.0000
           0.0000       0.0000    3906.0000     744.0000
           0.0000       0.0000       0.0000     459.0000
rho_0	           0.000000000           0.000000000           0.000000000           0.000000000
rho_1	           0.000000000           0.000000000           0.000000000           0.000000000
rho_2	           0.000000000           0.000000000           0.000000000           0.000000000
rho_3	           0.000000000           0.000000000           0.000000000           0.000000000
rho_4	           0.000000000           0.000000000           0.000000000           0.000000000
rho_5	           0.000000000           0.000000000           0.000000000           0.000000000
rho_6	           0.000000000           0.000000000           0.000000000           0.000000000
rho_7	           0.000000000           0.000000000           0.000000000           0.000000000
rho_8	      -21600.000000000     -880416.000000000     -732672.000000000     -237600.000000000	&lt;-----
DonelsonHansen6, p=8, k=4, l=4
           0.0000       0.0000       0.0000       0.0000
       -1360.0000    4603.0000       0.0000       0.0000
       -1350.0000    1008.0000-3455657.0000       0.0000
        2160.0000  -28242.0000-28102272.0000   59160.0000
         550.0000   15728.0000-5942052.0000  175440.0000
           0.0000    6903.000031623488.0000 -201690.0000
           0.0000       0.0000 5876493.0000  -55920.0000
           0.0000       0.0000       0.0000   23010.0000
          -9.0000       0.0000       0.0000       0.0000
         456.0000   -1293.0000       0.0000       0.0000
        2376.0000   -8136.0000  789744.0000       0.0000
        1656.0000    9936.000015276816.0000  -15543.0000
         141.0000   16968.000040314888.0000 -159048.0000
           0.0000    1845.000020558640.0000 -156168.0000
           0.0000       0.0000 1449972.0000   20232.0000
           0.0000       0.0000       0.0000    6867.0000
rho_0	           0.000000000           0.000000000           0.000000000           0.000000000
rho_1	           0.000000000           0.000000000           0.000000000           0.000000000
rho_2	           0.000000000           0.000000000           0.000000000           0.000000000
rho_3	           0.000000000           0.000000000           0.000000000           0.000000000
rho_4	           0.000000000           0.000000000           0.000000000           0.000000000
rho_5	           0.000000000           0.000000000           0.000000000           0.000000000
rho_6	           0.000000000           0.000000000           0.000000000           0.000000000
rho_7	           0.000000000           0.000000000           0.000000000           0.000000000
rho_8	      -21600.000000000     -451872.000000000   -95072832.000000000    -3227040.000000000	&lt;-----
rho_9	     -426816.000000000   -12359520.000000000 -4067660160.000000000  -142718112.000000000	&lt;-----
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-06-stability-regions-for-mihelcics-formulas</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-06-stability-regions-for-mihelcics-formulas</guid>
		<title>Stability Regions for Mihelčić's Formulas</title>
		<category>mathematics</category>
		<pubDate>Sun, 06 Jul 2025 22:15:00 +0200</pubDate>
		<description><![CDATA[
<p>Matija Mihelcic and K. Wingerath searched for cyclic multistep methods, which</p>
<ol>
<li>were of high order <em>p</em></li>
<li>had a remarkable low number of stepnumbers <em>k</em></li>
<li>adhered to the condition of <a href="https://eklausmeier.goip.de/blog/2024/07-01-das-fehlerverhalten-zusammengesetzter-linearer-mehrschrittformeln">annulated dominance</a></li>
</ol>
<table>
<thead>
<tr>
<th>order <em>p</em></th>
<th>step <em>k</em></th>
<th>cycle length <em>l</em></th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td>5</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>7</td>
<td>5</td>
<td>5</td>
</tr>
</tbody>
</table>
<p>Bibliography: <a href="https://hrcak.srce.hr/file/413565">Matija (Miško) Mihelčić</a> (1935—2011).</p>
<p>Matija Mihelčić (Mihelcic): &quot;<a href="https://wwwzb.fz-juelich.de/verlagextern1/index.asp?Msg=list&amp;Jahr=1977&amp;PageNo=4">Fast <em>A</em>-stabile Donelson-Hansensche
zyklische Verfahren zur numerischen Integration von
'stiff'-Differentialgleichungssystemen</a>&quot;,
Angewandte Informatik, 1977, Vol 19, Heft 7, pp.299—305</p>
<p>Matija Mihelčić (Mihelcic): &quot;<a href="http://dx.doi.org/10.1007/BF02251950"><em>A</em>(α)-Stable Composite
Multistep Methods of Order 5</a>&quot;, Computing, Vol 20, 1978,
pp.267—272</p>
<p>Matija Mihelčić (Mihelcic) und K. Wingerath: &quot;<a href="http://dx.doi.org/10.1002/zamm.19810610609"><em>A</em>(α)-stable
Cyclic Composite Multistep Methods of Orders 6 and 7 for Numerical
Integration of Stiff Ordinary Differential Equations</a>&quot;, ZAMM, Band 61,
1981, pp.261—264</p>
<p>Below table summarizes the Widlund-α-wedge.
ODIOUS denotes the formulas from <a href="https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas">Peter Tischer</a>.
BP73 denotes the block-implicit methods from <a href="https://doi.org/10.1007/BF01951938">Bickart/Picel (1973)</a>.</p>
<table>
<thead>
<tr>
<th><em>p</em></th>
<th>TENDLER</th>
<th>BDF</th>
<th>ODIOUS</th>
<th>BP73</th>
<th>Mihelcic</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>90.00</td>
<td>90.00</td>
<td>90.00</td>
<td>90.0</td>
<td>*</td>
</tr>
<tr>
<td>2</td>
<td>90.00</td>
<td>90.00</td>
<td>90.00</td>
<td>90.0</td>
<td>*</td>
</tr>
<tr>
<td>3</td>
<td>89.43</td>
<td>86.03</td>
<td>90.00</td>
<td>88.9</td>
<td>*</td>
</tr>
<tr>
<td>4</td>
<td>80.88</td>
<td>73.35</td>
<td>90.00</td>
<td>87.7</td>
<td>40.6</td>
</tr>
<tr>
<td>5</td>
<td>77.48</td>
<td>51.84</td>
<td>86.64</td>
<td>85.5</td>
<td>53.0</td>
</tr>
<tr>
<td>6</td>
<td>63.25</td>
<td>17.84</td>
<td>76.32</td>
<td>82.7</td>
<td>52.7</td>
</tr>
<tr>
<td>7</td>
<td>33.53</td>
<td>*</td>
<td>57.66</td>
<td>79.5</td>
<td>44.8</td>
</tr>
<tr>
<td>8</td>
<td>*</td>
<td>*</td>
<td>22.15</td>
<td>76.0</td>
<td>*</td>
</tr>
<tr>
<td>9</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>72.5</td>
<td>*</td>
</tr>
<tr>
<td>10</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>69.6</td>
<td>*</td>
</tr>
</tbody>
</table>
<p>Here we compute these values by using the <a href="https://de.wikipedia.org/wiki/QZ-Algorithmus">QZ algorithm</a>.
The program <code>stabregion</code> has a command line flag <code>-m</code> for the Mihelcic formulas.
See <a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a>.</p>
<p>Also see <a href="https://eklausmeier.goip.de/blog/2013/08-11-design-notes-on-system-for-the-analysis-of-order-and-stepsize-changes-for-cyclic-composite-multistep-methods">Design Notes on System for the Analysis of Order- and Stepsize Changes for Cyclic Composite Multistep Methods</a>.</p>
<p><strong>1. The stability regions.</strong>
You can hover over the diagrams and see the values.</p>
<div id="container_Mihelcic4" class="chartarea"></div>
<div id="container_Mihelcic5" class="chartarea"></div>
<div id="container_Mihelcic6" class="chartarea"></div>
<div id="container_Mihelcic7" class="chartarea"></div>
<p><strong>2. stabregion program.</strong>
The formulas were entered like so.</p>
<pre class="line-numbers" data-line=4,19,36,57><code class="language-C">formula_t F[] = {
    . . .
    {
        &quot;Mihelcic4&quot;, 4, 3, 2,	// name, p, k, l
        (double[]){
        0.635, 0,
        4.08, -21299.0 / 63500,
        -5.715, 0.288,
        1, -60489.0 / 63500,
        0, 1,
        // --------
        0, 0,
        -653.0 / 200, 4203.0 / 25400,
        -1.63, 10527.0 / 127000,
        109.0 / 200, 94929.0 / 127000,
        0, 0.387 }
    },
    {
        &quot;Mihelcic5&quot;, 4, 3, 3,	// name, p, k, l
        (double[]){
        1.473, 0, 0,
        8.784, -1.369091006228046872693999232562, 0,
        -13.257, 2.544, 0.363,
        3, -2.174908993771953127306000767438, -2.160,
        0, 1, -1.203,
        0, 0, 3,
        // --------
        0, 0, 0,
        -7.347, 0.6040303354093489575646664108540, 0,
        -2.874, 0.2391213416373958302586656434162, -0.086,
        1.491, -0.1299696645906510424353335891459, 0.061,
        0, 0.481, 3.424,
        0, 0, 1.035 }
    },
    {
        &quot;Mihelcic6&quot;, 6, 4, 4,	// name, p, k, l
        (double[]){
        -0.9390362339466378776258361005001e-01,                                      0,                                      0,                                      0,
         0.2307741600964885363988695519087e+00,  0.1313792557365642037980205785897e+01,                                      0,                                      0,
         0.6362705032057367094700091337420e+00, -0.5218540536524916920611801547836e+01,  0.1394364937701534512038572085087e+00,                                      0,
        -0.1773141039907661458106295075601e+01,  0.7529417145415851180555472647834e+01, -0.1011623223444230192358671688990e+01,  0.1444191297888636803281533656209e+01,
         1,                                     -0.4624669166256576297923876885895e+01,  0.2533821653452779618403940682161e+01, -0.5492130726047090045832910083724e+01,
         0,                                      1,                                     -0.2661634923778702877249126201679e+01,  0.7660459268273149438357977410280e+01,
         0,                                      0,                                      1,                                     -0.4612519840114696195806600982764e+01,
         0,                                      0,                                      0,                                     1,
        // ------------------------------------------------------------------------------------------------------------------------------------------------------------
        -0.1853058013316520953710176130202e-02,                                      0,                                      0,                                      0,
         0.2451624610656680441199165441716e+00, -0.6428104226828121021947147465023e+00,                                      0,                                      0,
        -0.9774386604306546531165819680760e+00,  0.1217442120880404165141230674303e+01, -0.1234001277245579249775694769490e+00,                                      0,
         0.5535769499829904561071401752847e+00,  0.2924405192057778509076307429902e+00,  0.6120300247935214387198741562141e+00, -0.6918619210365557047027968203354e+00,
         0.3644443541805902548632380173403e+00, -0.1439373462587944161697640697511e+01, -0.8155238085505402874283164469721e+00,  0.1168008238715629118739713863798e+01,
         0,                                      0.5385875007216307945710071168686e+00, -0.1145523605965158361286500199803e-01,  0.4386358816535462908082534556190e+00,
         0,                                                                          0,  0.4094644596664487699907078389984e+00, -0.1467449527693897117841289393376e+01,
         0,                                                                          0,                                      0,  0.5438956185163976564593606928377e+00 }
    },
    {
        &quot;Mihelcic7&quot;, 7, 5, 5,	// name, p, k, l
        (double[]){
        -0.8153861905026022737434167615414e+00,                                      0,                                      0,                                      0,                                      0,
         0.4248895254033088383481894572139e+01, -0.2222441760654655361593826056284e-01,                                      0,                                      0,                                      0,
        -0.8854047951365927037900576200388e+01,  0.2654870121454308294304980610591e+00, -0.1032372883543017869086260071380e+00,                                      0,                                      0,
         0.9222953551982948533098094387068e+01, -0.1205209745869234199415093321373e+01,  0.8599203816315797312780689738287e+00, -0.4503824855570349203575243869964e+00,                                      0,
        -0.4802414664147507604935996997277e+01,  0.2592699276978907532702377400625e+01, -0.2778518172270275904802809146576e+01,  0.2649630382099203346956766040160e+01,  0.3219958911202349451261006329238e-02,
         1,                                     -0.2630752125658557609101843879749e+01,  0.4366928200996645755541775423194e+01, -0.6226227266320010195981550682429e+01,  0.1553984660531454990906076870577e-01,
         0,                                      1,                                     -0.3345093122003647795108409243309e+01,  0.7304031887973224464306216642665e+01, -0.4533196816782826816679836557976e+00,
         0,                                      0,                                      1,                                     -0.4277052518196382694923907613400e+01,  0.1691723344964800813261126750020e+01,
         0,                                      0,                                      0,                                      1,                                     -0.2257163468803035030953464869257e+01,
         0,                                      0,                                      0,                                      0,                                      1,
        // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         0.4225456071360219714271811811639e+00,                                      0,                                      0,                                      0,                                      0,
        -0.1384364739812333541090764922689e+01,  0.5044748643224129949603468040808e-01,                                      0,                                      0,                                      0,
         0.1146229672531143866569110401229e+01, -0.3550507135730755767219599244966e+00,  0.1003502539567659420767582244072e+00,                                      0,                                      0,
         0.6542124190961045586099091344395e+00,  0.9776848659097670987554894143623e+00, -0.6085349671365743688808169611528e+00,  0.2643442532041219470801194385611e+00,                                      0,
        -0.1322701573944066648938040619221e+01, -0.1124773012768567816507929091140e+01,  0.1286689084300843479379774302352e+01, -0.1081991130901289033649461985260e+01,  0.3096249379217892308281396122901e-01,
         0.4840799656531792806536461685364e+00,  0.1917873380953330674263870885019e+00, -0.9223533615854392440249726038524e+00,  0.1354222521191408219378646232897e+01, -0.2269170368480450921510442892867e+00,
         0,                                      0.3700608846337565198520459335580e+00, -0.2298469653682757407333327433246e+00, -0.9237493311630675669214627664954e-01,  0.7904598622265127771615281344478e+00,
         0,                                      0,                                      0.3969920978990539400467297585933e+00, -0.8904512454964667161729702886816e+00, -0.1202094468615905428211278510487e+01,
         0,                                      0,                                      0,                                      0.4473119757158579081724970288316e+00,  0.4061703817752004671762456256483e+00,
         0,                                      0,                                      0,                                      0,                                      0.3568354106010698554863523086895e+00 }
    },

    . . .
</code></pre>
<p>Above diagrams were produced like so:</p>
<pre class="line-numbers"><code class="language-bash">for i in 4 5 6 7; do stabregion -m$i -oj -r600 &gt;&gt; /tmp/formulas; done
</code></pre>
<p><code>stabregion</code> performs a check on the order of consistency.</p>
<pre class="line-numbers" data-line=1,25-30><code class="language-bash">Mihelcic7, p=7, k=5, l=5
              -0.8154       0.0000       0.0000       0.0000       0.0000
               4.2489      -0.0222       0.0000       0.0000       0.0000
              -8.8540       0.2655      -0.1032       0.0000       0.0000
               9.2230      -1.2052       0.8599      -0.4504       0.0000
              -4.8024       2.5927      -2.7785       2.6496       0.0032
               1.0000      -2.6308       4.3669      -6.2262       0.0155
               0.0000       1.0000      -3.3451       7.3040      -0.4533
               0.0000       0.0000       1.0000      -4.2771       1.6917
               0.0000       0.0000       0.0000       1.0000      -2.2572
               0.0000       0.0000       0.0000       0.0000       1.0000
               0.4225       0.0000       0.0000       0.0000       0.0000
              -1.3844       0.0504       0.0000       0.0000       0.0000
               1.1462      -0.3551       0.1004       0.0000       0.0000
               0.6542       0.9777      -0.6085       0.2643       0.0000
              -1.3227      -1.1248       1.2867      -1.0820       0.0310
               0.4841       0.1918      -0.9224       1.3542      -0.2269
               0.0000       0.3701      -0.2298      -0.0924       0.7905
               0.0000       0.0000       0.3970      -0.8905      -1.2021
               0.0000       0.0000       0.0000       0.4473       0.4062
               0.0000       0.0000       0.0000       0.0000       0.3568
rho_0             -0.000000000          -0.000000000          -0.000000000          -0.000000000           0.000000000  &lt;-----
rho_1             -0.000000000          -0.000000000           0.000000010          -0.000000000           0.000000000  &lt;-----
rho_2              0.000000000          -0.000000000           0.000000100          -0.000000000           0.000000000  &lt;-----
rho_3             -0.000000000          -0.000000000           0.000000750          -0.000000000           0.000000000  &lt;-----
rho_4              0.000000000          -0.000000001           0.000005000          -0.000000002           0.000000000  &lt;-----
rho_5             -0.000000000          -0.000000002           0.000031250          -0.000000017           0.000000000  &lt;-----
rho_6              0.000000000          -0.000000007           0.000187500          -0.000000118           0.000000000  &lt;-----
rho_7           -380.244711682        -131.147463978        -181.569375773        -292.075880578        -107.416443262  &lt;-----
rho_8          -7646.239139806       -3876.002411054       -6731.935756390      -12973.881560683       -5789.895353638  &lt;-----
</code></pre>
<p>It is only the <em>p=7</em> method which exhibits this behaviour.</p>
<p><strong>3. Conjecture.</strong>
Mihelcic and Wingerath make the following conjecture:</p>
<blockquote>
<p>However this seems to be too optimistic!
At any rate we were <strong>not able to obtain these orders of accuracy</strong>.
Moreover, it seems to us that the following conjecture could be true:</p>
<p>“The <em>A</em>(α)-stable <em>(k,M)</em>-methods- with <em>k = M</em> and <em>k &gt; 3</em> have the greatest possible order of accuracy <em>P = k + 2</em>.”</p>
<p>However, we were unsuccessful in proving it.</p>
</blockquote>
<p>Added 22-Jul-2025: This post was mentioned in <a href="https://blaze.email/The-Mathematician/archive/2025-07-08">The Mathematician: 8th July 2025</a>.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/07-04-vodafone-internet-outage-p3</link>
		<guid>https://eklausmeier.goip.de/blog/2025/07-04-vodafone-internet-outage-p3</guid>
		<title>Vodafone Internet Outage #3</title>
		<category>network</category>
		<pubDate>Fri, 04 Jul 2025 10:00:00 +0200</pubDate>
		<description><![CDATA[
<p>From Thursday, 03-Jul-2025, starting at 23:10 (CET), internet provided by Vodafone was unavailable.
The outage lasted until Friday, 04-Jul-2025, 06:40 (CET).
I personally didn't notice anything until 06:00, as I was asleep.</p>
<p>So for seven and a half hours I had no internet and the blog went dark.
Luckily, the IP address stayed the same, so I had no delay in DNS.</p>
<p><strong>1. Google fonts.</strong> I had coped for Google font such that the blog ressorts to the system supplied fonts, in case outside fonts are not reachable.
This problem occurs, when you read your own blog with <em>no</em> internet connection.</p>
<pre><code class="language-CSS">font-family:Merriweather,Georgia,&quot;Times New Roman&quot;,ui-serif,Cambria,Times,serif;
</code></pre>
<p><strong>2. JavaScript libraries.</strong> With no internet, you cannot use Datatables and Apache ECharts.
So my blog posts using these, cannot be read unaffected anymore.</p>
<p><strong>3. History of outages.</strong> I blogged about previous internet outages:</p>
<ol>
<li>In 2022 the Vodafone internet <a href="https://eklausmeier.goip.de/blog/2022/06-14-eklausmeier-go-ip-down">router was defective</a></li>
<li>No <a href="https://eklausmeier.goip.de/blog/2024/01-08-vodafone-internet-outage">internet on 08-Jan-2024</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2024/10-14-vodafone-internet-outage-p2">Vodafone Internet Outage #2</a></li>
</ol>
<p><strong>4. Uptime monitors.</strong> The uptime monitors all diagnosed the problem.</p>
<ol>
<li>Hetrix<ul>
<li>Down: Noticed at: 2025-07-03 23:10:42 (UTC+01:00)</li>
<li>Up: Noticed at: 2025-07-04 06:40:42 (UTC+01:00)</li>
</ul>
</li>
<li>BetterUptime<ul>
<li>Down: Started at: 04-Jul-2025 at 12:25am CEST</li>
<li>Up: Resolved at: 04-Jul-2025 at 8:55am CEST</li>
</ul>
</li>
<li>UptimeRobot<ul>
<li>Down: Incident started at 2025-07-04 00:57:02</li>
<li>Up: Resolved at 2025-07-04 06:34:05</li>
</ul>
</li>
<li>Ahrefs site audit crawl failed at Jul 4, 6:07 AM</li>
<li>ping-failure-test every 30 minutes</li>
</ol>
<pre><code>Fri Jul  4 12:09:21 AM CEST 2025
Fri Jul  4 12:39:21 AM CEST 2025
Fri Jul  4 01:09:21 AM CEST 2025
Fri Jul  4 01:39:16 AM CEST 2025
Fri Jul  4 02:09:21 AM CEST 2025
Fri Jul  4 02:39:21 AM CEST 2025
Fri Jul  4 03:09:21 AM CEST 2025
Fri Jul  4 03:39:15 AM CEST 2025
Fri Jul  4 04:09:21 AM CEST 2025
Fri Jul  4 04:39:21 AM CEST 2025
Fri Jul  4 05:09:21 AM CEST 2025
Fri Jul  4 05:39:16 AM CEST 2025
Fri Jul  4 06:09:31 AM CEST 2025
Fri Jul  4 06:39:31 AM CEST 2025
Fri Jul  4 07:09:32 AM CEST 2025
</code></pre>
<p><a href="https://eklausmeier.goip.de/blog/2024/10-14-vodafone-internet-outage-p2">Again</a>, the Hetrix monitor is the most detailed and accurate alerter.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas</link>
		<guid>https://eklausmeier.goip.de/blog/2025/06-19-stability-regions-for-tischers-formulas</guid>
		<title>Stability Regions for Tischer's Formulas</title>
		<category>mathematics</category>
		<pubDate>Thu, 19 Jun 2025 16:15:00 +0200</pubDate>
		<description><![CDATA[
<p>Ten years after Tendler's PhD in 1973, Peter Tischer finished his PhD thesis in 1983.
He developed an array of cyclic multistep formulas, which are all stiffly stable.
While Tendler found his formulas by guessing and experimenting, Tischer computed his formulas according the following objectives:</p>
<ol>
<li>The extraneous roots at the origin should be equal to zero (as with the Adams formulas).</li>
<li>The roots at infinity should be equal to zero (as with the BDF).</li>
<li>The formulas should exhibit better stiff-stability properties, order by order, than the BDF.</li>
<li>The leading coefficients of the multistep formulae should not vary within a cycle.</li>
<li>The leading truncation error coefficients of the multistep formulae used in the cycle should not be &quot;large&quot;.</li>
</ol>
<p>Tischer used the nonlinear equation solver <code>ZSYSTM</code> from <a href="https://www.imsl.com">IMSL</a> to solve his optimization problem.
<code>ZSYSTM</code> is:</p>
<blockquote>
<p>Determination of a root of a system of N simultaneous nonlinear equations in N unknowns, f(x)=0, in vector form</p>
</blockquote>
<p>Tischer restricted himself to only two stages.
The formulas were later implemented in a program called <a href="https://dl.acm.org/doi/10.1145/214408.214417">ODIOUS</a>.
Program ODIOUS was compared against LSODE in <a href="https://dl.acm.org/doi/10.1145/214408.214417">Tischer/Gupta (1985)</a>.</p>
<p>Tischer, Peter E.: “The Cyclic Use of Linear Multistep
Formulas for the Solution of Stiff Differential Equations”, Ph.D. Thesis,
Department of Computer Science, Monash University, Clayton, Victoria,
Australia, August 1983, <em>x</em>+180 S.</p>
<p>Tischer, Peter E. und Sacks-Davis, Ron: “<a href="https://doi.org/10.1137/0904051">A New Class of
Cyclic Multistep Formulae for Stiff Systems</a>”,
SIAM Journal on Scientific and Statistical Computing,
Vol 4, No 4, December 1983, pp.733—747.</p>
<p>Peter Tischer and G.K. Gupta:
“<a href="https://dl.acm.org/doi/10.1145/214408.214417">An evaluation of some new cyclic linear multistep formulas for stiff ODEs</a>”,
ACM Transactions on Mathematical Software, Vol. 11, No. 3, pages 263–27,
01-Sep-1985</p>
<p>Below table summarizes the Widlund-α-wedge.
BP73 denotes the block-implicit methods from <a href="https://doi.org/10.1007/BF01951938">Bickart/Picel (1973)</a>.</p>
<table>
<thead>
<tr>
<th><em>p</em></th>
<th>TENDLER</th>
<th>BDF</th>
<th>ODIOUS</th>
<th>BP73</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>90.00</td>
<td>90.00</td>
<td>90.00</td>
<td>90.0</td>
</tr>
<tr>
<td>2</td>
<td>90.00</td>
<td>90.00</td>
<td>90.00</td>
<td>90.0</td>
</tr>
<tr>
<td>3</td>
<td>89.43</td>
<td>86.03</td>
<td>90.00</td>
<td>88.9</td>
</tr>
<tr>
<td>4</td>
<td>80.88</td>
<td>73.35</td>
<td>90.00</td>
<td>87.7</td>
</tr>
<tr>
<td>5</td>
<td>77.48</td>
<td>51.84</td>
<td>86.64</td>
<td>85.5</td>
</tr>
<tr>
<td>6</td>
<td>63.25</td>
<td>17.84</td>
<td>76.32</td>
<td>82.7</td>
</tr>
<tr>
<td>7</td>
<td>33.53</td>
<td>*</td>
<td>57.66</td>
<td>79.5</td>
</tr>
<tr>
<td>8</td>
<td>*</td>
<td>*</td>
<td>22.15</td>
<td>76.0</td>
</tr>
<tr>
<td>9</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>72.5</td>
</tr>
<tr>
<td>10</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>69.6</td>
</tr>
</tbody>
</table>
<p>Here we compute these values by using the <a href="https://de.wikipedia.org/wiki/QZ-Algorithmus">QZ algorithm</a>.
The program <a href="https://github.com/eklausme/c/blob/master/stabregion.c"><code>stabregion</code></a> has a command line flag <code>-s</code> for the Tischer/Sacks-Davis formulas.
See <a href="https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas">Stability Regions for BDF and Tendler's Formulas</a>.</p>
<p>Also see <a href="https://eklausmeier.goip.de/blog/2013/08-11-design-notes-on-system-for-the-analysis-of-order-and-stepsize-changes-for-cyclic-composite-multistep-methods">Design Notes on System for the Analysis of Order- and Stepsize Changes for Cyclic Composite Multistep Methods</a>.</p>
<p><strong>1. The stability regions.</strong>
You can hover over the diagrams and see the values.</p>
<div id="container_Tischer3" class="chartarea"></div>
<div id="container_Tischer4" class="chartarea"></div>
<div id="container_Tischer5" class="chartarea"></div>
<div id="container_Tischer6" class="chartarea"></div>
<div id="container_Tischer7" class="chartarea"></div>
<div id="container_Tischer8" class="chartarea"></div>
<p><strong>2. stabregion program.</strong>
The formulas were entered like so in the <a href="https://github.com/eklausme/c/blob/master/stabregion.c">C program</a>.</p>
<pre class="line-numbers" data-line=7,20,35,52,71,92,115><code class="language-C">#define S	0.0	// Tischer parameter


formula_t F[] = {
    . . .
    {
        &quot;Tischer2&quot;, 2, 2, 2,	// name, p, k, l
        (double[]){
        0.2713503499466539, S * 0.2713503499466539,
        -1.271350349946654, S * -1.271350349946654,
        1, -1 + S,
        0, 1,
        // --------
        -0.06067517497332695, -0.04894502624599904 + S * (-0.06067517497332695),
        0.2143248250266731, 0.1728900524919981 + S * 0.2143248250266731,
        0.575, 0.3010549737540010 + S * 0.575,
        0, 0.575 }
    },
    {
        &quot;Tischer3&quot;, 3, 3, 2,	// name, p, k, l
        (double[]){
        -0.7156809323463300, S * (-0.7156809323463300),
        2.421409496232843, S * 2.421409496232843,
        -2.705728563886513, 0.4195749238763092 + S *(-2.705728563886513),
        1, -1.419574923876309 + S,
        0, 1,
        // --------
        -0.8629888978651531, 1.894838801355351+ S * (-0.8629888978651531),
        3.166634912306544, -6.952885160409694+ S * 3.166634912306544,
        -4.013693645981575, 9.231466454815180 + S * (-4.013693645981575),
        1.72, -5.312995019637147 + S * 1.72,
        0, 1.72 }
    },
    {
        &quot;Tischer4&quot;, 4, 4, 2,	// name, p, k, l
        (double[]){
        0.6103461100271559, S * 0.6103461100271559,
        -2.747685823192436, S * (-2.747685823192436),
        4.670005693524193, -0.2716147139534076 + S * 4.670005693524193,
        -3.532665980358913, 1.222768338553090 + S * (-3.532665980358913),
        1, -1.951153624599682 + S,
        0, 1,
        // --------
        0.9215366381763085, -2.649958179621567 + S * 0.9215366381763085,
        -4.136159579898865, 11.89388403771322 + S * (-4.136159579898865),
        7.141520549769378, -20.89280076921304 + S * 7.141520549769378,
        -5.652569985267611, 17.85562740240295 + S * (-5.652569985267611),
        1.72, -7.606291401927840 + S * 1.72,
        0, 1.72 }
    },
    {
        &quot;Tischer5&quot;, 5, 5, 2,	// name, p, k, l
        (double[]){
        -0.5473524843400159, S * (-0.5473524843400159),
        3.046981165805116, S * 3.046981165805116,
        -6.842547445085438, 0.2023989966807180 + S * (-6.842547445085438),
        7.741845845969376, -1.126707101014822 + S * 7.741845845969376,
        -4.398927082349038, 2.473981498420040 + S * (-4.398927082349038),
        1, -2.549673394085936 + S,
        0, 1,
        // --------
        -0.8285692507199495, 2.569479392269974 + S * (-0.8285692507199495),
        4.523688780360865, -14.02842923277731 + S * 4.523688780360865,
        -10.05367226203171, 31.45494082222007 + S * (-10.05367226203171),
        11.42213178164391, -36.93603791002108 + S * 11.42213178164391,
        -6.661863565106905, 23.96920129089773 + S * (-6.661863565106905),
        1.59, -8.446918649021926 + S * 1.59,
        0, 1.59 }
    },
    {
        &quot;Tischer6&quot;, 6, 6, 2,	// name, p, k, l
        (double[]){
        0.5065949241573893, S * 0.5065949241573893,
        -3.347588901033099, S * (-3.347588901033099),
        9.288264853658161, -0.1622565792899431 + S * 9.288264853658161,
        -13.85423667736953, 1.072194564235031 + S * (-13.85423667736953),
        11.70833137691048, -2.943247343299985+ S * 11.70833137691048,
        -5.301365576323402, 4.228025197181846 + S * (-5.301365576323402),
        1, -3.194715838826949 + S,
        0, 1,
        // --------
        0.6632827080818050, -1.966557927018182 + S * 0.6632827080818050,
        -4.318145132370032, 12.80281007873031 + S * (-4.318145132370032),
        11.87138330994840, -35.39751311755192 + S * 11.87138330994840,
        -17.69684560038281, 53.77255375657074 + S * (-17.69684560038281),
        15.14109874111104, -48.44295713982840 + S * 15.14109874111104,
        -7.068045626188859, 26.08926183188078 + S * (-7.068045626188859),
        1.4, -8.166685368910522 + S * 1.4,
        0, 1.4 }
    },
    {
        &quot;Tischer7&quot;, 7, 7, 2,	// name, p, k, l
        (double[]){
        -0.4730377247001383, S * (-0.4730377247001383),
        3.614094099926330, S * 3.614094099926330,
        -11.91361867598596, 0.1354428064536342 + S * (-11.91361867598596),
        21.97700424011387, -1.034807631868773 + S * 21.97700424011387,
        -24.50710155920918, 3.390826065383960 + S * (-24.50710155920918),
        16.51027888261980, -6.137117459840426 + S * 16.51027888261980,
        -6.207619262764723, 6.516126407008639 + S * (-6.207619262764723),
        1, -3.870470187137034 + S,
        0, 1,
        // --------
        -0.5593384312526297, 1.627202025358370+ S * (-0.5593384312526297),
        4.220709442337714, -12.27869670539260 + S * 4.220709442337714,
        -13.79410919873106, 40.28383410923075 + S * (-13.79410919873106),
        25.36722912840438, -74.96406486441271 + S * 25.36722912840438,
        -28.42514847816480, 86.48642725198855 + S * (-28.42514847816480),
        19.46252654187500, -63.47949128834042 + S * 19.46252654187500,
        -7.551726936498641, 29.33643618328776 + S * (-7.551726936498641),
        1.275, -8.238999899992440 + S * 1.275,
        0, 1.275 }
    },
    {
        &quot;Tischer8&quot;, 8, 8, 2,	// name, p, k, l
        (double[]){
        0.4453348513468461, S * 0.4453348513468461,
        -3.859180665772141, S * (-3.859180665772141),
        14.71642002045547, -0.1162654110659919 + S * 14.71642002045547,
        -32.27324489323404, 1.007532253824141 + S * (-32.27324489323404),
        44.53945382773937, -3.827901007455769 + S * 44.53945382773937,
        -39.61766259292482, 8.302866483037190 + S * (-39.61766259292482),
        22.16853315999479, -11.16589138289488 + S * 22.16853315999479,
        -7.119653707605472, 9.369883714651345 + S * (-7.119653707605472),
        1, -4.570224650096031 + S,
        0, 1,
        // --------
        0.4822252401396465, -1.384350259109908 + S * 0.4822252401396465,
        -4.136942315524837, 11.87614560523851 + S * (-4.136942315524837),
        15.65983206216709, -45.07917311093609 + S * 15.65983206216709,
        -34.21855612352479, 99.29376589604582 + S * (-34.21855612352479),
        47.30113434219221, -139.7912993045485 + S * 47.30113434219221,
        -42.45139314249457, 130.5230230565463 + S * (-42.45139314249457),
        24.20929805095255, -81.18525412979233 + S * 24.20929805095255,
        -8.028548065406828, 33.00040235056584 + S * (-8.028548065406828),
        1.18, -8.408425274884485 + S * 1.275,
        0, 1.18 }
    },
    . . .
</code></pre>
<p>Above diagrams were produced like so:</p>
<pre class="line-numbers"><code class="language-bash">for i in `seq 3 8`; do stabregion -s$i -oj -r600 &gt;&gt; /tmp/formulas; done
</code></pre>
<p><a href="https://github.com/eklausme/c/blob/master/stabregion.c"><code>stabregion</code></a> performs a check on the order.
Checking the correct order for the order eight method.</p>
<pre class="line-numbers" data-line=1,28-31><code class="language-bash">Tischer8, p=8, k=8, l=2
               0.4453       0.0000
              -3.8592      -0.0000
              14.7164      -0.1163
             -32.2732       1.0075
              44.5395      -3.8279
             -39.6177       8.3029
              22.1685     -11.1659
              -7.1197       9.3699
               1.0000      -4.5702
               0.0000       1.0000
               0.4822      -1.3844
              -4.1369      11.8761
              15.6598     -45.0792
             -34.2186      99.2938
              47.3011    -139.7913
             -42.4514     130.5230
              24.2093     -81.1853
              -8.0285      33.0004
               1.1800      -8.4084
               0.0000       1.1800
rho_0(1)           0.000000000           0.000000000
rho_1             -0.000000000           0.000000000
rho_2              0.000000000           0.000000000
rho_3              0.000000000           0.000000000
rho_4              0.000000000           0.000000000
rho_5              0.000000000           0.000000000
rho_6              0.000000000           0.000000002    &lt;
rho_7              0.000000002           0.000000004    &lt;
rho_8             -0.000000002           0.000000045    &lt;--
rho_9        -268194.357417837      200351.482900381    &lt;-----
</code></pre>
<p>One can notice that starting with consistency order of six the truncation error is no longer neglible.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas</link>
		<guid>https://eklausmeier.goip.de/blog/2025/06-01-stability-regions-for-bdf-and-tendlers-formulas</guid>
		<title>Stability Regions for BDF and Tendler's Formulas</title>
		<category>mathematics</category>
		<category>C / C++</category>
		<pubDate>Sun, 01 Jun 2025 16:15:00 +0200</pubDate>
		<description><![CDATA[
<p>In <a href="https://eklausmeier.goip.de/blog/2025/03-24-die-verwendeten-zyklischen-formeln-im-programm-tendler">Die verwendeten zyklischen Formeln im Programm TENDLER</a> we listed the Widlund wedge α and Widlund distance δ for the seven formulas of Joel Tendler, which he developed during his <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">PhD thesis</a> in 1973.</p>
<p>Here we compute these values by using the <a href="https://de.wikipedia.org/wiki/QZ-Algorithmus">QZ algorithm</a>.
We list the values for the BDF (backward differentiation formulas) and the cyclic linear multistep formulas by Tendler.</p>
<p>Also see <a href="https://eklausmeier.goip.de/blog/2013/08-11-design-notes-on-system-for-the-analysis-of-order-and-stepsize-changes-for-cyclic-composite-multistep-methods">Design Notes on System for the Analysis of Order- and Stepsize Changes for Cyclic Composite Multistep Methods</a>.</p>
<p><strong>1. The BDF.</strong></p>
<p>The two first BDF are <em>A</em>-stable.
Therefore the Widlund wedge α must be 90°, as can be seen by δ being zero.</p>
<p>You can hover over the diagrams and see the values.</p>
<div id="container_BDF1" class="chartarea"></div>
<div id="container_BDF2" class="chartarea"></div>
<div id="container_BDF3" class="chartarea"></div>
<div id="container_BDF4" class="chartarea"></div>
<div id="container_BDF5" class="chartarea"></div>
<div id="container_BDF6" class="chartarea"></div>
<p><strong>2. Tendler's cyclic formulas.</strong></p>
<div id="container_Tendler3" class="chartarea"></div>
<div id="container_Tendler4" class="chartarea"></div>
<div id="container_Tendler5" class="chartarea"></div>
<div id="container_Tendler6" class="chartarea"></div>
<div id="container_Tendler7" class="chartarea"></div>
<p><strong>3. Program <code>stabregion</code>.</strong>
The <a href="https://github.com/eklausme/c/blob/master/stabregion.c">C program</a> to generate these values uses two <a href="https://eklausmeier.goip.de/blog/2025/05-20-computing-generalized-eigenvalues-with-lapack">LAPACK routines</a>:</p>
<pre class="line-numbers"><code class="language-C">extern double dlamch_(char *cmach);
extern void zggev_(char *jobvl, char *jobvr, int *n, complex *a, int *lda, complex *b,
    int *ldb, complex *alpha, complex *beta, complex *vl, int *ldvl, complex *vr, int *ldvr,
    complex *work, int *lwork, double *rwork, int *info);
</code></pre>
<p>It stores the formulas like so:</p>
<pre class="line-numbers" data-line="11,17,24"><code class="language-C">typedef struct {
    const char *name;
    const int p;	// order (for information only)
    const int k;	// number of start steps, 2*(k+l) = number of rows of a[]
    const int l;	// cycle length, i.e., column count of a[]
    double *a;	// transpose of A_i and B_i matrices in a single matrix
} formula_t;

formula_t F[] = {
    {
        &quot;BDF1&quot;, 1, 1, 1,
        (double[]){
        -1, 1,
        0, 1 }
    },
    {
        &quot;BDF2&quot;, 2, 2, 1,
        (double[]){
        1, -4, 3,
        0, 0, 2 }
    },
    . . .
    {
        &quot;Tendler3&quot;, 3, 3, 3,	// name, p, k, l
        (double[]){
        -2, 0, 0,
        9, -2, 0,
        -18, 9, 0,
        11, -18, 9,
        0, 11, -12,
        0, 0, 3,
        // --------
        0, 0, 0,
        0, 0, 0,
        0, 0, 0,
        6, 0, -4,
        0, 6, -4,
        0, 0, 2 }
    },
    . . .
};
</code></pre>
<p>It &quot;transposes&quot; above formulas in to matrices <em>A1</em>, <em>B1</em>, <em>A0</em>, and <em>B0</em>:</p>
<pre class="line-numbers" data-line=25,27-28><code class="language-C">if (fm-&gt;k &gt;= fm-&gt;l) {
    rest = fm-&gt;k - fm-&gt;l,
    n = fm-&gt;k,
    nrest = fm-&gt;l,
    nsq = fm-&gt;k * fm-&gt;k;
} else {
    rest = fm-&gt;l - fm-&gt;k,
    n = fm-&gt;l,
    nrest = fm-&gt;k,
    nsq = fm-&gt;l * fm-&gt;l;
}
eps = 10 * dlamch_(cmach);

memset(a0,0,sizeof(*a0) * nsq);	// set a0[] to zero matrix
memset(b0,0,sizeof(*b0) * nsq);	// set b0[] to zero matrix
memset(a1,0,sizeof(*a1) * nsq);	// set a1[] to zero matrix
memset(b1,0,sizeof(*b1) * nsq);	// set b1[] to zero matrix

for (i=0; i&lt;rest; ++i) {
    a1[i+i*n] = 1;	// fill with parts of identity matrix
    if (i + nrest &lt; n) a0[i+(i+nrest)*n] = -1;	// cancel out
}
for (i=rest; i&lt;n; ++i) {
    for (j=0; j&lt;n; ++j)
        a0[i+j*n] = fm-&gt;a[(i-rest)+j*fm-&gt;l];
    for (j=rest; j&lt;n; ++j)
        a1[i+j*n] = fm-&gt;a[(i-rest)+((j-rest)+n)*fm-&gt;l],
        b1[i+j*n] = fm-&gt;a[(i-rest)+((j-rest+fm-&gt;l)+2*n)*fm-&gt;l];
}
</code></pre>
<p>Finally, it iterates through the unit circle and computes all eigenvalues.</p>
<pre class="line-numbers" data-line="1,7"><code class="language-C">for (i=0,phiinc=2*M_PI/nr,phi=0; i&lt;nr; phi+=phiinc,++i) {
    eiphi = cexp(I * phi);
    for (j=0; j&lt;nsq; ++j)	// A = A1 e^{i\phi} + A0, same for B
        a[j] = a1[j] * eiphi + a0[j],
        b[j] = b1[j] * eiphi + b0[j];
    info = 0;
    zggev_(jobvl, jobvr, &amp;n, a, &amp;lda, b, &amp;ldb, alpha, beta, vl, &amp;ldvl, vr, &amp;ldvr, work, &amp;lwork, rwork, &amp;info);
    for (j=0; j&lt;n; ++j) {
        if (beta[j] == 0) continue;
        lambda = alpha[j] / beta[j];
        rlambda = creal(lambda),
        ilambda = cimag(lambda),
        xmin = fmin(xmin,rlambda);	// Widlund distance delta
        if (rlambda &lt; 0) {
            if (fabs(rlambda) &gt; eps &amp;&amp; fabs(ilambda) &gt; eps)
                widlw = fmin(widlw,fabs(atan(ilambda/rlambda)));	// Widlund wedge in radians
        }
        prtf(i,lambda,xmin,180/M_PI*widlw);
}
</code></pre>
<p>The <em>function pointer</em>  <code>prtf()</code> points to a function that prints JavaScript suitable for using in <a href="https://echarts.apache.org/en/index.html">Apache ECharts</a>.</p>
<p><strong>3. Running program.</strong>
The program <a href="https://github.com/eklausme/c/blob/master/stabregion.c"><code>stabregion</code></a> is controlled by command line arguments.</p>
<ol>
<li>With the output flag <code>-oj</code> we generate JavaScript.</li>
<li>Command line flags <code>-b</code> are BDF, <code>-t</code> are for Tendler's formulas of the respective order.</li>
<li>Command line flag <code>-r</code> specifies how many subdivisions we do for the unit circle.</li>
</ol>
<pre class="line-numbers"><code class="language-bash">rm /tmp/formula
for i in `seq 1 6`; do stabregion -oj -b$i -r600 &gt;&gt; /tmp/formula; done
for i in `seq 3 7`; do stabregion -oj -t$i -r600 &gt;&gt; /tmp/formula; done
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/05-25-filtering-lines-with-specific-length</link>
		<guid>https://eklausmeier.goip.de/blog/2025/05-25-filtering-lines-with-specific-length</guid>
		<title>Filtering Lines with Specific Length</title>
		<category>programming</category>
		<category>C / C++</category>
		<pubDate>Sun, 25 May 2025 17:30:00 +0200</pubDate>
		<description><![CDATA[
<p>Task at hand: extract <em>all</em> lines of a file, which do not have a specific line length.</p>
<p>Example: Print out all lines, which do <em>not</em> have a line length of 171 and not 1370.</p>
<p>Also see <a href="https://eklausmeier.goip.de/blog/2022/11-12-line-length-distribution-in-files">Line Length Distribution in Files</a>.</p>
<p>Below Perl one-liner does that, here for the line lengths 20 and 21:</p>
<pre class="line-numbers"><code class="language-bash">perl -ne 'print if (($n=length($_)) != 20 &amp;&amp; $n != 21))' &lt;file&gt;
</code></pre>
<p>Below C program does it with a little bit of comfort on the command line.
It might also be useful if <a href="https://eklausmeier.goip.de/blog/2014/07-10-no-perl-and-php-on-mainframe-from-ibm">Perl is not available</a>.
With command line option <code>-g</code> you specify a line length, which should <em>not</em> be filtered.
Multiple line lengths are given by multiple <code>-g</code>'s.</p>
<pre class="line-numbers" data-line="21,37-38"><code class="language-C">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;unistd.h&gt;

#define MAXBUF	8192
char buf[MAXBUF];

int main (int argc, char *argv[]) {
    int i, c, gcnt=0, len;
    int good[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
    FILE *fp;

    while ((c = getopt(argc,argv,&quot;g:&quot;)) != -1) {
        switch(c) {
            case 'g':
                if (gcnt &gt;= 9) {
                    printf(&quot;%s: too many 'good' lines\n&quot;,argv[0]);
                    return 1;
                }
                good[gcnt++] = atoi(optarg);
                break;
            default:
                printf(&quot;%s: illegal option %c\n&quot;,argv[0],c);
                return 2;
        }
    }
    if (optind &lt; argc) {
        if ((fp = fopen(argv[optind],&quot;r&quot;)) == NULL) {
            printf(&quot;%s: cannot open %s\n&quot;,argv[0],argv[optind]);
            return 3;
        }
    } else fp = stdin;

L1:	while (fgets(buf,MAXBUF,fp) != NULL) {
        len = strlen(buf);
        for (i=0; i&lt;gcnt; ++i)
            if (len == good[i]) goto L1;
        printf(&quot;%s&quot;,buf);
    }

    return 0;
}
</code></pre>
<p>The equivalent of the above Perl command would be</p>
<pre class="line-numbers"><code class="language-bash">lenfilter -g20 -g21 &lt;file&gt;
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/05-20-computing-generalized-eigenvalues-with-lapack</link>
		<guid>https://eklausmeier.goip.de/blog/2025/05-20-computing-generalized-eigenvalues-with-lapack</guid>
		<title>Computing Generalized Eigenvalues with LAPACK</title>
		<category>mathematics</category>
		<category>programming</category>
		<category>C / C++</category>
		<pubDate>Tue, 20 May 2025 17:50:00 +0200</pubDate>
		<description><![CDATA[
<p>Task at hand: compute generalized eigenvalues for</p>
<div class=math>
$$
    A x = \lambda B x, \qquad A, B \in \mathbb{C}^{n\times n}, \quad x\in\mathbb{C}^n, \quad\lambda\in\mathbb{C}
$$
</div>
<p>using the C programming language and the Fortran library <a href="https://www.netlib.org/lapack">LAPACK</a>.</p>
<p>Previously I had used <code>cqzhes()</code> and <code>cqzval()</code> from <a href="https://en.wikipedia.org/wiki/EISPACK">EISPACK</a>.</p>
<p><strong>1. Installing LAPACK.</strong>
Watch out for any pre-existing BLAS library, e.g., <a href="https://en.wikipedia.org/wiki/GotoBLAS">GotoBLAS</a>.</p>
<pre class="line-numbers"><code class="language-bash">pacman -S blas cblas lapack lapack-doc
</code></pre>
<p>Check man page for <code>zgghrd</code>, <code>zhgeqz</code>, and <code>zggev</code>:</p>
<pre class="line-numbers"><code class="language-bash">man zgghrd
man zhgeqz
man zggev
</code></pre>
<p>Checking the so-file with <code>objdump -d</code> and noticing that the Fortran symbols end with <code>_</code>:</p>
<pre class="line-numbers"><code class="language-bash">objdump -d /usr/lib/liblapack.so
</code></pre>
<p>Info on the library <code>liblapack.so</code> to which we link:</p>
<pre class="line-numbers" data-line="3,4"><code class="language-bash">ldd /usr/lib/liblapack.so
        linux-vdso.so.1 (0x000077c056586000)
        libblas.so.3 =&gt; /usr/lib/libblas.so.3 (0x000077c056481000)
        libgfortran.so.5 =&gt; /usr/lib/libgfortran.so.5 (0x000077c055200000)
        libm.so.6 =&gt; /usr/lib/libm.so.6 (0x000077c055108000)
        libgcc_s.so.1 =&gt; /usr/lib/libgcc_s.so.1 (0x000077c056454000)
        libc.so.6 =&gt; /usr/lib/libc.so.6 (0x000077c054f18000)
        /usr/lib64/ld-linux-x86-64.so.2 (0x000077c056588000)
</code></pre>
<p><code>zggev</code> calls <code>zgghrd</code> and <code>zhgeqz</code>.</p>
<div class=markmap>
# zggev
## xerbla
## zgeqrf
## zggbak
## zggbal
## zgghrd
### xerbla
### zlartg
### zlaset
### zrot
## zhgeqz
### xerbla
### zlartg
### zlaset
### zrot
### zscal
## zlacpy
## zlascl
## zlaset
## ztgevc
## zungqr
## zunmqr
</div>
<p>The methods in question use the <a href="https://en.wikipedia.org/wiki/Schur_decomposition#Generalized_Schur_decomposition">QZ algorithm</a>.</p>
<p><strong>2. Example program.</strong>
Compile and link with</p>
<pre class="line-numbers"><code class="language-bash">gcc -Wall qztest.c -o qztest -llapack
</code></pre>
<p>Below program uses the following rules when linking to Fortran on Linux:</p>
<ol>
<li>All arguments passed to Fortran are pointers.</li>
<li>Arrays in Fortran store their values in column order, in contrast to row order in C. Therefore we have to transpose the matrix.</li>
<li>Add underscore as suffix.</li>
</ol>
<p>The program <code>qztest.c</code> is:</p>
<pre class="line-numbers" data-line="6-8,37"><code class="language-C">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;math.h&gt;
#include &lt;complex.h&gt;

extern void zggev_(char *jobvl, char *jobvr, int *n, complex *a, int *lda, complex *b,
    int *ldb, complex *alpha, complex *beta, complex *vl, int *ldvl, complex *vr, int *ldvr,
    complex *work, int *lwork, double *rwork, int *info);



#define N	5
double stoer[] = {	// Stoer/Burlisch (1970):``Introduction to Numerical Analysis&quot;, page 374
    12,  1,   0,   0,   0,
    1,   9,   1,   0,   0,
    0,   1,   6,   1,   0,
    0,   0,   1,   3,   1,
    0,   0,   0,   1,   0
};


int main (int argc, char *argv[]) {
    int i, j, lda=N, ldb=N, ldvl=N, ldvr=N, lwork=N*N, n=N, info=0;
    char jobvl[8], jobvr[8];
    complex a[N*N], b[N*N], alpha[N], beta[N], work[N*N], vl[N*N], vr[N*N], lambda;
    double rwork[8*N];

    memset(b,0,sizeof(*b)*N*N);	// set b[] to zero matrix
    for (i=0; i&lt;N; ++i) {
        b[i+i*N] = 1;
        for (j=0; j&lt;N; ++j)
            a[i+j*N] = stoer[i*N+j];	// transpose
    }

    jobvl[0] = 'N';	// do not compute the left generalized eigenvectors
    jobvr[0] = 'N'; // do not compute the right generalized eigenvectors
    zggev_(jobvl, jobvr, &amp;n, a, &amp;lda, b, &amp;ldb, alpha, beta, vl, &amp;ldvl, vr, &amp;ldvr, work, &amp;lwork, rwork, &amp;info);
    printf(&quot;zggev_.info=%d\n&quot;,info);

    puts(&quot;lambda =&quot;);
    for (i=0; i&lt;N; ++i) {
        lambda = alpha[i] / beta[i];
        printf(&quot;\t(%11.6f %11.6f)\n&quot;,creal(lambda),cimag(lambda));
    }

    return 0;
}
</code></pre>
<p>It prints</p>
<pre><code>lambda =
        (  12.316876    0.000000)
        (   9.016136    0.000000)
        (   6.000000    0.000000)
        (   2.983864    0.000000)
        (  -0.316876    0.000000)
</code></pre>
<p><strong>3. Another example.</strong></p>
<div class=math>
$$
    A = \pmatrix{ -9 & 0 & -3\cr
        -10 & 16 & -2\cr
        -1 & 28 & 1\cr
    }, \qquad
    B = \pmatrix{ -1 & 0 & 2\cr
        1 & -2 & 3\cr
        3 & -2 & 2\cr
    }.
$$
</div>
<p>This should print</p>
<pre><code>        (   6.441386    0.000000)
        (  -1.220693    1.495264)
        (  -1.220693   -1.495264)
</code></pre>
<p>Crosscheck with <a href="https://www.wolframalpha.com">Wolfram Alpha</a>:</p>
<pre><code>Eigenvalues[ {{-1,0,2},{1,-2,3},{3,-2,2}}^(-1) * {{-9,0,-3},{-10,16,-2},{-1,28,1}} ]
</code></pre>
<p>Added 22-Jul-2025: This post was mentioned in <a href="https://blaze.email/Machine-Learning-Engineer/archive/2025-05-27">Machine Learning Engineer: 27th May 2025</a>.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/05-12-a-treatment-for-untreatable</link>
		<guid>https://eklausmeier.goip.de/blog/2025/05-12-a-treatment-for-untreatable</guid>
		<title>A treatment for "untreatable"</title>
		<category>uncategorized</category>
		<pubDate>Mon, 12 May 2025 17:30:00 +0200</pubDate>
		<description><![CDATA[
<p>Transcript produced by <a href="https://script.tokaudit.io">tokscript</a> and corrected by <a href="https://gemini.google.com">Gemini</a>.
The video was made by <a href="https://www.tiktok.com/@dr.cal.ur.science.pal">dr_cal_ur_science_pal</a>.</p>
<p>She has more than 360 thousand followers on TikTok, and more than 4.8 million Likes.</p>
<blockquote class="tiktok-embed" cite="https://www.tiktok.com/@dr.cal.ur.science.pal/video/7502855012150742294" data-video-id="7502855012150742294" style="max-width: 605px;min-width: 325px;">
    <section><a target="_blank" title="@dr.cal.ur.science.pal" href="https://www.tiktok.com/@dr.cal.ur.science.pal?refer=embed">@dr.cal.ur.science.pal</a></section>
</blockquote>
<p>A team of doctors has just treated this woman's “untreatable” cancer using <a href="https://en.wikipedia.org/wiki/Genome_editing">DNA editing</a>. Let’s talk about it.</p>
<p>Your immune system needs to be very careful about what it attacks. If it starts going after your own healthy cells, things can go off the rails very quickly. So, your immune cells have evolved all kinds of internal checkpoints they have to go through before they start kicking the wrong ass.</p>
<p>One of those crucial checkpoint mechanisms is a protein called “<a href="https://en.wikipedia.org/wiki/CISH_(protein)">CISH</a>,” which is written into your cells’ <a href="https://en.wikipedia.org/wiki/DNA">DNA</a>. It’s a voice of reason inside an immune cell that says,</p>
<blockquote>
<p>“Hey, don't punch that guy, he's on our team.”</p>
</blockquote>
<p>But every cancer cell starts as a healthy cell, so they all look like an ass that shouldn't get kicked. It’s one of the reasons that your immune system has such trouble fighting cancer, because they're bad guys that look like good guys.</p>
<p>Usually, some immune cells will eventually detect the imposter. These are called “<a href="https://en.wikipedia.org/wiki/Tumor-infiltrating_lymphocytes">tumor infiltrating lymphocytes</a>,” or “TILs.” But just because a handful of TILs have successfully recognized and infiltrated enemy <a href="https://en.wikipedia.org/wiki/Headquarters">HQ</a> doesn't mean that they can defeat the tumor on their own.</p>
<p>So, what if you extracted some TILs from behind enemy lines, multiplied them, and then put them back into the patient with a few billion of their buddies? Well, this does work, but only sometimes. See, it doesn't matter how many TILs can recognize the tumor and get inside of it if that CISH protein is holding them back from killing it.</p>
<p>So, what if before you put the TILs back in, you edited their DNA to delete CISH entirely? You’ve essentially made a group of jacked-up super soldiers that know the way to enemy HQ, and once they're inside, they can start banging heads together without anything holding them back.</p>
<p>This idea saved <a href="https://www.foxnews.com/health/terminal-colon-cancer-patient-saved-breakthrough-treatment">Emma Dimery</a>’s life. By 2022, she had already gone through a decade of chemotherapy, radiotherapy, and immunotherapy, but her stage 4 <a href="https://en.wikipedia.org/wiki/Colorectal_cancer">colorectal cancer</a> still hadn't been stopped. She thought she was out of options until she signed up for a clinical trial that would teach her TILs how to ignore it when cancer cells tried to fake their way out of getting whooped.</p>
<p>The trial team harvested Emma's TILs and then used <a href="https://en.wikipedia.org/wiki/CRISPR_gene_editing">CRISPR-Cas9</a> DNA editing to delete the gene that serves as instructions for her cells to make the CISH protein. They then put 100 billion of those edited TILs back into Emma's body so that they could find the tumor and start kicking its ass. And it worked!! Emma has been cancer free for two years now 🥳.</p>
<p>Now, Emma is only one of 12 patients on the trial who had their TILs extracted, edited, and put back in. The other patients didn't react quite as strongly for a variety of reasons the doctors are still trying to work out. But because this treatment works by taking the brakes off of the immune system rather than depending on some feature of the cancer cells themselves, it could theoretically be useful for a lot more patients. Everybody's cancer is a little bit different, but everybody's CISH works the same.</p>
<p>This is a huge step towards a treatment for cancer that is simultaneously tailored to the individual, because it runs on your own homegrown cells, but also universally applicable, because it runs on a mechanism that all of our bodies share.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/04-26-considerations-on-gdgs-on-linux</link>
		<guid>https://eklausmeier.goip.de/blog/2025/04-26-considerations-on-gdgs-on-linux</guid>
		<title>Considerations on GDGs on Linux</title>
		<category>Linux</category>
		<pubDate>Sat, 26 Apr 2025 22:30:00 +0200</pubDate>
		<description><![CDATA[
<p><strong>1. Introduction.</strong> The mainframe knows the notion of GDGs, i.e., Generation Data Groups.
These are <em>groups</em> of files, which are handled as almost a single entity.</p>
<p>Some notions.
A GDG file consists of three parts in its file name:</p>
<pre><code>&lt;GDG-Base&gt;.G&lt;generation&gt;.V&lt;version&gt;
</code></pre>
<p>The <em>limit</em> is the maximal number of generations we want to keep.</p>
<table>
<thead>
<tr>
<th>Nr.</th>
<th>Notion</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>1.</td>
<td>GDG base</td>
<td>common prefix</td>
</tr>
<tr>
<td>2.</td>
<td>generation</td>
<td>number in range 0001 to 9999, default is 0001; also called <em>absolute generation</em></td>
</tr>
<tr>
<td>3.</td>
<td><em>relative</em> generation</td>
<td>number in range -9998 to +9998; added to <em>absolute</em> generation</td>
</tr>
<tr>
<td>4.</td>
<td>version</td>
<td>number in range 00 to 99, default is 00</td>
</tr>
<tr>
<td>5.</td>
<td>limit</td>
<td>maximal number of files for a GDG, e.g., 5</td>
</tr>
</tbody>
</table>
<p>Here is an examples of a GDG with base <code>DONKNUTH</code> and limit 3:</p>
<ol>
<li><code>DONKNUTH.G0001V00</code></li>
<li><code>DONKNUTH.G0002V00</code></li>
<li><code>DONKNUTH.G0003V00</code></li>
</ol>
<p>Accessing a generation is done using the paranthesis notation on MVS and using <em>relative generations</em>.</p>
<ol>
<li>So <code>DONKNTUH(0)</code> is <code>DONKNUTH.G0003V00</code>. The &quot;current&quot; generation.</li>
<li>Similarly, <code>DONKNTUH(-1)</code> is <code>DONKNUTH.G0002V00</code>. This is the &quot;previous&quot; generation.</li>
<li>And, <code>DONKNTUH(-2)</code> is <code>DONKNUTH.G0001V00</code>. This is the before-previous generation.</li>
<li>A new generation is created by specifying <code>DONKNTUH(+1)</code>.
That would be <code>DONKNUTH.G0004V00</code>.</li>
</ol>
<p>Here is another example of GDG with base <code>DRitchie</code> and limit 8:</p>
<ol>
<li><code>DRitchie.g9996v00</code></li>
<li><code>DRitchie.g9997v00</code></li>
<li><code>DRitchie.g9998v00</code></li>
<li><code>DRitchie.g9999v00</code></li>
<li><code>DRitchie.g0001v00</code></li>
<li><code>DRitchie.g0002v00</code></li>
<li><code>DRitchie.g0003v00</code></li>
<li><code>DRitchie.g0004v00</code></li>
</ol>
<p>The generation number <code>0000</code> is <em>not</em> used.
In above example <code>DRitchie.g0000v00</code> will never exist.
I.e., there is a jump from <code>9999</code> to <code>0001</code> in <em>absolute generations</em>.</p>
<p>The <em>version</em> of GDG is of no relevance in our following discussions.
Its purpose is to change a specific generation and alter the file.
For example, you could change <code>DRitchie.g0003v00</code> to <code>DRitchie.g0003v01</code>.
In that case <code>DRitchie.g0003v00</code> will be gone.
Only <code>DRitchie.g0003v01</code> remains, and, of course, the other generations.</p>
<p>See <a href="https://www.ibm.com/docs/en/zos/2.4.0?topic=groups-absolute-generation-version-numbers">Absolute generation and version numbers</a>.</p>
<p><strong>2. Solution sketch.</strong>
This short memo outlines how this can be implemented with the help of SQLite.
SQLite is particularly apt to this task as it provides:</p>
<ol>
<li><a href="https://sqlite.org/lockingv3.html">Concurrency processing</a>, i.e., protecting against accidental overwriting of parallel tasks</li>
<li>Keeping all information in a single file</li>
</ol>
<p>The solution is now to have <em>two</em> sets of files:</p>
<ol>
<li>A number of data files, which actually hold the data, named <em>xxx</em>.g0001v00, <em>xxx</em>.g0002v00, <em>xxx</em>.g0003v00, etc.</li>
<li>An SQLite file <em>xxx.db</em> for <em>managing</em> the generation, i.e., the actual file with generation number</li>
</ol>
<p>The version part is kept constant to <code>V00</code>.
We stick to the lowercase file suffixes.
<a href="https://eklausmeier.goip.de/blog/2022/02-07-mass-lowercasing-of-file-names">Mass lowercasing of file names</a> described an approach to lowercase huge number of files.</p>
<p>In addition there will be a single binary <code>gdg</code>, which controls the access to above sets of files.
Program <code>gdg</code> is entirely controlled by command line arguments.</p>
<p><code>gdg</code> is written in C and accesses the SQLite database file and returns a string, which is the file name of the generation in question.
As <code>gdg</code> is used in many shell scripts the <em>startup time</em> of <code>gdg</code> is important and other languages are too slow,
see <a href="https://eklausmeier.goip.de/blog/2016/04-05-performance-comparison-c-vs-lua-vs-luajit-vs-java">Performance Comparison C vs. Lua vs. LuaJIT vs. Java</a>.</p>
<p><code>gdg</code> takes two input strings via command line:</p>
<ol>
<li>The name of the SQLite database for the GDG, e.g., <code>DONKNUTH.db</code></li>
<li>The requested <em>relative</em> generation number, e.g., +2, or simply 2</li>
</ol>
<p>For the example with <code>DONKNUTH.db</code> and +2, it will return</p>
<pre><code>DONKNUTH.G0005V00
</code></pre>
<p>Likewise:</p>
<pre><code class="language-bash">echo $(gdg DONKNUTH.db -2)
</code></pre>
<p>will print <code>DONKNUTH.G0001V00</code>.</p>
<p>To create an entire new GDG use command line flag <code>-c</code> and specify GDG base and limit.
E.g., creating above example <code>DRitchie</code> with limit 8:</p>
<pre><code class="language-bash">gdg -c DRitchie.db 8
</code></pre>
<p>If the limit is omitted, it is assumed to be 1.</p>
<p>Similarly, the limit is <em>changed</em> by specifying command line argument <code>-c</code>.
If the new limit is smaller than the previous one, multiple files might get deleted by <code>gdg</code>.</p>
<p><code>gdg</code> does not use the paranthesis notation from MVS, as paranthesis have a special meaning with the shell, and calling <code>gdg</code> from a shell is the most common use-case.</p>
<p>It should be noted that <code>gdg</code> just reads strings and produces strings.
It does not produce any files.
However, <code>gdg</code> <em>deletes</em> files!
I.e., according the specified limit, surplus files are deleted.
Forever.
Whenever a positive relative generation is specified all the files which do not match the limit criterion are deleted by <code>gdg</code>.</p>
<p>Deleting the surplus files is done using <a href="https://man.archlinux.org/man/scandir.3"><code>scandir()</code></a> and <a href="https://man.archlinux.org/man/unlink.3p"><code>unlink()</code></a>.</p>
<p><code>gdg</code> can take an optional third argument: a program name.
This is just a string stored in the <code>genhist</code> table, see below.</p>
<p><strong>3. Data model.</strong> The SQLite database will store below table called <code>genmgt</code> (&quot;generation management&quot;).</p>
<table>
<thead>
<tr>
<th>Nr.</th>
<th>Column</th>
<th>type</th>
<th>nullable</th>
<th>Example or meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>base</td>
<td>text</td>
<td>not null</td>
<td>GDG base: file name excluding directory, e.g., <code>DONKNUTH</code></td>
</tr>
<tr>
<td>2</td>
<td>generation</td>
<td>int</td>
<td>not null</td>
<td>current <em>absolute</em> generation, e.g., 73; starts with 1</td>
</tr>
<tr>
<td>3</td>
<td>limit</td>
<td>int</td>
<td>not null</td>
<td>total number of generations allowed, e.g., 5; default is 1</td>
</tr>
</tbody>
</table>
<p>As only the file name without path of the GDG is stored, the GDG can be moved around the filesystem.</p>
<p>We might be interested in the history of accesses.
I.e., <em>who</em> accessed the GDG with <em>what</em> program or job.
For this we can use the table <code>genhist</code> (&quot;generation history&quot;).
This table is entirely optional and not required.</p>
<table>
<thead>
<tr>
<th>Nr.</th>
<th>Column</th>
<th>type</th>
<th>nullable</th>
<th>Example or meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>generation</td>
<td>int</td>
<td>not null</td>
<td>historic <em>absolute</em> generation number , e.g., 71</td>
</tr>
<tr>
<td>2</td>
<td>uid</td>
<td>int</td>
<td>not null</td>
<td>user-id from <code>getuid()</code></td>
</tr>
<tr>
<td>3</td>
<td>gid</td>
<td>int</td>
<td>not null</td>
<td>group-id from <code>getgid()</code></td>
</tr>
<tr>
<td>4</td>
<td>pgmname</td>
<td>text</td>
<td>null</td>
<td>name of program or job, which accessed the i-th generation</td>
</tr>
<tr>
<td>5</td>
<td>atime</td>
<td>date</td>
<td>not null</td>
<td>access time</td>
</tr>
</tbody>
</table>
<p>The following SQL statements will be used:</p>
<ol>
<li>Create an entire new GDG base: <code>insert into genmgt (...)</code></li>
<li>Specify <em>relative</em> generation, e.g., (+1):<ul>
<li><code>select generation, limit from genmgt</code></li>
<li><code>update genmgt set generation = ...</code></li>
</ul>
</li>
<li>Change limit: <code>update genmgt set limit = ...</code></li>
</ol>
<p><strong>4. Outlook</strong>. Each GDG element might be a so called partitioned dataset.
In UNIX jargon this would be a directory.
I.e., so ideally <code>gdg</code> can also handle a GDG of directories.</p>
<p><strong>5. Effort estimation.</strong>
Program <code>gdg</code> can be written in less than three mandays.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/04-17-most-used-linux-commands</link>
		<guid>https://eklausmeier.goip.de/blog/2025/04-17-most-used-linux-commands</guid>
		<title>Most Used Linux Commands</title>
		<category>Linux</category>
		<pubDate>Thu, 17 Apr 2025 20:10:00 +0200</pubDate>
		<description><![CDATA[
<p>Similar to the post <a href="https://jasonthai.me/blog/2018/09/03/10-most-used-linux-commands">My 10 Most Used Linux Commands</a> by <a href="https://www.linkedin.com/in/jasontthai/">Jason Thai</a>, here is a list of the most used commands on the command line in zsh.</p>
<pre><code class="language-bash">  11991 cd
   8214 rsync
   5398 ll
   5206 v
   5193 l
   4254 time
   4123 li
   2490 git
   2432 lh
   2412 rg
   2192 ..
   1862 mv
   1813 grep
   1552 cat
   1483 ssh
   1419 p
   1385 tmux
   1271 find
   1204 man
   1199 scp
   1088 cp
   1032 php
   1008 rm
    956 startx
    891 perl
    869 pacman
    865 b
    796 uptime
    725 pmsh
    722 curl
    711 su
    707 ...
    661 file
    633 a
    615 +
    586 g
    560 tail
    557 r
    504 echo
    445 wc
    443 diff
    427 j
    420 cwebp
    410 nvim
    396 pidof
    393 which
    377 geany
    341 -
</code></pre>
<p>Above list was generated like so:</p>
<pre><code class="language-bash">cut -d' ' -f1 .histfile | sort | uniq -c | sort -rn | li
</code></pre>
<p>A large portion of those commands are in turn aliases or one-line scripts.</p>
<table>
<thead>
<tr>
<th>Alias</th>
<th>command</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>+</code></td>
<td><code>pushd .</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td><code>popd</code></td>
</tr>
<tr>
<td><code>..</code></td>
<td><code>cd ..</code></td>
</tr>
<tr>
<td><code>...</code></td>
<td><code>cd ../..</code></td>
</tr>
<tr>
<td>l</td>
<td><code>ls -aCF</code></td>
</tr>
<tr>
<td>li</td>
<td><code>less</code></td>
</tr>
<tr>
<td>ll</td>
<td><code>ls -alF</code></td>
</tr>
<tr>
<td>b</td>
<td><code>bcompare</code>, i.e., <a href="https://eklausmeier.goip.de/blog/2018/05-17-using-scooter-software-beyond-compare">Beyond Compare</a></td>
</tr>
<tr>
<td>a</td>
<td><code>mupdf</code></td>
</tr>
<tr>
<td>g</td>
<td><code>sxiv</code></td>
</tr>
<tr>
<td>j</td>
<td><a href="https://eklausmeier.goip.de/aux/categories#J-Pilot"><code>jpilot</code></a></td>
</tr>
<tr>
<td>p</td>
<td><code>ps -fu $(whoami)</code></td>
</tr>
<tr>
<td>r</td>
<td><code>echo $?</code></td>
</tr>
<tr>
<td>v</td>
<td><code>vim</code></td>
</tr>
</tbody>
</table>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods</link>
		<guid>https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods</guid>
		<title>A Stiffly Stable Integration Process Using Cyclic Composite Methods</title>
		<category>mathematics</category>
		<pubDate>Fri, 04 Apr 2025 14:00:00 +0200</pubDate>
		<description><![CDATA[
<p>PhD thesis from Joel Marvin Tendler from May, 1973.
Completed under the direction of Prof. Dr. <a href="https://www.legacy.com/us/obituaries/coloradocommunitymedia/name/theodore-bickart-obituary?id=53536695">Theodore Bickart</a>, Syracuse University.</p>
<p><a href="https://eklausmeier.goip.de/pdf/TendlerDiss1973.pdf">TendlerDiss1973.pdf</a></p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/04-03-a-stability-and-composite-multistep-methods</link>
		<guid>https://eklausmeier.goip.de/blog/2025/04-03-a-stability-and-composite-multistep-methods</guid>
		<title>A-Stability and Composite Multistep Methods</title>
		<category>mathematics</category>
		<pubDate>Thu, 03 Apr 2025 14:00:00 +0200</pubDate>
		<description><![CDATA[
<p>PhD thesis from William Benjamin Rubin from May, 1973.
Completed under the direction of Prof. Dr. <a href="https://www.legacy.com/us/obituaries/coloradocommunitymedia/name/theodore-bickart-obituary?id=53536695">Theodore Bickart</a>, Syracuse University.</p>
<p><a href="https://eklausmeier.goip.de/pdf/RubinDiss1973.pdf">RubinDiss1973.pdf</a></p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/03-31-scanning-microfilm-to-pdf</link>
		<guid>https://eklausmeier.goip.de/blog/2025/03-31-scanning-microfilm-to-pdf</guid>
		<title>Scanning Microfilm to PDF</title>
		<category>college</category>
		<pubDate>Mon, 31 Mar 2025 14:00:00 +0200</pubDate>
		<description><![CDATA[
<p>On 31-Mar-2025 I visited the <a href="https://en.wikipedia.org/wiki/Regenstein_Library">Joseph Regenstein Library</a> in Chicago to scan two PhD dissertations.
I had kept these two PhD thesis since 1990.
In 1990 I could only read these two thesis on a microfilm reader.
At that time there was no <a href="https://en.wikipedia.org/wiki/PDF">PDF</a>.</p>
<p>The Regenstein library of the <a href="https://en.wikipedia.org/wiki/University_of_Chicago">University of Chicago</a> offers the possibility for the public to scan <a href="https://en.wikipedia.org/wiki/Microform">microfilms</a>.
See <a href="https://guides.lib.uchicago.edu/microforms">Using the Microform Scanners</a>.</p>
<p>The entrance of the Regenstein library.</p>
<p><img src="https://eklausmeier.goip.de/img/ChicagoRegensteinLibrary.webp" alt="Photo"></p>
<p>The Regenstein library is next to the futuristic <a href="https://en.wikipedia.org/wiki/Joe_and_Rika_Mansueto_Library">Mansueto library</a>.</p>
<p><img src="https://eklausmeier.goip.de/img/ChicagoMansuetoLibrary.webp" alt="Photo"></p>
<p>This is all part of the <a href="https://en.wikipedia.org/wiki/University_of_Chicago">University of Chicago</a> campus.</p>
<p><img src="https://eklausmeier.goip.de/img/ChicagoUniversity.webp" alt="Photo"></p>
<p>The scanning cubicle: you can see the two rolls with the microfilm in below photo while scanning.</p>
<p><img src="https://eklausmeier.goip.de/img/ChicagoRegensteinScanning.webp" alt="Photo"></p>
<p>Unfortunately, each page had to be scanned individually and saved as a separate file.
So it took me a couple of hours to scan the two microfilms.
Each page is essentially just an image stored as PDF.</p>
<p>The actual command to concatenate all those files from Tendler's dissertation:</p>
<pre><code class="language-bash">$ time pdfunite Tendler01aL*.pdf Tendler01b*.pdf TendlerDiss1973.pdf
        real 2.99s
        user 2.77s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p>Rubin's dissertation:</p>
<pre><code class="language-bash">$ time pdfunite Rubin02a* Rubin02b*.pdf RubinDiss1973.pdf
        real 3.10s
        user 2.87s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p>The results are here:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2025/04-03-a-stability-and-composite-multistep-methods">A-Stability and Composite Multistep Methods</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">A Stiffly Stable Integration Process Using Cyclic Composite Methods</a></li>
</ol>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/03-24-die-verwendeten-zyklischen-formeln-im-programm-tendler</link>
		<guid>https://eklausmeier.goip.de/blog/2025/03-24-die-verwendeten-zyklischen-formeln-im-programm-tendler</guid>
		<title>Die verwendeten zyklischen Formeln im Programm TENDLER</title>
		<category>mathematics</category>
		<pubDate>Mon, 24 Mar 2025 19:30:00 +0100</pubDate>
		<description><![CDATA[
<blockquote>
<p>It is entirely possible, and even very likely, in view of the fact
that the parameters $C_{ij}$ were “manually” set in an interactive
computer search for the maximum $\alpha$, that better and simpler
cyclic composite methods exist. An interested reader is invited to
try the development of such methods on his own. For those, who are
satisfied with the methods obtained thus far, in what follows, we
describe how they are implemented in a numerical algorithm.</p>
<p>J.M. Tendler, Th.A. Bickart, Z. Picel (1976)</p>
</blockquote>
<p>Inhalt</p>
<ul>
<li><a href="#formeln">1. Die sieben zyklischen Korrektorformeln von J.M. Tendler</a></li>
<li><a href="#bemerkungen">2. Bemerkungen zu den Formeln von J.M. Tendler</a></li>
<li><a href="#fehlerfaktoren">3. Die Fehlerfaktoren der Korrektorformeln</a></li>
<li><a href="#stabilitaetseigenschaften">4. Die Stabilitätseigenschaften der Korrektorformeln</a></li>
<li><a href="#praediktorformeln">5. Die sieben Prädiktorformeln</a></li>
</ul>
<p>In diesem Abschnitt werden sämtliche benutzten Formeln
vorgestellt, die in dem Programm TENDLER Verwendung gefunden haben.
Zuerst kommen die Korrektorformeln und anschliessend die Prädiktorformeln.</p>
<p>Angegeben werden auch mehrere Fehlerfaktoren und Fehlerkonstanten
und natürlich auch die Werte, die maßgeblich die
Stabilitätseigenschaften quantifizieren, also die Werte $\alpha$ und
$\delta$ bei der $A_\infty[\alpha]$-Stabilität und
$S_\infty[\delta]$-Stabilität.
Hingewiesen wird auch auf Charakteristika und auf den prinzipiellen
Aufbau der zyklischen Formeln.
Diskutiert wird ebenfalls, welche Bedingungen Stabilität bei unendlich
in einfachster Weise garantieren.</p>
<p>Mit angeführt werden auch mehrere Darstellungen für diese Formelpaare;
nämlich einmal in der gewöhnlichen Darstellung und das andere Mal in
Form von rückwärtsgenommenen Differenzen.
Die letztgenannte Form ist auch diejenige Form, die auch in dem Programm
TENDLER verwendet wird.
Die Darstellung in Form von rückwärtsgenommenen Differenzen bietet
Vorteile insbesondere bei der Fehlerkontrolle und bei der
Schrittweiten- und Ordnungssteuerung.
Dort stellen sie gerade Näherungen für entsprechend benötigte
Ableitungswerte dar.
Die Korrektoriteration hingegen verhält sich neutral gegenüber der Darstellungsart.
Ebenso der Prädiktor.
In beiden Darstellungsarten, also sowohl der Darstellung in Form von
rückwärtsgenommenen Differenzen als auch in gewöhnlicher Ordinatenform,
sind die Prädiktorrechnungen einfach durchführbar.
Die Prädiktorrechnungen haben einen häufig unterschätzten Einfluß auf die
Gesamtrechenzeit.</p>
<h2>1. Die sieben zyklischen Korrektorformeln von J.M. Tendler<a id=formeln></a></h2>
<blockquote>
<p>At first it was hoped that high order $A$-stable cyclic methods
could be found. This goal was not achieved. However, the new
integration methods are applicable to the solution of
stiff systems. Moreover they exhibit better stability
properties than the backward differentiation formulas in
Gear's widely accepted algorithm.</p>
<p><a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">J.M. Tendler (1973)</a></p>
</blockquote>
<p><strong>1.</strong> Die Verfahren der Ordnung $p=1,\ldots,7$, die
Joel Marvin Tendler im Rahmen seiner
Dissertation 1973 neu entwickelt hat, werden
hier nun angegeben.</p>
<p>Für die an anderer Stelle genauer erläuterte Fehlerkonstante von Henrici</p>
<div class=math>
$$
    C = {v{\mskip 3mu}\gamma\over v{\mskip 3mu}\rho'(1){\mskip 3mu}w}, \qquad\left\{ \eqalign{
        v{\mskip 3mu}\rho(1)&=0,\quad v\ne0,\cr \rho(1){\mskip 3mu}w&=0,\quad w\ne0,\cr }\right.
$$
</div>
<p>werden auch gleichzeitig die Linkseigenvektoren $v_p$, für $p=1,\ldots,7$
der entsprechenden Matrizen aufgeführt.
Der Rechtseigenvektor ist natürlich immer $w_p=(1,\ldots,1)^\top$,
für $p=1,\ldots,7$.
Zu dieser Konstanten vgl. man auch den Aufsatz von
<a href="https://doi.org/10.1007/BF01389876">Albrecht (1985)</a>.</p>
<p>Die beiden ersten Verfahren, also die der Ordnung 1 und 2, sind nichts
anderes als die zyklische Wiederholung ein und der selben Formel,
hier also des impliziten Euler-Verfahrens für die Ordnung 1 und BDF2 für das
Verfahren der Ordnung 2.</p>
<p>Bibliographisch:</p>
<ol>
<li><a href="https://www.researchgate.net/profile/Joel-Tendler/research">Joel Marvin Tendler</a>: “<a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">A Stiffly Stable Integration Process Using Cyclic Composite Methods</a>”, Ph.D. Diss., Syracuse University, Syracuse, New York, 26-Feb-1973</li>
<li>Tendler, Joel Marvin und Bickart, Theodore A. und Picel, Zdenek:
“STINT: STiff ordinary differential equations INTegrator. Program and User Manual”,
Electrical and Computer Engineering Department, Syracuse University,
Syracuse, New York 13210, USA, and Department of Electrical Engineering,
Delft University of Technology, Delft, The Netherlands,
Technical Report TR-76-12, December 1976, <em>ii</em>+85 pages</li>
<li><a href="https://www.researchgate.net/profile/Theodore-Bickart/research">Theodore A. Bickart (1936—2023)</a>, <a href="https://www.legacy.com/us/obituaries/coloradocommunitymedia/name/theodore-bickart-obituary?id=53536695">obituary</a></li>
<li>Peter Albrecht, 1985: “<a href="https://doi.org/10.1007/BF01389876">Numerical Treatment of O.D.E.s: The Theory of $A$-Methods</a>”</li>
<li><a href="https://de.wikipedia.org/wiki/Leonhard_Euler">Euler, Leonhard (1707—1783)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Peter_Henrici_(mathematician)">Henrici, Peter Karl Eugen (1923—1987)</a></li>
<li>Zdenek Picel</li>
</ol>
<p><strong>2.</strong> Die Formeln der Ordnung $p=1,\ldots,7$ sind stets von der Gestalt</p>
<div class=math>
$$
    \sum_{ j=-k+1}^\ell \alpha_{ij}y_{m\ell+j} =
        h \sum_{j=-k+1}^\ell \beta_{ij}f_{m\ell+j},
    \qquad i=1,\ldots,\ell.
$$
</div>
<p>In Matrixschreibweise erhält man z.B. für $\ell=3$ und $k=2$, also für ein
dreistufiges Verfahren mit 2 Startwerten, ausgeschrieben:</p>
<div class=math>
$$
    \left(
    \begin{array}{ccccc|ccccc}
        \alpha_{1,-1} & \alpha_{1,0} & \alpha_{1,1} & \alpha_{1,2} & \alpha_{1,3} &
           \beta_{1,-1} & \beta_{1,0} & \beta_{1,1} & \beta_{1,2} & \beta_{1,3}\cr
        \alpha_{2,-1} & \alpha_{2,0} & \alpha_{2,1} & \alpha_{2,2} & \alpha_{2,3} &
           \beta_{2,-1} & \beta_{2,0} & \beta_{2,1} & \beta_{2,2} & \beta_{2,3}\cr
        \alpha_{3,-1} & \alpha_{3,0} & \alpha_{3,1} & \alpha_{3,2} & \alpha_{3,3} &
           \beta_{3,-1} & \beta_{3,0} & \beta_{3,1} & \beta_{3,2} & \beta_{3,3}\cr
    \end{array}
    \right)
    \pmatrix{
        y_{3m-1}\cr y_{3m}\cr y_{3m+1}\cr y_{3m+2}\cr y_{3m+3}\cr
           -hf_{3m-1}\cr -hf_{3m}\cr -hf_{3m+1}\cr -hf_{3m+2}\cr -hf_{3m+3}\cr
    }
    = \pmatrix{0\cr 0\cr 0\cr} .
$$
</div>
<p>Aus Übersichtlichkeitsgründen werden die sieben nachfolgenden
zyklischen Verfahren in der folgenden transponierten Schreibweise angegeben.</p>
<p>Später wird mit den Tableaux in transponierter Darstellung auch in dieser
Form gerechnet.</p>
<div class=math>
$$
\begin{array}{c|c}
p & i=1,\ldots,\ell\cr
\hline
j & \alpha_{ij}\cr
\hline
j & \beta_{ij}\cr
\end{array}
$$
</div>
<p><strong>3.</strong> Für die zyklische, dreifache Wiederholung des impliziten Euler-Verfahrens</p>
<div class=math>
$$
    y_{m+1}=y_m+hf_{m+1}
$$
</div>
<p>und für die zyklische, dreifache Wiederholung der BDF2</p>
<div class=math>
$$
    3y_{m+1}-4y_m+y_{m-1} = 2hf_{m+1},
$$
</div>
<p>ergeben sich die beiden transponierten Tableaux für die Verfahren
wie untenstehend.</p>
<p>Ordnung 1.</p>
<div class=math>
$$
\begin{array}{r|rrr}
p=1 & 1 & 2 & 3\cr
\hline
 0&  -1 &   0 &   0\cr
 1&   1 &  -1 &   0\cr
 2&   0 &   1 &  -1\cr
 3&   0 &   0 &   1\cr
\hline
0 &   0 &   0 &   0\cr
1 &   1 &   0 &   0\cr
2 &   0 &   1 &   0\cr
3 &   0 &   0 &   1\cr
\end{array}
$$
</div>
<p>Ordnung 2.</p>
<div class=math>
$$
\begin{array}{r|rrr}
p=2 & 1 & 2 & 3\cr
\hline
-1&   1 &   0 &   0\cr
 0&  -4 &   1 &   0\cr
 1&   3 &  -4 &   1\cr
 2&   0 &   3 &  -4\cr
 3&   0 &   0 &   3\cr
\hline
-1&   0 &   0 &   0\cr
0 &   0 &   0 &   0\cr
1 &   2 &   0 &   0\cr
2 &   0 &   2 &   0\cr
3 &   0 &   0 &   2\cr
\end{array}
$$
</div>
<p>Für die Links- und Rechtseigenvektoren $v_1$, $v_2$, $w_1$ und $w_2$
erhält man</p>
<div class=math>
$$
    v_1^\top=\pmatrix{1\cr 1\cr 1\cr},\qquad
    v_2^\top=\pmatrix{1\cr 1\cr 1\cr},\qquad
    w_1=w_2=\pmatrix{1\cr 1\cr 1\cr}
$$
</div>
<p>und für die Fehlerkonstanten von Henrici ergeben sich damit</p>
<div class=math>
$$
    C_1=-{3\over2},\qquad C_2=-1.
$$
</div>
<p>Diese beiden Verfahren werden sowohl in dem Programm STINT als auch in
dem neu entwickelten Programm TENDLER in dieser Form benutzt.
Da beide Verfahren, also sowohl das implizite Euler-Verfahren und auch
BDF2, optimale, also nicht verbesserbare Stabilitätseigenschaften
$A_\infty^0[\alpha]$ und $S_\infty^0[\delta]$ besitzen,
wurden sie unverändert so übernommen.</p>
<p><strong>4.</strong> Für $p=k=3$, $p=k=4$ und $p=k=5$ konnte Tendler die folgenden Werte finden.
Bei allen drei Verfahren sind wieder die beiden ersten Stufen der Zyklen
BDF3, BDF4, bzw. BDF5.
Nur die letzte Stufe sorgt, bzw. die letzten beiden Stufen sorgen für die
Vergrößerung des Widlund-Winkels $\alpha$ bei der
$A_\infty[\alpha]$-Stabilität und der Verkleinerung der
Widlund-Distanz $\delta$ bei der $S_\infty[\delta]$-Stabilität.</p>
<p>Ordnung 3.</p>
<div class=math>
$$
\begin{array}{r|rrr}
p=3 & 1 & 2 & 3\cr
\hline
-2&  -2 &   0 &   0\cr
-1&   9 &  -2 &   0\cr
0 & -18 &   9 &   0\cr
1 &  11 & -18 &   9\cr
2 &   0 &  11 & -12\cr
3 &   0 &   0 &   3\cr
\hline
-2&   0 &   0 &   0\cr
-1&   0 &   0 &   0\cr
0 &   0 &   0 &   0\cr
1 &   6 &   0 &  -4\cr
2 &   0 &   6 &  -4\cr
3 &   0 &   0 &   2\cr
\end{array}
$$
</div>
<p>Ordnung 4.</p>
<div class=math>
$$
\begin{array}{r|rrr}
p=4 & 1 & 2 & 3\cr
\hline
-3&    3 &    0 &    0\cr
-2&  -16 &    3 &    0\cr
-1&   36 &  -16 &   11\cr
 0&  -48 &   36 &  -48\cr
 1&   25 &  -48 &  216\cr
 2&    0 &   25 & -272\cr
 3&    0 &    0 &   93\cr
\hline
-3&    0 &    0 &    0\cr
-2&    0 &    0 &    0\cr
-1&    0 &    0 &    0\cr
 0&    0 &    0 &    0\cr
 1&   12 &    0 &  -60\cr
 2&    0 &   12 &  -48\cr
 3&    0 &    0 &   48\cr
\end{array}
$$
</div>
<p>Ordnung 5.</p>
<div class=math>
$$
\begin{array}{r|rrrr}
p=5 & 1 & 2 & 3 & 4\cr
\hline
-4&   -12 &     0 &     0 &     0\cr
-3&    75 &   -12 &     0 &     0\cr
-2&  -200 &    75 &  -118 &     0\cr
-1&   300 &  -200 &   735 &  -133\cr
 0&  -300 &   300 & -1940 &   780\cr
 1&   137 &  -300 &  2980 & -1680\cr
 2&     0 &   137 & -3030 &  5470\cr
 3&     0 &     0 &  1373 & -5595\cr
 4&     0 &     0 &     0 &  1158\cr
\hline
-4&     0 &     0 &     0 &     0\cr
-3&     0 &     0 &     0 &     0\cr
-2&     0 &     0 &     0 &     0\cr
-1&     0 &     0 &     0 &     0\cr
 0&     0 &     0 &     0 &     0\cr
 1&    60 &     0 &   -60 &    30\cr
 2&     0 &    60 &     0 & -1860\cr
 3&     0 &     0 &   600 & -1530\cr
 4&     0 &     0 &     0 &   600\cr
\end{array}
$$
</div>
<p>Die Vektoren $v_i$ mit $v_i\rho(1)=0$, die Vektoren $w_i$ mit
$\rho(1){\mskip 3mu}w_i=0$ und die Fehlerkonstanten von Henrici sind</p>
<div class=math>
$$
    v_3^\top = \pmatrix{5\cr 7\cr 9\cr},\qquad
    v_4^\top = \pmatrix{121\cr 125\cr 21\cr},\qquad
    w_3 = w_4 = \pmatrix{1\cr 1\cr 1\cr},\qquad
    C_3 = -{15\over4},\qquad C_4=-{667\over470}.
$$
</div>
<p>Wäre beim Verfahren dritter Ordnung auch noch die letzte Stufe gleich BDF3,
also das gesamte Verfahren dreimal BDF3 hintereinander, so erhielte man
für die Fehlerkonstante natürlich
$\tilde C_3=-3/4$.
Der Linkseigenvektor von $\rho(1)$, der zugehörige Rechtseigenvektor
und die Fehlerkonstante von Henrici zu dem Verfahren 5.ter Ordnung
berechnen sich zu</p>
<div class=math>
$$
    v_5^\top=\pmatrix{5 323 293\cr  7 719 518\cr  548 547\cr  211 142\cr},
    \qquad w_5=\pmatrix{1\cr 1\cr 1\cr 1\cr},\qquad
    C_5 = {v_5{\mskip 3mu}\gamma\over v_5\rho'(1)w_5} =
    -{104 982 866\over 62 004 015}\approx-1.693 162 3
$$
</div>
<p><strong>5.</strong> Man beachte bei allen diesen obigen Formeln, als auch bei den noch
folgenden Formeln, den grundlegenden Aufbau.
In gewisser Hinsicht wird das Potential, welches man prinzipiell durch
Einführung der zyklischen Verfahren erhält, nicht in voller Gänze
ausgeschöpft, jedoch stellt sich die vermeintliche Einschränkung unter
anderen Gesichtspunkten (programmiermässige Einfachheit, Rechenbedarf,
Speicherplatzbedarf) als gar keine Einschränkung heraus, sondern als echter
Vorteil.
Stets sind die Formeln von der Gestalt,</p>
<div class=math>
$$
    \underbrace{
        \begin{array}{cccccc}
            *&*&*&*& & \cr
             &*&*&*&*& \cr
             & &*&*&*&*
        \end{array}
    }_{ \displaystyle y_{m\ell+i} }
    \qquad \quad
    \underbrace{
        \begin{array}{cccccc}
            0&0&0&*& & \cr
             &0&0&*&*& \cr
             & &0&*&*&*
        \end{array}
    }_{ \displaystyle z_{m\ell+i} = h f_{m\ell+i} }
$$
</div>
<p>D.h. es handelt sich immer um die zyklische Hintereinanderschaltung
linearer Mehrschrittverfahren mit fester Anzahl von Startwerten.
Insbesondere heißt dies z.B. für die letzte Stufe, daß nicht
alle möglichen $k+(\ell-1)$ Werte benutzt werden, sondern tatsächlich
nur $k$, oder bei der Ordnung $p=3$ sogar nur $k-1$.
Erneut wird deutlich, daß es sich hier um eine echte Verallgemeinerung
der BDF auf Mehrstufigkeit handelt.
Insbesondere werden also nicht alle möglichen zurückliegenden Ableitungswerte
verwendet.
Aufgrund des Einbein-Charakters der BDF sind natürlich auch andere
Verallgemeinerungen denkbar.</p>
<p>Tischer (1983) in seiner Dissertation und
<a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>
verfahren hier etwas anders.
Hier werden in der letzten Stufe der Zyklen ein Startwert <em>zusätzlich</em>
verwendet.
Neben den potentiell besseren Stabilitätseigenschaften von zyklischen
Verfahren ist dies ein weiterer, möglicher Vorteil von zyklischen
Verfahren gegenüber einstufigen linearen Mehrschrittverfahren.</p>
<p>Beachtenswert ist auch die Benutzung der skalierten Ableitungswerte
$hf_{m\ell+i}$.
Wie bei den $y_{m\ell+i}$ werden hier nicht alle möglichen Werte
wirklich benutzt.
Zum maßgeblichen Teil hängt dies an der $A_\infty^0[\alpha]$-
bzw. $S_\infty^0[\delta]$-Stabilität.
Dennoch muß man hierbei im Auge behalten, daß man diese zusätzlichen Werte
auch zu speichern hat.
Insbesondere hat man auch für den Fall vorzusorgen, daß ein gesamter
Zyklus zurückgewiesen wird und somit noch weitere Werte abgespeichert
werden müssen.
Darüber hinaus entstehen Rechnungen für die skalierten Ableitungen
bei der Interpolation für evtl. benötigte Zwischengitterpunkte bei einem
Schrittweitenwechsel.</p>
<p><strong>6.</strong> Für die Ordnung $p=k=6$, wo nur die erste Stufe des Zykluses gleich der BDF6
ist und schließlich für $p=k=7$, für die die BDF noch niemals $D$-stabil ist,
konnte Tendler die folgenden zyklischen, steif-stabilen Verfahren finden.
Bei $p=k=7$ sind die ersten beiden Stufen wieder die BDF7, wobei man dann
auch erneut ein Beispiel dafür sieht, daß die zyklische
Kombination klassischer (instabiler) Mehrschrittverfahren das
Gesamtverhalten gegenüber dem Einzelverhalten u.U. verbessern kann.</p>
<p>Ordnung 6.</p>
<div class=math>
$$
\begin{array}{r|rrrr}
p=6 & 1 & 2 & 3 & 4\cr
\hline
-5&    10 &     0 &     0 &     0\cr
-4&   -72 &   202 &     0 &     0\cr
-3&   225 & -1455 &   195 &     0\cr
-2&  -400 &  4550 & -1399 &   285\cr
-1&   450 & -8100 &  4340 & -2039\cr
 0&  -360 &  9150 & -7540 &  6225\cr
 1&   147 & -7277 &  8905 &-10360\cr
 2&     0 &  2930 & -7445 & 18455\cr
 3&     0 &     0 &  2944 &-14865\cr
 4&     0 &     0 &     0 &  2299\cr
\hline
-5&     0 &     0 &     0 &     0\cr
-4&     0 &     0 &     0 &     0\cr
-3&     0 &     0 &     0 &     0\cr
-2&     0 &     0 &     0 &     0\cr
-1&     0 &     0 &     0 &     0\cr
 0&     0 &     0 &     0 &     0\cr
 1&    60 &   -60 &  -420 &   180\cr
 2&     0 &  1200 &   -60 & -4080\cr
 3&     0 &     0 &  1200 & -4680\cr
 4&     0 &     0 &     0 &  1200\cr
\end{array}
$$
</div>
<p>Ordnung 7.</p>
<div class=math>
$$
\begin{array}{r|rrrr}
p=7 & 1 & 2 & 3 & 4\cr
\hline
-6&   -60 &     0 &     0 &     0\cr
-5&   490 &   -60 &     0 &     0\cr
-4& -1764 &   490 &  -210 &     0\cr
-3&  3675 & -1764 &  1722 &  -774\cr
-2& -4900 &  3675 & -6235 &  6349\cr
-1&  4410 & -4900 & 13100 &-22988\cr
 0& -2940 &  4410 &-17650 & 48160\cr
 1&  1089 & -2940 & 17710 &-66290\cr
 2&     0 &  1089 &-11297 & 68159\cr
 3&     0 &     0 &  2860 &-42364\cr
 4&     0 &     0 &     0 &  9748\cr
\hline
-6&     0 &     0 &     0 &     0\cr
-5&     0 &     0 &     0 &     0\cr
-4&     0 &     0 &     0 &     0\cr
-3&     0 &     0 &     0 &     0\cr
-2&     0 &     0 &     0 &     0\cr
-1&     0 &     0 &     0 &     0\cr
 0&     0 &     0 &     0 &     0\cr
 1&   420 &     0 &  -600 &   840\cr
 2&     0 &   420 & -1860 & -2100\cr
 3&     0 &     0 &  1200 & -8400\cr
 4&     0 &     0 &     0 &  4200\cr
\end{array}
$$
</div>
<p>Die entsprechenden Eigenvektoren zu $\rho(1)$ und die Fehlerkonstante
von Henrici sind hierbei</p>
<div class=math>
$$
    v_6=\pmatrix{
        162 594 313\cr
          9 558 423\cr
          4 609 160\cr
          1 830 530\cr},\qquad
    w_6=\pmatrix{1\cr 1\cr 1\cr 1\cr},\qquad
    C_6 = {v_6{\mskip 3mu}\gamma\over v_6\rho'(1)w_6} =
    -{21 342 463\over 13 076 931}\approx -1.632 069 7 .
$$
</div>
<p>Für das letzte siebente Verfahren lauten die Eigenvektoren und die
Fehlerkonstante von Henrici</p>
<div class=math>
$$
    v_7=\pmatrix{
        47 498 730\cr
        33 327 441\cr
         -99 973\cr
        1 007 530\cr}, \qquad
    w_7=\pmatrix{1\cr 1\cr 1\cr 1\cr},\qquad
    C_7 = {v_7{\mskip 3mu}\gamma\over v_7\rho'(1)w_7} =
    -{855 729 101\over 1 250 018 175}\approx -0.684 573 .
$$
</div>
<p>Bibliographisch:</p>
<ol>
<li>Tischer, Peter E.: “The Cyclic Use of Linear Multistep
Formulas for the Solution of Stiff Differential Equations”, Ph.D. Thesis,
Department of Computer Science, Monash University, Clayton, Victoria,
Australia, August 1983, <em>x</em>+180 S.</li>
<li>Tischer, Peter E. + Sacks-Davis, Ron: “<a href="https://doi.org/10.1137/0904051">A New Class of
Cyclic Multistep Formulae for Stiff Systems</a>”,
SIAM Journal on Scientific and Statistical Computing,
Vol 4, No 4, December 1983, pp.733–747</li>
</ol>
<h2>2. Bemerkungen zu den Formeln von J.M. Tendler<a id=bemerkungen></a></h2>
<p><strong>1.</strong> Man könnte es als entscheidenden Nachteil ansehen, daß die drei Verfahren
der Ordnungen $p=5$, $p=6$ und $p=7$ nun 4 Stufen verlangen.
Umfangreiche Testläufe mit dem Programm TENDLER zeigten nun jedoch,
daß bei einer geringfügigen Modifikation der Schrittweiten- und
Ordnungssteuerung Schrittzurückweisungen innerhalb, oder am Ende, eines
Zykluses “fast nie” auftreten.
Zudem sind Zurückweisungen in dem Programm TENDLER ohnehin die Ausnahme.
Die Testläufe legten sogar nahe noch weiter zu gehen.
Zyklen mit 5 Stufen wären völlig unproblematisch in das Programm
TENDLER zu integrieren.
Diese Erfahrungen stehen im Gegensatz zu den _Entwurfs_zielen
bei den zyklischen Verfahren von Tischer (1983) (Dissertation)
und <a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>,
nicht jedoch zu den <em>praktischen</em> Erfahrungen, die
<a href="https://dl.acm.org/doi/10.1145/4078.4079">Tischer/Gupta (1983)</a>
und <a href="https://dl.acm.org/doi/10.1145/214408.214417">Tischer/Gupta (1985)</a>
mit dem Programm ODIOUS gemacht haben.</p>
<p>Bibliographisch:</p>
<ol>
<li><a href="https://dblp.org/pid/t/PeterETischer.html">Peter E. Tischer</a></li>
<li><a href="https://personal.utdallas.edu/~gupta">Gopal K. Gupta</a></li>
<li><a href="https://dblp.org/pid/s/RonSacksDavis.html">Ron Sacks-Davis</a></li>
</ol>
<p><strong>2.</strong> Auffällig ist bei den $\alpha_{ij}$-Werten die Vorzeichenalternierung
entlang herunter einer Spalte und bei den $\beta_{ij}$-Werten sticht ins Auge,
die “Konzentration” der Minus-Zeichen “in der Mitte”, falls nicht dort
Nullen stehen, wiederum entlang herunter einer Spalte.</p>
<p>Stets sind die ersten beiden Stufe nichts anderes als die BDF, außer bei dem
Verfahren sechster Ordnung.</p>
<p>Für die Abhängigkeit der Stufenzahl $\ell$ von der Ordnung $p$ erhält
man übersichtlich zusammengefasst,</p>
<div class=math>
$$
\begin{array}{c|ccccccc}
p    & 1 & 2 & 3 & 4 & 5 & 6 & 7\cr
\hline
\ell & 3 & 3 & 3 & 3 & 4 & 4 & 4\cr
\end{array}
$$
</div>
<p>welche man auch mit der Formel $\ell=3+\lfloor p/5\rfloor$ berechnen könnte
$(1\le p\le7)$.</p>
<p><strong>3.</strong> Für alle Formeln von <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a> gilt, daß
$z_i=hf_i$ für $i\le m\ell$ nicht benötigt werden,
man vergl. hier auch das vorher angegebene Sternchen-Schema.
Stets ist also $B_0=0$, bei invertierbarer Matrix $B_1$.
Hiermit sichert man automatisch, daß die Nullstellen des charakteristischen
Polynoms $\det Q(\mu,H)$ für $\mathop{\rm Re}H\to-\infty$ gegen Null
streben, wegen</p>
<div class=math>
$$
\def\mapright#1{\mathop{\longrightarrow}\limits^{#1}}
    \det Q(\mu,H) = \det \bigl[(A_1\mu+A_0) - H(B_1\mu+B_0) \bigr]
        \mapright{\mathop{\rm Re}\nolimits  H\to-\infty} \det(B_1\mu+B_0),
$$
</div>
<p>(in nicht ganz korrekter Schreibweise) und somit aufgrund von $B_0=0$ dann</p>
<div class=math>
$$
    \det Q(\mu,\infty) = \pm\mu^s \det B_1.
$$
</div>
<p>Damit enthält das Spektrum des Matrixpolynoms $Q(\mu,\infty)$ nur die Null,
falls $B_1$ invertierbar vorausgesetzt wird.</p>
<p>Dies ist nicht der einzige mögliche Weg sicherzustellen, daß die Eigenwerte
bei $\mathop{\rm Re}\nolimits  H=-\infty$ verschwinden.
Wichtig ist lediglich, daß das Spektrum des Matrixpolynoms</p>
<div class=math>
$$
    \sum_{i=0}^\kappa B_i\mu, \qquad \det B_\kappa\ne0
$$
</div>
<p>nur aus der Null besteht.
Für den Falle eines Polynoms der Form $B_1\mu+B_0$ ergibt sich daher die
folgende Überlegung.
Man beachte, daß man auf dieses lineare Polynom alle anderen Polynome
zurückführen kann, u.U. durch Vergrößern der Dimension,
z.B. durch das Begleitpolynom.</p>
<p>Im monischen Falle, also $\det B_1\ne 0$, besteht das Spektrum des
besagten linearen Polynomes $B_1\mu+B_0$ genau dann nur aus der Null,
wenn $B_1^{-1}B_0$ ähnlich ist zu</p>
<div class=math>
$$
    \mathop{\rm diag} (0,\ldots,0,J_1,\ldots,J_k), \qquad
        J_i = (\delta_{p+1,q})_{p,q=1}^{s_\nu},
$$
</div>
<p>also die Matrizen $J_i$ Jordankästen zum Eigenwert Null sind.
Der Fall $\det B_\kappa\ne0$ ist stets zu erreichen, wenn alle Stufen
implizit, oder sogar blockimplizit sind.</p>
<p>Bei expliziten Stufen oder bei Mischung aus expliziten und impliziten
Stufen, ist das reguläre, oder häufig sogar singuläre Matrizenbüschel
$B_1\mu+B_0$ entsprechend zu untersuchen,
siehe <a href="https://www.amazon.de/Matrizentheorie-Felix-R-Gantmacher/dp/3642712444?__mk_de_DE">Gantmacher (1986)</a>.</p>
<p>Tischer (1983) (Dissertation) und
<a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>
z.B. gehen hier den anderen möglichen Weg mit $B_0\ne0$.</p>
<p>Dennoch bedeutet $B_0=0$ im Falle $B_1\mu+B_0$, bzw. $B_i=0$
($i=0,\ldots,\kappa$) im Falle $\sum_{i=0}^\kappa B_i \mu^i$, einen großen
Rechen- und Speichervorteil, wenn der Prädiktor entsprechend gewählt wird.
Sehr vereinfacht ausgedrückt heißt dies: “Je mehr Nullen in den Stufen,
desto besser.”
Die Vereinfachung liegt hier maßgeblich u.a. daran, daß der
Prädiktor entsprechend gewählt werden muß und, daß Nullen bei den
$y_{m\ell+i}$-Werten nicht automatisch auch zu Nullen bei der
Implementierung führen, welche ja auf der Darstellung in Form von
rückwärtsgenommenen Differenzen beruht.
Man beachte, daß bei z.B. 1000 Schritten u.U. 2000–9000
mehr Vektoradditionen und Skalar-Vektor-Multiplikationen ausgeführt werden
müssen, wenn man “Nullen verschenkt.”
Es ist nicht ungewöhnlich, daß eine Funktionsauswertung billiger ist als
die Bildung einer längeren Linearkombination von gespeicherten Vektoren.</p>
<p><a href="https://en.wikipedia.org/wiki/John_Couch_Adams">Adams</a>-Formeln und BDF sind hier typische Vertreter für beide möglichen
Extrema, was z.T. ihren hohen Grad an Effizienz plausibel macht.</p>
<p><strong>4. Beispiel:</strong>  Für das explizite Eulerverfahren
$y_{n+1}-y_n=hf_n$ erhält man mit den Vektoren</p>
<div class=math>
$$
    u_{n+1} = \pmatrix{y_n\cr y_{n+1}\cr} \qquad
    u_n = \pmatrix{y_{n-1}\cr y_n\cr}
$$
</div>
<p>die vier Matrizen</p>
<div class=math>
$$
    A_0 = \pmatrix{0&-1\cr0&0\cr},\quad
    A_1 = \pmatrix{1&0\cr-1&1\cr},\quad
    B_0 = \pmatrix{0&-1\cr0&0\cr},\quad
    B_1 = \pmatrix{1&0\cr1&0\cr}.
$$
</div>
<p>Die Matrizen $A_1$, $A_0$, $B_1$ und $B_0$ sind natürlich nicht eindeutig.
An der Nichtinvertierbarkeit von $B_1$ ändert dies aber nichts.
Offensichtlich hat das Matrixpolynom $B_1\mu+B_0$, also hier das
verallgemeinerte Eigenwertproblem, einen Eigenwert bei unendlich
und damit ist das Verfahren natürlich nicht $A_\infty^0$-stabil.
An dieser Stelle werden auch die Überlegung bezüglich des singulären
Matrizenbüschels von Wichtigkeit.</p>
<p><strong>5.</strong> Es sei nocheinmal darauf hingewiesen, daß für die Ordnung $p=1$ und
$p=2$ keine originär neuen Formeln gesucht und damit auch nicht
gefunden werden konnte.
Es wurde tatsächlich dreimal hintereinander dasselbe Verfahren bei
den beiden niedrigsten Ordnungen als zyklisches Verfahren benutzt.
Im Hinblick darauf, daß sich die beiden Stabilitätsmerkmale, wie
Widlund-$\alpha$-Winkel, also $A_\infty[\alpha]$-Stabilität und
Widlund-Distanz, also $S_\infty[\delta]$-Stabilität, nicht weiter verbessern
lassen, wird dies verständlich.
Zudem bleibt damit auch der Wert $\gamma$={$\beta$}/{$\alpha$}, der
bei der Iterationsmatrix $W=I-h\gamma J$ wichtig wird, über den
gesamten Zyklus konstant, obwohl dies nicht so wesentlich ist, wie vermutet
werden könnte.
Kleinere Fehlerkonstanten und
Schrittweitenwechsel-Stabilitätseigenschaften
blieben bei der Auffindung der neuen zyklischen Formeln unberücksichtigt.</p>
<p><strong>6.</strong> Das Tschebyscheffsche-$\alpha$-Äquilibrierungsmaß $\mu$ einer linearen
Mehrschrittformel ist definiert durch</p>
<div class=math>
$$
    \mu = {1\over\left|\alpha_\kappa\right|} \max_{i=0}^\kappa
        \left( \left|\alpha_i\right|, \left|\beta_i\right| \right).
$$
</div>
<p>Hiermit wird ein erster Eindruck von der unterschiedlichen Gewichtung
einzelner Terme in dem Verfahrensausdruck vermittelt.</p>
<p>Die zyklischen Formeln von Tendler weisen annähernd ein Äquilibrierungsmaß
von $1:p$ auf, wobei $p$ die Ordnung des Zykluses ist.</p>
<p>Die BDF hingegen weisen annähernd ein Äquilibrierungsmaß von
$1:{p\over2}$ auf, welches also lediglich halb so groß ist,
wie die Äquilibrierungsmaße der Formeln von J.M. Tendler.</p>
<p>Diesem Punkte wurde beim Aufsuchen der Formeln keinerlei
Berücksichtigung zuteil.
Anders ist dies etwa bei den Formeln von <a href="https://doi.org/10.1002/zamm.19730530805">Filippi/Kraska (1973)</a>.</p>
<p>Hier wurden die Formeln durch Lösungen eines linearen Optimierungsproblems
bestimmt, wobei die Summe der Beträge der Koeffizienten der Verfahren
in der Zielfunktion auftauchten.
Die Formeln von Tischer (1983) (Dissertation) und
<a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>
weisen besonders ungünstige Äquilibrierungsmaße auf.
Die Maße bewegen sich von ca. $1:p^2$ bis zu ca. $1:2p^2$.</p>
<p><strong>7.</strong> Zusammenstellend noch die Werte</p>
<div class=math>
$$
    \gamma = \max_{i=1}^\ell {\beta_{ii}\over\alpha_{ii}},
$$
</div>
<p>welche wichtig sind für die Konvergenz der Picard-Iteration.
Die Werte sind auf eine Dezimale hinter dem Komma genau.</p>
<div class=math>
$$
\begin{array}{c|ccccccc}
p      & 1   & 2   & 3   & 4   & 5   & 6   & 7\cr
\hline
\gamma & 1.0 & 0.7 & 0.5 & 0.5 & 0.5 & 0.5 & 0.4\cr
\end{array}
$$
</div>
<p><strong>8.</strong> Es seien jetzt wieder nur die Tendlerschen Zyklen betrachtet.
Die Matrix $Q$ sei diejenige Matrix, wie sie bei der Umwandlung
von Ordinatenwerten in Werte für rückwärtsgenommene Differenzen auftaucht.
Durch Vormultiplikation mit der Matrix $VQ^\top V$, passenden
Ranges, mit $V=(\delta_{n+1-i,j})$, ergeben sich für die Ordinatenwerte
$y_{m\ell+i}$ die Werte in der folgenden Tabelle, also die Werte für die
Darstellung der Formeln in Form von rückwärtsgenommenen Differenzen.
Dieses sind jedoch noch nicht die Werte, die nachher wirklich
gespeichert werden.
Die Werte $z_{m\ell+i}$ bleiben hier unberücksichtigt, da sie nicht
in der Form rückwärtsgenommener Differenzen verwendet werden.
Dies liegt an der günstigen Eigenschaft der Tendlerschen Zyklen, daß die
skalierten Ableitungswerte niemals interpoliert zu werden brauchen.
Bei einem Schrittweitenwechsel muß ein Ableitungswert lediglich neu skaliert
werden.
Dies ist eine typische Eigenschaft der Tendlerschen Zyklen.
Für anders gebaute Zyklen gilt dies nämlich nicht so ohne weiteres.</p>
<div class=math>
$$
\begin{array}{c|c|c|c|c|c|c|c|c}
p & i & \nabla & \nabla^2 & \nabla^3 & \nabla^4 & \nabla^5 & \nabla^6 & \nabla^7\cr
\hline
1 & 1,2,3 & 1 & & & & & & \cr
\hline
2 & 1,2,3 & 2 & 1 & & & & & \cr
\hline
3 & 1,2 & 6 & 3 & 2 & & & &\cr
  & 3 & -6 & 9 & 0 & & & & \cr
\hline
4 & 1,2 & 12 & 6 & 4 & 3 & & &\cr
  & 3 & -60 & 138 & 4 & 11 & & &\cr
\hline
5 & 1,2 & 60 & 30 & 20 & 15 & 12 & &\cr
  & 3 & 540 & 390 & 180 & 145 & 118 & &\cr
  & 4 & -2760 & 3760 & -110 & 115 & 133 & &\cr
\hline
6 & 1 & 60 & 30 & 20 & 15 & 12 & 10 & \cr
  & 2 & 1140 & 630 & 410 & 305 & 243 & 202 & \cr
  & 3 & 720 & 1260 & 270 & 270 & 229 & 195 &\cr
  & 4 & -7380 & 8610 & 150 & 305 & 329 & -285 &\cr
\hline
7 & 1,2 & 420 & 210 & 140 & 105 & 84 & 70 & 60\cr
  & 3   & -1260 & 2430 & 510 & 405 & 313 & 252 & 210\cr
  & 4   & -5460 & 7350 & 3640 & 1365 & 1148 & 931 & 774\cr
\end{array}
$$
</div>
<p>Wegen der ersten Zeile der Matrix $Q^\top$ und der Konsistenzbedingung
$\rho(1)=0$, wird der Wert für $\nabla^0$ nicht mit vermerkt.
Die erste Stufe bei allen zyklischen Formeln ist die BDF und hier gilt</p>
<div class=math>
$$
    \sum_{i=1}^\kappa {1\over i}\nabla^i y_{n+1} = z_{n+1}.
$$
</div>
<p>Die Normierung von $\nabla y_{n+1}$ wird hier nicht gesondert durchgeführt.</p>
<p>Bibliographisch:</p>
<ol>
<li><a href="https://en.wikipedia.org/wiki/Felix_Gantmacher">Gantmacher, Felix R. (1908–1964)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Olof_B._Widlund">Widlund, Olof B. (*1938)</a></li>
<li><a href="https://de.wikipedia.org/wiki/Siegfried_Filippi">Filippi, Siegfried (1929—2022)</a></li>
<li><a href="https://www.semanticscholar.org/author/E.-Kraska/146622138">Kraska, E.</a></li>
</ol>
<h2>3. Die Fehlerfaktoren der Korrektorformeln<a id=fehlerfaktoren></a></h2>
<blockquote>
<p>The new methods presented were obtained solely on the basis of
optimizing the Widlund wedge angle associated with the method.
It is felt that attention should also be focused on simultaneously
minimizing the local discretization error. In addition, higher
stiffly stable methods should be derived.</p>
<p><a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">J.M. Tendler (1973)</a></p>
</blockquote>
<p>Nun seien die Beträge der Fehlerfaktoren der sieben zyklischen Verfahren
angegeben.
Zum Vergleich werden auch die Fehlerfaktoren der BDF angeschrieben.
Diese sind gerade die Fehlerfaktoren der ersten Stufe der 7 zyklischen
Verfahren.
Mit Fehlerfaktor $c_{i,p+1}$ wird hier die erste nichtverschwindende
Komponente des Matrix-Vektor-Produktes aus $C_{p+1,k}$ und den
Koeffizienten $(\alpha,\beta)^\top$ des Verfahrens bezeichnet,
skaliert mit einer entsprechenden Fakultät.
Es ist also</p>
<div class=math>
$$
    c_{i,p+1} := {1\over (p+1)!} C_{p+1,k}\pmatrix{\alpha\cr \beta\cr}.
$$
</div>
<p><strong>1.</strong> Die Fehlervektoren $\gamma_p$ für alle Ordnungen $p=1,\ldots,7$
und alle Stufen, lauten exakt ausgerechnet wie in der Tabelle sichtbar.</p>
<div class=math>
$$
\begin{array}{c|rrrrrrr}
p & 1 & 2 & 3 & 4 & 5 & 6 & 7\cr
\hline
c_{1,p+1} & \displaystyle{-{1\over2}} & \displaystyle{-{2\over3}} & \displaystyle{-{3\over2}} & \displaystyle{-{12\over5}} & -10 & \displaystyle{-{60\over7}}   & \displaystyle{-{105\over2}}\cr
c_{2,p+1} & \displaystyle{-{1\over2}} & \displaystyle{-{2\over3}} & \displaystyle{-{3\over2}} & \displaystyle{-{12\over5}} & -10 & \displaystyle{-{1210\over7}} & \displaystyle{-{105\over2}}\cr
c_{3,p+1} & \displaystyle{-{1\over2}} & \displaystyle{-{2\over3}} & \displaystyle{-{1\over2}} & -10         & -99 & \displaystyle{-{1182\over7}} & \displaystyle{-{2515\over14}}\cr
c_{4,p+1} & * & * & * & * & \displaystyle{-{239\over2}} & \displaystyle{-{1699\over7}} & \displaystyle{-{1319\over2}}\cr
\end{array}
$$
</div>
<p><strong>2.</strong> Normiert man stufenweise den führenden Koeffizienten des Verfahrens auf eins,
so normieren sich entsprechend die Werte $c_{i,p+1}$, für $i=1,\ldots,\ell$.
Für die zyklischen Formeln von Tendler ergeben sich dann nach kurzer
Rechnung, die Werte in der entsprechenden Tabelle.</p>
<div class=math>
$$
\begin{array}{c|rrrrrrr}
p && 1 & 2 & 3 & 4 & 5 & 6 & 7 \cr
\hline
{c_{1,p+1}/\alpha_{11}} && -0.5 & -0.\overline{2} & -0.1\overline{36} & -0.096 & -0.07299 & -0.05831 & -0.04821\cr
{c_{2,p+1}/\alpha_{22}} && -0.5 & -0.\overline{2} & -0.1\overline{36} & -0.096 & -0.07299 & -0.05900 & -0.04821\cr
{c_{3,p+1}/\alpha_{33}} && -0.5 & -0.\overline{2} & -0.1\overline{6}  & -0.1075 &-0.07210 & -0.05736 & -0.06281\cr
{c_{4,p+1}/\alpha_{44}} && * & * & * & * & -0.1032 & -0.1056 & -0.067654\cr
\end{array}
$$
</div>
<p><strong>3.</strong> Zur Gegenüberstellung nun die gleichen Fehlerfaktoren diesmal jedoch
skaliert mit dem Kehrwert der Summe der $\beta$-Koeffizienten, was
gerade zur Fehlerkonstante von <a href="https://en.wikipedia.org/wiki/Peter_Henrici_(mathematician)">Henrici</a> führt.
Man beachte, daß hier erneut stets stufenweise die Fehlerfaktoren gebildet
wurden.</p>
<div class=math>
$$
\begin{array}{c|ccccccc}
p & 1 & 2 & 3 & 4 & 5 & 6 & 7\cr
\hline
{c_{1,p+1}/\sigma_{1}(1)} & -0.5 & -0.\overline{3} & -0.25            & -0.2            & -0.1\overline{6} & -0.14286 & -0.125\cr
{c_{2,p+1}/\sigma_{2}(1)} & -0.5 & -0.\overline{3} & -0.25            & -0.2            & -0.1\overline{6} & -0.15163 & -0.125\cr
{c_{3,p+1}/\sigma_{3}(1)} & -0.5 & -0.\overline{3} & 0.08\overline{3} & 0.1\overline{6} & -0.18\overline{3}& -0.23452 & 0.14257\cr
{c_{4,p+1}/\sigma_{4}(1)} & * & *            & *             & *            & 0.0433           & 0.03289 & 0.12079\cr
\end{array}
$$
</div>
<p>Auffällig ist, daß die Tabellenwerte betragsmässig leicht äquilibrierter
erscheinen und im ganzen gesehen, etwas größer geworden sind.
Natürlich gilt hier immer $\sigma_{ip}(1)\ne0$, für alle Stufen
$i=1,\ldots,\ell$ und alle Ordnungen $p=1,\ldots,7$.
Das heißt, 1 ist einfache Wurzel jeder Stufe, nicht notwendig die
betragsmässig größte.</p>
<p><strong>4.</strong> Übersichtlich zum Vergleich gegenübergestellt, werden jetzt die zyklusweise
gebildeten Fehlerkonstanten von Henrici aufgeführt.
Man beachte, daß diese Konstante jeweils immer zyklusweise gebildet wird.
Die Werte lauten für alle Ordnungen $p=1,\ldots,7$:</p>
<div class=math>
$$
\begin{array}{c|ccccccc}
p   & 1 & 2 & 3 & 4 & 5 & 6 & 7\cr
\hline
C_p & -1.5 & -1 & -3.75 & -1.419 148 9 & -1.687 203 & -1.632 069 7 & -0.684 573\cr
\end{array}
$$
</div>
<p>Diese Konstanten sind nun betragsmässig am größten, von allen bisher
angegebenen Konstanten.
Auffallend ist hier die Konstante für die Ordnung $p=3$.</p>
<p><strong>5.</strong> Um einen Überblick über die Größenordnungen zu erhalten, seien
auch die Fehlerkonstanten der Adams-Moulton-Verfahren
in der folgenden Tabelle angeschrieben.</p>
<div class=math>
$$
\begin{array}{c|ccccccc}
p   & 1 & 2 & 3 & 4 & 5 & 6 & 7\cr
\hline
C_p & -0.5 & -0.833 & -0.0417 & -0.0264 & -0.0188 & -0.0143 & -0.0114\cr
\end{array}
$$
</div>
<p>Wegen $\rho'(1)=\sigma(1)=1$ und $\alpha_k=1$ stimmen alle drei
verschiedenen Arten an Fehlerkonstanten überein.
Vergleicht man nun alle bisher angegebenen Konstanten, so muß man beachten
vor welcher $h$-Potenz diese Konstanten stehen.
Beispielsweise führt bei einem Verfahren siebenter Ordnung eine
Halbierung der Schrittweite asymptotisch betrachtet, zu einer
Erhöhung der “Genauigkeit” um den Faktor 256.
Überdies ist der Unterschied zwischen einem Verfahren $p$-ter und
$(p+1)$-ter Ordnung nur gering, falls die Schrittweite variabel sein kann.
Ist das Verfahren $p$-ter Ordnung nicht mehr ausreichend genau genug,
so ist es gerade die zentrale Aufgabe der Ordnungssteuerung dies zu erkennen
und durch Wahl einer passenderen Ordnung, den Genauigkeitsverlust wieder
auszugleichen.
Weiterhin beachte man die Wachstumseigenschaften der Fehlerkonstante
von Henrici bei mehrfacher Wiederholung einer Stufe.</p>
<p>Bibliographisch:</p>
<ol>
<li><a href="https://en.wikipedia.org/wiki/John_Couch_Adams">John Couch Adams (1819–1892)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Forest_Ray_Moulton">Forest Ray Moulton (1872–1952)</a></li>
</ol>
<h2>4. Die Stabilitätseigenschaften der Korrektorformeln<a id=stabilitaetseigenschaften></a></h2>
<blockquote>
<p>While methods suitable for non-stiff problems, $\ldots$, are easy to
find and to analyse, methods appropriate for stiff problems seem
to be able to hide their presence much more successfully.
However, there are such methods $\ldots$</p>
<p>J.C. Butcher (1987)</p>
</blockquote>
<p>Zum Vergleich seien die Werte für den Widlund-$\alpha$-Winkel der
Formeln von J.M. Tendler mit denen der BDF in der untenstehenden Tabelle
gegenübergestellt.
Man beachte, daß die BDF7 nicht mehr $D$-stabil ist, erst recht also nicht
mehr $A_\infty[\alpha]$-stabil.
Rechts daneben ist auch eine Gegenüberstellung der
Widlund Distanzen $\delta$, bei der $S_{\infty}[\delta]$-Stabilität.</p>
<p>Widlund-$\alpha$-Winkel.
Für die Berechnung der Winkel der BDF vgl. man <a href="https://www.researchgate.net/publication/334193899_Optimal_subsets_in_the_stability_regions_of_multistep_methods">Lajos Lóczi1 (2019)</a> und
<a href="https://doi.org/10.1007/s10543-019-00768-1">Akrivis/Katsoprinakis (2019): Maximum angles of $A(\vartheta)$-stability of backward difference formulae</a>, <a href="https://www.cs.uoi.gr/~akrivis/AK2a.pdf">PDF</a>.</p>
<table>
<thead>
<tr>
<th><em>p</em></th>
<th>TENDLER</th>
<th>BDF</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>90.00</td>
<td>90.00</td>
</tr>
<tr>
<td>2</td>
<td>90.00</td>
<td>90.00</td>
</tr>
<tr>
<td>3</td>
<td>89.43</td>
<td>86.03</td>
</tr>
<tr>
<td>4</td>
<td>80.88</td>
<td>73.35</td>
</tr>
<tr>
<td>5</td>
<td>77.48</td>
<td>51.84</td>
</tr>
<tr>
<td>6</td>
<td>63.25</td>
<td>17.84</td>
</tr>
<tr>
<td>7</td>
<td>33.53</td>
<td>*</td>
</tr>
</tbody>
</table>
<p>Widlund-Distanz $\delta$.</p>
<table>
<thead>
<tr>
<th><em>p</em></th>
<th align="right">TENDLER</th>
<th align="right">BDF</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td align="right">0.0000</td>
<td align="right">0.0</td>
</tr>
<tr>
<td>2</td>
<td align="right">0.0000</td>
<td align="right">0.0</td>
</tr>
<tr>
<td>3</td>
<td align="right">0.0048</td>
<td align="right">0.083</td>
</tr>
<tr>
<td>4</td>
<td align="right">0.2400</td>
<td align="right">0.67</td>
</tr>
<tr>
<td>5</td>
<td align="right">1.4000</td>
<td align="right">2.3</td>
</tr>
<tr>
<td>6</td>
<td align="right">2.9000</td>
<td align="right">6.1</td>
</tr>
<tr>
<td>7</td>
<td align="right">10.2000</td>
<td align="right">*</td>
</tr>
</tbody>
</table>
<p>Die Definition der Begriffe Widlund-Winkel, Widlund-Distanz,
$A_\infty[\alpha]$-Stabilität, $S_\infty[\delta]$-Stabilität findet man
bei <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a>
und <a href="https://dl.acm.org/doi/pdf/10.1145/356502.356495">Tendler/Bickart/Picel (1978)</a>,
aber sinngemäß auch bei Albrecht (1979), §7.2., und
weiteren Autoren.</p>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Bibliographisch:</p>
<ol>
<li><a href="https://en.wikipedia.org/wiki/John_C._Butcher">Butcher, John Charles (*1933)</a></li>
<li>Albrecht, Peter: “<a href="https://www.amazon.de/numerische-Behandlung-gew%C3%B6hnlicher-Differentialgleichungen-Ber%C3%BCcksichtigung/dp/3112728440?__mk_de_DE">Die numerische Behandlung gewöhnlicher
Differentialgleichungen — Eine Einführung unter besonderer
Berücksichtigung zyklischer Verfahren</a>”, Carl Hanser Verlag, München
Wien, 1979, <em>xi</em>+193 S.</li>
<li>Albrecht, Peter: “<a href="https://juser.fz-juelich.de/record/842404/files/J%C3%BCl_1274_Albrecht.pdf?version=1">Numerische Behandlung gewöhnlicher Differentialgleichungen</a>”,
Jül-1274, Februar 1976, Berichte der Kernforschungsanlage Jülich, Institut für Festkörperforschung,
<a href="https://eklausmeier.goip.de/pdf/J%C3%BCl_1274_Albrecht.pdf">Kopie</a></li>
</ol>
<h2>5. Die sieben Prädiktorformeln<a id=praediktorformeln></a></h2>
<blockquote>
<p>The difficulty of resolving various other questions concerned with
incorporating general linear methods into practical software
should not be underestimated.</p>
<p>John C. Butcher (1987)</p>
</blockquote>
<p>Es seien jetzt noch die Prädiktorformeln angegeben.
Bei ihnen handelt es sich um nichts anderes als die expliziten BDF.
Diese Formeln sind für Ordnungen $p&gt;2$ nicht mehr $D$-stabil,
d.h. sie dürfen nicht alleinstehend ohne einen Korrektor verwendet werden.
Das Verfahren erster Ordnung ist natürlich nichts anderes als das
explizite Eulerverfahren $y_{n+1}=y_n+hf_n$, und die Prädiktorformel zweiter
Ordnung ist die (explizite) Mittelpunktsregel $y_{n+1}=y_{n-1}+2hf_n$
(= explizite Nyström-Formel zweiter Ordnung).</p>
<p>Die Angabe der Werte geschieht zunächst in der Form</p>
<div class=math>
$$
    y_{n+1}^0 = \alpha_ny_n+\cdots+\alpha_{n-p+1}y_{n-p+1}+\beta_nz_n.
$$
</div>
<p>für die Ordnungen $p=1,\ldots,7$.
Die Werte $\beta_{n-i}$ für $i&gt;0$ sind sämtlich Null, d.h. heißt es werden
vom Prädiktor keine weiteren vergangenen skalierten Ableitungen benutzt.</p>
<p>Zuerst nun die Werte $\alpha_{n-i}$ und $\beta_n$ in der obigen
Darstellung mit gewöhnlichen Ordinatenwerten $y_{m\ell+i}$, siehe erste
Tabelle.</p>
<div class=math>
$$
\begin{array}{c|c|r|r|r|r|r|r|r}
k & z_n & y_n & y_{n-1} & y_{n-2} & y_{n-3} & y_{n-4} & y_{n-5} & y_{n-6} \cr\hline
1 & 1 & 1 & & & & & & \cr\hline
2 & 2 & 0 & 1 & & & & & \cr\hline
3 & 3 & \displaystyle{-{3\over2}} & \displaystyle{6\over2} & \displaystyle{-{1\over2}} & & & & \cr\hline
4 & 4 & \displaystyle{-{10\over3}} & \displaystyle{18\over3} & \displaystyle{-{6\over3}} & \displaystyle{1\over3} & & & \cr\hline
5 & 5 & \displaystyle{-{65\over12}} & \displaystyle{120\over12} & \displaystyle{-{60\over12}} & \displaystyle{20\over12} & \displaystyle{-{3\over12}} & & \cr\hline
6 & 6 & \displaystyle{-{77\over10}} & \displaystyle{150\over10} & \displaystyle{-{100\over10}} & \displaystyle{50\over10} & \displaystyle{-{15\over10}} & \displaystyle{2\over10} & \cr\hline
7 & 7 & \displaystyle{-{609\over60}} & \displaystyle{1260\over60} & \displaystyle{-{1050\over60}} & \displaystyle{700\over60} & \displaystyle{-{315\over60}} & \displaystyle{84\over60} & \displaystyle{-{10\over60}} \cr
\end{array}
$$
</div>
<p>Die Darstellung der Prädiktorformeln in Form von rückwärtsgenommenen
Differenzen, also in der Darstellungsform</p>
<div class=math>
$$
    y_{n+1} = \tilde\alpha_n \nabla^0y_n  +  \cdots  +
        \tilde\alpha_{n-p+1} \nabla^{p-1}y_n  +  \beta_n z_n
$$
</div>
<p>für die Ordnungen $p=1,\ldots,7$, entnimmt man der zweiten Tabelle.</p>
<div class=math>
$$
\begin{array}{c|c|r|r|r|r|r|r|r}
k & z_n & \nabla^0 & \nabla & \nabla^2 & \nabla^3 & \nabla^4 & \nabla^5 & \nabla^6 \cr\hline
1 & 1 & 1 & & & & & & \cr\hline
2 & 2 & 1 & -1 & & & & & \cr\hline
3 & 3 & 1 & -2 & \displaystyle{-{1\over2}} && & & & \cr\hline
4 & 4 & 1 & -3 & \displaystyle{-{2\over2}} & \displaystyle{-{1\over3}} & & & \cr\hline
5 & 5 & 1 & -4 & \displaystyle{-{3\over2}} & \displaystyle{-{2\over3}} & \displaystyle{-{1\over4}} && & \cr\hline
6 & 6 & 1 & -5 & \displaystyle{-{4\over2}} & \displaystyle{-{3\over3}} & \displaystyle{-{2\over4}} & \displaystyle{-{1\over5}} & \cr\hline
7 & 7 & 1 & -6 & \displaystyle{-{5\over2}} & \displaystyle{-{4\over3}} & \displaystyle{-{3\over4}} & \displaystyle{-{2\over5}} & \displaystyle{-{1\over6}} \cr
\end{array}
$$
</div>
<p>In kompakter Form seien noch diejenigen Werte angegeben, die auch
tatsächlich im Programm TENDLER benutzt werden, wenn auch nicht in dieser
kompakten Form.
An späterer Stelle wird nocheinmal kurz auf die Herleitung dieser
Koeffizienten eingegangen.
Die nachstehende Tabelle enthält in gewisser Hinsicht ein “Gemisch” von
Prädiktor- und Korrektorformeln.
Dabei werden für $y$ rückwärtsgenommene Differenzen verwendet, für $z$ jedoch
<em>nicht</em>.</p>
<div class=math>
$$
\begin{array}{c|c| r|r|r|r|r|r |c|c|r}
k & i & \nabla & \nabla^2 & \nabla^3 & \nabla^4 & \nabla^5 & \nabla^6 &
    z_1 & z_0 & z_{-1} \cr\hline
%-----------------------------------------------
1 & 1,2,3 & & & & & &   & 1 & & \cr\hline
%-----------------------------------------------
2 & 1,2,3 & {-2} & & & & &   & 3 & & \cr\hline
%-----------------------------------------------
3 & 1,2 & \displaystyle{-{9\over2}} & \displaystyle{-{5\over4}} & & & &  & \displaystyle{11\over2} & & \cr\hline
3 & 3 & \displaystyle{-{15\over2}} & \displaystyle{-{3\over4}} & & & &   & \displaystyle{13\over2} & 2 & \cr\hline
%-----------------------------------------------
4 & 1,2 & \displaystyle{-{22\over3}} & \displaystyle{-{8\over3}} & \displaystyle{-{17\over18}} & & &  & \displaystyle{25\over3} & & \cr\hline
4 & 3 & -9 & \displaystyle{-{9\over4}} & \displaystyle{-{7\over8}} & & &   & \displaystyle{35\over4} & \displaystyle{5\over4} & & \cr\hline
%-----------------------------------------------
5 & 1,2 & \displaystyle{-{125\over12}} & \displaystyle{-{101\over24}} & \displaystyle{-{71\over36}} & \displaystyle{-{37\over48}} & &  &
  \displaystyle{137\over12} & & \cr\hline
5 & 3 & \displaystyle{-{253\over24}} & \displaystyle{-{1001\over240}} & \displaystyle{-{707\over360}} & \displaystyle{-{123\over160}} & &  &
  \displaystyle{1373\over120} & \displaystyle{1\over10} & \cr\hline
5 & 4 & \displaystyle{-{57\over4}} & \displaystyle{-{25\over8}} & \displaystyle{-{17\over10}} & \displaystyle{-{169\over240}} & &  &
  \displaystyle{61\over5} & \displaystyle{31\over10} & \displaystyle{-{1\over20}} \cr\hline
%-----------------------------------------------
6 & 1,2 & \displaystyle{-{137\over10}} & \displaystyle{-{117\over20}} & \displaystyle{-{46\over15}} & \displaystyle{-{191\over120}} & \displaystyle{-{197\over300}} & &
  \displaystyle{147\over10} & & \cr\hline
6 & 3 & \displaystyle{-{353\over25}} & \displaystyle{-{571\over100}} & \displaystyle{-{1819\over600}} & \displaystyle{-{79\over50}} & \displaystyle{-{3919\over6000}} & &
  \displaystyle{1477\over100} & \displaystyle{7\over20} & \cr\hline
6 & 4 & \displaystyle{-{3529\over200}} & \displaystyle{-{1889\over400}} & \displaystyle{-{1609\over600}} & \displaystyle{-{3527\over2400}} & \displaystyle{-{931\over1500}} & &
    \displaystyle{3079\over200} & \displaystyle{17\over5} & \displaystyle{-{3\over20}} \cr\hline
%-----------------------------------------------
7 & 1,2 & \displaystyle{-{343\over20}} & \displaystyle{-{303\over40}} & \displaystyle{-{253\over60}} & \displaystyle{-{589\over240}} & \displaystyle{-{101\over75}} & \displaystyle{-{23\over40}} &
  \displaystyle{363\over20} & & \cr\hline
7 & 3 & \displaystyle{-{266\over15}} & \displaystyle{-{221\over30}} & \displaystyle{-{749\over180}} & \displaystyle{-{73\over30}} & \displaystyle{-{803\over600}} & \displaystyle{-{103\over180}} &
  \displaystyle{547\over30} & \displaystyle{1\over2} & \cr\hline
7 & 4 & \displaystyle{-{1316\over75}} & \displaystyle{-{1151\over150}} & \displaystyle{-{3689\over900}} & \displaystyle{-{121\over50}} & \displaystyle{-{4003\over3000}} & \displaystyle{-{257\over450}} &
  \displaystyle{2737\over150} & \displaystyle{1\over2} & \displaystyle{-{1\over5}} \cr\hline
\end{array}
$$
</div>
<p>Hierbei beachte man, daß die Werte in Tendler/Bickart/Picel (1976)
für $p=6$, $i=4$ nicht sämtlich richtig sind.
In dem Programm STINT und auch in dem Programm DIFJMT werden jedoch die
korrekten Werte gespeichert.</p>
<p>Bibliographisch:</p>
<ol>
<li>Tendler, J.M. + Bickart, Th. + Picel, Z.: “STINT: STiff ordinary differential equations INTegrator.
Program and User Manual”,
Electrical and Computer Engineering Department, Syracuse University,
Syracuse, New York 13210, USA, and Department of Electrical Engineering,
Delft University of Technology, Delft, The Netherlands,
Technical Report TR-76-12, December 1976, <em>ii</em>+85 S.</li>
</ol>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/03-09-stiffness-in-neural-networks</link>
		<guid>https://eklausmeier.goip.de/blog/2025/03-09-stiffness-in-neural-networks</guid>
		<title>Stiffness in Neural Networks</title>
		<category>mathematics</category>
		<pubDate>Sun, 09 Mar 2025 18:30:00 +0100</pubDate>
		<description><![CDATA[
<p>In below two posts I had already mentioned the close connection between neural networks and solving stiff ordinary differential equations:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2023/06-07-neural-networking-training-using-stiff-ode-solvers">Neural Network Training using Stiff ODE Solvers</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2020/06-30-reply-to-neural-network-back-propagation-revisited-with-ordinary-differential-equations">Reply to: Neural Network Back-Propagation Revisited with Ordinary Differential Equations</a></li>
</ol>
<p>Below threedimensional graph shows different frequencies, and when solving for the global maximum there are very many local maxima in the way.</p>
<div class=math>
$$
    z = f(x,y) = e^{-(x^2+y^2)/25} \sin {\pi\over2}x \cos {\pi\over2}x
$$
</div>
<p>In this case you want the stiff solver to ignore the high frequency solutions, but just follow the low frequency solution, thereby going straight to the global maximum.</p>
<div class="chartarea" id="container1"></div>
<p>The above graph is similar to an egg carton.</p>
<p><img src="https://eklausmeier.goip.de/img/EggCarton1.webp" alt=""></p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/03-06-building-j-pilot-and-pilot-link-on-linux</link>
		<guid>https://eklausmeier.goip.de/blog/2025/03-06-building-j-pilot-and-pilot-link-on-linux</guid>
		<title>Building J-Pilot and Pilot-Link on Linux</title>
		<category>J-Pilot</category>
		<category>Linux</category>
		<pubDate>Thu, 06 Mar 2025 20:30:00 +0100</pubDate>
		<description><![CDATA[
<p>I was asked how I build <a href="https://www.jpilot.org">J-Pilot</a> and Pilot-Link on Linux.</p>
<ul>
<li><a href="#jpilot">1. J-Pilot</a></li>
<li><a href="#pilotlink">2. Pilot-Link</a></li>
</ul>
<p>J-Pilot (<a href="https://en.wikipedia.org/wiki/J-Pilot">Wikipedia</a>) is a graphical application to manage</p>
<ul>
<li>dates and appointments</li>
<li>addresses</li>
<li>to-do's</li>
<li>memos of all sorts</li>
<li>various plugins, e.g., expenses</li>
</ul>
<p><img src="https://eklausmeier.goip.de/img/jpilot-landing.png" alt="Photo"></p>
<p>J-Pilot was written by <a href="https://www.linkedin.com/in/juddmontgomery">Judd Montgomery</a>.</p>
<h2>1. J-Pilot<a id=jpilot></h2>
<p>Below are all the steps to build J-Pilot on <a href="https://archlinux.org">Arch Linux</a>, assuming Pilot-Link is already installed, because you need the header files of Pilot-Link for building J-Pilot.</p>
<p>I just built in <code>/tmp</code> because this happens to be in RAM on Arch Linux and is therefore quite fast.</p>
<pre><code class="language-bash">klm@chieftec /tmp: git clone git@github.com:juddmon/jpilot.git
Cloning into 'jpilot'...
remote: Enumerating objects: 11777, done.
remote: Counting objects: 100% (470/470), done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 11777 (delta 300), reused 388 (delta 282), pack-reused 11307 (from 1)
Receiving objects: 100% (11777/11777), 9.71 MiB | 9.07 MiB/s, done.
Resolving deltas: 100% (8805/8805), done.
klm@chieftec /tmp: cd jpilot
</code></pre>
<p>Content of repository.</p>
<pre><code class="language-bash">klm@chieftec /tmp/jpilot: ls -alF
total 4944
drwxr-xr-x 13 klm  klm    2480 Mar  6 09:02 ./
drwxrwxrwt 15 root root    360 Mar  6 09:02 ../
-rw-r--r--  1 klm  klm   79584 Mar  6 09:02 ABOUT-NLS
-rw-r--r--  1 klm  klm   15486 Mar  6 09:02 address.c
-rw-r--r--  1 klm  klm  195960 Mar  6 09:02 address_gui.c
-rw-r--r--  1 klm  klm    3527 Mar  6 09:02 address.h
-rw-r--r--  1 klm  klm   31590 Mar  6 09:02 alarms.c
-rw-r--r--  1 klm  klm    1328 Mar  6 09:02 alarms.h
-rw-r--r--  1 klm  klm    3193 Mar  6 09:02 AUTHORS
-rwxr-xr-x  1 klm  klm     985 Mar  6 09:02 autogen.sh*
-rw-r--r--  1 klm  klm    2024 Mar  6 09:02 BUGS
-rw-r--r--  1 klm  klm   18635 Mar  6 09:02 calendar.c
-rw-r--r--  1 klm  klm    2633 Mar  6 09:02 calendar.h
-rw-r--r--  1 klm  klm   37367 Mar  6 09:02 category.c
-rw-r--r--  1 klm  klm   19586 Mar  6 09:02 ChangeLog
-rw-r--r--  1 klm  klm   19582 Mar  6 09:02 configure.in
-rw-r--r--  1 klm  klm   22486 Mar  6 09:02 contact.c
-rw-r--r--  1 klm  klm   17992 Mar  6 09:02 COPYING
-rw-r--r--  1 klm  klm    3599 Mar  6 09:02 cp1250.c
-rw-r--r--  1 klm  klm    1156 Mar  6 09:02 cp1250.h
-rw-r--r--  1 klm  klm     401 Mar  6 09:02 .cvsignore
-rw-r--r--  1 klm  klm   35669 Mar  6 09:02 dat.c
-rw-r--r--  1 klm  klm   27453 Mar  6 09:02 datebook.c
-rw-r--r--  1 klm  klm  235733 Mar  6 09:02 datebook_gui.c
-rw-r--r--  1 klm  klm    4833 Mar  6 09:02 datebook.h
-rw-r--r--  1 klm  klm     335 Mar  6 09:02 description-pak
drwxr-xr-x  2 klm  klm     120 Mar  6 09:02 dialer/
-rw-r--r--  1 klm  klm   13964 Mar  6 09:02 dialer.c
drwxr-xr-x  2 klm  klm     580 Mar  6 09:02 docs/
drwxr-xr-x  2 klm  klm     300 Mar  6 09:02 empty/
drwxr-xr-x  2 klm  klm     100 Mar  6 09:02 Expense/
-rw-r--r--  1 klm  klm   12981 Mar  6 09:02 export_gui.c
-rw-r--r--  1 klm  klm    2047 Mar  6 09:02 export.h
-rw-r--r--  1 klm  klm    2494 Mar  6 09:02 font.c
-rw-r--r--  1 klm  klm    9470 Mar  6 09:02 gettext.h
drwxr-xr-x  7 klm  klm     240 Mar  6 09:02 .git/
-rw-r--r--  1 klm  klm     642 Mar  6 09:02 .gitignore
-rw-r--r--  1 klm  klm    1283 Mar  6 09:02 i18n.h
drwxr-xr-x  2 klm  klm     400 Mar  6 09:02 icons/
-rw-r--r--  1 klm  klm   14841 Mar  6 09:02 import_gui.c
-rw-r--r--  1 klm  klm   15766 Mar  6 09:02 INSTALL
-rw-r--r--  1 klm  klm   16768 Mar  6 09:02 install_gui.c
-rw-r--r--  1 klm  klm    9608 Mar  6 09:02 install_user.c
-rw-r--r--  1 klm  klm    1063 Mar  6 09:02 install_user.h
-rw-r--r--  1 klm  klm    7150 Mar  6 09:02 japanese.c
-rw-r--r--  1 klm  klm    1202 Mar  6 09:02 japanese.h
-rw-r--r--  1 klm  klm    2467 Mar  6 09:02 jp-contact.c
-rw-r--r--  1 klm  klm   76522 Mar  6 09:02 jpilot.c
-rw-r--r--  1 klm  klm  684119 Mar  6 09:02 jpilotcss.blue
-rw-r--r--  1 klm  klm    8750 Mar  6 09:02 jpilotcss.default
-rw-r--r--  1 klm  klm  684118 Mar  6 09:02 jpilotcss.green
-rw-r--r--  1 klm  klm  684118 Mar  6 09:02 jpilotcss.purple
-rw-r--r--  1 klm  klm  684118 Mar  6 09:02 jpilotcss.steel
-rw-r--r--  1 klm  klm     169 Mar  6 09:02 jpilot.desktop
-rw-r--r--  1 klm  klm   71820 Mar  6 09:02 jpilot-dump.c
-rw-r--r--  1 klm  klm    1110 Mar  6 09:02 jpilot.h
-rw-r--r--  1 klm  klm    9877 Mar  6 09:02 jpilot-merge.c
-rw-r--r--  1 klm  klm    4906 Mar  6 09:02 jpilotrc.blue
-rw-r--r--  1 klm  klm    2595 Mar  6 09:02 jpilotrc.default
-rw-r--r--  1 klm  klm    4367 Mar  6 09:02 jpilotrc.green
-rw-r--r--  1 klm  klm    5283 Mar  6 09:02 jpilotrc.purple
-rw-r--r--  1 klm  klm    4993 Mar  6 09:02 jpilotrc.steel
-rw-r--r--  1 klm  klm    5011 Mar  6 09:02 jpilot.spec.in
-rw-r--r--  1 klm  klm    9043 Mar  6 09:02 jpilot-sync.c
-rw-r--r--  1 klm  klm    1204 Mar  6 09:02 jpilot.xpm
-rw-r--r--  1 klm  klm    2073 Mar  6 09:02 jp-pi-contact.h
drwxr-xr-x  2 klm  klm     100 Mar  6 09:02 jpsqlite/
drwxr-xr-x  2 klm  klm     120 Mar  6 09:02 KeyRing/
-rw-r--r--  1 klm  klm   25866 Mar  6 09:02 libplugin.c
-rw-r--r--  1 klm  klm   11324 Mar  6 09:02 libplugin.h
-rw-r--r--  1 klm  klm   86295 Mar  6 09:02 libsqlite.c
-rw-r--r--  1 klm  klm    2889 Mar  6 09:02 libsqlite.h
-rw-r--r--  1 klm  klm    6094 Mar  6 09:02 log.c
-rw-r--r--  1 klm  klm    1935 Mar  6 09:02 log.h
drwxr-xr-x  2 klm  klm     280 Mar  6 09:02 m4/
-rw-r--r--  1 klm  klm    4781 Mar  6 09:02 Makefile.am
-rw-r--r--  1 klm  klm   10269 Mar  6 09:02 memo.c
-rw-r--r--  1 klm  klm   72251 Mar  6 09:02 memo_gui.c
-rw-r--r--  1 klm  klm    1492 Mar  6 09:02 memo.h
-rwxr-xr-x  1 klm  klm    3514 Mar  6 09:02 mkinstalldirs*
-rw-r--r--  1 klm  klm   18430 Mar  6 09:02 monthview_gui.c
-rw-r--r--  1 klm  klm       0 Mar  6 09:02 NEWS
-rw-r--r--  1 klm  klm    9129 Mar  6 09:02 otherconv.c
-rw-r--r--  1 klm  klm    1524 Mar  6 09:02 otherconv.h
-rw-r--r--  1 klm  klm   10509 Mar  6 09:02 password.c
-rw-r--r--  1 klm  klm    1702 Mar  6 09:02 password.h
-rw-r--r--  1 klm  klm    2875 Mar  6 09:02 pidfile.c
-rw-r--r--  1 klm  klm    1076 Mar  6 09:02 pidfile.h
-rw-r--r--  1 klm  klm    2797 Mar  6 09:02 pi-task.h
-rw-r--r--  1 klm  klm   13382 Mar  6 09:02 plugins.c
-rw-r--r--  1 klm  klm    2819 Mar  6 09:02 plugins.h
drwxr-xr-x  2 klm  klm     520 Mar  6 09:02 po/
-rw-r--r--  1 klm  klm   26864 Mar  6 09:02 prefs.c
-rw-r--r--  1 klm  klm   38779 Mar  6 09:02 prefs_gui.c
-rw-r--r--  1 klm  klm    1011 Mar  6 09:02 prefs_gui.h
-rw-r--r--  1 klm  klm    6367 Mar  6 09:02 prefs.h
-rw-r--r--  1 klm  klm   40224 Mar  6 09:02 print.c
-rw-r--r--  1 klm  klm   12070 Mar  6 09:02 print_gui.c
-rw-r--r--  1 klm  klm    2847 Mar  6 09:02 print.h
-rw-r--r--  1 klm  klm   37995 Mar  6 09:02 print_headers.c
-rw-r--r--  1 klm  klm    1216 Mar  6 09:02 print_headers.h
-rw-r--r--  1 klm  klm   32340 Mar  6 09:02 print_logo.c
-rw-r--r--  1 klm  klm    1029 Mar  6 09:02 print_logo.h
-rw-r--r--  1 klm  klm    6490 Mar  6 09:02 README
-rw-r--r--  1 klm  klm    2214 Mar  6 09:02 README.md
-rwxr-xr-x  1 klm  klm     373 Mar  6 09:02 reconf*
-rw-r--r--  1 klm  klm   15482 Mar  6 09:02 restore_gui.c
-rw-r--r--  1 klm  klm    1062 Mar  6 09:02 restore.h
-rw-r--r--  1 klm  klm    4695 Mar  6 09:02 russian.c
-rw-r--r--  1 klm  klm    1166 Mar  6 09:02 russian.h
-rw-r--r--  1 klm  klm   26316 Mar  6 09:02 search_gui.c
-rwxr-xr-x  1 klm  klm    3998 Mar  6 09:02 SlackBuild.in*
-rw-r--r--  1 klm  klm    1890 Mar  6 09:02 stock_buttons.h
-rw-r--r--  1 klm  klm  128907 Mar  6 09:02 sync.c
-rw-r--r--  1 klm  klm    1902 Mar  6 09:02 sync.h
drwxr-xr-x  2 klm  klm     100 Mar  6 09:02 SyncTime/
-rw-r--r--  1 klm  klm   12280 Mar  6 09:02 task.c
-rw-r--r--  1 klm  klm     404 Mar  6 09:02 TODO
-rw-r--r--  1 klm  klm   13885 Mar  6 09:02 todo.c
-rw-r--r--  1 klm  klm  106957 Mar  6 09:02 todo_gui.c
-rw-r--r--  1 klm  klm    2359 Mar  6 09:02 todo.h
-rw-r--r--  1 klm  klm  120331 Mar  6 09:02 utils.c
-rw-r--r--  1 klm  klm   18441 Mar  6 09:02 utils.h
-rw-r--r--  1 klm  klm   13742 Mar  6 09:02 weekview_gui.c
</code></pre>
<p>We do not run <code>configure</code> but <code>autogen.sh</code>.</p>
<pre><code class="language-bash">klm@chieftec /tmp/jpilot: time ./autogen.sh
+ rm -f configure Makefile Makefile.in config.h.in
+ autopoint --force
Copying file config.rpath
Copying file m4/codeset.m4
Copying file m4/glibc2.m4
Copying file m4/glibc21.m4
Copying file m4/intdiv0.m4
Copying file m4/intl.m4
Copying file m4/intldir.m4
Copying file m4/intmax.m4
Copying file m4/inttypes-pri.m4
Copying file m4/inttypes_h.m4
Copying file m4/lcmessage.m4
Copying file m4/lock.m4
Copying file m4/longdouble.m4
Copying file m4/longlong.m4
Copying file m4/nls.m4
Copying file m4/po.m4
Copying file m4/printf-posix.m4
Copying file m4/size_max.m4
Copying file m4/stdint_h.m4
Copying file m4/uintmax_t.m4
Copying file m4/ulonglong.m4
Copying file m4/visibility.m4
Copying file m4/wchar_t.m4
Copying file m4/wint_t.m4
Copying file m4/xsize.m4
Copying file po/Makefile.in.in
Copying file po/Makevars.template
Copying file po/Rules-quot
Copying file po/boldquot.sed
Copying file po/en@boldquot.header
Copying file po/en@quot.header
Copying file po/insert-header.sin
Copying file po/quot.sed
Copying file po/remove-potcdate.sin
+ intltoolize --force --copy --automake
+ libtoolize --force --copy --automake
+ aclocal -I m4
aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in'
+ autoheader
autoheader: warning: autoconf input should be named 'configure.ac', not 'configure.in'
+ automake --add-missing --foreign
automake: warning: autoconf input should be named 'configure.ac', not 'configure.in'
configure.in:57: warning: The 'AM_PROG_MKDIR_P' macro is deprecated, and its use is discouraged.
configure.in:57: You should use the Autoconf-provided 'AC_PROG_MKDIR_P' macro instead,
configure.in:57: and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.
configure.in:20: installing './compile'
configure.in:19: installing './config.guess'
configure.in:19: installing './config.sub'
configure.in:8: installing './install-sh'
configure.in:8: installing './missing'
automake: warning: autoconf input should be named 'configure.ac', not 'configure.in'
Expense/Makefile.am: installing './depcomp'
Makefile.am:32: warning: source file 'icons/icons.c' is in a subdirectory,
Makefile.am:32: but option 'subdir-objects' is disabled
automake: warning: possible forward-incompatibility.
automake: At least one source file is in a subdirectory, but the 'subdir-objects'
automake: automake option hasn't been enabled.  For now, the corresponding output
automake: object file(s) will be placed in the top-level directory.  However, this
automake: behavior may change in a future Automake major version, with object
automake: files being placed in the same subdirectory as the corresponding sources.
automake: You are advised to start using 'subdir-objects' option throughout your
automake: project, to avoid future incompatibility.
Makefile.am:32: warning: source file 'jpsqlite/jpsqlite.c' is in a subdirectory,
Makefile.am:32: but option 'subdir-objects' is disabled
+ autoconf
configure.in:12: warning: 'AM_CONFIG_HEADER': this macro is obsolete.
configure.in:12: You should use the 'AC_CONFIG_HEADERS' macro instead.
aclocal.m4:1788: AM_CONFIG_HEADER is expanded from...
configure.in:12: the top level
configure.in:26: warning: The macro 'AC_PROG_INTLTOOL' is obsolete.
configure.in:26: You should run autoupdate.
aclocal.m4:423: AC_PROG_INTLTOOL is expanded from...
configure.in:26: the top level
configure.in:37: warning: The macro 'AC_LIBTOOL_DLOPEN' is obsolete.
configure.in:37: You should run autoupdate.
m4/ltoptions.m4:113: AC_LIBTOOL_DLOPEN is expanded from...
configure.in:37: the top level
configure.in:37: warning: AC_LIBTOOL_DLOPEN: Remove this warning and the call to _LT_SET_OPTION when you
configure.in:37: put the 'dlopen' option into LT_INIT's first parameter.
./lib/autoconf/general.m4:2434: AC_DIAGNOSE is expanded from...
m4/ltoptions.m4:113: AC_LIBTOOL_DLOPEN is expanded from...
configure.in:37: the top level
configure.in:38: warning: The macro 'AC_PROG_LIBTOOL' is obsolete.
configure.in:38: You should run autoupdate.
m4/libtool.m4:100: AC_PROG_LIBTOOL is expanded from...
configure.in:38: the top level
configure.in:57: warning: AM_PROG_MKDIR_P: this macro is deprecated, and will soon be removed.
configure.in:57: You should use the Autoconf-provided 'AC_PROG_MKDIR_P' macro instead,
configure.in:57: and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.
./lib/autoconf/general.m4:2434: AC_DIAGNOSE is expanded from...
aclocal.m4:1755: AM_PROG_MKDIR_P is expanded from...
m4/po.m4:23: AM_PO_SUBDIRS is expanded from...
m4/gettext.m4:57: AM_GNU_GETTEXT is expanded from...
configure.in:57: the top level
configure.in:57: warning: The macro 'AC_TRY_LINK' is obsolete.
configure.in:57: You should run autoupdate.
./lib/autoconf/general.m4:2918: AC_TRY_LINK is expanded from...
lib/m4sugar/m4sh.m4:690: _AS_IF_ELSE is expanded from...
lib/m4sugar/m4sh.m4:697: AS_IF is expanded from...
./lib/autoconf/general.m4:2249: AC_CACHE_VAL is expanded from...
./lib/autoconf/general.m4:2270: AC_CACHE_CHECK is expanded from...
m4/gettext.m4:367: gt_INTL_MACOSX is expanded from...
m4/gettext.m4:57: AM_GNU_GETTEXT is expanded from...
configure.in:57: the top level
configure.in:57: warning: The macro 'AC_TRY_LINK' is obsolete.
configure.in:57: You should run autoupdate.
./lib/autoconf/general.m4:2918: AC_TRY_LINK is expanded from...
lib/m4sugar/m4sh.m4:690: _AS_IF_ELSE is expanded from...
lib/m4sugar/m4sh.m4:697: AS_IF is expanded from...
./lib/autoconf/general.m4:2249: AC_CACHE_VAL is expanded from...
./lib/autoconf/general.m4:2270: AC_CACHE_CHECK is expanded from...
m4/gettext.m4:57: AM_GNU_GETTEXT is expanded from...
configure.in:57: the top level
configure.in:57: warning: The macro 'AC_TRY_LINK' is obsolete.
configure.in:57: You should run autoupdate.
./lib/autoconf/general.m4:2918: AC_TRY_LINK is expanded from...
lib/m4sugar/m4sh.m4:690: _AS_IF_ELSE is expanded from...
lib/m4sugar/m4sh.m4:697: AS_IF is expanded from...
./lib/autoconf/general.m4:2249: AC_CACHE_VAL is expanded from...
./lib/autoconf/general.m4:2270: AC_CACHE_CHECK is expanded from...
m4/iconv.m4:20: AM_ICONV_LINK is expanded from...
m4/gettext.m4:57: AM_GNU_GETTEXT is expanded from...
configure.in:57: the top level
configure.in:76: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:76: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:76: the top level
configure.in:107: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:107: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:107: the top level
configure.in:120: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:120: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:120: the top level
configure.in:133: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:133: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:133: the top level
configure.in:146: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:146: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:146: the top level
configure.in:163: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:163: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:163: the top level
configure.in:175: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:175: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:175: the top level
configure.in:192: warning: AM_PATH_GTK_3_0 is deprecated, use PKG_CHECK_MODULES([GTK], [gtk+-3.0]) instead
aclocal.m4:34: AM_PATH_GTK_3_0 is expanded from...
configure.in:192: the top level
configure.in:192: warning: The macro 'AC_TRY_RUN' is obsolete.
configure.in:192: You should run autoupdate.
./lib/autoconf/general.m4:2995: AC_TRY_RUN is expanded from...
aclocal.m4:34: AM_PATH_GTK_3_0 is expanded from...
configure.in:192: the top level
configure.in:192: warning: The macro 'AC_TRY_LINK' is obsolete.
configure.in:192: You should run autoupdate.
./lib/autoconf/general.m4:2918: AC_TRY_LINK is expanded from...
aclocal.m4:34: AM_PATH_GTK_3_0 is expanded from...
configure.in:192: the top level
configure.in:200: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:200: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:200: the top level
configure.in:278: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:278: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:278: the top level
configure.in:296: warning: The macro 'AC_TRY_LINK' is obsolete.
configure.in:296: You should run autoupdate.
./lib/autoconf/general.m4:2918: AC_TRY_LINK is expanded from...
configure.in:296: the top level
configure.in:309: warning: The macro 'AC_TRY_RUN' is obsolete.
configure.in:309: You should run autoupdate.
./lib/autoconf/general.m4:2995: AC_TRY_RUN is expanded from...
configure.in:309: the top level
configure.in:339: warning: The macro 'AC_TRY_COMPILE' is obsolete.
configure.in:339: You should run autoupdate.
./lib/autoconf/general.m4:2845: AC_TRY_COMPILE is expanded from...
configure.in:339: the top level
configure.in:391: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:391: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:391: the top level
configure.in:428: warning: The macro 'AC_HEADER_TIME' is obsolete.
configure.in:428: You should run autoupdate.
./lib/autoconf/headers.m4:702: AC_HEADER_TIME is expanded from...
configure.in:428: the top level
configure.in:438: warning: The macro 'AC_TRY_LINK' is obsolete.
configure.in:438: You should run autoupdate.
./lib/autoconf/general.m4:2918: AC_TRY_LINK is expanded from...
configure.in:438: the top level
configure.in:454: warning: The macro 'AC_TYPE_SIGNAL' is obsolete.
configure.in:454: You should run autoupdate.
./lib/autoconf/types.m4:805: AC_TYPE_SIGNAL is expanded from...
configure.in:454: the top level
configure.in:462: warning: The macro 'AC_HELP_STRING' is obsolete.
configure.in:462: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.in:462: the top level
+ test x = x
+ echo Running configure ...
Running configure ...
+ ./configure
checking for a BSD-compatible install... /bin/install -c
checking whether sleep supports fractional seconds... yes
checking filesystem timestamp resolution... 0.01
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking xargs -n works... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C11 features... none needed
checking whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... gcc3
checking for strerror in -lcposix... no
checking whether NLS is requested... yes
checking for intltool-update... /bin/intltool-update
checking for intltool-merge... /bin/intltool-merge
checking for intltool-extract... /bin/intltool-extract
checking for xgettext... /bin/xgettext
checking for msgmerge... /bin/msgmerge
checking for msgfmt... /bin/msgfmt
checking for gmsgfmt... /bin/msgfmt
checking for perl... /bin/perl
checking for perl &gt;= 5.8.1... 5.40.1
checking for XML::Parser... ok
checking for sed... /bin/sed
checking for grep... /bin/grep
checking for cut... /bin/cut
checking how to print strings... printf
checking for a sed that does not truncate output... (cached) /bin/sed
checking for grep that handles long lines and -e... (cached) /bin/grep
checking for egrep... /bin/grep -E
checking for fgrep... /bin/grep -F
checking for ld used by gcc... /bin/ld
checking if the linker (/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /bin/nm -B
checking the name lister (/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /bin/ld option to reload object files... -r
checking for file... file
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for ranlib... ranlib
checking for ar... ar
checking for archiver @FILE support... @
checking for strip... strip
checking command to parse /bin/nm -B output from gcc object... ok
checking for sysroot... no
checking for a working dd... /bin/dd
checking how to truncate binary pipes... /bin/dd bs=4096 count=1
checking for mt... no
checking if : is a manifest tool... no
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for sys/time.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking for shl_load... no
checking for shl_load in -ldld... no
checking for dlopen... yes
checking whether a program can dlopen itself... yes
checking whether a statically linked program can dlopen itself... no
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no
checking for msgfmt... (cached) /bin/msgfmt
checking for gmsgfmt... (cached) /bin/msgfmt
checking for xgettext... (cached) /bin/xgettext
checking for msgmerge... (cached) /bin/msgmerge
checking for ld used by GCC... /bin/ld -m elf_x86_64
checking if the linker (/bin/ld -m elf_x86_64) is GNU ld... yes
checking for shared library run path origin... done
checking for CFPreferencesCopyAppValue... no
checking for CFLocaleCopyCurrent... no
checking for GNU gettext in libc... yes
checking whether to use NLS... yes
checking where the gettext function comes from... libc
checking for locale.h... yes
checking for dlopen... (cached) yes
stock buttons enabled by configure options
checking for pkg-config... /bin/pkg-config
checking pkg-config is at least version 0.16... yes
checking for GTK+ - version &gt;= 3.24.12... yes (version 3.24.48)
checking for pilot-link header files... found at /usr/include
checking for pilot library files... found at /lib
checking for gethostent... yes
checking for setsockopt... yes
checking to see if I can compile a pilot link program... ok
checking if I can run a pilot-link program... ok
checking pilot-link version... pi-version indicates 0.12.5
pilot-link has USB
pilot-link has card support (&gt;12.0)
pilot-link has Calendar support (&gt;12.5)
checking for gpgrt-config... /bin/gpgrt-config
configure: Use gpgrt-config as libgcrypt-config
checking for LIBGCRYPT - version &gt;= 1.2.0... yes (1.11.0)
checking LIBGCRYPT API version... okay
checking for gcry_md_hash_buffer in -lgcrypt... yes
checking for fcntl.h... yes
checking for langinfo.h... yes
checking for locale.h... (cached) yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for sys/socket.h... yes
checking for sys/time.h... (cached) yes
checking for sys/wait.h... yes
checking for unistd.h... (cached) yes
checking for utime.h... yes
checking for netinet/in.h... yes
checking for termio.h... yes
checking for openssl/md5.h... yes
checking for openssl/des.h... yes
checking for inline... inline
checking for pid_t... yes
checking for size_t... yes
checking for uid_t... yes
checking for gid_t... yes
checking whether struct tm is in sys/time.h or time.h... time.h
checking for _NL_TIME_FIRST_WEEKDAY... yes
checking return type of signal handlers... void
checking for working strcoll... yes
checking for setenv... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating Expense/Makefile
config.status: creating jpsqlite/Makefile
config.status: creating SyncTime/Makefile
config.status: creating KeyRing/Makefile
config.status: creating dialer/Makefile
config.status: creating m4/Makefile
config.status: creating po/Makefile.in
config.status: creating icons/Makefile
config.status: creating docs/Makefile
config.status: creating empty/Makefile
config.status: creating jpilot.spec
config.status: creating SlackBuild
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing po/stamp-it commands

This package is configured for the following features:
------------------------------------------------------
Compiling with plugin support..........   yes
Compiling with private record support..   yes
Compiling with Datebk support..........   yes
Compiling with Manana support..........   yes
Compiling with Prometheon support......   no
Compiling Expense plugin...............   yes
Compiling jpsqlite plugin..............   yes
Compiling SyncTime plugin..............   yes
Compiling KeyRing plugin...............   yes
Compiling dialer add-on................   yes
Cryptographic library..................   libgcrypt
GTK-3 support..........................   yes
Stock buttons (icons on buttons in GUI)   yes
NLS support (foreign languages)........   yes
Compiler Options.......................   -g -O2
Prefix directory.......................   /usr/local
pilot-link headers.....................   /usr/include
USB support enabled....................   yes
pilot-link version found...............   0.12.5

Now type make to compile

        real 10.44s
        user 6.26s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p><code>configure</code> and <code>Makefile</code> have now been produced.</p>
<p>Below two statements are only required on Arch Linux.</p>
<pre><code class="language-bash">klm@chieftec /tmp/jpilot: sed 's/return Contact_add_blob(c, blob);/return Contact_add_blob(c, (void*)blob);/' jp-contact.c &gt; /tmp/jp-contact.c
klm@chieftec /tmp/jpilot: mv /tmp/jp-contact.c .
mv: overwrite './jp-contact.c'? y
</code></pre>
<p>Finally, just call <code>make</code>.</p>
<pre><code class="language-bash">klm@chieftec /tmp/jpilot: time make
make  all-recursive
make[1]: Entering directory '/tmp/jpilot'
Making all in m4
make[2]: Entering directory '/tmp/jpilot/m4'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/jpilot/m4'
Making all in po
make[2]: Entering directory '/tmp/jpilot/po'
file=`echo ca | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file ca.po
file=`echo cs | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file cs.po
file=`echo da | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file da.po
file=`echo de | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file de.po
file=`echo es | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file es.po
file=`echo fr | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file fr.po
file=`echo it | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file it.po
file=`echo ja | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file ja.po
file=`echo ko | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file ko.po
file=`echo nl | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file nl.po
file=`echo nb | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file nb.po
file=`echo pt_BR | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file pt_BR.po
file=`echo ru | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file ru.po
file=`echo rw | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file rw.po
file=`echo sv | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file sv.po
file=`echo tr | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file tr.po
file=`echo uk | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file uk.po
file=`echo vi | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file vi.po
file=`echo zh_CN | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file zh_CN.po
file=`echo zh_TW | sed 's,.*/,,'`.gmo \
  &amp;&amp; rm -f $file &amp;&amp; /bin/msgfmt -o $file zh_TW.po
make[2]: Leaving directory '/tmp/jpilot/po'
Making all in Expense
make[2]: Entering directory '/tmp/jpilot/Expense'
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I..    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -MT libexpense_la-expense.lo -MD -MP -MF .deps/libexpense_la-expense.Tpo -c -o libexpense_la-expense.lo `test -f 'expense.c' || echo './'`expense.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -MT libexpense_la-expense.lo -MD -MP -MF .deps/libexpense_la-expense.Tpo -c expense.c  -fPIC -DPIC -o .libs/libexpense_la-expense.o
mv -f .deps/libexpense_la-expense.Tpo .deps/libexpense_la-expense.Plo
/bin/sh ../libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -module -avoid-version  -o libexpense.la -rpath /usr/local/lib/jpilot/plugins libexpense_la-expense.lo -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
libtool: link: gcc -shared  -fPIC -DPIC  .libs/libexpense_la-expense.o   -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0  -g -O2   -pthread -Wl,-soname -Wl,libexpense.so -o .libs/libexpense.so
libtool: link: ( cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libexpense.la&quot; &amp;&amp; ln -s &quot;../libexpense.la&quot; &quot;libexpense.la&quot; )
make[2]: Leaving directory '/tmp/jpilot/Expense'
Making all in jpsqlite
make[2]: Entering directory '/tmp/jpilot/jpsqlite'
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I..    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -MT libjpsqlite_la-jpsqlite.lo -MD -MP -MF .deps/libjpsqlite_la-jpsqlite.Tpo -c -o libjpsqlite_la-jpsqlite.lo `test -f 'jpsqlite.c' || echo './'`jpsqlite.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -MT libjpsqlite_la-jpsqlite.lo -MD -MP -MF .deps/libjpsqlite_la-jpsqlite.Tpo -c jpsqlite.c  -fPIC -DPIC -o .libs/libjpsqlite_la-jpsqlite.o
mv -f .deps/libjpsqlite_la-jpsqlite.Tpo .deps/libjpsqlite_la-jpsqlite.Plo
/bin/sh ../libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -module -avoid-version  -o libjpsqlite.la -rpath /usr/local/lib/jpilot/plugins libjpsqlite_la-jpsqlite.lo -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3
libtool: link: gcc -shared  -fPIC -DPIC  .libs/libjpsqlite_la-jpsqlite.o   -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3  -g -O2   -pthread -Wl,-soname -Wl,libjpsqlite.so -o .libs/libjpsqlite.so
libtool: link: ( cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libjpsqlite.la&quot; &amp;&amp; ln -s &quot;../libjpsqlite.la&quot; &quot;libjpsqlite.la&quot; )
make[2]: Leaving directory '/tmp/jpilot/jpsqlite'
Making all in SyncTime
make[2]: Entering directory '/tmp/jpilot/SyncTime'
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I..    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -MT libsynctime_la-synctime.lo -MD -MP -MF .deps/libsynctime_la-synctime.Tpo -c -o libsynctime_la-synctime.lo `test -f 'synctime.c' || echo './'`synctime.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -MT libsynctime_la-synctime.lo -MD -MP -MF .deps/libsynctime_la-synctime.Tpo -c synctime.c  -fPIC -DPIC -o .libs/libsynctime_la-synctime.o
mv -f .deps/libsynctime_la-synctime.Tpo .deps/libsynctime_la-synctime.Plo
/bin/sh ../libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -module -avoid-version  -o libsynctime.la -rpath /usr/local/lib/jpilot/plugins libsynctime_la-synctime.lo -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
libtool: link: gcc -shared  -fPIC -DPIC  .libs/libsynctime_la-synctime.o   -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0  -g -O2   -pthread -Wl,-soname -Wl,libsynctime.so -o .libs/libsynctime.so
libtool: link: ( cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libsynctime.la&quot; &amp;&amp; ln -s &quot;../libsynctime.la&quot; &quot;libsynctime.la&quot; )
make[2]: Leaving directory '/tmp/jpilot/SyncTime'
Making all in KeyRing
make[2]: Entering directory '/tmp/jpilot/KeyRing'
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I..    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread  -I.. -g -O2 -MT libkeyring_la-keyring.lo -MD -MP -MF .deps/libkeyring_la-keyring.Tpo -c -o libkeyring_la-keyring.lo `test -f 'keyring.c' || echo './'`keyring.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -I.. -g -O2 -MT libkeyring_la-keyring.lo -MD -MP -MF .deps/libkeyring_la-keyring.Tpo -c keyring.c  -fPIC -DPIC -o .libs/libkeyring_la-keyring.o
mv -f .deps/libkeyring_la-keyring.Tpo .deps/libkeyring_la-keyring.Plo
/bin/sh ../libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread  -I.. -g -O2 -module -avoid-version  -o libkeyring.la -rpath /usr/local/lib/jpilot/plugins libkeyring_la-keyring.lo -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lgcrypt
libtool: link: gcc -shared  -fPIC -DPIC  .libs/libkeyring_la-keyring.o   -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lgcrypt  -g -O2   -pthread -Wl,-soname -Wl,libkeyring.so -o .libs/libkeyring.so
libtool: link: ( cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libkeyring.la&quot; &amp;&amp; ln -s &quot;../libkeyring.la&quot; &quot;libkeyring.la&quot; )
make[2]: Leaving directory '/tmp/jpilot/KeyRing'
Making all in dialer
make[2]: Entering directory '/tmp/jpilot/dialer'
gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT jpilot-dial.o -MD -MP -MF .deps/jpilot-dial.Tpo -c -o jpilot-dial.o jpilot-dial.c
mv -f .deps/jpilot-dial.Tpo .deps/jpilot-dial.Po
/bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2   -o jpilot-dial jpilot-dial.o -lm
libtool: link: gcc -g -O2 -o jpilot-dial jpilot-dial.o  -lm
make[2]: Leaving directory '/tmp/jpilot/dialer'
Making all in icons
make[2]: Entering directory '/tmp/jpilot/icons'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/jpilot/icons'
Making all in docs
make[2]: Entering directory '/tmp/jpilot/docs'
sed -e 's|@DOCDIR@|/usr/local/share/doc/jpilot|g' jpilot.man &gt; jpilot.1
sed -e 's|@DOCDIR@|/usr/local/share/doc/jpilot|g' jpilot-dial.man &gt; jpilot-dial.1
sed -e 's|@DOCDIR@|/usr/local/share/doc/jpilot|g' jpilot-sync.man &gt; jpilot-sync.1
sed -e 's|@DOCDIR@|/usr/local/share/doc/jpilot|g' jpilot-dump.man &gt; jpilot-dump.1
sed -e 's|@DOCDIR@|/usr/local/share/doc/jpilot|g' jpilot-merge.man &gt; jpilot-merge.1
make[2]: Leaving directory '/tmp/jpilot/docs'
Making all in empty
make[2]: Entering directory '/tmp/jpilot/empty'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/jpilot/empty'
make[2]: Entering directory '/tmp/jpilot'
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT address.o -MD -MP -MF .deps/address.Tpo -c -o address.o address.c
mv -f .deps/address.Tpo .deps/address.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT address_gui.o -MD -MP -MF .deps/address_gui.Tpo -c -o address_gui.o address_gui.c
mv -f .deps/address_gui.Tpo .deps/address_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT alarms.o -MD -MP -MF .deps/alarms.Tpo -c -o alarms.o alarms.c
mv -f .deps/alarms.Tpo .deps/alarms.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT category.o -MD -MP -MF .deps/category.Tpo -c -o category.o category.c
mv -f .deps/category.Tpo .deps/category.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT calendar.o -MD -MP -MF .deps/calendar.Tpo -c -o calendar.o calendar.c
mv -f .deps/calendar.Tpo .deps/calendar.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT contact.o -MD -MP -MF .deps/contact.Tpo -c -o contact.o contact.c
mv -f .deps/contact.Tpo .deps/contact.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT cp1250.o -MD -MP -MF .deps/cp1250.Tpo -c -o cp1250.o cp1250.c
mv -f .deps/cp1250.Tpo .deps/cp1250.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT dat.o -MD -MP -MF .deps/dat.Tpo -c -o dat.o dat.c
mv -f .deps/dat.Tpo .deps/dat.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT datebook.o -MD -MP -MF .deps/datebook.Tpo -c -o datebook.o datebook.c
mv -f .deps/datebook.Tpo .deps/datebook.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT datebook_gui.o -MD -MP -MF .deps/datebook_gui.Tpo -c -o datebook_gui.o datebook_gui.c
mv -f .deps/datebook_gui.Tpo .deps/datebook_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT dialer.o -MD -MP -MF .deps/dialer.Tpo -c -o dialer.o dialer.c
mv -f .deps/dialer.Tpo .deps/dialer.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT export_gui.o -MD -MP -MF .deps/export_gui.Tpo -c -o export_gui.o export_gui.c
mv -f .deps/export_gui.Tpo .deps/export_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT font.o -MD -MP -MF .deps/font.Tpo -c -o font.o font.c
mv -f .deps/font.Tpo .deps/font.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT import_gui.o -MD -MP -MF .deps/import_gui.Tpo -c -o import_gui.o import_gui.c
mv -f .deps/import_gui.Tpo .deps/import_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT install_gui.o -MD -MP -MF .deps/install_gui.Tpo -c -o install_gui.o install_gui.c
mv -f .deps/install_gui.Tpo .deps/install_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT install_user.o -MD -MP -MF .deps/install_user.Tpo -c -o install_user.o install_user.c
mv -f .deps/install_user.Tpo .deps/install_user.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT japanese.o -MD -MP -MF .deps/japanese.Tpo -c -o japanese.o japanese.c
mv -f .deps/japanese.Tpo .deps/japanese.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT jpilot.o -MD -MP -MF .deps/jpilot.Tpo -c -o jpilot.o jpilot.c
mv -f .deps/jpilot.Tpo .deps/jpilot.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT jp-contact.o -MD -MP -MF .deps/jp-contact.Tpo -c -o jp-contact.o jp-contact.c
mv -f .deps/jp-contact.Tpo .deps/jp-contact.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT libplugin.o -MD -MP -MF .deps/libplugin.Tpo -c -o libplugin.o libplugin.c
mv -f .deps/libplugin.Tpo .deps/libplugin.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT libsqlite.o -MD -MP -MF .deps/libsqlite.Tpo -c -o libsqlite.o libsqlite.c
mv -f .deps/libsqlite.Tpo .deps/libsqlite.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT log.o -MD -MP -MF .deps/log.Tpo -c -o log.o log.c
mv -f .deps/log.Tpo .deps/log.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT memo.o -MD -MP -MF .deps/memo.Tpo -c -o memo.o memo.c
mv -f .deps/memo.Tpo .deps/memo.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT memo_gui.o -MD -MP -MF .deps/memo_gui.Tpo -c -o memo_gui.o memo_gui.c
mv -f .deps/memo_gui.Tpo .deps/memo_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT monthview_gui.o -MD -MP -MF .deps/monthview_gui.Tpo -c -o monthview_gui.o monthview_gui.c
mv -f .deps/monthview_gui.Tpo .deps/monthview_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT otherconv.o -MD -MP -MF .deps/otherconv.Tpo -c -o otherconv.o otherconv.c
mv -f .deps/otherconv.Tpo .deps/otherconv.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT password.o -MD -MP -MF .deps/password.Tpo -c -o password.o password.c
mv -f .deps/password.Tpo .deps/password.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT pidfile.o -MD -MP -MF .deps/pidfile.Tpo -c -o pidfile.o pidfile.c
mv -f .deps/pidfile.Tpo .deps/pidfile.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT plugins.o -MD -MP -MF .deps/plugins.Tpo -c -o plugins.o plugins.c
mv -f .deps/plugins.Tpo .deps/plugins.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT prefs.o -MD -MP -MF .deps/prefs.Tpo -c -o prefs.o prefs.c
mv -f .deps/prefs.Tpo .deps/prefs.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT prefs_gui.o -MD -MP -MF .deps/prefs_gui.Tpo -c -o prefs_gui.o prefs_gui.c
mv -f .deps/prefs_gui.Tpo .deps/prefs_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT print.o -MD -MP -MF .deps/print.Tpo -c -o print.o print.c
mv -f .deps/print.Tpo .deps/print.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT print_gui.o -MD -MP -MF .deps/print_gui.Tpo -c -o print_gui.o print_gui.c
mv -f .deps/print_gui.Tpo .deps/print_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT print_headers.o -MD -MP -MF .deps/print_headers.Tpo -c -o print_headers.o print_headers.c
mv -f .deps/print_headers.Tpo .deps/print_headers.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT print_logo.o -MD -MP -MF .deps/print_logo.Tpo -c -o print_logo.o print_logo.c
mv -f .deps/print_logo.Tpo .deps/print_logo.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT restore_gui.o -MD -MP -MF .deps/restore_gui.Tpo -c -o restore_gui.o restore_gui.c
mv -f .deps/restore_gui.Tpo .deps/restore_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT russian.o -MD -MP -MF .deps/russian.Tpo -c -o russian.o russian.c
mv -f .deps/russian.Tpo .deps/russian.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT search_gui.o -MD -MP -MF .deps/search_gui.Tpo -c -o search_gui.o search_gui.c
mv -f .deps/search_gui.Tpo .deps/search_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT sync.o -MD -MP -MF .deps/sync.Tpo -c -o sync.o sync.c
mv -f .deps/sync.Tpo .deps/sync.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT todo.o -MD -MP -MF .deps/todo.Tpo -c -o todo.o todo.c
mv -f .deps/todo.Tpo .deps/todo.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT todo_gui.o -MD -MP -MF .deps/todo_gui.Tpo -c -o todo_gui.o todo_gui.c
mv -f .deps/todo_gui.Tpo .deps/todo_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT utils.o -MD -MP -MF .deps/utils.Tpo -c -o utils.o utils.c
mv -f .deps/utils.Tpo .deps/utils.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT weekview_gui.o -MD -MP -MF .deps/weekview_gui.Tpo -c -o weekview_gui.o weekview_gui.c
mv -f .deps/weekview_gui.Tpo .deps/weekview_gui.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT icons.o -MD -MP -MF .deps/icons.Tpo -c -o icons.o `test -f 'icons/icons.c' || echo './'`icons/icons.c
mv -f .deps/icons.Tpo .deps/icons.Po
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT jpsqlite.o -MD -MP -MF .deps/jpsqlite.Tpo -c -o jpsqlite.o `test -f 'jpsqlite/jpsqlite.c' || echo './'`jpsqlite/jpsqlite.c
mv -f .deps/jpsqlite.Tpo .deps/jpsqlite.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -export-dynamic  -o jpilot address.o address_gui.o alarms.o category.o calendar.o contact.o cp1250.o dat.o datebook.o datebook_gui.o dialer.o export_gui.o font.o import_gui.o install_gui.o install_user.o japanese.o jpilot.o jp-contact.o libplugin.o libsqlite.o log.o memo.o memo_gui.o monthview_gui.o otherconv.o password.o pidfile.o plugins.o prefs.o prefs_gui.o print.o print_gui.o print_headers.o print_logo.o restore_gui.o russian.o search_gui.o sync.o todo.o todo_gui.o utils.o weekview_gui.o icons.o jpsqlite.o -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3
libtool: link: gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -o jpilot address.o address_gui.o alarms.o category.o calendar.o contact.o cp1250.o dat.o datebook.o datebook_gui.o dialer.o export_gui.o font.o import_gui.o install_gui.o install_user.o japanese.o jpilot.o jp-contact.o libplugin.o libsqlite.o log.o memo.o memo_gui.o monthview_gui.o otherconv.o password.o pidfile.o plugins.o prefs.o prefs_gui.o print.o print_gui.o print_headers.o print_logo.o restore_gui.o russian.o search_gui.o sync.o todo.o todo_gui.o utils.o weekview_gui.o icons.o jpsqlite.o -Wl,--export-dynamic  -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3 -pthread
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT jpilot-dump.o -MD -MP -MF .deps/jpilot-dump.Tpo -c -o jpilot-dump.o jpilot-dump.c
mv -f .deps/jpilot-dump.Tpo .deps/jpilot-dump.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2   -o jpilot-dump address.o calendar.o category.o contact.o cp1250.o datebook.o japanese.o jpilot-dump.o libplugin.o libsqlite.o log.o memo.o otherconv.o password.o plugins.o prefs.o russian.o todo.o utils.o jp-contact.o -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3
libtool: link: gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -o jpilot-dump address.o calendar.o category.o contact.o cp1250.o datebook.o japanese.o jpilot-dump.o libplugin.o libsqlite.o log.o memo.o otherconv.o password.o plugins.o prefs.o russian.o todo.o utils.o jp-contact.o  -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3 -pthread
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT jpilot-sync.o -MD -MP -MF .deps/jpilot-sync.Tpo -c -o jpilot-sync.o jpilot-sync.c
mv -f .deps/jpilot-sync.Tpo .deps/jpilot-sync.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -export-dynamic  -o jpilot-sync cp1250.o category.o jpilot-sync.o japanese.o libplugin.o libsqlite.o datebook.o calendar.o log.o otherconv.o password.o plugins.o prefs.o russian.o sync.o utils.o jp-contact.o -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3
libtool: link: gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -o jpilot-sync cp1250.o category.o jpilot-sync.o japanese.o libplugin.o libsqlite.o datebook.o calendar.o log.o otherconv.o password.o plugins.o prefs.o russian.o sync.o utils.o jp-contact.o -Wl,--export-dynamic  -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3 -pthread
gcc -DHAVE_CONFIG_H -I.    -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -MT jpilot-merge.o -MD -MP -MF .deps/jpilot-merge.Tpo -c -o jpilot-merge.o jpilot-merge.c
mv -f .deps/jpilot-merge.Tpo .deps/jpilot-merge.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -pthread -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2   -o jpilot-merge cp1250.o japanese.o libplugin.o libsqlite.o datebook.o calendar.o password.o log.o jpilot-merge.o otherconv.o plugins.o prefs.o russian.o utils.o -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3
libtool: link: gcc -I/usr/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cloudproviders -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -DLOCALEDIR=\&quot;/usr/local/share/locale\&quot; -g -O2 -o jpilot-merge cp1250.o japanese.o libplugin.o libsqlite.o datebook.o calendar.o password.o log.o jpilot-merge.o otherconv.o plugins.o prefs.o russian.o utils.o  -L/lib -lpisock -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lsqlite3 -pthread
make[2]: Leaving directory '/tmp/jpilot'
make[1]: Leaving directory '/tmp/jpilot'
        real 17.94s
        user 15.72s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p>Checking binary.</p>
<pre><code class="language-bash">klm@chieftec /tmp/jpilot: ldd jpilot
        linux-vdso.so.1 (0x0000763000e01000)
        libpisock.so.9 =&gt; /usr/lib/libpisock.so.9 (0x0000763000cc2000)
        libgtk-3.so.0 =&gt; /usr/lib/libgtk-3.so.0 (0x0000763000400000)
        libgdk-3.so.0 =&gt; /usr/lib/libgdk-3.so.0 (0x0000763000bd6000)
        libz.so.1 =&gt; /usr/lib/libz.so.1 (0x00007630003e7000)
        libpangocairo-1.0.so.0 =&gt; /usr/lib/libpangocairo-1.0.so.0 (0x0000763000bc6000)
        libpango-1.0.so.0 =&gt; /usr/lib/libpango-1.0.so.0 (0x000076300037c000)
        libharfbuzz.so.0 =&gt; /usr/lib/libharfbuzz.so.0 (0x0000763000257000)
        libatk-1.0.so.0 =&gt; /usr/lib/libatk-1.0.so.0 (0x0000763000231000)
        libcairo-gobject.so.2 =&gt; /usr/lib/libcairo-gobject.so.2 (0x0000763000228000)
        libcairo.so.2 =&gt; /usr/lib/libcairo.so.2 (0x00007630000f1000)
        libgdk_pixbuf-2.0.so.0 =&gt; /usr/lib/libgdk_pixbuf-2.0.so.0 (0x00007630000ac000)
        libgio-2.0.so.0 =&gt; /usr/lib/libgio-2.0.so.0 (0x0000762fffedd000)
        libgobject-2.0.so.0 =&gt; /usr/lib/libgobject-2.0.so.0 (0x0000762fffe7d000)
        libglib-2.0.so.0 =&gt; /usr/lib/libglib-2.0.so.0 (0x0000762fffd2d000)
        libsqlite3.so.0 =&gt; /usr/lib/libsqlite3.so.0 (0x0000762fffbbc000)
        libc.so.6 =&gt; /usr/lib/libc.so.6 (0x0000762fff9ca000)
        libusb-0.1.so.4 =&gt; /usr/lib/libusb-0.1.so.4 (0x0000762fff9c2000)
        libpthread.so.0 =&gt; /usr/lib/libpthread.so.0 (0x0000762fff9bd000)
        libbluetooth.so.3 =&gt; /usr/lib/libbluetooth.so.3 (0x0000762fff98f000)
        libgmodule-2.0.so.0 =&gt; /usr/lib/libgmodule-2.0.so.0 (0x0000762fff988000)
        libpangoft2-1.0.so.0 =&gt; /usr/lib/libpangoft2-1.0.so.0 (0x0000762fff96b000)
        libfontconfig.so.1 =&gt; /usr/lib/libfontconfig.so.1 (0x0000762fff91b000)
        libfribidi.so.0 =&gt; /usr/lib/libfribidi.so.0 (0x0000762fff8fb000)
        libepoxy.so.0 =&gt; /usr/lib/libepoxy.so.0 (0x0000762fff7ee000)
        libm.so.6 =&gt; /usr/lib/libm.so.6 (0x0000762fff6f4000)
        libXi.so.6 =&gt; /usr/lib/libXi.so.6 (0x0000762fff6e1000)
        libX11.so.6 =&gt; /usr/lib/libX11.so.6 (0x0000762fff5a0000)
        libatk-bridge-2.0.so.0 =&gt; /usr/lib/libatk-bridge-2.0.so.0 (0x0000762fff566000)
        libcloudproviders.so.0 =&gt; /usr/lib/libcloudproviders.so.0 (0x0000762fff54d000)
        libtinysparql-3.0.so.0 =&gt; /usr/lib/libtinysparql-3.0.so.0 (0x0000762fff47c000)
        libXfixes.so.3 =&gt; /usr/lib/libXfixes.so.3 (0x0000762fff472000)
        libxkbcommon.so.0 =&gt; /usr/lib/libxkbcommon.so.0 (0x0000762fff41b000)
        libwayland-client.so.0 =&gt; /usr/lib/libwayland-client.so.0 (0x0000762fff40c000)
        libwayland-cursor.so.0 =&gt; /usr/lib/libwayland-cursor.so.0 (0x0000762fff402000)
        libwayland-egl.so.1 =&gt; /usr/lib/libwayland-egl.so.1 (0x0000762fff3fd000)
        libXext.so.6 =&gt; /usr/lib/libXext.so.6 (0x0000762fff3e6000)
        libXcursor.so.1 =&gt; /usr/lib/libXcursor.so.1 (0x0000762fff3d9000)
        libXdamage.so.1 =&gt; /usr/lib/libXdamage.so.1 (0x0000762fff3d4000)
        libXcomposite.so.1 =&gt; /usr/lib/libXcomposite.so.1 (0x0000762fff3cf000)
        libXrandr.so.2 =&gt; /usr/lib/libXrandr.so.2 (0x0000762fff3c2000)
        libXinerama.so.1 =&gt; /usr/lib/libXinerama.so.1 (0x0000762fff3bd000)
        libthai.so.0 =&gt; /usr/lib/libthai.so.0 (0x0000762fff3b0000)
        libfreetype.so.6 =&gt; /usr/lib/libfreetype.so.6 (0x0000762fff2e6000)
        libgraphite2.so.3 =&gt; /usr/lib/libgraphite2.so.3 (0x0000762fff2c4000)
        libpng16.so.16 =&gt; /usr/lib/libpng16.so.16 (0x0000762fff28a000)
        libXrender.so.1 =&gt; /usr/lib/libXrender.so.1 (0x0000762fff27e000)
        libxcb.so.1 =&gt; /usr/lib/libxcb.so.1 (0x0000762fff251000)
        libxcb-render.so.0 =&gt; /usr/lib/libxcb-render.so.0 (0x0000762fff242000)
        libxcb-shm.so.0 =&gt; /usr/lib/libxcb-shm.so.0 (0x0000762fff23d000)
        libpixman-1.so.0 =&gt; /usr/lib/libpixman-1.so.0 (0x0000762fff197000)
        libjpeg.so.8 =&gt; /usr/lib/libjpeg.so.8 (0x0000762fff0f9000)
        libtiff.so.6 =&gt; /usr/lib/libtiff.so.6 (0x0000762fff06c000)
        libmount.so.1 =&gt; /usr/lib/libmount.so.1 (0x0000762fff01a000)
        libffi.so.8 =&gt; /usr/lib/libffi.so.8 (0x0000762fff00f000)
        libpcre2-8.so.0 =&gt; /usr/lib/libpcre2-8.so.0 (0x0000762ffef63000)
        /lib64/ld-linux-x86-64.so.2 =&gt; /usr/lib64/ld-linux-x86-64.so.2 (0x0000763000e03000)
        libexpat.so.1 =&gt; /usr/lib/libexpat.so.1 (0x0000762ffef39000)
        libatspi.so.0 =&gt; /usr/lib/libatspi.so.0 (0x0000762ffef02000)
        libdbus-1.so.3 =&gt; /usr/lib/libdbus-1.so.3 (0x0000762ffeead000)
        libgcc_s.so.1 =&gt; /usr/lib/libgcc_s.so.1 (0x0000762ffee7f000)
        libjson-glib-1.0.so.0 =&gt; /usr/lib/libjson-glib-1.0.so.0 (0x0000762ffee55000)
        libxml2.so.2 =&gt; /usr/lib/libxml2.so.2 (0x0000762ffed08000)
        libdatrie.so.1 =&gt; /usr/lib/libdatrie.so.1 (0x0000762ffecff000)
        libbz2.so.1.0 =&gt; /usr/lib/libbz2.so.1.0 (0x0000762ffecea000)
        libbrotlidec.so.1 =&gt; /usr/lib/libbrotlidec.so.1 (0x0000762ffecdb000)
        libXau.so.6 =&gt; /usr/lib/libXau.so.6 (0x0000762ffecd6000)
        libXdmcp.so.6 =&gt; /usr/lib/libXdmcp.so.6 (0x0000762ffecce000)
        libzstd.so.1 =&gt; /usr/lib/libzstd.so.1 (0x0000762ffebe9000)
        liblzma.so.5 =&gt; /usr/lib/liblzma.so.5 (0x0000762ffebb4000)
        libjbig.so.2.1 =&gt; /usr/lib/libjbig.so.2.1 (0x0000762ffeba6000)
        libblkid.so.1 =&gt; /usr/lib/libblkid.so.1 (0x0000762ffeb6d000)
        libsystemd.so.0 =&gt; /usr/lib/libsystemd.so.0 (0x0000762ffea4a000)
        libicuuc.so.76 =&gt; /usr/lib/libicuuc.so.76 (0x0000762ffe800000)
        libbrotlicommon.so.1 =&gt; /usr/lib/libbrotlicommon.so.1 (0x0000762ffea25000)
        libcap.so.2 =&gt; /usr/lib/libcap.so.2 (0x0000762ffea19000)
        libicudata.so.76 =&gt; /usr/lib/libicudata.so.76 (0x0000762ffc800000)
        libstdc++.so.6 =&gt; /usr/lib/libstdc++.so.6 (0x0000762ffc400000)
klm@chieftec /tmp/jpilot:
</code></pre>
<h2>2. Pilot-Link<a id=pilotlink></h2>
<p>Unfortunately the <a href="https://aur.archlinux.org/packages/pilot-link">AUR</a> package for pilot-link is broken, i.e., it no longer builds.
This is a known problem: <a href="https://github.com/desrod/pilot-link/issues/18">https://github.com/desrod/pilot-link/issues/18</a>.
If you have the built package, though, then it's just fine.</p>
<p>Download the compressed source tar-ball from here: <a href="https://mirrors.slackware.com/slackware/slackware-14.1/source/l/pilot-link/">https://mirrors.slackware.com/slackware/slackware-14.1/source/l/pilot-link/</a></p>
<p>I edited the <code>configure</code> file and changed <code>-Wall</code> to <code>-fpermissive</code> for <code>CFLAGS</code>.
Otherwise I couldn't compile the source.</p>
<p>If you no longer sync from any handheld device, then you don't need to build pilot-link.
You just need the <code>include</code> directory and copy it accordingly because the include files from pilot-link are required for J-Pilot.</p>
<pre><code class="language-bash">klm@ryzen /tmp: tar jxf ~/D/pilot-link-0.12.5.tar.bz2
klm@ryzen /tmp: cd pilot-link-0.12.5
klm@ryzen /tmp/pilot-link-0.12.5: ls -a
./          autogen.sh*    config.h.in   COPYING      doc/         libpisock/  Makefile.am  pilot-link.m4        popt/   ylwrap*
../         bindings/      config.sub*   COPYING.LIB  include/     libpisync/  Makefile.in  pilot-link.m4.in     README
aclocal.m4  ChangeLog      configure*    darwin/      INSTALL      ltmain.sh*  missing*     pilot-link.pc.in     src/
AUTHORS     config.guess*  configure.ac  depcomp*     install-sh*  m4/         NEWS         pilot-link-pp.pc.in  tests/
</code></pre>
<p>Change <code>configure</code> file and check nothing has been forgotten.</p>
<pre><code class="language-bash">klm@ryzen /tmp/pilot-link-0.12.5: v configure
klm@ryzen /tmp/pilot-link-0.12.5: rg -l Wall
ChangeLog
bindings/Perl/h2xs-pilot-link
bindings/Perl/Pilot.c
configure.ac
bindings/Java/Makefile
configure
src/pilot-install-expenses
klm@ryzen /tmp/pilot-link-0.12.5: v configure
</code></pre>
<p>Now call <code>configure</code>.</p>
<pre><code class="language-bash">klm@ryzen /tmp/pilot-link-0.12.5: time ./configure
checking whether to enable maintainer-specific portions of Makefiles... no
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for g77... no
checking for g77-3.2... no
checking for g77-3.3... no
checking for fl32... no
checking for f77... no
checking for fort77... no
checking for xlf... no
checking for f90... no
checking for xlf90... no
checking whether we are using the GNU Fortran 77 compiler... no
checking whether  accepts -g... no
checking for a sed that does not truncate output... /bin/sed
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for fgrep... /bin/grep -F
checking for ld used by gcc... /bin/ld
checking if the linker (/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /bin/nm -B
checking the name lister (/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking whether the shell understands some XSI constructs... yes
checking whether the shell understands &quot;+=&quot;... yes
checking for /bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for ar... ar
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /bin/nm -B output from gcc object... ok
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking for g77... no
checking for xlf... no
checking for f77... no
checking for frt... no
checking for pgf77... no
checking for cf77... no
checking for fort77... no
checking for fl32... no
checking for af77... no
checking for xlf90... no
checking for f90... no
checking for pgf90... no
checking for pghpf... no
checking for epcf90... no
checking for gfortran... gfortran
checking whether we are using the GNU Fortran 77 compiler... (cached) no
checking whether gfortran accepts -g... (cached) no
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking for gfortran option to produce PIC...
checking if gfortran static flag  works... yes
checking if gfortran supports -c -o file.o... yes
checking if gfortran supports -c -o file.o... (cached) yes
checking whether the gfortran linker (/bin/ld -m elf_x86_64) supports shared libraries... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking for bison... bison -y
checking for ANSI C header files... (cached) yes
checking for an ANSI C-conforming const... yes
checking whether time.h and sys/time.h may both be included... yes
checking whether struct tm is in sys/time.h or time.h... time.h
checking whether gcc needs -traditional... no
checking return type of signal handlers... void
checking dirent.h usability... yes
checking dirent.h presence... yes
checking for dirent.h... yes
checking errno.h usability... yes
checking errno.h presence... yes
checking for errno.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking for inttypes.h... (cached) yes
checking for memory.h... (cached) yes
checking netdb.h usability... yes
checking netdb.h presence... yes
checking for netdb.h... yes
checking netinet/in.h usability... yes
checking netinet/in.h presence... yes
checking for netinet/in.h... yes
checking regex.h usability... yes
checking regex.h presence... yes
checking for regex.h... yes
checking for stdint.h... (cached) yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for strings.h... (cached) yes
checking sys/ioctl_compat.h usability... no
checking sys/ioctl_compat.h presence... no
checking for sys/ioctl_compat.h... no
checking sys/ioctl.h usability... yes
checking sys/ioctl.h presence... yes
checking for sys/ioctl.h... yes
checking sys/malloc.h usability... no
checking sys/malloc.h presence... no
checking for sys/malloc.h... no
checking sys/select.h usability... yes
checking sys/select.h presence... yes
checking for sys/select.h... yes
checking sys/sockio.h usability... no
checking sys/sockio.h presence... no
checking for sys/sockio.h... no
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking sys/utsname.h usability... yes
checking sys/utsname.h presence... yes
checking for sys/utsname.h... yes
checking for unistd.h... (cached) yes
checking IOKit/IOBSD.h usability... no
checking IOKit/IOBSD.h presence... no
checking for IOKit/IOBSD.h... no
checking ifaddrs.h usability... yes
checking ifaddrs.h presence... yes
checking for ifaddrs.h... yes
checking for inttypes.h... (cached) yes
checking for atexit... yes
checking for cfmakeraw... yes
checking for cfsetispeed... yes
checking for cfsetospeed... yes
checking for cfsetspeed... yes
checking for dup2... yes
checking for gethostname... yes
checking for inet_aton... yes
checking for malloc... yes
checking for memcpy... yes
checking for memmove... yes
checking for putenv... yes
checking for sigaction... yes
checking for snprintf... yes
checking for strchr... yes
checking for strdup... yes
checking for strtok... yes
checking for strtoul... yes
checking for strerror... yes
checking for uname... yes
checking for connect... yes
checking for gethostbyname... yes
checking for main in -linet... no
checking for cispeed and cospeed members of struct termios... yes
checking for socklen_t... yes
checking whether to enable userland conduits... no
checking for pkg-config... /bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for BLUEZ... yes
checking for libiconv in -liconv... no
checking for iconv... yes
checking for gnu_get_libc_version... yes
checking if system iconv handles CP1252... yes
checking if perl was enabled... no
Runtime debugging is enabled
configure: creating ./config.status
config.status: creating Makefile
config.status: creating pilot-link.m4
config.status: creating pilot-link.pc
config.status: creating pilot-link-pp.pc
config.status: creating libpisock/Makefile
config.status: creating libpisync/Makefile
config.status: creating include/Makefile
config.status: creating include/pi-version.h
config.status: creating popt/Makefile
config.status: creating src/Makefile
config.status: creating src/prc/Makefile
config.status: creating src/pix/Makefile
config.status: creating bindings/Makefile
config.status: creating bindings/Perl/Makefile.PL
config.status: creating bindings/Python/setup.py
config.status: creating bindings/Python/setup-standalone.py
config.status: creating bindings/Java/Makefile
config.status: creating bindings/Tcl/Makefile
config.status: creating doc/Makefile
config.status: creating doc/doxygen.cfg
config.status: creating doc/xml/Makefile
config.status: creating doc/xml/catalog.xml
config.status: creating doc/xml/docbook.xsl
config.status: creating doc/man/Makefile
config.status: creating tests/Makefile
config.status: creating darwin/Makefile
config.status: creating config.h
config.status: creating include/pi-md5.h
config.status: include/pi-md5.h is unchanged
config.status: executing depfiles commands
config.status: executing libtool commands

  Options detected/selected
  -------------------------.
  pilot-link version...... : 0.12.5
  libpisock version....... : 9.0.2
  libpisync version....... : 1.0.3
  Build for host.......... : x86_64-unknown-linux-gnu
  Extra Warnings.......... : no
  Direct USB support...... : yes, Linux
  BlueZ support........... : yes
  Thread-safe libpisock... : no
  ElectricFence checks.... : no
  CPPFLAGS................ :
  CFLAGS.................. : -g2 -fpermissive

  Userland Tools
  -------------------------.
  Build userland tools.... : no
  Support for popt........ : none
  Readline support........ : none
  PNG support............. : no

  Internal Language Support
  -------------------------.
  Iconv support........... : yes

  External Language Support
  -------------------------.
  TCL support............. : false
  Java support............ : false
  Python support.......... : false
  Perl support............ : false

        real 7.61s
        user 2.91s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p>Double check for compiler options.</p>
<pre><code class="language-bash">klm@ryzen /tmp/pilot-link-0.12.5: rg -l Wall
bindings/Perl/h2xs-pilot-link
bindings/Perl/Pilot.c
src/pilot-install-expenses
configure
ChangeLog
configure.ac
klm@ryzen /tmp/pilot-link-0.12.5: rg -l fpermissive
bindings/Tcl/Makefile
bindings/Makefile
popt/Makefile
configure
libpisock/Makefile
config.status
bindings/Java/Makefile
Makefile
libtool
doc/Makefile
doc/man/Makefile
include/Makefile
doc/xml/Makefile
libpisync/Makefile
config.log
tests/Makefile
darwin/Makefile
src/prc/Makefile
src/pix/Makefile
src/Makefile
</code></pre>
<p>Finally, call <code>make</code>.</p>
<pre><code class="language-bash">klm@ryzen /tmp/pilot-link-0.12.5: time make
make  all-recursive
make[1]: Entering directory '/tmp/pilot-link-0.12.5'
Making all in popt
make[2]: Entering directory '/tmp/pilot-link-0.12.5/popt'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/popt'
Making all in libpisock
make[2]: Entering directory '/tmp/pilot-link-0.12.5/libpisock'
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-bluetooth.lo -MD -MP -MF .deps/libpisock_la-bluetooth.Tpo -c -o libpisock_la-bluetooth.lo `test -f 'bluetooth.c' || echo './'`bluetooth.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-bluetooth.lo -MD -MP -MF .deps/libpisock_la-bluetooth.Tpo -c bluetooth.c  -fPIC -DPIC -o .libs/libpisock_la-bluetooth.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-bluetooth.lo -MD -MP -MF .deps/libpisock_la-bluetooth.Tpo -c bluetooth.c -o libpisock_la-bluetooth.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-bluetooth.Tpo .deps/libpisock_la-bluetooth.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-unixserial.lo -MD -MP -MF .deps/libpisock_la-unixserial.Tpo -c -o libpisock_la-unixserial.lo `test -f 'unixserial.c' || echo './'`unixserial.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-unixserial.lo -MD -MP -MF .deps/libpisock_la-unixserial.Tpo -c unixserial.c  -fPIC -DPIC -o .libs/libpisock_la-unixserial.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-unixserial.lo -MD -MP -MF .deps/libpisock_la-unixserial.Tpo -c unixserial.c -o libpisock_la-unixserial.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-unixserial.Tpo .deps/libpisock_la-unixserial.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-usb.lo -MD -MP -MF .deps/libpisock_la-usb.Tpo -c -o libpisock_la-usb.lo `test -f 'usb.c' || echo './'`usb.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-usb.lo -MD -MP -MF .deps/libpisock_la-usb.Tpo -c usb.c  -fPIC -DPIC -o .libs/libpisock_la-usb.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-usb.lo -MD -MP -MF .deps/libpisock_la-usb.Tpo -c usb.c -o libpisock_la-usb.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-usb.Tpo .deps/libpisock_la-usb.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-linuxusb.lo -MD -MP -MF .deps/libpisock_la-linuxusb.Tpo -c -o libpisock_la-linuxusb.lo `test -f 'linuxusb.c' || echo './'`linuxusb.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-linuxusb.lo -MD -MP -MF .deps/libpisock_la-linuxusb.Tpo -c linuxusb.c  -fPIC -DPIC -o .libs/libpisock_la-linuxusb.o
linuxusb.c: In function ‘pi_usb_impl_init’:
linuxusb.c:60:33: warning: assignment to ‘ssize_t (*)(pi_socket_t *, const unsigned char *, size_t,  int)’ {aka ‘long int (*)(struct pi_socket *, const unsigned char *, long unsigned int,  int)’} from incompatible pointer type ‘int (*)(pi_socket_t *, unsigned char *, size_t,  int)’ {aka ‘int (*)(struct pi_socket *, unsigned char *, long unsigned int,  int)’} [-Wincompatible-pointer-types]
   60 |         impl-&gt;write             = u_write;
      |                                 ^
linuxusb.c:61:33: warning: assignment to ‘ssize_t (*)(pi_socket_t *, pi_buffer_t *, size_t,  int)’ {aka ‘long int (*)(struct pi_socket *, pi_buffer_t *, long unsigned int,  int)’} from incompatible pointer type ‘int (*)(pi_socket_t *, pi_buffer_t *, size_t,  int)’ {aka ‘int (*)(struct pi_socket *, pi_buffer_t *, long unsigned int,  int)’} [-Wincompatible-pointer-types]
   61 |         impl-&gt;read              = u_read;
      |                                 ^
linuxusb.c: In function ‘u_flush’:
linuxusb.c:384:32: warning: implicit declaration of function ‘recv’ [-Wimplicit-function-declaration]
  384 |                         while (recv(ps-&gt;sd, buf, sizeof(buf), 0) &gt; 0)
      |                                ^~~~
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-linuxusb.lo -MD -MP -MF .deps/libpisock_la-linuxusb.Tpo -c linuxusb.c -o libpisock_la-linuxusb.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-linuxusb.Tpo .deps/libpisock_la-linuxusb.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-address.lo -MD -MP -MF .deps/libpisock_la-address.Tpo -c -o libpisock_la-address.lo `test -f 'address.c' || echo './'`address.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-address.lo -MD -MP -MF .deps/libpisock_la-address.Tpo -c address.c  -fPIC -DPIC -o .libs/libpisock_la-address.o
address.c: In function ‘unpack_AddressAppInfo’:
address.c:212:32: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  212 |         unsigned char *start = record;
      |                                ^~~~~~
address.c: In function ‘pack_AddressAppInfo’:
address.c:280:39: warning: passing argument 1 of ‘strcpy’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  280 |                 strcpy(ai-&gt;phoneLabels[i - 3], ai-&gt;labels[i]);
      |                        ~~~~~~~~~~~~~~~^~~~~~~
In file included from address.c:26:
/usr/include/string.h:141:39: note: expected ‘char * restrict’ but argument is of type ‘const char *’
  141 | extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
      |                      ~~~~~~~~~~~~~~~~~^~~~~~
address.c:282:39: warning: passing argument 1 of ‘strcpy’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  282 |                 strcpy(ai-&gt;phoneLabels[i - 19 + 5], ai-&gt;labels[i]);
      |                        ~~~~~~~~~~~~~~~^~~~~~~~~~~~
/usr/include/string.h:141:39: note: expected ‘char * restrict’ but argument is of type ‘const char *’
  141 | extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
      |                      ~~~~~~~~~~~~~~~~~^~~~~~
address.c:301:39: warning: passing argument 1 of ‘strcpy’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  301 |                 strcpy(ai-&gt;phoneLabels[i - 3], ai-&gt;labels[i]);
      |                        ~~~~~~~~~~~~~~~^~~~~~~
/usr/include/string.h:141:39: note: expected ‘char * restrict’ but argument is of type ‘const char *’
  141 | extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
      |                      ~~~~~~~~~~~~~~~~~^~~~~~
address.c:303:39: warning: passing argument 1 of ‘strcpy’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  303 |                 strcpy(ai-&gt;phoneLabels[i - 19 + 5], ai-&gt;labels[i]);
      |                        ~~~~~~~~~~~~~~~^~~~~~~~~~~~
/usr/include/string.h:141:39: note: expected ‘char * restrict’ but argument is of type ‘const char *’
  141 | extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
      |                      ~~~~~~~~~~~~~~~~~^~~~~~
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-address.lo -MD -MP -MF .deps/libpisock_la-address.Tpo -c address.c -o libpisock_la-address.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-address.Tpo .deps/libpisock_la-address.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-appinfo.lo -MD -MP -MF .deps/libpisock_la-appinfo.Tpo -c -o libpisock_la-appinfo.lo `test -f 'appinfo.c' || echo './'`appinfo.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-appinfo.lo -MD -MP -MF .deps/libpisock_la-appinfo.Tpo -c appinfo.c  -fPIC -DPIC -o .libs/libpisock_la-appinfo.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-appinfo.lo -MD -MP -MF .deps/libpisock_la-appinfo.Tpo -c appinfo.c -o libpisock_la-appinfo.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-appinfo.Tpo .deps/libpisock_la-appinfo.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-connect.lo -MD -MP -MF .deps/libpisock_la-connect.Tpo -c -o libpisock_la-connect.lo `test -f 'connect.c' || echo './'`connect.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-connect.lo -MD -MP -MF .deps/libpisock_la-connect.Tpo -c connect.c  -fPIC -DPIC -o .libs/libpisock_la-connect.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-connect.lo -MD -MP -MF .deps/libpisock_la-connect.Tpo -c connect.c -o libpisock_la-connect.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-connect.Tpo .deps/libpisock_la-connect.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-contact.lo -MD -MP -MF .deps/libpisock_la-contact.Tpo -c -o libpisock_la-contact.lo `test -f 'contact.c' || echo './'`contact.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-contact.lo -MD -MP -MF .deps/libpisock_la-contact.Tpo -c contact.c  -fPIC -DPIC -o .libs/libpisock_la-contact.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-contact.lo -MD -MP -MF .deps/libpisock_la-contact.Tpo -c contact.c -o libpisock_la-contact.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-contact.Tpo .deps/libpisock_la-contact.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-cmp.lo -MD -MP -MF .deps/libpisock_la-cmp.Tpo -c -o libpisock_la-cmp.lo `test -f 'cmp.c' || echo './'`cmp.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-cmp.lo -MD -MP -MF .deps/libpisock_la-cmp.Tpo -c cmp.c  -fPIC -DPIC -o .libs/libpisock_la-cmp.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-cmp.lo -MD -MP -MF .deps/libpisock_la-cmp.Tpo -c cmp.c -o libpisock_la-cmp.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-cmp.Tpo .deps/libpisock_la-cmp.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-datebook.lo -MD -MP -MF .deps/libpisock_la-datebook.Tpo -c -o libpisock_la-datebook.lo `test -f 'datebook.c' || echo './'`datebook.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-datebook.lo -MD -MP -MF .deps/libpisock_la-datebook.Tpo -c datebook.c  -fPIC -DPIC -o .libs/libpisock_la-datebook.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-datebook.lo -MD -MP -MF .deps/libpisock_la-datebook.Tpo -c datebook.c -o libpisock_la-datebook.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-datebook.Tpo .deps/libpisock_la-datebook.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-debug.lo -MD -MP -MF .deps/libpisock_la-debug.Tpo -c -o libpisock_la-debug.lo `test -f 'debug.c' || echo './'`debug.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-debug.lo -MD -MP -MF .deps/libpisock_la-debug.Tpo -c debug.c  -fPIC -DPIC -o .libs/libpisock_la-debug.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-debug.lo -MD -MP -MF .deps/libpisock_la-debug.Tpo -c debug.c -o libpisock_la-debug.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-debug.Tpo .deps/libpisock_la-debug.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-dlp.lo -MD -MP -MF .deps/libpisock_la-dlp.Tpo -c -o libpisock_la-dlp.lo `test -f 'dlp.c' || echo './'`dlp.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-dlp.lo -MD -MP -MF .deps/libpisock_la-dlp.Tpo -c dlp.c  -fPIC -DPIC -o .libs/libpisock_la-dlp.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-dlp.lo -MD -MP -MF .deps/libpisock_la-dlp.Tpo -c dlp.c -o libpisock_la-dlp.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-dlp.Tpo .deps/libpisock_la-dlp.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-expense.lo -MD -MP -MF .deps/libpisock_la-expense.Tpo -c -o libpisock_la-expense.lo `test -f 'expense.c' || echo './'`expense.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-expense.lo -MD -MP -MF .deps/libpisock_la-expense.Tpo -c expense.c  -fPIC -DPIC -o .libs/libpisock_la-expense.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-expense.lo -MD -MP -MF .deps/libpisock_la-expense.Tpo -c expense.c -o libpisock_la-expense.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-expense.Tpo .deps/libpisock_la-expense.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-hinote.lo -MD -MP -MF .deps/libpisock_la-hinote.Tpo -c -o libpisock_la-hinote.lo `test -f 'hinote.c' || echo './'`hinote.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-hinote.lo -MD -MP -MF .deps/libpisock_la-hinote.Tpo -c hinote.c  -fPIC -DPIC -o .libs/libpisock_la-hinote.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-hinote.lo -MD -MP -MF .deps/libpisock_la-hinote.Tpo -c hinote.c -o libpisock_la-hinote.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-hinote.Tpo .deps/libpisock_la-hinote.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-inet.lo -MD -MP -MF .deps/libpisock_la-inet.Tpo -c -o libpisock_la-inet.lo `test -f 'inet.c' || echo './'`inet.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-inet.lo -MD -MP -MF .deps/libpisock_la-inet.Tpo -c inet.c  -fPIC -DPIC -o .libs/libpisock_la-inet.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-inet.lo -MD -MP -MF .deps/libpisock_la-inet.Tpo -c inet.c -o libpisock_la-inet.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-inet.Tpo .deps/libpisock_la-inet.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-location.lo -MD -MP -MF .deps/libpisock_la-location.Tpo -c -o libpisock_la-location.lo `test -f 'location.c' || echo './'`location.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-location.lo -MD -MP -MF .deps/libpisock_la-location.Tpo -c location.c  -fPIC -DPIC -o .libs/libpisock_la-location.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-location.lo -MD -MP -MF .deps/libpisock_la-location.Tpo -c location.c -o libpisock_la-location.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-location.Tpo .deps/libpisock_la-location.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-blob.lo -MD -MP -MF .deps/libpisock_la-blob.Tpo -c -o libpisock_la-blob.lo `test -f 'blob.c' || echo './'`blob.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-blob.lo -MD -MP -MF .deps/libpisock_la-blob.Tpo -c blob.c  -fPIC -DPIC -o .libs/libpisock_la-blob.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-blob.lo -MD -MP -MF .deps/libpisock_la-blob.Tpo -c blob.c -o libpisock_la-blob.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-blob.Tpo .deps/libpisock_la-blob.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-calendar.lo -MD -MP -MF .deps/libpisock_la-calendar.Tpo -c -o libpisock_la-calendar.lo `test -f 'calendar.c' || echo './'`calendar.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-calendar.lo -MD -MP -MF .deps/libpisock_la-calendar.Tpo -c calendar.c  -fPIC -DPIC -o .libs/libpisock_la-calendar.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-calendar.lo -MD -MP -MF .deps/libpisock_la-calendar.Tpo -c calendar.c -o libpisock_la-calendar.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-calendar.Tpo .deps/libpisock_la-calendar.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-mail.lo -MD -MP -MF .deps/libpisock_la-mail.Tpo -c -o libpisock_la-mail.lo `test -f 'mail.c' || echo './'`mail.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-mail.lo -MD -MP -MF .deps/libpisock_la-mail.Tpo -c mail.c  -fPIC -DPIC -o .libs/libpisock_la-mail.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-mail.lo -MD -MP -MF .deps/libpisock_la-mail.Tpo -c mail.c -o libpisock_la-mail.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-mail.Tpo .deps/libpisock_la-mail.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-md5.lo -MD -MP -MF .deps/libpisock_la-md5.Tpo -c -o libpisock_la-md5.lo `test -f 'md5.c' || echo './'`md5.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-md5.lo -MD -MP -MF .deps/libpisock_la-md5.Tpo -c md5.c  -fPIC -DPIC -o .libs/libpisock_la-md5.o
In file included from md5.c:27:
../include/pi-md5.h:26:24: warning: extra tokens at end of #ifdef directive
   26 | #ifdef HAVE_INTTYPES_H || HAVE_STDINT_H
      |                        ^~
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-md5.lo -MD -MP -MF .deps/libpisock_la-md5.Tpo -c md5.c -o libpisock_la-md5.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-md5.Tpo .deps/libpisock_la-md5.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-memo.lo -MD -MP -MF .deps/libpisock_la-memo.Tpo -c -o libpisock_la-memo.lo `test -f 'memo.c' || echo './'`memo.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-memo.lo -MD -MP -MF .deps/libpisock_la-memo.Tpo -c memo.c  -fPIC -DPIC -o .libs/libpisock_la-memo.o
memo.c: In function ‘unpack_MemoAppInfo’:
memo.c:125:32: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  125 |         unsigned char *start = record;
      |                                ^~~~~~
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-memo.lo -MD -MP -MF .deps/libpisock_la-memo.Tpo -c memo.c -o libpisock_la-memo.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-memo.Tpo .deps/libpisock_la-memo.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-money.lo -MD -MP -MF .deps/libpisock_la-money.Tpo -c -o libpisock_la-money.lo `test -f 'money.c' || echo './'`money.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-money.lo -MD -MP -MF .deps/libpisock_la-money.Tpo -c money.c  -fPIC -DPIC -o .libs/libpisock_la-money.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-money.lo -MD -MP -MF .deps/libpisock_la-money.Tpo -c money.c -o libpisock_la-money.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-money.Tpo .deps/libpisock_la-money.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-net.lo -MD -MP -MF .deps/libpisock_la-net.Tpo -c -o libpisock_la-net.lo `test -f 'net.c' || echo './'`net.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-net.lo -MD -MP -MF .deps/libpisock_la-net.Tpo -c net.c  -fPIC -DPIC -o .libs/libpisock_la-net.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-net.lo -MD -MP -MF .deps/libpisock_la-net.Tpo -c net.c -o libpisock_la-net.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-net.Tpo .deps/libpisock_la-net.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-notepad.lo -MD -MP -MF .deps/libpisock_la-notepad.Tpo -c -o libpisock_la-notepad.lo `test -f 'notepad.c' || echo './'`notepad.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-notepad.lo -MD -MP -MF .deps/libpisock_la-notepad.Tpo -c notepad.c  -fPIC -DPIC -o .libs/libpisock_la-notepad.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-notepad.lo -MD -MP -MF .deps/libpisock_la-notepad.Tpo -c notepad.c -o libpisock_la-notepad.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-notepad.Tpo .deps/libpisock_la-notepad.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-padp.lo -MD -MP -MF .deps/libpisock_la-padp.Tpo -c -o libpisock_la-padp.lo `test -f 'padp.c' || echo './'`padp.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-padp.lo -MD -MP -MF .deps/libpisock_la-padp.Tpo -c padp.c  -fPIC -DPIC -o .libs/libpisock_la-padp.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-padp.lo -MD -MP -MF .deps/libpisock_la-padp.Tpo -c padp.c -o libpisock_la-padp.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-padp.Tpo .deps/libpisock_la-padp.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-palmpix.lo -MD -MP -MF .deps/libpisock_la-palmpix.Tpo -c -o libpisock_la-palmpix.lo `test -f 'palmpix.c' || echo './'`palmpix.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-palmpix.lo -MD -MP -MF .deps/libpisock_la-palmpix.Tpo -c palmpix.c  -fPIC -DPIC -o .libs/libpisock_la-palmpix.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-palmpix.lo -MD -MP -MF .deps/libpisock_la-palmpix.Tpo -c palmpix.c -o libpisock_la-palmpix.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-palmpix.Tpo .deps/libpisock_la-palmpix.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-pi-buffer.lo -MD -MP -MF .deps/libpisock_la-pi-buffer.Tpo -c -o libpisock_la-pi-buffer.lo `test -f 'pi-buffer.c' || echo './'`pi-buffer.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-pi-buffer.lo -MD -MP -MF .deps/libpisock_la-pi-buffer.Tpo -c pi-buffer.c  -fPIC -DPIC -o .libs/libpisock_la-pi-buffer.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-pi-buffer.lo -MD -MP -MF .deps/libpisock_la-pi-buffer.Tpo -c pi-buffer.c -o libpisock_la-pi-buffer.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-pi-buffer.Tpo .deps/libpisock_la-pi-buffer.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-pi-file.lo -MD -MP -MF .deps/libpisock_la-pi-file.Tpo -c -o libpisock_la-pi-file.lo `test -f 'pi-file.c' || echo './'`pi-file.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-pi-file.lo -MD -MP -MF .deps/libpisock_la-pi-file.Tpo -c pi-file.c  -fPIC -DPIC -o .libs/libpisock_la-pi-file.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-pi-file.lo -MD -MP -MF .deps/libpisock_la-pi-file.Tpo -c pi-file.c -o libpisock_la-pi-file.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-pi-file.Tpo .deps/libpisock_la-pi-file.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-pi-header.lo -MD -MP -MF .deps/libpisock_la-pi-header.Tpo -c -o libpisock_la-pi-header.lo `test -f 'pi-header.c' || echo './'`pi-header.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-pi-header.lo -MD -MP -MF .deps/libpisock_la-pi-header.Tpo -c pi-header.c  -fPIC -DPIC -o .libs/libpisock_la-pi-header.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-pi-header.lo -MD -MP -MF .deps/libpisock_la-pi-header.Tpo -c pi-header.c -o libpisock_la-pi-header.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-pi-header.Tpo .deps/libpisock_la-pi-header.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-serial.lo -MD -MP -MF .deps/libpisock_la-serial.Tpo -c -o libpisock_la-serial.lo `test -f 'serial.c' || echo './'`serial.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-serial.lo -MD -MP -MF .deps/libpisock_la-serial.Tpo -c serial.c  -fPIC -DPIC -o .libs/libpisock_la-serial.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-serial.lo -MD -MP -MF .deps/libpisock_la-serial.Tpo -c serial.c -o libpisock_la-serial.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-serial.Tpo .deps/libpisock_la-serial.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-slp.lo -MD -MP -MF .deps/libpisock_la-slp.Tpo -c -o libpisock_la-slp.lo `test -f 'slp.c' || echo './'`slp.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-slp.lo -MD -MP -MF .deps/libpisock_la-slp.Tpo -c slp.c  -fPIC -DPIC -o .libs/libpisock_la-slp.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-slp.lo -MD -MP -MF .deps/libpisock_la-slp.Tpo -c slp.c -o libpisock_la-slp.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-slp.Tpo .deps/libpisock_la-slp.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-sys.lo -MD -MP -MF .deps/libpisock_la-sys.Tpo -c -o libpisock_la-sys.lo `test -f 'sys.c' || echo './'`sys.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-sys.lo -MD -MP -MF .deps/libpisock_la-sys.Tpo -c sys.c  -fPIC -DPIC -o .libs/libpisock_la-sys.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-sys.lo -MD -MP -MF .deps/libpisock_la-sys.Tpo -c sys.c -o libpisock_la-sys.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-sys.Tpo .deps/libpisock_la-sys.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-socket.lo -MD -MP -MF .deps/libpisock_la-socket.Tpo -c -o libpisock_la-socket.lo `test -f 'socket.c' || echo './'`socket.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-socket.lo -MD -MP -MF .deps/libpisock_la-socket.Tpo -c socket.c  -fPIC -DPIC -o .libs/libpisock_la-socket.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-socket.lo -MD -MP -MF .deps/libpisock_la-socket.Tpo -c socket.c -o libpisock_la-socket.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-socket.Tpo .deps/libpisock_la-socket.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-syspkt.lo -MD -MP -MF .deps/libpisock_la-syspkt.Tpo -c -o libpisock_la-syspkt.lo `test -f 'syspkt.c' || echo './'`syspkt.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-syspkt.lo -MD -MP -MF .deps/libpisock_la-syspkt.Tpo -c syspkt.c  -fPIC -DPIC -o .libs/libpisock_la-syspkt.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-syspkt.lo -MD -MP -MF .deps/libpisock_la-syspkt.Tpo -c syspkt.c -o libpisock_la-syspkt.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-syspkt.Tpo .deps/libpisock_la-syspkt.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-threadsafe.lo -MD -MP -MF .deps/libpisock_la-threadsafe.Tpo -c -o libpisock_la-threadsafe.lo `test -f 'threadsafe.c' || echo './'`threadsafe.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-threadsafe.lo -MD -MP -MF .deps/libpisock_la-threadsafe.Tpo -c threadsafe.c  -fPIC -DPIC -o .libs/libpisock_la-threadsafe.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-threadsafe.lo -MD -MP -MF .deps/libpisock_la-threadsafe.Tpo -c threadsafe.c -o libpisock_la-threadsafe.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-threadsafe.Tpo .deps/libpisock_la-threadsafe.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-todo.lo -MD -MP -MF .deps/libpisock_la-todo.Tpo -c -o libpisock_la-todo.lo `test -f 'todo.c' || echo './'`todo.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-todo.lo -MD -MP -MF .deps/libpisock_la-todo.Tpo -c todo.c  -fPIC -DPIC -o .libs/libpisock_la-todo.o
todo.c: In function ‘unpack_ToDoAppInfo’:
todo.c:235:32: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  235 |         unsigned char *start = record;
      |                                ^~~~~~
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-todo.lo -MD -MP -MF .deps/libpisock_la-todo.Tpo -c todo.c -o libpisock_la-todo.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-todo.Tpo .deps/libpisock_la-todo.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-utils.lo -MD -MP -MF .deps/libpisock_la-utils.Tpo -c -o libpisock_la-utils.lo `test -f 'utils.c' || echo './'`utils.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-utils.lo -MD -MP -MF .deps/libpisock_la-utils.Tpo -c utils.c  -fPIC -DPIC -o .libs/libpisock_la-utils.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-utils.lo -MD -MP -MF .deps/libpisock_la-utils.Tpo -c utils.c -o libpisock_la-utils.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-utils.Tpo .deps/libpisock_la-utils.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-veo.lo -MD -MP -MF .deps/libpisock_la-veo.Tpo -c -o libpisock_la-veo.lo `test -f 'veo.c' || echo './'`veo.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-veo.lo -MD -MP -MF .deps/libpisock_la-veo.Tpo -c veo.c  -fPIC -DPIC -o .libs/libpisock_la-veo.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-veo.lo -MD -MP -MF .deps/libpisock_la-veo.Tpo -c veo.c -o libpisock_la-veo.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-veo.Tpo .deps/libpisock_la-veo.Plo
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include      -g2 -fpermissive -MT libpisock_la-versamail.lo -MD -MP -MF .deps/libpisock_la-versamail.Tpo -c -o libpisock_la-versamail.lo `test -f 'versamail.c' || echo './'`versamail.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-versamail.lo -MD -MP -MF .deps/libpisock_la-versamail.Tpo -c versamail.c  -fPIC -DPIC -o .libs/libpisock_la-versamail.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT libpisock_la-versamail.lo -MD -MP -MF .deps/libpisock_la-versamail.Tpo -c versamail.c -o libpisock_la-versamail.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/libpisock_la-versamail.Tpo .deps/libpisock_la-versamail.Plo
/bin/sh ../libtool --tag=CC   --mode=link gcc    -g2 -fpermissive -export-dynamic -version-info 9:2:0  -o libpisock.la -rpath /usr/local/lib libpisock_la-bluetooth.lo libpisock_la-unixserial.lo libpisock_la-usb.lo libpisock_la-linuxusb.lo libpisock_la-address.lo libpisock_la-appinfo.lo libpisock_la-connect.lo libpisock_la-contact.lo libpisock_la-cmp.lo libpisock_la-datebook.lo libpisock_la-debug.lo libpisock_la-dlp.lo libpisock_la-expense.lo libpisock_la-hinote.lo libpisock_la-inet.lo libpisock_la-location.lo libpisock_la-blob.lo libpisock_la-calendar.lo libpisock_la-mail.lo libpisock_la-md5.lo libpisock_la-memo.lo libpisock_la-money.lo libpisock_la-net.lo libpisock_la-notepad.lo libpisock_la-padp.lo libpisock_la-palmpix.lo libpisock_la-pi-buffer.lo libpisock_la-pi-file.lo libpisock_la-pi-header.lo libpisock_la-serial.lo libpisock_la-slp.lo libpisock_la-sys.lo libpisock_la-socket.lo libpisock_la-syspkt.lo libpisock_la-threadsafe.lo libpisock_la-todo.lo libpisock_la-utils.lo libpisock_la-veo.lo libpisock_la-versamail.lo -lbluetooth
libtool: link: gcc -shared  .libs/libpisock_la-bluetooth.o .libs/libpisock_la-unixserial.o .libs/libpisock_la-usb.o .libs/libpisock_la-linuxusb.o .libs/libpisock_la-address.o .libs/libpisock_la-appinfo.o .libs/libpisock_la-connect.o .libs/libpisock_la-contact.o .libs/libpisock_la-cmp.o .libs/libpisock_la-datebook.o .libs/libpisock_la-debug.o .libs/libpisock_la-dlp.o .libs/libpisock_la-expense.o .libs/libpisock_la-hinote.o .libs/libpisock_la-inet.o .libs/libpisock_la-location.o .libs/libpisock_la-blob.o .libs/libpisock_la-calendar.o .libs/libpisock_la-mail.o .libs/libpisock_la-md5.o .libs/libpisock_la-memo.o .libs/libpisock_la-money.o .libs/libpisock_la-net.o .libs/libpisock_la-notepad.o .libs/libpisock_la-padp.o .libs/libpisock_la-palmpix.o .libs/libpisock_la-pi-buffer.o .libs/libpisock_la-pi-file.o .libs/libpisock_la-pi-header.o .libs/libpisock_la-serial.o .libs/libpisock_la-slp.o .libs/libpisock_la-sys.o .libs/libpisock_la-socket.o .libs/libpisock_la-syspkt.o .libs/libpisock_la-threadsafe.o .libs/libpisock_la-todo.o .libs/libpisock_la-utils.o .libs/libpisock_la-veo.o .libs/libpisock_la-versamail.o   -lbluetooth    -Wl,-soname -Wl,libpisock.so.9 -o .libs/libpisock.so.9.0.2
libtool: link: (cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libpisock.so.9&quot; &amp;&amp; ln -s &quot;libpisock.so.9.0.2&quot; &quot;libpisock.so.9&quot;)
libtool: link: (cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libpisock.so&quot; &amp;&amp; ln -s &quot;libpisock.so.9.0.2&quot; &quot;libpisock.so&quot;)
libtool: link: ar cru .libs/libpisock.a  libpisock_la-bluetooth.o libpisock_la-unixserial.o libpisock_la-usb.o libpisock_la-linuxusb.o libpisock_la-address.o libpisock_la-appinfo.o libpisock_la-connect.o libpisock_la-contact.o libpisock_la-cmp.o libpisock_la-datebook.o libpisock_la-debug.o libpisock_la-dlp.o libpisock_la-expense.o libpisock_la-hinote.o libpisock_la-inet.o libpisock_la-location.o libpisock_la-blob.o libpisock_la-calendar.o libpisock_la-mail.o libpisock_la-md5.o libpisock_la-memo.o libpisock_la-money.o libpisock_la-net.o libpisock_la-notepad.o libpisock_la-padp.o libpisock_la-palmpix.o libpisock_la-pi-buffer.o libpisock_la-pi-file.o libpisock_la-pi-header.o libpisock_la-serial.o libpisock_la-slp.o libpisock_la-sys.o libpisock_la-socket.o libpisock_la-syspkt.o libpisock_la-threadsafe.o libpisock_la-todo.o libpisock_la-utils.o libpisock_la-veo.o libpisock_la-versamail.o
ar: `u' modifier ignored since `D' is the default (see `U')
libtool: link: ranlib .libs/libpisock.a
libtool: link: ( cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libpisock.la&quot; &amp;&amp; ln -s &quot;../libpisock.la&quot; &quot;libpisock.la&quot; )
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/libpisock'
Making all in libpisync
make[2]: Entering directory '/tmp/pilot-link-0.12.5/libpisync'
/bin/sh ../libtool --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT sync.lo -MD -MP -MF .deps/sync.Tpo -c -o sync.lo sync.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT sync.lo -MD -MP -MF .deps/sync.Tpo -c sync.c  -fPIC -DPIC -o .libs/sync.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT sync.lo -MD -MP -MF .deps/sync.Tpo -c sync.c -o sync.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/sync.Tpo .deps/sync.Plo
/bin/sh ../libtool --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT util.lo -MD -MP -MF .deps/util.Tpo -c -o util.lo util.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT util.lo -MD -MP -MF .deps/util.Tpo -c util.c  -fPIC -DPIC -o .libs/util.o
util.c: In function ‘convert_ToPilotChar_WithCharset’:
util.c:123:23: warning: passing argument 2 of ‘iconv’ from incompatible pointer type [-Wincompatible-pointer-types]
  123 |         if (iconv(cd, &amp;text, &amp;ibl, &amp;ob, &amp;obl) == (size_t)-1)
      |                       ^~~~~
      |                       |
      |                       const char **
In file included from util.c:32:
/usr/include/iconv.h:49:54: note: expected ‘char ** restrict’ but argument is of type ‘const char **’
   49 | extern size_t iconv (iconv_t __cd, char **__restrict __inbuf,
      |                                    ~~~~~~~~~~~~~~~~~~^~~~~~~
util.c: In function ‘convert_FromPilotChar_WithCharset’:
util.c:214:23: warning: passing argument 2 of ‘iconv’ from incompatible pointer type [-Wincompatible-pointer-types]
  214 |         if (iconv(cd, &amp;ptext, &amp;ibl, &amp;ob, &amp;obl) == (size_t)-1)
      |                       ^~~~~~
      |                       |
      |                       const char **
/usr/include/iconv.h:49:54: note: expected ‘char ** restrict’ but argument is of type ‘const char **’
   49 | extern size_t iconv (iconv_t __cd, char **__restrict __inbuf,
      |                                    ~~~~~~~~~~~~~~~~~~^~~~~~~
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include -g2 -fpermissive -MT util.lo -MD -MP -MF .deps/util.Tpo -c util.c -o util.o &gt;/dev/null 2&gt;&amp;1
mv -f .deps/util.Tpo .deps/util.Plo
/bin/sh ../libtool --tag=CC   --mode=link gcc  -g2 -fpermissive -export-dynamic -version-info 1:3:0  -o libpisync.la -rpath /usr/local/lib sync.lo util.lo ../libpisock/libpisock.la 
libtool: link: gcc -shared  .libs/sync.o .libs/util.o   -Wl,-rpath -Wl,/tmp/pilot-link-0.12.5/libpisock/.libs -Wl,-rpath -Wl,/usr/local/lib ../libpisock/.libs/libpisock.so    -Wl,-soname -Wl,libpisync.so.1 -o .libs/libpisync.so.1.0.3
libtool: link: (cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libpisync.so.1&quot; &amp;&amp; ln -s &quot;libpisync.so.1.0.3&quot; &quot;libpisync.so.1&quot;)
libtool: link: (cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libpisync.so&quot; &amp;&amp; ln -s &quot;libpisync.so.1.0.3&quot; &quot;libpisync.so&quot;)
libtool: link: ar cru .libs/libpisync.a  sync.o util.o
ar: `u' modifier ignored since `D' is the default (see `U')
libtool: link: ranlib .libs/libpisync.a
libtool: link: ( cd &quot;.libs&quot; &amp;&amp; rm -f &quot;libpisync.la&quot; &amp;&amp; ln -s &quot;../libpisync.la&quot; &quot;libpisync.la&quot; )
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/libpisync'
Making all in include
make[2]: Entering directory '/tmp/pilot-link-0.12.5/include'
make  all-am
make[3]: Entering directory '/tmp/pilot-link-0.12.5/include'
make[3]: Leaving directory '/tmp/pilot-link-0.12.5/include'
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/include'
Making all in src
make[2]: Entering directory '/tmp/pilot-link-0.12.5/src'
Making all in prc
make[3]: Entering directory '/tmp/pilot-link-0.12.5/src/prc'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/tmp/pilot-link-0.12.5/src/prc'
Making all in pix
make[3]: Entering directory '/tmp/pilot-link-0.12.5/src/pix'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/tmp/pilot-link-0.12.5/src/pix'
make[3]: Entering directory '/tmp/pilot-link-0.12.5/src'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/tmp/pilot-link-0.12.5/src'
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/src'
Making all in bindings
make[2]: Entering directory '/tmp/pilot-link-0.12.5/bindings'
make[3]: Entering directory '/tmp/pilot-link-0.12.5/bindings'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/tmp/pilot-link-0.12.5/bindings'
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/bindings'
Making all in doc
make[2]: Entering directory '/tmp/pilot-link-0.12.5/doc'
make[3]: Entering directory '/tmp/pilot-link-0.12.5/doc'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/tmp/pilot-link-0.12.5/doc'
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/doc'
Making all in tests
make[2]: Entering directory '/tmp/pilot-link-0.12.5/tests'
gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT calendardb-test.o -MD -MP -MF .deps/calendardb-test.Tpo -c -o calendardb-test.o calendardb-test.c
mv -f .deps/calendardb-test.Tpo .deps/calendardb-test.Po
/bin/sh ../libtool --tag=CC   --mode=link gcc  -g2 -fpermissive   -o calendardb-test calendardb-test.o ../libpisock/libpisock.la
libtool: link: gcc -g2 -fpermissive -o .libs/calendardb-test calendardb-test.o  ../libpisock/.libs/libpisock.so -Wl,-rpath -Wl,/usr/local/lib
gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT locationdb-test.o -MD -MP -MF .deps/locationdb-test.Tpo -c -o locationdb-test.o locationdb-test.c
mv -f .deps/locationdb-test.Tpo .deps/locationdb-test.Po
/bin/sh ../libtool --tag=CC   --mode=link gcc  -g2 -fpermissive   -o locationdb-test locationdb-test.o ../libpisock/libpisock.la
libtool: link: gcc -g2 -fpermissive -o .libs/locationdb-test locationdb-test.o  ../libpisock/.libs/libpisock.so -Wl,-rpath -Wl,/usr/local/lib
gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT contactsdb-test.o -MD -MP -MF .deps/contactsdb-test.Tpo -c -o contactsdb-test.o contactsdb-test.c
contactsdb-test.c: In function ‘main’:
contactsdb-test.c:348:9: warning: ‘pilot_connect’ is deprecated [-Wdeprecated-declarations]
  348 |         sd = pilot_connect (argv[1]);
      |         ^~
In file included from contactsdb-test.c:31:
../include/pi-header.h:31:5: note: declared here
   31 | int pilot_connect(const char *port) PI_DEPRECATED;
      |     ^~~~~~~~~~~~~
mv -f .deps/contactsdb-test.Tpo .deps/contactsdb-test.Po
/bin/sh ../libtool --tag=CC   --mode=link gcc  -g2 -fpermissive   -o contactsdb-test contactsdb-test.o ../libpisock/libpisock.la
libtool: link: gcc -g2 -fpermissive -o .libs/contactsdb-test contactsdb-test.o  ../libpisock/.libs/libpisock.so -Wl,-rpath -Wl,/usr/local/lib
gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT dlp-test.o -MD -MP -MF .deps/dlp-test.Tpo -c -o dlp-test.o dlp-test.c
mv -f .deps/dlp-test.Tpo .deps/dlp-test.Po
/bin/sh ../libtool --tag=CC   --mode=link gcc  -g2 -fpermissive   -o dlp-test dlp-test.o ../libpisock/libpisock.la
libtool: link: gcc -g2 -fpermissive -o .libs/dlp-test dlp-test.o  ../libpisock/.libs/libpisock.so -Wl,-rpath -Wl,/usr/local/lib
gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT versamail-test.o -MD -MP -MF .deps/versamail-test.Tpo -c -o versamail-test.o versamail-test.c
mv -f .deps/versamail-test.Tpo .deps/versamail-test.Po
/bin/sh ../libtool --tag=CC   --mode=link gcc  -g2 -fpermissive   -o versamail-test versamail-test.o ../libpisock/libpisock.la
libtool: link: gcc -g2 -fpermissive -o .libs/versamail-test versamail-test.o  ../libpisock/.libs/libpisock.so -Wl,-rpath -Wl,/usr/local/lib
gcc -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -I../include     -g2 -fpermissive -MT vfs-test.o -MD -MP -MF .deps/vfs-test.Tpo -c -o vfs-test.o vfs-test.c
vfs-test.c: In function ‘main’:
vfs-test.c:80:9: warning: ‘pilot_connect’ is deprecated [-Wdeprecated-declarations]
   80 |         sd = pilot_connect (argv[1]);
      |         ^~
In file included from vfs-test.c:37:
../include/pi-header.h:31:5: note: declared here
   31 | int pilot_connect(const char *port) PI_DEPRECATED;
      |     ^~~~~~~~~~~~~
mv -f .deps/vfs-test.Tpo .deps/vfs-test.Po
/bin/sh ../libtool --tag=CC   --mode=link gcc  -g2 -fpermissive   -o vfs-test vfs-test.o ../libpisock/libpisock.la
libtool: link: gcc -g2 -fpermissive -o .libs/vfs-test vfs-test.o  ../libpisock/.libs/libpisock.so -Wl,-rpath -Wl,/usr/local/lib
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/tests'
Making all in darwin
make[2]: Entering directory '/tmp/pilot-link-0.12.5/darwin'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/pilot-link-0.12.5/darwin'
make[2]: Entering directory '/tmp/pilot-link-0.12.5'
make[2]: Leaving directory '/tmp/pilot-link-0.12.5'
make[1]: Leaving directory '/tmp/pilot-link-0.12.5'
        real 8.12s
        user 5.56s
        sys 0
        swapped 0
        total space 0
klm@ryzen /tmp/pilot-link-0.12.5: echo $?
0
klm@ryzen /tmp/pilot-link-0.12.5:
</code></pre>
<p>This post is referenced here: <a href="https://forum.ubuntuusers.de/topic/make-von-aelteren-projekt-geht-nicht-mehr/">MAKE von älteren Projekt geht nicht mehr</a>.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2025/01-07-praktische-gewinnung-zyklischer-steif-stabiler-verfahren</link>
		<guid>https://eklausmeier.goip.de/blog/2025/01-07-praktische-gewinnung-zyklischer-steif-stabiler-verfahren</guid>
		<title>Praktische Gewinnung zyklischer, steif-stabiler Verfahren</title>
		<category>mathematics</category>
		<pubDate>Tue, 07 Jan 2025 13:50:00 +0100</pubDate>
		<description><![CDATA[
<ul>
<li><a href="#DefStabEig">1. Definition von Stabilitätseigenschaften</a></li>
<li><a href="#Schreibweise">2. Schreibweise zusammengesetzter Mehrschrittformeln</a></li>
<li><a href="#StabPoly">3. Stabilität und Polynome</a></li>
<li><a href="#Verschaerfung">4. Verschärfung von Stabilitätsdefinitionen</a></li>
<li><a href="#Konstruktion">5. Konstruktive Herleitung steif-stabiler zyklischer Formeln</a></li>
<li><a href="#Basisformeln">6. Basisformeln der Tendlerschen Zyklen</a></li>
<li><a href="#Aequilibrierung">7. Äquilibrierung von Formeln</a></li>
</ul>
<p>In diesem Text werden die theoretischen Grundlagen, die u.a. zu den
zyklischen Verfahren von <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a> führten, angeschnitten.
Es werden die Begriffe $A[\alpha]$- und $S[\delta]$-Stabilität
eingeführt.
Die naheliegenden weiteren Definitionen von $A_\infty^r[\alpha]$-
und $S_\infty^r[\delta]$-Stabilität werden ebenso diskutiert.
Diese Definitionen weichen gelegentlich von den Definitionen ab, wie sie in
der Literatur zu finden sind.
Die Begriffe $A_\infty^r[\alpha]$- und $S_\infty^0[\delta]$-Stabilität werden
hier nur so benutzt, wie sie an dieser Stelle erklärt werden.
Diese Stabilitätsmerkmale ermöglichen einen Vergleich verschiedener
Verfahren gleicher Ordnung und damit eine Abschätzung über ihre
Brauchbarkeit bei einem Einsatz in einem Programmpaket.
Dennoch setzen diese Stabilitätsdefinitionen gewisse idealisierte
Bedingungen voraus.
Aus diesem Grunde ist es ratsam, ihnen nicht unangemessen großes Gewicht
beizumessen.
Erfüllt also ein Verfahren diese Eigenschaft besonders “gut”, so heißt dies
nicht automatisch, daß es sich in einem Rechenprogramm auch immer “gut”
verhalten würde.</p>
<p>Schließlich wird dargelegt, wie die neuen zyklischen Formeln generiert
wurden.
Das letzte ist von Interesse, wenn versucht werden sollte, die von
<a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">J.M. Tendler</a> gefundenen Formeln weiter zu verbessern.
Von seinen prinzipiellen Grundbestandteilen her sind die Tendlerschen
Zyklen vergleichsweise einfach aufgebaut, nämlich als lineares
Komposituum linear unabhängiger Mehrschrittformeln.
Dennoch ist die tatsächliche Erzeugung, insbesondere die systematische
Generierung nicht ganz einfach.
Es handelt sich hier nicht um einen einfach erlernbaren Kalkül, sondern um
einen iterativen Suchvorgang.</p>
<p>Bibliographisch: Tendler, Joel Marvin: &quot;<a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">A Stiffly Stable
Integration Process Using Cyclic Composite Methods</a>&quot;,
Ph.D. Diss., Syracuse University, Syracuse, New York,
26.Feb.1973, <em>viii</em>+<em>iv</em>+172 S.</p>
<h2>1. Definition von Stabilitätseigenschaften<a id=DefStabEig></a></h2>
<blockquote>
<p>$\ldots$ wird sich diese Störung allerdings erst später einstellen,
aber auf alle Fälle wird die Integration nach ausreichend
vielen Schritten gründlich verpfuscht.
Man nennt diese Erscheinung <em>numerische Instabilität</em>.
Sie ist nicht etwa eine Folge der Akkumulation von Rundungsfehlern,
denn die Formel beschreibt den Integrationsprozeß unter der Annahme,
daß vollständig exakt gerechnet wird.</p>
<p><a href="https://de.wikipedia.org/wiki/Eduard_Stiefel">Eduard Stiefel</a> (1968)</p>
</blockquote>
<p>Ausschließlich Differentialgleichungen vom Typ</p>
<div class=math>
$$
    \dot y = f(t,y), \quad\hbox{mit dem Anfangswert}\quad
    y(t_0) = y_0
$$
</div>
<p>werden hier betrachtet.
Es sei für diesen und alle weiteren Abschnitte
angenommen, daß $f$ und damit $y$ so oft differenzierbar sind, wie
es für die jeweilige Betrachtung nötig ist.
Es wird nun $t_n=t_0+nh$ gesetzt, und $y_n$ bezeichnet die berechneten
Näherung für $y(t_n)$, für $n=m\ell+j$ und $j=1,\ldots,\ell$, die durch
die folgenden $\ell$ Mehrschrittformeln bestimmt wurden</p>
<div class=math>
$$
    \sum_{j=-k+1}^{\ell} \left(
      \alpha_{ij}y_{m\ell+j}  -  h\beta_{ij}\dot y_{m\ell+j}
    \right) = 0, \qquad i=1,\ldots,\ell,
$$
</div>
<p>wobei $\dot y_i = f(t_i,y_i)$ ist.</p>
<p>Ausführlich aufgeschrieben lautet der obige Ausdruck z.B. für ein
dreistufiges Verfahren mit drei Startwerten, also $\ell=3$, und $k=3$, wie
untenstehend.
Hier und im weiteren wird häufig die Abkürzung $z_i=hf_i=h\dot y_i$
benutzt.</p>
<div class=math>
$$
\eqalignno{
      &
    \alpha_{1,-2}y_{3m-2}+\alpha_{1,-1}y_{3m-1}+\alpha_{10}y_{3m}+
    \alpha_{11}y_{3m+1}+\alpha_{12}y_{3m+2}+\alpha_{13}y_{3m+3}
      \cr = &
    \beta_{1,-2}z_{3m-2}+\beta_{1,-1}z_{3m-1}+\beta_{10}z_{3m}+
    \beta_{11}z_{3m+1}+\beta_{12}z_{3m+2}+\beta_{13}z_{3m+3} \cr
    &
    \alpha_{2,-2}y_{3m-2}+\alpha_{2,-1}y_{3m-1}+\alpha_{20}y_{3m}+
    \alpha_{21}y_{3m+1}+\alpha_{22}y_{3m+2}+\alpha_{23}y_{3m+3}
      \cr = &
    \beta_{2,-2}z_{3m-2}+\beta_{2,-1}z_{3m-1}+\beta_{20}z_{3m}+
    \beta_{21}z_{3m+1}+\beta_{22}z_{3m+2}+\beta_{23}z_{3m+3} \cr
      &
    \alpha_{3,-2}y_{3m-2}+\alpha_{3,-1}y_{3m-1}+\alpha_{30}y_{3m}+
    \alpha_{31}y_{3m+1}+\alpha_{32}y_{3m+2}+\alpha_{33}y_{3m+3}
      \cr = &
    \beta_{3,-2}z_{3m-2}+\beta_{3,-1}z_{3m-1}+\beta_{30}y_{3m}+
    \beta_{31}z_{3m+1}+\beta_{32}z_{3m+2}+\beta_{33}z_{3m+3}.\cr
}   % Ende eqalign
$$
</div>
<p>Der obige Ausdruck wird zyklisch, falls gilt</p>
<div class=math>
$$
    \alpha_{ij} = 0 \quad\land\quad \beta_{ij} = 0 \qquad
          (1\le i \lt  j \le \ell).
$$
</div>
<p>Gälte $\alpha_{ij}\ne0$ oder $\beta_{ij}\ne0$ für ein $i&lt;j$, so wäre das
zusammengesetzte Verfahren blockimplizit.
Der Aufwand zur “Beseitigung” der Implizitheit der Formeln wäre dann größer
als bei (einstufigen) linearen Mehrschrittformeln.</p>
<p>Bei zyklischen Verfahren ist der Aufwand zur Berechnung der Näherungen nicht
größer als wie bei Mehrschrittverfahren.
Andererseits hat man jedoch nun die Möglichkeit, da nicht alle Stufen gleich
gewählt werden müssen, Stabilitätseigenschaften zu erreichen die u.U. den
Stufen überlegen sind.
Die Stufen müssen untereinander nicht verschieden sein.
Einige oder auch alle dürfen übereinstimmen.
Praktische Ergebnisse deuten auf den merkwürdigen Umstand hin, daß die
dreifache Wiederholung der BDF2 als zyklisches Verfahren entsprechend
programmiert, gegenüber der dreifachen Anwendung von 3 Schritten mit der BDF2
mit einem Programm konzipiert für einstufige Verfahren, Vorteile bieten kann.</p>
<p>Während bis jetzt noch jede Stufe des Zykluses $2(k+i)$ Parameter, d.h. noch
nicht bestimmte Koeffizienten, enthält, sei noch zusätzlich angenommen,
um die die Anzahl der der Bedingungen zu reduzieren, daß gelte</p>
<div class=math>
$$
    \alpha_{ij} = 0  \quad\land\quad \beta_{ij} = 0
        \qquad (-k+i\gt j,\quad i=1,\ldots,\ell).  \tag{LMSV}
$$
</div>
<p>D.h., daß jede Stufe ein lineares $k$-Schrittverfahren ist.
Es verbleiben jetzt noch $2(k+1)$ Parameter.
Aus Vereinfachungsgründen wird nun verlangt, daß jede Stufe die
gleiche Konsistenzordnung $p=k$ hat.
Berücksichtigt man die Konsistenzbedingungen, so verbleiben noch $k+1$ Parameter.
Diese werden dazu benutzt die gewünschten Stabilitätseigenschaften des
Verfahrens zu erreichen.</p>
<p>Zur Untersuchung des Lösungsverhaltens der Differenzengleichung, welche
man zur numerischen Lösung von Differentialgleichungen einsetzt,
betrachtet man die sehr spezielle Testgleichung</p>
<div class=math>
$$
    \dot y = \lambda y,   \qquad y(t_0) = y_0.
$$
</div>
<p>Da man durch Linearisierung viele Differentialgleichung zumindestens in
einer kleinen Umgebung auf diese obige Form zurückführen kann, liefert
die Untersuchung dieser speziellen Gleichung einen ersten Eindruck was man
wohl im allgemeineren Falle zu erwarten hat.
Desweiteren kann man damit gewisse Ineffizienzen von Programmen verstehen
und erklären.
Zur Wiederholung seien in sehr salopper Form die beiden bekanntesten
Stabilitätsdefinitionen angegeben:</p>
<p>Eine Formel heißt <em>stabil</em>, wenn die sämtlichen berechneten
Lösungen für $H=0$ nicht unbeschränkt wachsen können; $H=h\lambda$.</p>
<p>Die Formel heißt <em>$A$-stabil</em>, wenn sämtliche berechneten Lösungen
eine Nullfolge bilden, für alle $H\in\mathbb{C}^-$.
Ausführlicher</p>
<p><strong>1. Definition:</strong>  nach <a href="https://de.wikipedia.org/wiki/Germund_Dahlquist">Germund Dahlquist</a>, <a href="https://doi.org/10.1007/BF01963532">Dahlquist (1963)</a>.
Ein lineares $k$-Schrittverfahren heißt $A$-stabil, falls alle Lösungen von</p>
<div class=math>
$$
    \sum_{i=0}^k \alpha_i y_{n+i} = \sum_{i=0}^k \beta_i f_{n+i}
$$
</div>
<p>gegen Null gehen ($n\to\infty$), wenn das Verfahren mit fester
Schrittweite $h$ auf Differentialgleichungen der Form $\dot y=\lambda y$
angewendet wird, mit einer festen komplexen Konstante $\lambda$, mit
negativen Realteil.</p>
<p>Die Beschränkung auf lineare $k$-Schrittverfahren ist unwesentlich.
Die Beschäftigung mit <em>zyklischen</em> linearen Verfahren hat zu einem nicht
unmaßgeblichen Teil ihren Ursprung in der <a href="https://de.wikipedia.org/wiki/Zweite_Dahlquist-Barriere">zweiten Dahlquist-Barriere</a>.
Diese besagt, daß $A$-stabile, lineare Mehrschrittformeln keine beliebig
hohe Ordnung erreichen können: maximal die Ordnung zwei.
Durch die drastische Einschränkung der Vielfalt $A$-stabiler, linearer
Mehrschrittverfahren werden zwei Erweiterungen nahegelegt:
Abschwächung des Begriffes der $A$-Stabilität und Hinzufügung größerer
Klassen von Verfahren.
Zur Quantifizierung von Stabilitätseigenschaften einerseits und zur
Abschwächung der $A$-Stabilität andererseits dienen die nachstehenden
Definitionen.</p>
<p><strong>2. Definition:</strong>  Bezeichne ${\cal S}[\delta]$ eine
zusammenhängende und offene Teilmenge der komplexen Ebene mit dem Ursprung
als Randpunkt, die mindestens einen unendlich großen Teil der linken
Halbebene enthält mit Elementen $z$ der Form</p>
<div class=math>
$$
    \mathop{\rm Re}\nolimits  z \lt  -\delta \le 0, \qquad \delta\ge0
$$
</div>
<p>Nun heißt ein Verfahren $S[\delta]$-stabil, falls so eine
Menge ${\cal S}[\delta]$ existiert derart, daß wenn man das Verfahren auf
die lineare und zeitinvariante Differentialgleichung $\dot y=\lambda y$
anwendet, die mit dem Verfahren berechneten Lösungen $y_n$ gegen Null
streben, wenn $n\to\infty$, für eine feste positive Schrittweite $h$, falls
immer $\lambda h=H \in {\cal S}[\delta]$.
Existiert kein unendlich großer Bereich der linken Halbebene, so werde von
<em>nicht</em> $S[\delta]$-stabil gesprochen.
Im Falle der Existenz heißt das betragsmässig kleinste $\delta$ die
<em>Widlund-Distanz</em>, nach <a href="https://en.wikipedia.org/wiki/Olof_B._Widlund">Olof B. Widlund</a>.</p>
<p>Diese Definition hat eine sehr anschauliche Interpretation, wenn man
das Gebiet ${\cal S}[\delta]$ aufzeichnet.
Von besonderem Interesse ist hier das betragsmässig kleinstmögliche $\delta$.
Nur von diesem kleinstmöglichen $\delta$ wird im weiteren überhaupt
noch die Rede sein.
Gleiche Anschaulichkeit hat auch die folgende Definition.</p>
<p><strong>3. Definition:</strong>  Sei ${\cal A}[\alpha]$ eine
zusammenhängende und offene Teilmenge der komplexen Zahlenebene mit
Elementen $z$ der Form</p>
<div class=math>
$$
    \mathopen|\arg \{-z\}\mathclose| \lt  \alpha \le 90^\circ, \qquad \alpha\gt 0.
$$
</div>
<p>Jetzt heißt das Verfahren $A[\alpha]$-stabil, wenn es w.o. eine
derartige Menge ${\cal A}[\alpha]$ gibt derart, daß die berechneten
Näherungen dieses Verfahren gegen Null streben, für $n\to\infty$, wenn man
das Verfahren auf die Differentialgleichung $\dot y = \lambda y$ anwendet.
Diese Abklingeigenschaft soll immer dann gelten, wenn
$\lambda h=H \in {\cal A}[\alpha]$ gilt, für feste positive Schrittweite $h$.
Für $\alpha\notin\left[0,90^\circ\right]$ werde von <em>nicht</em>
$A[\alpha]$-stabil gesprochen.
Im Falle der Existenz nennt man den größtmöglichen Winkel $\alpha$ auch den
<em>Widlund-$\alpha$-Winkel</em>, ebenfalls nach
<a href="https://en.wikipedia.org/wiki/Olof_B._Widlund">Olof B. Widlund</a>.</p>
<p>In sinnfälliger Verallgemeinerung nennt man ein Verfahren $A[0]$-stabil,
wenn es ein $\alpha$ gibt, sodaß das Verfahren $A[\alpha]$-stabil ist.
${\cal A}[0]$ ist in $\mathbb{C}$ nicht offen.
Wie die obige Definition kann man diese Eigenschaft wiederum
sehr anschaulich deuten.
Hier gilt je größer der Winkel $\alpha$, desto besser.
Bei der vorherigen Definition galt je kleiner $\delta$, desto günstiger.
Durch ein größeres $\alpha$, bzw. kleineres $\delta$, werden
die entsprechenden Mengen ${\cal A}[\alpha]$,
bzw. ${\cal S}[\delta]$, “größer”.</p>
<p>Bei den beiden
Defintionen beachte man, daß ${\cal S}[\delta]$ die Menge
bezeichnet und $S[\delta]$ die dazugehörige Eigenschaft.
Entsprechend gilt dies für ${\cal A}[\alpha]$ und $A[\alpha]$.
Man stellt schnell fest, daß ein Verfahren stets $A[\alpha]$-stabil ist,
für ein gewisses $\alpha(\delta)$, wenn es $S[\delta]$-stabil ist.
Die Umkehrung ist nicht notwendig richtig.
Bei den noch folgenden Eigenschaften
$A_{\infty}[\alpha]$ und $S_{\infty}[\delta]$ wird dies jedoch der Fall sein.
Ist $\delta = 0$ oder $\alpha = 90^\circ$, so ist dies das gleiche wie
$A$-Stabilität.
Beide Werte führen zur selben Menge, nämlich der gesamten linken komplexen
Halbebene ohne die imaginäre Achse.</p>
<p><strong>4. Beispiele:</strong>  (1) Die impliziten BDF der Ordnung
$p=1$ bis $p=6$ erfüllen
mit gewissen $\alpha$ und $\delta$ die obigen Stabilitätseigenschaften.</p>
<p>(2) Sämtliche zyklischen Verfahren von <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a>, oder <a href="https://dl.acm.org/doi/pdf/10.1145/356502.356495">Tendler/Bickart/Picel (1978)</a> sind ebenfalls
Beispiele für Verfahren, die $A[\alpha]$- bzw. $S[\delta]$-stabil sind.
Zusätzlich sind die Formeln von Tendler auch $A_\infty^0[\alpha]$- und
$S_\infty^0[\delta]$-stabil.
(Definition folgt.)</p>
<p>(3) Genauso sind auch alle zyklischen Formeln von
<a href="https://www.researchgate.net/profile/Peter-Tischer-2">Peter E. Tischer</a> (1983) und
Tischer/Sacks-Davis (1983) alle
$A[\alpha]$- bzw. $S[\delta]$-stabil, sogar $A_\infty^0[\alpha]$- und
$S_\infty^0[\delta]$-stabil.</p>
<p>(4) Die 10 blockimpliziten Verfahren von
<a href="https://doi.org/10.1007/BF01951938">Bickart/Picel (1973)</a>
sind alle $A[\alpha]$- und $S[\delta]$-stabil, sogar $A_\infty^0[\alpha]$-
und $S_\infty^0[\delta]$-stabil.</p>
<p>(5) Explizite Verfahren mit konstanter Schrittweite erfüllen die
obigen Eigenschaften nicht.
Das explizite Euler-Verfahren mit konstanter Schrittweite ist also
weder $A[\alpha]$- noch $S[\delta]$-stabil und zwar für
kein $\alpha$ und kein $\delta$.</p>
<p>Bibliographisch: Tischer, Peter E.: &quot;The Cyclic Use of Linear Multistep
Formulas for the Solution of Stiff Differential Equations&quot;, Ph.D. Thesis,
Department of Computer Science, Monash University, Clayton, Victoria,
Australia, August 1983, <em>x</em>+180 S.</p>
<p>Tischer, Peter E. und Sacks-Davis, Ron: &quot;<a href="https://doi.org/10.1137/0904051">A New Class of
Cyclic Multistep Formulae for Stiff Systems</a>&quot;,
SIAM Journal on Scientific and Statistical Computing,
Vol 4, No 4, December 1983, pp.733—747.</p>
<p>Bickart, Theodore A. und Picel, Zdenek:
&quot;<a href="https://doi.org/10.1007/BF01951938">High Order Stiffly Stable Composite Multistep Methods for Numerical
Integration of Stiff Differential Equations</a>&quot;, BIT, Vol 13, 1973,
pp.272—286</p>
<h2>2. Schreibweise zusammengesetzter Mehrschrittformeln<a id=Schreibweise></a></h2>
<p><strong>1.</strong> Wann nun ein Verfahren diese Eigenschaften hat, wird durch sein
<a href="https://de.wikipedia.org/wiki/Charakteristisches_Polynom">charakteristisches Polynom</a> bestimmt.
Dieses Polynom in <em>zwei</em> komplexen Veränderlichen erhält man nun wie folgt.</p>
<p>Den gesamten $\ell$-stufigen Zyklus</p>
<div class=math>
$$
    \sum_{j=-k+1}^{\ell} \left[
        \alpha_{ij}y_{m\ell+j}  -  h\beta_{ij}\dot y_{m\ell+j}
    \right]
    = 0,\qquad\hbox{für}\quad i=1,\ldots,\ell,
$$
</div>
<p>kann man als eine einzige Matrixdifferenzengleichung notieren, nämlich</p>
<div class=math>
$$
    \sum_{i=0}^\kappa \left[
    A_i Y_{m+i}  -  h B_i \dot Y_{m+i} \right] = 0,
    % \eqno \hbox{(Matrix)}
$$
</div>
<p>mit $\kappa=\lceil k/\ell \rceil$.
$\kappa$ ist hierbei die kleinste ganze Zahl, die größer oder
gleich $k/\ell$ ist.
Die insgesamt $\kappa+1$ Matrizen $A_i$, $B_i$ haben die Größe $\ell\times\ell$.
Es genügen genau dann zwei Matrizen $A_1$ und $A_0$, bzw. $B_1$ und $B_0$,
wenn $\kappa=1$ ist, also $k\le\ell$.</p>
<p>Vergrößert man die Dimensionen der Matrizen $A_i$ und $B_i$ mit Hilfe von
sogenannten Trivialstufen ($1=1$ Stufen), so läßt sich natürlich die Anzahl
der Matrizen verringern, z.B. auf genau zwei, also $A_0$ und $A_1$,
bzw. $B_0$ und $B_1$.
Bei den zyklischen Verfahren von J.M. Tendler ist stets $\kappa\le2$,
d.h. man kommt mit jeweils höchstens drei Matrizen zur Beschreibung der
Matrixdifferenzengleichung aus.</p>
<p><strong>2.</strong> Die Matrizen $A_i$ und $B_i$, für $i=0,\ldots,\kappa$ lauten:</p>
<div class=math>
$$
    A_\kappa = \pmatrix{
        \alpha_{11}    & \ldots & \alpha_{1\ell}\cr
             \vdots    & \ddots & \vdots\cr
        \alpha_{\ell1} & \ldots & \alpha_{\ell\ell}\cr
    }, \quad
    B_\kappa = \pmatrix{
        \beta_{11}    & \ldots & \beta_{1\ell}\cr
        \vdots        & \ddots & \vdots\cr
        \beta_{\ell1} & \ldots & \beta_{\ell\ell}\cr
    }, \quad
    Y_{m+\kappa} = \pmatrix{y_{m\ell+1}\cr \vdots\cr y_{m\ell+\ell}},
$$
</div>
<p>und</p>
<div class=math>
$$
    A_{\kappa-1} = \pmatrix{
        \alpha_{1,-\ell+1}    & \ldots & \alpha_{10}\cr
        \vdots                & \ddots & \vdots\cr
        \alpha_{\ell,-\ell+1} & \ldots & \alpha_{\ell0}\cr
    }, \quad
    B_{\kappa-1} = \pmatrix{
        \beta_{1,-\ell+1}    & \ldots & \beta_{10}\cr
        \vdots               & \ddots & \vdots\cr
        \beta_{\ell,-\ell+1} & \ldots & \beta_{\ell0}\cr
    }, \quad
    Y_{m+\kappa-1} = \pmatrix{y_{m\ell-\ell+1}\cr \vdots\cr y_{m\ell}},
$$
</div>
<p>beziehungsweise</p>
<div class=math>
$$
    A_{\kappa-2} = \pmatrix{
        \alpha_{1,-2\ell+1}    & \ldots & \alpha_{1,-\ell}\cr
        \vdots                 & \ddots & \vdots\cr
        \alpha_{\ell,-2\ell+1} & \ldots & \alpha_{\ell,-\ell}\cr
    }, \quad
    B_{\kappa-2} = \pmatrix{
        \beta_{1,-2\ell+1}    & \ldots & \beta_{1,-\ell}\cr
        \vdots                & \ddots & \vdots\cr
        \beta_{\ell,-2\ell+1} & \ldots & \beta_{\ell,-\ell}\cr
    }, \quad
    Y_{m+\kappa-2} = \pmatrix{y_{m\ell-2\ell+1}\cr \vdots\cr y_{m\ell-\ell}\cr}
$$
</div>
<p>und so weiter bis zu den Matrizen $A_0$, $B_0$ und Vektoren $Y_m$.
Allgemein also</p>
<div class=math>
$$
    A_i = \pmatrix{
        \alpha_{1,(i-\kappa)\ell+1}    & \ldots & \alpha_{1,(i-\kappa)\ell+\ell}\cr
        \vdots                         & \ddots & \vdots\cr
        \alpha_{\ell,(i-\kappa)\ell+1} & \ldots & \alpha_{\ell,(i-\kappa)\ell+\ell}\cr
    }, \qquad
    Y_{m+i} = \pmatrix{y_{(m+i-\kappa)\ell+1}\cr \vdots\cr y_{(m+i-\kappa)\ell+\ell}\cr},
    \qquad
    \dot Y_{m+i} = \pmatrix{f_{(m+i-\kappa)\ell+1}\cr \vdots\cr f_{(m+i-\kappa)\ell+\ell}\cr}
$$
</div>
<p>für $i=0,\ldots,\kappa$.
Die $B_i$ analog wie die $A_i$.</p>
<p><strong>3.</strong> Bei einer vektorwertigen Funktion mit $n$ Komponenten hat man die
oben angegebenen Matrizen zu ersetzen durch</p>
<div class=math>
$$
    A_i\gets A_i\otimes I_n \in \mathbb{R}^{n\ell\times n\ell}, \qquad
    B_i\gets B_i\otimes I_n \in \mathbb{R}^{n\ell\times n\ell}.
$$
</div>
<p>Hierbei ist $I_n$ die $n\times n$-Einheitsmatrix und $\otimes$ bezeichnet
das <a href="https://de.wikipedia.org/wiki/Kronecker-Produkt">Kroneckerprodukt</a>,
nach <a href="https://de.wikipedia.org/wiki/Leopold_Kronecker">Leopold Kronecker (1823—1891)</a>.
In den meisten Fällen kann man auf diese gesonderte Notierung verzichten,
u.a. weil gilt $\left|A\otimes I_n\right| = \left|A\right|$.</p>
<p><strong>4. Beispiele:</strong>  (1) Im Falle einstufiger Zyklen, also $\ell=1$,
reduziert sich die obige Matrixdifferenzengleichung zu der gewöhnlichen
skalaren Differenzengleichung für lineare Mehrschrittverfahren, mit
$A_i=\alpha_i$, $B_i=\beta_i$ und $Y_i=y_i$.</p>
<p>(2) Das lineare zweistufige zyklische $A_\infty^0$-stabile Verfahren der
Ordnung 4, also $k=4$, $p=4$ und $\ell=2$, von
Tischer (1983) und <a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>,
soll in der obigen Schreibweise angegeben werden.
Die zu den Werten</p>
<div class=math>
$$
\left( \begin{array}{cccccc|cccccc}
y_{2n-3} & y_{2n-2} & y_{2n-1} & y_{2n} & y_{2n+1} & \hbox{---} & z_{2n-3} & z_{2n-2} & z_{2n-1} & z_{2n} & z_{2n+1} & \hbox{---}\cr
y_{2n-3} & y_{2n-2} & y_{2n-1} & y_{2n} & y_{2n+1} & y_{2n+2}   & z_{2n-3} & z_{2n-2} & z_{2n-1} & z_{2n} & z_{2n+1} & z_{2n+2}\cr
\end{array} \right)
$$
</div>
<p>gehörigen Koeffizienten lauten</p>
<div class=math>
$$
\left( \begin{array}{cccccc|cccccc}
0.6 & -2.7 & 4.7  & -3.5 &    1 & 0 &  0.9 & -4.1 &   7.1 & -5.6 &  1.7 & 0\cr
0   & 0    & -0.3 &  1.2 & -2.0 & 1 & -2.6 & 11.9 & -20.9 & 17.9 & -7.6 & 1.7\cr
\end{array} \right)
$$
</div>
<p>wobei alle Koeffizienten auf eine Stelle hinter dem Komma gerundet worden
sind, also der “Konsistenzschnelltest” $\rho(1)=0$ hier immer $\pm0.1$
ergibt.</p>
<p>In der Schreibweise als Matrixdifferenzengleichung w.o. ergibt sich
nun unmittelbar</p>
<div class=math>
$$
\begin{array}{cccccc}
     & \pmatrix{0.6 & -2.7\cr 0 & 0\cr}\pmatrix{y_{2n-3}\cr y_{2n-2}\cr}
    &+&\pmatrix{4.7 & -3.5\cr -0.3 & 1.2\cr}\pmatrix{y_{2n-1}\cr y_{2n}\cr}
    &+&\pmatrix{1 & 0\cr -2.0 & 1\cr}\pmatrix{y_{2n+1}\cr y_{2n+2}\cr}\cr
    \cr %\noalign{\phantom{:}}
    =& \pmatrix{0.9 & -4.1\cr -2.6 & 11.9\cr}\pmatrix{z_{2n-3}\cr z_{2n-2}\cr}
    &+&\pmatrix{7.1 & -5.6\cr -20.9 & 17.9\cr}\pmatrix{z_{2n-1}\cr z_{2n}\cr}
    &+&\pmatrix{1.7 & 0\cr -7.6 & 1.7\cr}\pmatrix{z_{2n+1}\cr z_{2n+2}\cr}\cr
\end{array}
$$
</div>
<p>Eine typische Eigenschaft der Formeln von
Tischer (1983) und
<a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>
ist die relativ geringe Äquilibrierung der $\beta_{ij}$-Werte.
Bei diesem Verfahren beträgt sie über 1:20.
Für die Ordnung $p=8$ hat man sogar Verhältnisse von 1:130.
Maßgeblich betrifft dies stets die <em>letzte</em> Stufe der immer zweistufigen
Zyklen.</p>
<p>Die Formeln von <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a> besitzen diese
Eigenschaften nicht.
Bei gewöhnlichen Quadratur- und Kubaturformeln für $y=\int_a^b f(x) dx$
ist bekannt, daß diese Eigenschaft unerwünscht ist.</p>
<p>(3) Das zweistufige, zyklische Verfahren DH3 von Donelson/Hansen (1971)</p>
<p>Donelson III, John und Hansen, Eldon:
&quot;<a href="https://doi.org/10.1137/0708018">Cyclic Composite Multistep Predictor-Corrector Methods</a>&quot;,
SIAM Journal on Numerical Analysis, Vol 8, 1971, pp.137—157</p>
<div class=math>
$$
\begin{array}{r|rr}
p=5 & 1 & 2\cr
\hline
-2 &    0 &    0\cr
-1 &  -57 &   31\cr
 0 &   24 &  -12\cr
 1 &   33 &  -39\cr
 2 &    0 &   20\cr
\hline
-2 &   -1 &    0\cr
-1 &   24 &  -10\cr
 0 &   57 &  -39\cr
 1 &   10 &   12\cr
 2 &    0 &    7\cr
\end{array}
$$
</div>
<p>Die Stabilität definierenden Matrizen sind:</p>
<div class=math>
$$
    \eqalign{
        A_0 &= \pmatrix{0&0\cr 0&0\cr},\cr &\cr
        A_1 &= \pmatrix{-57&24\cr 31&-12\cr},\cr &\cr
        A_2 &= \pmatrix{33&0\cr -39&20\cr},\cr } \qquad
    \eqalign{
        B_0 &= \pmatrix{0&-1\cr 0&0\cr},\cr &\cr
        B_1 &= \pmatrix{24&57\cr -10&-39,\cr}\cr &\cr
        B_2 &= \pmatrix{10&0\cr 12&7\cr},\cr }
$$
</div>
<p>Die charakteristische Gleichung ist</p>
<div class=math>
$$
    \det\left(A_0+A_1\mu+A_2\mu^2\right) = -660(\mu-1)(\mu+1/11)\mu^2.
$$
</div>
<p>Keinesfalls müssen zyklische Verfahren nur zweistufig sein.
Die Stufenzahl eines zyklischen Verfahrens unterliegt keiner Schranke,
außer, daß diese Anzahl nicht unendlich ist und daß diese Anzahl dabei fest ist.
Gleichzeitig erkennt man, daß eine formale Übertragung
$\det Q(\mu,H)={\cal O}(H^{p+1})$ ($\mu=e^H$) scheitert, weil z.B. für DH3
gilt</p>
<div class=math>
$$
    \det Q(\mu,H) = -720H - 3060H^2 - 5838H^3 - 7090H^4 - 6303H^5
        - {52985\over12}H^6 + {\cal O}(H^7) \ne {\cal O}(H^6),
$$
</div>
<p>nach Substitution von $\mu=e^H$.</p>
<p><strong>5.</strong> Es ist natürlich ebenso möglich die Linearisierung des obigen
Matrixpolynoms zu betrachten, jedoch werden dann die Dimensionen der
Matrizen größer, falls $\kappa&gt;1$, also $k&gt;\ell$ ist.
Das Verfahren schreibt sich dann in der Form $z_{n+1}=Az_n+h\varphi_n$, oder
$Lz_{n+1}=Uz_n+h\varphi_n$.</p>
<h2>3. Stabilität und Polynome<a id=StabPoly></a></h2>
<p><strong>1.</strong> Das charakteristische Polynom lautet</p>
<div class=math>
$$
    \det Q(\mu,H) = \det\Biggl\{\sum_{i=0}^\kappa (A_i  -  H B_i) \mu^i
        \Biggr\}. % \eqno \hbox{(char.Pol.)}
$$
</div>
<p>Man beweist jetzt, daß das verwendete Verfahren genau dann $A[\alpha]$-stabil
bzw. $S[\delta]$-stabil ist, wenn die sämtlichen Nullstellen $\mu$ von
$\det Q(\mu,H)=0$, alle betragsmässig kleiner eins sind, für alle
$H \in {\cal A}[\alpha]$, bzw. alle $H \in {\cal S}[\delta]$.
Die Eigenschaft eines Polynomes $Q(\mu,H)$ für ein spezielles $H_0$
sämtliche Wurzeln in der offenen Einheitskreisscheibe zu haben, nennt man
<em>absolut-stabil</em>.
${\cal A}[\alpha]$ und ${\cal S}[\delta]$ sind also Mengen der absoluten
Stabilität.</p>
<p>Äquivalent hierzu ist, daß das Verfahren genau dann $A[\alpha]$-stabil ist,
bzw. $S[\delta]$-stabil ist, falls alle Nullstellen $H$ von $\det Q(\mu,H)=0$
im Komplement von ${\cal A}[\alpha]$, bzw. im Komplement von
${\cal S}[\delta]$, liegen, für alle $\mu$ aus dem Komplement der offenen
Einheitskreisscheibe.
Man erhält somit den folgenden Test.</p>
<p><strong>2. Test A:</strong> Ein Verfahren ist genau dann $A[\alpha]$-stabil,
bzw. $S[\delta]$-stabil, falls</p>
<ol>
<li>die Nullstellen $\mu$ von $\det Q(\mu,H_0)$ für ein festgehaltenes
beliebiges $H_0 \in {\cal A}[\alpha]$, bzw. $H_0 \in {\cal S}[\delta]$,
sämtlich betragsmässig kleiner 1 sind und gleichzeitig</li>
<li>die Kurve der Punkte $H$, die
$\det Q(\mu,H)|_{\mathopen|\mu\mathclose|=1} = 0$ erfüllen, im
Komplement von ${\cal A}[\alpha]$, bzw. im Komplement von
${\cal S}[\delta]$ liegen.</li>
</ol>
<p>Leider sind Verfahren, die die obigen beiden Eigenschaften
erfüllen, noch nicht wirklich gut zur Integration von steifen
Differentialgleichungen geeignet.
Dies liegt u.a. daran, daß wenn $\mathopen|H\mathclose|$ $(\mathop{\rm Re}\nolimits  H&lt;0)$ immer
größer wird, die Nullstellen $\mu$ von $\det Q(\mu,H)=0$ betragsmässig gegen
eins streben könnten.
Integriert man jedoch $\dot y = \lambda y$ ($\mathop{\rm Re}\nolimits \lambda&lt;0$) so würde dies
heißen, daß es eine Lösung gibt mit $\mathopen|y_{n+1}/y_n\mathclose| \to 1$.
Diese Eigenschaft spiegelt sicherlich nicht das wahre Verhalten der Lösung
wider.
Diese Eigenheit hat z.B. die Trapezregel</p>
<div class=math>
$$
    y_{m+1} = y_m + (h/2)(f_{m+1} + f_m).
$$
</div>
<p>Aus diesem Grunde sind Verfahren günstiger bei denen die Nullstellen $\mu$
bei $\mathop{\rm Re}\nolimits  H=-\infty$ von $\det Q(\mu,H)=0$ in der offenen Einheitskreisscheibe
liegen, also keinerlei Wurzeln des Betrages eins auftauchen.
Damit hätte man die Trapezregel als zwar $A$-stabiles Verfahren, letztlich
ausgesondert.
Um diesen Wunsch zu präzisieren und um handliche Begriffe bereitzustellen,
seien diese Anforderungen nun nomenklaturmässig genauer festgelegt.</p>
<h2>4. Verschärfung von Stabilitätsdefinitionen<a id=Verschaerfung></a></h2>
<blockquote>
<p>Suppose, for example, that it is known that the planetary system is
stable “in the past”. If it captures a new body, say, a speck of
dust arriving from “infinity”, then the newly formed system of
bodies looses its stability: with probability one, either a collision
occurs, or one of the bodies escapes again at infinity. Moreover,
it is by no means necessary that the speck of dust is the one that
leaves the Solar system: Jupiter, or even the Sun may equally well
leave.</p>
<p>V.I. Arnold, V.V. Kozlov, A.I. Neishtadt (1988),
<a href="https://www.amazon.de/Mathematical-Aspects-Classical-Celestial-Mechanics-ebook/dp/B0D1ZL41WL?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;crid=1ZD2GSE27YL7U&amp;dib=eyJ2IjoiMSJ9.XgBb1JYfOPiTx7OrnhES3FW_ZmFL3gfOcvXQKPf6MeM2fZSWGxkt6bBUHcBBJgRjTL2MkfJELlOtodjGHHkCaLH_hHcEjZhBJoV9Lz-nmLK5QD2KHecGdVCUtYXFvVIAdiDeiVwXUWGzXNIepjpc90A1i9isdGcXR8vVf44i-W584fDx3VPQwC5h828HlXfER6a3CtJ1u9V8u0wTGSASmTrmsySv6eB8XI3j-dBLg-E.dDwyo6NY0NYA5GIKAWlBopNNW7CLONQWNubGwJCRjXs&amp;dib_tag=se&amp;keywords=Mathematical+Aspects+of+Classical+and+Celestial+Mechanics&amp;nsdOptOutParam=true&amp;qid=1736099699&amp;sprefix=mathematical+aspects+of+classical+and+celestial+mechanics%2Caps%2C89&amp;sr=8-1">Mathematical Aspects of Classical and Celestial Mechanics</a></p>
</blockquote>
<p>Bibliographisch:
<a href="https://en.wikipedia.org/wiki/Vladimir_Arnold">Vladimir Arnold</a> (1937—2010),
<a href="https://en.wikipedia.org/wiki/Valery_Vasilevich_Kozlov">Valery Vislevich Kozlov</a> (*1950),
<a href="https://scholar.google.co.uk/citations?user=ZG4SF0sAAAAJ&amp;hl=en">Anatoly Neishtadt</a>.</p>
<p>Es liegt nun nahe, die Begriffe $A[\alpha]$-Stabilität und
$S[\delta]$-Stabilität zu verfeinern.
Hierzu wird das Verhalten der Differenzengleichung für $\mathop{\rm Re}\nolimits  H\to-\infty$
mit in die Nomenklatur integriert.
Dies führt jetzt zur</p>
<p><strong>1. Definition:</strong>
(1) Ein $S[\delta]$-stabiles Matrixpolynom $Q(\mu,H)$ mit der Eigenschaft,
daß die sämtlichen Nullstellen $\mu$ für $\mathop{\rm Re}\nolimits  H\to-\infty$ in der offenen,
Kreisscheibe $\{z\in\mathbb{C}: \mathopen|z\mathclose|&lt;r\}$ liegen, nennt man
$S_\infty^r[\delta]$-stabil.
Für $r=1$ sagt man abkürzend nur $S_\infty[\delta]$-stabil.</p>
<p>(2) Analog definiert man $A_\infty^r[\alpha]$-Stabilität als Erweiterung
der $A[\alpha]$-Stabilität.
Erneut bezeichnet $A_\infty[\alpha]$-Stabilität die Abkürzung für
$A_\infty^1[\alpha]$-Stabilität.</p>
<p>(3) Für $r=0$ ist $r\to0$ gemeint, also: Die sämtlichen Nullstellen $\mu$
für $\mathop{\rm Re}\nolimits  H\to-\infty$ verschwinden.
Hierfür schreibt man $A_\infty^0[\alpha]$- bzw. $S_\infty^0[\delta]$-stabil.</p>
<p>(4) Der Wert $r$ bei der $S_\infty^r[\delta]$-
bzw. $A_\infty^r[\alpha]$-Stabilität heißt Widlund-Endradius.
I.a. wird ein kleinstmöglicher Wert angegeben und von <em>dem</em>
Widlund-Endradius gesprochen.</p>
<p>Hat ein Verfahren das Matrixpolynom $Q(\mu,H)$, so vererbt sich der
entsprechende Name auf das Verfahren.
Genauso hätte man auch die $A[\alpha]$- bzw. $S[\delta]$-Stabilität
einführen können.
Die Werte $\alpha$ und $\delta$ bei den Stabilitätsdefinitionen werden
in der Schreibweise unterdrückt, wenn die Wert $\alpha=90^\circ$,
bzw. $\delta=0$ betragen, genau w.o. auch.</p>
<p>Die Definition von $A_\infty^0$-Stabilität verallgemeinert offensichtlich
den Begriff der <a href="https://en.wikipedia.org/wiki/L-stability">L-Stabilität</a> für Einschrittverfahren.</p>
<p>Offensichtlich ist jedes $A_\infty^{r_1}[\alpha]$-stabiles Polynom auch
$A_\infty^{r_2}[\alpha]$-stabil, falls $r_1&lt;r_2$, nicht jedoch immer
umgekehrt.
Gleiches gilt für die entsprechend andere Stabilitätseigenschaft, also
jedes $S_\infty^{r_1}[\delta]$-stabile Polynom ist natürlich auch
$S_\infty^{r_2}[\delta]$-stabil, falls $r_1&lt;r_2$.
Insbesondere ist jedes $A_\infty^0[\alpha]$-stabile Polynom auch
$A_\infty[\alpha]$- und $A[\alpha]$-stabil.</p>
<p>I.d.R. wird man ein kleinstmögliches $r$ bei größtmöglichen $\alpha$,
bzw. ein kleinstmögliches $r$ bei kleinstmöglichem $\delta$, anstreben.</p>
<p>Welche der Eigenschaften insgesamt am günstigsten ist, kann allgemein nicht
gesagt werden.
Man hat hier einen Zielkonflikt.
Dies hängt auch von der zu lösenden Differentialgleichung ab.
Weiß man im voraus, daß beispielsweise die zu lösende lineare
Differentialgleichung $\dot y=Ay$ eine Jacobimatrix $A$ mit nur negativen
reellen Eigenwerten hat, so ist ein großer Widlund-$\alpha$-Winkel unerheblich.
Aber selbst einer beliebigen festen Matrix anzusehen, ob sie nur reelle
Eigenwerte hat, ist keine triviale Aufgabe.</p>
<p><strong>2. Beispiele:</strong>  (1) Die BDF der Ordnung
$p=1$ bis $p=6$, die Formeln von Peter Tischer aller Ordnungen und
auch die Formeln von Tendler aller Ordnungen sind $A_\infty^0[\alpha]$-
und $S_\infty^0[\delta]$-stabile Verfahren.
Aber auch die blockimpliziten Verfahren von
Bickart/Picel (1973)
sind $A_\infty^0[\alpha]$- und $S_\infty^0[\delta]$-stabile Verfahren.</p>
<p>(2) Liniger/Gagnebin (1974)
zeigten u.a., daß</p>
<div class=math>
$$
    (40-\xi)y_{n+3}-(60-\xi)y_{n+2}+(24-3\xi)y_{n+1}-(4-\xi)y_n=24h\dot y_{n+3}
$$
</div>
<p>$A_\infty^0=S_\infty^0$-stabil ist für $0\le\xi\le16$.
Der lokale Fehler ist hierbei</p>
<div class=math>
$$
    -(4+\xi)h^3y^{(3)}(t) + {\cal O}(h^4).
$$
</div>
<p>Für $\xi=-4$ erhält man die BDF3, welche $A_\infty^0[86.03^\circ]$- und
$S_\infty^0[0.083]$-stabil ist.</p>
<p><a href="https://de.wikipedia.org/wiki/Werner_Liniger">Werner Liniger (1927—2017)</a> und Gagnebin, Thierry:
&quot;<a href="https://doi.org/10.1007/978-1-4684-2100-2_17">Construction of a Family of Second Order, $A$-Stable $k$-Step Formulas
Depending on the Maximum Number, $2k-2$, of Parameters</a>&quot;,
in &quot;<a href="https://doi.org/10.1007/978-1-4684-2100-2">Stiff Differential Systems</a>&quot;, Editor Ralph A. Willoughby,
Plenum Press, New York and London, 1974, pp.217—227</p>
<p>(3) Für ein nicht-triviales Beispiel, wo diese Eigenschaften erfüllt, aber
auch möglicherweise nicht erfüllt sind, kann man wie folgt vorgehen.
Kombiniert man in zyklischer Reihenfolge $i$-mal das explizite und
$j$-mal das implizite Eulerverfahren, so erhält man sofort für die
Nullstelle $\mu$ von $\det Q(\mu,H)$ die Gleichung</p>
<div class=math>
$$
    \mu = {(1+H)^i\over (1-H)^j},
$$
</div>
<p>der man augenblicklich ansieht, daß für betragsmässig große $H$ mit
negativem Realteil, die Nullstelle $\mu$ sich wie untenstehend verhält:</p>
<div class=math>
$$
    \mathopen|\mu\mathclose| \stackrel{\mathop{\rm Re}\nolimits H\to-\infty}{\longrightarrow} %\mapright^{\mathop{\rm Re}\nolimits H\to-\infty}
    \cases{\infty,& falls $i\gt j$;\cr
           1,     & falls $i=j$;\cr 0,& falls $i\lt j$.\cr}
$$
</div>
<p>Interessant hierbei ist, daß eine Kombination impliziter Verfahren mit
expliziten Verfahren dennoch $A_\infty^0[\alpha]$-stabil,
bzw. $S_\infty^0[\delta]$-stabil sein kann.
Bei partiellen Differentialgleichungen, wo die Implizitheit von
Formeln häufig noch schwerlastiger auf die gesamte Rechenzeit einwirken,
werden sogar tatsächlich Kombinationen von expliziten und impliziten
Verfahren verwendet, beispielsweise beim
<a href="http://www.cfd.tu-berlin.de/Lehre/tfd_skript/node27.html">leapfrog-DuFort/Frankel-Verfahren</a>, oder beim
odd-even-hopscotch-Verfahren.</p>
<p>Schwächt man noch weiter ab, daß also nicht mehr konstante Schrittweiten
zu nehmen sind, sondern auch variable Schrittweiten, so kann man sogar
alleine mit expliziten Verfahren prinzipiell auskommen.
Der Hinweis auf das Prinzipielle deswegen, weil die resultierenden
Verfahren nicht notwendig auch im praktischen Gebrauch gut einsetzbar sind.</p>
<p>Beim expliziten Eulerverfahren liegen die Verhältnisse besonders
durchsichtig vor.
Hier ist</p>
<div class=math>
$$
    \mu = (1+H_1)(1+H_2)\cdots(1+H_\nu)
$$
</div>
<p>und offensichtlicherweise kann man durch ein geeignet gewähltes $H_i$, mit
$1\le i\le\nu$ das obige Produkt zum Verschwinden bringen.
Bei vektorwertigen Differentialgleichungen liegen die Verhältnisse nicht
mehr so einfach.
<a href="https://www.genealogy.math.ndsu.nodak.edu/id.php?id=95282">John (Jack) D. Lambert</a> in <a href="https://doi.org/10.1016/0898-1221(86)90238-5">Lambert (1986)</a>
äußert sich hier in größerem Umfange zu dieser Problematik.
<a href="https://de.wikipedia.org/wiki/Hans_J%C3%B6rg_Stetter">Hans Jörg Stetter</a> reißt dieses Thema kurz in seinem
Buch &quot;<a href="https://doi.org/10.1007/978-3-642-65471-8">Analysis of Discretization Methods for Ordinary Differential Equations</a>&quot; von 1973 an, in dem Abschnitt über die Stabilitätsbereiche zyklischer Verfahren.</p>
<p><strong>3.</strong> Weiteren Aufschluß über die Stabiltät eines linearen Verfahrens erhält
man, wenn man versucht zu quantifizieren, wie schnell die vom Verfahren
gelieferten Näherungswerte abklingen.
Für genügend rasch abfallende Lösungen ist die folgende Stabilitätsmenge
von Interesse:</p>
<div class=math>
$$
    {\cal Y}_r := \left\{{\mskip 3mu} H\in\mathbb{C}: \det Q(\mu,H)=0 \: \land\: 
        \mathopen|\mu\mathclose|\lt r {\mskip 3mu}\right\}.
$$
</div>
<p>Dies sind also diejenigen Zahlen $H$, sodaß $\det Q(\mu,H)$ verschwindet,
dabei $\mu$ aber stets aus der offenen Kreisscheibe $D_r$ ist.
Weiter werden jetzt die Mengen ${\cal A}[\alpha]$ und ${\cal S}[\delta]$
verallgemeinert zu Mengen, die den Radius $r$ mit berücksichtigen.
Hier ist insbesondere natürlich $0&lt;r&lt;1$ von Interesse.
Es seien also die Mengen betrachtet</p>
<div class=math>
$$
    {\cal A}_r[\alpha] := \left\{{\mskip 3mu} H\in\mathbb{C}^-:
        \left|\arg(-H)\right| \lt  \alpha \le90^\circ \hbox{ und }
        H\in{\cal Y}_r {\mskip 3mu}\right\}
$$
</div>
<p>und</p>
<div class=math>
$$
    {\cal S}_r[\delta] := \left\{{\mskip 3mu} H\in\mathbb{C}^-:\mathop{\rm Re}\nolimits  H\lt \delta\le0
        \hbox{ und } H\in{\cal Y}_r {\mskip 3mu}\right\}.
$$
</div>
<p>Zur Zeichnung des Randes $\partial{\cal Y}_r$ löst man
genügend oft das verallgemeinerte Eigenwertproblem in $H$ zu</p>
<div class=math>
$$
    (A_1\mu+A_0){\bf x} = H(B_1\mu+B_0){\bf x}, \qquad \mu = r e^{i\varphi}.
$$
</div>
<p>Mit $\varphi$ durchläuft man dann eine diskrete Teilmenge von
$[0^\circ,180^\circ]$, zum Beispiel
$\varphi = 0^\circ, 20^\circ, \ldots, 160^\circ, 180^\circ$.
Mit $r$ wandert man von $r=1$ beispielsweise in $(-1/10)$ Schritten
nach $r=0.1$.
Damit erhält man also die Höhenlinien der “Funktion” $H(r)$,
bzw. von $H(\mu)$.
Die “Funktion” $H(r)$ ist implizit definiert.
Die Betragsfunktion $\left|\cdot\right|$ wähle dann unter den
mehreren möglichen “Funktionswerten”, den betragsmässig größten
aus, ordnet also letztlich jedem $re^{i\varphi}$ eine komplexe Zahl $H$ zu.
Das bivariable Polynom $\det Q(\mu,H)$ ist natürlich algebraisch.
Lösungsäste algebraischer Funktionen haben höchstens algebraische
Singularitäten.
$\partial{\cal Y}_r$ kann aus mehreren Zusammenhangskomponenten bestehen,
insbesondere für kleiner werdende $r$ ziehen sich die “kreisförmigen”
Komponenten immer mehr zu den Nullstellenpunkten von $\det Q(\mu,0)=0$ zusammen.</p>
<p>Ein mehr geometrisch-anschaulich motivierter Ansatz geht von der Betrachtung
von $\mu(H)$ aus.
Dann löst man das verallgemeinerte Eigenwertproblem in $\mu$ zu</p>
<div class=math>
$$
    \left[ (A_1-HB_1)\mu + (A_0-HB_0) \right] {\bf x} = {\bf 0},
$$
</div>
<p>auf einem Gitter von $\mathbb{C}$ für genügend viele $H$ und zeichnet entweder
nur die betragsmässig größten $\mu$, oder zeichnet mehrere Schichten ein.
Eine räumliche Veranschaulichung dieses Sachverhaltes findet man in
Wanner (1987).</p>
<p>Wanner, Gerhard: &quot;Order Stars and Stability&quot;, in
&quot;The State of the Art in Numerical Analysis&quot;,
Proceedings of the joint IMA/SIAM conference held at the
University of Birmingham, 14–18 April 1986,
Edited by A. Iserles and M.J.R. Powell,
Clarendon Press, Oxford, 1987, 451—471</p>
<p>Für das verallgemeinerte Eigenwertproblem empfehlen sich die Unterprogramme
<code>cqzhes()</code>, <code>cqzval()</code> und <code>cqzvec()</code> von
<a href="https://dl.acm.org/doi/pdf/10.1145/356502.356500">Burton S. Garbow (1978)</a>, und
<a href="http://dx.doi.org/10.1145/2701.356113">Garbow (1984)</a>, welche eine Implementierung des
<a href="https://en.wikipedia.org/wiki/Schur_decomposition#Generalized_Schur_decomposition"><em>QZ</em>-Algorithmuses</a> von <a href="https://www.jstor.org/stable/2156353">Moler/Stewart (1973)</a>
darstellen.
Aufgrund der Reellität der Matrixkoeffizienten, also</p>
<div class=math>
$$
    \overline{\sum A_i}=\sum A_i, \hbox{ und wegen }
    \overline{e^{i\varphi}} = e^{-i\varphi},
$$
</div>
<p>ist das Stabilitätsgebiet stets
achsensymmetrisch zur reellen Achse $\mathbb{R}\subset\mathbb{C}$.
Die Eigenvektoren mittels <code>cqzvec()</code> werden für obige Stabilitätsüberlegungen nicht benötigt.</p>
<p>Bibliographisch:
<a href="https://en.wikipedia.org/wiki/Cleve_Moler">Cleve Moler</a> und
<a href="https://history.siam.org/oralhistories/stewart.htm">G.W. &quot;Pete&quot; Stewart</a>.
Verfahrensbeschreibung: <a href="https://www.researchgate.net/publication/235012188_An_Algorithm_for_the_Generalized_Matrix_Eigenvalue_Problem_Ax_Lambda_Bx">An Algorithm for the Generalized Matrix Eigenvalue Problem Ax = Lambda Bx</a>.
Ferner <a href="https://www.researchgate.net/scientific-contributions/Burton-S-Garbow-60801016">Burton S. Garbow</a>.</p>
<p><strong>4.</strong> Bei dem, wie schon oben angegebenen charakteristischen Polynom</p>
<div class=math>
$$
    \det Q(\mu,H) = \det\left\{\sum_{i=0}^\kappa (A_i - H B_i) \mu^i\right\},
$$
</div>
<p>erhält man für immer mehr dominierendes $H$ schließlich im Grenzfalle
das Polynom $\det Q(\mu,\infty)$ zu</p>
<div class=math>
$$
    \det Q(\mu,\infty) = \det\left\{ \sum_{i=0}^\kappa B_i\mu^i \right\},
$$
</div>
<p>in etwas nachlässiger, aber sehr suggestiver Schreibweise.
Es ist hier interessant zu vermerken, daß jetzt $A_{\infty}[\alpha]$- und
$S_{\infty}[\delta]$-Stabilität zueinander äquivalent sind, für geignete
$\alpha$ und $\delta$.
Dies ist ein weitergehendes Ergebnis, als man es von
der $A[\alpha]$- und $S[\delta]$-Stabilität her kannte.</p>
<p><strong>5.</strong> Um nun zu überprüfen ob ein Verfahren sogar
$A_{\infty}[\alpha]$-stabil, bzw. $S_{\infty}[\delta]$-stabil
ist, erweitert man die 1.te Bedingung im Test A zu einer neuen Bedingung (1)
und erhält damit den</p>
<p><strong>6. Test B:</strong> Ein Verfahren ist $A_\infty^r[\alpha]$-stabil,
bzw. $S_\infty^r[\delta]$-stabil genau dann, wenn:</p>
<ol>
<li>die Nullstellen von $\det Q(\mu,\infty)$ liegen in der offenen
Einheitskreisscheibe und</li>
<li>die Kurve der Punkte $H$, die
$\det Q(\mu,H)|_{\mathopen|\mu\mathclose|=r} = 0$ erfüllen, im
Komplement von ${\cal A}[\alpha]$, bzw. im Komplement von
${\cal S}[\delta]$ liegen.</li>
</ol>
<p><strong>7.</strong> Eine Möglichkeit die Bedingung (1) bei Test B zu erfüllen ist, wie es
u.a. <a href="https://dblp.org/rec/conf/ifip/Gear68.html">Gear (1968)</a> vorgeschlagen hat,
daß man alle Nullstellen $\mu$ von $\det Q(\mu,\infty)=0$ zu Null setzt.
Dies ist z.B. der Fall, wenn man fordert:</p>
<div class=math>
$$
    \beta_{ij} = 0\quad (j\le0), \qquad \beta_{ii}\ne0.  \tag {NULL}
$$
</div>
<p>Eine einfache, notwendige und hinreichende Bedingung wird später angegeben.
Von der Sicht des Speicherplatzes, des Rechenbedarfs und der
programmiermässigen Einfachheit, sind diese Nullen besonders vorteilhaft
einsetzbar.
Diese Vorteile werden in dem Programm TENDLER genutzt.
Das Programm ODIOUS kann diese Vorteile natürlich nicht nutzen, aufgrund
$B_i\ne0$, für $i=0,\ldots,\kappa$.</p>
<p>Zusammen mit der Bedingung (LMSV) ergibt nun die Bedingung (NULL), daß</p>
<div class=math>
$$
    \det Q(\mu,\infty) = \pm\mu^{\kappa\ell} \prod_{i=1}^{\ell} \beta_{ii}.
$$
</div>
<p>Nun enthält jede Stufe des Zykluses der Ordnung $p=k$, die der Bedingung
(LMSV) und (Null) genügt, noch $\min\{i,k+1\}$ Parameter.
Jede Stufe kann aber noch skaliert werden, ohne die Stabilitätseigenschaften
zu verändern, d.h. von jeder Stufe muß man noch einen freien
Parameter abziehen.
Es bleiben dann $\min\{i-1,k\}$ völlig frei bestimmbare
Parameter für die $i$-te Stufe, also ist</p>
<div class=math>
$$
\eqalignno{
   {\ell(\ell-1)\over2}, &\qquad\hbox{falls}\quad\ell\le k+1\cr
   {k\left[ 2\ell - (k+1)\right]\over2}, &\qquad\hbox{falls}\quad\ell\ge k+1.\cr}
$$
</div>
<p>Wählt man die $\beta_{ij}$ für $0&lt;j&lt;i$, alle zu Null, so erhält man
wieder die BDF.
In diesem Sinne kann man die zyklischen Formeln von J.M. Tendler als
echte Verallgemeinerung der einstufigen BDF auffassen.
In der Tat unterscheiden sich die Formeln auch nicht allzu sehr in
ihren Eigenschaften und in ihren Ergebnissen, die sie liefern, insbesondere
ist bei den zyklischen Verfahren von Tendler die erste Stufe auch
immer gleich der entsprechenden BDF.</p>
<p><strong>8.</strong> Die sämtlichen bisherigen Stabilitätsdefinitionen gehören zur “Begriffswelt”
der absoluten Stabilität, nicht jedoch zur relativen Stabilität.
Für den Begriff der relativen Stabilität benötigt man die folgenden
Überlegungen.
Sei</p>
<div class=math>
$$
    L(t,y,h) = \sum_{\nu=0}^m \sum_{i=0}^k \alpha_{i\nu} h^\nu y^{(\nu)}(t+ih).
$$
</div>
<p>Dann ist</p>
<div class=math>
$$
    \det Q(\mu,H) = \sum_{\scriptstyle{0\le\nu\le m}\atop\scriptstyle{0\le i\le k}}
        \alpha_{i\nu} H^\nu \mu^i
    = \sum_{0\le i\le k} a_i(H)\mu^i
    = a_k(H) (\mu-\xi_1(H))\cdot\ldots\cdot(\mu-\xi_k(H)).
$$
</div>
<p>Sei $\mu=1$ einfache Nullstelle von</p>
<div class=math>
$$
    \rho_0 = \sum_{0\le i\le k} \alpha_{i0} \mu^i.
$$
</div>
<p>Da dann $\mu=1$ separiert ist, folgt aufgrund der <a href="https://eklausmeier.goip.de/blog/2024/02-05-stetigkeit-der-eigenwerte-in-abhaengigkeit-der-matrixkomponenten">stetigen Abhängigkeit</a> der
Wurzeln für genügend kleine $h$</p>
<div class=math>
$$
    \mathopen|e^H - \xi_\nu(H)\mathclose| \ge C, \qquad \nu=2,\ldots,k,
$$
</div>
<p>das ist die Fortpflanzung der Separiertheit für genügend kleine $h$.
Jetzt muß aber</p>
<div class=math>
$$
    \xi_1(H) = e^H + {\cal O}(H^{p+1}) = e^H + {\cal O}(h^{p+1})
$$
</div>
<p>gelten, damit $Q(\mu,H)={\cal O}(h^{p+1})$ für $\mu=e^H$, aufgrund der
Konsistenz von $L$.</p>
<p><strong>9. Definition:</strong>  Ein Matrixpolynom</p>
<div class=math>
$$
    Q(\mu,H) = \sum_{\scriptstyle{0\le\nu\le m}\atop\scriptstyle{1\le i\le k}}
        A_{i\nu} H^\nu \mu^i
$$
</div>
<p>heißt konsistent mit mindestens der Konsistenzordnung $p$
genau dann, wenn die formale Ersetzung der Skalare $\mu^i$ ($i=0,\ldots,k$)
durch die Vektoren</p>
<div class=math>
$$
    \pmatrix{1\cr \vdots\cr \mu^{\ell-1}\cr},\quad\ldots\quad
    \pmatrix{\mu^{i\ell}\cr \vdots\cr \mu^{i\ell+\ell-1}\cr},\quad\ldots\quad
    \pmatrix{\mu^{k\ell}\cr \vdots\cr \mu^{k\ell+\ell-1}\cr}
$$
</div>
<p>($\mu=e^H$) dann liefert</p>
<div class=math>
$$
    Q(\mu,H) = \pmatrix{{\cal O}(H^{p_1+1})\cr \vdots\cr {\cal O}(H^{p_\ell+1})\cr},
    \qquad (p\ge p_i).
$$
</div>
<p>Das Matrixpolynom $Q(\mu,H)$ ist konsistent mit der genauen Ordnung
$\min_{i=1}^\ell p_i$.
Gilt $p_i\ge1$ ($\forall i$), so heißt das Matrixpolynom konsistent.
Möchte man die besondere Form</p>
<div class=math>
$$
    [\mu^{i\ell},\ldots,\mu^{i\ell+\ell-1}], \qquad (\mu=e^H)
$$
</div>
<p>besonders betonen, so spricht man von polynomial-konsistent.</p>
<p>Die obige Definition verallgemeinert $\rho(e^h)-h\sigma(e^h)={\cal O}(h^{p+1})$
auf $\ell$-Mehrstufigkeit mit $m$-facher Ableitung für äquidistante Gitter.
Die Konsistenz nach obiger Festlegung ist eine Eigenschaft des Matrixpolynomes.
Sie vererbt sich sinngemäß auf das Verfahren, welches dem Matrixpolynom
i.d.R. zugrunde liegt.</p>
<p>Zur besseren Unterscheidung zwischen absoluter und relativer Stabilität seien
beide einander gegenübergestellt.</p>
<p><strong>10. Definition:</strong>  (10.1) Ein Matrixpolynom $Q\mu,H)$ heißt
absolut-stabil
für ein $H_0$ genau dann, wenn für die sämtlichen Nullstellen $\mu$ von
$\det Q(\mu,H_0)=0$ gilt: $\mathopen|\mu\mathclose|&lt;1$.</p>
<p>(10.2) Die Menge ${\cal Y}_1$ derjenigen $H$, für die das
Matrixpolynom $Q(\mu,H)$ absolut-stabil ist, also</p>
<div class=math>
$$
    {\cal Y}_1 = \{H\in\mathbb{C}: \det Q(\mu,H)=0\: \land\: \mathopen|\mu\mathclose|\lt 1\}
$$
</div>
<p>heißt <em>Menge der absoluten Stabilität</em>.</p>
<p>Offensichtlich gilt: Enthält ${\cal Y}_1$ die offene, linke komplexe
Halbebene $\mathbb{C}^-$, so ist das Verfahren $A$-stabil.</p>
<p><strong>11. Definition:</strong>  (11.1) Ein konsistentes Matrixpolynom $Q(\mu,H)$,
für welches $\mu=1$ einfache Nullstelle von $\det Q(\mu,0)=0$ ist, heißt
relativ-stabil für ein $H_0$ genau dann, wenn gilt</p>
<div class=math>
$$
    \mathopen|\mu_i(H)\mathclose| \lt  \mathopen|\mu_1(H)\mathclose|
        \quad(i\ge2), \qquad \mu_1(0)=1.
$$
</div>
<p>$\mu_1(H)$ ist also die zu $\mu_1(0)=1$ gehörende Nullstelle, wobei
$Q(\mu_i(H),H)=0$ ($i\ge1$).
Hat $\det Q(\mu,H)$ in $\mu$ nur den Grad 1, so sei das Matrixpolynom
$Q(\mu,H)$ relativ-stabil.</p>
<p>(11.2) Die Menge $\cal Z$ derjenigen $H$, für die das Matrixpolynom $Q(\mu,H)$
relativ-stabil ist, also</p>
<div class=math>
$$
    {\cal Z} = \{H\in\mathbb{C}: \det Q(\mu,H)=0\: \land\: 
        \mathopen|\mu_i\mathclose|\lt \mathopen|\mu_1\mathclose|\: (i\gt 2)\}
$$
</div>
<p>heißt <em>Menge der relativen Stabilität</em>.</p>
<p>Im Falle eines linearen Differentialgleichungssystems $\dot y=Ay\in\mathbb{R}^n$
mit diagonalähnlicher Matrix $A$ entstehen bei Transformation $n$ skalare
Differentialgleichungen.
Eigenwerte von $A$ mit stark negativen Realteil, also $\mathop{\rm Re}\nolimits \lambda\ll0$,
führen zu schnell abklingenden Lösungen.
In diesem Falle zu forden, daß die Nebenwurzeln $\mu_i(H)$ die Hauptwurzel
$\mu_1(H)$ nicht betragsmässig übersteigen ist nur wichtig, wenn man an sehr
hoher relativer Genauigkeit interessiert ist, sonst allerdings nicht.
Wesentlicher ist in diesem Falle die absolute Stabilität.
Man ist an Exponentialtermen nur so lange interessiert, wie sie einen im Rahmen
der Rechengenauigkeit signifikanten Einfluß auf das Gesamtergebnis besitzen.
Spielen stark abklingende Terme keine Rolle mehr, so genügt absolute
Stabilität.
Dies motiviert die</p>
<p><strong>12. Definition:</strong>  (12.1) Ein konsistentes Matrixpolynom $Q\mu,H)$
heißt $LR$-$S[\delta]$-stabil genau dann, wenn es $S[\delta]$-stabil ist
und das um den Ursprung angeordnete Rechteck</p>
<div class=math>
$$
    {\cal R} = \{H\in\mathbb{C}: a_1\le\mathop{\rm Re}\nolimits  H\le a_2\: \land\: 
        b_1\le\mathop{\rm Im} H\le b_2\}
$$
</div>
<p>mit $a_1&lt;0&lt;a_2$, $b_1&lt;0&lt;b_2$ Teilmenge der Menge der relativen Stabilität ist.</p>
<p>(12.2) Analog definiert man $LR$-$S_\infty^r[\delta]$- und
$LR$-$A_\infty^r[\alpha]$-Stabilität.</p>
<p>$LR$ soll an lokal-relativ erinnern.
Die Festlegung auf ein Rechteck ist nicht wesentlich.
Genauso gut hätte man eine Kreisscheibe, eine elliptische Scheibe, ein
Hexagon, etc. nehmen können, solange es um den Ursprung angeordnet ist.
Je umfassender $\cal R$ ist, desto günstiger.
Die Begrenzung in $b_1$ und $b_2$ rührt daher, daß Exponentialterme mit stark
imaginären Anteil, aber geringen negativen Realteil als Exponent, noch mehr
Eigenschaften benötigen als relative Stabilität.
Für Differentialgleichungen mit periodischen
Lösungen sind <a href="https://doi.org/10.1007/3-540-30666-8">gesonderte Formeln</a> besser geeignet.</p>
<p>Abweichend von der Definition in <a href="https://books.google.de/books/about/Numerical_Initial_Value_Problems_in_Ordi.html?id=e9QQAQAAIAAJ&amp;redir_esc=y">Gear (1968)</a>
und auch abweichend von der Definition in
<a href="https://www.amazon.de/Gew%C3%B6hnliche-Differentialgleichungen-Einf%C3%BChrung-Theorie-Hochschultext/dp/3540152881">Werner/Arndt (1986)</a>,
aber völlig sinnentsprechend wie in <a href="https://dl.acm.org/doi/pdf/10.1145/356502.356495">Tendler/Bickart/Picel (1978)</a>,
in <a href="https://doi.org/10.1007/BF01951938">Bickart/Picel (1973)</a> und in <a href="https://www.amazon.de/numerische-Behandlung-gew%C3%B6hnlicher-Differentialgleichungen-Ber%C3%BCcksichtigung/dp/3112728440">Albrecht (1979)</a>,
sei wie folgt definiert.</p>
<p><strong>13. Definition:</strong>  Ein konsistentes Matrixpolynom $Q(\mu,H)$,
welches einer oder mehrerer der Bedingungen der
$A[\alpha]$-, $S[\delta]$-, oder $LR$-$A[\alpha]$-,
$LR$-$S[\delta]$-Stabilität genügt, heißt steif-stabil.</p>
<p>Bibliographisch:</p>
<ol>
<li><a href="https://www.researchgate.net/profile/Theodore-Bickart/research">Theodore A. Bickart (1936—2023)</a>, <a href="https://www.legacy.com/us/obituaries/coloradocommunitymedia/name/theodore-bickart-obituary?id=53536695">obituary</a>,</li>
<li><a href="https://de.wikipedia.org/wiki/Helmut_Werner_%28Mathematiker%29">Werner, Helmut (1931—1985)</a>,</li>
<li><a href="https://www.mathgenealogy.org/id.php?id=35442">Arndt, Herbert</a>,</li>
<li><a href="https://en.wikipedia.org/wiki/C._William_Gear">Gear, Charles William (1935—2022)</a>,</li>
<li><a href="https://genealogy.math.ndsu.nodak.edu/id.php?id=23871">Peter Albrecht</a>.</li>
</ol>
<p>Bickart, Theodore A. und Picel, Zdenek:
&quot;<a href="https://doi.org/10.1007/BF01951938">High Order Stiffly Stable Composite Multistep Methods for Numerical
Integration of Stiff Differential Equations</a>&quot;, BIT, Vol 13, 1973,
pp.272—286</p>
<p>Albrecht, Peter: “<a href="https://juser.fz-juelich.de/record/842404/files/J%C3%BCl_1274_Albrecht.pdf?version=1">Numerische Behandlung gewöhnlicher Differentialgleichungen</a>”,
Jül-1274, Februar 1976, Berichte der Kernforschungsanlage Jülich, Institut für Festkörperforschung,
<a href="https://eklausmeier.goip.de/pdf/J%C3%BCl_1274_Albrecht.pdf">Kopie</a></p>
<h2>5. Konstruktive Herleitung steif-stabiler zyklischer Formeln<a id=Konstruktion></a></h2>
<blockquote>
<p>A computer program for plotting both the Lambda and Zeta Loci was
presented and described.
Using an interactive version of this program new and efficient
cyclic composite linear multistep methods of orders three through
seven were obtained. $\ldots$<br>
The test for stiff stability of a composite linear multistep method
presented herein is entirely graphical. $\ldots$<br>
Interactive communication was via a teletypewriter, the only device
available for this purpose at the computer facility used.</p>
<p><a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">J.M. Tendler (1973)</a></p>
</blockquote>
<p><strong>1.</strong> In diesem Abschnitt wird darauf eingegangen, wie die in dem Programm
TENDLER verwendeten Formeln, von <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a>
entwickelt wurden.
Neben der schon mehrfach erwähnten Dissertation von J.M. Tendler, findet man
eine Darstellung der Parametrisierung von Verfahren in dem Aufsatz von
<a href="https://doi.org/10.1137/0708018">Donelson/Hansen (1971)</a>.
U.a. weitere Hinweise zur Konstruktion generell zyklischer Verfahren und
auch steif-stabiler zyklischer Verfahren, einschließlich entsprechender
Parametrisierungen, findet man in dem Buch von
<a href="https://www.amazon.de/numerische-Behandlung-gew%C3%B6hnlicher-Differentialgleichungen-Ber%C3%BCcksichtigung/dp/3112728440">Albrecht (1979)</a>.</p>
<p>Die beiden Aufsätze von <a href="https://wwwzb.fz-juelich.de/verlagextern1/index.asp?Msg=list&amp;Jahr=1977&amp;PageNo=4">Mihelčić (1977)</a>,
<a href="http://dx.doi.org/10.1007/BF02251950">Mihelčić (1978)</a>,
die Veröffentlichung von <a href="http://dx.doi.org/10.1002/zamm.19810610609">Mihelčić/Wingerath (1981)</a>,
und die Disserattion von Tischer (1983), die Arbeit
<a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>
bzw. <a href="https://doi.org/10.1145/214408.214417">Tischer/Gupta (1985)</a>,
liefern ebenfalls Aufschluß über die Gewinnung zyklischer, steif-stabiler
Verfahren.
<a href="https://doi.org/10.1145/214408.214417">Tischer/Gupta (1985)</a> äußern sich
dort mehr zu den Erfahrungen mit den von Tischer (1983)2 und
Tischer/Sacks-Davis (1983)3 gewonnen Formeln, wobei auch weitere
zyklische Formeln in die Bewertung mit eingeschlossen werden.</p>
<p>Die Dissertation von Tischer (1983) und die Arbeit von <a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a> geben sogar
zweistufige $A_\infty^0$-stabile zyklische Verfahren an bis zur Ordnung
$p\le4$.
Über der Ordnung $p&gt;4$ sind die weiterhin zweistufigen Zyklen noch
$A_\infty^0[\alpha]$-stabil, mit $\alpha$=$86^\circ$, $76^\circ$,
$57^\circ$, und $22^\circ$.
Die Formeln erfüllen sogar noch zahlreiche weitere wünschenswerte
Eigenschaften, allerdings haben sie auch gewisse Nachteile.</p>
<p>Bibliographisch. <a href="https://hrcak.srce.hr/file/413565">Matija (Miško) Mihelčić</a> (1935—2011),
<a href="https://www.researchgate.net/profile/Peter-Tischer-2">Peter E. Tischer</a>.</p>
<p>Matija Mihelčić (Mihelcic): &quot;<a href="https://wwwzb.fz-juelich.de/verlagextern1/index.asp?Msg=list&amp;Jahr=1977&amp;PageNo=4">Fast $A$-stabile Donelson-Hansensche
zyklische Verfahren zur numerischen Integration von
'stiff'-Differentialgleichungssystemen</a>&quot;,
Angewandte Informatik, 1977, Vol 19, Heft 7, pp.299—305</p>
<p>Matija Mihelčić (Mihelcic): &quot;<a href="http://dx.doi.org/10.1007/BF02251950">$A(\alpha)$-Stable Composite
Multistep Methods of Order 5</a>&quot;, Computing, Vol 20, 1978,
pp.267—272</p>
<p>Matija Mihelčić (Mihelcic) und K. Wingerath: &quot;<a href="http://dx.doi.org/10.1002/zamm.19810610609">$A(\alpha)$-stable
Cyclic Composite Multistep Methods of Orders 6 and 7 for Numerical
Integration of Stiff Ordinary Differential Equations</a>&quot;, ZAMM, Band 61,
1981, pp.261—264</p>
<p>Tischer, Peter E.: &quot;The Cyclic Use of Linear Multistep
Formulas for the Solution of Stiff Differential Equations&quot;, Ph.D. Thesis,
Department of Computer Science, Monash University, Clayton, Victoria,
Australia, August 1983, <em>x</em>+180 S.</p>
<p>Tischer, Peter E. und Sacks-Davis, Ron: &quot;<a href="https://doi.org/10.1137/0904051">A New Class of
Cyclic Multistep Formulae for Stiff Systems</a>&quot;,
SIAM Journal on Scientific and Statistical Computing,
Vol 4, No 4, December 1983, pp.733—747.</p>
<p><strong>2.</strong> Für die gestellte Aufgabe zur Gewinnung neuerer und besserer
Verfahren für die Integration steifer Differentialgleichungen ging
<a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a> wie folgt vor:
Man entwerfe zyklische Formeln der Konvergenzordnung 1 bis 6, die Ordnung
für Ordnung bessere Stabilitätseigenschaften besitzen als die BDF.
Falls möglich sollten sogar Verfahren mit einer Ordnung höher als 6
entwickelt werden.
Als Vergleichsmaßstab wurde der Widlund-$\alpha$-Winkel gewählt.
Andere Kriterien spielten keine Rolle.</p>
<p>Die Bedingungen (Null) und (LMSV) an die Koeffizienten $\alpha_{ij}$
und $\beta_{ij}$, sorgen dafür, daß der Zyklus stets die folgende Form
hat</p>
<div class=math>
$$
    \underbrace{
        \begin{array}{cccccc}
            *&*&*&*& & \cr
             &*&*&*&*& \cr
             & &*&*&*&*
        \end{array}
    }_{ \displaystyle\alpha_{ij} }
    \qquad \quad
    \underbrace{
        \begin{array}{cccccc}
            0&0&0&*& & \cr
             &0&0&*&*& \cr
             & &0&*&*&*
        \end{array}
    }_{ \displaystyle\beta_{ij} }
$$
</div>
<p>Die BDF erster und zweiter Ordnung</p>
<div class=math>
$$
\eqalign{
     y_{n+1}  &= y_n + h\dot y_{n+1}, \cr
     3y_{n+1} &= 4y_n - y_{n-1} + 2h\dot y_{n+1} }
$$
</div>
<p>sind beide $A_{\infty}^0[\alpha]$-stabil mit optimalen Widlund-Winkel von
$\alpha=90^\circ$ und optimaler Widlund-Distanz $\delta=0$, sodaß damit
eine weitere Verbesserung nicht mehr möglich ist, wenn man wie gesagt nur
den Widlund-$\alpha$-Winkel als Vergleichsmaßstab nimmt.
Diese beiden Verfahren werden daher auch für $p=1$ und entsprechend
für $p=2$ in dem Programm TENDLER verwendet.</p>
<p>Die $i$ Parameter in der $i$-ten Stufe deuten darauf hin, daß $i$ linear
unabhängige Formeln in geeigneter Kombination ausreichen, um ein neues
Verfahren zu konstruieren.
Für die Ordnungen $p=3$ und höher, wurde daher wie
folgt die Suche nach besseren Formeln durchgeführt:</p>
<ol>
<li>Im ersten Schritt wurden zyklische Formeln gewonnen,
die die Bedingung (LMSV) und (Null) erfüllen und</li>
<li>im zweiten Schritt wurde der Widlund-$\alpha$-Winkel numerisch
berechnet und mit dem entsprechenden Winkel für die BDF verglichen.</li>
<li>War dann der Winkel größer und damit besser, wurde die Suche abgebrochen,
andernfalls wurden die Parameter weiter variiert und der erste Schritt,
ggf. mit einer anderen Stufenzahl $\ell$, erneut durchgeführt.</li>
</ol>
<p>Beim ersten Schritt ging man wie folgt vor.
Zuerst wurde eine Folge von $k+1$ linear unabhängigen Mehrschrittformeln
aufgestellt, sodaß die $\beta$-Koeffizienten eine Diagonalmatrix bilden.
Wegen der linearen Unabhängigkeit ist dies immer zu erreichen.
Diese Diagonalform erleichtert das Generieren von Zyklen mit der Eigenschaft</p>
<div class=math>
$$
    \beta_{ij}=0 \quad (j\le0), \qquad \beta_{ii}\ne0.
$$
</div>
<p>Da nur Linearkombinationen von diesen Mehrschrittformeln gebildet werden,
ist das Erfülltsein von (LMSV) ebenfalls sofort klar.
Dann wurde für jedes $i=1,\ldots,\ell$ eine Linearkombination dieser Formeln
berechnet um daraus die $i$-te Stufe des Zykluses zu bilden.
Die Stufenzahl $\ell$ wurde versucht so klein wie möglich zu halten.</p>
<p>Um das Vorgehen zu illustrieren ein längeres Beispiel.</p>
<p><strong>3. Beispiel:</strong>  Es seien die $k+1=4$ linear unabhängigen
Mehrschrittformeln $F1$ bis $F4$ der Konsistenzordnung 3 betrachtet:</p>
<div class=math>
$$
    \matrix{F1:\cr F2:\cr F3:\cr F4:\cr}\qquad
    \pmatrix{ -2 &  9 & -18 & 11 & 0 & 0 & 0 & -6\cr
               1 & -6 &   3 &  2 & 0 & 0 & -6 & 0\cr
              -2 & -3 &   6 & -1 & 0 & -6 & 0 & 0\cr
             -11 & 18 &  -9 &  2 & -6 & 0 & 0 & 0
            }
    \pmatrix{ y_{n+i-3}\cr
              y_{n+i-2}\cr
              y_{n+i-1}\cr
              y_{n+i}\cr
              h\dot y_{n+i-3}\cr
              h\dot y_{n+i-2}\cr
              h\dot y_{n+i-1}\cr
              h\dot y_{n+i}
            }
       =
    \pmatrix{ 0\cr 0\cr 0\cr 0 }.
$$
</div>
<p>Jede Zeile der Matrix ist dabei das entsprechende Mehrschrittverfahren,
also die erste Zeile ist F1, die zweite ist F2 und so fort.
Das Verfahren $F1$ ist implizit, während hingegen $F2$, $F3$ und $F4$
explizite Verfahren sind.
Wie so häufig gilt auch hier, daß die einzelnen Stufen instabil sind, mit
Ausnahme der ersten, welche gerade die BDF3 ist, mit den Nullstellen 1 und
$0.3\overline{18}\pm 0.284i$.
Die Nullstellen der zweiten “Zeile” liegen bei 1, $-2.686$ und $0.186$.
Die dritte “Zeile” hat die Nullstellen 1, $5.372$ und $-0.372$ und
schließlich die letzte vierte Zeile hat die Nullstellen 1 und
$1.75\pm 1.561i$.
Diese Instabilität der Stufen bzw. von Komponenten der Stufen, überträgt
sich nicht automatisch auf den Gesamtzyklus.
Die Stabilität des Gesamtzyklus wird getrennt überprüft.</p>
<p>Von diesem Arsenal an Formeln wurde nun der
Zyklus für das Verfahren dritter Ordnung, wie folgt aufgebaut:
Jede Stufe wurde als Linearkombination der
$F1$ bis $F4$ erhalten, d.h. die $i$-te Stufe ist gleich</p>
<div class=math>
$$
    c_{i1}F1 + c_{i2}F2 + c_{i3}F3 + c_{i4}F4.
$$
</div>
<p>Um nun die Bedingung (NULL) zu erfüllen, muß offensichtlich $c_{ij}=0$
für $j&gt;i$ gelten.
Der Widlund-$\alpha$-Winkel wurde jetzt für die Werte maximiert:</p>
<div class=math>
$$
%\newcommand{\md}[2]{\mathchoice{\textstyle\nicefrac{#1}{#2}}{\nicefrac{#1}{#2}}{\nicefrac{#1}{#2}}{\nicefrac{#1}{#2}}}
\def\md#1{#1}
\begin{array}{lllll}
  \ell=3: & i=1: & c_{11}=1,  &                   & \cr
          & i=2: & c_{21}=1,  & c_{22}=0,   & \cr
          & i=3: & c_{31}=\md{1/3}, & c_{32}=-\md{2/3}, & c_{33}=-\md{2/3}.\cr
\end{array}
$$
</div>
<p>Der so gebildete Zyklus der Ordnung $p=3$ kann daher wie folgt geschrieben
werden:</p>
<div class=math>
$$
\begin{array}{ccccccccccccccccc}
-2y_{m\ell-2}&+&9y_{m\ell-1}&-&18y_{m\ell}&+&11y_{m\ell+1}&&&&%
    &=& 6h\dot y_{m\ell+1},\cr
&-&2y_{m\ell-1}&+&9y_{m\ell}&-&18y_{m\ell+1}&+&11y_{m\ell+2}&&%
    &=&&& 6h\dot y_{m\ell+2},\cr
&&&&&&9y_{m\ell+1}&-&12y_{m\ell+2}&+&3y_{m\ell+3}%
    &=& h\bigl(-4\dot y_{m\ell+1}&-&4\dot y_{m\ell+2}+2\dot y_{m\ell+3}\bigr).\cr
\end{array}
$$
</div>
<p>Weil der Widlund-$\alpha$-Winkel grösser und damit besser als der
entsprechende Winkel für BDF3 ausgefallen war, wurde der Zyklus akzeptiert.
Die Formeln der Konvergenzordnung $p=4$ bis $p=7$ wurden auf genau die oben
beschriebene Art und Weise erhalten.
Daß bei diesem Beispiel die ersten beiden Stufen gleich sind, nämlich
hier gleich BDF3, ist mehr oder minder Zufall.
Mit der Bedingung $c_{ij}=0$ für $i&gt;j$ hat dies nichts zu tun.
Beim zyklischen Verfahren sechster Ordnung sind auch tatsächlich
alle Stufen untereinander verschieden.
Bei allen anderen Verfahren hingegen, außer eben bei $p=6$, sind die
ersten beiden Stufen gleich und zwar gleich der entsprechenden BDF.</p>
<p><strong>4.</strong> Es waren 3 Stufen nötig für die
Verfahren 3.ter und 4.ter Ordnung und 4 Stufen für die Formeln 5.ter, 6.ter
und 7.ter Ordnung.
Die genauen Zahlenwerte für die Koeffizienten aller Zyklen werden später
in einem Schema angegeben.
Es sei angemerkt, daß immer die ersten beiden
Stufen des $i$-ten Zykluses mit BDF$i$ beginnen.
Dies gilt bei allen Verfahren, außer bei der Ordnung $p=6$.
Dort ist es nur die 1.te Stufe.</p>
<p><strong>5.</strong> Zum Vergleich seien einmal die Werte für den
Widlund-$\alpha$-Winkel für die neuen zyklischen Mehrschrittverfahren,
die in dem Programm TENDLER verwendet werden, mit denen der BDF in der
untenstehenden Tabelle gegenübergestellt.
Auch findet man die entsprechenden Werte für die Formeln, die in der Dissertation
Tischer (1983),
bzw. <a href="https://doi.org/10.1137/0904051">Tischer/Sacks-Davis (1983)</a>
entwickelt haben, unter der Spalte ODIOUS.
BP73 bezeichnet hier die blockimpliziten Verfahren von
<a href="https://doi.org/10.1007/BF01951938">Bickart/Picel (1973)</a>.
Die BDF$i$, für alle $i\ge7$, sind nicht $D$-stabil, also natürlich erst
recht nicht $A[\alpha]$- bzw. $S[\delta]$-stabil.
Einen Beweis und alternative Beweisansätze findet man in dem Buch von
<a href="https://www.amazon.de/Solving-Ordinary-Differential-Equations-Computational/dp/3540566708">Hairer/Wanner/Nørsett (1987)</a>
oder hier <a href="https://doi.org/10.1137/0720090">Hairer/Wanner (1983): On the Instability of the BDF Formulas</a>.</p>
<p>Zyklische Verfahren <em>über</em> der Ordnung $p=7$ werden in dem Programm
TENDLER nicht verwendet.
Die Programme LSODE, LSODA und LSODAR benutzen die BDF lediglich bis zur
Ordnung $p=5$.
Rechts daneben ist auch eine Gegenüberstellung der $\delta$-Werte bei
der $S_{\infty}[\delta]$-Stabilität.</p>
<p>Widlund-$\alpha$-Winkel</p>
<table>
<thead>
<tr>
<th><em>p</em></th>
<th>TENDLER</th>
<th>BDF</th>
<th>ODIOUS</th>
<th>BP73</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>90.00</td>
<td>90.00</td>
<td>90.00</td>
<td>90.0</td>
</tr>
<tr>
<td>2</td>
<td>90.00</td>
<td>90.00</td>
<td>90.00</td>
<td>90.0</td>
</tr>
<tr>
<td>3</td>
<td>89.43</td>
<td>86.03</td>
<td>90.00</td>
<td>88.9</td>
</tr>
<tr>
<td>4</td>
<td>80.88</td>
<td>73.35</td>
<td>90.00</td>
<td>87.7</td>
</tr>
<tr>
<td>5</td>
<td>77.48</td>
<td>51.84</td>
<td>86.64</td>
<td>85.5</td>
</tr>
<tr>
<td>6</td>
<td>63.25</td>
<td>17.84</td>
<td>76.32</td>
<td>82.7</td>
</tr>
<tr>
<td>7</td>
<td>33.53</td>
<td>*</td>
<td>57.66</td>
<td>79.5</td>
</tr>
<tr>
<td>8</td>
<td>*</td>
<td>*</td>
<td>22.15</td>
<td>76.0</td>
</tr>
<tr>
<td>9</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>72.5</td>
</tr>
<tr>
<td>10</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>69.6</td>
</tr>
</tbody>
</table>
<p>Widlund-Distanz $\delta$</p>
<table>
<thead>
<tr>
<th><em>p</em></th>
<th align="left">TENDLER</th>
<th align="left">BDF</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td align="left">0</td>
<td align="left">0</td>
</tr>
<tr>
<td>2</td>
<td align="left">0</td>
<td align="left">0</td>
</tr>
<tr>
<td>3</td>
<td align="left">0.0048</td>
<td align="left">0.083</td>
</tr>
<tr>
<td>4</td>
<td align="left">0.24</td>
<td align="left">0.67</td>
</tr>
<tr>
<td>5</td>
<td align="left">1.4</td>
<td align="left">2.3</td>
</tr>
<tr>
<td>6</td>
<td align="left">2.9</td>
<td align="left">6.1</td>
</tr>
<tr>
<td>7</td>
<td align="left">10.2</td>
<td align="left">*</td>
</tr>
</tbody>
</table>
<p>Die Widlund-Winkel der BDF können exakt bestimmt werden:
<a href="http://dx.doi.org/10.1007/s10543-019-00796-x">Gander/Wanner (2020): Exact BDF stability angles with maple</a>
und
<a href="https://doi.org/10.1007/s10543-019-00768-1">Akrivis/Katsoprinakis (2019): Maximum angles of $A(\vartheta)$-stability of backward difference formulae</a>, <a href="https://www.cs.uoi.gr/~akrivis/AK2a.pdf">PDF</a>.</p>
<p><strong>6.</strong> Die besseren Stabilitätseigenschaften, die sich durch den größeren
Widlund-$\alpha$-Winkel bemerkbar machen, erlauben nun einem Programm,
welches die hergeleiteten Formeln benutzt, früher die Schrittweite zu
erhöhen, da sie nicht durch Stabilitätsbeschränkungen verkleinert
werden muß.
Insbesondere für Differentialgleichungen, bei denen die
Eigenwerte der Jacobimatrix nahe der imaginären Achse sind, sollten
besser integriert werden können.</p>
<p>Das Suchverfahren nach steif-stabilen zyklischen Formeln wird beschrieben in
der Dissertation von <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a>.
Dort wird auch ein Programm zur Berechnung des Widlund-$\alpha$-Winkels
angegeben, basierend auf einem Polynomlöser.
Das hier beschriebene Suchverfahren hängt von einem Programm zur Berechnung
des Widlund-Winkels ab.</p>
<p>Man beachte, daß alle Verfahren interaktiv gefunden wurden:
“Probieren-gucken”, “probieren-gucken”, $\ldots$<br>
Wenn also hier von “maximiert” gesprochen wird, ist damit gemeint,
daß durch Suchen, nicht jedoch kalkülmässig, in geschlossener Form,
eine Maximierung stattgefunden hat.
Sieht man einmal von grundsätzlichen Einstellungen ab, so kann man diesem
pragmatischen Ansatz seine Bedeutung nicht absprechen.</p>
<p>Es wurde auch versucht ein Verfahren der Konvergenzordnung $p=8$ zu
erhalten, welches steif-stabil ist, doch gelang dies nicht.
Dies führt <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a> darauf zurück, daß eben
nur interaktiv gesucht wurde.
Eine andere Möglichkeit wird darin gesehen, daß die Begrenzung der Anzahl
der Stufen auf $\ell=4$ zu restriktiv gewesen sei.</p>
<p>Testläufe haben ergeben, daß die Auffindung von zyklischen Verfahren mit
mehr als 4 Stufen durchaus sinnvoll sein kann.
Oder m.a.W., die Erfahrungen mit dem Programm TENDLER deuten darauf hin,
daß Zyklen mit mehr als 4 Stufen nicht krass den praktischen Bedürfnissen
widerstreben.
Ob diese Erfahrung grundsätzlich für geeignete vielstufige Zyklen sich
bestätigen könnte, kann selbstverständlich nicht pauschal postuliert werden.
Ein Einbau solcher Formeln in das Programm TENDLER zumindestens wäre völlig
unproblematisch.
Da jede Stufe Element einer ringzyklischen Liste ist, macht es keinen
Aufwand hier eine weiteres Ringelement einzufügen.
Zudem ist die Konstante 4 als Programmkonstante <code>MAXYRING</code> abgelegt.</p>
<p>Außer Konstantenänderungen sind keine Änderungen nötig,
insbesondere keine algorithmischen, vorausgesetzt es handelt sich um echte
Verallgemeinerungen der BDF, wie es beispielsweise die Tendlerschen Zyklen
darstellen.
Man beachte hierzu die Ausführungen bzgl. der Prädiktorformeln.
Zu berücksichtigen ist jedoch, daß der Speicherplatzbedarf dann größer wird,
allerdings nur in linearen Termen der Dimension $n$ der
Differentialgleichung.
Dies nur, falls die Ordnung 7 übersteigt.
Dies liegt an der Notwendigkeit zur Bildung rückwärtsgenommener Differenzen
bis zur Ordnung $p+1$ in dem Programm TENDLER.</p>
<h2>6. Basisformeln der Tendlerschen Zyklen<a id=Basisformeln></a></h2>
<p><strong>1.</strong> Die Bestandteile der zyklischen Formeln von <a href="https://eklausmeier.goip.de/blog/2025/04-04-a-stiffly-stable-integration-process-using-cyclic-composite-methods">Tendler (1973)</a> lauten:</p>
<div class=math>
$$
\begin{array}{c|c}
p & i=1,\ldots,\ell\cr
\hline
j & \alpha_{ij}\cr
\hline
j & \beta_{ij}\cr
\end{array}
$$
</div>
<p>Die in jeder Tabelle ganz rechts stehende Formel, ist immer die BDF.
Die restlichen Formeln sind explizite Verfahren.
Alle unten aufgeführten Formeln benötigen $k$ Startwerte und besitzen
die Konsistenzordnung $p=k$.
Die im folgenden angegebenen Basisformeln sind also ersteinmal nur für die
Konstruktion von Zyklen der Konvergenzordnung $p=k$ geeignet.
Wünscht man andere Konvergenzordnungen, bei anderer Schrittzahl, so gelten
die Überlegungen jedoch entsprechend.
Berücksichtigt man den Effekt der annullierten Dominanz, so sind die
angegebenen Basisformeln auch für zyklische Verfahren der Konvergenzordnung
$p=k+1$ geeignet.
Unter den Verfahren befindet sich stets der entsprechende,
gänzlich unskalierte Fehlerfaktor, der berechnet wurde nach der Vorschrift</p>
<div class=math>
$$
    c_{p+1} := {1\over(p+1)!} C_{p+2,k} \pmatrix{\alpha\cr \beta\cr}.
$$
</div>
<p>Die Basisformeln im einzelnen.</p>
<div class=math>
$$
\def\x#1/#2.{\displaystyle{#1\over #2}}
\def\y#1/#2.{\displaystyle{-{#1\over #2}}}
\begin{array}{r|rrrr}
p=3 & 1 & 2 & 3 & 4\cr
\hline
-2 & -11 &  -2 &  1 &  -2\cr
-1 &  18 &  -3 & -6 &   9\cr
 0 &  -9 &   6 &  3 & -18\cr
 1 &   2 &  -1 &  2 &  11\cr
\hline
-2 &   6 &   0 &  0 &   0\cr
-1 &   0 &   6 &  0 &   0\cr
 0 &   0 &   0 &  6 &   0\cr
 1 &   0 &   0 &  0 &   6\cr
\hline
c_{i,4} & \x3/2. & \y1/2. & \x1/2. & \y3/2.\cr
\end{array}
$$
</div>
<div class=math>
$$
\begin{array}{r|rrrrr}
p=4 & 1 & 2 & 3 & 4 & 5\cr
\hline
-3 & -25 &  -3 &   1 &  -1 &   3\cr
-2 &  48 & -10 &  -8 &   6 & -16\cr
-1 & -36 &  18 &   0 & -18 &  36\cr
 0 &  16 &  -6 &   8 &  10 & -48\cr
 1 &  -3 &   1 &  -1 &   3 &  25\cr
\hline
-3 &  12 &   0 &   0 &   0 &   0\cr
-2 &   0 &  12 &   0 &   0 &   0\cr
 1 &   0 &   0 &  12 &   0 &   0\cr
 0 &   0 &   0 &   0 &  12 &   0\cr
 1 &   0 &   0 &   0 &   0 &  12\cr
\hline
c_{i,5} & \y12/5. & \x3/5. & \y2/5. & \x3/5. & \y12/5.\cr
\end{array}
$$
</div>
<div class=math>
$$
\begin{array}{r|rrrrrr}
p=5 & 1 & 2 & 3 & 4 & 5 & 6\cr
\hline
-4 & -137 &  -12 &    3 &   -2 &    3 &  -12\cr
-3 &  300 &  -65 &  -30 &   15 &  -20 &   75\cr
-2 & -300 &  120 &  -20 &  -60 &   60 & -200\cr
-1 &  200 &  -60 &   60 &   20 & -120 &  300\cr
 0 &  -75 &   20 &  -15 &   30 &   65 & -300\cr
 1 &   12 &   -3 &    2 &   -3 &   12 &  137\cr
\hline
-4 &   60 &    0 &    0 &    0 &    0 &    0\cr
-3 &    0 &   60 &    0 &    0 &    0 &    0\cr
-2 &    0 &    0 &   60 &    0 &    0 &    0\cr
 1 &    0 &    0 &    0 &   60 &    0 &    0\cr
 0 &    0 &    0 &    0 &    0 &   60 &    0\cr
 1 &    0 &    0 &    0 &    0 &    0 &   60\cr
\hline
c_{i,6} & 10 & -2 & 1 & -1 & 2 & -10\cr
\end{array}
$$
</div>
<div class=math>
$$
\begin{array}{r|rrrrrrr}
p=6 & 1 & 2 & 3 & 4 & 5 & 6 & 7\cr
\hline
-5 & -147 &  -10 &    2 &   -1 &    1 &   -2 &   10\cr
-4 &  360 &  -77 &  -24 &    9 &   -8 &   15 &  -72\cr
-3 & -450 &  150 &  -35 &  -45 &   30 &  -50 &  225\cr
-2 &  400 & -100 &   80 &    0 &  -80 &  100 & -400\cr
-1 & -225 &   50 &  -30 &   45 &   35 & -150 &  450\cr
 0 &   72 &  -15 &    8 &   -9 &   24 &   77 & -360\cr
 1 &  -10 &    2 &   -1 &    1 &   -2 &   10 &  147\cr
\hline
-5 &   60 &    0 &    0 &    0 &    0 &    0 &    0\cr
-4 &    0 &   60 &    0 &    0 &    0 &    0 &    0\cr
-3 &    0 &    0 &   60 &    0 &    0 &    0 &    0\cr
-2 &    0 &    0 &    0 &   60 &    0 &    0 &    0\cr
-1 &    0 &    0 &    0 &    0 &   60 &    0 &    0\cr
 0 &    0 &    0 &    0 &    0 &    0 &   60 &    0\cr
 1 &    0 &    0 &    0 &    0 &    0 &    0 &   60\cr
\hline
c_{i,7} & \y60/7. & \x10/7. & \y4/7. & \x3/7. & \y4/7. & \x10/7. & \y60/7.\cr
\end{array}
$$
</div>
<div class=math>
$$
\begin{array}{r|rrrrrrrr}
p=7 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8\cr
\hline
-6 & -1089 &   -60 &    10 &    -4 &     3 &    -4 &    10 &   -60\cr
-5 &  2940 &  -609 &  -140 &    42 &   -28 &    35 &   -84 &   490\cr
-4 & -4410 &  1260 &  -329 &  -252 &   126 &  -140 &   315 & -1764\cr
-3 &  4900 & -1050 &   700 &  -105 &  -420 &   350 &  -700 &  3675\cr
-2 & -3675 &   700 &  -350 &   420 &   105 &  -700 &  1050 & -4900\cr
-1 &  1764 &  -315 &   140 &  -126 &   252 &   329 & -1260 &  4410\cr
 0 &  -490 &    84 &   -35 &    28 &   -42 &   140 &   609 & -2940\cr
 1 &    60 &   -10 &     4 &    -3 &     4 &   -10 &    60 &  1089\cr
\hline
-6 &   420 &     0 &     0 &     0 &     0 &     0 &     0 &     0\cr
-5 &     0 &   420 &     0 &     0 &     0 &     0 &     0 &     0\cr
-4 &     0 &     0 &   420 &     0 &     0 &     0 &     0 &     0\cr
-3 &     0 &     0 &     0 &   420 &     0 &     0 &     0 &     0\cr
-2 &     0 &     0 &     0 &     0 &   420 &     0 &     0 &     0\cr
-1 &     0 &     0 &     0 &     0 &     0 &   420 &     0 &     0\cr
 0 &     0 &     0 &     0 &     0 &     0 &     0 &   420 &     0\cr
 1 &     0 &     0 &     0 &     0 &     0 &     0 &     0 &   420\cr
\hline
c_{i,8} & \x105/2. & \y15/2. & \x5/2. & \y3/2. & \x3/2. & \y5/2. & \x15/2. & \y105/2.\cr
\end{array}
$$
</div>
<div class=math>
$$
\begin{array}{r|rrrrrrrrr}
p=8 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9\cr
\hline
-7 &  -2283 &   -105 &     15 &     -5 &      3 &     -3 &      5 &    -15 &    105\cr
-6 &   6720 &  -1338 &   -240 &     60 &    -32 &     30 &    -48 &    140 &    960\cr
-5 & -11760 &   2940 &   -798 &   -420 &    168 &   -140 &    210 &   -588 &   3920\cr
-4 &  15680 &  -2940 &   1680 &   -378 &   -672 &    420 &   -560 &   1470 &  -9408\cr
-3 & -14700 &   2450 &  -1050 &   1050 &      0 &  -1050 &   1050 &  -2450 &  14700\cr
-2 &   9408 &  -1470 &    560 &   -420 &    672 &    378 &  -1680 &   2940 & -15680\cr
-1 &  -3920 &    588 &   -210 &    140 &   -168 &    420 &    798 &  -2940 &  11760\cr
 0 &    960 &   -140 &     48 &    -30 &     32 &    -60 &    240 &   1338 &  -6720\cr
 1 &   -105 &     15 &     -5 &      3 &     -3 &      5 &    -15 &    105 &   2283\cr
\hline
-7 &    840 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0\cr
-6 &      0 &    840 &      0 &      0 &      0 &      0 &      0 &      0 &      0\cr
-5 &      0 &      0 &    840 &      0 &      0 &      0 &      0 &      0 &      0\cr
-4 &      0 &      0 &      0 &    840 &      0 &      0 &      0 &      0 &      0\cr
-3 &      0 &      0 &      0 &      0 &    840 &      0 &      0 &      0 &      0\cr
-2 &      0 &      0 &      0 &      0 &      0 &    840 &      0 &      0 &      0\cr
-1 &      0 &      0 &      0 &      0 &      0 &      0 &    840 &      0 &      0\cr
 0 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &    840 &      0\cr
 1 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &    840\cr
\hline
c_{i,9} & \y280/3. & \x35/3. & \y10/3. & \x5/3. & \y4/3. & \x4/3. & \y10/3. & \x35/3. & \y280/3.\cr
\end{array}
$$
</div>
<div class=math>
$$
\begin{array}{r|rrrrrrrrrr}
p=9 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\cr
\hline
-8 &  -7129 &   -280 &     35 &    -10 &      5 &     -4 &      5 &    -10 &     35 &   -280\cr
-7 &  22680 &  -4329 &   -630 &    135 &    -60 &     45 &    -54 &    105 &   -360 &   2835\cr
-6 & -45360 &  10080 &  -2754 &  -1080 &    360 &   -240 &    270 &   -504 &   1680 & -12960\cr
-5 &  70560 & -11760 &   5880 &  -1554 &  -1680 &    840 &   -840 &   1470 &  -4704 &  35280\cr
-4 & -79380 &  11760 &  -4410 &   3780 &   -504 &  -2520 &   1890 &  -2940 &   8820 & -63504\cr
-3 &  63504 &  -8820 &   2940 &  -1890 &   2520 &    504 &  -3780 &   4410 & -11760 &  79380\cr
-2 & -35280 &   4704 &  -1470 &    840 &   -840 &   1680 &   1554 &  -5880 &  11760 & -70560\cr
-1 &  12960 &  -1680 &    504 &   -270 &    240 &   -360 &   1080 &   2754 & -10080 &  45360\cr
 0 &  -2835 &    360 &   -105 &     54 &    -45 &     60 &   -135 &    630 &   4329 & -22680\cr
 1 &    280 &    -35 &     10 &     -5 &      4 &     -5 &     10 &    -35 &    280 &   7129\cr
\hline
-8 &   2520 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0\cr
-7 &      0 &   2520 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0\cr
-6 &      0 &      0 &   2520 &      0 &      0 &      0 &      0 &      0 &      0 &      0\cr
-5 &      0 &      0 &      0 &   2520 &      0 &      0 &      0 &      0 &      0 &      0\cr
-4 &      0 &      0 &      0 &      0 &   2520 &      0 &      0 &      0 &      0 &      0\cr
-3 &      0 &      0 &      0 &      0 &      0 &   2520 &      0 &      0 &      0 &      0\cr
-2 &      0 &      0 &      0 &      0 &      0 &      0 &   2520 &      0 &      0 &      0\cr
-1 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &   2520 &      0 &      0\cr
 0 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &   2520 &      0\cr
 1 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &      0 &   2520\cr
\hline
c_{i,10} & 252 & -28 & 7 & -3 & 2 & -2 & 3 & -7 & 28 & -252\cr
\end{array}
$$
</div>
<p><strong>2.</strong> Die Werte zur Bildung der Linearkombination der zyklischen
Formeln von Tendler lauten in der Reihenfolge $p=3,4,5$ und $p=6,7$ wie folgend:</p>
<div class=math>
$$
\displaylines{
    \pmatrix{1&&\cr 1&0&\cr 1/3&-2/3&-2/3\cr},\qquad
    \pmatrix{1&&\cr 1&0&\cr 4&-4&5\cr},\qquad
    \pmatrix{1&&&\cr 1&0&&\cr 10&0&-1&\cr 10&-51/2&-31&1/2\cr}, \cr
    \pmatrix{1&&&\cr 20&-1&&\cr 20&-1&7&\cr 20&-78&-68&3\cr},\qquad
    \pmatrix{1&&&\cr 1&0&&\cr 20/7&-31/7&-10/5&\cr 10&-20&-5&2\cr}. \cr
}
$$
</div>
<h2>7. Äquilibrierung von Formeln<a id=Aequilibrierung></a></h2>
<p>Es folgt die Definition von Äquilibrierungsmaßen für eine
konsistente Formel $F$ der Form</p>
<div class=math>
$$
    F = (\alpha,{\mskip 3mu}\beta)
      = (\alpha_0,\ldots,\alpha_\kappa, {\mskip 5mu}\beta_0,\ldots,\beta_\kappa).
$$
</div>
<p><strong>1. Definition:</strong>  Eine Formel $F$ hat</p>
<p>(1) Gaußsches-$\alpha$-Äquilibrierungsmaß</p>
<div class=math>
$$
    \mu_\alpha^G := {1\over\alpha_\kappa^2}\sum_{i=0}^\kappa\left(\alpha_i^2+
        \beta_i^2\right)={1\over\alpha_\kappa^2}\lVert F\rVert_2^2,
$$
</div>
<p>(2) Gaußsches-$\beta$-Äquilibrierungsmaß
$\mu_\beta^G := \lVert F\rVert_2^2/\beta_\kappa^2$,</p>
<p>(3) Gauß-Henrici-Äquilibrierungsmaß
$\mu_H^G := \lVert F\rVert_2^2 / (\sigma(1))^2$,</p>
<p>(4) Tschebyscheff-$\alpha$-Äquilibrierungsmaß</p>
<div class=math>
$$
    \mu_\alpha^T := {1\over\lVert alpha_\kappa\rVert}\max_{i=0}^\kappa
    \left(|\alpha_i|,|\beta_i|\right) =
    {1\over\lVert \alpha_\kappa\rVert}\lVert F\rVert_\infty,
$$
</div>
<p>(5) Tschebyscheff-$\beta$-Äquilibrierungsmaß
$\mu_\beta^T := \lVert F\rVert_\infty / \lVert\beta_\kappa\rVert$,</p>
<p>(6) Tschebyscheff-Henrici-Äquilibrierungsmaß
$\mu_H^T := \lVert F\rVert_\infty / \lVert\sigma(1)\rVert$.</p>
<p>Sollten Zyklen mit geringem Äquilibrierungsmaß in den führenden
Koeffizienten stark flukturieren, so kann man daran denken, bei der Suche
nach günstigen Formeln die folgende
<em>Deviation der führenden Koeffizienten</em>
klein zu halten.
Sei $\gamma:=\beta_{ii}/\alpha_{ii}$.
Es gibt $({\ell\atop2})$ zyklusinterne Deviationen.
Man begrenzt dann beispielsweise die Gaußsche Deviation der Koeffizienten,
nämlich $\sum_{i&lt;j}(\gamma_i-\gamma_j)^2$.</p>
<p><strong>2. Beispiel:</strong>  Sei $\ell=3$.
Es gibt ${\ell\choose2} = {3\choose2}=3$ Deviationen.
Man fordert Beschränktheit, oder in besonderen Situationen auch Minimalität,
durch</p>
<div class=math>
$$
    (\gamma_3-\gamma_2)^2+(\gamma_3-\gamma_1)^2+(\gamma_2-\gamma_1)^2
    \cases{\to\min&\cr \le\rm const&\cr}
$$
</div>
<p>Es sollen nun einige Eigenschaften der Äquilibrierungsmaße hergeleitet werden.
Es handelt sich hier um direkt aus der Definition herleitbare Aussagen.</p>
<p><strong>3. Satz:</strong>  Es gelten</p>
<p>(1) $\mu_\beta^T\ge1$, $\mu_\alpha^T\ge1$.
Die Ungleichungen sind scharf, beispielsweise für die beiden Euler-Verfahren</p>
<div class=math>
$$
    F=(-1,1,{\mskip 5mu}1,0) \qquad\hbox{und}\qquad F=(-1,1,{\mskip 5mu}0,1).
$$
</div>
<p>(2) $\mu_\alpha^G&gt;1$, $\mu_\beta^G&gt;1$.</p>
<p>(3) $\mu_H^T$ und $\mu_H^G$ sind stets definiert für $D$-stabile Verfahren,
wegen $\rho'(1)=\sigma(1)\ne0$, da 1 keine mehrfache Nullstelle sein darf.</p>
<p>Die $\alpha$-Äquilibrierungsmaße treten vornehmlich im Zusammenhang mit
expliziten gewöhnlichen Differentialgleichungen der Form
$\dot y=f(t,y)$ auf.
Die $\beta$-Äquilibrierungsmaße treten bei DAE auf, die man mit linearen
Mehrschrittverfahren löst, und die Henrici-Äquilibrierungsmaße treten
gehäuft im Zusammenhang mit Einbein-Verfahren auf.
Man ist grundsätzlich, ersteinmal ohne Einschränkungen, an möglichst kleinen
Äquilibrierungsmaßen interessiert.
Bei Quadraturformeln ist aus Erfahrung bekannt, daß große Äquilibrierungsmaße
ungünstig sind, da diese Quadraturformeln zu Oszillationen neigen.
Jedoch bedeuten kleine Äquilibrierungsmaße nicht auch automatisch kleine
Fehlerkonstanten.
Gegenbeispiele anhand numerisch gewonnener Formeln sind bekannt.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2024/12-31-website-analytics</link>
		<guid>https://eklausmeier.goip.de/blog/2024/12-31-website-analytics</guid>
		<title>Website Analytics</title>
		<category>statistics</category>
		<category>Perl</category>
		<category>web-server</category>
		<pubDate>Tue, 31 Dec 2024 17:00:00 +0100</pubDate>
		<description><![CDATA[
<p>I had written on website analytics with regard to this blog before:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/blog/2020/10-07-statistics-of-this-blog-crossed-110-000-views">Statistics of this Blog: Crossed 110.000 Views</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2022/09-18-statistics-of-this-blog-crossed-120-000-views">Statistics of this Blog: Crossed 120.000 Views</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2021/12-14-url-count-statistics">URL Count Statistics</a></li>
</ol>
<p>I do not use cookies or any JavaScript libraries to track users.
Instead I only analyze the web-server logs using a Perl script.
To doublecheck the accuracy of this Perl script I occasionally inserted analytics code from</p>
<ol>
<li><a href="https://statcounter.com">statcounter</a></li>
<li><a href="https://clicky.com">clicky</a></li>
<li><a href="https://analytics.google.com/analytics/web/">Google Analytics</a></li>
<li><a href="https://www.cloudflare.com/web-analytics/">Cloudflare Analytics</a></li>
<li><a href="https://www.heap.io">Heap Analytics</a></li>
<li><a href="https://www.smartlook.com">CISCO smartlook</a></li>
</ol>
<p>These analytics provider used cookies, and JavaScript.
Therefore my site was not cookie-free, when I employed them.</p>
<p>Nowadays I no longer employ those bulky JavaScript libraries.
I resort to the web-server logfile.
There are a number of advantages and disadvantages.</p>
<p>Advantages:</p>
<ol>
<li>The user does not have to be concerned about cookies</li>
<li>The user does not need to download bulky JavaScript libraries</li>
<li>The user does not need to make yet another connection to any other server</li>
</ol>
<p>Disadvantages:</p>
<ol>
<li>The detection of bots and nonsense access is a little more cumbersome; there seems to be no ready-to-use software to filter out all the bots, so I had to write it myself, see <a href="https://github.com/eklausme/bin/blob/master/accesslogFilter"><code>accesslogFilter</code></a></li>
<li>There seems to be no off-the-shelf software to fully analyze weblogs and generate diagrams, so I had to write it myself, see <a href="https://github.com/eklausme/bin/blob/master/blogurlcnt"><code>blogurlcnt</code></a></li>
</ol>
<p>Below are the statistics for the year 2024.
Some key figures using <em>filtered</em> data.</p>
<ol>
<li>Ca. 18,000 &quot;real&quot; accesses as can be seen by looking at <code>pagefind-ui.js</code>, i.e., someone not loading this JavaScript is in many cases not a real reader</li>
<li>On average there are ca. 1,000 monthly accesses for &quot;real&quot; posts</li>
<li>Most intensive access is <a href="https://hetrixtools.com/uptime-monitor">HetrixTools</a></li>
<li>Best post was <a href="https://eklausmeier.goip.de/blog/2024/07-14-hosting-static-content-with-gitlab">Hosting Static Content with GitLab</a>, which had more than 4,500 views in July 2024, and more than 1,300 views in August</li>
<li>Second best was <a href="https://eklausmeier.goip.de/blog/2021/07-13-performance-comparison-c-vs-java-vs-javascript-vs-luajit-vs-pypy-vs-php-vs-python-vs-perl">Performance Comparison C vs. Java vs. Javascript vs. LuaJIT vs. PyPy vs. PHP vs. Python vs. Perl</a> having 100-200 views per month</li>
</ol>
<h2>1. URL statistics</h2>
<p>Below is the output of the Perl script <a href="https://github.com/eklausme/bin/blob/master/blogurlcnt"><code>blogurlcnt</code></a>.
I.e., the output is <em>filtered</em>.</p>
<p>The generated output uses JavaScript <a href="https://datatables.net"><em>DataTables</em></a>.
DataTables allow easy filtering and sorting within the table.</p>
<p>Combine that with <a href="https://echarts.apache.org/en/index.html">Apache ECharts</a> to show histograms to get a visual representation of the development of various URLs over time.</p>
<link href="https://cdn.datatables.net/v/dt/dt-2.3.1/datatables.min.css" rel=stylesheet />
<style>
    .histogram { height:400px; width:400px; }
</style>
<table id="urlcnt" class="display"></table>
<table><thead><tr><th>Year<th>Month<th>Week
    <tbody><tr>
    <td><div class="histogram" id="containerYear"></div>
    <td><div class="histogram" id="containerYearMonth"></div>
    <td><div class="histogram" id="containerYearWeek"></div>
</table>
</body>
<p>Above table and charts where generated with <a href="https://eklausmeier.goip.de/blog/2024/10-26-unix-process-substitution">below command</a>:</p>
<pre><code class="language-bash">time blogconcatlog 67 | pv | tee /tmp/a2 | accesslogFilter -o &gt;(tee /tmp/a1.stat | blogstatcnt -m3000 &gt; /srv/http/statcnt.html) | tee /tmp/a1 | blogurlcnt -m470 &gt; /srv/http/urlstat2-m100.html
</code></pre>
<p>I.e., the &quot;uncount&quot; statistics are dropped if they count less than 3,000 entries.
Likewise the statistics and charts are only shown for entries, which have more than 470 views.</p>
<h2>2. Uncount statistics</h2>
<p>The &quot;uncount&quot; statistics is called &quot;uncounted&quot;, as these number were <em>not counted</em> in above statistics, i.e., they were filtered out.
This filtering was done using <a href="https://github.com/eklausme/bin/blob/master/accesslogFilter"><code>accesslogFilter</code></a>.</p>
<p>A key issue with analyzing the raw web-server log is to <em>filter</em> out all irrelevant entries.
Examples of irrelevant entries are:</p>
<ol>
<li>My own access to my blog on my own local network, i.e., on 127.0.0.1 or localhost</li>
<li>Various bots from Google, Ahrefs, Yahoo, etc.</li>
<li>HTTP codes 404 (not found), etc.</li>
<li>IP address ranges from webhosting platforms or known AI platforms</li>
</ol>
<p>Below table shows what filters are most effective.
Some noteworthy highlights:</p>
<ol>
<li>There are more than 9-times more irrelevant accesses than good ones, as given by column %good in first row with &quot;Sum total&quot;. Or phrased differently: only roughly 10% of all accesses are relevant.</li>
<li>The major factor of all HTTP codes, which are irrelevant, is 404 (not found)</li>
<li>The most active bots, which can only be identified by IP address range, are in the class B subnet 162.55, which is Hetzner's your-server.de; these bots are more intense than all HTTP error codes combined</li>
<li>Ahrefs is the most frequent visitor of all bots (ca. 21%), <em>way before</em> Google bot (4.7%); in line with observations from last year: <a href="https://eklausmeier.goip.de/blog/2023/04-22-website-checking-with-ahrefs">Website Checking with Ahrefs</a></li>
<li>It is interesting that Yandex is searching the blog more frequently than Bing</li>
</ol>
<table id="cntStatTable" class="display"></table>
<!-- Datatables -->
<!-- Apache ECharts -->

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2024/12-15-installing-simplified-saaze-on-android</link>
		<guid>https://eklausmeier.goip.de/blog/2024/12-15-installing-simplified-saaze-on-android</guid>
		<title>Installing Simplified Saaze on Android</title>
		<category>Android</category>
		<category>blogging</category>
		<pubDate>Sun, 15 Dec 2024 16:30:00 +0100</pubDate>
		<description><![CDATA[
<p><a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a> is a static site generator.
This very blog uses <em>Simplified Saaze</em>.</p>
<p>It is possible to generate all HTML files on Android using <em>Simplified Saaze</em>!
This post shows the necessary steps.</p>
<p>The main trick is to use <a href="https://github.com/termux/termux-app">termux</a>.
I had written on termux here: <a href="https://eklausmeier.goip.de/blog/2020/03-12-ssh-and-rsync-for-android-termux">ssh and rsync for Android, Termux</a>.</p>
<h2>1. Installing PHP and C compiler</h2>
<p>Install the C compiler and Git.</p>
<pre class="line-numbers"><code class="language-bash">pkg install clang git autoconf
</code></pre>
<p><code>gcc</code> is not available on termux, therefore we chose <code>clang</code>.
Git is required further down, when we install MD4C.
Autoconf is required for all PHP extensions, which use <code>configure</code>.</p>
<p><em>Simplified Saaze</em> is written in PHP.
Therefore we need <a href="https://www.php.net">PHP</a> and optionally <a href="https://getcomposer.org">composer</a>.</p>
<pre class="line-numbers"><code class="language-bash">pkg install php composer
</code></pre>
<p><code>composer</code> is not strictly requiered, but convenient when you want to install one of the many <a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze#themes">themes</a>.</p>
<h2>2. Installing PHP yaml extension</h2>
<p>First install <code>libyaml</code> library:</p>
<pre class="line-numbers"><code class="language-bash">pkg install libyaml
</code></pre>
<p>Next download latest tar-ball from <a href="https://pecl.php.net/package/yaml">PECL yaml package</a>.
Untar the file</p>
<pre class="line-numbers"><code class="language-bash">tar zxf yaml-2.2.4.tgz
</code></pre>
<p>Do the usual three-step:</p>
<pre class="line-numbers"><code class="language-bash">phpize
./configure
make
</code></pre>
<p>Once all has been built, the module is copied or moved to the PHP extension library directory:</p>
<pre class="line-numbers"><code class="language-bash">mv modules/yaml.so /data/data/com.termux/files/usr/lib/php/
</code></pre>
<h2>3. Installing MD4C extension</h2>
<p>Clone the git directory <em>including</em> its submodule:</p>
<pre class="line-numbers"><code class="language-bash">git clone --recurse-submodules https://github.com/eklausme/php-md4c.git
</code></pre>
<p>The reason for this is that termux does not provide MD4C in its package repositories.</p>
<p>Now the rest is standard again with the usual three-step procedure.</p>
<pre class="line-numbers"><code class="language-bash">phpize
./configure
make
</code></pre>
<p>After the build, move or copy the MD4C so-file.</p>
<pre class="line-numbers"><code class="language-bash">mv modules/md4c.so /data/data/com.termux/files/usr/lib/php/
</code></pre>
<h2>4. Setting php.ini</h2>
<p>For PHP to use yaml and MD4C we have to edit <code>php.ini</code>.
It is stored in</p>
<pre><code>/data/data/com.termux/files/usr/etc/php/php.ini
</code></pre>
<p>The content is then:</p>
<pre class="line-numbers"><code class="language-bash">opcache.enable=1 
opcache.jit_buffer_size=100M
opcache.jit=1255

short_open_tag = 0

extension=md4c
extension=yaml
</code></pre>
<p>Regarding JIT configuration see <a href="https://stitcher.io/blog/php-8-jit-setup">PHP 8: How to setup the JIT</a>.</p>
<p>Once all is installed and configured, first check with <code>php -m</code>, then check PHP with <code>phpinfo()</code>: Create a file <code>phpinfo.php</code> with below content.</p>
<pre class="line-numbers"><code class="language-PHP">&lt;?php
    phpinfo();
?&gt;
</code></pre>
<p>Then start the builtin web-server of PHP:</p>
<pre class="line-numbers"><code class="language-bash">php -S &lt;your-IP-address&gt;:8000 -t .
</code></pre>
<p>Assuming that the <code>phpinfo.php</code> file is in your current directory (therefore <code> -t .</code>).
Check in your browser whether the yaml and MD4C extension are visible in the output of <code>phpinfo()</code>.</p>
<h2>5. Running <em>Simplified Saaze</em></h2>
<p>Below you will find my entire blog processed on Android.
My blog happens to reside in the directory <code>sndsaaze</code>.
For that I simply copied it to termux:</p>
<pre class="line-numbers"><code class="language-bash">tar cf - sndsaaze | ssh x14 'cd ~/php; tar xf -'
</code></pre>
<p>Finally:</p>
<pre class="line-numbers" data-line="11-13"><code class="language-bash">$ time php saaze -mort
Building static site in ./build...
        execute(): filePath=./content/error.yml, nSIentries=0, totalPages=0, entries_per_page=20
        execute(): filePath=./content/music.yml, nSIentries=83, totalPages=5, entries_per_page=20
        execute(): filePath=./content/gallery.yml, nSIentries=11, totalPages=1, entries_per_page=20
        execute(): filePath=./content/blog.yml, nSIentries=491, totalPages=25, entries_per_page=20
        execute(): filePath=./content/aux.yml, nSIentries=8, totalPages=1, entries_per_page=20
Finished creating 5 collections, 4 with index, and 625 entries (0.44 secs / 23.44MB)
#collections=5, parseEntry=0.0145/629-5, md2html=0.0363, toHtml=0.0413/625, renderEntry=0.2265/625, renderCollection=0.0101/36, content=625/0

real    0m0.471s
user    0m0.339s
sys     0m0.120s
</code></pre>
<p>This entire blog can be processed with <em>Simplified Saaze</em> on Android within less than half a second.
These runtimes are for an <a href="https://eklausmeier.goip.de/blog/2024/11-25-upgrading-oppo-reno4-to-xiaomi-14t-pro">Xiaomi 14T Pro</a> model.</p>
<!-- The above error messages are just due to my specific [/uses](*https://eklausmeier.goip.de*/aux/uses) page, which uses `pacman` and `pagefind` to print version information.
Further, the post [Blog Anniversary: 500 posts](*https://eklausmeier.goip.de*/blog/2023/08-11-blog-anniversary-500-posts) uses the `find` commmand to count the actual number of Markdown files.
-->
<p>When using the <em>parallel</em> option in <em>Simplified Saaze</em> the runtime can be brought down to a quarter second.</p>
<pre class="line-numbers" data-line="18-20"><code class="language-bash">$ time php saaze -mort -p8
Building static site in ./build...
        execute(): filePath=./content/error.yml, nSIentries=0, totalPages=0, entries_per_page=20
        execute(): filePath=./content/music.yml, nSIentries=83, totalPages=5, entries_per_page=20
        execute(): filePath=./content/gallery.yml, nSIentries=11, totalPages=1, entries_per_page=20
        execute(): filePath=./content/blog.yml, nSIentries=491, totalPages=25, entries_per_page=20
        nentries=510, procnr=00, pid=24969
        nentries=510, procnr=01, pid=24970
        nentries=510, procnr=02, pid=24971
        nentries=510, procnr=03, pid=24972
        nentries=510, procnr=04, pid=24973
        nentries=510, procnr=05, pid=24974
        nentries=510, procnr=06, pid=24975
        execute(): filePath=./content/aux.yml, nSIentries=8, totalPages=1, entries_per_page=20
Finished creating 5 collections, 4 with index, and 115 entries (0.24 secs / 19.54MB)
#collections=5, parseEntry=0.0149/629-5, md2html=0.0364, toHtml=0.0410/625, renderEntry=0.0535/115, renderCollection=0.0142/36, content=625/0

real    0m0.275s
user    0m0.182s
sys     0m0.084s
</code></pre>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2024/12-10-example-theme-for-simplified-saaze-myra-west</link>
		<guid>https://eklausmeier.goip.de/blog/2024/12-10-example-theme-for-simplified-saaze-myra-west</guid>
		<title>Example Theme for Simplified Saaze: Myra West</title>
		<category>blogging</category>
		<pubDate>Tue, 10 Dec 2024 19:10:00 +0100</pubDate>
		<description><![CDATA[
<p><a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a> is the static site generator used for this very blog.
There are a number of themes for <a href="https://eklausmeier.goip.de/blog/2021/10-31-simplified-saaze"><em>Simplified Saaze</em></a>:</p>
<ol>
<li><a href="https://eklausmeier.goip.de/saaze-example">Saaze example</a>, a pure example theme, simple to use and modify</li>
<li><a href="https://eklausmeier.goip.de/jpilot">J-Pilot</a>, showcasing an open-source software project and having a hierarchical menu</li>
<li><a href="https://eklausmeier.goip.de/koehntopp">Koehntopp</a>, a blog for a computer scientist</li>
<li><a href="https://eklausmeier.goip.de/nukeklaus">NukeKlaus</a>, a blog for a nuclear power engineer</li>
<li><a href="https://eklausmeier.goip.de/mobility">Mobility</a>, a multilingual site for promoting software for battery management used in electric vehicles</li>
<li><a href="https://eklausmeier.goip.de/vonhoff">Vonhoff</a>, a German site for a doctoral student</li>
<li><a href="https://eklausmeier.goip.de/paternoster">Paternoster</a>, a blog of a web developer</li>
<li><a href="https://eklausmeier.goip.de/panorama">Panorama</a>, a site for a restaurant showing their rooms and their menu</li>
<li><a href="https://eklausmeier.goip.de/lemire">Lemire</a>, a site for a computer science professor</li>
<li><a href="https://eklausmeier.goip.de/wendt">Wendt</a>, a German political blog</li>
</ol>
<p>Here we present yet another theme called <a href="https://eklausmeier.goip.de/myrawest">&quot;Myra West&quot;</a>.</p>
<p><img src="https://eklausmeier.goip.de/img/MyraWestOnPCs.jpg" alt="">
<img src="https://eklausmeier.goip.de/img/MyraWestOnX14.webp" alt=""></p>
<p>The theme is for a blog about psychology, friendship, and personal journaling of a female writer with an artistic touch.
Therefore it has a pink background, blossoms as a hero image, a kind of artistic font, etc.</p>
<p>In <a href="https://eklausmeier.goip.de/blog/2024/12-08-converting-myra-west-s-vlog-to-blog">Converting Myra West's vlog to blog</a> I described how I used the <a href="https://www.youtube.com/@myrawest">YouTube</a> video content to remodel it as a text blog, with some sprinkles of:</p>
<ul>
<li><a href="https://eklausmeier.goip.de/blog/2022/04-23-mindmaps-in-saaze">mindmaps</a></li>
<li><a href="https://eklausmeier.goip.de/blog/2022/04-22-galleries-in-saaze">galleries</a></li>
</ul>
<h2>1. Key features</h2>
<p>Some key features of the theme:</p>
<ol>
<li>Lightweight</li>
<li>Responsive with media breaks at 40rem and 60rem</li>
<li>The hero image is showing a parallax, see <a href="https://www.w3schools.com/howto/tryhow_css_parallax_demo_none.htm">W3 schools example</a></li>
<li>Static site search using <a href="https://eklausmeier.goip.de/blog/2023/10-23-pagefind-searching-in-static-sites">pagefind</a></li>
</ol>
<p>The theme uses three Google fonts:</p>
<ol>
<li><a href="https://fonts.google.com/?query=Libre+Baskerville">Libre Baskerville</a> for the main body of text</li>
<li><a href="https://fonts.google.com/?query=Charm">Charm</a> for headlines</li>
<li><a href="https://fonts.google.com/?query=Mea+Culpa">Mea Culpa</a> for some artistic feeling in the headlines for the first character</li>
</ol>
<p>As each blog post is essentially the transcript of an already existing YouTube video, each frontmatter references the YouTube video like this:</p>
<pre><code>---
date: &quot;2019-08-12 12:00:00&quot;
title: &quot;21 Years Old: I Have NO Friends&quot;
youtube: &quot;QfbCMjNj9q8&quot;
---
</code></pre>
<h2>2. Installing the theme</h2>
<p>Installing this theme including <em>Simplified Saaze</em> goes like this:</p>
<pre><code class="language-bash">composer create-project eklausme/saaze-myrawest
</code></pre>
<p>The source code is in <a href="https://github.com/eklausme/saaze-myrawest">saaze-myrawest</a>.</p>
<h2>3. Building a static blog</h2>
<p>Below is the command to build:</p>
<pre><code class="language-bash">$ time php saaze -rb /tmp/build
Building static site in /tmp/build...
        execute(): filePath=./content/blog.yml, nSIentries=22, totalPages=2, entries_per_page=20
Finished creating 1 collections, 1 with index, and 23 entries (0.02 secs / 3.07MB)
#collections=1, parseEntry=0.0005/23-1, md2html=0.0010, toHtml=0.0012/23, renderEntry=0.0016/23, renderCollection=0.0003/3, content=23/0
        real 0.03s
        user 0.02s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p>Option <code>-b</code> is entirely superfluous.
It specifies the build directory.
In our case this is <code>/tmp/build</code>, which happens to be a RAM disk in Arch Linux.
If this option is not given then <em>Simplified Saaze</em> stores the static files in the <code>build</code> directory of the current directory.</p>
<p>Option <code>-r</code> generates an RSS feed.</p>
<p>The <code>time</code> command is only used to demonstrate that converting 23 Markdown files to HTML is pretty quick.</p>
<h2>4. Using pagefind</h2>
<p>The Myra West template includes static search, i.e., entering any search word will <em>immediately</em> show search results.
There is <em>no</em> server backend doing the search.</p>
<p>Generating all required static search files using <a href="https://eklausmeier.goip.de/blog/2023/10-23-pagefind-searching-in-static-sites"><code>pagefind</code></a> goes like this:</p>
<pre><code class="language-bash">klm@chieftec /tmp/build: time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=en

Running Pagefind v1.3.0
Running from: &quot;/tmp/build&quot;
Source:       &quot;&quot;
Output:       &quot;pagefind&quot;

[Walking source directory]
Found 29 files matching **/*.{html}

[Parsing files]
Did not find a data-pagefind-body element on the site.
↳ Indexing all &lt;body&gt; elements on the site.

[Reading languages]
Discovered 1 language: en

[Building search indexes]
Total:
  Indexed 1 language
  Indexed 29 pages
  Indexed 2828 words
  Indexed 0 filters
  Indexed 0 sorts

Finished in 0.212 seconds
        real 0.25s
        user 0.16s
        sys 0
        swapped 0
        total space 0
</code></pre>
<p>Once all the search-files have been created, you move the <code>pagefind</code> directory to the <code>public</code> directory.</p>
<p>If you do not want this search functionality, then you can simply ignore this.</p>
<h2>5. Templates</h2>
<p>I use the following hierarchy of PHP files for my <code>entry</code>-template, i.e., the template for a blog post:</p>
<div class=markmap>
# entry.php
## top-layout.php
### head.php
## Actual content: $entry['content']
## bottom-layout.php
</div>
<p>The following hierarchy is used for the <code>index</code>-template, i.e., the template for showing a reverse-date sorted <em>list</em> of blog posts:</p>
<div class=markmap>
# index.php
## top-layout.php
### head.php
## for-loop over entry-excerpts
## bottom-layout.php
</div>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2024/12-08-converting-myra-west-s-vlog-to-blog</link>
		<guid>https://eklausmeier.goip.de/blog/2024/12-08-converting-myra-west-s-vlog-to-blog</guid>
		<title>Converting Myra West's vlog to blog</title>
		<category>blogging</category>
		<pubDate>Sun, 08 Dec 2024 22:10:00 +0100</pubDate>
		<description><![CDATA[
<p><a href="https://www.youtube.com/@myrawest">Myra West</a> has a YouTube channel, where she mostly talks about friendship, relationship, personal journey as a yound adult.
Below video <a href="https://www.youtube.com/watch?v=QfbCMjNj9q8">&quot;21 Years Old: I Have NO Friends&quot;</a> went viral and hit more than six million views.
<a href="https://www.youtube.com/watch?v=QfbCMjNj9q8"><img alt=YouTube src="https://i.ytimg.com/vi/QfbCMjNj9q8/hqdefault.jpg"></a></p>
<p>Myra West has no blog.
Below are the steps to convert her YouTube talks to a blog.</p>
<h2>1. Getting transcript</h2>
<p>Sometimes YouTube offers transcripts, but sometimes they are <em>not</em> available.
To get the <em>raw</em> text I used <a href="https://youtubetranscript.com">YouTube Transcript</a>.
Though, sometimes that didn't work at all.
I then switched to <a href="https://kome.ai/tools/youtube-transcript-generator">kome</a>.</p>
<p>There are YouTube videos where YouTube Transcript is <em>not</em> able to generate any meaningful text.
For example, for below videos it failed:</p>
<ol>
<li><a href="https://www.youtube.com/watch?v=lc_-bDbaxm8">&quot;If You Struggle to Make Friends&quot;</a></li>
<li><a href="https://www.youtube.com/watch?v=YcpnmwXOYVA">&quot;when you feel like you have nothing to offer, you can do this...&quot;</a></li>
<li><a href="https://www.youtube.com/watch?v=gcxcIzX4zG0">&quot;when you are terrified by how FAST time flies&quot;</a></li>
</ol>
<p><a href="https://kome.ai/tools/youtube-transcript-generator">kome</a> also failed in all cases here.
In that case I recorded the video with my smartphone and had Google voice recorder produce text.
Obviously, that's quite an act.
But even then, some parts of above video were not understood by Google voice recorder.</p>
<p><img src="https://eklausmeier.goip.de/img/GoogleVoiceTyping.webp" alt=""></p>
<p>I used copy-paste to copy the text to a text editor, where I added frontmatter:</p>
<pre><code>---
date: &quot;2019-08-12 12:00:00&quot;
title: &quot;21 Years Old: I Have NO Friends&quot;
youtube: &quot;QfbCMjNj9q8&quot;
---
</code></pre>
<h2>2. Getting punctuation</h2>
<p>Unfortunately the transcript from neither YouTube nor YouTube-Transcript contains <em>punctuation</em>.
To get this I asked <a href="https://gemini.google.com/app">Google Gemini</a>.
I used below prompt:</p>
<pre><code class="language-text">Put punctuation into below text:

&lt;Copy-paste text&gt;
</code></pre>
<p>I tried <a href="https://en.wikipedia.org/wiki/ChatGPT">ChatGPT</a>, <a href="https://en.wikipedia.org/wiki/Claude_(language_model)">Claude</a>, <a href="https://en.wikipedia.org/wiki/Microsoft_Copilot">MS Copilot</a>, and <a href="https://en.wikipedia.org/wiki/Gemini_(chatbot)">Gemini</a>: they all only allow a few paragraphs to punctuate.
Microsoft Copilot says it only allows 8,000 characters.
These limitations are quite a nuisance.</p>
<p>Therefore you have to repeat above step a couple of times.
But at this point you have at least a transcript including punctuation.</p>
<h2>3. Proofreading</h2>
<p>The transcript needs proofreading.
In particular, I meticulously checked that Google Gemini did not drop any word!</p>
<p>ChatGPT is very keen on <a href="https://en.wikipedia.org/wiki/Hallucination_(artificial_intelligence)">hallucinating</a> and adding content on its own.</p>
<p>For this <a href="https://eklausmeier.goip.de/blog/2024/10-26-unix-process-substitution">I used</a>:</p>
<pre><code class="language-bash">bcompare &lt;(perl -npe 's/\s+/\n/g' ~/php/saaze-myrawest/raw/$1) &lt;(perl -npe 's/\s+/\n/g' ~/php/saaze-myrawest/content/blog/$1) &amp;
</code></pre>
<p>I.e., I compared the <em>raw</em> transcript with the <em>punctuated</em> transcript.</p>
<p><img src="https://eklausmeier.goip.de/img/blogmyrawestdiff.webp" alt=""></p>
<p>During proofreading I</p>
<ul>
<li>dropped duplicate words,</li>
<li>deleted unfinished parts of sentences,</li>
<li>dropped fillwords, like &quot;and&quot;, &quot;um&quot;, &quot;like&quot;, etc.</li>
</ul>
<p>I also added occasional headings.
In some posts I even added <a href="https://eklausmeier.goip.de/blog/2022/04-23-mindmaps-in-saaze">Markmap mindmaps</a>.
In one post I added a <a href="https://eklausmeier.goip.de/blog/2022/04-22-galleries-in-saaze">gallery</a>.</p>
<p>I added links, i.e., I made use of <a href="https://en.wikipedia.org/wiki/Hypertext">hypertext</a>.
In videos there seems to be no equivalent, i.e., there is no <em>hypervideo</em>, except when you use JavaScript trickery.</p>
<h2>4. Result</h2>
<p>As can be seen from above steps, the process is quite manual.
As of now it doesn't seem to be amenable to automation.</p>
<p>As of today, 08-Dec-2024, Myra West has produced 82 videos.
I did not convert all of them.
I converted those, which contain a lot of spoken text.
The converted vlog is here: <a href="https://eklausmeier.goip.de/myrawest">Myra West's blog</a>.</p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2024/11-25-upgrading-oppo-reno4-to-xiaomi-14t-pro</link>
		<guid>https://eklausmeier.goip.de/blog/2024/11-25-upgrading-oppo-reno4-to-xiaomi-14t-pro</guid>
		<title>Upgrading Oppo Reno4 to Xiaomi 14T Pro</title>
		<category>hardware</category>
		<category>Android</category>
		<pubDate>Mon, 25 Nov 2024 20:25:00 +0100</pubDate>
		<description><![CDATA[
<p>Today I upgraded my <a href="https://eklausmeier.goip.de/blog/2022/05-26-upgrading-oneplus-five-to-oppo-reno4">Oppo Reno4</a> smartphone to a <a href="https://www.mi.com/global/product/xiaomi-14t-pro">Xiaomi 14T Pro</a> model.
The &quot;old&quot; Oppo was still good, but the offered price for the 14T Pro was too good to say no.</p>
<p>I already own a <a href="https://www.mi.com/global/product/xiaomi-pad-6">Xiaomi Tablet 6</a>, with which I am very happy.
So changing from OnePlus / Oppo to Xiaomi was an easy choice.
Add to that, that the Oppo phone did no longer receive kernel updates, and OnePlus / Oppo no longer sell their devices in Germany due to <a href="https://en.wikipedia.org/wiki/Patent_troll">patent trolls</a>.</p>
<p><img src="https://eklausmeier.goip.de/img/Xiaomi14TPro-Photo.webp" alt="Photo"></p>
<p>Marketing descriptions for the Xiaomi 14T Pro are <a href="https://www.mi.com/global/product/xiaomi-14t-pro">here</a>.</p>
<p>The technical <a href="https://www.mi.com/global/product/xiaomi-14t-pro/specs">specs</a> are given below.</p>
<table>
<thead>
<tr>
<th>Type</th>
<th><a href="https://www.mi.com/global/product/xiaomi-14t-pro/specs">Specification</a></th>
</tr>
</thead>
<tbody>
<tr>
<td>Processor</td>
<td><a href="https://www.mediatek.com/products/smartphones/mediatek-dimensity-9300-plus">MediaTek Dimensity 9300+</a><br>4nm power-efficient manufacturing process<br>CPU:1 x Cortex-X4, up to 3.4GHz<br>3 x Cortex-X4, up to 2.85GHz<br>4 x Cortex-A720, up to 2.0GHz<br>GPU:<a href="https://www.arm.com/products/silicon-ip-multimedia/immortalis-gpu/immortalis-g720">Immortalis-G720</a> MC12<br>AIMediaTek NPU 790 (Generative AI)</td>
</tr>
<tr>
<td>Storage &amp; RAM</td>
<td>2GB, 512GB + 16GB Ultra Space<br>UFS 4.0 + LPDDR5X 8533Mbps</td>
</tr>
<tr>
<td>Dimensions</td>
<td>Height: 160.4mm<br>Width: 75.1mm<br>Thickness: 8.39mm<br>Weight: 209g</td>
</tr>
<tr>
<td>Display</td>
<td>Refresh rate 144 Hz AMOLED<br>Resolution 2712 x 1220, 446ppi<br>Touch sampling rate: Up to 480Hz</td>
</tr>
<tr>
<td>Camera</td>
<td>front:32MP<br>main: Leica 50 MP<br>ultra-wide: 12 MP<br>digital zoom up to 30x<br>mage formats captured: DNG,HEIF,JPEG</td>
</tr>
<tr>
<td>Video</td>
<td>8K (7680x4320) video recording at 24fps, 30fps<br>4K (3840x2160) video recording at 24 fps, 30 fps, 60 fps<br>1080p (1920x1080) HD video recording at 30 fps, 60 fps<br>720p (1280x720) HD video recording at 30 fps<br>Slow motion video:<br>720p 120fps, 240fps, 960fps<br> 1080p 120fps,240fps,960fps</td>
</tr>
<tr>
<td>Battery</td>
<td>5,000 mAh, 120 W HyperCharge<br>50 W wireless charging</td>
</tr>
<tr>
<td>NFC + Bluetooth</td>
<td>Yes</td>
</tr>
<tr>
<td>Network bands</td>
<td>5G SA: n1/2/3/5/7/8/12/20/25/26/28/38/40/41/48/66/75/77/78<br>5G NSA: n1/3/5/7/8/20/28/38/40/41/66/75/77/78<br>4G: LTE FDD: B1/2/3/4/5/7/8/12/13/17/18/19/20/25/26/28/32/66<br>4G: LTE TDD: B38/39/40/41/42/48<br>3G: UMTS: B1/2/4/5/6/8/19<br>2G: GSM: B2/3/5/8<br>Supports 4x4 MIMO</td>
</tr>
<tr>
<td>WiFi</td>
<td>Wi-Fi 7 capability<br>Dual band Simultaneous<br>Multi-Link Operation<br>Supports 2x2 MIMO, 8x8 Sounding for MU-MIMO, WiFi Direct<br>Bluetooth 5.4, Dual-Bluetooth<br>Supports AAC/LDAC/LHDC 4.0/LC3/ASHA/Auracast</td>
</tr>
<tr>
<td>Navigation</td>
<td>GPS: L1+L5<br>Galileo: E1+E5a+E5b, GLONASS: G1, Beidou, NavIC: L5<br>A-GPS supplementary positioning, Electronic compass, Wireless network, Data network, MPE</td>
</tr>
<tr>
<td>Audio</td>
<td>Stereo speakersSupports audio formats: MP3, FLAC, APE, AAC, OGG, WAV, AMR, AWB<br>Hi-Res &amp; Hi-Res Audio Wireless certification, Dolby Atmos</td>
</tr>
<tr>
<td>Vido</td>
<td>Supports video formats: MP4, MKV, WEBM, 3GP<br>Supports HDR display when playing HDR10, HDR10+, Dolby Vision video content</td>
</tr>
<tr>
<td>Water resistant</td>
<td><a href="https://en.wikipedia.org/wiki/IP_code">IP68</a></td>
</tr>
<tr>
<td>Sensor</td>
<td>Proximity sensor, Ambient light sensor, Accelerometer, Gyroscope, Electronic compass, IR blaster, Flicker sensor, X-axis linear vibration motor</td>
</tr>
<tr>
<td>Operating System</td>
<td>Xiaomi HyperOS</td>
</tr>
</tbody>
</table>
<p>Testing internet speed on https://fast.com:</p>
<p><img src="https://eklausmeier.goip.de/img/Xiaomi14TPro-Fast-com.jpg" alt="Photo"></p>
<p>The CPU according <code>lscpu</code>:</p>
<pre><code>Architecture:                       aarch64
CPU op-mode(s):                     64-bit
Byte Order:                         Little Endian
CPU(s):                             8
On-line CPU(s) list:                0-7
Vendor ID:                          ARM
Model name:                         Cortex-A720
Model:                              1
Thread(s) per core:                 1
Core(s) per socket:                 4
Socket(s):                          1
Stepping:                           r0p1
CPU(s) scaling MHz:                 15%
CPU max MHz:                        2000.0000
CPU min MHz:                        300.0000
BogoMIPS:                           26.00
Flags:                              fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti ecv afp wfxt
Model name:                         Cortex-X4
Model:                              1
Thread(s) per core:                 1
Core(s) per socket:                 4
Socket(s):                          1
Stepping:                           r0p1
CPU(s) scaling MHz:                 48%
CPU max MHz:                        3400.0000
CPU min MHz:                        550.0000
BogoMIPS:                           26.00
Flags:                              fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti ecv afp wfxt
Vulnerability Gather data sampling: Not affected
Vulnerability Itlb multihit:        Not affected
Vulnerability L1tf:                 Not affected
Vulnerability Mds:                  Not affected
Vulnerability Meltdown:             Not affected
Vulnerability Mmio stale data:      Not affected
Vulnerability Retbleed:             Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass:    Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:           Mitigation; __user pointer sanitization
Vulnerability Spectre v2:           Not affected
Vulnerability Srbds:                Not affected
Vulnerability Tsx async abort:      Not affected
</code></pre>
<p>Linux kernel after one <a href="https://en.wikipedia.org/wiki/Xiaomi_HyperOS">HyperOS</a> update according <code>uname -a</code>:</p>
<pre><code>Linux localhost 6.1.57-android14-11-g2de3ba70f288-ab11985038 #1 SMP PREEMPT Tue Jun 18 13:21:55 UTC 2024 aarch64 Android
</code></pre>
<p>Storage is plentiful: 12 GB RAM, 512 GB SSD.
As usual, some of this storage is used for internal purposes and therefore not directly available to you.</p>
<pre><code>$ df -h | grep tmpfs
Filesystem                Size Used Avail Use% Mounted on
tmpfs                     5.4G 3.3M  5.4G   1% /dev
tmpfs                     5.4G  38M  5.4G   1% /mnt
tmpfs                     5.4G  28K  5.4G   1% /apex
$ df -h | grep storage
Filesystem                Size Used Avail Use% Mounted on
/dev/fuse                 481G  22G  458G   5% /storage/emulated
</code></pre>
<p><img src="https://eklausmeier.goip.de/img/Xiaomi14TPro-Storage.jpg" alt="Photo"></p>
<p>A good review of the smartphone is here: <a href="https://www.notebookcheck.net/Xiaomi-14T-Pro-smartphone-review-Amazing-value-amazing-screen-brightness.907877.0.html">Verdict on the Xiaomi 14T Pro</a>.</p>
<p>A video review by Mike Chudley of the camera of the Xiaomi phone is <a href="https://www.youtube.com/watch?v=SGVvzh_t-cU">here</a>:</p>
<p><a href="https://www.youtube.com/watch?v=SGVvzh_t-cU"><img alt=YouTube src="https://i.ytimg.com/vi/SGVvzh_t-cU/hqdefault.jpg"></a></p>
<p>Observations so far:</p>
<ol>
<li>The fingerprint sensor is reacting very quick, way quicker than the Oppo fingerprint sensor. That's good.</li>
<li>There is no double tap to lock the phone, but you can use: <em>Additional setting</em> - <em>Accessibility</em> - <em>Accessibility menu</em>. With this you can activate something similar.</li>
<li>The 5,000 mAh battery seems to deplete faster than the 4,000 mAh battery of the Oppo phone, i.e., the Oppo phone lasts longer. That is unexpected and bad.</li>
<li>The Oppo phone (7.6mm) is clearly slimmer than the Xiaomi (8.39mm). It is also lighter: 209g vs. 172g.</li>
</ol>
<p>Added 16-Feb-2025: Another video review by &quot;<a href="https://en.wikipedia.org/wiki/Unbox_Therapy">Unbox Therapy</a>&quot;.</p>
<p><a href="https://www.youtube.com/watch?v=Ut4fAe7sC84"><img alt=YouTube src="https://i.ytimg.com/vi/Ut4fAe7sC84/hqdefault.jpg"></a></p>
<p>Added 21-Jun-2025: A German review.
<a href="https://www.computerbild.de/artikel/cb-Tests-Handy-Xiaomi-14T-Pro-Test-Infos-review-2025-38937929.html">Xiaomi 14T Pro im Test: Jetzt ist es endlich auch ein Preis-Hit!</a></p>

		]]></description>
	</item>
	<item>
		<link>https://eklausmeier.goip.de/blog/2024/11-19-snd-hda-intel-no-codecs-initialized</link>
		<guid>https://eklausmeier.goip.de/blog/2024/11-19-snd-hda-intel-no-codecs-initialized</guid>
		<title>snd_hda_intel: no codecs initialized</title>
		<category>Linux</category>
		<pubDate>Tue, 19 Nov 2024 11:40:00 +0100</pubDate>
		<description><![CDATA[
<p>Problem at hand: No sound on my loudspeakers.</p>
<p>Error message during login and booting:</p>
<pre><code>Nov 19 10:53:19 chieftec kernel: snd_hda_intel 0000:08:00.6: Codec #0 probe error; disabling it...
Nov 19 10:53:19 chieftec kernel: snd_hda_intel 0000:08:00.6: no codecs initialized
</code></pre>
<p>Solution: Add below three lines to <code>/etc/modprobe.d/alsa-base.conf</code>:</p>
<pre><code>options snd-hda-intel single_cmd=1
options snd-hda-intel probe_mask=1
options snd-hda-intel model=basic
</code></pre>
<p>On my machine this file did not exist previously.</p>
<p>I found this solution here: <a href="https://forums.mageia.org/en/viewtopic.php?t=15317&amp;p=89597">[SOLVED]snd_hda_intel: no codecs found - no sound</a> by user broncosman.</p>
<p>Though, even after above change there are still quite a number of messages in the log:</p>
<pre><code>Nov 21 08:39:56 chieftec kernel: snd_hda_intel 0000:08:00.1: spurious response 0x0:0x0, last cmd=0x1f0500
Nov 21 08:39:56 chieftec kernel: snd_hda_intel 0000:08:00.1: spurious response 0x200:0x0, last cmd=0x970740
Nov 21 08:39:56 chieftec kernel: snd_hda_intel 0000:08:00.1: spurious response 0x0:0x0, last cmd=0x377200
</code></pre>

		]]></description>
	</item>
</channel>
</rss>
