WordPress Ladezeiten verbessern durch Lazy Load Plugin
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
WordPress 3.4 “Green” ist veröffentlicht (inkl. deutscher Version)
Es 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
Einfache XML-Serialisierung in C#
Heute 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
Artikel auf Blogspot erstellen – C# .NET Blogger API
Heute 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







