Simon

Jun 112013
 

Ich verwende gerne Launchy, um alle Anwendungen schnell zugreifbar zu haben, ohne vorher jede einzeln als Verknüpfung/Hotkey/Whatever konfigurieren zu müssen.

Launchy durchforstet automagisch Startmenü und andere Ordner (anpassbar) nach Verknüpfungen und ausführbaren Dateien. Diese werden indiziert und sind so sehr schnell zugreifbar.

Als ich neulich dann GitHub via Launchy starten wollte, wurde es aber nicht gefunden.
Die Ursache ist simpel: Github for Windows ist eine ClickOnce-Anwendung, es gibt keine .exe und keine .lnk-Datei in Startmenü oder Installationsordner, stattdessen startet man sie über eine .appref-ms-Datei.

Also: Putty-Konfiguration um diese Dateierweiterung ergänzen:
 2013-06-11_21h40_43

Dann klappt’s auch mit Launchy und GitHub (und anderen ClickOnce-Apps):
2013-06-11_21h39_56

Jun 052013
 

Hat dir eine Fehlermeldung eigentlich schonmal dabei geholfen, den Fehler zu erkennen und abzustellen?

Vermutlich nicht, die Chancen stehen gut, dass du die Meldungen sowieso nicht liest, weil fast nie etwas Hilfreiches drinsteht. Ich finde das absolut nachvollziehbar und werfe bestimmt nicht mit Steinen, obwohl ich meistens tatsächlich lese, was mir da entgegengeworfen wird.

Und heute hat es sich mal gelohnt:
Um git bzw. GitHub hinter einem Proxy zu verwenden, habe ich diesen Tipp gefunden.
Leider hat der Blog das Kommando verfälscht, und aus ‘—config’ wurde ‘-config’,
dementsprechend funktionierte das Kommando auch nicht auf Anhieb, stattdessen kam diese Fehlermeldung:

gitproxyerror

Und was fällt uns da auf?

Man muss tatsächlich nur Englisch beherrschen, um zu verstehen, was man tun muss damit es funkioniert.
So geht Fehlermeldung!

 Posted by at 10:16  Tagged with:
Feb 072012
 

Bei WPF kann man mit Styles, ControlTemplates etc. wirklich viel erreichen. Ich bin großer Fan davon, viel “Standard-Style” in applikationsweit gültige StaticResources auszulagern, und nur noch ganz wenig “Custom-Styling” in der View vorzunehmen.
Anders ist es IMHO nicht möglich, in größeren Teams Wildwuchs zu vermeiden oder später “DEN” Style nochmal großflächig zu ändern.

Ein großes Defizit gibt es aber: es ist unglaublich lästig, eine Style-Hierarchie zu pflegen, z.B. einen Firmenstandard in Styles zu definieren, und dann aber für eine Einzelanwendung für Kunde X ein kleines Delta obendrauf zu setzen. Noch lästiger ist es, bei Komponenten von Fremdherstellern die Styles anpassen zu wollen, da hier oft diese Möglichkeit gar nicht vorgesehen ist.

Neulich wollte ich z.B. beim Toolbar im PropertyGrid von Mindscape einige Tooltipps eindeutschen, die leider in der vorliegenden Version nicht anpassbar waren. Dafür hätte ich das gesamte ControlTemplate für das PropertyGrid kopieren müssen, dann die 4 Texte ändern und die geänderte Version in meine Applikationsstyles integrieren müssen. Ein neuer Style mit BasedOn oder das Hinterlegen eines Styles nur für die Teilkomponente “Toolbar” ging nicht.

  1. Copy/Paste widerspricht DRY, und man kann dem Style hinterher nicht mehr ansehen, welcher Teil 1:1 kopiert und welcher angepasst ist (Ja, ich weiß dass Kommentare auch in XML möglich sind, aber ich weiß auch dass die keiner liest oder gar pflegt)
  2. Irgendwas an dem kopierten XAML hat dem WPF-Designer nicht geschmeckt, und da er in den applikationsweiten Ressourcen sein sollte, hat das den WPF-Designer gleich für die gesamte Solution ausgehebelt.
  3. Dadurch wurde die gesamte Ressource erst von der Fremdhersteller-Lib und dann nochmal von meiner App eingelesen, auch unnötig.

Also braucht es einen anderen Weg, mein kleines Delta in den Style bzw. das ControlTemplate einzubauen.
Und zwar wollte ich “OnApplyTemplate” das angewandte ControlTemplate im Code-Behind manipulieren. Dafür muss man natürlich den Visual Tree herunterlaufen und die anzupassenden Elemente heraussuchen. Da ich sowieso eine Ableitung des UserControls hatte, konnte ich mich problemlos in das Event einhängen – alternativ hätte ich auch ein "Behavior" bauen können, was sich ins Event einklinkt.
Folgende Extension-Methode funktioniert für sowas wunderbar:

public static class WPFTreeUtils {

  public static IEnumerable FindVisualChildren(this DependencyObject obj, bool applyTemplateIfNeeded) 
    where T : DependencyObject {
      if (obj != null) {
        int childrenCount = VisualTreeHelper.GetChildrenCount(obj);
        if (childrenCount==0 && applyTemplateIfNeeded) {
          var fe = obj as FrameworkElement;
          if (fe != null) {
            if (fe.ApplyTemplate()) {
              childrenCount = VisualTreeHelper.GetChildrenCount(obj);
            }
          }
        }
        for (int i = 0; i < childrenCount; i++) {
          var child = VisualTreeHelper.GetChild(obj, i);
          if (child is T) {
            yield return (T)child;
          }
          var childOfChild = child.FindVisualChildren();
          if (childOfChild != null) {
            foreach (T c in childOfChild) {
              yield return c;
            }
          }
        }
      }
    }
}

Die rekursive Suche mit dem VisualTreeHelper ist relativ straight forward. Tricky ist die kleine If-Abfrage: Bevor man mit leeren Händen nach Hause geht, sollte man erst noch gucken, ob durch "ApplyTemplate" nicht doch noch eine Unterstruktur gefüllt wird, in der man fündig wird. So konnte ich meine Buttons herauspicken und die Tooltipps durch eine lokalisierte Variante ersetzen und noch einen Labeltext ändern. Auf diese Art kann man, statt immer neue, immer größere ResourceDictionaries zu erzeugen zur Laufzeit die Änderungen anbringen. Natürlich ist das nicht für alle Anwendungen geeignet, aber in diesem Fall z.B. wird das Control nur selten instanziiert und es kostet nicht die Welt, jedesmal dann Hand anzulegen.

 Posted by at 12:00
Nov 022011
 

Die DKMS (Deutsche Knochenmarkspende) ist die Datenbank für potentielle Knochenmarkspender.
Leukämie kann jeden treffen, und ein Spender kann Leben retten – allerdings nur wenn er auffindbar ist, und die Trefferchance ist gering.

Die Registrierung ist unkompliziert und kostenfrei: Einfach online das Registrierungskit bestellen, selbst zu Hause eine Probe nehmen und per Post zurück. Fertig.

Und warum bist du noch nicht registriert?

Geschrieben mit WordPress für Windows Phone

Okt 132011
 

Im Januar 2009 deutete Joel Spolsky schon an, dass der Java-Installer eventuell um ein bis zwei Vorkommen des Wörtchens ‘Java’ reduziert werden könnte.

Ich weiß nicht ob er der erste war, bis heute hab ich diesen und ähnliche Screenshots jedenfalls desöfteren als abschreckendes Beispiel in Präsentationen gesehen.

Jetzt ist es Ende 2011 und man könnte ja meinen, Oracle hätte sich zwischenzeitlich mal drangemacht, diesen Lacher abzustellen.
Leider gefehlt, heute sieht der Installer so aus:

2011-10-13 21h02_18

Das einzige Java, das verschwunden ist, ist das Logo – und das war natürlich das einzige ‘Java’, das den anderen Javas wenigstens etwas Information in Form von Wiedererkennungswert des Logos zugefügt hat.

Will Oracle dieses Anti-Pattern etwa als Markenzeichen prägen?

Sep 152011
 

Ich kann zumindest teilweise Entwarnung geben: ifttt funktioniert prinzipiell, ich hab mir nur ein ungünstiges erstes Testobjekt ausgewählt: Selbstgehostete WordPress-Blogs scheinen gerade noch nicht als Trigger zu funktionieren. Naja, ist ja auch noch Beta-Status.

Mein nächster Versuch war jetzt erfolgreicher:

Wann immer ich einen Post in meinem Google-Reader “Sterne”, wird er auch gleich auf meinen ReadItLater-Account übertragen. Im Grunde bräuchte jetzt kein Google-Reader-Client mehr diese Funktion zu  implementieren – zumindest nicht für mich.

Toll.

Sep 152011
 

Hmm, bislang noch keine Aktion von ifttt zu erkennen, und die Logs meiner Tasks zeigen nur wenig hilfreiche Fehlermeldungen (war nix, probier später nochmal…)
Aber ist ja auch noch in der Startphase, da will ich mal nicht meckern.

Update 17.05.12: Nachdem ich meinen „selbst“ (also nicht auf wordpress.com) gehosteten  Blog jetzt von einem Unterverzeichnis ins Webroot verschoben habe, klappt’s auch mit den IFTTT-Triggern so wie es soll 🙂

Sep 152011
 

Wer kennt das nicht: Lästige kleine Handgriffe, die jeweils nur Sekunden dauern, aber die doch auf Dauer lästig werden, weil sie einfach immer wiederkehren…

Zum Beispiel: E-Mail-Anhänge speichern (hatten wir doch neulich schon) oder beim neuen Release des eigenen Pet Projects auf Twitter rundrufen, dass es existiert.

Alles Tätigkeiten, für die man nicht viel nachdenken muss und die auch relativ einfach z.B. mit Skriptsprachen/Makros automatisierbar wären. Allerdings… welche Skriptsprache hat noch gleich supereinfache Schnittstellen für die gängigsten Internetdienste eingebaut? Richtig.

Außerdem gibt es so viele, da will man sich eigentlich nicht in jeden erst einarbeiten für so eine einfache Aufgabe.

Der neue Internetdienst IFTTT.com will uns das jetzt abnehmen. Für diverse Internetdienste kann man sich dort aus vordefinierten Triggern und Aktionen seine eigenen Makros zusammenklicken, z.B. wenn ich getwittert habe gleich das ungeliebte inhaltsgleiche Cross-Posting bei Facebook posten :evil:… Verdammt, das geht so einfach, es wird etliche geben die das tun.

Das ganze noch mit hübschen Bildchen verpackt und wunderbar einfach zu bedienen, ich schätze im Laufe der Zeit werden die Trigger und Aktionen auch noch etwas filigraner auszugestalten sein. Und etwas Social ist es auch noch: man kann seine “Recipes” – also die Makros (nach Entfernung der persönlichen Parameter – auch wunderbar zur Nachahmung empfehlen.

Dann bin ich ja mal gespannt:

Ich hab mir erstmal 2 Regeln definiert:

  1. Wenn mein Blog einen neuen Post hat: EMail an mich mit dem Inhalt.
  2. Wenn mein Blog einen neuen Post hat: Das erste Bild daraus (mehr geht leider nicht) auf DropBox ablegen.

Also brauch ich jetzt noch ein Bild, um das ganze auszuprobieren… et voílà:

Winking smile

Also dann, fröhliches Triggern.
Meine Rezepte gibt’s übrigens hier: http://ifttt.com/people/sdraht

Jul 212011
 

Was tun, wenn die Frau, die mal die Schwiegermutter werden soll, fragt, ob man es nicht vereinfachen könnte, die vielen Fotos aus den E-Mails in ihren Bilder-Ordner zu verfrachten?

Zuerst hab ich in Outlook nach der Funktion gesucht, die auf Knopfdruck alle Anhänge einer E-Mail in einem auszuwählenden Ordner abspeichert und musste feststellen: es gibt sie nicht oder sie ist verdammt gut versteckt. Außerdem ist ja auch lästig, DEN Ordner (ja, immer der selbe) immer wieder neu auszuwählen und alle Mails einzeln abzuarbeiten, also mal schnell einen Blick riskiert, ob man dafür nicht ein schnelles Makro zaubern könnte.

Et voilà, hier ist es:

Sub UnterFotosSpeichern()
  Dim Ordnername As String   
  Dim objMail As MailItem    
  On Error Resume Next   
  Ordnername = &quot;zB ein absoluter Pfad zum Ordner&quot;   
  For Each objMail In Application.ActiveExplorer.Selection     
    For Each attachedFile In objMail.Attachments        
      attachedFile.SaveAsFile Ordnername &amp; &quot;\&quot; &amp; attachedFile.FileName     
    Next attachedFile    
  Next objMail  
End Sub 

Der Clou dabei: es können gleich mehrere Mail markiert werden und alle Attachments werden “abgesaugt”.

Alternativ könnte man natürlich einen beliebigen Ordner auswählen lassen, oder einen anhand der Datei-Datumsinformation einen Unterordner oder die Mails hinterher noch löschen oder verschieben usw… aber das war hier gerade nicht beabsichtigt.

Und das ganze ging echt schnell, für solche kleinen Nettigkeiten ist VB zugegebenermaßen echt brauchbar, auch wenn mir C# wesentlich besser von der Hand geht.

 


*Sorry, es war stärker als ich. Sollte meinen: Hoppla, da hab ich doch nach langer Zeit nochmal einen ungewollten Ausflug in die Welt von Visual Basic (VB) for Applications gemacht.

n/a