Nicht nur, aber viel Wahres dran:
Manfrotto BeFree und Lowepro Flipside 200 an der D90
Nachdem ich mir im letzten Sommer ein zusätzliches Objektiv gekauft hatte, musste eine neue Tasche her; es ist die Lowepro Flipside 200 geworden. Letzte Woche habe ich dann spontan noch ein Stativ dazugekauft – eine Investition, die ich schon lange vorhatte. Da bot es sich an, dass es das Manfrotto BeFree für ~135 statt ~200 UVP Euro bei Amazon gab (Partnerlink).
Zu beiden Produkten gibt es schon drölfzig Reviews im Netz, technische Details und Vergleiche finden sich dort. Das Manfrotto ist mein erstes Stativ, deshalb kann ich auch gar keine elaborierten Vergleiche anstellen. Was mich aber insbesondere an den Manfrotto-Reviews störte: Man sieht praktisch nie eine Kamera auf dem Stativ, und es wird auch nicht so richtig klar, ob bsplw. eine D90 ohne Adapter und/oder zusätzliche Schnellwechselplatte kompatibel ist – sie ist. Bei Amazon war ich mir nicht mal sicher, ob eine solche dabei ist (“Lieferumfang: inkl. Tasche”) – sie ist. Deshalb hier ein paar Eindrücke “in Betrieb”:
Lowepro Flipside 200
Die Flipsides sind super:
- die Öffnung liegt zum Rücken hin, man kann also auch im dichten Gedränge nichts klauen
- über den Bauchgurt kann man den Rucksack nach vorne holen (“Flip”), die Öffnung ist dann “oben” und bequen erreichbar
- eine Stativlasche plus kleinem Gurt ermöglichen das Anschnallen eines Stativs:

- der Tragegriff ist im Vergleich zu anderen Rucksäcken um 90° gedreht, so schlägt der Rucksack beim Tragen in der Hand nicht an die Beine
- damals recht günstig (~58 Euro, inzwischen leider teurer, Partnerlink)
- selbstverständlich: Kleine Taschen für SD-Karten sind vorhanden, die Innenaufteilung ist variabel
Was die Innenaufteilung angeht, so gab es damals zig Kundenfotos auf Amazon, die leider entfernt wurden. Hier mein Aufbau (aus naheliegenden Gründen mit dem Handy aufgenommen):

- Reissverschlusstasche. Wenn ich unterwegs bin, sind hier oft Portemonnaie, Handy etc drin, sonst Kabel
- die Kamera mit 10-24mm
- Ladegerät, unterwegs nicht immer dabei
- 18-105, hochkant
- Filter, Gegenlichtblenden, etc
- 35mm
- Einschub in der Klappe, ggf. für Stadtführer, Pässe, etc
- Reissverschlusstasche für Stifte, Speicherkarten, inkl. befestigtem Schlüsselband
- Getränketasche
Damit ist das Ding auch voll – aber es ist auch immerhin das kleinste Modell! Vor allem an das 35mm (Punkt 6) kommt man schlecht ran, da die Klappe nicht hochklappt, sondern gebogen werden muss, und das 35mm in meinem Setup unter der Beuge sitzt. Das ist einer von auch nur zwei Kritikpunkten; der andere ist: Der Bauchgurt kommt mir sehr dünn und “billig” vor. Ich traue ihm nicht zu, den Rucksack vernüftig zu halten. Da er außerdem keine Möglichkeit bietet, die Schlaufen und überhängenden Gurtenden wegzubinden, habe ich ihn entfernt. Vielleicht ist das bei den größeren Modellen anders.
Manfrotto BeFree MKBFRA4-BH
Für das Manfrotto gibt es eine nette Microsite, sowie diverse Video-Reviews über das Konzept der Stativbeine, bsplw.:
Aber wie gesagt, mir fehlte Material über den konkreten Einsatz. Deshalb gleich einige Bilder mit meiner D90 mit aufgesetztem 10-24mm (ebenfalls mit dem Handy aufgenommen). Das ist das schwerste Objektiv (460g offiziell), das ich habe; zusammen mit der Kamera (620g offiziell – ohne Akku^^) kommt man auf über 1kg. Mit einem Tele müsste man vermutlich einen Objektivring verwenden, aber das muss man woanders auch.
Der Kopf macht mir trotzdem am meisten Sorgen: Es gibt keine Hebel; man muss mit einer Hand die Flügelschraube lösen, um die Kamera mit der anderen zu justieren. Dreht man die Schraube wieder fest, muss man darauf achten, die Kamera nicht wieder zu verziehen. Immerhin gibt Manfrotto 10 Jahre Garantie auf das System, so dass man sich wenigstens keine Sorgen um die langfristige Zugkraft der Schraube machen muss.
Bild 1: Ganz ausgezogen. So sitzt mir die Kamera bei 186cm Körpergröße etwa auf Höhe des Halsansatzes. Man sieht, dass das Ganze etwas filigran wirkt:

Bild 2, etwas näher:

Bild 3: Stellschrauben. Der obere Teil ist jetzt ganz eingeschoben. Mir sitzt die Kamera so etwa zwischen Brust und Bauch, was immer noch OK ist (wir sprechen hier von einem Reisestativ!) und wesentlich stabiler:

Trotz des rudimentären Kopfes ist alles nötige möglich: 180° Drehungen oder 90° Abklappung. Die Schnellwechselplatte gehört übrigens zum Lieferumfang. Besonders nett: Der Kopf ist auch andersherum einsetzbar, so dass man zB für Makro-Aufnahmen dicht an den Boden kommt (das hintere Bein ist ganz ausgezogen, die beiden vorderen zwei Einheiten weit eingezogen):

Einen Vorteil bietet der Kopf dann aber doch: Die Beine sind so dicht anklappbar, dass das ganze Ding echt klein wird. Hier ein Bild an der Lowepro, die wie gesagt schon das kleinste Modell ist; markiert sind die Lasche, die zwei Beine fasst, sowie der Gurt:

Synology: Seinen eigenen DDNS-Service hosten
Achtung: Setzt inwx.de als Registrar voraus!
Der Service
Auf xuad.net gibt es eine entsprechende Anleitung für einen DDNS-Service, auf GitHub liegen die Sourcen. Dabei ist einiges zu beachten:
Man muss dieses Skript unter einer anderen (Sub-) Domain als das DDNS-“Ziel” laufen lassen, klar. Sobald man die DDNS-Domain dynamisch um-mapped, ist das Skript sonst nicht mehr erreichbar.
Wer bei INWX ein Passwort mit Sonderzeichen verwendet, sollte es in der .ini in Anführungszeichen setzen.
Wenn man die IP auslesen möchte, statt sie zu übergeben (siehe Comments in dem Post), und der Server nur schon IPv6 spricht, sollte man den hier beschriebenen “Fix” verwenden, denn INWX erwartet eine v4-Adresse:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
$v4mapped_prefix_hex = '00000000000000000000ffff'; //$v4mapped_prefix_bin = pack("H*", $v4mapped_prefix_hex); $v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex); $addr = $_SERVER['REMOTE_ADDR']; $addr_bin = inet_pton($addr); if( $addr_bin === FALSE ) { die('Invalid IP address'); } if( substr($addr_bin, 0, strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) { $addr_bin = substr($addr_bin, strlen($v4mapped_prefix_bin)); } $ip = inet_ntop($addr_bin); |
Darüber hinaus muss bei INWX ein expliziter Eintrag für die Subdomain angelegt sein. Das Skript ruft diesen bestehenden Eintrag ab, extrahiert eine ID, und updated dann über diese ID. Gibt es keinen Eintrag, gibt es auch keine ID, und das Update kann nicht durchgeführt werden. Ein Wildcard-Eintrag genügt nicht.
Dann sollte das klappen. Falls nicht, kann man im DDNSManager.php Debugging einschalten, um Request und Response an INWX ausgeben zu lassen:
|
1 |
$domrobot->setDebug(true); |
Und/oder PHP-Fehler anzeigen, klar:
|
1 2 |
error_reporting(E_ALL); ini_set("display_errors", 1); |
Den Service aufrufen (lassen)
Interessanter ist die Frage, wie und wann sich das NAS dann registriert. Der hauseigene DDNS-Client bietet zwar drölfzig Anbieter zur Auswahl, aber kein Feld für custom Skripte 🙁
Erste Idee: cron. Zwar bringen die Synologys cron mit, allerdings will man sich mit einem regelmäßigen Cronjob ja nicht seinen Ruhezustand versauen.
Zweite Idee: dhclient-exit-hooks.d (siehe auch), dhcpcd, networkmanager, oder irgendwas, das einen Hook bei IP-Änderung bietet. Gibt es auf einem Synology offenbar (so) nicht.
Dritte Idee: Den erwähnten DDNS-Dienst pimpen. Google liefert tatsächlich einen Ansatz:
- per SSH auf dem NAS einloggen, Benutzer “root”, Passwort vom “admin”-Account
- /etc.defaults/ddns_provider.conf editieren (bsplw. mit vi)
- Einen neuen Eintrag anlegen a la
|
1 2 3 |
[crusy.net] modulepath=DynDNS queryurl=ddns.crusy.net/update_ddns.php?key=__PASSWORD__ |
Hier wäre übrigens möglich, die IP zu übergeben, dann muss man sie nicht auslesen: Neben __USERNAME__ und __PASSWORD__ sind __HOSTNAME__ und __MYIP__ möglich. Trotzdem: Die IPv6-Übersetzung scheint angebracht, wie gesagt wegen INWX.
htaccess-Authentifizierung habe ich hier nicht hinbekommen, sobald sich das ändert, gibt es hier ein Update.
Nun kann man im DSM seinen neuen DDNS-Service auswählen; “Hostname” kann in diesem Fall mit irgendwas gefüllt werden, da er in der Query-URL ja nicht verwendet wird

HTH
Geht mal wieder raus!
via KTH
Facebook: API-Zugriff auf altersbeschränkte Seite
Der API-Zugriff auf die Posts einer Seite sieht in PHP eigentlich so aus:
|
1 2 3 4 5 6 |
$facebook = new Facebook(array( 'appId' => FB_APP_ID, 'secret' => FB_APP_SECRET, )); $posts = $facebook->api('/' . FB_PAGE_ID . '/posts'); |
Aber: Wenn die Seite altersbeschränkt ist, dann ist der Response leer.

Man kann das umgehen, indem man einen Access Token mitgibt. Da stellen sich allerdings zwei Fragen:
- Wie gibt man einen Token mit?
- Woher bekommt man so einen Token?
Zu Frage 1 schlägt das Internet von Query-Parametern bis Request-Header alles mögliche vor, dabei ist es recht einfach:
|
1 |
$facebook->setAccessToken($new_access_token); |
Wichtig ist dabei offenbar, dass der übergebene Access Token zur Art des Zugriffs passt. Anders gesagt: Es gibt verschiedene Arten von Tokens, nämlich User Access-, App Access-, Page Access-, und Client Token. Wenn ich, wie oben, mittels einer App-ID auf die API zugreife, dann scheint das nur mit einem App Access Token zu funktionieren. Das ist wichtig zu wissen für die folgende Art, so einen Token zu generieren (Quelle, und hier):
- Man öffne den Graph API Explorer
- Man wähle ganz oben unter “App” die App, über die man auf die API zugreifen will
- Man klicke “Zugriffsschlüssel anfordern” (“Get Access Token”)
- Man öffne den Tab “Extended Permissions”
- Man selektiere “manage_pages” und ““
- Man klicke “Get Access Token”, akzeptiere die Permissions im Popup
- der erzeugte Token gilt für 1 Stunde, was man hier überprüfen kann (einfach rein pasten)
- mit diesem “short-lived access_token” kann man einen 60 Tage gültigen Token erzeugen, indem man ihn zusammen mit der App ID und dem App Secret in diese URL einsetzt:
https://graph.facebook.com/oauth/access_token?client_id=FB_APP_ID&client_secret=FB_APP_SECRET&grant_type=fb_exchange_token&fb_exchange_token=FB_PAGE_ACCESS_TOKEN_SHORT
Ich flieg’ nie wieder
F*ck you, Microsoft
Ich würde gerne ein Visual-Studio-Projekt aus dem letzten Jahr öffnen. Genauer gesagt: Eine Windows Phone 8 App. Also zum Windows Phone Dev Center, das mich empfängt mit den Worten
The Windows Phone development tools include everything you need to develop apps and games for Windows Phone.
Man könnte verwirrt sein durch die lage Liste an Tools:
- Windows Phone 8.1 Development Tools RC
- Windows Phone 8.1 Emulators
- SDK 8.0
- Windows Phone SDK 8.0 Update 3 Emulators
- SDK 8.0 Update for Windows Phone 8.0.10322
- SDK Update for Windows Phone 7.8
- SDK 7.1
- SDK 7.1.1 Update
- “Other downloads” (oh-oh…)
, aber die werden das schon machen. “Windows Phone development tools include everything you need”. Ich lade also die angepriesenen Development Tools, starte mein Windows 8, öffne das geladene Setup, und lese:
This version of Visual Studio requires a computer with a newer version of Windows.
Seriöslich, Microsoft!? Ihr schafft es nicht mal, von Windows 8 zu Windows 8.1 abwärtskompatibel zu bleiben!?! Also lade ich stattdessen das im verlinkten Post empfohlene “Visual Studio Express 2013 für Windows Desktop“. Mir leuchtet zwar nicht ein, was jetzt der Unterschied zu “Development Tools” sein soll, aber das ist ja auch nicht mein Fachgebiet. Und “Visual Studio Express” klingt vertraut, das hatte ich IMHO damals auch. Ich installiere geschlagene 5.x GB, öffne mein Projekt – doch was muss ich lesen?
Mein Projekt ist nicht kompatibel mit dieser Version von Visual Studio. Offenbar ist die nur für “Store Applications for Windows 8.1”. Wieder mal rächt sich, dass “Windows (Store) Apps” und “Windows Phone (Store?) Apps” ähnlich aussehen, aber was anderes sind. Bei einer Road Show wurde uns mal gesagt, dass es codetechnisch komplett unterschiedlichen Abteilungen entwickelte Packages von sind – die so ähnlich heißen und ähnliche Methoden bieten, aber eben nur so ähnlich. Warum sollte das bei der Benamung der IDE anders sein^^ Klar, sind ja auch nur 5GB+, warum sollte man auch beides damit kompilieren können. Immerhin gut zu wissen, dass auch diese Version nicht abwärtskompatibel ist (da ich sie in obigem Post gefunden habe) m(
Ich habe diesen Mist so schnell deinstalliert, dass ich nicht mal Zeit für einen Screenshot hatte. Aber ich bleibe gutgläubig. Da muss doch noch was zu machen sein. Ich doppelklicke die Projektdatei, und bekomme den altbekannten Dialog angezeigt, der mich fragt, womit ich die Datei öffnen möchte. Ich wähle die Suche im App Store, und dort bekomme ich “Visual Studio Express 2012 für Windows Phone 8” angeboten. OK, das klingt älter (vielversprechend im Hinblick auf Kompatibilität), es ist wieder ein “Visual Studio Express”, es ist für Windows Phone 8 (was ich öffnen will), und ES KOMMT BEI DOPPELKLICK AUF MEINE PROJEKTDATEI.
Aber ihr könnt euch den Rest denken. Weitere 2.x GB später:

Fuck you, Microsoft. Wenn ihr keine Entwickler für eure Plattform wollt, dann fuck you halt. Ernsthaft.
UPDATE
Zwei Tage später: Ich gebe mich geschlagen, und update auf Windows 8.1. Dauert auch nur zwei Stunden oder so, denn der App Store startet nicht. Microsoft hat einen eigenen “Windows Store Apps TroubleShooter” für dieses Problem m( Der und (oder?) ein Neustart hilft schliesslich.
Dann installiere ich eine weitere halbe Stunde erneut die Developer Tools – was jetzt geht. Sie starten sogar. Allerdings war das “everything” in “Windows Phone development tools include everything you need” vielleicht ein wenig… gelogen: Es gibt keinen Emulator, den muss man extra installieren.
Leider geht das nicht.

Das Windows Update hat die 32 Bit Version installiert.
Fuck you, Microsoft.
Öfter mal was Neues: BlackBerry
Ich konnte mich, knapp ein Jahr nach dessen Launch, endlich dazu durchringen, mein Windows Phone gegen ein BlackBerry Q10 einzutauschen. Die Entscheidung ist mir gleichermaßen leicht und schwer gefallen, deshalb: Was waren die Faktoren, was die Alternativen, was der Grund?
Vorweg dazu: Das perfekte Smartphone gibt es nicht. Das eine Killerargument für oder gegen eine Plattform ebensowenig. Deshalbe verzichte ich auf eine Rangliste der “Für und Wider”s, und stelle meine Beweggründe nach Plattform sortiert vor:
Der Grund
Bisher hatte ich, wie gesagt, ein Windows Phone (WP). Genauer gesagt: Ein LG E900 mit Windows Phone 7.8. Dazu bin ich eher zufällig gekommen, ich habe es zum Launch von WP gewonnen 🙂 ‘Geschenktem Gaul schaut man nicht in’s Maul, und WP sah echt vielversprechend aus, deshalb habe ich gewechselt. Obwohl ich mit meinem vorherigen Handy ziemlich zufrieden war, dazu später mehr.
Leider sieht WP immer noch “nur” vielversprechend aus, zumindest unter v7.x hat sich wenig getan über die Jahre. Das ist beim Nachfolger WP8 ein Stück weit anders, aber Microsoft hat viele Besitzer eines WP7 mit der Entscheidung verprellt, das Update für die “alte” Plattform nicht anzubieten, und viele Features auch nicht nachzureichen – darunter Grundlegendes wie CalDAV-Support, Rotation-Lock, lernende Autokorrektur (ich meine nicht neue Wörter, sondern Häufigkeit der Nutzung von Wörtern), oder auch nur custom Klingeltöne. Richtig gelesen: Was bei anderen Systemen seit x Jahren zur Grundausstattung gehört, verweigert M$ ausgerechnet seinen Early Adopters. Das war der primäre Grund für meinen Plattformwechsel.
Der konkrete Anlass allerdings war, dass mein WP langsam den Geist aufgibt. Es geht oft aus, manchmal im Minutentakt. Schade, denn sogar der Akku hält noch länger durch als bei manchem neuen Smartphone – was sicherlich dem “langsamen” Prozessor und der “geringen” Pixeldichte auf “kleinem” Display geschuldet ist.
Also, who’s next?
iPhone?
Das iPhone ist der Platzhirsch, keine Frage. Und dabei so angenehm handlich – aber auch abstrus teuer. Es ist mir absolut schleierhaft, wie jemand so einen Haufen Geld für ein Handy ausgegeben kann. Noch dazu für eins, das so schnell und oft kaputt geht. Raus.
Die Entscheidung war leicht.
Android?
Ähnlich attraktives Ökosystem, dabei deutlich günstiger. Leider auch (oft) deutlich größer und unhandlicher, außerdem ist ein Google-Account Pflicht. Und Google kommt mir nicht auf’s Handy. Wenn wir eins aus der NSA-Affäre gelernt haben, dann, dass Datensparsamkeit, Verschlüsselung und Dezentralisierung wichtig sind. Mindestens Punkt 1 und 3 steht Google direkt entgegen. Raus.
Die Entscheidung war leicht.
Jolla?
Kurz habe ich über das Jolla nachgedacht: Ein unabhängiges, Open-Source-Betriebssystem, aus Europa, auf Unix-basis, stylisches UI, konsequent auf Gestensteuerung ausgerichtet. Leider auch nicht billig, zumindest für die Hardware und das begrenzte Angebot an Apps. OK, man kann Android-Apps installieren, trotzdem fehlen mir konkrete Erfahrungsberichte und ein Hands-on im örtlichen Saturn (oder irgendwo). Bis auf Weiteres raus, wird aber beobachtet.
Die Entscheidung war nach einer Woche oder so auch leicht 😉
Windows Phone 8?
Ich mag WP immer noch total gerne, ein WP8-Handy war bis zum Schluss die direkte Alternative zum BlackBerry. Das UI-Konzept funktioniert super, und ist insofern sogar stylisch, als dass es klug minimalisiert wurde. Klug, weil ergonomisch. Es funktioniert super – bis es in die Apps geht. Da nervt sie sehr schnell; wer mal eine App geschlossen hat, weil nie ganz klar ist, wohin der (eine) “Zurück”-Button nun navigiert, weiß, was ich meine.
Viele App-Entwickler kommen offensichtlich auch nicht damit zurecht, den Content in den Mittelpunkt der Anwendung zu stellen, bzw. scheitern daran, dass ein 1:1 Klon von anderen Plattformen nicht “funktioniert”. Vielleicht kommt hier ja noch mehr, wenn die Plattform sich (noch?) weiter verbreitet.
Bis es so weit ist, habe ich aber keine Lust mehr zu warten, nach 3 ½ Jahren ist meine Geduld dann mal erschöpft. Die Entscheidung war aber nicht leicht, zumal die Geräte vergleichsweise günstig sind.
BlackBerry?
Man muss erst mal wissen, dass ich vor dem WP ein Nokia E71 hatte, mit dem ich sehr zufrieden war. Das hatte eine Tastatur, und die war super. Auf dem WP vertippe ich mich, seitdem ich es habe und bis heute. Leider nimmt so eine Tastatur auch Platz weg, sonst wäre ich schon lange umgestiegen. Das Verhältnis von physischer Tastatur zu Bildschirm bleibt also zu testen.
Das BB ist dafür gemacht, alles schnell und effizient erledigen zu können, nicht dazu, bsplw. Einsteigerhandy zu sein. Vieles bedient sich am Besten über Gestenund/oder Kurzbefehle und/oder Tastenkürzel – ja, Tastenkürzel. Wo die schon mal da sind!? 🙂 Aber für meine Frau wäre es ob der Kürzel und Gesten nichts.
Bei der Effizienz hilft, dass man alles customizen kann. Auch das wäre nichts für meine Frau, aber ich mag es, wenn ich Quick Settings ein- und ausblenden kann, ihre Reihenfolge ändere, … oder dass ich Quick Settings habe, schönen Gruß, Microsoft!
Auf dem BlackBerry OS v10 kann man ebenfalls Android-Apps installieren, damit dürfte das Angebot größer sein als bei WP8. Es gibt CalDav- und CardDav-Support. Die Sprachqualität ist super, wegen der zusätzlichen Mikrofone, die Umgebungsgeräusche rausfiltern. Man kommt ohne Probleme per USB auf’s Dateisystem, und zwar in beide Richtungen: Ich kann vom Handy aus meinen Rechner browsen, was bsplw. bei der Installation von Android-Apps hilft. OK, die hauseigene Maps-App ist Mist (kein ÖPNV!?), aber es gibt gute Ersatz-Apps. Das Gerät ist sauschnell und hatte zum Start mit die höchste Pixeldichte – bei inzwischen “nur” noch knapp über 300 €.
Damit war die Entscheidung gefallen, aber sie war schwer – nun muss BB sich beweisen!
Instagram: Upload hängt oder “failed”
Wer mit bsplw. iGrann (Upload hängt) oder der Android App (“Upload failed”) Probleme hat, auf Instagram zu posten, der möge auf dem Desktop versuchen, ein fremdes Bild zu liken. Wenn dann die Aufforderung kommt, seine Handynummer für eine Bestätigungs-SMS einzugeben, der kennt den Grund der Probleme: Nach Bestätigung der Handynummer funktioniert auch das Posten über die Apps wieder.
Vagrant, PHP: APC aktivieren
Vagrant ist ziemlich neu für mich, und der allergrößte PHP-Experte bin ich auch nicht. Deshalb habe ich einige Zeit gebraucht, um APC zu aktivieren. Google legt nahe, dass es sich um ein separates Modul handelt ([1], [2]), aber das ist gar nicht der Fall. Stattdessen wird es per apt-get direkt auf der Maschine installiert (wahrscheinlich ginge das auch über ein “exec” im Manifest):
|
1 2 |
vagrant ssh sudo apt-get install php-apc |
und danach über die php.ini ([3], [4]) aktiviert. Im Manifest sieht das dann so aus:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class { 'php': version => 'latest', } php::module { "mcrypt": } php::module { "curl": } php::module { "gd": } puphpet::ini { 'php': value => [ 'date.timezone = "Europe/Berlin"', 'display_errors = On', 'error_reporting = -1', 'apc.enabled= 1' ], ini => '/etc/php5/conf.d/zzz_php.ini', require => Class['php'], notify => Service['httpd'] } |
Der wichtige Teil ist Zeile 14.

