Links zur Patent-Kontroverse (David K. Levine)

:: Wirtschaft, Recht

David K. Levine (englische Wikipedia) hat über viele Jahre Patente sowie “geistiges Eigentum” beforscht und kommt in einer Zusammenfassung eines Beitrags zu dem kurz formulierten Ergebnis:

“The case against patents can be summarized briefly: there is no empirical evidence that they serve to increase innovation and productivity, unless productivity is identified with the number of patents awarded—which, as evidence shows, has no correlation with measured productivity. (…)”

Das Paper aus dem Journal of Economic Perspectives ist gut zu lesen und auch frei verfügbar (PDF hier).

Darüberhinaus pflegt(e) seine Kollegen und er ein paar interessante Linksammlungen, Seiten mit Informationen zu den Themen:

Auf der zuletzt genannten Seite bzw. deren Hall of Shame habe ich dieses wunderschöne Zitat über das US Patent Office gefunden:

Microsoft has patented the idea that “a user may discover and navigate among hyperlinks through the use of a keyboard.” Even if you thought the CIA and FBI are completely and utterly incompetent, you have to grant that U.S. Patent Office takes first prize. There is a rather significant missing reference to prior art in the application: the Lynx character based web browser. For obvious reasons (no mouse) this browser has always navigated among links using the keyboard - using in fact the same tab key cited in the Microsoft Patent.

Folgen des Lexmark-Urteils

:: IT, Wirtschaft, Allerlei, Recht

Zum Urteil des Supreme Courts über die Patentklage von Lexmark (gebloggt hier) habe ich in der Legal Tribune Online eine interessante Einordnung gelesen. In dem Beitrag darauf hingewiesen, dass die Entscheidung, dass beim Export von Gütern der Patentschutz erschöpft, eine Abkehr der bisherigen Rechtsprechung in den USA sei. Dies habe gravierende Auswirkungen auf den Export patentgeschützter Güter wie Medikament oder Lizenzverträge soweit sie sich auf die Erschöpfung von Patenten beziehen. Damit wird es für die US-Patenthinaher schwierig, den Re-Import mit dem Verweis auf das Patentrecht abzuwehren. Zugleich weist der Autor auf die Auswirkungen im internationalen Handel hin und macht deutlich, dass die Frage der Erschöpfung bei Patenten wohl eine der umstrittensten Fragen im Welthandel darstellt.

Lexmark scheitert mit einer Patentklage in den USA

:: IT, Wirtschaft, Allerlei, Recht

Ich hatte im Jahr 2015 einmal über Lexmarks Druckerpatronen-“Lizenz” gebloggt. Mit dieser sollte erreicht werden, dass rabattierte Patronen direkt wieder an Lexmark zurückgehen, zumindest verpflichtet sich wie gebloggt der Endkunde dazu, diese Patrone nur einmal zu nuzen und sie auch an Lexmark zurückzugeben.

In den USA hat Lexmark nun versucht, das Wiederauffüllen sowie den Reimport gebrauchter Patronen durch andere Unternehmen gerichtlich zu unterbinden. Hierzu bediente sich Lexmark einer Patentklage gegen diese “Remanufacturer”. Diese waberte dann durch die Instanzen und im Ergebnis hat der Supreme Court entschieden, dass die Patentrechte nach dem Verkauf der Patronen (für die im Inland, also den USA, sowie den ins Ausland verkauften) erschöpft sind. Insbesondere stellt der Supreme Court fest, dass die Endkunden-Lizenz möglicherweise ein gültiger und durchsetzbarer Vertrag sein könnte, sich hieraus aber keine patentrechtlichen Ansprüche ableiten lassen.

Man wird sehen, wie die Druckerpatronen-Industrie darauf reagieren wird.

Die Entscheidung des Supreme Courts findet sich hier. Hingewiesen wurde ich beim Lesen von Fefes Blog.

Update (2017–06–04) Und hier noch der Link zur Verfahrensseite beim SCOTUSblog.

Meine Erfahrungen mit Locomore

:: Reisen

Ende 2016 hat Locomore eine Zugverbindung von Stuttgart nach Berlin und zurück auf den Markt gebracht. Mittlerweile bin ich schon zwei mal (jeweils von Kassel nach Berlin) mit dem Zug gefahren, einmal im Februar im Reisebereich Basic und einmal im März im Reisebereich Business.

Die “alten” IC-Waggons sind sehr schön und praktisch erneuert worden. Ich finde auch die Farbgestaltung ganz ansprechend, sie wirkt sehr frisch und warm, gemütlich. Mir gefallen die guten Ablagen fürs Gepäck, so bekommt man in Waggons mit Abteilen im Gang auch noch größere Taschen auf der Ablage unter. Ebenso sind ausreichend Steckdosen verfügbar, um elektronische Geräte aufzuladen oder zu betreiben. Etwas ungeschickt finde ich jedoch die Höhe des Tischs, ich habe das Gefühl, der ist recht hoch bzw. nicht so praktisch gebaut. Geblendet hatte mich die Leselampe, deren Anordnung und Funktionsweise fand ich nicht so gelungen.

Das WLAN hat durchweg gut funktioniert, bei Tunneldurchfahrten gab es gelegentlich Hänger. Aber im Großen und Ganzen eine gute Verfügbarkeit. So konnte ich auf einer Fahrt auch bequem arbeiten.

Praktisch ist, dass die Reservierung gleich im Ticket enthalten ist, ein Service, den sich die Deutsche Bahn derzeit mit 4,50 Euro bezahlen lässt.

Das gebuchte Ticket kann man entweder in Papier mitführen oder einfach auf dem Smartphone anzeigen lassen. Letzteres hat einwandfrei funktioniert.

Ein wirklich gelungenes Konzept ist das Business-Abteil. Es funktioniert so, dass ein normales 6er-Abteil nur mit drei Personen belegt wird, man erhält noch ein kleines Kissen sowie einen Snack und zwei Getränke während der Fahrt.

Generell habe ich den Service als sehr freundlich und zuvorkommend erlebt. Da habe ich mich sehr wohl und gut umsorgt gefühlt. Auch mit dem kulinarischen Angebot (preislich auch unter der Deutschen Bahn) war ich sehr zufrieden.

Und letztlich: Endlich wieder einmal mit einem Fernzug in Berlin am Bahnhof Zoo ankommen!

Zusammengefasst: Eine gute Art zu reisen, ich war sehr zufrieden. Gerade mit dem Business-Ticket bekommt man ein wirklich gutes Angebot: Eine pünktliche und schnelle Verbindung, Sitzplatzresvierung, viel Platz im Abteil, Strom und WLAN plus Catering. Ich hoffe, dass das Konzept von Locomore aufgeht und werde gerne weiterhin mit Locomore fahren. Die nächste Fahrt ist schon gebucht!

Update (2017–05–11): Oh wie schade, Locomore hat einen Insolvenzantrag gestellt.

10th European Lisp Symposium

:: Racket, IT, Scheme, Common Lisp, Veranstaltungen

Last year my brother Stephan and I attended the European Lisp Symposium (ELS) for the first time. It was a great event and therefore we decided to come to this year’s symposium. It took place in Brussels from April 3 to April 4.

After giving a two-days course on IoT using Racket at StudiumPlus last year we submitted a short demonstration. And: It got accepted! It was a great honor for me to give a demonstration at the symposium.

Our paper is in the proceedings which can be found find on the conference’s homepage. The slides are available there as well. I host these files here: Paper and slides. The source code is provided as a ZIP archive.

Neues vom E-Postbrief

:: IT

Im Sommer des Jahres 2010 bloggte ich (hier und hier) über meinen Selbstversuch mit dem E-Postbrief (heißt wohl nun “E-POST”) der Deutschen Post. Zwischenzeitlich musste ich einmal das Kennwort erneuern. Bei dem Telefonat mit der Hotline fiel dem freundlichen Mitarbeiter auf, dass ich mich praktisch nie (es war damals über 12 Monate her) in den Dienst einloggte. Ob ich das Produkt denn wirklich noch weiter haben möchte, wollte er wissen. Nun, ich entschied mich erst einmal dabei zu bleiben. Ca. einmal im Jahr sendete mir die Post einen Newsletter in das Postfach, manchmal habe ich ihn gelesen, manchmal auch ignoriert.

Jedoch, am frühen Anbend des 31. Januar 2016 schreckte ich hoch, denn eine frisch eingegangene SMS deutete darauf hin, dass noch jemand anderes außer dem Kundenservice mir etwas mitteilen wollte. Und tatsächlich, nach über sechs Jahren: Mein erster E-Postbrief!

(Und was war es? Die Rechnung für ein Zeitschriften-Abonnement.)

Mein Wechsel zu Frog

:: Homepage, Racket, Frog

Bisher habe ich mein Blog mit Octopress bereit gestellt. Eine neue Version (“3.0”) ist auf dem Weg. Nachdem in letzter Zeit die einen oder anderen Schwierigkeiten mit meiner Octopress-Installation auftauchten, habe ich mich entschieden, mit dem Blog auf Frog, ebenfalls ein Generator für statische Blogseiten, zu wechseln.

Meine Erfahrungen mit Octopress

  • Ich hatte Octopress und alle Abhängigkeiten in einen Docker-Container gepackt. Das war ganz sinnvoll, um die Ruby-Bibliotheken-Abhängigkeitshölle in den Griff zu bekommen. Es hatte mich aber nur bedingt glücklich gemacht, da ich immer auf Docker angewiesen war, um einen Blogpost zu erzeugen.
  • Einige der Sachen, die Brandon Mathis (dem Autor von Octopress) aufgezeigt hatte, fand ich auch überarbeitungsbedürftig (bspw. das Ausliefern über Git und die enge Verzahnung, die Updates schwierig machte).
  • Was mir sehr gut gefallen hat, war das Layout und Thema sowie auch die Zahl an Plugins und Erweiterungsmöglichkeiten. Da wird mir doch die eine oder andere Möglichkeit fehlen.

Warum nun Frog?

Es gibt ja viele Generatoren für statische Homepages und Blogs. Ich habe mich für den Generator Frog von Greg Hendershott entschieden. Es sprach für mich dafür:

  • Frog ist in Racket geschrieben und da ich das praktisch täglich für allerlei Sachen benutze, liegt es mir deutlich näher als Ruby und ich kann die Abhängigkeiten etc. besser beurteilen und ggf. beheben.
  • Frog verwendet im Standard ein paar HTML-Templates, die dann eine Seite mit Bootstrap-CSS etc. bereit stellen. Da ich eh das eine oder andere mit Bootstrap mache bzw. vorhabe, ist das für mich eine ganz gute Lernmöglichkeit.
  • Die Anpassung von Templates ist für mich einfacher als bei Octopress, da ich dort direkt Racket-Code eingeben und nutzen kann.
  • Wie Octopress/Jekyll verarbeitet Frog Markdown als Eingabeformat. Allerdings kann man auch Scribble-Dateien zum Schreiben von Seiten und Posts verwenden. Scribble verwende ich zwischenzeitlich recht oft als Dokumentations- bzw. Schreibwerkzeug, so dass das ein nettes zusätzliches Feature ist.
  • Es wirkt auf mich, als wäre Frog auch etwas schneller als Octopress im Erzeugen der HTML-Seiten.

Umstellungsaufwand

Frog verarbeitet ebenso wie Octopress Dateien im Markdown-Format; allerdings sind die Metadaten etwas anders formatiert (in Octopress gibt es eine YAML-Präambel). Insofern musste ich alle Blog-Posts (knapp 60 Stück) und Seiten einmal in die Hand nehmen und anpassen. Für die Einrichtung und die Anpassung der Files habe ich ca. eine Stunde gebraucht, dann noch “etwas” Gefummel mit dem CSS und den DNS-Einträgen für die Github Pages. Also durchaus überschaubar.

Zukünftiges

Es gibt beim neuen Blog noch einiges, was ich ergänzen möchte (“Letzte Artikel”-Sidebar, Tag-Sidebar etc.) und mit dem CSS/Thema bin auch noch nicht so zufrieden, aber es tut zumindest nun schon mal.

Ach ja, zum Thema CSS und Fummeln darf natürlich nicht der übliche Hinweis auf diesen (bewegten) Cartoon fehlen.

Using Racket Minimal and raco

:: IT, Racket

I use Racket Minimal on my smart phone (this describes how to compile the run time for an ARM based system). It’s is a very small installation of Racket (about 36 MB after installation). After installation one only needs to install the packages that are really neded. But this can be a bit tricky because a lot of packages want to install their documentation and other stuff and bring a whole bunch of files on your drive as dependencies.

Some of the packages are divided up into a "-lib", "-doc" (and sometimes "-test") as laid out in the documentation. With these packages it’s easier to only install the implementation.

A small script of mine used only basic modules and relied on rackunit for the tests. On a mobile device the start up time of such a program can be critical. Therefore it is wise to only require the needed packages and to have the source code being compiled to byte code. One could do this with raco setup (which is included in Minimal Racket) but I wanted to have raco make (which is not part of Minimal Racket) available.

The commands of raco are added via a raco-commands variable in packages’ info.rkt file. I looked through the packages of my “full install” and found the package compiler-lib which adds some commands (make, exe, pack, unpack, decompile, test, expand, read, distribute, demodularize) to raco and relies on only a few other packages. As a result the source and binary files need about 3.8 MB on my phone which is okay for me.

To sum up: After a simple raco pkg install compiler-lib I could easily use raco make and raco test to play with my program on my phone.

I played with CHICKEN Scheme, Docker and Alpine Linux

:: IT, Scheme, Docker, Linux

I am looking forward to meet LISP people at the 32c3’s LISP assembly. The last days I played a bit with different Scheme implementations including CHICKEN scheme. The main feature of CHICKEN is that it compiles the Scheme code to C and then creates dynamic libraries and binaries with the C compiler. I thought that combining these binaries with a minimal Docker container could give me a very small deployment. So here are my steps:

Choosing Alpine Linux as a “small” Linux

The smallest Linux image for Docker is undoubtly busybox with a size of about 2.489 MB. But busybox lacks a package manager which makes installing software painful. Therefore I have chosen Alpine Linux which comes with package manager and it’s image’s size is about 5.234 MB. That’s double the size of the busybox image but still quite small compared to the Ubuntu image which is about 266 MB.

Creating a Docker container with CHICKEN

Alpine Linux comes with the musl libc and I thought it would be best to compile all the CHICKEN stuff with that libc. Therefore I created a Docker container with gcc and all the other stuff with this Dockerfile (Github repository):

FROM alpine:3.2

RUN apk update && apk add make gcc musl-dev 
RUN wget -O - http://code.call-cc.org/releases/4.10.0/chicken-4.10.0.tar.gz | tar xz

WORKDIR /chicken-4.10.0

RUN make PLATFORM=linux && make PLATFORM=linux install

RUN rm -fr /chicken-4.10.0 

WORKDIR /

CMD ["csi"]

This image is quite big (about 161.7 MB) and is available for download at the Docker Hub.

Compiling some CHICKEN code

For testing purposes I wanted a minimal web server running in the Alpine Linux image. Therefore I looked through the egg index and found spiffy. I fired up the chicken-alpine container (but I used ash as command instead of the csi Scheme interpreter) and created a small web server that serves some static pages. I wrote a main.scm:

(use spiffy)
(start-server)

and added some static pages to a ./web sub-directory. Then everything had to be compiled and prepared for deployment:

chicken-install spiffy
csc -deploy main.scm
chicken-install -deploy -p $PWD/main spiffy

Deploy in a fresh Alpine Linux image

After the compilation I copied the main and web directories on my host machine using docker cp and created the following Dockerfile:

FROM alpine:3.2

ADD main /main
ADD web main/web
WORKDIR main

CMD /main/main

and let docker build -t krrrcks/spiffy-test . do the job. The size of the resulting image is about 12.37 MB and that’s pretty small. I uploaded that image to the Docker Hub as well.

To serve the pages I did a docker run -d -p 8080:8080 krrrcks/spiffy-test (spiffy listens on port 8080 in the default install) and browsed my static pages.

How to use GET Bucket location on Amazon S3 with Racket

:: IT, Racket, AWS

In Racket I want to iterate over my buckets in Amazon S3. They are located in different regions. So how do I get my bucket’s location/region? In the API Reference there is a call GET Bucket location. I use Greg’s AWS library for Racket and this library authenticates its calls with signature version V4. But V4 requires the user to know the region to correctly sign the request. So I need to know the region to ask Amazon S3 for the region where the bucket is located. Otherwise Amazon S3 responds with an error:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
 <Code>AuthorizationHeaderMalformed</Code>
 <Message>The authorization header is malformed; the region 'us-east-1'
is wrong; expecting 'eu-central-1'</Message>
 <Region>eu-central-1</Region>
 <RequestId>XXXX</RequestId>
 <HostId>XXXX>
</Error>

After some search on the net I found a post on Stackoverflow that helped to solve that issue: If I use the URL format (instead of the normally used virtual host format) I could get the location of any bucket. Every region responds with a LocationConstraint answer.

Therefore a code snippet for Racket could be:

(define (get-bucket-location bucket)
  (parameterize
      ([s3-path-requests? #t])
    (define xpr (get/proc (string-append bucket "/?location") read-entity/xexpr))
    (and (list? xpr)
         (= (length xpr) 3)
         (third xpr))))

For example:

> (get-bucket-location "my-bucket-somewhere")
"eu-central-1"

PS: I think official Amazon S3 documentation could be a bit more verbose on the issues with GetBucketLocation and signature V4.

Update: Greg added a bucket-location function to his great library