Kategorien
Sport

Mein erstes Crossfit WOD

Letzten Dienstag war ich für ein Intro bei crossfit hh, um mir Crossfit mal genauer anzusehen. Ich habe schon etwas länger einige der sog. Workouts Of The Day (kurz: WOD) angesehen und mit meinem aktuellen Training verglichen. Ergebnis: es gibt eine große Übereinstimmung – größer als die üblichen Trainingspläne in Fitnessstudios.

Also habe ich mich dort für ein Intro angemeldet, d.h. eine Einführung in Crossfit. Um 1700h war’s dann soweit. Eigentlich sollten an dem Intro zwei Personen teilnehmen, aber ich war doch alleine dort. Der Trainer meinte, eine kurzfristige Absage wäre nichts ungewöhnliches. Vielleicht verlässt viele dann doch der Mut, wenn man sich auf so etwas neues einlässt… wie auch immer, so hatte ich quasi eine Einzelstunde. 🙂

Das Studio selbst ist groß, hat viel Platz, ist laut und mit trainierenden, schnaufenden Menschen gefüllt. Leute laufen rum, schieben ihre Rudergeräte vom aufgestapelten Platz an der Wand für ein WOD selbst zurecht. Wer sich unter einem Trainingsraum eher eine Wellnessoase oder ein auf hochglanz poliertes Fitnessstudio vorstellt, der wird wohl rückwärts wieder raus gehen…

Aber: der Boden ist großflächig mit Gummimatten ausgelegt, es gibt Squatracks, Ringe, Lang- und Kurzhanteln, Medizinbälle, Traktorreifen(!) und wahrscheinlich noch viele andere schöne Dinge, die ich in der kurzen Zeit noch gar nicht entdeckt habe.

Das Intro begann erstmal mit einer Kurzeinführung im Stil von “Was ist Crossfit?”. Das war relativ kurz, vielleicht immer so kurz, vielleicht auch dem Umstand geschuldet, dass ich alleine vor dem Whiteboard stand.

Wie auch immer, wir sind schnell beim Aufwärmen angelangt:

  • 50 Mountain Climbs
  • 50 Jumping Jacks

So weit noch nichts aufregendes, das habe ich ganz gut absolviert. Anschliessend ist man auch ausreichend aufgewärmt. 😉 Danach ging es an mein erstes WOD, ein sog. EMOM – kurz für every minute on the minute – ausgelegt auf maximale Wiederholungen. Das heißt, man macht jede Übung für 1 Minute und so oft man kann. (Es gibt auch eine zweite Variante, in der man innerhalb der Minute eine vorgegebene Anzahl an Wiederholungen absolviert und mit Beginn der nächsten Minute die nächste Übung startet.)

Die Übungen für mein EMOM:

Das EMOM bestand aus 3 Runden, d.h. 3x5x1min = 15min. Und das hat mir gereicht. 😀 Man konnte anhand meiner erreichten Gesamtwiederholungen pro Runde deutlich sehen, dass ich in der ersten Runde ganz gut war, in der zweiten und dritten Runde aber nur noch zwei Drittel der Wiederholungen absolvieren konnte. Das heißt wohl, das meine Ausdauer noch ausbaufähig ist. B-)

Das ganze WOD war wirklich anstrengend. Und mit einem richtigen Timer (und einem Trainer, der anfeuert oder Tipps gibt) deutlich anstrengender und strikter als meine selbst ausgedachten und durchgeführten “WOD”. Wenn ich mir jetzt noch vorstelle, dass im regulären Training mehrere Leute das gleiche WOD machen und ich als Tabellennerd meinen eigenen Fortschritt gegen mich selbst vergleiche, dann kann ich da ein Motivationspotential erkennen… 😀

Für diese Art von Training müsste ich

  • die Fahrtstrecke
  • den Preis
  • die Einschränkung, dass ich nur von Montag bis Donnerstag dort trainieren könnte

hinnehmen und mich an den Wochenenden, an denen ich nicht in die Crossfit Box gehen kann, alleine durchzubeissen und mit Medizinball und Springseil auf dem Sportplatz trainieren.

Wieso Always On eine schlechte Idee ist

Ich hatte mich ja vor kurzem schon aufgeregt, dass eine reine Online-Anmeldung bzw. ein Online-Installer eine ziemlich doofe Idee ist. Und jetzt ist es schon wieder soweit: Ein Always On-Login schlägt seit gestern fehl und ich kann ein Spiel nicht spielen. Welches Spiel, fragt ihr? Minecraft.

Der neue Launcher prüft beim Start, ob bereits ein Profil angelegt ist. Ist kein Profil angelegt, muss man seinen Mojang-Accountnamen und das Passwort eingeben. Das wird dann anscheinend online überprüft und erst dann kann Minecraft gestartet werden.

Seit gestern erhalte ich aber in den meisten Fällen die folgende Exception:

[14:15:39 ERROR]: Couldn't log in
com.mojang.authlib.exceptions.AuthenticationUnavailableException: Cannot contact authentication server
	at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:58) ~[launcher.jar:?]
	at com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication.logInWithPassword(YggdrasilUserAuthentication.java:77) ~[launcher.jar:?]
	at com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication.logIn(YggdrasilUserAuthentication.java:60) ~[launcher.jar:?]
	at net.minecraft.launcher.ui.popups.login.LogInForm$4.run(LogInForm.java:173) [launcher.jar:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_25]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_25]
	at java.lang.Thread.run(Thread.java:724) [?:1.7.0_25]
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.7.0_25]
	at java.net.SocketInputStream.read(SocketInputStream.java:150) ~[?:1.7.0_25]
	at java.net.SocketInputStream.read(SocketInputStream.java:121) ~[?:1.7.0_25]
	at sun.security.ssl.InputRecord.readFully(InputRecord.java:442) ~[?:1.7.0_25]
	at sun.security.ssl.InputRecord.read(InputRecord.java:480) ~[?:1.7.0_25]
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) ~[?:1.7.0_25]
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) ~[?:1.7.0_25]
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) ~[?:1.7.0_25]
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) ~[?:1.7.0_25]
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:515) ~[?:1.7.0_25]
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) ~[?:1.7.0_25]
	at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1090) ~[?:1.7.0_25]
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) ~[?:1.7.0_25]
	at com.mojang.authlib.HttpAuthenticationService.performPostRequest(HttpAuthenticationService.java:73) ~[launcher.jar:?]
	at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:41) ~[launcher.jar:?]
	... 6 more

Hier ist nochmal die Fehlermeldung: Cannot contact authentication server.

Minecraft möchte also, bevor ich überhaupt nur dran denke, das Spiel zu starten, eine Überprüfung meines Accounts online vornehmen. Ohne diese Überprüfung kann ich nicht mal eine existierende Singleplayer-Welt starten – d.h. das Spiel ist nicht spielbar.

Wenn mir jetzt bitte jemand erklären kann, wieso ich zum Spielen eines Spiels, das vollständig auf meiner Festplatte installiert ist und zu dem ich sogar schon Savegames habe, eine Onlineverbindung brauche?

The case for offline installers – Minecraft and Amazon S3

Since yesterday I am not able install (or even play) a game I bought several months ago: Minecraft. In case you haven’t heard of it yet, you’ve lived under a rock for several years. Go buy the game.

But, and this is a major issues for me, I couldn’t install or play the game since yesterday. I had to reinstall my computer and when I finished everything and wanted to install Minecraft again, I got a lot of these errors in the launcher console:

[08:29:05 WARN]: Couldn't download https://s3.amazonaws.com/Minecraft.Resources/sounds/random/explode2.ogg for job 'Resources'
java.lang.RuntimeException: Server responded with 503
at net.minecraft.launcher.updater.download.Downloadable.download(Downloadable.java:88) ~[launcher.jar:?]
at net.minecraft.launcher.updater.download.DownloadJob.popAndDownload(DownloadJob.java:104) [launcher.jar:?]
at net.minecraft.launcher.updater.download.DownloadJob.access$000(DownloadJob.java:11) [launcher.jar:?]
at net.minecraft.launcher.updater.download.DownloadJob$1.run(DownloadJob.java:86) [launcher.jar:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.7.0_45]
at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.7.0_45]
at java.lang.Thread.run(Unknown Source) [?:1.7.0_45]

As you can see in the error message, the game launcher started to download from https://s3.amazonaws.com/Minecraft.Resources/sounds/random/explode2.ogg but got a HTTP error code 503 Service not available. I already know that Amazon S3 has some restrictions on request rate and download volume, but nevertheless I tried to open the URL in my browser:

<Error>
  <Code>SlowDown</Code>
  <Message>Please reduce your request rate.</Message>
  <RequestId>7064E0C35CD852F4</RequestId>
     <HostId>zG0J+l6QtmyubEt6A5pe5VlsKPe+vY6SbMTnLXz+UieLtwFWXlamKl4pVo7QulY7</HostId>
</Error>

So what does that mean? Amazon decided to throttle the requests to the S3 storage used by Minecraft to host assets of the game. The launcher tries to download the version that you specified in the profile, but Amazon is not returning it but the 503 error instead.

This is not an error that will prevent everyone to download Minecraft, maybe it’s just the region that my requests to S3 are routed to or maybe just me getting to a faulty S3 storage. But it’s common enough that @Dinnerbone reacted on twitter:

There is no other way for me to download the game than the launcher. There is no ZIP or EXE that will give me the complete game, and which could be mirrored by other hosts in case the hosting provider is not available or has other issues. This is a common usage pattern nowadays, it gives the publisher control over the download and is a way to have exact download statistics. Amazon S3 itself is mirrored over multiple hosts in different regions and you can even add another layer of caching to it via Amazon Cloudfront.

But still, why is this the only way to download and install the game? And it’s not the only online-only installer: Google Chrome, Oracle Java, Steam… they all rely on online installers. If you’re lucky enough, you can zip the installed software afterwards and have your own offline installer, but I’m really happy when I notice a piece of software that provides a full offline installer, that is also hosted on different providers – or even downloadable p2p via Torrent or something like that.

So this again is a piece of software that I’ll zip&backup and have to try if I can have my own version archive sitting on my Drobo at home just in case the magical cloud has a hiccup again.

Small update: If you do have a minecraft installation on your PC right now, you should ZIP it

  • On Windows press WIN+R, enter %APPDATA% and create an archive of the directory .minecraft.
  • On Linux, open a terminal and execute the following command: tar cjf ~/.minecraft ~/minecraft.tar.bz2
  • On Mac, I don’t know what to do. Maybe trust your Time Machine.

Keep an Error Journal

Yesterday I listened to the excellent episode Bugs considered harmful of Scott Hanselmans podcast hanselminutes. (If you’re not subscribed to the podcast, stop reading here and subscribe.) Scott talked to Douglas Crockford about the history of computer science, about our understanding of the history and the missing self-consciousness about predecessors and principles of computers and programming languages.

That in itself makes an interesting podcast, but then the topic came to bugs and how to learn from them. Douglas Crockford mentioned an error journal that a software developer should write all bugs into, as a reference and as an excercise. The famous example of this is Donald E. Knuth and his document The errors of TeX. I’m still searching for the article mentioned in the podcast, where Donald Knuth described the usefulness of his error journal. Unfortunately the hanselminutes podcast does not have show notes, so there is no direct link to this article… 🙁

Anyway, I decided to start my own error journal today, after a colleague discovered a very silly bug that I created by manually copying data from one database to another. I couldn’t even remember doing that, but fortunately I created a ticket in JIRA before doing the actual task, so we could rule out a misbehavior of the database and pin the bug down to my human error. Maybe the error journal helps me to prevent such bugs in the future, and I do hope that simply writing it down will help me to remember this in the future.

Do you keep an error journal or something like that? Or do you have another way of remembering the types of bugs that you found, created or fixed?

Zurück zu Google Hangouts

Vor einigen Wochen habe ich ja beschlossen, Google Hangouts nicht mehr zu nutzen.

Jetzt bin ich wieder zurück. Googles Chat funktioniert einfach am besten, wenn man viele verschiedene Geräte (Smartphone, Tablet, mehrere Desktop-Rechner) verwendet. Und der Jabber-Server des CCC hat leider häufig mit DOS-Angriffen zu kämpfen. Und schliesslich ist auch Xabber als Android-Client leider nicht in der gleichen Klasse wie Googles Hangouts für Android.

Contributor für Apache Camel

Seit heute bin ich offizieller Contributor für Apache Camel. Das Apache Contributor License Agreement habe ich heute vormittag per Mail an die Apache Foundation geschickt und die Freischaltung war bereits nach wenigen Stunden erledigt.

Danach konnte ich sofort einen Account im Wiki anlegen und eine kurze Mail an die camel-users Mailing Liste reichte aus, damit mir die notwendigen Rechte für den ersten Edit der Dokumentationsseiten eingerichtet wurden. 🙂

Ab sofort kann ich mich also nicht nur über die unvollständige Dokumentation aufregen, sondern sie auch gleich beheben.

Den Sourcecode habe ich bereits gecloned, der Build läuft im Moment noch. Bevor ich mich allerdings an die ersten offenen Einträge im Camel Issue Tracker mache, werde ich noch den Guide for new commiters – und ein paar andere Dokumentationen – lesen.