<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>xscDevBlog - LastSharp &#38; Co. &#187; Web</title>
	<atom:link href="http://dev.xscheme.de/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.xscheme.de</link>
	<description>Der xscheme-DevelopmentBlog</description>
	<lastBuildDate>Sun, 23 May 2010 11:40:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Release] SharpConnect 1.0.0</title>
		<link>http://dev.xscheme.de/2010/03/release-sharpconnect-1-0-0/</link>
		<comments>http://dev.xscheme.de/2010/03/release-sharpconnect-1-0-0/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 18:41:49 +0000</pubDate>
		<dc:creator>WordPress</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Theorie]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=1001</guid>
		<description><![CDATA[Die erste Version von SharpConnect (einer Bibliothek zum Zugriff auf Web-APIs, z.B. dem von Last.FM) steht nun der Öffentlichkeit zur Verfügung. Und zwar auf der neu eingerichteten Wiki-Seite:
http://wiki.xscheme.de/index.php?p=sharpconnect
]]></description>
			<content:encoded><![CDATA[<p>Die erste Version von SharpConnect (einer Bibliothek zum Zugriff auf Web-APIs, z.B. dem von Last.FM) steht nun der Öffentlichkeit zur Verfügung. Und zwar auf der neu eingerichteten Wiki-Seite:</p>
<p><a href="http://wiki.xscheme.de/index.php?p=sharpconnect">http://wiki.xscheme.de/index.php?p=sharpconnect</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2010/03/release-sharpconnect-1-0-0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>nginx = Wow!</title>
		<link>http://dev.xscheme.de/2010/02/nginx-wow/</link>
		<comments>http://dev.xscheme.de/2010/02/nginx-wow/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 15:11:17 +0000</pubDate>
		<dc:creator>xsc</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=976</guid>
		<description><![CDATA[Nachdem ich ja diese Woche mit meinem Blog den Hoster gewechselt habe, stand ich vor einem kleinen Problem: der vServer, den ich mir angemietet habe, schien zeitweise extrem instabil, hing manchmal fest und tat gar nichts mehr.
Eine kleine Analyse brachte das Problem zutage: der installierte Apache 2 Server fraß die Resourcen auf, anscheinend beim Versuch, [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich ja diese Woche mit meinem Blog den Hoster gewechselt habe, stand ich vor einem kleinen Problem: der vServer, den ich mir angemietet habe, schien zeitweise extrem instabil, hing manchmal fest und tat gar nichts mehr.</p>
<p>Eine kleine Analyse brachte das Problem zutage: der installierte <strong>Apache 2</strong> Server fraß die Resourcen auf, anscheinend beim Versuch, sich mit der MySQL-Datenbank (die ich zwecks einfacher Weiterbetreibung dieses Blogs behalten habe) zu verbinden. Und egal, wo ich an der Konfiguration herumgeschraubt habe, es hat nichts gebracht.</p>
<p>Also bin ich einen anderen Weg gegangen: ein neuer Webserver musste her. Und hierbei fiel mein Auge auf <strong>nginx (Engine X)</strong>. (<a href="http://nginx.org/">Homepage</a>) Eine kurze <a href="http://www.howtoforge.com/installing-nginx-with-php5-and-mysql-support-on-debian-lenny">Installation</a> und eine unglaublich einfach zu erledigende Konfiguration später, lief er dann auch schon. Und siehe da: keine Abstürze, keine langen Wartezeiten. Einfach Wow!</p>
<p><del datetime="2010-02-04T08:52:46+00:00">Jetzt muss ich nur noch <a href="http://cakephp.org/">cakePHP</a> zum Laufen bekommen, dann wäre die Welt perfekt&#8230;</del> Läuft.</p>
<p><span id="more-976"></span>Oh, noch nebenbei die Konfiguration für diesen Wordpress-Blog, falls jemand auf der Suche nach den Rewrite-Rules sein sollte (nginx unterstützt keine .htaccess Dateien):</p>
<pre>server {
	listen 80;
	server_name dev.xscheme.de;

	location / {
		root [...];
		index index.php;
		if (!-e $request_filename) {
			rewrite ^ /index.php last;
		}
	}
	...
}
</pre>
<p>Wo genau ich das gefunden habe, weiß ich jetzt auch nicht mehr&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2010/02/nginx-wow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inside Last.FM: Silent Authentication für API 2.0</title>
		<link>http://dev.xscheme.de/2009/07/inside-lastfm-silent-authentication/</link>
		<comments>http://dev.xscheme.de/2009/07/inside-lastfm-silent-authentication/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 21:47:06 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Lapicon]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[lastfm]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=774</guid>
		<description><![CDATA[Update (17.07.2009): Das hier ist (abgesehen von den &#8220;Skills&#8221;, die ich dabei gebraucht hab) wohl ziemlich überflüssig, wenn man die API-Methode auth.getMobileSession mal genauer betrachtet. Wieder was gelernt: RTFM!
Da im Moment anscheinend wieder Änderungen am Last.FM-Webservice gemacht werden, die dazu geführt haben, dass LastSharp höchstens noch mithilfe der &#8220;Modifizierten Verbindung&#8221; (unter &#8220;Erweiterte Einstellungen&#8221; &#62;&#62; &#8220;Verschiedenes&#8221;) [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update (17.07.2009):</strong> Das hier ist (abgesehen von den &#8220;Skills&#8221;, die ich dabei gebraucht hab) wohl ziemlich überflüssig, wenn man die API-Methode auth.getMobileSession mal genauer betrachtet. Wieder was gelernt: RTFM!</p>
<p>Da im Moment anscheinend wieder Änderungen am Last.FM-Webservice gemacht werden, die dazu geführt haben, dass LastSharp höchstens noch mithilfe der &#8220;Modifizierten Verbindung&#8221; (unter &#8220;Erweiterte Einstellungen&#8221; &gt;&gt; &#8220;Verschiedenes&#8221;) funktioniert, habe ich mir mal das <a href="http://www.lastfm.de/api/radio">Radio-API</a> angesehen, das ja anscheinend die Zukunft des Radiostreamings bei Last.FM ist. Was mich daran allerdings stört, ist die umständliche Anmeldeprozedur: Token holen, Browser öffnen, auf Authentifizierung warten, Session holen.</p>
<p>Der Umweg über den Browser ist einfach unschön, weshalb ich nach einer Lösung gesucht habe, die <strong>den Login sowie die anschließende Bestätigung eines Users im Hintergrund simuliert</strong>, sodass er das eigentliche Programm nicht verlassen muss.</p>
<p><span id="more-774"></span></p>
<p><em>Funktionen, die Authentication-Token und -Session holen, werden im folgenden als gegeben betrachetet, z.B. durch LastFmLib.Net. </em></p>
<p>Wir brauchen nun also zwei Funktionen, die das Abschicken des Login-Formulars und das Klicken auf den &#8220;Zulassen&#8221;-Button vortäuschen. Beide Operationen produzieren eine HTTP-POST-Anfrage, funktionieren aber nur, wenn auch die richtigen Cookies vorhanden sind. (Das hat mich einige Zeit gekostet und dabei war die Lösung so einfach&#8230;) Es bietet sich an, die POST-Anfrage in eine Hilfsfunktion <em>ExecutePOST</em> zu packen, hier z.B. in C#:<br />
(Namespace <em>System.Net</em> muss eingebunden sein)</p>
<pre name="code" class="c-sharp">// Löst das Cookie Problem: Immer denselben Container verwenden!
private static CookieContainer GlobalCookies = new CookieContainer();

// Sendet eine POST-Anfrage
public static void ExecutePOST(string uri, string data) {
    try
    {
        // Bereite die Anfrage vor
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.CookieContainer = GlobalCookies; // !!
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = data.Length;

        // Schreiben der Daten
        ASCIIEncoding enc = new ASCIIEncoding();
        byte[] bdata = enc.GetBytes(bodyData);
        Stream str = req.GetRequestStream();
        str.Write(bdata, 0, bdata.Length);
        str.Close();

        // Schicke Anfrage ab und verwirf die Antwort
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        response.Close();
    }
    catch { }
}</pre>
<p>Will man überprüfen, ob die gewünschte Operation erfolgreich war, würde es sich vermutlich anbieten, die Antwort auszuwerten, aber darauf verzichte ich jetzt aus Zeitgründen.</p>
<p>Nächster Schritt ist die Untersuchung der Formulare auf der Last.FM-Seite, damit man weiß, welche Daten an welche Adresse gesendet werden müssen:</p>
<ul>
<li>Login: <strong>https://www.last.fm/login/</strong>
<ul>
<li>refererKey (leer)</li>
<li>backto (&#8220;/&#8221;)</li>
<li>username (Benutzername)</li>
<li>password (Passwort)</li>
</ul>
</li>
<li>Zulassen: <strong>http://www.last.fm/api/grantAccess</strong>
<ul>
<li>api_key (Last.FM schickt den sogar zweimal, wir deshalb sicherheitshalber auch&#8230;)</li>
<li>token (Authentication-Token)</li>
<li>referer (&#8220;/&#8221;)</li>
</ul>
</li>
</ul>
<p>Also, die beiden verbleibenden Funktionen in C#:</p>
<pre name="code" class="c-sharp">    // Lasse ein Programm zu
    public static void GrantAccess(string token)
    {
        ExecutePOST(
            "http://www.last.fm/api/grantAccess",
            "api_key=" + apiKey + "&amp;api_key=" + apiKey + "&amp;token=" + token + "&amp;referer=/"
        );
    }

    // Melde den User bei Last.FM an
    public static void Login(string username, string password)
    {
        ExecutePOST(
            "https://www.last.fm/login/",
            "refererKey=&amp;backto=/&amp;username=" + Uri.EscapeDataString(username) +
            "&amp;password=" + Uri.EscapeDataString(password)
        );
    }</pre>
<p>Um jetzt eine gesamte Anmeldung zu simulieren, müsste man nun folgendes machen:</p>
<pre name="code" class="c-sharp">public static void Authenticate(string username, string password)
{
    string token = GetToken(); // irgendeine externe Funktion
    Login(username, password);
    GrantAccess(token);
    string session = GetSession(); // irgendeine externe Funktion
    // Mache etwas...
}</pre>
<p>Das war&#8217;s auch schon. Wie gesagt fehlt hier ein Test, ob die Anmeldung erfolgreich war, aber irgendwie lässt sich das bestimmt einfach überprüfen. (Vllt. liefert Last.FM ja im Hintergrund einen HTTP-Error, der im Browser nicht auffällt?)</p>
<p>Jedenfalls, wenn jemand die <strong>Authentifizierung für das Last.FM-API 2.0 im Hintergrund</strong> ablaufen lassen will, ist das hier der Weg. Ich hoffe, es hilft.</p>
<p>Die Verwendung des Radio-APIs in LastSharp werde ich übrigens so lang wie möglich hinauszögern, da hier wieder einmal diverse Standards (HTTP, XML, &#8230;) unsachgemäß ausgelegt werden&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/07/inside-lastfm-silent-authentication/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SerienjunkiesGML</title>
		<link>http://dev.xscheme.de/2009/07/serienjunkies-gml/</link>
		<comments>http://dev.xscheme.de/2009/07/serienjunkies-gml/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 16:10:56 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=770</guid>
		<description><![CDATA[First of all: wie es mit der Legalität der Seite serienjunkies.org aussieht, weiß ich nicht. Ich selbst kannte sie bis vorgestern nicht und alles, was nun folgt, ist für mich nur eine programmiertechnische Fingerübung &#8211; wenn auch womöglich mit einem gewissen Nutzen.
Das Problem, auf das ich hingewiesen wurde, als ich mich nach online verfügbaren Episoden [...]]]></description>
			<content:encoded><![CDATA[<p>First of all: wie es mit der Legalität der Seite <em>serienjunkies.org</em> aussieht, weiß ich nicht. Ich selbst kannte sie bis vorgestern nicht und alles, was nun folgt, ist für mich nur eine programmiertechnische Fingerübung &#8211; wenn auch womöglich mit einem gewissen Nutzen.</p>
<p>Das Problem, auf das ich hingewiesen wurde, als ich mich nach online verfügbaren Episoden von <a href="http://en.wikipedia.org/wiki/Flight_of_the_Conchords_(TV_series)">Flight of the Conchords</a> erkundigt und die o.g. Seite als Quelle empfohlen bekommen habe, war, dass man, um an Downloadlinks zu kommen (ohnehin nicht das, was ich wollte), für jede Episode ein Captcha lösen und anschließend für jede einzelne Teil-Datei eine Serie von Klick-Copy-Paste ausführen musste. Und da kam mir die Idee, dass ganze in ein Programm zu packen: <strong>SerienjunkiesGML (Get My Links!)</strong></p>
<p><a href="http://dev.xscheme.de/wp-content/uploads/2009/07/sgml1.png"><img class="alignleft size-medium wp-image-771" style="margin-right: 2em; margin-bottom: 1em;" title="sgml1" src="http://dev.xscheme.de/wp-content/uploads/2009/07/sgml1-236x300.png" alt="sgml1" width="236" height="300" /></a>Man gibt einfach die URL einer Serienjunkies-Seite in das dafür vorgesehene Textfeld ein (alternativ kann man auch direkt nach irgendetwas suchen), lässt das Programm die verfügbaren Episoden laden und startet mit einem Doppelklick auf die jeweilige Episode das Holen der Links.</p>
<p>Das Lösen des Captchas konnte ich nicht automatisieren (da sind schon viel größere Kaliber als ich dran gescheitert), aber die darauf folgenden Operationen, die zu den eigentlichen Links führen. D.h.: <strong>Hoster auswählen, Captcha lösen, warten, fertig!</strong></p>
<p>Man kann auch gleich von vornherein mehrere Episoden auswählen und mit einem Klick auf &#8220;Go!&#8221; nacheinander abarbeiten.</p>
<p>Ein Hinweis noch: das Holen der Links funktioniert in einer Vielzahl der Fälle reibungslos, nur manchmal scheitert es. Dann muss man die entsprechenden URLs (die mit &#8220;download.serienjunkies.org&#8221;) beginnen, eben von Hand in den Browser eingeben.</p>
<p>Herausforderungen an mich waren: Untersuchung einer HTML-Seite, Simulieren einer POST-Request, Entwicklung einer intuitiven Benutzeroberfläche.</p>
<p><strong>Download: <a href="http://dev.xscheme.de/wp-content/uploads/2009/07/serienjunkiesgml.exe">http://dev.xscheme.de/wp-content/uploads/2009/07/serienjunkiesgml.exe</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/07/serienjunkies-gml/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Und dann machte es &#8220;Bing&#8221;!</title>
		<link>http://dev.xscheme.de/2009/06/und-dann-machte-es-bing/</link>
		<comments>http://dev.xscheme.de/2009/06/und-dann-machte-es-bing/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 15:37:07 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=763</guid>
		<description><![CDATA[Ich muss zugeben, ein großer Teil meiner Festplatte wird von Microsoft-Programmen eingenommen: Ich verwende Word zum Schreiben von Briefen, Excel zum tabellarischen Aufbereiten von Daten, Visual C# Express Edition zum Programmieren,  diverse Hilfsprogramme und nicht zu vergessen dieses winzige Konstrukt namens Windows Vista&#8230;.
Aber alles, was mit Internet zu tun hat, kommt von anderen Herstellern: Firefox [...]]]></description>
			<content:encoded><![CDATA[<p>Ich muss zugeben, ein großer Teil meiner Festplatte wird von Microsoft-Programmen eingenommen: Ich verwende Word zum Schreiben von Briefen, Excel zum tabellarischen Aufbereiten von Daten, Visual C# Express Edition zum Programmieren,  diverse Hilfsprogramme und nicht zu vergessen dieses winzige Konstrukt namens Windows Vista&#8230;.</p>
<p>Aber alles, was mit Internet zu tun hat, kommt von anderen Herstellern: Firefox statt IE, Thunderbird statt Outlook,  ICQ statt dem Windows Live Messenger &#8211; und nicht zuletzt Google statt&#8230; Ja, statt was eigentlich?</p>
<p><span id="more-763"></span></p>
<p>So wird es womöglich vielen Usern gehen: man kennt nur Google. Ich suche ein Restaurant: Google. Ich will wissen, wie ich am besten zum TÜV komme: Google. Ich brauche Statistiken zu Google: Google. Die Ergebnisse sind nicht immer die besten (wenn auch meistens besser als sonstwo), aber diese sechs Buchstaben sind so unglaublich fest ins Bewusstsein der Internetnutzer gebrannt, dass jeder, der sich &#8220;daneben brennen&#8221; will, einen wirklich schweren Stand hat.</p>
<p>Und dann machte es <a href="http://www.bing.com">Bing</a>. Microsofts neue Suchmaschine &#8211; ich muss es zugeben &#8211; hat schon etwas für sich. (Böse Zungen behaupten, ihre anfängliche Popularität schulde sie v.a. der <a href="http://www.windowsblog.at/post/2009/06/01/BING-e28093-Gute-Videosuche-e28093-NOT-SAFE-FOR-WORK.aspx">&#8220;Video&#8221;</a>-Suche&#8230;)</p>
<p>Allein optisch gesehen: So sind beispielsweise die Hintergrundbilder der Startseite sehr gut gewählt und würden sich wohl durchaus für so manchen Desktop eignen. Nach Eingabe eines Suchbegriffs und Starten der Suche erhält man eine (Google-ähnliche) Ergebnisseite, deren einzelne Elemente nach Relevanz geordnet sind. Einen diesbezüglichen Vergleich mit Google kann ich zu diesem Zeitpunkt noch nicht machen, die Funktion <strong>Related Searches</strong>, die thematisch ähnliche Suchvorgänge vorschläft,  scheint mir dem Konkurrenten (endlich einmal, möchte man fast sagen!) einen Schritt voraus zu sein.</p>
<p>Eine weitere Innovation ist die <strong>Videosuche</strong>. Ohne Bing verlassen zu müssen, kann man sich Videos ansehen, sogar die Suchergebnisse selbst sind verkleinerte, vollständig abspielbare Clips! In den USA findet man über Bing sogar auf einfachste Weise ganze Episoden von z.B. &#8220;Dr. House&#8221; oder &#8220;Navy CIS&#8221;.</p>
<p><strong>Bing Maps</strong> wiederum kommt mir schneller vor als sein Google-Pendant. Außerdem bietet es die Möglichkeit der Vogelperspektive (z.B. des <a href="http://www.bing.com/maps/default.aspx?v=2&amp;FORM=LMLTCP&amp;cp=s48xd6h5r218&amp;style=b&amp;lvl=1&amp;tilt=-90&amp;dir=0&amp;alt=-1000&amp;phx=0&amp;phy=0&amp;phscl=1&amp;scene=42566760&amp;where1=Eiffel%20Tower&amp;encType=1">Eiffelturms</a>), was ich bei Google-Maps bisher auch noch nicht entdeckt habe.</p>
<p>Ich denke, ein paar Prozent Marktanteil kann Microsoft mit Bing wohl gewinnen, aber der große Angriff auf Google wird letztlich nicht stattfinden. Dafür lässt sich der Otto-Normal-User zu schwer von seinen Gewohnheiten abbringen. Mir gefällt es jedenfalls!</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/06/und-dann-machte-es-bing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zwischenstand: Universal Version Description (UVD) / Entwickler gesucht</title>
		<link>http://dev.xscheme.de/2009/05/zwischenstand-universal-version-description-uvd-entwickler-gesucht/</link>
		<comments>http://dev.xscheme.de/2009/05/zwischenstand-universal-version-description-uvd-entwickler-gesucht/#comments</comments>
		<pubDate>Wed, 13 May 2009 14:17:12 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Batch]]></category>
		<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Fundstücke]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Lapicon]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Theorie]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=755</guid>
		<description><![CDATA[Ich möchte an dieser Stelle einmal auf den aktuellen Stand des hier begonnenen Projekts verweisen, der sich wie folgt darstellt: Ich habe das UVD-Format weiter ausgearbeitet und angepasst und damit begonnen, eine C#-Bibliothek zu schreiben, die dessen Verarbeitung dient.
Als Beispiel sei die UVD von LastSharp gegeben, die wir im folgenden Codebeispiel mithilfe einer XSL-Transformation (DescriptionPage.xsl) [...]]]></description>
			<content:encoded><![CDATA[<p>Ich möchte an dieser Stelle einmal auf den aktuellen Stand des <a href="http://dev.xscheme.de/2009/05/universal-version-description-uvd/">hier</a> begonnenen Projekts verweisen, der sich wie folgt darstellt: Ich habe das UVD-Format weiter ausgearbeitet und angepasst und damit begonnen, eine C#-Bibliothek zu schreiben, die dessen Verarbeitung dient.</p>
<p>Als Beispiel sei die <a href="http://dev.xscheme.de/uvd/lastsharp.uvd.xml">UVD von LastSharp</a> gegeben, die wir im folgenden Codebeispiel mithilfe einer XSL-Transformation (<a href="http://dev.xscheme.de/uvd/DescriptionPage.xsl">DescriptionPage.xsl</a>) in eine HTML-Datei verwandeln. Das soll illustrieren, wie einfach die Verwendung von UVD sein kann, wenn entsprechende Bibliotheken vorhanden sind:</p>
<pre class="c-sharp:collapse" name="code">UVD lastsharp = UVD.Create("http://dev.xscheme.de/uvd/lastsharp.uvd.xml");
lastsharp.Save("c:/lastsharp.htm", "http://dev.xscheme.de/uvd/DescriptionPage.xsl");</pre>
<p>Nun haben wir eine Datei &#8220;lastsharp.htm&#8221;, die <a href="http://dev.xscheme.de/uvd/lastsharp.htm">hier</a> eingesehen werden kann und Beschreibungen in verschiedenen Sprachen und Längen bietet, Downloadlinks, etc&#8230; Außerdem sind (wie man bei der Ansicht des Quelltextes feststellen kann) auch die META-Tags zu Schlüsselwörtern und Beschreibungen bereits gesetzt, sodass die Seite auch für Suchmaschinen verwendbar ist.</p>
<p><span id="more-755"></span>Das UVD-Objekt (s. Code) bietet noch weitere Möglichkeiten, aber ich möchte nun auf den Update-Mechanismus zu sprechen kommen, den man mithilfe von UVD implementieren kann. Eine UVD kann einen Verweis auf die vorhergehende Version, sowie Informationen zum inkrementellen Update (lösche Datei X, aktualisiere Datei Y, &#8230;) enthalten, sodass man durch Untersuchen der Versionsgeschichte jede Version auf den neuesten Stand bringen kann.</p>
<p>Wir verwenden die folgenden (sinnlosen) Dateien zur Demonstration: <a href="http://dev.xscheme.de/uvd/updatetest1.xml">Version 1.2</a> &gt;&gt; <a href="http://dev.xscheme.de/uvd/updatetest2.xml">Version 1.1</a> &gt;&gt; <a href="http://dev.xscheme.de/uvd/updatetest3.xml">Version 1.0</a>. Mithilfe der UVDs läuft ein Update von Version 1.0 auf 1.2 folgendermaßen ab:</p>
<ol>
<li>Extrahiere aus der UVD zu Version 1.2 die URL zu Version 1.1!</li>
<li>Speichere die Update-Informationen in der UVD zu Version 1.1!</li>
<li>Führe nacheinander die Update-Schritte (1.0 &gt;&gt; 1.1) und (1.1 &gt;&gt; 1.2) aus!</li>
</ol>
<p>Die Bibliothek, an der ich gerade arbeite, verwendet hierfür sog. Update-Profile, die festlegen, welche Sprache und welches Betriebssystem für das Update berücksichtigt werden soll. Code:</p>
<pre class="c-sharp:collapse" name="code">UVD version12 = UVD.Create("http://dev.xscheme.de/uvd/updatetest1.xml");
UVDVersion currentVs = new UVDVersion(1, 0); // aktuelle Version
UpdateProfile profile = new UpdateProfile(); // OS und Sprache egal
Update u = profile.CreateUpdate(currentVs, version12);
foreach(UpdateSegment s in u)
{
    Console.WriteLine(s.ToString());
}
u.Execute("c:/program/"); // Programmverzeichnis muss angegeben werden!</pre>
<p>Das liefert folgende Ausgabe:</p>
<pre>[Add: file3.txt] http://www.download.de
[Execute: file3.txt]
[Remove: file4.txt]
[Add: file1.txt] http://www.download.de
[Update: file2.txt] http://www.download.de
[Execute: file3.txt]</pre>
<p>Anschließend werden genau diese Schritte ausgeführt. Bei der Erstellung des Updates wird im übrigen mehr oder weniger intelligent vorgegangen: wenn eine Datei in Version 1.2 gelöscht wird, wird sie in Version 1.1 gar nicht erst hinzugefügt. Und warum eine Datei hinzufügen, wenn sie irgendwann später überschrieben wird? Dieses Verhalten lässt sich über das Update-Profil festlegen. Wenn deaktiviert, lautet die Ausgabe:</p>
<pre><span style="text-decoration: underline;">[Add: file4.txt] http://www.download.de</span>
<span style="text-decoration: underline;">[Add: file2.txt] http://www.download.de</span>
[Add: file3.txt] http://www.download.de
[Execute: file3.txt]
<span style="text-decoration: underline;">[Remove: file4.txt]</span>
[Add: file1.txt] http://www.download.de
<span style="text-decoration: underline;">[Update: file2.txt] http://www.download.de</span>
[Execute: file3.txt]</pre>
<p>Soviel dazu. Was jetzt noch wichtig ist, ist die Übertragung der Bibliothek auf andere Programmiersprachen. <strong>Deswegen suche ich Entwickler, die mit mir gemeinsam UVD auf Java, PHP, etc&#8230; portieren.</strong> Bei Interesse einfach eine E-Mail schreiben an <a href="mailto:Yannick_Scherer@gmx.net">Yannick_Scherer@gmx.net</a>! Aber man sollte sich bewusst sein, dass das einiges an Arbeit bedeutet.</p>
<p>Mehr habe ich vorerst nicht vorzuweisen&#8230; Außer vielleicht das ultimative &#8220;einzeilige&#8221; Update (mit einer sinnvollen Datei funktioniert es dann auch&#8230;):</p>
<pre class="c-sharp:collapse" name="code">new UpdateProfile()
       .CreateUpdate(new UVDVersion(1, 0), UVD.Create("http://dev.xscheme.de/uvd/updatetest1.xml"))
       .Execute("c:/program/");</pre>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/05/zwischenstand-universal-version-description-uvd-entwickler-gesucht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inside Last.FM: Visual Radio</title>
		<link>http://dev.xscheme.de/2009/05/lastfm-visual-radio/</link>
		<comments>http://dev.xscheme.de/2009/05/lastfm-visual-radio/#comments</comments>
		<pubDate>Wed, 06 May 2009 21:23:01 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=739</guid>
		<description><![CDATA[Seit heute präsentiert sich das Radio von Last.FM in neuem Gewand &#8211; und ich muss sagen, ich bin beeindruckt! Visual Radio heißt das klingende Schlagwort (siehe Last.HQ) und woher der Name kommt, ist nicht schwer zu erraten, sind es doch bei der ersten genaueren Untersuchung vor allem Oberflächlichkeiten, die sich einem entgegenrecken:

Ein größeres Eingabefeld, die [...]]]></description>
			<content:encoded><![CDATA[<p>Seit heute präsentiert sich das <a href="http://www.last.fm/listen">Radio</a> von Last.FM in neuem Gewand &#8211; und ich muss sagen, ich bin beeindruckt! <strong>Visual Radio</strong> heißt das klingende Schlagwort (siehe <a href="http://blog.last.fm/2009/05/06/lastfm-visual-radio">Last.HQ</a>) und woher der Name kommt, ist nicht schwer zu erraten, sind es doch bei der ersten genaueren Untersuchung vor allem Oberflächlichkeiten, die sich einem entgegenrecken:</p>
<p style="text-align: center;"><img class="size-full wp-image-740 aligncenter" style="border: 1px solid #dddddd; padding: 0.5em;" title="nulastfm1" src="http://dev.xscheme.de/wp-content/uploads/2009/05/nulastfm1.png" alt="nulastfm1" width="600" height="365" /></p>
<p style="text-align: left;">Ein größeres Eingabefeld, die zuletzt gehörten Radiostationen &#8211; war das alles?</p>
<p style="text-align: left;"><span id="more-739"></span>War es nicht, wie ein Klick auf das Play-Symbol zeigt. Denn nun wird zum einen das gewünschte gespielt, zum anderen läuft eine <strong>Diashow</strong> mit Bildern der Band / des Interpreten (überlagert von einem Anzeigetafel-Effekt) im Hintergrund ab, die durchaus Eindruck macht:</p>
<p style="text-align: center;"><img class="size-full wp-image-741 aligncenter" style="border: 1px solid #dddddd; padding: 0.5em;" title="nulastfm2" src="http://dev.xscheme.de/wp-content/uploads/2009/05/nulastfm2.png" alt="nulastfm2" width="578" height="500" /></p>
<p style="text-align: left;">Und scrollt man ein wenig nach unten, sieht man eine <a href="http://lastgraph.aeracode.org/">lastgraph</a>-ähnliche Grafik, die einem sagt, wann und wie oft man den entsprechenden Titel gespielt hat:</p>
<p style="text-align: center;"><img class="size-full wp-image-742 aligncenter" style="border: 1px solid #dddddd; padding: 0.5em;" title="nulastfm3" src="http://dev.xscheme.de/wp-content/uploads/2009/05/nulastfm3.png" alt="nulastfm3" width="281" height="157" /></p>
<p style="text-align: left;">(<a href="http://lastgraph.aeracode.org/">lastgraph</a> ist übrigens auch etwas, was sich jeder Last.FM-Nutzer, der seine musikalische Vergangenheit ergründen will, einmal ansehen sollte &#8211; aber das nur am Rande.)</p>
<p style="text-align: left;">Das kosmetische ist zwar ganz nett, aber davon hat man als User nicht unbedingt etwas. Das dachten sich wohl auch die Last.FM-Entwickler und haben noch eins draufgelegt: <strong>Multi-Tag- und Multi-Artist-Radios</strong>!</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-743" style="border: 1px solid #dddddd; padding: 0.5em;" title="nulastfm4" src="http://dev.xscheme.de/wp-content/uploads/2009/05/nulastfm4.png" alt="nulastfm4" width="565" height="157" /></p>
<p style="text-align: left;">Ab sofort ist es möglich, im Player auf der Last.FM-Seite nach einem Klick auf einen der obigen Buttons <strong>bis zu drei Interpreten oder Tags</strong> einzutragen, die alle in die Zusammenstellung der Playlist miteinfließen. Das eröffnet einige neue Möglichkeiten, allerdings sollte man laut <a href="http://blog.last.fm/2009/05/06/lastfm-visual-radio">Last.HQ</a> nicht darauf vertrauen, dass auch jede Kombination genug Daten für eine abspielbare Radiostation ergibt.</p>
<p style="text-align: left;">Mein erster Eindruck ist durchaus positiv: das Aussehen macht einiges her (der Nutzen wiederum ist bei den meisten optischen Neuerungen eher gering), und auch die Möglichkeit, mehrere Interpreten und Tags anzugeben, klingt vielversprechend. Soll heißen: ich werde jetzt erstmal Radio hören!</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/05/lastfm-visual-radio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vom Gedankenspiel zum Versuch: Universal Version Description (UVD)</title>
		<link>http://dev.xscheme.de/2009/05/universal-version-description-uvd/</link>
		<comments>http://dev.xscheme.de/2009/05/universal-version-description-uvd/#comments</comments>
		<pubDate>Fri, 01 May 2009 22:24:43 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Theorie]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[pad]]></category>
		<category><![CDATA[portable application description]]></category>
		<category><![CDATA[universal version description]]></category>
		<category><![CDATA[update check]]></category>
		<category><![CDATA[uvd]]></category>
		<category><![CDATA[version check]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=713</guid>
		<description><![CDATA[Das Problem der Updates
Ich bin in meinem vorletzten Artikel zum Thema Update-Check bereits darauf eingegangen: Versionsänderungen sind nicht immer leicht zu verfolgen und die Überprüfung auf Updates erfordert meist einen nicht zu unterschätzenden Programmier- und Verwaltungsaufwand. Weiterhin bedeutet es für den Entwickler selbst auch, dass er auf mehreren Hochzeiten tanzen muss: er stellt meist eine [...]]]></description>
			<content:encoded><![CDATA[<h2>Das Problem der Updates</h2>
<p>Ich bin in meinem <a href="http://dev.xscheme.de/2009/04/gedankenspiel-update-notification-server/">vorletzten Artikel zum Thema Update-Check</a> bereits darauf eingegangen: Versionsänderungen sind nicht immer leicht zu verfolgen und die Überprüfung auf Updates erfordert meist einen nicht zu unterschätzenden Programmier- und Verwaltungsaufwand. Weiterhin bedeutet es für den Entwickler selbst auch, dass er auf mehreren Hochzeiten tanzen muss: er stellt meist eine eigene Downloadseite bereit, die Links zu verschiedenen Versionen enthält, er aktualisiert gleichzeitig die Dateien, die für die Versionsüberprüfung zuständig sind, er kümmert sich um die Daten, die in irgendwelchen Softwareverzeichnissen (heise, chip.de, etc&#8230;) stehen, usw., usw&#8230; Als verantwortungsvoller Entwickler mit der Ambition, sein Programm unter die Leute zu bringen, hat man richtiggehend die Pflicht, diese Schritte durchzuführen &#8211; und das regelmäßig und mit äußerster Genauigkeit.</p>
<p>Hier nun also das (absolut logische und vernünftige) Konzept, das die meisten Beispiele, die man im Web zu dem Thema &#8220;Update-Check&#8221; findet, implementieren:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-715" title="Allgemeines Konzept zum Update-Check" src="http://dev.xscheme.de/wp-content/uploads/2009/05/unserver.png" alt="Allgemeines Konzept zum Update-Check" width="600" height="300" /></p>
<p>Augenscheinliche Probleme hierbei:</p>
<ul>
<li> Die Verwaltung der Programmdaten läuft (beim Otto-Normal-Programmierer) meist von Hand ab, d.h. man bearbeitet die Update-Datei (die nicht, wie im Beispiel, im XML-Format vorliegen kann), lädt sie von Hand auf den <em>eigenen</em> Webserver und ist aus Kompatibilitätsgründen meist an ein (demnach schwer erweiterbares) Format und an einen bestimmten Dateinamen gebunden.</li>
<li>Je nachdem, wie detailliert die Update-Informationen sind (nur Versionsnummer vs. Versionsnummer, Änderungsdatum, Changelog, &#8230;), kann das Bearbeiten der Versionsdatei eine Heidenarbeit bedeuten.</li>
<li>Der Entwickler muss das Programm erst einmal dazu bringen, einen funktionierenden Versions-Check durchzuführen.</li>
<li>Und was passiert bei Programmen, die mehrsprachig funktionieren und beworben werden?</li>
</ul>
<p>Die Idee im erwähnten Artikel war es also, den &#8220;Update Notification Server&#8221; nicht mehr als Eigentum des Entwicklers zu sehen, sondern als über ein API zugängliche Plattform im Internet, die Verwaltungsfunktionen komfortabel bereitstellt. Gleichzeitig wären verschiedene Bibliotheken für das API nötig, um dem Programmierer die Implementierung der Versionsprüfung fast gänzlich abzunehmen.</p>
<p>Was folgte, war ein Einspruch.</p>
<p><span id="more-713"></span></p>
<p>Es sei nicht garantierbar, dass der verantwortliche zentrale Server auch in zwei Jahren noch erreichbar sein würde, wurde argumentiert. Man könne das bei einem eigenen Server viel eher kontrollieren &#8211; und außerdem habe heutzutage ohnehin jeder Entwickler zumindest ein bisschen Webspace.</p>
<p>Dem kann man nicht widersprechen. Zwar würde eine zentrale Plattform den Komfort steigern, allerdings unvermeidbar auch das Risiko. Was also tun?</p>
<h2>Unvereinbarkeit</h2>
<p>Ein großes Problem bei den vielen Versionsprüfungsimplementierungen (was für ein Wort!) im Web ist die Unvereinbarkeit. Die meisten basieren auf verschiedenen Dateiformaten, die wiederum unterschiedlichen Informationsgehalt bieten. Eine reine Textdatei mit der Versionsnummer mag dem <a href="http://www.aeroxp.org/board/index.php?showtopic=11508">einen</a> reichen, der <a href="http://themech.net/2008/05/adding-check-for-update-option-in-csharp/">andere</a> benötigt aber vllt. auch schon den Downloadlink für die aktuelle Version dazu. Oder gar den Namen des Programms und Zusatzmeldungen. <a href="http://beta.unclassified.de/code/dotnet/updatecheck/">Kann passieren</a>.</p>
<p>Wenn einem schließlich keine der Lösungen des World Wide Webs zusagt, dann bleibt nichts anderes zu tun, als eine bestehende Lösung anzupassen. Oder <em>from scratch</em>, also komplett neu zu beginnen. Das wiederum kostet Zeit und Energie, Schweiß und Kaffee, von den Nerven gar nicht erst zu sprechen. Was also tun? (Zweimal haben wir uns das jetzt schon gefragt!)</p>
<p>Eine Lösung, die es allen recht macht, wird es vermutlich nie geben, aber das heißt nicht, dass man nicht versuchen darf, in ihre Nähe zu kommen. Was benötigt wird, ist ein <strong>standardisiertes Dateiformat für Softwarebeschreibungen</strong>.</p>
<h2>Standards</h2>
<p>Es gibt so etwas bereits unter dem Namen <strong>Portable Application Description (PAD)</strong>, nachzulesen beispielsweise in <a href="http://de.wikipedia.org/wiki/Portable_Application_Description">Wikipedia</a> oder der <a href="http://www.asp-shareware.org/pad/">Association of Shareware  Professionals</a>, anzusehen u.a. <a href="http://download.agilita.de/pad_file.xml">hier</a>. Der Vorteil: das <em>ist</em> in der Tat ein Standard; der Nachteil: er wurde für den Vertrieb von <a href="http://de.wikipedia.org/wiki/Shareware">Shareware</a> entworfen. Außerdem wird ein alternatives XML-Namensraumkonzept verwendet, was sich für einen solchen Standard meiner Meinung nach nicht gehört.</p>
<p><img class="alignright size-full wp-image-717" style="margin-left: 1em; margin-bottom: 0.5em;" title="Portable Application Description" src="http://dev.xscheme.de/wp-content/uploads/2009/05/pad.png" alt="Portable Application Description" width="300" height="310" />Aber ganz allgemein hat das Format in meinen Augen signifikante Schwächen:</p>
<ul>
<li>Erweiterbarkeit: Man darf genau <em>einen</em> Screenshot angeben, <em>eine</em> Informations-URL, usw&#8230;</li>
<li>Es findet keine Unterscheidung nach unterstützen Betriebsystemen statt. Angenommen, es gäbe einen Installer, der das Programm auf den neueren Windows-Versionen einrichtet, sowie einen, der es sogar auf Windows 95 zum Laufen bringt: PAD bietet keine Möglichkeit, diese Dateien zu unterscheiden bzw. überhaupt erst vernünftig gemeinsam anzubieten.</li>
<li>Wir leben in einer multilingualen Welt. Die meisten Programme sind für mehrere Sprachen ausgelegt, doch würde man versuchen, Informations/Download-URLs nach Sprache anzubieten, würde man an PAD absolut <em>insane</em> werden.</li>
<li>Überhaupt fehlt so etwas wie Hinweise auf Support im Web in PAD. Man kann Telefonnummern angeben, aber das Leben und die Lebenshilfe findet heutzutage nun einmal zu größeren Teilen im Internet statt als noch früher. Und E-Mail-Adressen bedeuten bloß Wartezeit.</li>
<li>Man kann in PAD genau einen Entwickler angeben. Was macht man bei heutzutage weit verbreiteten Entwickler-Teams?</li>
<li>Das Format hat eine Struktur, die das Verständnis manchmal erschwert. Aber es wird ja von Computern verarbeitet, also ist das akzeptabel. Andererseits: auch Suchmaschinencrawler sind Computerprogramme, und PAD (ein Standard!) wird von denen so gut wie ignoriert!</li>
<li>Was Nutzer oftmals interessiert, ist die Entwicklung eines Programms: Was gibt es neues? Was wurde entfernt, was verbessert?</li>
</ul>
<p>Es ist vielleicht etwas hochgegriffen, aber für die Softwarebeschreibung der heutigen Zeit muss ein neuer Standard erarbeitet werden. Und hier wird aus dem Gedankenspiel der Versuch.</p>
<h2>Was macht Software aus?</h2>
<p>Um welche Punkte müsste sich ein neues Format kümmern, was sind seine Prämissen und Ziele? Und was genau will ich eigentlich? Ein Brainstorming:</p>
<ul>
<li>Sprachenunterstützung</li>
<li>Änderungsverfolgung</li>
<li>Autorenliste</li>
<li>Firmenkontaktdaten</li>
<li>Lizenzinformationen</li>
<li>Suchmaschinen-Metadaten</li>
<li>Installationsanweisungen</li>
<li>Abhängigkeiten: Was brauche ich, damit das Programm läuft?</li>
<li>Einfacher Zugang zu Support-Quellen (Foren, Anleitungen, FAQ)</li>
</ul>
<p>Es entwickelt sich vor meinem inneren Auge also langsam eine XML-Struktur, die das alles mit sich bringt: <strong>XML Application Description (XAD)</strong>, veranschaulicht durch ein <a href="http://dev.xscheme.de/xad/lastsharp.xad.xml">Beispiel</a> (Rechtsklick &gt;&gt; Quelltext), das verwendete <a href="http://dev.xscheme.de/xad/xad.xsl">XSLT-Stylesheet</a> und die <a href="http://dev.xscheme.de/xad/xad.dtd">DTD</a> (das Dokument ist <a href="http://www.validome.org/grammar/validate/?lang=ge&amp;viewSourceCode=1&amp;grammarTyp=DTD&amp;url=http://dev.xscheme.de/xad/xad.dtd">valide</a>, ich weiß nicht, warum Firefox und der IE da rumspinnen).</p>
<h2>Ein Gedanke</h2>
<p>Dann kam mir ein Gedanke: <strong>nicht nur Programme</strong> unterliegen Änderungen, auch Dokumente, Filme, Serien lassen sich einem Versionskonzept unterordnen. Zwei Beispiele: die FAZ vom 30.04.2009 könnte ebensogut die Versionsnummer 2009.119 (der 30.04. ist der 119. Tag des Jahres 2009) tragen, und die Special Extended Edition von &#8220;Herr der Ringe: Die zwei Türme&#8221; könnte auch &#8220;Herr der Ringe 2.1&#8243; heißen (wenn man keinen Wert auf Gewinn legen würde). Mit ein wenig Phantasie überträgt man das ganze auf Autos, CPUs, kurz gesagt: alles, was sich irgendwie als bildlicher <strong>Entwicklungsstrom</strong> darstellen lässt.</p>
<p style="text-align: center;"><img class="size-full wp-image-718 aligncenter" title="strom" src="http://dev.xscheme.de/wp-content/uploads/2009/05/strom.png" alt="strom" width="550" height="230" /></p>
<p>Wichtig hierbei ist die Möglichkeit, stets auf die früheren Versionen eines Objektes zugreifen zu können, weil im Idealfall Verweise auf diese vorhanden sind.</p>
<p>Wenn man also das oben erwähnte Format weiterentwickelt, verallgemeinert und anpasst, dann hat man ein mächtiges Werkzeug für weit mehr als bloß Software. Und hier wären wir.</p>
<h2>Universal Version Description (UVD)</h2>
<p>Da die Verwendung nicht mehr nur auf Programme beschränkt ist, ist es wichtig, anzugeben, was genau in einem Dokument beschrieben wird. Die Nomenklatur hierfür wäre idealerweise etwas wie &#8220;Kategories:Unterkategorie&#8221; oder &#8220;Kategorie&#8221; allein. Beispiele:</p>
<ul>
<li>media:tv-episode</li>
<li>software:utility</li>
<li>paper:specification</li>
<li>paper:mathematics</li>
<li>&#8230;</li>
</ul>
<p>Folgendes wäre ein Beispiel für das kleinstmögliche UVD-Dokument:</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE uvd SYSTEM "http://dev.xscheme.de/uvd/uvd-1.dtd"&gt;
&lt;uvd version="1.0.0" type="software:audio"&gt;
  &lt;general&gt;
    &lt;name&gt;WinAmp&lt;/name&gt;
  &lt;/general&gt;
&lt;/uvd&gt;</pre>
<p>Nicht sehr aussagekräftig, aber jetzt bauen wir noch Informations-Links (in verschiedenen Sprachen), sowie Beschreibungstexte (in verschiedenen Sprachen und Längen; die unterstützen Längenangaben sind 100, 255, 2000 und &#8220;any&#8221;) ein:</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE uvd SYSTEM "http://dev.xscheme.de/uvd/uvd-1.dtd"&gt;
&lt;uvd version="1.0.0" type="software:audio"&gt;
  &lt;general&gt;
    &lt;name&gt;WinAmp&lt;/name&gt;
    &lt;urls&gt;
      &lt;url lang="en"&gt;http://www.winamp.com/&lt;/url&gt;
      &lt;url lang="de"&gt;http://de.winamp.com/&lt;/url&gt;
    &lt;/urls&gt;
    &lt;descriptions&gt;
      &lt;description lang="en" maxlength="255"&gt;
        WinAmp is a multimedia player, supporting (...)
      &lt;/description&gt;
      ...
    &lt;/descriptions&gt;
  &lt;/general&gt;
&lt;/uvd&gt;</pre>
<p>Deutsch und Englisch vorhanden, alles andere beliebig nachtragbar. Weitere Informationen wären: Lizenz, Keywords, Screenshots, etc&#8230;Anschließend könnte in einem neuen Abschnitt &#8220;release&#8221; die aktuelle Version (inkl. Downloadlinks nach Sprache und OS) beschrieben, in &#8220;contributors&#8221; alle Beteiligten aufgelistet und in &#8220;company&#8221; Informationen zum Firmenkontakt bereitgestellt werden.</p>
<p>Eine komplette Dokumentation des Formats würde den Rahmen aber noch mehr sprengen, deswegen wird hier auf die folgenden Dokumente verwiesen:</p>
<ul>
<li>&#8220;Spezifikation&#8221; zu UVD: <a href="http://dev.xscheme.de/uvd/Universal%20Version%20Description.txt">http://dev.xscheme.de/uvd/Universal%20Version%20Description.txt</a></li>
<li>DTD: <a href="http://dev.xscheme.de/uvd/uvd-1.dtd">http://dev.xscheme.de/uvd/uvd-1.dtd</a> (<a href="http://www.validome.org/grammar/validate/?lang=ge&amp;viewSourceCode=1&amp;grammarTyp=DTD&amp;url=http://dev.xscheme.de/uvd/uvd-1.dtd">Validate</a>)</li>
<li>Beispiele:
<ul>
<li><a href="http://dev.xscheme.de/uvd/release-example.uvd.xml">Programm-Release</a></li>
<li><a href="http://dev.xscheme.de/uvd/writer-example.uvd.xml">Dokument</a></li>
<li><a href="http://dev.xscheme.de/uvd/episode-example.uvd.xml">TV-Episode</a></li>
</ul>
</li>
</ul>
<h2>Fazit</h2>
<p>Meistens ist der eigene Blick von Selbstherrlichkeit getrübt, wenn man etwas in den eigenen Augen neues und tolles geschaffen hat. Deswegen brauche ich Meinungen hierzu.</p>
<p>Um das anfangs erwähnte Argument noch einmal aufzugreifen, man könne seinen eigenen Webspace besser kontrollieren, will ich hier erwähnen, dass ein UVD-Dokument natürlich überall liegen kann. Was bisher fehlt, sind Programme zur Verwaltung und Erstellung, sowie Bibliotheken zur Verarbeitung.</p>
<p>Vielleicht überschätze ich auch den Nutzen des ganzen. Kein Grund allerdings, den Stein nicht ins Rollen zu bringen.</p>
<h2>Update (02.05.2009)</h2>
<p>Ich will an dieser Stelle noch demonstrieren, wie sich das Format für einfache Versionsprüfung, sowie Update-Verarbeitung eignet.</p>
<p>Für einen normalen Versionscheck würde schon so etwas reichen:</p>
<pre class="xml:collapse" name="code">&lt;uvd version="1.0.0" type="software:ripper"&gt;
  &lt;general&gt;
    &lt;name&gt;LastSharp&lt;/name&gt;
  &lt;/general&gt;
  &lt;release&gt;
    &lt;date&gt;
      &lt;day&gt;20&lt;/day&gt;
      &lt;month&gt;4&lt;/month&gt;
      &lt;year&gt;2009&lt;/year&gt;
    &lt;/date&gt;
    &lt;version&gt;
      &lt;major&gt;0&lt;/major&gt;
      &lt;minor&gt;4&lt;/minor&gt;
      &lt;build&gt;1&lt;/build&gt;
    &lt;/version&gt;
  &lt;/release&gt;
&lt;/uvd&gt;</pre>
<p>Und folgende Datei könnte von einem Updater automatisch verarbeitet werden:</p>
<pre class="xml:collapse" name="code">&lt;uvd version="1.0.0" type="software:ripper"&gt;
  &lt;general&gt;
    &lt;name&gt;LastSharp&lt;/name&gt;
  &lt;/general&gt;
  &lt;release&gt;
    &lt;date&gt;
      &lt;day&gt;20&lt;/day&gt;
      &lt;month&gt;4&lt;/month&gt;
      &lt;year&gt;2009&lt;/year&gt;
    &lt;/date&gt;
    &lt;version&gt;
      &lt;major&gt;0&lt;/major&gt;
      &lt;minor&gt;4&lt;/minor&gt;
      &lt;build&gt;1&lt;/build&gt;
    &lt;/version&gt;
    &lt;files&gt;
      &lt;file name="LastUtility" os="any" type="lib" filename="LastUtility.dll"
            update-action="update" update-path=".inc" direct-download="no"&gt;
        &lt;urls&gt;
          &lt;url lang="all"&gt;http://download.server.tld/LastUtility.dll&lt;/url&gt;
        &lt;/urls&gt;
      &lt;/file&gt;
      &lt;file name="LastSharpExe" os="any" type="exe" filename="LastSharp.exe"
            update-action="update" direct-download="no"&gt;
        &lt;urls&gt;
          &lt;url lang="all"&gt;http://download.server.tld/LastSharp.exe&lt;/url&gt;
        &lt;/urls&gt;
      &lt;/file&gt;
      &lt;file name="SettingsFile" os="any" type="xml" filename="settings.xml"
            update-action="remove" /&gt;
      &lt;file name="LastSharpFull" os="any" type="package" filename="LastSharp041.zip"
            update-action="ignore"&gt;
        &lt;urls&gt;
          &lt;url lang="all"&gt;http://download.server.tld/LastSharp041.zip&lt;/url&gt;
        &lt;/urls&gt;
        &lt;descriptions&gt;
          &lt;description lang="de" maxlength="any"&gt;
            Das vollständige Paket mit allen Dateien von LastSharp 0.4.1.
          &lt;/description&gt;
        &lt;/descriptions&gt;
      &lt;/file&gt;
    &lt;/files&gt;
  &lt;/release&gt;
&lt;/uvd&gt;</pre>
<p>Wenn man genau hinsieht, erkennt man die Anweisungen an den Updater:</p>
<ol>
<li>Lade die Datei &#8220;LastUtility.dll&#8221; von der angegebenen URL herunter und überschreibe ihre Entsprechung im Unterverzeichnis &#8220;.inc&#8221;.</li>
<li>Tue dasselbe mit der Datei &#8220;LastSharp.exe&#8221;, allerdings diesmal im Hauptverzeichnis. (&#8220;update-path&#8221; fehlt)</li>
<li>Lösche die Datei &#8220;settings.xml&#8221; im Hauptverzeichnis.</li>
</ol>
<p>Der letzte &#8220;file&#8221;-Eintrag enthält das Gesamtpaket, das beim automatischen Update ignoriert wird. (&#8220;update-action=&#8217;ignore&#8217;&#8221;) Gleichzeitig wird es aber dem User im Gegensatz zu den Dateien zuvor direkt zugänglich gemacht. (&#8220;direct-download=&#8217;no&#8217;&#8221; soll verhindern, dass evtl. Clients die so markierten Links dem User zeigen)</p>
<p>Wenn man jetzt bedenkt, dass ein wichtiger Punkt von UVD die Verlinkung mit den früheren Versionen ist (Der &#8220;release&#8221;-Tag bietet das Attribut &#8220;previous&#8221;, das auf das entsprechende UVD-Dokument verlinkt!), sieht man schnell, dass man mit diesem Format <strong>jede beliebige</strong> Version aktualisieren kann, wenn man sich in der Versionsgeschichte &#8220;zurückhangelt&#8221;.</p>
<p>Ich hoffe, diese kleine Demonstration hat noch einmal verdeutlicht, worin ich u.a. den Nutzen des Formats sehe.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/05/universal-version-description-uvd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gedankenspiel: Update Notification Server</title>
		<link>http://dev.xscheme.de/2009/04/gedankenspiel-update-notification-server/</link>
		<comments>http://dev.xscheme.de/2009/04/gedankenspiel-update-notification-server/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 15:19:05 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Theorie]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=708</guid>
		<description><![CDATA[Wenn man als Programmierer dafür sorgen will, dass jeder User auch stets die aktuellste Version des eigenen Programms verwendet, kommt man nicht umhin, einen Mechanismus einzubauen, der nach neuen Updates sucht. Im Normalfall entscheidet man sich für jenen:
- Stelle eine Verbindung zu einer Internetseite her, welche die Nummer der aktuellsten Version enthält.
- Vergleiche mit der [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man als Programmierer dafür sorgen will, dass jeder User auch stets die aktuellste Version des eigenen Programms verwendet, kommt man nicht umhin, einen Mechanismus einzubauen, der nach neuen Updates sucht. Im Normalfall entscheidet man sich für jenen:</p>
<p>- Stelle eine Verbindung zu einer Internetseite her, welche die Nummer der aktuellsten Version enthält.<br />
- Vergleiche mit der eigenen Version.<br />
- Zeige eine Benachrichtigung, falls die Server-Version neuer ist.</p>
<p>So macht das LastSharp mit der URL <a href="http://dev.xscheme.de/vls.htm">http://dev.xscheme.de/vls.htm</a>. Nachteile: das Bearbeiten der Informationen, das von Hand (Textdatei erstellen, schreiben, FTP-Upload) geschehen muss, sowie die Notwendigkeit, entsprechenden Webspace zu besitzen.</p>
<p>Jetzt kam mir also eine (wirklich simple) Idee, wie man das vereinfachen und somit vielen Programmierern helfen könnte.</p>
<p><span id="more-708"></span>Man lagert das ganze auf eine eigene Website aus, auf der sich User anmelden können. Jeder Programmierer trägt seine Programme ein und deren aktuelle Version, Release Notes, das ChangeLog, die DownloadURL, etc&#8230; Anschließend werden diese Informationen über ein API zugänglich gemacht.</p>
<p>Jetzt fehlt nur noch die Implementierung der API-Funktionen für verschiedene Programmiersprachen und Plattformen, und voilà: Update-Benachrichtung ganz einfach. Für den Programmierer hat das nur Vorteile:</p>
<ul>
<li>eine weitere Website, auf der sein Programm erscheint,</li>
<li>kein großer, zusätzlicher Programmieraufwand,</li>
<li>zentrale, komfortable Verwaltung,</li>
<li>keine Notwendigkeit, auf den FTP-Server zuzugreifen (bzw. dessen Zugangsdaten weiterzugeben),</li>
<li>&#8230; (?)</li>
</ul>
<p>War nur ein Gedankenspiel. Ich habe auch keine Ahnung, ob es sowas schon gibt. (Ich bezweifle es aber mal, weil meine Google-Suche zu dem Thema eher erfolglos war.) Im Moment bringe ich mir Ruby On Rails bei, was für so ein Projekt wohl eine ideale Grundlage wäre. Und vielleicht gibt es dann wirklich irgendwann einen &#8220;Update Notification Server&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/04/gedankenspiel-update-notification-server/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Der große, rote Knopf &#8211; NICHT DRÜCKEN!</title>
		<link>http://dev.xscheme.de/2009/04/der-grose-rote-knopf/</link>
		<comments>http://dev.xscheme.de/2009/04/der-grose-rote-knopf/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 19:52:47 +0000</pubDate>
		<dc:creator>xsc</dc:creator>
				<category><![CDATA[Fundstücke]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=704</guid>
		<description><![CDATA[Der grundlegendste Beweis für die menschliche Unvollkommenheit ist doch letztendlich, dass man, wenn irgendwo groß, dick, deutlich lesbar Auf keinen Fall machen!!! draufsteht, sofort in einen inneren Monolog/Dialog verfällt, der in etwa so abläuft:
Soll ich?
Nein. Das steht da nicht ohne Grund.
Aber&#8230;
Kein Aber.
Was wohl passiert?
Schlimme Sachen. Schonmal von Tschernobyl gehört?
Ach, ein klein bisschen&#8230;
Denk nicht mal dran!!
Was [...]]]></description>
			<content:encoded><![CDATA[<p>Der grundlegendste Beweis für die menschliche Unvollkommenheit ist doch letztendlich, dass man, wenn irgendwo groß, dick, deutlich lesbar <strong>Auf keinen Fall machen!!! </strong>draufsteht, sofort in einen inneren Monolog/Dialog verfällt, der in etwa so abläuft:</p>
<p>Soll ich?<br />
Nein. Das steht da nicht ohne Grund.<br />
Aber&#8230;<br />
Kein Aber.<br />
Was wohl passiert?<br />
Schlimme Sachen. Schonmal von Tschernobyl gehört?<br />
Ach, ein klein bisschen&#8230;<br />
Denk nicht mal dran!!<br />
Was soll&#8217;s.<br />
<em>AUTSCH!!!</em><br />
<span id="more-704"></span><br />
Dieses Verhalten wurde nun in ein spielerisches Konzept überführt. Und zwar <a href="http://www.i-am-bored.com/bored_link.cfm?link_id=9644">hier</a>. </p>
<p>Und jetzt, genau hinhören, <strong>NICHT AUF DEN ROTEN KNOPF DRÜCKEN!</strong><br />
<object width="480" height="430" data="http://www.85qm.de/up/BigRedButton.swf" type="application/x-shockwave-flash"><param name="movie" value="http://www.85qm.de/up/BigRedButton.swf" /></object><br />
Ich gebe zu, das ist einer meiner weniger vernünftigen Beiträge. Aber zumindest hat es mir Spaß gemacht.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/04/der-grose-rote-knopf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
