Dienstag, 27. Oktober 2009

Dot Net (C#): lokalisiertes PropertyGrid ; lokalisierte Attribute

In der heutigen Zeit wird eine Anwendung meistens für mehrere Sprachen realisiert. Mit Microsoft .NET ist es kein Problem, Windows-Anwendungen zu lokalisieren. Doch immer wieder kommt die Frage auf, wie man Attribute, insbesondere solche für das PropertyGrid (Description, DisplayText, Category), lokalisieren kann.

Da meine Internetrecherche zu diesem Thema kaum brauchbare Beispiele hervorbrachte, möchte ich an einem Minimalbeispiel darauf eingehen:

Als erstes brauchen wir eine Klasse, die lokalisiert werden soll, nehmen wir in diesem Fall eine "Person":

namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
public String FirstName { get; set; }
public String LastName { get; set; }

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}

Normalerweise würde man die Klasse nun wir folgt mit Attributen versehen:
[DescriptionAttribute("Der Vorname dieser Person")]
public String FirstName { get; set; }

[DescriptionAttribute("Der Nachname dieser Person")]
public String LastName { get; set; }

Diese Vorgehensweise hat jedoch den Nachteil, dass die Attribute nicht lokalisierbar sind. Leider gibts es in .NET keine Möglichkeit, solche Attribute problemlos zu lokalisieren, da deren Information von der Laufzeitumgebung einmal eingelesen wird (per Reflection) und danach nicht mehr aktualisiert. Mit einem kleinen Trick kann man jedoch zumindest dafür sorgen, dass genau in diesem Momemt die Attribute der Sprache angepasst werden. Dazu ist es als erstes notwendig, die lokalisierten Texte wie gewohnt in einer beliebigen Resource-Datei abzulegen.



Als nächstes muss eine Klasse her, die es einem Attribut ermöglicht, seine Informationen aus einer Resource-Datei zu laden. Ich zeige das Verfahren am Beispiel des Description-Attributes, es kann alternativ mit dem Category- und DisplayText-Attribut verfahren werden:

Lediglich ein privates Feld (oder Property) sowie das Überschreiben des Get-Property sind notwenidg.
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
/// <summary>
/// Contains the name of the resource-string
/// </summary>
private string rDescription;

/// <summary>
/// Creates a new LocalizedDescription Attribute instance
/// giving it the name of the resource-string
/// </summary>
/// <param name="description"></param>
public LocalizedDescriptionAttribute(string description)
{
this.rDescription = description;
}

/// <summary>
/// (Overridden) Get: fetching the description during runtime
/// from the Resources (with respect to the current culture)
/// </summary>
public override string Description
{
get
{
return Properties.Resources.ResourceManager.GetString(
this.rDescription,
Thread.CurrentThread.CurrentCulture
);
}
}
}

Als nächstes ist es notwendig, die Klasse Person abzuändern und das neue Attribut einzusetzen:
namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
[LocalizedDescriptionAttribute("PersonFirstName")]
public String FirstName { get; set; }
[LocalizedDescriptionAttribute("PersonLastName")]
public String LastName { get; set; }

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}


Eine fertige Klasse könnte wie folgt aussehen:
namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
[LocalizedCategoryAttribute("PersonCatData"),
LocalizedDescriptionAttribute("PersonFirstNameDescription"),
LocalitedDisplayTextAttribute("PersonFirstNameDisplayText")]
public String FirstName { get; set; }

[LocalizedCategoryAttribute("PersonCatData"),
LocalizedDescriptionAttribute("PersonLastNameDescription"),
LocalitedDisplayTextAttribute("PersonLasttNameDisplayText")]
public String LastName { get; set; }

// other properties

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}


Das gesamte Beispiel könnt ihr hier runterladen: localizablepropgridcode.rar (14,6 KB)

Mittwoch, 13. Mai 2009

Understanding SSDs / which SSD to choose nowadays

Since december 2008 I'm using a SSD for my OS and the installed programs. I had to make a choice between the OCZ Core v2 / Solid - series (MLC, JMicron-based), the Patriot Warp v2 (MLC, JMicron-based) or the Mtron Mobi 3500-series (SLC, proprietary development-chip). Because of better price per GB and availability I picked the Patriot Warp v2. Sadly I had to return it to the shop some days later because of terrible stuttering/pause-problems.

Then I chose the Mtron Mobi 3500-series (3525 32GB in fact) and experienced some very satisfying performance. I'm using it for 5 months now and I'm still happy with my decision not to keep the Patriot Warp but switching to the Mtron Mobi. The diurnal performance of this drive is just astonishing in my book. Applications start in a fraction of time they did before (using a quite fast Samsung-HDD).

If you want to make your laptop/pc faster and are "still" using an HDD, all you have to do is to put any (good) SSD into it. This update is worth much more than adding more RAM, upgrading the CPU or anything else!!!

So, it's been a while and some new SSDs are available down to the present day. OCZ launched their Vertex series (Summit comming soon), the Samsung SLC-SSD dropped in price, they launched the new PB22-J and a lot of other drives are pretty much available. So it's hard to select the right one if you want to have a good performing SSD for your OS and applications. Within the last days I read a lot of reviews concerning the Intel X25-E and the OCZ Vertex, two very attractive SSDs these days.

There is one article that is definitely worth reading: At the Anandtech-Website you can find it: The SSD Anthology: Understanding SSDs and New Drives from OCZ. This article starts with some facts about the stuttering/pause-problems (JMicron-based SSDs, esp. JMF602A/JMF602B) like I had with the Patriot Warp v2, explaines generally why you should want an SSD. Then it accurately describes the anatomy of an SSD (very worth reading), it deals with the performance degradation problem (also very worth reading!!!), describes how you can restore the peak performance of your SSD using secure erase-mechanism. Furthermore there is a comparison of the performances of new vs. used drives, a very juicy story about the development of the OCZ Vertex and finally a chunk of benchmark and real-world-usage results.

Unhappily this article does not include any words about my Mtron Mobi, but it explains a lot about SSDs itself, its architecture, its development during the last couple of month and has a clother look at the OCZ Vertex and Intel X25-M, two very interesting drives today.

If you're planning to purchase a SSD and want to know why not to choose the OCZ Solid / Core, Patriot Warp and some other samples, you definitely have to read that article.

current prices of some SSDs:


(I picked ~60GB and 2,5" models, omitted old JMicron-based SSDs, sorted them by price/gb)

Montag, 4. Mai 2009

8 GB Arbeitsspeicher unter Windows XP / Vista 32 Bit nutzen (Update 2)

Jeder kennt das: Arbeitsspeicher kann man nie genug haben! Leider bieten Windows XP und Vista in der 32 Bit-Version lediglich eine Unterstützung für maximal 3,2 GB Arbeitsspeicher. Baut man nun 4, 6 oder 8 GB RAM ein, so stehen einem lediglich 3,2 GB zur Verfügung.

Mit einem kleinen Trick kann man den restlichen RAM jedoch nutzen. Kürzlich bin ich auf folgenden Artikel aufmerksam geworden:

8GB unter Vista / XP x86 (32 Bit) nutzen - Dank RAM Disk

Nach dieser Anleitung kann man von Windows XP / Vista 32-Bit nicht ansprechbaren RAM für eine RAM-Disk (RAM-Laufwerk) nutzen. Ich habe kürzlich weitere 4 GB zu meinen vorhandenen 2 GB DDR II - Speicher gesteckt und nutze nun die die verbleibenden 2,8 GB (6 - 3,2 = 2,8) für ein RAM-Laufwerk. Dort habe ich die Auslagerungsdatei von Windows, mein Temp-Verzeichnis sowie portable Programme und meinen Webbrowser untergebracht.

Der Vorteil liegt auf der Hand: Von Windows "ausgelagerte" Daten bleiben im RAM, alle temporären Daten, der Browser-Verlauf/-Cache liegen im RAM. Das System ist dadurch deutlich schneller :)



Nachtrag: vom 7.05.2009:

Inzwischen habe ich meinen RAM von 6 auf 8 GB aufgestockt, da man mit den ca. 2,5 GB für die RAM-Disk nicht wirklich auskommt:
- Auslagerungsdatei: 1,2 GB
- Portable Anwendungen: 0,5 GB
- Webbrowser + Cache: 0,3 GB
- Temporäre Dateien: 0,5 GB

Mit dem 8 GB-Ausbau habe ich nun 4,5 GB für die RAM-Disk, was sich wie folgt aufteilt:
- Auslagerungsdatei: 1,2 GB
- Portable Anwendungen: 0,5 GB
- Webbrowser + Cache: 0,3 GB
- Temporäre Dateien: 2,5 GB




Nachtrag: vom 18.05.2009:

Wie das Leben so ist, gibt es zu jedem Vorteil auch immer mind. einen Nachteil. Sofern man mehr als nur die Auslagerungsdatei und temporäre Dateien auf dem RAM-Laufwerk hat, so muss dieses evtl. beim Beenden gespeichert und beim nächsten Booten neu geladen werden. Das kostet natürlich etwas Zeit, so dass der Boot-Vorgang minimal verlänger wird (Laden des Images), das Herunterfahren hingegen dauert spürbar länger (Speichern des Images auf Festplatte).

Man muss sich also überlegen, ob man diesnn Nachteil in den Kauf nimmt. Ich persönlich kann damit aber sehr gut leben, der Performance-Vorsprung ist es mir Wert!




Nachtrag: vom 28.05.2009:

Kurioserweise kann ich in meinem System die 8 GB RAM nicht zu 100% ausnutzen. Trage ich bei RAM-Disk in den Memory-Optionen die vom Bios gemeldet 8192 MB ein, so stürzt Windows beim nächsten Boot ab. Ich musste ein wenig experimentieren und bin nun mit folgenden Settings bei einem stabilen Betrieb angekommen:

Installed (MB): 7890
Reserved (MB): 280
Direct address: disabled

Daraus ergeben sich 4371 MB unmanaged memory, von denen ich 4300 für die RAM-Disk nutze.

Sonntag, 8. März 2009

Multi-display tools

Beim Arbeiten mit mehreren Monitoren fehlen insbesondere unter Windows XP Möglichkeiten, seine Fenster zu organisieren.

Mit den Tools GridMove, UltraMon und ATI Tray Tools kann man seinen Desktop schnell um viele nützliche Funktionen erweitern. So lassen sich beispielsweise Fenster per Tastendruck auf einen anderen Monitor verschieben, an einem Rand oder einer vordefinierten Fläche auf einem Monitor ausrichten, einzelne Displays drehen (für Pivot-Funktionen) und vieles mehr.

Hier die wichtigsten Funktionen der einzelnen Tools kurz vorgestellt:

UltraMon:

  • Monitore pixelgenau ausrichten
  • Erweiterung der Startleiste auf den zweitem Monitor
  • Verschieben von Fenstern auf andere Monitore per Shortcut
  • Starten von Tools auf bestimmten Monitoren / vordefinierten Positionen und Fenstergrößen
  • Desktopsymbole bzw. deren Position wieder herstellen, sollten diese sich verschoben haben
  • Monitore über Windows deaktivieren (Darstellung ausschalten)
  • unterschiedliche Wallpaper/Hintergründe für jeden Monitor einrichten
Download: www.realtimesoft.com/de/ultramon/


ATI Tray Tools:
  • Setup der Monitore unter Windows
  • Drehen von einzelnen Monitoren
  • Getrennte Farbkorrekturen
Download: www.guru3d.com/article/ati-tray-tools-/


GridMove:
  • Ausrichten von Fenstern an Bildschirmrändern
  • Nebeneinander oder Übereinander ausrichten von Fenstern
  • Verschieben von Fenstern in vordefinierte "Flächen" auf Monitoren
Download: jgpaiva.donationcoders.com/gridmove.html

Freitag, 27. Februar 2009

Music Discovery Project 2009 - The Planets Reloaded - Paul van Dyk und das hr-Sinfonieorchester + Gäste

2009 sollte es endlich wieder soweit sein: Paul van Dyk spielt ein erneutes Mal gemeinsam mit einem weltbekannten Orchester: Das hr-Sinfonieorchester unter seinem Chefdirigenten Paavo Järvi (zweifacher Grammy-Preisträger) spielte Gustav Holsts "Die Planeten", das bereits bekannte Filmregisseure und diverse Rockbands faszinierte.

Am Samstag, den 23. Mai 2009, war es soweit: Das Konzert wurde in der ausverkauften Jahrhunderthalle Frankfurt ausgetragen, wo zwei herausragende Musikwelten aufeinandertrafen: Klassig und Elektronik :)

Musikalisch wurde das ganze in 2 Teile untergliedert: Als erstes spielte das hr-Sinfonieorchester "Die Planeten" (ca. 45 Minuten), anschließend trat Paul van Dyk samt 4-köpfiger Band (Schlagzeug: Flo Dauner [Die Fantastischen Vier], Gitarre: Bruce Gainsford [Vega 4], Percussion: Roland Peil, Keyboard: Ulf Kleiner) sowie 4 Gesangpartnern (Johnny McDaid [Vega4], Josée Hurlock, Ryan Merchant, Jemma Endersby) hinzu um seinen Teil zu spielen (ca. 55 Minuten). Diesen musikalischen Hochgenuss möchte ich euch natürlich nicht vorenthalten. Nach der Übertragung auf hr / youFM kann der Mitschnitt sowie weitere Informationen zu dem Event auf hr-online abgerufen werden (Links siehe unten).

Impressionen:



Paul van Dyk spielte bereits 2005 mit dem Babelsberger Filmorchester die sogenannte "Orchestral Show - RBB Feinkost". Auch dieses Event war grandios inszeniert und absolut höhrenswert !!!

Links zum Thema:

Freitag, 13. Februar 2009

Software-Portal software.marioschneider-online.de

Seit Jahren findet ihr auf meiner privaten Webseite jede Menge Programme, meist kleine Tools, die einem die Arbeit am PC erleichtern oder beim Programmieren unterstützen. Da ich für diese Programme gern eine zentrale Anlaufstelle einrichten wollte, ist vor kurz das Portal software.marioschneider-online.de online gegangen. Dort findet ihr von nun an alle Informationen zu meinen Tools, incl. Versionsverlauf, Screenshots und den entsprechenden Download-Links.

Tool-Liste (auszugsweise:)

  • CD-Manager (Delphi) - Verwaltung von CDs/DVDs für Spiele und Filme incl. Verleihliste
  • File Extractor (C#) - Komfortables Entpacken mehrerer Rar-Archive, incl. Passwortselektor
  • HTML Map Creator (C#), erzeugt HTML-Image-Maps (mehrere Links auf einem Bild)
  • Icon Viewer - (C#) Navigator für Bilder und Icons (übersichtliche Darstellung von ico, gif, png, bmp etc.)
  • Libra XHTML-Editor (C#) sehr komfortabler HTML-Editor mit grafischer (Block-)Darstellung von HTML-Elementen
  • Millhouse (Java) Brettspiel Mühle inc. KI-Gegner, Netzwerkunterstützung und verschiedenen Skins
  • Notizblock .Net (C#) Programm zur übersichtlichen Verwaltung von beliebigen Notizen in mehreren Kategorien
  • Passwort Verwalter Dot Net (C#) Sehr komfortables Programm zur Verwaltung beliebiger sensibler Daten (Passwörter, Logins) incl. iTan-Listen u.v.m
  • RegEx Test (C#) Testen von regulären Ausdrücken cinl. Beispielen, Trefferanzeige, Gruppenanzeige etc.
  • Text-Editor (Delphi) ermöglicht das Editieren von Texten nach vielen Kriterien

Weiterhin sind auf der Website div. Code-Snippets sowie Beispielanwendungen zu div. Themen zu finden.

software.marioschneider-online.de

Sonntag, 31. August 2008

Windows: Dateien synchronisieren mit RoboCopy

Jeder kennt das: In der heutigen Zeit, in der (riesige) Festplatten verhältnismäßig billig sind, wird es immer schwieriger, wichtige Daten zu sichern. Die Rede ist von (automatischen) Backups.

Seit Jahre verwende ich dafür das Programm Total Commander, dessen Synchronisationsfunktion wirklich sehr gut (d.h. sauber, schnell und zuverlässig) ist. Da ich mehrere Verzeichnisse synchronisieren muss (z.B. Eigene Dateien, Recovery-Ordner), muss ich jeweils das Quell- und Zielverzeichnis manuell auswählen, danach die Synchronisation starten usw.

Das in Windows Vista integrierte Programm RoboCopy, welches mit den Windows Server 2003 Resource Kit Tools auch für andere Windows-Systeme erhältlich ist, bringt endlich eine Ablöse für das Problem.

RoboCopy (Robust File Copy) ist ein Kommandozeilenprogramm, welches mit unzähligen Parametern genauestens konfiguriert werden kann. Es existiert auch eine grafische Oberfläche (von Microsoft) für das Programm: Robocopy GUI.

Ich beziehe mich hier lediglich auf RoboCopy selbst. Dafür habe ich folgendes Script geschrieben. Startet man dieses Script, so werden 2 Verzeichnisse komplett synchronisiert (Mirror).

@echo off
echo Starte Sicherung...
set Quelle01="E:\Daten\Eigene Dateien"
set Ziel01="K:\Daten\Backups\Eigene Dateien"
set Quelle02="E:\Daten\Recovery"
set Ziel02="K:\Daten\Backups\Recovery"
set Logfile="c:\robo_log.txt"
c:
cd C:\Programme\Windows Resource Kits\Tools
echo.
echo Sicherung 1: Eigene Dateien
robocopy %Quelle01% %Ziel01% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG:%Logfile% > NUL
echo Sicherung 1: Eigene Dateien - fertig
echo.
echo Sicherung 2: Recovery
robocopy %Quelle02% %Ziel02% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG+:%Logfile% > NUL
echo Sicherung 2: Recovery - fertig
echo.
echo Sicherung abgeschlossen.
echo.
pause


Das Script im einzelnen, kurz erklärt:

1. Anlegen von Variablen für die Quell- und Zielverzeichnisse sowie Log-Datei:
set Quelle01="E:\Daten\Eigene Dateien"
set Ziel01="K:\Daten\Backups\Eigene Dateien"
set Quelle02="E:\Daten\Recovery"
set Ziel02="K:\Daten\Backups\Recovery"
set Logfile="c:\robo_log.txt"

2. Navigation zum Verzeichnis, in dem sich robocopy.exe befindet (nicht nötig, sofern PATH-Variable von Windows angepasst):
c:
cd C:\Programme\Windows Resource Kits\Tools

3. Erstes Verzeichnis synchronisieren:
robocopy %Quelle01% %Ziel01% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG:%Logfile% > NUL

4. Zweites Verzeichnis synchroniseren:
robocopy %Quelle02% %Ziel02% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG+:%Logfile% > NUL


Die Schalter kurz erklärt:
/MIR            - Mirror-Funktion (Löschen von Dat./Ordnern in Quelle im Ziel nachvollz.)
/R:10 /W:10 - [R] Mal erneut versuchen nach [W] Sekunden
/V - wortreiche Ausgabe
/XD ".svn" - Alle Verzeichnisse namens ".svn" nicht beachten
/XF "thumbs.db" - Alle Dateien namens "thumbs.db" nicht beachten
/COPY:DAT - Dateiinhalt, -Attribute und Zeitstempel kopieren
/LOG:%Logfile% - Logdatei erstellen (falls vorhanden: ersetzen)
/LOG+:%Logfile% - Logdatei erstellen (falls vorhanden: erweitern)
>> NUL - Bildschirmausgabe deaktivieren


Dieses Script kann als *.bat-Datei gespeichert werden und ist somit per Doppelklick ausführbar. Außerdem kann ein Windows-Task angelegt werden, um die Sicherung zu automatisieren.