<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://tcanabrava.github.io/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;tcanabrava.github.io</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It&#x27;s free.</tabi:about_feeds>
        <tabi:visit_the_site>Visit website</tabi:visit_the_site>
        <tabi:recent_posts>Recent posts</tabi:recent_posts>
        <tabi:last_updated_on>Updated on $DATE</tabi:last_updated_on>
        <tabi:default_theme>dark</tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>Tomaz Canabrava Ramblings</tabi:current_section>
    </tabi:metadata><title>Tomaz Canabrava Ramblings</title>
        <subtitle>Somewhat updated list of C++, Qt and KDE bits</subtitle>
    <link href="https://tcanabrava.github.io/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://tcanabrava.github.io" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-09-08T00:00:00+00:00</updated><id>https://tcanabrava.github.io/atom.xml</id><entry xml:lang="en">
        <title>Harmonicon v0.0.11, or, the harmonica I made up</title>
        <published>2026-09-08T00:00:00+00:00</published>
        <updated>2026-09-08T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/harmonicon-v0-0-11/" type="text/html"/>
        <id>https://tcanabrava.github.io/harmonicon-v0-0-11/</id>
        
            <content type="html">&lt;p&gt;I tagged v0.0.11 last night. Or this morning. I’ve stopped keeping track of
which side of midnight things happen on.&lt;&#x2F;p&gt;
&lt;p&gt;Most of what’s in this tag I already went on about on Monday, in the
&lt;a href=&quot;https:&#x2F;&#x2F;tcanabrava.github.io&#x2F;harmonicon-weekly-update&#x2F;&quot;&gt;weekly update&lt;&#x2F;a&gt;: the harp swapping,
the Guitar Pro files, the pitch detectors that turn out not to hear chords. Go
read that one if you want the long version, and it is a long version, I checked.
This is only about the four things that landed after I wrote it.&lt;&#x2F;p&gt;
&lt;p&gt;Four things. Well. Three things, because one of them was me deleting a line out
of a TODO file, and I’m not going to make you read a paragraph about that.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-harmonica-i-made-up&quot;&gt;The harmonica I made up&lt;&#x2F;h2&gt;
&lt;p&gt;So there was this line in my TODO list, and it said my chromatic harmonica was
modelled as reaching less of its range than a diatonic, which is backwards.
Chromatics are the ones that get all the notes. That’s the deal with a
chromatic. You press the little button on the side and you get the notes in
between, that is the entire pitch of the instrument, that’s why it costs four
times as much as the other one.&lt;&#x2F;p&gt;
&lt;p&gt;So I went in to fix it, expecting to add a missing technique somewhere, and what
I found instead was that the layout in my code was not a chromatic harmonica. It
was not a harmonica at all. It was a C major scale going up one note per hole. C
D E F G A B C D E F G, straight up, like somebody had typed a scale into an
array and gone to lunch, which, in fairness, is exactly what happened, and the
somebody was me.&lt;&#x2F;p&gt;
&lt;p&gt;A real 12-hole chromatic is solo tuned. It goes C E G C, then D F A B, and that
four hole group repeats up the instrument for three octaves. That repeating is
the whole point of it. That’s what makes one fingering work in every octave,
that’s the thing you’re buying. Mine repeated nothing. Mine also stopped at A5
instead of C7, so fourteen of the thirty seven semitones between C4 and C7
weren’t reachable at all, on an instrument whose one job is reaching all of
them.&lt;&#x2F;p&gt;
&lt;p&gt;Fourteen out of thirty seven. On the chromatic. The one that gets all the notes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nobody-noticed-and-here-s-the-bad-part&quot;&gt;Nobody noticed, and here’s the bad part&lt;&#x2F;h2&gt;
&lt;p&gt;Now you’d think somebody would have noticed, and here is why nobody did, and
it’s the part that actually bothers me.&lt;&#x2F;p&gt;
&lt;p&gt;Both of the chromatic charts I ship had the made up layout copied into them.
Both of them. So they agreed with the code perfectly, and the code agreed with
them, and everybody in there was consistent and confident and describing an
instrument nobody owns.&lt;&#x2F;p&gt;
&lt;p&gt;One of those two charts, and I want you to appreciate this with me, one of those
two charts is the lesson that teaches you the chromatic slide.&lt;&#x2F;p&gt;
&lt;p&gt;So if you had gone out and bought a real chromatic harmonica, an actual physical
one, made of metal, by a company, and you’d sat down to learn the slide from my
game, the hole numbers would have been wrong. Every one of them. And nothing
anywhere would have told you why, and you would have assumed the problem was
you, because when you’re learning an instrument you always assume the problem is
you, and about nine times in ten you’re right, and this was the tenth time.&lt;&#x2F;p&gt;
&lt;p&gt;Both charts are re-fingered onto the real instrument now. The music didn’t
change, and it couldn’t, because every event already recorded the pitch it
sounds and those pitches were fine. It was only ever the hole numbers that were
imaginary. So I re-resolved each event from its note instead of its hole:
thirty three of them in Für Elise, sixteen in the lesson. Not one note moved.&lt;&#x2F;p&gt;
&lt;p&gt;The slide lesson does now teach ten slides instead of fourteen, because on a
real solo tuned harmonica more of those notes just sit on a plain reed and don’t
need the button. Which is fine. Ten slides is plenty of slides.&lt;&#x2F;p&gt;
&lt;p&gt;And the test that would have caught this doesn’t compare the charts to
themselves, because as established they were extremely happy with themselves. It
compares them against a tuning this codebase can actually build.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-staff-was-lying-too-only-quietly&quot;&gt;The staff was lying too, only quietly&lt;&#x2F;h2&gt;
&lt;p&gt;Two smaller ones, both in the notation strip along the top.&lt;&#x2F;p&gt;
&lt;p&gt;Accidentals were drawn per note instead of per bar. So if a tune leans on one
altered note, and blues tunes do, a second position blues leans on its F# all
day long, you got the same sharp redrawn in front of every single note. Which
looks silly, but it’s worse than silly, because each one is about eleven pixels
wide and an eighth note only has seventeen pixels to give in the first place.&lt;&#x2F;p&gt;
&lt;p&gt;They hold for the rest of the bar now, like they do on paper. And every note
that cancels one gets a real natural sign, because just skipping the repeats
would have left a later plain F in that bar reading as an F#, and I’d have gone
from drawing something redundant to drawing something false, which is a worse
trade than it sounds.&lt;&#x2F;p&gt;
&lt;p&gt;The staff itself was a fixed thirty four pixels per beat, and a notehead plus
the accidental in front of it wants about twenty one, and a sixteenth note was
getting eight and a half. They overlapped. Of course they overlapped. It works
out the spacing from each song’s own density now, with a cap on it, because
otherwise one busy bar shrinks how far ahead you can see down to about a bar and
a half, and then you can’t read the thing at all.&lt;&#x2F;p&gt;
&lt;p&gt;That’s v0.0.11. Still 0.0.x, still early, still on
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tcanabrava&#x2F;harmonicon&quot;&gt;GitHub&lt;&#x2F;a&gt;, still, as of this week, no
longer shipping an instrument that does not exist.&lt;&#x2F;p&gt;
</content>
        <summary type="html">I tagged v0.0.11. Most of it I already wrote about, so this one is mostly about the chromatic harmonica I shipped, which turns out to be an instrument that does not exist and never has.</summary>
        </entry><entry xml:lang="en">
        <title>Harmonicon Weekly Update: any harp, any file</title>
        <published>2026-09-07T00:00:00+00:00</published>
        <updated>2026-09-07T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/harmonicon-weekly-update/" type="text/html"/>
        <id>https://tcanabrava.github.io/harmonicon-weekly-update/</id>
        
            <content type="html">&lt;p&gt;This is a weekly update, which means I did a week of things and now I’m going
to tell you about them, and I should say up front that most of the week went on
two problems that sound small when you write them down. You had to own the
exact harmonica a chart was written for. And the chart had to be in my file
format, the one I invented, the one nobody else has ever written anything in.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-one-harmonica-you-own&quot;&gt;The one harmonica you own&lt;&#x2F;h2&gt;
&lt;p&gt;Here’s the thing about harmonicas. A diatonic is built in one key. Not tuned to
one key, &lt;em&gt;built&lt;&#x2F;em&gt; in it, the reeds are physically cut for it, and if the chart
says C and the harp in your pocket says G then you can’t play that chart. Not
badly, not with effort. You sit there and nothing you do produces the note.&lt;&#x2F;p&gt;
&lt;p&gt;And people learning have one harmonica. One. Whichever one turned up. So the
situation where you open my game, pick a song, and discover it wasn’t written
for the only instrument you own isn’t an edge case, it’s Tuesday.&lt;&#x2F;p&gt;
&lt;p&gt;There are two honest answers to this and they go in opposite directions. You
keep the tab and let the music move: same holes, same breath, different key.
Or you keep the music and let the tab move: same tune, different holes. Both
are defensible, I couldn’t pick, so I built both and put them on a little
screen that turns up after you choose a song.&lt;&#x2F;p&gt;
&lt;p&gt;That screen also tells you the damage. Something like “5 need a bend · 2 need
an overblow · 9 can’t be played”. The nine is the number I built the screen
for. If swapping your harp in quietly eats a fifth of the melody, I’d rather
say it out loud and let you decide than hand you a chart with holes in it and
let you assume you’re the problem.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-test-that-went-looking-for-one-thing&quot;&gt;The test that went looking for one thing&lt;&#x2F;h2&gt;
&lt;p&gt;The remapping code has a property test on it. It walks twelve source keys
against twelve target keys, both harmonica families, every hole, both breath
directions, in both of those modes I just described, and for every single
combination it checks that anything the code calls playable is a pitch that
harmonica can physically produce.&lt;&#x2F;p&gt;
&lt;p&gt;That check is the entire reason the test exists. If it fails, my game is
sitting there listening for a note you cannot make, and then marking you down
for not making it, and you’d have no way of knowing which of you was broken.&lt;&#x2F;p&gt;
&lt;p&gt;It told me I was wrong three times, and each time the code was right, which is
why I wrote a test instead of trusting myself. A G harp is pitched &lt;em&gt;below&lt;&#x2F;em&gt; C,
not above, so G4 sits on hole 4 and not hole 1. A#4 isn’t on an F harp at all,
and I had to go find a Bb before I could test the case I actually wanted. And
transposing a chart onto its own harmonica isn’t the no-op I’d assumed, because
hole 3 blow and hole 2 draw are both G4 on a C harp, so resolving by pitch
alone was quietly rewriting one into the other and telling me it had done
nothing.&lt;&#x2F;p&gt;
&lt;p&gt;But that’s not the interesting part.&lt;&#x2F;p&gt;
&lt;p&gt;The interesting part is that the same test, which I wrote to check
transposition, sat down and told me about a bug that has nothing to do with
transposition at all. The set of notes my scorer will accept from your
microphone was built out of blow reeds, draw reeds and bends. Not overblows.
Not overdraws. On a C harp, seven of the eight over-pitches simply were not in
that set, which means any chart asking for an overblow could never be scored.
Ever. Not once. And nothing on screen would have told you why.&lt;&#x2F;p&gt;
&lt;p&gt;Nobody hit it because none of the charts I ship use one. It was going to sit
there until somebody wrote something advanced, and then it was going to look
like a microphone problem, and they’d have spent an evening buying a better
microphone.&lt;&#x2F;p&gt;
&lt;p&gt;Later in the week I found the same kind of thing pointing the other way. My
table of how far each hole bends had every hole capped at a semitone and a
half, which is just wrong. A bend pulls a reed toward the other reed in the
same hole, so how far you can go is however much room is between them. Three
full semitones on hole 3, which is the note you buy a harmonica in order to
play. Nothing at all on holes 5 and 7. The table says that now, and there’s a
test comparing it against the physical layout, because two descriptions of one
physical fact will come apart eventually and I’d rather find out from CI.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;somebody-else-s-files&quot;&gt;Somebody else’s files&lt;&#x2F;h2&gt;
&lt;p&gt;Harmonicon reads Guitar Pro now, gp3 through gp7, and MuseScore, and MusicXML,
and MIDI. Drop one in a song folder and it gets found and converted and played.&lt;&#x2F;p&gt;
&lt;p&gt;Parsing them was the easy half. The hard half is that a tab file is a whole
band. Bass, comp, melody, usually drums, and I have to work out which of those
you meant. So every track gets converted on its own and fitted to its own
harmonica, because the right harp for a melody is almost never the right harp
for a bass line, and then you get a list telling you what you’d actually be
able to play. “Track 1: 6 notes, 0% playable. Track 2: 100%.”&lt;&#x2F;p&gt;
&lt;p&gt;If a track is called Harmonica it wins automatically, and I learned two
exceptions to that by breaking things. A bass line called Harmonica handed me a
chart with no playable notes in it at all, so being named right no longer beats
being playable. And drum tracks now report zero notes on purpose, because their
frets are drum kit indices, and if you read those as pitches you get a part that
looks entirely reasonable, wins the picker, and then plays nothing whatsoever
resembling the song.&lt;&#x2F;p&gt;
&lt;p&gt;The word “harp” on its own is deliberately not in my list of names to look for.
It matches an orchestral harp. A harp part converted to harmonica is precisely
the unplayable soup the list exists to prevent, and the arithmetic isn’t close:
missing a track called Harp costs you one click, matching a real one costs you
a chart nobody alive can play.&lt;&#x2F;p&gt;
&lt;p&gt;All seven of them sit behind one trait in a new crate, so the next format is a
module and a match arm. It cost more than I wanted. That crate went from 5
dependencies to 94, almost all of it zip and everything zip drags along behind
it. I wrote the tradeoff down and slept on it before deciding, which I mention
because I nearly didn’t, and the thing that decided it was that zip is what
MuseScore and the newer Guitar Pro containers genuinely need, so it buys three
formats rather than propping up one.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;which-of-my-detectors-can-hear-a-chord&quot;&gt;Which of my detectors can hear a chord&lt;&#x2F;h2&gt;
&lt;p&gt;Chord scoring has been in there for ages. It wants every pitch of the chord
present at the same time, which is a reasonable thing to want. What I had never
once checked is whether the pitch detectors can actually deliver it.&lt;&#x2F;p&gt;
&lt;p&gt;So I measured, on a real chord out of a real chart. FFT, which is the default,
hears both notes. NMF hears both notes. YIN, pYIN and MPM hear neither.&lt;&#x2F;p&gt;
&lt;p&gt;And the three that fail don’t fail quietly. pYIN and MPM both report an F4,
confidently, a note which is not in the signal, which simply happens to sit
between the two notes that are. So it isn’t a chord going unscored. It’s a
wrong note strolling into the scorer with its hands in its pockets.&lt;&#x2F;p&gt;
&lt;p&gt;None of which was visible from inside the game. Choosing pYIN in the options
made every chord in every chart unhittable and told you nothing. The picker
says “pYIN, single notes only” now, and if the song you loaded has chords your
detector can’t hear, a banner says so.&lt;&#x2F;p&gt;
&lt;p&gt;While I was in there: unplugging your microphone in the middle of a song used
to leave the game convinced it was still connected. Your notes just stopped
scoring, forever, silently. Which is the exact failure I’d built a warning
overlay for the week before, reachable by the more likely route the entire
time, and I’d like it on the record that I found this myself before anybody
else did.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;three-hundred-gigabytes&quot;&gt;Three hundred gigabytes&lt;&#x2F;h2&gt;
&lt;p&gt;Now this next part isn’t about the game at all and you can skip it, except that
it ate two days, so.&lt;&#x2F;p&gt;
&lt;p&gt;My build directory had reached 300 gigabytes.&lt;&#x2F;p&gt;
&lt;p&gt;Two separate reasons, both boring, both mine. A debug binary was 2.41 GB, of
which about ninety percent was debug information for dependencies I have never
once stepped into. And cargo doesn’t delete the old ones. So there were
ninety-nine files of over a gigabyte each, sitting there, going back to August,
every one of them a complete binary from some build I’d long since stopped
caring about.&lt;&#x2F;p&gt;
&lt;p&gt;A few profile settings and a sweep later a debug binary is 287 MB, and a clean
build plus the entire test suite leaves the whole tree at 7.1 GB.&lt;&#x2F;p&gt;
&lt;p&gt;While I was in the mood I also found the version number written in four
different places that disagreed with each other, which meant the version the
game showed you in Help &#x2F; About was one that no release has ever actually
carried. One script bumps all four now, and CI fails in about three seconds if
the tag and the manifest disagree, rather than after four platform builds have
finished uploading.&lt;&#x2F;p&gt;
&lt;p&gt;So: you can play a chart on the harmonica you own, or on the one it was written
for, and either way it’ll tell you what that’s going to cost you before you
start. And you can hand it a Guitar Pro file, and it’ll work out which part of
the band you meant.&lt;&#x2F;p&gt;
&lt;p&gt;1306 tests passing. Still 0.0.x, still early, still on
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tcanabrava&#x2F;harmonicon&quot;&gt;GitHub&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        <summary type="html">A week on Harmonicon, in which a property test finds a bug that has nothing to do with the property test, a bass line lies about being a harmonica, and my build directory reaches 300 gigabytes.</summary>
        </entry><entry xml:lang="en">
        <title>Harmonicon: a rhythm game you play on a real harmonica</title>
        <published>2026-08-31T00:00:00+00:00</published>
        <updated>2026-08-31T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/introducing-harmonicon/" type="text/html"/>
        <id>https://tcanabrava.github.io/introducing-harmonicon/</id>
        
            <content type="html">&lt;p&gt;For once, something on this blog that isn’t C++.&lt;&#x2F;p&gt;
&lt;p&gt;Harmonicon is a rhythm game for blues harmonica. Notes scroll toward a hit line
and you play on an actual harmonica, into your microphone, and the game listens.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-idea&quot;&gt;The idea&lt;&#x2F;h2&gt;
&lt;p&gt;The harmonica is cheap, fits in a pocket, and it hides everything:
the reeds are inside, your tongue and throat do most of the work,
and nothing about the instrument tells you whether the note that just
came out is the note you meant. You can practise a bend wrong for a
month quite happily.&lt;&#x2F;p&gt;
&lt;p&gt;Let the instrument be the input. Harmonicon captures the microphone, runs pitch
detection on it in real time, and scores what you actually played against the chart.
Every note you score is a note you genuinely hit.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;playing-a-song&quot;&gt;Playing a song&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tcanabrava.github.io&#x2F;introducing-harmonicon&#x2F;play-2d.png&quot; alt=&quot;The 2D play mode: a lane per harmonica hole, with notation and a tab readout above&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The default view is one lane per hole: ten for a diatonic, twelve for a
chromatic, taken from whatever the chart was written for. Blue notes are blows,
orange are draws, and the number on each is the hole you need. Above the lanes
there’s the phrase in standard notation and as harmonica tab, because those are
the two ways harmonica players actually read music, and the panel on the right
tells you which harp to pick up and which position you’re playing in.&lt;&#x2F;p&gt;
&lt;p&gt;There’s also a 3D view, which is the same game rendered around a harmonica model
that moves with the beat.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tcanabrava.github.io&#x2F;introducing-harmonicon&#x2F;play-3d.png&quot; alt=&quot;The 3D play mode: notes travelling down toward an animated harmonica model&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;getting-away-from-charts&quot;&gt;Getting away from charts&lt;&#x2F;h2&gt;
&lt;p&gt;Charts are good for learning a song and bad for learning to play. The Jam
Session mode drops the scoring entirely and gives you a rolling 12-bar blues to
improvise over.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tcanabrava.github.io&#x2F;introducing-harmonicon&#x2F;jam-session.png&quot; alt=&quot;Jam Session: a 12-bar chord grid on the left, a live-tinted hole map on the right&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The useful part is the hole map on the right. As the backing moves through the
bars, each hole recolours: gold if it’s a chord tone of the bar sounding right
now, green if it’s elsewhere in the blues scale, dim if it’s going to sound
wrong. You follow the colour instead of trying to recall theory at tempo, and
the theory arrives later, on its own.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lessons&quot;&gt;Lessons&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;tcanabrava.github.io&#x2F;introducing-harmonicon&#x2F;lessons-list.png&quot; alt=&quot;The lessons list, grouped into units from fundamentals to jazz&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There’s a curriculum underneath all of this, grouped into units and gated by
prerequisites, from getting one clean single note out of the thing, through
bends and articulation, up to improvising over a blues. Some lessons are scored
drills. A few aren’t scoreable at all: tongue blocking sounds identical to
puckering from the microphone’s point of view, so that one is instruction you
mark as done and the game trusts you.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;under-the-hood&quot;&gt;Under the hood&lt;&#x2F;h2&gt;
&lt;p&gt;Rust, with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevyengine.org&#x2F;&quot;&gt;Bevy&lt;&#x2F;a&gt; for the engine and &lt;code&gt;cpal&lt;&#x2F;code&gt; for audio
capture. The interesting problem is the pitch detection, which is why there are
five algorithms to chose from: FFT, YIN, pYIN, MPM and NMF.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;status&quot;&gt;Status&lt;&#x2F;h2&gt;
&lt;p&gt;There’s a lot in it: a bending
trainer, an in-game song editor with MIDI import, adaptive difficulty, A–B
looping, latency calibration, a spectrogram, but “early&#x2F;experimental” is an
honest label rather than modesty.&lt;&#x2F;p&gt;
&lt;p&gt;It’s MIT licensed and the code is at
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tcanabrava&#x2F;harmonicon&quot;&gt;github.com&#x2F;tcanabrava&#x2F;harmonicon&lt;&#x2F;a&gt;.
If you own a harmonica and a microphone, that’s the entire hardware requirement.&lt;&#x2F;p&gt;
</content>
        <summary type="html">For once, something on this blog that isn’t C++.
Harmonicon is a rhythm game for blues harmonica. Notes scroll toward a hit line
and you play on an actual harmonica, into your microphone, and the game listens.
The idea
The harmonica is cheap, fits in a pocket, and it hides everything:
the reeds are inside, your tongue and throat do most of the work,
and nothing about the instrument tells you whether the note that just
came out is the note you meant. You can practise a bend wrong for a
month quite happily.
Let the instrument be the input. Harmonicon captures the microphone, runs pitch
detection on it in real time, and scores what you actually played against the chart.
Every note you score is a note you genuinely hit.
Playing a song

The default view is one lane per hole: ten for a diatonic, twelve for a
chromatic, taken from whatever the chart was written for. Blue notes are blows,
orange are draws, and the number on each is the hole you need. Above the lanes
there’s the phrase in standard notation and as harmonica tab, because those are
the two ways harmonica players actually read music, and the panel on the right
tells you which harp to pick up and which position you’re playing in.
There’s also a 3D view, which is the same game rendered around a harmonica model
that moves with the beat.
…</summary>
        </entry><entry xml:lang="en">
        <title>FOSSASIA 2026: Bangkok, Booths, and the Hallway Track</title>
        <published>2026-03-13T00:00:00+00:00</published>
        <updated>2026-03-13T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/fossasia-2026/" type="text/html"/>
        <id>https://tcanabrava.github.io/fossasia-2026/</id>
        
            <content type="html">&lt;p&gt;I went to FOSSASIA Summit 2026 in Bangkok, and I took the time to write this report because of how much things happened in three days, also because I am not much of a blogger.&lt;&#x2F;p&gt;
&lt;p&gt;FOSSASIA is Asia’s big open source event and this year it took place at True Digital Park West - a rather exageratted shopping mall and convention center, which was great because whenever I was hungry I could just quickly go eat some lovely thai dishes, and back.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;KDE had a community booth, and I spent a fair amount of time there alongside Pongsakorn, who held things down while I was off getting pulled into hallway conversations. We had a few devices on display running Plasma and I got to show off some recent Konsole work to anyone who wandered over.&lt;&#x2F;p&gt;
&lt;p&gt;Some people requested me to show what mattered more to me in KDE, why I was a KDE developer, or why don’t I use $software from a different provider. I explained that KDE is not just about the software, but about the community and the people who contribute to it, but also about the software. There is no other terminal that can do what konsole does (well, now it’s my second favorite terminal, my favorite one is https:&#x2F;&#x2F;ratty-term.org&#x2F;).&lt;&#x2F;p&gt;
&lt;p&gt;The hallway track was, as usual, where a lot of the real conversations happened. One of the more interesting ones was with some developers from OpenKylin. They’re building a Linux distribution and they are using KDE Technology behind it. During our conversation we talked about how to better integrate the OpenKylin distribution with KDE Technology, and I ended up with an invitation to their HQ in shanghai - there will be another blogpost about this.&lt;&#x2F;p&gt;
&lt;p&gt;Bangkok itself was great, but also strangely familiar - all the streets, buildings, and the way people behave fit exactly in the city that I grew up in, Salvador, in Brazil. It was strange to see a country in asia to be &lt;em&gt;so&lt;&#x2F;em&gt; similar to my hometown.
Coming back from a conference like this always leaves me with a mixed feeling: energized by all the conversations and connections, and slightly overwhelmed by the list of things I now want to go and implement or investigate. The OpenKylin conversation got me thinking more about how distributions handle the upstream relationship. And seeing what different communities are building with AI at the OS level was genuinely interesting, even if I’m skeptical of some of the grander claims in the space.&lt;&#x2F;p&gt;
&lt;p&gt;FOSSASIA remains one of the better events to go to if you want a view of what open source looks like outside the European and North American bubble, and we need to connect with other communities to learn from and collaborate with.&lt;&#x2F;p&gt;
</content>
        <summary type="html">I went to FOSSASIA Summit 2026 in Bangkok, and I took the time to write this report because of how much things happened in three days, also because I am not much of a blogger.
FOSSASIA is Asia’s big open source event and this year it took place at True Digital Park West - a rather exageratted shopping mall and convention center, which was great because whenever I was hungry I could just quickly go eat some lovely thai dishes, and back…</summary>
        </entry><entry xml:lang="en">
        <title>The State of KDE Apps and Plasma in Archlinux</title>
        <published>2024-05-09T00:00:00+00:00</published>
        <updated>2024-05-09T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/state-kde-arch/" type="text/html"/>
        <id>https://tcanabrava.github.io/state-kde-arch/</id>
        
            <content type="html">&lt;p&gt;KDE has a symbiotic relationship with many linux distros, since while we develop our software we also use particular versions of linux, I personally use archlinux as my distro of choice for many years being the only distro that I manage to bare for more than six months ( and I believe I am using it for more than 15 years already so that counts).&lt;&#x2F;p&gt;
&lt;p&gt;The “recipe” for packaging KDE software for arch is big, because we are big, and packaging large amounts of software is no easy feat, so me and Antonio Rojas started to update the build scripts to be less manual and less error prone. All the versions of Plasma 6 that have been packaged for arch are using this scripts in one way or another (or manually when we broke everything :)&lt;&#x2F;p&gt;
&lt;p&gt;This work is being done in a separate branch to not break the current workflow, but things are looking good and we hope to merge this in master soon, so that deploying newer versions of KDE software for arch will be a single command, meaning more time for the developers and less time creating packages.&lt;&#x2F;p&gt;
</content>
        </entry><entry xml:lang="en">
        <title>Porting Codevis to KDE</title>
        <published>2023-10-12T00:00:00+00:00</published>
        <updated>2023-10-12T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/porting-codevis-to-kde/" type="text/html"/>
        <id>https://tcanabrava.github.io/porting-codevis-to-kde/</id>
        
            <content type="html">&lt;h1 id=&quot;the-problem-with-c-tooling&quot;&gt;The Problem with C++ Tooling&lt;&#x2F;h1&gt;
&lt;p&gt;An ISO accepted C++ tooling is inexistent, so each project will choose their own toolings based on personal preference, and sometimes, based on Corporations preferences, and unfortunately there’s no common ground on what should be used. There are some programs that got the &lt;code&gt;Standard by consensus&lt;&#x2F;code&gt;, like &lt;code&gt;CMake&lt;&#x2F;code&gt;. But even tough, projects will choose &lt;code&gt;handmade makefiles&lt;&#x2F;code&gt;, &lt;code&gt;KConfig&lt;&#x2F;code&gt;, &lt;code&gt;meson&lt;&#x2F;code&gt;, &lt;code&gt;autotools&lt;&#x2F;code&gt;, and many others exist.&lt;&#x2F;p&gt;
&lt;p&gt;The same thing happens for Package Managers, each Linux distributtion has a variant of packages, and on top of that there’s &lt;code&gt;vcpkg&lt;&#x2F;code&gt;, &lt;code&gt;conan&lt;&#x2F;code&gt; - each one with pros and cons.&lt;&#x2F;p&gt;
&lt;p&gt;The lack of a &lt;code&gt;node&lt;&#x2F;code&gt; or a &lt;code&gt;cargo&lt;&#x2F;code&gt; or a &lt;code&gt;pip&lt;&#x2F;code&gt; that’s the entry point for the language makes it complex for developers to know where to start, and the most common idea is to build what doesn’t exist, or manually install (via &lt;code&gt;git submodules&#x2F;git subtrees&lt;&#x2F;code&gt;) things that are not disponible in your distribution or operating system.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-codevis-started-tools-and-libraries&quot;&gt;How Codevis Started (Tools and Libraries)&lt;&#x2F;h1&gt;
&lt;p&gt;Codevis started as an experiment to see if it would be possible to apply the ideas in the &lt;code&gt;Large Scale C++&lt;&#x2F;code&gt; book by &lt;code&gt;John Lakos&lt;&#x2F;code&gt;. A small proof of concept was created three years ago, and we adopted a lot of libraries to be able to work fast keeping the quality high:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Qt (5 and 6)&lt;&#x2F;li&gt;
&lt;li&gt;soci (database layer used at CERN)&lt;&#x2F;li&gt;
&lt;li&gt;QuaZip (easy access to compressed files)&lt;&#x2F;li&gt;
&lt;li&gt;LLVM and CLang (parsing of C++ files)&lt;&#x2F;li&gt;
&lt;li&gt;Sqlite3 (our actual database)&lt;&#x2F;li&gt;
&lt;li&gt;Doxygen (Documentation)&lt;&#x2F;li&gt;
&lt;li&gt;Python (Plugins)&lt;&#x2F;li&gt;
&lt;li&gt;Catch2 (Tests)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And this is already a fair number of libraries, specially considering that those libraries also depend on others, keeping the Dependency graph quite large.&lt;&#x2F;p&gt;
&lt;p&gt;One problem that we had was to create a CI for all systems we targeted with all those libraries. both of the most common C++ package managers failed us:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;conan&lt;&#x2F;code&gt; did not had LLVM (and we indeed created patches for it, adding missing libraries)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;vcpkg&lt;&#x2F;code&gt; did not had some libraries that we needed, too.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Because of this we had to manually create base CI scripts that would download, compile, install the libraries that were not found on the package managers but this is frail, as any handwritten script is.&lt;&#x2F;p&gt;
&lt;p&gt;We started to look for a new home, and KDE was nice enough to host us. This gave us their amazing CI and buildsystems, that already had all the libraries we used, plus a few more.&lt;&#x2F;p&gt;
&lt;p&gt;So we were able to drop the handwritten scripts for, mostly, llvm.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;why-did-the-change-from-pure-qt-to-kde-frameworks&quot;&gt;Why did the change from Pure Qt to KDE Frameworks?&lt;&#x2F;h1&gt;
&lt;p&gt;When you are inside of a system that works, and that offers powerful and battle tested libraries, it’s worth to try to use them. There are many libraries in the KDE Frameworks that I wanted to use before but it was too hard to bring to windows if I’m not using &lt;code&gt;craft&lt;&#x2F;code&gt;,  resembles to &lt;code&gt;conan&lt;&#x2F;code&gt; and knows how to build libraries and applications within the KDE universe.&lt;&#x2F;p&gt;
&lt;p&gt;Adding the necessary information to build &lt;code&gt;Codevis&lt;&#x2F;code&gt; in craft was much simpler than expected.:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;clone &lt;code&gt;craft-blueprints-kde&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;copy a program template and chagne it’s name&lt;&#x2F;li&gt;
&lt;li&gt;point to the kde repository with a list of libraries it should use&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The full &lt;code&gt;codevis&lt;&#x2F;code&gt; recipe for windows, mac and linux using &lt;code&gt;craft&lt;&#x2F;code&gt; is the following:
Note that every line on runtimeDependencies and buildDependencies are a &lt;code&gt;craft&lt;&#x2F;code&gt; recipe inside of the same repository, so just by searching the folders it’s easy to know what to add for your program.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import info&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;from Packager.CollectionPackagerBase import PackagerLists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class subinfo(info.infoclass):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    def setTargets(self):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.versionInfo.setDefaultValues()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.description = &amp;quot;Codevis is a software to visualize large software architectures.&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.displayName = &amp;quot;Codevis&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.webpage = &amp;quot;http:&#x2F;&#x2F;invent.kde.org&#x2F;sdk&#x2F;codevis&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.svnTargets[&amp;quot;master&amp;quot;] = &amp;quot;http:&#x2F;&#x2F;invent.kde.org&#x2F;sdk&#x2F;codevis.git&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    def setDependencies(self):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.buildDependencies[&amp;quot;kde&#x2F;frameworks&#x2F;extra-cmake-modules&amp;quot;] = None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.runtimeDependencies[&amp;quot;libs&#x2F;llvm&amp;quot;] = None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.runtimeDependencies[&amp;quot;libs&#x2F;zlib&amp;quot;] = None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.runtimeDependencies[&amp;quot;libs&#x2F;catch2&amp;quot;] = None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.runtimeDependencies[&amp;quot;qt-libs&#x2F;quazip&amp;quot;] = None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.runtimeDependencies[&amp;quot;libs&#x2F;runtime&amp;quot;] = None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.runtimeDependencies[&amp;quot;libs&#x2F;qt5&#x2F;qtbase&amp;quot;] = None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;from Package.CMakePackageBase import *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class Package(CMakePackageBase):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    def __init__(self):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        CMakePackageBase.__init__(self)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.subinfo.options.configure.args += [&amp;quot;-DUSE_QT_WEBENGINE=OFF &amp;quot;, &amp;quot;-DCOMPILE_TESTS=OFF &amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    def createPackage(self):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        self.defines[&amp;quot;executable&amp;quot;] = &amp;quot;bin\\codevis_desktop.exe&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return TypePackager.createPackage(self)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;how-easy-is-to-bring-a-50-100k-lines-of-code-to-kde&quot;&gt;How easy is to bring a 50 - 100K lines of code to KDE?&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;We adopted &lt;code&gt;KConfig&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With The build part fixed, it was time to adopt some libraries to remove some handwritten logic we had. I wrote a configuration to c++ parser to easily access configuration keys from .ini format, but this was the only project using it, so why not change to KConfig, that uses a &lt;code&gt;XML&lt;&#x2F;code&gt; based description for settings, and it’s used by almost all programs within the KDE Infrastructure (and it certainly has way more unittests preventing breackages than what I have on my try)&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We adopted &lt;code&gt;KXmlGUI&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;KXMLGui is one of the killer features of the &lt;code&gt;KDE Frameworks&lt;&#x2F;code&gt;. It allow you to split the logic of your interface with a description of &lt;code&gt;Menus&lt;&#x2F;code&gt; and &lt;code&gt;Toolbars&lt;&#x2F;code&gt; in &lt;code&gt;XML&lt;&#x2F;code&gt;, and in runtime it provides some nice features like allowing the user to change the toolbars with any action registered within the system, and a &lt;code&gt;searchable command pallete&lt;&#x2F;code&gt;, that’s something I use in all &lt;code&gt;KDE&lt;&#x2F;code&gt; applications on my machine, and I sure was missing this on Codevis.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We adopted &lt;code&gt;KDocTools&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Documentation is complex, but having an integrated documentation viewer and semantics ready, that could compile into hmtl with integrated search is impressive. Now we just need the time to actually write that documentation…&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We adopted &lt;code&gt;KNewStuff&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;KNewStuff is a technology that integrates with &lt;code&gt;pling.com&lt;&#x2F;code&gt; and allows to distribute certain types of downloadable goodies, like wallpapers - or in our case, &lt;code&gt;plugins&lt;&#x2F;code&gt; to improve the system with things that the main developers didn’t had the time to do yet.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We adopted &lt;code&gt;KNotification&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Since the application takes a while to parse C++ code, or to run some plugins, &lt;code&gt;KNotification&lt;&#x2F;code&gt; is used to send a desktop notification to the user when an action ends. A small feature, but good for UX.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We adopted &lt;code&gt;KTextEditor&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We need to have a place for users to develop plugins for Codevis, so KTextEditor was not a hard choice, it’s the editor that powers up Kate, one of the flagship applications from KDE. Using it has been extremely easy and fast, supporting &lt;code&gt;syntax-highlihting&lt;&#x2F;code&gt; for multiple formats.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;an-honest-and-unbiased-view&quot;&gt;An Honest, and unbiased, view&lt;&#x2F;h1&gt;
&lt;p&gt;The work to port Codevis to use KDE libraries took around 2 weeks, and things were good. No major breakage and just some changes in behavior (mostly for the better). We also helped the KF6 libraries with ideas while discussing on their public channel in Matrix, and patches for some other programs while developing (such as &lt;code&gt;Konsole&lt;&#x2F;code&gt;, &lt;code&gt;Kate&lt;&#x2F;code&gt;, &lt;code&gt;Konversation&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Nothing is perfect, but the outcome was a better, more stable, Codevis and the community was great while helping us understand how to use &#x2F; handle specifics of a library - like &lt;code&gt;KNotification&lt;&#x2F;code&gt; using &lt;code&gt;raw news&lt;&#x2F;code&gt; without a corresponding call to a deleter. This was fixed by a comment on the Documentation stating that it auto-deletes itself.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;should-corporations-adopt-kde-libraries&quot;&gt;Should Corporations Adopt KDE Libraries?&lt;&#x2F;h1&gt;
&lt;p&gt;For sure. The libraries are really high quality, and there are more than 90 of them. &lt;code&gt;Not using&lt;&#x2F;code&gt; something that’s already working and with tests, is a waste of money on the corporation side.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;are-the-devs-happy&quot;&gt;Are the devs Happy?&lt;&#x2F;h1&gt;
&lt;p&gt;Yes, and I would use KDE Frameworks again.&lt;&#x2F;p&gt;
&lt;p&gt;The work for &lt;code&gt;Codevis&lt;&#x2F;code&gt; is sponsored by &lt;code&gt;Bloomberg&lt;&#x2F;code&gt;, and done by &lt;code&gt;Codethink&lt;&#x2F;code&gt; in the open, inside of the KDE Repositories.&lt;&#x2F;p&gt;
</content>
        </entry><entry xml:lang="en">
        <title>Codevis Weekly Update</title>
        <published>2023-10-06T00:00:00+00:00</published>
        <updated>2023-10-06T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/codevis-weekly-update/" type="text/html"/>
        <id>https://tcanabrava.github.io/codevis-weekly-update/</id>
        
            <content type="html">&lt;p&gt;Welcome to the first “Codevis Weekly Update”&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-is-codevis&quot;&gt;What is Codevis?&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;sdk&#x2F;codevis&quot;&gt;Codevis&lt;&#x2F;a&gt; is a tool to help developers manage large codebases, sponsored by Bloomberg, developed by Codethink and hosted on the KDE Infrastructure, with all that, completely opensource with a permissive license. Codevis uses a mix of technologies to do what it does, mainly &lt;code&gt;LLVM and Clang&lt;&#x2F;code&gt; to do the heavy lifting of understanding C++ Codebases, &lt;code&gt;Qt&lt;&#x2F;code&gt; for Callback management (in the form of Signal&#x2F;Slots), &lt;code&gt;KDE Frameworks&lt;&#x2F;code&gt; libraries for the desktop application, and &lt;code&gt;pure Qt&lt;&#x2F;code&gt; for the CLI application. The database layer is written with &lt;code&gt;Soci&lt;&#x2F;code&gt; , the same database layer used in CERN, targeting sqlite3.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;but-how-does-it-work&quot;&gt;But How does it work?&lt;&#x2F;h1&gt;
&lt;p&gt;Codevis analyzes &lt;em&gt;all&lt;&#x2F;em&gt; the &lt;em&gt;visible&lt;&#x2F;em&gt; source code from your project and creates a graph database (using a relational database) in a way that the analyst can load and interpret information from the codebase without loading the codebase. The graph-database is &lt;code&gt;comprehensive&lt;&#x2F;code&gt;, and has all the information we think it’s important, and also a lot of information that’s &lt;code&gt;good to have&lt;&#x2F;code&gt;, with a bunch of information because &lt;code&gt;why not&lt;&#x2F;code&gt;. Since something that’s not important for me could be &lt;em&gt;really&lt;&#x2F;em&gt; important for a company with billions of lines of code.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;it-just-generates-visualization&quot;&gt;It just generates visualization?&lt;&#x2F;h1&gt;
&lt;p&gt;No. Codevis also allows you to &lt;em&gt;draw&lt;&#x2F;em&gt; your software architecture and generate ready-to-compile c++ code from it. Think of this as a possibility to have C++ templates for complex projects tha are also visually documented. You can create libraries, classes, structures, connect them quickly on a dirty mockup during a meeting, and the output could be &lt;code&gt;60 c++ files on disk&lt;&#x2F;code&gt; with all the classes, folder-hierarchy and &lt;code&gt;CMake&lt;&#x2F;code&gt; ready to compile.&lt;&#x2F;p&gt;
&lt;p&gt;This will &lt;em&gt;not&lt;&#x2F;em&gt; add any method or implement anything, but just the creation of the C++ files and CMake scripts from a small architecture meeting is pretty interesting in my point of view.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h1 id=&quot;yeah-but-isn-t-uml-alreday-that&quot;&gt;Yeah, but isn’t UML alreday that?&lt;&#x2F;h1&gt;
&lt;p&gt;No. UML is quite more complex and harder to use for large scale visualization, and the UML code generation doesn’t really takes &lt;code&gt;buildability&lt;&#x2F;code&gt; in mind. You can’t generate an entire project from a UML definition.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;you-say-that-it-s-a-large-scale-but-my-proejct-is-small-it-will-also-help-me&quot;&gt;You say that it’s a large scale, but my proejct is small. it will also help me?&lt;&#x2F;h1&gt;
&lt;p&gt;Codevis will analyze &lt;em&gt;everything&lt;&#x2F;em&gt;, every single include that you use (even if it’s not from your project), helping you decide the best usage for libraries and visualizing the graph with different graph algorithms - making sure that the &lt;code&gt;physical software layout&lt;&#x2F;code&gt; is organized (not just the &lt;code&gt;logical architecture&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;h1 id=&quot;improve-it-with-plugins&quot;&gt;Improve it with Plugins&lt;&#x2F;h1&gt;
&lt;p&gt;We support &lt;code&gt;C++&lt;&#x2F;code&gt; and &lt;code&gt;Python&lt;&#x2F;code&gt; plugins so you can implement things that might be important for your corporation (and by corporation I mean &lt;code&gt;Gnome, KDE, RedHat, Collabora&lt;&#x2F;code&gt;, etc) and integrate the software in ways that the developers didn’t think of.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;ci-integration&quot;&gt;CI integration?&lt;&#x2F;h1&gt;
&lt;p&gt;Imagine that you need to make sure the architecture of the software is stable. Architecture is not something that is easy to do &lt;code&gt;unittests&lt;&#x2F;code&gt; for. it can also be a complex architecture so it’s hard to see if all my new &lt;code&gt;header and source&lt;&#x2F;code&gt; files are implementing (or correctly integrating) into new architecture.&lt;&#x2F;p&gt;
&lt;p&gt;with Codevis you can use the &lt;code&gt;cli&lt;&#x2F;code&gt; tools and extract the code information on a CI step, load the database and run a plugin that checks if the whole architecture of the system is correct, based on heuristics.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;is-everything-you-said-here-production-ready&quot;&gt;Is everything you said here production ready?&lt;&#x2F;h1&gt;
&lt;p&gt;No. This is also an appeal for help. we are developing and we have &lt;em&gt;almost&lt;&#x2F;em&gt; everything here running correcty, some parts are missing, specially, people using and testing is missing. We appreciate if people download, compile, try.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Welcome to the first “Codevis Weekly Update”
What is Codevis?
Codevis is a tool to help developers manage large codebases, sponsored by Bloomberg, developed by Codethink and hosted on the KDE Infrastructure, with all that, completely opensource with a permissive license. Codevis uses a mix of technologies to do what it does, mainly LLVM and Clang to do the heavy lifting of understanding C++ Codebases, Qt for Callback management (in the form of Signal/Slots), KDE Frameworks libraries for the desktop application, and pure Qt for the CLI application. The database layer is written with Soci , the same database layer used in CERN, targeting sqlite3.
But How does it work?
Codevis analyzes all the visible source code from your project and creates a graph database (using a relational database) in a way that the analyst can load and interpret information from the codebase without loading the codebase. The graph-database is comprehensive, and has all the information we think it’s important, and also a lot of information that’s good to have, with a bunch of information because why not. Since something that’s not important for me could be really important for a company with billions of lines of code.
It just generates visualization?
No. Codevis also allows you to draw your software architecture and generate ready-to-compile c++ code from it. Think of this as a possibility to have C++ templates for complex projects tha are also visually documented. You can create libraries, classes, structures, connect them quickly on a dirty mockup during a meeting, and the output could be 60 c++ files on disk with all the classes, folder-hierarchy and CMake ready to compile.
This will not add any method or implement anything, but just the creation of the C++ files and CMake scripts from a small architecture meeting is pretty interesting in my point of view…</summary>
        </entry><entry xml:lang="en">
        <title>Is this still on?</title>
        <published>2023-10-04T00:00:00+00:00</published>
        <updated>2023-10-04T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/is-this-still-on/" type="text/html"/>
        <id>https://tcanabrava.github.io/is-this-still-on/</id>
        
            <content type="html">&lt;p&gt;It’s been a Long long time without posting anything. Not that i’m lazy (well, a bit).
But I have been working on a lot of things related to KDE this past few years, and I was finally able to release and opensource Codevis.
I know this post is as small as a tweet, just checking if the integration is stil working&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;</content>
        <summary type="html">It’s been a Long long time without posting anything. Not that i’m lazy (well, a bit).
But I have been working on a lot of things related to KDE this past few years, and I was finally able to release and opensource Codevis.
I know this post is as small as a tweet, just checking if the integration is stil working…</summary>
        </entry><entry xml:lang="en">
        <title>Konsole in 2021</title>
        <published>2021-12-27T00:00:00+00:00</published>
        <updated>2021-12-27T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/konsole-in-2021/" type="text/html"/>
        <id>https://tcanabrava.github.io/konsole-in-2021/</id>
        
            <content type="html">&lt;p&gt;This year konsole kept the momentum it gained in 2020, and implemented quite
a lot of userful new features. We Finally implemented Reflow, thanks to the
combined effort of me and Carlos Alves - that was one of the most requested
features of konsole for the entire history of the project.&lt;&#x2F;p&gt;
&lt;p&gt;Ahmad Samir fixed &lt;em&gt;tons&lt;&#x2F;em&gt; of issues in konsole, all around the codebase, he’s
the person with most commits on konsole this year, praise to him.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Waqar has been on a spree speeding konsole by a factor of too much - he’s single
handly managed to make scrolling in konsole twice as fast, and we are now almost
as fast as the fastest terminals, and the fastest terminals don’t offer what
konsole offers.&lt;&#x2F;p&gt;
&lt;p&gt;FreeBSD got a bit of love under konsole, too. By the skillfull hands of Adriaan
de Groot, our bsd wizzard.&lt;&#x2F;p&gt;
&lt;p&gt;We also implemented a plugin system for konsole, and the first plugin
implemented is a putty like interface to manage SSH sessions&lt;&#x2F;p&gt;
&lt;p&gt;All in all, we had around 200 commits for konsole this year, and that’s a
pretty good shape - one of the most active projects for terminals all around.&lt;&#x2F;p&gt;
</content>
        <summary type="html">This year konsole kept the momentum it gained in 2020, and implemented quite
a lot of userful new features. We Finally implemented Reflow, thanks to the
combined effort of me and Carlos Alves - that was one of the most requested
features of konsole for the entire history of the project.
Ahmad Samir fixed tons of issues in konsole, all around the codebase, he’s
the person with most commits on konsole this year, praise to him…</summary>
        </entry><entry xml:lang="en">
        <title>KConfigXT Alternative Generator</title>
        <published>2021-09-20T00:00:00+00:00</published>
        <updated>2021-09-20T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/kconfig-alternate/" type="text/html"/>
        <id>https://tcanabrava.github.io/kconfig-alternate/</id>
        
            <content type="html">&lt;p&gt;I’m using for my own personal projects a generator for c++ preferences for quite a while, I’ll not say that it’s heavily tested as KConfigXT is, but it is also &lt;em&gt;much&lt;&#x2F;em&gt; more simple than it.&lt;&#x2F;p&gt;
&lt;p&gt;While talking about it to a fellow developer he asked me how hard it would be to port the thing to KConfig (as the main backend I used was QSettings) - and the result is quite nice, the port toook
less than a day, and now my generator generates configurations for both KConfig and QSettings.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Example configuration:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;preferences.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;QString&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;QStandardPaths&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Preferences {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    General {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        int beatsPerMinute = 60&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Some {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Inner {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            Group {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                int value = 10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Harmonica {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        QString partitureFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For those that worked with KConfigXT, it’s easy to see how much this is different from the xml that the tool uses. And differently from KConfigXT, the code is smaller, easier to read, and does not rely on magic enums, nor it has a lot of different possibilities to fine tune the settings - if you want to choose between runtime or compile time file, shared vs non shared config, etc.: KConfigXT is for you, mine is supposed to be simple and up to the point.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;That Preferences will generate all the corresponding C++ classes with the needed boilerplate for a Qt application to handle settings, in a safe way - no more strings for keys on code.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Preferences::self()-&amp;gt;some()-&amp;gt;inner()-&amp;gt;group()-&amp;gt;setValue(15);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Preferences::self()-&amp;gt;general()-&amp;gt;setBeatsPerMinute(10);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;All of the preferences are exported as Q_PROPERTIES using &lt;code&gt;snake_case&lt;&#x2F;code&gt;
so you use it directly on Qml.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SomeQmlElement {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    width: preferences.window.width&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you want to set specific rules to the Preferences values, this is done in c++, using the &lt;code&gt;setRule&lt;&#x2F;code&gt; variants of the settings:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;int main(int argc, char *argv[]) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   QApplication app(argc, argv);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Preferences::self()-&amp;gt;some()-&amp;gt;inner()-&amp;gt;group()-&amp;gt;setValueRule([](int value) { return value &amp;lt; 90; });&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The defaut values can be queried with &lt;code&gt;Default&lt;&#x2F;code&gt; variants:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Preferences::self()-&amp;gt;some()-&amp;gt;inner()-&amp;gt;group-&amp;gt;valueDefault();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There’s no code to automatically handle ui files, like KConfigXT, nor there will be. create your connects by hand using this.&lt;&#x2F;p&gt;
&lt;p&gt;The source is at https:&#x2F;&#x2F;github.com&#x2F;tcanabrava&#x2F;configuration-parser
Currently the build produces two binaries: one for qsettings, one for kconfig.&lt;&#x2F;p&gt;
&lt;p&gt;(if anyone is better at cmake than myself, I’d appreicate some help on ConfigurationCompiler.cmake, as it’s not correctly generating the targets on a 3rd party project)&lt;&#x2F;p&gt;
</content>
        <summary type="html">I’m using for my own personal projects a generator for c++ preferences for quite a while, I’ll not say that it’s heavily tested as KConfigXT is, but it is also much more simple than it.
While talking about it to a fellow developer he asked me how hard it would be to port the thing to KConfig (as the main backend I used was QSettings) - and the result is quite nice, the port toook
less than a day, and now my generator generates configurations for both KConfig and QSettings.

Example configuration:

preferences.conf

#include &lt;QString&gt;
#include &lt;QStandardPaths&gt;

Preferences {
    General {
        int beatsPerMinute = 60
    }
    Some {
        Inner {
            Group {
                int value = 10
            }
        }
    }
    Harmonica {
        QString partitureFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)
    }
}

For those that worked with KConfigXT, it’s easy to see how much this is different from the xml that the tool uses. And differently from KConfigXT, the code is smaller, easier to read, and does not rely on magic enums, nor it has a lot of different possibilities to fine tune the settings - if you want to choose between runtime or compile time file, shared vs non shared config, etc.: KConfigXT is for you, mine is supposed to be simple and up to the point…</summary>
        </entry><entry xml:lang="en">
        <title>Konsole in 2020</title>
        <published>2020-06-16T00:00:00+00:00</published>
        <updated>2020-06-16T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/konsole-in-2020/" type="text/html"/>
        <id>https://tcanabrava.github.io/konsole-in-2020/</id>
        
            <content type="html">&lt;p&gt;Konsole is having a resurge in the moment, it’s the terminal emulator of choice
for the power user that wants to break the 4th wall in *nix systems. Right now
it can do almost all the things I want it to do, and a few more.&lt;&#x2F;p&gt;
&lt;p&gt;Since last year you can use splits in Konsole, with full drag &amp;amp; drop support
between tabs and windows.&lt;&#x2F;p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;f9Y1pul8smQ&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;You can also use Konsole to quickly check for thumbnails of anything that dolphin
can show you, just by hovering with the mouse (and depending of your configuration)
pressing shift&#x2F;control&#x2F;alt. To my knowledge Konsole is the only terminal emulator
that supports this.&lt;&#x2F;p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;8lic9xKG4lo&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Probably you already used &lt;code&gt;ls&lt;&#x2F;code&gt; to list a file that you need to get the full url,
to open in an unrelated program that does not accept the common way to open files
via the shell, and you need to paste into a dialog, or you just need to send the
full path of a file for a project colleague. I had problems with this untill I
snapped and implemented a way for konsole to &lt;code&gt;Copy Location&lt;&#x2F;code&gt;, it copies the full
file path of the selected file, and adds this data to your clipboard.&lt;&#x2F;p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;z11WRTM35Nc&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Konsole supported for quite a while a way for you to click in a file and open it
in a the default editor (you need to have this configured in the profile) - but
sometimes we don’t want to open it in the default file, we wan’t to visualize
a image in gwenview or edit it in gimp, so now konsole supports a &lt;code&gt;Open With&lt;&#x2F;code&gt; menu
quite helpful when you don’t remember the name of the app you want to use but
remember the icon. :)&lt;&#x2F;p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;iUhftcLEfXo&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Now a few features I’m working that I expect that will be ready for the next
version of konsole, those are still in review and I don’t know when they will
be ready, it’s just a sneak peek:&lt;&#x2F;p&gt;
&lt;p&gt;Configurable dimm stength for inactive terminals - when you are working with
split views and many terminals, there’s a option in the profile that makes the
terminals without focus darker, so it’s easier to know which terminal you are,
but it was not possible to configure the amount of darkening - and different
people have different needs, so now you can do this: (&lt;em&gt;not merged yet&lt;&#x2F;em&gt;)&lt;&#x2F;p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;dx8B6mJqVhU&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Improved broadcast support - Konsole already supported this, but it did not play
well with splits, and it was not really easy to integrate multiple windows. How
you can now select what kind of broadcast group a terminal belongs to, any
terminal that belongs to the same group will send data to it, there’s also a
None group - for terminals that should not send data anywhere, and a &lt;code&gt;Broadcast to All&lt;&#x2F;code&gt; groups, that will push data everywhere - despite being in the group or
not. (&lt;em&gt;not merged yet&lt;&#x2F;em&gt;)&lt;&#x2F;p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;PmI-t-nGsKs&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Support for URL Escape Codes. There’s a spec that specifies how a terminal
application can embbed a URL inside of a block of text, by using the special
notation: &lt;code&gt;\e]8;;http:&#x2F;&#x2F;www.kde.org\e\\click here\e]8;;\e\\\n&lt;&#x2F;code&gt; this is equivalent
to the html code &lt;code&gt;&amp;lt;a href=&quot;http:&#x2F;&#x2F;www.kde.org&amp;gt; click here &amp;lt;&#x2F;a&amp;gt;&lt;&#x2F;code&gt; and there’s a
work in progress implementation for that in the works (featuring a VIP list of
accepted schemas, currently only file, http and https are allowed, but the user
can overrite)&lt;&#x2F;p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;R_caJmf142Y&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Those are all of the features that I worked (minus &lt;em&gt;tons&lt;&#x2F;em&gt; of bugfixes, security
improvements and general rewrites that are unrelated to new features). I hope
you all enjoy the new konsole, that is still one of the fastest terminal
emulators around, even tough it’s packed with features for the experienced and
novice user.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Konsole is having a resurge in the moment, it’s the terminal emulator of choice
for the power user that wants to break the 4th wall in *nix systems. Right now
it can do almost all the things I want it to do, and a few more.
Since last year you can use splits in Konsole, with full drag &amp; drop support
between tabs and windows.

    

You can also use Konsole to quickly check for thumbnails of anything that dolphin
can show you, just by hovering with the mouse (and depending of your configuration)
pressing shift/control/alt. To my knowledge Konsole is the only terminal emulator
that supports this.

    
…</summary>
        </entry><entry xml:lang="en">
        <title>Konsole and Splits</title>
        <published>2019-06-27T00:00:00+00:00</published>
        <updated>2019-06-27T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/konsole-splits/" type="text/html"/>
        <id>https://tcanabrava.github.io/konsole-splits/</id>
        
            <content type="html">&lt;p&gt;Some terminals like Tilix and Terminator offers the possibility to split the screen recursively, and I started to add the same thing to konsole. Konsole is usually said to be the swiss army knife of the terminal emulators, and if you didn’t try it yet, please do. We offer quite a lot of things that no other terminal emulator offer.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Rigth now this code is in review but it currently supports quite a few things:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Allow to Drag &amp;amp; drop the tab to create a new window of konsole&lt;&#x2F;li&gt;
&lt;li&gt;Allow to Drag &amp;amp; drop the tab back into another window&lt;&#x2F;li&gt;
&lt;li&gt;Allow to Drag &amp;amp; drop a split to reposition it in the current tab&lt;&#x2F;li&gt;
&lt;li&gt;Allow to Drag &amp;amp; drop a split to another tab&lt;&#x2F;li&gt;
&lt;li&gt;Allow to Drag &amp;amp; drop a split to another window (if in the same process)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&quot;&gt;
    &lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;f9Y1pul8smQ&quot;
            style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot;
            title=&quot;YouTube video player&quot;
            loading=&quot;lazy&quot;
            allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Expect this to be in the next version of konsole if all goes well.
Help to test, help to find bugs, Help to test, help to find bugs.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Some terminals like Tilix and Terminator offers the possibility to split the screen recursively, and I started to add the same thing to konsole. Konsole is usually said to be the swiss army knife of the terminal emulators, and if you didn’t try it yet, please do. We offer quite a lot of things that no other terminal emulator offer…</summary>
        </entry><entry xml:lang="en">
        <title>Konsole and Wayland</title>
        <published>2019-06-18T00:00:00+00:00</published>
        <updated>2019-06-18T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/konsole-wayland/" type="text/html"/>
        <id>https://tcanabrava.github.io/konsole-wayland/</id>
        
            <content type="html">&lt;p&gt;Wayland needs a different mindset when you are programming, you cannot just assume things works the same way as in as X11. One of my first patches to konsole was the rewrite of the Tab Bar, and a different way to deal with Drag &amp;amp; Drop of the tabs. In my mind - and how wrong I was - I could assume that I was dragging to a konsole main window by querying the widget below the mouse.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;Nope, this will not work. As Wayland has security by default, it will not give you anything global. What if I was a spy app trying to record another one to send to NSA? Security in Wayland is much stricter, and because of that I had to redo my drag &amp;amp; drop patch.&lt;&#x2F;p&gt;
&lt;p&gt;Konsole &lt;em&gt;should&lt;&#x2F;em&gt; work now with drag &amp;amp; drop of tabs in Wayland, as soon as the patch hits master. I also have other patches waiting that will make the wayland transition smoother, I’ll write about them in due time.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Wayland needs a different mindset when you are programming, you cannot just assume things works the same way as in as X11. One of my first patches to konsole was the rewrite of the Tab Bar, and a different way to deal with Drag &amp; Drop of the tabs. In my mind - and how wrong I was - I could assume that I was dragging to a konsole main window by querying the widget below the mouse…</summary>
        </entry><entry xml:lang="en">
        <title>The state of Terminal Emulators in Linux</title>
        <published>2019-06-15T00:00:00+00:00</published>
        <updated>2019-06-15T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/the-state-of-terminals-in-linux/" type="text/html"/>
        <id>https://tcanabrava.github.io/the-state-of-terminals-in-linux/</id>
        
            <content type="html">&lt;p&gt;We are seeing a strange trend nowadays: The terminal is being more widely used in windows, after they fixed the broken cmd.exe and MS is actually actively promoting their terminal applications like Visual Studio Code and the new Windows Terminal, but on the other hand the Unix world was always terminal based, even if you tend to use the Desktop Environment for your daily needs you probably also had a Terminal open somewhere.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;And because we had always been terminal users, there are a lot of terminals for Linux, But it’s not easy to keep a terminal up to date, it’s usually fragile code and hard to maintain, that means that a lot of projects, good projects, are abandoned.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;good-terminals-that-unfortunately-didn-t-make-it&quot;&gt;Good terminals that unfortunately didn’t make it&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Tilix: Is one of the best terminal emulators out there, it’s a shell written in D, on top of VTE, the author lacks the time to continue working on it.&lt;&#x2F;li&gt;
&lt;li&gt;Terminator: I don’t know if this one is abandoned as there’s no news on the web about it, the news that I know is that version 2 is scheduled for release in 2017, never happened though.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;If you are sad that your favorite terminal is without a maintainer, try to maintain it, free software depends on developers.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-state-of-konsole&quot;&gt;The state of Konsole:&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Konsole is receiving more reviews, more code and more contributors in the last year than it got in the past 10 years.&lt;&#x2F;li&gt;
&lt;li&gt;In the past, the project is kept alive by Kurt, and he did an awesome job. But a project as big as konsole needs more people.&lt;&#x2F;li&gt;
&lt;li&gt;Three new developers joined konsole and are activelly fixing things over the past year, no plans to stop.&lt;&#x2F;li&gt;
&lt;li&gt;Terminator &#x2F; Tilix split mode is working&lt;&#x2F;li&gt;
&lt;li&gt;A few features to be completely equal to minix &#x2F; terminator is missing, but not hard to implement&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Now it has more developers and more code flowing, fixing bugs, improving the interface, increasing the number of lines of code flowing thru the codebase. We don’t plan to stop supporting konsole, and it will not depend on a single developer anymore.&lt;&#x2F;p&gt;
&lt;p&gt;We want konsole to be the swiss army knife of terminal emulators, you can already do with konsole a lot of things that are impossible in other terminals, but we want more. And we need more developers for that.&lt;&#x2F;p&gt;
&lt;p&gt;Konsole is, together with VTE, the most used terminal out there in numbers of applications that integrate the technology: Dolphin, Kate, KDevelop, Yakuake, and many other applications also use konsole, so fixing a bug in one place we are helping a lot of other applications too.&lt;&#x2F;p&gt;
&lt;p&gt;Consider joining a project, Consider sending code.&lt;&#x2F;p&gt;
</content>
        <summary type="html">We are seeing a strange trend nowadays: The terminal is being more widely used in windows, after they fixed the broken cmd.exe and MS is actually actively promoting their terminal applications like Visual Studio Code and the new Windows Terminal, but on the other hand the Unix world was always terminal based, even if you tend to use the Desktop Environment for your daily needs you probably also had a Terminal open somewhere…</summary>
        </entry><entry xml:lang="en">
        <title>Hello new Konsole</title>
        <published>2019-06-05T00:00:00+00:00</published>
        <updated>2019-06-05T00:00:00+00:00</updated>
        <author>
            <name>Tomaz Canabrava</name>
        </author>
        <link rel="alternate" href="https://tcanabrava.github.io/hello-new-konsole/" type="text/html"/>
        <id>https://tcanabrava.github.io/hello-new-konsole/</id>
        
            <content type="html">&lt;p&gt;Konsole has been ready for many many years, and got almost 10 years without anything really exciting being added, mostly because the software is ready, why should we modify something that works to add experimental features?&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;But then the reality kicked in, konsole missed some features that are quite nice and existed in Terminator, Tilix and other new terminals, but Tilix now lacks a developer, and Terminator is also not being actively developed (with the last release being it in 26 of February of 2017)&lt;&#x2F;p&gt;
&lt;p&gt;Konsole is tougth as a powerhouse of the terminal emulators, having too many things that are quite specific for some use cases, and it’s really tricky to remove a feture (even when it’s half-broken) because some people do rely in that behavior, so my first idea is to modernize the codebase so I can actually start to code.&lt;&#x2F;p&gt;
&lt;p&gt;It’s been around one year that I send patches regularly to Konsole now, and I don’t plan to stop.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Konsole has been ready for many many years, and got almost 10 years without anything really exciting being added, mostly because the software is ready, why should we modify something that works to add experimental features?…</summary>
        </entry>
</feed>
