Denn nun ist das Feature eingebaut und nun kann man noch schneller eine Webseite auf den übertragen und het so mehr Zeit zum Lesen.
Ich hoffe, dass der Webservice zum offline Lesen von Webseiten so noch besser zu nutzen ist und Kindle Inhaber (so wie ich) noch mehr Zeit zum Lesen haben.
Links:
web2kindle.de
Artikel: Webseiten offline auf dem Kindle lesen
Related posts:
]]>Erst habe ich ja noch gedacht, es gibt bestimmt irgendeine Option mit dem der tar Befehl das von sich aus macht, aber ich habe nichts gefunden. Das Ergebnis ist folgendes kleine Shell Script.
#!/bin/sh
# set -x
for i in `find . -name "*.tgz" -print`
do
cd `dirname $i`
tar -xvzf `basename $i`
cd -
done
Total easy und schnell gemacht. Während ich das Skript gerade laufen lasse habe ich noch Zeit einen kleinen Artikel im Blog zu schreiben und dann mache ich mich wieder daran, weiter zu entwickeln. Was es ist wird noch nicht verraten
No related posts.
]]>Auf der Arbeit muss ich PHP oft in Schutz nehmen da es in Enterprise Projekten noch nicht das Ansehen hat wie es Java aktuell hat. Aber genau die gleiche Situation habe ich schon einmal erlebt. Als Ende der 90er Jahre Java noch ganz neu war und wir alle noch mit C oder C++ programmiert haben. Damals hat das Debuggen von Pointer Arithmetik mehr Zeit benötigt, als es gut war für jedes Projekt, statt ant gab es make und Webseiten konnten mit CGI oder FastCGI in C oder sogar mit Shell Scripten umgesetzt werden. Aber das ist lange her (zum Glück). Heute hat man dank moderner Programmiersprachen und umfangreicher IDEs Möglichkeiten, die vor 10 Jahren noch nicht denkbar waren.
Doch zurück zum Thema “Java vs. PHP”.
Zum Vergleich habe ich mal mit Hilfe von Google Insights das Suchvolumen bei Google in der Kategorie Computer und Elektronik hier als Bild eingefügt. Die blaue Linie ist das Suchvolumen für den Begriff java und die rote Kurve für den Begriff PHP. Es ist deutlich zu erkennen, dass Java in Deutschland ein wesentlich höheres Suchvolumen hat als PHP.
Ganz Klarer Gewinner ist Java, doch was sagt die Kurve eigentlich aus? Denn eigentlich ist es kein Kriterium für die Auswahl der Programmiersprache, wie oft danach gegoogelt wurde. Statt dessen sollte man sich überlegen, welche Programmiersprache einen bei der Arbeit am besten unterstützt. Heute hat man einen Application-Server, Load-Balancer und so tolle Werkzeuge wie Maven, Hudson und JUnit, die einem das Leben einfacher machen. Trotzdem ist es in vielen Fällen einfacher, mal schnell ein PHP Script zu schreiben, als eine Web-Anwendung in Java zu realisieren und genau da liegt der große Vorteil der Programmiersprache PHP. PHP ist einfacher, schneller und mittlerweile auch sehr weit verbreitet bei Open Source Projekten. Die API ist sehr intuitiv zu verstehen und selbst BWL Stundenten haben im Studium Kontakt damit und kommen damit klar.
Heute ist bei so gut wie jedem Webhoster auch PHP und eine MySQL Datenbank dabei und so kann sich jeder, der einen Text-Editor bedienen kann auch eine Web Anwendung programmieren. Auch wenn es nur ein einfaches Gästebuch oder ein Counter oder sonst was ist. Genau dafür ist PHP wesentlich besser geeignet als Java.
Aber was ist mit wirklich großen Projekten, an denen mehrere Duzend Mitarbeiter über einen längeren Zeitraum entwickeln müssen? Tja, da ich leider keine Erfahrung damit habe, größere Projekte in PHP umzusetzen bin ich also auf eure Mithilfe angewiesen. Was ist eurer Meinung nach besser geeignet, ein großes Projekte umzusetzen Java oder PHP?
Related posts:
]]>Dieser kleine Bericht ist kein Tutorial oder eine Anleitung oder sowas. Es ist eher ein Roman – die Geschichte, wie ich Magento2 kennengelernt habe.
Installiert habe ich also erst mal:
1. xampp-win32-1.7.7-VC9-installer.exe
Quelle: http://dfn.dl.sourceforge.net/project/xampp/XAMPP Windows/1.7.7/xampp-win32-1.7.7-VC9-installer.exe
Weitere Informationen zu xampp unter: http://www.apachefriends.org/
2. Git-1.7.10-preview20120409.exe
Quelle: http://msysgit.googlecode.com/files/Git-1.7.10-preview20120409.exe
Informationen dazu unter: http://msysgit.github.com/
Dann habe ich das Magento2 Repository unter https://github.com/magento/magento2 geforkt und mit der Git-BASH ein lokal geclonnt.
git clone https://[email protected]/msoftware/magento2.git
Das gleiche habe ich mit dem Repository von netresearch gemacht. Erst ein fork und dann git clone (https://github.com/netresearch/jumpstorm). Hier ist aber dringend darauf zu achten, dass ein rekursives clone durchgeführt wird. Da aus dem jumpstore Repository heraus auch noch andere Repositorys benötigt werden. Z.B. die Dateien unter /lib/Symfony/Component. Das es sich hier um verknüpfte Repositories handelt, kann man unter github.con auch gut an dem kleinen grünen Icon erkennen (z.B. hier https://github.com/msoftware/jumpstorm/tree/master/lib/Symfony/Component).
Und weil es so einen Spaß macht, habe ich auch direkt mal das FIREGENTO GermanSetup Repository (https://github.com/firegento/firegento-germansetup) kopiert und auch geklont.
Ja, mir ist schon klar, dass der ganze Aufwand mit dem Forken eigentlich überflüssig ist, aber wer weiß wozu es mal gut ist. Ich glaube zwar nicht, dass ich über das reine “Mal reinschauen” hinauskomme, aber wer weiß …
So weit erst mal zur Vorbereitung. Jetzt, da ich alles zusammen habe, was ich für die ersten Schritte benötige, checke ich erst mal, ob der Apache läuft und muss dann mit Hilfe von jumpstorm ein Magento aufsetzen. Vor ein paar Stunden habe ich noch einen Vortrag darüber gehört und bin sehr gespannt, ob ich das nun auch hin bekomme.
Nachdem ich http://localhost/ in die Adress-Zeile meines Browsers eingegeben habe, erscheint der mir bekannte xampp Start Screen und so wie es scheint läuft der Apache (Xampp) perfekt und ich werde mir jetzt mal jumpstore ansehen. Im Hauptverzeichnis finde ich eine PDF Datei mit dem Namen README.pdf. Der Name klingt vielversprechend und ich schaue einfach mal rein. Das PDF ist in englischer Sprache verfasst und erklärt sehr anschaulich mit vielen kleinen Beispielen die Vorgehensweise.
Als erstes sehe ich mir mal die sample.jumpstorm.ini an. Da ich nicht mit sample.jumpstorm.ini arbeiten möchte, benenne ich die Datei um in “jumpstorm.ini” und editiere sie in meinem bevorzugten vim . Als erstes fällt mir auf, dass hier jemand vor dem einchecken vergessen hat das MySQL Passwort zu entfernen. Eigentlich nicht so schlimm, da es sich bei der Konfiguration ganz offensichtlich um eine lokale Entwicklungsumgebung handelt, aber es wirkt doch erst mal nicht unbedingt vertrauensbildend. Das gleiche gilt auch für das adminPass. Auch hier hätte ich mir eher einen leeren Eintrag gewünscht.
Da ich auf den ersten Blick nicht verstehe, was ich in meinem Fall unter “magento” -> “source” eintragen soll, muss ich wohl erst mal in die jumpstorm sourcen schauen. Das ist so oser so erst mal eine gute Idee, denn evtl. baut ein Blick in den Source-Code mein Vertrauen in die Entwickler wieder auf.
Nach dem öffnen der jumpstorm Datei sehe ich auf den ersten Blick das dieses Skript nicht unter Windows entwicklet wurde und daher in meinem Fall einige Anpassungen benötigt. Da es in PHP geschrieben ist, habe ich damit aber wenig Probleme und mache mich erst mal daran, jumpstorm für meine Umgebung anzupassen.
Klar, die Pfade müssen alle angepasst werden, aber ich treffe auch noch auf andere Problem.
1. In der Datei \jumpstorm\lib\Netresearch\Source gibt es eine Methode “isFilesystemPath”, die so erst mal nicht funktioniert – wenigstens unter Windows.
public static function isFilesystemPath($sourcePath)
{
return (0 === strpos($sourcePath, ‘/’)); // path is absolute filesystem path
}
Egal. Ich denke mir mal kleine Änderung – große Wirkung und ändere die Methode ein wenig ab.
public static function isFilesystemPath($sourcePath)
{
return (is_dir($sourcePath)); // path is absolute filesystem path
}
Beim nächsten Test komme ich wieder einen kleinen Schritt weiter. Als nächstes versucht das Script die Dateien per rsync zu kopieren. Das ist eine sehr gute Idee, aber unter Windows doch wieder ein Problem. Bei meiner Suche in den Sourcen finde ich 2 Stellen an denen rsync verwendet wird.
$ grep -r rsync *
lib/Netresearch/Source/Filesystem.php:
$command = sprintf(‘rsync -a -h %s %s 2>&1′, $this->source, $target);
src/Jumpstorm/Extensions.php:
$command = sprintf(
‘rsync -a -h –exclude=”doc/*” –exclude=”*.git” %s %s 2>&1′,
$source . DIRECTORY_SEPARATOR,
$this->config->getTarget()
);
Dabei denke ich natürlich direkt an Clean-Code und Refactoring und …. Aber ich kann mich bremsen und suche kurz mal bei Google nach einer geeigneten Funktion und werde unter http://aidanlister.com/2004/04/recursively-copying-directories-in-php/ fündig. Unter dem Titel Recursively copying directories in PHP hat Aidan Lister eine copyr Funktion veröffentlicht, die – so hoffe ich – auch ihren Zweck erfüllt. Zu dem Zweck habe ich ein weitere PHP Datei unter \jumpstorm\lib\AidanLister angelegt, in der ich die Datei Copyr.php mit der entsprechenden Funktion hinterlegt habe. Beim Test wird klar, warum die Kollegen von netresearch hier auf rsync gesetzt haben, denn das Kopieren der Dateien ist so ungluablich langsam, dass ich in der Zeit auch eben rsync für Windows instalieren könnte.
Nach dem Kopieren der Dateien treffe ich auf das nächste Problem. Der Nächste Schritt versucht die Anlager der MySQL Datenbank. Auch hier wir mit dem exec Kommando gearbeitet und mit Hilfe vom mysql Kommando Datenbanken gelöscht und angelegt. Da der Befehl mysql in meinem Fall nicht im Pfad ist, bekomme ich erst mal nur eine Reihe von Fehlermeldungen. Was dann dazu führt, dass die MAgento Installation mit der folgenden Exception abbricht.
[Exception]
Could not create live database
Also mysql in den Pfad aufnehmen. Bei mir liegt das Kommando mysql unter C:\xampp\mysql\bin und genau das Trage ich dann auch in meine PATH Variable ein. Während mein Test läuft und ich wieder darauf warte, dass die Dateien geladewn werden, lese ich ein wenig über das Symfony Framework. Ich selbst habe es noch nie eingesetzt und nutze die Gelegenheit, mich mal kurz damit zu beschäftigen. Unter http://symfony.com/symfony-in-five-minutes finde ich eine Zusammenfasssung des Symfony Frameworks, dass ich zwar nicht in 5 Minuten lesen kann, aber das Kopieren der Dateien lauft ja auch ein wenig länger . Na toll. Mittlerweile bin ich zum Senior Symphony Developer geworden und ich sehe wieder nur die Exception. Tja, das hat wohl nicht viel gebracht. Ich greppe noch mal durch die Sourcen nach mysql und sehe, dass es nur eine Stelle gibt, an der das Kommando mysql wirklich benötigt wird. Soll ich einfach den Pfad in der Funktion prepareMysqlCommand ergänzen. Vermutlich wird es klappen, aber so macht das einfach keinen Spaß. Ich sitze ja so oder so hier im Zug fest und erst in Hannover. D.H. ich habe noch ca. 2 Stunden vor mir und daher noch genug Zeit, es richtig zu machen. Geanu in dem Moment geht mir eine Frage durch den Kopf. Warum ist es eigentlich immer so, dass es ungleich länger dauert etwas “richtig” zu machen als es mal eben rein zu fummeln? Die Antwort kenne ich zwar, aber daran will ich mich jetzt nich hoch ziehen. Statt dessen mache ich es richtig unb baue den Pfad zu mysql in die jumpstorm.ini mit ein. Auch wenn ich mir nicht ganz klar darüber bin, ob das schon ausreicht, denn eigentlich währe es noch viel besserm ganz auf den Aufruf von mysql zu verzichten und mit den PHP Methoden mysql_connect und mysql_querry zu arbeiten. Aber das habe ich schon 100 mal gemacht und heute habe ich mal Lust auf was neues.
Nachdem ich mir nun die Arbeit mit der jumpstorm.ini gemacht habe, muss ich feststellen, dass es alles nichts bringt. Der mysql Befehl wird nun zwar ordnungsgemäß gefunden, aber die Exception bleibt. Mist!
Also weiter Suchen und nicht aufgeben. Vermutlich bin ich wieder einen kleinen Schritt weiter gekommen und darf jetzt nicht aufgeben. Das ist halt das Lehrgeld dass man zahlen muss, wenn man “mal wieder was neues probieren möchte”. OK, ich schaue mir also den Teil in der Base.php noch mal genauer an. Eigentlich kann hier nicht viel passieren und daher entscheide ich mich für eine pragmatische Herangehensweise und gebe einfach mal das erzeugte mysql Kommando aus. Beim Test sehe ich was ich nicht sehen wollte. Das Passwort aus der jumpstorm.ini steht hier im Aufruf. Ach Schei… das habe ich beim vielen Schreiben ja total vergessen. Das PAsswort muss natütrlich raus aus der php.ini, da ich gar kein Passwort für meine lokale xampp Installation nutze. So weit so gut, doch alles jamern und probieren hat keinen Zweck. Irgendwie schaffe ich es nicht, diesen Konstrukt aus mysql.exe und den benötigten Parametern zu übergeben. Ich sehe mir den Return Wert an, der immer 1 statt 0 ist und suche danach bei Google. Evtl. gibt es ja eine Besonderheit unter Windows oder irgendeinen Bug – was weiß ich? Aber nichts. Ich sehe mir das Result des Aufrufs an und bekomme immer eine mysql Hilfe als Result. Das ist sehr verwunderlich und ergibt meiner Meinung nach keinen Sinn, ist aber so. Mittlerweile bin ich fast im Hamm und folge dem was meine Oma immer zu mir gesagt hat. ” Junge, bleib doch lieber bei den bewährten alten Methoden. Das ganze moderne Zeug ist doch nicht gut für Dich”. Eigentlich stimmt es nicht so ganz, denn der aufruf mysql_connect ist jünger als das mysql commando, aber das ist mir jetzt egal und ich baue die Base.php um. In der Magento.php habe ich eine ähnliche Konstruktion entdeckt, um die ich mich jetzt aber noch nicht kümmere. Ich bin mir sicher da werde ich noch ganz von allein drauf treffen. So schaffe ich es dann auch tatsächlich, dass die Datenbank angelegt wird. Hurra! Jetz kann ich also Dateien kopieren und eine leere Datenbank anlegen. Der Nächste Schritt ist die Anlage der Magento Sample Data Tabellen und Inhalte. Auch bei diesem Schritt darf ich mich über eine Exception freuen, was aber daran liegt, dass ich den Punkt noch nicht konfiguriert habe.
[Exception]
Could not detect sample data sql file in source directory git://git.example.org/magento/sampledata.git
Also muss ich nun in der jumpstorm.ini Datei die richtige Lokation der Datei angeben und schon kann es weiter gehen. So lange der Download dauert (Leider habe ich die Zip Datei noch nicht herunter geladen und im Zug ist die UMTS Verbindung leider nicht sehr stabil) schaue ich mir schon mal die Stelle an, die zu der Exception geführt hat. Ich habe ja nun schon eine Menge über jumpstorm gelernt und evtl. hilft mir das Wissen ja weiter.
Siehe da, es ist die Stelle in der Magento.php, die ich gerade noch vor mir hergeschoben habe. Was für ein Wunder. Klar muss hier wieder ein SQL Statement ausgeführt werden und klar ist auch, dass es wieder mit prepareMysqlCommand und exec gemacht wird. Dieses mal ist es aber nicht so einfach wie noch gerade. Ein einfaches DROP DATABASE oder CREATE DATABASE ist doch etwas anderes als eine mehrere 100 MB große SQL Datei einzulesen und dann mit mysql_query auszuführen. Aber ich halte mich an das was meine Oma gesagt hat und versuche, es wieder ohne exec zu machen. Doch aktuell heißt es erst mal Geduld haben und auf den Download warten. In der Zeit google ich das Problem mal. Vermutlich hat so ein Problem schon mal jemand vor mir gehabt und warum soll ich das Rad jedes mal neu erfinden. Dabei fällt mir was ein. Ich habe doch auf der Symphonny Website gelesen, dass es bei einem guten Framework darauf ankommt, dass man das Rad nicht jedes mal neu erfinden muss. Dementsprechend ist das Internet irgendwie auch ein Framework. Man kann es nicht so ohne weiteres benutzen, aber hier findet man auch zu fast jedem Problem eine Lösung, da man so gut wie nie der erste ist, der darauf gestoßen ist … und wenn doch? Dann hat man vermutlich etwas tatal falsch gemacht und sollte lieber alles löschen und noch mal von Vorne anfangen.
So, der Download ist fertig und ich bin in Dortmund. Mist. Selbst mit Verspätung hat die Zeit nicht gereicht. Ich muss in 10 Minuten aussteigen und dann ist erst mal Sense mit Magento2. In den nächsten Tagen werde ich wohl erst mal nicht mehr dazu kommen, hier weiter zu arbeiten. Außerden sehe ich keinen Grud darain, mein Netbook in die Hand zu nehmen, wenn ich einen richtigen Rechner habe.
So wie es aussieht ist das der Punkt an dem ich erst mal aufgeben muss. Ja, ich weiß, dass Magento nicht für Windows gemacht wurde und das hat so wie es scheint auch einen Hintergrund . Ich werde das ganze wohl noch mal in Ruhe auf einem Linux Server probieren und gebe damit zurück an die anderen Webseiten.
Related posts:
]]>So, das war’s jetzt erst mal. Ich hoffe, ihr könnt den Trash Mail Dienst noch mal brauchen – stinkefinger.net kann man sich ja auch gut merken .
Related posts:
]]>1. Eine Domain Liste
2. Ein Script mit dem man gelöschte Dateien finden kann
3. Viel Rechenpower und ein schnelles Netz
Beim dritten Punkt kann ich leider nicht helfen. Meine Server sind alle mehr als ausreichend damit beschäftigt, die Thumbshots zu generieren. Aber zu Punkt 1 habe ich auf einem USB Stick ein Skript gefunden, dass schnell und einfach auf jedem Linux MacOS oder Windows (mit cygwin) Computer installiert und ausgeführt werden kann.
Zu Punkt 2 gibt es ja sehr viele Möglichkeiten. Dazu könnt ihr einfach mal nach Domain Listen bei Google suchen.
Auch wenn das Script eigentlich nicht dazu gedacht war, um endlose Domain Listen zu checken. Ich habe es eine Zeit lang dafür genutzt, um ausgewählte Domains zu prüfen und mir dann im Falle eines Falles eine E-Mail zu senden. Aber irgendwann habe ich das Interesse daran verloren und es ist in Vergessenheit geraten.
Jetzt habe ich das Script wieder ausgegraben und hoffe, dass der Eine oder Andere was damit anfangen kann und evtl. sogar mal eine Premium Domain erwischt. Ich wünsche echo damit viel Erfolg.
Die Liste enthält 453501 .de Domains. Weitere Einträge, Ergänzungen und Hinweise sind immer erwünscht.
Auf Wunsch hier noch mal das Shell Script zum finden von gelöschten Domains. Wie schon gesagt ist das Script nichts besonderes, aber es funktioniert wunderbar.
#!/bin/sh
DOMAINLIST=domains.txt
TMPFILE=tmp.txt
# Cleanup tmp Data
touch $TMPFILE
rm $TMPFILE
echo 1. IP Adress check
# IP Adress Check
for i in `cat $DOMAINLIST`
do
echo $i _ `host -t A $i` | grep -i "not found" | awk -F "_" '{ print $1 }' >> $TMPFILE
echo -n .
done
echo
echo 2. Whois check
# Whois Check
for i in `cat $TMPFILE`
do
echo Check Domain: $i
whois $i
echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# % Error: 55000000002 Connection refused; access control limit exceeded
sleep 20
done
rm $TMPFILE
Related posts:
]]>http://developers.google.com/+/
http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html
Update:
Ok, das ist schon die erste schlechte Nachricht. Folgendes habe ich gerade unter http://developers.google.com/+/api/ gelesen.
Note: The Google+ API currently provides read-only access to public data. All API calls require either an OAuth 2.0 token or an API key.
Nur read-only? Wie soll denn so eine brauchbare Integration gelingen? Read-only ist doch eine Einbahnstrasse und daher nicht zu gebrauchen. Es mag sicher Anwendungsfälle geben, die mit der Read-Only auskommen, aber mir ist das noch zu wenig.
So, habe nun mal meine Mittgaspause genutzt um die Google + API auszuprobieren. Habe natürlich alle Erkenntnisse mitgeschrieben und unter http://m-software.de/google-api-howto veröffentlicht.
Related posts:
]]>Related posts:
]]>Ich habe ein JavaScript entwickelt, mit dem ihr die Thumbshots als Linkvorschau nutzen könnt. Das Script reagiert auf das Bewegen der Maus über externe Links und blendet daraufhin unter dem Link eine Vorschau des Screenshots an.
Hier könnt ein Beispiel dafür sehen.
Zuerst müsst ihr definieren bei welchen Links die Vorschau angezeigt werden sollen. Meistens will man die Linkvorschau nur bei externen Seiten verwenden. Dazu stattet ihr alle externen Links mit einer HTML Klasse aus. Im Beispiel verwende ich die Klasse “externalURL”.
Beispiel:
<a class="externalURL" href="http://www.easy-coding.de">easy-coding.de</a>
Bindet das JavaScript für die Vorschau auf keinen Fall direkt von diesem Pfad ein, sondern ladet es euch stattdessen hier herunter und speichert die Datei dann auf eurem Webspace.
Google, Yahoo & Co empfehlen aus Performancegründen alle JavaScripts erst am Ende der Seite einzubinden. Deswegen solltet ihr den nun folgenden Code direkt vor das schließende Tag einfügen:
<script type="text/javascript"> // <![CDATA[ Bubble.init("externalURL", function (D) { return '<img style="width: 150px; height: 100px;" src="http://m-software.de/screenshot/Screenshot.png?url='+ escape(D.href) +'&commingsoonimg=http://fadeout.de/images/thumbshot.png" alt="" />';}); // ]]> <script type="text/javascript">
Ich bin Webmaster von easy-coding.de und habe das Script unter der LGPL v3 veröffentlicht. Ihr könnt das Script also kostenlos auf kommerziellen, sowieso auf nicht kommerziellen Seiten verwenden. Wenn ihr selbst Programmierer seit, dann interessiert euch vielleicht auch der Aufbau des Codes. Weitere Informationen zur Programmierung findet ihr im easy-coding wiki unter Link Vorschau Bubble.
Zuletzte solltet ihr nicht vergessen, dass der super Service von Michael kostenlos ist, er aber auf unterstützende Links angewiesen ist. Deswegen lest die Thumbshots FAQ und vergesst nicht den Link zu seiner Seite.
<a class="externalURL" href="http://m-software.de/thumbshots-html">Thumbshots von M-Software.de</a>
Related posts:
]]><?
/* Permanente Weiterleitung mit einen HTTP 301 Code */
$url = “http://xn--sms-sprche-geb.org/”;
header(“HTTP/1.1 301 Moved Permanently”);
header(“Location: ” . $url);
?>
Für denjenigen, der mehr Details über die HTTP Statuscodes erfahren möchte, kann ich auf jeden Fall mal die Seite unter http://de.wikipedia.org/wiki/HTTP-Statuscode empfehlen.
Der 301 Status-Code ist einer aus der Gruppe der 3XX Umleitungen. 301 hat den Namen “Moved Permanently”, was bedeutet, dass die angeforderte URL ab sofort unter der im „Location“-Header-Feld angegebenen Adresse zu finden ist.
Related posts:
]]>