C#: TimeSpan serialisieren

Möchte man mit einer Klasse einen TimeSpan serialisieren, muss man sich eines kleinen Wrappers behelfen, da andernfalls der TimeSpan-Wert falsch serialisiert und so beim Deserialisieren mit „00:00:00“ überschrieben wird. Das kann zu äußerst unangenehmen Nebeneffekten führen und mir ist es unbegreiflich warum TimeSpans nicht von Haus aus sauber serialisiert werden können.

Binde dazu das folgende struct in deine Klasse ein, die serialisiert werden soll:

 
        public struct TimeSpan : IXmlSerializable
        {
            private System.TimeSpan _value;

            public static implicit operator TimeSpan(System.TimeSpan value)
            {
                return new TimeSpan { _value = value };
            }

            public static implicit operator System.TimeSpan(TimeSpan value)
            {
                return value._value;
            }

            public XmlSchema GetSchema()
            {
                return null;
            }

            public void ReadXml(XmlReader reader)
            {
                _value = System.TimeSpan.Parse(reader.ReadElementContentAsString());
            }

            public void WriteXml(XmlWriter writer)
            {
                writer.WriteValue(_value.ToString());
            }
        }

Diese Wrapperklasse stammt ursprünglich hier her: , funktionierte allerdings nicht richtig bei mir, da der reader-Aufruf „ReadContentAsString()“ eine Exception warf. Die obige Klasse funktioniert bei mir fehlerfrei, auch in Verbindung mit dem Entity Framework.

Und so schaut das ganze als serialisiertes XML aus:

    <ServiceRuntimeDefinitionService>
      <SerializedServiceRuntimeDefinition>
        <SeralizedServiceRuntimeDaysList />
        <Description />
        <RuntimeName>DummyRuntime</RuntimeName>
        <Start>13:00:00</Start>
        <End>14:00:00</End>
        <ToleranceStart>00:10:00</ToleranceStart>
        <ToleranceEnd>00:10:00</ToleranceEnd>
        <DefaultAVG>00:01:00</DefaultAVG>
        <Duration>2.08:29:35.2500000</Duration>
      </SerializedServiceRuntimeDefinition>

General problems with Npgsql.NET

1. Make sure all attachements are delivered with your software build. Npgsql may come with some additional program librarys (especially security.mono.dll and npgsql.dll).
2. Implement the following procedures: ExecuteScalar() instead of retrieving a whole dataset for single value return querys.
3. Try to increase the connection pooling minimum value of the sql connection. You may override that setting in the connection string. See „user’s manual“ of npgsql for further information.
4. Npgsql seems not to be thread-safe. Adding „Thread.Sleep()“ to procedures where exception are randomly thrown can decrease the number of errors resulting from asynchronous thread operations.

Membership.GetUser() gibt null zurück

Es ist die ungünstigste Situation die man sich nur denken kann: am Quelltext wurden marginale Änderungen gemacht, woraufhin die ASP.NET Membership Authentication auf dem Remote Test System, aber nicht mehr lokal funktioniert. Auch nach mehrmaligem Clean/Build/Publish und dem akribischen prüfen der web.conf ändert sich dieses Verhalten nicht. Membership.GetUser() gibt immer null zurück.
Warum dieses Verhalten jetzt und nicht zuvor auftritt ist mir immernoch unklar, aber ich fand nach vielen Eigenversuchen, in einem Forum einen Snippet der das Problem bei mir behebt:

 
MembershipUser user = Membership.GetUser(username);
GenericIdentity identity = new GenericIdentity(user.UserName);
RolePrincipal principal = new RolePrincipal(identity);
System.Threading.Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;

Quelle.

Post Rheindahlen Öffnungszeiten

Am Wickrather Tor 19 41179 Mönchengladbach

Montag: 9:00-13:00 14:00-17:15
Dienstag: 9:00-13:00 14:00-17:15
Mittwoch: 9:00-13:00 14:00-17:15
Donnerstag: 9:00-13:00 14:00-17:15
Freitag: 9:00-13:00 14:00-17:15
Samstag: 9:00-12:00

Wer keine Lust auf die ewigen Wartezeiten in der Postfiliale Rheindahlen hat, kann sich hier sein Porto selber ausdrucken. Voraussetzungen sind eine gültige Bankverbindung, Kreditkarte oder Paypalkonto. Anschließend geschieht der Einwurf der Briefe in der Filiale (interner Briefkasten) oder in eine der folgenden Briefkästen:

  • Am Wickrather Tor 48
  • Durchfahrt Stadtwaldstraße zur Geusenstraße
  • Südwall/Beeckerstraße
  • Gladbacherstraße 20
  • An der Bahn
  • Am Grotherater Berg 26
  • Gladbacherstraße 169
  • Gerkerather Mühle 21
  • Rochusstraße 322
  • Rochusstraße 174

Onlinefrankierung ist bei DHL, ebenfalls, hier möglich. Die vorfrankierten Pakete können dann in der Filiale, beim DHL-Fahrer oder an der Packstation (Gladbacherstraße) abgegeben werden. Paketscheine für Hermes ohne Vorfrankierung können hier gedruckt und anschließend bei der Tankstelle Erkelenzerstraße oder dem Zeitungsladen auf der Plektrudisstraße aufgegeben werden.

Datenbankpasswort für Franzis Führerschein 2012

fs.mdb:

iuahfubjffwoö7842194-|

questions2011:

3D26A75D31D185577092AA5BB849D1E03CD04C2615F7E79748EE34CBB1431CB73BE392E0478F5A55C56EAFCC89AAD1C6728EB7C3C5F5F4A3
„Womit müssen Sie bei diesen Verkehrszeichen rechnen?“
(112 hex; 52 ascii)

3D26A75D31D185577092AA5BB849D1E03CD04C2615F7E7978711CCAAAEBDCA293BE392E0478F5A55C56EAFCC89AAD1C6728EB7C3C5F5F4A3
„Womit müssen Sie bei diesem Verkehrszeichen rechnen?“
(112 hex; 52 ascii)

8D04B5E41219332B ECEFFFACABB627C2 = „a) ist richtig“
0C13D233E2944594 ECEFFFACABB627C2 = „b) ist richtig“
DFFE7E4155E50763 ECEFFFACABB627C2 = „c) ist richtig“

ECEFFFACABB627C2 = „ichtig “
DFFE7E4155E50763 = „c) ist r“

6B1C2B61ABFCCE14 = „Pkw|||||“
24A6F03BA6B95BE3 = „Lkw|||||“

6BC9B51D8E88F560 = „3 Jahre “
625F37DA4A16E836 = „2 Jahre “

Vermutlich AES128 ohne Salt. Zu faul für weitere Analysen.

Meine Lieblingserweiterungen in C#/LINQ

Im Laufe der Zeit habe ich mir ein kleines Repertoire an Extensions und Hilfsfunktionen in C# und LINQ angesammelt. Hier meine Favoriten:

1. ForEach()
2. IsEmpty()
3. GetSQLDate()
4. Stopwatch extensions
5. StringBuilder extensions
6. Merging lists
7. Left/Mid/Right

1. ForEach()

 
        public static void ForEach<T> (this IEnumerable<T>  enumeration, Action<T>  action)
        {
            foreach (T item in enumeration)
            {
                action(item);
            }
        }

Beispiel:

 
int[] foo = { 1, 2, 3, 4, 5 };
foo.ForEach(p =>  p *= p);
// foo enthält nun: { 1, 4, 9, 16, 25 }

(Bitte verschont mich mit Kommentaren bzgl. des Gebrauchs von foreach-Schleifen.)


2. IsEmpty()

 
        public static Boolean IsEmpty<T> (this IEnumerable<T>  source)
        {
            try
            {
                if (source == null)
                    return true;
                return !source.Any();
            }
            catch
            {
                return true;
            }
        }

Beispiel:

 
int[] foo = { 1, 2, 3, 4, 5 };
bool bar;

bar = foo.IsEmpty();
// bar ist nun false
foo = null;
bar = foo.IsEmpty();
// bar ist nun true

3. GetSQLDate()
Wandelt ein Datumswert in das SQL-Server Standardformat um.

 
        public static string GetSQLDate(this DateTime? _d)
        {
            if (_d.HasValue)
                return string.Concat("'", _d.Value.ToString("yyyy-MM-dd HH:mm:ss"), "'");
            else
                return "NULL";
        }

Beispiel:

 
DateTime foo = DateTime.Now;
string SQL = string.Format("SELECT ID FROM dbo.dummy_table WHERE datetime={0};", foo.GetSQLDate());

/*
Wäre "foo" ein DateTime?, also nullable, würde nach "NULL" gesucht werden. Das ist bei SELECT-Abfragen ggf.
unerwünscht, aber bei INSERT-Abfragen durchaus gewollt.
*/

4. Stopwatch extensions

 
        public static string StopAndGetSecondsString(this Stopwatch stopwatch)
        {
            stopwatch.Stop();
            double Seconds = stopwatch.ElapsedTicks / (float)Stopwatch.Frequency;
            return String.Format("{0:0.0000}", Seconds);
        }

        public static void Restart(this Stopwatch stopwatch)
        {
            stopwatch.Stop();
            stopwatch.Reset();
            stopwatch.Start();
        }

        public static Stopwatch GetStartedStopwatch()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            return stopwatch;
        }

Beispiel:

 
Stopwatch sw = GetStartedStopwatch(); // Stopwatch läuft bereits!

// Zeitintensive Operationen hier einfügen...

Console.WriteLine(sw.StopAndGetSecondsString()); // Stoppen und Ausgabe auf Console.

sw.Restart(); // Zurücksetzen und wieder starten.

5. StringBuilder extensions

 
        public static StringBuilder AppendAllElements(this StringBuilder _S, IEnumerable<string>  _IE)
        {
            _IE.ForEach(s =>  _S.AppendLine(s));
            return _S;
        }

Beispiel:

 
StringBuilder sb = new StringBuilder();
List<string>  s = new List<string> () { "a", "b", "c", "d", "e" };

sb.AppendAllElements(s); // füge alle Objekte aus "s" an den StringBuilder (zeilengetrennt!)

Console.WriteLine(sb.ToString()); // Ausgabe auf die Console

6. Merging lists

 
        public static IEnumerable<string>  Merge(this IEnumerable<IEnumerable<string> >  enumeration)
        {
            List<string>  _l = new List<string> ();
            foreach (IEnumerable<string>  item in enumeration)
            {
                _l.AddRange(item);
            }
            return _l.AsEnumerable();
        }

Beispiel:

 
List<List<string> >  s1 = new List<List<string> > (); // Jagged bzw. mehrdimensionale Liste!
List<string>  s2 = new List<string> () { "a", "b", "c", "d", "e" };
List<string>  s3 = new List<string> () { "D", "1", "V", "F", "Q" };
s1.Add(s2);
s1.Add(s3);

List<string>  s4 = s1.Merge().ToList();
// s4 enthält nun: 
// "a", "b", "c", "d", "e", "D", "1", "V", "F", "Q"

Wie ich später herausgefunden habe, geht das ganze auch viel einfacher ohne Extension, nur mit SelectMany() :

Beispiel:

 
List<List<string> >  s1 = new List<List<string> > (); // Jagged bzw. mehrdimensionale Liste!
List<string>  s2 = new List<string> () { "a", "b", "c", "d", "e" };
List<string>  s3 = new List<string> () { "D", "1", "V", "F", "Q" };
s1.Add(s2);
s1.Add(s3);

List<string>  s4 = s1.SelectMany(x =>  x).ToList();
// s4 enthält nun: 
// "a", "b", "c", "d", "e", "D", "1", "V", "F", "Q"

7. Left/Mid/Right
Stringoperationen für alle VB-Umsteiger:

 
        public static string Left(this string param, int length)
        {
            return param.Substring(0, length);
        }

        public static string Right(this string param, int length)
        {
            return param.Substring(param.Length - length, length);
        }

        public static string Mid(this string param, int startIndex, int length)
        {
            return param.Substring(startIndex, length); ;
        }

        public static string Mid(this string param, int startIndex)
        {
            return param.Substring(startIndex);
        }

Neuerungen

Da ich mich inzwischen vom Social Network Facebook habe hinreissen lassen, habe ich ein paar kleine Neuerungen an der WordPress Software durchgeführt: unter jedem Artikel erscheint nun der Like/Share-Button um meine Artikel auf Facebook mitteilen zu können.
Dies gibt mir, neben den konventionellen Auswertungsmethoden, die Möglichkeit einzusehen welche Artikel besonders beliebt sind. Neue Artikel werden übrigends direkt an Facebook übermittelt und erscheinen bei verbundenen Personen unter „Neuigkeiten“.

Desweiteren habe ich testweise ein Widget eingeführt, das ermöglicht mich direkt via Skype zu kontaktieren (siehe rechts).

Nachtrag: alles Mist.

Till K. – Für

Heute mal etwas musikalisches: im Sommer 2007 habe ich mit einem Freund, Till K., ein wenig musiziert. Dabei sind diverse schräge Sachen herausgekommen, aber auch ein recht vernünftiges Instrumentalstück, das er damals, soweit ich mich erinnere, für seine Eltern schrieb.

Genre: Jazz
Year: 2007
Drums/Percussions: Till K.
Keys: Till K.
Bass: David K.
Flute: Fr. K.
Recording/Production: David K.

httpvh://www.youtube.com/watch?v=PhnVDAdJAnE