For GOG on Linux, use Minigalaxy

For other Linux gamers wishing GOG Galaxy had a client for Linux, there’s an open source project that provides most of the critical features, namely easy download install and updating. It’s called Minigalaxy and available for most distros.

It even allows you to install Windows-only games via Wine, and assuming you have DXVK configured for your Wine instance, I’ve found many games play reasonably well out of the box.

To install it on Fedora, simply enter: sudo dnf install minigalaxy
Then launch it, enter your account credentials, and you’re ready to go.

Find it on GitHub here:

Home Rooftop Solar Panels in Arkansas

My spouse and I have wanted to reduce our carbon footprint and utilize renewable energy for a while, but it had to make sense. Our utility provider offers a “renewable investment” where we invest $$$ into their renewable implementation and we get X% off our bill – but this never made financial sense, it would never pay for itself. So we looked into installing rooftop solar. Our setup makes financial sense while also reducing our carbon footprint. Going Solar is Arkansas is definitely do-able.

The System


The panels are LG NeON 2 High-Efficiency 335W 60-cell photovoltaic solar panels. Total output capacity of the system is 8.04Kwh. The panels ratings include for high wind and baseball sized hail, which are important considerations in my region. They come with a 20-year parts guarantee, 25-year performance guarantee, and they are rated to produce 90% of their original output when they reach the 25 year mark.

Our system is grid-tied, meaning we supply our excess power generation into the grid, which accumulates as credit, and we pull on that accumulated credit at night, cloudy days, or seasons with higher utilization (like summer).

22 panels on the west roof (photo taken after 5pm)

Most of our West-facing rooftop is unshaded year-round, so there we have 22 panels, but for a 100% electricity use offset we needed 2 more panels. We had the option between placing panels in the Southwest corner of our roof and accept that they would be shaded during peak solar hours through portions of the year, or we could put the 2 panels on our South-facing gable over our garage, where they would be shaded through some of the morning but have more peak hours year-round. We went with the latter plan, so 22 panels on the west roof and 2 on the garage.

2 panels on the garage

The panels are mounted through the roof on railing that keeps them elevated from the roof, allowing them to stay cool while they absorb sunlight. The railing is also necessary to distribute the weight of the panels evenly on the roof. The panels themselves, by keeping direct sunlight from reaching the roof, should also help reduce indoor heat accumulation during warmer months.

Roof mounting during installation

Each panel connects to an Enphase IQ7 Microinverter underneath, and the wiring runs through the attic and to the Enphase control module near the electric meter.

Photovoltaic control system

Electricity goes both directly into our home and any excess goes into the grid. The Enphase control system tracks system production and grid utilization to provide realtime and long-term statistics on grid net usage/contribution. This information is directly available to the consumer through the Enphase Enlighten website and mobile app.

For those with more of a DIY/devops disposition, the solar controller has an undocumented API that some on Github have found ways to tap into directly. You can see my real-time solar production stats here.


There isn’t much to tell here.

  • We signed for the system in early/mid February.
  • February through March: The installers went through the regulatory approval process with the city and the POA.
  • Late March: physical installation completed in 1 day.
  • Mid April: the city inspected the installation.
  • At the end of April: the power company inspected the installation and installed the net meter.

Cost and Return on Investment

My Enlighten lifetime production statistics for the past 3 weeks

In the 3 weeks since starting, we have produced nearly 645kWh, and netted 356kWh into the grid. The goal is to net a decent excess of electricity in the Spring, so that in Summer there is credit to draw on in the event that production doesn’t cover the utilization created by air conditioning. Our installation didn’t complete in time to maximize that timetable for this calendar year, but we still seem to be on track to avoid large electricity bills this summer.

Total cost for the system, before the 26% Federal tax credit in 2020 and any sales incentives, is $33,305. The state of Arkansas allows for 20-year zero-down solar loans. During our first few years our solar payment will be only slightly higher than our previous average monthly electric bill.

With normal regular rate increases from the utility company, our prior electric bill would have exceeded our flat solar payment in approximately 7 years. That makes our return on investment occur somewhere near year 12 of owning the system. The solar loan requires that, to keep to our current monthly payment, we redirect our Federal solar tax credit into the solar loan to reduce the principle cost of the system.

Thanks to Arkansas’ generous 1:1 net metering rules, all excess power that we generate and do not use becomes a full per-watt credit on our account. With our particular power company, if we maintain a credit for 24 months, we can request a check for the wholesale rate of our excess power generation.

Our solar installation makes financial sense and has a sound return on investment, while also reducing our carbon footprint. Prohibiting factors for you going solar would be shade, minimal electricity usage, or exceedingly high electricity usage. I think higher usage actually makes it easier to go solar as a quicker return on investment, but the upfront price tag might be higher than most want.

With home appliances always becoming more efficient, and our system rated to produce 90% of its original output in 25 years, this system could last us for the rest of our lives.

Installer: Performance Guarantees and Service

For the installation of our system, we used SunPro out of North Little Rock. We chose them because:

  • SunPro guarantees the annual production of the systems they install, or they pay you the difference
  • They use top-tier panels from LG and offer them at the best prices
  • They guarantee the quality of their work for 20 years
  • SunPro’s parent company also does roofing, so they have a separate income stream from solar
  • SunPro has the largest footprint across the Southern United States for solar installers
  • Despite not living near Little Rock, their installation team was just as available and prompt as if they were local

SunPro also has a potentially lucrative referral system, where they will give both the referrer and the new customer cash just for taking a meeting, no obligation. If you’re interested, feel free to email me at erik [at]

To answer the most common questions I get:

  • So what happens if you need a new roof? The installers will take the panels down and store them for a flat rate, then put them back up when the roofing work is complete.
  • Why don’t you have batteries, isn’t the point to be off-grid? While many people do install solar panels to be off-grid, and solar companies will gladly sell home batteries to you, it doesn’t make sense as a financial return on investment. Batteries will double the cost of the solar installation.

Side-note: If you are interested in having some amount of off-grid power power during power outages, and have no shading potential, the SMA Sunny Boy line of string inverters offer 1 electrical outlet that can be powered directly from the panels. Some think of it as a gimmick, but I could see it being handy to charge phones or other emergency item during a power outage. As long as there is sunshine.

Enabling amdgpu on Fedora 31 for using Vulkan with R7 and R9 Radeon cards

For the AMD Radeon R9 390, Fedora will, by default, use the open source driver ‘radeon’ – which is generally sufficient for average workloads, but if you want to game, or want to use Vulkan, you probably want the AMD-written open source driver ‘amdgpu’. It is not just a matter of installing the driver, and some extra configuration will be required to utilize this driver for graphics cards in the Southern Islands and Sea Islands family of AMD cards, since support for these models is considered experimental.

The solution also varies depending on whether your card is Southern Islands or Sea Islands.

Card FamilyModelsModule Parameter
Southern IslandsHD7750-HD7970, R9 270, R9 280, R9 370X, R7 240, R7 250amdgpu.si_support=1
Sea IslandsHD7790, R7 260, R9 290, R7 360, R9 390amdgpu.cik_support=1

First, determine which kernel driver is currently in use: lspci -k | grep -EA3 'VGA|3D|Display'

If your Kernel driver in use result says amdgpu you’re working, there’s nothing for you to do except install Vulkan (if that’s your goal). If your result says radeon, read on.

  1. Install the amdgpu driver, along with Vulkan (both x64 and x86): sudo dnf install xorg-x11-drv-amdgpu mesa-vulkan-drivers.x86_64 mesa-vulkan-drivers.i686 vulkan-loader.x86_64 vulkan-loader.i686 vulkan-tools
  2. If you plan to use Vulkan with Wine: sudo dnf install wine-dvxk.x86_64 wine-dvxk.i686
  3. The GRUB Bootloader needs to be modified to (a) disable the ‘radeon’ driver for your card and (b) enable the module parameter for amdgpu. Edit /etc/default/grub append one of the following inside the quotes on the GRUB_CMDLINE_LINUX line:
    • For Southern Island cards: radeon.si_support=0 amdgpu.si_support=1
    • For Sea Island cards: radeon.cik_support=0 amdgpu.cik_support=1
  4. Build the GRUB config:
    • For EFI systems: sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
    • For BIOS systems: sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  5. Reboot.

If everything went according to plan, after reboot you should be able to login and run vulkaninfo without errors. Now you can install Lutris, use Proton on Steam, or do any of the other things that Vulkan allows.
If your GUI doesn’t load after reboot, you can restore your machine back to the previous configuration by pressing CTRL+ALT+F2, logging in, editing /etc/default/grub to remove the added text, and running grub2-mkconfig like before.

These instructions are intended for Fedora Linux, but with some minor modification to the grub2-mkconfig command, and substituting your package manager for dnf, you can probably adapt them to other Linux distributions.

For additional information, refer to the Arch or Gentoo wikis.

How to block a DNF package update on Fedora

You know the new version of a package is a buggy mess and you don’t want to update, or you manually install an rpm that exists in the repos but you really want to keep the version you installed. There’s an easy way to do that!

Edit (as root) /etc/dnf/dnf.conf and add this line:

exclude = packagename1
exclude = packagename2

Save it. The next time DNF updates, your package won’t be updated! This will work with any distribution that uses DNF (Mageia, future versions of CentOS).

Crouton broken by Chrome OS security update – here’s a fix

A security update in Chrome OS 73 patches a security hole used to run the Crouton script. Luckily, it’s easy to work-around with a simple permission change on the Crouton file.

  • Use CTRL+SHIFT+T to open the terminal window like normal.
  • Then type shell like you normally would.
  • Enter the following to alter the permissions in order to allow you to run the Crouton script:
sudo install -Dt /usr/local/bin -m 755 ~/Downloads/crouton

You’re done! Now you can update Crouton or install targets as you would normally.

My article on how to setup Crouton and Steam on a Chromebook has been updated to reflect this change.

Neverwinter Nights Enhanced Edition produces black screen on Linux

I decided I wanted to start playing the new release of the classic game Neverwinter Nights, on my Chromebook using my Ubuntu Linux chroot. My download comes from GOG. While my install worked great on my Windows desktop and Fedora laptop, the game isn’t starting on my Chromebook. It just produces a black screen instead of the game’s main menu.

Another Beamdog re-release, Baldur’s Gate, works great on here. The solution for NWN should be pretty simple: turn off full screen mode. But how can you do that without entering the game?!


  • Navigate to /home/<your user>/.local/share/Neverwinter Nights
  • Edit nwn.ini
  • Change the following:

You’re done! The game won’t run in true full screen, but it will be a full-screen borderless window.

Possible missing firmware for module tg3

When recently updating my Debian 9 Stretch’s boot image, it produced the following warning:

W: Possible missing firmware /lib/firmware/tigon/tg3_tso5.bin for module tg3
W: Possible missing firmware /lib/firmware/tigon/tg3_tso.bin for module tg3
W: Possible missing firmware /lib/firmware/tigon/tg3.bin for module tg3

That doesn’t look good! Without this module, I suspect my network card will not work after reboot. What’s needed is the package firmware-linux-nonfree but it’s not available in the standard Debian free repos – you need the nonfree repo.

Edit your /etc/apt/sources.list and add the following:

deb stretch main non-free

You can install firmware-linux-nonfree with apt-get, which will allow your adapter requiring the tg3 module to continue working.

Pi-hole logrotate parent directory has insecure permissions

My Pi-hole was producing this error every day:

Cron test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily )

/etc/cron.daily/logrotate: error: skipping “/var/log/lighttpd/access.log” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.
error: skipping “/var/log/lighttpd/error.log” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.
run-parts: /etc/cron.daily/logrotate exited with return code 1

The solution to this was pretty easy:

  • sudo vi /etc/logrotate.d/lighttpd
  • Under /var/log/lighttpd/*.log { add the following line:

su www-data www-data

That’s it! You may want to do sudo systemctl restart cron to make it reload, and now the error should not reoccur.

Have root send as a different address using postfix

If you have scripts or other services that run as root that need to send to outside email addresses, via postfix, without being root@hostname, this is what you need to do:

    1.  sudo vi /etc/postfix/generic


    2. sudo vi /etc/postfix/

      smtp_generic_maps = hash:/etc/postfix/generic

    3. sudo postmap /etc/postfix/generic
    4. sudo systemctl restart postfix

Done! Now root will send as instead. Substitute whatever you want for

Home Assistant: Unable to find service

In my Home Assistant setup, I created an SMTP notification that would email my phone’s SMS gateway when certain conditions were met. Except it didn’t work.

When monitoring the log file, I found the following when the condition was supposed to trigger:

WARNING (MainThread) [homeassistant.core] Unable to find service notify/txt_smeg

When I did additional digging in the log file, I found this:

ERROR (Thread-6) [homeassistant.components.notify.smtp] Login not possible. Please check your setting and/or your credentials
Traceback (most recent call last):
  File "/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/notify/", line 120, in connection_is_valid
    server = self.connect()
  File "/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/notify/", line 113, in connect
    mail.login(self.username, self.password)
  File "/usr/lib/python3.5/", line 729, in login
    raise last_exception
  File "/usr/lib/python3.5/", line 720, in login
  File "/usr/lib/python3.5/", line 641, in auth
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Error: authentication failed:')
 ERROR (MainThread) [homeassistant.components.notify] Failed to initialize notification service smtp

But everything in my configuration looked OK. I checked and the password works. Restarting the Home Assistant service resulted in the same error.

After seeing this discussion where a machine restart magically fixes this problem, I restarted my entire device. After it booted back up, the notification worked correctly. My only guess is that smtplib must keep a cache somewhere, or holds something in memory across application re-loads.