Testing out silicone sponges

I was reading some stories (don’t ask my where anymore – might have been on reddit or Lifehacker) about silicone sponges to replace (the often gross) disposable sponges we used in the kitchen. Sounded like a great idea – something that you don’t need to throw away, that doesn’t become a bacterial warzone, durable.. but after trying it out I’ll be going back to the disposables.

This blog post “I Tried It: Goodbye Gross Disposables, Hello Silicone Sponge summarizes it nicely…

  • Wastes more soap/water – it just rinses off the sponge. It does the same with the bad bugs, but well…
  • Scrubbing is just a no go. No matter how much you try, it’s just not firm enough!
  • Breaks easily – the first sponge had several holes quickly enough. Might be because of the cheapo ones we got to try it out, though.

Why did you become a vegetarian?

“Why did you become a vegetarian?” – It’s one of those questions I get asked fairly frequently, when it comes to food choices / eating habits. I recently had the question again, at work – I’ve changed jobs recently, and it came up during a discussion. I guess it’s a good question, as not everyone has the same reasons.

(Bit of a backstory: I come from a rural home, so I’m no stranger to the ‘meet your meat’ kind of thing – I’ve fed, petted, played, and (helped) kill animals that were bred for their meat. Can’t say I enjoyed the latter part, but it was a part of life.)

My original reasons were very.. eh..  selfish: I’m lazy.

As my girlfriend was living with me (at my parents house) during a sabbatical year she was taking, and combined with the odd hours I was working (two shifts), she cooked for the two of us. Already being a vegetarian, she cooked a veggy meal – but in no way opposed if I would want to cook a piece of meat. But, as I said: I’m lazy. It also opened up my palate to the wonderful world of vegetarian food, meat replacements, spices, …

After nearly a year of not eating meat, I noticed – the first time round when I got served a piece of meat – that it disagreed with me. It tasted off. The texture was wrong.
Fast forward 10 years, and I’m now a nearly 100% vegetarian. My only vice is the once-a-year (or so) seafood pizza. I’ve stopped eating meat, poultry and fish, and cannot say that I miss it. Even more so, the smell of fried meat is something that nauseates me. Strange but true.

These last few years, I’m actually quite happy that I don’t eat meat anymore…

  • The food scandals going round (meat being sold of such quality that is way below what is allowed for consumption)
  • Horrible treatment of animals. (and I’m always cynically amused by the fact people don’t realise just how bad animals are treated)
  • Waste of water with growing all the foods required to feed the proverbial 1kg of meat. In a world where water is becoming scarcer and scarcer
  • Pollution due to the transport of cattle all over the place (note: if you don’t watch where your vegetables come from, you’re likely just as bad of)

Will I ever become a vegan? Probably not. I’m too fond of cheese!

Hibernate after suspend (on Fedora)

I recently found out that Windows has this nice feature where, after suspending your laptop, it’ll go to hibernate after a while to preserve battery. Seems like a really cool feature, saves your battery too, so I wanted it on my linux installation. I’m using Fedora 27 right now.

To get it working, you’ll first need to verify that your suspend to ram and suspend to disk actually work. There are plenty of articles on the web that can guide you through it.

The solution is relatively easy, thanks to the internet ;) I got most of the info here, on the ArchLinux forums / wiki. create the following systemd unit file (in /etc/systemd/system), called suspend-to-hibernate.service. After some testing I ended up with this file:

[Unit]
Description=Delayed hibernation trigger
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
Documentation=https://wiki.archlinux.org/index.php/Power_management
Conflicts=hibernate.target hybrid-sleep.target
Before=sleep.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
Environment="SLEEPLENGTH=+30min"
ExecStart=-/usr/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM'
ExecStop=-/usr/bin/sh -c '\
 alarm=$(cat $WAKEALARM); \
 now=$(date +%%s); \
 if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
 echo "hibernate triggered"; \
 systemctl hibernate; \
 else \
 echo "normal wakeup"; \
 fi; \
 echo 0 > $WAKEALARM; \
'

[Install]
WantedBy=sleep.target

Afterwards, enable it through systemctl enable suspend-to-hibernate.service; start it through systemctl start suspend-to-hibernate.service and you should be good to go.

DIY ambilight with Hyperion and a Raspberry Pi

I’ve always liked the Ambilight technology Philips builds into some of their TV’s. I just don’t like the price that they ask for it… so I looked around if there was no way to build that yourself. There is, using a Raspberry Pi, some leds, and some bits and pieces ;)

I found this tutorial which explains quite a bit of the build process, and which pieces to get. Since I suck at soldering (and/or my soldering iron is just plain crap), I went for another solution, and bought corner pieces to attach the different led strip parts together.

After attaching it to the back of the TV (with tape, to test), this is what you get:

To make it work for any HDMI input, I can refer you to this tutorial. It consists of using an HDMI splitter, convertor to AV, and an AV to USB convertor. This signal is piped into the Pi, where Hyperion can do it’s magic with it.

Quite happy with the end result ;)

Why you should use Syncthing

I’ve been a user of Dropbox for ages, I’ve tried Owncloud, I’ve tried Box, and probably numerous others that I’ve forgotten about, but in the past year I’ve migrated over to Syncthing, and I haven’t looked back. Opensource software, well designed protocol, complete ownership of your data, I could go on… but this post by gbolo explains it perfectly!

Syncthing – Why you should be using it

Upgrading the TP-Link Archer C5 (v1.2) to an Archer C7 (v2.0)

I own a TP-Link Archer C5 router, version 1.2 – which is identical to the TP-Link Archer C7, version 2.0, save for some limitations which are introduced through software. These limitations include a 300Mbps cap on 2.4GHz (450Mbps for the C7) and a 876Mbps cap on 5GHz (1300Mbps on the C7). Not that much, but still enough to be worth tinkering for.
Since I was looking at increasing the WiFi speeds in my home, I searched around a bit, and found out on Stefan Thesen’s blog and Hagensieker’s blog that it is perfectly possible :)

First, make sure you definitely have an Archer C5 version 1.2, with three antennas. Don’t even try with another version. If it breaks, noone is to blame but you.

You’ll need to flash DD-WRT, OpenWRT or LEDE-Project (check the respective projects for instructions on how to do that) first.

Next, download an Archer C7 firmware from the TP-Link website. I downloaded version 3.14.1 (141110) – which contains the firmware in the file ArcherC7v2_v3_en_3_14_1_up_boot(141110).bin

Now, remove the first 256 bytes, which is the bootloader (which we don’t need to flash it):  dd if=ArcherC7v2_v3_en_3_14_1_up_boot(141110).bin of=tplink_mod.bin skip=257 bs=512 (In case you don’t trust doing it yourself, you can also download the firmware from the blog of Stefan)

Next, you can transmit this (using SFTP) to your router, and then force flash it: sysupgrade -F /tmp/tplink_mod.bin. This will flash the firmware, and reboot the router. You’ll have to reconnect to it (default IP address is 192.168.0.1) and the web interface should report an Archer C7 :)

Afterwards you can either upgrade to the latest C7 firmware, or whichever 3rd party firmware you want. I reflashed to LEDE-Project.

Initial testing showed an improvement in WiFi throughput speeds – so I’m happy with my ‘new’ C7 :)

Installing microG services (as Play Services replacement) on the Asus TF101 tablet

I still have an Asus Transformer TF101 tablet in use – running MarshMallow – but after a Play Services upgrade, in which Google inserted some NEON instructions (which the TF101 does not support) , a lot of “Play Services has stopped working” popups showed up  – making the tablet nigh unusable. Initial tests blocking upgrade of the services yielded no success, and a lot of programs demand the newer versions of the services anyway.

In my searches I ran across the microG Project – “A free-as-in-freedom re-implementation of Google’s proprietary Android user space apps and libraries.” Sounded interesting, so I went and tried it, with success, on the tablet. It runs faster, battery life is better, and it works for everything I use it for.

Below you can find the steps I used. These apply to the Transformer TF101, and come with no guarantees whatsoever.

Preparing the tablet

  • First, you’ll need to uninstall both “Google Play Servics” and the “Google Play Store”. Use something like Lucky Patcher, or Titanium Backup, or whatnot, to remove them.
  • Reflash the ROM for KatKiss (I’m using 6.0.1 #29) and SuperSU (linked on the same page). Do NOT install opengapps!
  • Install F-Droid.
    Make sure you enable “Expert Mode” and “Unstable updates” in the settings, as we need the latest version of the packages.
  • Add the repository for microG: https://microg.org/fdroid/repo (as described here)
  • Temporarily disable the F-Droid repository.
  • Install the following items using F-Droid:
    • microG Services Core
    • microG Service Framework Proxy
  • Re-enable the F-Droid repository, and install

Patching the ROM to allow signature spoofing
Download (with git) a copy of https://github.com/Lanchon/haystack.git: git clone https://github.com/Lanchon/haystack.git

Make sure your tablet is connected through usb, and that adb works, and execute these commands in the directory where you cloned the git repository:
(you can find more information on the page of the git repository)

  • ./pull-fileset tf101
  • ./patch-fileset patches/sigspoof-hook-4.1-6.0/ 23 tf101/
  • ./patch-fileset patches/sigspoof-core/ 23 tf101__sigspoof-hook-4.1-6.0/
  • ./patch-fileset patches/sigspoof-ui-global-4.1-6.0/ 23 tf101__sigspoof-hook-4.1-6.0__sigspoof-core/
  • ./push-fileset tf101__sigspoof-hook-4.1-6.0__sigspoof-core__sigspoof-ui-global-4.1-6.0/

Reboot the tablet. Afterwards, go to “Settings”, “Developer options”, scroll to the bottom and enable “Allow signature spoofing”.

Configuring microG Services
Go into the application drawer, and look for an application calld “microG Settings”.

  • Tap “Permission Missing” and give all permissions
  • Enable “Google device registration”
  • Enable “Google Cloud Messaging”
  • Go in “UnifiedNlp Settings”, tap both “location backend” and “address lookup backends” and enable the backends there.
  • Go back to the main menu of microG Settings and tap “Self-Check” and make sure it doesn’t complain about anything
  • In “Self-Check”, make sure to tap “Battery optimizations ignored” to allow the service to run in the background

Reinstall Google Play Store
Download the Play Store from eg. APKMirror (http://www.apkmirror.com/apk/google-inc/google-play-store/[/url] to your PC. Rename it to com.android.vending.apk
Execute the following with adb:

  • adb remount
  • adb shell mkdir /system/priv-app/Phonesky
  • adb push com.android.vending.apk /system/priv-app/Phonesky/

Reboot the tablet one last time. Now you should have the Play Store available and you can install apps again to your heart’s content ;)

Tweaking WooCommerce payment workflows

I’m playing part-time webmaster for the choir I sing in, and as such, am getting up close and personal with WooCommerce. Quite a nifty shopping cart, but it does require a lot of tweaks to really make it work to your liking – unless you’re willing to shell out a lot of cash.

The latest modification was changing the workflow of the payment gateways – more specifically, the BACS gateway (Bank Account Clearing System – or as we mortals call it, wire transfer).

The default flow for WooCommerce (for this gateway) is:

  1. Order is put in by customer
  2. Order is automatically flagged as on-hold, and a mail is sent out to the customer with the bank info
  3. Customer (supposedly) pays
  4. Store manager sees the payment, and flags order as processing – another mail is sent out with the notification that it’s being processed
  5. Store manager (hopefully) ships the product, flags the order as completed and another mail is sent out with ‘order complete’ status.

Now, for our uses, the on-hold status is a bit superfluous (and we’ve had people getting confused by it).
We’d rather have it go straight to processing, and have that mail contain the bank information (only for BACS payments, ofcourse).

After some testing, I came up with two solutions: One very hacky, and not maintainable, the other better. Both solutions need to be inserted in your theme’s functions.php file.

/* override gateway for BACS */
function my_core_gateways($methods) {
  foreach ($methods as &$method) {
    if($method == 'WC_Gateway_BACS') {
      $method = 'WC_Gateway_BACS_custom';
    }
  }
  return $methods;
}

/* custom gateway processor for BACS */
class WC_Gateway_BACS_custom extends WC_Gateway_BACS {
  public function email_instructions( $order, $sent_to_admin, $plain_text = false ) {

    if ( ! $sent_to_admin && 'bacs' === $order->payment_method && $order->has_status( 'processing' ) ) {
      if ( $this->instructions ) {
        echo wpautop( wptexturize( $this->instructions ) ) . PHP_EOL;
      }
 
     /* dirty hack to get access to bank_details */
     $reflector = new ReflectionObject($this);
     $method = $reflector->getMethod('bank_details');
     $method->setAccessible(true);
 
     $result = $method->invoke($this, $order->id);
    }
  }

  public function process_payment( $order_id ) {
    $order = wc_get_order( $order_id );

    // Mark as processing (we're awaiting the payment)
    $order->update_status( 'processing', __( 'Awaiting BACS payment', 'woocommerce' ) );

    // Reduce stock levels
    $order->reduce_order_stock();

    // Remove cart
    WC()->cart->empty_cart();

    // Return thankyou redirect
    return array(
      'result' => 'success',
      'redirect' => $this->get_return_url( $order )
    );
  }
}

I have several reservations with the code above: it’s basically shamelessly copying and overloading the two functions of the parent class, and calling a private function which is internal to the parent class – both of which might cause trouble if there are big changes in WooCommerce. It works, but well, it’s .. ugly. So, I looked for a better way to tackle this.

sadfasdfasdf
add_action( 'woocommerce_email_before_order_table', 'add_order_email_instructions', 10, 2 );
add_action( 'woocommerce_thankyou', 'bacs_order_payment_processing_order_status', 10, 1 );

function bacs_order_payment_processing_order_status( $order_id ) {
  if ( ! $order_id ) {
    return;
  }

  $order = new WC_Order( $order_id );
 
  if ('bacs' === $order->payment_method && ('on-hold' == $order->status || 'pending' == $order->status)) {
    $order->update_status('processing');
  } else {
    return;
  }
}

function add_order_email_instructions( $order, $sent_to_admin ) {
  if ( ! $sent_to_admin && 'bacs' === $order->payment_method && $order->has_status( 'processing' ) ) {
    $gw = new WC_Gateway_BACS();
 
    $reflector = new ReflectionObject($gw);
    $method = $reflector->getMethod('bank_details');
    $method->setAccessible(true);
 
    $result = $method->invoke($gw, $order->id);
  }
}

Still not as clean as I’d like, as we’re still invoking an internal function, but atleast we’re using the proper hooks to tweak WooCommerce. I’ll update if I ever find a better way to get to the bank details.

Using a Yubikey for account security

I got a Yubikey 4 half a year ago (during Red Hat Summit 2016), but until now I didn’t do much with it. Time to change that ;)

If you have any more ideas on how to use the Yubikey, feel free to comment!

Also, If you’re not using 2  factor authentication yet, I urge you to start using it. It gives you a nice additional layer of account security, with limited hassle. It doesn’t even have to cost you any money, if you’re using a software solution. Checkout twofactorauth.org for a (non-comprehensive) list of sites that support it!