von Maximilian
Mittwoch, 8. September 2010 21:47
Addins gab es für das Visual Studio glaub ich schon immer. Aber mit der neuen 2010er Version ist das durchstöbern der Galerie und die Installation einfach wie nie. Deshalb habe ich mir auch ein wenig Zeit genommen und mich in der Galerie etwas umgesehen und das ein oder andere Addin für nützlich befunden und installiert.
Besonders Hervorheben möchte ich die Productivity Power Tools welche direkt von Microsoft entwickelt wurden. Diese ergänzen das Visual Studio um sehr nützlich Funktionen wie einen erweiterten Solution Explorer, automatische Vervollständigung von fehlenden Klammern und Regions bei der Eingabe, ein erweitertes Tab Management und noch vieles mehr. Kann ich nur empfehlen.
Was hab ich sonst noch Installiert?
- VisualSVN – (Link, Kostenpflichtig) Addin zur Integration von Subversion in das Visual Studio.
- Gradient Selection – (Link, Kostenlos) Bietet keine besondere Funktionalität aber hebt ausgewählten Text schöner hervor.
- Win7 Taskbar Extension – (Link, Kostenlos) Zeigt den Buildfortschritt in der Windows 7 Taskbar an. Zusätzlich gibt es Buttons zum Erstellen und Debuggen.
- Und zu guter Letzt: Build Version Increment – (Link, Kostenlos) Inkrementiert automatisch die Versionsnummer beim Erstellen.
von Maximilian
Dienstag, 31. August 2010 01:47
Es gibt wieder Neuigkeiten vom updateSystem.NET. Ich komme derzeit mit meinen Plänen recht gut voran. Was ich alles genau plane oder sogar bereits umgesetzt habe, verrate ich noch nicht komplett, dass wird zum Schluss eine Überraschung. Aber soviel kann ich verraten: Es ändert sich so einiges, bis auf die Lizenz, die bleibt gleich und damit das ganze kostenlos für alle.
Mit Dem Dialog in welchem die Updatepakete erstellt werden bin ich heute ein gutes Stück weiter gekommen. Einen ersten Entwurf habe ich ja neulich schon präsentiert. Diesen habe ich nun in die Tat umgesetzt und was dabei herausgekommen ist, kann nun bestaunt werden:

Was mich besonders freut ist der nun größere Editor für die Updateaktionen. Der kleine in der aktuellen Version hat mich selbst immer genervt, aber mit der neuen Version kann ich sehr gut leben. Der Fortschritt bei der Erstellung des Paketes wird nun auch in dem gleichen Fenster angezeigt. Wenn nun bei der dabei ein Fehler auftritt muss man das Paket nicht erneut zusammenklicken sondern kann den Vorgang einfach nochmal starten.
Generell sind die Fehlermeldungen etwas Benutzerfreundlicher geworden. Besonders kostenlose Webangebote neigen ja gelegentlich dazu etwas zu hängen was auch die FTP-Routine stören kann. Geht nun beim Hoch- oder Herunterladen etwas schief, kann man direkt im Fehlerdialog über eine “Wiederholen”-Schaltfläche die entsprechende Aktion neu starten.
Wann es etwas zum ausprobieren gibt kann ich noch nicht genau sagen, ich schätze mal so in etwa 2 Wochen, dies aber ohne Gewähr :-)
von Maximilian
Samstag, 10. Juli 2010 22:05
Will man in einem Programm sensible Informationen wie z.B. Passwörter schützen so sollte man diese beim Speichern nach Möglichkeit verschlüsseln. Um zu verhindern, dass fremde beim Zugriff auf den PC einfach die Daten kopieren und auf einem anderen PC entschlüsseln können gibt es seit Windows XP die DPAPI (Data Protection API) welche Daten so verschlüsseln kann, dass man diese nur entweder auf dem gleichen PC oder nur mit dem gleichen Benutzeraccount wieder entschlüsseln kann.
Für diese native API gibt es im .NET Framework eine Wrapperklasse mit dem Namen ProtectedData welche sich im System.Security.Cryptography-Namespace befindet. Dazu muss allerdings vorher das Assembly System.Security.dll eingebunden werden. Im folgenden ein kleines Beispiel:
//Geheimer Zusatzschlüssel um zu gewährleisten, dass nur die eigene Anwendung die Daten entschlüsseln kann.
byte[] secretBytes = new byte[] { 13, 1, 23, 44, 22, 74 };
//Die Daten als Bytearray die verschlüsselt werden sollen, z.B. ein String:
byte[] plainData = Encoding.Default.GetBytes("Hallo Welt");
//Verschlüsseln
byte[] encodedData =
System.Security.Cryptography.ProtectedData.Protect(plainData, secretBytes, System.Security.Cryptography.DataProtectionScope.CurrentUser);
//Entschlüsseln
byte[] decodedData =
System.Security.Cryptography.ProtectedData.Unprotect(encodedData, secretBytes, System.Security.Cryptography.DataProtectionScope.CurrentUser);
Bei portablen Anwendungen welche auf mehreren Rechnern ausgeführt- und die gleichen Settings verwenden sollen würde ich allerdings auf eine andere Methode setzen, sonst führt das unweigerlich zu Problemen.
von Maximilian
Freitag, 2. Juli 2010 20:14
Ich habe wieder etwas Zeit in meinen feedCarrier investiert. Dabei ist das kleine Benachrichtigungsfenster komplett gewichen und stattdessen gibt es eine Übersicht über alle Feeds mit der Anzeige der neuen Artikel. Demzufolge sieht man bei neuen Artikeln keine Beschreibungen mehr sondern nur noch die Titel. Aber Bilder sagen mehr als tausend Worte, deshalb hier nun ein paar Screenshots:

Neu ist auch die Benachrichtigung mittels der Balloninfo. Diese kann optional dazugeschaltet- sowie die Anzeigedauer bestimmt werden. Auch das Trayicon selbst verändert sich bei neuen Artikeln. Gibt es nichts zu lesen ist das Icon grau, ansonsten weiß-organge.
Bei unerwarteten Programmfehlern gibt es nun einen ausführlichen Fehlerdialog welcher direkt die Möglichkeit bietet mir diesen Report zukommen zu lassen. Dabei werden natürlich keine privaten Daten übertragen.
Die neue Version kann hier heruntergeladen werden: feedCarrier.zip
von Maximilian
Freitag, 18. Juni 2010 01:43
Seit dem Release von Stylizer 5 und der dort integrierten Produktaktivierung frage ich mich mal wieder über den Nutzen von solchen Methoden.
Auf der einen Seite steht der Hersteller, der nicht möchte, dass sein Produkt von Leuten verwendet wird, welche nicht über eine entsprechende Lizenz verfügen.
Auf der anderen Seite steht der Kunde der die Software erworben hat und diese zu jeder Zeit und im vollen Umfang nutzen möchte.
Dann gibt es noch eine kleine Gruppe von Leuten, die zu keiner Zeit dazu bereit sind für die Software Geld auszugeben und jede Möglichkeit nutzen die Software auch ohne gültige Lizenz zu betreiben.
Das Ziel des Herstellers ist es nun die letzte Gruppe so klein- und die mittlere Gruppe, die Kunden, so groß wie Möglich zu halten. Bei vielen Herstellern sieht man jedoch bei dem Versuch das gerade erklärte durchzuführen einen Effekt, der sich in die vollkommen andere Richtung entwickelt: Wo der zahlende Kunde noch die Seriennummer eingibt und auf die Gnade des Aktivierungsservers hofft, hat der Raubkopierer schon die Exe ausgetauscht und arbeitet ohne Einschränkungen mit dem entsprechendem Programm.
Als ultimative Sicherungsmethode greifen die Hersteller gerne auf eine Aktivierung über das Internet zurück. Dabei werden i.d.R. die einzelnen Kunden anhand einer Seriennummer identifiziert und diese mitsamt einer oder mehrerer Prüfsummen der Computerhardware (z.B.: MAC-Adresse, Festplatten-ID) auf den Servern des Herstellers gespeichert. Dies soll das mehrfache verwenden der gleichen Seriennummer auf unterschiedlichen Rechnern unterbinden. Im Endeffekt trifft das Onkel Otto der sein Acrobat mit seinem Neffen teilen möchte, jedoch nicht die oben genannte Gruppe von Benutzern die sowieso nicht für die Software zahlen möchten, denn das Aushebeln solch einer Sperre ist nicht mehr oder weniger Aufwändig als das umgehen einer Offlinelösung.
Neben der Notwendigkeit einer Interverbindung birgt solch eine Onlineaktivierung auch noch ganz andere Gefahren, speziell für den Entwickler/Vertrieb. Wer z.B. garantiert dem Käufer, dass es das Unternehmen in 5 Jahren noch gibt und er sein Produkt ordnungsgemäß aktiveren und benutzen kann? Was wenn der Aktivierungsserver nicht erreichbar- und so das Produkt nicht benutzbar ist? Im “besten” Falle verliert man einen Kunden, im schlechtesten Falle ist dem Kunden dabei ein Schaden entstanden und er macht bei dem Vertrieb seine berechtigten Regressansprüche gelten. Wie zu sehen ist, werden mit solch einer Methode dem zahlenden Kunden immer mehr Hürden aufgebürdet bevor er das Produkt benutzen kann wo hingegen der Raubkopierer durchs einfaches Patchen der Anwendung kaum einen Aufwand hat.
Wie würde ich es denn lösen?
Meine Lösung bestünde aus einer Lizenzdatei, in welcher einige persönliche Daten des Lizenzinhabers im Klartext sowie eine RSA Signatur enthalten sind. Diese wird einmalig beim Kauf erstellt und dem Kunden ausgehändigt. Auf Grund der persönlichen Informationen in der Lizenzdatei steigt die Hemmschwelle diese Datei an fremde Leute zu verteilen. Die RSA Signatur schützt vor Manipulation an der Datei, denn ohne den privaten Schlüssel lässt sich keine Signatur erstellen die einer Überprüfung mit dem korrespondierendem öffentlichen Schlüssel in der Anwendung stand hält. Sicherlich lässt sich diese Sicherung auch Aushebeln, aber mit dem gleichen Aufwand der für das Umbiegen der Überprüfung mit dem Onlinedienst notwendig wäre. Nur funktioniert meine Lösung immer und ohne Internet.
von Maximilian
Montag, 14. Juni 2010 21:00
Bisher habe ich bei meinem Anwendungen den Build-Part der Versionsnummer immer selber mit einer kleinen Kommandozeilenanwendung via dem PostBuild-Event im Visual Studio erhöht. Gestern bin ich über das VS Addin Build Version Increment gestolpert welches meine Anwendung Dank einfacher und komfortabler Handhabung abgelöst hat. Pro Projekt lässt sich komfortabel die gewünschte Konfiguration vornehmen, oder es können für alle Projekte die gleichen Einstellungen verwendet werden.
Dieses Addin für das Visual Studio 2005, 2008 und 2010 ermöglicht nicht nur das inkrementieren der Versionsnummer sondern auch das setzen eines TimeStamps. So sind zum Beispiel Versionsnummern in folgendem Format möglich: 1.0.4.614
Die vorletzte Stelle wird pro Buildvorgang um einen Zähler erhöht und die letzte Stelle beinhaltet einen Zeitstempel in Form des aktuellen Monats (6) und des Tages (14).
Auch bei diesem Addin gilt leider wieder: Benutzer der Express Editionen vom Visual Studio schauen in die Röhre, denn Addins werden erst mit den Bezahlversionen unterstützt.
von Maximilian
Donnerstag, 10. Juni 2010 23:23
Zum Mailen nutze ich seit Jahren Microsoft Outlook (aktuell in der Version 2010). Ich finde da gibt es nichts besseres für, nicht zuletzt da ich neben meinem IMAP Konto auch einen Exchange Konto besitze, mit welchem andere Mailprogramme, wie zum Beispiel der kostenlose Mozilla Thunderbird nichts anfangen können.
Allerdings gibt es bei Outlook + IMAP Konto ein Problem mit den Benachrichtigungen bei neuen Mails. Per Default gibt Outlook nämlich keinen Mucks von sich. Dies kann man ändern in dem man via einer Regel, die auf neue Nachrichten reagiert, eine Desktopbenachrichtigung anzeigen und/oder einen Sound abspielen lässt. Was aber wenn man nicht am Rechner ist und die akustische sowie visuelle Benachrichtigung nicht mitbekommt? Bei einem POP3 oder Exchange Account ist das kein Problem, dort wird zusätzlich zu den erwähnten Benachrichtigungen ein gelber Briefumschlag im Traybereich angezeigt. Bei einem IMAP Konto ist dies mit Outlookmitteln nicht zu bewerkstelligen.
Aus diesem Grund habe ich mir eine kleine Anwendung geschrieben, welche nichts anderes macht als einen gelben Umschlag im Tray anzuzeigen und bei einem Doppelklick auf dieses Icon Outlook aus dem Tray holt und sich selber beendet. Gestartet wird sie über eine Regel in Outlook. Also sehr simpel aber macht genau das was ich möchte:

Wer Interesse hat kann sich bei mir melden, die Anwendung ist nicht wirklich Massentauglich und daher verschicke ich sie nur auf Anfrage.
von Maximilian
Sonntag, 30. Mai 2010 12:48
Neulich hatte ich ein bisschen Langeweile, weshalb ich mir mal zum Spaß Microsofts PowerShell angeschaut habe. Diese soll wohl auf kurz oder lang gesehen die normale Windowskonsole ablösen. Da ich nun wenig Lust hatte vorher Bücher zu wälzen, habe ich mir ein praktisches Beispiel ausgesucht und versucht dieses mit einem PS-Script umzusetzen. Ziel war es die AdBlock Filterliste von Opera mit der von Fanboy aus dem Internet zu aktualisieren.
Das tolle an der PowerShell ist ja, dass man in dieser ohne Probleme auf Objekte und Klassen des .NET Frameworks zurückgreifen kann. Da fühlt man sich als C# Entwickler sofort heimisch.
Etwas anders ist die Syntax schon aber man gewöhnt sich relativ leicht daran.
Zum Erstellen von PowerShell Scripten gibt es zusätzlich einen Editor (“Windows PowerShell ISE) welcher einem mittels Codehighlight und einer Debugausgabe etwas die Arbeit abnimmt. Bevor man aber eigene PS-Scripte ausführen kann, muss man die lokale “ExecutionPolicy” etwas lockern, dazu muss in einer PowerShell Instanz, welche über Administratorrechte verfügt, folgender Befehl eingegeben werden: Set-Executionpolicy RemoteSigned
Damit werden lokal erstellte Scripte erlaubt sowie aus dem Internet heruntergeladene, welche über eine gültige digitale Signatur verfügen.
Das Script als solches macht nichts anderes als zu prüfen ob sich der aktuelle Inhalt der Filterdatei von dem aus der Version aus dem Internet unterscheidet. Gibt es einen Unterschied werden vom Script alle Opera-Instanzen gekillt, die lokalen Daten mit dem aus dem Internet überschrieben und Opera anschließend wieder gestartet. Relativ simpel, aber um einen Ersten Eindruck zu gewinnen reicht es durchaus.
Das Script gibt es einmal auf pastebin.com sowie als signierte Version über meine Seite: updateOperaFilter.ps1.
von Maximilian
Montag, 24. Mai 2010 20:00
Wie versprochen gibt es nun ein Update von dem Ergebnis meines letzten Weekend Coding Stunts, dem feedCarrier. Vorweg: Einiges was ich selbst auf meiner Todo-List hatte und was mir im nachhinein Vorgeschlagen wurde, konnte ich auf Grund von Zeitmangelns noch nicht umsetzen, aber das wird mit den nächsten Versionen seinen Weg ins Programm finden. Hier nun eine Übersicht aller Neuerungen:
- Im Benachrichtigungsfenster können neue Artikel mit der rechten Pfeiltaste geladen werden.
- Die neuen Artikel sind nun nach Veröffentlichungsdatum sortiert.
- Das Veröffentlichungsdatum wird im unteren Teil des Benachrichtigungsfensters angezeigt.
- Bei den Feedeinstellungen können Benutzerinformationen angegeben, so dass sich auch Feeds herunterladen lassen, welche eine Anmeldung erfordern, wie zum Beispiel die Twitter Timeline.
- Es kann eine Sounddatei ausgewählt werden, welche bei neuen Feeds wiedergegeben wird (derzeit werden nur Sounddateien im Wave (*.wav) Format unterstützt.
- Es gibt eine globale Fehlerbehandlung.
- Der lokale Cache der gelesenen Feeds kann automatisch bereinigt werden um Speicherplatz zu sparen. Diese können entweder nach Datum oder eine bestimmten Anzahl gelöscht werden.
- Die Suche nach neuen Artikeln kann unterbrochen werden wenn der Benutzer den PC nicht benutzt. (Hierzu besten Dank an Thomas der das Feature Vorgeschlagen hat sowie an Tommy der mir den Code für den IDLE-Modus zur Verfügung gestellt hat)
- Das Programm verfügt nun über eine Autoupdate Funktion die dafür sorgt, dass das Programm immer aktuell gehalten wird. Spätere Versionen sind auch über diese zu beziehen.
- feedCarrier kann wahlweise direkt beim Windowsstart gestartet werden.
- Credits im “Über…”-Bereich hinzugefügt.
Die aktuelle Version gibt es hier zum Download: feedCarrier_Beta2.zip
Und wie immer gilt: Featurevorschläge sind ausdrücklich Willkommen, Fehlermeldungen eher weniger aber was muss das muss.
von Maximilian
Montag, 17. Mai 2010 00:36
Nun zum zweiten Teil meines Weekend Coding Stunts. Heute war ich auf Grund mangelnder Motivation nicht so produktiv wie ich es geplant hatte. Dennoch habe ich meinen kleinen Feednotifer zum Funktionieren gebracht. Alle Funktionen konnte ich zwar nicht umsetzen aber das elementare, dass zeitgesteuerte Abfragen von beliebigen Feeds im RSS-Format, funktioniert.


Mit einem Klick auf den Titel wird der Artikel im Standardbrowser zum weiterlesen geöffnet. Wie schon erwähnt ist noch nicht alles implementiert was ich mir vorgenommen hatte. Das kommt noch in den nächsten Tagen:
- Benachrichtigungsoptionen (Ton abspielen, Fensterblinken, etc.)
- Automatisch mit Windows starten
- Import und Export von Feeds im OPML-Format
- Anpassen des Benachrichtigungsfensters
- Unterstützung von ATOM-Feeds
- Autoupdate
Ist also noch ein klein wenig was zu tun. Nun aber noch ein paar Informationen zu der technischen Umsetzung.
Im Gegensatz zum normalen XmlDocument nimmt sich Linq2Xml beim Auslesen nicht viel. Man spart bei einfachen Abfragen nur unwesentlich was an Code. Geschwindigkeitsvorteile konnte ich auch nicht erkennen, dies hängt in erster Linie aber wohl mit der Internetverbindung zusammen um überhaupt die XML-Datei herunterzuladen. Linq2Xml muss ich dann bei Gelegenheit nochmal zum Erstellen von Dateien testen.
Was das Observer Pattern angeht ist dies in .NET leichter umzusetzen als ich Gedacht habe. Ich habe in meiner Benachrichtigungsklasse das Singleton Pattern implementiert und in dieser Events definiert welche bei Veränderungen von globalen Eigenschaften wie die Settings oder das hinzufügen von ungelesenen Feeds gefeuert werden. Alle Controllerklassen haben sich dann an die Events gehängt die sie benötigten und wurden so über neue Feeds oder sich ändernde Einstellungen informiert.
Zum Schluss noch der Download der Beta1: feedCarrier_Beta1.zip
Kleine Anmerkung: Es gibt noch keine Fehlerbehandlung, wenn also irgendwo was schief geht knallt es entweder komplett oder ihr seht die Standard .NET Fehlermeldung. In jedem Fall mir bitte per Mail oder IM Bericht erstatten, ich kümmere mich dann darum.