Create a dev machine in the cloud for daily use

I’m a software developer, so today I want to show how to create a development VM in Azure.

Create VM

Go to Azure and create an account if you do not yet have one. If you have an MSDN (aka Visual Studio) subscription log in and activate your free Azure credits right there.
Now in the Azure Portal click Create a ressource and search for Visual Studio. Now select Visual Studio Community Edition which is free or Enterprise if you have an Enterprise subscription. I’ve choosen VS on Windows 10, but you can even select VS on Windows Server 2016.
/images/2018/azurevs_orig.jpg

First you have to give it a name and select the storage type. Default is SSD which I also recommend for the best performance. Then enter a username you want to use and a password.
/images/2018/azurevs1_orig.jpg

Now you have to choose a size of your new VM. As you can see, there are a lot of options available. The estimated price would be the price if your VM is up and running 24/7 for a month. However, my dev machine will only run if I’m using it, so I can choose a bigger machine even if I have not enough credits to run this machine for an entire month. Each ressource is billed per minute which is awesome. I will go with 4 CPUs and 16GB RAM. So running this machine for one hour will cost me about 0,20 EUR.
/images/2018/azurevs2_orig.jpg

In the last step you can define networking stuff, but I will use the defaults here for now.

Auto-shutdown

Just one setting is really important: Auto-shutdown. As you can see here, I have enabled auto-shutdown and set it to 18:00. That means: Whenever you leave the office and forgot to shutdown your machine, Azure will do it for you at the specified time. You can even send notifications before shutdown which can be configured later.
/images/2018/azurevs3_orig.jpg

Networking

Now wait a few minutes until the machine is provisioned.
The next step is to set a static IP for your machine and a DNS name if you want to. Click on your VM in the portal and then Networking. There you can see your public IP. If you click it, you can define a DNS name as well and switch from dynamic to a static IP.

Disks and Backup

Now go to the Disks tab in your VM and add a new data disk. There you can store all data independently from the rest of your VMs OS disk. Also it is on another LUN so you have done everything you can for the best performance ;-)

What I’ve done now is to go to the Backup tab and configure an automatic daily backup. With this backup you can restore the VM to any day in the last 30 days. You can even restore single files on your disks. Therefore Azure mounts the disk you selected locally and you can copy single files from the disks. Awesome!

Keep in mind: Disks/Storage and Backup have it’s own price tag, so check that before configuring it.

/images/2018/azurevs6_orig.jpg

Using it

You can now Remote Desktop into the machine via the Connect button on the VM overview tab. If you have selected a static IP and DNS name you can connect using them.
Now install all your favorite dev tools within the VM. Visual Studio is already installed but needs to be updated (of course).

How to use Microsoft Flow to start and stop the VM from my mobile

First of all, go to this blog post from Søren Rasmussen. He describes how to automate startup and shutdown of Azure VMs with the help of Azure Automation Services. After you have created the so called runbooks go to the startup runbook, click Webhooks->Add Webhook


/images/2018/azurevs9_orig.jpg
Make sure you copy the webhook URL before clicking OK, because there is no way to see the URL again.
The URL looks like: https://s2events.azure-automation.net/webhooks?token=some-secret-token
Do the same for the shutdown runbook.

Create Flow buttons

Login with your account to Flow. Click on My Flows -> Create from blank.
You should see a Flow button for mobile.
/images/2018/azurevs10_orig.jpg
Then add a new action. Search for http and selet POST as the method and paste the webhook URL from your runbook.
/images/2018/azurevs11_orig.jpg

That’s it! On your mobile download the Flow app and there you can see your buttons and start your VM on the way to the office.
/images/2018/azurevs12_orig.jpg

Note: It can take a minute (on my first try it took a few more minutes) to kick of the runbook and start the VM.

Add comments to this blog

I have had no comments enabled since I have moved my blog to hexo. There are some solutions with Disqus available, but I thought it is a good chance to build it myself.

First of all I created a new storage account in Azure to store all comments in table storage which is simple, easy to use, cheap and fast.
Then I needed an API which stores and retrieves the comments from the table. Azure Functions is perfect, because it has ready-to-use templates for HTTP POST and GET with table storage. It generates a url to call the functions.
In my javascript within this blog I have added a few lines of code to add and render existing comments.

It is a first try and the design is awful, but it works. I will monitor it over the next few weeks and see if it works or if I move to something like Disqus.

Automate blog image thumbnail generation with Azure Functions and Event Grid

Update:
There was an error in the thumbnail create code. The block blob automatically gets the content type application/octet-stream which is wrong for images. It should be image/jpeg.
I have fixed the referenced code.


Ok well, that’s a really long title for this post.
My blog is a static site running on Azure CDN generated by Hexo.
I’m writing my blog posts in Visual Studio Code. The downside of this solution is, that there is no server side code. That means images has to be resized locally to provide a thumbnail.
The lightbox code is already built-in in Hexo, but I have to provide two images: The thumbnail and the large one. Really cumbersome… and unneccessary.

Azure Functions to the rescue

Azure Functions is an event driven, compute-on-demand experience that extends the existing Azure application platform with capabilities to implement code triggered by events occurring in virtually any Azure or 3rd party service as well as on-premises systems.
Source: https://github.com/Azure/Azure-Functions

That means, you write code which executes based on events. The events are managed and generated by Azure Event Grid.

Azure Event Grid allows you to easily build applications with event-based architectures. You select the Azure resource you would like to subscribe to, and give the event handler or WebHook endpoint to send the event to.
Source: https://docs.microsoft.com/en-us/azure/event-grid/overview

The best thing: Azure Functions and Event Grid is priced by consumption and has a lot of free executions per month. Overall this solution cost me nothing.

The steps to automate thumbnail generation

  • Create a new Azure Function (search for event grid)
    /images/2018/FunctionCreate.jpg
    You can find the code here
  • On the “Integrate” tab click on create near the “Event Grid Subscription URL” textbox. This will guide you through the steps to create an event subscription.
    /images/2018/FunctionCreate2.jpg
  • That’s it!

If you can see the thumbnail images in this post, it works!

Smart Home Use Cases - Part 3

Fensterkontakte

Beim Hausbau stand die Überlegung im Raum direkt vom Fensterbauer Fenstersensoren einbauen zu lassen. Der Kostenfaktor sprach dann aber dagegen. Ich habe also nur vom Elektriker ein Kabel an allen Fenstern vorbei ziehen lassen und habe dann von da aus eigene Reed-Kontakte an den Fenstern und der Haustür montiert.
Sie sind nicht unsichtbar, aber auch Gästen fallen sie in der Regel nicht auf.

/images/2018/fenstersensor.jpg

Use Cases

Es gibt da den häufig genannten Fall: Heizung runter regeln wenn Fenster auf.
Das ist in meinem Fall eher unsinn. Eine Fußbodenheizung ist dazu viel zu träge. Außerdem ist die Heizung autonom und nicht in meiner Haussteuerung integriert.

  • Ich nutze sie um an der Haustür eine LED rot leuchten zu lassen, wenn noch ein Fenster auf ist oder grün wenn alle geschlossen sind. Damit kann man beim Verlassen des Hauses auf einen Blick sehen ob wirklich alle Fenster zu sind.

  • Der Rolladen an der Terrassentür fährt automatisch auf, wenn man die Tür öffnet, bzw fährt gar nicht erst runter, sofern die Tür geöffnet ist. So sperrt einen die Sonnenautomatik nicht aus.

  • Durch das Öffnen der Haustür geht sofort das Licht im Flur bzw. Außen an, so steht man auf keinen Fall im Dunkeln auch wenn die Bewegungsmelder einen noch nicht erkannt haben.

  • Und als Gimmick: Wenn die Terrassentür geöffnet ist (wir also im Garten sind) und es klingelt an der Haustür, dann blinken die Lampen an der Terrasse zweimal kurz auf.

Musikbox für Kind 2

Das Ziel

Das Ziel ist eine Box zu haben, die gegenüber Kassette und CD einfacher in der Bedienung ist und dazu auch noch robuster. Sie soll auch in Version 2 weiterhin ohne Display auskommen und nur die notwendigsten Tasten und keine beweglichen Teile haben.

Version 1 vs Version 2

Während ich in Version 1 noch auf Teile gesetzt habe, die gerade vorhanden waren, verwende ich in Version 2 nur Teile die es so auch zu kaufen gibt. Außerdem werde ich diesmal etwas detaillierter auf die einzelnen Schritte eingehen, damit ein Nachbau einfacher möglich ist. Außerdem sind die Komponenten so verschraubt, dass auch ein Sturz oder ein Schütteln problemlos ist.

Die Hardware

Hier sind die verwendeten Komponenten:

Die meisten Teile sind von Drittanbietern bei Amazon und kosten sehr wenig. Man benötigt nur genug Zeit, weil teilweise 6 Wochen Lieferzeit normal sind. Die meisten Teile findet man so oder so ähnlich natürlich auch im örtlichen Elektronikfachgeschäft.

Zusammenbau

Als erstes habe ich eine Kiste aus Holz gebaut. Dazu im Baumarkt 6 Teile zusägen lassen. Die Maße in meinem Fall sind ca 25 x 15 x 15 cm. Das ganze sieht dann in verleimt, gebohrt und lackiert so aus:

/images/2017/musikbox1.jpg

Der Deckel ist verschraubt, um die ganzen Teile unterzubringen und um auch später noch leicht an alles zu kommen um ggf. Reperaturen vornehmen zu können.

Nun habe ich auf dem Boden die Powerbank mit Lochband fixiert und verschraubt. Genauso die beiden Lautsprecher. Den Raspberry habe ich an die Rückwand und den RFID Leser an die rechte Seite geschraubt.

/images/2017/musikbox2.jpg

Im Bild außerdem zu sehen ist unten in der Mitte der Daumengroße Verstärker. Dieser wird direkt aus dem Raspberry mit 5V versorgt.
Die PIN Belegung der GPIO Ports des Raspberry findet man über Google.

Auf der Powerbank liegend sieht man noch die USB Soundkarte mit der Ground Loop und dem Klinke-Adapter. An der linken Seite ist der Ein-/Ausschalter. Die LED des Schalters geht auf einen Port auf dem Raspberry, damit nach dem Hochfahren die LED blinkt um so den “gestartet” Zustand zu signalisieren.

Vollständig verkabelt inklusive der Taster sieht das ganze dann so aus:

Die Taster sind jeweils an GND und einen entsprechenden Pin verkabelt. Das wird dann in der Software definiert.
Aktuell sind folgende (physische, nicht GPIO) Pins definiert und belegt:

  • Pin 11 (IN): Play/Pause
  • Pin 12 (IN): Lauter
  • Pin 13 (IN): Leiser
  • Pin 15 (IN): Nächster Titel
  • Pin 16 (IN): Vorheriger Titel
  • Pin 3 (OUT): LED des Ein/Ausschalters. Signalisiert durch blinken, dass das Programm bereit ist

Software

Als erstes das Raspbian Image von der offiziellen Seite runterladen (die Version ohne den grafischen Desktop) und auf eine SD Karte schreiben. Ich verwende eine 32GB Karte, da darauf auch die Musik gespeichert wird.
Nach dem Hochfahren an einem Monitor als erstes sudo raspi-config ausführen und dort folgende Punkte erledigen:

  • Expand Filesystem
  • Enable SSH
  • Enable auto login

Nun mit sudo nano /etc/wpa_supplicant/wpa_supplicant.conf die WLAN Konfiguration öffnen und dort folgenden Block hinzufügen/bearbeiten:

network={
        ssid="wlan name hier eintragen"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        group=CCMP
        psk="wlan kennwort hier eintragen"
}

Nun sollte nach einem sudo reboot der Raspi starten und sich ins WLAN verbinden. Man kann nun mit SSH (von Windows per Putty) darauf zugreifen und benötigt keinen Monitor mehr.

MPD als Musik Daemon einrichten

Dafür habe ich folgende Anleitung von Seite 1 verwendet. Dort kann man auch nachlesen, wie man PULSE anstatt ALSA als Audio Output verwendet. Bei mir funktioniert der Standard aber problemlos.
Die /etc/mpd.conf sieht bei mir in der audio_output Sektion folgendermaßen aus:

audio_output {
    type            "alsa"
    name            "My ALSA Device"
    mixer_type      "software"      # optional
}

Mit mpc sollte man nun lokal den MPD steuern können. mpc add "Ordner/Datei.mp3" und anschließendem mpc play sollte man ein Audiofile abspielen können.

Über add muss der Pfad relativ zum in der mpd.conf definiertem Musikverzeichnis sein.

Samba für den Netzlaufwerk Zugriff einrichten

Dazu mit dem Befehl sudo apt-get install samba samba-common den Samba Dienst installieren.
Dann mit sudo nano /etc/samba/smb.conf Einträge für die Freigaben hinzufügen. Ich habe 3 Freigaben angelegt. Eine für die Musikdateien, eine für die Playlists und eine für die Anwendung:

[music]
    comment = Musik
    browseable = yes
    path = /var/lib/mpd/music
    guest ok = yes
    writeable = yes
    create mask = 0644
    public = yes
    directory mask = 0755
    force user = pi
[playlists]
    comment = Playlists
    browseable = yes
    path = /var/lib/mpd/playlists
    guest ok = yes
    writeable = yes
    create mask = 0644
    public = yes
    directory mask = 0755
    force user = pi
[app]
    comment = Home
    browseable = yes
    path = /home/pi/raspimusic
    guest ok = yes
    writeable = yes
    create mask = 0644
    public = yes
    directory mask = 0755
    force user = pi

Berechtigungen auf den jeweiligen Ordnern vergeben mit
sudo chown -R pi:pi /var/lib/mpd/music/

Meine Applikation

Bei RaspiMusic handelt es sich um eine .NET Konsolenanwendung die mit Hilfe von mono auf Linux läuft. Durch die Einbindung von der GPIO Bibliothek kann man damit aus C# direkt auf die Input und Output Pins zugreifen um darüber die Buttons abzufragen und die LED zum blinken zu bewegen.

Voraussetzung:

Nun einen Ordner im home Verzeichnis anlegen: mkdir raspimusic
In diesen die exe und dll Dateien von RaspiMusic kopieren.

Starten lässt sich das ganze dann mit
sudo mono /home/pi/raspimusic/RaspiMusic.exe

Muss mit sudo ausgeführt werden, da sonst kein Zugriff auf die GPIO Ports möglich ist.

Um die Anwendung beim Starten automatisch zu laden fehlt noch, es über das Profil zu laden. Dazu das Profil bearbeiten mit sudo nano /home/pi/.profile. Dort ganz am Ende dann folgende Zeile einfügen:
sudo mono /home/pi/raspimusic/RaspiMusic.exe

Getestet werden kann nun mit sudo reboot. Anschließend sollte die LED im Ein/Ausschalter nach ca. 30sek anfangen zu blinken. Die Anwendung wartet jetzt auf eine Eingabe. Diese erfolgt durch halten einer RFID Karte an den Kartenleser. Dieser “tippt” dann die Seriennummer ein und bestätigt mit ENTER. Um was zu hören muss natürlich eine Playlist mit der Seriennummer angelegt werden, z.B. 0005555555.m3u


Wenn ihr Fragen oder Anregungen habt, kontaktiert mich gerne per Mail oder Twitter.