finally works

there was alot of strange things going on. mostly with unicode and
ipython version mismatching. now it looks like its working fine now.
This commit is contained in:
Marvin Steadfast 2015-08-24 09:27:24 +00:00
parent 69ffb5a446
commit a3c6e4c00d
10 changed files with 228 additions and 249 deletions

1
.gitignore vendored
View File

@ -2,7 +2,6 @@
output output
pelicanconf_local.py pelicanconf_local.py
cache/ cache/
pelican-plugins/*
.ipynb_checkpoints .ipynb_checkpoints
#Python #Python

View File

@ -10,7 +10,7 @@
with_items: with_items:
- git - git
- ansible - ansible
- python-dev - python3-dev
- python-virtualenv - python-virtualenv
- libxml2-dev - libxml2-dev
- libxslt1-dev - libxslt1-dev
@ -18,6 +18,7 @@
- lftp - lftp
- pandoc - pandoc
- nodejs - nodejs
- mc
sudo: yes sudo: yes
- name: clone batcave - name: clone batcave
@ -34,9 +35,4 @@
pip: pip:
requirements=/vagrant/requirements.txt requirements=/vagrant/requirements.txt
virtualenv=~/env virtualenv=~/env
virtualenv_command=virtualenv -p /usr/bin/python3 virtualenv_command="virtualenv -p /usr/bin/python3"
- name: clone pelican plugins
git:
repo=https://github.com/getpelican/pelican-plugins.git
dest=/vagrant/pelican-plugins

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 366 KiB

After

Width:  |  Height:  |  Size: 366 KiB

View File

@ -1,197 +1,4 @@
{ {
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alles ist besser mit öffentlich zugänglichen API's. Sogar Städte. Konnte keiner mit rechnen. Gerade aktuell ist mir keine Stadt in Deutschland bekannt die erstmal ohne viel Bürokratie öffentliche API's zu verfügung stellt. Und zwar am besten alles was unter der eigenen Verwaltung steht. Zum Beispiel die Daten der öffentlichen Verkehrsmittel oder halt auch die Stadtbibliothek. Und so war in auf einem Spaziergang durch Nürnberg mit einem guten Freund. Wir unterhielten uns über die große Hürde verwendbare Daten von der Stadt zu bekommen. Ich zum Beispiel habe oft das Problem, dass ich nicht mehr weiß wann meine Bücher zurück zur Bibliothek müssen. Ok gut. Die Stadtbibliothek bietet eine [Website](http://www.nuernberg.de/internet/stadtbibliothek/) an in der man sich einloggen kann und ein paar Informationen bekommt. Neben einer Suche gibt es auch eine Übersicht der ausgeliehenden Bücher und dem Rückgabe Datum. Die ganze Seite ist ein Schmerz im Arsch. Es gibt sehr skurille Login-Sessions mit sehr komisch generierten Urls. Und was will man? Eine schöne Bibliotheks-App? Noch praktischer: Ein ical-File welches ich in den Kalendar meiner Wahl einbinden kann. Also kam ich zu dem schluß einen Wrapper zu bauen. Am besten wäre es wenn am Ende eine API rauskommt auf der andere Apps aufbauen können. War nicht so einfach wie ich gedacht habe. Als erstes hatte ich einfach [requests](http://docs.python-requests.org/en/latest/) und [BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/) probiert. Damit konnte ich selbst nach Tagen den Login nicht hinbekommen. Den zweiten Anlauf bestritt ich mit [RoboBrowser](https://github.com/jmcarp/robobrowser). Der setzt auch auf requests und BeautifulSoup, soll aber gut mit Sessions und Cookies zurecht kommen. Gleiches Spiel. Suche habe ich hinbekommen, den Login aber nicht. An diesem Zeitpunkt war ich kurz davor das Projekt in die Tonne zu treten. Dann googelte ich umher und fand [selenium](https://de.wikipedia.org/wiki/Selenium). Ein Testingframework um Webapps zu testen. Eigentlich dafür da um verschiedene installierte Browser zu öffnen um automatisch zu testen ob die Seite auch funktiert. Nun gibt es einen WebKit Browser der ohne grafische Oberfläche auskommt. [PhantomJS](http://phantomjs.org/). Ist eigentlich dafür da um die automatisierten Tests schneller durchlaufen zu lassen. Na klar, man muss nicht erstmal Chrome oder Firefox öffnen lassen. Dieser tut es nun um Hintergrund der API. Er browst die Seiten ab und übergibt den Source an BeautifulSoup. Das aufgearbeiteten Daten gehen dann per [Bottle](http://bottlepy.org), [Gunicorn](http://gunicorn.org/) und NGINX raus. Das ganze ist natürlich ein fieser Hack... aber es funktioniert. Zum vereinfachten Rollout benutze ich [Docker](https://www.docker.com/) und [Ansible](http://www.ansible.com/home). Mir geht es garnicht darum das alle auf einer API rumklicken. Da es sich um einen Hack handelt soll es so einfach wie möglich sein seine eigene API aufzusetzen. Aber schauen wir uns erstmal an welche Sachen funktionieren. Dafür benutze ich mein geliebtes requests..."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import requests\n",
"import json\n",
"from pprint import pprint"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Es ist wichtig das wir JSON an die API senden. Dazu ist mir aufgefallen das es für requests nötig ist den richtigen Header zu setzen."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{u'results': [{u'available': False,\n",
" u'name': u'American Splendor [DVD] / Paul Giamatti, Hope Davis. Dir. by Robert Pulcini ... ',\n",
" u'type': u'DVD-Video/-Audio',\n",
" u'year': u'2005-01-01'}]}\n"
]
}
],
"source": [
"payload = {'name': 'american splendor'}\n",
"\n",
"r = requests.post('http://localhost:5000/api/search', data=json.dumps(payload), headers=headers)\n",
"\n",
"pprint(r.json())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Es wird eine Liste mit Items zurückgegeben. In diesem Fall habe ich nach [American Splendor](https://de.wikipedia.org/wiki/American_Splendor) gesucht. Es gab nur einen Treffer. Bis jetzt sind folgende Informationen abrufbar: Verfügbarkeit, Name, der Typ (in diesem Fall eine DVD) und das Erscheinungsjahr. Zukünftig will ich noch mehr Sachen parsen und vor allem auch bei der Anfrage mehr Optionen anbieten. Zum Beispiel das man gleich sagen kann \"Gib mir nur DVD's\". Aber ich wollte erstmal die für mich relevanten Informationen auslesen.\n",
"\n",
"Ein weitere Basis-Funktion war das auslesen der noch ausgeliehenden Teile. Dies macht man durch die Angabe von Kartennummer und Passwort."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{u'results': [{u'from_date': u'2015-05-20',\n",
" u'name': u'Duden-Abiturhilfen Kunstgeschichte : 11. bis 13. Klasse. - 2.. 19. und 20. JahrhundertKunst00237375',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Duden-Abiturhilfen Kunstgeschichte : (11./13. Schuljahr). - 1.. Von den Anf\\xe4ngen bis zum 18. JahrhundertKunst00237374',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Kammerlohr - Kunst im \\xdcberblick : Stile - K\\xfcnstler - Werke / Walter Etschmann ; Robert Hahne ; Volker Tlusty7 Ets00302818',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Kunst : 7. Klasse bis Abitur / [Autoren Klaus Borkmann ...]7 Dud01083769',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Duden, Abiwissen Kunstgeschichte : von der Antike bis zum 21. Jahrhundert ; [Abitur] / [Autorin: Eva Bambach-Horst]Kunst01208988',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'}]}\n"
]
}
],
"source": [
"payload = {'cardnumber': 'B123456', 'password': '123456'}\n",
"\n",
"r = requests.post('http://localhost:5000/api/rented', data=json.dumps(payload), headers=headers)\n",
"\n",
"pprint(r.json())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bis jetzt parse ich hier auch nur die Basics. Neben Ausleih und Fälligskeitsdatum gibt es auch den Punkt \"notes\". Da würden zum Beispiel fällige Gebühren stehen.\n",
"\n",
"Als erste Beispielanwendung wollte ich den ical-Support einbauen. Ich habe mich dazu entschieden Kartennummer und Passwort, durch einem dem Server bekannten KEY, in ein Token zu kodieren. Die komplette URL kann man per URL anfordern in dem man ihm Kartennummer und Passwort sendet."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{u'url': u'http://localhost:5000/ical/rented.ics?token=W3siY2FyZG51bWJlciI6IkIxOTM1NTEiLCJwYXNzd29yZCI6IjE3LjA3LjE5ODcifSx7fV0.3OgATqehpVhdnyU4dlW8LPMiR6g'}\n"
]
}
],
"source": [
"payload = {'cardnumber': 'B123456', 'password': '123456'}\n",
"\n",
"r = requests.post('http://localhost:5000/api/ical-url', data=json.dumps(payload), headers=headers)\n",
"\n",
"pprint(r.json())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"na mal schauen was mir die url zurück liefert."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"BEGIN:VCALENDAR\n",
"PRODID:ics.py - http://git.io/lLljaA\n",
"VERSION:2.0\n",
"BEGIN:VEVENT\n",
"DTSTAMP:20150612T090919Z\n",
"DTSTART:20150617T000000Z\n",
"SUMMARY:Bibliothekrueckgabe: 5 Teile\n",
"DESCRIPTION:- Duden-Abiturhilfen Kunstgeschichte : 11. bis 13. Klasse. - 2.. 19. und 20. JahrhundertKunst00237375\\n- Duden-Abiturhilfen Kunstgeschichte : (11./13. Schuljahr). - 1.. Von den Anfängen bis zum 18. JahrhundertKunst00237374\\n- Kammerlohr - Kunst im Überblick : Stile - Künstler - Werke / Walter Etschmann \\; Robert Hahne \\; Volker Tlusty7 Ets00302818\\n- Kunst : 7. Klasse bis Abitur / [Autoren Klaus Borkmann ...]7 Dud01083769\\n- Duden\\, Abiwissen Kunstgeschichte : von der Antike bis zum 21. Jahrhundert \\; [Abitur] / [Autorin: Eva Bambach-Horst]Kunst01208988\n",
"UID:d500f008-1ecb-4f55-85e5-38fd13ff31d1@d500.org\n",
"END:VEVENT\n",
"END:VCALENDAR"
]
}
],
"source": [
"%%bash\n",
"http GET http://localhost:5000/ical/rented.ics?token=W3siY2FyZG51bWJlciI6IkIxOTM1NTEiLCJwYXNzd29yZCI6IjE3LjA3LjE5ODcifSx7fV0.3OgATqehpVhdnyU4dlW8LPMiR6g"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Und diese URL funktioniert im Thunderbird wie auch im Google Calendar. Ein paar Basics habe ich also eingebaut. Das Projekt ist auch noch lange nicht am Ende. Mir ging es erstmal darum sowas zu hacken um zu sehen was es für Möglichkeiten gibt wenn man mal API Zugriff auf die Daten hätte. Das es sich hierbau um einen Dirty-Hack handelt ist mir klar. Wir brauchen die API in nativ mit Soße und scharf."
]
}
],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "Python 2", "display_name": "Python 2",
@ -209,8 +16,208 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython2", "pygments_lexer": "ipython2",
"version": "2.7.8" "version": "2.7.8"
} },
"name": "",
"signature": "sha256:32b1da6142bc28f4fac89e1d27afdd40e2d6ab60410a9e5f2009628e053cabcd"
}, },
"nbformat": 4, "nbformat": 3,
"nbformat_minor": 0 "nbformat_minor": 0,
} "worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alles ist besser mit \u00f6ffentlich zug\u00e4nglichen API's. Sogar St\u00e4dte. Konnte keiner mit rechnen. Gerade aktuell ist mir keine Stadt in Deutschland bekannt die erstmal ohne viel B\u00fcrokratie \u00f6ffentliche API's zu verf\u00fcgung stellt. Und zwar am besten alles was unter der eigenen Verwaltung steht. Zum Beispiel die Daten der \u00f6ffentlichen Verkehrsmittel oder halt auch die Stadtbibliothek. Und so war in auf einem Spaziergang durch N\u00fcrnberg mit einem guten Freund. Wir unterhielten uns \u00fcber die gro\u00dfe H\u00fcrde verwendbare Daten von der Stadt zu bekommen. Ich zum Beispiel habe oft das Problem, dass ich nicht mehr wei\u00df wann meine B\u00fccher zur\u00fcck zur Bibliothek m\u00fcssen. Ok gut. Die Stadtbibliothek bietet eine [Website](http://www.nuernberg.de/internet/stadtbibliothek/) an in der man sich einloggen kann und ein paar Informationen bekommt. Neben einer Suche gibt es auch eine \u00dcbersicht der ausgeliehenden B\u00fccher und dem R\u00fcckgabe Datum. Die ganze Seite ist ein Schmerz im Arsch. Es gibt sehr skurille Login-Sessions mit sehr komisch generierten Urls. Und was will man? Eine sch\u00f6ne Bibliotheks-App? Noch praktischer: Ein ical-File welches ich in den Kalendar meiner Wahl einbinden kann. Also kam ich zu dem schlu\u00df einen Wrapper zu bauen. Am besten w\u00e4re es wenn am Ende eine API rauskommt auf der andere Apps aufbauen k\u00f6nnen. War nicht so einfach wie ich gedacht habe. Als erstes hatte ich einfach [requests](http://docs.python-requests.org/en/latest/) und [BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/) probiert. Damit konnte ich selbst nach Tagen den Login nicht hinbekommen. Den zweiten Anlauf bestritt ich mit [RoboBrowser](https://github.com/jmcarp/robobrowser). Der setzt auch auf requests und BeautifulSoup, soll aber gut mit Sessions und Cookies zurecht kommen. Gleiches Spiel. Suche habe ich hinbekommen, den Login aber nicht. An diesem Zeitpunkt war ich kurz davor das Projekt in die Tonne zu treten. Dann googelte ich umher und fand [selenium](https://de.wikipedia.org/wiki/Selenium). Ein Testingframework um Webapps zu testen. Eigentlich daf\u00fcr da um verschiedene installierte Browser zu \u00f6ffnen um automatisch zu testen ob die Seite auch funktiert. Nun gibt es einen WebKit Browser der ohne grafische Oberfl\u00e4che auskommt. [PhantomJS](http://phantomjs.org/). Ist eigentlich daf\u00fcr da um die automatisierten Tests schneller durchlaufen zu lassen. Na klar, man muss nicht erstmal Chrome oder Firefox \u00f6ffnen lassen. Dieser tut es nun um Hintergrund der API. Er browst die Seiten ab und \u00fcbergibt den Source an BeautifulSoup. Das aufgearbeiteten Daten gehen dann per [Bottle](http://bottlepy.org), [Gunicorn](http://gunicorn.org/) und NGINX raus. Das ganze ist nat\u00fcrlich ein fieser Hack... aber es funktioniert. Zum vereinfachten Rollout benutze ich [Docker](https://www.docker.com/) und [Ansible](http://www.ansible.com/home). Mir geht es garnicht darum das alle auf einer API rumklicken. Da es sich um einen Hack handelt soll es so einfach wie m\u00f6glich sein seine eigene API aufzusetzen. Aber schauen wir uns erstmal an welche Sachen funktionieren. Daf\u00fcr benutze ich mein geliebtes requests..."
]
},
{
"cell_type": "code",
"collapsed": true,
"input": [
"import requests\n",
"import json\n",
"from pprint import pprint"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Es ist wichtig das wir JSON an die API senden. Dazu ist mir aufgefallen das es f\u00fcr requests n\u00f6tig ist den richtigen Header zu setzen."
]
},
{
"cell_type": "code",
"collapsed": true,
"input": [
"headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"payload = {'name': 'american splendor'}\n",
"\n",
"r = requests.post('http://localhost:5000/api/search', data=json.dumps(payload), headers=headers)\n",
"\n",
"pprint(r.json())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{u'results': [{u'available': False,\n",
" u'name': u'American Splendor [DVD] / Paul Giamatti, Hope Davis. Dir. by Robert Pulcini ... ',\n",
" u'type': u'DVD-Video/-Audio',\n",
" u'year': u'2005-01-01'}]}\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Es wird eine Liste mit Items zur\u00fcckgegeben. In diesem Fall habe ich nach [American Splendor](https://de.wikipedia.org/wiki/American_Splendor) gesucht. Es gab nur einen Treffer. Bis jetzt sind folgende Informationen abrufbar: Verf\u00fcgbarkeit, Name, der Typ (in diesem Fall eine DVD) und das Erscheinungsjahr. Zuk\u00fcnftig will ich noch mehr Sachen parsen und vor allem auch bei der Anfrage mehr Optionen anbieten. Zum Beispiel das man gleich sagen kann \"Gib mir nur DVD's\". Aber ich wollte erstmal die f\u00fcr mich relevanten Informationen auslesen.\n",
"\n",
"Ein weitere Basis-Funktion war das auslesen der noch ausgeliehenden Teile. Dies macht man durch die Angabe von Kartennummer und Passwort."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"payload = {'cardnumber': 'B123456', 'password': '123456'}\n",
"\n",
"r = requests.post('http://localhost:5000/api/rented', data=json.dumps(payload), headers=headers)\n",
"\n",
"pprint(r.json())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{u'results': [{u'from_date': u'2015-05-20',\n",
" u'name': u'Duden-Abiturhilfen Kunstgeschichte : 11. bis 13. Klasse. - 2.. 19. und 20. JahrhundertKunst00237375',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Duden-Abiturhilfen Kunstgeschichte : (11./13. Schuljahr). - 1.. Von den Anf\\xe4ngen bis zum 18. JahrhundertKunst00237374',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Kammerlohr - Kunst im \\xdcberblick : Stile - K\\xfcnstler - Werke / Walter Etschmann ; Robert Hahne ; Volker Tlusty7 Ets00302818',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Kunst : 7. Klasse bis Abitur / [Autoren Klaus Borkmann ...]7 Dud01083769',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'},\n",
" {u'from_date': u'2015-05-20',\n",
" u'name': u'Duden, Abiwissen Kunstgeschichte : von der Antike bis zum 21. Jahrhundert ; [Abitur] / [Autorin: Eva Bambach-Horst]Kunst01208988',\n",
" u'notes': u'',\n",
" u'till_date': u'2015-06-17'}]}\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bis jetzt parse ich hier auch nur die Basics. Neben Ausleih und F\u00e4lligskeitsdatum gibt es auch den Punkt \"notes\". Da w\u00fcrden zum Beispiel f\u00e4llige Geb\u00fchren stehen.\n",
"\n",
"Als erste Beispielanwendung wollte ich den ical-Support einbauen. Ich habe mich dazu entschieden Kartennummer und Passwort, durch einem dem Server bekannten KEY, in ein Token zu kodieren. Die komplette URL kann man per URL anfordern in dem man ihm Kartennummer und Passwort sendet."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"payload = {'cardnumber': 'B123456', 'password': '123456'}\n",
"\n",
"r = requests.post('http://localhost:5000/api/ical-url', data=json.dumps(payload), headers=headers)\n",
"\n",
"pprint(r.json())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{u'url': u'http://localhost:5000/ical/rented.ics?token=W3siY2FyZG51bWJlciI6IkIxOTM1NTEiLCJwYXNzd29yZCI6IjE3LjA3LjE5ODcifSx7fV0.3OgATqehpVhdnyU4dlW8LPMiR6g'}\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"na mal schauen was mir die url zur\u00fcck liefert."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%bash\n",
"http GET http://localhost:5000/ical/rented.ics?token=W3siY2FyZG51bWJlciI6IkIxOTM1NTEiLCJwYXNzd29yZCI6IjE3LjA3LjE5ODcifSx7fV0.3OgATqehpVhdnyU4dlW8LPMiR6g"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"BEGIN:VCALENDAR\n",
"PRODID:ics.py - http://git.io/lLljaA\n",
"VERSION:2.0\n",
"BEGIN:VEVENT\n",
"DTSTAMP:20150612T090919Z\n",
"DTSTART:20150617T000000Z\n",
"SUMMARY:Bibliothekrueckgabe: 5 Teile\n",
"DESCRIPTION:- Duden-Abiturhilfen Kunstgeschichte : 11. bis 13. Klasse. - 2.. 19. und 20. JahrhundertKunst00237375\\n- Duden-Abiturhilfen Kunstgeschichte : (11./13. Schuljahr). - 1.. Von den Anf\u00e4ngen bis zum 18. JahrhundertKunst00237374\\n- Kammerlohr - Kunst im \u00dcberblick : Stile - K\u00fcnstler - Werke / Walter Etschmann \\; Robert Hahne \\; Volker Tlusty7 Ets00302818\\n- Kunst : 7. Klasse bis Abitur / [Autoren Klaus Borkmann ...]7 Dud01083769\\n- Duden\\, Abiwissen Kunstgeschichte : von der Antike bis zum 21. Jahrhundert \\; [Abitur] / [Autorin: Eva Bambach-Horst]Kunst01208988\n",
"UID:d500f008-1ecb-4f55-85e5-38fd13ff31d1@d500.org\n",
"END:VEVENT\n",
"END:VCALENDAR"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Und diese URL funktioniert im Thunderbird wie auch im Google Calendar. Ein paar Basics habe ich also eingebaut. Das Projekt ist auch noch lange nicht am Ende. Mir ging es erstmal darum sowas zu hacken um zu sehen was es f\u00fcr M\u00f6glichkeiten gibt wenn man mal API Zugriff auf die Daten h\u00e4tte. Das es sich hierbau um einen Dirty-Hack handelt ist mir klar. Wir brauchen die API in nativ mit So\u00dfe und scharf."
]
}
],
"metadata": {}
}
]
}

@ -1 +1 @@
Subproject commit fda474fb90473874f5a0f04b6dda2d4db7c4503e Subproject commit da4487d6be46966818c05abc5b58322139b597e4

View File

@ -13,8 +13,6 @@ RELATIVE_URLS = True
GITHUB_URL = 'http://github.com/xsteadfastx/' GITHUB_URL = 'http://github.com/xsteadfastx/'
TWITTER_NAME = 'xsteadfastx' TWITTER_NAME = 'xsteadfastx'
DISQUS_SITENAME = "xsteadfastx"
#ISSO_URL = 'http://comments.xsteadfastx.org'
FLATTR_USER = 'xsteadfastx' FLATTR_USER = 'xsteadfastx'
PDF_GENERATOR = False PDF_GENERATOR = False
REVERSE_CATEGORY_ORDER = True REVERSE_CATEGORY_ORDER = True
@ -77,10 +75,3 @@ LOAD_CONTENT_CACHE = True
# disable tags # disable tags
TAGS_SAVE_AS = '' TAGS_SAVE_AS = ''
TAG_SAVE_AS = '' TAG_SAVE_AS = ''
# PIWIK
PIWIK_URL = 'piwik.luftmentsh.org'
PIWIK_SITE_ID = 5
# TWITTER
TWITTER_CARDS = True

View File

@ -19,5 +19,14 @@ FEED_DOMAIN = SITEURL
# Following items are often useful when publishing # Following items are often useful when publishing
#DISQUS_SITENAME = "" # PIWIK
#GOOGLE_ANALYTICS = "" PIWIK_URL = 'piwik.luftmentsh.org'
PIWIK_SITE_ID = 5
# TWITTER
TWITTER_CARDS = True
# DISQUS
DISQUS_SITENAME = "xsteadfastx"
#ISSO_URL = 'http://comments.xsteadfastx.org'

View File

@ -1,50 +1,22 @@
BeautifulSoup==3.2.1
Jinja2==2.8 Jinja2==2.8
Markdown==2.4 Markdown==2.6.2
MarkupSafe==0.23 MarkupSafe==0.23
PyYAML==3.11 PyYAML==3.11
Pygments==2.0.2 Pygments==2.0.2
Unidecode==0.04.18 Unidecode==0.04.18
argparse==1.2.1
backports.ssl-match-hostname==3.4.0.2
beautifulsoup4==4.3.2
binaryornot==0.4.0 binaryornot==0.4.0
blinker==1.3 blinker==1.4
certifi==2015.04.28
chardet==2.3.0 chardet==2.3.0
click==3.3 click==3.3
cookiecutter==1.0.0 cookiecutter==1.0.0
decorator==4.0.2
docutils==0.12 docutils==0.12
feedgenerator==1.7 feedgenerator==1.7
funcsigs==0.4 ipython==2.4.1
functools32==3.2.3-1
ghp-import==0.4.1
ipykernel==4.0.3
ipython==4.0.0
ipython-genutils==0.1.0
jsonschema==2.5.1
jupyter-client==4.0.0
jupyter-core==4.0.4
lxml==3.4.2
mistune==0.7
mock==1.3.0 mock==1.3.0
nbconvert==4.0.0
nbformat==4.0.0
notebook==4.0.4
path.py==7.6.1
pbr==1.5.0 pbr==1.5.0
pelican==3.6.0 pelican==3.6.3
pexpect==3.3
pickleshare==0.5
ptyprocess==0.5
python-dateutil==2.4.2 python-dateutil==2.4.2
pytz==2015.4 pytz==2015.4
pyzmq==14.7.0 pyzmq==14.7.0
requests==2.6.0
simplegeneric==0.8.1
six==1.9.0 six==1.9.0
terminado==0.5
tornado==4.2.1 tornado==4.2.1
traitlets==4.0.0
wsgiref==0.1.2

View File

@ -1,5 +1,10 @@
FROM 32bit/ubuntu:14.04 FROM 32bit/ubuntu:14.04
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y \ && apt-get install -y \
software-properties-common \ software-properties-common \