Posts

CMake configuration for reproducible builds of C++ projects with gcc/Linux

This is a quick guide for configuring CMake such that every rebuild of the same C++ code generates bit-by-bit identical binaries. This is useful in verifying if a given binary is indeed generated from the given sources and comes in handy for configuration control. This article is not a detailed documentation on the reasons or mechanisms that cause binaries to differ from build to build nor the rationale behind the countermeasures explained in great detail. That information is already covered elsewhere and a few helpful links are provided in the end. This post is made because all of this information was not available in one place. In general, the same C++ code should generate the same executable (or library) every time it is compiled using the same build system on the same platform. But in practice, several factors cause the final binaries to differ. There are a few things developers need to take care of to avoid these: Eliminate differences due to build path. target_compile_options(

qView - a simple, fast image viewer for Linux

Image
qView is a simple, minimalistic and fast image viewer for Linux, Windows and macOS. It's built using Qt and is GPL v3 licensed free software. It supports pretty much all features that one expects from a fast and no-nonsense image viewer. It has replaced Gwenview as the default image viewer on my KDE Plasma Fedora desktop. Gwenview is of course more feature-rich and fancier, but I like qView for simply viewing and cycling through images.

Dangerous ride with a worn out motorcycle tyre - lesson learnt!

Image
My Mahindra Mojo had munched over 11,000km and my rear tyre had been almost completely worn out. The Mojo comes with Pirelli Diablo Rosso 2 which are soft-compound tyres. That meant they would offer great grip on the roads, but would wear out faster. My rear tyre was worn out way beyond the limit indicated by the Tread Wear Indicators and at one or two places, the steel radial wires were slightly visible. That's terrible, I know! My daily rides were limited to 5-6km through private roads and so I felt lazy and put off replacing the tyre. And one day, this happened! A few weeks back, one fine morning, I got a call from a friend to go on a bike trip to Hoggenakkal , which is around 140km from my place. Against my better judgement, I agreed and we rode to Hoggenakkal. Throughout the ride, we were mindful of the tyre condition. Anyway, the onward ride was uneventful and Hoggenakkal was terrible and disappointing (borderline disgusting). On our ride back to Bengaluru, we got h

เดฎിเดฏ เดŽเดจ്เดจ เดชൂเดš്เดšเด•്เด•ുเดŸ്เดŸി

Image
เดฎൂเดจ്เดจ് เดตเดฐ്‍เดทเด™്เด™เดณ്‍เด•്เด•് เดฎുเดฎ്เดชാเดฃ് เด…เดท്เดŸเดฎൂเดฐ്‍เดค്เดคി เดธാเดฑിเดจ്เดฑെ เด’เดฐു เด•ുเดฑിเดช്เดชിเดฒൂเดŸെ CP เดฑോเดœเดจ്‍ เดŽเดดുเดคിเดฏ " เดฎിเดฏ เดŽเดจ്เดจ เดชൂเดš്เดšเด•്เด•ുเดŸ്เดŸി " เดŽเดจ്เดจ เดชുเดธ്เดคเด•เดค്เดคെเด•്เด•ുเดฑിเดš്เดš് เด…เดฑിเดฏുเดจ്เดจเดค്. เดคിเดฐുเดตเดจเดจ്เดคเดชുเดฐเดค്เดค് เด’เดจ്เดจ് เดฐเดฃ്เดŸ് เดชുเดธ്เดคเด•เด•്เด•เดŸเด•เดณിเดฒും เดชിเดจ്เดจെ เดชเดฒ เด“เดฃ്‍เดฒൈเดจ്‍ เด•เดŸเด•เดณിเดฒും เด…เดจ്เดตേเดทിเดš്เดšിเดŸ്เดŸ് เดชുเดธ്เดคเด•ം เด•ിเดŸ്เดŸിเดฏിเดฒ്เดฒ. เด…เดตเดธാเดจം เดžാเดจ്‍ เดซെเดฏ്เดธ്เดฌുเด•്เด•ിเดฒൂเดŸെ เดถ്เดฐീ เดฑോเดœเดจുเดฎാเดฏി เดฌเดจ്เดงเดช്เดชെเดŸ്เดŸു. เดชുเดธ്เดคเด•ം เดคിเดฐുเดตเดจเดจ്เดคเดชുเดฐเดค്เดค് เดŽเดตിเดŸെเด•്เด•ിเดŸ്เดŸുเดฎാเดฏിเดฐിเด•്เด•ും เดŽเดจ്เดจ เดšോเดฆ്เดฏเดค്เดคിเดจ് "เดตിเดฒാเดธം เดคเดฐൂ เดžാเดจ്‍ เด…เดฏเดš്เดšുเดคเดฐാം" เดŽเดจ്เดจാเดฏിเดฐുเดจ്เดจു เดฎเดฑുเดชเดŸി. เด…เด•്เด•ൗเดฃ്เดŸ് เดตിเดตเดฐเด™്เด™เดณ്‍ เดคเดจ്เดจാเดฒ്‍ เดชുเดธ്เดคเด•เดค്เดคിเดจ്เดฑെ เดตിเดฒ เดžാเดจ്‍ เดคเดฐാം เดŽเดจ്เดจ് เดชเดฑเดž്เดžเดช്เดชോเดณ്‍ "เด†เดฆ്เดฏം เดตാเดฏിเด•്เด•ൂ, เดŽเดฒ്เดฒാเดค്เดคിเดจും เดธเดฎเดฏเดฎുเดฃ്เดŸ്" เดŽเดจ്เดจ เดฎเดฑുเดชเดŸി. เดŽเดจ്เดจാเดฒ്‍ เดถเดฐി เดฌാเด•്เด•ി เดตാเดฏിเดš്เดšിเดŸ്เดŸ് เด…เดฑിเดฏിเด•്เด•ാം เดŽเดจ്เดจ് เดžാเดจും เดชเดฑเดž്เดžു. เดชുเดธ്เดคเด•ം เดตเดจ്เดจു. เดตാเดฏിเดš്เดšു. เด’เดฐുเดชാเดŸ്, เด’เดฐുเดชാเดŸ് เด‡เดท്เดŸเดช്เดชെเดŸ്เดŸു. เดชเด•്เดทേ เดฑോเดœเดจെ เด…เดฑിเดฏിเด•്เด•ാเดจ്‍ เดเดคോ เดคിเดฐเด•്เด•ിเดจാเดฒ്‍ เดตിเดŸ്เดŸുเดชോเดฏി.  เด‡เดคെเดฒ്เดฒാം เดจเดŸเด•്เด•ുเดจ്เดจเดค് 2016 เดธെเดช്เดฑ്เดฑംเดฌเดฑിเดฒ്‍. เดตเดณเดฐെ เดฎോเดถเดฎാเดฏിเดช്เดชോเดฏി เดŽเดจ്เดจ് เดžാเดจ്‍ เดŽเดจ്เดจോเดŸ് เดคเดจ്เดจെ เด‡เดŸเดฏ്เด•്เด•് เด“เดฐ്‍เดฎ്เดฎเดตเดฐുเดฎ്เดชോเดณ്‍ เดชเดฑเดฏും. เด‡เดค്เดฐเดฏും เด•ാเดฒം เด•เดดിเดž്เดžിเดŸ്เดŸും เดˆ เดชുเดธ്เดคเด•เดตും เดŽเดดുเดค്เดคുเด•ാเดฐเดจും เดชเด•്เดทേ เดฎเดจเดธ്เดธിเดฒ്‍ เดจിเดจ്เดจ് เดฎാเดž്เดžിเดฒ്เดฒ. เด…เดค്

Qt - Enabling qDebug messages and Qt Creator

I have been struggling for the past two hours to get qDebug() messages from my Qt 5 application to show up on the 'Application output' pane in Qt Creator IDE on Linux. Finally I found a solution, thanks to a user on Qt IRC channel. To enable log messages in Qt, do the following: Edit ~/.config/QtProject/qtlogging.ini and make sure it has: [Rules] *.debug=true qt.*.debug=false With this, I was getting the messages when I run the application from a terminal. But Qt Creator was not showing the qDebug() messages. To have the messages displayed in Qt Creator, do the following: Qt creator > Tools > Options > Kits, select your kit, find Environment, click change and add: QT_ASSUME_STDERR_HAS_CONSOLE=1 This fixed the problem for me. I thought I should document the full process here as Google wasn't getting me good leads. My environment: Fedora 29 Linux x86-64 Qt 5.11.3 Qt Creator v4.7.2 References: https://bugzilla.redhat.com/show_bug.cgi?id=12272

เดฌിเด—് เดฑേเดกിเดฏോ เด‡เดคിเดนാเดธം

เด‡เดจ്เดจ് เดคിเดฐുเดตเดจเดจ്เดคเดชുเดฐเดค്เดค് 92.7 เดฌിเด—് เดŽเดซ്เดŽം เดฑേเดกിเดฏോ เดชเดฐിเดชാเดŸിเดฏിเดฒ്‍ เด•േเดŸ്เดŸเดค്..  เดชเดฐിเดชാเดŸി: " เดธ്เดตീเดฑ്เดฑ് เด†เดจ്‍เดธി " เด…เดตเดคเดฐിเดช്เดชിเด•്เด•ുเดจ്เดจ เดฑിเด•്เดตเดธ്เดฑ്เดฑ് เดฐാเด—, เดฏെเดธ് เด“เดฐ്‍ เดจോ เด—െเดฏിം ... เดธ്เดตീเด†: เดนเดฒോ, เด†เดฐാ เดตിเดณിเด•്เด•ുเดจ്เดจเดค്?  เดฑเดธാเด•്เด•് เดธ്เดตീเด†: เดฑเดธാเด•്เด•് เด…เดฒ്เดฒേ.. "เดฑเดธാเด•്เด•ിเดจ്เดฑെ เด‡เดคിเดนാเดธം" เดตാเดฏിเดš്เดšിเดŸ്เดŸുเดฃ്เดŸോ? เดฑเดธാเด•്เด•്: เด‡เดฒ്เดฒ เดธ്เดตീเด†: เดŽเดจ്เดคാ เดฑเดธാเด•്เด•േ, เดธ്เดตเดจ്เดคം เดชേเดฐിเดฒ്‍ เด’เดฐു เดชുเดธ്เดคเด•เดฎൊเด•്เด•െ เด‰เดณ്เดณเดช്เดชോเดณ്‍ เด…เดค് เดตാเดฏിเด•്เด•เดฃ്เดŸേ? เดฑเดธാเด•്เด•്: เด™േ? ... เดธ്เดตീเด†: เด…เดช്เดชോเดณ്‍ เดฑเดธാเด•്เด•ിเดจും เดฑเดธാเด•്เด•ിเดจ്เดฑെ เด‡เดคിเดนാเดธം เด‡เดท്เดŸเดช്เดชെเดŸുเดจ്เดจ เดตാเดฏเดจเด•്เด•ാเดฐ്‍เด•്เด•ും เดตേเดฃ്เดŸി เดˆ เดชാเดŸ്เดŸ് เดกെเดกിเด•്เด•േเดฑ്เดฑ് เดšെเดฏ്เดฏുเดจ്เดจു... ...  เดตാเดฒ്‍:  เดฎเดนാเดจാเดฏ เดŽเดดുเดค്เดคുเด•ാเดฐเดจ്‍ เดชിเดฃเดฑാเดฏി เดตിเดœเดฏเดจ്‍ เดŽเดดുเดคിเดฏ "เดฑเดธാเด•്เด•ിเดจ്เดฑെ เด‡เดคിเดนാเดธം" เดŽเดจ്เดจോ เดฎเดฑ്เดฑോ เดชเดฑเดฏാเดคിเดฐുเดจ്เดจเดค് เดคเดจ്เดจെ เดญാเด—്เดฏം ...  เดšോเดฆ്เดฏം: 'เดšเด™്เด™เดฎ്เดชുเดด' เดŽเดจ്เดจ เด•เดตിเดค เดŽเดดുเดคിเดฏเดค് เด†เดฐാเดฃ്? เด‰เดค്เดคเดฐം: เด…เด™്เด™เดจെเดฏൊเดฐു เด•เดตിเดคเดฏുเดฃ്เดŸെเด™്เด•ിเดฒ്‍ เด…เดคെเดดുเดคിเดฏเดค് เดฐเดฎเดฃเดจാเดฏിเดฐിเด•്เด•ും! (เด•เดŸเดช്เดชാเดŸ്: เด•เดฃ്เดŸ് เดฎเดฑเดจ്เดจ เด’เดฐു เดชเดดเดฏ เดฎเดฒเดฏാเดณം เดธിเดจിเดฎ)

เดœเดจเดฑേเดทเดจ്‍ เด—്เดฏാเดช്เดช്

Image
เด‡เดจ്เดจเดฒെ เดตൈเด•ുเดจ്เดจേเดฐം เดตเดฃ്เดŸിเดฏോเดŸിเด•്เด•ുเดฎ്เดชോเดณ്‍ เด•േเดณ്‍เด•്เด•ാเดจിเดŸเดฏാเดฏ เดคിเดฐുเดตเดจเดจ്เดคเดชുเดฐം เด…เดจเดจ്เดคเดชുเดฐി FM-เดจ്เดฑെ เดซോเดฃ്‍-เด‡เดจ്‍ เดชเดฐിเดชാเดŸിเดฏിเดฒ്‍ เดจിเดจ്เดจ്. เดชเดฐിเดชാเดŸി เด…เดตเดคเดฐിเดช്เดชിเด•്เด•ുเดจ്เดจเดค് เดคാเดฎเดฐเดถ്เดถേเดฐി เดจീเดฒാംเดฌเดฐเดจ്‍ เดธാเดฐ്‍. --------------------------------------------------------------- เดจീเดฒാംเดฌเดฐเดจ്‍ เดธാเดฐ്‍: เดนเดฒോ.. เดฐാเดนുเดฒ്‍: เดนเดฒോ.. ... เดธാเดฐ്‍: เดฎോเดจ്‍ เดเดค് เด•്เดฒാเดธ്เดธിเดฒാ เดชเด ിเด•്เด•ുเดจ്เดจเดค്? เดฐാเดนുเดฒ്‍: เดเดดാം เด•്เดฒാเดธ്เดธിเดฒ്‍ เดธാเดฐ്‍: เดชเด ിเดค്เดคเดฎൊเด•്เด•െ เดŽเด™്เด™เดจെ เดชോเด•ുเดจ്เดจു? เด•്เดฒാเดธ്เดธിเดฒ്‍ เดฐാเดนുเดฒ്‍ เดŽเดค്เดฐാเดฎเดจാ? (เดฎเดฒเดฏാเดณเดค്เดคിเดจ് เดจเดจ്เดฆി. เด‡ംเด—്เดฒീเดทിเดฒ്‍ เด‡เดค് เดšോเดฆിเด•്เด•ാเดจ്‍ เด•ുเดฑเดš്เดš് เด•เดท്เดŸเดช്เดชെเดŸ്เดŸേเดจേ..) เด’เดจ്เดจാเดฎเดคാเดฃോ? เดฐാเดนുเดฒ്‍: เด…เดฒ്เดฒ. เดžാเดจ്‍ เดฐเดฃ്เดŸാเดฎเดจാ เดธാเดฐ്‍: เดฐാเดนുเดฒ്‍ เดจเดจ്เดจാเดฏി เดชเด ിเดš്เดš് เดตേเด—ം เดคเดจ്เดจെ เด’เดจ്เดจാเดฎเดจാเด•เดฃം. เด•േเดŸ്เดŸോ.. เดฐാเดนുเดฒ്‍: เดถเดฐി (?) เดธാเดฐ്‍: เดฐാเดนുเดฒിเดจ് เดเดค് เดตിเดทเดฏเดฎാเดฃ് เดเดฑ്เดฑเดตും เด‡เดท്เดŸം? เดฐാเดนുเดฒ്‍: เดธเดฏเดจ്‍เดธ് เดธാเดฐ്‍: เด†เดนാ.. เดตเดฒുเดคാเดตുเดฎ്เดชോเดณ്‍ เดฎോเดจ് เด†เดฐാเด•เดฃเดฎെเดจ്เดจാ เด†เด—്เดฐเดนം? เดฐാเดนുเดฒ്‍: เด•ാเดฐ്‍เดŸ്เดŸോเด—്เดฐാเดซเดฐ്‍! เดธാเดฐ്‍: เด™േ? เดœെเดฌാ? เดฐാเดนുเดฒ്‍: เด•ാเดฐ്‍เดŸ്เดŸോเด—്เดฐാเดซเดฐ്‍ (?) เดธാเดฐ്‍: เด? เด™്เดนാ.. เด…เดคാเด•ാเดจാเดฃเดฒ്เดฒേ เด†เด—്เดฐเดนം.. เดถเดฐി เดถเดฐി.. เดฎോเดจേเดค് เดชാเดŸ്เดŸാ เดตേเดฃ്เดŸเดค്? (เดนാเดตൂ..) ... เดธാเดฐ്‍: เดฌ്เดฒเดกി เด”เดŸ്เดŸ്เดธ്เดชോเด•്เด•เดฃ്‍ เด•ാเดฐ്‍เดŸ്เดŸോเด—്เดฐാเดซേเดด്‌เดธ്! (เดŽเดจ്เดจ് เดฎเดจเดธ്เดธിเดฒ്‍ เดชเดฑเดž്เดžിเดŸ്เดŸുเดฃ്เดŸാเด•เดฃം