Archiv der Kategorie: Development

Literaturverwaltung mit Zotero und BibTex

Da ich aktuell an meiner Masterarbeit sitze und nach einem halbwegs automatischen Prozess gesucht habe, um von den diversen Paper-Quellen zu halbwegs vernünftigen BibTex-Einträgen zu kommen, habe ich Zotero als mein Tool der Wahl auserkoren.

Zotero, die unkomplizierte Literaturverwaltung

Dabei handelt es sich sowohl um eine Online-Plattform als auch um ein Browserplugin oder eine standalone Applikation die sich recht gut unter Linux/Windows/Mac oder eben im Browser nutzen lässt.
Sobald man das Paper seiner Wahl gefunden hat kann man es direkt in der Zotero-Datenbank via Browserplugin abglegen lassen (Synchronisation mit dem Server ist direkt mit dabei, arbeiten an verschiedenen Rechnern ist ohne Probleme möglich). Sehr praktisch ist auch die Möglichkeit Einträge zu annotieren oder mit Tags zu versehen.
Sobald man jetzt den nächsten Schritt in Richtung LaTex bzw. BibTex macht hilft Zotero ebenfalls weiter. Hier hat man die Möglichkeit die Einträge seiner Wahl gesammelt als BibTex Bibliography (.bib-Datei) zu exportieren.
Wichtig dabei ist, dass man darauf achtet vor dem Export mindestens die Punkte Autor, Jahr und Titel für alle Einträge sinnvoll gefüllt zu haben.

BibTex Literaturverzeichnis ohne Überraschungen

Jetzt kommt der spannende Teil: Das Literaturverzeichnis
Beim Erzeugen des Literaturverzeichnisses gibt es einige Stolperfallen die man zuvor beachten sollte. BibTex mag auf keinen Fall alte Output-Files (*.bbl, *.blg, *.aux, *.out, …), dementsprechend immer in einem gesäuberten Buildverzeichnis arbeiten. Außerdem muss pdfLaTeX vor dem Ausführen von BibTex als auch danach ausgeführt werden.
Letztlich kommt es noch darauf an welches Bibliographiesystem man verwendet. Hier habe ich das natbib Paket im Einsatz. Diese ermöglicht es den url-Tag des Zotero-Exports als klickbare URL anzuzeigen. Zustätzlich muss noch das hyperref Paket mit an Board sein.

\usepackage[square,numbers]{natbib}
\usepackage{hyperref}
\bibliographystyle{abbrvnat}
\bibliography{bibliography}
bibliography example

Die Ausgabe am Ende mit klickbaren URLs

Beispiel

Ein vollständiges Beispiel gibts hier.

Quellen

Barcamp Karlsruhe 2014

Bp12-FaCYAADxcw

Heute möchte ich mal vom 3. Karlsruher BarCamp berichten, welches vom 15. bis 16.11.2014 in der Karlshochschule statt fand und ich selbst Samstags besuchen konnte. Generell zeichnet sich das BarCamp-Konferenzformat dadurch aus, dass jeder Teilnehmer aktiv wird – Jeder? Ja, wirklich jeder hat die Chance sich in Form einer eigenen Session oder aber eines Sessionwunsches einzubringen. Es wurde durch die Organisation unter der Leitung von @FabianBeiner aka Gurkentruppe quasie nur der Rahmen geschaffen, was natürlich eine respektable und großartige Leistung war! Die Inhalte liefern dagegen wirklich nur die Teilnehmer und das durchaus auf sehr hohen Niveau und mit viel Engagement.

Dabei konnten die thematischen Inhalte als auch die beruflichen Hintergründe der Teilnehmer nicht konträrer sein. Vom Software entwickelnden „Alleskönners“ (Zitat des Teilnehmers) über den Nettomitarbeiter oder den Krankenpfleger hatte sich wirklich ein bunter Haufen von Nah und Fern (sogar von Hamburg angereiste Gäste) zum #BCKA14 zusammen gefunden.

Nachdem die Sessionvorschläge den einstündigen Slots in insgesamt fünf Tracks zugeteilt waren ging es direkt los mit geballtem Infotaiment, welches mit sehr gutem Catering, viel Kaffee und Mate begleitet wurde. Da man bekanntlich ja nur auf einer Hochzeit tanzen kann, werde ich im folgenden nur auf die von mir besuchen Vorträge eingehen (etwas technik-lastiger als die Veranstaltung selbst).

Beim Vortrag um E-Mail-Verschlüsselung von @zeitschlag konnten erste Schritte zur PGP verschlüsselten Email gemacht werden. Praktische Tricks sowie die Diskussion rund um das Thema „Kostenlos-Mentalität“ und Usability von Verschlüsselung rundeten die Session ab.

dancin1 Das Informationsdesign und die Datenvisualisierung waren bei @zwitscherjoe die Themem. Es wurde eindrucksvoll gezeigt, dass bereits von über 100 Jahren extrem komplexe sowie aussagekräftige Infografiken gestaltet wurden. Anhand von Beispielen konnte der Zuhörer viele Gestaltungsformen und deren unterschiedliche Wirkung kennen lernen. Beispielsweise wurden 1735 Schrittfolgen von Tänzen visualisiert und grafisch aufbereitet.

DevoxxWithoutBrackets_PNG_300px_de Weiter ging es dann bei mir mit der Vorstellung des diesjährig ersten Devoxx4Kids in Karlsruhe bei der Kinder zwischen 10 und 14 Jahren erste Erfahrungen mit Technik, Programmieren und Basteln mit Elektronik in verschiedenen Workshops machen konnten. Das aus der belgischen Devoxx entstandene Konzept wurde dabei durch die Veranstalter um @KatjaArrasz und @cmennerich komplett übersetzt und bringt den Kindern spielerisch auf Basis von Scratch oder Workshops mit dem kleinen humanoiden Roboter Nao das programmieren, sowie viele logische Konzepte näher. Ein ganz besonderer Bestandteil der Karlsruher Veranstaltung: Ein eigens für die Veranstaltung programmierter Quadrocopter der durch simple Befehle durch die Kinder gesteuert werden konnte. Ein wirklich tolles Konzept um die Hemmschwelle und Vorurteile gegenüber Technik und Computern zu verlieren!

Docker Technisch ging es für mich weiter, diesmal im Bereich DevOps wo durch @RobertReiz die Container-Plattform Docker vorgestellt wurde. Damit können die Abhängigkeiten von Libraries und verschiedenen Versionsständen in einem Plattform-unabhängigen Container gekapselt werden und somit ohne größere Probleme auf anderen Maschinen ausgebracht werden.

In der nachfolgenden Session ging es dann hoch hinaus. Das FPV Modellfliegen wurde direkt am echten Gerät vorgestellt sowie die dafür notwendigen Funktechniken und ersten Schritte um in die Thematik einzusteigen. Wer einen Flug wagen möchte kann sich hier in die Lüfte schwingen (Schwindelgefahr!).

Abschließend wurde es dann nochmal philosophisch in einer Diskussionssession rund um die Technikfolgenabschätzung sowie den Themenkomplex um den Gläsernen Bürger wurde kontrovers über viele Aspekte zwischen Ethik, Verantwortung und Empathie diskutiert.

Aber auch nicht-technische Themen waren auf dem BarCamp vertreten – Beispielsweise Reiseberichte über Grönland oder über alternative Beziehungsformen waren sehr beliebt und gut besucht. Auch der Vortrag rund um die Discounter und deren Wirken hinter den Kulissen oder das tägliche Leben in deutschen Notaufnahmen rundeten die Veranstaltung ab.

Ein großen Dank gebührt an dieser Stelle nochmal den Veranstaltern, welche mit Hilfe zahlreicher Sponsoren ein solch großartiges Event möglich machten!
Ich komme wieder!

CouchDB: restore deleted documents

This is a python based approach to restore deleted documents from couchdb if you have not compacted the database already. The following code snipped is based on this solution.

#!/usr/bin/python

import httplib
import json

SERVER_URL = 'localhost:5984' # host address
FILE_NAME = 'deleted.json' # one line in deleted.json: id,rev\n (comma-seperatet id and rev of deleted doc one line each)
DB_NAME = 'db' #database name

conn = httplib.HTTPConnection(SERVER_URL)

def count_lines(filename):
    lines = 0
    for line in open(filename):
        lines += 1
    return lines

with open(FILE_NAME) as file:
	i = 0
	count = count_lines(FILE_NAME)
	for line in file:
		i += 1
		print 'Document [{}/{}]'.format(i,count)
		
		doc = line.split(',')
		id = doc[0]
		rev = doc[1].rstrip()
		
		#empty doc
		uri = '/{}/{}?rev={}'.format(DB_NAME, id, rev)
		body = '{}'
		headers = {"Content-type": "application/json"}
		print uri
		conn.request("PUT", uri, body, headers)
		r = conn.getresponse()
		r.read()
		
		#get old rev
		uri = '/{}/{}?revs_info=true'.format(DB_NAME, id)
		conn.request("GET", uri)
		print uri
		r = conn.getresponse()
		obj = json.loads(r.read())
		oldRev = obj['_revs_info'][2]['rev'].encode("utf-8")
		print oldRev
		currentRev = obj['_revs_info'][0]['rev'].encode("utf-8")
		print currentRev
		
		#get old doc
		uri = '/{}/{}?rev={}'.format(DB_NAME, id, oldRev)
		print uri
		conn.request("GET", uri)
		r = conn.getresponse()
		doc = r.read()
		
		#restore old doc
		uri = '/{}/{}?rev={}'.format(DB_NAME, id, currentRev)
		print uri
		body = doc.replace(oldRev, currentRev)
		headers = {"Content-type": "application/json"}
		conn.request("PUT", uri, body, headers)
		r = conn.getresponse()
		print r.read()

Transfer data via AJAX to NodeJS

Prerequisites

  • NodeJS with Express

Client-Side Code

I’m using a jQuery UI DatePicker as an example. But it can be transferred to any other element for doing an AJAX-Call.

$(document).ready(function() {
	$('#datepicker').datepicker( { 
		onSelect: function(date, pickerInstance){ 
			$.ajax({
				url: '/datepicker',
				data: {'date':date},
				type: 'POST'
			});
		}
	} );
});

Server-Side Code

This code is running on NodeJS.

var app = express()
app.use(express.bodyParser()); // must be before any 'app.use(express.static(__dirname + '/public'))'-statements

...

app.post('/datepicker', function(request, response){
  console.log(request.body)       // your JSON
  response.send(request.body);    // echo the result back
});

It is important to have app.use(express.bodyParser());, which is used for JSON parsing, in the very beginning of the server code. Any routing stuff like app.use(express.static(__dirname + '/public')) must be set afterwards, otherwise the request.body will be undefined.

Mehrere Domains auf einen Uberspace aufschalten

Seid einiger Zeit ist dieser Blog auf Uberspace umgezogen. Grund dafür war zum einen das Bezahlmodell als auch die unkomplizierte Nutzbarkeit eines Shared-Hosts. Da ich außer meiner Hauptdomain honnel.de mittlerweile ein weiteres Projekt in Angriff nehmen möchte, habe ich sich erst einmal auf meinen bestehenden Uberspace aufgeschaltet.

Szenario

Um das Szenario etwas greifbarer zu machen hier mal das Setup:

Diese Domains und beliebige Subdomains sollen nun auch entsprechende Unterverzeichnisse weitergeleitet werden. Außerdem sollen für beide Domains entsprechende getrennte Mail-Adressen vergeben werden können.

Weiterlesen

Was macht diese RegExe?

(?:http://(?:(?:(?:(?:(?:a-zA-Zd?). )(?:a-zA-Z?))|(?:(?:d+)(?:.(?:d+) ){3}))(?::(?:d+))?)(?:/(?:(?:(?:(?:[a-zA-Zd$-.+!'(),]|(?:%[a-fA-F d]{2}))|[;:@&=]))(?:/(?:(?:(?:[a-zA-Zd$-.+!'(),]|(?:%[a-fA-Fd]{ 2}))|[;:@&=]))))(?:?(?:(?:(?:[a-zA-Zd$-.+!'(),]|(?:%[a-fA-Fd]{ 2}))|[;:@&=])))?)?)|(?:ftp://(?:(?:(?:(?:(?:[a-zA-Zd$-.+!'(),]|(? :%[a-fA-Fd]{2}))|[;?&=]))(?::(?:(?:(?:[a-zA-Zd$-_.+!'(),]|(?:%[a- fA-Fd]{2}))|[;?&=])))?@)?(?:(?:(?:(?:(?:a-zA-Zd?).)* (...)

Weiterlesen

wikipedia2bibtex

Hier ein kleines Python-Script um aus einem Wikipedia-Artikel einen BibTex-Eintrag zu generieren.

Known Issues

  • Leider habe ich noch keine schöne Variane gefunden das Artikel Jahr rauszufinden. Deswegen wird immer das aktuelle Jahr gesetzt.
  • Als Key des BibTex-Eintrags wird immer der seitenspezifische URL Abschnitt genommen. Dabei kann es zu Problemen kommen wenn Sonderzeichen o. ä. benutzt werden.
import sys
import urllib.request
from bs4 import BeautifulSoup
import time
import re

urlstring = sys.argv[1];
print('try to retrieve "%s"...' % urlstring)

try:
 req = urllib.request.Request(urlstring, headers={'User-Agent' : "Magic Browser"})
 with urllib.request.urlopen(req) as url:
 wikisite = url.read()
except ValueError:
 sys.stderr.write('unkown url type "%s"n' % urlstring)
 sys.exit(1)

soup = BeautifulSoup(wikisite)
label = urlstring.rsplit('/',1)[1]
title = soup.title.string
title = title.split('–',1)[0]
title = title.split('-',1)[0]
year = time.strftime("%Y")
timestamp = time.strftime("%d.%m.%Y")

print('@misc{wiki:%s,ntauthor = "Wikipedia",nttitle = "%s--- {W}ikipedia", ntyear = "%s", nthowpublished = "%s", ntnote = "[Online; accessed %s]"n}' % (label, title, year, urlstring, timestamp))

Datenfresser

Pacman frisst und frisst und frisst... Nachdem ich es endlich geschafft habe das Buch „Die Datenfresser“ von Constanze Kurz und Frank Rieger zu lesen, kann ich nur noch mehr jeden dazu Aufrufen sich in Punkten Privatsphäre und Datenschutz weiterzubilden. Was die großen Firmen wie klein f und groß G gemeinsam mit Pacman haben ist der unendliche Hunger! Leider aber nicht nach gelben Punkten sondern nach Daten: Deinen Daten, vor allem im Kontext zu deiner Person. Die personalisierte Werbung ist ein Faktor warum persönlichen Profile, Nutzungsgewohnheiten und Kurznachrichten so wertvoll sind. Was daraus noch gewonnen werden kann bringt die Zeit.
Jeder sollte sich in Tagen in denen Face Recognition und Authentifizierung per Kreditkarte immer mehr Verbreitung findet ein eigenes Verständnis und Bewusstsein für seine persönliche Privatsphäre finden. Die bekannten Beispiele wie die Bilder vom letzten Abschuss auf der Uniparty der beim Bewerbungsgespräch auf dem Tisch liegt sind allen bekannt. Auch die Skandale über geographische Nutzerprofile bei Smartphones wurden überall durchgekaut. Doch trotzdem scheren sich viel zu wenig Menschen tatsächlich darum und geben sich den vermeintlich „kostenlosen“ Services hin – Das sind sie aber ganz gewiss nicht. Ein Blick ich so manche Datenschutz-Klauseln gibt die tatsächlichen Kosten preis. Meist verliert man seine Rechte an den Bildern, Texten oder Videos komplett und verliert damit die Kontrolle über jegliche weitere Verwendung auch wenn man den Dienst kündigen sollte.
Auf politischer Ebene tut sich in der Richtung recht wenig. Die Politik kommt auf nationaler Ebene wenig gegen International agierende Dienste an. Die staatliche Seite hat seid dem 11. September 2001 in Sachen Datenschutz ebenfalls stark auf die Bremse getreten. So wurden erst vor kurzem eine Verlängerung der Anti-Terror-Gesetze von unserer Justizministerin Fr. Leutheusser-Schnarrenberger gebilligt. Die Terrorgefahr ist nach wie vor der Grund. Ein bisschen mehr Kontrolle schadet ja nie!
Spannende und beängstigende Entwicklungen die bisher noch wenig Gegenwehr hervorrufen. Wahrscheinlich fehlt einfach der Grundstein dafür in breiten Teilen der Bevölkerung.

Die Frage ist:
Wie schafft man eine Sensibilisierung von genau solche Themen? Wie erreicht man einen Punkt in dem man unterscheiden kann welche Daten man tatsächlich Preisgeben will?
Wie erzeugt man das Bewusstsein für Privatsphäre?

Level up?

1up Mushroom Super Mario Seit einigen Tagen bin ich dabei aus meiner Dropbox auszuziehen. Als neues Heim für meine Daten, hauptsächlich für die Uni, habe ich mir eine Mischung aus SVN und git rausgesucht. Grund für diesen Umstieg ist die doch nicht ganz so automatische Synchronisation von Daten in der Dropbox. Problematisch wird es nämlich sobald man versucht Datensicherheit mit TrueCrypt Containern um zusetzen [1]
Prinzipiell hatte das ganze den verlockenden Aspekt, dass beim Abgleich mit dem Server trotz großen TrueCrypt Containern nur die wirklichen Veränderungen abgeglichen werden. Doch sobald man an verschiedenen Rechnern nicht immer Dropbox im Hintergrund laufend hat kommt es nicht allzu selten zu „conflicted-state“ Dateien, welche Dropbox dann wieder anfängt komplett zu synchronisieren. Dass das bei großen Containern um die ein Gigabyte anstrengend wird kann man sich vorstellen.
Der Auslöser für den Umstieg war dann letztendlich der Dienst Assembla welcher zum einen kostenlosen SVN als auch git Support mit zwei Gigabyte Speicherplatz bietet. Ob sich diese manuelle Synchronisation über ein Versionskontrollsystem besser eignet um die an der Uni anfallenden Projekte und andere Daten auf allen Rechnern auf dem gleichen Stand zu halten wird sich zeigen.
Ein Vorteil den ich jetzt gleich zu Anfang gefunden habe, war die Möglichkeit das Repository einer meiner Vorlesungen (Softwaretechnik I) als „svn:externals“ in mein eigenes einzubinden. Somit bewirkt ein Update meiner Dateien gleichzeitig ein Update der vorlesungsrelevanten Daten. Klick gespart 🙂

Zum Thema git kann ich bis jetzt das Buch „Git kurz & gut“ von Sven Riedel (O’Reilly Verlag) empfehlen, in dem habe ich bis her alles gefunden was ich für den Anfang benötigt habe.

Wer prinzipiell einen Einblick in Versionskontrolle, vorallem im verteilten Sinne wie git sucht wird beim CRE130 fündig.