0

C# DateTime.Ticks in Unix-Timestamp und andere Formate umrechnen

C# DateTime.Ticks ConverterMit den DateTime-Funktionen des .NET-Frameworks lässt sich so einiges anstellen. Der Umgang damit gestaltet sich, meiner Meinung nach, sehr angenehm. Einzige Voraussetzung: Man befindet sich in einer reinen .NET-Umgebung. Kommen andere Systeme ins Spiel, so geht die Rechnerei los. Aber woran liegt es, dass man zum Beispiel DateTime.Ticks nicht mit der PHP-Funktion mktime() vergleichen kann?

Ruft man den “Timestamp” eines DateTime-Objekts (DateTime.Ticks) ab, so bekommt man die Anzahl der Ticks seit dem 01.01.0001 00:00Uhr zurück. Ein Tick wiederum ist 100 Nanosekunden lang.
Ein Unix-Timestamp, so wie ihn mktime() zum Beispiel produziert, gibt im Gegenteil zu DateTime.Ticks die Anzahl der Sekunden seit dem 01.01.1970 zurück.
Ein direkter Vergleich ist somit nicht möglich. Wie umgerechnet werden muss, möchte ich euch heute anhand von ein paar kurzen Snippets zeigen.
 
 
Unix-Timestamp -> DateTime.Ticks

private static DateTime TimeFromUnixTimestamp(int unixTimestamp)
{
    DateTime unixYear0 = new DateTime(1970, 1, 1);
    long unixTimeStampInTicks = unixTimestamp * TimeSpan.TicksPerSecond;
    DateTime dtUnix = new DateTime(unixYear0.Ticks + unixTimeStampInTicks);
    return dtUnix;
}

Zuerst wird ein DateTime-Objekt erstellt, dass den Zeitpunkt des Beginns der Unix-Zeitrechnung angibt. Danach wird der (in Sekunden angegebene) Unix-Timestamp in Ticks umgerechnet. Zum Schluss wird ein neues DateTime-Objekt erzeugt, dass die Ticks des Unix-Epochen-Beginns, sowie des Unix-Timespans in Ticks enthält.
 
 
DateTime.Ticks -> Unix-Timestamp

public static long UnixTimestampFromDateTime(DateTime date)
{
    long unixTimestamp = date.Ticks - new DateTime(1970, 1, 1).Ticks;
    unixTimestamp /= TimeSpan.TicksPerSecond;
    return unixTimestamp;
}

Zuerst wird die Anzahl der Ticks vom Beginn der DateTime-Zeitrechnung (siehe Einleitung) bis zum Beginn der Unix-Zeitrechnung abgezogen. Danach hat man quasi schon einen Unix-Timestamp – bloß in Ticks statt in Sekunden. Eben diese werden abschließend noch von Ticks in Sekunden umgerechnet (TimeSpan.TicksPerSecond ist unser Freund) und schon ist die Umrechnung abgeschlossen.
 
 
[Java] System.currentTimeMillis() -> DateTime.Ticks

private static DateTime TimeFromJavaTimestamp(long javaTimestamp)
{
    return TimeFromUnixTimestamp((int)(javaTimestamp / 1000));
}

Der Java-Timestamp (System.currentTimeMillis()) ist fast identisch mit dem standard Unix-Timestamp. Die Zeitrechnung beginnt ebenfalls am 01.01.1970. Der Unterschied liegt lediglich darin, dass der Timestamp in Java in Millisekunden, statt in Sekunden, angegeben wird. Somit können wir uns die oben erstelle Funktion zur Umrechnung zu nutze machen und dessen Ergebnis einfach durch 1000 dividieren.
 
 
DateTime.Ticks -> [Java] System.currentTimeMillis()

public static long JavaTimestampFromDateTime(DateTime date)
{
    return (UnixTimestampFromDateTime(date) * 1000);
}

Um DateTime.Ticks in einen Java-Timestamp umzurechnen müssen wir nur einen Unix-Timestamp erstellen und mit 1000 multiplizieren. (Warum das so ist hatte ich einen Absatz weiter oben ja bereits beschrieben.)
 
 
Ich hoffe, ich konnte dem ein oder anderen Suchenden damit ein wenig weiterhelfen. Solltet ihr noch Fragen oder Verbesserungsvorschläge haben, schreibt mir einfach einen Kommentar. Ich bin gerne bereit den Artikel zu überarbeiten, wenn ihr einen besseren Vorschlag habt. (Man lernt ja nie aus.)
 
Viele Grüße,
Raffi

1

WordPress Ladezeiten verbessern durch Lazy Load Plugin

Lazy Load Image Heute möchte ich den WordPress-Bloggern unter euch einen kleinen Tipp geben. Es geht um das kostenlose WordPress Plugin Lazy Load, dass dazu dienen soll, die Ladezeiten eures WordPress-Blogs zu verringern. Wie das gehen soll?

Lazy Load macht sich die jQuery Sonar Erweiterung zunutze und lädt Bilder erst dann, wenn sie in den Viewport kommen. Das heißt im Klartext, Bilder werden erst geladen, wenn Sie im sichtbaren Bereich eures Webbrowser sind. Je mehr Bilder ihr in einem Artikel/auf eurer Startseite habt, umso mehr Zeit könnt ihr demnach mit dem Lazy Load Plugin einsparen.

Stattdessen der Besucher warten muss, bis alle Grafiken geladen sind, damit er ohne Hakeln, Ruckeln oder sonstige Einschränkungen auf eurer Seite scrollen kann, kann der Besucher nun wesentlich schneller loslegen. Erst wenn er in einen Bereich hineinscrollt, in dem sich weitere Grafiken befinden, werden diese nachgeladen. (Daher stammt übrigens auch der Name des Plugins. “Lazy Loading” ist ein Begriff aus der IT und beschreibt, dass Objekte erst initialisiert (vereinfacht: geladen/erstellt)  werden, wenn Sie benötigt werden.)

Ein kleiner Hinweis am Rande: Auch wenn das Plugin offiziell zur Zeit nur bis zur WordPress Version 3.3.4 kompatibel sein soll, funktioniert es einwandfrei mit der aktuellen WordPress Version 3.4.

Zum Schluss gilt mein Dank Caschy, über dessen Blog ich auf das Plugin aufmerksam geworden bin und der mir wie immer schnell und hilfsbereit per Twitter Auskunft darüber gegeben hat. Nutzt ihr selber vielleicht auch schon ein Lazy Load Plugin und wenn ja, welche Erfahrungen habt ihr damit gemacht?
 
Viele Grüße,
Raffi

1

WordPress 3.4 “Green” ist veröffentlicht (inkl. deutscher Version)

Wordpress 3.4 IconEs gibt mal wieder ein Update für das beliebte Blogsystem “WordPress”, dass unter anderem auch in diesem Blog hier Verwendung findet. Das aktuelle Release ist ein Major-Release mit der Versionsnummer 3.4 und horcht auf den Spitznamen “Green” (in Anlehnung an den Jazzmusiker Grant Green).

 

 

Zu den größten Neuerungen zählt:

  • Die Live-Vorschau bei Änderungen am Theme
  • Das Einbinden von Tweets durch einfaches einfügen eines Links zu einem Tweet in einen Artikel. WordPress bindet den Tweet dann automatisch optisch aufgewertet in den Post/die Seite ein (inkl. Retweet-Button, etc.).
  •  Überarbeitung der WordPress XML-RPC-Schnittstelle (Infoseite zur API)
  • Überarbeitung der wp_querys um Posts, etc. schneller laden/anzeigen zu können
  • Bildbeschriftungen (Captions) können mit HTML gestaltet werden

Eine komplette Übersicht der Neuerungen findet ihr an dieser Stelle auf den Seiten von WordPress. Den Download der aktuellen Deutschen Version findet ihr hier: Download WordPress 3.4 De

Alternativ könnt ihr euer WordPress aber auch wie gewohnt über das Backend updaten. Wie immer gilt – egal für welche Methode ihr euch entscheidet – nicht vergessen vorher ein Backup eurer Datenbank, wenn möglich sogar vom kompletten Blog, anzulegen.

Wer nicht lesen mag, kann sich auch das Video zur neuen Version anschauen.

Und nun wünsche ich viel Spaß mit der neuen Version. Was mich zum Schluss noch interessieren würde. Wer von euch macht das Update und wer macht es nicht (und wenn ja, aus welchen Gründen)?
 
Viele Grüße,
Raffi

2

Einfache XML-Serialisierung in C#

C# XML SerialisierungHeute möchte ich euch zeigen, wie man eine XML-Serialisierung in C# durchführen kann. Serialisierung selbst, bedeutet, dass man ein Objekt in eine andere, transportable Form umwandelt. Mittels XML-Serialisierung ist es uns zum Beispiel nötig, ein Objekt einer Klasse in Form einer XML-Datei abzuspeichern und auch wieder herzustellen.
Das kann Sinn machen, wenn man ein Objekt in seinem Zustand nach dem Schließen und erneuten Öffnen einer Anwendung wiederherstellen oder wenn man ein Objekt beispielsweise per HTTP übertragen möchte.

Für unser Beispiel habe ich folgende Klasse Blog erstellt:

public class Blog
{
    public string User { get; set; }
    public string Pass { get; set; }
    public string Subdomain { get; set; }
    public string BaseUrl { get; set; }
}

Die Methode zum Serialisieren sieht wie folgt aus:

public void SerializeBlogToXML(Blog blogObj)
{
    //Erstelle einen XML-Serialisierer für Objekte vom Typ Blog
    XmlSerializer serializer = new XmlSerializer(typeof(Blog));

    //Erstelle einen FileStream auf die Datei, in die unserer
    //Blog-Objekt in XML-Form gespeichert werden soll.
    FileStream file = new FileStream(Application.StartupPath
                                     + "\\blog.xml",
                                     FileMode.Create);
    //Serialisiere das übergebene Blog-Objekt (blogObj)
    //und schreibe es in den FileStream.
    serializer.Serialize(file, blogObj);

    //Schließe die XML-Datei.
    file.Close();
}

Nicht vergessen die passenden Using-Anweisungen zu schreiben!

using System.Xml.Serialization;
using System.IO;

Ohne diese würde die oben geschriebene Methode SerializeBlogToXML nicht ohne weitere Anpassungen laufen.

Das war es auch schon. Wenn man von meinen Kommentaren absieht, dann reichen ganze 4 Zeilen aus, um ein Objekt als XML-Datei abzuspeichern.

Ein kleines Beispiel zur Verwendung könnte zum Beispiel so aussehen:

private void buttonSerialisieren_Click(object sender, EventArgs e)
{
    //Blog-Objekt erstellen und mit Werten befüllen
    Blog blogObject = new Blog();
    blogObject.User = "maxmustermann";
    blogObject.Pass = "superpasswort";
    blogObject.Url = "www.code-bude.net";

    //Blog-Objekt serialisieren
    SerializeBlogToXML(blogObject);
}

Wenn alles geklappt hat, dürfte sich nun im Ausführungsverzeichnis eures Projektes eine Datei namens Blog.xml befinden. Diese sollte folgenden Inhalt haben:

<?xml version="1.0"?>
<Blog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <User>maxmustermann</User>
  <Pass>superpasswort</Pass>
  <Url>www.code-bude.net</Url>
</Blog>

Das einzige was jetzt noch fehlt, ist die Konvertierung eines nach XML serialisierten Objekts. Das geht sogar noch ein bisschen leichter, als das umwandeln in’s XML-Format.

public Blog DeserializeXmlToBlog()
{
    XmlSerializer serializer = new XmlSerializer(typeof(Blog));
    FileStream file = new FileStream(Application.StartupPath
                                        + "\\blog.xml",
                                        FileMode.Open);
    //Die Deserialize()-Methode gibt ein Object zurück. => casten!
    Blog blogList = serializer.Deserialize(file) as Blog;
    file.Close();
    return blogList;
}

Zum Abschluss noch mal ein Beispiel, in dem Serialisiert und Deserialisiert wird.

private void buttonSerialisieren_Click(object sender, EventArgs e)
{
    Blog blogObject = new Blog();
    blogObject.User = "maxmustermann";
    blogObject.Pass = "superpasswort";
    blogObject.Url = "www.code-bude.net";

    SerializeBlogToXML(blogObject);
    Blog blogFromXml = DeserializeXmlToBlog();
    MessageBox.Show(blogFromXml.Url);
}

Ich hoffe, ich habe das ganze verständlich genug beschrieben. Solltet ihr dennoch Fragen haben, schreibt mir einfach einen Kommentar.

Wer keine Lust hat, den Code von Hand zu tippen bzw. zu kopieren, der kann sich das Beispiel auch als Visual Studio 2010 Projekt herunterladen.

Viele Grüße,
Raffi

0

Artikel auf Blogspot erstellen – C# .NET Blogger API

Blogger C# API LogoHeute möchte ich euch zeigen, wie man mittels C# Blogartikel auf Blogger.com (Blogspot.com) erstellen kann. Hierfür benötigt ihr zu aller erst die Google.GData.Client.dll, welche ihr im Google. Net API Pack findet.
Das API-Pack könnte ihr euch hier von Google herunterladen. (Die Datei heißt Google_Data_API_Setup_2.0.1.0.msi. Beachtet bitte, dass sich die Versionsnummer – 2.0.1.0 – im Laufe der Zeit natürlich ändern kann.) Wenn ihr den Download abgeschlossen habt, installiert das Paket, öffnet ein neues Projekt im Visual Studio und bindet die Google.GData.Client.dll ein.
Die .dll-Datei findet ihr im Downloadverzeichnis des API-Pack. (Wie ihr eine DLL einbinden könnt, habe ich hier bereits beschrieben.)

Wenn ihr die DLL eingebunden habt, kann es auch schon losgehen. Einen Post aka Blogartikel könnt ihr wie folgt erstellen:

 

private static int AddPost(string title,
                                   string html,
                                   string[] labels,
                                   string user,
                                   string pass,
                                   string blogUrl
                                   bool isDraft)
{
	try
	{
		//Wird benötigt um Google Zertifikatfehler zu "umgehen"
		ServicePointManager.ServerCertificateValidationCallback =
			new RemoteCertificateValidationCallback
			(
				delegate { return true; }
			);

		//Eine Google Service Instanz wird erstellt. "blogger"
		//gibt den Dienst an, den wir nutzen wollen. "api_test"
		//gibt den Namen an, unter dem sich unsere Anwendung
		//ausweisen soll. Im Gegenteil zum Dienstparameter, der
		//für unser Beispiel auf "blogger" festgelegt ist, haben
		//wir beim Namen freie Wahl.
		Service service = new Service("blogger", "api_test");

		//Der Service Instanz werden die Benutzerdaten eines
		//gültigen Blogger (Google) Accounts überegeben.
		service.Credentials = new GDataCredentials(user, pass);

		//Ein neues Blogartikel Objekt wird (lokal) angelegt.
		AtomEntry newPost = new AtomEntry();

		//Die Überschrift des Blogartikels wird gesetzt
		newPost.Title.Text = title;

		//Der Inhalt des Blogartikel wird gesetzt.
		newPost.Content = new AtomContent();
		//Wenn ihr HTML-Code übergebt, solltet ihr zuvor sämtliche
		//Zeilenumbrüche entfernen, da Blogger sonst automatisch alle
		//Zeilenumbrüche durch <br /> ersetzt. Wenn man selbst schon
		//im Quelltext <br /> gesetzt hatte, wird einem sonst das
		//ganze Layout "zerfleddert".
		string[] breaks = new string[] { "\r\n", "\r", "\n" };
		foreach (string breakStr in breaks)
		{
			while (html.Contains(breakStr))
				html = html.Replace(breakStr, "");
		}
		newPost.Content.Content = html;
		newPost.Content.Type = "html";

		//Setzen der Labels für den Blogartikel.
		//(Labels bei Blogger entsprechen Kategorien/Tags)
		foreach (string labelRaw in labels)
		{
			AtomCategory cat = new AtomCategory();
			cat.Scheme = new Uri("http://www.blogger.com/atom/ns#");

			//Blogger verbietet bestimmte Zeichen in den Labels
			//Diese sollten zuvor herausgefiltert werden.
			string label = labelRaw;
			string[] forbiddenChars = new string[] { "&", "<", ">",
													 "@", "!", "," };
			foreach (string forbiddenChar in forbiddenChars)
			{
				while (label.Contains(forbiddenChar))
					label = label.Replace(forbiddenChar, "");
			}
			cat.Term = label;
			newPost.Categories.Add(cat);
		}

		//Festlegen, ob der Artikel direkt gepostet oder als Entwurf
		//gespeichert werden soll. (false = direkt Posten)
		newPost.IsDraft = isDraft;

		AtomEntry response = null;
		try
		{
			//Blogartikel absenden (Woher die blogUrl kommt,
                        //wird später im Artikel geklärt.
			response = service.Insert(new Uri(blogUrl), newPost);
		}
		catch (GDataRequestException iDontCare)
		{
			//Fehler beim Absenden aufgetreten
			if (iDontCare.ResponseString == "Blog has exceeded rate " +
								  "limit or otherwise requires word " +
								  "verification for new posts")
			{
				//Fehler tritt auf, wenn das Tageslimit an Posts
				//erreicht ist. (Mehr dazu weiter unten in
				//diesem Blogartikel.)
				return -2;
			}
			else
			{
				//Anderer Fehler aufgetreten
				throw iDontCare;
			}
		}
		if (response == null)
		{
			throw new Exception("Konnte keine Verbindung herstellen");
		}

		//Blogartikel erfolgreich abgesendet
		return 0;
	}
	catch
	{
		//Es ist ein Fehler aufgetreten
		return -1;
	}
}

Nun haben wir den größten Teil geschafft! Um nun einen Blogartikel zu posten, müssen wir nur noch die eben geschriebene Funktion aufrufen. Das könnte wie folgt aussehen:

Demo.AddPost("Meine Überschrift",
             "<b>das</b><br /><i>ist</i> ein test",
             new string[] { "test", "csharp", "api" },
             "maxmustermann@googlemail.com",
             "demo_passwort",
             "https://www.blogger.com/feeds/XXXXXX/posts/default");

Eine letzte Frage steht nun noch im Raum. Was ist die Blog-Url und wo kommt Sie her? Das klären wir nun. Die Url ist vom Grundaufbau her immer identisch. Lediglich die XXXXXXe müssen durch die ID des Blogs ersetzt werden. Eine Möglichkeit die komplette URL zu bekommen, möchte ich euch nachfolgend zeigen.
Nehmen wir an, euer Blog hat die URL: http://code-bude-test.blogspot.com – dann ist “code-bude-test” der Name des Blogs, den wir nun brauchen.

public static string SelectUserBlogPostUrl(string subdomain,
                                                   string user,
                                                   string pass)
{
	//Erstellen der Google Service Instanz
	ServicePointManager.ServerCertificateValidationCallback =
		new RemoteCertificateValidationCallback
		(
			delegate { return true; }
		);
	Service service = new Service("blogger", "api_test");
	service.Credentials = new GDataCredentials(user, pass);

	//Anfordern einer Liste mit allen Blogs, die unter
	//dem angegeben Google Account existieren
	FeedQuery query = new FeedQuery();
	query.Uri = new Uri("http://www.blogger.com/feeds/default/blogs");
	AtomFeed feed = service.Query(query);

	//Wenn die Liste mit den Blogs nicht null ist...
	string blogUrl = string.Empty;
	if (feed != null)
	{
		//Durchlaufe alle erhaltenen Blogs
		foreach (AtomEntry entry in feed.Entries)
		{
			//Überprüfe, ob der aktuelle Blog der gesuchte
			//Blog ist.
			if (entry.AlternateUri.Content.Contains(subdomain))
			{
				//Suche die Blog Post URL
				for (int i = 0; i < entry.Links.Count; i++)
				{
					if (entry.Links[i].Rel.Equals("http://schemas.google.com/g/2005#post"))
					{
						blogUrl = entry.Links[i].HRef.ToString();
					}
				}
				//Gebe die Blog Post Url zurück
				return blogUrl;
			}
		}
	}
	//Wenn keine URL gefunden wurde, gebe Blog Url
	//= string.empty zurück
	return blogUrl;
}

Nun haben wir alles zusammen. Mit den oben stehenden Funktionen könnt ihr nun die Blog Post Url herausfinden und mittels dieser und der AddPost-Funktion Blogartikel auf Blogger.com veröffentlichen.

Zum Abschluss noch ein paar Worte zum “Rate-Limit” (aka “Blog has exceeded rate limit or otherwise requires word verification for new posts”). Die Blogger API erlaubt nur eine gewisse Anzahl an Posts pro Tag. Eine genaue Zahl gibt Google nicht heraus. Aus Erfahrung kann ich jedoch sagen, dass es ziemlich genau 50 Artikel sind, die man am Tag veröffentlichen kann. Danach geht über die API gar nichts mehr.
Über die Weboberfläche von Blogger.com können jedoch weitere Artikel veröffentlicht werden. Hierbei muss nach Erreichen des Limits jedoch jedes Mal beim Veröffentlichen ein Captcha gelöst werden. Das Limit/die Sperre wird ziemlich genau nach 24 Stunden wieder zurückgesetzt.

So, das war’s dann aber auch wirklich für heute. Wenn ihr noch Fragen, oder noch besser, Anregungen und Ideen habt, dann schreibt einfach einen Kommentar.

Viele Grüße,
Raffi

weitere Seiten ... 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25