Kurztipp: Segmentation Fault von PHP mit XDebug unter Ubuntu 15.04

Unser Entwicklungsrechner lief hier lange unter Ubuntu 14.10 LTS, aber nach dem jetzt Ubuntu 15.04 da war, haben wir uns doch mal entschlossen, ein Update zu fahren, in der Hoffnung dadurch ein paar Probleme loszuwerden, die wir hatten. (Und ich wollte mal sehen, wie sich Systemd macht…). Abgesehen von einem kleinen Stromausfall während des Updates und darauf folgender Reparatur auf der Textkonsole (bei Windows wäre ein Neuinstallation nötig gewesen!), lief auch alles gut.

Was leider nicht mehr wollte, war Xdebug. Ohne Debugger liefen die PHP-Skripte perfekt, aber wenn man sie debuggte, wurde komischerweise teilweise Variablen nicht angezeigt und es kam zu sehr unerklärlichen Exceptions, gefolgt von einer tollen Meldung im Apache Log:


[core:notice] [pid 13686] AH00052: child pid 14595 exit signal Segmentation fault (11)

Weiterlesen

Opertunistic Encryption mit Firefox 37 und Ubuntu 14.04 LTS

Firefox 37 hat ein neues Feature: Opertunistic Encryption, oder auch „TLS for http://“. Die Idee ist einfach: Wir versuchen einfach mal, die Seite über HTTPS zu laden, auch wenn das Zertifikat nicht nicht stimmt, behaupten aber auch nicht, die Seite wäre sicher. Einfach, aber wirkungsvoll. Ich finde es aktuell schrecklich, das es entweder verschlüsselt und authentifiziert mit teurem Zertifikat, oder völlig unverschlüsselt gibt. Sollte nicht viel mehr der Unterschied verschlüsselt und nicht authentifiziert (http) oder verschlüsselt und authentifiziert (https) sein?

Natürlich ist es ein leichtes, die Verschlüsselung auszuhebeln, wenn man ein aktiver Angreifer/MITM ist. Aber es hilft gegen passives Belauschen. Und das muss nicht mal die NSA sein, es geht auch um Sachen wie FireSheep. Auf jeden Fall ist die Idee das man so, wenn möglich, ein verschlüsselte Verbindung bekommt, aber da man ja nicht weiß, mit wem man redet, behauptet niemand, das die Verbindung sicher sei.

Weiterlesen

Tipp: Schöner RegEx-Tester

Ja, es gibt circa 100.000 Websites, auf denen man reguläre Ausdrücke testen kann, aber eine finde ich besonders schön:

http://regex101.com/

RegEx101 heißt die Seite, und hat ein paar schöne Features:

  • Man kann die (Programmier-)Sprache einstellen, leider gibt es (noch) kein .NET, aber die PHP-Syntax ist sehr ähnlich
  • Man kann Flags setzen
  • Es gibt die übliche Kurzhilfe, aber auch eine etwas längere Version.
  • Es gibt ein relativ gutes Syntax-Highlighting
  • Ganz toll: Es werden die gefundenen Matches (also der Gruppen) angezeigt. Das habe ich lange gesucht!
  • Die Seite hat einen Code-Genrator, der auch C# kann, auch wenn man den jetzt nicht wirklich braucht…

regexEin weiteres nettes Feature ist der Debugger, der anzeigt, in welchen Schritten die Engine den Text absucht. Auf die Weise findet man schnell Fehler bei denen zu viel „gefressen“ wird. Leider ist die Seite nicht besonders schnell, vermutlich wird der RegEx per AJAX auf dem Server ausgeführt… Wer eine schnellere Alternative sucht (die ich bis jetzt benutzt habe): http://regexpal.com/ Sehr schnell (weil in JavaScript), versteht aber die .NET Eigenheiten nicht und kann auch die Matches/Gruppe nicht anzeigen. Darum habe ich eine neue Seite gebraucht…

Weiterlesen

Mit C# und Word Serienbriefe erstellen

Wie dem einen oder anderen ja vielleicht bekannt ist, kann man die ganzen Office-Anwendungen von Microsoft ja aus vielen Programmiersprachen fernsteuern. Dazu gibt es eine COM-Schnittstelle (leider :() Die ist zwar nicht gerade modern oder praktisch, aber sie funktioniert relativ gut.

Theoretisch geht das auch mit .NET 2.0, praktisch gesehen möchte man es aber erst mit .NET 4.0 probieren: Die Funktionen von Office nehmen oft wahnsinnig viele Parameter (15 sind da keine Seltenheit), und vor .NET 4.0 gab es keine optionalen Parameter, daher musste man für alles, was man nicht benutzen wollte Type.Missing angeben. Das war natürlich extrem unpraktisch. Mit dem neuen .NET ist Type.Missing jetzt der Standard-Wert der optionalen Parameter, und das ganze ist deutlich benutzbarer geworden.

Ich hatte mir zu Ziel gesetzt einen kleinen Serienbrief-Generator in C# zu schreiben. Ich weiß, Word hat so eine Funktion schon eingebaut, aber die Daten für die Briefe sollten automatisch generiert werden, und es hat mich auch einfach interessiert 🙂 Die Briefe basieren auf einem Template, was einfach ein normales Word-Dokument ist, das Platzhalter enthält. (Die Platzhalter sind auch einfach nur Text, keine Magie dahinter…) Diese Platzhalter werden durch ein einfaches Suchen&Ersetzen umgewandelt, und danach wird das Dokument ausgedruckt. Funktioniert auch recht gut, aber es gibt ein paar seltsame Dinge, auf die ich kurz eingehen will:

Weiterlesen

FischerPi Teil 4: RaspiFastCamD

TL;DR: Wer einfach nur RaspiFastCamD haben will: Hier gibt es die (mglw. veraltete Binärversion).

Wow, der letzte Teil ist schon wieder lange her. Aber ich war nicht untätig, für die weitere Arbeit an meinem Roboter musste erst ein Software-Problem behoben werden:

Ich habe mir ja die Rasperry Camera gekauft, und diese sollte für die Navigation benutzt werden. Dazu muss natürlich irgendwie das Kamera-Bild ausgewertet werden. Nach ein wenig Suchen habe ich dann OpenCV gefunden, eine Bibliothek, die genau dafür gemacht wurde (CV steht für „Computer Vision“). Nur wie das Bild der Kamera in OpenCV bekommen? Bei USB-Kameras, die V4L (Video for Linux) unterstützen, ist das recht einfach, dort kann OpenCV die Bilder einfach abholen.

Weiterlesen

FischerPi Teil 3: Kühlung, Stromverbrauch und ein erstes Blinken

Im letzten Teil hatte ich ja schon geschrieben, dass es noch ein Problem mit der Kühlung gab, sprich der Spannungswandler auf meinem Roboter, der aus den ~9V für den fischertechnik-Teil genau 5V für den Raspberry Pi machen sollte, wurde viel zu heiß. Wie Christoph in den Kommentaren anmerkte bin ich da nicht ganz unschuldig dran, denn mein Spannungswandler ist tatsächlich nur für 2A ausgelegt, wenn er ausreichend gekühlt wird.

Also habe ich einen Blick in unsere Metallkiste geworfen, und aus einem alten Stück Alu-Blech dieses Kühlkörper gebaut:IMGP1936Kommt vermutlich nicht ganz an die Kühlleistung eines richtigen Kühlkörpers heran, reicht aber völlig. Damit bleibt die Temperatur des Bleches auf einem erträglichen Maß (man kann es ca. 10 sek lang anfassen). Trotzdem ist das Ding immer noch ziemlich warm, und strahlt auch eine Menge Wärme ab. Gerade wenn das man von einem Akku gespeist werden soll, wird da wohl zu viel Energie verloren gehen… Aber: Der Raspberry Pi läuft! Er wird direkt über die GPIO Pins mit Strom versorgt, und läuft wunderbar.

Weiterlesen

.NET Tipps 5: Optionale Parameter und Params sind keine gute Idee

Mal wieder ein neuer .NET Tipp!

C# hat ja so nette Funktionen wie optionale Parameter und „params„. Beide für sich sehr praktisch, mit dem ersten kann man Parametern Default-Werte mitgeben, die benutzt werden, wenn der Parameter nicht angegeben wird. Mit dem zweiten kann man einen Parameter kennzeichnen, der ein Array erwartet, statt diesem kann man dann auch einfach eine Kommata-getrennte Liste angeben.

Nur beides zusammen ist keine gute Idee: Ich hatte diese Funktion, welche eine optionale Sequenznummer erwartet, sowie eine Liste von NiboCommand-Objekten:

Weiterlesen

Ein Kartengeber aus fischertechnik

Diesmal eine kleine Vorgeschichte: Bei uns bei uniKIK gibt es immer jede Menge Flyer, und diese Flyer müssen meisten in Packen von ca. 15 an die ganzen Schulen verschickt werden. Von der Druckerei kommt aber nur ein großer Haufen, also müssen die Flyer in einer wahnsinnig spannenden Aktion abgezählt werden. Langweilige Arbeit? Das kann doch auch eine Maschine machen, dachte ich mir 😉IMGP1869

Weiterlesen

PHP: htmlentities() zerstört UTF-8

htmlentities() ist ja eine Recht nette PHP Funktion um schnell das ganzen HTML aus einem String zu bekommen, weil man den z.B. (als Code) ausgeben möchte. Aber: Die Funktion macht UTF-8 kaputt! Also muss man entweder sowas wie utf8_decode(htmlentities($str)) machen, oder man schaut sich die Argumente noch mal genau an, und stellt fest, dass man das Charset auf explizit angeben kann. Diese Variante lässt UTF-8 am Leben:


htmlentities($str, ENT_COMPAT | ENT_HTML401, "UTF-8");

Weiterlesen

Segementation Fault unter Linux/Mac debuggen

Für die Uni muss ich ja nun viel C schreiben, und da gibt es ja nun mal diese wunderbaren Pointer. Sollte man davon mal eine falsch setzen bricht das Programm ab, und es gibt eine wunderbare Fehlermeldung: Segementation Fault: 11. Jetzt heißt es also, den Fehler mit jede Menge printf() eingrenzen und nach sehr viel Suchen dann evtl. auch finden.

Nach den ich heute mal wieder einen Pointer falsch hatte, habe ich mal nachgesehen, ob es nicht auch einfacher geht… Geht es natürlich… Also eine kleine Anleitung! Ich habe extra für euch ein Programm mit Fehler gebaut: Sowas würde mir sonst natürlich nie passieren 😉

Was nun? Als ersten müssen wir dem Betriebsystem sagen, dass es einen Speicherdump (coredump) erstellen soll, wenn ein Programm abstürzt. Die Dinger werden ziemlich groß, deswegen ist das normalerweise ausgeschaltet. Um es für die akutelle Shell zu aktivieren geben wir ulimit -c unlimited ein. Damit wird bei nächsten Absturz ein core-dump erstellt. Damit kommen wir schon recht weit, doch wir können das Programm noch im Debug-Modus kompilieren, damit wir noch besser sehen, was da schief gelaufen ist. Dazu einfach gcc den Parameter -g mitgeben (ja, clang kann das auch). Danach lassen wir das Programm wieder abstürzen:Na, aufgepasst? Da steht jetzt (core dumped). Nun schauen wir mal in den Ordner /cores, dort liegt unser core dump! Und er ist (für dieses einfache Programm) >300 MB groß! Das war das, was ich oben meinte…

Weiterlesen