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)
Nach dem Erfolg im letzten Jahr wiederholen nun unseren Physical Computing Workshop.
Wie 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!
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!
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.
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.
HandHeld! Das Kickfinger-Turnier für Mobile Entwickler mit Heribert Faßbender
15. Mai 2012Autor: Niklas
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.
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 »
“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…


