-
ACHTUNG - NEUES BLOG
Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
|
Tool: Outlookmaster
23.03.06 - OutlookMaster Beitrag von Norbert Eder| | Da ich Microsoft Outlook intensiv verwende, es aber nicht ständig geöffnet haben will (Ressourcen, die ich fürs Programmieren benötige), habe ich mir gestern ein kleines Tool gebaut, welches Zugang zu einigen Outlook-Funktionen per Traybar anbietet.
Es fehlt zwar noch eine MailChecker-Funktionalität, aber leistet zumindest mir recht gute Dienste. Daher möchte ich das Tool potentiellen Usern nicht vorenthalten und habe es online gestellt.
Zu finden ist das Tool auf der Projektseite zu Outlookmaster.
Anregungen etc. nehme ich natürlich entgegen, unter Verwendung der Kontaktseite.
| | | 2 Kommentare
- 1402 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
.NET Compact Framework Version 2: Welches CAB für welches Gerät?
23.03.06 - Mobile Devices Beitrag von Norbert Eder
Patterns: Command Pattern
21.03.06 - Patterns Beitrag von Norbert Eder| | Das nächste Pattern, welches ich in meiner Rubrik Patterns vorstellen möchte, ist das Command-Pattern.
Defintion
Das Command Pattern ermöglicht die Repräsentation von Aktivitäten in eigenständigen Objekten.
Was bedeutet dies in der Praxis?
Innerhalb der selben Struktur können unterschiedliche Commands ausgeführt werden, die jeweils eine bestimmte Aufgabe besitzen. Unabhängig davon, welche Aufgabe ein Command hat, muss das ausführende Konstrukt nicht verändert werden. Zusätzlich besteht die Möglichkeit, Commands in beispielsweise einer Queue abzulegen um hintereinander abgearbeitet zu werden.
Beispiel-Implementierung
Der Aufbau des Command Patterns wird zwar in manchen Fällen recht aufwändig und kompliziert dargestellt, gestaltet sich in der Praxis jedoch als sehr einfach. Es wird ein Interface ICommand erstellt welches die notwendige Methode Execute() zur Verfügung stellt. Jeder konkrete Command implementiert dieses Interface und die Methode Execute() wird dabei mit der Logik des Commands befüllt. In einigen Fällen macht es auch durchaus Sinn, einen abstrakten Command einzufügen, der bereits Basisfunktionalitäten zur Verfügung stellt.
public interface ICommand
{
string Message{get;set;}
void Execute();
}
Dieses Interface schreibt also die Methode Execute() vor, die von jedem Command implementiert werden muss. Weiters wird eine Eigenschaft Message vorgeschrieben, die eine entsprechende Nachricht speichern soll. Konkreter Anwendungsfall wäre eine Fehlermeldung wenn der Command auf einem entfernten Host ausgeführt wird (kann als eine Ergänzung zu einem State gute Dienste leisten).
In diesem Beispiel wird nun ein abstrakter Command erstellt, der die Eigenschaft als Basisfunktionalität zur Verfügung stellt:
public abstract class Command : ICommand
{
private string message = null;
public string Message
{
get { return this.message; }
set { this.message = value; }
}
public abstract void Execute();
}
Alle Commands, die nun vom abstrakten Command ableiten, müssen die Eigenschaft Message nicht mehr implementieren, da diese bei der Ableitung übernommen wird. Lediglich die Methode Execute ist zu überschreiben. Dies wird anhand des folgenden Sourcecodes gezeigt:
public class ConcreteCommand : Command
{
#region ICommand Members
public override void Execute()
{
this.Message = "This is a concrete command implementation.";
}
#endregion
}
Hier passiert nichts anderes, als dass die Eigenschaft Message mit einem String befüllt wird.
Weiters wird von mir noch eine Klasse Executor benutzt, der für die Ausführung der Commands zuständig ist.
public class Executor
{
public void ExecuteCommand(ICommand ic)
{
ic.Execute();
}
}
Wie hier zu sehen ist, wird ein ICommand übergeben, der anschließend ausgeführt wird. Dadurch kann jeder beliebige Command ausgeführt werden und eine Erweiterung ist nur dann notwendig, wenn der Executor selbst diverse neue Features bekommt.
Zusammenfassung
Da im Falle des Command Patterns nur mehr die einzelnen Commands implementiert werden müssen, das ausführende Framework sich jedoch nicht ändert, eignet sich dieses Pattern sehr gut für eine Client-Server Kommunikation und wird daher auch oft eingesetzt, wenn Clients beispielsweise mit WebServices interagieren.
Nachfolgend findet sich ein kleines Testprogramm, welches den gesamten Ablauf dieses Patterns zeigt.
Beispiel-Anwendung: Download
| | | 6 Kommentare
- 2699 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Forenbetreiber werden wieder einmal abgemahnt!
15.03.06 - Internet, Community Beitrag von Norbert Eder| | Durch ungerechtfertigte Abmahnungen sind vor allem die privat geführten Internetforen sehr gefährdet. Diese beziehen sich auf den Heise-Fall, der zudem noch nicht abgeschlossen ist und zudem auch nicht übertragbar sein dürfte.
Wer also gerne an diversen Foren im Internet teilnimmt, der möge sich an dieser Spendenaktion beteiligen um die zugrundeliegende Klage zu unterstützen. Es kommt allen (deutschsprachigen) Foren zugute.
Helft mit!
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Tools: LaTeX Reference Manager
12.03.06 - 3rd Party Tools Beitrag von Norbert Eder| | Wer so wie ich entweder gerade seine Diplomarbeit oder auch andere Dokumente mit LaTeX schreibt, der weiß auch, dass Literaturangaben sehr wichtig sind, jedoch bei der Pflege viel Aufwand bedürfen.
Um dies einfacher zu machen, sei zu einem Tool namens JabRef geraten. Hierbei handelt es sich um eine Verwaltungs-Oberfläche für BibTeX-Datenbanken. Viele Funktionen (zu erwähnen ist auch die Unterstützung von vielen unterschiedlichen Formaten) werden geboten und erleichtern die Arbeit mit Literaturverweisen ungemein.
Anforderungen: Java 1.4 und neuer.
| | | Kommentar hinzufügen
- 4 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Community: Neue Kategorie und neues Glengamoi
09.03.06 - Community Beitrag von Norbert Eder| | Zum einen habe ich heute die Neue Kategorie Community eingeführt, in der Themen/Informationen aus eben diesem Gebiet aufgegriffen werden.
Weiters hat sich Glengamoi weiterentwicklet und geht nun mit einem Forum ins Rennen. Die altbekannten Mailinglisten wird es (so sieht es aus) weiterhin geben.
Vielleicht liest man sich ja das eine oder andere Mal ;-)
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
C# Beginner: UserControl DoubleTrackBar Beispiel
04.03.06 - .NET, WPF Beitrag von Norbert Eder| | Deisem Eintrag liegt ein Beispiel bei, welches zeigt, wie ein einfaches DoubleTrackBar-Control erstellt werden kann.
Mit Hilfe dieses Controls können mit zwei Schieberegler ein Minimum-Wert und ein Maximum-Wert eingestellt werden. Eigentlich ein recht simples Problem, jedoch nicht für C# Programmierer, die in Themen wie GDI+, UserControls wenig Erfahrung haben.
Der folgende Screenshot zeigt das Aussehen des UserControls in einer kleinen Testanwendung:
Zusätzliche Funktionalitäten sollten sich recht einfach einfügen lassen.
Anforderungen: .NET 2.0 für die Solution. Sourcecode auch unter .NET 1.1 nutzbar
Download
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Tools: DotLucene - Fulltext Search Engine for .NET
03.03.06 - 3rd Party Tools Beitrag von Norbert Eder| | Wer für diverse Anwendungsfälle eine kostengünstige und vor allem schnell Volltextsuche benötigt, der sollte sich auf jeden Fall DotLucene genauer ansehen.
Hinter diesem Open-Source-Projekt verbirgt sich eine vielversprechende Lösung für dieses Thema.
Ein kurzer Auszug aus der Featureliste:
- Gute Performance
- Ranking
- Hervorhebung der Suchbegriffe in den Ergebnissen
- Suche nach Metadaten
- Speicherung von vollindizierten Dokumenten
Durch die Benutzung der Online Demo kann man sich von der Geschwindigkeit und von einigen Features überzeugen.
Im gleichen Atemzug kann man sich auch den - auf der Seite von DotLucene vorgeschlagenen - Indexing Server Seek a File ansehen. Der Server läuft als Windows Dienst und kann folgende und weitere Dateitypen indizieren:
- DOC
- PDF
- XLS
- PPT
- RTF
- HTML
- TXT
- XML
Ein Blick auf diese Tools sollte sich als durchaus lohnen.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
C#-Beginner: Exception-Handling unter C#
02.03.06 - .NET, Base Framework Beitrag von Norbert Eder| | Das Thema Exception-Behandlung scheint bei vielen .NET Programmierern noch nicht richtig angekommen zu sein. Immer wieder finden sich in diversen Beispielen und Fragen traurige Konstrukte, die hauptsächlich negative Erscheinungen zu Tage fördern. Also Beispiel sei hier ein neulich gesichteter Code gezeigt werden (nicht kopieren!!!!!):
try
{
StreamReader sr = new StreamReader("path");
string text = sr.ReadToEnd();
sr.Close();
}
catch (Exception ex) {}
Das Ergebnis? Nun, ist die Datei nicht vorhanden wird eine Exception geworfen und auch abgefangen, aber es passiert damit nichts. Es erfolgt weder eine Meldung an den User, noch ein Log-Eintrag, um etwaige Fehler zu einem späteren Zeitpunkt nachvollziehen zu können. Ein weiterer Effekt ist, dass beim "Testen" durch den Entwickler "alles funktioniert" - was natürlich nicht stimmt.
Nun gut, aber wie soll das Exception Handling dann wirklich umgesetzt werden? Ganz einfach. Der grundlegende try-catch-Block sieht so aus:
try {
// Implementierung
} catch (IOException ex) {
// Fehlerbehandlung für IO-Fehler
} catch (Exception ex) {
// Fehlerbehandlung für andere Fehler
} finally {
// Abschlussarbeiten
}
Hier noch eine genaue Beschreibung:
try: Im try-Teil des gesamten Blockes erfolgt die Implementierung der tatsächlichen Funktion.
catch: Hier ist die Fehlerbehandlung zu implementieren. Dies kann realisiert werden, indem die Fehlermeldungen bzw. zusätzliche Einträge in eine Log-Datei geschrieben werden oder eine User-Interaktion verlangt wird. Wie oben gezeigt, können mehrere Exceptions gezielt abgefangen und behandelt werden. In der MSDN finden sich zu allen Methoden auch Angaben darüber, welche Exceptions geworfen werden. Prinzipiell ist mit diesen Exceptions zu arbeiten und nicht direkt mit Exception selbst.
finally: Dieser Teil des Blockes wird in jedem Fall ausgeführt, also sowohl nach erfolgreichem Durchlauf des try-Teiles, als auch im Falle eines Fehlers. Dadurch bietet es sich an, im finally-Block Aufräumarbeiten durchzuführen. Dies kann beispielsweise das Schließen einer Datenbank-Verbindung sein.
Beim catch-Block muss nicht zwingend ein Typ angegeben werden. Ist dies nicht der Fall, dann werden sämtliche Exceptions behandelt. Von dieser Schreibweise würde ich jedoch eher abraten:
try {
} catch {
}
Des weiteren sollten Exception nicht für die Ablaufsteuerung einer Anwendung verwendet werden. Darunter wird verstanden, dass gezielt auf Exceptions abgefragt wird, um aufgrund des Exception-Typs zu entscheiden, welcher weitere Code anschließend ausgeführt wird. Exceptions sind sehr "teuer". Dies bedeutet, dass dadurch viele Ressourcen verbraucht werden. Daher sind Exceptions auch als solche zu behandeln.
Natürlich besteht auch die Möglichkeit eigene Exceptions zu implementieren. Dies macht vor allem bei der Entwicklung von größeren Frameworks (die auch von anderen Entwicklern benutzt werden) Sinn. Folgendes Beispiel soll eine eigene Exception verdeutlichen:
using System;
class MyException : ApplicationException
{
public MyException(string str)
{
Console.WriteLine(str);
}
}
Wie zu erkennen ist, ist von der Basisklasse ApplicationException abzuleiten. Der Konstruktor erhält einen Parameter und damit ist die einfachste Variante einer benutzerdefinierten Exception fertig. Weitere Möglichkeiten können aus der MSDN bezogen werden.
Zum Schluss möchte ich noch kurz ansprechen, wie der Programmierer selbst Exceptions werfen kann. Dies wird mittels des Schlüsselwortes throw getan:
throw new MyException("Eine benutzerdefinierte Exception ist aufgetreten");
Eine so geworfene Exception muss natürlich auch entsprechend behandelt werden.
Referenzen und weiterführende Artikel:
[1] Exception Management Architecture Guide
[2] Exception Class
| | | 3 Kommentare
- 1676 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
www.norberteder.com wieder online
26.02.06 - Blog-Intern Beitrag von Norbert Eder| | Seit heute ist meine Website www.norberteder.com wieder online. Die Seite war ja in den letzten Monaten durch einen Serverausfall down.
In den letzten Tagen habe ich etwas Zeit gefunden, um die Seite in einem neuen Design online zu stellen. Der komplette Content ist noch nicht online, wird jedoch in den nächsten Tagen nachgezogen.
| | | Kommentar hinzufügen
- 3 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL | Zurück Weiter
|
|
|
|
|
|
|