Roulette, ein sicheres System?

23. Januar 2010 Mario Noack Keine Kommentare

In letzter Zeit findet man immer wieder Berichte, wie man Online-Casinos angeblich mit einem todsicherem System austricksen könnte. Das soll wie folgt funktionieren:

Man setzt einen Euro auf eine Farbe. Gewinnt man, fährt man mit einem Euro fort. Verliert man, so setzt man das doppelte und zwar solange, bis man wieder gewinnt. Der Verlust wird dadurch vollständig ausgeglichen und ist auch unter dem Begriff Martingal Roulette System bekannt.

Das klingt erst mal gut, funktioniert auch theoretisch. Allerdings gibt es ein paar praktische Probleme: Tischlimits führen schnell dazu, dass man seine Strategie nicht fortsetzen kann. Der Gewinn pro Runde bleibt bei einem Euro stehen. Man muss also 200 erfolgreiche Runden absolvieren, für einen Gewinn von 200 Euro…

Ich habe dazu eine kleine Anwendung geschrieben, die das ganze durchtestet. Die einzelnen Parameter sind einstellbar, ob man gewinnt oder nicht, wird dem Zufall überlassen. Die Anwendungen läuft, bis entweder die maximale Rundenzahl erreicht wurde, oder man den Einsatz mangels Kapital nicht mehr bringen kann. Das geht oft schneller, als gewünscht. Am Ende siegt eben immer noch die Bank:

Downloads:
Ausführbare Anwendung (10 kByte), Microsoft .Net 2.0 erforderlich
Quellcode für C# 2.0 (18 kByte)

Categories: Allgemein, Microsoft .NET Tags:

Klonen von Objekten in C#

30. November 2009 Mario Noack Keine Kommentare

Möchte man existierende Objekte in Microsoft.NET klonen, so steht scheinbar die Schnittstelle System.ICloneable zur Verfügung. Dazu wird dann oft zur Implementation der Methode MemberwiseClone geraten. In der Praxis zeigt sich leider, das Referenzen somit aber nicht geklont werden.

Eine Lösung wird durch Serialisierung angeboten:
http://www.csharp411.com/c-object-clone-wars/ (Punkt 4)
Auf diesem Weg kann ein Datenabzug eines Objekts erstellt werden und auf dieser Basis kann eine Kopie (Clone) erzeugt werden. Eine Demonstration eines CloneManagers habe ich hier dargestellt.

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleApplication6
{
    public static class CloneManager
    {
        public static T Clone<T>(T instance) where T : class
        {
            var serializer = new BinaryFormatter();
            var stream = new MemoryStream();
            serializer.Serialize(stream, instance);
            stream.Seek(0, SeekOrigin.Begin);
            return serializer.Deserialize(stream) as T;
        }
    }
 
    [Serializable]
    public class A
    {
        public int C { get; set; }
        public B B { get; set; }
        public A()
        {
            B = new B();
        }
    }
    [Serializable]
    public class B
    {
        public int[] Ints { get; set; }
 
        public B()
        {
            Ints = new[] {2, 4, 5};
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var a = new A {C = 3};
            var a2 = CloneManager.Clone(a);
            a.B.Ints[1] = 3;
            Console.WriteLine("a.C {0} - a2 {1}", a.C, a2.C);
            Console.WriteLine("a.B [0] {0} - a2.B [0] {1}", a.B.Ints[0], a2.B.Ints[0]);
            Console.WriteLine("a.B [1] {0} - a2.B [1] {1}", a.B.Ints[1], a2.B.Ints[1]);
            Console.ReadKey();
        }
    }
}

Der CloneManager ist an diese Version http://www.codeproject.com/KB/cs/CloneManager.aspx angelehnt.

Categories: Microsoft .NET Tags:

Blog-Parade: Die 3 beliebtesten Fachbücher aus dem .NET-Umfeld

28. September 2009 Mario Noack Keine Kommentare

Mit diesem Beitrag möchte ich mich der Blog-Parade zum Thema der beliebtesten Fachbücher aus dem NET-Bereich anschließen.

1. Richtlinien für das Framework-Design
Dieses Buch enthält Richtlinien für die Namensgebung im .NET-Bereich. Außerdem enthält man Einblicke, wie speziell die Konventionen innerhalb des .NET-Frameworks herausgearbeitet wurden. Nach dem Durcharbeiten des Buches fällt es leichter, Namensfehler zu vermeiden und die Benennung geschickter zu wählen.

2. C# 3.0 Entwurfsmuster
Das Buch ist eine Einführung in Entwurfsmuster. Vielen andere Einführungen, welche nicht speziell auf die Spracheigenschaften von C# ausgelegt sind, wirken komisch, wenn am Ende des Kapitels beispielsweise klar wird, welche bekannte C#-Technik dahinter steckt.

3. Grundlagen der Anwendungsentwicklung mit dem .NET Framework 2.0
Dieses Buch setzt vernünftiges Grundwissen voraus und vermittelt einen darauf basierenden breiten Querschnitt über die vorhandenen Technologien und deren Anwendung. Es zeigt das .NET Framework 2.0 aus der Sicht, wie es von Microsoft konzipiert wurde und wie es eingesetzt werden sollte.

Categories: Microsoft .NET Tags: ,

RegEx Kurzreferenz

7. September 2009 Mario Noack Keine Kommentare

^ Start des Eingabemusters
$ Ende des Eingabemusters
^abc$ erlaubt abc, aber nicht xabcd

. ein beliebiges Zeichen
\t Tabulatorzeichen
\f Seitenvorschubzeichen
\n Zeilenumbruch
\d Ziffer
\D keine Ziffer
\s Leerraumzeichen
\S kein Leerraum
\w Zeichen in einem Wort ([A-Za-z0-9_])
\W Zeichen, dass nicht in einem Wort vorkommt

* vorhergehendes Zeichen kommt 0 oder mehrfach vor
+ vorhergehendes Zeichen kommt 1 oder mehrfach vor
? vorhergehendes Zeichen kommt 0 oder 1 mal vor
{n} vorhergehendes Zeichen kommt genau n-fach vor
{n,m} vorhergehendes Zeichen kommt n-m fach vor

x|y Übereinstimmung mit x oder y
[xyz] Übereinstimmung mit x, y oder z
[a-d] Übereinstimmung mit a, b, c oder d

(?<zahl>\d+) Definition eines benannten Rückverweises auf eine zahl
\k<name> Rückverweis auf name

Categories: Allgemein Tags:

Dark Theme VS 2008

4. September 2009 Mario Noack Keine Kommentare

Für Visual Studio 2008 habe ich ein dunkles Farb-Schema von Scott Hanselmann angepasst und speziell für den ReSharper noch einige Anpassungen vorgenommen.

Dunkles Schema für VS2008 und ReSharper
Das neue Farbschema kann hier heruntergeladen und in Visual Studio importiert werden.

Categories: Toolbox Tags: ,

Asp.NET TimeOut bei Form-Authentifizierung

4. September 2009 Mario Noack Keine Kommentare

Verwendet man Formular-Authentifizierung, so lässt sich der TimeOut von Asp.NET Anwendungen scheinbar nicht über 20min erhöhen. Damit es doch geht, muss in der web.config der TimeOut explizit vermerkt werden:

...
    <authentication mode="Forms">
      <forms name="WebFormlogin" loginUrl="WebFormlogin.aspx" timeout="60">
...
Categories: Microsoft .NET Tags: ,

Clean Code Developer (CCD)

7. August 2009 Mario Noack Keine Kommentare

In der Softwareentwicklung versucht man seit langem, guten Quellcode zu schreiben. Hierfür gibt es alle Jahre neue Ansätze, die das erreichen sollen. So fallen einem dazu schnell Begriffe wie UML und Objektorientierung ein. Aber all diese Mittel haben nie dafür gesorgt, dass der Quellcode durch Anwendung solcher Prinzipien bzw. Verwahrensweisen zwingend besser, sprich sauberer wurde.

Clean Code DeveloperSoftwareentwicklern aus Leidenschaft sind darum ständig auf der Suche danach, was in den eigenen Entwicklungen falsch läuft. Was muss man besser machen, damit der Quellcode gut lesbar und langfristig nutzbar und erweiterbar ist. Einen Königsweg hierzu gibt es wie immer leider nicht.
Stefan Lieser und Ralf Westphal haben vor einer Weile aber eine Initiative unter dem Namen Clean Code Developer ins Leben gerufen. Beim Studieren der Idee war mir schnell klar, dass es für mich ein Hilfsmittel sein kann, besseren Code zu entwickeln.

Sie sammelten Ideen und Ansätze, die helfen, besseren Quellcode zu schreiben. Diese verteilten Sie auf einzelne Grade, da alles auf einmal nicht realistisch umsetzbar ist. Jeder Entwicker, der seine Prinzipien der Entwicklung verbessern möchte, kann sich an den einzelnen Graden entlang hocharbeiten:
Schwarz, Rot, Orange, Gelb, Grün, Blau und Weiß.

Vorschau PyramideEntwickler, die sich an Ihren Grad und die dahinter stehenden Prinzipien erinnern möchten, können dazu ein Armband tragen. Mir persönlich sagt das nicht zu. Jan Waiz hat hierzu alternativ kleine Pyramiden gestaltet, die man sich einfach auf den Tisch stellen kann und so seine Prinzipien auch jederzeit präsent hat. Das finde ich wirklich ansprechend.

Ich selbst ordne mich momentan als Orange ein und kann leider noch nicht aufsteigen, da ich Automatisierte Integrationstests noch nicht umsetzen konnte. Übrigens: Aufzusteigen ist auch nicht das zwingende Ziel der CCD’ler… es geht darum, selbst eine Stufe der inneren Zufriedenheit mit der eigenen Softwareentwicklung zu bekommen. Dazu muss man nicht die höchste Stufe erreicht haben!

Categories: CCD, Weiterbildung Tags:

Beispiele für String-Formatierungen

6. August 2009 Mario Noack Keine Kommentare

Ein Beispiel sagt oft mehr, als tausend Worte… Um mit .NET Strings zu formatieren, gibt es viele Möglichkeiten, leider ist die Hilfe dazu zwar oft korrekt, aber nicht wirklich erklärend.

Darum hier ein Link mit praktischen Beispielen dazu sind hier zufinden:

http://alexonasp.net/samples/stringformatting/

Sogar die Ländereinstellungen sind umschaltbar.

Categories: Microsoft .NET Tags: ,

SQL mit Datumsspalten

6. August 2009 Mario Noack Keine Kommentare

Eher zufällig ist mir der SQL

SELECT CONVERT (datetime, CONVERT (varchar, GETDATE(), 101), 101);

aufgefallen (natürlich ursprünglich in einem größeren Kontext). Schnell war die scheinbare Optimierung durchgeführt:

SELECT GetDate();

Diese habe ich dann zum Glück noch einmal überprüft und konnte doch eine Abweichung feststellen: GetDate liefert das aktuelle Datum inkl. Uhrzeit zurück. Der doppelte Convert entfernt einfach die Uhrzeit. Das ist immer dann sinnvoll, wenn Datumswerte ohne Uhrzeit gespeichert werden und man mit diesen Rechnen möchte.

In der MSDN ist auch erklärt, was der Parameter 101 im Convert bewirkt: Es wird ein Datum im Format mm/tt/jjjj als String erzeugt.
kick it on dotnet-kicks.de

Categories: Allgemein Tags: ,

SQL Count, das unbekannte Wesen

5. August 2009 Mario Noack Keine Kommentare

Bei der Suche nach einem praktischen SQL-Skript für eine Statistik, bin ich auf die Möglichkeit gestoßen, den SQL Count Befehl zu verwenden:

SELECT a.BewertungId, 	
 Count(*) Gesamt,
 COUNT(E_Datum) Offen, 
 Count(CASE WHEN ((a.Abgelehnt = 0) OR (b.OFI = 0)) THEN NULL Else 1 END) Abgelehnt
FROM Aktivitaeten a, Bewertung b
WHERE a.BewertungId = b.Id
GROUP BY a.BewertungId
ORDER BY a.BewertungId

Die Nutzungsmöglichkeit des COUNTs ist dabei vielfältig:

  • Üblicherweise wird Count mit dem Parameter (*) aufgerufen. Dieser Aufruf führt zur vollständigen Zählung der Datenmenge.
  • Gibt man aber als Parameter einen Spaltennamen ein, so werden nur die Datensätze gezählt, die in der gewünschten Spalte einen Eintrag ungleich NULL haben.
  • Aber auch die Angabe eines Ausdrucks, der NULL oder einen Wert liefert, ist möglich.

Das aufgeführte Beispiel zählt also auf einmal: alle Datensätze, alle Datensätze mit einem Eintrag in der Spalte E_Datum und als letzten Punkt alle Datensätze, die eine Ablehnung enthalten.
kick it on dotnet-kicks.de

Categories: Datenbank Tags: