Archive Page 2

Outlook Emails und Aufgaben per Verküpfung

Ich persönliche finde das Vista Startmenü sehr komfortabel. Per Suchbegriff kann schnell ein Programm oder eine Datei geöffnet werden. Bisher fehlte mir jedoch der direkte Zugriff um per Outlook 2007 eine Email zu verschicken oder schnell eine Aufgabe anzulegen. Nach kurzer Suche stieß ich auf folgende Befehle, die - verpackt als Verknüpfung - nun direkt das Dialogfenster für Emails und Aufgaben öffnen.

Aufgabe:
"C:\Program Files\Microsoft Office\Office12\OUTLOOK.EXE" /c ipm.task /a

Email:
"C:\Program Files\Microsoft Office\Office12\OUTLOOK.EXE" /c ipm.note"

Tracing mit ASP.NET AJAX

Die Verwendung von Tracing ist eine einfache und leichte Möglichkeit einem Fehler auf den Grund zu gehen oder einfach nur bestimmte Ereignisse und Vorgänge per Nachricht auszugeben. In der Code-Beside Datei einer ASP.NET Seite ist dies, je nach verwendeter Programmiersprache, einfach. Wird C# verwendet kann über die Klasse Trace und die Methode Write eine Nachricht ausgegeben werden.

In vielen Web Anwendungen wird jedoch JavaScript, häufig in Verbindung mit AJAX genutzt. Das ASP.NET AJAX Framework bietet allerdings auch eine Möglichkeit an Tracing zu verwenden.

Über die Funktion Sys.Debug.trace() kann eine einfache Meldung ausgegeben werden.

<script language="javascript" type="text/javascript">
    function TraceMessage()
    {
        Sys.Debug.trace("Tracing is working");
    }
</script>

Ist das Script-Debugging im Internet Explorer aktiviert und die Anwendung per Visual Studio ausgeführt, wird die Meldung im Visual Studio Output Window ausgegeben.

AJAXTracing

Eine weitere Möglich besteht in der Ausgabe in eine Textarea. Hier muss auf der Seite eine Textarea mit der ID TraceConsole eingefügt werden. Anschließend werden die Meldungen auch hier ausgegeben.

<textarea id="TraceConsole" cols="20" rows="20"></textarea>

Wird kann der Firefox Browser verwendet, können die Meldungen mit Hilfe des FireBug Add-Ons ebenfalls ausgegeben werden. Hierzu ist es nötig die Konsole für den localhost zu aktivieren.

AJAXTracingFirebug2

Dem dem sehr einfachen Ausgeben von Nachrichten bietet das AJAX Framework noch weit umfangreichere Möglichkeiten, um Fehler zu finden, oder das Verhalten der Anwendung zu beobachten. In der MSDN finden sich dazu mehrere Artikel und Beschreibungen:

Debugging and Tracing AJAX Applications Overview

Die Beispielanwendung kann hier runtergeladen werden.

Active Directory Authentifizierung mit C# via LDAP

Die Authentifizierung gegen ein Active Directory via LDAP ist mit wenigen Zeilen zu lösen. Nachdem Hinzufügen der Referenz System.DirecotryServices kann mit Angabe der Domäne, Benutzername und Passwort ein Aufruf mit Hilfe der Klasse DirecoryEntry gestartet werden.

static bool Authenticate(string domain, string username, string password)
{
    bool isAuthenticated = false;

    try
    {
        DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, username, password);
        object nativeObject = entry.NativeObject;
        isAuthenticated = true;
    }
    catch (DirectoryServicesCOMException) { }

    return isAuthenticated;
}

Das Beispielprojekt kann hier runtergeladen werden.

ASP.NET AJAX History Control

Ein häufiges Ärgernis von AJAX Anwendungen tritt dann zu Tage, wenn die Vor- und Zurück-Buttons des Browsers verwendet werden. Eine per AJAX ausgeführte Aktion wird vom Browser nicht als Seitenwechsel interpretiert und taucht somit auch nicht im Seitenverlauf auf. Im schlimmsten Fall landet der Benutzer der Seite also wieder am Beginn und hat alle getätigten Änderungen und Eingaben sind verloren.

Mit dem Service Pack 1 des .NET Framework 3.5 wurde der AJAX ScriptManager um eine neue Funktionalität erweitert. Diese neue Funktion setzt nach jedem AJAX Aufruf einen Verlaufspunkt im Browser, so dass die Vor- und Zurück-Buttons wieder verwendet werden können.  Das folgende Beispiel zeigt die Verwendung anhand einer DropDownListe und eines UpdatePanels auf. Nach dem Auswählen eines Eintrags wird der Bereich im UpdatePanel aktualisiert und die Auswahl in einem Label ausgegeben.

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

<asp:UpdatePanel ID="updatePnl" runat="server">
    <ContentTemplate>
        <asp:DropDownList ID="ddlAuswahl" runat="server" OnSelectedIndexChanged="ddlAuswahl_SelectedIndexChanged" AutoPostBack="true">
            <asp:ListItem>Eintrag 1</asp:ListItem>
            <asp:ListItem>Eintrag 2</asp:ListItem>
            <asp:ListItem>Eintrag 3</asp:ListItem>
            <asp:ListItem>Eintrag 4</asp:ListItem>
            <asp:ListItem>Eintrag 5</asp:ListItem>
        </asp:DropDownList>
        <br />
        Auswahl: <asp:Label ID="lblAuswahl" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void ddlAuswahl_SelectedIndexChanged(object sender, EventArgs e)
    {
        lblAuswahl.Text = ddlAuswahl.Text;
    }
}


Ohne die AJAX Funktionalität, die das UpdatePanel bereitstellt, wird nach jeder Auswahl die Seite neu geladen und somit auch der Zurück-Button im Browser aktiv. Sobald jedoch das UpdatePanel verwendet wird, bleibt der Button ausgegraut.

 HistoryIE0 

Neben dem setzen der Eigenschaft EnableHistory des ScriptManagers auf true, ist es weiterhin nötig einen HistoryPoint zu setzen. Dies wird im EventHandler der DropDownListe erledigt.

protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
    ScriptManager1.AddHistoryPoint("index", ddl.SelectedIndex.ToString(), "Point " + ddl.SelectedValue);
}

Um die gesetzten Werte später wieder abzurufen und - in diesem Beispiel - den richtigen Index der DropDownListe zu setzen, ist es nötig den Event OnNavigate des ScriptManagers zu abonnieren. An den EventHandler wird der Wert übergeben, welcher vorher mit Hilfe der Methode AddHistoryPoint gesetzt wurde.

protected void ScriptManager1_Navigate(object sender, HistoryEventArgs e)
{
    string selectedIndex = e.State["index"];

    if (String.IsNullOrEmpty(selectedIndex))
        ddl.SelectedIndex = 0;
    else
        ddl.SelectedIndex = Convert.ToInt32(selectedIndex);
}

Nach dem Starten der Anwendung ist das Ergebnis ein aktiviertes Zurück-Button im Browser.

HistoryIE1

Durch die flexible Struktur und die Events ist es möglich das Verhalten in komplexen AJAX-Anwendungen an die eigenen Bedürfnisse anzupassen.

Noch ein Hinweis:

Wird die Eigenschaft EnableHistory auf false gesetzt, ohne den Aufruf der Methode AddHistoryPoint() zu entfernen, wird der Aufruf mit einer Exception quittiert. Um dies zu verhindern kann die Eigenschaft zusätzlich noch im EventHandler abgefragt werden. Weiterhin gibt die Eigenschaft IsNavigating Auskunft darüber, ob momentan mit Hilfe des HistoryControls navigiert wird.

protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
    if (ScriptManager1.EnableHistory && ScriptManager1.IsNavigating == false)
    {
        ScriptManager1.AddHistoryPoint("index", ddl.SelectedIndex.ToString(), "Point " + ddl.SelectedValue);
    }
}

Das Beispielprojekt kann hier herruntergeladen werden.

Neues Projekt: WPF-Bloggers.com

misc_wpfblogger_logo

Nun ist es raus: Neben dem .NET GUI Foren hat Norbert ein weiteres Projekt gestartet, welches den Namen WPF-Blogger.com trägt. Es handelt sich um ein Portal, welches Beiträge von Silverlight oder WPF Bloggern sammelt und zur Verfügung stellt.

Momentan befindet sich alles noch in der Startphase, so dass in den nächsten Wochen und Monaten mit weiteren Erweiterungen gerechnet werden kann.

Wie immer freut sich Norbert über Rückmeldungen. Mehr zum Projekt gibt es unter http://blog.norberteder.com/index.php?entry=entry081215-183739

World of Goo - Spiel für Zwischendurch

WoG_header

Ich gebe zu das ich seit mindestens 3 Jahren kein Spiel mehr am PC gespielt habe. Letzte Woche bin ich beim Stöbern im Web jedoch auf das Spiel auf World of Goo gestoßen und bin ihm sofort verfallen. Das Prinzip des Spiels ist einfach: Die Goo Balls müssen in ein Rohr geleitet werden. Dazu können die Goos selbst zu Strukturen verbunden werden, auf denen sich dann die übrig gebliebenen Goos bewegen können. Das Bauen der Strukturen orientiert sich an dem schon etwas älteren Spiel Bridge Builder.

Das Spiel gibt es für Windows, MacOS und demnächst auch für Linux. Es kostet 20 EUR - Eine Demoversion ist verfügbar. Viel Spaß beim Spielen.

http://www.worldofgoo.com/

Buch-Tipp: Ship it! Softwareprojekte erfolgreich zum Abschluss bringen

ShipIt

Das Buch Ship it! Softwareprojekte erfolgreich zum Anbschluss bringen wurde von Jared R. Richardson und William A. Gwaltney geschrieben. Es beschäftigt sich mit den alltäglichen Problemen, die während eines Softwareprojekts oder der Arbeit im Team auftreten können.

Umschlagtext:

Software-Projekte erfolgreich zum Abschluss bringen

Kennen Sie das? - Projekte geraten ins Stocken, weil die falschen Tools eingesetzt oder die Tools falsch angewendet wurden, weil die Kommunikation im Team nicht stimmt, weil die Anforderungen sich ständig ändern, weil…. Dieses Buch ist für alle gedacht, die das nicht länger ertragen wollen und die ihre Software ohne Ausflüchte zum Termin rausbringen wollen.

Die Autoren stellen zunächst die Infrastruktur und Tools vor, die Sie und Ihr Team für Ihr Projekt brauchen, damit es rund läuft. Sie zeigen, welche pragmatischen Techniken Sie in Ihrem Team einsetzen sollten, damit alle immer auf dem gleichen Stand sind und sich immer zuerst um das Wichtigste kümmern.

Nicht zuletzt werden häufige Probleme und Gefahren offen angesprochen und praxiserprobte, pragmatische Lösungen vorgestellt.

Geht es Ihnen auch so?

- Sie haben die Nase voll von ins Stocken geratenen Projekten.
- Sie wollen sich und Ihr Team produktiver machen.
- Sie finden ‚Extreme Programming’ eine Spur zu extrem.
- Sie finden den Kosten- und Zeitaufwand der verbreiteten Vorgehens- und Prozessmodelle oft übertrieben.
- Ihre Software muss jetzt einfach fertig werden, ohne Wenn und Aber.

Dann lesen Sie in diesem Buch, wie sie Ihre Software pünktlich ausliefern können!

Das Buch liest sich gut von der Hand und ist angenehm geschrieben. Die Gliederung ist klar und strukturiert. Die Probleme, auf die ein Softwareprojekt stoßen kann, sind direkt beim Namen genannt und werden häufig mit einer patenten Lösung beantwortet. Jedoch werden viele Punkte meiner Meinung nach zu oberflächlich behandelt und hätten hier und da noch eine weitere Erklärung oder ein wenig ausschweifenden Zusatz benötigt.

Für unerfahrene Projektleiter oder neu gegründete Entwicklungs-Teams ist das Buch jedoch ideal und bietet den richtigen Einstieg. Jedoch sollte sich der Käufer auf den Erwerb weiterer Literatur vorbereiten.

Für Leute, die sich schon einmal mit dem Thema befasst haben, bietet das Buchs nichts neues, sodass sich ein Kauf nicht lohnt.

Amazon-Link:
http://www.amazon.de/gp/product/3446404252/ref=sib_rdr_dp

Vista AutoUpdate error 8000FFFF

Nachdem ich gestern Abend mein Thinkpad neu installieren musste, war die Aufgabe heute die fehlenden Windows Updates und benötigte Software zu installieren. Ich staunte jedoch nicht schlecht, als das Windows Update mit dem Fehlercode 8000FFFF beendet wurde. Ein manueller Download der Update wurde ebenfalls mit selbigem Fehler beendet.

Nach ein wenig googlen habe ich folgenden Eintrag gefunden, welcher genau dieses Problem beschreibt und eine Lösung anbietet.

http://blogs.technet.com/kailash/archive/2007/09/20/windows-vista-autoupdate-error-8000ffff.aspx

Wie im Eintrag beschrieben muss ein Eintrag in der Registry entfernt werden. Dies kann per Start - Ausführen und mit folgendem Befehl erledigt werden:

reg delete HKLM\Components /v AdvancedInstallersNeedResolving

Eine Antwort auf das “Warum” konnte ich jedoch nicht finden.

Neue Kategorie: Bücher

Häufig lese ich, dass viele Softwareentwickler das Internet dem guten alten Buch vorziehen und sich mit einem Problem lieber online befassen. Ich bin jedoch der Meinung das ein gutes Buch mit dieser Aussage zu unrecht verurteilt wird. Bücher bieten häufig einen leichten und kompakten Einstieg in ein neues Thema oder liefern Hintergrundwissen.

Aus diesem Grund lese ich noch immer gerne (Fach-)Bücher. In der neuen Kategorie im Blog möchte ich zukünftig meine Meinung zu fertig gelesenen Büchern kundtun, oder bestimmtem Titel zur Diskussion stellen.

Twitter und C#

Momentan scheint Twitter wieder in aller Munde zu sein - zumindest haben viele Freunde und Bekannte in den letzten Wochen einen Twitter Account erstellt und sind nun fröhlich am twittern.

Grund genug auszuprobieren, wie schwer oder wie einfach es ist einen Tweet per C# zu senden. Hierfür muss natürlich zunächst ein Test-Account erstellt werden. In diesem Fall lautet der Username passenderweise BlaBlubBlog. Twitter stellt externen Programmen eine API zu Verfügung, die unter http://apiwiki.twitter.com/ dokumentiert ist. Die API basiert auf REST und kann somit ohne weitere Hilfsmittel per C# angesprochen werden.

Zunächst ist es erforderlich eine Anmeldung per HTTP Basic Authentication durchzuführen. Hierfür ist die Klasse HttpWebRequest erforderlich, an die der Benutzername und das Passwort übergeben wird.

HttpWebRequest request = WebRequest.Create(twitterUpdateUrl) as HttpWebRequest;
request.Proxy = HttpWebRequest.DefaultWebProxy;
request.Credentials = new NetworkCredential("BlaBlubBlog", "<PASSWORD>");

Die Url um einen Tweet abzuschicken bzw. den Status zu setzen lautet http://twitter.com/statuses/update.xml. Nachdem der gewünschte Text per UrlEncode() Methode für das Senden vorbereitet wurde, wird der ContentType und die Art der Datenübertragung - in diesem Fall POST - gesetzt. Weiterhin werden die nötigen Parameter erstellt, zum einen der Text selbst und zum anderen die Quelle oder Anwendung, von der aus der Tweet gesendet wurde.

twitterText = HttpUtility.UrlEncode(twitterText);

request.Method = "POST";

request.ContentType = "application/x-www-form-urlencoded";
string param = "status=" + twitterText;
string sourceParam = "&source=BlaBlubBlog";
request.ContentLength = param.Length + sourceParam.Length;

Nachdem alle Vorbereitungen abgeschlossen sind, können die Daten nun per StreamWriter geschrieben werden. Mt Hilfe der HttpWebResponse Klasse werden die Daten an Twitter gesendet und die Rückantwort ausgewertet. Diese kann als Xml-Dokument geladen und verarbeitet werden. Im Node Status befindet sich die Meldung bezüglich des abgesetzten Tweet.

StreamWriter stOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(param);
stOut.Write(sourceParam);
stOut.Close();

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    StreamReader reader = new StreamReader(response.GetResponseStream());

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);

    XmlNode node = doc.SelectSingleNode("status");
}

War die Übertragung erfolgreich, erscheint das Tweet umgehend auf der Hauptseite des Benutzers.

Tweet

Dieses Beispiel hat gezeigt wie einfach es ist per C# mit Twitter zu kommunizieren. Natürlich sind noch viele Dinge mehr möglich, die aber den Rahmen dieses einfachen Beispiels sprengen würden.

Das Beispielprojekt gibt es zum Download unter der Url
http://www.veloursnebel.de/Code/TwitterClient.zip