Fun with FunScript

FunScript is a compiler or better a transpiler, which converts F# code into JavaScript code.
I have not tried it much since the last couple of days and I’m really amazed how well it works.

I had really good expierences creating D3 charts but I wasn’t shure how well it works with AngularJS, with all his dependency mechanisms and “magic” behind the scenes.
So I thought I give it a try!

I came up with this DSL like syntax:

The DSL code looks like this (mainly it wraps the kinda ugly generated code):

It is still a bit clunky to use (mainly to get angular’s dependency injection to work) and it is far from completed, but at least a simple controller works!

The downsides of using FunScript to generate JavaScript code is the additional code generation step, it generates more verbose code than writing similar code in JavaScript and the debugging is chunky (but that’s a problem nearly every transpiler has). I don’t know of a source map file for the generated code, but maybe I’m missing something.

On the other side you can use this nice functional and composable code in places where I never thought it is possible to get it to work!

The sample project can be found here.

Tagged , , , ,

F# Advent Calendar in English 2014

Sergey Tihon's Blog

Update: Event extended until December 31.

Our friends from Japan have a beautiful event called “F# Advent Calendar“. Every day from December 1 to December 31, one awesome volunteer publish a new post about F#. What an amazing way to celebrate Christmas, isn’t it?

Lets support this initiative and do an English version of the calendar. Two blog posts per day is better than one, isn’t it? We need 31 volunteers, who are ready to prepare a post about F# and publish it on specified date.


Rules are very simple:

  1. Choose F# related topic for your blog post and send it to me on Twitter or leave a comment to this post.
  2. Prepare a blog post in English (about F# or using F#)
  3. Publish your post on specified date (according to the calendar)
  4. Post link to your post on Twitter with hashtags #fsharp and #FsAdvent.


Date (December)

View original post 275 more words

Import NuGet Packages to F# Interactive Scripts

Yes, it’s been a long time (exactly one year, but that’s a coincidence) since my last blog post. The main reason was that in the last year I learnt F# and slowly I have the feeling that I have understood the language and especially the paradigm shift that comes with F#.

I jump over the usual homage of why F# is a wonderful language – that’s material for a plethora of blog posts – and come straight to the motivation of this blog post.

If you are like me and you learn by trying things out you probably love the interactive and iterative nature of F#. Just create a new fsx (F# Interactive) file and start hacking until you have a working prototype. You don’t even have to save the file!
I actually have a folder full of F# scripts with my experimentations in them.

One pain point though is that F# interactive does not have support for NuGet package management. You can reference the library files manually but that’s very cumbersome.

There exists an older blog post from Daniel Mohl where he suggests how to add NuGet support to F# Interactive, but his solution requires the VS Object Model and doesn’t support loose fsx files (without the creation of a F# project).

So I wrote my own “PackageManagement.fsx” file which can be initialized with F# Interactive:

And here is the script code:

It depends on the NuGet.Core.dll which you can get from here and you must define your target NuGet packages directory, where the packages are downloaded and from where they are referenced (you can define the “NugetLibDir” environment variable so you can use the same script on multiple machines). I ignore the versioning of the packages (I always download the latest stable release), but you can enable it by setting the boolean parameter “useSideBySidePaths” on line 11 to true.

So how to work with this script?

The main command is “ipr” which stands for “install package and references”, which downloads the package with all its dependencies and adds the references to the clipboard, so the only thing you have to do is to paste the references on top of your script file.

Just enter ipr “package name”;; in the f# Interactive REPL (don’t forget the two semicolons) and it will try it’s best to download and reference the packages.

There are also commands to update and uninstall packages or to simply copy the references without trying to download the latest package.


I try my best to find the best matching references for the framework version in which F# interactive runs, but this matching is not bullet proof and unfortunately the NuGet lib doesn’t provide a way to get the best matching references automatically (at least I didn’t found any practical way).

The script should also work without VS and should work on Mono but I don’t have tested it so please feel free to contact me or edit the file if you have any problems.

Actually there is now a suggestion on fslang uservoice with a propose to natively support NuGet packages:–package-directive-to-import-nuget-packages-in-f

Tagged , ,

Easy monitoring of a folder with pswatch

pswatch is a easy to use little module for PowerShell to montitor a folder for changes.

You can choose if you want to monitor file additions, changes, renames or deletions. You can also monitor file sin subfolders.

Based on this monitoring you can further add scripting to automatically run other commands (see example on github).

I further customized the output to include the time of the occurrence of the event:

watch $env:Temp -includeDeleted | % { $_ | Add-Member ScriptProperty Time { Get-Date } -PassThru }

This adds a dynamic Time property which automatically updates itself when a new file change event is happening.

Tagged , ,

Reset your login credentials for „Visual Studio Tools for Git“

If you change your login credentials for one of the git hosting services (github, bitbucket, …) and you try to pull, fetch or push you probably receive the same error as in the screenshot below:

I struggled a while with the problem until I found the solution.

You have to reset the credentials in the Windows Credential store.

Sorry, I have to translate the text on the fly because I have a German version of Windows 7.

Go to your user account settings and click on “manager your own credentials”:

Pick the credentials for e.g. git: and click on edit:

You should now be able to work with your git remote again:

Hope this helps!

Tagged , , , , ,

Bildschirm deaktivieren, sobald der Computer gesperrt wird

Wie sinnvoll ist ein Bildschirm, wenn man den Computer gesperrt hat?

Über die Energieoptionen kann natürlich konfiguriert werden, wann der Bildschirm deaktiviert wird, aber wenn man eine kurze Zeitspanne aktiviert und man gerade einen Text (oder hoffentlich meinen Blog) durchliest, dann ist das eher störend, wenn plötzlich der Bildschirm ausgeht. Andere Möglichkeit wäre den Bildschirm einfach abzuschalten, aber das ist bei mehreren Bildschirmen (wie hat man früher eigentlich produktiv mit nur einem Bildschirm arbeiten gekonnt?) umständlich und man vergisst es gerne.

Eine andere Möglichkeit ist den Bildschirm automatisch zu deaktivieren, wenn man ihn gerade nicht benötigt. Das beste Beispiel ist wohl, wenn man kurz AFK ist und man seine Arbeitsstation sperrt. Heißt so viel wie: ich werde jetzt mal nichts am Computer machen!

Als Programmierer habe ich mir natürlich gleich mal überlegt ein kleines Programm zu schreiben, das mir das erledigen könnte… Hmm… Das Programm läuft im Hintergrund und klinkt sich in die Message Loop ein und wenn der Computer die Lock Message schickt den Computer sperren…
Halt! Stopp!

Seit Windows Vista gibt es eine viel einfachere Möglichkeit dies zu erledigen. Alles was man dazu benötigt ist der Aufgabenplaner (Task Scheduler) und ein kleines Utility namens NirCmd.

Fangen wir bei NirCmd an:

Es ist ein kleines aber feines Tool, welches bestimmte Windows-Befehle ausführt, welche normalerweise nur über ein User-Interface zugänglich sind. Einer dieser Befehle ist den Monitor auszuschalten.

Wenn jemand den Systembefehl kennt, welcher zum Deaktivieren des Monitors verwendet wird bitte mir mitteilen, ich habe ihn leider nicht gefunden.
Der Systembefehl hätte den Vorteil, dass kein Third-Party Tool verwendet werden muss.
Was mir an NirCmd jedoch gefällt: es kann eine Warteizeit gesetzt werden und erst danach wird das Kommando ausgeführt.

Bei mir sieht das Kommando folgendermaßen aus:

"c:\Program Files\nircmd\nircmd.exe" cmdwait 5000 monitor off

Der Aufgabenplaner von Windows ab Vista:

Seit Vista verfügt Windows über einen sehr mächtigen Aufgabenplaner. Es können “Trigger” definiert werden, wann eine Aufgabe abläuft. Ein einfacher Trigger wäre einmal täglich. Aber auch komplexere Trigger sind möglich. Und genau einer dieser komplexeren Trigger benötigen wir: “Bei Arbeitsstationssperre”.
Unter den Aktionen kann man dann einstellen, was gemacht werden soll: in unserem Fall soll das oben beschriebene Kommando ausgeführt werden.


  1. Aufgabenplaner starten
  2. Zur Aufgabenplanungsbibliothek wechseln (oder, was ich gerne Mache, in einen Unterordner, welchen ich für meine persönlichen Aufgaben extra erstellt habe)
  3. Aktionen à Neue Aufgabe erstellen…
  4. Unter Allgemein einen Namen eingeben
  5. Unter Trigger den Trigger auswählen “Bei Arbeitsstationssperre”
  6. Unter Aktionen den NirCmd Befehl eintragen
  7. Bei den Bedingungen können alle Checkboxen entfernt werden (ich hab zwar einen Stand-PC aber bei einem mobilen Computer ist es ja auch durchaus sinnvoll, dass der Befehl ausgeführt wird, wenn der Computer vom Stromnetz getrennt ist).
  8. Das Dialogfeld mit OK bestätigen.
  9. Den Computer sperren ([Win]+L) und sich von seiner Funktionsweise überzeugen! J


Wie ich leider feststellen musste hat NirCmd – zumindest auf meinem Rechner – die Eigenart, sich ausgerechnet dann NICHT zu beenden, wenn man den Parameter “monitor off” übergibt.

Um diese Aufgabe dennoch öfters als einmal ausführen zu können (die Aufgabe wird im Aufgabenplaner immer als ausgeführt angezeigt) muss man etwas hacken:

  1. Bei den Einstellungen der Aufgabe einstellen, dass neue Instanzen parallel ausgeführt werden sollen
  2. Vor der Aktion NirCmd den Monitor abschalten zu lassen folgenden Befehl einfügen
    "C:\Program Files\nircmd\nircmd.exe" killprocess nircmd

    Dies löscht den vorherigen “Zombie”

Leider bleibt immer ein NirCmd-Prozess übrig, aber ich kann damit leben.

Eventuell kann man den Prozess einfach händisch beenden, oder man erstell eine weitere Aufgabe, welche beim Aufheben der Arbeitsstationssperre ausgeführt wird und dort wird der killprocess Befehl eingefügt.

PowerShell: Set-Content mit Binärwerten

Ich stoße in PowerShell-Scripts immer wieder auf folgenden Befehl:

[System.IO.File]::WriteAllBytes(<pfad>, <wert>)

Nichts dass daran irgendetwas falsch wäre, es gibt jedoch eine PowerShell-freundlichere Möglichkeit Binärwerte in eine Datei zu schreiben, und zwar mit folgendem Befehl:

Set-Content -Path ... -Value ... -Encoding Byte

Dies hat den Vorteil, dass der Pfad richtig aufgelöst wird und man kann dadurch den Binärwert über die PowerShell Pipeline übergeben.

Beispiel aus der Praxis: Das Auslesen des Profilbildes eines ActiveDirectory-Benutzers und anschließendem Speichern als Datei

Import-Module ActiveDirectory
(Get-ADUser TBurger -Property thumbnailPhoto).thumbnailPhoto | Set-Content TBurger.jpg -Encoding Byte

„eval“-Äquivalent in PowerShell

Heute hatte ich ein vermeintlich einfaches Problem zu lösen:

Ich sollte eine Textdatei mit PowerShell auslesen, welche wiederum PowerShell-Variablen enthält (z.B. $datum, $_.Name, …).


Hier ist normaler Text


Hier ist normaler Text
08/23/2012 09:53:12

Ein einfaches


funktioniert hier nicht, da hierbei die Variablen nicht interpretiert werden und der Text wird so ausgegeben, wie er in der Textdatei steht.

Die Lösung ist, die Methode ExpandString auszuführen, welche in der PowerShell über


aufrufbar ist.

$date = Get-Date
$content = Get-Content .\Content.txt    # PowerShell 3 Tipp: -Raw liest die Datei in einem String aus, normalerweise wird ein String-Array ausgelesen.
$content = $ExecutionContext.InvokeCommand.ExpandString($content)

Und schon hat man das gewünschte Resultat. J

Sehr praktisch wenn man z.B. Emails mit einem Body-Template verschicken will.

Man kann sogar so weit gehen, dass man ganze PowerShell-Kommandos ausführen kann (im Prinzip verhält sich der Text wie Text aus einem “Here-String“):


eval is evil

Wie auch bei eval gilt: Vorsicht, was man einliest, da prinzipiell jedes Kommando im Kontext der ausführenden PowerShell-Instanz ausgeführt wird kann man sehr böse Dinge anstellen!

PowerShell Cmdlet zum Auslesen der Anmeldeinformationen aus der “Windows Anmeldeinformationsverwaltung”

Will man PowerShell-Operationen automatisieren benötigt man gelegentlich Anmeldeinformationen, welche dann irgendwie im Script zur Verfügung gestellt werden müssen. Normalerweise erledigt man dies über Get-Credential, welches allerdings immer eine Benutzerabfrage bedingt und in einem automatisch ablaufenden Script nutzlos ist.

Der einfachste (aber auch unsicherste) Weg ein Passwort auszulesen ist folgender:

$password = ConvertTo-SecureString <plaintextpassword> -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential <username>, $password

Dass dies nicht der bevorzugte Weg ist, sieht man am Umstand, dass der Paramter –Force angegeben werden muss, da ansonsten folgender Fehler ausgegeben wird: “Nur-Text-Eingaben können vom System nicht geschützt werden.”
Und wenn man (hoffentlich) etwas nachdenkt, ist dieses Verhalten auch vollkommen verständlich, denn wer will schon seine Passwörter im Klartext in einer Textdatei hinterlegen.
Auf der anderen Seite ist es doch immer wieder praktisch Logininformationen eines Systems zu ermitteln, indem man Dateien mit den klingenden Namen config.(php|asp|*), connection.(php|asp|*), usw.. durchstöbert. Zwinkerndes Smiley

Nun gibt es zwei Möglichkeiten Passwörter sicher zu hinterlegen

  1. Das Password wird verschlüsselt im Script selbst hinterlegt oder in einer Datei ausgelagert.
  2. Die Anmeldeinformationen werden im “Windows Credential Manager” (das ist die englische Bezeichnung für die Windows Anmeldeinformationsverwaltung) hinterlegt.

Methode 1: PowerShell “out-of-the-box”

Das Password wird in eine Date gespeichert:

// Die Login-Informationen werden abgefragt
$credential = Get-Credential
// Das Password wird in einer Datei gespeichert
$credential.Password | ConvertFrom-SecureString | Set-Content <file>

Das Auslesen des Passwortes wird dann folgendermaßen erledigt:

$password = Get-Content <file> | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential(<username>, $password)

Dieses PSCredential kann man dann den Cmdlets übergeben, welche die Anmeldeinforationen benötigen (z.B. Enter-PSSesssion <server> –Credential $credential).

Zu beachten ist, dass diese Methode nur funktioniert, wenn das Passwort auf demselben Computer ausgelesen wird, auf welchem es auch erstellt wurde, da für die Verschlüsselung/Entschlüsselung der MachineKey verwendet wird.

Damit die Methode über mehrere Computer funktioniert, kann man entweder den MachineKey der Computer angleichen (!) oder ConvertFrom-SecureString und ConvertTo-SecureString einen –Key oder -SecureKey übergeben, welcher dann wiederum sicher aufbewahrt werden sollte, und da man dies mit Methode 1 endlos wiederholen müsste, würde sich Methode 2 anbieten. Zwinkerndes Smiley

Methode 2: “Windows Anmeldeinformationsverwaltung”

Informationen zur Windows Anmeldeinformationverwaltung (englisch: Windows Credential Manager) findet man hier:

Hinterlegt werden diese Anmeldeinformationen über Systemsteuerung/Benutzerkonten/Anmeldeinformationsverwaltung. Dabei wird eine Internet- oder Netzwerkadresse (welche später als Schlüssel dient) das Login und das Passwort hinterlegt.

Leider bietet PowerShell keine Möglichkeiten diese Anmeldeinformationen nativ auszulesen. Aus diesem Grund habe ich ein PowerShell Cmdlet erstellt, welches diese Aufgabe übernimmt.

Die Datei findet man hier:

Die Verwendung gestaltet sich dann wie folgt:

$credential = .\Get-CredentialFromWindowsCredentialManager.ps1 <internet- oder netzwerkadresse>
Enter-PSSession <server> –Credential $credential

Die Anmeldeinformationen sind lokal und Benutzerbezogen, das heißt natürlich, sie sind bei Bedarf für ein weiteres Benutzerkonto oder auf einem weiteren Rechner ebenfalls im Windows Credential Manager des jeweiligen Benutzerkontos zu hinterlegen.

Tagged , , ,

dynamic^2 oder ”variable Variablen”

(Irgendwie mag Windows Live Writer kein ² in der Überschrift…) Erzürnt

Seit .NET 4 gehört C# (und natürlich VB.Net) zu dem Kreis der dynamisch typisierten Sprachen. Dies ermöglicht die DLR, die Dynamic Language Runtime.
D.h. man kann Variablen “spät binden” (late binding), d.h. sie werden erst zur Laufzeit in ihren konkreten Typ materialisiert.
Das erlaubt einem eine hohe Flexibilität für verschiedenste Szenarien, wie z.B. beim COM Interop, der Kommunikation mit anderen dynamischen Sprachen für .NET (IronPython, IronRuby, IronJS, Phalanger, …) oder einfach in Situationen in denen der konkrete Typ erst zur Laufzeit bekannt ist (Reflection, XML, …).

Ich möchte jetzt nicht weiter auf die Grundlagen eingehen, da es inzwischen genügend Dokumentation dazu gibt. Einfach mal in die MSDN Doku reinschauen.

Basierend auf dem Beispiel aus der Doku mit dem DynamicDictionary möchte ich auf eine kleine Erweiterung eingehen: variable Variablen.
PHP Programmierer wissen vielleicht was ich meine. In PHP ist es beispielsweise möglich folgendes zu schreiben:

$variableName = "age";
$obj = new stdClass();
$obj->{$variableName} = "31";

echo $obj->age;

Also die Variable (bzw. den Member) variabel zu halten.

In C# ist das Out of the Box nicht möglich. Durch zwei Erweiterungsmethoden kann diese “dynamische Dynamik” aber leicht nachgereicht werden:

public static object GetMember(this object obj, string memberName)
    var binder = Binder.GetMember(
        CSharpBinderFlags.None, memberName, obj.GetType(),
        new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) });
    var getterSite = CallSite<Func<CallSite, object, object>>.Create(binder);
    return getterSite.Target(getterSite, obj);

public static void SetMember(this object obj, string memberName, object value)
    var binder = Binder.SetMember(CSharpBinderFlags.None, memberName, obj.GetType(),
        new CSharpArgumentInfo[] {
            CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
            CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null)
    var setterSite = CallSite<Func<CallSite, object, object, object>>.Create(binder);
    setterSite.Target.Invoke(setterSite, obj, value);

Somit ist es auch in C# möglich folgendes zu schreiben:

string variableName = "Age";
dynamic obj = new DynamicDictionary();
((object)obj).SetMember(variableName, 31);


Das Unboxing mittels ((object)obj).SetMember/GetMember… ist dabei notwendig, da es sich um eine Erweiterungsmethode handelt und diese für dynamische Objekte nicht aufgelöst werden.

Alternativ könnte man auch schreiben:

obj, variableName, 31);

Interessant ist, dass die beiden Befehle komplett unterschiedlichen IL Code generieren. Wo bei ersterem Befehl der Methodenaufruf SetMember steht, wird bei zweiterem Befehl SetMember wiederum dynamisch aufgerufen, was einen kleinen Performanceoverhead bedeutet. Man kann diesen jedoch wieder verschwinden lassen, indem man einfach obj nach object castet:

object)obj, variableName, 31);
Tagged , , ,