<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ignorance is bliss...</title><link>https://cullmann.dev/</link><description>Recent content on Ignorance is bliss...</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><managingEditor>christoph@cullmann.dev (Christoph Cullmann)</managingEditor><webMaster>christoph@cullmann.dev (Christoph Cullmann)</webMaster><copyright>Copyright © Christoph Cullmann</copyright><atom:link href="https://cullmann.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>About</title><link>https://cullmann.dev/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/about/</guid><description>&lt;h2 id="christoph-cullmann"&gt;Christoph Cullmann&lt;/h2&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/about/images/christoph_hu_7a038c3e79a4bbff.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/about/images/christoph_hu_ee8547adc6de0df2.webp" alt="Christoph Cullmann" style="border: 0px; border-radius: 8px;" width="640" height="640" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;h2 id="professional-life"&gt;Professional Life&lt;/h2&gt;
&lt;p&gt;I work as a Senior Software Engineer at &lt;a href="https://www.absint.com/"&gt;AbsInt Angewandte Informatik GmbH&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My work is focused on &lt;a href="https://en.wikipedia.org/wiki/Static_program_analysis"&gt;static program analysis&lt;/a&gt; on both binary and source level.&lt;/p&gt;
&lt;p&gt;For binary programs, the worst-case &lt;a href="https://www.absint.com/stackanalyzer/"&gt;stack usage&lt;/a&gt; or &lt;a href="https://www.absint.com/ait/"&gt;execution time&lt;/a&gt; are computed.&lt;/p&gt;
&lt;p&gt;For source programs, &lt;a href="https://www.absint.com/rulechecker/"&gt;coding rules&lt;/a&gt; or &lt;a href="https://www.absint.com/astree/"&gt;run time errors&lt;/a&gt; are checked and a formally verified &lt;a href="https://www.absint.com/compcert/"&gt;C compiler&lt;/a&gt; is offered.&lt;/p&gt;
&lt;h2 id="open-source-projects"&gt;Open Source Projects&lt;/h2&gt;
&lt;p&gt;In my spare time, I work on various open source projects.
The most work goes into &lt;a href="https://kate-editor.org"&gt;Kate&lt;/a&gt;, the GUI text editor I maintain since two decades.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="christoph-cullmann">Christoph Cullmann</h2>
<center>



<a href="https://cullmann.dev/about/images/christoph_hu_7a038c3e79a4bbff.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/about/images/christoph_hu_ee8547adc6de0df2.webp" alt="Christoph Cullmann" style="border: 0px; border-radius: 8px;" width="640" height="640" />
</a>
</center>

<h2 id="professional-life">Professional Life</h2>
<p>I work as a Senior Software Engineer at <a href="https://www.absint.com/">AbsInt Angewandte Informatik GmbH</a>.</p>
<p>My work is focused on <a href="https://en.wikipedia.org/wiki/Static_program_analysis">static program analysis</a> on both binary and source level.</p>
<p>For binary programs, the worst-case <a href="https://www.absint.com/stackanalyzer/">stack usage</a> or <a href="https://www.absint.com/ait/">execution time</a> are computed.</p>
<p>For source programs, <a href="https://www.absint.com/rulechecker/">coding rules</a> or <a href="https://www.absint.com/astree/">run time errors</a> are checked and a formally verified <a href="https://www.absint.com/compcert/">C compiler</a> is offered.</p>
<h2 id="open-source-projects">Open Source Projects</h2>
<p>In my spare time, I work on various open source projects.
The most work goes into <a href="https://kate-editor.org">Kate</a>, the GUI text editor I maintain since two decades.</p>
<p>For more details take a look at the <a href="/projects/">Projects</a> page.</p>
<h2 id="contact-information">Contact Information</h2>
<p>My contact information can be found on the <a href="/impressum/">Impressum</a> page.</p>
<h2 id="cartoon-like-me-p">Cartoon-like Me :P</h2>
<center>



<a href="https://cullmann.dev/about/images/christoph_hu_c88a9d4ca20bf3e0.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/about/images/christoph_hu_fabef21ab210c0a2.webp" alt="Christoph Cullmann" style="border: 0px; border-radius: 8px;" width="640" height="640" />
</a>
</center>

]]></content:encoded></item><item><title>Links</title><link>https://cullmann.dev/links/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/links/</guid><description>&lt;p&gt;Links to stuff I often use/read/&amp;hellip;&lt;/p&gt;
&lt;p&gt;Might be useful for others, but in the end just a pile of stuff I don&amp;rsquo;t want to search over and over again.&lt;/p&gt;
&lt;p&gt;The libraries linked below will in most cases be for C or C++.&lt;/p&gt;
&lt;h2 id="programming-newsinformation"&gt;Programming News/Information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;News, Status &amp;amp; Discussion about Standard C++: &lt;a href="https://isocpp.org"&gt;https://isocpp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="multi-purpose-libraries"&gt;Multi-Purpose Libraries&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Qt: &lt;a href="https://www.qt.io"&gt;https://www.qt.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BOOST: &lt;a href="https://www.boost.org"&gt;https://www.boost.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="compression-libraries"&gt;Compression Libraries&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Zstandard compression: &lt;a href="https://facebook.github.io/zstd/"&gt;https://facebook.github.io/zstd/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LZ4 compression: &lt;a href="https://lz4.github.io/lz4/"&gt;https://lz4.github.io/lz4/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="xml-libraries"&gt;XML Libraries&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;light-weight C++ XML processing: &lt;a href="https://pugixml.org"&gt;https://pugixml.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="json-libraries"&gt;JSON Libraries&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;fast JSON parser/generator: &lt;a href="http://rapidjson.org"&gt;http://rapidjson.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fonts"&gt;Fonts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Geist &amp;amp; Geist Mono - used on this page for everything: &lt;a href="https://vercel.com/font"&gt;https://vercel.com/font&lt;/a&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>Links to stuff I often use/read/&hellip;</p>
<p>Might be useful for others, but in the end just a pile of stuff I don&rsquo;t want to search over and over again.</p>
<p>The libraries linked below will in most cases be for C or C++.</p>
<h2 id="programming-newsinformation">Programming News/Information</h2>
<ul>
<li>News, Status &amp; Discussion about Standard C++: <a href="https://isocpp.org">https://isocpp.org</a></li>
</ul>
<h2 id="multi-purpose-libraries">Multi-Purpose Libraries</h2>
<ul>
<li>
<p>Qt: <a href="https://www.qt.io">https://www.qt.io</a></p>
</li>
<li>
<p>BOOST: <a href="https://www.boost.org">https://www.boost.org</a></p>
</li>
</ul>
<h2 id="compression-libraries">Compression Libraries</h2>
<ul>
<li>
<p>Zstandard compression: <a href="https://facebook.github.io/zstd/">https://facebook.github.io/zstd/</a></p>
</li>
<li>
<p>LZ4 compression: <a href="https://lz4.github.io/lz4/">https://lz4.github.io/lz4/</a></p>
</li>
</ul>
<h2 id="xml-libraries">XML Libraries</h2>
<ul>
<li>light-weight C++ XML processing: <a href="https://pugixml.org">https://pugixml.org</a></li>
</ul>
<h2 id="json-libraries">JSON Libraries</h2>
<ul>
<li>fast JSON parser/generator: <a href="http://rapidjson.org">http://rapidjson.org</a></li>
</ul>
<h2 id="fonts">Fonts</h2>
<ul>
<li>
<p>Geist &amp; Geist Mono - used on this page for everything: <a href="https://vercel.com/font">https://vercel.com/font</a></p>
</li>
<li>
<p>MonoLisa - a commercial coding font: <a href="https://www.monolisa.dev/">https://www.monolisa.dev/</a></p>
</li>
<li>
<p>LucasFonts - small fonts studio in Germany: <a href="https://www.lucasfonts.com/">https://www.lucasfonts.com/</a></p>
</li>
</ul>
<h2 id="mail-server-stuff">Mail Server Stuff</h2>
<p>For my mails, I use postfix &amp; dovecot, here some links about documentation and more.</p>
<ul>
<li>
<p>postfix documentation: <a href="http://www.postfix.org/documentation.html">http://www.postfix.org/documentation.html</a></p>
</li>
<li>
<p>dovecot 2.x documentation: <a href="https://doc.dovecot.org/">https://doc.dovecot.org/</a></p>
</li>
<li>
<p>blacklist performance monitoring: <a href="https://www.intra2net.com/en/support/antispam/">https://www.intra2net.com/en/support/antispam/</a></p>
</li>
</ul>
<h2 id="hhkb-resources">HHKB Resources</h2>
<ul>
<li>
<p>HHKB Reddit: <a href="https://www.reddit.com/r/HHKB/">https://www.reddit.com/r/HHKB/</a></p>
</li>
<li>
<p>HHKBs compared (Pro 2 vs. Classic vs. Hybrid Type-S): <a href="https://seongminpark.com/hhkbs-compared/">https://seongminpark.com/hhkbs-compared/</a></p>
</li>
<li>
<p>HHKB Professional Hybrid review: <a href="https://materialjournal.com/blog/hhkb-hybrid-review">https://materialjournal.com/blog/hhkb-hybrid-review</a></p>
</li>
</ul>
]]></content:encoded></item><item><title>Projects</title><link>https://cullmann.dev/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/projects/</guid><description>&lt;h2 id="personal-projects"&gt;Personal projects&lt;/h2&gt;
&lt;p&gt;Personal stuff like this web site or my QMK config are hosted on this server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git.babylon2k.com/cullmann/"&gt;https://git.babylon2k.com/cullmann/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kde"&gt;KDE&lt;/h2&gt;
&lt;p&gt;I work on various projects that are under the &lt;a href="https://www.kde.org/"&gt;KDE&lt;/a&gt; umbrella.&lt;/p&gt;
&lt;h3 id="the-kate-editor-a-full-featured-text-editor"&gt;The Kate editor, a full-featured text editor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kate-editor.org"&gt;https://kate-editor.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/utilities/kate"&gt;https://invent.kde.org/utilities/kate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-ktexteditor-framework-a-versatile-text-editor-component"&gt;The KTextEditor framework, a versatile text editor component&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://api.kde.org/ktexteditor-index.html"&gt;KTextEditor API documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/frameworks/ktexteditor"&gt;KTextEditor Git repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-ksyntaxhighlighting-framework--300-languages-supported"&gt;The KSyntaxHighlighting framework, &amp;gt; 300 languages supported&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://api.kde.org/ksyntaxhighlighting-index.html"&gt;KSyntaxHighlighting API documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/frameworks/syntax-highlighting"&gt;KSyntaxHighlighting Git repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="random-other-stuff"&gt;Random other stuff&lt;/h3&gt;
&lt;p&gt;Other KDE related contributions can be found on my &lt;a href="https://invent.kde.org/cullmann"&gt;invent.kde.org profile&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="personal-projects">Personal projects</h2>
<p>Personal stuff like this web site or my QMK config are hosted on this server:</p>
<ul>
<li><a href="https://git.babylon2k.com/cullmann/">https://git.babylon2k.com/cullmann/</a></li>
</ul>
<h2 id="kde">KDE</h2>
<p>I work on various projects that are under the <a href="https://www.kde.org/">KDE</a> umbrella.</p>
<h3 id="the-kate-editor-a-full-featured-text-editor">The Kate editor, a full-featured text editor</h3>
<ul>
<li><a href="https://kate-editor.org">https://kate-editor.org</a></li>
<li><a href="https://invent.kde.org/utilities/kate">https://invent.kde.org/utilities/kate</a></li>
</ul>
<h3 id="the-ktexteditor-framework-a-versatile-text-editor-component">The KTextEditor framework, a versatile text editor component</h3>
<ul>
<li><a href="https://api.kde.org/ktexteditor-index.html">KTextEditor API documentation</a></li>
<li><a href="https://invent.kde.org/frameworks/ktexteditor">KTextEditor Git repository</a></li>
</ul>
<h3 id="the-ksyntaxhighlighting-framework--300-languages-supported">The KSyntaxHighlighting framework, &gt; 300 languages supported</h3>
<ul>
<li><a href="https://api.kde.org/ksyntaxhighlighting-index.html">KSyntaxHighlighting API documentation</a></li>
<li><a href="https://invent.kde.org/frameworks/syntax-highlighting">KSyntaxHighlighting Git repository</a></li>
</ul>
<h3 id="random-other-stuff">Random other stuff</h3>
<p>Other KDE related contributions can be found on my <a href="https://invent.kde.org/cullmann">invent.kde.org profile</a>.</p>
<p>Contributors to these projects are welcome.</p>
<p>If you wish to sponsor the work done by KDE in non-technical ways, please think about <a href="https://kde.org/donations">donating</a>.</p>
<h2 id="github">GitHub</h2>
<p>Contributions to projects hosted on <a href="https://github.com/">GitHub</a> can be seen in this account:</p>
<ul>
<li><a href="https://github.com/christoph-cullmann/">https://github.com/christoph-cullmann/</a></li>
</ul>
]]></content:encoded></item><item><title>Academic</title><link>https://cullmann.dev/academic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/academic/</guid><description>&lt;h2 id="academic-life"&gt;Academic Life&lt;/h2&gt;
&lt;p&gt;I studied computer science at &lt;a href="https://www.uni-saarland.de/"&gt;Saarland University&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I finished my Diploma thesis &lt;a href="https://cullmann.dev/academic/publications/diplom.pdf"&gt;&amp;ldquo;Statische Berechnung sicherer Schleifengrenzen auf Maschinencode&amp;rdquo;&lt;/a&gt; in 2006.&lt;/p&gt;
&lt;p&gt;In February 2013, I successfully defended my PhD thesis about &lt;a href="https://cullmann.dev/academic/publications/phd.pdf"&gt;&amp;ldquo;Cache Persistence Analysis for Embedded Real-Time Systems&amp;rdquo;&lt;/a&gt;.
The official publication can be found &lt;a href="https://publikationen.sulb.uni-saarland.de/handle/20.500.11880/26474;jsessionid=A6DE5A6E674C991A2F390B34454E05BC"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="publications"&gt;Publications&lt;/h2&gt;
&lt;p&gt;Lists of my publications can be found online at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://scholar.google.com/citations?user=eK6jgYUAAAAJ&amp;amp;hl=en"&gt;Google Scholar&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://dblp.org/pers/hd/c/Cullmann:Christoph"&gt;dblp computer science library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://dl.acm.org/author_page.cfm?id=81461660747"&gt;ACM digital library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><content:encoded><![CDATA[<h2 id="academic-life">Academic Life</h2>
<p>I studied computer science at <a href="https://www.uni-saarland.de/">Saarland University</a>.</p>
<p>I finished my Diploma thesis <a href="/academic/publications/diplom.pdf">&ldquo;Statische Berechnung sicherer Schleifengrenzen auf Maschinencode&rdquo;</a> in 2006.</p>
<p>In February 2013, I successfully defended my PhD thesis about <a href="/academic/publications/phd.pdf">&ldquo;Cache Persistence Analysis for Embedded Real-Time Systems&rdquo;</a>.
The official publication can be found <a href="https://publikationen.sulb.uni-saarland.de/handle/20.500.11880/26474;jsessionid=A6DE5A6E674C991A2F390B34454E05BC">here</a>.</p>
<h2 id="publications">Publications</h2>
<p>Lists of my publications can be found online at:</p>
<ul>
<li>
<p><a href="https://scholar.google.com/citations?user=eK6jgYUAAAAJ&amp;hl=en">Google Scholar</a></p>
</li>
<li>
<p><a href="https://dblp.org/pers/hd/c/Cullmann:Christoph">dblp computer science library</a></p>
</li>
<li>
<p><a href="https://dl.acm.org/author_page.cfm?id=81461660747">ACM digital library</a></p>
</li>
</ul>
]]></content:encoded></item><item><title>Impressum</title><link>https://cullmann.dev/impressum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/impressum/</guid><description>&lt;h2 id="impressum"&gt;Impressum&lt;/h2&gt;
&lt;h2 id="angaben-gemäß--5-tmg"&gt;Angaben gemäß § 5 TMG&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Dr.-Ing. Christoph Cullmann
Lessingstrasse 61
66121 Saarbrücken
Deutschland&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="kontakt--contact"&gt;Kontakt / Contact&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Telefon/Mobile/Signal: +49 176 235 467 98
E-Mail: &lt;a href="mailto:christoph@cullmann.dev"&gt;christoph@cullmann.dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="datenschutzerklärung"&gt;Datenschutzerklärung&lt;/h2&gt;
&lt;p&gt;Verantwortliche Stelle im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dr.-Ing. Christoph Cullmann
Lessingstrasse 61
66121 Saarbrücken
Deutschland&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="ihre-betroffenenrechte"&gt;Ihre Betroffenenrechte&lt;/h3&gt;
&lt;p&gt;Unter den angegebenen Kontaktdaten unseres Datenschutzbeauftragten können Sie jederzeit folgende Rechte ausüben:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auskunft über Ihre bei uns gespeicherten Daten und deren Verarbeitung (Art. 15 DSGVO),&lt;/li&gt;
&lt;li&gt;Berichtigung unrichtiger personenbezogener Daten (Art. 16 DSGVO),&lt;/li&gt;
&lt;li&gt;Löschung Ihrer bei uns gespeicherten Daten (Art. 17 DSGVO),&lt;/li&gt;
&lt;li&gt;Einschränkung der Datenverarbeitung, sofern wir Ihre Daten aufgrund gesetzlicher Pflichten noch nicht löschen dürfen (Art. 18 DSGVO),&lt;/li&gt;
&lt;li&gt;Widerspruch gegen die Verarbeitung Ihrer Daten bei uns (Art. 21 DSGVO) und&lt;/li&gt;
&lt;li&gt;Datenübertragbarkeit, sofern Sie in die Datenverarbeitung eingewilligt haben oder einen Vertrag mit uns abgeschlossen haben (Art. 20 DSGVO).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft widerrufen.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="impressum">Impressum</h2>
<h2 id="angaben-gemäß--5-tmg">Angaben gemäß § 5 TMG</h2>
<blockquote>
<p>Dr.-Ing. Christoph Cullmann
Lessingstrasse 61
66121 Saarbrücken
Deutschland</p>
</blockquote>
<h3 id="kontakt--contact">Kontakt / Contact</h3>
<blockquote>
<p>Telefon/Mobile/Signal: +49 176 235 467 98
E-Mail: <a href="mailto:christoph@cullmann.dev">christoph@cullmann.dev</a></p>
</blockquote>
<h2 id="datenschutzerklärung">Datenschutzerklärung</h2>
<p>Verantwortliche Stelle im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist:</p>
<blockquote>
<p>Dr.-Ing. Christoph Cullmann
Lessingstrasse 61
66121 Saarbrücken
Deutschland</p>
</blockquote>
<h3 id="ihre-betroffenenrechte">Ihre Betroffenenrechte</h3>
<p>Unter den angegebenen Kontaktdaten unseres Datenschutzbeauftragten können Sie jederzeit folgende Rechte ausüben:</p>
<ul>
<li>Auskunft über Ihre bei uns gespeicherten Daten und deren Verarbeitung (Art. 15 DSGVO),</li>
<li>Berichtigung unrichtiger personenbezogener Daten (Art. 16 DSGVO),</li>
<li>Löschung Ihrer bei uns gespeicherten Daten (Art. 17 DSGVO),</li>
<li>Einschränkung der Datenverarbeitung, sofern wir Ihre Daten aufgrund gesetzlicher Pflichten noch nicht löschen dürfen (Art. 18 DSGVO),</li>
<li>Widerspruch gegen die Verarbeitung Ihrer Daten bei uns (Art. 21 DSGVO) und</li>
<li>Datenübertragbarkeit, sofern Sie in die Datenverarbeitung eingewilligt haben oder einen Vertrag mit uns abgeschlossen haben (Art. 20 DSGVO).</li>
</ul>
<p>Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft widerrufen.</p>
<p>Sie können sich jederzeit mit einer Beschwerde an eine Aufsichtsbehörde wenden, z. B. an die zuständige Aufsichtsbehörde des Bundeslands Ihres Wohnsitzes oder an die für uns als verantwortliche Stelle zuständige Behörde.</p>
<p>Eine Liste der Aufsichtsbehörden (für den nichtöffentlichen Bereich) mit Anschrift finden Sie unter: <a href="https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html">https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html</a></p>
<h3 id="erfassung-allgemeiner-informationen-beim-besuch-unserer-website">Erfassung allgemeiner Informationen beim Besuch unserer Website</h3>
<h4 id="art-und-zweck-der-verarbeitung">Art und Zweck der Verarbeitung</h4>
<p>Wenn Sie auf unsere Website zugreifen, d.h., wenn Sie sich nicht registrieren oder anderweitig Informationen übermitteln, werden automatisch Informationen allgemeiner Natur erfasst. Diese Informationen (Server-Logfiles) beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den Domainnamen Ihres Internet-Service-Providers, Ihre IP-Adresse und ähnliches.</p>
<p>Sie werden insbesondere zu folgenden Zwecken verarbeitet:</p>
<ul>
<li>Sicherstellung eines problemlosen Verbindungsaufbaus der Website,</li>
<li>Sicherstellung einer reibungslosen Nutzung unserer Website,</li>
<li>Auswertung der Systemsicherheit und -stabilität sowie</li>
<li>zu weiteren administrativen Zwecken.</li>
</ul>
<p>Wir verwenden Ihre Daten nicht, um Rückschlüsse auf Ihre Person zu ziehen. Informationen dieser Art werden von uns ggfs. statistisch ausgewertet, um unseren Internetauftritt und die dahinterstehende Technik zu optimieren.</p>
<h4 id="rechtsgrundlage">Rechtsgrundlage</h4>
<p>Die Verarbeitung erfolgt gemäß Art. 6 Abs. 1 lit. f DSGVO auf Basis unseres berechtigten Interesses an der Verbesserung der Stabilität und Funktionalität unserer Website.</p>
<h4 id="empfänger">Empfänger</h4>
<p>Empfänger der Daten sind ggf. technische Dienstleister, die für den Betrieb und die Wartung unserer Webseite als Auftragsverarbeiter tätig werden.</p>
<h4 id="speicherdauer">Speicherdauer</h4>
<p>Die Daten werden gelöscht, sobald diese für den Zweck der Erhebung nicht mehr erforderlich sind. Dies ist für die Daten, die der Bereitstellung der Webseite dienen, grundsätzlich der Fall, wenn die jeweilige Sitzung beendet ist.</p>
<h4 id="bereitstellung-vorgeschrieben-oder-erforderlich">Bereitstellung vorgeschrieben oder erforderlich</h4>
<p>Die Bereitstellung der vorgenannten personenbezogenen Daten ist weder gesetzlich noch vertraglich vorgeschrieben. Ohne die IP-Adresse ist jedoch der Dienst und die Funktionsfähigkeit unserer Website nicht gewährleistet. Zudem können einzelne Dienste und Services nicht verfügbar oder eingeschränkt sein. Aus diesem Grund ist ein Widerspruch ausgeschlossen.</p>
<h3 id="ssl-verschlüsselung">SSL-Verschlüsselung</h3>
<p>Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS.</p>
<h3 id="information-über-ihr-widerspruchsrecht-nach-art-21-dsgvo">Information über Ihr Widerspruchsrecht nach Art. 21 DSGVO</h3>
<h4 id="einzelfallbezogenes-widerspruchsrecht">Einzelfallbezogenes Widerspruchsrecht</h4>
<p>Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen Situation ergeben, jederzeit gegen die Verarbeitung Sie betreffender personenbezogener Daten, die aufgrund Art. 6 Abs. 1 lit. f DSGVO (Datenverarbeitung auf der Grundlage einer Interessenabwägung) erfolgt, Widerspruch einzulegen; dies gilt auch für ein auf diese Bestimmung gestütztes Profiling im Sinne von Art. 4 Nr. 4 DSGVO.</p>
<p>Legen Sie Widerspruch ein, werden wir Ihre personenbezogenen Daten nicht mehr verarbeiten, es sei denn, wir können zwingende schutzwürdige Gründe für die Verarbeitung nachweisen, die Ihre Interessen, Rechte und Freiheiten überwiegen, oder die Verarbeitung dient der Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.</p>
<h4 id="empfänger-eines-widerspruchs">Empfänger eines Widerspruchs</h4>
<blockquote>
<p>Dr.-Ing. Christoph Cullmann
Lessingstrasse 61
66121 Saarbrücken
Deutschland</p>
</blockquote>
<h3 id="änderung-unserer-datenschutzbestimmungen">Änderung unserer Datenschutzbestimmungen</h3>
<p>Wir behalten uns vor, diese Datenschutzerklärung anzupassen, damit sie stets den aktuellen rechtlichen Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z.B. bei der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung.</p>
<h3 id="fragen-an-den-datenschutzbeauftragten">Fragen an den Datenschutzbeauftragten</h3>
<p>Wenn Sie Fragen zum Datenschutz haben, schreiben Sie uns bitte eine E-Mail oder wenden Sie sich direkt an die für den Datenschutz verantwortliche Person in unserer Organisation:</p>
<blockquote>
<p>Dr.-Ing. Christoph Cullmann
Lessingstrasse 61
66121 Saarbrücken
Deutschland</p>
</blockquote>
<p>Generiert von <a href="https://www.activemind.de/datenschutz/datenschutzhinweis-generator/">Datenschutzerklärungs-Generator der activeMind AG (Version 2018-09-24)</a>.</p>
<h2 id="haftungsausschluss">Haftungsausschluss</h2>
<h3 id="haftung-für-inhalte">Haftung für Inhalte</h3>
<p>Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.</p>
<p>Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.</p>
<h3 id="haftung-für-links">Haftung für Links</h3>
<p>Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar.</p>
<p>Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.</p>
<h3 id="urheberrecht">Urheberrecht</h3>
<p>Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.</p>
<p>Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.</p>
<p>Quelle: <a href="https://www.e-recht24.de/muster-disclaimer.html">https://www.e-recht24.de/muster-disclaimer.html</a></p>
]]></content:encoded></item><item><title>KDE Gear 25.12 with improved Wayland window activation for Kate &amp; Konsole</title><link>https://cullmann.dev/posts/kde-gear-25.12-with-improved-for-wayland-window-activation-for-kate-konsole/</link><pubDate>Sat, 13 Dec 2025 17:30:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kde-gear-25.12-with-improved-for-wayland-window-activation-for-kate-konsole/</guid><description>&lt;p&gt;&lt;a href="https://kde.org/announcements/gear/25.12.0/"&gt;KDE Gear 25.12&lt;/a&gt; got just released.&lt;/p&gt;
&lt;p&gt;This includes my fixes (or workarounds) for Konsole &amp;amp; Kate window activation on Wayland.&lt;/p&gt;
&lt;p&gt;If you now start Kate or Konsole inside Konsole, the new processes will properly activate their windows to come on top of Konsole.&lt;/p&gt;
&lt;p&gt;This works both for just starting new instances and for re-using already running ones.&lt;/p&gt;
&lt;p&gt;For more details, see &lt;a href="https://cullmann.dev/posts/improving-wayland-window-activation-for-kate-konsole/"&gt;my older post&lt;/a&gt; about the implementation.&lt;/p&gt;
&lt;p&gt;At the moment that only works for Konsole &amp;amp; Kate.&lt;/p&gt;</description><content:encoded><![CDATA[<p><a href="https://kde.org/announcements/gear/25.12.0/">KDE Gear 25.12</a> got just released.</p>
<p>This includes my fixes (or workarounds) for Konsole &amp; Kate window activation on Wayland.</p>
<p>If you now start Kate or Konsole inside Konsole, the new processes will properly activate their windows to come on top of Konsole.</p>
<p>This works both for just starting new instances and for re-using already running ones.</p>
<p>For more details, see <a href="/posts/improving-wayland-window-activation-for-kate-konsole/">my older post</a> about the implementation.</p>
<p>At the moment that only works for Konsole &amp; Kate.</p>
<p>If that works nicely for our users, perhaps somebody will come up with a more generic way for that or we can move that workaround to some lower level of the stack.</p>
<p>:) For me that is already a nice Christmas present, I disliked that this was broken for years :)</p>
<p>Btw., thanks again for the amazing <a href="https://kde.org/fundraisers/yearend2025/">end of the year fundraiser results</a>! €280k and counting :)</p>
<h2 id="feedback">Feedback</h2>
<p>You can provide feedback on the matching <a href="https://www.reddit.com/r/kde/comments/1plpopz/kde_gear_2512_with_improved_wayland_window/">Reddit</a> post.</p>
]]></content:encoded></item><item><title>KDE - End of Year Fundraiser 2025</title><link>https://cullmann.dev/posts/kde-end-of-year-fundraiser-2025/</link><pubDate>Sun, 07 Dec 2025 19:10:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kde-end-of-year-fundraiser-2025/</guid><description>&lt;p&gt;Like in the years before, KDE does an &lt;a href="https://kde.org/fundraisers/yearend2025/"&gt;end of the year fundraiser campaign&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Beside that Plasma will show some small popup to ask if you want to sponsor us with a donation.&lt;/p&gt;
&lt;p&gt;It looks like this year that is already going well, below the state as of today, 7th December 2025.&lt;/p&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kde-end-of-year-fundraiser-2025/images/kde-end-of-year-fundraiser-2025_hu_e65f5d4416b1cdc4.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kde-end-of-year-fundraiser-2025/images/kde-end-of-year-fundraiser-2025_hu_2f4bfbf2d426c6d3.webp" alt="KDE - End of Year Fundraiser 2025" style="border: 0px; border-radius: 8px;" width="640" height="1198" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;I want to say to all that already donated: Thanks a lot!&lt;/p&gt;</description><content:encoded><![CDATA[<p>Like in the years before, KDE does an <a href="https://kde.org/fundraisers/yearend2025/">end of the year fundraiser campaign</a>.</p>
<p>Beside that Plasma will show some small popup to ask if you want to sponsor us with a donation.</p>
<p>It looks like this year that is already going well, below the state as of today, 7th December 2025.</p>
<center>



<a href="https://cullmann.dev/posts/kde-end-of-year-fundraiser-2025/images/kde-end-of-year-fundraiser-2025_hu_e65f5d4416b1cdc4.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-end-of-year-fundraiser-2025/images/kde-end-of-year-fundraiser-2025_hu_2f4bfbf2d426c6d3.webp" alt="KDE - End of Year Fundraiser 2025" style="border: 0px; border-radius: 8px;" width="640" height="1198" />
</a>
</center>

<p>I want to say to all that already donated: Thanks a lot!</p>
<p>I will not personally get any money from that, but I will benefit largely from the stuff <a href="https://ev.kde.org">KDE e.V.</a> funds with it, like the infrastructure, some people working on our stuff and the very important sprints and conferences!</p>
<p>Keep the money flowing, money is not everything, but if you can not contribute in another way and you have some spare money, <a href="https://kde.org/fundraisers/yearend2025/">please consider a donation</a>.</p>
<p>I wish you all a good end of the year :)</p>
<h3 id="discussion">Discussion</h3>
<p>Feel free to join the discussion at the <a href="https://www.reddit.com/r/linux/comments/1pgpbk5/kde_end_of_year_fundraiser_2025/">Linux reddit</a>.</p>
]]></content:encoded></item><item><title>KDE Gardening 2025</title><link>https://cullmann.dev/posts/kde-gardening-2025/</link><pubDate>Thu, 16 Oct 2025 20:42:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kde-gardening-2025/</guid><description>&lt;p&gt;The KDE community created in the last decades a lot of interesting projects.&lt;/p&gt;
&lt;p&gt;Unfortunately, not all projects survive the test of time,
be it because the developers leave or technology moves on and stuff gets less relevant.&lt;/p&gt;
&lt;p&gt;The same happens for our communication channels or web sites.
20 years ago, mailing lists and IRC were still kind of common place, today more people hang around on stuff like discuss.kde.org or in our Matrix channels.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The KDE community created in the last decades a lot of interesting projects.</p>
<p>Unfortunately, not all projects survive the test of time,
be it because the developers leave or technology moves on and stuff gets less relevant.</p>
<p>The same happens for our communication channels or web sites.
20 years ago, mailing lists and IRC were still kind of common place, today more people hang around on stuff like discuss.kde.org or in our Matrix channels.</p>
<p>Unfortunately our community is not that good at cleaning dead stuff up or deciding that the zombie state of some things hurt.</p>
<h1 id="dead-web-sites">Dead Web Sites</h1>
<p>A no longer updated website might be a small issue, that just looks bad, but most people will see that stuff with news from 2010 will likely be not alive.</p>
<p>Still, I think it makes sense to remove such sites and just redirect them (if there is any follow up information online).</p>
<p>It is no good state if we have stuff up that rots away since a few years, at least if it contains no other valuable info, like documentation or howtos.</p>
<h1 id="zombie-git-projects">Zombie Git Projects</h1>
<p>Worse than dead web sites are zombie Git repositories that still get merge requests but nobody takes a look as all people are just gone but the stuff is not clearly marked as archived.</p>
<p>People waste their time and will likely be upset their contributions are not even looked at.</p>
<p>If a project is really dead, that should be archived, one can still resurrect it with easy later on, it is not gone, just clearly marked as dead.</p>
<h1 id="blackhole-mailing-lists">Blackhole Mailing Lists</h1>
<p>Even worse are in my eyes dead mailing lists.</p>
<p>People will drop questions there, in worst case that will even already hang for days in moderation or then forever without answer on the list.</p>
<p>That turns away people, you have a question or contribution and it ends in a black hole? No good first contact.</p>
<h1 id="solutions-gardening">Solutions? Gardening!</h1>
<p>What can we do?</p>
<p>We not just need to create new stuff and maintain what we have, we need to do some house cleaning or gardening.</p>
<p>We did that in the past, we can do it again :)</p>
<p>If you want to help, or just turn up and tell that your old project, web site or list it dead, show up on one of these issues:</p>
<ul>
<li>
<p><a href="https://invent.kde.org/sysadmin/repo-metadata/-/issues/23">Repository &amp; Bugzilla Cleanup</a></p>
</li>
<li>
<p><a href="https://invent.kde.org/websites/kde-org/-/issues/42">Mailing List Cleanup</a></p>
</li>
<li>
<p><a href="https://invent.kde.org/websites/kde-org/-/issues/43">Website Cleanup</a></p>
</li>
</ul>
<h3 id="discussion">Discussion</h3>
<p>Feel free to join the discussion at the <a href="https://www.reddit.com/r/kde/comments/1o8elxw/kde_gardening_2025/">KDE reddit</a>.</p>
]]></content:encoded></item><item><title>My First Linux: S.u.S.E. Linux 5.1</title><link>https://cullmann.dev/posts/my-first-linux-suse-linux-5.1/</link><pubDate>Tue, 16 Sep 2025 22:15:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/my-first-linux-suse-linux-5.1/</guid><description>&lt;p&gt;Visiting my parents before going to Akademy I found the manual of my first Linux distribution ever: S.u.S.E. Linux 5.1 from 1997.&lt;/p&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/my-first-linux-suse-linux-5.1/images/suse-linux-5.1-manual_hu_a4ab42fbfd310219.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/my-first-linux-suse-linux-5.1/images/suse-linux-5.1-manual_hu_73c4e2479287cf22.webp" alt="S.u.S.E. Linux 5.1 Manual" style="border: 0px; border-radius: 8px;" width="640" height="480" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;Given my first PC was some Pentium 100 with 16 MB of main memory and Windows 95, that was my first dive into open source software.&lt;/p&gt;
&lt;p&gt;Seems I went in less than 2 years from starting on Windows to at least trying out Linux.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Visiting my parents before going to Akademy I found the manual of my first Linux distribution ever: S.u.S.E. Linux 5.1 from 1997.</p>
<center>



<a href="https://cullmann.dev/posts/my-first-linux-suse-linux-5.1/images/suse-linux-5.1-manual_hu_a4ab42fbfd310219.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/my-first-linux-suse-linux-5.1/images/suse-linux-5.1-manual_hu_73c4e2479287cf22.webp" alt="S.u.S.E. Linux 5.1 Manual" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>Given my first PC was some Pentium 100 with 16 MB of main memory and Windows 95, that was my first dive into open source software.</p>
<p>Seems I went in less than 2 years from starting on Windows to at least trying out Linux.</p>
<p>A few years later I joined the great KDE community and stayed there :)</p>
<p>:) Now I feel old.</p>
<h2 id="feedback">Feedback</h2>
<p><a href="https://www.reddit.com/r/linux/comments/1nisf0x/do_you_still_remember_your_first_linux/">reddit - Do you still remember your first Linux distribution?</a></p>
]]></content:encoded></item><item><title>Improving Wayland Window Activation for Kate &amp; Konsole</title><link>https://cullmann.dev/posts/improving-wayland-window-activation-for-kate-konsole/</link><pubDate>Sun, 31 Aug 2025 21:14:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/improving-wayland-window-activation-for-kate-konsole/</guid><description>&lt;h2 id="window-activation-whats-that"&gt;Window Activation, what&amp;rsquo;s that?&lt;/h2&gt;
&lt;p&gt;In short: for some actions you want to activate your application window.
How to do that differs from platform to platform.&lt;/p&gt;
&lt;p&gt;Some weeks ago there was a post by Kai about &lt;a href="https://blog.broulik.de/2025/08/on-window-activation/"&gt;window activation on Wayland&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It explains nicely how the &lt;a href="https://wayland.app/protocols/xdg-activation-v1"&gt;XDG Activation protocol&lt;/a&gt; works and how the different parts of the KDE &amp;amp; Qt stack implement it to correctly allow to activate the right windows in your KDE Plasma Wayland session.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="window-activation-whats-that">Window Activation, what&rsquo;s that?</h2>
<p>In short: for some actions you want to activate your application window.
How to do that differs from platform to platform.</p>
<p>Some weeks ago there was a post by Kai about <a href="https://blog.broulik.de/2025/08/on-window-activation/">window activation on Wayland</a>.</p>
<p>It explains nicely how the <a href="https://wayland.app/protocols/xdg-activation-v1">XDG Activation protocol</a> works and how the different parts of the KDE &amp; Qt stack implement it to correctly allow to activate the right windows in your KDE Plasma Wayland session.</p>
<h2 id="whats-the-issue">What&rsquo;s the issue?</h2>
<p>For the most parts this works now flawlessly, but there is some corner case not handled that well at the moment: stuff launched by our terminal emulator Konsole.</p>
<p>This is no large issue for many users, but I rely in my usual workflow with Kate a lot on just being able to do</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">❯ kate mycoolfile.cpp</span></span></code></pre></div><p>in my Konsole window and if Kate is already running to have the existing window activated.</p>
<p>That worked just fine on X11, but on Wayland the safeguards to avoid misuse of window activation stopped that.
There I just get some flashing of the Kate icon in the task switcher.</p>
<p>After some years of ignoring that issues myself and hoping a solution would just materialize, I now gave that some try to fix it myself.</p>
<h2 id="the-hack-solution">The hack (solution)</h2>
<p>In the most cases it is easy to get the application that launches stuff to export a new <em>XDG_ACTIVATION_TOKEN</em> environment variable for the new process and all stuff just works.</p>
<p>Unfortunately that is not that easy for a terminal emulator.</p>
<p>Naturally Konsole could create and export one before starting the shell, but that is an one-time use token.
In the best case the first launched Kate or other application could use it once.</p>
<p>The current solution is to allow applications to query a <em>XDG_ACTIVATION_TOKEN</em> via DBus from Konsole, if they can prove they got started inside the shell session by passing a <em>KONSOLE_DBUS_ACTIVATION_COOKIE</em> that got exported by Konsole to the shell.</p>
<p>This leads to the following client code in Kate/KWrite and Konsole itself.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl">    <span class="c1">// on wayland: init token if we are launched by Konsole and have none
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">if</span> <span class="p">(</span><span class="n">KWindowSystem</span><span class="o">::</span><span class="n">isPlatformWayland</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;&amp;</span> <span class="n">qEnvironmentVariable</span><span class="p">(</span><span class="s">&#34;XDG_ACTIVATION_TOKEN&#34;</span><span class="p">).</span><span class="n">isEmpty</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="o">&amp;&amp;</span> <span class="n">QDBusConnection</span><span class="o">::</span><span class="n">sessionBus</span><span class="p">().</span><span class="n">interface</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// can we ask Konsole for a token?
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="k">const</span> <span class="k">auto</span> <span class="n">konsoleService</span> <span class="o">=</span> <span class="n">qEnvironmentVariable</span><span class="p">(</span><span class="s">&#34;KONSOLE_DBUS_SERVICE&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">const</span> <span class="k">auto</span> <span class="n">konsoleSession</span> <span class="o">=</span> <span class="n">qEnvironmentVariable</span><span class="p">(</span><span class="s">&#34;KONSOLE_DBUS_SESSION&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">const</span> <span class="k">auto</span> <span class="n">konsoleActivationCookie</span>
</span></span><span class="line"><span class="cl">            <span class="o">=</span> <span class="n">qEnvironmentVariable</span><span class="p">(</span><span class="s">&#34;KONSOLE_DBUS_ACTIVATION_COOKIE&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">konsoleService</span><span class="p">.</span><span class="n">isEmpty</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">konsoleSession</span><span class="p">.</span><span class="n">isEmpty</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">konsoleActivationCookie</span><span class="p">.</span><span class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// we ask the current shell session
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="n">QDBusMessage</span> <span class="n">m</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">                <span class="n">QDBusMessage</span><span class="o">::</span><span class="n">createMethodCall</span><span class="p">(</span><span class="n">konsoleService</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="n">konsoleSession</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="n">QStringLiteral</span><span class="p">(</span><span class="s">&#34;org.kde.konsole.Session&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">                    <span class="n">QStringLiteral</span><span class="p">(</span><span class="s">&#34;activationToken&#34;</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// use the cookie from the environment
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="n">m</span><span class="p">.</span><span class="n">setArguments</span><span class="p">({</span><span class="n">konsoleActivationCookie</span><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// get the token, if possible and export it to environment for later use
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="k">const</span> <span class="k">auto</span> <span class="n">tokenAnswer</span> <span class="o">=</span> <span class="n">QDBusConnection</span><span class="o">::</span><span class="n">sessionBus</span><span class="p">().</span><span class="n">call</span><span class="p">(</span><span class="n">m</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">tokenAnswer</span><span class="p">.</span><span class="n">type</span><span class="p">()</span> <span class="o">==</span> <span class="n">QDBusMessage</span><span class="o">::</span><span class="n">ReplyMessage</span>
</span></span><span class="line"><span class="cl">                <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">tokenAnswer</span><span class="p">.</span><span class="n">arguments</span><span class="p">().</span><span class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">const</span> <span class="k">auto</span> <span class="n">token</span> <span class="o">=</span> <span class="n">tokenAnswer</span><span class="p">.</span><span class="n">arguments</span><span class="p">().</span><span class="n">first</span><span class="p">().</span><span class="n">toString</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">token</span><span class="p">.</span><span class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">qputenv</span><span class="p">(</span><span class="s">&#34;XDG_ACTIVATION_TOKEN&#34;</span><span class="p">,</span> <span class="n">token</span><span class="p">.</span><span class="n">toUtf8</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span></span></span></code></pre></div><p>The <em>KONSOLE_DBUS_SERVICE</em> and <em>KONSOLE_DBUS_SESSION</em> environment variables did already exist before, the only new one is the <em>secret</em> <em>KONSOLE_DBUS_ACTIVATION_COOKIE</em> that is filled by Konsole with some random string per shell session.</p>
<p>The <em>org.kde.konsole.Session</em> has now a new <em>activationToken</em> method to retrieve a token.
That method will only work if the right cookie is passed and if Konsole itself is the current active window (else it will not be able to request a token internally).</p>
<p>As it easily visible alone from the naming, that is some Konsole only interface and one needs own code in applications that want to make use of it.</p>
<p>Therefore this is more of a hack than a proper solution.</p>
<p>If it inspires others to come up with something generic, that would be awesome!</p>
<p>I will happily help to implement that in Kate and Co., but until that happens, at least my workflow is back working in my <a href="/posts/plasma-kate-wayland-2025/">Wayland session</a>.</p>
<h2 id="feedback">Feedback</h2>
<p>You can provide feedback on the matching <a href="https://lemmy.kde.social/post/4473601">Lemmy</a> and <a href="https://www.reddit.com/r/kde/comments/1n53df3/improving_wayland_window_activation_for_kate/">Reddit</a> posts.</p>
]]></content:encoded></item><item><title>Plasma &amp; Kate on Wayland in 2025</title><link>https://cullmann.dev/posts/plasma-kate-wayland-2025/</link><pubDate>Sun, 20 Jul 2025 19:00:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/plasma-kate-wayland-2025/</guid><description>&lt;p&gt;This is an update of my &lt;a href="https://cullmann.dev/posts/plasma-kate-wayland-2021/"&gt;Plasma &amp;amp; Kate on Wayland end of 2021 post&lt;/a&gt; from close to 4 years ago.&lt;/p&gt;
&lt;h2 id="wayland-what"&gt;Wayland, what?&lt;/h2&gt;
&lt;p&gt;Since years (or let&amp;rsquo;s say a decade now) &lt;a href="https://wayland.freedesktop.org/"&gt;Wayland&lt;/a&gt; based compositors are promoted as the successors to the venerable &lt;a href="https://www.x.org"&gt;X.org&lt;/a&gt; X11 display server.&lt;/p&gt;
&lt;p&gt;If you want to have some more high level overview about what is different to good old X11 see the &lt;a href="https://wayland.freedesktop.org/architecture.html"&gt;Wayland Architecture&lt;/a&gt; overview.&lt;/p&gt;
&lt;h2 id="but-my-xeyes"&gt;But my Xeyes&amp;hellip;&lt;/h2&gt;
&lt;p&gt;And yes, X11 will not just vanish in the next years and &lt;a href="https://wayland.freedesktop.org/docs/html/ch05.html"&gt;Xwayland&lt;/a&gt; will allow to run legacy applications for even longer without relying on the full low-level X11 stack.&lt;/p&gt;</description><content:encoded><![CDATA[<p>This is an update of my <a href="/posts/plasma-kate-wayland-2021/">Plasma &amp; Kate on Wayland end of 2021 post</a> from close to 4 years ago.</p>
<h2 id="wayland-what">Wayland, what?</h2>
<p>Since years (or let&rsquo;s say a decade now) <a href="https://wayland.freedesktop.org/">Wayland</a> based compositors are promoted as the successors to the venerable <a href="https://www.x.org">X.org</a> X11 display server.</p>
<p>If you want to have some more high level overview about what is different to good old X11 see the <a href="https://wayland.freedesktop.org/architecture.html">Wayland Architecture</a> overview.</p>
<h2 id="but-my-xeyes">But my Xeyes&hellip;</h2>
<p>And yes, X11 will not just vanish in the next years and <a href="https://wayland.freedesktop.org/docs/html/ch05.html">Xwayland</a> will allow to run legacy applications for even longer without relying on the full low-level X11 stack.</p>
<p>But poor Xeyes will not be able to watch Wayland windows, evil security, I want my global key logger in no time!</p>
<h2 id="my-experience-in-2025">My experience in 2025</h2>
<p>Since my <a href="/posts/plasma-kate-wayland-2021/">last post in 2021</a> I use Wayland more or less exclusive on all my private machines.</p>
<p>The latest newcomer to that is a M2 Macbook Air, even there it works just fine for me in general.
For more details, here is <a href="https://git.babylon2k.com/cullmann/nixos/src/branch/master/zeta">my NixOS configuration</a> for that machine, many thanks to the <a href="https://asahilinux.org/">Asahi Linux team</a> to make that feasible!</p>
<p>At work we use <a href="https://archlinux.org">Arch Linux</a> since some time and there Waylands works just fine for my needs, too.</p>
<p>I must confess I stay away from NVIDIA hardware and the AMD, Intel &amp; Apple M2 GPUs I use work nicely with the open source drivers.
Therefore, if you are a NVIDIA user, your mileage might vary.</p>
<p>Same if you are stuck on some older distribution, but as said, X11 is not gone.
Before my 2021 switch I did keep using X11 due to driver issues, too, and I think that will still be feasible for years.</p>
<p>For day to day tasks I face no bugs that block me on either NixOS or Arch Linux.</p>
<p>For Kate itself, we had some persistent issues with bad parents of popups, that should now be fixed in the latest Frameworks 6 and some upcoming Qt 6.9.2 or higher patch release.
That should remove the last logging spam on the terminal about Wayland issues like seen below.</p>
<blockquote>
<p>qt.qpa.wayland: Creating a popup with a parent, QWidgetWindow(0x559ddf4cf3c0, name=&ldquo;MainWindow#1Window&rdquo;) which does not match the current topmost grabbing popup, QWidgetWindow(0x559de00644b0, name=&ldquo;goWindow&rdquo;) With some shell surface protocols, this is not allowed.
The wayland QPA plugin is currently handling it by setting the parent to the topmost grabbing popup.
Note, however, that this may cause positioning errors and popups closing unxpectedly.
Please fix the transient parent of the popup.</p>
</blockquote>
<p>The stuff did in principle work before, but that output still was unsettling and in rare cases could lead to totally misplaced popups or other issues with them.</p>
<p>One thing that I myself underestimated a lot in the past is, that Wayland is just a different thing than X11.
It is a totally different platform in many aspects and just because stuff works as wanted on X11, if they are very low level, they might not work the same way on Wayland.
Thankfully a lot of people helped to fix the issues we had!</p>
<h2 id="all-done">All done?</h2>
<p>No, naturally not.
One could ask: but a lot of people worked on that a decade?
How can that be?</p>
<p>Wayland is as said above really different to X11 in design (for good reasons, we no longer live in the 80ties and requirements have changed), it is expected that this will take time given the amount of code we have.</p>
<p>The <a href="https://community.kde.org/Plasma/Wayland_Known_Significant_Issues">currently known significant issues</a> that still not work looks reasonable small to me.
Naturally that might be different for others, one must be transparent that some stuff is working differently now and that some things still just not work (and some never will work by design).</p>
<p>My personal biggest issue I still have with Kate is the missing way to raise my existing windows if I open a new file via the terminal shell.
All works fine if you do that via Dolphin and Co. as I get some activation token, that is at the moment just not feasible via the terminal with the shell.</p>
<p>With virtual desktops we miss some way to pick the right window or decide if we need to open a new one (even if we get a activation token from Dolphin), see <a href="https://bugs.kde.org/show_bug.cgi?id=503519">bug 503519</a>.</p>
<h2 id="my-current-kde-plasma-wayland-session">My current KDE Plasma Wayland session</h2>
<p>Like in the last post, let&rsquo;s take a look at how my current session looks.</p>
<center>



<a href="https://cullmann.dev/posts/plasma-kate-wayland-2025/images/plasma-kate-wayland_hu_117a23699186b43a.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/plasma-kate-wayland-2025/images/plasma-kate-wayland_hu_1fe369d58ea1f3f1.webp" alt="My current KDE Plasma on Wayland session with Kate ;=)" style="border: 0px; border-radius: 8px;" width="640" height="120" />
</a>
</center>

<h2 id="try-it-out">Try it out!</h2>
<p>I can encourage all to give Wayland a try, if you are on some up-to-date distribution.
To hunt the last bugs, we need more adopters.
That more and more distributions default to Wayland naturally helps in that respect.
But one must manage the expectations, the <a href="https://community.kde.org/Plasma/Wayland_Known_Significant_Issues">currently known issues</a> will not just disappear over night.</p>
<h2 id="help-out">Help out!</h2>
<p>If you encounter issues, please report them as bug reports to the respective upstream projects.
And naturally, any help in fixing them would be welcome, too.
For Kate/KTextEditor beside the above mentioned window activation, I got all stuff that bothered me fixed.
Naturally there will still be things that annoy others, patches welcome, scratch your own itch!</p>
<h2 id="feedback">Feedback</h2>
<p>You can provide feedback on the matching <a href="https://www.reddit.com/r/linux/comments/1m4u5y3/plasma_kate_on_wayland_in_2025/">Reddit post</a>.</p>
]]></content:encoded></item><item><title>Deep Learning is no Intelligence</title><link>https://cullmann.dev/posts/deep-learning-is-no-intelligence/</link><pubDate>Fri, 23 May 2025 15:00:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/deep-learning-is-no-intelligence/</guid><description>&lt;p&gt;Here we are in the year 2025 and every company that wants to grab your money now peddles AI.&lt;/p&gt;
&lt;p&gt;Even most search engines will now start with some &amp;ldquo;AI powered&amp;rdquo; summary.&lt;/p&gt;
&lt;p&gt;Unfortunately, what they give you is just some deep learning intelligence fake.&lt;/p&gt;
&lt;p&gt;Just imagine, you don&amp;rsquo;t read the links yourself, but you pass that to some friend/colleague/&amp;hellip; that might be a nice person but is known to, if in doubt, not to tell that he did not understand what he should do, but just returns some random stuff that sounds like it could be true.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Here we are in the year 2025 and every company that wants to grab your money now peddles AI.</p>
<p>Even most search engines will now start with some &ldquo;AI powered&rdquo; summary.</p>
<p>Unfortunately, what they give you is just some deep learning intelligence fake.</p>
<p>Just imagine, you don&rsquo;t read the links yourself, but you pass that to some friend/colleague/&hellip; that might be a nice person but is known to, if in doubt, not to tell that he did not understand what he should do, but just returns some random stuff that sounds like it could be true.</p>
<p>That is the state of AI.</p>
<p>Naturally one has trained the models to death on standard questions and problems, ask a semi new model why the sky is blue and you get the same answer as on the Wikipedia, more or less.</p>
<p>But try it different: Ask something that for sure is no training question.</p>
<p>My self serving question, just to see if the standard models know something about Kate (and perhaps me).
Naturally not just &lsquo;me&rsquo; invented Kate, but let&rsquo;s roll with that.</p>
<blockquote>
<p>Who invented the Kate editor?</p>
</blockquote>
<p>Let&rsquo;s ask the gemma3 model:</p>
<blockquote>
<p>The Kate editor was primarily developed by Michael Hofmann.</p>
<p>Here&rsquo;s a breakdown of the key figures and the evolution of Kate:</p>
<p>Michael Hofmann (Lead Developer): Hofmann started working on Kate as a personal tool for editing and exploring Markdown. He initially created it as a command-line tool and gradually built out the features we see today. He&rsquo;s the driving force behind the project and continues to actively maintain and develop it.
Other Contributors: While Hofmann is the central figure, Kate has benefited from significant contributions from a community of developers and designers. Important contributors include:
Matt Butcher: Made significant contributions to the UI design and the editor&rsquo;s overall look and feel.
Daniel Wani: Was instrumental in the early development and testing.
Key Timeline:</p>
<p>2013-2015: Initial development started by Michael Hofmann as a personal tool.
2015: Kate was released as open-source.
2016: The first desktop version was released.
In short, Michael Hofmann is widely considered the inventor of the Kate editor, but it&rsquo;s a product of a collaborative effort.</p>
<p>You can find more information about the development history on the Kate editor&rsquo;s website: katex.app</p>
</blockquote>
<p>Ok? No idea where that stems from.</p>
<p>Next try, ask llama3.2:</p>
<blockquote>
<p>I couldn&rsquo;t find any information on who specifically &ldquo;invented&rdquo; the Kate editor, but it was primarily developed by Michael Hofmann.</p>
<p>The Kate editor is a command-line text editor that was first released in 2005 and has since become popular among programmers and developers. It&rsquo;s known for its speed, efficiency, and customization options.</p>
<p>If you&rsquo;re looking for more information on the history of Kate or its development, I&rsquo;d be happy to try and help!</p>
</blockquote>
<p>A bit better, at least some hint that the answer could be useless.
Half contradicting the first, given there the same person seem to have invented that close to one decade later.</p>
<p>Next try, ask deepseek-r1:</p>
<blockquote>
<p>The Kate editor was not invented by a single individual but is instead an open-source project that was primarily developed and designed by Michael Hofmann in 2005. Since then, it has been actively maintained and improved by a community of contributors who have added features, enhanced its functionality, and worked on its documentation.</p>
<p>Kate is known for its simplicity, speed, and ability to perform complex text transformations quickly. It is widely used in development environments and is often bundled with modern IDEs (Integrated Development Environments) like JetBrains Rider for Java and .NET projects.</p>
<p>If you&rsquo;re looking for more details about Kate or its history, feel free to ask!</p>
</blockquote>
<p>Matching a bit the second answer with more interesting random pseudo facts.</p>
<p>Ok, then let&rsquo;s try the Brave browser AI search:</p>
<blockquote>
<p>Kate Editor Inventor
The KDE community developed the KDE Advanced Text Editor, or Kate. It has been a part of the KDE Software Compilation since version 2.2, which was first released in 2001.</p>
</blockquote>
<p>That looks at least reasonable.</p>
<p>Let&rsquo;s put the first sentence of one of the answers in the Brave browser AI search to see what happens then:</p>
<blockquote>
<p>The Kate editor was not invented by a single individual but is instead
an open-source project that was primarily developed and designed by
Michael Hofmann in 2005.</p>
</blockquote>
<p>You get back:</p>
<blockquote>
<p>The Kate editor is part of the KDE free software community and was not invented by a single individual.
Development of Kate began in 2001 with the release of KDE Software Compilation version 2.2.
Michael Hofmann is known for his contributions to the project, but he did not single-handedly create it.
Kate is an advanced text editor that supports syntax highlighting, code folding, and multiple cursors, among other features.</p>
</blockquote>
<p>Now you have Michael Hofmann back, as that was in your search prompt.
None of the linked search results tell you a sentences about Michael Hofmann, this was just nicely hallucinated into the summary because it was in the prompt.</p>
<p>I don&rsquo;t say that AI tooling is useless, deep learning is a very useful tool.</p>
<p>But I am afraid many people will just read the AI summary box above the search results and believe that is a real summary.</p>
<p>No, it is not.</p>
<p>If you rephrase the</p>
<blockquote>
<p>The Kate editor was not invented by a single individual but is instead
an open-source project that was primarily developed and designed by
Michael Hofmann in 2005.</p>
</blockquote>
<p>to something different, with a different name and perhaps not that nice achievement, you will likely just get a hallucinated confirmation of your query.</p>
<p>And voila: you asked if some thing you heard somewhere is true and more or less get it confirmed because you asked about it.</p>
<p>We then end up here:</p>
<blockquote>
<p>I said it because it is the truth.
It is the truth because I said it.</p>
</blockquote>
<p>I hope that enough people understand that issue and don&rsquo;t fall for the trap of only peaking at the AI summary and not actually looking at the search results.
But as it is that convenient, and even I often just read that first, I am afraid that will not be the case.</p>
<p>Naturally the search results themselves were never the fully reliable source of information.</p>
<p>They are weighted and sorted via algorithms that will keep in mind a lot of things that might not be in your interest and even without that, perhaps just the found pages are full of half truths or lies (like this one :)</p>
<p>But the AI summary box just adds one level more that can introduce just any kind of error or bias on top of that.</p>
]]></content:encoded></item><item><title>Over 20 years of bug squashing</title><link>https://cullmann.dev/posts/over-20-years-of-bug-squashing/</link><pubDate>Sun, 15 Dec 2024 20:23:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/over-20-years-of-bug-squashing/</guid><description>&lt;p&gt;The open source project I work on for the longest time is &lt;a href="https://www.kde.org"&gt;KDE&lt;/a&gt; and there more specific &lt;a href="https://kate-editor.org"&gt;Kate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This means I look at user bug reports for over 20 years now.&lt;/p&gt;
&lt;p&gt;The statistics tell me our team got more than 9000 bugs since around 2001 (just for Kate, this excludes the libraries like KTextEditor that we maintain, too).&lt;/p&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/over-20-years-of-bug-squashing/images/kate-bug-statistics_hu_430fbf83709733e6.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/over-20-years-of-bug-squashing/images/kate-bug-statistics_hu_9641ed10de8b645.webp" alt="Kate Bug Statistics" style="border: 0px; border-radius: 8px;" width="640" height="480" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;That is a bit more than one bug per day for over two decades.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The open source project I work on for the longest time is <a href="https://www.kde.org">KDE</a> and there more specific <a href="https://kate-editor.org">Kate</a>.</p>
<p>This means I look at user bug reports for over 20 years now.</p>
<p>The statistics tell me our team got more than 9000 bugs since around 2001 (just for Kate, this excludes the libraries like KTextEditor that we maintain, too).</p>
<center>



<a href="https://cullmann.dev/posts/over-20-years-of-bug-squashing/images/kate-bug-statistics_hu_430fbf83709733e6.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/over-20-years-of-bug-squashing/images/kate-bug-statistics_hu_9641ed10de8b645.webp" alt="Kate Bug Statistics" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>That is a bit more than one bug per day for over two decades.</p>
<p>And as the statistics show, especially in the last years we were able to keep the open bug count down, that means we fixed a lot of them.</p>
<p>Given we are a small team, I think that is a nice achievement.</p>
<p>We not just survived over 20 years, we are still alive and kicking and not just a still compiling zombie project.</p>
<p>Thanks a lot to <a href="https://kate-editor.org/the-team/">all people</a> that are contributing to this success!</p>
<p>Let&rsquo;s keep this up in the next year and the ones following.</p>
]]></content:encoded></item><item><title>KDE Applications &amp; Icons</title><link>https://cullmann.dev/posts/kde-applications-and-icons/</link><pubDate>Sat, 11 May 2024 20:30:01 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kde-applications-and-icons/</guid><description>&lt;p&gt;In this rather lengthy post I talk a bit about the current issues with icons for the KDE applications I work on or use.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with looking at what I mean with KDE applications and what the current state is, up to KDE Frameworks 6.2 and current KDE Gear 24.02.
Then let&amp;rsquo;s see what will be improved in future releases.&lt;/p&gt;
&lt;h2 id="what-do-i-mean-with-kde-applications"&gt;What do I mean with &amp;lsquo;KDE Applications&amp;rsquo;&lt;/h2&gt;
&lt;p&gt;If I speak about &amp;lsquo;KDE Applications&amp;rsquo; here I talk about applications like Kate, Dolphin, Okular and others like that.&lt;/p&gt;</description><content:encoded><![CDATA[<p>In this rather lengthy post I talk a bit about the current issues with icons for the KDE applications I work on or use.</p>
<p>Let&rsquo;s start with looking at what I mean with KDE applications and what the current state is, up to KDE Frameworks 6.2 and current KDE Gear 24.02.
Then let&rsquo;s see what will be improved in future releases.</p>
<h2 id="what-do-i-mean-with-kde-applications">What do I mean with &lsquo;KDE Applications&rsquo;</h2>
<p>If I speak about &lsquo;KDE Applications&rsquo; here I talk about applications like Kate, Dolphin, Okular and others like that.</p>
<p>This means applications developed with Qt and KDE Frameworks that integrate well with the KDE Plasma desktop but are not restricted to it.</p>
<p>Many of this applications not just aim to work well on Linux &amp; BSD or other open source operating systems but are ported and working well on the rather different Windows and macOS desktop. Some even are successful since years in the official Windows Store.</p>
<p>The above applications are part of the KDE Gear releases, but the described issues and solutions naturally are not restricted to stuff released with that.</p>
<p>What most of these applications have in common is that they rely on rather large parts of our Frameworks.
With that they depend at least indirectly on an icon set that covers large parts of what our default icon set Breeze provides.
Even if you use no icons from that icon set yourself in your application, just using the standard actions or many widgets/dialogs from Frameworks will rely on some subset of Breeze.</p>
<h2 id="current-state-of-icons-per-desktop-or-platform">Current State of Icons per Desktop or Platform</h2>
<p>When talking about the current situation of icons that depends largely on the desktop or platform you are running the KDE application on.</p>
<p>Let&rsquo;s take a look at some (I for sure miss some that are common or loved, that doesn&rsquo;t mean I disregard them, I just want to limit the scope).</p>
<h3 id="kde-plasma-on-linuxbsd-with-waylandx11">KDE Plasma on Linux/BSD with Wayland/X11</h3>
<p>If you just aim to run on the KDE Plasma desktop with your Qt and KDE Frameworks based application, all is fine with icons, there is no problem.</p>
<p>The KDE project did their job, at least for Kate I never did have any issues with icons on Plasma.</p>
<p>Below a screenshot of Kate 24.02 running on Plasma 6. All icons are there, they are properly re-colored for the dark theme, too, including not just the used Breeze icons but for example the small Git icons in the left sidebar that Kate has bundled.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-linux-wayland_hu_fba1422131943aa5.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-linux-wayland_hu_ea78c2e52b607631.webp" alt="KDE Plasma on Linux/BSD with Wayland/X11" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>This is the vanilla state each user will get if Kate is installed on Plasma (and the dark theme is used).
There are no patches done during building to achieve that nor is there any extra user configuration necessary.</p>
<h3 id="microsoft-windows">Microsoft Windows</h3>
<p>If you run Kate on Windows, the icon situation is good, too, if you use our Windows Store variant or get at build done via Craft.</p>
<p>See below what the current nightly of Kate looks like in some Windows 11 VM (I just started it from the unpacked ZIP, no setup needed).</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-windows_hu_335f3ad79fbb1b41.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-windows_hu_4ee58bee688721f6.webp" alt="Microsoft Windows" style="border: 0px; border-radius: 8px;" width="640" height="331" />
</a>
</center>

<p>In the Craft build descriptions we do some patches to ensure the Breeze icons are bundled as library and the application links with that.
In addition we ensure with some more patching that our own icon engine is used to allow for the proper recoloring.</p>
<p>If you don&rsquo;t do that patching you will end up with close to no icons or for dark theme black on black icons.</p>
<h3 id="apples-macos">Apple&rsquo;s macOS</h3>
<p>The situation on macOS is the same as on Windows.</p>
<p>If you go with a Craft build of Kate, you will end up with something like below.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-macos_hu_3e40f9846668371c.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-macos_hu_3792db2e7f381358.webp" alt="Apple&#39;s macOS" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>All icons are there and even application provided icons like our Git one are properly recolored.</p>
<p>Without the Craft patches Kate has more or less no icons like on Windows.</p>
<h3 id="haiku">Haiku</h3>
<p>After covering Plasma and the two large closed-source desktop operating systems, as a small excursion, look how Kate (the KF5 based version) looks if installed on <a href="https://www.haiku-os.org/">Haiku</a> with the package they provide.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-haiku_hu_615b601dcaa9965c.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-haiku_hu_33f6632cda48a3eb.webp" alt="Haiku" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>Kate looks ok, system icons intermixed with Breeze as fallback icons.</p>
<h3 id="gnome">GNOME</h3>
<p>For testing this, I installed the latest Fedora Workstation in a VM.
I have done no user configuration beside what the installer and initial setup wizard asked and then just installed the Kate package.
The shell was even helpful to ask to do that after you just tried to start the not installed Kate.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-fedora-gnome_hu_ce9b027369ac921d.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-fedora-gnome_hu_7439923819bc0b0a.webp" alt="Kate on GNOME" style="border: 0px; border-radius: 8px;" width="640" height="400" />
</a>
</center>

<p>Most icons not there, not that nice.
For details about that read <a href="/posts/kate-and-icons/">this post</a>, we don&rsquo;t need to re-iterate this again.</p>
<p>If you think: that is just Kate, let us just try Okular.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-okular-fedora-gnome_hu_daecd41ddc8afd22.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-okular-fedora-gnome_hu_8dddb47fb209fa8a.webp" alt="Okular on GNOME" style="border: 0px; border-radius: 8px;" width="640" height="400" />
</a>
</center>

<p>One thing that can be at least solved easily is that the icons are gone, we just install the Breeze icon set as package.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-and-okular-with-breeze-fedora-gnome_hu_2c0997c28e8b0391.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-and-okular-with-breeze-fedora-gnome_hu_145ce9725dcaad7f.webp" alt="Kate and Okular with Breeze on GNOME" style="border: 0px; border-radius: 8px;" width="640" height="400" />
</a>
</center>

<p>Looks ok, system icons intermixed with Breeze as fallback icons just like on Haiku.
Not stylish but usable.</p>
<p>I was unable to trigger Kate or Okular to adjust to the dark mode GNOME provides, therefore I can not test if we end up with black on black icons there, but it is likely, as the fallback is just Breeze.</p>
<h3 id="mate">MATE</h3>
<p>Kate and Dolphin 24.02 on MATE with dark mode on NixOS, normal system packages, Breeze icons is installed.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-and-dolphin-mate_hu_5b67d574556dfec6.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-and-dolphin-mate_hu_1877e679b9206008.webp" alt="MATE" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>System icons intermixed with Breeze as fallback icons, looks not that nice.
Breeze icons not readable, as recoloring is not working.</p>
<h3 id="xfce">Xfce</h3>
<p>Kate and Dolphin 24.02 on Xfce with dark mode on NixOS, normal system packages, Breeze icons is installed.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-and-dolphin-xfce_hu_653b07c8fcc35b55.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-and-dolphin-xfce_hu_1bd9135514230137.webp" alt="Xfce" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>Same mix and unreadable state as on MATE.</p>
<h3 id="enlightenment">Enlightenment</h3>
<p>Kate 24.02 on Enlightenment with dark mode on NixOS, normal system packages, Breeze icons is installed.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-enlightenment_hu_51779d0937f8dc80.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-enlightenment_hu_4b3b4b762e6f4061.webp" alt="Enlightenment" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>Just unreadable icons, beside out own Git icon and the few colored ones.</p>
<h2 id="summary-whats-up-with-icons-today">Summary: What&rsquo;s up with Icons today</h2>
<p>The icons in KDE applications do look perfect on KDE Plasma.
That should be no real surprise as many people working on these applications will test them there and KDE Frameworks and Qt are well tested on Plasma, too.</p>
<p>The icons look fine on Windows and macOS, too, at least for applications that got properly ported, but only thanks to patches we do in Craft.
If you just grab e.g. Kate&rsquo;s and the needed frameworks sources from our normal repositories, you don&rsquo;t get that.</p>
<p>If the maintainers of the port for some OS do care, like the Haiku people, KDE applications can look fine there.</p>
<p>On other desktop environments it doesn&rsquo;t look that great out of the box.</p>
<p>Unlike for the other operating systems, there the same packages without extra patches are running.</p>
<p>Whereas that works perfect on Plasma, we rely too much that the desktop environment running provides an icon set that has a similar coverage and naming as Breeze. As we don&rsquo;t hard depend on the Breeze icons for our applications, it can even happen that just no fitting icons are there per default.</p>
<p>Even if that can be solved with some better package dependencies, you still end up with a patchwork look and without a Qt platform theme plugin that handles the needed recoloring to make dark mode feasible.</p>
<h2 id="getting-it-fixed">Getting it fixed</h2>
<p>Fortunately, just because the status quo is not that nice, it must not stay that way.</p>
<p>We have more or less all needed parts to fix the situation, we did already fix it during <a href="https://kate-editor.org/post/2021/2021-03-07-cross-platform-light-dark-themes-and-icons/">the porting to Windows and macOS</a>.</p>
<p>We just never pushed to get this stuff done on Linux and Co.</p>
<p>How did we solve it there?</p>
<ul>
<li>We have the Breeze icon set as Qt resource inside a library and link with that. That makes them a hard build and runtime dependency and easy to deploy.</li>
<li>We ensure the icon engine we have in our KIconThemes framework is there and used.</li>
<li>We enforce the Breeze Qt style. (this is not really icon related, but ensures an usable look&rsquo;n&rsquo;feel, too)</li>
</ul>
<p>The first and the last thing are easy to do on Linux and Co., too, even with still allowing the user to override the icon set and style, but still defaulting to Breeze.</p>
<p>The second point is harder, as that requires at the moment a few hacks and is not 100% as good as going the Qt platform theme plugin route we use inside Plasma.</p>
<p>For KDE Frameworks 6.3 we worked to get that done.</p>
<p>See our <a href="https://invent.kde.org/frameworks/kiconthemes/-/issues/3">meta issue on our GitLab instance</a> covering that topic.</p>
<p>All is not perfect, we will need to get some Qt API to fully do that, but the current state is already usable.</p>
<p>Here a comparison with the state as we have it now in our released software compared to with the state in the current master branch on an Cinnamon desktop.</p>
<center>



<a href="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-fixed-cinnamon_hu_8f125a393ef84dc0.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-and-icons/images/2024-kate-fixed-cinnamon_hu_5bf997f3dce886d.webp" alt="Cinnamon" style="border: 0px; border-radius: 8px;" width="640" height="344" />
</a>
</center>

<p>The left side is the current Kate 24.02, the right side the current master build of Kate with master Frameworks.</p>
<p>The hard dependency to the Breeze icon library is done in KIconThemes, if you link to that, you are guaranteed that you have Breeze icons.
You can naturally just link to only the Breeze icon library on your own.</p>
<p>The ensuring that the proper icon engine is done with some new API in KIconThemes that application developers must opt-in for.
The same for the Qt style setup, there we have API in KConfigWidgets.</p>
<p>For Kate the concrete changes can be <a href="https://invent.kde.org/utilities/kate/-/merge_requests/1482">found here</a>.
They are minimal and even remove some platform specific code for the style setup.</p>
<p>Including fallback code for pre 6.3 Frameworks compatibility of the style setting, the basic idea is:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;KIconTheme&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#define HAVE_STYLE_MANAGER __has_include(&lt;KStyleManager&gt;)
</span></span></span><span class="line"><span class="cl"><span class="cp">#if HAVE_STYLE_MANAGER
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;KStyleManager&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(...)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * trigger initialisation of proper icon theme
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl"><span class="cp">#if KICONTHEMES_VERSION &gt;= QT_VERSION_CHECK(6, 3, 0)
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="n">KIconTheme</span><span class="o">::</span><span class="n">initTheme</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">    <span class="n">QApplication</span> <span class="n">yourAppInstance</span><span class="p">(...);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">#if HAVE_STYLE_MANAGER
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * trigger initialisation of proper application style
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl">    <span class="n">KStyleManager</span><span class="o">::</span><span class="n">initStyle</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="cp">#else
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * For Windows and macOS: use Breeze if available
</span></span></span><span class="line"><span class="cl"><span class="cm">     * Of all tested styles that works the best for us
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl"><span class="cp">#if defined(Q_OS_MACOS) || defined(Q_OS_WIN)
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="n">QApplication</span><span class="o">::</span><span class="n">setStyle</span><span class="p">(</span><span class="n">QStringLiteral</span><span class="p">(</span><span class="s">&#34;breeze&#34;</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">    <span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>In the long run, once 6.3 is the minimal version the application depends on, this is just:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;KIconTheme&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;KStyleManager&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(...)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * trigger initialisation of proper icon theme
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl">    <span class="n">KIconTheme</span><span class="o">::</span><span class="n">initTheme</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">QApplication</span> <span class="n">yourAppInstance</span><span class="p">(...);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * trigger initialisation of proper application style
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl">    <span class="n">KStyleManager</span><span class="o">::</span><span class="n">initStyle</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>At the moment KIconTheme::initTheme() is still a bit hacky until we have proper Qt API, but that is not visible for the API user.</p>
<p>If we get this properly done in our applications, that will not just solve the current issue for running them in other desktop environments.</p>
<p>With that API in use and the now already upstreamed patches, one can build vanilla Frameworks and Kate on Windows and macOS and the icons will just work in the resulting application bundles and you get an usable style out of the box if Breeze is there.</p>
<h2 id="help-wanted">Help Wanted!</h2>
<p>We have now some API to help our applications to be more usable on non-Plasma installations and Windows and macOS.</p>
<p>We still need to make use of it and we need to improve the implementation and upstream to Qt the needed extra API to make it a real 100% replacement to what we do with the Plasma integration plugin.</p>
<p>If you have time to help us, show up on <a href="https://invent.kde.org/frameworks/kiconthemes/-/issues/3">our meta issue</a>.</p>
<p>Not just coding is needed, we for example have still a few icons that <a href="https://invent.kde.org/frameworks/breeze-icons/-/issues/17">don&rsquo;t recolor well</a>, help to fix that is wanted, too.</p>
<h2 id="feedback">Feedback</h2>
<p>You can provide feedback on the matching <a href="https://lemmy.kde.social/post/1259796">KDE Social</a> or <a href="https://www.reddit.com/r/linux/comments/1cpnuth/kde_applications_icons_current_state_and_how_to/">reddit</a> post.</p>
]]></content:encoded></item><item><title>Kate &amp; Icons</title><link>https://cullmann.dev/posts/kate-and-icons/</link><pubDate>Thu, 02 May 2024 00:36:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-and-icons/</guid><description>&lt;h2 id="how-it-shall-look"&gt;How it shall look&amp;hellip;&lt;/h2&gt;
&lt;h3 id="linux--bsds"&gt;Linux &amp;amp; BSDs&lt;/h3&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-linux-wayland_hu_fba1422131943aa5.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-linux-wayland_hu_ea78c2e52b607631.webp" alt="Linux &amp;amp; BSDs" style="border: 0px; border-radius: 8px;" width="640" height="360" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;h3 id="windows"&gt;Windows&lt;/h3&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-windows_hu_f53be2b7a7e8b0a9.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-windows_hu_598e8fa88471db4d.webp" alt="Windows" style="border: 0px; border-radius: 8px;" width="640" height="331" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;h3 id="macos"&gt;macOS&lt;/h3&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-macos_hu_3e40f9846668371c.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-macos_hu_3792db2e7f381358.webp" alt="macOS" style="border: 0px; border-radius: 8px;" width="640" height="360" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;h2 id="state-on-fedora-40-workstation--xfce-spin"&gt;State on Fedora 40 Workstation &amp;amp; XFCE Spin&amp;hellip;&lt;/h2&gt;
&lt;p&gt;Screenshots taken from the &lt;a href="https://gitlab.gnome.org/GNOME/adwaita-icon-theme/-/issues/288"&gt;GNOME bugtracker&lt;/a&gt;, copies to not stall their GitLab instance.&lt;/p&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-workstation_hu_37e81c4c5ea4f924.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-workstation_hu_9f1de2f8fe934f14.webp" alt="Fedora 40 Workstation" style="border: 0px; border-radius: 8px;" width="640" height="368" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-xfce_hu_6dce8b55870781ff.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-xfce_hu_2f7fb5f4eb4f7968.webp" alt="Fedora 40 XFCE Spin" style="border: 0px; border-radius: 8px;" width="640" height="895" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;I think that is rather unpleasant and for e.g. the left icon-only border just an unusable insult.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="how-it-shall-look">How it shall look&hellip;</h2>
<h3 id="linux--bsds">Linux &amp; BSDs</h3>
<center>



<a href="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-linux-wayland_hu_fba1422131943aa5.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-linux-wayland_hu_ea78c2e52b607631.webp" alt="Linux &amp; BSDs" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<h3 id="windows">Windows</h3>
<center>



<a href="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-windows_hu_f53be2b7a7e8b0a9.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-windows_hu_598e8fa88471db4d.webp" alt="Windows" style="border: 0px; border-radius: 8px;" width="640" height="331" />
</a>
</center>

<h3 id="macos">macOS</h3>
<center>



<a href="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-macos_hu_3e40f9846668371c.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/2024-kate-macos_hu_3792db2e7f381358.webp" alt="macOS" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<h2 id="state-on-fedora-40-workstation--xfce-spin">State on Fedora 40 Workstation &amp; XFCE Spin&hellip;</h2>
<p>Screenshots taken from the <a href="https://gitlab.gnome.org/GNOME/adwaita-icon-theme/-/issues/288">GNOME bugtracker</a>, copies to not stall their GitLab instance.</p>
<center>



<a href="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-workstation_hu_37e81c4c5ea4f924.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-workstation_hu_9f1de2f8fe934f14.webp" alt="Fedora 40 Workstation" style="border: 0px; border-radius: 8px;" width="640" height="368" />
</a>
</center>

<center>



<a href="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-xfce_hu_6dce8b55870781ff.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-and-icons/images/fedora-40-xfce_hu_2f7fb5f4eb4f7968.webp" alt="Fedora 40 XFCE Spin" style="border: 0px; border-radius: 8px;" width="640" height="895" />
</a>
</center>

<p>I think that is rather unpleasant and for e.g. the left icon-only border just an unusable insult.</p>
<h2 id="why-the-adwaita-icon-theme-no-longer-follows-the-fdo-icon-naming-spec">Why? The Adwaita Icon Theme no longer follows the FDO icon naming spec</h2>
<p>There was no information that they want to break away from the icon naming &rsquo;the world&rsquo; does assume (given there is a <a href="https://specifications.freedesktop.org/icon-naming-spec/latest/ar01s04.html">spec</a>).
And now we have that state for our users there, at least on these spins.</p>
<p>That is not that nice, we did spend a lot of work to get our applications working cross-desktop and even cross-platform and now that&hellip;</p>
<p>I feel rather infuriated, finding this before going to sleep, even more after reading the feedback in the <a href="https://gitlab.gnome.org/GNOME/adwaita-icon-theme/-/issues/288">GNOME bugtracker</a> and that this is just closed as &lsquo;so be it&rsquo;.</p>
<p>They added now at least a hint to the README:</p>
<p><a href="https://gitlab.gnome.org/GNOME/adwaita-icon-theme/-/commit/ad605446a829420b659c7f360333e4309a8f4a55"><strong>Private UI icon set for GNOME core apps.</strong></a></p>
<p>Ok, I assume that is then all fine.</p>
<p>No, it is not.</p>
<p>Then please don&rsquo;t install it as FDO icon theme and break all FOSS apps that rely on the naming spec&hellip;</p>
<p>If you care for non &lsquo;GNOME core apps&rsquo; to work per default properly on distributions like that, please either get them to fix it (hints are given in the <a href="https://gitlab.gnome.org/GNOME/adwaita-icon-theme/-/issues/288">linked issue</a>) or get the distributions to install a compliant theme.</p>
<p>We can plan to work around this mess in <a href="https://invent.kde.org/frameworks/kiconthemes/-/issues/3">the future</a> on our side, but that will not un-break the application versions that are now already shipped to our users and non-KDE frameworks based stuff that will just run into the same issues.</p>
<h2 id="feedback">Feedback</h2>
<p>You can provide feedback on the matching <a href="https://lemmy.kde.social/post/1212069">KDE Social</a>, <a href="https://www.reddit.com/r/linux/comments/1chzmya/kde_kate_editor_icons_or_how_fedora_40_with_the/">reddit</a> or <a href="https://news.ycombinator.com/item?id=40230558">Hacker News</a> post.</p>
]]></content:encoded></item><item><title>Kate on all Platforms - 2024</title><link>https://cullmann.dev/posts/kate-on-all-platforms-2024/</link><pubDate>Sun, 14 Apr 2024 19:32:02 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-on-all-platforms-2024/</guid><description>&lt;h2 id="unix-like-systems-with-x11-or-wayland"&gt;Unix like systems with X11 or Wayland&lt;/h2&gt;
&lt;p&gt;All &lt;a href="https://en.wikipedia.org/wiki/Unix"&gt;Unix like systems&lt;/a&gt; with either &lt;a href="https://en.wikipedia.org/wiki/X_Window_System"&gt;X11&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Wayland_%28protocol%29"&gt;Wayland&lt;/a&gt; are well supported since ever.&lt;/p&gt;
&lt;p&gt;Linux with X11 and now Wayland is for a long time the primary system on that Kate work happens.&lt;/p&gt;
&lt;p&gt;Over the years it was, like most of the &lt;a href="https://apps.kde.org/"&gt;KDE applications&lt;/a&gt;, ported to various &lt;a href="https://en.wikipedia.org/wiki/Berkeley_Software_Distribution"&gt;BSD&lt;/a&gt; variants.&lt;/p&gt;
&lt;p&gt;Be it some mainstream Linux distribution like &lt;a href="https://fedoraproject.org/"&gt;Fedora&lt;/a&gt; or a niche one like &lt;a href="http://nixos.org"&gt;NixOS&lt;/a&gt;, Kate is available as binary package.
You love BSD?
From &lt;a href="https://freebsd.org"&gt;FreeBSD&lt;/a&gt; to &lt;a href="https://openbsd.org"&gt;OpenBSD&lt;/a&gt;, you can get a Kate package via your normal package system.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="unix-like-systems-with-x11-or-wayland">Unix like systems with X11 or Wayland</h2>
<p>All <a href="https://en.wikipedia.org/wiki/Unix">Unix like systems</a> with either <a href="https://en.wikipedia.org/wiki/X_Window_System">X11</a> or <a href="https://en.wikipedia.org/wiki/Wayland_%28protocol%29">Wayland</a> are well supported since ever.</p>
<p>Linux with X11 and now Wayland is for a long time the primary system on that Kate work happens.</p>
<p>Over the years it was, like most of the <a href="https://apps.kde.org/">KDE applications</a>, ported to various <a href="https://en.wikipedia.org/wiki/Berkeley_Software_Distribution">BSD</a> variants.</p>
<p>Be it some mainstream Linux distribution like <a href="https://fedoraproject.org/">Fedora</a> or a niche one like <a href="http://nixos.org">NixOS</a>, Kate is available as binary package.
You love BSD?
From <a href="https://freebsd.org">FreeBSD</a> to <a href="https://openbsd.org">OpenBSD</a>, you can get a Kate package via your normal package system.</p>
<p>And in the normal case, you can just build it from source on your own, all needed patches should be in our repositories upstream.
If that is not the case for your system, please help to upstream them.</p>
<p>Below the current state of the master branch compiled on NixOS unstable with Wayland.</p>
<center>



<a href="https://cullmann.dev/posts/kate-on-all-platforms-2024/images/2024-kate-linux-wayland_hu_fba1422131943aa5.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-on-all-platforms-2024/images/2024-kate-linux-wayland_hu_ea78c2e52b607631.webp" alt="Unix like systems with X11 or Wayland" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>How to compile Kate on your own on a Unix like system and start to help to develop it can be found out <a href="https://kate-editor.org/build-it/">here</a>.</p>
<h2 id="windows">Windows</h2>
<p>Since several years there are activities in the KDE community to provide our libraries and applications for <a href="https://en.wikipedia.org/wiki/Microsoft_Windows">Windows</a>.</p>
<p>Even if that is a non-free platform, we can reach out to new users and developers that might later be then even interested to switch a full open platform.</p>
<p>Progress is slow, but steady.
We have Kate and some other applications in the official <a href="https://apps.microsoft.com/search/publisher?name=KDE&#43;e.V.">Windows Store</a> and nightly build for more of them.
With reasonable effort you can develop Kate on Windows with <a href="https://community.kde.org/Get_Involved/development/Windows">Craft</a>.</p>
<p>Below the current state of the master branch running on Windows 11 inside VirtualBox.</p>
<center>



<a href="https://cullmann.dev/posts/kate-on-all-platforms-2024/images/2024-kate-windows_hu_f53be2b7a7e8b0a9.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-on-all-platforms-2024/images/2024-kate-windows_hu_598e8fa88471db4d.webp" alt="Windows" style="border: 0px; border-radius: 8px;" width="640" height="331" />
</a>
</center>

<p>If you like to try that, use the nighly installer linked on the <a href="https://kate-editor.org/get-it/">Kate website</a>.</p>
<h2 id="macos">macOS</h2>
<p>Beside Windows, the major other non-free platform Kate tries to support is <a href="https://en.wikipedia.org/wiki/MacOS">macOS</a>.</p>
<p>We have nighly build available for that and you can, like on Windows, develop Kate with the help of <a href="https://community.kde.org/Get_Involved/development/Mac">Craft</a>.</p>
<p>Below the current state of the master branch running native on my M2 ARM Mac Mini.</p>
<center>



<a href="https://cullmann.dev/posts/kate-on-all-platforms-2024/images/2024-kate-macos_hu_3e40f9846668371c.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-on-all-platforms-2024/images/2024-kate-macos_hu_3792db2e7f381358.webp" alt="macOS" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>Same as for Windows, if you like to try that, use the nighly installer for either ARM or Intel Macs linked on the <a href="https://kate-editor.org/get-it/">Kate website</a>.</p>
<h2 id="other-platforms">Other Platforms</h2>
<p>Naturally there are more than the above mentioned operating systems around.</p>
<p>Beside the mobile ones like <a href="https://en.wikipedia.org/wiki/Android_%28operating_system%29">Android</a> and <a href="https://en.wikipedia.org/wiki/IOS">iOS</a> that are not that interesting for Kate, many other desktop operating systems exist.</p>
<p>Even if the Kate team itself doesn&rsquo;t put active work it them, that doesn&rsquo;t mean Kate can&rsquo;t run there.</p>
<p>Without any active work on our side, for example a Kate port for <a href="https://www.haiku-os.org/">Haiku</a> was done.
Some one-liner patches for that got even upstreamed.</p>
<p>If you work on some port of our stuff and need to upstream stuff, please contact us.
Even if you work on a non-mainstream system, as long as the patches are not too intrusive, we are interested to have them.</p>
<h2 id="help-us">Help us!</h2>
<p>Naturally the most of our developers are working on the Linux or some BSD.</p>
<p>That means the other systems are always in need of more people to help out, both on the programming and testing side.</p>
<p>For Kate, testing should be easy, grab a nighly build for Windows or macOS on the <a href="https://kate-editor.org/get-it/">Kate website</a>.
Or even better, get <a href="https://community.kde.org/Craft">Craft</a> running, that will make it easier to contribute, too.</p>
<p>One recent topic that needs love is the removal of <a href="https://en.wikipedia.org/wiki/D-Bus">DBus</a> for Windows/macOS/Android and other systems that don&rsquo;t use it normally.</p>
<p>If you are up to help with that, <a href="https://invent.kde.org/packaging/craft-blueprints-kde/-/issues/17">here</a> that is coordinated.
The current state is already sufficient that the nightly builds of Kate no longer hang on e.g. macOS, but still some frameworks like KIO will need more work.</p>
<p>Just don&rsquo;t get that wrong, DBus is great on the Linux or BSD systems that use it natively, but it is a pain on systems that have no notion of DBus and leads there to hangs or the spawning of unwanted processes.
Beside that, the usefulness is low there, as there are no services on the bus to communicate with anyways.</p>
<h2 id="feedback">Feedback</h2>
<p>You can provide feedback on the matching <a href="https://lemmy.kde.social/post/1121189">KDE Social</a>, <a href="https://www.reddit.com/r/kde/comments/1c3z0g4/kate_on_all_platforms_2024/">reddit</a> or <a href="https://news.ycombinator.com/item?id=40032869">Hacker News</a> post.</p>
]]></content:encoded></item><item><title>KDE Frameworks 6 / Plasma / Gear Release Schedule Plan</title><link>https://cullmann.dev/posts/kf6-release-plan/</link><pubDate>Thu, 07 Sep 2023 22:05:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kf6-release-plan/</guid><description>&lt;p&gt;The Qt 6 based KDE Frameworks 6 (KF6) development is ongoing since some time.&lt;/p&gt;
&lt;p&gt;Already many things including Plasma and several applications, like Kate, have working KF6 based development versions.&lt;/p&gt;
&lt;p&gt;KDE contributors did meet this week online for planning the final release time-frames.&lt;/p&gt;
&lt;p&gt;We came up with &lt;a href="https://mail.kde.org/pipermail/kde-devel/2023-September/002008.html"&gt;this current plan&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Frameworks / Plasma/ Gear Release Schedule Plan&lt;/p&gt;
&lt;p&gt;Following on from the last Akademy we checked where we were with our
development progress in a meeting and settled on the following plan
for all 3 major parts:&lt;/p&gt;</description><content:encoded><![CDATA[<p>The Qt 6 based KDE Frameworks 6 (KF6) development is ongoing since some time.</p>
<p>Already many things including Plasma and several applications, like Kate, have working KF6 based development versions.</p>
<p>KDE contributors did meet this week online for planning the final release time-frames.</p>
<p>We came up with <a href="https://mail.kde.org/pipermail/kde-devel/2023-September/002008.html">this current plan</a>:</p>
<blockquote>
<p>Frameworks / Plasma/ Gear Release Schedule Plan</p>
<p>Following on from the last Akademy we checked where we were with our
development progress in a meeting and settled on the following plan
for all 3 major parts:</p>
<ul>
<li>
<p>In KDE Gear master will be open for Qt6 code to land for those
ready to move. Not all apps need to port.</p>
</li>
<li>
<p>The KDE Gear release will move by 2 months to allow for the extra
time needed for testing initial Qt6 changes</p>
</li>
<li>
<p>An Alpha will be made in November  (a soft freeze in Plasma terms)</p>
</li>
<li>
<p>Betas/RCs will be made throughout December and January (3 releases,
3 weeks apart)</p>
</li>
<li>
<p>Final release of all 3 major parts in sync in February</p>
</li>
</ul>
<p>Due to the delay of KDE Gear by an additional patch release of 23.08
will be made.</p>
</blockquote>
<p>This is still up for discussion, but if no objections come up, we will see a triple release of a first stable KF6, KF6 based Plasma and KF6 based Gear next February.</p>
<p>There is still a lot to do, <a href="https://community.kde.org/Get_Involved">help is welcome</a>!</p>
]]></content:encoded></item><item><title>Planck and QMK</title><link>https://cullmann.dev/posts/planck-and-qmk/</link><pubDate>Sat, 08 Oct 2022 18:35:00 +0300</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/planck-and-qmk/</guid><description>&lt;h2 id="the-planck-keyboard"&gt;The Planck Keyboard&lt;/h2&gt;
&lt;p&gt;Over the past two years I tried out a few different keyboards for fun.&lt;/p&gt;
&lt;p&gt;I started with common form factors like TKL boards, went over 75% boards like the &lt;a href="https://cullmann.dev/posts/keyboards-and-open-source/"&gt;Q1&lt;/a&gt; and then to a 60% &lt;a href="https://en.wikipedia.org/wiki/Happy_Hacking_Keyboard"&gt;HHKB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For typing feel, the HHKB is really amazing, but unfortunately the programmable features of a stock HHKB board are very limited.&lt;/p&gt;
&lt;p&gt;Now that I went down to 60%, I will give a more extreme keyboard a chance, the 40% Planck ortholinear keyboard.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="the-planck-keyboard">The Planck Keyboard</h2>
<p>Over the past two years I tried out a few different keyboards for fun.</p>
<p>I started with common form factors like TKL boards, went over 75% boards like the <a href="/posts/keyboards-and-open-source/">Q1</a> and then to a 60% <a href="https://en.wikipedia.org/wiki/Happy_Hacking_Keyboard">HHKB</a>.</p>
<p>For typing feel, the HHKB is really amazing, but unfortunately the programmable features of a stock HHKB board are very limited.</p>
<p>Now that I went down to 60%, I will give a more extreme keyboard a chance, the 40% Planck ortholinear keyboard.</p>
<p>This one is fully open-source, you can even produce your own PCBs and Co.
You find more or less all stuff freely at <a href="https://github.com/olkb">GitHub</a>.</p>
<p>Given that the Plank designer funded <a href="https://qmk.fm">QMK</a>, too, naturally you can fully customize the Planck boards.</p>
<p>Unlike for my tries with the Q1, this time I just went the plain QMK route, without any UI like the closed <a href="https://www.caniusevia.com/">VIA</a> or the open <a href="https://get.vial.today/">VIAL</a>.</p>
<p>The Planck board offers a nice platform for experiments, given the plain grid layer that allows really to freely shuffle all your keys and experiment with extreme layouts.</p>
<center>



<a href="https://cullmann.dev/posts/planck-and-qmk/images/planck-building_hu_b496bb6c656fff28.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/planck-and-qmk/images/planck-building_hu_5621f073443ff0e3.webp" alt="Building the Planck keyboard" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<h2 id="install-qmk-on-nixos">Install QMK on NixOS</h2>
<p>As I use at the moment <a href="https://nixos.org">NixOS</a> at home, here the needed steps to get going with QMK on that distribution.</p>
<p>Install the qmk package. This will install the needed cross compile tool chains, too.</p>
<p>Ensure the udev rules are setup, e.g. add to your configuration.nix</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="n">services</span><span class="o">.</span><span class="n">udev</span><span class="o">.</span><span class="n">packages</span> <span class="o">=</span> <span class="p">[</span> <span class="n">pkgs</span><span class="o">.</span><span class="n">qmk-udev-rules</span> <span class="p">];</span></span></span></code></pre></div>
<p>Run qmk setup, here with some own firmware location</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qmk setup -H ~/install/qmk/firmware</span></span></code></pre></div>
<p>Configure QMK to use the Planck as default</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qmk config user.keyboard<span class="o">=</span>planck/rev6_drop</span></span></code></pre></div>
<p>Use my github name as keymap name</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qmk config user.keymap<span class="o">=</span>christoph-cullmann</span></span></code></pre></div>
<p>Create own keymap based on default</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qmk new-keymap</span></span></code></pre></div>
<p>Compile the firmware</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qmk compile</span></span></code></pre></div>
<p>Put the keyboard in boot loader mode (e.g. trigger RESET)</p>
<p>Flash the firmware</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">qmk flash</span></span></code></pre></div>
<p>Now the keyboard should auto-restart with the new firmware.</p>
<h2 id="have-fun-">Have fun :)</h2>
<p>Below the state of a finalized Planck board with some more or less standard first layer layout.</p>
<p>It even plays a nice startup sound on powering up.</p>
<center>



<a href="https://cullmann.dev/posts/planck-and-qmk/images/planck-final_hu_220a707b81a0e7b9.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/planck-and-qmk/images/planck-final_hu_efed79363788dff9.webp" alt="Finalized Planck keyboard" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>My current keymap can be found <a href="https://git.babylon2k.com/cullmann/qmk">here</a>.</p>
<p>As the history of this repository shows, I already experimented if some different layouts.</p>
<h2 id="warning-">Warning ^^</h2>
<p>Yes, the paper on the left of the keyboard is a printout of the lower &amp; raise keyboard layers.</p>
<p>My typing speed is still abysmal on that new layout and I guess I need to build as second one for at work, otherwise I will never get used to the layout if I swap daily between this and a HHKB.</p>
<p>Therefore, if you like to try such a board and are not a lot more experienced with switching between different layouts: you will need some time to get used to this.</p>
<p>Even just the removed row staggering is confusing the first few days.</p>
]]></content:encoded></item><item><title>Keyboards and Open-Source</title><link>https://cullmann.dev/posts/keyboards-and-open-source/</link><pubDate>Sun, 23 Jan 2022 21:25:00 +0300</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/keyboards-and-open-source/</guid><description>&lt;h2 id="keyboards-and-open-source-how-is-that-related"&gt;Keyboards and Open-Source, how is that related?&lt;/h2&gt;
&lt;p&gt;In my &lt;a href="https://cullmann.dev/posts/keyboard-fun/"&gt;Keyboard Fun&lt;/a&gt; post from last year I talked a bit about my interest in mechanical keyboards.&lt;/p&gt;
&lt;p&gt;Since then, I played around with a few more keyboards/switches/keycaps/&amp;hellip;&lt;/p&gt;
&lt;p&gt;Interesting enough, beside the actual hardware, naturally there is some software component to all these keyboards, too.&lt;/p&gt;
&lt;p&gt;Whereas most commercial keyboards still come with proprietary firmware, there is the trend within the keyboard enthusiast scene to go for open-source firmware.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="keyboards-and-open-source-how-is-that-related">Keyboards and Open-Source, how is that related?</h2>
<p>In my <a href="/posts/keyboard-fun/">Keyboard Fun</a> post from last year I talked a bit about my interest in mechanical keyboards.</p>
<p>Since then, I played around with a few more keyboards/switches/keycaps/&hellip;</p>
<p>Interesting enough, beside the actual hardware, naturally there is some software component to all these keyboards, too.</p>
<p>Whereas most commercial keyboards still come with proprietary firmware, there is the trend within the keyboard enthusiast scene to go for open-source firmware.</p>
<p>This allows you to properly update the firmware even from your Linux machine and do proper configuration of e.g. the keymap, too.</p>
<h2 id="qmk-firmware">QMK Firmware</h2>
<p>A popular project in that area is <a href="https://qmk.fm/">QMK</a>.</p>
<p>I supports a mass of keyboards out of the box already and is actively extended by both volunteers and some companies.</p>
<p>That means it is deployed not only on main stream products but even in more exotic projects like the &ldquo;I improve my vintage and modern Model M keyboards&rdquo; by <a href="https://gitlab.com/esr/m-star">Eric S. Raymond</a>.</p>
<h2 id="via">VIA</h2>
<p>Whereas QMK provides the open-source firmware part and you can do close to everything with it that is possible, given the features your hardware actually has, it is hard for simple task like &ldquo;I want that my key x does y&rdquo;.</p>
<p>Naturally you can change the keymap in your QMK port and compile &amp; flash.
But even I would call this a sub-optimal workflow, given a lot of commercial offerings at least provide some GUI to do this on the fly.</p>
<p>Here <a href="https://caniusevia.com/">VIA</a> comes into the picture.</p>
<p>For sure, it is an Electron based monster, but it provides a cross-platform UI for QMK based keyboards that allow on the fly configuration of at least the common things, like keymaps.
And it provides trivial things like testing all your keys, which is not that unneeded, given I was too dumb to properly install all my hot-swap switches ;)</p>
<center>



<a href="https://cullmann.dev/posts/keyboards-and-open-source/images/keyboard-via_hu_ab1255f376b6ac9a.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboards-and-open-source/images/keyboard-via_hu_aad374d2b33ad4c6.webp" alt="VIA UI" style="border: 0px; border-radius: 8px;" width="640" height="439" />
</a>
</center>

<h2 id="actual-keyboard">Actual Keyboard?</h2>
<p>Naturally, after this talk about the software side, all this makes no sense without an actual keyboard using it.</p>
<p>As I use the German ISO layout for typing, I am more limited on product choices than e.g. people using the ANSI layout.</p>
<p>It is really frustrating that where ever you look for some cool keyboard project, in many cases no ISO variant is available.
And yes, I don&rsquo;t want to switch to ANSI, I like to have my umlauts easily accessible and I can&rsquo;t swap all keyboards I need to use at work with ANSI variants, others would be not amused.</p>
<p>Therefore, if you are in need of some ISO layout keyboard, you might be interested in the information below.
If you use ANSI, ignore all this, there are masses of ANSI keyboards out there to buy, with QMK, too.
I have done no great research how the keyboard I did choose compares to them, for ISO there were not that many available contenders that were 75%, hot-swap and QMK ready.</p>
<p>After some trial and error I went with a Keychron Q1 75% keyboard.
It is available in ISO layout, unfortunately only as bare bone kit, that means you must buy your own switches and keycaps.
It naturally comes already with factory installed QMK, nice, above the VIA screenshot was actually from this board on my Linux machine.</p>
<p>For switches, I went with some BOX Navy switches, they are very heavy but have a nice click ;)
Even my office neighbor is happy with the sound and hasn&rsquo;t yet attacked me.
I won&rsquo;t link random reviews of them, you can search for that yourself if you are interested.
In any case, yes, they are HEAVY, really, you can believe that from the reviews.
And they are loud, but in no bad way.</p>
<p>For keycaps, yeah, same issue with the German ISO layout, there are not many sets that are available.</p>
<p>At work I now have some <a href="https://www.keycaps.info/">SA profile</a> set from Signature Plastics, they are able to produce sets with proper legends and no missing German keys, unlike some other vendors I tried (and yes, I tried it with cheap vendors, it seems not to be trivial at all print all the proper German keys at all and not just forget them in the package&hellip;).
Funny enough, shipping from US did take 4 weeks, even with air express, USPS seems to be not the fasted variant of travel.
If others play with the idea to buy there, I must confess the quality is really good, but they are expensive, if you don&rsquo;t require exotic layouts like German, I would rather go with some cheaper sets, for US ANSI even the cheapest I tried out were ok, without obvious faults.</p>
<center>



<a href="https://cullmann.dev/posts/keyboards-and-open-source/images/keyboard-q1-work_hu_e90798ed80a61a8.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboards-and-open-source/images/keyboard-q1-work_hu_898d195454a82f85.webp" alt="Keychron Q1 Ice Cap Keycaps" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>If you look a bit more around on the picture you will see I have still my good old Nokia rubber ducky, a sole survivor from the time Nokia owned Qt :P
And no, I don&rsquo;t use a Mac, that is just one we use for our compile farm.</p>
<p>At home I went with some <a href="https://matt3o.com/about-mt3-profile-and-devtty-set/">MT3 profile</a> set without any legends, that is really cheap and funny enough did take only 4 days from US to Germany with standard UPS.</p>
<center>



<a href="https://cullmann.dev/posts/keyboards-and-open-source/images/keyboard-q1-home_hu_6cab8c9438792b23.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboards-and-open-source/images/keyboard-q1-home_hu_d61861f0135ef7a0.webp" alt="Keychron Q1 MT3 /dev/tty Keycaps" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>:=) And no, no second Nokia ducky at home.</p>
<p>So far, the Q1 works nicely, both at work and at home.
Having the exact same layout and switches in both places really helps to get used to it.</p>
<p>Using VIA works nicely, too.
So far I have not flashed any updated QMK version, therefore no experience how well that works in practice.</p>
<p>I actually even learned a bit more about my use of the different keys.
On the work picture you still see on the right the page up/down buttons (with Fn key =&gt; home/end).
At home I already reprogrammed that to home/end (with Fn key =&gt; page up/down), as I use that far more often during editing whereas the page up/down stuff just rarely in the terminal.
Actually, I didn&rsquo;t know I would miss these two keys until they were no longer easy accessible ;=)</p>
]]></content:encoded></item><item><title>Plasma &amp; Kate on Wayland end of 2021</title><link>https://cullmann.dev/posts/plasma-kate-wayland-2021/</link><pubDate>Sat, 18 Dec 2021 19:25:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/plasma-kate-wayland-2021/</guid><description>&lt;h2 id="wayland-the-future-after-x11"&gt;Wayland, the future after X11&lt;/h2&gt;
&lt;p&gt;Since years &lt;a href="https://wayland.freedesktop.org/"&gt;Wayland&lt;/a&gt; based compositors are promoted as the successors to the venerable &lt;a href="https://www.x.org"&gt;X.org&lt;/a&gt; X11 display server.&lt;/p&gt;
&lt;p&gt;In the embedded space it seems Wayland already has made a lot of progress and some distributions start to use it per default, too.&lt;/p&gt;
&lt;h2 id="my-experience-of-the-past-years"&gt;My experience of the past years&lt;/h2&gt;
&lt;p&gt;I tried Wayland over the last few years multiple times, but I most often needed to go back to X11 due to random crashes/displaying issues/&amp;hellip; (independent of the compositor, I tried a few).
I just had always bad luck with the drivers and Wayland.
On top of that came issues in the remaining stack, too.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="wayland-the-future-after-x11">Wayland, the future after X11</h2>
<p>Since years <a href="https://wayland.freedesktop.org/">Wayland</a> based compositors are promoted as the successors to the venerable <a href="https://www.x.org">X.org</a> X11 display server.</p>
<p>In the embedded space it seems Wayland already has made a lot of progress and some distributions start to use it per default, too.</p>
<h2 id="my-experience-of-the-past-years">My experience of the past years</h2>
<p>I tried Wayland over the last few years multiple times, but I most often needed to go back to X11 due to random crashes/displaying issues/&hellip; (independent of the compositor, I tried a few).
I just had always bad luck with the drivers and Wayland.
On top of that came issues in the remaining stack, too.</p>
<p>Unfortunately, as long as my setup didn&rsquo;t run Wayland at all in any stable way, I didn&rsquo;t really spend a lot of time to actually debug/fix issues even in Kate or KTextEditor.
It&rsquo;s just easier to scratch your own itch then to invest time in stuff you not use yourself at all.</p>
<h2 id="my-experience-end-of-2021">My experience end of 2021</h2>
<p>Two months ago, I tried Wayland once more on my <a href="https://archlinux.org">Arch Linux</a> machine after some short journey to FreeBSD ;)</p>
<p>And great, it worked out of the box.
Not random crashing of the compositor, no strange fractals on my second screen, all fine.</p>
<p>Now that I can use KDE Plasma &amp; Kate on my normal machine on Wayland every day, I started to get more drive to take a look at remaining Wayland issues.</p>
<p>Aleix Pol Gonzalez &amp; David Edmundson did a fantastic job to help out with remaining issues.</p>
<p>Naturally, not all is perfect for Kate on Wayland, e.g. you still get with each start some</p>
<blockquote>
<p>qt.qpa.wayland: Wayland does not support QWindow::requestActivate()</p>
</blockquote>
<p>indicating not all kinds of window activation work as intended at the moment.</p>
<p>But the 21.12 release of Kate should at least have the most obvious issues fixed.</p>
<p>I use now the KDE Plasma Wayland session as my daily driver since two months without any large issues.
I not once had a compositor crash nor any strange displaying issues.</p>
<p>As mentioned above, still small issues remain to be fixed for Kate (and for sure for other applications, too).</p>
<p>But beside Chromium &amp; Wine (even sandboxed as extra user) that still run via XWayland all other parts run native.</p>
<p>Thanks to all people that worked on this to make it happen.
I really was impressed after I gave Wayland a try again how well all parts nowadays work together.
Let&rsquo;s continue to improve that in the next years even more!</p>
<h2 id="my-current-kde-plasma-on-wayland-session-">My current KDE Plasma on Wayland session ;=)</h2>
<p>Even <a href="https://www.winehq.org/">Wine</a> based gaming in parallel to coding is possible, awesome!</p>
<center>



<a href="https://cullmann.dev/posts/plasma-kate-wayland-2021/images/plasma-kate-diablo-wayland_hu_790d86783ac094f9.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/plasma-kate-wayland-2021/images/plasma-kate-diablo-wayland_hu_892a93fe10ceed0b.webp" alt="My current KDE Plasma on Wayland session ;=)" style="border: 0px; border-radius: 8px;" width="640" height="180" />
</a>
</center>

<h2 id="try-it-out">Try it out!</h2>
<p>I can encourage all to give Wayland a try, if you are on some up-to-date distribution like Arch Linux.
At least on my mid-class AMD graphics card Wayland works flawless with the open-source driver.
Naturally the experience can differ for other setups, like it did for me in the past.</p>
<h2 id="help-out">Help out!</h2>
<p>If you encounter issues, please report them as bug reports to the respective upstream projects.
And naturally, any help in fixing them would be welcome, too.
For Kate/KTextEditor I might be able to at least reproduce and try to fix them now myself, given I use it now daily, thought other projects might rely more on external contributors to get the rough edges fledged out.</p>
<h2 id="feedback">Feedback</h2>
<p>You can provide feedback on the matching <a href="https://www.reddit.com/r/kde/comments/rjdgu5/kde_plasma_kate_on_wayland_end_of_2021/">Reddit post</a>.</p>
]]></content:encoded></item><item><title>Farewell Telegram - Hello Signal!</title><link>https://cullmann.dev/posts/farewell-telegram-hello-signal/</link><pubDate>Fri, 17 Dec 2021 20:51:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/farewell-telegram-hello-signal/</guid><description>&lt;p&gt;In the last few years I started to use Telegram as my main messenger, beside good old SMS/e-mail.&lt;/p&gt;
&lt;p&gt;I never used WhatsApp as I try to stay away from the Facebook/Meta/&amp;hellip; ecosystem.&lt;/p&gt;
&lt;p&gt;Telegram seemed like a good choice as a lot of people I know are there and we e.g. mirror our KDE channels often to Telegram for better outreach, too.
And all old messengers like ICQ more or less were abandoned by everybody I know including myself ;=)&lt;/p&gt;</description><content:encoded><![CDATA[<p>In the last few years I started to use Telegram as my main messenger, beside good old SMS/e-mail.</p>
<p>I never used WhatsApp as I try to stay away from the Facebook/Meta/&hellip; ecosystem.</p>
<p>Telegram seemed like a good choice as a lot of people I know are there and we e.g. mirror our KDE channels often to Telegram for better outreach, too.
And all old messengers like ICQ more or less were abandoned by everybody I know including myself ;=)</p>
<p>Unfortunately, during the <a href="https://en.wikipedia.org/wiki/COVID-19_pandemic">current pandemic</a>, I met more and more people that went down into the rabbit hole thanks to totally uncontrolled Telegram groups.</p>
<p>Yes, you can say: this is free speech.</p>
<p>It is.</p>
<p>But on the other side, I think it can&rsquo;t really be tolerated that people start to live in some parallel universe that completely ignores any science/laws/facts of the real world.</p>
<p>Telegram isn&rsquo;t interested in even deleting the most obvious lies or hate speech that is spread in masses there.
Most other platforms at least try to do so.
At least this is the impression I came to in the last few months.</p>
<p>I talked with people in person that live in such state of denial and I can&rsquo;t any longer use some application/network/service that encourages the spreading of such stuff.</p>
<p>Therefore I abandoned my Telegram account this week.</p>
<p>If you want to stay in touch with me via some messenger and not plain good e-mail, I use <a href="https://signal.org/">Signal</a> now, at least this seems to be not as awful as Telegram looks for me now.</p>
<p>My Signal account is: +49 176 235 467 98</p>
<p>I will participate in the KDE &amp; Kate related channels via <a href="https://matrix.org/">Matrix</a>, e.g. thanks to <a href="https://apps.kde.org/neochat/">NeoChat</a> and other free clients ;=)
Should have started to use that since long anyways, after I somehow went away from IRC years ago.</p>
<p>Therefore, if you fail to contact me via Telegram, that is no accident, that is intended, sorry if that might be inconvenient.</p>
]]></content:encoded></item><item><title>Keyboard Fun</title><link>https://cullmann.dev/posts/keyboard-fun/</link><pubDate>Sun, 12 Dec 2021 14:10:00 +0300</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/keyboard-fun/</guid><description>&lt;h2 id="keyboards"&gt;Keyboards?&lt;/h2&gt;
&lt;p&gt;In the recent past, I started to get more interested in the quality of the keyboards I use at work and home.
I always hated to use very cheap low-profile boards, but otherwise I more or less always worked with what came stock with my PC in the good old times ;)&lt;/p&gt;
&lt;h2 id="tkl-boards"&gt;TKL boards&lt;/h2&gt;
&lt;p&gt;A longer time ago I bought some Xtrfy K4 TKL White Edition keyboard, my first keyboard that had no numbers block.
I liked it a lot and the red switches were ok for my taste.
Thought I didn&amp;rsquo;t like the keycaps, they feel cheap.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="keyboards">Keyboards?</h2>
<p>In the recent past, I started to get more interested in the quality of the keyboards I use at work and home.
I always hated to use very cheap low-profile boards, but otherwise I more or less always worked  with what came stock with my PC in the good old times ;)</p>
<h2 id="tkl-boards">TKL boards</h2>
<p>A longer time ago I bought some Xtrfy K4 TKL White Edition keyboard, my first keyboard that had no numbers block.
I liked it a lot and the red switches were ok for my taste.
Thought I didn&rsquo;t like the keycaps, they feel cheap.</p>
<p>Some weeks ago, I bought the Varmilo Moonlight VA88M, a TKL keyboard with nicer keycaps (both in material and design).
I now used it at home for some weeks and the brown switches are fine, keycaps are fantastic, Cherry profile PBT keycaps are really nifty.</p>
<p>But&hellip;.
The ping&hellip;
Especially in the middle of the keyboard, each and every key pings.
Actually you can get the ping even if you just tap a bit on the backside of the board itself, seems to be no sole switch issue :/</p>
<h2 id="removing-the-ping">Removing the ping?</h2>
<p>All reviews I read didn&rsquo;t tell a thing about any ugly ping with the stock Varmilo board.
Though most reviews naturally did look at the ANSI variant, but I bought the ISO one, given I like the German layout.
Perhaps they just altered something in the more recent fabrication, who knows.</p>
<p>I did take some look at the internals of the keyboard to see if some more dampening or taping could help.</p>
<p>See the disassembly and later playing around with stuff and tape below.</p>
<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-1_hu_e487e2999726c31a.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-1_hu_9982a7c1be87f992.webp" alt="Removing the ping?" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-2_hu_f29dc16461e3d003.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-2_hu_13fdc156e22a8596.webp" alt="Removing the ping?" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-3_hu_48eecfc873e02c56.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-3_hu_dd43a1936db00fc1.webp" alt="Removing the ping?" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-4_hu_71c8d646687130c9.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/varmilo-moonlight-disass-4_hu_aba158b3535e75da.webp" alt="Removing the ping?" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>Short answer: it didn&rsquo;t help. You can even stuff the lower parts totally with &ldquo;anything&rdquo;, given you screw all things together later it will still ping.
Even alone the upper plate does ping if you tick it without any extra parts.
I found no way to stabilize it in a way that removes that.</p>
<p>Btw., hint for anyone trying this: Yes, there is some stupid screw below some white seal at the bottom ;)
Unlike the one screw that is missing on the top, there is one&hellip;</p>
<p>For flexing the case open, even if you are too dumb to remove all screws, my nice old BahnCard and credit cards did help a lot ;=)</p>
<h2 id="the-solution">The solution?</h2>
<p>Now, given I just use one PC, I had one keyboard that has no ugly sounds and is ok, and one keyboard that has really fantastic keycaps and is borked.</p>
<p>Solution? Create one out of both.</p>
<p>Given the red switches and the typing on the Xtrfy board was nice, why not just use the Varmilo keycaps for it?</p>
<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight-transfer-1_hu_fa7124bdfcf1bee9.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight-transfer-1_hu_2e137d8b613bba6a.webp" alt="The solution?" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight-transfer-2_hu_d68d79f2384b1c3d.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight-transfer-2_hu_db5a9432ab7e8fec.webp" alt="The solution?" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight-transfer-3_hu_5d9ff21ecdfee5d1.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight-transfer-3_hu_13dcabe6a6c8e4be.webp" alt="The solution?" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>Varmilo was nice enough to include a keycaps puller anyways, already used for the total disassembly above.</p>
<h2 id="end-result">End result</h2>
<center>



<a href="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight_hu_e192a9051a08c25a.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/keyboard-fun/images/xtrfy-varmilo-moonlight_hu_a1943ad61c87bd1e.webp" alt="End result" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>I think the final &ldquo;product&rdquo; looks nice.
The RGB back-lighting still works, though the new keycaps are not shine-through.</p>
<p>In addition I have now a full shine-through ABS keycaps set as backup parts for more keyboard modding.
And some more or less useless Varmilo baseboard.
But who knows, if I spill too much coffee or whatever in my board, I can still re-build the Varmilo board to have something that works (and pings).</p>
<p>Naturally that was not the way I meant to use the new keyboard, but good enough ;)
And I must confess, a bit modding around on the keyboards was fun!</p>
<p>For any people interested in keyboards: I think both boards mentioned above are ok.
Perhaps I just was unlucky with my Varmilo board and other builds of it don&rsquo;t ping at all, like the most reviews tell.</p>
]]></content:encoded></item><item><title>BorgBackup - Continued</title><link>https://cullmann.dev/posts/borg-backup-continued/</link><pubDate>Fri, 10 Sep 2021 22:45:00 +0300</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/borg-backup-continued/</guid><description>&lt;p&gt;In my last &lt;a href="https://cullmann.dev/posts/borg-backup/"&gt;BorgBackup post&lt;/a&gt; I described my new setup using &lt;a href="https://www.borgbackup.org/"&gt;BorgBackup&lt;/a&gt; for the backup of my private data.&lt;/p&gt;
&lt;p&gt;After two weeks of use, I have now first experiences on the way the incremental backups perform and some additional information how I apply this to backup a virtual FreeBSD server hosting some of my stuff.&lt;/p&gt;
&lt;h2 id="incremental-backup-performance-"&gt;Incremental Backup Performance ;=)&lt;/h2&gt;
&lt;p&gt;I must confess, I am positively impressed.&lt;/p&gt;
&lt;p&gt;As told before, my &lt;a href="https://duplicity.gitlab.io/"&gt;duplicity&lt;/a&gt; setup did have a very bad performance (even just in the locally to my NAS).
Perhaps I did something wrong, on the other side, I followed the default way as described to setup a encrypted backup.&lt;/p&gt;</description><content:encoded><![CDATA[<p>In my last <a href="/posts/borg-backup/">BorgBackup post</a> I described my new setup using <a href="https://www.borgbackup.org/">BorgBackup</a> for the backup of my private data.</p>
<p>After two weeks of use, I have now first experiences on the way the incremental backups perform and some additional information how I apply this to backup a virtual FreeBSD server hosting some of my stuff.</p>
<h2 id="incremental-backup-performance-">Incremental Backup Performance ;=)</h2>
<p>I must confess, I am positively impressed.</p>
<p>As told before, my <a href="https://duplicity.gitlab.io/">duplicity</a> setup did have a very bad performance (even just in the locally to my NAS).
Perhaps I did something wrong, on the other side, I followed the default way as described to setup a encrypted backup.</p>
<p>On the other side, the new BorgBackup powered variant performs well locally (with 1 GBit networking) and remotely (with just between 25-50 MBit upload).</p>
<p>Instead of multi-hours to sync, the new variant runs in minutes.</p>
<p>Naturally, for larger increments, the upload is the restricting part here, this means for the remote backup, some minutes upload are added on top.</p>
<p>Let&rsquo;s see what happens if I backup my data again after I bought some music album online and the usual stuff that happens in a day:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Time <span class="o">(</span>start<span class="o">)</span>: Fri, 2021-09-10 20:38:39
</span></span><span class="line"><span class="cl">Time <span class="o">(</span>end<span class="o">)</span>:   Fri, 2021-09-10 20:39:19
</span></span><span class="line"><span class="cl">Duration: 40.65 seconds
</span></span><span class="line"><span class="cl">Number of files: <span class="m">68984</span>
</span></span><span class="line"><span class="cl">Utilization of max. archive size: 0%
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------
</span></span><span class="line"><span class="cl">                       Original size      Compressed size    Deduplicated size
</span></span><span class="line"><span class="cl">This archive:              256.50 GB            249.26 GB            405.36 MB
</span></span><span class="line"><span class="cl">All archives:                1.82 TB              1.77 TB            240.18 GB
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                       Unique chunks         Total chunks
</span></span><span class="line"><span class="cl">Chunk index:                  <span class="m">148438</span>              <span class="m">1118042</span>
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------</span></span></code></pre></div>
<p>Just the expected, more or less the size of my new album + a bit more given other minor things in my home did change, like this blog post ;=)</p>
<p>More or less the same happens for my remote increment:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Time <span class="o">(</span>start<span class="o">)</span>: Fri, 2021-09-10 20:38:32
</span></span><span class="line"><span class="cl">Time <span class="o">(</span>end<span class="o">)</span>:   Fri, 2021-09-10 20:40:52
</span></span><span class="line"><span class="cl">Duration: <span class="m">2</span> minutes 20.11 seconds
</span></span><span class="line"><span class="cl">Number of files: <span class="m">68984</span>
</span></span><span class="line"><span class="cl">Utilization of max. archive size: 0%
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------
</span></span><span class="line"><span class="cl">                       Original size      Compressed size    Deduplicated size
</span></span><span class="line"><span class="cl">This archive:              256.50 GB            249.26 GB            405.32 MB
</span></span><span class="line"><span class="cl">All archives:                2.38 TB              2.32 TB            240.41 GB
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                       Unique chunks         Total chunks
</span></span><span class="line"><span class="cl">Chunk index:                  <span class="m">148994</span>              <span class="m">1454388</span>
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------</span></span></code></pre></div>
<p>The backup time is more or less just the local network backup time + the extra time you need for the poor 25-50 MBit upload speed.</p>
<p>This looks reasonable and allows to run this daily via cron or other means without large impact on my local machine.</p>
<p>I have already a few increments online, e.g. for roughly each second day (the data varies here on the remotes, not all have the exactly same backups).
Still the combined archives size on both remotes is below the actual size of the raw data I backup.</p>
<p>The <a href="https://en.wikipedia.org/wiki/Zstandard">Zstandard</a> compression I did choose for the backup has a small impact, most of my stuff is already either compressed or likely not that well suites for further compression.
But BorgBackup was able to de-duplicate already in the initial backup a few things that are redundant in my home, like duplicated albums I have by accident in different folders.
Good hints what to cleanup if I need again disk space ;=)</p>
<h2 id="full-freebsd-server-backup">Full FreeBSD server backup</h2>
<p>I own some virtual FreeBSD server to host various things.
I backup that server to a pure backup server without any other services regularly.</p>
<p>Below is the setup to do this via rsync &amp; BorgBackup in some hopefully both secure and usable way.</p>
<p>The below stuff runs as a plain old cronjob without any other fancy stuff around.</p>
<h3 id="first-step-plain-rsync">First step: Plain rsync</h3>
<p>The basic backup is just a plain rsync of more or less all things.</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rsync -alHSvh --no-specials --no-devices <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --delete --force --stats <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;root@my-cool-server:/&#34;</span> <span class="s2">&#34;/some-where/my-backup&#34;</span></span></span></code></pre></div>
<p>Naturally on the server we pull our backups from, some stuff like databases are dumped to the local disk via cron before this rsync run, to have some consistent data and not relying on good luck that e.g. the database that way on disk during this sync was consistent (that will most likely not be the case).</p>
<p>Using this method, on the actual server, you have no way to get access to the backup server.
The backup server will just pull all stuff via rsync.
Even if somebody breaks into the actual server running my services, getting to the backup server will still be as hard as without any access to the first server.</p>
<p>If you like to copy this, keep in mind: the above rsync call will rsync all mounted file systems.
This is useful for me, as e.g. the FreeBSD machine has ZFS with a bunch of individual mount points (like the standard FreeBSD ZFS setup) and I really just want to have everything.</p>
<h3 id="second-step-history-via-borgbackup">Second step: History via BorgBackup</h3>
<p>This rsync method is easy and fast, but it provides no history.
As this sync runs nightly, if I ever delete e.g. some mail on my server by accident and not notice that before the nightly deadline =&gt; all hope (and the mail) is lost!</p>
<p>A nice solution for this is to use BorgBackup to backup your synced files once more into a local repository.</p>
<p>This might sound a bit strange, why not just use BorgBackup directly, but it has a few benefits:</p>
<ul>
<li>The normal BorgBackup way will need access to the backup server from the server you backup =&gt; Once you capture the server, you might be able to do evil things on the backup server or at least mess with the backups.</li>
<li>There are ways to pull via BorgBackup, but they are complicated and still will rely on BorgBackup to have no exploitable holes, I trust rsync more in that regard (but you can still try <a href="https://borgbackup.readthedocs.io/en/stable/deployment/pull-backup.html">the described pull variants</a> if you are less paranoid).</li>
<li>You have a plain 1:1 copy always available, in the case BorgBackup really screws up. If you have the space for that one copy, I think that extra safety is nice.</li>
</ul>
<h4 id="initial-preparation-of-the-repository">Initial preparation of the repository</h4>
<p>You need to create once the repository.
I use for that no encryption, I have anyways my not encrypted rsync copy on the same backup machine:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">borg init --encryption<span class="o">=</span>authenticated <span class="s2">&#34;/some-where/my-backup.borg&#34;</span></span></span></code></pre></div>
<p>The documentation recommends the &ldquo;authenticated&rdquo; variant to avoid issues with malicious input data.
Given a bit more hashing won&rsquo;t hurt as I will use compression, too, I just went with that recommendation (without a passphrase).
If you like to skip that, use &ldquo;none&rdquo;.
But better read <a href="https://borgbackup.readthedocs.io/en/stable/usage/init.html">the documentation</a> yourself.</p>
<h4 id="create-increment-after-rsync">Create increment after rsync</h4>
<p>After each daily rsync, just create a new increment via:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">borg create --compression zstd --stats <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;/some-where/my-backup.borg::{now:%Y-%m-%d}&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;/some-where/my-backup&#34;</span></span></span></code></pre></div>
<p>And that&rsquo;s it ;=)</p>
<h4 id="performance">Performance</h4>
<p>The initial BorgBackup run is slow (single core machine), but the compression actually make at least some visible difference on my server data, not just the de-duplication:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Time <span class="o">(</span>start<span class="o">)</span>: Fri, 2021-09-10 21:21:35
</span></span><span class="line"><span class="cl">Time <span class="o">(</span>end<span class="o">)</span>:   Fri, 2021-09-10 22:02:00
</span></span><span class="line"><span class="cl">Duration: <span class="m">40</span> minutes 25.12 seconds
</span></span><span class="line"><span class="cl">Number of files: <span class="m">259439</span>
</span></span><span class="line"><span class="cl">Utilization of max. archive size: 0%
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------
</span></span><span class="line"><span class="cl">                       Original size      Compressed size    Deduplicated size
</span></span><span class="line"><span class="cl">This archive:               56.48 GB             45.17 GB             40.61 GB
</span></span><span class="line"><span class="cl">All archives:               56.48 GB             45.17 GB             40.61 GB
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                       Unique chunks         Total chunks
</span></span><span class="line"><span class="cl">Chunk index:                  <span class="m">252076</span>               <span class="m">278721</span>
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------</span></span></code></pre></div>
<p>An increment is a much faster thing, just like for my normal backup:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Time <span class="o">(</span>start<span class="o">)</span>: Fri, 2021-09-10 22:16:36
</span></span><span class="line"><span class="cl">Time <span class="o">(</span>end<span class="o">)</span>:   Fri, 2021-09-10 22:19:36
</span></span><span class="line"><span class="cl">Duration: <span class="m">2</span> minutes 59.12 seconds
</span></span><span class="line"><span class="cl">Number of files: <span class="m">259624</span>
</span></span><span class="line"><span class="cl">Utilization of max. archive size: 0%
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------
</span></span><span class="line"><span class="cl">                       Original size      Compressed size    Deduplicated size
</span></span><span class="line"><span class="cl">This archive:               56.51 GB             45.18 GB             46.81 MB
</span></span><span class="line"><span class="cl">All archives:              112.99 GB             90.35 GB             40.66 GB
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                       Unique chunks         Total chunks
</span></span><span class="line"><span class="cl">Chunk index:                  <span class="m">252551</span>               <span class="m">557639</span>
</span></span><span class="line"><span class="cl">------------------------------------------------------------------------------</span></span></code></pre></div>
<p>Btw., the rsync received size was ~76 MB for the above run, BorgBackup did break this down to just 46 MB for the increment, not that bad.</p>
<p>And just 3 minutes more for the nightly run in addition to the plain rsync, I would say nicely usable even on my single core machine.</p>
<h2 id="conclusion">Conclusion</h2>
<p>As shown above, I think BorgBackup performs well for my use case.</p>
<p>The increments are reasonable small and fast, seems to be no issue to have daily ones.</p>
<p>Naturally, one will later start to expire older backups, I will need to read up more about this in the future, I just skimmed through that parts of the documentation so far.</p>
<p>At least for my personal data and server backup, this seems to be now a rather nice setup.</p>
<p>I hope this is helpful for others, too, but please always do your own research.
There are plenty of other open-source backup tools out there, perhaps they fit your requirements better.</p>
<p>But at least from my side: thanks to the BorgBackup developers to provide the world with such an useful piece of software!</p>
<p>At least my backup setup got successfully assimilated .P</p>
<center>



<a href="https://cullmann.dev/posts/borg-backup-continued/images/borg-backup-logo_hu_7ffde70dd6b304fd.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/borg-backup-continued/images/borg-backup-logo_hu_643c4fe8cfe0d4ce.webp" alt="BorgBackup" style="border: 0px; border-radius: 8px;" width="640" height="224" />
</a>
</center>

]]></content:encoded></item><item><title>BorgBackup</title><link>https://cullmann.dev/posts/borg-backup/</link><pubDate>Sat, 28 Aug 2021 21:00:00 +0300</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/borg-backup/</guid><description>&lt;p&gt;Backup is always something you under-appreciate until you need it.
Therefore, since I lost a lot of my mails due to non-existing backups in the past, I tried to keep proper backups around the last decade.
At least this allowed me to keep all my Kate related development mails intact since 2001 or so, not that bad ;=)&lt;/p&gt;
&lt;h2 id="my-old-way-of-doing-backups-rsync--duplicity"&gt;My old way of doing backups: rsync &amp;amp; duplicity&lt;/h2&gt;
&lt;p&gt;So far, I did my backup on my Unix machines by using &lt;a href="https://rsync.samba.org/"&gt;rsync&lt;/a&gt; to a second host and &lt;a href="https://duplicity.gitlab.io/"&gt;duplicity&lt;/a&gt; to archive stuff on my old Synology NAS.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Backup is always something you under-appreciate until you need it.
Therefore, since I lost a lot of my mails due to non-existing backups in the past, I tried to keep proper backups around the last decade.
At least this allowed me to keep all my Kate related development mails intact since 2001 or so, not that bad ;=)</p>
<h2 id="my-old-way-of-doing-backups-rsync--duplicity">My old way of doing backups: rsync &amp; duplicity</h2>
<p>So far, I did my backup on my Unix machines by using <a href="https://rsync.samba.org/">rsync</a> to a second host and <a href="https://duplicity.gitlab.io/">duplicity</a> to archive stuff on my old Synology NAS.</p>
<h3 id="plain-rsync">Plain rsync?</h3>
<p>Naturally, the rsync method (if you don&rsquo;t do snapshots/&hellip;) is just a 1:1 mirror.
If you do by accident delete stuff and don&rsquo;t notice it, you just will wipe it on the next sync, too, if you don&rsquo;t do some dry-run first to inspect.</p>
<p>But so far, in the normal case, the rsync copy was always what I used to get my data back after I did really break my system.</p>
<p>It&rsquo;s the fastest way to migrate from one operating system to another for me, too, without any fear that you might wipe your data disk.
It helped my nicely on me journey between different Linux distributions to FreeBSD.</p>
<h3 id="duplicity">Duplicity?</h3>
<p>I started to use duplicity after I did introduce disk encryption at home for all machines years ago.</p>
<p>Given my old NAS has no such concept, duplicity with client side encryption did seem to nicely solve that hole in my data security concept.</p>
<p>Naturally, duplicity allows the normal full/incremental/&hellip; backup scheme, that will let you retrieve even older stuff if you by accident deleted stuff locally.</p>
<p>But I never was completely happy with duplicity.
Combined with my old slow NAS, the backup process was always a very slow thing and the progress indication actually never worked properly for me.
I had just for hours some unknown estimated time and no real feedback.
Given I normally don&rsquo;t let my workstation just run the whole day, that was not that satisfying.</p>
<p>On the other side, so far, restoring did work, which is a good thing ;=)
And, like most good open source projects, it works properly on different platforms.
I could easily continue to use the same backup destination after switching from Manjaro to FreeBSD, no problem at all.
duplicity is just nicely installable via pkg there, too!</p>
<h2 id="the-future-borgbackup">The future: BorgBackup?</h2>
<p>I investigated a bit more what I could use as duplicity replacement, and ended up giving <a href="https://www.borgbackup.org/">BorgBackup</a> a try.</p>
<center>



<a href="https://cullmann.dev/posts/borg-backup/images/borg-backup-logo_hu_7ffde70dd6b304fd.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/borg-backup/images/borg-backup-logo_hu_643c4fe8cfe0d4ce.webp" alt="BorgBackup" style="border: 0px; border-radius: 8px;" width="640" height="224" />
</a>
</center>

<p>The <a href="https://borgbackup.readthedocs.io/en/stable/">documentation</a> is a nice starting point, beside that, you find plenty of useful tutorial online.</p>
<p>On Linux or FreeBSD some usable BorgBackup version is available with the usual package managers.
In my case I am using the version available on FreeBSD 13 via &ldquo;pkg install py38-borgbackup&rdquo;.</p>
<h3 id="borgbackup--synology">BorgBackup &amp; Synology</h3>
<p>For me, the primary backup target is my old Synology NAS.</p>
<p>Fortunately, you can install BorgBackup on the NAS itself via the package center if you add <a href="https://synocommunity.com/#easy-install">SynoCommunity</a> as an additional source.
There you will find the &ldquo;Borg&rdquo; package in a reasonable fresh version.
No need to fiddle around with the internals of the Synology distribution on your own.</p>
<p>I then activated ssh access &amp; enabled the home directory service to be able to add some authorized_keys &amp; have my backup repository in the home.</p>
<h3 id="cloud-backup">Cloud backup</h3>
<p>Given I now start to setup my backup from scratch anyways, I decided to fix a second issue: All my backups are in my flat ;=)</p>
<p>Given either &ldquo;fire, fire&rdquo; or &ldquo;we steal just all stuff, even your crappy NAS&rdquo;, perhaps nobody might really access my data even if stolen, still I could easily loose it all.</p>
<p>As BorgBackup like duplicity works nicely over ssh, no reason not to use it to push all the data encrypted to some random virtual server somewhere.</p>
<p>There are several companies that even promote their BorgBackup compatibility.
But I will not start to promote here cloud/virtual server hosting companies, your search machine will tell you what is available.</p>
<h3 id="borgbackup-repository-initialization">BorgBackup repository initialization</h3>
<p>I recommend their <a href="https://borgbackup.readthedocs.io/en/stable/quickstart.html">quick start</a> documentation for the initial setup.</p>
<p>For me, it was e.g. for the NAS (see the &ndash;remote-path to let it find the borg binary on the Synology):</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">borg init --remote-path /usr/local/bin/borg <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --encryption<span class="o">=</span>repokey thecooluser@nas-name-here:borg</span></span></code></pre></div>
<p>and for the cloud server:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">borg init --encryption<span class="o">=</span>repokey <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    thecooluser@server-name-here:borg</span></span></code></pre></div>
<p>That command will query some passphrase, use a good one, that is the sole protection of your data.
And keep it somewhere you have it, even in the &ldquo;fire, fire&rdquo; case ;=)</p>
<h3 id="borgbackup-usage">BorgBackup usage</h3>
<p>After you did initialize the repositories like above, you will have on your NAS and/or server some borg directory in the home of the matching user.</p>
<p>You can create a new backup archive of e.g. your home (excluding the .cache directory you might not want) via:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">borg create --compression zstd --progress --stats <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    -e <span class="s2">&#34;/home/your-user/.cache&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;thecooluser@server-name-here:borg::name-of-backup-archive&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;/home/your-user&#34;</span></span></span></code></pre></div>
<p>On the NAS you will need an additional &ldquo;&ndash;remote-path /usr/local/bin/borg&rdquo; like for the init command.</p>
<h3 id="does-this-work">Does this work?</h3>
<p>So far it seems so, but time must tell.
As with any backup solution, I will need to test restore again and again and must see how the incremental backups work in practice over time.
At least the initial full backup seems to work more fluent than I was used with duplicity.</p>
<p>Naturally, BorgBackup <a href="https://borgbackup.readthedocs.io/en/stable/changes.html">had already bugs in the past</a> and for sure still has some.
The <a href="https://borgbackup.readthedocs.io/en/stable/internals.html">cryptography isn&rsquo;t perfect either</a>, on the other side, I want to protect my personal data against the normal thief, not some government agency.</p>
<h3 id="shall-i-use-that">Shall I use that?</h3>
<p>If this post did spark your interest to try this, please do your own research if it really fits your bill.
In any case, I still have a plain rsync copy around on a second machine, just in case it doesn&rsquo;t work like expected.
Not that I again loose a decade of flame war mails .-)</p>
]]></content:encoded></item><item><title>Join the KDE e.V.</title><link>https://cullmann.dev/posts/join-the-kde-ev/</link><pubDate>Sat, 20 Feb 2021 15:13:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/join-the-kde-ev/</guid><description>&lt;p&gt;The &lt;a href="https://ev.kde.org"&gt;KDE e.V.&lt;/a&gt; is a registered non-profit organization that represents the &lt;a href="https://www.kde.org"&gt;KDE Community&lt;/a&gt; in legal and financial matters.&lt;/p&gt;
&lt;p&gt;The KDE e.V. is for example responsible for paying the servers that run our &lt;a href="https://invent.kde.org"&gt;GitLab instance&lt;/a&gt; and all our other web services.
The e.V. takes care of sponsoring developer sprints and contributor travel costs, too.&lt;/p&gt;
&lt;p&gt;You did participate at some &lt;a href="https://akademy.kde.org"&gt;Akademy&lt;/a&gt;?
This wouldn&amp;rsquo;t have been possible without the KDE e.V., both by sponsoring and helping to organize the event!&lt;/p&gt;</description><content:encoded><![CDATA[<p>The <a href="https://ev.kde.org">KDE e.V.</a> is a registered non-profit organization that represents the <a href="https://www.kde.org">KDE Community</a> in legal and financial matters.</p>
<p>The KDE e.V. is for example responsible for paying the servers that run our <a href="https://invent.kde.org">GitLab instance</a> and all our other web services.
The e.V. takes care of sponsoring developer sprints and contributor travel costs, too.</p>
<p>You did participate at some <a href="https://akademy.kde.org">Akademy</a>?
This wouldn&rsquo;t have been possible without the KDE e.V., both by sponsoring and helping to organize the event!</p>
<p>If you are an active KDE contributor, consider to join the e.V. to be able to vote on its future direction.
This includes very important things like the <a href="https://kde.org/community/whatiskde/kdefreeqtfoundation/">KDE Free Qt Foundation</a>.</p>
<p>At the moment, already a lot of our KDE community members are <a href="https://ev.kde.org/members/">e.V. members</a>, too.</p>
<p>But naturally, as people enter and leave our community, we need to outreach to new contributors to join the e.V..
The e.V. shall stay a representation of the currently active KDE contributors/community and not some club of KDE oldies =)</p>
<p>Just take a look at the <a href="https://ev.kde.org/reports/2002/">2002 e.V. meeting</a> group photo below:</p>
<center>



<a href="https://cullmann.dev/posts/join-the-kde-ev/images/2002_meeting_hu_efe09f7fe39f718.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/join-the-kde-ev/images/2002_meeting_hu_c62b44a803b124a1.webp" alt="2002 KDE e.V. meeting" style="border: 0px; border-radius: 8px;" width="640" height="480" />
</a>
</center>

<p>A few of this people are still active, some of them many of the current active KDE community members have never heard of.
The group pictured above isn&rsquo;t that diverse either.
It looks a bit like you take a group photo of some computer science course in a university in Germany of that time.
And yes, I am on that photo, too (as usual, wrongly written as Cullman, like <a href="https://en.wikipedia.org/wiki/Cullman_County,_Alabama">my nice county</a>).
I actually fished that picture out of my private data storage .P</p>
<p>Let&rsquo;s take a look at the Akademy 2020 group photo below (CC BY 4.0, created by the Akademy team):</p>
<center>



<a href="https://cullmann.dev/posts/join-the-kde-ev/images/akademy2020_group_photo_1080_hu_16c3e9f9f262cd75.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/join-the-kde-ev/images/akademy2020_group_photo_1080_hu_d4b9855e9964e5ad.webp" alt="Akademy 2020 group photo" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>This looks a lot more like the KDE community we all know and love.
Therefore it would be fantastic if active people take care to join the e.V., too!</p>
<p>If you want to join, just take a short look at <a href="https://ev.kde.org/getinvolved/members.php">this guide</a>.</p>
<p>You will need some e.V. member that suggests you, I assume you will know someone from the <a href="https://ev.kde.org/members/">e.V. members list</a> to ask to do so.</p>
]]></content:encoded></item><item><title>CMake &amp; Meson &amp; CompCert</title><link>https://cullmann.dev/posts/cmake-meson-compcert/</link><pubDate>Sun, 07 Jun 2020 16:13:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/cmake-meson-compcert/</guid><description>&lt;p&gt;I tried to compile the &lt;a href="https://github.com/keith-packard/picolibc"&gt;Picolibc&lt;/a&gt; that uses the &lt;a href="https://mesonbuild.com/"&gt;Meson build system&lt;/a&gt; with &lt;a href="http://compcert.inria.fr/"&gt;CompCert&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The CompCert install I tried uses the GNU/GCC toolchain for preprocessing and linking.
That makes the compiler relatively compatible to a GCC, beside that not all command line options are supported.&lt;/p&gt;
&lt;p&gt;I was used to &lt;a href="https://www.cmake.org"&gt;CMake&lt;/a&gt; projects and there it is normally enough to just set CC=ccomp and you are ready and set (at least if you use the GNU/GCC toolchain).
As long as you don&amp;rsquo;t use special flags in your project, that will just work.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I tried to compile the <a href="https://github.com/keith-packard/picolibc">Picolibc</a> that uses the <a href="https://mesonbuild.com/">Meson build system</a> with <a href="http://compcert.inria.fr/">CompCert</a>.</p>
<p>The CompCert install I tried uses the GNU/GCC toolchain for preprocessing and linking.
That makes the compiler relatively compatible to a GCC, beside that not all command line options are supported.</p>
<p>I was used to <a href="https://www.cmake.org">CMake</a> projects and there it is normally enough to just set CC=ccomp and you are ready and set (at least if you use the GNU/GCC toolchain).
As long as you don&rsquo;t use special flags in your project, that will just work.</p>
<p>The Picolibc was the first Meson based project I encountered.</p>
<p>There setting CC to ccomp just leads to</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"> meson.build:1:0: ERROR: Unknown compiler<span class="o">(</span>s<span class="o">)</span>: <span class="o">[[</span><span class="s1">&#39;ccomp&#39;</span><span class="o">]]</span></span></span></code></pre></div>
<p>I did assume that the project won&rsquo;t compile &amp; link without adjustments, as CompCert doesn&rsquo;t support the full range of command line options like GCC as mentioned above nor the full GNU extensions for C.
But that it directly ends at the compiler initialization in the build system itself was astonishing.</p>
<p>I searched a bit in the internet and it seems, if I really want to get this working, I actually need to patch Meson itself :/
(see how to add a new compiler <a href="https://github.com/mesonbuild/meson/commit/74602928100394f6129e064f8e0bfe6c9e08c9d2#diff-1eaa302b42bbbba32f1c6d474d08397e">here</a>)</p>
<p>At least I found no other solution, actually, I found no real solution for the above error message at all and the code looks like you need to manually add compilers anyways.</p>
<p>Given I want to spend work on getting the C library to compile and not fix a build system, it seems easier to go with the <a href="https://github.com/mirror/newlib-cygwin">newlib</a> that uses the old autotools,
at least for them the compile starts at all with my CC environment variable and you get to places of interest to fix.</p>
<p>This means for my use case, with a non-standard compiler, I can not see how Meson is an improvement over other existing stuff like CMake or even autotools.
But perhaps this area will improve in the future.</p>
]]></content:encoded></item><item><title>Manjaro with KDE on a MacBook Pro</title><link>https://cullmann.dev/posts/manjaro-with-kde-on-a-macbook-pro.md/</link><pubDate>Tue, 14 Jan 2020 21:22:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/manjaro-with-kde-on-a-macbook-pro.md/</guid><description>&lt;p&gt;I bought a MacBook end of 2014.
My initial reason to buy it was to &lt;a href="https://kate-editor.org/2015/01/03/kate5-on-mac/"&gt;improve the Kate port&lt;/a&gt; for macOS.
Beside that, I wanted to try if the Apple ecosystem and macOS are really that great and will solve all my issues in life (short answer: no, they aren&amp;rsquo;t, at least not for me).
The HiDPI screen looked nice, too :=)&lt;/p&gt;
&lt;p&gt;After some initial &amp;ldquo;not a lot works&amp;rdquo;, if you don&amp;rsquo;t go the &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; or &lt;a href="https://www.macports.org/"&gt;MacPorts&lt;/a&gt; way, the Kate port improved over the following years.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I bought a MacBook end of 2014.
My initial reason to buy it was to <a href="https://kate-editor.org/2015/01/03/kate5-on-mac/">improve the Kate port</a> for macOS.
Beside that, I wanted to try if the Apple ecosystem and macOS are really that great and will solve all my issues in life (short answer: no, they aren&rsquo;t, at least not for me).
The HiDPI screen looked nice, too :=)</p>
<p>After some initial &ldquo;not a lot works&rdquo;, if you don&rsquo;t go the <a href="https://brew.sh/">Homebrew</a> or <a href="https://www.macports.org/">MacPorts</a> way, the Kate port improved over the following years.</p>
<p>I learned a lot about standalone non-Linux deployment of applications and macOS specifics in the process.</p>
<p>As a side-effect of my porting efforts, with the help of others, I was able to improve the deployment of <a href="https://api.kde.org/frameworks/index.html">KDE Frameworks</a> in some ways, e.g. by allowing to bundle more stuff inside <a href="https://doc.qt.io/qt-5/resources.html">Qt resources</a>.</p>
<p>For example the <a href="https://api.kde.org/frameworks/syntax-highlighting/html/index.html">KSyntaxHighlighting</a> or <a href="https://api.kde.org/frameworks/ktexteditor/html/index.html">KTextEditor</a> frameworks are now just a library you link, you don&rsquo;t need to deploy any extra data files.
This is a huge improvement, if you want to bundle them with your standalone application.</p>
<p>Unfortunately, my initial hope, that we would get more people contributing to the macOS port (and with this to KTextEditor/Kate/&hellip;) didn&rsquo;t really take off.</p>
<p>Beside some minimal help, not a lot happened.</p>
<p>I think my last self-provided bundle update for macOS was in <a href="https://kate-editor.org/2016/06/16/new-katekwrite-bundles-for-mac/">2016</a>.</p>
<p>The binary factory still churns out new builds, you can grab them via the links on our <a href="https://kate-editor.org/get-it/">download page</a>.</p>
<p>I occasionally tried them, but they never got polished in a way like our Windows variants that we now even ship via the <a href="https://www.microsoft.com/store/apps/9NWMW7BB59HW">Windows Store</a>.</p>
<p>Apple doesn&rsquo;t make the world a better place with each update of macOS, see for example the now necessary notarized builds and the effort the cause for e.g. <a href="https://krita.org/en/item/first-notarized-macos-build-of-krita/">Krita</a>
(and with necessary I mean: you shall do it, otherwise your users are nagged with &ldquo;do you really want to execute this&hellip;&rdquo; stuff that makes a very bad impression).</p>
<p>In the last years, I used my MacBook more or less just to either grab some stuff from iTunes or do stuff inside my Linux VirtualBox there.</p>
<p>Given I anyways have a proper Windows 10 VM to take care of the Windows development for Kate (yes, Apple, Microsoft allows that officially, you can just buy a license, you can even get some &lsquo;free&rsquo; developer VM images for a fixed time&hellip;), I just migrated my seldom used iTunes account to that machine.</p>
<p>With that away, I just installed purely <a href="https://manjaro.org/">Manjaro Linux</a> on my MacBook last evening, who cares, I anyways don&rsquo;t use macOS at all beside as VirtualBox startup environment.</p>
<p>I searched for some pointers in the internet, in the past I already had some parallel install.
If you search a bit, you will find various hints how to do it.</p>
<p>If people want to do the same as me, a pure Manjaro install without keeping any macOS around, here a minimal how-to for a MacBook Pro Retina 13&quot; (model number MGX82**/A, model id MacBookPro11,1):</p>
<ul>
<li>
<p>Get the USB installer from their <a href="https://manjaro.org/">Manjaro Linux</a> homepage, I used the KDE variant ;=)</p>
</li>
<li>
<p>Get it on a stick and plug it into your MacBook</p>
</li>
<li>
<p>Boot up your MacBook (pressing the ALT key)</p>
</li>
<li>
<p>Select the EFI boot option.</p>
</li>
<li>
<p>Start the live system, like on any other machine</p>
</li>
<li>
<p>If you want to have internet, which is a good idea to e.g. later easily install the Broadcom driver, use your mobile phone with USB-tethering</p>
</li>
<li>
<p>Install it normally, I used the &ldquo;erase my full drive and encrypt it&rdquo; variant. Be careful, your data is gone afterwards, you got warned!</p>
</li>
<li>
<p>Reboot your MacBook, you will boot into your fresh installed Manjaro</p>
</li>
<li>
<p>Install the matching Broadcom driver for your kernel, something like &ldquo;linux54-broadcom-wl&rdquo;</p>
</li>
<li>
<p>Install some fan control like &ldquo;mbpfan-git&rdquo; and enable it afterwards with &ldquo;sudo systemctl enable mbpfan&rdquo; + &ldquo;sudo systemctl start mbpfan&rdquo;</p>
</li>
</ul>
<p>For me this did the job and the stuff is running well enough.
The webcam won&rsquo;t work without additional effort, not that I use it.
No idea if Bluetooth or other stuff like the Thunderbolt ports work, but I never used that even on macOS.</p>
<p>Fortunately the HiDPI support on Linux &amp; Qt &amp; KDE has gone a long way since my initial try 2015 and now, with some scaling of 1.5 or 2, it is all nicely usable ;=)</p>
<p>Given I still have some macOS machines available at work, I might still try out some Kate bundles there from time to time, but my personal life is now macOS free.</p>
]]></content:encoded></item><item><title>C++ Standard Version Mix-up</title><link>https://cullmann.dev/posts/cpp-standard-version-mix-up/</link><pubDate>Sat, 21 Dec 2019 16:09:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/cpp-standard-version-mix-up/</guid><description>&lt;p&gt;At &lt;a href="https://www.absint.com/"&gt;work&lt;/a&gt; we use the LLVM/clang libraries for pre-processing and parsing C/C++ stuff.&lt;/p&gt;
&lt;p&gt;During some experimenting with the current master version of these libraries, I stumbled on unexpected crashes inside our unit-tests on Windows.&lt;/p&gt;
&lt;p&gt;We work with MSVC 2019 on Windows and all worked fine with LLVM 9.x, but with master, close to all my tests did now segfault in aligned_free.&lt;/p&gt;
&lt;p&gt;I first thought that might be some current regression in LLVM master, but after tracing it back to having DenseSet/Map crashing during destruction, this seemed unlikely.&lt;/p&gt;</description><content:encoded><![CDATA[<p>At <a href="https://www.absint.com/">work</a> we use the LLVM/clang libraries for pre-processing and parsing C/C++ stuff.</p>
<p>During some experimenting with the current master version of these libraries, I stumbled on unexpected crashes inside our unit-tests on Windows.</p>
<p>We work with MSVC 2019 on Windows and all worked fine with LLVM 9.x, but with master, close to all my tests did now segfault in aligned_free.</p>
<p>I first thought that might be some current regression in LLVM master, but after tracing it back to having DenseSet/Map crashing during destruction, this seemed unlikely.</p>
<p>On further investigation, the fault is really hilarious: We compiled the LLVM libraries with the default language standard as set there in the CMake tooling: C++14.</p>
<p>On the other side, we compiled our own tools that use these libraries with C++17.</p>
<p>Some months ago, the implementation of DenseMap got improved to use the <a href="https://github.com/llvm/llvm-project/blob/master/llvm/include/llvm/Support/Compiler.h">allocate_buffer/deallocate_buffer</a> functions to use (if possible) aligned allocation.</p>
<p>Unfortunately, this means, during the compilation of the library, the checks there ensure it doesn&rsquo;t use these code paths, on the other side, during compilation of our tools, it does, as the allocation functions are fully inline in the header including the feature checks.</p>
<p>For operating systems != Windows, this doesn&rsquo;t hurt that much, as you can use the normal free for stuff allocated with the aligned variants (and vice versa).</p>
<p>Unfortunately (or fortunately, to detect this screw-up), this doesn&rsquo;t hold for the MSVC run-time on Windows.</p>
<p>If one uses a consistent C++ standard version for the compilation of the whole tool-chain, all is fine.</p>
<p>Therefore, if somebody stumbles on the same kind of crashes, perhaps this blog post can avoid some longer bug hunting.</p>
<p>A usual crash backtrace of such an error would look like:</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="mh">0x00000000778ca12f</span> <span class="o">-</span> <span class="n">RtlFreeHeap</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x000007fef90ba8b0</span> <span class="o">-</span> <span class="n">free_base</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x000007fef910ffe2</span> <span class="o">-</span> <span class="n">aligned_free</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000140113fa7</span> <span class="o">-</span> <span class="n">llvm</span><span class="o">::</span><span class="n">TypeFinder</span><span class="o">::~</span><span class="n">TypeFinder</span></span></span></code></pre></div>
]]></content:encoded></item><item><title>KDE &amp; Qt Applications and High DPI Displays with Scaling</title><link>https://cullmann.dev/posts/kde-qt-highdpi-scaling/</link><pubDate>Thu, 03 Oct 2019 18:40:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kde-qt-highdpi-scaling/</guid><description>&lt;h3 id="what-is-a-high-dpi-display"&gt;What is a High DPI Display?&lt;/h3&gt;
&lt;p&gt;In the past, most displays had (or the OS pretended to have) around &lt;a href="https://en.wikipedia.org/wiki/Dots_per_inch#Computer_monitor_DPI_standards"&gt;96 PPI&lt;/a&gt;, more or less.&lt;/p&gt;
&lt;p&gt;If you differed a bit and had too small/large UI elements, you mostly just resized your default font size a bit and were kind of happy.&lt;/p&gt;
&lt;p&gt;In the last years, more and more displays arise that have a much higher PPI values, which allows for e.g. very crisp rendering of text.&lt;/p&gt;</description><content:encoded><![CDATA[<h3 id="what-is-a-high-dpi-display">What is a High DPI Display?</h3>
<p>In the past, most displays had (or the OS pretended to have) around <a href="https://en.wikipedia.org/wiki/Dots_per_inch#Computer_monitor_DPI_standards">96 PPI</a>, more or less.</p>
<p>If you differed a bit and had too small/large UI elements, you mostly just resized your default font size a bit and were kind of happy.</p>
<p>In the last years, more and more displays arise that have a much higher PPI values, which allows for e.g. very crisp rendering of text.</p>
<p>I arrived late in that era for my Linux machines by now starting to use two 163 PPI displays.</p>
<p>Just tweaking your fonts doesn&rsquo;t help here, all other things will still be unbearable small, even if you in addition increase e.g. icon sizes.</p>
<p>A solution for this is the current trend to just &ldquo;scale&rdquo; your UI by some factor, for my displays some factor of 1.5 leads to the most pleasant sizes.</p>
<h3 id="how-does-qt-handle-that">How does Qt handle that?</h3>
<p>A detailed description on how Qt does try to tackle the challenges of such displays can be found <a href="https://doc.qt.io/qt-5/highdpi.html">here</a>.</p>
<p>More or less the gist of this is:
In your application you work on logical pixels (in most cases) and Qt will do the hard work for you to then paint that in real pixels with the right scaling applied.</p>
<p>In practice, this isn&rsquo;t fully transparent to the programmer.
For example, as soon as you work with QPixmap, you will think a bit about where which pixel variant is used.
You need to be careful to not mix-up the size() of a QPixmap 1:1 with let&rsquo;s say layout/widget sizes in such scaled scenarios, see <a href="https://doc.qt.io/qt-5/qpixmap.html#devicePixelRatio">here</a>.</p>
<h3 id="fine-nice-but-what-does-that-mean-in-practice">Fine, nice, but what does that mean in practice?</h3>
<p>Let&rsquo;s take a look at how this works out in practice using the latest stable release of KDE &amp; Qt stuff:</p>
<ul>
<li>KDE Plasma 5.16.5</li>
<li>KDE Applications 19.08.1</li>
<li>KDE Frameworks 5.62.0</li>
<li>Qt 5.13.1</li>
</ul>
<p>My setup for the below experiments are two 163 PPI displays with scale factor 1.5.</p>
<p>I use some <a href="https://manjaro.org/">Manjaro Linux</a> with open-source AMD drivers for some average middle class card.</p>
<p>The screenshots are taken on my second screen.
I used PNG to avoid that some JPEG artifacts make the real rendering artifacts unclear, bear with the large size.</p>
<h3 id="experiments-on-kate--konsole">Experiments on Kate &amp; Konsole</h3>
<p>Let&rsquo;s show the current state with <a href="https://kate-editor.org">Kate</a> &amp; <a href="https://konsole.kde.org">Konsole</a>, here how Kate 19.08.1 looks if you start it on the second screen with default configuration with COPYING.LIB of ktexteditor.git as file:</p>
<center>



<a href="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-19.08.1-hidpi-second-screen_hu_1269a7e93c917ebd.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-19.08.1-hidpi-second-screen_hu_f810883b26b1eb.webp" alt="Experiments on Kate &amp; Konsole" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>This looks kind of strange. What you see is actually no split screen, even that is a pure rendering artifacts, actually, the whole Kate windows is more or less one artifacts.</p>
<p>A user reported this in <a href="https://bugs.kde.org/show_bug.cgi?id=411965">Bug 411965 - Rendering issue in dual screen hidpi setup</a>.
With my new setup I was able to reproduce that, on every Kate start :/</p>
<p>The user himself investigated this and came to the same conclusion as me, the culprit is some winId() call in KonsolePart.
As Kate constructs the KonsolePart widget without a parent first and then insert it into a layout, the code inside the part will call <a href="https://doc.qt.io/qt-5/qwidget.html#winId">winId()</a> on a non-native widget.</p>
<p>This is now fixed and backported to the 19.08 branch.</p>
<p>This means, with 19.08.2, you will have the following experience:</p>
<center>



<a href="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-19.08.2-hidpi-second-screen_hu_8814cfc2b021ae05.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-19.08.2-hidpi-second-screen_hu_d5d4a999f830ed55.webp" alt="Experiments on Kate &amp; Konsole with 19.08.2" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>This somehow looks more like an actual working application.</p>
<p>For people not able to update, a workaround is to disable both project and terminal plugin in your Kate setup, no ideal solution, but makes Kate at least usable again.</p>
<p>Is now all fine with Kate?
Unfortunately not, lets change my font size a bit and select things:</p>
<center>



<a href="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-19.08.2-hidpi-selection_hu_97fec059c0197efd.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-19.08.2-hidpi-selection_hu_f2317379d5c94d4d.webp" alt="Experiments on Kate &amp; Konsole with 19.08.2 with selection" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>I selected both in the text view (KTextEditor) and in the KonsolePart to show the issue is not just a plain &ldquo;we are too dumb to render things&rdquo; in KTextEditor.
You get equal artifacts with most of our software :(</p>
<p>I spend some time to trace this issues down in the <a href="https://bugreports.qt.io/browse/QTBUG-66036">QTBUG-66036 - QTextLayout draw() rendering issues with &ldquo;some&rdquo; font sizes</a>.</p>
<p>It came up to not being a text related issue at all.</p>
<p>To give a small outline how KTextEditor and Konsole render stuff:</p>
<ul>
<li>All things are in pure integer coordinates inside the applications.</li>
<li>More or less we render some uniform high lines of text.</li>
<li>Most background/selection coloring is done via <a href="https://doc.qt.io/qt-5/qpainter.html#fillRect">fillRect</a> with integer coordinates/sizes in both KTextEditor/Konsole.</li>
<li>KTextEditor paints parts of the text background via <a href="https://doc.qt.io/qt-5/qtextlayout.html#setFormats">QTextLayout::setFormats</a>.</li>
<li>KTextEditor and Konsole rely in some parts on the clipping to avoid over-painting.</li>
</ul>
<p>Given none of both rendering &ldquo;engines&rdquo; work anywhere with non-integer coordinates and sizes, the artifacts seems to be strange.
They only occur with fractional scaling, e.g. with 1.5, not with e.g 2.0.</p>
<p>During debugging, three major issues that lead to the artifacts came up, I created separate bugs for them, as they are not text rendering related:</p>
<h4 id="qtbug-78964---fillrect--anti-aliasing--hi-dpi-scaling--missing-filled-pixels"><a href="https://bugreports.qt.io/browse/QTBUG-78964">QTBUG-78964 - fillRect + Anti-Aliasing + hi-dpi Scaling =&gt; missing filled pixels</a></h4>
<p>If you use fillRect, even for purely integer coordinates and sizes, if the scaling is fractional and you have the render hint &ldquo;QPainter::Antialiasing&rdquo; turned on, it will miss to fill one pixel at the border.
For KTextEditor/Konsole mostly at the lower part of the filling.
A workaround for this, now commited for KTextEditor framework and Konsole is to turn the anti-aliasing off for large parts of the rendering.
Only the parts that actually need it, turn if on again, this doesn&rsquo;t affect e.g. the text anti-aliasing.</p>
<h4 id="qtbug-78962---setcliprect-misbehavior-for-hi-dpi-scaling-with-qrect-overload-vs-qrectf-overload"><a href="https://bugreports.qt.io/browse/QTBUG-78962">QTBUG-78962 - setClipRect misbehavior for hi-dpi scaling with QRect overload vs. QRectF overload</a></h4>
<p>KTextEditor uses setClipRect to avoid overpainting between individual lines. Unfortunately, like fillRect, setClipRect leads to one pixel being clipped away too early for fractional scaling.
A workaround for this is to use the QRectF overload of setClipRect.
Even thought the passed QRectF has the same pure-integer coordinates, this will avoid the clipping errors due to different internal handling.
KTextEditor uses now this workaround.</p>
<h4 id="qtbug-78963---misbehavior-of-clipping-done-for-paintevent-with-hi-dpi-fractional-scaling"><a href="https://bugreports.qt.io/browse/QTBUG-78963">QTBUG-78963 - Misbehavior of clipping done for ::paintEvent with hi-dpi fractional scaling</a></h4>
<p>Even after all this fixed, Konsole still draws some artifacts.
Konsole is more relying on paintEvent to clip correctly than KTextEditor.
Unfortunately the internal clipping done for the paintEvent seems to have the same off-by-one rounding issues like the manual setClipRect for QRect instead of QRectF.
As we can&rsquo;t control this clipping region in Konsole, I see no easy workaround, beside more often trigger full widget updates, which are costly.</p>
<p>This leads to this current state of the rendering in the master branch.
I did select + deselect a bit text in the terminal to trigger the paintEvent related clipping failure, you can see a few small one pixel high selection leftovers below the selection area.
You need to play a bit with the scaling factor and font size, too, to trigger the effects, as like all rounding errors, you need specific values to trigger them.</p>
<center>



<a href="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-master-hidpi_hu_a31f563209c23856.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-qt-highdpi-scaling/images/kate-master-hidpi_hu_87b79e6ab59e7f.webp" alt="Experiments on Kate master" style="border: 0px; border-radius: 8px;" width="640" height="360" />
</a>
</center>

<p>I hope the Qt bugs linked above can be fixed in the near future, as I doubt we can add workaround to all the applications affected (nor do we want to) and the clipping issue of the paintEvent, if it really is the reason for the last remaining Konsole artifacts, seems not to be really fixable at all in the application code, beside going away from fine grained repaints.</p>
<p>Here are the matching <a href="https://bugs.kde.org/show_bug.cgi?id=390451">KTextEditor</a> and <a href="https://bugs.kde.org/show_bug.cgi?id=373232">Konsole</a> bug report for the above issues.
The relevant Qt bugs are linked there again, too.</p>
<h3 id="are-that-all-current-issues-i-assume-not">Are that all current issues? I assume not.</h3>
<p>I think there are for sure more pitfalls hidden, if you use some fractional scaling and Qt &amp; KDE applications.
Some of our applications are even still horrible broken for any kind of scaling :(</p>
<p>We are open-source software, patches to improve the current situation are very welcome.</p>
<p>Perhaps you are able to fix one of the above Qt bugs, that would be great!</p>
<h3 id="ps-floating-point-math-is-hard">P.S. Floating point math is hard!</h3>
<p>One thing that disturbed me during trying to get rid of the rendering artifacts, is the bit careless choice of scaling factors people use.</p>
<p>I can understand that you want to have things 20% larger, but unfortunately, a factor of 1.2 leads to rounding errors all over the place, as 1.2 is no the nice number it seems to be in the hardware double precision floats we use.</p>
<p>If you want to avoid running in bad artifacts more than needed, please better scale with some factor that is a nicely representable float, like some multiple of 1/16 or 1/32.</p>
<p>For example some scaling with 1.25 will lead to much less issues than 1.2.</p>
<p>For details, just read up about how stuff like 0.1 or 0.2 is represented ;=)</p>
<ul>
<li><a href="https://docs.python.org/3/tutorial/floatingpoint.html">Floating Point Arithmetic: Issues and Limitations</a></li>
<li><a href="https://www.exploringbinary.com/why-0-point-1-does-not-exist-in-floating-point/">Why 0.1 Does Not Exist In Floating-Point</a></li>
<li><a href="https://floating-point-gui.de/formats/binary/">Binary Fractions</a></li>
</ul>
<p>You can ignore that advice and scale like you want, but I won&rsquo;t take care of the artifacts that remain for e.g. 1.1 scaling in some corner cases ;=)</p>
<h3 id="discussion">Discussion</h3>
<p>Feel free to join the discussion at the <a href="https://www.reddit.com/r/kde/comments/dct6r1/kde_qt_applications_and_high_dpi_displays_with/">KDE reddit</a>.</p>
]]></content:encoded></item><item><title>KDE applications on Windows</title><link>https://cullmann.dev/posts/kde-applications-on-windows/</link><pubDate>Sat, 21 Sep 2019 23:13:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kde-applications-on-windows/</guid><description>&lt;h4 id="kde-applications-on-windows"&gt;KDE applications on Windows?&lt;/h4&gt;
&lt;p&gt;One of the new &lt;a href="https://dot.kde.org/2019/09/07/kde-decides-three-new-challenges-wayland-consistency-and-apps"&gt;goals of KDE&lt;/a&gt; is to spread the use of the applications created by the KDE community.
This doesn&amp;rsquo;t only include the use of them on Linux &amp;amp; other Unix-like operating systems, but Windows, too.&lt;/p&gt;
&lt;h4 id="the-successes-"&gt;The Successes :)&lt;/h4&gt;
&lt;p&gt;The KDE community has some successfully cross-platform applications out there, like &lt;a href="https://krita.org/"&gt;Krita&lt;/a&gt; and &lt;a href="https://gcompris.net/"&gt;GCompris&lt;/a&gt;.
The teams behind these applications did some great job to both develop &amp;amp; market them for all operating systems, including Windows.&lt;/p&gt;</description><content:encoded><![CDATA[<h4 id="kde-applications-on-windows">KDE applications on Windows?</h4>
<p>One of the new <a href="https://dot.kde.org/2019/09/07/kde-decides-three-new-challenges-wayland-consistency-and-apps">goals of KDE</a> is to spread the use of the applications created by the KDE community.
This doesn&rsquo;t only include the use of them on Linux &amp; other Unix-like operating systems, but Windows, too.</p>
<h4 id="the-successes-">The Successes :)</h4>
<p>The KDE community has some successfully cross-platform applications out there, like <a href="https://krita.org/">Krita</a> and <a href="https://gcompris.net/">GCompris</a>.
The teams behind these applications did some great job to both develop &amp; market them for all operating systems, including Windows.</p>
<h4 id="the-remaining-stuff-">The Remaining Stuff :(</h4>
<p>Wheres many KDE application can already be built on Windows since years, they have not found a wide spread use there.</p>
<p>For example <a href="https://kate-editor.org">Kate</a>, the text editor I maintain, is there mostly unknown.
Actually most of the applications we ship with the <a href="https://kde.org/announcements/announce-applications-19.08.1.php">KDE Applications releases</a> are not widely known on Windows (nor used).</p>
<h4 id="the-plan">The Plan!</h4>
<p>Already last year we came up with <a href="https://phabricator.kde.org/T9575">the task</a> to bring more of our applications to the official <a href="https://store.microsoft.com">Microsoft Store</a> to increase their visibility for the average Windows user.</p>
<h4 id="the-building-blocks">The Building Blocks</h4>
<p>Hannah von Reth &amp; Kevin Funk provided the means to achieve this:</p>
<ul>
<li><a href="https://community.kde.org/Craft">Craft</a> - a meta build system / package manager that can be used on Windows for our stuff</li>
<li><a href="https://binary-factory.kde.org/">KDE Binary Factory</a> - a CI that actually even creates fully signed installers and packages for the store!</li>
</ul>
<p>Without their work, nothing would have happened for the &ldquo;we publish stuff in the store&rdquo; task.</p>
<p>More details about that can be found in the wiki and older blog posts:</p>
<ul>
<li><a href="https://community.kde.org/Guidelines_and_HOWTOs/Build_from_source/Windows">Using Craft on Windows</a></li>
<li><a href="http://kfunk.org/2017/12/20/tips-streamlining-kde-application-for-deployment-microsoft-windows/">Tips for streamlining KDE applications for deployment on Microsoft Windows</a></li>
<li><a href="http://kfunk.org/2017/11/17/kde-binary-factory/">CI for Windows installer and macOS bundle generation: KDE Binary Factory</a></li>
</ul>
<h4 id="our-progress-">Our Progress :=)</h4>
<p>Based on that work, some applications got now published with the <a href="https://ev.kde.org/">KDE e.V.</a> account to the Microsoft Store.
The first was <a href="https://kde.org/applications/education/org.kde.kstars">KStars</a> and after a long gap <a href="https://kate-editor.org">Kate</a> &amp; <a href="https://okular.kde.org">Okular</a> followed.</p>
<p>Direct links to the store entries can be found below (the screenshots are in German, made in a Win10 VM, yes, i18n works on Windows just fine):</p>
<ul>
<li><a href="https://www.microsoft.com/store/apps/9N41MSQ1WNM8">Okular - more than a reader</a></li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kde-applications-on-windows/images/okular-on-windows_hu_b69bb63658bfbf07.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-on-windows/images/okular-on-windows_hu_6c534a094ed5fc52.webp" alt="Okular - more than a reader" style="border: 0px; border-radius: 8px;" width="640" height="512" />
</a>
</center>

<ul>
<li><a href="https://www.microsoft.com/store/apps/9NWMW7BB59HW">Kate - Advanced Text Editor</a></li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kde-applications-on-windows/images/kate-on-windows_hu_2b6068c9d2233a26.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-on-windows/images/kate-on-windows_hu_b1210f5c483eaa8d.webp" alt="Kate - Advanced Text Editor" style="border: 0px; border-radius: 8px;" width="640" height="528" />
</a>
</center>

<ul>
<li><a href="https://www.microsoft.com/store/apps/9PPRZ2QHLXTG">KStars - Astronomy Software</a></li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kde-applications-on-windows/images/kstars-on-windows_hu_71f513fe7ea87bbb.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kde-applications-on-windows/images/kstars-on-windows_hu_3d8403db24aed83a.webp" alt="KStars - Astronomy Software" style="border: 0px; border-radius: 8px;" width="640" height="499" />
</a>
</center>

<h4 id="help-wanted">Help Wanted!</h4>
<p>At the moment, this is the effort of only a few people and it will only be sustainable if we gain more support.</p>
<p>Therefore, if you are interested in bringing more of our applications to Windows and helping to maintain them, join in at <a href="https://phabricator.kde.org/T9575">this Phabricator task</a>.</p>
<p>The tooling might still be a bit rough to use in some places and the documentation is not perfect, but this can be improved!</p>
<h4 id="why-all-that">Why all that?</h4>
<p>I think there is a large user base on Windows that might benefit from our applications and we will benefit from potential more contributors, too.</p>
<p>Some might say: &ldquo;Why shall we provide our applications on a proprietary operating system? People shall use fully open systems!&rdquo;</p>
<p>I say: &ldquo;Why shall we ignore all the people that are stuck with a proprietary operating system out of whatever reason?&rdquo;</p>
<h4 id="ps">P.S.</h4>
<p>And no, the idea is not to publish the stuff exclusively in the Microsoft Store.</p>
<p>The <a href="https://binary-factory.kde.org/">KDE Binary Factory</a> outputs normal installers and portable archives, too.</p>
<p>The Microsoft Store is just a good way to advertise our applications to a broader scope of potential users.
The KDE e.V. published applications are there available for free but you can use any other means to install them.</p>
<p>Feel free to join the discussion at the <a href="https://www.reddit.com/r/kde/comments/d7g44o/kde_applications_on_windows_whats_the_current/">KDE reddit</a>.</p>
]]></content:encoded></item><item><title>KDE e.V. wants you!</title><link>https://cullmann.dev/posts/kde-ev-wants-you/</link><pubDate>Sun, 08 Sep 2019 11:20:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kde-ev-wants-you/</guid><description>&lt;p&gt;At the moment, the yearly KDE conference &lt;a href="https://akademy.kde.org/2019"&gt;Akademy&lt;/a&gt; is taking place in Milan.
The yearly &lt;a href="https://ev.kde.org"&gt;KDE e.V.&lt;/a&gt; meeting will be tomorrow.&lt;/p&gt;
&lt;p&gt;KDE e.V. is a registered non-profit organization that represents the KDE Community in legal and financial matters.&lt;/p&gt;
&lt;p&gt;For example the KDE e.V. is responsible for paying the servers that run our Phabricator/Bugzilla/Gitlab instances and all our web sites.
KDE e.V. takes care of sponsoring developer sprints and contributor travel costs, too.&lt;/p&gt;</description><content:encoded><![CDATA[<p>At the moment, the yearly KDE conference <a href="https://akademy.kde.org/2019">Akademy</a> is taking place in Milan.
The yearly <a href="https://ev.kde.org">KDE e.V.</a> meeting will be tomorrow.</p>
<p>KDE e.V. is a registered non-profit organization that represents the KDE Community in legal and financial matters.</p>
<p>For example the KDE e.V. is responsible for paying the servers that run our Phabricator/Bugzilla/Gitlab instances and all our web sites.
KDE e.V. takes care of sponsoring developer sprints and contributor travel costs, too.</p>
<p>If you are a KDE contributor, consider to join the e.V. to get some vote about its direction.</p>
<p>If you want to join, just take a short look at <a href="https://ev.kde.org/getinvolved/members.php">this guide</a>.</p>
]]></content:encoded></item><item><title>Kate LSP Status - July 22</title><link>https://cullmann.dev/posts/kate-lsp-status-july-22/</link><pubDate>Mon, 22 Jul 2019 22:43:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-lsp-status-july-22/</guid><description>&lt;p&gt;After my series of LSP client posts, I got the question: What does this actually do? And why should I like this or help with it?&lt;/p&gt;
&lt;p&gt;For the basic question: What the heck is the &lt;a href="https://microsoft.github.io/language-server-protocol/overview"&gt;Language Server Protocol (LSP)&lt;/a&gt;, I think my &lt;a href="https://cullmann.dev/posts/kate-language-server-protocol-client/"&gt;first post&lt;/a&gt; can help. Or, for more details, just head over to the &lt;a href="https://langserver.org/"&gt;official what/why/&amp;hellip; page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But easier than to describe why it is nice, I can just show the stuff in action.
Below is a video that shows the features that at the moment work with our master branch.
It is shown using the build directory of Kate itself.&lt;/p&gt;</description><content:encoded><![CDATA[<p>After my series of LSP client posts, I got the question: What does this actually do? And why should I like this or help with it?</p>
<p>For the basic question: What the heck is the <a href="https://microsoft.github.io/language-server-protocol/overview">Language Server Protocol (LSP)</a>, I think my <a href="/posts/kate-language-server-protocol-client/">first post</a> can help. Or, for more details, just head over to the <a href="https://langserver.org/">official what/why/&hellip; page</a>.</p>
<p>But easier than to describe why it is nice, I can just show the stuff in action.
Below is a video that shows the features that at the moment work with our master branch.
It is shown using the build directory of Kate itself.</p>
<p>To get a usable build directory, I build my stuff locally with <a href="https://kdesrc-build.kde.org/">kdesrc-build</a>, the only extra config I have in the global section of my <strong>.kdesrc-buildrc</strong> is:</p>
<blockquote>
<p>cmake-options -DCMAKE_BUILD_TYPE=RelWithDebInfo -G &ldquo;Kate - Unix Makefiles&rdquo; -DCMAKE_EXPORT_COMPILE_COMMANDS=ON</p>
</blockquote>
<p>This will auto generate the needed <strong>.kateproject</strong> files for the Kate project plugin and the <strong>compile_commands.json</strong> for <strong>clangd</strong> (the LSP server for C/C++ the plugin uses).</p>
<p>If you manually build your stuff with <strong>cmake</strong>, you can just add the</p>
<blockquote>
<p>-G &ldquo;Kate - Unix Makefiles&rdquo; -DCMAKE_EXPORT_COMPILE_COMMANDS=ON</p>
</blockquote>
<p>parts to your <strong>cmake</strong> call. If you use <strong>ninja</strong> and not <strong>make</strong>, just use</p>
<blockquote>
<p>-G &ldquo;Kate - Ninja&rdquo; -DCMAKE_EXPORT_COMPILE_COMMANDS=ON</p>
</blockquote>
<p>Then, let&rsquo;s see what you can do, once you are in a prepared build directory and have a <strong>master</strong> version of <strong>Kate</strong> in your <strong>PATH</strong>.</p>

<center>
    <video width="640" preload="auto" controls style="border: 0px;">
        <source src="https://cullmann.dev/posts/kate-lsp-status-july-22/images/kate-lsp-video.mp4" />
        Your browser does not seem to support the video images/kate-lsp-video.mp4.
    </video>
</center>

<p>I hope the quality is acceptable, that is my first try in a long time to do some screen-cast ;)</p>
<p>As you can see, this is already in an usable state at least for C/C++ in combination with <strong>clangd</strong>.</p>
<p>For details how to build Kate master with it&rsquo;s plugins, please take a look at <a href="https://kate-editor.org/build-it/">this guide</a>.</p>
<p>If you want to start to hack on the plugin, you find it in the kate.git, <a href="https://cgit.kde.org/kate.git/tree/addons/lspclient">addons/lspclient</a>.</p>
<p>Feel welcome to show up on <a href="mailto:kwrite-devel@kde.org">kwrite-devel@kde.org</a> and help out!
All development discussions regarding this plugin happen there.</p>
<p>If you are already familiar with Phabricator, post some patch directly at <a href="https://phabricator.kde.org/differential/">KDE&rsquo;s Phabricator instance</a>.</p>
]]></content:encoded></item><item><title>Kate LSP Status - July 21</title><link>https://cullmann.dev/posts/kate-lsp-status-july-21/</link><pubDate>Sun, 21 Jul 2019 15:18:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-lsp-status-july-21/</guid><description>&lt;p&gt;The new LSP client by Mark Nauwelaerts keeps making nice progress.&lt;/p&gt;
&lt;p&gt;It will not be shipped with the KDE Applications 19.08 release, but in master it is now compiled &amp;amp; installed per default.
You only need to activate it on the plugin configuration page in Kate&amp;rsquo;s settings dialog to be able to use it.&lt;/p&gt;
&lt;p&gt;For details how to build Kate master with it&amp;rsquo;s plugins, please take a look at &lt;a href="https://kate-editor.org/build-it/"&gt;this guide&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The new LSP client by Mark Nauwelaerts keeps making nice progress.</p>
<p>It will not be shipped with the KDE Applications 19.08 release, but in master it is now compiled &amp; installed per default.
You only need to activate it on the plugin configuration page in Kate&rsquo;s settings dialog to be able to use it.</p>
<p>For details how to build Kate master with it&rsquo;s plugins, please take a look at <a href="https://kate-editor.org/build-it/">this guide</a>.</p>
<p>If you want to start to hack on the plugin, you find it in the kate.git, <a href="https://cgit.kde.org/kate.git/tree/addons/lspclient">addons/lspclient</a>.</p>
<p>Feel welcome to show up on <a href="mailto:kwrite-devel@kde.org">kwrite-devel@kde.org</a> and help out!
All development discussions regarding this plugin happen there.</p>
<p>If you are already familiar with Phabricator, post some patch directly at <a href="https://phabricator.kde.org/differential/">KDE&rsquo;s Phabricator instance</a>.</p>
<p>What is new this week?</p>
<p>The most thing are internal cleanups and minor improvements.</p>
<p>Feature wise, the hover implementation works now more like in other editors or IDEs, you get some nice tool tip after some delay:</p>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-status-july-21/images/kate-hover_hu_7d90d1c023fa755e.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-status-july-21/images/kate-hover_hu_f7c5a0401e31afbc.webp" alt="Hover" style="border: 0px; border-radius: 8px;" width="640" height="395" />
</a>
</center>

<p>Never try to guess again what some <em>auto</em> means ;=)</p>
<p>There is still a lot that can be improved, e.g. a filter for the symbols outline is in work:</p>
<ul>
<li><a href="https://phabricator.kde.org/D22592">D22592 - port symbols view to model/view concept</a></li>
</ul>
<p>To be able to later out-source some parts of the generic LSP client code to a library, if there is demand, we will aim to make the plugin be licensed under the MIT license.
This should make it easier for other projects to depend of our code, if wanted.</p>
]]></content:encoded></item><item><title>Kate LSP Client Continued</title><link>https://cullmann.dev/posts/kate-lsp-client-continued/</link><pubDate>Sun, 14 Jul 2019 15:33:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-lsp-client-continued/</guid><description>&lt;p&gt;The new LSP client by Mark Nauwelaerts made nice progress since the &lt;a href="https://cullmann.dev/posts/kate-lsp-client-restart/"&gt;LSP client restart&lt;/a&gt; post last week.&lt;/p&gt;
&lt;p&gt;Reminder: The plugin is not compiled per default, you can turn it on via:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cmake -DCMAKE_INSTALL_PREFIX=&amp;ldquo;your prefix&amp;rdquo; -DENABLE_LSPCLIENT=ON &amp;ldquo;kate src dir&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The code can still be found kate.git master, see &lt;a href="https://cgit.kde.org/kate.git/tree/addons/lspclient"&gt;lspclient&lt;/a&gt; in the addons directory.&lt;/p&gt;
&lt;p&gt;What is new?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diagnostics support: A tab in the LSP client toolview will show the diagnistics, grouped by file with links to jump to the locations. Issues will be highlighted in the editor view, too.&lt;/li&gt;
&lt;/ul&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-diagnostics_hu_edfc7c6c9e32a07e.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-diagnostics_hu_ac6a9261d4e283f.webp" alt="Diagnostics support" style="border: 0px; border-radius: 8px;" width="640" height="390" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;ul&gt;
&lt;li&gt;Find references: Find all references for some variable/function in your complete program. They are listed like the diagnostics grouped per file in an extra tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-find-references_hu_bd2c69d3fcb02da7.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-find-references_hu_c8b0be181aa50895.webp" alt="Find references" style="border: 0px; border-radius: 8px;" width="640" height="390" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;ul&gt;
&lt;li&gt;Improved document highlight: Highlight all occurrences of a variable/&amp;hellip; inside the current document. Beside highlighting the reads/writes/uses, you get a jump list like for the other stuff as tab, too.&lt;/li&gt;
&lt;/ul&gt;
&lt;center&gt;



&lt;a href="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-document-highlight_hu_8e7ea10856574fea.webp" target="_new" style="border-bottom: 0px; background-color: inherit;"&gt;
 &lt;img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-document-highlight_hu_c80a7dcf62b8fdd8.webp" alt="Improved document highlight" style="border: 0px; border-radius: 8px;" width="640" height="390" /&gt;
&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;A feature I missed to show last time:&lt;/p&gt;</description><content:encoded><![CDATA[<p>The new LSP client by Mark Nauwelaerts made nice progress since the <a href="/posts/kate-lsp-client-restart/">LSP client restart</a> post last week.</p>
<p>Reminder: The plugin is not compiled per default, you can turn it on via:</p>
<blockquote>
<p>cmake -DCMAKE_INSTALL_PREFIX=&ldquo;your prefix&rdquo; -DENABLE_LSPCLIENT=ON &ldquo;kate src dir&rdquo;</p>
</blockquote>
<p>The code can still be found kate.git master, see <a href="https://cgit.kde.org/kate.git/tree/addons/lspclient">lspclient</a> in the addons directory.</p>
<p>What is new?</p>
<ul>
<li>Diagnostics support: A tab in the LSP client toolview will show the diagnistics, grouped by file with links to jump to the locations. Issues will be highlighted in the editor view, too.</li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-diagnostics_hu_edfc7c6c9e32a07e.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-diagnostics_hu_ac6a9261d4e283f.webp" alt="Diagnostics support" style="border: 0px; border-radius: 8px;" width="640" height="390" />
</a>
</center>

<ul>
<li>Find references: Find all references for some variable/function in your complete program. They are listed like the diagnostics grouped per file in an extra tab.</li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-find-references_hu_bd2c69d3fcb02da7.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-find-references_hu_c8b0be181aa50895.webp" alt="Find references" style="border: 0px; border-radius: 8px;" width="640" height="390" />
</a>
</center>

<ul>
<li>Improved document highlight: Highlight all occurrences of a variable/&hellip; inside the current document. Beside highlighting the reads/writes/uses, you get a jump list like for the other stuff as tab, too.</li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-document-highlight_hu_8e7ea10856574fea.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-document-highlight_hu_c80a7dcf62b8fdd8.webp" alt="Improved document highlight" style="border: 0px; border-radius: 8px;" width="640" height="390" />
</a>
</center>

<p>A feature I missed to show last time:</p>
<ul>
<li>Hover support: Show more meta info about a code location, like the proper type, useful e.g. for <a href="https://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/">almost-always-auto</a> C++ programming.</li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-hover_hu_17be972702ab4309.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-continued/images/kate-hover_hu_b72a7acbe6b02d00.webp" alt="Hover support" style="border: 0px; border-radius: 8px;" width="640" height="390" />
</a>
</center>

<p>We even got already two patches for the fresh plugin:</p>
<ul>
<li><a href="https://phabricator.kde.org/D22348">D22348 - Use the label when insertText or sortText is missing</a></li>
<li><a href="https://phabricator.kde.org/D22349">D22349 - Don&rsquo;t send the Content-Type header</a></li>
</ul>
<p>Both are aimed to improve the support of the Rust LSP server.
As you can see, they got already reviewed and merged.</p>
<p>Feel welcome to show up on <a href="mailto:kwrite-devel@kde.org">kwrite-devel@kde.org</a> and help out!
All development discussions regarding this plugin happen there.</p>
<p>If you are already familiar with Phabricator, post some patch directly at <a href="https://phabricator.kde.org/differential/">KDE&rsquo;s Phabricator instance</a>.</p>
<p>You want more LSP servers supported? You want to have feature X? You have seen some bug and want it to vanish? =&gt; Join!</p>
]]></content:encoded></item><item><title>Kate LSP Client Restart</title><link>https://cullmann.dev/posts/kate-lsp-client-restart/</link><pubDate>Sun, 07 Jul 2019 15:13:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-lsp-client-restart/</guid><description>&lt;p&gt;Since my last post about the &lt;a href="https://cullmann.dev/posts/kate-lsp-client-progress/"&gt;LSP client progress&lt;/a&gt; in May I didn&amp;rsquo;t work on that project at all I think.&lt;/p&gt;
&lt;p&gt;But the good news is, somebody else did scratch that itch on his own ;=)&lt;/p&gt;
&lt;p&gt;We have now a prototype plugin in kate.git master, see &lt;a href="https://cgit.kde.org/kate.git/tree/addons/lspclient"&gt;lspclient&lt;/a&gt; in the addons directory.&lt;/p&gt;
&lt;p&gt;It is not compiled per default, you can turn it on via:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cmake -DCMAKE_INSTALL_PREFIX=&amp;ldquo;your prefix&amp;rdquo; -DENABLE_LSPCLIENT=ON &amp;ldquo;kate src dir&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It shares no code with my initial prototype.
The author started this without knowing of my work.
This might actually be not that bad, as this plugin is composed of a much smaller code base.
This allows to get familiar with the code easier as with the code I copied over from Qt Creator for my initial try.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Since my last post about the <a href="/posts/kate-lsp-client-progress/">LSP client progress</a> in May I didn&rsquo;t work on that project at all I think.</p>
<p>But the good news is, somebody else did scratch that itch on his own ;=)</p>
<p>We have now a prototype plugin in kate.git master, see <a href="https://cgit.kde.org/kate.git/tree/addons/lspclient">lspclient</a> in the addons directory.</p>
<p>It is not compiled per default, you can turn it on via:</p>
<blockquote>
<p>cmake -DCMAKE_INSTALL_PREFIX=&ldquo;your prefix&rdquo; -DENABLE_LSPCLIENT=ON &ldquo;kate src dir&rdquo;</p>
</blockquote>
<p>It shares no code with my initial prototype.
The author started this without knowing of my work.
This might actually be not that bad, as this plugin is composed of a much smaller code base.
This allows to get familiar with the code easier as with the code I copied over from Qt Creator for my initial try.</p>
<p>But, even nicer, it does actually work a lot better than my variant, already now!</p>
<p>What does work (tested with clangd and kate.git/work projects) at the moment:</p>
<ul>
<li>Auto completion: you get the proper LSP server provided completion items</li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-client-restart/images/kate-auto-completion_hu_f665beb20f7c6346.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-restart/images/kate-auto-completion_hu_1632169f10dd51cb.webp" alt="Auto completion" style="border: 0px; border-radius: 8px;" width="640" height="212" />
</a>
</center>

<ul>
<li>Outline view: Get an extra tool view with the symbols of your current view</li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-client-restart/images/kate-outline-view_hu_fda89e875288646a.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-restart/images/kate-outline-view_hu_45d624cb329158c2.webp" alt="Outline view" style="border: 0px; border-radius: 8px;" width="640" height="441" />
</a>
</center>

<ul>
<li>Document highlight: highlight all occurrences of a variable/&hellip; inside the current view</li>
</ul>
<center>



<a href="https://cullmann.dev/posts/kate-lsp-client-restart/images/kate-document-highlight_hu_8228df3695ed1e57.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-lsp-client-restart/images/kate-document-highlight_hu_9d6ec622d752842c.webp" alt="Document highlight" style="border: 0px; border-radius: 8px;" width="640" height="441" />
</a>
</center>

<ul>
<li>Code navigation: jump to the definition/declaration</li>
</ul>
<p>There is still a lot of stuff missing and this is all prototype quality.
For example the document highlight implementation I added has no way to clear the highlighting at the moment beside document reload.</p>
<p>But given I just needed one hour to add the document highlight support, I would say the code base is easy to adjust.</p>
<p>=&gt; If you have time and want a good LSP client, now you can join the fun and have direct results.</p>
<p>As the author was kind enough to move his work on the plugin to the KDE infrastructure, feel welcome to show up on <a href="mailto:kwrite-devel@kde.org">kwrite-devel@kde.org</a> and help out!
All development discussions regarding this plugin happen there.
We are happy to accept patches, too, if you are a new contributor!</p>
]]></content:encoded></item><item><title>Kate &amp; C++ Developer Survey</title><link>https://cullmann.dev/posts/kate-cpp-developer-survey/</link><pubDate>Mon, 10 Jun 2019 22:45:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-cpp-developer-survey/</guid><description>&lt;p&gt;While browsing the &lt;a href="https://isocpp.org"&gt;ISO C++ homepage&lt;/a&gt; I stumbled over the &lt;a href="https://isocpp.org/files/papers/CppDevSurvey-2019-04-summary.pdf"&gt;results PDF&lt;/a&gt; of the &lt;a href="https://isocpp.org/blog/2019/05/results-summary-2019-global-developer-survey-lite"&gt;Second Annual C++ Foundation Developer Survey “Lite”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was astonished that Kate made it into the &amp;ldquo;Which development environments (IDEs) or editors do you use for C++ development?&amp;rdquo; results.&lt;/p&gt;
&lt;p&gt;;=) Seems not only I use it as my normal editor for working on C++ code.&lt;/p&gt;
&lt;p&gt;And heads up, KDevelop is there, too!&lt;/p&gt;
&lt;p&gt;This is actually the second survey, I missed to notice the first one last year.
The &lt;a href="https://isocpp.org/files/papers/CppDevSurvey-2018-02-summary.pdf"&gt;results PDF&lt;/a&gt; from &lt;a href="https://isocpp.org/blog/2018/03/results-summary-cpp-foundation-developer-survey-lite-2018-02"&gt;last year&lt;/a&gt; shows Kate did show up already there.&lt;/p&gt;</description><content:encoded><![CDATA[<p>While browsing the <a href="https://isocpp.org">ISO C++ homepage</a> I stumbled over the <a href="https://isocpp.org/files/papers/CppDevSurvey-2019-04-summary.pdf">results PDF</a> of the <a href="https://isocpp.org/blog/2019/05/results-summary-2019-global-developer-survey-lite">Second Annual C++ Foundation Developer Survey “Lite”</a>.</p>
<p>I was astonished that Kate made it into the &ldquo;Which development environments (IDEs) or editors do you use for C++ development?&rdquo; results.</p>
<p>;=) Seems not only I use it as my normal editor for working on C++ code.</p>
<p>And heads up, KDevelop is there, too!</p>
<p>This is actually the second survey, I missed to notice the first one last year.
The <a href="https://isocpp.org/files/papers/CppDevSurvey-2018-02-summary.pdf">results PDF</a> from <a href="https://isocpp.org/blog/2018/03/results-summary-cpp-foundation-developer-survey-lite-2018-02">last year</a> shows Kate did show up already there.</p>
<p>We shouldn&rsquo;t be that proud of only having less than three percent usage, but still, we are there at all.
I hope we can rise here a bit in the future.</p>
<p>At least we work on supporting modern C++ standards in the highlighting, e.g. see the recent C++20 improvements (<a href="https://phabricator.kde.org/D21585">Phabricator</a> + <a href="https://cgit.kde.org/syntax-highlighting.git/commit/?id=9ba02971123d255c10fca97223538c439e252e3d">Commit</a>). Thanks to Jonathan Poelen for the patch!</p>
<p><a href="/posts/kate-lsp-client-progress/">Language Server Protocol (LSP)</a> would help, too, but my initial work is far from usable, help appreciated.
Beside a hacked &ldquo;goto definition&rdquo; nothing works at the moment (and it is hardcoded to just start clangd, no other LSP server).</p>
]]></content:encoded></item><item><title>KTextEditor/Kate Bugs - Scratch Your Own Itch</title><link>https://cullmann.dev/posts/ktexteditor-kate-bugs-scratch-your-own-itch/</link><pubDate>Sun, 26 May 2019 14:25:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/ktexteditor-kate-bugs-scratch-your-own-itch/</guid><description>&lt;p&gt;Two days ago I mentioned &lt;a href="https://cullmann.dev/posts/ktexteditor-kate-bugs-help-appreciated/"&gt;here&lt;/a&gt; that the bug report count of KTextEditor and Kate has risen to some not that manageable amount.&lt;/p&gt;
&lt;p&gt;For developers that report a bugs or wish, the best way to really get it solved is to scratch your own itch and provide some patch.&lt;/p&gt;
&lt;p&gt;I know this is not feasible for all bug reporters, as not all are developers nor will even the developers all have either time nor perhaps the right skill set to tackle the issue on their own.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Two days ago I mentioned <a href="/posts/ktexteditor-kate-bugs-help-appreciated/">here</a> that the bug report count of KTextEditor and Kate has risen to some not that manageable amount.</p>
<p>For developers that report a bugs or wish, the best way to really get it solved is to scratch your own itch and provide some patch.</p>
<p>I know this is not feasible for all bug reporters, as not all are developers nor will even the developers all have either time nor perhaps the right skill set to tackle the issue on their own.</p>
<p>But if you have the time and you are at least a bit familiar with C++/Qt, you should give it a try.</p>
<p>We can help you to get your patch done, that is much easier for e.g. myself than to motivate me to work on a bug or wish that doesn&rsquo;t concern my normal workflow or lie within my skill set.</p>
<p>For example we have a lot of issues with left-to-right text rendering or related to languages that use complex Unicode surrogates.
Given I have zero knowledge of any language using this my motivation to dig into these issues is small (and I will more likely break more things than fix them).</p>
<p>The same holds for issues in our Vi mode.
I don&rsquo;t use this mode myself nor do I really know how Vi commands shall behave in real life.
Therefore any fix or enhancement there is beyond me.</p>
<p>A good example for such a &ldquo;Scratch Your Own Itch&rdquo; approach is <a href="https://bugs.kde.org/show_bug.cgi?id=407910">bug 407910</a>.</p>
<p>It is a small request, to have some action/shortcut to reset the font size to the default one.
We have since years some zoom in/out actions/shortcuts but nothing to go back to the configured one.</p>
<p>I rarely use the zoom stuff, perhaps once in a month, if I want to show something to a colleague on my screen or projector and it is really not readable with my normal font size.
Therefore my motivation to invest any work into yet an other action I will not use regularly is small.</p>
<p>But, in this case, the reporter had the time to invest a bit work into this.</p>
<p>He provided a patch via our <a href="https://phabricator.kde.org/D21412">KDE Phabricator - D21412</a>.</p>
<p>We needed some iterations to get the patch into a usable shape in the bug report and in Phabricator, but thanks to the persistence of the reporter, it got now <a href="https://cgit.kde.org/ktexteditor.git/commit/?id=968af10fd4b64cccf6a858f105ac6cfad9fce78e">pushed</a> to our repository.</p>
<p>If nobody would have stepped up to provide at least some initial patch for this, such a request for sure would have rotted again in our bug database.</p>
<p>This is not the first time such a nice thing happened, this is just a recent example how such things can work out.</p>
<p>Therefore, if you report something and are capable of given it a try on your own, please do so!</p>
<p>Perhaps even some of the existing <a href="https://bugs.kde.org/buglist.cgi?bug_severity=critical&amp;bug_severity=grave&amp;bug_severity=major&amp;bug_severity=crash&amp;bug_severity=normal&amp;bug_severity=minor&amp;bug_status=UNCONFIRMED&amp;bug_status=CONFIRMED&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;columnlist=bug_severity%2Cpriority%2Cassigned_to%2Cbug_status%2Cresolution%2Ccomponent%2Cshort_desc%2Cchangeddate%2Cop_sys%2Crep_platform%2Creporter&amp;known_name=Kate%2FKWrite%20Bugs&amp;list_id=1625288&amp;product=frameworks-ktexteditor&amp;product=kate&amp;query_based_on=Kate%2FKWrite%20Bugs&amp;query_format=advanced">bugs</a> or <a href="https://bugs.kde.org/buglist.cgi?bug_severity=wishlist&amp;bug_status=UNCONFIRMED&amp;bug_status=CONFIRMED&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;columnlist=product%2Ccomponent%2Cassigned_to%2Cbug_status%2Cresolution%2Cshort_desc%2Cchangeddate%2Creporter%2Creporter_realname&amp;known_name=Kate%2FKWrite%20Wishs&amp;list_id=1625290&amp;product=frameworks-ktexteditor&amp;product=kate&amp;query_based_on=Kate%2FKWrite%20Wishs&amp;query_format=advanced">wishes</a> are stuff you want to take care of yourself because they concern you!</p>
<p>I think not a lot motivates your more to do something than an issue you have with a tool for your workflow.
At least for me that was the reason to at all start the development of Kate (I missed a MDI variant of KWrite) and join the work on stuff like KTextEditor.</p>
]]></content:encoded></item><item><title>KTextEditor/Kate Bugs - Help Appreciated</title><link>https://cullmann.dev/posts/ktexteditor-kate-bugs-help-appreciated/</link><pubDate>Fri, 24 May 2019 16:20:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/ktexteditor-kate-bugs-help-appreciated/</guid><description>&lt;p&gt;The bug report count of KTextEditor (implementing the editing part used in Kate/KWrite/KDevelop/Kile/&amp;hellip;) and Kate itself reached again
some value over 200.&lt;/p&gt;
&lt;p&gt;If you have time and need an itch to scratch, any help to tackle the currently open bugs would be highly appreciated.&lt;/p&gt;
&lt;p&gt;The full list can be found with this &lt;a href="https://bugs.kde.org/buglist.cgi?bug_severity=critical&amp;amp;bug_severity=grave&amp;amp;bug_severity=major&amp;amp;bug_severity=crash&amp;amp;bug_severity=normal&amp;amp;bug_severity=minor&amp;amp;bug_status=UNCONFIRMED&amp;amp;bug_status=CONFIRMED&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;columnlist=bug_severity%2Cpriority%2Cassigned_to%2Cbug_status%2Cresolution%2Ccomponent%2Cshort_desc%2Cchangeddate%2Cop_sys%2Crep_platform%2Creporter&amp;amp;list_id=1624725&amp;amp;order=bug_id%20DESC&amp;amp;product=frameworks-ktexteditor&amp;amp;product=kate&amp;amp;query_based_on=Kate%2FKWrite%20Bugs&amp;amp;query_format=advanced"&gt;bugs.kde.org query&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Easy things anybody with a bit time could do would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;check if the bug still is there with current master builds, if not, close it it&lt;/li&gt;
&lt;li&gt;check if it is the duplicate of a similar still open bug, if yes, mark it as duplicate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beside that, patches for any of the existing issues are very welcome.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The bug report count of KTextEditor (implementing the editing part used in Kate/KWrite/KDevelop/Kile/&hellip;) and Kate itself reached again
some value over 200.</p>
<p>If you have time and need an itch to scratch, any help to tackle the currently open bugs would be highly appreciated.</p>
<p>The full list can be found with this <a href="https://bugs.kde.org/buglist.cgi?bug_severity=critical&amp;bug_severity=grave&amp;bug_severity=major&amp;bug_severity=crash&amp;bug_severity=normal&amp;bug_severity=minor&amp;bug_status=UNCONFIRMED&amp;bug_status=CONFIRMED&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;columnlist=bug_severity%2Cpriority%2Cassigned_to%2Cbug_status%2Cresolution%2Ccomponent%2Cshort_desc%2Cchangeddate%2Cop_sys%2Crep_platform%2Creporter&amp;list_id=1624725&amp;order=bug_id%20DESC&amp;product=frameworks-ktexteditor&amp;product=kate&amp;query_based_on=Kate%2FKWrite%20Bugs&amp;query_format=advanced">bugs.kde.org query</a>.</p>
<p>Easy things anybody with a bit time could do would be:</p>
<ul>
<li>check if the bug still is there with current master builds, if not, close it it</li>
<li>check if it is the duplicate of a similar still open bug, if yes, mark it as duplicate</li>
</ul>
<p>Beside that, patches for any of the existing issues are very welcome.</p>
<p>I think the best guide how to setup some development environment is on our <a href="https://community.kde.org/Guidelines_and_HOWTOs/Build_from_source">KDE Community Wiki</a>.
I myself use a kdesrc-build environment like described there, too.</p>
<p>Patches can be submitted for an review via our <a href="https://phabricator.kde.org/differential/">KDE Phabricator</a>.</p>
<p>If it is just a small change and you don&rsquo;t want to spend time on Phabricator, attaching a git diff versus current master to the bug is ok, too.
Best mark the bug with a <strong>[PATCH]</strong> prefix in the subject.</p>
<p>The team working on the code is small, therefore please be a bit patient if you wait for reactions.
I hope we have improved our reaction time in the last months but we still are lacking in that respect.</p>
]]></content:encoded></item><item><title>Kate LSP Client Progress</title><link>https://cullmann.dev/posts/kate-lsp-client-progress/</link><pubDate>Mon, 13 May 2019 00:02:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-lsp-client-progress/</guid><description>&lt;p&gt;The &lt;a href="https://cgit.kde.org/kate.git/log/?h=lsp"&gt;Kate lsp branch&lt;/a&gt; contains now the infrastructure as used by Qt Creator.
In addition, &lt;a href="https://clang.llvm.org/extra/clangd/"&gt;clangd&lt;/a&gt; is now somehow started in a working state for the first project opened inside Kate.&lt;/p&gt;
&lt;p&gt;For example, if you use the CMake Kate project generator and you compile Kate from the &amp;ldquo;lsp&amp;rdquo; branch, clangd should pick up the compile_commands.json for a CMake generated Kate project.&lt;/p&gt;
&lt;p&gt;;=) Unfortunately not much more than starting and informing clangd about the open workspaces (for the first opened project) works ATM.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The <a href="https://cgit.kde.org/kate.git/log/?h=lsp">Kate lsp branch</a> contains now the infrastructure as used by Qt Creator.
In addition, <a href="https://clang.llvm.org/extra/clangd/">clangd</a> is now somehow started in a working state for the first project opened inside Kate.</p>
<p>For example, if you use the CMake Kate project generator and you compile Kate from the &ldquo;lsp&rdquo; branch, clangd should pick up the compile_commands.json for a CMake generated Kate project.</p>
<p>;=) Unfortunately not much more than starting and informing clangd about the open workspaces (for the first opened project) works ATM.</p>
<p>If you press ALT-1 over some identifier, you will get some debug output on the console about found links, like below:</p>
<blockquote>
<p>qtc.languageclient.parse:   content:  &ldquo;{&quot;id&quot;:&quot;{812e04c6-2bca-42e3-a632-d616fdc2f7d4}&quot;,&quot;jsonrpc&quot;:&quot;2.0&quot;,&quot;result&quot;:[{&quot;range&quot;:{&quot;end&quot;:{&quot;character&quot;:20,&quot;line&quot;:67},&quot;start&quot;:{&quot;character&quot;:6,&quot;line&quot;:67}},&quot;uri&quot;:&quot;file:///local/cullmann/kde/src/kate/kate/katemainwindow.h&quot;}]}&rdquo;</p>
</blockquote>
<p>The current ALT-1 handling is a big hack, as then one just adds the current document and triggers the GotoDefinitionRequest.
A proper implementation tracks the opened/closed documented of the editor.</p>
<p>But at least in principle Kate is now able to start some language server processes and talk a bit with them, all thanks to the nice code borrowed from Qt Creator.</p>
<p>:=) As my spare time is limited, any help in bringing the branch up-to-speed is highly welcome, just drop us a mail to <a href="mailto:kwrite-devel@kde.org">kwrite-devel@kde.org</a> or mail me in private (<a href="mailto:cullmann@kde.org">cullmann@kde.org</a>).
A working LSP integration will help to make Kate more attractive for programmers of many languages.</p>
]]></content:encoded></item><item><title>Kate Language Server Protocol Client</title><link>https://cullmann.dev/posts/kate-language-server-protocol-client/</link><pubDate>Sun, 28 Apr 2019 20:36:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-language-server-protocol-client/</guid><description>&lt;p&gt;The &lt;a href="https://microsoft.github.io/language-server-protocol/overview"&gt;Language Server Protocol (LSP)&lt;/a&gt; allows the integration of stuff like code completion, jump to definition, symbol search and more into an application without manual re-implementation for each language one wants to support.
LSP doesn&amp;rsquo;t fully allow an integration like &lt;a href="https://www.kdevelop.org"&gt;KDevelop&lt;/a&gt; or Qt Creator do with the &lt;a href="https://clang.llvm.org/docs/Tooling.html"&gt;libclang&lt;/a&gt; based tooling aimed for C/C++ but on the other side offers the possibility to interface with &lt;a href="https://langserver.org/#implementations-server"&gt;plenty of languages&lt;/a&gt; without a large effort on the client side.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The <a href="https://microsoft.github.io/language-server-protocol/overview">Language Server Protocol (LSP)</a> allows the integration of stuff like code completion, jump to definition, symbol search and more into an application without manual re-implementation for each language one wants to support.
LSP doesn&rsquo;t fully allow an integration like <a href="https://www.kdevelop.org">KDevelop</a> or Qt Creator do with the <a href="https://clang.llvm.org/docs/Tooling.html">libclang</a> based tooling aimed for C/C++ but on the other side offers the possibility to interface with <a href="https://langserver.org/#implementations-server">plenty of languages</a> without a large effort on the client side.</p>
<p>If one takes a look at some current <a href="https://langserver.org/#implementations-client">LSP clients list</a>, a lot of editors and IDEs have joined the LSP family in the last years.</p>
<p>In the past I was always scared away to start implementing this in Kate, as no readily available library was around to do the low-level work for the client.
Whereas you get some reference stuff for the JSON based protocol for JavaScript and such, for Qt nothing was around.</p>
<p>Fortunately Qt Creator started to implement an LSP client beginning with <a href="https://blog.qt.io/blog/2018/12/06/qt-creator-4-8-0-released/">the 4.8 release</a>.</p>
<p>Based on this code, I started now to get this into the Kate project plugin.
At the moment not much more has happened then some initial import of the Qt Creator LSP infrastructure code into the <a href="https://cgit.kde.org/kate.git/log/?h=lsp">Kate lsp branch</a>.</p>
<p>If I get this working (help is welcome!), any improvements will be submitted back to the Qt Creator implementation.
If it really starts to work well in Kate, one might think about some better code sharing in the long term.
But before such plans, first at least some basic things must work for some initial language server like <a href="https://clang.llvm.org/extra/clangd/">clangd</a>.</p>
]]></content:encoded></item><item><title>Qt Creator 4.9 uses KSyntaxHighlighting</title><link>https://cullmann.dev/posts/qt-creator-4-9-uses-ksyntaxhighlighting/</link><pubDate>Tue, 16 Apr 2019 20:45:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/qt-creator-4-9-uses-ksyntaxhighlighting/</guid><description>&lt;p&gt;As you can read in the &lt;a href="https://blog.qt.io/blog/2019/04/15/qt-creator-4-9-0-released/"&gt;official Creator 4.9.0 release announcement&lt;/a&gt;, Qt Creator now uses the &lt;a href="https://api.kde.org/frameworks/syntax-highlighting/html/index.html"&gt;KSyntaxHighlighting Framework&lt;/a&gt; for providing the &lt;a href="https://doc.qt.io/qtcreator/creator-highlighting.html#generic-highlighting"&gt;generic highlighting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a nice step for the wider adoption of this &lt;a href="https://opensource.org/licenses/MIT"&gt;MIT&lt;/a&gt; licensed part of the &lt;a href="https://api.kde.org/frameworks/index.html"&gt;KDE Frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And this is not just an one-way consumption of our work.&lt;/p&gt;
&lt;p&gt;The framework got actively patches back that make it more usable for other consumers, too, like &lt;a href="https://kate-editor.org"&gt;Kate&lt;/a&gt; ;=)&lt;/p&gt;
&lt;p&gt;If you want concrete examples, take a look at:&lt;/p&gt;</description><content:encoded><![CDATA[<p>As you can read in the <a href="https://blog.qt.io/blog/2019/04/15/qt-creator-4-9-0-released/">official Creator 4.9.0 release announcement</a>, Qt Creator now uses the <a href="https://api.kde.org/frameworks/syntax-highlighting/html/index.html">KSyntaxHighlighting Framework</a> for providing the <a href="https://doc.qt.io/qtcreator/creator-highlighting.html#generic-highlighting">generic highlighting</a>.</p>
<p>This is a nice step for the wider adoption of this <a href="https://opensource.org/licenses/MIT">MIT</a> licensed part of the <a href="https://api.kde.org/frameworks/index.html">KDE Frameworks</a>.</p>
<p>And this is not just an one-way consumption of our work.</p>
<p>The framework got actively patches back that make it more usable for other consumers, too, like <a href="https://kate-editor.org">Kate</a> ;=)</p>
<p>If you want concrete examples, take a look at:</p>
<ul>
<li>D18982: <a href="https://phabricator.kde.org/D18982">prevent assertion in regex load</a></li>
<li>D18996: <a href="https://phabricator.kde.org/D18996">Fix building with namespaced Qt</a></li>
<li>D18997: <a href="https://phabricator.kde.org/D18997">Add functions returning all definitions for a mimetype or file name</a></li>
<li>D19200: <a href="https://phabricator.kde.org/D19200">Return sorted definitions for file names and mime types</a></li>
<li>D19215: <a href="https://phabricator.kde.org/D19215">Install DefinitionDownloader header</a></li>
</ul>
<p>I hope this cooperation will continue in the future.
I thank the people working on Qt Creator that made this integration possible.
I hope the initial effort will pay of with less code for them to maintain on their own and more improvements of the framework for all users.</p>
]]></content:encoded></item><item><title>Removing Files from Git History</title><link>https://cullmann.dev/posts/removing-files-from-git-history/</link><pubDate>Mon, 15 Apr 2019 20:07:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/removing-files-from-git-history/</guid><description>&lt;p&gt;Today I did run again into an old problem:
You need to archive a lot small and large files inside a single Git repository and you have no support for &lt;a href="https://git-lfs.github.com/"&gt;Git LFS&lt;/a&gt; available.
You did this several year and now you ended up in a state where cloning and working with the repository is unbearable slow.&lt;/p&gt;
&lt;p&gt;What now? Last time I did run into that, I archived the overfull repository to some &amp;ldquo;rest in peace&amp;rdquo; space and used &lt;code&gt;git filter-branch&lt;/code&gt; to filter out no longer needed and too large objects from a repository copy that then will replace the old one for daily use.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Today I did run again into an old problem:
You need to archive a lot small and large files inside a single Git repository and you have no support for <a href="https://git-lfs.github.com/">Git LFS</a> available.
You did this several year and now you ended up in a state where cloning and working with the repository is unbearable slow.</p>
<p>What now? Last time I did run into that, I archived the overfull repository to some &ldquo;rest in peace&rdquo; space and used <code>git filter-branch</code> to filter out no longer needed and too large objects from a repository copy that then will replace the old one for daily use.</p>
<p>There are a lot of guides available how to use <code>git filter-branch</code> for that.
All variants I ever used were complex to do and did take very long.
Especially if you need several tries to get a sane set of stuff you want to remove to gain enough space savings.</p>
<p>This time, I searched once more and stumbled on the <a href="https://rtyley.github.io/bfg-repo-cleaner/">BFG Repo-Cleaner</a>.
And yes, it does what it promises on the web site and it seems to be trusted enough to be advertised by e.g. <a href="https://help.github.com/en/articles/removing-sensitive-data-from-a-repository">GitHub</a>, too.</p>
<p>Just following the steps described on their <a href="https://rtyley.github.io/bfg-repo-cleaner/">landing page</a> allows to shrink your stuff nicely and without a lot of round-trip time.</p>
<p>If you still are just in the &ldquo;experimenting&rdquo; phase to see which space decrease one can archive with which file size filter (or which files you want to purge by removing them from master before running the tool), I recommend to swap the step</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git reflog expire --expire<span class="o">=</span>now --all <span class="o">&amp;&amp;</span> git gc --prune<span class="o">=</span>now --aggressive</span></span></code></pre></div>
<p>with just</p>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git reflog expire --expire<span class="o">=</span>now --all <span class="o">&amp;&amp;</span> git gc --prune<span class="o">=</span>now</span></span></code></pre></div>
<p>to not wait potential hours for the aggressive GC.
For me that was good enough to get some estimate of the later size for my experiments before I settled to some final settings and did the real run.</p>
<p>And as always, if you touch your Git history: <strong>Do that only if you really need to, keep backups, check carefully that afterwards the repository is in some sensible state (<code>git fsck --strict</code> is your friend) and inform all people using that repository that they will need to do a full new clone.</strong></p>
]]></content:encoded></item><item><title>Kate History - KDE 4 Porting</title><link>https://cullmann.dev/posts/kate-history-kde-4-porting/</link><pubDate>Fri, 12 Apr 2019 23:52:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/kate-history-kde-4-porting/</guid><description>&lt;p&gt;During my web site upgrade, I reviewed the old stuff I had hosted on my long gone web sites but still archived here locally. An interesting thing I stumbled on are the KDE 3 -&amp;gt; 4 porting screenshots of Kate I saved in 2005.&lt;/p&gt;
&lt;p&gt;They actually show pretty nicely how far we have gone since 2005 with our development stack.&lt;/p&gt;
&lt;p&gt;The KDE 3 -&amp;gt; 4 transition was a large hassle. It did take weeks of work just to get Kate back into an usable state.&lt;/p&gt;</description><content:encoded><![CDATA[<p>During my web site upgrade, I reviewed the old stuff I had hosted on my long gone web sites but still archived here locally. An interesting thing I stumbled on are the KDE 3 -&gt; 4 porting screenshots of Kate I saved in 2005.</p>
<p>They actually show pretty nicely how far we have gone since 2005 with our development stack.</p>
<p>The KDE 3 -&gt; 4 transition was a large hassle. It did take weeks of work just to get Kate back into an usable state.</p>
<p>We first started with some trivial KTextEditor container (a mini KWrite) for the porting to get KTextEditor at all doing something. That started out with something that even had no menu or toolbars working:</p>
<center>



<a href="https://cullmann.dev/posts/kate-history-kde-4-porting/images/katetest-kde4-20050515-more_hu_882df6f08cc074d6.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-history-kde-4-porting/images/katetest-kde4-20050515-more_hu_23a4b65d63258f9d.webp" alt="no menu or toolbars working kde 4" style="border: 0px; border-radius: 8px;" width="640" height="372" />
</a>
</center>

<p>This evolved after two days into a kind of working KWrite port (icons still randomly missing):</p>
<center>



<a href="https://cullmann.dev/posts/kate-history-kde-4-porting/images/katetest-kde4-20050517_hu_e4fe701724d6e537.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-history-kde-4-porting/images/katetest-kde4-20050517_hu_1a3f9968d51cb6ee.webp" alt="kwrite kde 4" style="border: 0px; border-radius: 8px;" width="640" height="457" />
</a>
</center>

<p>After the KTextEditor part did work &ldquo;reasonable&rdquo;, we started with Kate:</p>
<center>



<a href="https://cullmann.dev/posts/kate-history-kde-4-porting/images/kate-kde4-20050519_hu_5a14f8ff0ed48194.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-history-kde-4-porting/images/kate-kde4-20050519_hu_e2637b4ac0aaed83.webp" alt="kate kde 4" style="border: 0px; border-radius: 8px;" width="640" height="578" />
</a>
</center>

<p>And ended up with an initial ported prototype three days later:</p>
<center>



<a href="https://cullmann.dev/posts/kate-history-kde-4-porting/images/kate-kde4-20050522_hu_688350a473935013.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-history-kde-4-porting/images/kate-kde4-20050522_hu_a4838d5354ced449.webp" alt="kate kde 4" style="border: 0px; border-radius: 8px;" width="640" height="481" />
</a>
</center>

<p>And after that a long time of actual polishing for KDE 4.0 did start. Kate was actually one of the first ported applications during the KDE 3 -&gt; 4 transition.</p>
<p>The KDE 4 -&gt; KF5 transition was much nicer, even thought the Frameworks split did cost a lot of time and resources. But the actual changes to the application code bases were not that radical.</p>
<p>And where did we end up with this ~14 years later? Actually, just here:</p>
<center>



<a href="https://cullmann.dev/posts/kate-history-kde-4-porting/images/kate-kf5-20190412_hu_a75e08e732aa1498.webp" target="_new" style="border-bottom: 0px; background-color: inherit;">
    <img fetchpriority="high" src="https://cullmann.dev/posts/kate-history-kde-4-porting/images/kate-kf5-20190412_hu_5e53ea7a8d076633.webp" alt="kate kf5" style="border: 0px; border-radius: 8px;" width="640" height="455" />
</a>
</center>

<p>It is still recognizable the same application, thought I hope some progress is visible :=)</p>
]]></content:encoded></item><item><title>Web-Server Transition</title><link>https://cullmann.dev/posts/webserver-transition/</link><pubDate>Mon, 08 Apr 2019 23:59:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/webserver-transition/</guid><description>&lt;p&gt;Several years the Kate editor &amp;amp; my personal web site got hosted on a &lt;a href="https://www.hetzner.de/"&gt;Hetzner&lt;/a&gt; root server.
To reduce costs and switch away from old hardware they got now moved to an &lt;a href="https://openvz.org/"&gt;OpenVZ&lt;/a&gt; based virtual server at &lt;a href="https://www.hosteurope.de"&gt;Host Europe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On both servers &lt;a href="https://centos.org"&gt;CentOS&lt;/a&gt; 7.x is running, it did always provide a stable foundation for the services these sites use.&lt;/p&gt;
&lt;p&gt;As with any server move in the past, I always need to search how to best move the data/config from one server to the other.
To document this for me and others, here the quick way to move the basic things needed for web services using just plain &lt;a href="https://httpd.apache.org/"&gt;Apache&lt;/a&gt; &amp;amp; &lt;a href="https://mariadb.org/"&gt;MariaDB&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Several years the Kate editor &amp; my personal web site got hosted on a <a href="https://www.hetzner.de/">Hetzner</a> root server.
To reduce costs and switch away from old hardware they got now moved to an <a href="https://openvz.org/">OpenVZ</a> based virtual server at <a href="https://www.hosteurope.de">Host Europe</a>.</p>
<p>On both servers <a href="https://centos.org">CentOS</a> 7.x is running, it did always provide a stable foundation for the services these sites use.</p>
<p>As with any server move in the past, I always need to search how to best move the data/config from one server to the other.
To document this for me and others, here the quick way to move the basic things needed for web services using just plain <a href="https://httpd.apache.org/">Apache</a> &amp; <a href="https://mariadb.org/">MariaDB</a>.</p>
<p>The following steps assume you have installed the same packages on both machines and the new machine is allowed to ssh as root to the old one.
If you have non-system users, you should create them with the same ids as on the old server.</p>
<p>For the following shell commands, the old server address is $SERV and the MariaDB root password is $PASS on both machines.
Best use the raw IP as address if you are in parallel updating your DNS entries to avoid confusion (and wrong syncs).</p>
<p><strong>Attention: Wrong syncing of stuff can have disastrous consequences! Check all commands again before executing them, don&rsquo;t trust random people like me without verification!</strong></p>
<ul>
<li>sync your data, assuming it is in /home and /srv/(ftp/www)</li>
</ul>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rsync --delete -av root@<span class="nv">$SERV</span>:/home/ /home
</span></span><span class="line"><span class="cl">rsync --delete -av root@<span class="nv">$SERV</span>:/srv/ftp /srv
</span></span><span class="line"><span class="cl">rsync --delete -av root@<span class="nv">$SERV</span>:/srv/www /srv</span></span></code></pre></div>
<ul>
<li>transfer your databases</li>
</ul>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh root@<span class="nv">$SERV</span> <span class="s2">&#34;mysqldump -u root -p</span><span class="nv">$PASS</span><span class="s2"> --all-databases &gt; /root/db.sql&#34;</span>
</span></span><span class="line"><span class="cl">scp root@<span class="nv">$SERV</span>:/root/db.sql /root/
</span></span><span class="line"><span class="cl">mysql -u root -p<span class="nv">$PASS</span> &lt; /root/db.sql</span></span></code></pre></div>
<ul>
<li>sync configs (you might need more, this is just apache &amp; vsftp)</li>
</ul>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rsync --delete -av root@<span class="nv">$SERV</span>:/etc/httpd /etc
</span></span><span class="line"><span class="cl">rsync --delete -av root@<span class="nv">$SERV</span>:/etc/letsencrypt /etc
</span></span><span class="line"><span class="cl">rsync --delete -av root@<span class="nv">$SERV</span>:/etc/vsftpd /etc</span></span></code></pre></div>
<ul>
<li>get crontabs over for later re-use, store them in the root home</li>
</ul>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rsync --delete -av root@<span class="nv">$SERV</span>:/var/spool/cron /root</span></span></code></pre></div>
<p>Now all things should be there and after some service restarts e.g. <a href="https://wordpress.org/">WordPress</a> powered pages should be up-and-running again.</p>
<p>I hope this short how-to helps others and allows me to avoid searching stuff in the future once again from scratch.</p>
]]></content:encoded></item><item><title>Privacy and Hugo Themes</title><link>https://cullmann.dev/posts/privacy-and-hugo-themes/</link><pubDate>Sun, 07 Apr 2019 17:10:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/privacy-and-hugo-themes/</guid><description>&lt;p&gt;I use the &amp;ldquo;Hugo Coder&amp;rdquo; theme for this page.&lt;/p&gt;
&lt;p&gt;After creating the &lt;a href="https://cullmann.dev/impressum/"&gt;privacy page (Impressum)&lt;/a&gt;, I did take a closer look at the generated HTML code to confirm I didn&amp;rsquo;t miss to state things there.&lt;/p&gt;
&lt;p&gt;I thought, given Hugo generates plain static HTML pages, I would be on the safe side.&lt;/p&gt;
&lt;p&gt;But unfortunately, the theme I use includes some external resources, like the Google web fonts&amp;hellip;&lt;/p&gt;
&lt;p&gt;I now patched that out of the theme and provide local copies on my own server.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I use the &ldquo;Hugo Coder&rdquo; theme for this page.</p>
<p>After creating the <a href="/impressum/">privacy page (Impressum)</a>, I did take a closer look at the generated HTML code to confirm I didn&rsquo;t miss to state things there.</p>
<p>I thought, given Hugo generates plain static HTML pages, I would be on the safe side.</p>
<p>But unfortunately, the theme I use includes some external resources, like the Google web fonts&hellip;</p>
<p>I now patched that out of the theme and provide local copies on my own server.</p>
<p>The local mirrored files can be found <a href="https://git.babylon2k.com/cullmann/www">here</a>.</p>
<p>Actually, this shows, for a &ldquo;normal&rdquo; user, it is really hard to ensure no privacy violations are on his/her/&hellip; website, given you need to control each and every page.</p>
<p>This is already ugly with static pages, like the stuff generated here (and I hope I missed nothing), but with dynamic websites this is&hellip;</p>
]]></content:encoded></item><item><title>Hugo Extended on CentOS 7</title><link>https://cullmann.dev/posts/hugo-extended-centos-7/</link><pubDate>Sat, 06 Apr 2019 22:55:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/hugo-extended-centos-7/</guid><description>&lt;p&gt;After first using the Hermit theme, I moved to the Hugo Coder theme to have a nicer front page and menu at the top.&lt;/p&gt;
&lt;p&gt;Unfortunately that needs Hugo in the &amp;ldquo;extended&amp;rdquo; version.&lt;/p&gt;
&lt;p&gt;The binary one can download on &lt;a href="https://github.com/gohugoio/hugo/releases"&gt;https://github.com/gohugoio/hugo/releases&lt;/a&gt; doesn&amp;rsquo;t run on CentOS 7, unlike the normal variant you get there (too new libstdc++ needed).&lt;/p&gt;
&lt;p&gt;One has to recompile it to get that working.&lt;/p&gt;
&lt;p&gt;To make it easier for others, to do so, just:&lt;/p&gt;</description><content:encoded><![CDATA[<p>After first using the Hermit theme, I moved to the Hugo Coder theme to have a nicer front page and menu at the top.</p>
<p>Unfortunately that needs Hugo in the &ldquo;extended&rdquo; version.</p>
<p>The binary one can download on <a href="https://github.com/gohugoio/hugo/releases">https://github.com/gohugoio/hugo/releases</a> doesn&rsquo;t run on CentOS 7, unlike the normal variant you get there (too new libstdc++ needed).</p>
<p>One has to recompile it to get that working.</p>
<p>To make it easier for others, to do so, just:</p>
<ul>
<li>install golang + gcc-c++ on your CentOS 7</li>
<li>download <a href="https://github.com/gohugoio/hugo/archive/v0.54.0.tar.gz">https://github.com/gohugoio/hugo/archive/v0.54.0.tar.gz</a></li>
<li>execute in the source directory <code>go install -tags extended</code></li>
<li>grab the result binary in your ~/go directory</li>
</ul>
]]></content:encoded></item><item><title>New Website</title><link>https://cullmann.dev/posts/new-website/</link><pubDate>Sat, 06 Apr 2019 18:18:00 +0200</pubDate><author>christoph@cullmann.dev (Christoph Cullmann)</author><guid>https://cullmann.dev/posts/new-website/</guid><description>&lt;p&gt;After several years of failing to update my personal WordPress page, I restarted my website with the &lt;a href="https://gohugo.io/"&gt;Hugo framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The new website uses zero cookies (yes, no stupid cookie question) and no kind of analytic software.&lt;/p&gt;
&lt;p&gt;I hope my &lt;a href="https://cullmann.dev/impressum/"&gt;Impressum&lt;/a&gt; is done well enough to avoid any legal issues.&lt;/p&gt;
&lt;p&gt;At the moment the website is still very empty, I hope to fill in more content about my open source projects and academic stuff in the near future.&lt;/p&gt;</description><content:encoded><![CDATA[<p>After several years of failing to update my personal WordPress page, I restarted my website with the <a href="https://gohugo.io/">Hugo framework</a>.</p>
<p>The new website uses zero cookies (yes, no stupid cookie question) and no kind of analytic software.</p>
<p>I hope my <a href="/impressum/">Impressum</a> is done well enough to avoid any legal issues.</p>
<p>At the moment the website is still very empty, I hope to fill in more content about my open source projects and academic stuff in the near future.</p>
]]></content:encoded></item></channel></rss>