<?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>blog.http.net &#187; Development</title>
	<atom:link href="http://blog.http.net/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.http.net</link>
	<description>http.net Blog</description>
	<lastBuildDate>Wed, 11 Jan 2012 22:33:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Express-DNS im Domain-Formular</title>
		<link>http://blog.http.net/domains/express-dns-im-domain-formular/</link>
		<comments>http://blog.http.net/domains/express-dns-im-domain-formular/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 14:56:46 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Domain-Services]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[Partnerweb]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=802</guid>
		<description><![CDATA[Um die Wartezeit auf das neue Partnerweb zu verkürzen, hat unsere Development-Task-Force sich vorgenommen, im alten Partnerweb noch ein paar Verbesserungen vorzunehmen, bevor es in den verdienten Ruhestand gehen kann. Hierzu zählt die bereits versprochene Einbindung des beliebten Domain-DNS-Kombi-Templates zur gleichzeitigen Domain- und DNS-Verwaltung in das Domain-Bestellformular. Damit kann man nun gleichzeitig konnektieren und registrieren [...]]]></description>
			<content:encoded><![CDATA[<p>Um die Wartezeit auf das neue Partnerweb zu verkürzen, hat unsere Development-Task-Force sich vorgenommen, im alten Partnerweb noch ein paar Verbesserungen vorzunehmen, bevor es in den verdienten Ruhestand gehen kann. Hierzu zählt die bereits versprochene Einbindung des beliebten <a href="http://blog.http.net/domains/domain-robot-meets-dns/">Domain-DNS-Kombi-Templates</a> zur gleichzeitigen Domain- und DNS-Verwaltung in das Domain-Bestellformular. Damit kann man nun <em>gleichzeitig konnektieren und registrieren</em> oder die Domain zusammen mit den Nameservern updaten, was bisher nur bei DE-Domains mit <a href="http://www.denic.de/hintergrund/nameservice/nameserver-und-nsentry-eintraege.html" target="_blank">NSentries</a> möglich war.</p>
<h2 style="font-size: 1em;">Ein Beispiel Schritt für Schritt</h2>
<p>Nehmen wir an, eine DE-Domain soll registriert werden. Im Bestellformular wählt man zunächst Domainnamen und Auftragsart:</p>
<p><a rel="attachment wp-att-790" href="http://blog.http.net/domains/domain-robot-meets-dns-via-partnerweb/attachment/step1/"><img title="Express-DNS Schritt 1" src="http://blog.http.net/wp-content/uploads/2011/11/step1-600x105.png" alt="Express-DNS Schritt 1" width="600" height="105" /></a></p>
<p>Im nächsten Schritt werden die Kontakt-Handles ausgewählt oder erstellt. Das ist nichts Neues und wird hier nicht besprochen. Als nächstes ist die <strong>Delegation</strong> für die Domain anzugeben. Damit teilt man der Registry mit, welche Nameserver für die Domain zuständig sein sollen. Bei einer DE-Domain hat man hier folgende Möglichkeiten:</p>
<ol>
<li>Eigene Nameserver</li>
<li>Nameserver der http.net</li>
<li>Nameserver der DENIC (NSentries)</li>
</ol>
<p><a rel="attachment wp-att-791" href="http://blog.http.net/domains/domain-robot-meets-dns-via-partnerweb/attachment/step2/"><img title="Express-DNS Schritt 2" src="http://blog.http.net/wp-content/uploads/2011/11/step2-600x194.png" alt="Express-DNS Schritt 2" width="600" height="194" /></a></p>
<p>Wenn man eigene Nameserver verwendet, muss man selbst für die Eintragung einer geeigneten DNS-Zone auf den angegebenen Nameservern sorgen. Wenn man NSentries verwendet, kann man ein paar Resource-Records angeben, die DENIC zusammen mit der Domain einträgt. Wenn Sie unsere Nameserver benutzen, so mussten Sie bisher separat einen Auftrag an unseren DNS-Robot generieren, um die Zone dort einzutragen.</p>
<p><strong>Neu:</strong> Wenn Sie unsere Nameserver verwenden, können jetzt gleichzeitig einen Auftrag an den DNS-Robot generieren, so dass zuerst die Zone eingetragen wird. Ganz analog zu NSentries können Sie also hier direkt einige wichtige Resource-Records für die Domain angeben. Das gilt natürlich nicht nur für DE-Domains, sondern für beliebige TLDs. Aktivieren Sie die Checkbox <em>&#8220;Zonendaten eintragen&#8221;</em> um das Formular zu erweitern:</p>
<p><a rel="attachment wp-att-792" href="http://blog.http.net/domains/express-dns-im-domain-formular/attachment/step3/"><img title="Express-DNS Schritt 3" src="http://blog.http.net/wp-content/uploads/2011/11/step3-600x111.png" alt="Express-DNS Schritt 3" width="600" height="111" /></a></p>
<p>Die Syntax der Express-DNS-Einträge orientiert sich an den NSentries. Sie können bis zu 6 Address- und Mail-Exchange-Records eintragen. Wie es geht, sollte schnell klar werden, wenn Sie auf <em>&#8220;Beispiel anzeigen&#8221;</em> klicken. Dann wird passend zum Domainnamen ein Standard-Beispiel generiert:</p>
<p><a rel="attachment wp-att-794" href="http://blog.http.net/domains/express-dns-im-domain-formular/attachment/step5/"><img title="Express-DNS Schritt 4" src="http://blog.http.net/wp-content/uploads/2011/11/step5-600x208.png" alt="Express-DNS Schritt 4" width="600" height="208" /></a></p>
<p>Benutzen Sie die Beispiel-Daten als Vorlage für Ihre eigenen Einträge. Wenn Sie beim Klick auf <em>&#8220;weiter&#8221;</em> die Checkbox</p>
<blockquote><p>Die Angaben auf dieser Seite als Standardwerte speichern.</p></blockquote>
<p>aktiviert haben, werden Ihre Express-DNS-Einträge als Vorlage gespeichert und bei der nächsten Benutzung des Formulars mit dem jeweiligen Domainnamen geladen, so dass Sie Ihre Standard-Konfiguration nur einmal eintragen müssen.</p>
<p>Nachdem Sie auf <em>&#8220;weiter&#8221;</em> geklickt haben, sehen Sie im letzten Schritt, in der Zusammenfassung des Auftrages, das Template, das an den Domain-Robot gesendet wird. Hier können Sie natürlich auch noch Änderungen vornehmen, wenn Ihr Auftrag spezielle Zusatzangaben erfordert oder Sie etwas ändern möchten:</p>
<p><a rel="attachment wp-att-796" href="http://blog.http.net/domains/express-dns-im-domain-formular/attachment/step7/"><img title="Express-DNS Schritt 7" src="http://blog.http.net/wp-content/uploads/2011/11/step7-600x220.png" alt="Express-DNS Schritt 7" width="600" height="220" /></a></p>
<p>Wenn Sie die Express-DNS-Option verwendet haben, sehen Sie hier ein <a href="http://blog.http.net/domains/domain-robot-meets-dns/">Kombi-Template</a>. Der Domain-Robot sendet den DNS-Teil solcher Templates zunächst an den DNS-Robot und verarbeitet den Domain-Teil zwei bis drei Minuten später, um sicherzustellen, dass die Zone zuerst eingetragen wird, falls dies für den Domain-Auftrag erforderlich ist.</p>
<h2 style="font-size: 1em;">Feedback erwünscht!</h2>
<p>Wie bei all unseren Innovationen gilt auch hier: Wir haben versucht, aus Ihren Anregungen, unserer Erfahrung und den technischen Möglichkeiten das aus unserer Sicht Beste zu machen. Am liebsten möchten wir aber das Beste aus der Sicht unserer Partner realisieren. Deshalb: Ideen, Anregungen, Verrisse &#8211; alles erwünscht! <img src='http://blog.http.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/domains/express-dns-im-domain-formular/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Danke für C!</title>
		<link>http://blog.http.net/development/danke-fur-c/</link>
		<comments>http://blog.http.net/development/danke-fur-c/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 08:04:48 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=684</guid>
		<description><![CDATA[When I read commentary about suggestions for where C should go, I often think back and give thanks that it wasn&#8217;t developed under the advice of a worldwide crowd. Dennis Ritchie hat sich unsterblich gemacht.]]></description>
			<content:encoded><![CDATA[<p><img src="http://upload.wikimedia.org/wikipedia/commons/0/01/Dennis_MacAlistair_Ritchie_.jpg" alt="Dennis Ritchie" /></p>
<blockquote><p>
When I read commentary about suggestions for where C should go, I often think back and give thanks that it wasn&#8217;t developed under the advice of a worldwide crowd.
</p></blockquote>
<p>
<a target="_blank" href="http://www.cs.bell-labs.com/who/dmr/">Dennis Ritchie</a> hat sich unsterblich gemacht.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/development/danke-fur-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Domain-Robot meets DNS</title>
		<link>http://blog.http.net/domains/domain-robot-meets-dns/</link>
		<comments>http://blog.http.net/domains/domain-robot-meets-dns/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 15:03:34 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Domain-Services]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=612</guid>
		<description><![CDATA[Die http.net arbeitet ja ständig an der Verbesserung ihrer Schnittstellen. Und immer, wenn das Wetter uns nicht an den Strand lockt (oder die Getränke Supportanfragen ausgegangen sind), dann sitzen wir natürlich im Büro und überlegen, wie wir unseren Partnern ihre Arbeit noch weiter erleichtern können. Ja, so sind wir Heute haben wir uns mal den [...]]]></description>
			<content:encoded><![CDATA[<p>Die http.net arbeitet ja ständig an der Verbesserung ihrer Schnittstellen. Und immer, wenn das Wetter uns nicht an den Strand lockt (oder die <del datetime="2011-08-24T14:45:29+00:00">Getränke</del> Supportanfragen ausgegangen sind), dann sitzen wir natürlich im Büro und überlegen, wie wir unseren Partnern ihre Arbeit noch weiter erleichtern können. Ja, so sind wir <img src='http://blog.http.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Heute haben wir uns mal den Robot vorgenommen und haben gedacht: wie wär&#8217;s mit einem kleinen Hack!</p>
<p>Warum sollte man nicht einfach bei einem Domain-Template auch ein DNS-Template mit senden können? Eine bessere Verknüpfung der Komponenten war schließlich auch in den <a href="http://blog.http.net/allgemein/wer-viel-fragt-bekommt-viel-antwort/">Kommentaren zur Umfrage</a> gefordert worden. Was das Partnerweb und andere Schnittstellen betrifft, wird das ein wenig aufwändiger werden, aber beim SMTP-Robot ist die Lösung eigentlich ganz einfach. Schreiben wir doch mal auf, was wir haben wollen:</p>
<blockquote><p><code><br />
From:      support@example.com<br />
To:        domreg@routing.net<br />
Subject:   REG: name.de</p>
<p>#internal: 999999/******</p>
<p>domain:    name.de<br />
owner-c:   TEST1-HTTP<br />
admin-c:   TEST2-HTTP<br />
tech-c:    TEST3-HTTP<br />
zone-c:    TEST4-HTTP<br />
nserver:   ns.routing.net<br />
nserver:   ns8.routing.net</p>
<p>dnszone:   name.de<br />
primary:   ns.routing.net<br />
mailbox:   dnsmaster@example.com<br />
namesrv:   ns.routing.net 213.160.64.64<br />
namesrv:   ns8.routing.net 213.160.65.64<br />
arecord:   @ 213.160.69.3<br />
crecord:   www @<br />
</code></p></blockquote>
<p>So, jetzt muss man dem Robot nur noch sagen, dass er zuerst den unteren Teil an seinen Kollegen, den DNS-Robot, weitergeben und dann den ersten Teil selbst verarbeiten soll. Fertig <img src='http://blog.http.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Also, Spaß beiseite. Folgendes gilt ab sofort:</p>
<p>An das Ende eines Domreg-Templates kann man ein DNS-Template hängen, das mit der Zeile</p>
<blockquote><p><code><br />
dnszone: &lt;domain&gt;<br />
</code></p></blockquote>
<p>(anstelle der <em>domain</em>-Zeile) beginnt. Daraus werden zwei separate Aufträge erzeugt, nämlich ein DNS-Template, das sofort an den den DNS-Robot übergeben wird, und ein Domain-Template, das etwa 2 bis 3 Minuten später an den Domreg-Robot gesendet wird, um sicherzustellen, dass die Zone zuerst eingetragen wird, falls dies für den Domain-Auftrag erforderlich ist. </p>
<p>Bei <em>REG</em>- und <em>KK</em>-Aufträgen an den Domreg-Robot wird ein <em>REG</em>-Auftrag für den DNS-Robot erzeugt, <em>CLOSE</em>- und <em>TRANSIT</em>-Aufträge kann man mit einem DNS-<em>CLOSE</em> verbinden und einem Domain-<em>UPDATE</em> kann man ein DNS-<em>UPDATE</em> anhängen. For Robot-Templates ohne <code>dnszone</code>-Schlüssel ändert sich natürlich nichts.</p>
<p>Einfach mal ausprobieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/domains/domain-robot-meets-dns/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>etwas backorder background</title>
		<link>http://blog.http.net/domains/etwas-backorder-background/</link>
		<comments>http://blog.http.net/domains/etwas-backorder-background/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 08:22:57 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Domain-Services]]></category>
		<category><![CDATA[backorder]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Landrush]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=524</guid>
		<description><![CDATA[Backordern ist eine sportliche Angelegenheit. Es läuft ungefähr so: Jede Nacht holen wir uns von der Registry die Liste mit den Domains ab, die 5 Tage später freigegeben werden. Das sind jeden Tag so an die 80.000 Namen, von denen 99.99% vollkommen uninteressant sind (adultentertainermedicals.com, &#8230;). Ein paar wenige schöne Namen sind aber oft dabei, [...]]]></description>
			<content:encoded><![CDATA[<p>Backordern ist eine sportliche Angelegenheit. Es läuft ungefähr so:</p>
<p>Jede Nacht holen wir uns von der Registry die Liste mit den Domains ab, die 5 Tage später freigegeben werden. Das sind jeden Tag so an die 80.000 Namen, von denen 99.99% vollkommen uninteressant sind (<em>adultentertainermedicals.com</em>, &#8230;). Ein paar wenige schöne Namen sind aber oft dabei, so etwa verteilt wie die vierblättrigen Kleeblätter auf einer Kuhwiese.</p>
<p>Unser neuer Suchagent <em>(powered by: <a href="http://blog.http.net/author/emonninger/">EM</a></em>) bietet die Möglichkeit, auf einen bestimmten Namen zu warten oder sich über freiwerdende Namen, die einem gegebenen Muster entsprechen, täglich informieren zu lassen. Jedenfalls, sobald die Domains in unserer Datenbank stehen, können sie bestellt werden.</p>
<p>Am Stichtag um 2 Uhr PM EST fängt die Registry an, die Domains freizugeben. Das zieht sich so 2 Stunden hin und es kommt darauf an, derjenige zu sein, der in genau der Millisekunde einen Auftrag für die Domain sendet, in der sie frei wird. In diesem weltweiten Bonbonregen treten jeden Tag Hunderte von Registraren an, Grabber und Snapper, die Giganten der Branche und neuerdings auch ein <a href="http://www.http.net/" target="_blank">ambitionierter Berliner Provider</a>.</p>
<p>Also, hier sind schon Ellenbogen gefragt. Unser Client läuft momentan in 4 Instanzen auf 2 Servern mit jeweils 5 bis 10 Threads, je nach Auftragsmenge. Jeder Thread öffnet in dem relevanten Zeitfenster eine persistente TCP-Session und sendet für die bestellten Domains 3 bis 4 REG-Aufträge pro Sekunde ab, bis entweder die Domain registriert oder die Zeit um ist. In der Praxis ist damit insgesamt ein durchschnittliches Intervall von ca. 20-30 Aufträgen pro Sekunde zu erreichen. Die Aufgabe ist nicht völlig trivial, da die Registry mehrere Pools  unterschiedlicher Priorität mit jeweils einer begrenzten Anzahl  paralleler Connections zur Verfügung stellt, von denen ein Teil für den Normalbetrieb garantiert sein muss.</p>
<p>Meistens klappt&#8217;s auch, aber leider nicht immer. Testläufe haben etwa eine Erfolgsquote von gefühlt 80% bei einigermaßen interessanten Namen ergeben. Statistische Aussagen dieser Art sind jedoch so schwierig wie die Frage nach dem Wert eines Domainnamens. Das ist also ein schönes Hobby, und den Programmierern kann endlich nicht mehr nachgesagt werden, zu wenig Sport zu treiben&#8230; <img src='http://blog.http.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/domains/etwas-backorder-background/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wir kennen das sicherlich alle:</title>
		<link>http://blog.http.net/code/wir-kennen-das-sicherlich-alle/</link>
		<comments>http://blog.http.net/code/wir-kennen-das-sicherlich-alle/#comments</comments>
		<pubDate>Wed, 18 May 2011 11:50:11 +0000</pubDate>
		<dc:creator>Edith Monninger</dc:creator>
				<category><![CDATA[Code-Schnipsel]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[http.net-API]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Soap]]></category>
		<category><![CDATA[SUDS]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=453</guid>
		<description><![CDATA[Es gibt da eine SOAP-Schnittstelle, mit der man unbedingt etwas klären muss. Menschen haben es da etwas schwerer als Rechner. Also dann, man nehme sich kurzerhand einen solchen (Computer) und entscheide, welche Sprache man heute sprechen möchte. Heute, was bei mir eigentlich gestern war, fiel die Wahl auf Python. Zum Schreiben eines SOAP-Clients bietet sich [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt da eine SOAP-Schnittstelle, mit der man unbedingt etwas klären muss.<br />
Menschen haben es da etwas schwerer als Rechner.</p>
<p>Also dann, man nehme sich kurzerhand einen solchen (Computer) und entscheide, welche Sprache man heute sprechen möchte. Heute, was bei mir eigentlich gestern war, fiel die Wahl auf Python.</p>
<p>Zum Schreiben eines SOAP-Clients bietet sich nach kurzer Befragung des Internet der Inhaber eines äußerst themengerechten, netten Logos an: <a href="https://fedorahosted.org/suds/">SUDS</a></p>
<p>Alles ist etwas simpler, als es am Anfang scheint, nicht umsonst ist der erste Satz auf der offiziellen Seite dieses Frameworks, ich zitiere:</p>
<blockquote><p>„Suds is a lightweight SOAP python client for consuming Web Services.“</p></blockquote>
<p>Nicht wesentlich unterhalb dieses Satzes gelangt man auf eine nette <a href="https://fedorahosted.org/suds/wiki/Documentation">&#8220;Getting Started&#8221;-Doku</a>, die eigentlich alles enthält, was man sich für solch einen Einstieg erwünscht.<br />
Erst einmal importiert man das Framework, oder, in diesem Fall, noch etwas weniger.</p>
<p><code>from suds.client import Client</code></p>
<p>Anschließend bastelt man sich einen solchen Client und gibt ihm auch gleich die Adresse des Servers.</p>
<p><code>client = Client('https://test/foo.bar/service.asmx?WSDL')</code></p>
<p>Solch ein Server hat sehr genaue Vorstellungen von Gesprächen, daher wird er uns genau sagen, was er in welcher Form gesagt bekommen möchte. Möchte man sich das anschauen, bietet es sich an mit</p>
<p><code>print client</code></p>
<p>einen Blick auf diese Anforderungen zu werfen.</p>
<p>Gehen wir nun davon aus, dass wir eine Methode benutzen wollen, die neben einem ganz normalen String auch noch einen<del></del> komplexen Typ verlangt, eine Authentifizierung. Diese validiert die Berechtigung des Fragestellers mittels zweier Strings, dem Benutzernamen und dem Passwort. Da unser Client den Typ schon kennt, suchen auch wir uns dessen vordefinierten Namen. (Wichtig: Es geht explizit um die Anforderung des Servers, nicht um Typen die Teil von SUDS oder Python wären!)</p>
<p>Nehmen wir an, sein Name ist „AuthData“ und er beinhaltet die beiden Strings „username“ und „password“</p>
<p><code>auth = client.factory.create('AuthData')</code></p>
<p>bewirkt, dass eine Variable des Types AuthData nach den Spezifikationen des Servers erstellt wird.</p>
<p>Mit <code>auth.username = 'admin'</code> und <code>auth.password = 'geheim'</code><br />
<em>(Beispiel für unsichere Zugangsdaten)</em></p>
<p>werden die Werte gefüllt.</p>
<p>Die Antwort des Servers wird erst zwischengespeichert</p>
<p><code>result = client.service.HalloServer(auth, 'Hallo')</code></p>
<p>und dann zum Beispiel mit einem</p>
<p><code>print result</code></p>
<p>ausgegeben. Fertig liest sich das dann:</p>
<p><code>from suds.client import Client<br />
client = Client('https://test/foo.bar/service.asmx?WSDL')<br />
auth = client.factory.create('AuthData')<br />
auth.username = 'admin'<br />
auth.password = 'geheim'<br />
result = client.service.HalloServer(auth, 'Guten Morgen')<br />
print result</code></p>
<p>Wer wissen möchte, wie so etwas realistisch in Bezug auf die http.net API aussehen würde, kann das Beispiel demnächst auch als Python-Sampleclient auf der <a href="https://api.http.net/1.1/domreg/demo/">API Dokuseite</a> wiederfinden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/code/wir-kennen-das-sicherlich-alle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Klassen mal anders</title>
		<link>http://blog.http.net/code/klassen-mal-anders/</link>
		<comments>http://blog.http.net/code/klassen-mal-anders/#comments</comments>
		<pubDate>Mon, 06 Dec 2010 09:07:23 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Code-Schnipsel]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=395</guid>
		<description><![CDATA[Hier wieder eine kleine Aufgabe für unsere Azubis.]]></description>
			<content:encoded><![CDATA[<p>Hier wieder eine kleine Aufgabe für unsere Azubis.</p>
<pre style="background:#eee"><code>
function A(p) {
   this.f = function(n) {
     return this[n] || (this[n] = p(this.f(n-1),this.f(n-2)))
   }
}

function B(p) {
   A.call(this,p);
   for (var i = 0; (this[i] = B.arguments[++i]); ); }

B.prototype = new A;

function f(n) {
   return (new B(function(x,y){return(x+y)},1,1)).f(n);
}

</code></pre>
<ol>
<li>Was ist <code>f(17)</code>?</li>
<li>Welche Programmiersprache ist das?</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/code/klassen-mal-anders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gnu Libidn EsZett Hotfix</title>
		<link>http://blog.http.net/code/gnu-libidn-eszett-hotfix/</link>
		<comments>http://blog.http.net/code/gnu-libidn-eszett-hotfix/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 16:11:35 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Code-Schnipsel]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Denic]]></category>
		<category><![CDATA[internationale Domains]]></category>
		<category><![CDATA[Libidn]]></category>
		<category><![CDATA[ß-Domains]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=367</guid>
		<description><![CDATA[Dies ist kein Update der Libidn auf IDNA2008. Ziel ist es, mit einfachen Mitteln das IDNA2003-Mapping von Codepoints der Kategorie PVALID (RFC 5892), insbesondere also des "ß" (U+00DF; LATIN SMALL LETTER SHARP S), bei Bedarf unterdrücken zu können. Ausgangspunkt ist die Erfordernis, kurzfristig Domainnamen mit "ß" innerhalb der DE-Zone verabeiten zu können.]]></description>
			<content:encoded><![CDATA[<p><strong>Dies ist kein Update der Libidn auf IDNA2008.</strong> Ziel ist es, mit einfachen Mitteln das IDNA2003-Mapping von Codepoints der Kategorie <code>PVALID</code> (RFC 5892), insbesondere also des &quot;&szlig;&quot; (<code>U+00DF; LATIN SMALL LETTER SHARP S</code>), bei Bedarf unterdrücken zu können. Ausgangspunkt ist die Erfordernis, kurzfristig <a href="http://blog.http.net/allgemein/lokalisiert-das-kleine-eszett-im-world-wide-web/">Domainnamen mit &quot;&szlig;&quot;</a> innerhalb der DE-Zone verabeiten zu können.</p>
<p>Die Änderungen werden hier nur für die C#-Version in <a href="http://ftp.gnu.org/gnu/libidn/" target="_blank">libidn-1.9</a> erwähnt und sind ggf. auf andere Sprachen oder Versionen zu übertragen.</p>
<p>Ziel ist es, die Funktionen <code>ToAscii</code> und <code>ToUnicode</code> um einen Parameter <code>bool useIDNA2008</code> zu erweitern, der die Wirkung hat, dass <code>PVALID</code> Codepoints vom Mapping ausgenommen werden.</p>
<p>(1) Hinzufügen einer Klasse IDNA2008, die alle <code>PVALID</code> Codepoints enthält:</p>
<pre style="background:#eee"><code>
  // IDNA2008.cs
  namespace Gnu.Inet.Encoding {
    class IDNA2008
    {
      // rfc5892 PVALID codepoints
      public static char[] PVALID = new char[] {
        '\u00DF', // LATIN SMALL LETTER SHARP S
        '\u03C2', // GREEK SMALL LETTER FINAL SIGMA
        '\u06FD', // ARABIC SIGN SINDHI AMPERSAND
        '\u06FE', // ARABIC SIGN SINDHI POSTPOSITION ME
        '\u0F0B', // TIBETAN MARK INTERSYLLABIC TSHEG
        '\u3007'  // IDEOGRAPHIC NUMBER ZERO
      };
    }
  }
</code></pre>
<p>(2) Überladen der Funktion <code>Map</code> (Stringprep.cs) mit einem dritten Parameter, der zu ignorierende Codepoints bezeichnet:</p>
<pre style="background:#eee"><code>
  internal static void Map(StringBuilder s, char[] search, string[] replace, <span style="color:red">char[] ignore</span>)
  {
    for (int i = 0; i < search.Length; i++)
    {
      char c = search[i];

      <span style="color:red">// check if c should be ignored
      bool ign = false;
      for (int t = 0; t < ignore.Length; t++)
      {
        if (ignore[t] == c)
        {
          ign = true;
          break;
        }
      }
      if (ign)
        continue;</span>

      int j = 0;
      while (j < s.Length)
      {
        if (c == s[j])
        {
          //s.deleteCharAt(j);
          s.Remove(j, 1);
          if (null != replace[i])
          {
            s.Insert(j, replace[i]);
            j += replace[i].Length - 1;
          }
        }
        else
        {
          j++;
        }
      }
    }
  }
</code></pre>
<p>(3) Überladen der Funktion Nameprep (Strinprep.cs) mit einem dritten Parameter <code>bool useIDNA2008</code>:</p>
<pre style="background:#eee"><code>
  public static string NamePrep(string input, bool allowUnassigned, <span style="color:red">bool useIDNA2008</span>)
  {
    if (input == null)
    {
      throw new System.NullReferenceException();
    }

    StringBuilder s = new StringBuilder(input);

    if (!allowUnassigned &#038;&#038; Contains(s, RFC3454.A1))
    {
      throw new StringprepException(StringprepException.CONTAINS_UNASSIGNED);
    }

    Filter(s, RFC3454.B1);

    // EsZett Hotfix
    if (useIDNA2008)
      <span style="color:red">Map(s, RFC3454.B2search, RFC3454.B2replace, IDNA2008.PVALID);</span>
    else
      Map(s, RFC3454.B2search, RFC3454.B2replace);

    s = new StringBuilder(NFKC.NormalizeNFKC(s.ToString()));
    // B.3 is only needed if NFKC is not used, right?
    // map(s, RFC3454.B3search, RFC3454.B3replace);

    if (Contains(s, RFC3454.C12) || Contains(s, RFC3454.C22) || Contains(s, RFC3454.C3) || Contains(s, RFC3454.C4) || Contains(s, RFC3454.C5) || Contains(s, RFC3454.C6) || Contains(s, RFC3454.C7) || Contains(s, RFC3454.C8))
    {
      // Table C.9 only contains code points > 0xFFFF which Java
      // doesn't handle
      throw new StringprepException(StringprepException.CONTAINS_PROHIBITED);
    }

    // Bidi handling
    bool r = Contains(s, RFC3454.D1);
    bool l = Contains(s, RFC3454.D2);

    // RFC 3454, section 6, requirement 1: already handled above (table C.8)

    // RFC 3454, section 6, requirement 2
    if (r &#038;&#038; l)
    {
      throw new StringprepException(StringprepException.BIDI_BOTHRAL);
    }

    // RFC 3454, section 6, requirement 3
    if (r)
    {
      if (!Contains(s[0], RFC3454.D1) || !Contains(s[s.Length - 1], RFC3454.D1))
      {
        throw new StringprepException(StringprepException.BIDI_LTRAL);
      }
    }

    return s.ToString();
  }
</code></pre>
<p>(4) Überladen der Funktionen <code>ToAscii</code> und <code>ToUnicode</code> (IDNA.cs), um den Parameter<br />
<code>bool useIDNA2008</code> an <code>Nameprep</code> durchzureichen:</p>
<pre style="background:#eee"><code>
  public static string ToASCII(string input, bool allowUnassigned, bool useSTD3ASCIIRules, <span style="color:red">bool useIDNA2008</span>)
  {
    // Step 1: Check if the string contains code points outside
    //         the ASCII range 0..0x7c.

    bool nonASCII = false;

    for (int i = 0; i < input.Length; i++)
    {
      int c = input[i];
      if (c > 0x7f)
      {
        nonASCII = true;
        break;
      }
    }

    // Step 2: Perform the nameprep operation.

    if (nonASCII)
    {
      try
      {
        input = Stringprep.NamePrep(input, allowUnassigned, <span style="color:red">useIDNA2008</span>);
      }
      catch (StringprepException e)
      {
        // TODO
        throw new IDNAException(e);
      }
    }

    // Step 3: - Verify the absence of non-LDH ASCII code points
    //    (char) 0..0x2c, 0x2e..0x2f, 0x3a..0x40, 0x5b..0x60,
    //    (char) 0x7b..0x7f
    //         - Verify the absence of leading and trailing
    //           hyphen-minus

    if (useSTD3ASCIIRules)
    {
      for (int i = 0; i < input.Length; i++)
      {
        int c = input[i];
        if ((c <= 0x2c) || (c >= 0x2e &#038;&#038; c <= 0x2f) || (c >= 0x3a &#038;&#038; c <= 0x40) || (c >= 0x5b &#038;&#038; c <= 0x60) || (c >= 0x7b &#038;&#038; c <= 0x7f))
        {
          throw new IDNAException(IDNAException.CONTAINS_NON_LDH);
        }
      }

      if (input.StartsWith("-") || input.EndsWith("-"))
      {
        throw new IDNAException(IDNAException.CONTAINS_HYPHEN);
      }
    }

    // Step 4: If all code points are inside 0..0x7f, skip to step 8

    nonASCII = false;

    for (int i = 0; i < input.Length; i++)
    {
      int c = input[i];
      if (c > 0x7f)
      {
        nonASCII = true;
        break;
      }
    }

    string output = input;

    if (nonASCII)
    {

      // Step 5: Verify that the sequence does not begin with the ACE prefix.

      if (input.StartsWith(ACE_PREFIX))
      {
        throw new IDNAException(IDNAException.CONTAINS_ACE_PREFIX);
      }

      // Step 6: Punycode

      try
      {
        output = Punycode.Encode(input);
      }
      catch (PunycodeException e)
      {
        // TODO
        throw new IDNAException(e);
      }

      // Step 7: Prepend the ACE prefix.

      output = ACE_PREFIX + output;
    }

    // Step 8: Check that the length is inside 1..63.

    if (output.Length < 1 || output.Length > 63)
    {
      throw new IDNAException(IDNAException.TOO_LONG);
    }

    return output;
  }

  public static string ToUnicode(string input, bool allowUnassigned, bool useSTD3ASCIIRules, <span style="color:red">bool useIDNA2008</span>)
  {
    string original = input;
    bool nonASCII = false;

    // Step 1: If all code points are inside 0..0x7f, skip to step 3.

    for (int i = 0; i < input.Length; i++)
    {
      int c = input[i];
      if (c > 0x7f)
      {
        nonASCII = true;
        break;
      }
    }

    // Step 2: Perform the Nameprep operation.

    if (nonASCII)
    {
      try
      {
        input = Stringprep.NamePrep(input, allowUnassigned, <span style="color:red">useIDNA2008</span>);
      }
      catch (StringprepException e)
      {
        // ToUnicode never fails!
        return original;
      }
    }

    // Step 3: Verify the sequence starts with the ACE prefix.

    if (!input.StartsWith(ACE_PREFIX))
    {
      // ToUnicode never fails!
      return original;
    }

    string stored = input;

    // Step 4: Remove the ACE prefix.

    input = input.Substring(ACE_PREFIX.Length);

    // Step 5: Decode using punycode

    string output;

    try
    {
      output = Punycode.Decode(input);
    }
    catch (PunycodeException e)
    {
      // ToUnicode never fails!
      return original;
    }

    // Step 6: Apply toASCII

    string ascii;

    try
    {
      ascii = ToASCII(output, allowUnassigned, useSTD3ASCIIRules, <span style="color:red">useIDNA2008</span>);
    }
    catch (IDNAException e)
    {
      // ToUnicode never fails!
      return original;
    }

    // Step 7: Compare case-insensitively.

    if (!ascii.ToUpper().Equals(stored.ToUpper()))
    {
      // ToUnicode never fails!
      return original;
    }

    // Step 8: Return the result.

    return output;
  }
</code></pre>
<p>(5) Testen von <code>ToAscii</code> und <code>ToUnicode</code> mit und ohne Anwendung von IDNA2008:</p>
<pre style="background:#eee"><code>
  [TestMethod()]
  public void Test030_EsZett_IDNA2003()
  {

    string u1 = "täßt";

    // Nameprep IDNA2203 should send "täßt" to "tässt"
    string u2 = Stringprep.NamePrep(u1, false, false);
    Assert.AreEqual("tässt", u2);

    // ToAscii IDNA2003 should send both "täßt" and "tässt" to "xn--tsst-loa"
    string a1 = IDNA.ToASCII(u1, false, true, false);
    Assert.AreEqual("xn--tsst-loa", a1);

    string a2 = IDNA.ToASCII(u2, false, true, false);
    Assert.AreEqual(a1, a2);

    // ToUnicode IDNA2003 should send "xn--tsst-loa" to "tässt"
    string u3 = IDNA.ToUnicode(a1, false, true, false);
    Assert.AreEqual(u2, u3);

  }

  [TestMethod()]
  public void Test040_EsZett_IDNA2008()
  {

    string u1 = "täßt";

    // Nameprep IDNA2208 should send "täßt" to "täßt"
    string u2 = Stringprep.NamePrep(u1, false, true);
    Assert.AreEqual(u1, u2);

    // ToAscii IDNA2008 should send "täßt" to "xn--tt-giat"
    string a1 = IDNA.ToASCII(u1, false, true, true);
    Assert.AreEqual("xn--tt-giat", a1);

    string a2 = IDNA.ToASCII(u2, false, true, true);
    Assert.AreEqual(a1, a2);

    // ToUnicode IDNA2003 should send "xn--tt-giat.de" to "täßt"
    string u3 = IDNA.ToUnicode(a1, false, true, true);
    Assert.AreEqual(u2, u3);

  }
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/code/gnu-libidn-eszett-hotfix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lokalisiert: Das kleine EsZett im World Wide Web</title>
		<link>http://blog.http.net/allgemein/lokalisiert-das-kleine-eszett-im-world-wide-web/</link>
		<comments>http://blog.http.net/allgemein/lokalisiert-das-kleine-eszett-im-world-wide-web/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 10:51:03 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Domain-Services]]></category>
		<category><![CDATA[Denic]]></category>
		<category><![CDATA[IETF]]></category>
		<category><![CDATA[internationale Domains]]></category>
		<category><![CDATA[ß-Domains]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=307</guid>
		<description><![CDATA[Wie immer, wenn etwas immer größer und komplizierter wird, zeichnet sich ein Trend zur Lokalisierung ab. Das Internet ist ein topologischer Raum, der so hochdimensional geworden ist, dass man ihn nur noch als Überdeckung eines unfassbaren Etwas durch lokale Landkarten erklären kann. Das Kraftwerk der Globalisierung sehnt sich heute nach Semantik, sucht soziale Kontakte und [...]]]></description>
			<content:encoded><![CDATA[<p>Wie immer, wenn etwas immer größer und komplizierter wird, zeichnet sich ein Trend zur Lokalisierung ab. Das Internet ist ein topologischer Raum, der so hochdimensional geworden ist, dass man ihn nur noch als Überdeckung eines unfassbaren Etwas durch lokale Landkarten erklären kann. Das Kraftwerk der Globalisierung sehnt sich heute nach Semantik, sucht soziale Kontakte und organische Strukturen.Es möchte den Menschen nahe sein, ihre Gegend kennen und ihren Dialekt sprechen.</p>
<p>Die alten globalen und normativen Lösungen werden verfeinert und den Bedürfnissen angepasst. Zum Beispiel der IDNA-Standard. Die Intention von IDNA ist es, Abbildungen zu definieren, die eine Kommunikation zwischen den unterschiedlichen und eigenartigen Informationsspektren beliebiger lokaler Entitäten auf der Basis uralter und schwer veränderbarer Protokolle wie dem DNS-System ermöglichen.</p>
<p>Im August 2010 veröffentlichte die IETF die IDNA2008-Spezifizierungen in RFC <a target="_blank" href="http://tools.ietf.org/html/rfc5890">5890</a> &#8211; <a target="_blank" href="http://tools.ietf.org/html/rfc5894">5894</a>. Eine Übersicht über die Unterschiede zwischen IDNA2003 und IDNA2008 bietet der <a target="_blank" href="http://unicode.org/reports/tr46/">Unicode Technical Standard #46 (Unicode IDNA Compatibility Processing)</a>. Bis dahin war IDNA eine globale Funktion, im Wesentlichen bestehend aus dem Nameprep-Mapping und dem Punycode-Algorithmus, wobei Nameprep effektiv durch eine Reihe von Tabellen definiert ist, die z.B. Gro&szlig;- auf Kleinbuchstaben und &quot;&szlig;&quot; auf &#8220;ss&#8221; abbilden. Der alte Standard hatte damit die Verantwortlichkeit für die konsistente Behandlung unterschiedlicher Sprachen innhalb des IDNA-Protokolls angesiedelt. Diese Lösung war global, einfach und unflexibel.</p>
<p>Mit IDNA2008 wurde eine neue Terminolgie geschaffen, die den Anforderungen an die lokale Unterschiedlichkeit von Applikationen und Benutzern gerecht werden und die Offenheit gegenüber zukünftigen Unicode-Versionen garantieren soll. Das Eszett, namentlich der Codepoint <code>U+00DF (LATIN SMALL LETTER SHARP S)</code>, wurde auf Betreiben von DENIC als Ausnahme in die Kategorie <code>PVALID</code> (Protocol Valid) aufgenommen. Während also die deutsche Ligatur <em>&szlig;</em> in der DE-Zone nun mit <code>xn--zca</code> aufgelöst wird, kann es gleichzeitig in einer anderen Zone mit <code>ss</code> aufgelöst werden. Ein Beitrag zur Lokalisierung und zur Konjunktur bei ISPs und Anwälten.</p>
<p>Dieser Codepoint bildet nun eine <a target="_blank" href="http://unicode.org/reports/tr46/#Deviations">Deviation</a>, d.h. unterschiedliche Applikationen können ihn abweichend verarbeiten. Man stelle sich vor, Alice greift von zu Hause aus auf ihr Konto unter <em>http://www.sparkasse-gießen.de</em> zu. Ihr Browser unterstützt IDNA2003, bildet also auf <em>http://www.sparkasse-giessen.de</em> ab und löst auf die IP-Adresse des Sparkassenservers auf. Nun besucht sie ihren Freund Bob und prüft dort ihren Kontostand. Bobs Browser unterstützt IDNA2008, benutzt also bei gleicher Eingabe stattdessen <em>http://www.xn--sparkasse-gieen-2ib.de</em>, was auf eine ganz andere IP-Adresse aufgelöst werden kann. Unter dieser könnte der Phishing-Server von Eve antworten, die so die Zugangsdaten von Alice ausspionieren kann.</p>
<p>Und wenn schlie&szlig;lich der Browser am Encoding der Diskussionsbeiträge verzweifelt, so wirkt das irgendwie selbstreferenziell:</p>
<p><img src="http://blog.http.net/wp-content/uploads/2010/10/eszett1.jpg" alt="discussions on ietf.idnabis" /></p>
<p>Ãh??? <img src='http://blog.http.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Für den ISP-Developer ist Lokalisierung allerdings stets eine Herausforderung. Er ist dafür zuständig, dass die lokalen Einheiten untereinander und miteinander kommunizieren können. Und wer will sich heute schon noch in ASCII unterhalten.</p>
<p>Das kleine &quot;&szlig;&quot; landet also eines Tages auf dem Schreibtisch und erklärt sich für gültig. Natürlich wei&szlig; die an Hunderten von Stellen tief in alle Systeme eingegrabene IDNA-Software noch lange nichts von den neuen RFCs. Der .NET <code>System.Globalization</code>-Namespace, der bis dahin zuverlässige Dienste beim Normalisieren, Validieren und Konvertieren auch der absonderlichsten Zeichen leistete, ist unter keinen Umständen dazu zu bewegen, ein &quot;&szlig;&quot; in Domain-Namen zu akzeptieren. Und was so eine DLL nicht kann, das kann sie eben nicht &#8211; tja, auf hoher See, vor Gericht und vor Microsoft  &#8230;</p>
<p>Am 26. Oktober 2010 kündigte DENIC an, praktisch ab sofort IDNA2008 zu unterstützen und zunächst in einer Sunrise-Phase allen Inhabern von Domains, die ein &#8220;ss&#8221; enthalten, die Gelegenheit zu geben, das Pendant mit &quot;&szlig;&quot; zu registrieren. Es musste innherhalb von wenigen Stunden eine Ad-hoc-Lösung her. Und das einzig Naheliegende war, eine automatische Abfrage des <a target="_blank" href="http://www.denic.de/domains/internationalized-domain-names/idn-konvertierung.html">DENIC-Web-Tools</a> zu programmieren, das in dem Moment den einzigen bekannten &szlig;-fähigen Konvertierungsmechanismus bot. <a href="http://blog.http.net/author/emonninger/">Unsere Auszubildende</a> setzte das prompt um, während eilig RFCs studiert und nach einer tragfähigen Lösung gesucht wurde. Diese bietet die GNU IDN Library <a target="_blank" href="http://www.gnu.org/software/libidn/">Libidn</a>. Die kann zwar auch noch kein &quot;&szlig;&quot;, ist aber fix gepatcht. Der Code liegt in C, Java und C# vor, da ist also für jeden etwas dabei.</p>
<p><img src="http://blog.http.net/wp-content/uploads/2010/10/nameprep1.jpg" alt="LibIDN source code" /></p>
<p>Also wird http.net auch in Zukunft allen globalen Anforderungen und lokalen Bedürfnissen des Internets technisch gewachsen sein <img src='http://blog.http.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>update:<br />
<a href="http://blog.http.net/domains/gnu-libidn-eszett-hotfix/" target="_blank">Hier ist ein Hotfix für Libidn</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/allgemein/lokalisiert-das-kleine-eszett-im-world-wide-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>xn--bullshit</title>
		<link>http://blog.http.net/domains/xn-bullshit/</link>
		<comments>http://blog.http.net/domains/xn-bullshit/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 08:13:07 +0000</pubDate>
		<dc:creator>Sebastian Böthin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Domain-Services]]></category>
		<category><![CDATA[Providerhumor]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=216</guid>
		<description><![CDATA[Ich dachte zuerst, unsere Testfunktion für ACE-Strings ist buggy. Aber nein! Die spontan für ungültig gehaltene Eingabe xn--bullshit ist tatsächlich gültig. Die IDN-Form lautet: 㟰㟦㟳㟮㟬㟠 (U+37F0 U+37E6 U+37F3 U+37EE U+37EC U+37E0). Das ist bullshit in Han-chinesisch . Scheint auch noch weitgehend verfügbar zu sein, falls noch jemand einen lustigen Domainnamen sucht &#8230; Update: xn--bullshit.com und [...]]]></description>
			<content:encoded><![CDATA[<p>Ich dachte zuerst, unsere Testfunktion für <a href="http://de.wikipedia.org/wiki/Internationalizing_Domain_Names_in_Applications" target="_blank">ACE-Strings</a>  ist buggy. </p>
<p>Aber nein! Die spontan für ungültig gehaltene Eingabe <em>xn--bullshit</em> ist tatsächlich gültig. Die IDN-Form lautet: 㟰㟦㟳㟮㟬㟠 (U+37F0 U+37E6 U+37F3 U+37EE U+37EC U+37E0). Das ist bullshit in <a href="http://titus.uni-frankfurt.de/unicode/utf8site/37055.htm" target="_blank">Han-chinesisch</a> <img src='http://blog.http.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><del datetime="2010-07-05T11:39:22+00:00">Scheint auch noch weitgehend verfügbar zu sein</del>, falls noch jemand einen lustigen Domainnamen sucht &#8230; <img src='http://blog.http.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Update:<br />
<a href="http://xn--bullshit.com" target="_blank">xn--bullshit.com</a> und <a href="http://xn--bullshit.net" target="_blank">xn--bullshit.net</a> wurden jetzt erstmal registriert. Falls jemand eine überzeugende Idee hat, was man damit anfangen kann, lässt sich über eine Übernahme reden!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/domains/xn-bullshit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internet Explorer und der &#8220;div&#8221;-Tag</title>
		<link>http://blog.http.net/code/internet-explorer-und-der-div-tag/</link>
		<comments>http://blog.http.net/code/internet-explorer-und-der-div-tag/#comments</comments>
		<pubDate>Fri, 21 May 2010 13:58:32 +0000</pubDate>
		<dc:creator>Christian Bielefeldt</dc:creator>
				<category><![CDATA[Code-Schnipsel]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[Internet Explorer]]></category>

		<guid isPermaLink="false">http://blog.http.net/?p=74</guid>
		<description><![CDATA[Vor kurzem stand ich vor folgendem Szenario bei der Entwicklung mit ASP.NET MVC und JQuery: Ich hatte eine Website erstellt, die dynamisch Inhalte vom Server nachgeladen hat. Gut, werden sich jetzt einige denken, das ist doch inzwischen Standard und sollte keine Probleme bereiten. Für gewöhnlich ist dies auch so, jedoch gab es hier eine Ausnahme: den [...]]]></description>
			<content:encoded><![CDATA[<p>Vor kurzem stand ich vor folgendem Szenario bei der Entwicklung mit ASP.NET MVC und JQuery:</p>
<p>Ich hatte eine Website erstellt, die dynamisch Inhalte vom Server nachgeladen hat. Gut, werden sich jetzt einige denken, das ist doch inzwischen Standard und sollte keine Probleme bereiten. Für gewöhnlich ist dies auch so, jedoch gab es hier eine Ausnahme: den Internet Explorer.</p>
<p>Man denke sich folgenden vereinfachten Quellcodeabschnitt:</p>
<pre>&lt;input type="text" onchange="$.get("/myController/Search",
   {query :  $(this).val()},
   function (resultValue)
   { $('#result_placeholder').html(resultValue); }  /&gt;
&lt;div id="result_placeholder" /&gt;
&lt;input type="submit" value="Suche starten" /&gt;</pre>
<p>Mit eigenen Worten beschrieben: Gibt man etwas in das Textfeld ein, wird eine Anfrage mit dem Inhalt der Textbox an den Server gesendet und Resultate in das div mit der Id result_placeholder hineingeschrieben.</p>
<p>Das klappte auch wunderbar. Jedoch war daraufhin mein &#8220;Suche starten&#8221;-Knopf verschwunden und ich konnte mir nicht erklären warum. Durch eine Analyse des zur Laufzeit vorliegenden Quelltextes konnte ich dann auch sehen, dass mein Submit-Button tatsächlich nicht mehr vorhanden war. Es stellte sich mir also die Frage, wieso er im Internet Explorer verschwand und in allen anderen Browsern weiterhin vorhanden war.</p>
<p>Die Lösung des Ganzen ist relativ einfach. Anstatt <strong>&lt;div id=&#8221;result_placeholder&#8221; /&gt; </strong>schreibt man <strong>&lt;div id=&#8221;result_placeholder&#8221;&gt;&lt;/div&gt;</strong> in den Quelltext, dann wird der Inhalt richtig gesetzt und auch der &#8220;Suche starten&#8221;-Button ist weiterhin vorhanden. <img src='http://blog.http.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Edit:</p>
<blockquote><p>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd</a>&#8220;&gt;<br />
&lt;html xmlns=&#8221;<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>&#8220;&gt;</p></blockquote>
<p>Diesen DOCTYPE verwende ich bei dem oben genannten Problem. Laut W3C ist damit das Dokument als XHTML ausgezeichnet und mein &#8220;&lt;div /&gt;&#8221; standardmäßig erlaubt. In dem Zusammenhang ist auch meine Beobachtung zu betrachten.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.http.net/code/internet-explorer-und-der-div-tag/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

