Aufbau eines Hackintosh

Ich bin ja schon lange kein Apple-Nutzer mehr, aber in den letzten Tagen hat mich ein kleines Projekt gepackt:

Kann ich auf meinem aktuellen Desktop mit Hardware von Mitte 2012 ein Mac OS installieren?

Grundsätzlich ist Mac OS für mich interessant: Ein Unix-basiertes System mit anständiger GUI. Normalerweise läuft auf meinen Rechnern ja ein Linux mit i3wm, in der letzten Zeit wieder vermehrt Windows 10 auf Desktop und Laptop. Wer aber mal versucht hat, Linux auf einem HiDPI Display und auf Laptop-Hardware anständig zum Laufen zu bringen, der wird meine Schmerzen verstehen.

Daher also der Grundgedanke: Kann ich ein Mac OS bekommen, ohne die Apple-typische Gängelei bei der Hardware? Zugegeben, die Apple-Hardware funktioniert gut zusammen, allerdings ist der letzte anständige Desktop Rechner uralt und es ist weit und breit keine neue Hardware zu sehen. Ausserdem bin ich zu sehr Gamer, um auf Windows zu verzichten und möchte bei der Auswahl von Grafikkarte, Soundkarte und RAM nicht auf die Zwangszuweisung von Apple angewiesen sein.

Ich habe also angefangen, mich in diverse Foren einzulesen, Anleitungen zur Erstellung eines Installationsmediums zu lesen und schlussendlich habe ich mir aus meiner uralten, aus meiner Macbook-Zeit übriggebliebenen Installations CD einen USB Stick erstellt, mit dem ich mich an die Installation auf meiner Hardware gewagt habe. Es ging nicht ohne die tatkräftige Hilfe aus einem Forum, wo meine ersten Installationsversuche noch einmal begutachtet und korrigiert wurden. Unter anderem braucht man

  • das Installationsmedium (aus dem Apple Store oder aus einem Karton mit uralten CDs)
  • den Clover Installer
  • zusätzliche Kernel Extensions wie FakeSMC

Die Hardware muss auch in etwa passen, z.B. braucht man ein UEFI Board. Empfohlen werden im Moment Boards von Gigabyte, da die dort verbauten Chipsätze gut mit Mac OS zusammenspielen. Ich habe aber ein etwas älteres Board von ASRock, das auch funktioniert.

Mittlerweile bin ich also so weit, das sich ein funktionierendes Mac OS High Sierra auf meinem Desktop habe. Ich muss zwar noch vom USB Stick booten und dann erst das Mac OS auf der internen SSD starten, aber das bekomme ich auch noch in den Griff.

Meine Nvidia GTX 970 macht auch schon ein Bild, aber die offiziellen Treiber laufen noch nicht. Audio habe ich noch nicht probiert, aber da ich eine externe USB Soundkarte von Xonar habe, sollte das auch kein Problem sein.

Edit Die Grafikkarte läuft auch.

Screenshot von Mac OS High Sierra

Einziger Bug: beim Start öffnet sich eins meiner Bluray Laufwerke. 😎 Aber damit kann ich erstmal leben.

Enable request logging in Jetty 9.1

Today I wanted to have a more detailed look into the requests coming into one of my applications using Eclipse Jetty. While it is easy enough to see incoming requests by enabling logging for class org.eclipse.jetty.server.Server (via the standard java logging API or SLF4J), adding a method to log incoming request headers is on a different level.

After digging around in the documentation and the sourcecode for a while, this is what I came up with:

// Create a server, but do not start it. This would prevent adding
// handlers later
Server server = JettyHttpContainerFactory.createServer(baseUri, null, null, false);

HandlerCollection handlers = new HandlerCollection();
// request log handler
RequestLogHandler requestLogHandler = new RequestLogHandler();
RequestLog requestLog = new Slf4jRequestLog();
requestLogHandler.setRequestLog(requestLog);
RequestLog traceLog = new Slf4jRequestLog() {
  @Override
  public void log(Request request, Response response) {
	  LOG.info("*************************************");
	  try {
	    Enumeration<String> headerNames = request.getHeaderNames();
	    while(headerNames.hasMoreElements()) {
		    String headerName = headerNames.nextElement();
		    String headerValue = request.getHeader(headerName);
		    LOG.info("{}: {}", headerName, headerValue);
	    }
	    // only dump the request body if we can reset the inputstream
	    if(request.getInputStream().markSupported()) {
		    request.getInputStream().mark(Integer.MAX_VALUE);
		    LOG.info(IOUtils.toString(request.getInputStream()));
		    request.getInputStream().reset();
	    } else {
		    LOG.info("Can not dump request body, because it can not be reset");
	    }
	  } catch (IOException e) {
	    LOG.warn(e);
	  }
	  LOG.info("*************************************");
  }
};
requestLogHandler.setRequestLog(traceLog);
// handler for real requests
final JettyHttpContainer containerHandler = ContainerFactory.createContainer(JettyHttpContainer.class,
	new RestResourceConfigWithSpringSupport("application-context.xml", MyServiceClass.class));
// add all handlers
handlers.setHandlers(new Handler[]{requestLogHandler, containerHandler});
server.setHandler(handlers);

server.start();

Note that I’m using a RestResourceConfigWithSpringSupport, but that doesn’t have to be the case. The main point for me was to create the JettyHttpContainer myself and not use the one created by a different call to JettyHttpContainerFactory.createServer(...). This way I can see at least the HTTP headers coming into my application. I’d prefer to see the body too, but I didn’t want to spent the time for it right now.

If anyone knows a way to wrap the request InputStream into a re-readable option, please let me know.

Hacktoberfest 2017

Dieses Jahr habe ich beim sogenannten Hacktoberfest von Digital Ocean mitgemacht. Hauptsächlich, um ein T-Shirt zu bekommen. Aber auch, um mal wieder bei Open Source Projekten mitzuhelfen.

Digital Ocean quasi einen Aufruf gestartet, den gesamten Oktober über so viele Pull Requests wie möglich aufzumachen und damit vielen Projekten weiterzuhelfen. Das ganze wird von der Firma mit einem T-Shirt und ein paar Stickern belohnt.

Ich habe davon erst vor ein paar Tagen erfahren und habe die folgenden Pull Requests aufgemacht:

Es gibt auch viele Spielprojekte auf Github, die nur dazu dienen, einen Pull Request für das Hacktoberfest zu machen. Ich halte davon nicht viel, da opfere ich meine Zeit doch lieber einem echten Projekt und helfe den Leuten. So wichtig ist mir das T-Shirt dann auch nicht. Aber wenn man Regeln aufstellt, gibt es wohl immer Leute, die schummeln. 🤷

Wie auch immer, vielleicht mache ich mit den Pull Requests gleich weiter. Hat doch Spass gemacht, den Leuten ein bißchen zu helfen. Und meistens ist es als Open Source Maintainer ja so, dass man viele Dinge machen möchte und keine Zeit dafür hat.

Automatische Erneuerung von Lets Encrypt Zertifikaten

Die letzten paar Mal habe ich die Zertifikate auf meinen Domains noch per Hand aktualisiert, d.h. Einloggen auf der Shell, mit dem certbot kämpfen, Webserver neustarten.

Aus meinem Setup erledige ich die Verifikation der Zertifikatsanfrage durch das Erstellen von Dateien in meinem Webroot, also dem Verzeichnis, das durch den Webserver veröffentlicht wird. Es gibt noch andere Arten der Verifikation, aber bei meinem Setup mit Docker Containern ist diese Methode am einfachsten.

Nach der letzten Aktualisierung der Zertifikate habe ich das ganze in einem Skript vereinfacht, das jede Woche ausgeführt wird und die Zertifikate ggfs. erneuert. Nachdem ich noch ein wenig in der Dokumentation des certbots gewühlt hab, bin ich bei folgendem Aufruf gelandet:

certbot-auto certonly -n -d DOMAINNAME --webroot --webroot-path=/pfad/zu/meinem/webroot

Am längsten hat es dabei gedauert, den Parameter webroot-path aus der Dokumentation zu suchen.

Anschliessend wird noch mein Webserver Docker Container neugestartet, der die Zertifikate per Volume mountet. Das ist aber ein Detail, das für die automatische Erneuerung nicht relevant ist.

Neue Antennen für meine Fritzbox

Vor ein paar Tagen habe ich mir einen Bausatz Antennen bei Frixtender bestellt. Meine Fritzbox steht im Wohnzimmer und da meine Zimmer alle an einem langen Flur aufgereiht sind, habe ich am anderen Ende der Wohnung manchmal schlechten Empfang. Das ganze wollte ich durch die gerichteten Antennen beheben. Der Einbau sah auf der Webseite von Frixtender nicht besonders schwierig aus und ich hab einfach mal bestellt.

Nachdem der erste Anlauf durch fehlendes Werkzeug (ich hab 10er Torx-Schraubendreher und 6er - aber keinen 8er…) ein schnelles Ende fand, hab ich mich gestern dann nochmal dran gesetzt. Der Einbau war wie erwartet schmerzlos, bis auf die leichten Kopfschmerzen einer aufziehenden Erkältung, und das Ergebnis startete auch wie gewohnt:

Aufgeschraubte Fritzbox

Fritzbox mit neuen Antennen

Ich habe dann auch gleich das 2.4GHz und das 5GHz WLAN unterschiedliche benannt und verbinde meine Geräte jetzt mit dem 5GHz Netz. Meine Nachbarn scheinen eher auf den 2.4GHz Standard zu setzen, jedenfalls habe ich in dem Netz auch weniger Störungen von draussen. Ob und wieviel die Antennen bringen, werde ich über die nächsten Tage feststellen. Falls ich zufrieden bin, wird wohl eine weitere Bestellung rausgehen, damit die Fritzbox im Zweitwohnsitz auch noch aufgemotzt werden kann.

Fitness vs Gesundheit

Stan Efferding hat wieder einen interessanten Rant gepostet:

(bei youtube angucken)

Die vollständige Playlist der Rants gibt es bei Youtube.

Renaissance Periodization, Teil 2

Vor ein paar Monaten hatte ich ja geschrieben, dass ich mit der Renaissance Periodization Diet ein paar Kilo abspecken wollte. Das hat wirklich gut geklappt, aber dann habe ich durch einen Jobwechsel meine Prioritäten ein wenig umsortiert und lieber darauf geachtet, dass ich meine Trainingsfrequenz beibehalte, statt meine Diät.

Wie dem auch sei, nach dem Urlaub hab ich 2kg zugelegt und jetzt geht es wieder mit der #rpstrength Diät los. Den Zeitplan des alten Beitrags übernehme ich einfach mal, d.h. ich werde mein Körpergewicht um 1kg pro Monat reduzieren und 78kg anpeilen. Bei meinem aktuellen Gewicht werde ich also ca. im April 2018 dort ankommen. Gut, dazwischen ist die Lebkuchenzeit, aber der grobe Zeitplan sollte passen. 😆

Der letzte PR

Vor ein paar Tagen habe ich den Artikel “One more time” von Crossfit Sioux Falls gelesen, in dem Deane Barker beschreibt, wie er (oder sie?) mit dem Alter und dem Ausbleiben von Fortschritten - jedenfalls Fortschritten bezüglich immer weiter steigenden Kraftwerten - umgeht. Hier ist der Satz, der eine gute Zusammenfassung liefert:

If you’re an athlete, here’s something else that’s true: one day, you’ll hit a PR in some movement, and then you’ll never hit that PR ever again. You won’t know it at the time, of course, but every PR has the potential of being the last such PR in your entire life.

Ich versuche mich mal an einer deutschen Zusammenfassung:

Irgendwann wird man zurückblicken und feststellen, dass man seine beste Kraftleistung bereits vor ein paar Monaten erreicht hatte und nie wieder so eine persönliche Bestleistung aufstellen wird.

Mittlerweile bin ich in den Crossfit Classes auch - leicht - über dem Altersdurchschnitt. Meine Kraftleistung, manchmal auch meine Ausdauerleistung, liegt auch etwas über dem Durchschnitt. Aber vielleicht habe ich meinen besten Snatch mit 78kg schon gemacht. Oder meine schwerste Kniebeuge mit 130kg. Oder meine beste Zeit bei Annie mit 6:58.

So genau hab ich da noch nicht drüber nachgedacht. Ich bin beim Training auch sehr zahlengetrieben und freue mich immer über einen kleinen Fortschritt. Aber würde es mich stören, wenn das Gewicht nicht mehr hoch bzw. die Zeiten nicht mehr runter gehen? Ich habe meine Trainingsziele über die Zeit schon mehrmals angepasst und im Moment arbeite ich auch eher an meiner Beweglichkeit und sehe das Training eher als Gegengewicht zum Schreibtischjob. Meine Hauptziele sind nicht irgendwelche Wettkämpfe, sondern eher Verletzungsvermeidung und Vorbeugung von den üblichen Ausfallerscheinungen, die im Alter durch fehlende Bewegung und Verlust von Muskeln und Balance auftreten.

Vielleicht bilde ich mir das aber auch nur ein und ich musste mich damit noch gar nicht beschäftigen, da meine Leistungen immer noch irgendwo ein bißchen besser werden…

Fahrrad geklaut

Ich bin jetzt in Hamburg angekommen. Heute morgen stand ich etwas verwirrt vor der Haustür und habe überlegt, ob ich mein Fahrrad gestern doch noch in den Keller gebracht hatte.

Nein, hatte ich nicht.

Mittlerweile kann man sowas ja online bei der Polizei melden und ich habe jetzt ein Aktenzeichen. Allerdings werden nur 10% der Fahrraddiebstähle aufgeklärt, ich habe das Rad deshalb schon abgeschrieben. Ich würde mich ja aufregen, wenn ich nicht selbst schuld wäre. Das nächste Rad werde ich also immer in den Keller bringen, auch wenn das etwas nervig ist, wenn man das jeden Tag zwei oder dreimal machen muss.

Ich werd auch mal die Versicherungen durchgucken, ob eine extra Fahrrad- oder eine erweiterte Hausratversicherung sinnvoll ist.

Erstes Review des Sony XZ Premium

TL;DR Das Sony XZ Premium ist ein gutes Smartphone.

Seit ein paar Wochen benutze ich jetzt das Sony XZ Premium. Das Smartphone ist das neue Flagschiff von Sony, riesengroß und hat eine recht anständige Kamera. Ich will den Beitrag kurz halten, daher gibt es jetzt einfach eine ungeordnete Liste mit meinen Eindrücken:

  • Das Telefon ist sehr rutschig (ich hatte vorher das OnePlus One mit sandiger Rückseite, das war quasi wie Klettverschluss). Ich habe mir (nicht nur wegen der Rutschgefahr) eine durchsichtige Gummihülle drum gemacht, so bleibt das Telefon auch in der Hand oder auf dem Sofa liegen und rutscht nicht sofort weg…
  • Das Display ist sehr gut.
  • Die Kamera ist gut. Die Superzeitlupe ist allerdings enttäuschend, die Videoqualität ist recht bescheiden, sogar bei guten Aussenbedingungen. Die Superzeitlupe selbst ist aber echt schön, man muss das Timing aber sehr exakt hinbekommen. Wenn es funktioniert, sieht die Superzeitlupe aber echt beeindruckend aus. Die normale Zeitlupe ist gut und die Videoqualität ist dann auch sehr viel besser.
  • Das Telefon ist schnell. Verglichen mit dem OnePlus One und mit meinem Nexus 7 (2013) - zugegeben, nicht gerade die richtigen Vergleichsobjekte, aber das sind nunmal meine bisherigen Geräte. Das Teilen von Inhalten aus einer App geht jetzt ohne Verzögerung, alle Dialog poppen sofort auf, Wechseln in andere Apps passieren sofort.
  • Akkulaufzeit ist für mich vollkommen ausreichend. Selbst wenn ich das Smartphone tagsüber viel benutze und Abends noch Videos gucke, bin ich selten unter 40% Akkuladung. Nachts lädt das Telefon mit der Akkuschonfunktion langsam und ist morgens um 0500h wieder voll.
  • Draussen ist das Telefon manchmal schwer zu lesen, aber mich hat das noch nicht gestört. Liegt vielleicht auch am Hamburger Sommer, der eh gerade nicht viel Sonne zu bieten hat.

Alles in allem bin ich sehr zufrieden. Der Preis für das Telefon ist für mich noch ein wenig gefallen, da ich die Bonus-Kopfhörer für Vorbesteller gerade bei Ebay verscheuert habe. Leider für etwas weniger als gehofft, aber immer noch ganz ok. Die nächste Hürde muss das Telefon bzw. Sony nehmen, wenn die neue Android Version rauskommt. Ich hoffe mal, das Sony etwas kürzere Update-Zyklen hat und relativ schnell ein Update anbietet. Ein paar Sicherheitsupdates sind schon gekommen und die Updates sind immer ohne Probleme nachts durchgelaufen, so dass ich morgen ein aktuelles OS hatte.