Natürlich gibt es nach wie vor Anwendungsbereiche, in denen Microcontroller bisher eher nicht vertreten sind. Der Blindenstock ist keiner davon – jedenfalls nicht mehr, seitdem am Samstag (13.04.2013) Reinhard und Thomas einen Ardiuno-gesteuerten Blindenstock mit Ultraschall-Echoloten, akustischem Signalgeber und zwei Vibrationsmotoren entwickelt haben. Der Microcontrollierte Blindenstock war eines von vielen interessanten Projekten, die die Teilnehmer des nun schon zweiten Physical Computing Laboratory “Löt IT” erfunden und ertüftelt haben… (Klick auf “mehr” für Fotos)

Diesen Beitrag weiterlesen »

Löt IT! 2013

27. Februar 2013
Autor: Jochen

Nach dem Erfolg im letzten Jahr wiederholen nun unseren Physical Computing Workshop.

loetit_logoWie beim ersten Mal ist die Teilnahme kostenlos und spezielle Vorkenntnisse sind nicht erforderlich. Wer sich einen Eindruck vom letzten Mal machen möchte findet hier im Blog einen kleinen Rückblick.

Interesse? Dann hier entlang zu allen Details und zur Anmeldung! Wir freuen uns auf euch!

PI Rekord bei DocCheck

6. Februar 2013
Autor: Jens

Unsere Portal für HealthCare-Profis DocCheck hat einen neuen Traffic-Rekord aufgestellt: 13 Millionen Page Impressions im Januar.

Herzlichen Glückwunsch an das Team!

Manchmal sind es eben die kleinen Dinge.

Als Entwickler, der oft eh’ gerade seine Hände an der Tastatur hat, habe ich mich daran gewöhnt, wann immer es möglich und effizient ist, auf selbige zurückzugreifen. Ein klassisches Beispiel ist der TotalCommander, den ich in weiten Teilen mit der Tastatur bediene.

Umso mehr habe ich mich gefreut, als ich endlich verstanden habe, wie man über die Kommandozeile (“Eingabeaufforderung”), wie sie auch TC mitbringt, eine leere Datei anlegen kann:

type NUL > neueDatei.txt

Das ist natürlich nicht nennenswert einfacher, und sogar bedeutend länger als Alternativen wie “notepad neueDatei.txt”, hat aber den Vorteil, dass kein Programmfenster geöffnet wird (naja, bleibt). Da es mir aber zu lang war, und ich von der Arbeit in UNIX-Umgebungen zu diesem Zwecke das kürzere “touch”* benutze, habe ich kurzerhand eine Batch-Datei gebastelt und in meinem Windows-Ordner abgelegt. Inhalt dieser Datei:

type NUL > "%1"

Mit dem Kommando “touch neueDatei.txt” habe ich somit eine leere Datei.

*) Jaaaa, UNIX-touch macht auch noch was anderes. Is’ ja gut.

[EDIT]
Nach einem Hinweis von Daniel habe ich den Beitrag aktualisiert. Das Kommando vertraute in der ersten Version diese Artikels auf eine nicht-vorhandene Datei. Sicherer und schöner ist das Benutzen von NUL. Daniel schreibt dazu:

“NUL ist so eine Art Nulldevice (/dev/null und NUL kennen sich und
fahren in ihrem Urlaub manchmal gemeinsam weg)”

Danke für den Hinweis!

Eine gängige Footerzeile auf einer Webseite sieht wie folgt aus:

© Copyright 2002-2012 Beispielfirma GmbH – Alle Rechte vorbehalten

Da vor allem das “-bis”-Jahr jedes Jahr aktuell zu halten ist, könnte man diese Zeile TypoScript abbilden, und zwar wie folgt:

lib.field_copyright = TEXT
lib.field_copyright {
	data = date : Y
	wrap = © Copyright 2002-| Beispielfirma GmbH - Alle Rechte vorbehalten
}

Um die groben Angriffsflächen, die PHP so mitbringt, ein wenig zu schützen, wird gerne mal Suhosin verwendet.

Bei einer WordPress-Installation mit dem CSS-Minifying-Plugin “wp-minify” bin ich jedoch in Verbindung mit dem Suhosin-Plugin auf einen interessanten Fehler gestoßen: Anstatt dass der Aufruf der Request-URL, die wp-minify generiert, ein schön komprimiertes CSS zurück gab, fand eine Weiterleitung mit 302-Header auf  die Haupt-Domain statt, in etwa so:

Request:

GET http://example.org/wp-content/plugins/wp-minify/min/?f=wp-content/plugins/file1.css,
wp-content/themes/example/style.css,wp-includes/css/admin-bar.css,wp-content/plugins/
someplugin/style.css&m=1350570864

Response:

HTTP/1.1 302 Found
Location: http://example.org

Über einen Beitrag im WordPress-Support-Forum kam ich schnell zur Ursache: Auch in dem Systemlog des fraglichen Servers gab Suhosin die Auskunft, der GET-Parameter sei zu lang.

wp-minify bietet eine Option, die Dateinamen der Originaldateien zu verbergen.

Na gut. Da wir den Schutz Suhosins natürlich nur sehr ungern auflockern möchten, habe ich mich nach Alternativen umgesehen. Und siehe da: wp-minify bietet eine Option, anstelle des oben beschriebenen URL-Formats mit ewig langen GET-Parametern, eine “pretty URL” einzusetzen.

Das Ergebnis: Dort, wo zuvor eine der gefühlt längsten URLs der Welt stand, findet sich nun so etwas wie

http://example.org/wp-content/plugins/wp-minify/cache/df7d5c2e66d6637a1d677845854a9eb1.css?m=1350628165

Damit hat der Suhosin keine Probleme mehr – und ganz nebenbei haben wir auch noch potentiellen Angreifern die Namen unserer CSS-Dateien, und somit unserer WordPress-Plugins, ein ganz kleines bisschen weniger offensichtlich gemacht.

Es gebe 3 Entitäten: slides, modules und user.

slides identifizieren sich über ihre Modulzugehörigkeit sowie eine eigene Slidenummer innerhalb dieses Moduls – es gibt also einen kombinierten Primärschlüssel aus (module_id, slideNumber), auf Englisch auch Composite Key genannt.

/**
 *
 * @author lukasdomnick
 * @ORM\Table(name="slides")
 * @ORM\Entity
 */
class Slide
{
	/**
	 * @ORM\Id
	 * @ORM\Column(type="integer")
	 */
	private $slideNumber;
	/**
	* @ORM\Id
	* @ORM\ManyToOne(targetEntity="Module", inversedBy="slides")
	* @ORM\JoinColumn(name="module_id", referencedColumnName="id")
	*/
	private $module;
	// und so weiter
}

Nun möchte ich erfassen, welcher User welches Slide gesehen hat. Es ist also eine irgendwie geartete Many-To-Many (oder N:M, oder wie auch immer)-Verknüpfung zwischen slides und users erforderlich. Auch das kann Doctrine 2 uns abnehmen; die Doku spricht dazu jedoch nur sparsam.

Da in diesem Fall der User die “owning Side” ist, wird die doch etwas komplexere Annotation für diese Relation genau hier definiert:

// User.php
// ...
	/**
	* Viewed Slides
	*
	* @var Collection
	*
	* @ORM\ManyToMany(targetEntity="Slide", inversedBy="users")
	* @ORM\JoinTable(name="user_viewedslides",
	*      inverseJoinColumns={
	*      		@ORM\JoinColumn(name="slideNumber", referencedColumnName="slideNumber"),
	*      		@ORM\JoinColumn(name="module_id", referencedColumnName="module_id")
	*      },
	*      joinColumns={
	*      		@ORM\JoinColumn(name="user_id", referencedColumnName="id")
	*      }
	* )
	*/
	private $viewedSlides;
// ...

Auf der Inverse Side, also in der Slide-Klasse, reicht dann die folgende Annotation wie gewohnt völlig aus:

// Slide.php
	/**
	* @ORM\ManyToMany(targetEntity="User", mappedBy="viewedSlides")
	*/
	private $users;

Nachdem nun die Entitys generiert und das Schema upgedated wurden, kann ich auf dem User mit ->getViewedSlides() die Collection der gesehenen Slides abrufen.

Du bist ein Virtuose am Touchscreen? Die Prima Ballerina des Double Tap? Deine Finger sind muskulöser als die Oberschenkel von Roberto Carlos? Hier kommt Deine Chance, zu zeigen, was du im „Handspiel“ wirklich drauf hast: Flicke die Konkurrenz schwindelig und nagle den Ball ins Schwarze – beim Kickfingerturnier für Mobile-Entwickler.

Kickfinger-Turnier für Mobile Entwickler mit Heribert Faßbender

Die Eckdaten:

Spielstätte: Grünfeld, Brüsseler Str. 47, 50674 Köln

Stichtag: Donnerstag, 31.05.2012
Beginn “Freies Training”: 19.00 Uhr
Offizieller Turnierbeginn: 19.30 Uhr
Siegerehrung: ca. 22.00 Uhr

Moderation: Heribert Faßbender

Bereit für den FlickOff? Netze bis zum 25.05. Deine Anmeldung bei uns ein.

Eine eMail mit „Ich will Handheld werden“ unter Angabe Deines Vor- und Zunamens an handheld@antwerpes.de genügt.

Bisher hatte ich nie ein Tool gefunden, mit dem JavaScript-Dateien zu Komprimieren wirklich Spaß gemacht hat. Der altbewährte YUI-Compressor von Yahoo erfüllt seinen Zweck hervorragend – aber die Kommandozeile zu bemühen ist doch eher lästig.

Wie gut, dass Total Commander mit seinen frei konfigurierbaren Button-Bars uns eine Möglichkeit gibt, diesen Minify-Prozess zu vereinfachen.
Diesen Beitrag weiterlesen »

LötIT 2012: Retrospektive

12. März 2012
Autor: Lukas

“Wie krieg ich jetzt mein Getränk ohne einen elektronischen Ausschenker in mein Glas?” – fragt Markus am Sonntag auf seiner Facebook-Wall. So ähnlich wie ihm dürfte es auch vielen der anderen Teilnehmer des ersten Phyiscal Computing Laboratory sponsored by antwerpes gegangen sein, als sie nach einem bastelintensiven Samstag wieder zurück ins echte Leben ohne volldigitale Rhythmusnachklopfer, Infrarot-Theremin, TSCoTCP (Tea Spoon Catapult o/ TCP), Nunchuck- und C#-kontrollierten Farbwechslern, Club-Mate-Klavier oder AJAX-Gesteuerten LED-Matritzen kehren mussten…

Diesen Beitrag weiterlesen »