Ermitteln von Feiertagen

Feiertage werden nicht nach dem Zufallsprinzip gesetzt, sondern es gibt eine feste Formel anhand welcher man sämtliche Feiertage berechnen kann. Hierbei muss man zwischen festen Feiertagen wie Neujahr und dem Tag der deutschen Einheit und den flexiblen unterscheiden. Zum Beispiel die, die sich an Ostersonntag ausrichten, welcher wiederrum errechnet werden kann. Dies ist mit der Gaußschen Osterformel möglich. Wenn man dies getan hat, werden von dem Ergebnisdatum aus nur noch Additionen sowie Subtraktionen durchgeführt. So lassen sich alle beweglichen Feiertage ermitteln. Wir nutzen zum errechnen vom Ostersonntag jedoch folgende Formel:

//year ist das aktuelle Jahr
int c = year / 100;
int n = year - 19 * (year / 19);
int k = (c - 17) / 25;
int i = c - c / 4 - ((c - k) / 3) + 19 * n + 15;
i = i - 30 * (i / 30);
i = i - (i / 28) * ((1 - (i / 28)) * (29 / (i + 1)) * ((21 - n) / 11));
int j = year + (year / 4) + i + 2 - c + (c / 4);
j = j - 7 * (j / 7);
int l = i - j;

int easterMonth = 3 + ((l + 40) / 44);
int easterDay = l + 28 - 31 * (easterMonth / 4);

Weiterlesen

Einen PHP-SOAP-Webservice erstellen und verwenden

Zum Erstellen eines SOAP-Webservices unter PHP gibt es einige Möglichkeiten. Eine davon wäre sicherlich bei Null zu beginnen und alles selbstständig zu programmieren. Eine andere Möglichkeit wiederrum ist die Verwendung von NuSoap; dies werde ich auch hier in diesem Beitrag tun. Was benötigt man zunächst einmal für einen NuSoap-PHP-Webservice? Nun zunächst einmal benötigt man einen Webspace auf dem PHP läuft und auch eine Datenbank wie z.B. MySQL ist an dieser Stelle hilfreich. Verwendet werden kann der Webservice anschließend in jeder SOAP-kompatiblen Programmiersprache. Ich werde hierfür C# verwenden.

Für den ersten Schritt sollten wir uns die Library für NuSoap herunterladen. Dies ist unter folgender URL möglich: http://sourceforge.net/projects/nusoap/ . Hier wird ausschließlich der „lib“-Ordner für die Referenzierung benötigt. Diesen packen wir auch direkt auf unseren Webserver, auf dem später der Webservice laufen soll. Weiterlesen

Laptop oder Tablet? Erkennen und richtig Handeln!

Durch Windows 8 ist eine ganz neue Form von „mobilen“ Anwendungen auf den Markt gekommen. Die Windows 8 Apps. Ebenso kamen Systeme dazu, die sowohl Tablet als auch Laptop sind und ebenso welche, die beides sein und sich zur Laufzeit ändern können. Passend dazu kamen auch relativ zeitnah die ersten Anwendungen, die auf dieses Verhalten entsprechend reagieren und sich mit jeweils einer anderen angepassten Oberfläche zur Schau stellen.

Die hierfür notwendige API gibt es leider bei Intel nur für C++. Aber mithilfe von P/Invoke kann dies auch ganz einfach mit C# und WPF verwendet werden.

Weiterlesen

Netz- und Broadcast IP-Adresse finden leicht gemacht

Nachdem nun einige Monate keine neuen Beiträge kamen, habe ich nun endlich wieder etwas Zeit, um hier einen neuen Beitrag zu veröffentlichen. Diesmal beschäftigen wir uns mit dem einfachen Finden von Netz- sowie Broadcast IP-Adressen in einem Netzwerk. Auch wenn dies sehr simpel ist, benötigt es einige Aktionen auf Bit-Ebene, um das Problem zu lösen. Damit hier eine sichere Funktionalität gewährleistet ist, möchte ich darauf hinweisen, dass die Größe der Datentypen hierbei sehr entscheidend sein kann. Kommen wir nun zum Sourcecode.  Weiterlesen

Wusstet ihr schon… Enumerationen?

Enumerationen oder auch Aufzählungen sind für den Computer nicht mehr und nicht weniger als Integer-Typen. Jede Aufzählung (außer jene, bei welchen man dies verändert hat) lässt sich zum Integer wandeln und jeder Integer kann zu einer Aufzählung gewandelt werden (für letzteres gelten allerdings einige Einschränkungen, da die  Zahl in der Aufzählung präsent sein muss). Darum kann auch jedem Eintrag in einer Aufzählung eine Ganzzahl zugewiesen werden (in der Regel verwendet man hier die 2er-Potenzen um so mittels „Flag“-Attribut „oder“, „und“ „exklusiv oder“ und die anderen Bit-Operatoren verwenden kann).  Weiterlesen

Einfaches Model-View-ViewModel nutzen unter WPF/C#

Inzwischen gibt es einige Frameworks für MVVM, besonders in Verbindung mit WPF und C#. Besonders einfach möglich ist dies mittels Cinch, welches wiederum MEFedMVVM nutzt. Die Links zu diesen beiden Projekten befinden sich am Ende dieses Posts. Diese Frameworks sind zum Einen kostenlos nutzbar und zum Anderen sehr gut dokumentiert. Außerdem steht eine entsprechend große Community hinter diesen Frameworks, die bei Fragen sehr gut unterstützt (natürlich sollte man hier am Besten Englisch beherrschen, aber dies ist in der Softwareentwicklung so oder so Grundvoraussetzung). Aber was genau sind dies für Frameworks?  Weiterlesen

Typenwandlung in C#

Um einen Typen in einen anderen zu verwandeln, gibt es in C# mehrere Wege. Zum einen gibt es das typische „Casten“, zum anderen das „Safty Casten“ und dann noch die „Convert“-Klasse. Beginnen wir mit der „Convert“-Klasse, da diese sich ein wenig von den anderen unterscheidet. Diese bietet uns statische Methoden wie „ToInt32“, um z.B. einen String in einen Integer zu wandeln. Allerdings stehen hier nur die .NET Standard-Datentypen wie Byte, Short, Integer, Long, Float, Double, Decimal, Character und String jeweils Signed und Unsigned (zumindest die Ganzzahlen) zur Verfügung. Sollte hier eine Wandlung nicht möglich sein, wird eine Ausnahme ausgelöst.

Zusätzlich gibt es auch noch das typische „Casten“, welches in nahezu jeder objektorientierten Programmiersprache möglich ist. Auch hierbei wird eine Ausnahme ausgelöst, wenn die Typenwandlung nicht möglich ist. Zusätzlich gibt es im .NET über das „as“-Keyword noch das „Safty Casten“. Dies erledigt die Typenwandlung und im Falle des unmöglichen, wird keine Ausnahme ausgelöst, sondern der Standardwert des Zieltypen hergestellt. Bedingt durch das nicht auslösen der Ausnahme empfehle ich diese Art der Typenwandlung zu vermeiden, denn es sorgt dafür, dass Fehler länger gesucht werden müssen als nötig.

Zeilenumbrüche in Strings

Zeilenumbrüche in Strings lassen sich auf vielen Wegen erzeugen. Oftmals wird hierfür einfach ‚\n‘ dem String angefügt. Ist dies jedoch wirklich der beste Weg? Ich würde darauf mit nein antworten. C# bzw. das .NET-Framework sieht für Zeilenumbrüche eine bessere Variante vor. Und zwar folgende:

Environment.NewLine;

Hierbei wird sichergestellt, dass im aktuellen Kontext das für den jeweiligen Kontext relevante eingefügt wird, um den Umbruch zu erzeugen.

Mails vom Programm versenden

In der heutigen Zeit gewinnen E-Mail’s gegenüber Briefen immer mehr an Bedeutung. Auch kann man diese wirklich gut für Bugreports verwenden. Aber wie könnte es anders sein, als dass uns das .NET-Framework auch hierfür entsprechende Methoden bereitstellt. Kommen wir zunächst zum Sourcecode, bevor ich erläutere welcher Parameter durch was zu ersetzen ist.

MailMessage mail = new MailMessage
	{
		From = new MailAddress("report@mailhoster.de", "Report Benutzer"),
		Subject = "Der Betreff der e-Mail",
		Body = "Dies ist der Inhalt der e-Mail <b>sogar mit HTML</b>.", 
		IsBodyHtml = true
	};

mail.To.Add(new MailAddress("test@mailhoster.de", "Test Benutzer"));

SmtpClient mailClient = new SmtpClient("smtp.mailhoster.de", 25)
	{
		Credentials = new NetworkCredential("report", "passwort")
	};

mailClient.Send(mail);

Weiterlesen

Ein eigener „Mini“-Downloadmanager

Hin und wieder kommt es vor, dass eine Anwendung Dateien aus dem Internet herunterladen muss. Oftmals soll hierfür auch eine Fortschrittsanzeige dargestellt werden, z.B. bei einer eigenen Update-Routine. Schön wäre es doch, wenn der Download gestartet wird, noch während man die Dateien für ein etwaiges Update zusammen sucht. Oder etwa nicht? Auch schön wäre es, wenn wir den Fortschritt des aktuellen Downloads erfahren könnten und wenn das Ganze anschließend auch noch sauber asynchron ausgeführt wird. Mithilfe der Klassen „WebClient“ und „Queue<T>“ können wir dies auch mit Leichtigkeit realisieren. Da ich den Quellcode bereits soweit vorbereitet habe, sehen wir uns das Ganze erst einmal an.

public class DownloadManager
{
    private readonly string _downloadDirectory;
    private bool _shouldAbort;

    private readonly Queue<string> _queue;
    private readonly WebClient _client;

    public double ProgressOfCurrentFile { get; private set; }

    public DownloadManager()
        : this(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"))
    { }

    public DownloadManager(string downloadDirectory)
    {
        _downloadDirectory = downloadDirectory;

        _queue = new Queue<string>();
        _client = new WebClient();

        _client.DownloadProgressChanged += (sender, args) => ProgressOfCurrentFile = args.ProgressPercentage;
    }

    public void Enqueue(string file)
    {
        _queue.Enqueue(file);
    }

    public void Abort()
    {
        _shouldAbort = true;
        _queue.Clear();
    }

    public void DownloadFiles()
    {
        Task result = DownloadFilesAsync();
        result.Wait();
    }

    public async Task DownloadFilesAsync()
    {
        _shouldAbort = false;
        if (!Directory.Exists(_downloadDirectory))
            Directory.CreateDirectory(_downloadDirectory);

        while (_queue.Count > 0 && !_shouldAbort)
        {
            string path = _queue.Dequeue();
            string filename = path.Split(new[] {'/', '\\'}).Last();

            await Task.Run(() => _client.DownloadFile(new Uri(path), _downloadDirectory + "\\" + filename));
        }
    }
}

Was haben wir hier nun? Zwei Konstruktoren, der eine ohne Parameter nutzt als Ziel für die Downloads den Benutzer-Download-Ordner, während der andere einen frei angegebenen Pfad nutzt. Zusätzlich haben wir eine Methode um Dateien dem Download hinzuzufügen, sowie eine Methode um das Ganze abzubrechen (aktuell würde diese nur zwischen Downloads abbrechen aber keine aktiven Downloads!). Und zu guter Letzt natürlich noch unsere beiden eigentlichen Download-Methoden, die eine synchron, die andere ssynchron, wobei in diesem Fall die synchrone die asynchrone nutzt und einfach auf dessen ending wartet.