DateTime conversion can be tricky

:: JavaScript, Common Lisp, IT

I wrote a small Lisp application and a JavaScript client gets some data from that application. All time stamps are returned as “Lisp” time stamps, i.e. an integer with seconds where zero equals Jan 01 1900.

In the JS client the time stamp is then converted to JS time stamps, i.e. millisconds where zero equals Jan 01 1970.

When testing the application I noticed that sometimes the displayed date is one day behind. For example in the data base I have Jan 05 1980 but in JavaScript I get a Jan 04 1980. But some other dates worked: A time stamp Jan 05 1970 was correctly converted to Jan 05 1970.

I had a look into the JavaScript code and found:

convA = function(ts) {
  tmp = new Date(ts*1000);
  tmp.setFullYear(tmp.getFullYear() - 70);
  return tmp.getTime();
}

It’s likely the developer thought: “Well, it’s millisecond instead of second. Therefore I multiply by 1,000. But then I am 70 years in the future and I have to substract 70 years and everything will be ok.”

After thinking a while I came to the conclusion: Of course not!

The developer made the assumption that there are as many leap years between 1900 and 1970 as between ts and ts+70. Obviously that assumption does not hold for all time stamps. And therefore sometimes the resulting JavaScript date is one day behind.

So a better solution would be to substract all seconds between 1900 and 1970 from ts, multiply by 1,000 and treat this as a JavaScript time stamp. Perhaps best would be to do the conversion in the Lisp process and only deliver a JavaScript-like time stamp.

I learned something about symbols and packages

:: Common Lisp, IT

I am using Common Lisp for developing a web application. Several days ago a new part of this application didn’t worked as supposed and I spent a considerable large amount of time in finding the bug. It was a very simple problem with symbols where I mixed something up.

In the application the web server somewhen gets some JSON data from the browser. It is then converted to Lisp object using the CL-JSON package. This package converts JSON objects to a-lists and converts the member keys to symbols (see CL-JSON’s documentation. I then wanted to look something up in that a-list and failed.

I wrote a small test case to show the effect and explain what went wrong.

(ql:quickload '("hunchentoot" "cl-who"))
;; direct loading via ql only for demonstration purposes, normally I
;; would use a asdf:defsystem for that.

(in-package :cl-user)

(defpackage :my-app (:use :cl))

(in-package :my-app)

(defparameter *my-a-list* 
  '((foo . 100)
    (bar . 200)))   ;; in the real application this a-list is
		    ;; generated by a JSON-to-lisp conversion by
		    ;; CL-JSON; in CL-JSON the object member keys are
		    ;; converted to symbols.

(defun get-value (key)
  "Returns the value with KEY from *MY-A-LIST*."
  (cdr (assoc (intern (string-upcase key)) *my-a-list*)))

(hunchentoot:define-easy-handler (web-get-value :uri "/get-value") (id)
  (cl-who:with-html-output-to-string (*standard-output* nil :prologue t)
    (:p (cl-who:fmt "Value of ~a is: ~a" id (get-value id)))))

(defun start ()
  (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242)))

So on the REPL everything looks fine: MY-APP> (get-value "foo") 100 MY-APP> (get-value "bar") 200 MY-APP>

But when I used my web browser to give me these results as well I got something strange. For example here are some results when using curl: ~> curl http://localhost:4242/get-value?id=foo <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <p>Value of foo is: NIL</p>

I was puzzled: The value is NIL?

After some debugging I found out that the easy handler from Hunchentoot runs with *package* set to COMMON-LISP-USER (and not to MY-APP as I implicitly assumed). That means that assoc looked up COMMON-LISP-USER::FOO in the a-list where the keys are MY-APP::FOO and MY-APP::BAR. And this test fails. Therefore NIL is returned which is correct.

So I rewrote the get-value function to: (defun get-value (key) "Returns the value with KEY from *MY-A-LIST*." (cdr (assoc (intern (string-upcase key) (find-package :my-app)) *my-a-list*))) Now the symbols are interned in the same package and everything went well: ~> curl http://localhost:4242/get-value?id=foo <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <p>Value of foo ist: 100</p> ~> curl http://localhost:4242/get-value?id=bar <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <p>Value of bar ist: 200</p>

Therefore I was reminded to think about packages when interning symbols. A good guide to symbols and packages could be found in this document: The Complete Idiot’s Guide to Common Lisp Packages.

Unicode support for Octopress

:: Docker, Octopress, IT

Well, it seems Octopress/Jekyll would like to have a locale set for UTF–8 support. I followed this (text in German) hint and now my Dockerfile looks like this:

# dockerfile for octopress

FROM ubuntu:14.04
MAINTAINER krrrcks <krrrcks@krrrcks.net>
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update; \
  apt-get -q -y upgrade
RUN /usr/sbin/locale-gen en_US.UTF-8; \
  update-locale LANG=en_US.UTF-8
RUN apt-get -q -y install git curl; \
  apt-get clean
RUN git clone git://github.com/imathis/octopress.git /opt/octopress
RUN curl -L https://get.rvm.io | bash -s stable --ruby
ENV HOME /root
RUN echo "export LC_ALL=en_US.UTF-8" >> /root/.bashrc
RUN echo "export LANG=en_US.UTF-8" >> /root/.bashrc
RUN echo "source /usr/local/rvm/scripts/rvm" >> /root/.bashrc; 
RUN /bin/bash -l -c "source /usr/local/rvm/scripts/rvm; \
  rvm install 1.9.3; \
  rvm use 1.9.3; \
  rvm rubygems latest; \
  cd /opt/octopress; \
  gem install bundler; \
  bundle install; \
  rake install" 
RUN echo "rvm use 1.9.3" >> /root/.bashrc

WORKDIR /opt/octopress
EXPOSE 4000
CMD ["/bin/bash"] 

After playing around with Docker and Octopress I put the whole /opt/octopress folder on my host machine and then restarted the image with the -v flag. Therefore I can edit the files on my host machine with my favorite editor and use the container only for producing the HTML files, for preview and for publishing.

The rake preview is a neat feature because the server always looks for changed files and produces the HTML files on the fly. That means I can edit the files in my editor and could see the resulting pages in a browser nearly the same time.

Relaunch fast fertig

:: Homepage, Octopress

So, nach einigem Gefummel mit Ruby und Octopress und den Weiterleitungsmöglichkeiten meines Hosters ist die Sache wohl bald so am laufen, wie ich mir das vorstelle. Es fehlt noch ein wenig das Eindeutschen der Octopress-Texte und vielleicht so eine Kategorien-Liste rechts.

Ansonsten habe ich, um der “Gem-Hölle” zu entgehen, das Octopress in einen Docker-Container gepackt; hier ist ein Link zu dem verwendeten Dockerfile. Ich habe es dann auch so gemacht, dass ich das /opt/octopress-Verzeichnis auf den Host-Rechner verschoben habe und in den Container als Volume hineinpacke. So kann ich auf dem Host-Rechner ganz bequem mit dem Emacs die Files editieren und verwende den Container nur noch für die Erstellung, das “Preview” und für das Hochladen.

Die “preview”-Funktion ist übrigens ein wirklich nettes Features: Die kann man derart nutzen, dass ein Webserver den aktuellen Stand lokal ausliefert. Dabei beobachtet der Dienst, ob sich Dateien ändern und erstellt unmittelbar wieder die HTML-Seiten. So kann man bequem im Editor das Markdown bearbeiten und im Browser daneben das fertige Ergebnis beurteilen.

Ein Relaunch

:: Homepage, Octopress

Ich denke, mir geht es wie vielen: Nach einer gewissen Zeit, in der das bisherige Blog, die bisherige Web-Seite nicht gepflegt wird, steht irgendwann ein Neubeginn an, dann gleich mit einem “Relaunch” und vielen neuen und guten Vorsätzen.

Ich bin zwar nach wie vor ein großer Freund und Nutzer von Org-Mode, aber für das Führen eines Blogs erschien mir der Ablauf doch immer recht umständlich. Ich habe mir daher einmal Octopress angeschaut (vor allem, da die Blog-Funktion von Org-Mode, die ich nutzte, auch mit Jekyll arbeitete) und finde das eigentlich ganz hübsch. Einzig so ein wenig “eindeutschen” sollte ich es noch. Außerdem ist das Umleiten von der bisherigen Domain hierher noch ein wenig kaputt; mein bisheriger Hoster lässt mich das nicht so schön mit CNAME-Einträgen gestalten, wie das eigentlich gedacht ist.

Nun also ein Relaunch, aber ohne große Vorsätze. Es wird hier also nur selten und nur wenig zu lesen geben.

My Dockerfile for setting up Octopress

:: Docker, Octopress, IT

After my trouble with installing all the dependencies for Octopress I came up with the following Dockerfile for Docker. This follows the instructions from the Octopress homepage and uses RVM for managing the ruby dependencies.

# dockerfile for octopress

FROM ubuntu:14.04
MAINTAINER krrrcks <krrrcks@krrrcks.net>
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update; \
  apt-get -q -y upgrade
RUN apt-get -q -y install git curl; \
  apt-get clean
RUN git clone git://github.com/imathis/octopress.git /opt/octopress
RUN curl -L https://get.rvm.io | bash -s stable --ruby
ENV HOME /root
RUN echo "source /usr/local/rvm/scripts/rvm" >> /root/.bashrc; 
RUN /bin/bash -l -c "source /usr/local/rvm/scripts/rvm; \
  rvm install 1.9.3; \
  rvm use 1.9.3; \
  rvm rubygems latest; \
  cd /opt/octopress; \
  gem install bundler; \
  bundle install; \
  rake install" 
RUN echo "rvm use 1.9.3" >> /root/.bashrc

WORKDIR /opt/octopress
EXPOSE 4000
CMD ["/bin/bash"] 

Gießkanne oder nicht?

:: Wirtschaft

Zu dem wohl bisher nicht veröffentlichten Gutachten einiger Wirtschaftsforschungsinstitute zur Förderung der Neuen Länder wurde heute morgen im Deutschlandfunk der Wirtschaftsminister von Thüringen, Matthias Machnig interviewt.

Er sagt dort zum Plädoyer eine Förderung nach dem Gießkannenprinzip einzustellen:

“Alle Jahre wieder kommen solche Thesen auf, sie haben mit der Realität nichts zu tun, weil die Behauptung, man würde mit der Gießkanne Fördermittel verteilen, das ist lange vorbei.”

Nun kenne ich nicht die ganzen Programme, die dort etabliert sind und ich weiß auch nicht, wie die jeweiligen Programme in Thüringen vor Ort umgesetzt werden. Ich gehe aber einmal davon aus, dass sich zwischenzeitlich eine irgendwie geartete “Priorisierung” etabliert hat.

Ich möchte jedoch auf ein grundsätzliches Problem aufmerksam machen: Im Bereich der Städtebauförderung (hier ist beispielsweise über das Programm “Stadtumbau Ost” auch eine spezifische regionale Förderung durchgeführt und etabliert worden) stellt sich regelmäßig die Frage, wie die Mittel der Programme auf die Länder zu verteilen sind. So hat sich die Bauministerkonferenz in einer Arbeitsgruppe darüber Gedanken gemacht und ihre bisherige Verteilung im Sinne einer “problemorientierten” Verteilung im Jahr 2008 fortentwickelt. Hier sind 70% der Mittel nach Bevölkerung zu verteilen und die restlichen Prozente nach Bevölkerungsverlusten, Arbeitslosigkeit, Ausländeranteil, überdurchschnittlichem Bevölkerungsanteil über 65 Jahre.

So. Und nun schauen wir einmal in die Verwaltungsvereinbarung Städtebauförderung 2011 und sehen diesen oder einen sehr ähnlichen Schlüssel für alle Teilprogramme: 70% der Mittel nach Bevölkerung, der Rest nach anderen Indikatoren.

Nun frage ich mich: Was ist denn eine Verteilung nach Bevölkerung anderes als die oben beschriebene Gießkanne? Es müsste doch ein Zusammenhang zwischen Bevölkerung und dem jeweils zu behebenden Problem des Teilprogramms herzustellen sein. Der Nachweis wäre, insbesondere für den Wohnungsleerstand im Programm Stadtumbau Ost, ja erst noch zu erbringen. Bei einem Gespräch mit einem mit der Materie befassten habe ich vor Jahren einmal zu hören bekommen: Etwas anderes als nach Bevölkerung ist politisch gar nicht umsetzbar aber es ist natürlich im Grunde die Verteilung mit der Gießkanne und nicht nach dem Bedarf.

(Dieser Artikel hat einen Blablameter-Wert von 0.32.)

Zu den Rating-Agenturen und ihren Ratings

:: Wirtschaft

Frankreich verlor die Bestnote und sofort nehmen einige erneut die Rating-Agenturen in das Blickfeld (siehe bspw. den Bericht in der Süddeutschen). Hierzu ist auch der kleine Blick von Paul Krugman auf die Begründung von Standard & Poor’s sehr interessant.

Zur gleichen Zeit, in der in den Medien und auf der Straße die Schulden- und Euro-Krise diskutiert wird, nimmt ein weiterer Diskussionsstrang an Fahrt auf: Nutzen Volkswirte eigentlich die richtigen Ansätze und Modelle für ihre Theorien? So beispielsweise in den VDI-Nachrichten oder auch mit Hinblick auf die Fragen von Studierenden nach alternativen Modellen beim Spiegel.

Beide Entwicklungen hängen meines Erachtens an einer Stelle zusammen, dazu möchte ich allerdings ein wenig ausholen:

  1. Seit einiger Zeit (bestimmt gut 10–15 Jahre) hat sich in der Sicht auf die Unternehmensfinanzierung ein Wandel vollzogen. War gerade in Deutschland in früherer Zeit das Hausbankenprinzip vorherrschend, also Kreditbeziehungen zwischen Kreditnehmer und Bank, so hat sich dies in den letzten Jahren (auch regulatorisch erkennbar bspw. an Basel II) gewandelt zu einer stärker kapitalmarktorientierten Sicht auf die Finanzierung. In der soll gleichsam der Kapitalmarkt für die rechte Allokation des Finanzkapitals sorgen und sich die Unternehmen gemäß ihren Aussichten und Ideen um dieses Kapital bewerben. Damit verändert sich allerdings der Aufgabenbereich der Bank. War die Hausbank als Gläubiger früher selbst daran interessiert, dass sie mit Informationen über ihre Kreditnehmer versorgt wird, so schwindet dies Interesse, wenn sie lediglich für das Platzieren einer Anleihe oder den Zugang zum Kapitalmarkt benötigt wird. Eine solchermaßen tätige Bank wird ja nicht selbst zum Gläubiger, sondern verdient ihr Geld am Zusammenbringen von Investoren und kapitalsuchenden Unternehmen. Damit die Investoren jedoch eine Möglichkeit erhalten, die Unternehmen zu beurteilen, müssen sie sich, da ihnen die Einsichtsmöglichkeiten wie bei einer Hausbank früher verwehrt sind, auf den Ratschlag eines externen Dritten verlassen, dem externen Rating durch eine Rating-Agentur. 1
  2. Wären alle Randbedingungen (wie Nachfrage, Produktionsbedingen etc.) eines Marktes oder einer Volkswirtschaft bekannt, so verbliebe im Prinzip ein reines Allokationsproblem zwischen Anbietern und Nachfragern. Dies könnte im Extremfall auch ein Computerprogramm erledigen. Nun ist es in der Realität aber so, dass viele Dinge völlig unklar und unbekannt sind und darüberhinaus auch die Zukunft für die Akteure reichlich ungewiss ist. Tätigwerden an einem Markt bedeutet dann, die eigenen Schlüsse aus dem für einen selbst verfügbaren Datenmaterial zu ziehen und etwas auszuprobieren. In der Folge lässt sich erkennen, ob diese Initiative von Erfolg gekrönt wurde oder nicht und entsprechend neue Ideen und Initiativen daraus ableiten. Zugleich lassen sich Vorstöße von Wettbewerbern beobachten und ggf. nachmachen, also imitieren. Der Wettbewerb ist also nicht statisch, sondern besteht aus einer Vielzahl von vorstoßenden und nachstoßenden Akten. Damit wird unmittelbar klar, dass der Wettbwerb in einem solchen Markt von einer gewissen Heterogenität geprägt sein wird: Es wird initiative Unternehmen geben, die mit neuen Produkten oder Produktionsverfahren experimentieren, es wird eher reagierende Unternehmer geben, die beobachten und abwarten, sich eher auf bisher Bewährtes konzentrieren und ggf. einfach etwas imitieren.
  3. Wendet man diese Überlegung nun auf die Finanzierung von Unternehmen an, so kann man die Frage aufwerfen, warum man in Europa die eigenen Strukturen des Hausbankenprinzips auf Kosten der Kapitalmarktorientierung zurückgedrängt hat. Wäre es nicht im Sinne der Heterogenität sinnvoll, ein alternatives Konzept am Markt zu testen? Hier deutet sich schon ein erster Zusammenhang zur Theoriebildung in der Volkswirtschaftslehre an. Im Zuge der Verhandlungen über Basel II ist es schlicht nicht gelungen, sich mit eigenen theoretischen Vorstellungen gegenüber einem stärker am Kapitalmarkt orientierten Modell durchzusetzen. 2
  4. Wer sind nun diese Rating-Agenturen? Es fällt auf, dass es in Bezug auf die großen Schuldner nur einige wenige Agenturen gibt. In Bezug auf die Staatsschuldenkrise werden hier häufig Standard & Poor’s, Fitch, Moody’s genannt. Deren Ratings haben mit Sicherheit einen sehr großen Einfluss. Klar jedoch ist, dass diese Agenturen natürlich nur mit dem Blick durch ihre eigene theoretische Brille zu ihren Einschätzungen kommen können. Und diese ist wahrscheinlich (man mag mich da gerne korrigieren, ich habe es nicht geprüft) von der US-amerikanischem Mainstream-Ökonomie beeinflusst. 3 Es wundert daher nicht, dass die Einschätzungen der Rating-Agenturen sich in einer gewissen Weise gleichen oder gleichen Ansätzen folgen. Auch hier die Frage: Fördert Gleichförmigkeit im Denken und in den Ansätzen den Wettbewerb? Sollten nicht alternative Rating-Konzepte am Markt getestet werden?
  5. Und hier schließt sich der Kreis von den Rating-Agenturen hin zur Frage, wie Volkswirtschaftslehre überhaupt gelehrt wird. Märkte, aber auch Wissenschaftssysteme, die von Gleichförmigkeit geprägt sind, können alternative und unterschiedliche Hypothesen nicht prüfen. Der Wettbewerb auf Märkten, der Wettbewerb um die besten Theorien der Wirtschaftswissenschaften, benötigt eine gewisse Heterogenität. Es wird daher spannend zu sehen sein, ob sich aus der momentanen Krise alternative Konzepte entwickeln und ob sie sich an ihren jeweiligen Märkten bewähren können.

(Dieser Artikel hat einen Blablameter-Wert von 0.22.)

  1. Ich will nun hier nicht in die Diskussion einsteigen, ob das eine oder das andere System besser ist, dazu gäbe es sicherlich eine Menge zu sagen, aber das soll hier nicht der Punkt sein. 

  2. Dass man sich nun über die Folgen wundert, ist folglich völlig unverständlich, siehe bspw. mein Blogpost zum Vorhaben der EU, den Rating-Agenturen unter bestimmten Bedingungen die Publikation von Länderratings zu untersagen: Link zum Blog-Post 

  3. Einigen der Schimpftiraden über die deutschen Ökonomen kann ich allerdings nicht so recht folgen. So wurde den Ökonomen in Deutschland über viele Jahre vorgehalten, sie seien international wissenschaftlich nicht “anschlussfähig”, publizierten zuwenig in den großen Journalen. Nun sind diese, wie man leicht prüfen kann, in der Regel US-amerikanische oder britische Zeitschriften. Will man dort landen, muss man sich ein Stück weit natürlich auf die Weltsicht des Mainstreams einstellen. Es gibt Ausnahmen, zugegeben. Aber grob skizziert lande ich mit einem Standardthema und einer Mainstream-Methodik eher im American Economic Journal als mit etwas sehr Ausgefallenem und Unüblichen. 

Zu den negativen Zinsen

:: Wirtschaft

Verschiedene Zeitungen berichteten, es habe nun bei einer aktuellen Refinanzierungsrunde Deutschlands negative “Zinsen” gegeben. Wie kann das passieren?

Bei der Ausgabe einer Anleihe überlegt sich der ausgebende Staat einen Nominalzins, den er für die Anleihe zahlen würde. Ein Nominalsatz von 1,00% würde bei einer Anleihe von 100 EUR dem Zeichner oder Inhaber der Anleihe eine jährliche Zinszahlung von 1,00 EUR bringen. Diesen Wert nennt man auch den Kupon einer Anleihe, da dafür früher tatsächlich Stücke eines speziellen Bogens als Kupon abgeschnitten werden mussten und gegen diesen Kupon dann die Zahlung erfolgt.

Nun geht der ausgebende Staat an den Markt und schaut für eine solche Anleihe, ob die ihm jemand abkaufen würde. Er sagt also: “Ich will 100 EUR und zahle dafür nominal 1,00% im Jahr.”

Wenn er nun ein schlechter Schuldner ist, kann es sein, dass er die Anleihe dann nur für 90 los wird. Dann ist der Nominalzins immer noch 1,00%, da der Inhaber der Anleihe aber 1,00 EUR für 90 EUR bekommt, steigt die Rendite, zugleich muss die ausgebende Stelle am Ende der Laufzeit die 100 EUR zurückzahlen. Umgekehrt kann es auch sein, dass Leute 110 EUR für die Anleihe bieten, sie bekommen dann am Ende nur 100 EUR zurück und erhalten auch nur eine Zinszahlung von 1,00 EUR pro Jahr für die angelegten 110 EUR, was dann eine niedrigere Rendite als 1,00% ergibt.

Oder um es noch einfacher zu machen, nehmen wir nun noch an, dass die Anleihe bereits nach einem Jahr zurückgezahlt wird:

Wird sie zu 100 verkauft, so ist die Rendite einfach 1%, bei Kurs 101 ist die Rendite 0% (man bekommt am Ende des Jahres ja die 100 plus 1% Kupon, also 101 wieder, das ist also genau das, was man bei der Ausgabe gezahlt hat), bei Kurs 102 ist die Rendite dann –1%.

Zusammengefasst, die Rendite sinkt, wenn der Kurs ansteigt und umgekehrt. Sie kann auch in der Konstellation negativ werden, wenn beispielsweise ein kleiner Kupon mit einem hohen Kurs einhergeht.

Bei neuen Anleihen schätzt der ausgebende Staat in der Regel vorher ab, wo die Rendite wohl liegen wird und ruft ein Volumen und einen Kupon auf. Bei der Schuldenverwaltung in Deutschland liegt man mit dieser Abschätzung zumeist recht gut, so dass die Rendite oft sehr nah beim Kupon zu liegen kommt. Das ist bei anderen Ländern in jüngster Vergangenheit auch schon mal gerne schief gegangen.

Bei den in der Presse dargestellten kurzfristigen Titeln handelte es sich um sogenannte unverzinsliche Schatzanweisungen. Diese funktionieren nun anders, denn sie haben gar keinen Kupon (sog. Nullkuponanleihen oder Zerobonds). Das bedeutet, wenn der Ausgabepreis unter 100 liegt, ergibt sich eine positive Rendite (der häufigste Fall), bei der gestrigen Auktion lag der Kurs über 100, damit wurde die Rendite negativ. Genaugenommen gab es also gar keine “negative Zinsen”, sondern eine “negative Rendite”

Die aktuellen Informationen zu den Auktionsergebnissen kann man hier einsehen.