Es gibt mal wieder seit langer Zeit ein Gewinnspiel, wo ich gerne mitmache und auch mit meinem Blog werbe. Es handelt sich um Cashys sechsten (Blog-)Geburtstag. Happy Birthday von mir an Cashy und seinem Blog, den ich ganz gerne lese, weil seine Artikel über Gadgets und nerdigen Krimskrams immer recht authentisch aus Consumer-Sicht geschrieben sind.
Nach langer Zeit ist es nun mal wieder so weit: eine neue Version von rsslounge ist verfügbar. Es gibt einige Änderungen und Optimierungen. Neue Features und größere Umbauten sind immer eine Frage der Zeit. Ich habe ja einiges auf der Wunschliste und auch im Forum haben einige Wünsche geäußert. Besonders interessant ist eine Funktion, so dass aus den gesammelten Feedbeiträgen wieder ein RSS Feed erzeugt wird. Das kann dann an beliebiger Stelle (z.B. in einer Android RSS App) eingebunden werden.
An dieser Stelle vielen Dank an alle, die mich mit Sprachdateien versorgt haben und mir Feedback geben. Sofern ich die Zeit finde, versuche ich sinnvolle Neuerungen einzubauen. Die Performance zu optimieren (besonders das erstmalige Laden von rsslounge zu beschleunigen) war im aktuellen Update mein primäres Anliegen. Die Änderungsliste ist im Changelog zu finden.
Download: rsslounge 1.7
Auf meiner Suche nach einem guten XML Parser, bin ich auf die sehr gute C++ Bibliothek pugixml gestoßen. Mit wenigen Zeilen Code, lassen sich XML Dateien parsen und verändern. pugixml ist dabei sehr schnell, da kein XML zuvor validiert wird, portabel und besteht lediglich aus zwei Sourcecode Dateien (Header und cpp Datei). Letzteres macht die Integration in eigene Projekte sehr leicht.
Ein String kann ganz einfach mit folgenden Zeilen geparsed werden:
std::string source(
"<test>"
"<eintrag id=\"1\">bla</eintrag>"
"<eintrag id=\"2\">bla2</eintrag>"
"</test>");
pugi::xml_document doc;
pugi::xml_parse_result result =
doc.load_buffer_inplace(
(void*)(source.c_str()),
source.length()
);
Um beispielsweise einen Eintrag zu suchen, kann folgender Aufruf ausgeführt werden, wobei hier XPath verwendet wird:
pugi::xpath_node_set entries =
doc.select_nodes("/test/eintrag[@id='2']");
pugi::xml_node entry = entries[0].node();
std::cout << entry[0].node().child_value(); // bla
Das node_set apps enthält dann alle gefundenen nodes, wobei über den [] Operator auf die einzelnen Elemente zugegriffen werden kann.
Einen guten Überblick bietet der QuickStart-Guide oder die sehr ausführliche und gute Dokumentation.
pugixml steht unter der MIT Lizenz zur Verfügung und nach einem ersten Einsatz kann ich die Bibliothek nur empfehlen. Aus meiner Sicht ein echter Tipp, insbesondere, weil die Einbindung einfach und unkompliziert ist. pugixml hat mich von der hohen Qualität stark an mongoose erinnert.
In letzter Zeit habe ich wieder etwas mehr Muse zu bloggen und werde auch die nächsten Wochen hier etwas aktiver sein. Besonders rsslounge, das ich die letzten Monate arg vernachlässigt habe, kommt auf die Agenda. Ein neuen Release mit einigen kleinen Verbesserungen wird es also bald geben. Darüber hinaus möchte ich wieder etwas mehr über interessante Dinge aus dem Bereich Softwareentwicklung und Fotografie schreiben.
In diesem Sinne bis zum nächsten Post. Ich hoffe es gibt noch einige interessierte Leser!
Häufig kommt es vor, dass Sprachdateien nicht vollständig sind. Ich habe den Effekt bei rsslounge, da ich hier von verschiedenen Personen Sprachdateien bekomme. Da ich nicht sicherstellen kann, ob auch wirklich jeder Key der Sprachdatei übersetzt wurde (außer ich prüfe manuell die gesamte Datei), bietet es sich an, einfach als Fallback-Lösung die entsprechende englische Übersetzung zu verwenden.
Zend_Translate bietet hier eine einfache Möglichkeit “Routen” zu erstellen. Das heißt man kann festlegen, welche Sprache alternativ verwendet werden soll. Dabei können sogar Ketten gebildet werden (z.B. wenn Französisch nicht gefunden wurde, dann in der deutschen Übersetzung suchen und wenn dort auch nichts gefunden wird, in der englischen). Wobei sich mir der Sinn von so einer Verkettung nicht ganz erschließt.
Das setzen einer Route ist sehr einfach. Folgendes Beispiel scanned ein übergebenes Verzeichnis nach CSV Dateien und übernimmt deren Inhalt als Übersetzung. Mit dem Key “route” wird definiert, wie die Sprachen verkettet werden sollen. In diesem Beispiel ist Englisch die Fallbacksprache für Deutsch und Französisch.
$language = new Zend_Translate(
'csv', // Typ der Quelle: hier csv Dateien
'locale', // Quell-Verzeichnis
'en', // Standard Sprache
array( // Optionen
'scan' => Zend_Translate::LOCALE_DIRECTORY,
'route' => array( 'de' => 'en', 'fr' => 'en' )
));
Der sauberste Weg ist es natürlich alle Schlüssel auf zu übersetzen. Beim Aufspüren von fehlenden Übersetzungen hilft Zend_Translate ebenfalls.
Ein Projekt, das schon länger auf der ToDo Liste steht, habe ich nun heute etwas genauer in Augenschein genommen:
Bei HeadJS handelt es sich um ein kleines JavaScript Skript, welches in der Lage ist, weitere JavaScript Dateien nachzuladen:
head.js(
"/path/to/jquery.js",
"/google/analytics.js",
"/js/site.js",
function() {
// all done
}
);
Der Vorteil ist die Tatsache, dass die weiteren Skriptdateien kontrolliert parallelisiert heruntergeladen werden. Wird dieser Aufruf am Ende der Website durchgeführt (also vor dem schließenden body Tag), so kann die HTML Seite, sowie die Stylesheets ungehindert geladen und gerendert werden, bevor mit der Verarbeitung von JavaScript Dateien begonnen wird. Das Ergebnis: die Seite wird schneller angezeigt. Mit 2,3 kB ist das Skript auch schön kompakt und klein.
Weitere Features sind eine bessere HTML5 Kompatibilität, automatisch gesetzte CSS Klassen (z.B. für bestimmte Browser) und noch einige weitere Schmankerl. Es lohnt sich also das kleine Skript genauer anzusehen. Im Einsatz habe ich es bei rsslounge (ab Version 1.7, die ich in wenigen Tagen online stellen will).
Zur headJS Webseite: http://headjs.com/
Pünktlich zum Jahresende gibt es wieder mein Best of deviantArt. Gerade merke ich, dass ich bereits seit 2007 mein jährliches feature für deviantart auf meinem Blog veröffentliche. Das wird jetzt schon richtig Tradition
Auf deviantArt findet ihr meine Best of 200x seit dem Jahr 2001.























































