von Maximilian
Sonntag, 1. August 2010 02:24
In letzter Zeit habe ich mir ein paar Gedanken gemacht, wie man den Dialog für das erstellen und bearbeiten der Updatepakete im updateDesigner etwas besser gestalten könnte. Im Detail geht es um die Verwaltung der einzelnen Updateaktionen. Der Bereich in dem aktuellen Dialog in welchem die Einstellungen für die jeweiligen Aktionen getätigt werden können ist derzeit einfach zu klein. Besonders bei komplexeren Verzeichnisstrukturen in einer Dateiaktion kommt man aus dem Scrollen nicht mehr raus.
Deshalb habe ich mich nun für eine TreeView-Navigation entschieden über welche die normalen Kategorien (Allgemein, Verfügbarkeit und Änderungen) und nun neu die einzelnen Updateaktionen erreichbar sind. Hier mal der GUI-Entwurf wie ich ihn plane umzusetzen:

Nun steht die komplette rechte Seite für die entsprechenden Einstellungen zur Verfügung.
Der Updatepaketdialog wird übrigens nicht das einzige Formular sein was überarbeitet wird. Die Dialoge im updateController sowie die Hauptform vom updateDesigner stehen auch noch auf meiner Renovierungsliste. Dies geschieht aber Etappenweise, mit dem nächsten größeren Update wird erstmal nur der eine Dialog aktualisiert. Für die anderen muss ich ohnehin noch viele Seiten in Microsofts UXGuide lesen um ein passendes Layout zu entwerfen. Ribbons wird es aber keine geben.
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
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.
von Maximilian
Samstag, 15. Mai 2010 11:02
Es ist mal wieder soweit. Nach knapp 5 Monaten habe ich mir wieder einen Weekend Coding Stunt überlegt welchen ich dieses Wochenende umsetzen werden.
Die Anwendung welche ich entwickeln möchte ist nichts besonderes und garantiert nicht einmalig, aber ich möchte mich gerne mit Linq2Xml auseinandersetzen und was bietet sich da mehr an als ein Feed Reader? Denn wie man weiß sind RSS und ATOM Feeds ja auch nichts anderes als XML-Dateien. Ok, ich plane keinen kompletten Reader sondern viel mehr eine kleine Benachrichtigungsanwendung welche regelmäßig nach neuen Feedeinträgen sucht und eine Vorschau des oder der Artikel anzeigt und diesen bei Interesse dann zum lesen im Browser öffnet.
Bei der Planung habe ich dann festgestellt, dass ich mich zusätzlich zu LINQ noch mit den Observer Pattern auseinandersetzen muss, um zwischen UI- Application- und Feedcontroller interagieren zu können. Mal schauen ob ich das an diesem Wochenende alles unter bekomme, zumindest Linq2Xml sollte nicht so schwer sein, da ich mich in der Vergangenheit schon ein wenig mit LINQ-Queries auseinandergesetzt habe.
Mehr zum Fortschritt dann heute Abend oder Morgen.
von Maximilian
Mittwoch, 21. April 2010 15:32
Auch wenn derzeit etwas langsam, aber die Entwicklung vom updateSystem.NET geht voran. Aus diesem Grund möchte ich euch ein paar Einblicke geben, was es in dem demnächst erscheinendem Minorrelease so an neuen bzw. erweiterten Funktionen geben wird.
Ich habe beim Release der Version 1.0 einiges an Feedback bekommen. Aufgefalllen ist, dass einige mit dem neuen System der updateActions leicht überfordert waren. Deshalb werde ich zum einen mich hinter die Schnellstarttutorials klemmen und zum anderen wird es einen Assistenten geben welcher einen durch die meist genutzten Aktionen führt (Prozesse beenden –> Dateien kopieren –> Prozesse starten) und so den Umgang erleichtert. Nach Abschluß des Assistenten erscheint dann der normale Dialog zum bearbeiten eines Updatespaketes in welchem dann weitere Änderungen vorgenommen werden können.
Man soll es mit Assistenten zwar nicht übertreiben, aber einen wird es (wieder) geben. Und zwar den smartPackage Wizard, welcher bereits erstellte Updatepakete analysiert und daraus ein neues Paket generiert. Für Leute die die Updatepakete nicht über die Kommandozeile generieren ist es doch schon etwas nervig für jedes Update die gleichen Aktionen erstellen zu müssen wenn sich z.B. nur eine Datei geändert hat. Dort schafft dann das smartPackage abhilfe.
Desweiteren habe Ich irgendwie das Gefühl, dass ich die Änderungen pro Version etwas zu komplex aufgezogen habe. Prinzipiell würde doch auch ein simples Multiline-Textfeld pro Sprache die gleichen gestalterischen Möglichkeiten bieten wie die aktuelle Lösung. Nur nicht so umständlich. Da bin ich mir nur noch etwas unsicher. Mal sehen was mir dazu während der Entwicklung noch einfällt.
Für einen Releasetermin möchte ich mich eigentlich noch nicht festlegen, aber ich gehe davon aus das ich es noch vor meinem Geburtstag schaffe. Und noch was kleines in eigener Sache: Yay, dass war der 100te Beitrag :-)
von Maximilian
Donnerstag, 8. April 2010 22:28
Heute bin ich durch Zufall auf einen Facebookclient gestoßen, welcher von den Microsoft uxLabs entwickelt wurde. Es nennt sich Fishbowl und wurde mit C# und WPF realisiert:

Gedacht war dieser Client wohl als Beispielprojekt für Microsofts Facebook SDK und demonstriert den Umgang damit (Quellcode von beidem findet man bei Codeplex). Vom Funktionsumfang her wurde so ziemlich alles Umgesetzt was man auch mittels Browser auf der Facebookseite erreichen kann. Allerdings werden Kontakte und Fotoalben optisch schick aufbereitet und dargestellt. Was etwas stört ist die etwas verschwomme Schrift welche leider typisch für WPF-Anwendungen ist.
Im Client verbaut ist auch eine Unterstützung von Windows 7 Features wie Jumplists, TaskBarPreviews uns IconOverlays mit z.B. der Anzahl neuer Events im Programsymbol der TaskBar.
von Maximilian
Freitag, 12. März 2010 18:36
Fast schon drei Wochen ist es her, als ich nach einer langen Entwicklungszeit die Version 1.0 von meinem updateSystem.NET veröffentlicht habe. Seit dem wurde es mehr als 200 Mal heruntergeladen und circa 10 Leute öffnen pro Tag mindestens einmal den updateDesigner. Nicht schlecht, wie ich finde. Vor allem möchte ich mich aber für das durchweg nette und konstruktive Feedback bedanken, dass ich in der Zeit via Kommentar, E-Mail oder Foreneintrag erhalten habe. Sowas motiviert immer ungemein.
Aber wie geht es nun weiter?
Meine ToDo-Liste ist seit dem Release stetig gewachsen und kleinere
sowie ein paar größere Änderungen habe ich schon implementiert. Morgen werde ich aller Voraussicht nach einen kurzen Entwicklungsstopp einlegen, das bereits implementierte testen und dann ein Update mit den Neuerungen herausbringen.
Neben ein paar kleineren kosmetischen Änderungen, gibt es in der kommenden Version die Möglichkeit die Dateien der Statistikserver über den updateDesigner zu aktualisieren (siehe Bild rechts).
Desweiteren habe ich die Schnittstelle für die Changelogplugins um eine zusätzliche Eigenschaft erweitert. Man kann nun den “Öffnen”-Dialog unterdrücken. Als (einziges) praktisches Beispiel was mir auf die schnelle einfällt, bei welchem man diese Option setzen könnte, ist der Import der Changelogdaten aus der Zwischenablage. Ich habe übrigens selbst ein entsprechenden Plugin für solch einen Import geschrieben, welches automatisch ab der nächsten Version mit dabei sein wird.
Und was wird die Zukunft bringen?
Für wirklich spätere Versionen, also 1.1 oder 1.2 habe ich ein paar größere Änderungen geplant. Diese betreffen in Erster Linie die updateActions. Dort im speziellen den Aufbau und die Verwaltung. Was mich persönlich am Updatesystem total stört ist der kleine Editor für die Updateactions. Hier möchte ich dringend nachbessern, allerdings ist mir noch keine brauchbare Lösung eingefallen, wie man Toolbox, Auflistung und den Editor platzsparend und einen Hut bringen kann. Momentan geistert mir eine “Ein-Form-Lösung” durch den Kopf, welche mittels Ribbons (s. neue Version vom assemblyCompressor) organisiert wird. Aber das ist alles noch nicht Spruchreif.
von Maximilian
Montag, 8. März 2010 00:28
Tja, ich weiß ehrlichgesagt nicht, warum ich diese Anwendung geschrieben habe, vermutlich aus Langweile, weil heute nichts anderes so wirklich klappen wollte. Ich selber nutze kein Twitter (den Sinn davon habe ich noch nicht erschließen können), aber ich habe aber dennoch einen Account in welchem ich eigentlich nur über neue Blogposts informiere oder eben die API Teste. Wie dem auch sei, vielleicht gibt es den ein oder anderen der diese Anwendung gebrauchen kann.
Aber worum geht es denn überhaupt? Ich habe eine Anwendung geschrieben, die sich beim Start in den Systemtray einbettet und beim klick auf das Icon einen simplen Dialog zum eingeben der Nachricht anzeigt. Über einen Rechtsklick kann man die Optionen (Autostart, Benutzerdaten) ändern oder das Programm beenden.

Optisch integriert sich die Anwendung ganz gut in den neuen Traybereich von Windows 7. Lauffähig ist sie auch unter Vista und vermutlich auch unter XP.
Wer also nun Interesse hat, kann sich die Anwendung hier herunterladen: trayTwittr.exe.
Update: Neue Version
Es gibt ein Update auf Version 1.1.0.0 welche Deutsch und Englisch als UI Sprache beherscht. Einfach die oben verlinkte Exe erneut herunterladen. Was ich ganz vergaß zu erwähnen: Die Anwendung benötigt das .NET Framework 3.5 um ausgeführt werden zu können.
Update 2 (20.03.): Ich habe den Quellcode des Projekts heute bei Codeplex veröffentlich: trayTwittr. Wer möchte kann ihn gerne erweitern oder sonstwie modifizieren.