Drilling for Ideas

Where the analogue world meets my digital ramblings

Encrypted GMail —

There comes a moment in your life where you want to jump on the “Encrypt all the things” bandwagon, and for that many options exists. Several reasons exists for wanting to encrypt data, be it propriety information, something you do not want to be legally bound to or just showing off your geek.
TrueCrypt remains the best way to encrypt files and folders, but what to do about email?
I was shocked when I heard how many of my friends (I’ll use that term loosely) thought GMail was totally secure… In the US (where some GMail servers are located) any email older than 180 days may be accessed by any Government official with only a notice. (source: Darren @ Hak5)

So lets encrypt our mail. We all know the ugly interfaces the CIA, FBI etc uses in movies, but why would you want to use that if you can rely on your well respected GMail account? I don’t want to use a new mail address just for that, don’t want to juggle handles and don’t want to encrypt ALL of my mail, while I do want my mail to be as portable as I am, I want to view the normal unencrypted mail on whichever device I’m using. 100% of the stuff leaving my mailbox can be unencrypted (1% if you factor in the Geek Factor).

Enters Mailvelope, an awesome Chrome and Firefox extension that will apply PGP encryption to your GMail with the help of Openpgp.js

The part I like is how you can encrypt the messages that you want on the fly. I can still receive all of my mail on my phone, via atom parsers or whatever other method I want to follow, but the encrypted messages will just be usable where I have Mailvelope installed.

The whole installation and usage process was covered in detail on Hak5 episode 1410 part 1 so I suggest having a look at the video or their transcript.

Feel the need to send encrypted secrets my way? Import my Public Key and send your secret messages to chris@digigram.za.net

PS. Remember the subject line does not get encrypted and any secrets will be shared with my wife, so keep it excellent :)


Speak your geek out —

So I spent some time over Easter playing with bash again, trying to write useful scripts. I did some work in Conky that I will share later on. One of the things in Conky being a nice weather parsing script. As all things should be, this part of the script grew some arms, got separated from the main script, grew some legs and then started talking. No seriously, it talks….
Here is two samples so you can decide if you even want to read further:
ParysZA SpringsTX

So I’ll share my newest scriptfun addition with my Linux buddies. Everything used in here is available on Windows as well, but you will have to figure that out yourself. Unless more that one person asks for it, then I *might* have a look at it.

The complete script will be downloadable at the end, but lets go over what each part does first.

First of we check all dependencies. You will need to install curl and espeak while grep and sed should already be installed. I base this assumption of Debian based distros such as my Linux Mint. If you are using something else, you should still be able to install/run all of this. Mbrola is also needed if you want to use their voices. I highly recommend it, but it is not necessary.

#Checking dependencies
command -v curl >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install curl first"; }
command -v grep >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install grep first"; }
command -v sed >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install sed first"; }
command -v espeak >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install espeak first"; }
command -v curl >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install curl first"; }>

Next we add some settings. Your location code can be a daunting task to find since AccuWeather changed their URL format a bit, but go ahead and Google it if you are not in South Africa or the US (US can use zip codes while I already supplied most of the South African code in the script).
We also specify a voice and how you would like your country/state to be said. You can use the default espeak voices, or just download the 7 MB mbrola-us1 (female) or mbrola-us2 (male). There are lots of other options as well, but I like those. And NO, DO NOT try the Afrikaans voice, it’s horrible.

#Set these as you wish
location="AF|ZA|FS|PARYS" 	#Zip code for US, Location code for International "AF|ZA|FS|PARYS"
voice=mb-us1 				#"sudo apt-get install mbrola-us1" (mb-us1) for female, "sudo apt-get install mbrola-us2" (mb-us2) for male. Others exist as well. Even 'n default one if you do not want to install mbrola
cc='ZA' 					#two letter code of your country or state. Leave as XX if you don't want your Country to pe pronounced
country='South Africa'		#Your country's name, or what you would like to hear after your city name. Anything goes.

And last but not least we read and say the weather.

curl -s --connect-timeout 30 http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1\&locCode=$location | grep "Currently in" | sed 's/^[ \t]*//' | sed 's/&.*;//' | sed 's/'"$cc"'/'"$country"'/' | espeak -v $voice -s165 -p45 -g3 >/dev/null

Lets split this up a bit.
curl will download the AccuWeather RSS feed for the location you specified. If you want your results in Fahrenheit rather than Celsius, change the metric=1 to metric=0.

curl -s --connect-timeout 30 http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1\&locCode=$location

Next we find the line that gives the Current weather. You can change this if you want the forecast. We also clear the line of other useless words, data and characters.

grep "Currently in" | sed 's/^[ \t]*//' | sed 's/&.*;//'

Now I don’t want to hear I live in ZA the whole time, or I’m in TX, or whatever the two letter code might be, I’ll rather want to hear “South Africa” or “Texas”, but you can put in just what you like. “In the shade” would work as well… “Currently in Upington, In the shade: 45C and clear”…

sed 's/'"$cc"'/'"$country"'/'

And at long last, we call espeak with this weather report and ask the lovely lady/gent to speak the weather out. I’ll have a look into if Festival TTS will sound better, but for now espeak with mbrola-us1 sounds clear enough to catch a drift of the current weather before going out.

espeak -v $voice -s165 -p45 -g3

And as promised, here is the complete script. Download (mind the white word Download in the first line, trying to fix that colour), make it executable and bind it to a shortcut key if you like.

#!/bin/bash
#Simple script to lookup Current weather from AccuWeather and send output to text-to-speak
#Ideas found all over web
#Stitched together by digigram chris@digigram.za.net
 
#Checking dependencies
command -v curl >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install curl first"; }
command -v grep >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install grep first"; }
command -v sed >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install sed first"; }
command -v espeak >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install espeak first"; }
command -v curl >/dev/null 2>&1 || { echo >&2 "Maybe try sudo apt-get install curl first"; }
 
#Set these as you wish
location="AF|ZA|FS|PARYS" 	#Zip code for US, Location code for International "AF|ZA|FS|PARYS"
voice=mb-us1 				#"sudo apt-get install mbrola-us1" (mb-us1) for female, "sudo apt-get install mbrola-us2" (mb-us2) for male. Others exist as well. Even 'n default one if you do not want to install mbrola
cc='ZA' 					#two letter code of your country or state. Leave as XX if you don't want your Country to pe pronounced
country='South Africa'		#Your country's name, or what you would like to hear after your city name. Anything goes.
 
#Done with settings. Sit back and enjoy
#Get weather, parse output, say it out loud
#If it seems to take forever, check your internet connection. If she just speaks to slow, increase -s
curl -s --connect-timeout 30 http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1\&locCode=$location | grep "Currently in" | sed 's/^[ \t]*//' | sed 's/&.*;//' | sed 's/'"$cc"'/'"$country"'/' | espeak -v $voice -s165 -p45 -g3

DigiBits – What they are —

DigiBits – Almost like a byte size of useless information, just smaller (Pun intended)

It is also some kind of cart management plugin for an e-commerce website running on WordPress or Drupal it seems, but over here I simply refer to a very short thought that I want to share with you without writing a whole post on it


TripBeam —

EDIT: The circuitry for the alarm and its programmer got stolen, how ironic! I’m searching the webs for a new one, then I’ll actually embed a pic and video on here where promised.
—-
I’m in the process of creating a simple alarm security system to use in and around our house. Eventually it will consist of motion activated cameras, sms or email enabled notifiers and maybe some smarter controls to keep the neighbourhood cats out while our Dexter can roam freely (It’s expensive feeding the neighbour’s cat).For now, the first step is to create a cheap and effective laser trip beam that will be put up in various locations outside the house to detect unwelcome “guests”.

I’ll be using microcontrollers even though most of the systems I’m going to create can be built out of discrete components, but where’s the fun in that? Another reason for using a microcontroller is the fact that I can easily update the firmware to include extra options such as modulation later on. So here is my first version of the Laser TripBeam.

{eerste foto}

The central processor for this is a ultra low power MSP430G2553 from TI, thanx to Dangerous Prototypes. Totally overkill, but thats what I have with me. This MCU is also easily programmed with Energia on my Linux Mint, but it works even easier on XP. Other components needed are 3 LED’s (one of which must be red to act as a receiver, while the other two is just status LED’s) and a cheap 5mW red laser pointer. The receiving LED should be sanded down I read, I’ll try that later, but for now it works straight from my toolbox.

Basic operation is currently like this:
You activate the laser then arm the circuit with the reset switch. A 10 second delay gives you time to clear the area before the alarm goes live. When the laser beam is broken, the alarm will sound.

{embed video here}

A red LED produces a small voltage while a red laser is shone onto it. This voltage tells the system everything is working and the path is clear. This voltage is tested for every 10ms. If the controller receives a smaller voltage 5 times in a row, it indicates that the beam was broken by an object and the status lights will show it. This also enables the siren, which must be turned off by resetting the alarm. Currently you need to remove power to disarm the beam, but that’s an easy fix for later. Concerning power, should the controller lose power, it will disarm. So to combat that, I will include a poll in the main controller to check if all receivers has power, otherwise sound a secondary alarm.

I want to put the sensor and laser next to each other so I only need one power supply, one set of wires etc. To achieve this, I will use a mirror, or two mirrors in a V shape actually to reflect the laser back to the sensor LED

The next steps will be to send a notification to the main controller, and to use interrupts instead of loops to save on battery power.

If you want to try it for yourself, I highly recommend buying a TI Launchpad MSP430 from RS for about R65 ($4.50 $10 – Note that RS still sells them at the reduced price, or so their website says). Install Energia and download the source file of the TripBeam.

The beta source, lets call it V0.0.1 is available on PasteBin


TI’s Launchpad MSP430 —

TI’s Launchpad MSP430, the stuff other starter guides assume you know

The Launchpad is an all-in-one programming and debugging suite for the MSP430 set op MCU’s. With the kit you will get 2 MCU’s namely the 2553 and 2452 (for Launchpad rev 1.5). You can use these MCU’s apart from the Launchpad, but you need to program them either in the Launchpad or use the breakout pins. I will discuss using the the G2553 in the Launchpad.

The software

You can use the Windows-only tools for the Launchpad, but Energia is an unofficial port of the Arduino IDE, works great on Windows, Linux and OSX and is dirt easy to use! I’ll guide you through installing Energia and uploading your first program. I commented the sample as good as I can so you don’t have to guess what the lines mean.

First up, head over to github for this nice piece of software:
https://github.com/energia/Energia/downloads

Installing

Ubuntu (what else do you want to use?? Windows? Read on)
Get the newest version from github or just note the version number, then do this:
$ls ~/
$wget -c https://github.com/downloads/energia/Energia/energia-0101E0008-linux.tgz
$tar -xzf energia-0101E0008-linux.tgz
$cd energia*
$bash energia
(64bit – https://docs.google.com/file/d/0B8SEZ58ZRPEOYlhYV0tfSjJtdzA/edit)
Next paste this in a .desktop file to add Energia to your menu:
Copy all from here: http://pastebin.com/dVE53HAG
$leafpad ~/.local/share/applications/energia.desktop
and paste it in the text file that opens.
*Note, I used leafpad, on Gnome try gedit or kate on KDE, or whatever you installed and like best.
**This has worked for me for a couple of hours, then the link just disappeared…. Trying to fix it ASAP

Windows
Download the Windows zip file and extract. Run the exe inside. That’s all.

OSX
I presume you just download the .dmg and install it or download, extract and run the .app, I don’t know, but I presume it should be easy enough.

Set up the Environment

Set your Programmer to rf2500 in the tools menu

And then select the correct board (MCU) from the same menu.

 

Your first program – no external components needed

Your first program will be very simple and will only use the hardware on the Launchpad, but you are more than welcome to attach your own LED’s, switches etc to the board. While this example is simple, it is a bit more involved than the examples within Energia. You will write a program that will flash two LED’s on the Launchpad alternating between LED1 (Green) and LED2 (Red???) with a delay of either 500ms or 1000ms. When you press the button (S2), the delay will change between the two options.

That’s it. Nothing more, nothing less. If you verify and upload this program to your MCU and it works, well done, you are ready to write your own code.
P.S. I do not use any debouncing code or hardware for the switch, so you might see it does not work every time or you need to press the button for almost a second and not just press and release.


Autorun Infections —

You have a deadline to meet as 1pm, so you go to print your assignment and 12:45 only to find it’s not on your flash drive or USB external drive anymore… Not only your assignment, but all of your research, music, photo’s, EVERYTHING is missing… You strike a panic, and then realize that you have lost your favourite Geek’s number, so nobody can help you retrieve it… With a bit of luck, the only issue you have is a small worm infestation (or commonly called a computer virus), that can be fixed within minutes.

I’ve seen this specific worm crawling around campuses again lately. The specific University campus uses MSE, but it seems to me that MSE does not detect the worm at all… I haven’t run AVG or similiar yet to determine the name of the worm, but it follows a path similiar to conficker it seems.

The main issue students have with this worm, is it looks like your folders on any USB media has become unusable, and thus all of your data appears to be missing.

Bad News: currently I can’t find any single tool that will fix it for you.
Good News: you don’t need to be a computer expert to follow the steps that will recover your work and prevent your USB drive from contracting the same worm again.

You have can have a look at the following steps. Only completing the Quick Fix will help on the short term to access your data, so go and have fun recovering your own data (and your beloved study buddies) while you pretend you are an ubergeek.
Note: flash drive = USB drive = thumb drive over here…

Quick Fix

You are in a hurry to use something on your flash drive or you have just contracted the worm and need to get to your data NOW… That’s easy, just set your explorer to show hidden files and folders. Windows users can take this route while Linux users probably know how to do this (ctrl+h or ctrl+. for most file managers) {PS. Yes, this worm does affect unix users as it affects your flash drive. It won’t do anything to your computer though}
Next delete the shortcut files and the autorun.inf as they spread the worm

Done…But you have to do this every time.

Long Term Fix

You would most probably like to clear the hidden attribute of the folders for quicker access, but Windows does not allow you (the option might be greyed out). Now what?
Command prompt to the rescue!
In your start menu you will find Command Prompt under Accessories, or you can press Windows key + R, type cmd and press enter, like this:

Plug your flash drive in and note the drive letter assigned to it in My Computer. Would be something like E or similiar. In Command Prompt add the drive letter followed by a colon, and press Enter (or Return), like this

Please ensure you are on the correct drive, as running the next commands on your system drive WILL DAMAGE WINDOWS.

Now, all you do is, remove the system attribute of the infected shortcuts and folders, remove the malicious folders and then remove the infected autorun.inf.

Note: The last part is .lnk as in link. This will delete non-malicious shortcuts as well, so if you need to keep some shortcuts that you trust, move them into a folder.

Done. Now keep your flash drive out of infected PC’s

Root Cause Fix

Some of you might have the savvy to fix the problem to try and prevent a new infection (or infestation of worms?)

Keep your flash drive safe

Go do a free registration over at Panda Security and download their USB Vaccine, it is a wonderful way to keep your drive safe. Basically it creates a safe autorun.inf that can’t be overwritten by the worm.

Keep your computer safe

If you want to stop the worm from spreading to other drives you can try scanning your PC with McAfee Stinger to eradicate the problem, and keep your PC autorun-worm free by using something to block the autorun files. I recommend USB Firewall, but Autorun Eater seems nice as well, and does not clash with my MSE.

Have any other tips, hints queries? Anything unclear? Leave a comment and let me know.


Git for noobs —

Git for noobs, what other how-to’s assume you know

Do you ever lose bits and pieces of your source code? End up with bits on 3 computers, 8 USB drives, Dropbox and Google Drive?
For me that is what programming in Python is like. I make some regular backups to my Google Drive, but I'm never quite sure which copy is the newest,so I edit over old files, just to find I have corrected some bugs before, ending up wasting valuable time.

This is not a sales pitch, but GIT is not only for collaborative coding, you can 
create a repository with your project and have sole ownership of it. 
I did not want to embrace GIT as I didn't want others to have access to my 
source code until I feel it is a usable project.
Then I found Atlassian BitBucket, where you can create unlimited repositories 
for your code. If you work on various small projects, mostly for yourself, then
hosting sites such as Sourceforge, GNU Savannah and CodePlex might not be 
for you, although you can still make use of them. I wanted a place where I can
have a private repository that I can change to public later on, and maybe give 
permission to one other person to my private repo... 
 
Wel, Bitbucket allows you unlimited repo's (one for every small project I'm 
working on) under one username, and you are allowed to add up to 5 users 
(you and 4 others) to your private repo's.
 

What is git

git is "the stupid content tracker". Basically a stupidly easy place where you can store your code and anyone with access can download, edit and upload parts of it. This anyone can be restricted to yourself on multiple PC's. As always Wikipedia gives a great definition, but the part that is important to you is:
  • All of your projects will be sorted in a neat fashion 
  • You have anytime, anywhere access to your code
  • You can edit your code and upload it when done, never lose your code again
  • A friend can make changes and request you to allow it first (pull request)
  • Great history and diff support 
 
One of the important points for me is the diff support. Why would you need diff support?
Well, lets say you have accidentally written over one of your important files... eish, yes, that does happen. Now you still have the correct file on BitBucket, but you do not notice your error and commit the changes to BitBucket... All is not lost, just go to your repo, choose the affected file, view the diff (side-by-side mode), and there you have your old file back.
Now there ought to be a better method, but I'm still new to BitBucket, so I will find it in time.

How do you use it?  

Using git can be a daunting task if you have a look at the documentation. Well, for me it was until I started. WOW it's so easy!!

First things first, set up your repository:

Here you can use your own local repo on a home server or your own PC even, but I will not go into that now, I want to look at web services. You can use GitHub, BitBucket, or any of these.
I’m using and loving BitBucket, but haven’t tried the rest, so any will do.
Login to BitBucket with your OpenID or create a new login. Create a new Repo, answer the questions the ask, and, well, that’s it for setting up the repo! Really!

Next, install git:

Ubuntu users should be able to 
$ sudo apt-get install git 
while those on Windows have to download Git or PortableGit from msysgit
Install and follow the steps.
 

Setup your local repo:

Your local repo is a local folder where the source code will be downloaded to. You will edit files in this folder and push back to the server. More on that later.
Here is some settings to personalize your Git. Note, these are commands within Git Bash for Windows. Linux commands should be roughly the same. You are welcome to use the Git Gui for Windows, but try Bash, it's fun.
 
 $ git config --global user.name "Your Name"  
$ git config --global user.email "Your_Name@gmail.com"
If you are working behind a proxy, add this as well: 
 $ git config --global http.proxy PROXY.ADDR.ESS:PORT 
or for authenticated proxy:
 $ git config --global http.proxy USERN:PASSW@PROXY.ADDR.ESS:PORT 
Lastly, make a directory for all of your projects and clone your first project from BitBucket. Yes, it might be empty if you are just starting out, but it will help set things up. 
$ mkdir ~/projects
$ cd ~/projects
$ git clone https://DigiGram@bitbucket.org/DigiGram/project.git
You will get the path to your .git file on your Project's Overview page.
 

Working with git:

First you need to understand how the git structure work. For me it was a total hit and miss, issuing commands without knowing what they do until something stick. Well, this image from Wikipedia actually helps you a lot. You will see why in a while.
 http://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Git_data_flow_simplified.svg/200px-Git_data_flow_simplified.svg.png
The remote repo is on BitBucket and the Working directory is the one on your hard drive that you can edit. Please note, *only* the Remote repo is not on your computer. To get a file from the Remote repo, you pull, to add your files to it, you push, but in between is some extra steps.
For now, lets only add files to the repo.
$ git add  
or
$ git add . 
to add everything in the directory to the index. Once a file is added, you do not need to add it again, even after you have changed it.

Now you can make some changes to your files.
commit these changes to your local repo. The -a tag will commit ALL files that has changed, not just those you specify. 
$ git commit -a -m "Give it a good reason" 
A good reason is important if you work with somebody else, so they know what you did to the code. Maybe something like "fixed the Search page bug". It can even be helpful if you work alone, so start learning a good habit
Lastly you can push your changes to BitBucket. Here you will need the repo password. 
$ git push 
 
You have created a remote repository, and you have added files to it. To get files from your repo on another computer, first clone the repo as above, and afterwards just do
$ git pull 

More on this to follow later on.
For more info, scoure the web, or look at this awesome tutorial from BitBucket  

Automatic Daily Backups —

So that PC Backup server I went on about a while ago… I thought it will be a quick process, install Fedora, install BackupPC, set some passwords and there we go… Boy was I wrong. No, it’s not such a hard process, but I am picky, and I like for things to work my way, so I chucked the Fedora for Ubuntu 12.04 (something I’m familiar with already), BackupPC (although it looks GREAT) got replaced with rsync (I’m a sucker for the command line) and for now the WiFi got replaced with Ethernet.

So this is what I have so far:

Print server

The printer will be some kind or other Kyocera ethernet printer, more on it later.

Backup server

The current server is a HP dx7300 with an E6300 CPU, 1GB DDR2 RAM, and an 80GB hard drive. Before I get flamed for a backup server with a single 80GB hard drive, this is just a test run, the final server will have something larger and maybe disk cloning or RAID, leave me your idea’s in a comment, remember that the server must remain cost effective. I’m in the process of learning CloneZilla to clone the server for easier setup of the next one.

Server side

All that really had to be done this side is the setup of SSH ($apt-get install openssh-server), VSFTPD ($apt-get install vsftpd) and VNC to remotely access the headless server after setup. ClamAV (although not necessary) was added for extra protection.

Client side

Thanx to cygwin I can run rsync in Windows, but this brings extra questions. The whole idea is unattended backups, so it should not be necessary for a user to start or allow the backup script each time. For that, I created a bash script to call rsync daily and after startup to do an incremental backup.

1:  rsync -ravz -e "ssh -i /cygdrive/c/cygwin/id_rsa" $path $USER@$IP:~/backups/$PCName/ >> $PCName.log  

id_rsa is an RSA privatekey matching the public key created and copied over to the server with: 

1:  ssh-keygen -q -t rsa -N "" -f '/cygdrive/c/cygwin/id_rsa  
2: ssh-add-id $IP
All variables are read from a config file, which I’ll talk about later, I absolutely love the idea of a config file for a bash script.
There is little more to the scripts than this, all that remains are parts I wrote to simplify the installation, directory creation etc. This client will make an incremental backup to the server. An administrator can make a backup of the server if he wants, or to restore just use SFTP for any needed data back to the computer. rsync can work both ways though, but for my purposes a one way process is much more needed.

Would you like to read more about any specific part of this setup?


Blog Designing —

I’m no stranger to website designs, especially sites that are more useful than beautiful, but have never designed a blog.

My previous sites were focused on the background application like a secure password generator, Rugby World Cup 2011 log scraping site for an intranet, custom php counters, daily information systems and a web interface for a database, but when my wife wanted to start a blog, I resorted to ready-made templates like the extra-nice template from nearfrog I have used on this blog.

She on the other hand wanted something no template could quite give her, so we dove right into the XML with my limited HTML knowledge, and it turned out quite nice. Her blog can be seen at justliloldme32 and on request I will try to explain any style or effect you see there. The artwork is from Shabby Princess and the layout was done by justliloldme32, while I can only take recognition for the coding (which was based on one of the Blogger Simple Templates).

In time I’ll try to explain what I have changed and how to do it yourself. By the end of the design, my wife (has almost no history with coding and absolutely dislikes the idea of it) were able to edit some of the parts to her liking. If I do not get to the part you are interested in quickly enough, drop a comment and I’ll try my best to start on that bit.

The next step for my Wife and I will be to learn how to create our own artwork with tools such as Paint.net or GIMP. Any good blogs, pages or forums that can help will be appreciated


The last 24 hours of 24 —

I thought about a nice post about my favourite things in life as a list of 24 for the last 24 hours of being 24… Well, I could only get a third namely:

  1. My Wife
  2. What my wife does for me
  3. My education
  4. My family
  5. The internet
  6. Gadgets
  7. Programming
  8. My Wife (she had to get spots 1 AND 8…)

Lots of stuff is amiss, but when I start to include special people and apps I love, it won’t be 24…

To add to #2, today my dear wife treated my coworkers to some chocolate cupcakes with ganash (yeah, I didn’t know what ganash was either…).

They taste even better than they look!! It was a WOW!!! I can’t help you find such an awesome girl, but I will add the link to her blog post with the recipe once written up. Maybe make some for your wife/girlfriend/random girl you are liking!

Thanx my Angel, ek het jou lief!!