Unc2Clipboard – f..k me on GitHub

es ist natürlich „fork“ gemeint.

Ich habe mich lange gesträubt, einen Webservice für SCM (source code management) zu verwenden. Ok, ehrlich gesagt: für private Basteleien ist die Faulheit relativ groß, ein Werkzeug wie Subversion, Git oder Zip-Dateien zu verwenden.

Aber manchmal muss man einfach ein bisschen mit der Zeit gehen.

Das erste „vollständige“ Projekt ist ein kleines und hoffentlich praktisches Werkzeug für alle, die gemeinsam auf Netzwerkfreigaben auf Netzwerkfreigaben arbeiten: Unc2Clipboard.

Problemstellung: Man hat eine Ordnerfreigabe als Netzlaufwerk gemappt und möchte einen Link darauf teilen. Windows hat im Kontextmenü des Explorer zwar die Funktion „Als Pfad kopieren“ (man muss die Umschalttaste gedrückt halten, damit der Eintrag erscheint), allerdings hierbei wird der Pfad mit Laufwerksbuchstaben kopiert. Dieser funktioniert auf PC A, aber nicht zwangsläufig auf PC B.

Um Netzwerkressourcen zu adressieren benutzt Windows die Uniform Naming Convention, die unabhängig von lokalen Mappings funktioniert.

Lösung: Mit Unc2Clipboard wird ein neuer Eintrag im Kontextmenü erzeugt, mit dem der Pfad entsprechend formatiert und in die Zwischenablage kopiert werden kann:

Der Code ist unter https://github.com/chris-heo/Unc2Clipboard zu finden, für die Mutigen gibt es auch einen v1.0 Release mit Kompilat. Auch oder gerade weil der Code mit bestem Wissen und Gewissen zusammenkopiert wurde gilt: Benutzung auf eigene Gefahr.

MCP2221 mit C# – aber schnell.

Nachdem die Python-Lib ganz gut funktioniert (ein paar Bugs habe ich bereits gefunden, Fixes stehen noch aus), wollte ich die Implementierung auch in C# umsetzen. Zwar gibt es von Microchip schon eine Lib, allerdings ist diese nicht Native und auch nicht open source und dadurch auf bestimmte .NET-Versionen eingeschränkt.

Um das Rad nicht neu erfinden zu müssen, wollte ich zumindest für die USB-HID-Kommunikation eine fertige Bibliothek verwenden. Bei der Suche bin ich auf HidLibrary gestoßen, die zwar nicht mehr so aktiv gepflegt wird – aber das muss nicht unbedingt viel bedeuten. Ja, auch Software kann mal fertig sein 😉

Heruntergeladen und die ersten Funktionsblöcke geschrieben. Als ersten Test habe ich i2c_detect portiert und laufen lassen. Für 127 Adressen dauert der Scan knapp über 17 Sekunden. Mit Microships MCP2221 I2C/SMBus Terminal sind es nicht ganz 11 Sekunden und mit meiner Python-Lib unter 0,7 Sekunden. Was ist da los?

Im ersten Schritt habe ich mit System.Diagnostics.Stopwatch die Schreib und Lesezeiten gemessen – jeweils braucht die Lib im Schnitt 21 ms, für jeden Probe einer Adresse sind zwei Schreib-/Lesezyklen erforderlich, kommt kein ACK für eine Adresse ist ein weiterer Zyklus für ein i2c_cancel erforderlich. Macht für einen Proben einer nicht genutzten Adresse ca. 126 ms, für 127 Adressen sind das bisschen über 16 Sekunden – kommt also hin.

Visual Studio kann Performance-Analysen und der schuldige ist schnell gefunden:

Es hängt also am HidLibrary.HidDevice::IsConnected bzw. EnumerateDevices.

Auf GitHub gibt es (Stand November 2018) auch Bugs zum Thema Performance.

Die Tickets existieren seit 2011, 2014 und 2016 – also besteht offenbar kein Interesse, das zu fixen. Ein User namens kaczart hat eine Lösung gefunden.

Um im ersten Schritt nicht zu viel zu verbasteln, habe ich einfach mal „IsConnected“ ein einstweiliges „return true;“ verpasst. Nun benötigt ein Schreibvorgang um die 3,4 ms und ein Lesevorgang knapp 2,3 ms. Unterm Strich dauert der Scan nun 2,5 Sekunden. Besser aber noch nicht gut genug.

In anderen „Projekten“ hat mir in Sachen Timing gerne mal der Debugger in die Suppe gespuckt, also mal als Release ausgeführt und Tadaa: 0,78 Sekunden. Fast so schnell wie die Python-Implementierung.

Um es nochmal genau zu wissen habe das „return true;“ aus HidDevice::IsConnected wieder entfernt und als Release ausgeführt: 14 Sekunden.

Der Hund liegt also definitiv in der Lib begraben. Workaround, Fixen, nach Alternativen suchen oder selber machen (oder einfach eine Weile abhängen lassen und etwas anderes machen)?

Mal sehen.