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.

Donnerstag, 31. Juli 2008

Passwort Verwalter Dot Net - Version 1.2

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.2 bietet folgende neue Features:

  • Bugfix: Aktivierung/Deaktivierung von Menüpunkten im Hauptmenü
  • Bugfix: Programminterne Hilfe: Sprung zum jeweiligen Kapitel
  • Bugfix: Suche: Markierung des Treffer-Feldes
  • Bugfix: Verzögerung beim (1.) Anzeigen des Suchen-Dialogs
  • Backupmanager hinzugefügt
  • Datenfelder können nachträglich gelöscht werden (sofern keine Daten mehr in diesem Datenfeld vorhanden sind)
  • Einträge können in andere Kategorien verschoben werden
  • Feedbackdialog hinzugefügt
  • Logindialog überarbeitet (Untersützung für Schlüsseldateien)
  • Hauptfenster kann in der Größe (begrenzt) verändert werden
  • Neues Tool "Notizblock" verfügbar
  • Schlüsseldateien (Keyfiles) verfügbar (incl. 4 Sichermeitsmodi)
  • Standard-Zufallspasswort kann konfiguriert werden
  • Verwendete Datei kann per Drag & Drop in Start- sowie Loginform geändert werden
  • Verzeichnis der aktuellen Datei kann im Explorer angezeigt werden (Haupfenster-Menüeintrag)

Projekt-Homepage: www.pwvdotnet.org

Direktdownload: pwvdotnet_v1200_setup.exe oder pwvdotnet_v1200.zip (portable)

Mittwoch, 30. Juli 2008

Dot Net (C#): Screenshot von einem Control erzeugen

Folgende zwei Methoden sind nötig, um einen Screenshot von einem Control zu erzeugen und diesen in eine Datei zu speichern:

   1:  public static Bitmap takeScreenshot(Control pControl)
   2:  {
   3:      Bitmap bmp = new Bitmap(pControl.Width, pControl.Height);
   4:      pControl.DrawToBitmap(bmp, Rectangle.FromLTRB(0, 0, pControl.Width, pControl.Height));
   5:      return bmp;
   6:  }
   7:   
   8:  public static Boolean saveScreenshotToFile(Control pControl, String pFilename)
   9:  {
  10:      try
  11:      {
  12:          takeScreenshot(pControl).Save(pFilename);
  13:          return true;
  14:      }
  15:      catch (Exception)
  16:      {
  17:          return false;
  18:      }
  19:  }

Die erste Methode nimmt einen Screenshot auf und speichert diesen in einem Bitmap-Objekt. Die zweite Methode kann genutzt werden, um den Screenshot direkt in eine Datei zu speichern.

Dienstag, 17. Juni 2008

Dot Net (C#): Drag & Drop

Drop von Dateien / Ordnern:

1. Vorbereitung:

"AllowDrop"-Property setzen und 2 Events anmelden:

   1:  public MainForm()
   2:  {
   3:      InitializeComponent();
   4:      this.textboxDir.AllowDrop = true;
   5:      this.textboxDir.DragOver += new DragEventHandler(textboxDir_DragOver);
   6:      this.textboxDir.DragDrop += new DragEventHandler(textboxDir_DragDrop);
   7:  }


2. Drag Over-Event:

DataFormat überprüfen und DragDropEffects setzen:

   1:  void textboxDir_DragOver(object sender, DragEventArgs e)
   2:  {
   3:      if (e.Data.GetDataPresent(DataFormats.FileDrop))
   4:      {
   5:          e.Effect = DragDropEffects.Move;
   6:      }
   7:  }


3. Drag-Drop-Event:

Drop auswerten:

   1:  void textboxDir_DragDrop(object sender, DragEventArgs e)
   2:  {
   3:      if (e.Effect == DragDropEffects.Move) // if move
   4:      {
   5:          if (e.Data.GetDataPresent(DataFormats.FileDrop)) // if file drop
   6:          {
   7:              string[] dirNames = (string[])e.Data.GetData(DataFormats.FileDrop);
   8:              if (dirNames.Length.Equals(1)) // wenn genau eine datei
   9:              {
  10:                  if (MSUtils.FileUtil.dirExists(dirNames[0]))
  11:                  {
  12:                      this.textboxDir.Text = dirNames[0];
  13:                  }
  14:              }
  15:          }
  16:      }
  17:  }

Montag, 16. Juni 2008

Opera 9.5 und öffentlicher ACID3-Build

Der Opera-Browser ist am 12.06.2008 in der Version 9.5 erschienen. Diese Version bringt viele neue Features mit sich:

  • Extended-Validation-SSL-Zertifikate
  • Adressleiste mit besseren Vorschlägen für bereits besuchte Seiten
  • bessere Unterstützung von Web-Standards (JavaScript, CSS, SVG, MathML)
  • Opera-Link (Synchronisation von Bookmarks und Co.)
  • neues Skin (altes Skin aber noch verfügbar)
  • schnellerer Seitenaufbau
  • weiches Scrollen
  • neue Entwicklerwerkzeuge
Opera 9.5 kann in mehr als 25 Sprachen hier heruntergeladen werden: http://www.opera.com/download/



Im ACID3-Test schafft diese Version ca. 85 Punkte. Ein öffentlicher Build, der 100 Punkte im ACID3-Test schafft, ist hier zu finden: http://labs.opera.com/news/2008/03/28/

Ich habe mich an einen kleinen Browservergleich gewagt, was die (Lade-)Geschwindigkeit angeht. Dabei habe ich Internet Explorer in den Versionen 6 sowie 7, Firefox in den Versionen 2.0 und 3.0 (RC3) sowie Opera in den Versionen 9.27 und 9.5 verwendet.

Das Ergebnis:




Dabei lädt Opera in der Version 9.5 die 8 ausgewählten Webseiten in 75 Sekunden (gegenüber 101s IE7 und 93s Firefox 3). Der Test berücksichtigt das Neuladen einer Webseite sowie das Laden derselben aus dem Cache. Dabei war Opera 9.5 in keinem einzigen Fall der langsamste Browser.

Dienstag, 8. April 2008

Dot Net (C#): Invoke()-Methode für MultiThread-Applikationen mit WindowsForms

Um ein Control auf einer WindowsForms von einem anderen Thread aus zu verändern, muss die Invoke()-Methode der Form oder des Controls verwendet werden. Ein Control darf nur von dem Thread geändert werden, von dem es erzeugt wurde!

Folgendes Minimal-Beispiel (unvollständig) zeigt einen Anwendungsfall, in dem ein Thread seinen Status an eine Form berichtet:

Die Klasse MathClass erzeugt Thread-Objekte, deren Methode CalcBackground() in einem Thread ausgefürt wird.Aus dieser Methode heraus soll die GUI über den aktuellen Thread-Status informiert werden:

   1:   
   2:      public class MathClass
   3:      {
   4:   
   5:          private MainForm myForm;
   6:          private int iNumber;
   7:   
   8:          public Thread Initialize(MainForm myform, int number)
   9:          {
  10:              this.myForm = myform;
  11:              this.iNumber = number;
  12:              return new Thread(new ThreadStart(this.CalcBackground));
  13:          }
  14:   
  15:          delegate void UpdateUI(int number, int state);
  16:          delegate void Finish(int number);
  17:   
  18:          public void CalcBackground()
  19:          {
  20:              UpdateUI updateUI = new UpdateUI(this.myForm.updateUIProc);
  21:              Finish finish = new Finish(this.myForm.FinishThread);
  22:   
  23:              try
  24:              {
  25:                  // do something
  26:                  // ...
  27:                  // report status to form:
  28:                  object[] param = new object[2] { this.iNumber, i };
  29:                  myForm.Invoke(updateUI, param); // call myForm.updateUIProc(iNumber, i)
  30:              }
  31:              catch (ThreadAbortException)
  32:              {
  33:                  // clean up
  34:              }
  35:              catch (Exception)
  36:              {
  37:                  // catch any other exception
  38:              }
  39:              finally
  40:              {
  41:                  try
  42:                  {
  43:                      // call myForm.FinishThread(iNumber)
  44:                      myForm.Invoke(finish, new object[] { this.iNumber }); 
  45:                  }
  46:                  catch (ObjectDisposedException e)
  47:                  {
  48:                  }
  49:                  catch (Exception ee)
  50:                  {
  51:                  }
  52:              }
  53:          }
  54:   
  55:      }

Die Mainform erzeugt in der Methode startThreads() zwei neue Threads. Die Methoden updateUIProc() sowie FinishThread() werden per Invoke()-Methode von Thread aus gestartet und laufen selbst im Thread der Mainform:
   1:      public partial class MainForm : Form
   2:      {
   3:   
   4:          public MainForm()
   5:          {
   6:              InitializeComponent();
   7:          }
   8:   
   9:          private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  10:          {
  11:              // kill threads before form closes
  12:              if (anyThreadAlive)
  13:              {
  14:                  killThreads();
  15:              }
  16:          }
  17:   
  18:          public void updateUIProc(int number, int val)
  19:          {
  20:              this.textBox1.AppendText(
  21:                  string.Format("thread {0} has done {1} % of its job", number, val));
  22:          }
  23:   
  24:          public void FinishThread(int number)
  25:          {
  26:              this.textBox1.AppendText(
  27:                  string.Format("thread {0} has finished", number));
  28:          }
  29:   
  30:          private void startThreads()
  31:          {
  32:              Thread th1 = new MathClass().Initialize(this, 0);
  33:              Thread th2 = new MathClass().Initialize(this, 1);
  34:              th1.Start();
  35:              th2.Start();
  36:          }
  37:      }

Es ist nicht erlaubt, das Control Mainform.textBox1 direkt aus dem Thread zu verändern.Ein Control darf nur von dem Thread verändert werden, von dem es erstellt wurde.Um trotzdem ein Control aus einem Thread heraus zu verändern, benutzt man die Methode Invoke() und übergibt dieser ein delegate (Funktionszeiger) sowie ein Parameterarray. Die eigentliche Methode (z.B. updateUIProc() oder FinishThread()) läuft anschließend (in diesem Fall) im Thread der MainForm. Dies hat ebenfalls zur Folge, dass keine der beiden Funktionen parallel mehrmals ausgeführt werden kann.

Donnerstag, 3. April 2008

Dot Net (C#): SearchOption.AllDirectories für GetDirectories()

Die Methode GetDirectories() der Klasse DirectoryInfo liefert alle zu einem Suchpattern passenden Verzeichnisse. Dabei liefert der Aufruf

dir.GetDirectories("Release*")

beispielsweise alle Verzeichnisse, die mit "Release" beginnen. Um dies für alle Unterverzeichnisse nicht rekursiv programmieren zu müssen, gibt es die Möglichkeit, die GetDirectoties()-Methode mit einem weiteren Parameter zu füttern:

dir.GetDirectories("Release*", SearchOption.AllDirectories)

Bei diesem Aufruf werden automatisch alle Unterverzeichnisse abgesucht. Dies erspart einem das rekursive Aufrufen von Methoden, was den Code wesentlich kürzer macht.

Genauso verhält es sich mit der Methode GetFiles().

Visual Studio: Methoden nachträglich generieren

Seit dem Visual Studio 2008 kann man Methoden nachträglich automatisch generieren lassen. Nehmen wir an, wir wollen (später) die folgende Methode generieren:

processDir(listFiles, this._strPath, pattern);

Nun schreibt man diese Methode einfach als Aufruf hin, obwohl diese noch nicht existiert. Ein anschließender Rechtsklick auf den Methodennamen sowie ein Klick auf den Eintrag "Generate Method Stub" erzeugt die angegebene Methode incl. der vorgegebenen Signatur in der aktuellen Klasse.


Anklicken für Vollansicht

Es wird folgende Methode generiert:
private void processDir(List<string> listFiles, string p, string pattern)
{
throw new NotImplementedException();
}

Die erzeugte Methode ist private, evtl. Rückgabewerte werden ebenfalls angelegt.

Dies ermöglicht einem, den Code für einen Anwendungsfall vollständig zu schreiben, ohne zwischendurch wegen anderen Methoden, die man später implementieren will, unterbrochen zu werden.

Donnerstag, 27. März 2008

Race Driver Grid - Ingame Video

Zum kommenden Rennspiel "Race Driver Grid" gibt es neben dem offiziellen (Render-)Trailer nun endlich einen "actual gameplay footage" mit Ingame-Szenen:


actual gameplay footage (ingame-graphics)

world trailer (rendered)

Projekt-Homepage: www.codemasters.de/grid

Mittwoch, 12. März 2008

Passwort Verwalter Dot Net - Version 1.1.3

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.3 bietet folgende neue Features:

  • FTP-Download:
    • Änderungsdatum der Datei korrigiert
    • Zugriffsdatum der Datei korrigiert
    • Erstellungsdatum der Datei korrigiert
  • HTML-Export:
    • Nachricht "Bitte warten" wird angezeigt, während der Report generiert wird
    • Statistikberechnung wird nur noch für ausgewählte Kategorien durchgeführt
  • Markierung von Eingabefeldern (gelbe Hervorhebung) kann deaktiviert werden
  • neue Engine zur Berechnung der Passwort-Sicherheit
  • neue Engine zur Erzeugung von Passwörtern
  • neuer Evaluierungs-Dailog für Passwörter
  • Passwort Generierung: Eigenschaften des Passworts per Kontextmenü wählbar (Länge, Zahlen, Sonderzeichen)
  • Statistik: "Bitte warten" Nachricht wird angezeigt, während die Statistik berechnet wird
  • Statistik und HTML-Export zeigen 3-spaltige Passwort-Sicherheit (Punkte, Prozent, Wort) an

Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1130_setup.exe oder pwvdotnet_v1130.zip

Worldshift - Screenshots und Open Beta

Zum Echtzeit-Strategie Worldshift, das voraussichtlich Ende 2008 erscheint, sind zahlreiche Screenshots sowie eine offene Beta erscheinen. Mit einem kostenlosen Account bei Fileplanet (oder 3DGames) kann man sich den Beta-Client herunterladen. Anschließend sind 2 Update-Versionen nötig, die das Spiel selbst beim Starten nachlädt. Es wird ebenfalls ein (kostenloser) GameSpy-Account benötigt.

Der kostenlose Beta-Client steht bei FilePlanet zum Download bereit

Screenshots:

Anklicken zum Vergrößern

Informationen sowie weitere Screenshots findet ihr auf worldshift-game.com bzw. worldshift.de.

lolcats - lol cats ;)

watch, make and save "lolcats" at icanhascheezburger.com:

click to enlarge

Donnerstag, 28. Februar 2008

Passwort Verwalter Dot Net - Version 1.1.2

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.2 bietet folgende neue Features:

  • Datensatz kann einzeln als Textdatei extrahiert werden
  • "Daten speichern"-Button im Hauptfenster ermöglicht nun ebenfalls das Verwerfen der Änderungen
  • Eingabefelder werden dezent gelb hervorgehoben
  • FTP-Zugriff:
    • Aktivierung und Deaktivierung des automatischen Uploads von der Toolbar aus
    • Fortschrittsanzeige für FTP-Upload und -Download
    • Programm beendet sich, wenn bei der heruntergeladenen Datei das Passwort geändert wurde
  • horizontale Scrollbar für Eintragsliste
  • sicherer Passwort-Eingabe-Dialog für Schutz vor Keyloggern
  • Hilfe-Fenster kann minimiert und maximiert werden
  • HTML-Export: zu exportierende Kategorien auswählbar
  • HTML-Export: Zeichen "<", ">" und "&" werden nun korrekt dargestellt
  • Kompaktansicht hinzugefügt (Minimierung der Ansicht auf das Datenfeld)
    • enthält nur relevante Datenfelder
    • kann in einer beliebigen Bildschirmecke positioniert werden
    • kann mit der Maus verschoben werden
  • TAN-Verwaltung:
    • TAN-Listen sind alphabetisch sortiert
    • es kann nur noch eine TAN-Nummer gleichzeitig selektiert werden
    • Upload der Datei erfolgt nicht mehr, wenn die Änderung verworfen werden

Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1120_setup.exe oder pwvdotnet_v1120.zip

Mittwoch, 27. Februar 2008

Dot Net (C#): List.ForEach() Methode

Verwenden der ForEach()-Methode einer Generic-List:

static void Main()
{
List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");

// Display the contents of the list using the Print method.
names.ForEach(Print);

// The following demonstrates the anonymous method feature of C#
// to display the contents of the list to the console.
names.ForEach(delegate(String name)
{
Console.WriteLine(name);
});
}

private static void Print(string s)
{
Console.WriteLine(s);
}


Generisch als Erweiterungsmethode für IEnumerable:
public static class IEnumerableExtension
{
public static void PrintItem<T>(this T item)
{
Console.WriteLine(item.ToString());
}

public static void PrintAllItems<T>(this IEnumerable<T> enumerable)
{
foreach (T item in enumerable)
{
PrintItem(item);
}
}
}

Dienstag, 19. Februar 2008

C# Code für HTML formatieren

Manoli.net bietet eine einfache Oberfläche, um beliebigen C#-Code für die Verwendung in HTML (also Blogs, Webseiten etc.) zu formatieren:

www.manoli.net/csharpformat/

Donnerstag, 7. Februar 2008

Passwort Verwalter Dot Net - Version 1.1.1

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.1 bietet folgende neue Features:

  • TAN-Verwaltung incl. iTAN-Verfahren
  • Export der Datei ins HTML-Format
  • Programm ist Freeware (kostenlos)

Screenshots:
Hauptfenster:

Kategorie erstellen
(völlig freie Konfiguration):

iTAN-Verwaltung:

Statistik:


(Klick auf ein Bild, um es zu vergrößern)


Weitere Features des Passwort Verwalter Dot Net:
  • Gruppierung der Einträge in frei konfigurierbare Kategorien
  • 256 Bit AES-Verschlüsselung für eine hohe Sicherheit der Daten
  • Sortieren nach Name, Zeitpunkt "hinzugefügt" oder Zeitpunkt "letzte Änderung"
  • Enthält einen Passwortgenerator zur Erstellung sicherer Passwörter auf Knopfdruck
  • Benutzer bestimmt, welche Daten sensibel sind und nicht als Klartext angezeigt werden
  • Anzeige sensibler Daten als Klartext per Tastenkombination oder Klick jederzeit möglich
  • Schelles Kopieren von Benutzernamen, Passwörtern etc. in die Zwischenablage
  • Automatisches Löschen sensibler Daten aus der Zwischenablage nach 5-20 Sekunden
  • Detailinformationen über Passwortsicherheit(Sicherheitslevel, Verbesserungsvorschläge)
  • Anzeige der Sicherheitsstufen von Passwörtern (incl. Verbesserungsvorschlägen)
  • Ausführliche Statistik (Anzahl der Passwörteraller Kategorien, Sicherheitseinstufung von Passwörtern)
  • Komfortable Updatefunktionalität (auf Wunsch automatisch bei jedem Programmstart)
  • FTP-Upload und -Download zum Abgleich der Daten auf mehreren Rechnern
  • Minimierung des Programms in den Systemtray oder Taskleiste
  • Komfortable Suchfunktion mit Ergebnis-Hervorhebung


Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1110_setup.exe oder pwvdotnet_v1110.zip

Montag, 4. Februar 2008

Dot Net (C#): Serialisieren (binär)

Serialisierung von Objekten in C# (binär):

Namespace: System.Runtime.Serialization.Formatters.Binary

/* zwei Objekt der zu serilisierenden Klasse anlegen */
objectKlasse object1b = new objectKlasse(10, "Hallo");
objectKlasse object2b = new objectKlasse(11, "Welt");

/* binary formatter anlegen */
BinaryFormatter binForm = new BinaryFormatter();

/* beide Objekte serialisiert nach C:\text.txt schreiben */
using (FileStream fs = new FileStream("C:\\test.txt", FileMode.Create))
{
binForm.Serialize(fs, object1b);
binForm.Serialize(fs, object2b);
}

/* zwei neue Objekte anlegen */
objectKlasse object11b = null;
objectKlasse object22b = null;

/* beide Objekte deserialisieren */
using (FileStream fs = new FileStream("C:\\test.txt", FileMode.Open))
{
object11b = (objectKlasse)binForm.Deserialize(fs);
object22b = (objectKlasse)binForm.Deserialize(fs);
}

/* deserialisierte Objektdaten ausgeben */
Console.WriteLine("Zahl: {0} , Wort: {1}", object11b.integer1, object11b.string1);
Console.WriteLine("Zahl: {0} , Wort: {1}", object22b.integer1, object22b.string1);

Alternativ:
XML-Serialisierung mit SoapFormatter aus dem Namespace System.Runtime.Serialization.Formatters.Soap

Montag, 21. Januar 2008

Windows-Tasten auf dem Notebook

Für einige Anwendungsfälle ist es sehr praktisch, die Windows-Tasten auf einem Notebook benutzen zu können. Viele Notebooks haben diese Tasten aus platzgründen nicht, mit einigen Tricks lassen sie sich aber leicht auf andere Tasten legen oder per Tastenkombination verwenden.

1. Tastenkombinationen:

[STRG] + [ESC] = linke Windows-Taste
[SHIFT] + [F10] = rechte Windows-Taste


2. Tool Remap Key verwenden
Remapkey ist ein kleines Tool, das unter allen Windows-Versionen (ab NT-Basis) läuft und ein einfaches remappen der Tastatur erlaubt. In diesem Fall ist die rechte Windows-Taste über die rechte Steuerungs-Taste erreichbar.
Download: remapkey.rar
Screenshot:
  


3. Tool SharpKeys
Sharpkeys ermöglicht es, unabhängig vom Tastaturlayouts, die Tastencodes zu ändern. Somit lassen sich sogar Sondertasten (Mediatasten, Zusatztasten, Kopieren, ...) auf real vorhandene Tasten umleiten.
Webseite: www.randyrants.com/sharpkeys/
Screenshots:
    

Dot Net (C#): Dauer ermitteln mit Stopwatch

Die Klasse Stopwatch aus dem Namespace System.Diagnostics ermöglicht es, Zeiten genau zu stoppen:

Stopwatch sw = new Stopwatch();
sw.Start();
/* do your work */
sw.Stop();
this.labelTime.Text =
"ElapsedTicks: " + sw.ElapsedTicks.ToString() +
"\nElapsedMilliseconds :" + sw.ElapsedMilliseconds.ToString() +
"\nElapsed(TimeSpan) :" + sw.Elapsed.ToString();

Samstag, 19. Januar 2008

Dot Net (C#): Enum in Combobox

Folgende Methode ermöglicht es, alle Elemente einer Enumeration in einer Combobox anzuzeigen:

private void importEnumeration(Type t)
{
this.comboBox.Items.Clear();
this.comboBox.Items.AddRange(Enum.GetNames(t));
this.comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
this.comboBox.SelectedIndex = 0;
}

Aufruf:

this.importEnumeration(typeof(anyEnum));

Freitag, 18. Januar 2008

Zeilenumbruch in Word verhindern

Es gibt Situationen, in denen ist ein Zeilenumbruch zwischen zwei Wörtern unerwünscht. Dies ist beispielsweise bei dem Text "150 m" der Fall. Word bietet die Möglichkeit, sowohl Bindestriche als auch Leerzeichen für einen Zeilenumbruch zu sperren.

Drücken Sie dazu [Strg] + [Shift] + [Leertaste], um ein Leerzeichen zu erzeugen, das nicht umgebrochen wird. Der gleiche Mechanismus funktioniert ebenfalls für einen Bindestrich. Beispielsweise kann der Text "50-150 Meter" durch das Schreiben des Bindestriches mit [Strg] + [Shift] + [-] vor einem Zeilenumbruch geschützt werden.

Montag, 14. Januar 2008

Werbung blockieren im Opera

Es gibt mehrere Methoden, um Werbung (insb. Popups und Layer-Ads) effektiv im Opera zu blockieren. Zwei davon möchte ich hier kurz vorstellen:

1. Blacklisten-Datei manuell anlegen:
Legt eine Datei "urlfilter.ini" unter "C:\Dokumente und Einstellungen \[Benutzername] \Anwendungsdaten \Opera \Opera \profile\" mit folgendem Inhalt an: 

Opera Preferences version 2.1

[prefs]
prioritize excludelist=1

[include]
*

[exclude]
http://*.advertising*
http://*.euros4click.de/*
http://*.hitbox.net/*
...

Den vollständigen Inhalt der Datei könnt ihr hier anschauen. Die Liste der blockierten URLs kann jederzeit manuell angepasst werden.

2. "Inhalte blockieren..." aus dem Kontextmenü wählen
Klickt mit der rechten Maustaste auf eine freie Fläche der Webseite und wählt den Eintrag "Inhalte blockieren...". Haltet die Shift-Taste gedrückt und klickt auf die Elemente, die dauerhaft blockiert werden sollen sowie anschließend auf "Fertig". Opera merkt sich nun die URL des gewählten Inhalts und sperrt diesen dauerhaft.