-
Notifications
You must be signed in to change notification settings - Fork 0
/
feed.xml
566 lines (519 loc) · 48.7 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >
<title type="html">Open Source C++ developer’s journal</title>
<!--<subtitle>C++ developer's journal</subtitle>-->
<updated>2021-11-18T15:00:23+02:00</updated>
<id>https://ahmadsamir.github.io/feed.xml</id>
<author><name>Ahmad Samir</name></author>
<link href="https://ahmadsamir.github.io/feed.xml" rel="self" type="application/atom+xml" />
<link href="https://ahmadsamir.github.io/" rel="alternate" type="text/html" />
<entry>
<title type="html">The Nouveau driver seems to work</title>
<link href="https://ahmadsamir.github.io/posts/nouveau.html" rel="alternate" type="text/html" title="The Nouveau driver seems to work" />
<id>https://ahmadsamir.github.io/posts/nouveau.html</id>
<updated>2021-11-18T00:00:00+02:00</updated>
<published>2021-11-18T00:00:00+02:00</published>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/nouveau.html"><p>I've had an nvidia graphics card for the past 8 years (and nvidia gtx770), I usually alternate between the nvidia proprietary driver and the nouveau open-source driver, i.e. there is a problem in one, I try the other. But I used the proprietary driver more than the nouveau driver, the latter usually performed worse than it's binary-blob-corporate-jailed driver.</p>
<p>Recently I found that the latest nvidia proprietary driver will finally get GBM support instead of the EGLStream that it currently has (AFAIK, all the other gfx drivers in Linux use GBM, except for nvidia), but... in typical nvidia fashion, they also decided to drop support for older cards, and my card falls into that group, so again, thank you nvidia! again!</p>
<p>That irked me, so I decided to try using the nouveau driver again; it looks like one of the reasons it always did badly in my current distro is that I didn't have the libdrm_nouveau2 package installed (it's likely that it was installed by default and then I removed it). Once I installed that it seemed to work much better (<code>glxinfo</code> is actually a very useful tool).</p>
<p>But it still felt a bit &quot;slower&quot; than the proprietary driver, I tried tweaking the compositor settings in Plasma (systemsettings -&gt; Display and Monitor -&gt; Compositor), and here is what worked for me:</p>
<ul>
<li>&quot;Keep Window Thumbnails&quot;: &quot;Never&quot;</li>
<li>&quot;Tearing Prevention (vsync)&quot;: &quot;Only when cheap&quot;</li>
</ul>
<p>for what it's worth, setting the vsync option to &quot;only when cheap&quot; I still don't see any tearing, but it seemed to improve the performance quite a bit.</p>
<p>It seemed to work, apart from some hard system locks (not too frequent, but still annoying), thankfully it looked like a viable option.</p>
<p>Then I started wondering if there is a way to change the &quot;performance level&quot;, which is an option in the nvidia-settings GUI tool for the proprietary driver; as far as I understand it changes the clock speeds of the various components in the hardware. The proprietary driver could change those levels dynamically based on the load on the system.</p>
<p>It turns out, I can actually change the &quot;performance level&quot; with the nouveau driver too (I'll post a link to the sources I found at the end).</p>
<p>Someone had sent me an email to kindly point out that someone reading my blog posts could try the stuff I post about, which is a fair point; so here is a disclaimer, try the following at your own risk, and after you've done your own research.</p>
<p>With that out of the way, here we go:</p>
<ul>
<li>to check the available clock speed levels of the card I used:</li>
</ul>
<pre>
# cat /sys/kernel/debug/dri/0/pstate
07: core 405 MHz memory 648 MHz
0a: core 405-1032 MHz memory 1620 MHz
0e: core 405-1202 MHz memory 7010 MHz
0f: core 405-1202 MHz memory 7010 MHz AC DC
AC: core 1058 MHz memory 7009 MHz
</pre>
<ul>
<li>I tested by changing to the <code>0f</code> state, and it seemed to work:</li>
</ul>
<pre>
# echo 0f > /sys/kernel/debug/dri/0/pstate
# cat /sys/kernel/debug/dri/0/pstate
07: core 405 MHz memory 648 MHz
0a: core 405-1032 MHz memory 1620 MHz
0e: core 405-1202 MHz memory 7010 MHz
0f: core 405-1202 MHz memory 7010 MHz AC DC *
AC: core 1058 MHz memory 7009 MHz
</pre>
<p>I tried glmark2 (a benchmarking tool available for Linux), and it gave a score of ~100 before this change and ~1000 afterwards, whatever that score means. And indeed the system seems/feels better.</p>
<ul>
<li>To make the change permanent, you need to add this to the kernel cmdline (the kernel command line parameters don't support hex values, so I used <code>15</code>, which is the decimal equivalent of the hex value <code>0x0f</code>):</li>
</ul>
<pre>
nouveau.config=NvClkMode=15
</pre>
<p>On my distro, I had to edit <code>/etc/default/grub</code> and add that string to GRUB_CMDLINE_LINUX_DEFAULT:</p>
<pre>
GRUB_CMDLINE_LINUX_DEFAULT="nouveau.config=NvClkMode=15"
</pre>
<p>then as root, I executed <code>grub2-mkconfig</code> to update the boot entries (check your distro's documentation).</p>
<p>Now my system is running &quot;well&quot;; sure, there is no dynamic management of the performance levels, but I'd rather crank it up to the top level, than suffer the slowness and performance hit.</p>
<p>Sources:</p>
<ul>
<li><a href="https://nouveau.freedesktop.org/KernelModuleParameters.html">https://nouveau.freedesktop.org/KernelModuleParameters.html</a></li>
<li><a href="https://nouveau.freedesktop.org/FeatureMatrix.html">https://nouveau.freedesktop.org/FeatureMatrix.html</a></li>
<li><a href="https://www.reddit.com/r/linux/comments/k5fa93/found_a_guide_on_how_to_reclock_nvidia_cards_at/">https://www.reddit.com/r/linux/comments/k5fa93/found_a_guide_on_how_to_reclock_nvidia_cards_at/</a></li>
</ul>
</content>
<author><name>Ahmad Samir</name></author>
<summary type="html">I've had an nvidia graphics card for the past 8 years (and nvidia gtx770), I usually alternate between the nvidia proprietary driver and the nouveau open-source driver, i.e. there is a problem in one, I try the other. But I used the proprietary driver more than the nouveau driver, the latter usually performed worse than it's binary-blob-corporate-jailed driver.</summary>
</entry>
<entry>
<title type="html">ninja Build system, and renamed files</title>
<link href="https://ahmadsamir.github.io/posts/ninja-build-system-tip.html" rel="alternate" type="text/html" title="ninja Build system, and renamed files" />
<published>2021-10-16T00:00:00+02:00</published>
<updated>2021-10-16T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/ninja-build-system-tip</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/ninja-build-system-tip.html"><p>I've been hearing about <code>ninja</code>, I had looked at it some time in the past, and did some local basic benchmarking (using <code>time</code>), and didn't find a huge difference in build times, both from scratch and incrementally. I tried ninja again recently and found one feature that sells it pretty well to me, it can show the build progress on one line in the terminal.</p>
<p>So I switched to <code>ninja</code> to see how that goes, seems to work OK, but a new tool, new quirks, right? :).</p>
<p>I happened to be using git interactive rebase, and so was jumping between commits, some files were renamed (with <code>git mv</code>), that's when ninja failed to build incrementally, clearing the build dir and starting anew, worked fine. But incremental builds are very useful, otherwise the waiting times between the usual &quot;modify code, compile, test, repeat&quot; cycles would be longer, and those waiting times aren't my favourite pastime. The workaround turned out to be simple, <code>touch CMakeLists.txt</code> file in the top source dir, then run ninja again and it should pick up the changes.</p>
<p>FWIW, that <code>touch CMakeLists.txt</code> method works too if say, you built KIO against some other Framework's libfoo.so.n, then libfoo.so.n was updated to .n+1, which would make the incremental build fail (with <code>make</code> at least, haven't seen that with <code>ninja</code> (yet?)), touch the file, and it picks up the changes (probably since it will check the build dependencies again).</p>
<p>Have fun hacking at code.</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">I've been hearing about ninja, I had looked at it some time in the past, and did some local basic benchmarking (using time), and didn't find a huge difference in build times, both from scratch and incrementally. I tried ninja again recently and found one feature that sells it pretty well to me, it can show the build progress on one line in the terminal.</summary>
</entry>
<entry>
<title type="html">GCC, Clang[d], LSP client, Kate and variadic macro warnings, a short story</title>
<link href="https://ahmadsamir.github.io/posts/gcc-clang-variadic-macros-warnings.html" rel="alternate" type="text/html" title="GCC, Clang[d], LSP client, Kate and variadic macro warnings, a short story" />
<published>2021-10-08T00:00:00+02:00</published>
<updated>2021-10-08T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/gcc-clang-variadic-macros-warnings</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/gcc-clang-variadic-macros-warnings.html"><p>Kate has had an LSP plugin for sometime now, which uses Clangd. It's a great plugin that brings many code navigation/validation features, akin to those available in Qt Creator and KDevelop.</p>
<p>So naturally since I got it to work, I've been using it. At some point I found out about the <strong>Diagnostics</strong> tab in the <strong>LSP Client</strong> tool view in Kate, which displays useful information; however I also saw that it was plagued by a spam of the following warnings:</p>
<pre>
[clang] Must specify at least one argument for '...' parameter of variadic macro
[qloggingcategory.h:121] Macro 'qCDebug' defined here
</pre>
<p>which is really annoying to say the least, as it adds needless noise.</p>
<p>I just ignored it and moved on; then, by accident, while searching for something in the Extra CMake Module KDE repo I found <a href="https://invent.kde.org/frameworks/extra-cmake-modules/-/blob/master/kde-modules/KDECompilerSettings.cmake#L546">this</a>:</p>
<pre>
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# -Wgnu-zero-variadic-macro-arguments (part of -pedantic) is triggered by every qCDebug() call and therefore results
# in a lot of noise. This warning is only notifying us that clang is emulating the GCC behaviour
# instead of the exact standard wording so we can safely ignore it
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-zero-variadic-macro-arguments")
endif()
</pre>
<p>this explains why those warnings are shown. Adding <code>-Wno-gnu-zero-variadic-macro-arguments</code> to my build flags, I use GCC by default, indeed made those warnings stop. But then GCC started complaining about an unrecognised build flag, which is correct, given that that flag is for Clang.</p>
<p>I started searching for a way to pass that compilation flag to Clangd without involving GCC, and I found <a href="https://github.com/clangd/clangd/issues/569#issuecomment-715444829">this</a>, which led me to <a href="https://clangd.llvm.org/config.html">this</a>.</p>
<p>So, the solution is to create a <strong>.clangd</strong> file in your repo's top level directory (I created it in the parent dir to my KDE Frameworks git checkouts, this way it affects all of them as Clangd searches for that file in all the parent directories of the current source file), and put this in it:</p>
<pre>
CompileFlags:
Add: [-Wno-gnu-zero-variadic-macro-arguments]
</pre>
<p>The End.</p>
<p>Feel free to tell me about any corrections in my posts, you can send me an email, or better still, use a GitHub issue.</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">Kate has had an LSP plugin for sometime now, which uses Clangd. It's a great plugin that brings many code navigation/validation features, akin to those available in Qt Creator and KDevelop.</summary>
</entry>
<entry>
<title type="html">Firefox and Hardware Acceleration on Linux</title>
<link href="https://ahmadsamir.github.io/posts/firefox-hw-acceleration.html" rel="alternate" type="text/html" title="Firefox and Hardware Acceleration on Linux" />
<published>2021-09-24T00:00:00+02:00</published>
<updated>2021-09-24T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/firefox-hw-acceleration</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/firefox-hw-acceleration.html"><p>In some Firefox version after 88.0 it looks like they're enabling WebRenderer by default, and it also looks like my hardware (an Nvidia graphics card with the proprietary driver)[1] isn't whitelisted, so what Firefox does is enable &quot;software WebRenderer&quot; instead.</p>
<p>First things first, I had been trying WebRenderer for some time (more than a couple of month) by force-enabling it, and while it seemed to make things better at first, on the whole the experience was awful, and because WebRenderer, if I understand correctly, uses GPU acceleration, that affected the rest of the desktop, so after a while I disabled WebRenderer (and &quot;Hardware Acceleration&quot; in the preferences tab, and set the processes limit to 2, while I was there), and then things seemed to be better.</p>
<p>Due to the iffy state Firefox can be in sometimes, I had decided to skip updates for as long as I can, i.e. I update Firefox, then stick with the version I have until an extension I use no longer works, or there is a really compelling new feature in a new version of Firefox (which, sadly, doesn't seem to be as often as it was before the &quot;rapid release&quot; schedule Mozilla had adapted...). So here I was using Firefox 88.0, shut the machine down at night, turned it on in the morning, then when I was opening a link, Firefox started and all the tabs had the &quot;your tab crashed&quot; &quot;reload this tab?&quot; message, clicking that button had no effect.</p>
<p>So nothing worked, not restoring the previous tabs, disabling all extensions, moving ~/.mozilla and starting anew; a couple of online searches later, still nothing, then I looked at <code>rpm -qa --last | less</code>, now I think the reason is a glibc update, which broke Firefox, probably it would be fixed by rebuilding Firefox against the new glibc. Not really OpenSuse Tumbleweed's problem because the current version of Firefox in the repos is 92.0...</p>
<p>The bottom line is, either I build Firefox from source (takes a long time, consuming CPU and memory ...etc) or update update to Firefox 92.0. I opted for the latter; and was greeted with laggy UI/scrolling/interacting with the browser ... lots of fun.</p>
<p>Another online search later, and I found that &quot;software&quot; WebRenderer is enabled (confirmed by looking at about:support in Firefox) and to <a href="https://www.reddit.com/r/firefox/comments/pkkdgz/how_to_disable_webrender_again/">disable it</a> I needed to set <code>gfx.webrender.force-disabled</code> to <code>true</code> in about:preferences.</p>
<p>[1] While I am here, the whole &quot;you should have bought an AMD graphics card!&quot; argument, that I have seen posted in many places whenever someone says he/she is using Nvidia with the proprietary driver, has never sit well with myself. When I was deciding which card to buy 7-8 years ago, the fglrx driver (which is the proprietary driver for AMD cards) back then was awful, all I heard about it were horror stories of users' complaints. The Nvidia proprietary driver was much better at that time. Some years later AMD decided to open-source their driver and upstream it (not sure) to the Linux Kernel, great, good news for users with AMD cards. But you know what? I can't see the future to know that 5 years after I bought that Nvidia card, AMD will become the better choice. So please, if you don't have a solution to the problem a user with an Nvidia card has, don't throw the &quot;you shouldn't have gotten an Nvidia card&quot; argument in there, saying nothing would be more helpful in that case. And you know what also? AMD being a corporation could at any minute stop supporting the open-source driver, right? I am not a lawyer, but I think if management decides it's not in their company's best interest, they could pull the plug. It's not like this hasn't happened before, Intel did stop developing/working on their gfx open-source driver, to the extent that distros were switching to the default Kernel ModeSetting driver.</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">In some Firefox version after 88.0 it looks like they're enabling WebRenderer by default, and it also looks like my hardware (an Nvidia graphics card with the proprietary driver)[1] isn't whitelisted, so what Firefox does is enable &quot;software WebRenderer&quot; instead.</summary>
</entry>
<entry>
<title type="html">Get more out of the window title with Konsole</title>
<link href="https://ahmadsamir.github.io/posts/alternate-git-prompt.html" rel="alternate" type="text/html" title="Get more out of the window title with Konsole" />
<published>2021-09-09T00:00:00+02:00</published>
<updated>2021-09-09T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/alternate-git-prompt</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/alternate-git-prompt.html"><p>If you use git on a regular basis, you should look into using git-prompt; there is a file called git-prompt.sh that is shipped with git, the location in your setup varies depending on the Linux distribution you're using, for example in OpenSuse it's /etc/bash_completion.d/git-prompt.sh. The <a href="https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh">file</a> is of course available in the upstream git repo.</p>
<p>Following the instructions from the top of that file should give you a very useful addition to the prompt of your shell (the file has instructions for BASH and ZSH). However that is not what this blog post is about; this post is about making the Konsole window title more useful, and by that I mean use the window title to show the current dir path and the info from git-prompt.</p>
<p>Now, the details, (these instructions are for BASH, but I expect it'll work with other shells with a bit of tweaking?):</p>
<ul>
<li>
<p>Set Konsole to show the title from the shell session on the title bar: <em>Settings -&gt; Configure Konsole -&gt; General -&gt; Show window title on the title bar</em></p>
</li>
<li>
<p>Open <em>~/.bashrc</em> in your favourite editor and add this:</p>
</li>
</ul>
<pre>
# Adds a '*' and/or a '+' character to the window title to show
# the status of the repo, see git-prompt.sh for the details
export GIT_PS1_SHOWDIRTYSTATE=1
</pre>
<ul>
<li>Next add this small helper function to set the window title (for what this function does see <a id="function-0" href="#function-1">[1]</a>):</li>
</ul>
<pre>
__prompt_set_window_title() {
printf '\e]2;%s %s\a' "$(__git_ps1 " [ %s ]")" "${PWD/#$HOME/\~}";
}
</pre>
<ul>
<li>Next add the <b>__prompt_set_window_title()</b> function to the PROMPT_COMMAND (the prompt command in BASH is executed after each command in the shell), by putting this on a new line in <em>.bashrc</em>:</li>
</ul>
<pre>
PROMPT_COMMAND='history -a; __prompt_set_window_title'
</pre>
<p>For what <code>history -a</code> does see <a id="note-2-0" href="#note-2-1">[2]</a>.</p>
<p>Now when you <b>cd</b> to any dir that has a git repo, the name of the branch will be displayed between the square brackets on the title bar, along with a '*' and/or '+' characters to show the status of the repo.</p>
<hr style="margin-top: 100px"/>
<a id="function-1" href="#function-0">[1]</a> Breaking down <b>__prompt_set_window_title()</b>:
<ul>
<li>
<p><code>prinft '%s %s' &quot;first arg&quot; &quot;second arg&quot;</code> printf will replace the first &quot;%s&quot; with &quot;first arg&quot; and the second &quot;%s&quot; with the second arg ...etc</p>
</li>
<li>
<p><code>\e]2;</code> starts the escape sequence to set the window title and <code>\a</code> marks the end of it</p>
</li>
<li>
<p><code>$(__git_ps1 &quot; [ %s ]&quot;)</code> for this details about this part, read the docs at the beginning of the git-prompt.sh file; this will put the current branch name between square brackets. Note that if you're not in a dir with a git repo, this will show nothing, i.e. an empty string.</p>
</li>
<li>
<p><code>${PWD/#$HOME/~}</code> this will put the path of the current dir (i.e. the string stored in the PWD env var) next to the git branch name (and replace <em>/home/username</em> with <em>~</em>), you can remove it if you don't want that behaviour (you'll also want to remove the second &quot;%s&quot; in the <em>printf</em> command).</p>
</li>
</ul>
<p><a id="note-2-1" href="#note-2-0">[2]</a> <code>history -a</code> adds a very useful feature, which I picked up from Mandriva more than a decade ago (thanks, Colin Guthrie :)), it appends the shell history to the history file after you run each command, which means that if you open a new terminal emulator window, you'll find that the shell history has the last command you ran from any other shell session; without 'history -a', the shell history is only appended in one go to ~/.bash_history (or whatever it's called in your distro) after you close the session). You can remove the <code>history -a;</code> part if you don't want that behaviour.</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">If you use git on a regular basis, you should look into using git-prompt; there is a file called git-prompt.sh that is shipped with git, the location in your setup varies depending on the Linux distribution you're using, for example in OpenSuse it's /etc/bash_completion.d/git-prompt.sh. The file is of course available in the upstream git repo.</summary>
</entry>
<entry>
<title type="html">When you really appreciate clang-format</title>
<link href="https://ahmadsamir.github.io/posts/old-codebase-clang-format.html" rel="alternate" type="text/html" title="When you really appreciate clang-format" />
<published>2021-09-07T00:00:00+02:00</published>
<updated>2021-09-07T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/old-codebase-clang-format</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/old-codebase-clang-format.html"><p>In the KDE repos, a lot of repositories have been formatted using clang-format (almost all of the KDE Frameworks, and IIRC a lot of parts in Plasma, and some apps, and Okular and KActivities (the latter two have had clang-format much longer before the rest of KDE caught up)).</p>
<p>There was this Linux Kernel talk given by Greg-Kroah Hartman where he talked about the importance of formatting patches submitted to the Kernel, they have tools/scripts to format patches according to the coding style used in the Kernel, in that talk he said that the human brain recognises patterns, and because of that it is much easier to read code that is formatted in a regular pattern that you're used to; which in, my experience so far, is pretty much true.</p>
<p>And you can appreciate the code being uniformly formatted in any KDE Frameworks repo; but you have to understand that, to the best of my knowledge, KDE as a community has always had a coding style (especially in the core libraries, formally known as kdelibs, which has been split into separate repos, i.e. went from one monolithic gigantic repo to the &quot;smaller&quot; ones which are the Frameworks nowadays), that was adhered to as much as possible, and any developer in a KDE code review will point out code style issue, so the effect of clang-format there was making something that looked good, look better.</p>
<p>However to really appreciate what clang-format does, try running it on an old codebase, of a project that had one main developer, so it was his coding style/taste. You run clang-format on something like that (with the set of formatting rules from extra-cmake-module/kde-modules/clang-format.cmake), and suddenly the code is transformed, gone are all the unfamiliar indentation, all the pointy hard tabs, all the braces around if/while/for blocks that aren't on the same line; it's like you put the codebase in the washer, set it to the 10 minutes quick wash program, and then got it out, pristine, smelling of soap. And yes, the human brain recognises patterns, reading that code now is somewhat easier.</p>
<p>Thanks go to the developers who work on clang-format (and clang in general, apparently they understand that for a tool like that to survive and prosper it must be open-source, with as many developers working on it, paid and volunteers.... remind you of anything?)</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">In the KDE repos, a lot of repositories have been formatted using clang-format (almost all of the KDE Frameworks, and IIRC a lot of parts in Plasma, and some apps, and Okular and KActivities (the latter two have had clang-format much longer before the rest of KDE caught up)).</summary>
</entry>
<entry>
<title type="html">Firefox and virtual desktops</title>
<link href="https://ahmadsamir.github.io/posts/firefox-virtual-desktops.html" rel="alternate" type="text/html" title="Firefox and virtual desktops" />
<published>2021-08-30T00:00:00+02:00</published>
<updated>2021-08-30T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/firefox-virtual-desktops</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/firefox-virtual-desktops.html"><p>At some point Firefox started remebering which window was open on which desktop, which meant that if you're running KDE or GNOME ...etc and open several Firefox windows on different virtual desktops, when you restart Firefox, each window will be restored to the desktop it was open on. Apparently <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=890125">that started with Firefox 77</a>.</p>
<p>Which is nice... or not, depending on your use-case; so, the good news is that this is actually configurable via a pref <code>widget.disable-workspace-management</code> (you can open the config page in Firefox by going to <code>about:config</code>), that <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1628742">pref was introduced in Firefox 81</a>.</p>
<p>It took 1-2 restarts to see the changes, but it works.</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">At some point Firefox started remebering which window was open on which desktop, which meant that if you're running KDE or GNOME ...etc and open several Firefox windows on different virtual desktops, when you restart Firefox, each window will be restored to the desktop it was open on. Apparently that started with Firefox 77.</summary>
</entry>
<entry>
<title type="html">-DKF_DISABLE_DEPRECATED_BEFORE_AND_AT=0x054F00 ?</title>
<link href="https://ahmadsamir.github.io/posts/disable-deprecated-before-and-at.html" rel="alternate" type="text/html" title="-DKF_DISABLE_DEPRECATED_BEFORE_AND_AT=0x054F00 ?" />
<published>2021-03-29T00:00:00+02:00</published>
<updated>2021-03-29T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/disable-deprecated-before-and-at</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/disable-deprecated-before-and-at.html"><p>-DKF_DISABLE_DEPRECATED_BEFORE_AND_AT=0x054F00</p>
<pre class="code">
0x054F00
0x05 0x4F 0x00
</pre>
<p>In terminal:</p>
<pre class="code">
$ printf '%d %d %d\n' 0x05 0x4F 0x00
5 79 0
</pre>
<p>Using <code>std::cout</code>:</p>
<pre class="code">
std::cout << std::dec << 0x05 << " "
<< 0x4F << " "
<< 0x00 << std::endl;
Outputs:
5 79 0
</pre>
<p>And:</p>
<pre class="code">
std::cout << std::hex << QT_VERSION_CHECK(5, 79, 0) << std::endl;
Outputs:
54f00
</pre>
<pre class="code">
54f00
Hexacdecimal: 54 4f 00
Decimal: 5 79 0
</pre>
<p>I hope you understand now.</p>
<p>&nbsp;</p>
<hr />
<b>Side-note:</b> I would like to thank Ilya Bizyaev, who took the time to file an issue which resulted in fixing the config files of my blog, so that links created to my blog on https://planet.kde.org actually work.
<p>This is very good because it actually has two results, a) I fixed the config and b) it gave me proof that someone actually read a post from this blog.</p>
<p>My main goal when I created this blog was to share info, so even if no one reads a new post right after I create one, it could help someone doing an online search some years from now (including myself, since I also think of this blog as my little personal wiki, something like this great all-things-about-BASH wiki https://mywiki.wooledge.org , but much smaller (and not as useful, yet.... ?) :)</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">-DKF_DISABLE_DEPRECATED_BEFORE_AND_AT=0x054F00</summary>
</entry>
<entry>
<title type="html">If a workaround “works” for a long time, is it still a workaround?</title>
<link href="https://ahmadsamir.github.io/posts/old-workaround.html" rel="alternate" type="text/html" title="If a workaround “works” for a long time, is it still a workaround?" />
<published>2021-03-20T00:00:00+02:00</published>
<updated>2021-03-20T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/old-workaround</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/old-workaround.html"><p>I remember back during the KDE3 to KDE4 transition, one feature was broken (or removed then brought back? it's been so long I don't recall exactly), and that is, double clicking the window menu button in the title bar (usually that button is the icon of the application to which that window belongs) would close the window. I was accustomed to using that functionality, both when I used Windows and after I switched to Linux, and it was a bit annoying to see that it suddenly didn't work any more...</p>
<p>So, to workaround that issue, I ended up moving the close button (yes, you can edit those in the KDE desktop (now Plasma) settings, from the &quot;Window Decorations&quot; KCM) from the far right, where it resides by default, to the far left on the title bar. And I've been using that ever since.</p>
<p>Even when I ran GNOME, I used that desktop for a while, I found that you can edit the buttons on the title bar there too, and I moved the close button the same way.</p>
<p>So, to answer my own question, if a workaround <i>works</i> for 10+ years, it ceases to be a workaround and becomes the normal way of doing things (&quot;work&quot; without around?).</p>
<p>A bonus point, is that I can close a window with one click, instead of having to double click on the window menu button (I think the feature was brought back as an option in the &quot;Window Decorations&quot; KCM, &quot;Close windows by double clicking the menu button&quot;, but I don't need it any more :)).</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">I remember back during the KDE3 to KDE4 transition, one feature was broken (or removed then brought back? it's been so long I don't recall exactly), and that is, double clicking the window menu button in the title bar (usually that button is the icon of the application to which that window belongs) would close the window. I was accustomed to using that functionality, both when I used Windows and after I switched to Linux, and it was a bit annoying to see that it suddenly didn't work any more...</summary>
</entry>
<entry>
<title type="html">NumPad Rebooted</title>
<link href="https://ahmadsamir.github.io/posts/numlock-rebooted.html" rel="alternate" type="text/html" title="NumPad Rebooted" />
<published>2020-10-13T00:00:00+02:00</published>
<updated>2020-10-13T00:00:00+02:00</updated>
<id>https://ahmadsamir.github.io/posts/numlock-rebooted</id>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/numlock-rebooted.html"><p>If you use the PageUp key a lot (e.g. accessing shell history) and instead of hitting PageUp you hit NumLock? and then it happens several times? the solution for me was to remap the NumLock key to become another PageUp.</p>
<p>This is for systems using Udev (which is now part of systemd), and a USB or PS/2 keyboard; I am not sure this is feasible for laptops, since as far as I know, on a laptop keyboard switching the Numpad on/off can be useful, gives you more keys on the already cramped keyboard.</p>
<ul>
<li>
<p>First you need to find the &quot;keycode&quot; for the Numlock key; install <code>evtest</code>, then run it as root from terminal</p>
</li>
<li>
<p>Select the device for your keyboard from the list; note down the device number (e.g. /dev/input/event<strong>8</strong>); this may need a bit of trial and error, usually there are multiple &quot;events&quot; for the same hardware device, e.g. one for handling the regular keyboard keys (A, B, C, Space bar ... etc) and another for handling the multimedia keys on the same keyboard.</p>
</li>
<li>
<p>Once you select a device, some info about the keyboard hardware will be printed, on my system I see:</p>
</li>
</ul>
<pre class="code">
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0xd62 product 0xd93f version 0x111
Input device name: " USB Keyboard"
</pre>
<p>note down the &quot;vendor&quot; (0xd62) and &quot;product&quot; (0xd93f)</p>
<ul>
<li>Now, in the terminal, every time you press a key you'll see some info about that key, pressing Numlock I see:</li>
</ul>
<pre class="code">
Event: time 1602580599.011787, -------------- SYN_REPORT ------------
Event: time 1602580600.611819, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70053
Event: time 1602580600.611819, type 1 (EV_KEY), code 104 (KEY_PAGEUP), value 1
Event: time 1602580600.611819, -------------- SYN_REPORT ------------
Event: time 1602580600.683796, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70053
Event: time 1602580600.683796, type 1 (EV_KEY), code 104 (KEY_PAGEUP), value 0
Event: time 1602580600.683796, -------------- SYN_REPORT ------------
</pre>
<p>the interesting part in the output is <em>value</em>, in my case it's <strong>70053</strong>.</p>
<ul>
<li>
<p>Next create this directory: <code>/etc/udev/hwdb.d/</code> (/etc/udev/ should already be there). Inside that directory create a text file e.g. <code>foo.hwdb</code> (the extension has to be <i>.hwdb</i>), and open it in a text editor</p>
</li>
<li>
<p>The first line in that file, should be something like:</p>
</li>
</ul>
<p><code class="code">evdev:input:b<em>v0D62pD93F</em></code></p>
<p>I constructed that line from the <i>vendor</i> and <i>product</i>, respectively (we noted them down earlier). From /usr/lib/udev/hwdb.d/60-keyboard.hwdb:</p>
<pre>
# - Generic input devices match:
# evdev:input:bZZZZvYYYYpXXXXeWWWW-VVVV
# This matches on the kernel modalias of the input-device, mainly:
# ZZZZ is the bus-id (see /usr/include/linux/input.h BUS_*), YYYY, XXXX and
# WWWW are the 4-digit hex uppercase vendor, product and version ID and VVVV
# is an arbitrary length input-modalias describing the device capabilities.
# The vendor, product and version ID for a device node "eventX" is listed
# in /sys/class/input/eventX/device/id.
</pre>
<p>The parts we're interested in are <em>YYYY</em> and <em>XXXX</em>, i.e. the <em>vendor</em> and <em>product</em>; I set the rest of those hex digits to &quot;*&quot;, since for example, it doesn't matter which bus-id is being used.</p>
<ul>
<li>The second line:</li>
</ul>
<pre class="code">
KEYBOARD_KEY_70053=pageup # Remap NumLock to PageUp
</pre> the part after # is a comment
<div class="note"><b>Note:</b> This line starts with one blank space, i.e. it's " KEYBOARD_KEY_70053=pageup", if you remove that space it won't work, it's iffy about syntax (it was the last time I tried anyway, which was quite a while ago); again see /usr/lib/udev/hwdb.d/60-keyboard.hwdb for examples.
</div>
<ul>
<li>Save the file, then as root, update the hwdb:</li>
</ul>
<p><code class="code">systemd-hwdb update</code></p>
<ul>
<li>To &quot;apply&quot; the changes, again as root:</li>
</ul>
<p><code class="code">udevadm trigger /dev/input/eventX</code></p>
<p>replace <em>X</em> with the device number you used previously. If this doesn't work, remove/reinsert the usb cable/receiver from the machine.</p>
<ul>
<li>
<p>Now try the Numlock key, pressing it should be the same as pressing PageUp.</p>
</li>
<li>
<p>To revert this change, simply remove the <code>foo.hwdb</code> file and:</p>
</li>
</ul>
<pre class="code">
systemd-hwdb update
udevadm trigger /dev/input/eventX
</pre>
<p>if the last command above doesn't &quot;apply&quot; the changes remove/reinsert the usb cable/receiver from the machine.</p>
<hr />
<p>Of course now you have no way to toggle the Numpad :), so the next logical step is to remap the number keys on the Numpad to always be in number mode i.e. 1 on the Numpad always types 1, 2 on the Numpad always types 2 ...etc, regardless of the state of NumLock. On my system I needed to use:</p>
<pre>
KEYBOARD_KEY_70062=0
KEYBOARD_KEY_70059=1
KEYBOARD_KEY_7005a=2
KEYBOARD_KEY_7005b=3
KEYBOARD_KEY_7005c=4
KEYBOARD_KEY_7005d=5
KEYBOARD_KEY_7005e=6
KEYBOARD_KEY_7005f=7
KEYBOARD_KEY_70060=8
KEYBOARD_KEY_70061=9
KEYBOARD_KEY_70055=asterisk
KEYBOARD_KEY_70063=dot
KEYBOARD_KEY_70058=enter
KEYBOARD_KEY_70056=minus
KEYBOARD_KEY_70057=plus
KEYBOARD_KEY_70054=slash
</pre>
<p>you simply repeat the above steps for each key.</p>
<p>One other issue that this fixes is booting and then trying to use the Numpad only to find NumLock isn't &quot;on&quot;, this way it's always &quot;on&quot; :)</p>
<p>I hope this mini-tutorial was useful.</p></content>
<author><name>Ahmad Samir</name></author>
<summary type="html">If you use the PageUp key a lot (e.g. accessing shell history) and instead of hitting PageUp you hit NumLock? and then it happens several times? the solution for me was to remap the NumLock key to become another PageUp.</summary>
</entry>
<entry>
<title type="html">Clangd config</title>
<link href="https://ahmadsamir.github.io/posts/12-clangd-config-tweaks.html" rel="alternate" type="text/html" title="Clangd config" />
<id>12-clangd-config-tweaks.html</id>
<updated>2022-08-19T15:00:00+02:00</updated>
<published>2022-08-19T15:00:00+02:00</published>
<author><name>Ahmad Samir</name></author>
<content type="html" xml:base="https://ahmadsamir.github.io/posts/12-clangd-config-tweaks.html">
<h1>Clangd config</h1>
<p class="post-date">2022-08-15</p>
<p>Since <a href="https://kate-editor.org/post/2020/2020-01-01-kate-lsp-client-status/">Kate got LSP support</a> some time ago (thanks to all the developers who made/make this possible, it is a great addition), I've been using it a lot; as you'd expect with any tool, it has some default behaviours that you'd want to disable, and some non-default ones that you want to make use of. Below are some of the config tweaks I've collected over time.</p>
<p>First, there are two ways to change the <a href="https://clangd.llvm.org/config.html">clangd config options</a>:
<ul>
<li>creating a <code>~/.config/clangd/config.yaml</code> text file, which will affect all projects</li>
<li>creating a <code>.clangd</code> in a specific project directory</li>
</ul>
Note that clangd search for a <code>.clangd</code> file in the current dir and then its parent dir ...etc. So, you can have one .clangd file in the parent dir of all your KDE Frameworks checkouts and it'll affect all of them.
</p>
<p>Now the config options:
<ul>
<li>Mark unused includes, this seems to only work with .h headers includes, but not with ForwardingHeaders (e.g. <code>#include <QString></code> or <code>#include <KIO/Stat></code>):
<pre>
Diagnostics:
UnusedIncludes: Strict
</pre>
So while it doesn't work a 100% for KDE code which uses ForwardingHeaders a lot, it is still useful to have, since you can remove some unused includes as you go along. Of course be careful as it could mark something as "unused" while it is actually needed for a different code path, e.g. only needed on FreeBSD or Windows.
</li>
<li>Disable/suppress showing "Diagnostics" for system headers (if you're a developer for system libraries, you'll have those libraries source code open in your editor, right? if I have a KDE Framework code open in my editor, I want to see issues about that code at his moment, not the system headers, please):
<pre>
---
If:
PathMatch: /usr/include/.*
Diagnostics:
Suppress: "*"
</pre>
</li>
If I understand correctly, the <em>---</em> is used to separate sections in the config file, so that means I only want to suppress Diagnostics for this PathMatch not everywhere else.
<li>Add/Remove compile flags that are passed to the compiler clangd uses (by default it uses clang, obviously):
<pre>
CompileFlags:
Add: [-Wno-gnu-zero-variadic-macro-arguments]
Remove: [-fdiagnostics-urls=always]
</pre>
For example I usually compile with gcc, and I add the <a href="https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gcc/Diagnostic-Message-Formatting-Options.html"><code>-fdiagnostics-urls=always</code></a> flag, but clang knows nothing about it and keeps complaining in e.g. the LSP diagnostics tab in Kate, so this is one way of removing that noisy warning.
For <code>-Wno-gnu-zero-variadic-macro-arguments</code> see this <a href="https://ahmadsamir.github.io/posts/gcc-clang-variadic-macros-warnings.html">post</a>.
</li>
</ul>
</p>
</content>
<summary type="html">
Clangd config tweaks
</summary>
</entry>
<entry>
<title type="html">Git</title>
<link href="https://ahmadsamir.github.io/posts/13-git.html" rel="alternate" type="text/html" title="Git" />
<id>13-Git.html</id>
<updated>2022-10-04T15:30:00+02:00</updated>
<published>2022-10-04T15:30:00+02:00</published>
<author><name>Ahmad Samir</name></author>
<content type="xhtml" xml:base="https://ahmadsamir.github.io/posts/13-git.html">
<h1>Git</h1>
<p class="post-date">2022-10-04</p>
<p>Git is one of those tools that I have been using for the past 4-5 years on a daily basis, very very good tool. Below I share some git commands and aliases ...etc, that I've collected over the years.</p>
<p><a href="https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases"><b>Aliases</b>:</a></p>
<ul>
<li><b>l = log</b><br/> how many times do you type <code>git log</code>?</li>
<li><b>logs = log --pickaxe-all -p -S</b><br/>
This is useful when searching in a repo's commit log for a line of code (verbatim), it shows all the commits where a string of text appears; the <code>-p</code> option makes it show the diff along with the commit message, very good for searching in e.g. less (or whatever pager you use); for what <b>--pickaxe-all</b> does, have a look at the <a href="https://git-scm.com/docs/git-log">documentation</a>
</li>
<li><b>logg = log --pickaxe-all -p -G</b><br/>
The same as the previous one but uses "-G" (instead of "-S"), which takes a regular expression</li>
<li><b>rei = rebase --interactive</b></li>
<li><b>rec = rebase --continue</b></li>
<li><b>cot = checkout -t origin/master -b</b><br/>
Creates a new branch, that tracks the remote origin/master branch, and switches to that new branch, for example <code>git cot blahbleh</code>
</li>
<li><b>cotqt = checkout -t origin/dev -b</b><br/>
The same as the previous one but for Qt repos, they use "dev" instead of "master"...
</li>
<li><b>one-long = log --pretty=format:\"%Cblue%H %>(20,trunc)%Cgreen%an%Creset %Cred%s%Creset\"</b><br/>
Shows git log of a repo, one line per commit:<br/>
<span class="terminal">
<span style="color:#4980ff">fd2a2f2806064e71c4e64c80a361bc4b2ef64bd2    </span><span style="color:#18b218">John Foo         </span><span style="color:#b2b2b2"> </span><span style="color:#ff7361">De-duplicate some code</span>
</span><br/>
See the documentation for more info.
</li>
<li><b>lbr = log -p origin/master..</b><br/>
Shows all the commits in the current branch (i.e. ones at the top that aren't in master yet); again "-p" makes it show the diff along with the commit message, remove it if you want to see commit messages only
</li>
<li><b>g =!git gui & disown</b><br/> "& disown", at least with BASH, means send it to the background, and detach it from this terminal, i.e. the GUI app won't be closed when you close the terminal
</li>
</ul>
<p><b>Custom Git Commands:</b></p>
<p>Some other commands are too big for an alias, so it's easier to use a git script, basically create a shell script somewhere in your PATH, make it executable and name it git-<i>command_name</i> (where <i>command_name</i> is the name of the command you want use e.g. git-history, you can then use <code>git history</code> like any other git command).</p>
<ul>
<li>git-history:
<pre>
#!/usr/bin/bash
git reflog "$@" | grep "checkout:" | perl -p -e 's@.+checkout: moving from ([^ ]+).+@$1@' | grep -v master | uniq | head -n 20
</pre>
Prints a list of the branch names that you have checked out / switched to/from, in chronological order; useful when you have many local branches and can't remember the name of one of the recent ones you've been working on. (I omit "master", because I don't have trouble remembering the name of that one).
</li>
<li>git-dadd:
<pre>
#!/usr/bin/bash
git diff --name-only --diff-filter=U | xargs git add
</pre>
When doing an interactive rebase and after resolving conflicts, you have to `git add` the files that had conflicts, this command does exactly that.
</li>
<li>git-copy:
<pre>
#!/usr/bin/bash
newName=$(git branch --show-current)-2
git branch --copy $newName
</pre>
Creates a copy of the current branch, named <i>current-branch-name</i>-2, basically creating a backup copy in case whatever changes I am about to attempt doing don't work out.
</li>
</ul>
</content>
<summary type="xhtml">Git</summary>
</entry>
</feed>