Author Archives: dmitriano

Why my QT app crashes at the destructor of std::thread on Android 10 devices?

I did some research on why my QT app crashes at the destructor of std::thread on Android 10 devices at the user side with the following call stack:

#00 /apex/com.android.runtime/lib64/bionic/libc.so (abort+160)
#01 /system/lib64/libc++.so (abort_message+232)
#02 /system/lib64/libc++.so (demangling_terminate_handler()+44)
#03 /system/lib64/libc++.so (std::__terminate(void (*)())+12)
#04 /system/lib64/libc++.so (std::terminate()+52)
#05 /system/lib64/libc++.so (std::__1::thread::~thread()+20)
#06 /apex/com.android.runtime/lib64/bionic/libc.so (__cxa_finalize+212)
#07 /apex/com.android.runtime/lib64/bionic/libc.so (exit+24)
#08 /data/app/com.domain.myapp-Rs_sm5VrLR1Jj8QW6oYByA==/lib/arm64/libplugins_platforms_qtforandroid_arm64-v8a.so

and figured out that its likely because std::thread destructor is being invoked while the thread is still joinable at some point of the application execution (thanks to G. M. on stackoverflow.com).

(more…)

Shrinking MySQL database

Calculating disk space usage per MySQL DB:

sudo du -h /var/lib/mysql/
932M    /var/lib/mysql/beauty
179M    /var/lib/mysql/slogpost
485M    /var/lib/mysql/omegauto
8.0K    /var/lib/mysql/test
676K    /var/lib/mysql/sys
22G     /var/lib/mysql/bot
79M     /var/lib/mysql/master
11M     /var/lib/mysql/mysql
176K    /var/lib/mysql/phpmyadmin
21M     /var/lib/mysql/shar
127M    /var/lib/mysql/mike
1.1M    /var/lib/mysql/performance_schema
79M     /var/lib/mysql/devnote
12M     /var/lib/mysql/mike1
48K     /var/lib/mysql/game
24G     /var/lib/mysql/
(more…)

C++ binary serialization speed is comparable with std::memmove

Measuring std::memmove speed

I wrote a simple test that outputs std::memmove speed to the console:

AWT_ATTRIBUTE(size_t, element_count, 1000000);

std::unique_ptr<uint8_t> p_src(new uint8_t[element_count]);
std::memset(p_src.get(), 25u, element_count);

std::unique_ptr<uint8_t> p_dst(new uint8_t[element_count]);

context.out << _T("std::memmove: ");

awl::StopWatch w;

std::memmove(p_dst.get(), p_src.get(), element_count);

ReportSpeed(context, w, element_count);

context.out << std::endl;

And the similar tests for std::memset and std::vector::insert.

(more…)

A funny example of C++ code that MS can compile :)

In the code below, static_assert operates on the addresses of local variables, but however MS compiles it and the assertion does not fail:

#include <tuple>
#include <string>
 
struct A
{
    int a;
    double b;
    std::string c;
};
 
void f()
{
    A a{ 1, 3.0, "abc" };
    constexpr auto t1 = std::tie(a.a, a.b, a.c);
    static_assert(&std::get<0>(t1) == &a.a);
}

Use the following command to compile this example:

cl /std:c++17 /EHsc a.cpp
(more…)

How I solved “This version of the application is not configured for billing through Google Play”

I created an unlockable product in Google Play, added billing permission to the manifest:

<uses-permission android:name="com.android.vending.BILLING"/>

and implemented billing in my application, but when I attempted to purchase the product first time I got error ‘This version of the application is not configured for billing through Google Play‘:

This version of the application is not configured for billing through Google Play
(more…)

Basic ideas of version tolerant serialization in C++

Consider the following scenario: there where structure A in an old version of a C++ application:

struct A
{
    double a;
    int b;
    std::string c;
};

An instance of A was serialized into a file in a binary format and after that the application was updated to a new version.

But in the new version of the application structure A was modified by adding fields d and e and deleting field a:

struct A
{
    int b;
    std::vector<int> d;
    bool e;
    std::string c;
};

and the new version of the application needs to deserialize an instance of its new structure A from the file containing old version of A.

(more…)

Packaging QT application into Android App Bundle (AAB)

In Qt Creator 4.11.0 on Projects page check “Build .aab”:

This will create .aab file.

(more…)

Setting up Oracle Database for development

To set up an Oracle Database for development I install the database in a docker container and then modify password policies in the default user profile as follows:

ALTER PROFILE DEFAULT LIMIT COMPOSITE_LIMIT UNLIMITED
  PASSWORD_LIFE_TIME UNLIMITED
  PASSWORD_REUSE_TIME UNLIMITED
  PASSWORD_REUSE_MAX UNLIMITED
  PASSWORD_VERIFY_FUNCTION NULL
  PASSWORD_LOCK_TIME UNLIMITED
  PASSWORD_GRACE_TIME UNLIMITED
  FAILED_LOGIN_ATTEMPTS UNLIMITED;

this prevents passwords from expiring and users from being locked.

(more…)

A simple C++ serialization framework

I implemented a simple C++ binary serialization framework that makes a structure or class serializable by adding a macro that usually takes one line of code as shown in the example below:

struct A
{
    bool x;
    int y;

    AWL_SERIALIZABLE(x, y)
};

There is also a macro that makes a structure or a class equatable:

AWL_MEMBERWISE_EQUATABLE(A)
(more…)

Oracle Database 19c auditing with Multitenant Architecture

First I installed Oracle 19c in Docker container , enabled unified auditing, and created multiple pluggable databases:

export ORACLE_SID=ORCLCDB
cd $ORACLE_HOME/bin
#connect to root container
./sqlplus / as sysdba
CREATE PLUGGABLE DATABASE testpdb1 ADMIN USER admin1 IDENTIFIED BY dbpasswd1
    FILE_NAME_CONVERT=('/opt/oracle/oradata/ORCLCDB/pdbseed', '/opt/oracle/oradata/ORCLCDB/testpdb1');
Pluggable database created.
CREATE PLUGGABLE DATABASE testpdb2 ADMIN USER admin2 IDENTIFIED BY dbpasswd2
    FILE_NAME_CONVERT=('/opt/oracle/oradata/ORCLCDB/pdbseed', '/opt/oracle/oradata/ORCLCDB/testpdb2');
Pluggable database created.
(more…)