25 Nov 2022

feedPlanet Maemo

Logitech M720 Triathlon mouse – long-term review

In this post I want to take a look at the Logitech M720 mouse after having used it for 2.5 years.

Specs and durability

The specs are pretty common for a mouse you get today, so lets start with the special features:

Especially the last two points make this seem to be future-proof product that you can use for a long time.

Logitech is currently replacing their Wireless Receiver dongles by Logitech Bolt, so in the near future the Wireless Receivers will go away. But thanks to the Bluetooth support you will still be able to use the mouse without having to occupy a USB port just for using it.

Then, using standard AA batteries means that you just use some nice rechargeable ones. This means that you will never have to wait for the mouse to charge and that the mouse can out-live the battery. As you are probably aware from using your phone, rechargeable batteries wear-out over time until the device cannot be properly used any more.

So we finally got a mouse for the years to come? Well..

Built-in obsolescence

Unfortunately, Logitech made some design decision that drastically shorten the life-span of the device, even though they must have known better.

Rubber coating

The most obvious one is likely the rubber coating of the mouse.

Note how the plastic buttons look still perfectly fine in comparison

I took the images for this post after cleaning the mouse. So the dirt you see there is not the skin from my greasy hands, but rather said rubber coating disintegrating.
This is caused by your sweat which is slightly acidic and thus takes hold of the rubber.
There is a reason that Gamepads do not have such coating, even though having good grip is even more important there.
Also, the way the coating is used here, all it does is making the mouse look greasy after some time.

Bad switches

The less obvious issue are the used switches i.e. the things that perform the clicks.
Did you ever notice that after some time your mouse does incorrect double clicks or releases the click while drag and dropping on its own? Well, that means the switch starts wearing out.

The mouse uses OMRON D2FC-F-7N micro-switches in a cheap variant that is only rated for 10 million clicks (10M). While this sounds a lot, it yields to 6850 clicks/ per day for 4 years, which is not all that much if you think about playing a shooter or using photoshop.
The crazy part is that going for the 20M rated variant (2x the durability) only costs 50 ct more (pack of 5 on amazon). This would make the mouse merely 1€ more expensive - probably way less even as Logitech can negotiate bulk discounts on these things.
Given that the mouse is priced at 50€, I do not think we can pass this off as cost optimization.

0 Add to favourites0 Bury

25 Nov 2022 5:34pm GMT

24 Nov 2022

feedPlanet Maemo

Introducing ODRS Browser

GNOME Open Desktop Ratings is the service that enables user ratings in various Linux app stores like the Snap-Store, Gnome Software and KDE Discover.

While it nowadays works for users by providing a mostly useful star rating, from a application developer perspective the story is very grim.

Basically one only gets the users view, which provides an average rating and some reviews in the current locale.
This means you might see something like "2 Stars from 80 Reviews" - but the 3 reviews in your current locale are all 4-5 Star.
To see something else you have to change the locale and restart the app store - which is inconvenient and confusing.
As a developer, seeing the negative reviews is crucial, as people often just post bug reports there and this is the only way to find out why the app did not work for them.

Therefore I quickly hacked together a web-based browser for the ODRS service, skillfully named

ODRS Browser

This allows accessing the ODRS service from the web and shows the reviews from multiple locales at once. The idea here is that often people write reviews in english - regardless of their current locale. Currently, ODRS has no logic to detect that.

Also, if your app is packaged in different formats like snap and flatpack and deb, you can see the reviews of all variants in the overview.

Unfortunately, ODRS currently does not set the CORS header which prevents browsers from accessing it directly. The data that you see right now was scraped with python script. But once this issue is fixed, the ODRS Browser will be able to use live data.

0 Add to favourites0 Bury

24 Nov 2022 12:14pm GMT

18 Nov 2022

feedPlanet Maemo

Debugging Python with GDB on Ubuntu

Lets say you want to debug a python process that is either already running or crashing in native code. Pythons PDB is of no help here and you will have to use low-level GDB debugger. Fortunately, it comes with support for debugging high level python scripts.

However, while the actual python-gdb commands are nicely described here, that page lacks important details on how to get python-gdb in the first place. We are merely told that a python-gdb.py is needed.

On Ubuntu/ Debian, this file is included in the python3-dbg package:

sudo apt install python3.10-dbg

Installing that is sufficient, if you use the matching python3 package. You can go ahead and connect to some running python process via:

gdb -p <PID>
# verify that the script is loaded
(gdb) info auto-load
# get a python backtrace
(gdb) py-bt
Traceback (most recent call first):
  File "/usr/lib/python3.10/selectors.py", line 416, in select
    fd_event_list = self._selector.poll(timeout)
  File "/usr/lib/python3.10/socketserver.py", line 232, in serve_forever
...

In case Ubuntu is merely a host and you use coda, you can still use the host python-gdb.py - even if the python versions dont match. You will have to load the script manually though like:

(gdb) source /usr/share/gdb/auto-load/usr/bin/python3.10-gdb.py

0 Add to favourites0 Bury

18 Nov 2022 4:42pm GMT

08 Nov 2022

feedPlanet Maemo

The “idiotism” of software developers

Before you get angry at me for this title, please let me state that I count myself in the number of the "idiots" and, secondly, that what I mean by "idiotism" here is not to be intended as an offence, but as some traits of mindset which are typical of very logical brains.

Some months ago I finished reading Dostoevskiy's "The Idiot", a book about an exceedingly good-hearted man, prince Lev Mishkin, whose behaviour was puzzling the people around him so much that they thought of him as an idiot. Sure, the fact that he was suffering from epilepsy didn't help, but it was far from being the primary reason for their thinking, since his epileptic seizures were very rare (if I remember correctly, only two occurred during the time of the story) and everybody's opinion had already formed well ahead of witnessing him in such a state.

He was an idiot because he was open, trustful, and especially because he could not "read between the lines" of what was been said to him: his social conduct was straight, and although he was following at his best the customs that he had been taught, he was supposedly awkward and unable to perceive and parse all the messages that are implicitly conveyed by social behaviours and human interactions. I added the word "supposedly" because, as a matter of fact, his behaviours were all perfectly normal for me: I only noticed their awkwardness when it was pointed out by the other characters, at which point I couldn't help smiling and acknowledging that, indeed, that thing he did was weird.

However, he was a good and caring person, and not without talents: he had an interest in calligraphy, and everybody liked to listen to him, as his speech was insightful and his thoughts were original. I wonder how many of my readers can identify themselves in such a character?

I definitely can. I won't get into the details, but I've felt many times on me the amused or puzzled glance of people (like that time in high school when I could not open a door in front of dozens of people, and I heard them say "So, that guy is the genius of mathematics?" - I'll never forget that!), often without understanding the reason for their reactions. Still, generally people seem to like my company and be genuinely interested in talking to me.

So, what's wrong with prince Lev Mishkin, me, and maybe with you too? Well, a few things, I would say. I'm not going to claim any scientific truth on what I'm going to say, these are just my own impressions and deductions, which seem to be shared by other people in the interwebs too, judging from a quick search I did; take them for what they are.

The first thing I notice is some common traits between us and autistic people: we tend to work better with things, rather than with people; we can to focus on a certain thing (work, a mathematical problem, a game) and forget about the world around us; we have our unique hobbies, like solving puzzles, arguing about a specific and very narrow topic, learning artificial (both human and programming) languages; it's as if we needed to build a small, better world where we would feel safe and at ease.

The other thing, which I actually consider harmful and which I put efforts to change in my own life, is the fact that it's extremely easy to get us interested into a specific aspect of a problem, and make us forget (or just not notice) the big picture. That small part that we are looking at is stimulating and challenging, and we are led to think that it's core of the issue, and maybe of all the issues that affect our world. What is often missing is the ability to take one step back and try to look at the issue from a different angle, and especially the ability to listen for counter arguments; I mean, we do listen to them, but since we have, in a way, "gamified" the issue, even when we think that we are open to listen for the other side, we are in reality trying to win the counter-arguments, rather than genuinely trying to understanding them.

Another thing which we have, is faith. Yes, you read it right: even though the IT world is probably the one with the highest percentage of atheists, men always need something to believe in. We just don't realize it, but we do hold a blind trust in certain persons and authorities. This does not mean that this trust lives forever and cannot be broken, but this generally does not occur because of a conscious realization of ours. Much more often than we'd like to admit, the reason why we lose faith in a certain person or authority is because the rest of the persons and authorities that we trust has told us so. In other words, even if there's undoubtedly a reasoning of our own, the full realisation and conviction occurs after having collected and compared the opinions (or statements) of those we trust. The net result is that the IT population is the one most trustful of the mainstream media, because it's the mainstream media who has more "voice": that's where the most reputable journalists, scientists, activists are (and "reputable" is the key word here, since this reputation is recursively created by the mainstream media themselves or by their sponsors).

I might be biased by my own experience here, but it seems to me that there isn't a group of people more homogenous in their political (and generally, world) views than that of IT workers. When, in 2018, I saw the leaked video of Google's co-founder Sergei Brin and other executives' reaction at Trump's presidential victory, what I found most surprising was not the contents of the speech, as they were mostly mainstream opinions, but rather the fact that all this could be said in a company meeting. Something like this, I though, could never happen in an European company, as political matters are a conventional tabu in the work environment. But the point is that Brin and others could say those words only because they knew that the overwhelming majority of the audience shared the same opinion. I don't think you could find the same homogeneity of thought among shop assistants or philosophy professors.

Assuming that you have followed me this far into my rambling, and that you recognize that there might be some truth in what I wrote, you might now be wondering if there's a way to counterbalance our "idiotic" traits. Unfortunately I don't have a full answer, as myself am only halfway there (but maybe I'm too optimistic here? and does this road even ever end?), but there are a few things that I think are absolutely worth trying:

Summing up, what I want you to realize is that we IT workers are easily exploitable. All those thought manipulation techniques represent a problem to everyone, but it's particularly with us that they tend to be especially effective; as a matter of fact, I've found that awareness of how the power controls us is higher among uneducated people, because they are more distrustful of the media and just tend to consume less of it. We, on the other hand, are not only well educated to respect the authority (see Noam Chomsky on education), but our logical, detail-focused mind can be easily externally controlled by continuously stimulating it to focus on specific things and not others.

How would Dostoevskiy call us?


  1. My favourite one is: which country hosts more refugees from Ukraine?

  2. I was recently surprised when I read people in a forum who were discussing avoiding doing business with Saudi Arabia because of their human rights record. Seriously? We are talking about a government who has indirectly caused the death of more than 300 thousands people in Yemen, and your main reason to criticize them is human rights? It's like asking the police to arrest a killer because before the assassination he misgendered his victim! Yet the elephant in the room continues to go unseen.

0 Add to favourites0 Bury

08 Nov 2022 5:11pm GMT

05 Nov 2022

feedPlanet Maemo

Deride, a generator of mock objects for unit testing

If you have been writing C++ classes for mocking out your C or C++ dependencies, you know how tedious it is. I generally write small classes with just a handful of methods, so it's generally bearable, but when using third-party code I'm usually not that lucky. If the dependency is a C library this becomes especially tricky, both because they might be larger than what you can handle, and both because the lack of an object-oriented design might not offer you an easy solution to store the mock object data.

But fear no more, Deride is here!

I won't spend too many words describing it, since you can read its description from the link above, where you will also find some example code. More examples, by the way, can be found in the example/ folder in the code repository, where you can see how it can be used to mock both pure C++ and QObject-based classes, and C libraries.

What is most important for me to say now, is that the project is in alpha state, meaning that I've tried it on a handful of header files only; it's highly likely that it will not work on many real-life scenarios, and if that happens I warmly invite you to inform me by filing a bug report providing the include file that was not properly processed.

I leave you with a short example of a unit test, written using Deride. The class under test is called Stable, and internally it uses objects of type Horse, that we decided to mock. We used Deride to generate the mocked implementation and a MockHorse class which can be used to control the mocked objects. When building the test, we won't link against the original horse.cpp, but we'll only use the original horse.h; the implementation will be found in mock_horse.cpp, generated by Deride. And in the corresponding mock_horse.h file we'll find the MockHorse class with all the on<method>Called() hooks which we can use to install our callbacks (either to reimplement the object behaviour, or to just be notified on when its methods are called).

    /* This MockHorse is the object created by Deride
     *                   |
     *                   |
     *                  \|/
     *                   V
     */
    using Mock = Animals::MockHorse;

    std::list<std::string> horseNames = {
        "Tom",
        "Dick",
        "Harry",
    };

    /* We could use a vector, but let's be explicit */
    Mock *mockTom;
    Mock *mockDick;
    Mock *mockHarry;

    int createdHorses = 0;
    // onConstructorCalled() is created by Deride and called when the mocked
    // Horse object is created
    Animals::MockHorse::onConstructorCalled([&](const std::string &name) {
        std::cout << "Horse instantiated: " << name << std::endl;
        createdHorses++;
        if (name == "Tom") {
            mockTom = Mock::latestInstance();
        } else if (name == "Dick") {
            mockDick = Mock::latestInstance();
        } else if (name == "Harry") {
            mockHarry = Mock::latestInstance();
        } else {
            assert(false); // should not be reached
        }
    });

    Stable stable;
    stable.createHorses(horseNames);
    /* It's at this point that the contructor callbacks we defined above will
     * have been called. Let's double-check that indeed that's the case.
     */
    assert(createdHorses == 3);
    assert(stable.count() == 3);
    assert(mockTom != nullptr);
    assert(mockDick != nullptr);
    assert(mockHarry != nullptr);

    /* Prepare for mocking the jump; these methods are generated by Deride and
     * allow setting the return value for the corresponding jumpHeight() method
     * from the original Horse class. */
    mockTom->setJumpHeightResult(1.5);
    mockDick->setJumpHeightResult(1.7);
    mockHarry->setJumpHeightResult(1.3);

    std::string highestJumper = stable.findHighestJumper();
    assert(highestJumper == "Dick");

In my closing words I'd like to thank the Clang project, which Deride is using to parse and interpret the input files, and Jinja2, the templating engine used to generate the mock code.

0 Add to favourites0 Bury

05 Nov 2022 6:51am GMT

13 Oct 2022

feedPlanet Maemo

Fix Steam Deck Input in Desktop Mode

While older SteamOS releases used to map the right trigger to the left mouse button by default, in current SteamOS you can only click by using the touchpad. However due to the way you hold the device it is really fiddly - especially if you try to drag and drop something.

Fortunately, there is a way to fix this via a setting in Steam. For this you need launch Steam when in Desktop Mode. There, switch to big picture mode and go to

Settings > Base configuration > Desktop Configuratiom

In this view you can configure the inputs to your liking

My final configuration Trigger to click Left touchpad for scrolling

I suggest you to go with the following setup

With this configuration you can use the desktop mostly pain-free.

0 Add to favourites0 Bury

13 Oct 2022 4:32pm GMT

29 Sep 2022

feedPlanet Maemo

Using Docker with SLURM

The SLURM documentation provides you with the basic information that you can use Docker withing SLURM - as long as you use rootless Docker. However some crucial pieces are missing.

The issue that you will immediately run into is that the SLURM resource allocation is not propagated to docker at all. E.g. if you start your job with srun --gpus 1 docker ... all GPUs will be available to docker nevertheless.

The issue here is that Docker uses a manager daemon that the docker CLI communicates with. And that daemon does not know anything about SLURM or any resources it allocated for the job.

The solution is to start a daemon per job (instead of per user) as one user might want to run different jobs with different allocations on the same machine. The docker documentation gives you an idea on how to do that.

You will need to set at least the following parameters to make the daemon fully job-specific

# dockerd-rootless.sh requires XDG_RUNTIME_DIR
XDG_RUNTIME_DIR=/somewhere/including/$SLURM_JOB_ID
# export, so docker client sees it later on
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
dockerd-rootless.sh --host=$DOCKER_HOST --data-root=... --exec-root=...

Here, exporting DOCKER_HOST makes the docker CLI use the correct daemon.

The drawback of this method is that each job needs to pull the container again due to the separate data-root paths. Switching to podman might solve that.

0 Add to favourites0 Bury

29 Sep 2022 2:47pm GMT

28 Aug 2022

feedPlanet Maemo

Steam Deck SSD Upgrade

If you, like me, went with the entry level Steam Deck option with only 64 GB of internal storage, you likely realized quite soon that some games wont fit on it.

One option is to use the microSD expansion card slot. For current-gen games the throughput of only about 150 MB/s does not seem to degrade loading performance compared to a NVMe SSD.
However, given that the internal storage is upgradable, the only logical choice for keeping your PC master race status is to cram in the fastest NVME SSD inside that thing.

Specifically, you will need a one-sided SSD in the M.2 2230 for factor so it fits the space inside the Steam Deck.
I went with the KIOXIA Client-SSD BG5 512GB. Kioxia is the Toshiba spin-off for SSD drives, if you wonder about the brand. Although it is a PCIe 4.0 drive, its peak read throughput of 3.5 GB/s is within the practical limits of PCIe 3.0 of the Steam Deck.
Also, the active power consumption of 4.1W is quite close to the 3.8W drawn by the custom PHISON PS5013 E13 SSD that Valve uses.

You can follow the iFixit Guide for the steps to actually swap the SSD. Make sure to transfer the ESD shielding wrap to the new SSD.

To get Steam OS on the new drive, follow the official recovery instructions and select the "Re-image Steam Deck" script.
This will install Steam OS on the blank SSD - similar to how you would install Ubuntu from a live USB.

Benchmarking results

Next, I wanted to actually compare the speed of the upgraded NVMe SSD with the one of the stock eMMC memory. To this end I used KDiskMark - an open-source alternative to CrystalDiskMark that runs on Linux natively.

The tests were performed on SteamOS 3.3.1 using KDiskMark 2.3.0.

eMMC NVMe The median of 3 KDiskMark runs


In short, the NVME offers roughly one order of magnitude faster throughput over the eMMC.
Whether you feel this in-game, highly depends on the given game. For older titles, even the eMMC is so fast, that you cannot read the hints on the loading-screen. However, for something like the Flight Simulator 2020 that shuffles huge assets around, it will surely be noticeable.

Finally, the peak read performance of 3.5GB/s is not reached. This might be due to the PCIe 3.0 bottleneck - I did not bother putting the drive in a PCIe 4.0 device. Still, there is a significant advantage in writing performance over the older Kioxia BG4 series, that only do 1.4 GB/s.

0 Add to favourites0 Bury

28 Aug 2022 2:49pm GMT

04 Apr 2022

feedPlanet Maemo

Computing replaygain for your Music library

TLDR; command at the end of post

If you want a equal loudness for your Music library the go to solution and the de-facto standard is ReplayGain.
If you are using a music streaming service, the provider is typically taking care of that for you - but maybe you want to migrate towards your own streaming solution.

ReplayGain analyses your audio files and stores their deviation from the baseline loudness as a tag. A compatible audio player can then read the tag and correct the playback volume so all you tracks have the same loudness.

Of course things get messy once you look at details like what the baseline loudness should be and how to determine loudness in the first place. Therefore we set the baseline once and for all as 89db and consider even tracks of the same album individually. If you disagree, feel free to branch off reading up the details now.

The next issue is that ReplayGain was born in a time where mp3 was synonymous to digital music, hence the algorithm was first implemented as the mp3gain CLI tool. Nowadays you also need aacgain and vorbisgain to cover all your formats, which is cumbersome to automate.

The larger issue with ReplayGain is that it defines loudness of a track by its peak volume. While a sane choice in theory, in practice the music and advertising industries raced to increase the perceived loudness without raising the peak volume. As broadcasters also used peak volume normalization, one could blow your eardrum with that very special advertisement.
Therefore the EBU R 128 was proposed which at its core is RMS based, meaning it is considering the average volume of the track.

Remember that ReplayGain merely adds a correction value to the tracks? This allows us to compute that correction value based on the R128 algorithm for a better normalization, which is exactly what the <a href="https://github.com/desbma/r128gain">r128gain</a> tool does.
Being written in modern day, r128gain also processes all possible audio files by hooking into ffmpeg as a filter.

So, without further ado, this is the command to normalize your Music library:

# pip3 install r128gain
r128gain -p -r Music/

This will preserve "-p" the file timestamps and recursively "-r" process all files in the given directory.

Trouble shooting

Note that if you previously used mp3gain, your files might contain non-standard lower-case replaygain_* tags, while r128gain will only write REPLAYGAIN_* tags.
To avoid confusing players with different values, you should remove the non-standard tags. This can be automated with eyeD3

eyeD3 -Q --remove-frame RGAD --preserve-file-times --user-text-frame=replaygain_track_gain: --user-text-frame=replaygain_track_peak: --user-text-frame=replaygain_album_gain: --user-text-frame=replaygain_album_peak: Music/

Refer to its documentation for the meaning of the parameters. For RGAD see here.

Header Image: "volume" by christina rutz (CC-BY-2.0)

0 Add to favourites0 Bury

04 Apr 2022 4:13pm GMT

18 Feb 2022

feedPlanet Maemo

Can Std Be Cured At Home

If you've been exposed to an std or are experiencing symptoms of an std you should see a doctor about std testing. 12.01.2022 · you can choose to test for a single sti or std, or do a full panel. Start treatment discreetly with medication provided at no additional charge. Same labs as physicians & hospitals. They work better the sooner you take them.

12.01.2022 · you can choose to test for a single sti or std, or do a full panel. Chhapaar Mela, Ludhiana Punjab India 2020 Dates, Festival Chhapaar Mela, Ludhiana Punjab India 2020 Dates, Festival from www.travelwhistle.com Echinacea tea also helps to treat tonsils with white spots on the throat along with boosting your … 22.07.2021 · chlamydia can be easily cured with antibiotics. Our providers can review the results of urine or blood tests that are ordered and collected by an outside lab to determine if you have an std, and provide a treatment recommendation, which may include a prescription. Majority of these are found in china with a few of them prevalent in asia and the mediterranean region. Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil. 16.08.2021 · syphilis can be cured with antibiotics. They work better the sooner you take them. Cdc recommends a single dose of 500 mg of intramuscular ceftriaxone.

Sometimes there are no symptoms at all.

05.07.2017 · epimedium belongs to the flowering plants of the family berberidaceae. 12.02.2020 · get std testing and treatment online. Echinacea tea also helps to treat tonsils with white spots on the throat along with boosting your … Alternative regimens are available when ceftriaxone cannot be used to treat urogenital or rectal gonorrhea. They work better the sooner you take them. Once your results come back the doctor will. Majority of these are found in china with a few of them prevalent in asia and the mediterranean region. Start treatment discreetly with medication provided at no additional charge. This can be done online through plushcare. 12.01.2022 · you can choose to test for a single sti or std, or do a full panel. Cdc recommends a single dose of 500 mg of intramuscular ceftriaxone. Gonorrhea can be cured with the right treatment. 16.08.2021 · syphilis can be cured with antibiotics.

Once your results come back the doctor will. Although medication will stop the infection, it will not repair any permanent damage done by the disease. 12.02.2020 · get std testing and treatment online. They work better the sooner you take them. Our top doctors are able to write std testing orders and will refer you to your local lab for testing.

22.07.2021 · chlamydia can be easily cured with antibiotics. Stone Columns | Mountain Home Architects, Timber Frame Stone Columns | Mountain Home Architects, Timber Frame from www.homearchitects.com We now have very effective treatments for hiv. Sometimes there are no symptoms at all. 12.02.2020 · get std testing and treatment online. 12.01.2022 · you can choose to test for a single sti or std, or do a full panel. Cdc recommends a single dose of 500 mg of intramuscular ceftriaxone. Medication sent to you, at no extra cost. Confidential results in 2 to 5 days. Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil.

Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil.

Same labs as physicians & hospitals. This can be done online through plushcare. 22.07.2021 · chlamydia can be easily cured with antibiotics. 12.02.2020 · get std testing and treatment online. Echinacea tea also helps to treat tonsils with white spots on the throat along with boosting your … Our top doctors are able to write std testing orders and will refer you to your local lab for testing. We now have very effective treatments for hiv. Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil. If you've been exposed to an std or are experiencing symptoms of an std you should see a doctor about std testing. 12.01.2022 · you can choose to test for a single sti or std, or do a full panel. 16.08.2021 · syphilis can be cured with antibiotics. Confidential results in 2 to 5 days. Medication sent to you, at no extra cost.

Medication sent to you, at no extra cost. Cdc recommends a single dose of 500 mg of intramuscular ceftriaxone. They work better the sooner you take them. Although medication will stop the infection, it will not repair any permanent damage done by the disease. 16.08.2021 · syphilis can be cured with antibiotics.

Sometimes there are no symptoms at all. Stone Columns | Mountain Home Architects, Timber Frame Stone Columns | Mountain Home Architects, Timber Frame from www.homearchitects.com Medication sent to you, at no extra cost. 09.09.2021 · it is the only way you can know for sure if you have hiv or an std. Start treatment discreetly with medication provided at no additional charge. Same labs as physicians & hospitals. Alternative regimens are available when ceftriaxone cannot be used to treat urogenital or rectal gonorrhea. Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil. If it's difficult to access a doctor or other healthcare professional, fully … Gonorrhea can be cured with the right treatment.

Sometimes there are no symptoms at all.

09.09.2021 · it is the only way you can know for sure if you have hiv or an std. If you've been exposed to an std or are experiencing symptoms of an std you should see a doctor about std testing. This can be done online through plushcare. Echinacea tea also helps to treat tonsils with white spots on the throat along with boosting your … Although medication will stop the infection, it will not repair any permanent damage done by the disease. We now have very effective treatments for hiv. They work better the sooner you take them. If it's difficult to access a doctor or other healthcare professional, fully … Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil. Gonorrhea can be cured with the right treatment. Start treatment discreetly with medication provided at no additional charge. Our top doctors are able to write std testing orders and will refer you to your local lab for testing. Majority of these are found in china with a few of them prevalent in asia and the mediterranean region.

Can Std Be Cured At Home. These medications are available to everyone who needs them in king county, wa. Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil. Gonorrhea can be cured with the right treatment. 09.09.2021 · it is the only way you can know for sure if you have hiv or an std. This can be done online through plushcare.

Echinacea tea also helps to treat tonsils with white spots on the throat along with boosting your … Ayusya Home Health Care Pvt Ltd-Bangalore-Chennai-Madurai Source: www.ayusyahomehealthcare.com

Alternative regimens are available when ceftriaxone cannot be used to treat urogenital or rectal gonorrhea. Although medication will stop the infection, it will not repair any permanent damage done by the disease. Confidential results in 2 to 5 days. Our top doctors are able to write std testing orders and will refer you to your local lab for testing. Majority of these are found in china with a few of them prevalent in asia and the mediterranean region.

Untreated stds are leading causes of infertility (inability to make a baby) for both men and women. 10 New Fixtures to Illuminate the Outdoors | Architectural Source: cdnassets.hw.net

Start treatment discreetly with medication provided at no additional charge. Although medication will stop the infection, it will not repair any permanent damage done by the disease. 09.09.2021 · it is the only way you can know for sure if you have hiv or an std. 12.01.2022 · you can choose to test for a single sti or std, or do a full panel. Same labs as physicians & hospitals.

Confidential results in 2 to 5 days. Making Easy and Fun Food Molds with Silicone Putty Source: www.smooth-on.com

16.08.2021 · syphilis can be cured with antibiotics. We now have very effective treatments for hiv. This can be done online through plushcare. Echinacea tea also helps to treat tonsils with white spots on the throat along with boosting your … 22.07.2021 · chlamydia can be easily cured with antibiotics.

Same labs as physicians & hospitals. Pachmarhi hill station Source: welcomenri.com

22.07.2021 · chlamydia can be easily cured with antibiotics. Our top doctors are able to write std testing orders and will refer you to your local lab for testing. This can be done online through plushcare. 16.08.2021 · syphilis can be cured with antibiotics. 05.07.2017 · epimedium belongs to the flowering plants of the family berberidaceae.

Although medication will stop the infection, it will not repair any permanent damage done by the disease. Sexually Transmitted Disease Surveillance, 2019 Source: www.cdc.gov

Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil. Cdc recommends a single dose of 500 mg of intramuscular ceftriaxone. Gonorrhea can be cured with the right treatment. If it's difficult to access a doctor or other healthcare professional, fully … 05.07.2017 · epimedium belongs to the flowering plants of the family berberidaceae.

Sometimes there are no symptoms at all. Chhapaar Mela, Ludhiana Punjab India 2020 Dates, Festival Source: www.travelwhistle.com

Medication sent to you, at no extra cost. If you've been exposed to an std or are experiencing symptoms of an std you should see a doctor about std testing. Although medication will stop the infection, it will not repair any permanent damage done by the disease. Emphasizing again on the fact that tonsillitis can be cured with simple home remedies if the bacterial infection has not caused a serious effect or else antibiotics will be prescribed by your doctor.salt water gargle can be the easiest way to treat an inflamed tonsil. We now have very effective treatments for hiv.

09.09.2021 · it is the only way you can know for sure if you have hiv or an std. Stone Columns | Mountain Home Architects, Timber Frame Source: www.homearchitects.com

Start treatment discreetly with medication provided at no additional charge. 16.08.2021 · syphilis can be cured with antibiotics. Same labs as physicians & hospitals. If it's difficult to access a doctor or other healthcare professional, fully … Medication sent to you, at no extra cost.

These medications are available to everyone who needs them in king county, wa. Commercial & Residential Construction - DWL Construction Source: www.dwlconstruction.com

Our providers can review the results of urine or blood tests that are ordered and collected by an outside lab to determine if you have an std, and provide a treatment recommendation, which may include a prescription. 12.01.2022 · you can choose to test for a single sti or std, or do a full panel. If it's difficult to access a doctor or other healthcare professional, fully … They work better the sooner you take them. If you've been exposed to an std or are experiencing symptoms of an std you should see a doctor about std testing.

0 Add to favourites2 Bury

18 Feb 2022 12:28pm GMT

17 Feb 2022

feedPlanet Maemo

Maemo Community e.V. - Invitation to the General Assembly 2022

Maemo Community e.V. - Invitation to the General Assembly 2022

Dear Member,

The meeting will be held on Thursday, March 17th 2022 at 20:00 CET on irc.libera.chat channel #maemo-meeting.

Unless any further issues are raised, the agenda includes the following topics:
1. Welcome by the Chairman of the Board
2. Determination of the proper convocation and the quorum of the General Assembly
3. Election of the Board Directors
6. Any other business

Requests for additions to the agenda must be submitted to the Board in writing one week prior to the meeting (§ 9.2 of the Statutes).

On Behalf of the Maemo Council, Jussi Ohenoja

0 Add to favourites0 Bury

17 Feb 2022 8:00am GMT

14 Feb 2022

feedPlanet Maemo

Honquest Funeral Home Loves Park Il

Stanislaus church, 201 buckbee, rockford, il 61104. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Obituary | Jason Hunt of Lubbock, Texas | Hillcrest Obituary | Jason Hunt of Lubbock, Texas | Hillcrest from www.hillcrestfuneralhomelittlefield.com Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Stanislaus church, 201 buckbee, rockford, il 61104.

Stanislaus church, 201 buckbee, rockford, il 61104.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Stanislaus church, 201 buckbee, rockford, il 61104. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Stanislaus church, 201 buckbee, rockford, il 61104. Shelly Kanneberg Obituary - Machesney Park, IL Shelly Kanneberg Obituary - Machesney Park, IL from dux7id0k7hacn.cloudfront.net Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Stanislaus church, 201 buckbee, rockford, il 61104.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Obituary for Kathleen Ann James | Honquest Family Funeral Obituary for Kathleen Ann James | Honquest Family Funeral from s3.amazonaws.com Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Stanislaus church, 201 buckbee, rockford, il 61104. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

Honquest Funeral Home Loves Park Il. Stanislaus church, 201 buckbee, rockford, il 61104. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Stanislaus church, 201 buckbee, rockford, il 61104. Mulford Facility | Honquest Family Funeral Homes Source: s3.amazonaws.com

Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Shelly Kanneberg Obituary - Machesney Park, IL Source: dux7id0k7hacn.cloudfront.net

Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

Stanislaus church, 201 buckbee, rockford, il 61104. Obituary for Robert E. Mueller | Honquest Family Funeral Homes Source: s3.amazonaws.com

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Stanislaus church, 201 buckbee, rockford, il 61104. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Obituary | MaryLou Reeser | Unger-Horner Funeral Home Source: www.ungerhorner.com

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Stanislaus church, 201 buckbee, rockford, il 61104.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Find Richard Lewis at Legacy.com Source: cache.legacy.net

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Obituary | Jason Hunt of Lubbock, Texas | Hillcrest Source: www.hillcrestfuneralhomelittlefield.com

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Stanislaus church, 201 buckbee, rockford, il 61104. Obituary for Carol Ann McKnight-Foster | Honquest Family Source: s3.amazonaws.com

Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm. Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st.

Stanislaus church, 201 buckbee, rockford, il 61104. Obituary for Terri Lynn Hemphill | Honquest Family Funeral Source: s3.amazonaws.com

Stanislaus church, 201 buckbee, rockford, il 61104. Mass of christian burial will be held at 10:00am on friday, january 28, 2022 in st. Mulford rd., loves park, il 61111 on thursday january 27, 2022 from 4:00 to 6:30pm.

0 Add to favourites1 Bury

14 Feb 2022 12:41pm GMT

25 Dec 2021

feedPlanet Maemo

Debugging the “Factory mode” of BQ devices in Ubuntu Touch

As you know, I'm trying to get the FM radio to work in Ubuntu Touch, and I basically have it working on the Redmi Note 7 Pro. But then I remembered that the BQ Aquaris E4.5 (which is the first commercial device officially supporting Ubuntu Touch) also comes with an FM radio, so I decided to put some effort in getting that to work, too. You might think it's a waste of time, but as a matter of fact this device is built on a Mediatek SoC, and FM radio support is exposed to userspace in a very similar way across all Mediatek devices - so this work should be covering other devices as well.

It was relatively easy to get the FM radio to work on this phone: I can now tune to a frequency and see that the RDS data is received, but I cannot get any sound out of the speakers or headphones, which makes the whole radio experience a bit, uhm… suboptimal, let's say.

The problem is not new: back in the days when Ubuntu Touch was still supported by Canonical, sturmflut was trying to get the FM radio to work, and he met the same issues (see this and this messages in the mailing list). He also spent some time investigating how the Factory mode works (the FM radio is indeed one of the features that can be tested via the Factory mode, and it does work) and he mentioned that he could get gdb to attach to the factory mode program and could see the various ioctls being executed. Yesterday I tried to follow the same steps, but I failed quite soon: I simply could not connect with adb shell while the device was in factory mode, so no chances of debugging for me. ☹

Out of dispair, I tried just to manually run the program /system/bin/factory inside a Lomiri session and, to my surprise, it overlayed its yellow "Factory Mode" title on the screen - just to immediately quit afterwards. I tried running it with strace, and noticed these lines:

open("/sys/class/BOOT/BOOT/boot/boot_mode", O_RDWR|O_LARGEFILE) = 15
read(15, "0\n", 4)                      = 2
close(15)                               = 0
writev(5, [{"\3", 1}, {"FTM\0", 4}, {"[FTM UTILS] Unsupported factory "..., 39}], 3) = 44
writev(5, [{"\6", 1}, {"NVRAM\0", 6}, {"[MAIN] Unsupported Factory mode\n"..., 33}], 3) = 40

Of course, the /sys/class/BOOT/BOOT/boot/boot_mode file is read-only, so I couldn't just write 1 into it, but could a bind-mount work? Indeed it did! And after a few attempts, I verified that writing a value of 4 in the boot_mode file made the factory program happy. It was still unusable because it was acting as if the volume down button was being constantly pressed, so the cursor was always moving downwards, but killing the Lomiri session did the trick. In short, these are the steps you need to follow in order to run the Factory Mode from an ordinary boot session:

sudo -i  # become root
echo 4 > /tmp/trick
mount -o bind /tmp/trick /sys/class/BOOT/BOOT/boot/boot_mode
service lightdm stop  # wait a few seconds until this returns
unset LD_PRELOAD
/system/bin/factory

What is more surprising, is that the FM radio test is working even in this environment, and you can actually hear the sounds (for some reason, the FM radio item takes about 40 seconds to initialize when run under these conditions, but it eventually works). At this point, not only I could run gdb (which I didn't), but I could even run the factory program under strace and collect the logs.

At the moment of writing this post, I haven't yet examined the logs, so I'm not at all sure that they'll be enough to make audio work (I suspect that the factory mode binary might be playing some tricks that are somehow not replicable in a proper Linux system with Pulseaudio and lots of other services running), but I do have enough information to make at least a few attempts.

Stay tuned, and have a Merry Christmas!

0 Add to favourites0 Bury

25 Dec 2021 7:13am GMT

19 Dec 2021

feedPlanet Maemo

Improving Qt

We are a few years further. A few years in which we all tried to make a difference.

I'm incredibly proud of my achievement of QTBUG-61928. At the time I thought I could never convince the Qt development team of changing their APIs. They did and today in Qt6 it's all very much part of the package.

I want to thank Thiago and others. But I also think it's a team effort. It might not be because of just me. But I still feel a little bit proud of having pushed this team just enough to make the changes.

I am now at a new Qt bug report. This time it's about int64_t. I think that QModelIndex should be completely supporting it. Again, I think a lot. And I have a lot of opinions. But I anyway filed QTBUG-99312 for this.

0 Add to favourites0 Bury

19 Dec 2021 5:49pm GMT

07 Dec 2021

feedPlanet Maemo

Enabling the FM radio in Ubuntu Touch

I recently realized that my Xiaomi Redmi Note 7 Pro, on which I installed Ubuntu Touch not so long ago, has a working FM radio. One of the many psychological bugs of mine is the irrational urge I feel of having my hardware, no matter whether I use it or not, supported by Linux. So, the fact that I never listen to the radio is unfortunately not a reason to dissuade me from wasting time on getting the FM radio working in Ubuntu Touch.

This post is a quick summary of my investigation, which should serve as a note keeper for when I'll actually get to implement the feature.

The Android story

It was a bit surprising to find out that Android does not offer an API to use the FM radio, meaning that we cannot simply expose an API via libhybris. Every manufacturer is therefore choosing their own API, and Android applications are most often developed for a specific chipset family, or need to carry the code to support all the various devices.

For example, I found the RFM Radio Android application which supports a few Qualcomm Snapdragon processors, for which the FM radio functionality is exposed by a kernel driver via the V4L API. This means that the FM radio is probably working out of the box with QtMultimedia's QRadioTuner. Unfortunately the Note 7 Pro uses a newer Snapdragon, and even after some days of investigations I couldn't find out how the radio driver communicates to the userspace; but more on this below. Other chipsets offer other APIs, and I was glad to find that someone already wrote a Ubuntu Touch FM radio application for the Volla phone, which has a Mediatek board.

Anyway, the lack of a unified FM radio API is probably the reason why most of the so-called "FM radio" applications on Android are not really using the FM radio but rather streaming audio from the internet.

The FM radio in the Note 7 Pro

Before I start talking about a phone that no one cares about, let me say that what I'm going to write applies to several other Snapdragon chipsets and could be relevant to other phones. For one, the Redmi Note 9 Pro uses the very same bluetooth chipset as the Note 7 Pro (and in case you are wondering why I mentioned bluetooth, it's because the FM radio functionality is delivered by the same BT chip), so all what I'm going to write here is also relevant for that phone.

In order to figure out how the radio worked on this device, I took the drastic decision to reflash the stock Android (well, MIUI), started the preinstalled FM radio application, and meanwhile looked at the logcat messages (I'm not sure if this is needed, but before doing so I went to the "Developer options" in the system settings and set the debugging level to the maximum). Among a lot of noise, this showed me lines like these:

I android_hardware_fm: Opened fm_helium.so shared object library successfully
I android_hardware_fm: Obtaining handle: 'FM_HELIUM_LIB_INTERFACE' to the shared object library...
D FmReceiverJNI: init native called
D android_hardware_fm: BT soc is cherokee
I android_hardware_fm: Init native called
I android_hardware_fm: Initializing the FM HAL module & registering the JNI callback functions...
D radio_helium: ++hal_init
D fm_hci  : ++fm_hci_init
I fm_hci  : hci_initialize

Well, even without knowing nothing about all what these lines meant, I had something I could search the internet for. So I found the Qualcomm FM code in CodeAurora, and search for the code relative to my Snapdragon 675 (aka sm6150). I quickly gave up on trying to make some sense out of the git tag naming in that repository, and just tried to search for a tag which could be referring to my device. I found one, and started browsing its source tree.

It turns out that Qualcomm provides a Java package which applications can use, and which internally dlopen()s the fm_helium.so library, which in turn depends on the libfm_hci.so library. I had a quick look at the source code of these libraries, which are also present in the repository, but decided that I would have had more chances of success if I just tried to follow the JNI code, and in particular the android_hardware_fm.cpp file. I'm not sure why this code is not using the C structure types defined in the headers provided by the helium library, and instead redefines all the constants and accesses the character buffers by offsets - it might be just for historical reasons - but in any case I decided to follow along.

The fm-bridge program

Since we have a rather net separation between the Ubuntu Touch and the Android worlds (the Android services are running inside an LXC container, with all their Android libs and dependencies), one should not attempt to write an Ubuntu process that loads the Android libraries, because the libc used in Android is different, so things are likely not to work. But we can have Ubuntu and Android processes communicate over a socket or other kind of IPC; so, what I decided to go for, is writing a small C program that will live in the Android side, it will talk to the FM radio (via helium_fm), and accept commands / give replies via its stdin / stdout.

I unimaginatively called it "fm-bridge", and you can look at its horrible code here. Really, I just said it was terrible, so why did you look at it? I definitely need to rewrite it from scratch, possibly using the helium headers, but as a proof of concept this also works. Then I carefully examined the logcat output while using the MIUI FM radio application in Android, and figured out what was the command sequence I had to input into fm-bridge's standard input in order to have it tune onto a given frequency. I'm publishing the commands here too, should I ever lose my notes:

enableSlimbus 1
setControl 0x8000004 1
enableSoftMute 1
setControl 0x8000029 0
setControl 0x800000c 1
setControl 0x800000d 1
setControl 0x800000e 1
setControl 0x800002b 0
setControl 0x8000007 4
setControl 0x8000006 0x40
setControl 0x8000006 0x40
setControl 0x8000011 0
setControl 0x800000f 1
getControl 0x8000010
setControl 0x8000010 0xef
setControl 0x800000f 1
setControl 0x800001b 1
setControl 0x8000012 0
setFreq 89300
setMonoStereo 1

I'm sure that not all of them are needed, but I'll figure out the optimal sequence later. In order to use this program on Ubuntu Touch, I had to alter the vendor partition to add this program, but also the fm_helium.so and libfm_hci.so libraries (more on that below).

When feeding the above commands to the fm-bridge in Ubuntu, I saw that I was getting a logcat output similar to the one from Android, which was mildly comforting. No sound was comint out of the speaker or out of the earplugs, but I was hardly expecting it all to work at the first try. And I got convinced that the FM tuner was indeed working, because typing the command "startSearch 1" made a new frequency appear in the logs, proving that the tuner had found another station and tuned onto it.

Getting the sound out

This was actually the easiest of the steps, thanks to the Ubuntu Touch FM radio application we have for the Volla: its source code mentions a few pulseaudio commands that worked perfectly in the Note 7 Pro too, despite the fact that the underlying chipset is totally different. This should not be as surprising as it might sound like, given that Android has a common audio API.

Just for my future reference, the commands are these:

pacmd set-source-port 1 input-fm_tuner
pactl load-module module-loopback source=1 sink=0

Ta-daaa! The radio was now playing from the phone loudspeakers! It was indeed quite loud, and the volume buttons did not seem to have any effect on it, but the volume can be controlled with pulseaudio:

pactl set-source-volume 1 50%

Of course, if we ever manage to make this into an Ubuntu Touch feature, we'll have to find a way to make the volume respond to the volume buttons.

Addind the needed files to the vendor partition

The simplest approach (and the one I took initially) is that of downloading the vendor.img into your PC, loop-mounting it, adding the fm_helium.so, libfm_hci.so and fm-bridge files to it and then umount the partition and reflash it (remembering to converting it from/to a sparse image before downloading/uploading it). This approach works flawlessly, but I'm wondering if one might incur into issues if the version of the NDK used to compile fm-bridge is different from the one that was used to compile the other vendor binaries, so I decided to give it a try to build the whole vendor partition myself.

This turned out to be a non trivial process, because I was using the Halium tree to build the vendor image, and not the LineageOS which was used to build the vendor image for my device: I could make an image, but it took some time before I figured out which were the needed packages that somehow got lost because of the Halium changes and that had to be added to the Makefile.

To help my weak memory, I expanded the README file in the violet port with the steps needed in order to build the vendor image.

A system service for the FM radio

While it could be possible for Ubuntu Touch applications to directly access the FM radio device in the same way that Android applications do, this is suboptimal for a few reasons. Even if we provided a shared library to deal with the various radio chipset implementations, the application would either need to be unconfined, or we'd had to provide an ever-changing AppArmor profile that peeks new holes every time that a new device implementation is added (and what if this implemenation uses a generic kernel device, which could be used for other goals too?) and in any case we'd have to make this policy restricted, since the RDS data provided by the radio stations would reveal the user location (well, the city at least) to the application. Not to talk about concurrent access to the radio device if two applications attempt to use it.

Therefore, my proposition (and what I'll implement, if I'll live long enough or if someone doesn't beat me to it) is to have a system service deal with the various hardware differences and expose a D-Bus API that will be hooked up as a QRadioTunerControl plugin, so that Qt applications will be able to just use the QtMultimedia APIs to access the radio.

The service would also need to talk to the trust-store, to let the user decide whether the application should really be granted access to the FM receiver (and when using the turst-store, this decision is remembered, and revocable from the System Settings's Security panel). Of course we'll also need to add a fm-radio AppArmor policy to let applications use this service.

0 Add to favourites0 Bury

07 Dec 2021 4:41pm GMT

03 Nov 2021

feedPlanet Maemo

Breaking free of Google

This post will be for those of you that care about privacy - i.e. if you want that information about you is exclusively under your control.
In that context not only Google is to blame, but actually most of the cloud services we know and use today.

Still Google will serve us as a nice placeholder as it is the market-leader when it comes to providing free services in exchange for your user-profile that Google in turn uses to sell target advertising. Even if you are fine with that, Google is also infamous for killing services - which might hit the one you rely on eventually.

As the world is moving mobile-first, a prerequisite for replacing a service is that we can easily integrate the replacement with an Android device.
Some might wonder why I chose Android here, given that it is made by Google. See, the problem is not who makes a service/ device, but who controls it. And with Android the main leverage for Google is bundling its services. If you take them away, the device itself is fully under your control - in contrast to Apple/ iOS.

Now, that we set the stage, lets start with:

Nextcloud

At the heart of our efforts will be Nextcloud. This started as an open-source alternative to Dropbox/ Google Drive, but is nowadays grown into a platform for a plethora of different services.
The main selling-point is that you can just install Nextcloud on your own machine - ensuring that your data stays private. The software being Open-Source also means that it is not under control of a single corporation - in fact Nextcloud was forked from its predecessor Owncloud after a corporation tried to put the screws on its users.

Note, that if you are serious about this, you will need to invest around 500€ to get a machine for hosting that is decently fail-safe. If you rather want to be cheap, you can also just use a RaspberryPi to get away with less than half of that amount. For inspiration, you can take a look on the built I use or on the list of commercial nextcloud device providers.

Files & Photos

By using the Nextcloud Android App, you can directly replace Google Drive/ Dropbox as this is the core functionality of Nextcloud.

Additionally, the App allows you to automatically back-up your Photos/ Videos and free the local storage so you can stop using Google Photos too.

Contacts & Calendar

Nextcloud also supports Contacts and Calendar out of the box. To integrate them with into your Android Device there is the DAVx5 app. This app will function as an additional data provider, so you can just continue using the stock Google Contacts and Calendar apps. Those will, however, stop sending any data to Google.

This is especially useful, if you run a small-business and must ensure that your customer data is private according to the CCPA/ GDPR.

Nextcloud News

An often overlooked part of your privacy is Google News (also part of Google Now). Each time you view an article there, Google can mine your interests and political views - similar to what Facebook does. And by now you should know where these things can lead.

Another drawback here is that the Google Algorithm will create a bubble for you by only showing content coherent with your current world-view.
I still prefer to manually choose the news sources - to create that bubble myself.

To do that, one usual subscribes some Web-feeds using a Feed aggregator like the Feedly service - similar to what Google Reader used to offer, before being killed by Google.

The go-to app here is Nextcloud News combined with the Android App for a pleasant mobile usage.

Music

Most of you are probably just stream music via Spotify/ Youtube Music, but keep in mind that these services merely rent the songs and as such they can arbitrarily disappear from your library.

Therefore, I like to have my own copy of the song. Unfortunately it is very inconvenient to juggle mp3s around for getting the music to various devices.

Google Play Music used to offer best of both worlds for me, where you could upload your own music files and manage your playlists in one place. Additionally, you could make the music available offline by pinning individual playlists on your device.
Unfortunately, that concept did not allow Google to arbitrarily inject ads into my music stream and therefore the service got killed as well.

Nextcloud Music to the rescue! This app picks up your music library via Nextcloud files and allows to stream that via the Browser or the Subsonic API.
This is where the DSub Android Player takes over. As with Play Music, you can either stream the library or pin individual songs/ playlists for offline use. Note: untick the "Authorization Basic headers" box when setting-up Nextcloud Music.

Other

If you clicked on the links above, you probably noticed the F-Droid alternative app store for Android.
Getting your apps there ensures that you are using verified packages and open-source software. You can easily use it alongside with the Play Store. If that is too inconvenient for you, all of the above apps are also available via the Play Store.

Finally, there is the web-browser. If you do not log in with your Google Account, using Chrome is mostly safe. However, I suggest switching to Firefox. See the my original article on that topic for details. In short; the main reason is the availability of extensions. Those allow you to block ads on the mobile web too and use Youtube in the backround.

Header Image: Digital Chains by stanjourdan (CC-BY-SA-2.0)

0 Add to favourites0 Bury

03 Nov 2021 8:34pm GMT