Kategorien
Fotografie Galerie Wandern

Wanderung Aletschgletscher

Meine Verlobte und ich waren dieses Wochenende mit unserem Trauzeugen Florian und seiner Freundin Kathi im Wallis und haben eine Wanderung zum Aletschgletscher unternommen.

Via Gondelbahn ging’s von Mörel rauf in die Riederalp und von dort weiter zur Gondel bis auf die Moosfluh. Dort begann dann die Wanderung, welche am Rande des Aletschgletschers entlang führte bis zur Gletscherstube Märjelensee. Da schon Nebel aufzog und es schon ziemlich spät am Nachmittag war, gingen wir durch den Tunnel (durchquert das Eggishorn) in Richtung Fiescheralp und von dort mit der grossen Gondel wieder zurück.

Hier einige Impressionen:

Und hier noch der aufgezeichnete GPS-Track:

Insgesamt eine nicht gerade anspruchsvolle Wanderung über ca. 14 Kilometer (in 4:20 Stunden), welche aber trotzdem einigermassen Trittsicherheit voraussetzt. Das viele Absteigen mit dem ganzen Geröll ging bei mir gegen Ende etwas in die Knie.. aber ich bin ja auch nicht mehr der Jüngste 😉

P.S.: einige Fotos (Ponys/Bär) sind von einer kurzen Wanderung im Fieschertal am nächsten Tag

Kategorien
Fotografie Galerie

Hochzeit Petra & Fabian

Vor einigen Wochen durfte ich die Hochzeit von Petra und Fabian fotografieren.

Hier einige meiner Fotos, welche mir am besten gefallen:

Kategorien
misc

IMDB mit James Bond Easter Egg

Die Leute von IMDB scheinen eine gewisse Sympathie für James Bond zu hegen. Wenn man die Charakter-Seite zu James Bond auf IMDB aufruft erhält man folgende Seite:

James Bond auf IMDB - was fällt hier auf?
James Bond auf IMDB – was fällt hier auf?

Na, wem ist hier etwas aufgefallen? Man richte seinen Blick auf die URL. Kann das Zufall sein? Wohl kaum, oder? 007 lässt grüssen.

Kategorien
Ferien Fotografie Galerie personal

Ferien im Burgund

Vor einer Woche war ich für einige Tage mit meiner Freundin im Burgund in Frankreich in den Ferien.

Leider hat das Wetter nicht mitgespielt und es hat praktisch die ganze Zeit geregnet, was leider dafür gesorgt hat, dass wir einige geplante Wanderungen nicht machen konnten. Auch war das Besichtigen der Orte bei Dauerregen nicht wirklich amüsant.
Trotzdem konnten wir einige Orte Besichtigen und einen Einblick in das (sonst vermutlich schönere 🙂 ) Burgund erhalten.

Wir haben hauptsächliche Folgende Orte besichtigt, wobei wir dabei jeweils nur eine Nacht in jedem Hotel verbrachten, was natürlich etwas stressig war, aber immerhin kommt man so etwas in der Gegend herum und kann mehr Orte anschauen.

Besonders empfehlenswert fand ich Dijon (schöne Stadt, gute Einkaufsmöglichkeiten) und auch Auxerre (sehr malerisch, nette Architektur). Die Grotte bei D’Arcy ist nett, aber mit einer Dauer von einer Stunde ist die Führung fast schon etwas zu lange, zumal es jetzt nicht gerade die spektakulärste Grotte ist.

Hier noch einige Impressionen aus unseren Burgund-Ferien:

Kategorien
IT

MySQL- und Website-Backup periodisch erstellen

Vor einigen Tagen konnte ich einen Punkt von meiner Aufgabenliste streichen, welchen ich schon längere Zeit offen hatte und eigentlich schon lange einmal hätte umsetzen wollen und sollen: das Einrichten eines Backups für meine Webseite.

Bisher machte ich nur sporadisch entweder manuelle Backups der Daten der Webverzeichnisse und der dazugehörigen MySQL-Datenbanken oder ich habe bei meinem VPS-Provider ein Backup für die ganze Maschine durchgeführt – beides nicht gerade sehr sexy, das muss besser und eleganter gelöst werden, dachte ich mir.

Als erstes schrieb ich ein Shell-Skript, welches mir alle Datenbanken (ausser den System-Datenbanken) in Archiv-Dateien exportiert (alle Pfade und Benutzerangaben wurden durch Beispieldaten ersetzt):

#!/bin/bash

BACKUP_DATE="$(date +%Y-%m-%d)"
DB_BACKUP_ROOT="/zielpfad/zum/backup/mysql"
DB_BACKUP="$DB_BACKUP_ROOT$BACKUP_DATE"
DB_USER="Datenbank-Benutzer"
DB_PASSWD="Datenbank-Kennwort"
HN=`hostname | awk -F. '{print $1}'`
# Create the backup directory
mkdir -p $DB_BACKUP

# Remove backups older than 30 days
find $DB_BACKUP_ROOT -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;

# Backup each database on the system using username and password
for db in $(mysql --user=$DB_USER --password=$DB_PASSWD -e 'show databases' -s --skip-column-names|grep -vi information_schema);
do
  BACKUP_FILE_PATH="$DB_BACKUP/mysqldump-$HN-$db-$BACKUP_DATE.gz"
  mysqldump --user=$DB_USER --password=$DB_PASSWD --opt $db | gzip > $BACKUP_FILE_PATH;
  # Set desired permissions
  chmod -R 600 $BACKUP_FILE_PATH
done

Das obenstehende Skript macht folgendes:

  • Zuerst setze ich einige Variablen, wie das Zielverzeichnis für die Backup-Dateien. Ich lese das aktuelle Datum aus und speichere es in einer Variable und benutze dies, um für die täglichen Backups jeweils ein neues Zielverzeichnis innerhalb des festgelegten „DB_BACKUP_ROOT“ zu erstellen.
  • Danach setze ich die MySQL-Zugangsdaten und ermittle den Host-Namen des Rechners, um diesen später auch zum Dateipfad hinzuzufügen.
  • Mittels des „find“-Befehls ermittle ich alle Backups, welche älter als 30 Tage sind und lösche diese.
  • Danach iteriere ich in einer Schleife über alle relevanten Datenbanken und speichere diese mittels „mysqldump“ an den gewünschten Zielort, dabei pipe ich das Resultat von „mysqldump“ zuvor noch an „gzip“ und sorge damit, dass ich eine Archivdatei erhalte.
  • Zum Schluss ändere ich mittels „chmod -R 600 …“ noch die Dateirechte der zuvor erstellten Backup-Datei, so dass nur noch der Besitzer der Datei diese lesen und ändern kann.

Nun habe ich die Datenbank gesichert. Mittels eines weiteren Shells-Skripts sichere ich nun noch die Dateien der einzelnen Webseiten:

#!/bin/bash

WWW_ROOT="/var/wwwdir/websites/"
WWW_BACKUP_ROOT="/zielpfad/zum/backup/www"
WWW_BACKUP="$WWW_BACKUP_ROOT`date +%Y-%m-%d`"
HN=`hostname | awk -F. '{print $1}'`
# Create the backup directory
mkdir -p $WWW_BACKUP

# Remove backups older than 30 days
find $WWW_BACKUP_ROOT -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;

# get arguments
while [ "$1" != "" ]; do
  case $1 in
    -s | --site )     shift
                      site=$1
                      ;;
    * )               echo "Unknown argument $1."
                      exit 1
  esac
  shift
done

# Backup website
if [ "$site" != "" ]; then
  BACKUP_PATH="$WWW_BACKUP/www-$HN-$site-$(date +%Y-%m-%d).tar.gz"
  WWW_PATH="$WWW_ROOT$site"
  echo "Backing up site $WWW_PATH to $BACKUP_PATH" 
  cd $WWW_ROOT
  tar -czf $BACKUP_PATH $site
  chmod -R 600 $BACKUP_PATH
else
  echo "You need to specifiy a site to backup with the -s argument."
  exit 1
fi

Dieses Skript macht folgendes:

  • Als erstes setze ich wieder einige Variablen. Das Quellverzeichnis der Webseiten-Daten wird angegeben (WWW_ROOT) und das (Wurzel-)Zielverzeichnis für die Backup-Daten wird festgelegt (WWW_BACKUP_ROOT). Ausserdem lege ich den Ordernnamen für die täglichen Backups fest (WWW_BACKUP), dazu verwende ich wie schon beim MySQL-Backup das „date“-Befehl.
  • Mittels mkdir -p $WWW_BACKUP wird der tägliche Backup-Ziel-Ordner erstellt, es sei denn er ist schon vorhanden (dazu ist der „-p“-Parameter da).
  • Erneut suche ich mittels „find“ alle Backup-Dateien, welche älter sind als 30 Tage und lösche diese.
  • Danach kommt eine „while“-Schleife, mit der ich die Argumente, welche dem Skript übergeben wurden auslese, dies ist nötig, da ich das Skript später mittels Cron-Job aufrufen möchte und jeweils die Quell-Webseite mittels eines Parameters angeben möchte. Wenn keine Website als Argument übergeben oder falls ein unbekanntes Argument übergeben wurde, wird das Skript beendet (exit 1).
  • Danach wird die eigentliche Backup-Datei erstellt. Dazu wird der Zielpfad der Archivdatei zusammengesetzt (BACKUP_PATH) und dann mittels dem „tar“-Befehl das Backup erstellt und gepackt.
  • Am Ende passe ich wieder die Dateirechte mittels „chmod“ an, so dass nur der Besitzer die Datei lesen und ändern kann.

Nun haben wir zwei Skripts, welche die für mich relevanten Komponenten der Webseiten sichern können, jedoch müssten diese immernoch manuell ausgeführt werden. Damit automatisch täglich die Backups erstellt werden, richtete ich unter einem Account einige Cronjobs (Befehl: crontab -e) ein, welche die (ausführbaren) Skripte einmal am Tag laufen lassen:

# Daily website backup
15 2 * * * /usr/local/bin/mysql_backup.sh >/dev/null 2>&1
15 2 * * * /usr/local/bin/www_backup.sh -s website_dir_1 >/dev/null 2>&1
15 2 * * * /usr/local/bin/www_backup.sh -s website_dir_2 >/dev/null 2>&1
15 2 * * * /usr/local/bin/www_backup.sh -s website_dir_3 >/dev/null 2>&1
45 4 * * * /usr/local/bin/copy_backup_to_different_server.sh >/dev/null 2>&1

Die Backups werden mit dieser Konfiguration also immer um 2:15 Uhr durchgeführt. „/dev/null 2>&1“ bewirkt, dass die Ausgaben unterdrückt werden, sie landen im Nirvana.

In der letzten Zeile der obenstehenden Crontab seht ihr, dass noch ein weiteres Skript „copy_backup_to_different_server.sh“ zu einem späteren Zeitpunkt aufgerufen wird.
Da die Daten bisher nur lokal auf dem Server gesichert werden, nützen sie mir nichts, falls es zu einem generellen Datenverlust auf dem Server käme. Zur Sicherheit kopiere ich also die Backup-Archive noch an einen weiteren Ort, auf einen anderen Server.

Das  Skript ist wie folgt aufgebaut:

  • #!/bin/bash
    
    rsync -rlthvz --delete --owner=1111 --group=333 -e '/usr/bin/ssh -i /home/userXy/.ssh/id_rsa' /zielpfad/zum/backup/ user@remote.server.com:/volumeXy/home/userMn/MyFiles/Backup/websites<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

    Das Skript kopiert via RSYNC alle neuen Dateien von „/zielpfad/zum/backup“ auf den Server „remote.server.com“ in den Pfad „/volumeXy/home/userMn/MyFiles/Backup/websites“. Die Verbindung wird im Beispiel mit dem Benutzer „user“ durchgeführt.

  • Die Verbindung geschieht durch den SSH-Aufruf innerhalb des RSYNC-Befehls über eine verschlüsselte SSH-Verbindung.
  • „–delete“ bewirkt, dass im Ziel die Dateien gelöscht werden, welche nicht mehr in der Quelle vorhanden sind.
  • Mittels „–owner=…“ und „–group=…“ setze ich den Besitzer und die Gruppe der neuen Dateien und Ordner auf dem Zielsystem, da diese nicht mit denen auf dem Quellsystem identisch sind.

Damit RSYNC via SSH auch ohne Kennwort-Eingabe funktioniert, muss man natürlich zuerst ein Schlüssel-Paar (öffentlich/privat) erzeugen (sofern man noch keines hat) und den öffentlichen Schlüssel auf dem Zielsystem in den „Authorized Keys“ eintragen. Hier findet ihr eine Anleitung dazu: http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/

Nun ist das Backup also eingerichtet. Es sichert täglich automatisch die Websites mitsamt der Datenbank und kopiert diese Dateien zur Sicherheit auch noch auf einen anderen Server.

Kategorien
Wandern

Rund-Wanderung von Abbaye Notre-Dame de Sénanque nach Gordes und zurück

Letzten Juni war ich mit meiner Freundin für einige Tage in Südfrankreich, in der Provence.

Wir machten einige Wanderungen, unter anderem eine von der Abbaye Notre-Dame de Sénanque nach Gordes und dann auf einem anderen Weg wieder zurück zur Abtei.

Ich habe die Strecke mit meinem HTC Hero S mittels Endomondo aufgezeichnet (am Anfang scheint es falsche Daten aufgezeichnet zu haben):

[map style=“width: auto; height:400px; margin:20px 0px 20px 0px; border: 1px solid black;“ gpx=“/wp-content/uploads/gpx/ads-gordes.gpx“]

Insgesamt waren wir etwas längers als 5 Stunden unterwegs und wanderten dabei ca. 16 Kilometer.

Wir hatten einen Wanderführer (DuMont Wanderführer Provence) was die Wegfindung erleichterte, allerdings auch nicht immer. An gewissen Stellen verliefen wir uns nur per Zufall nicht und ab ca. Kilometer 11 konnten wir den Weg gemäss Wanderführer nicht mehr ermitteln und orientierten uns an den  Trampelpfaden und Wegweisern.

Los ging es auf dem Parkplatz der Abtei Notre-Dame de Sénanque, welche wir zuvor noch kurz besichtigten. Leider war gerade keine Blütezeit des Lavendels, diese hätte erst einige Wochen später angefangen und die Lavendelfelder hätten dann viel schöner ausgeschaut, aber auch so ist die Abtei schön anzuschauen.

Zuerst ging es nach Norden und der Weg wurde bereits ziemlich unwegsam (schmal und voll von Ginsterbüschen). Ein Wegweiser welcher im Wanderführer vermerkt war, bestätigte uns, dass wir noch auf dem richtigen Pfad waren.

Danach wurde das Gelände immer steineriger, bis schliesslich gar kein Weg mehr ersichtlich war. Wir wussten einfach, dass wir uns weiter hinauf bewegen mussten, bis wir in der Ferne ein grosses weisses Schild sehen würden, was wir dann auch taten.

Oben angekommen, wurde der Weg wieder breiter und flacher. Hier trafen wir auch das erste Mal wieder auf andere Menschen, welche ebenfalls wanderten, allerdings andere Wege einschlugen als wir.

Nach einer Weile ging der Weg dann flach bergab, führt durch einige kleinere Siedlungen mit schönen Häusern und auch teilweise für kurze Strecken über gut befestigte Strassen. Nach kurzer Zeit kamen wir dann an den Rand des Hochplateaus von dem wir eine gute Übersicht über einen Teil der Provence hatten.

Dann gingen wir weiter am Rand dieses Plateaus entlang und nach wenigen hundert Metern tauchten vor uns die ersten Häuser von Gordes auf, einem malerischen, an einem Hang gelegenen Ort. Bei Kilometer 7,5 hatten wir einen guten Blick auf die Ortschaft, man sieht schön die Häuser, Villas und Hotels, welche sich auf und am Hang befinden, wie nebenstehendes Bild zeigt.

Nach Gordes liefen wir in Richtung der „Village des Bories„, einem Freilichtmuseum mit Uralten Steinhäusern, welches wir dann auch noch kurz besichtigten (KM 9,4), bevor wir die Wanderung fortsetzten.

Auf dem weiteren Weg stiessen wir auf ein altes Autowrack, welches vermutlich vor Jahrzehnten hier illegal entsorgt wurde. An der Tür hatte es auch einige Löcher.. aber bestimmt keine Einschusslöcher und wenn, dann wahrscheinlich nur, weil das Auto später für Zielübungen verwendet wurde – ganz bestimmt.

Wie breits erwähnt verliessen wir ab Kilometer 11 den Weg gemäss unserem Wanderführer und versuchten uns selbst zu orientieren. Sollte das gut gehen?

Bei KM 13,8 verliefen wir uns dann für ein kurzes Stückchen, kehrten aber noch rechtzeitig um, da es langsam Abend wurde und wir uns in einer unwegsam und verlassenen Schlucht befanden.  Wäre nicht so toll gewesen dort zu übernachten 🙂

An gewissen Stellen in dieser Schlucht mussten wir sogar einige Meter an einer Felswand hochklettern. Diese war zum Glück nicht senkrecht. Auch sonst wurde der Weg immer enger, verwachsener und abenteuerlicher.

Schlussendlich endete die Schlucht dann doch noch irgendwann und wir konnten sie bei KM 15,7 wieder verlassen und befanden uns nun auf der Rückseite der Abtei.

Alles in allem eine tolle Wanderung, welche teilweise über freies Gelände ohne Wege führt und auch manchmal nicht gut mit Wegweisern markiert ist, aber mit ein bisschen studieren und ausprobieren sollte man das Ziel finden 🙂 Ein Wanderführer oder eine GPS-Route erleichert die Wegfindung.

Kategorien
IT

Feeds parsen und schreiben mit Python

Ich hatte letzthin das Problem, dass ich auf meiner neuen Fotografie-Seite einen Feed meiner letzten iStockphoto-Uploads einbinden wollte, aber dies nicht ging, da der offizielle Feed scheinbar nicht validiert:
http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Fwww.istockphoto.com%2Fistock_myfiles_rss.php%3FID%3D8197370

Auf WordPress verwendete ich zuerst das „Embed RSS„-Plugin um Feeds in die Seite zu integrieren, jedoch kam dies nicht mit diesem ungültigen Feed klar. Einige RSS-Reader-Programme (z.B. „Vienna RSS„) hatten jedoch keine Probleme mit dem Feed. Vermutlich korrigierten sie intern die Fehler oder ignorierten diese einfach.

Zum Glück hat mich einmal ein guter Freund in die Welt von Python eingeführt und mir die nötigen Basics dieser tollen Programmiersprache beigebracht.

Mit Hilfe der Bibliotheken „feedparser“ und „PyRSS2Gen“ konnte ich ein Python-Skript schreiben um dieses Problem umgehen.

Zuerst hole ich mit feedparser den Feed ab und baue später mit PyRSS2Gen einen neuen Feed im „RSS 2.0“-Format neu auf. Abschliessend schreibe ich diesen neuen Feed als XML-Datei in das Verzeichnis des Webservers.

Das Skript habe ich so umgebaut, dass eine beliebige iStockphoto-Benutzer-ID als Parameter übergeben werden kann. Auch die Ziel-Datei kann als Paramter übergeben werden.

Hier das Skript, welches in einem Repository auf Github gehosted ist:

#!/usr/bin/python

import datetime
import feedparser
import getopt
import os
import PyRSS2Gen
import sys

def create_latest_uploads_feed(targetPath, feedTitle, feedUrl, feedDescription, entries):
  rssItems = []
  for entry in entries:
    rssItem = PyRSS2Gen.RSSItem(
        title = entry['title'],
        link = entry['link'],
        description = entry['description'],
        guid = PyRSS2Gen.Guid(entry['link']),
        pubDate = entry['pubDate'],
        author = entry['author']
        )
    rssItems.append(rssItem)
  rss = PyRSS2Gen.RSS2(
      title = feedTitle,
      link = feedUrl,
      description = feedDescription,
      lastBuildDate = datetime.datetime.now(),
      items = rssItems)
  print 'Writing RSS feed: ' + targetPath
  rss.write_xml(open(targetPath, 'w'))
  print 'Done!'


def fetch_feed_and_create_rss(userId, targetPath):
  feedUrl = "http://www.istockphoto.com/istock_myfiles_rss.php?ID=" + userId
  print 'Fetching feed: ' + feedUrl
  feed = feedparser.parse(feedUrl)
  feedTitle = feed['feed']['title']
  feedDescription = ""
  entries = feed['entries']
  preparedEntries = []
  print 'Processing fetched entries. Entries found: ' + str(len(entries))
  for entry in entries:
    entryPubDate = entry['published']
    pubDate = datetime.datetime.strptime(entryPubDate[:-6], '%Y-%m-%dT%H:%M:%S')
    #pubDateClean = pubDate.strftime('%d.%m.%Y')
    author = entry['author']
    entryTitle = entry['title']
    print ' * Entry title: ' + entryTitle.encode('utf-8')
    link = entry['link']
    summaryHtml = entry['summary']
    preparedEntries.append({"pubDate":pubDate,"author":author,"title":entryTitle,
      "description":summaryHtml,"link":link})
  create_latest_uploads_feed(targetPath, feedTitle, feedUrl, feedDescription,
      preparedEntries)

def main(argv):
  scriptName = os.path.basename(__file__)
  usageInfo = 'usage: ' + scriptName + ' -i  -t '
  userId = ''
  targetPath = ''
  try:
    opts, args = getopt.getopt(argv,"hi:t:",["id=","targetpath="])
  except getopt.GetoptError:
    print usageInfo
    sys.exit(2)
  for opt, arg in opts:
    if opt == '-h':
      print usageInfo
      sys.exit()
    elif opt in ("-i", "--id"):
      userId = arg
    elif opt in ("-t", "--targetpath"):
      targetPath = arg
  if (userId and targetPath):
    print 'User ID is: ' + userId
    print 'Target path is: ' + targetPath
    fetch_feed_and_create_rss(userId, targetPath)
  else:
    print usageInfo
    sys.exit()


if __name__ == "__main__":
  main(sys.argv[1:])
istock_latest_uploads.pyview rawview file on GitHub

Genau genommen validiert der neue Feed immer noch nicht 🙂 allerdings sind die Fehler nun scheinbar weniger tragisch und er kann nun von „Embed RSS“ gelesen werden. Auch verwende ich nun zur Einbettung in WordPress „HungryFEED“ anstelle von „Embed RSS“, da dieses etwas mächtiger ist und bessere Templating-Option mitbringt.

Damit ich für die Webseite immer einen relativ aktuellen Feed erhalte, lasse ich das Skript mittels Crontab alle vier Stunden laufen:

#m h dom mon dow command
0 */4 * * * python /usr/local/bin/scriptXy.py -i 8197370 -t /dir/subdir/targetfile.xml
Kategorien
Fotografie personal

Fotografie-Seite überarbeitet

FotografieIch habe meine „Fotografie„-Seite nun überarbeitet und mit der Hintergrund-Geschichte zu meinem Hobby versehen. Ausserdem wird auch meine aktuelle Foto-Ausrüstung augeführt und etwas über Stock-Fotografie berichtet.

Ihr findet die Seite hier:
http://qoo.li/fotografie

Kategorien
personal

Änderung des Blog-Namens und der Domain

Ich habe beschlossen meine alte „qoo.li“-Seite aufzugeben und dafür den Namen für meinen Blog/meine persönliche Webseite zu verwenden.

Die Inhalte der beiden Seiten, also des alten Blogs (shihan-online.ch) und der alten Qooli-Seite werden hier vereint in neuer, aufgefrischter Form zu finden sein.

Gleichzeitig habe ich dem Blog nun ein neues Aussehen verpasst. Ich hoffe es gefällt euch.

Für diejenigen, welche technische Details interessieren, ein Hinweis bezüglich der Domänen-Umleitung:
Damit die alten Inhalte, welche via Suchmaschinen schon indexiert wurden, auch weiterhin über die alte URL gefunden und aufgerufen werden können, habe ich mit „htaccess“ eine Rewrite-Rule eingerichtet. Diese sieht wie folgt aus:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !qoo.li$ [NC]
RewriteRule (.*) http://qoo.li/$1 [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Zeilen 5 und 6 sind neu und sorgen dafür, dass alle Aufrufe, welche nicht über „qoo.li“ eingehen auf eben diese neue Adresse umgebogen werden, wobei der restliche Pfad des aufrufes erhalten bleibt. „301“ sorgt dafür, dass die Weiterleitung als permanent gekennzeichnet wird. Suchmaschinen wissen somit, dass sie ihren Index entsprechend anpassen sollten.

Kategorien
fun

Resultat aus Minecraft-Zeitverschwendung

Anbei die Ergebnisse aus meiner Minecraft-Zeitverschwendung.

Damit andere nun ihre Zeit sinnlos damit vertrödeln können :-), gibt es am Ende einen Download-Link zur Map „Creativia“.

Aber zuerst noch die Übersicht:

Übersicht

… und einige Screenshots:

Download: http://www.minecraftworldmap.com/worlds/AEAQ4#/