ERROR 2006 (HY000) at line 137: MySQL server has gone away

Wenn man, wie ich einen großen MySQL-Dump (ca. 150 MB) mit

mysql -u root -p -D testdb < dump.sql

importieren will und dabei auf folgenden Fehler stößt,

ERROR 2006 (HY000) at line 137: MySQL server has gone away

kann man folgende zwei Dinge ausprobieren. Ich hatte dann am Ende beide benutzt.

1. maxallowedpacket erhöhen

In der MySQL-Config (bei ArchLinux unter /etc/mysql/my.cnf) den Eintrag max_allowed_packet suchen und erhöhen, z.B. auf

max_allowed_packet = 32M

Das ist ein sehr hoher Wert wenn man bedenkt, dass der default Wert 1M ist. Falls man auf einem Produktivsystem ist, sollte man nach dem Import wieder den alten Wert einstellen. Nicht vergessen den MySQL-Server nach Bearbeitung der config neuzustarten.

2. mysqldump Optionen ändern

Wichtig ist hierbei die option --skip-extended-insert auszuschalten, die per default eingeschaltet ist. Mein mysqldump Export Befehl sah dann am Ende so aus:

mysqldump -B dbname -u root -p -t --skip-extended-insert --skip-add-drop-table --skip-create-options > dump.sql

Vielleicht hilft's!

Kollaboratives Arbeiten mit Octopress und GitHub Pages

In diesem Post beschreibe ich einen Workflow, mit dem mehrere Leute mithilfe von Octopress und GitHub Pages einfach, schnell und kostenfrei bloggen können. Ich hatte bereits schonmal "einen Artikel" über meine Suche nach einer neuen Blogsoftware geschrieben, hier jetzt etwas mehr "hands on" und weniger "rant". Ursprünglich hatte ich diesen Beitrag als eine Anleitung für Stephan geplant, damit er endlich mal wieder mitbloggen kann. Aber ich dachte, es kann durchaus auch für andere Leute interessant sein. Also los!

Installation

(Im Großen und Ganzen ist diese Installationsanleitung eine Zusammenfassung der Setupanleitung der offiziellen Octopress Dokumentation. Im Zweifelsfall solltest du dort nachschauen, falls irgendwas nicht funktioniert. Wenn das auch nicht hilft, kannst du gerne ein Kommentar schreiben, dann versuche ich zu helfen.)

Lege ein neues Repository auf Github an. Der Name ist egal, am Ende ist dieses Repo (und damit dein Blog) über die Adresse "http://username.github.com/reponame" verfügbar. Bei mir ist es beispielsweise "http://benben.github.com/nerdlabor".

Für die Installation von Octopress sollte eine Ruby Version größer als 1.9.2 installiert und einsatzbereit sein. Am besten du benutzt den Ruby Version Manager oder kurz RVM. Wie das geht steht im Octopress Ruby Install Guide oder allgemeiner direkt bei RVM.

Bei Octopress gibt es keine richtigen Versionen, also kannst du einfach den aktuellen master-Zweig klonen:

git clone git://github.com/imathis/octopress.git octopress

Jetzt hast du einen Ordner "octopress". Nun kannst du folgende Befehle eingeben um die Installation zu beenden:

cd octopress
gem install bundler
bundle
rake install

Nun muss das zuvor angelegte Github-Repository als Deploy-Ziel angegeben werden. Dazu

rake setup_github_pages

ausführen und die Repo-Push-Url angeben. Bei mir wäre das "git@github.com:benben/nerdlabor.git". Octopress sollte alles weitere selbst erledigen.

Jetzt kannst du mit

rake generate
rake deploy

dein neues Blog erstellen und in den gh-pages-Zweig auf Github pushen. Warum gh-pages-Zweig? Weil Github Pages für Projekte so funktioniert. Mehr dazu hier (Abschnitt Project Pages).

Um nun aber auch den eigentlichen Quellcode des Blogs speichern zu können und nicht nur die statischen kompilierten Blogseiten (die bereits im gh-pages-Zweig sind), musst du noch folgendes tun:

git remote add origin (your repo url)

Dieser Befehl fügt dein Repository auf Github als origin hinzu. Also bei mir wäre es dieser Befehl:

git remote add origin git@github.com:benben/nerdlabor.git

Jetzt noch ein

git config branch.master.remote origin

um dein Repository auf github als default zu setzen. Den aktuellen Quellcode kannst du jetzt mit

git add .
git commit -am "initialer blog quellcode"
git push origin master

committen und pushen.

Also nochmal kurz: Im master-Zweig deines Repositories ist dein Blog Quellcode und im gh-pages-Zweig ist dein kompilierter Blog, der dann angezeigt wird.

Nun kannst du die _config.yml bearbeiten um dein Octopress zu konfigurieren. Das Einzige, was am Anfang gebraucht wird, ist eine korrekte Url, die deiner oben genannten Github Project Pages Url entspricht. Committe und pushe deine Änderungen danach in den master-Zweig.

Jetzt bist du endlich bereit und kannst mit dem Bloggen beginnen! Wurde aber auch Zeit!

Bloggen

Obwohl dieser Beitrag für mehrere Benutzer geschrieben ist, macht es auch Sinn wenn man alleine ist, da man a) den Überblick hat was die aktuellste Version ist und b) alles sicher aufgehoben ist und c) der git/GitHub-Workflow das Veröffentlichen so einfach wie ein "git push" macht.

Als erstes ein neues Blogpost-Template anlegen:

rake new_post["Mein neuer Blogposttitel"]

Dieser Befehl legt eine Datei unter octopress/source/_posts/ an. Diese kannst du jetzt mit deinem bevorzugen Editor öffnen. Am besten du beginnst mit den Konfigurationen im Header und verpasst deinem Blogpost ein paar Kategorien. Diese sind bei Octopress das gleiche wie Tags.

tags:
- octopress
- github
- ruby

Jetzt noch deinen Benutzername hinzufügen:

author: ben

Jetzt kannst du anfangen deinen Blogpost zu schreiben. Wenn du eine Vorschau sehen möchtest, dann speichere ab und führe

rake generate
rake preview

aus. Dann kannst du im Browser auf http://localhost:4000/reponame deinen Blog mit deinem neuen Blogpost sehen. Schreibe weiter an deinem Blogpost, speichere und aktualisiere das Browserfenster. Octopress müsste die Änderungen erkennen und die neue Version automatisch generieren solange der "rake preview"-Prozess läuft.

Wenn du zufrieden mit deinem Blogpost bist und denkst er ist gut genug, um die Welt zu verändern dann einfach ein

rake deploy

ausführen und der Blogpost ist in deinem Blog veröffentlicht. Jetzt musst du nur noch deine Änderungen committen und pushen, um auch den Quellcode des Blogposts auf Github zu schieben. Das geht mit

git add .
git commit -am "mein neuer blogpost"
git push origin master

Fertig!

Ein Freund zum mitbloggen einladen

Möchtest du jetzt einen Freund oder Kollegen zum mitbloggen anregen, dann füge ihn als Collaborator auf Github zu deinem Repository hinzu, damit er dort auch hinpushen kann.

Dann kann er das Repository klonen (dabei darauf achten, die ssh URI zu benutzen, die mit git@github.com beginnt) und folgende Befehle ausführen. (Hoffentlich hat er Ruby schon installiert! Wenn nicht, zeig ihm wie es geht, du weißt es ja jetzt.)

gem install bundler
git checkout master
bundle
rake setup_github_pages # dabei die gleiche URI wie beim klonen angeben

Jetzt kann er genauso wie du einen Blogpost schreiben, den Blog backen, auf Github deployen und den Quellcode in den master-Branch deines Repositories pushen. Wiederhole diesen Schritt für alle Leute, die du gern in deinem Blog schreiben lassen möchtest.

Happy Collaborative Blogging!

PS: Ich finde Octopress in Kombination mit den Funktionen von GitHub und Github Pages kann man durchaus als Alternative zu manch einem CMS sehen, da Nutzer- und Versionsverwaltung von git/Github einfach genutzt werden können. Was denkt ihr?

Ruby One-Liner für zufällige IP- und MAC-Adressen

Hier mal zwei lustige Einzeiler für die Generierung von zufälligen Fake-IP und Mac-Adressen.

IP-Adresse:

Array.new(4).map!{rand(256)}.join(".")
# => "220.58.246.123"

MAC-Adresse:

Array.new(6).map!{"%02x" % rand(256)}.join(":")
# => "86:c8:11:c6:18:57"

Ich würde mich über weitere praktische Einzeiler (gerne auch in anderen Programmiersprachen!) in den Kommentaren freuen!

Ruby FTP stoppt Upload ohne Error

Ich habe ein kleines Ruby Skript geschrieben, welches einen Ordner mit allen Inhalten (Dateien und Unterordner) per Net::FTP auf einen Server kopiert. Der Upload stoppte aber immer nach ein paar Dateien ohne Fehlermeldung und das Skript lief ohne etwas zu tun weiter. Es hat mich zwei Stunden gekostet, bis ich eine Lösung dafür hatte: Die FTP Verbindung muss explizit in den passiven Modus geschaltet werden:

ftp.passive = true

Scripting mit Blender 2.61 #2

Habe mal den Code vom letzen Blender Post erweitert und etwas Bewegung hinzugefügt. In ein Blender Skript kopieren und im Animationsfenster auf Play drücken.

#import blender stuff
import bpy

#loop through all objects in the scene
#bpy.context.scene.objects is a list
for obj in bpy.context.scene.objects:
    #use only real opbject, not the camera or lamp
    if obj.type == 'MESH':
        #select the current object
        obj.select = True
        #remove the current selected object (which will always be obj)
        bpy.ops.object.delete()

#create a new cube object
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))

#define a function which will be called every frame change
def my_func(scene):
    obj = scene.objects[0]
    obj.location.x = scene.frame_current/50
    print("frame #", scene.frame_current)

#remove all handlers
for i in range( len( bpy.app.handlers.frame_change_pre ) ):
        bpy.app.handlers.frame_change_pre.pop()

#append handler
bpy.app.handlers.frame_change_pre.append(my_func)