Archiv Juli 2017

Sonntag, 30. Juli 2017

Betriebsunfälle beim Kauf von gebrauchten Apple Watches vermeiden

Gestern habe ich den Verstand ausgeschaltet und impulsiv auf Ricardo bei einer Auktion für eine „Apple Watch Series 2“ Milanese mitgeboten — und dann zu allem Unglück auch noch gewonnen.

Dem Namen nach ging ich davon aus, dass es sich um eine „Apple Watch Series 2 Stainless Steel Milanaise“ (Modellnummer MNP62ZD in der Schweiz, MNPU2ZD in Deutschland) handelt, welche zu einem Neupreis von 789 CHF über den Ladentisch geht. Auf Ricardo konnte ich die Uhr für nur gerade 300 CHF ersteigern.

Dabei kam mir das Angebot 927745882 von jones9427 von Anfang an komisch vor:

  • Der Body der Apple Watch erschien auf dem Photo gelbstichig/golden — Apple produziert keine goldenen Stainless Steel-Uhren
  • Das Milanaise-Armband schien dieselbe Farbe aufzuweisen — Apple produziert kein goldenes Milanaise-Armband
  • Die Originalverpackung ist nicht vorhanden
  • Einem anderen Fragesteller hatte der Verkäufer mitgeteilt, dass die Uhr ungefähr noch ein Jahr Garantie aufweist — dabei müsste doch ein ordentlicher Apple Watch-Besitzer mittels des Kaufbelegs sofort eruieren können, wie lange seine Uhr noch Garantie hat (2 Jahre ab Kaufdatum).

Der Verkäufer hatte mir bezüglich dem ersten Punkt Tage vor Ende der Auktion versichert, dass die Uhr „silbern“ sei — und ich habe ihm das geglaubt.

Zum Glück blieb ich vor der Überweisung des Betrags an den Verkäufer hartnäckig und traf die nötigen Abklärungen. TL;DR: Ich bin vom Verkauf zurückgetreten.

Deshalb hier als Empfehlung an andere Zeitgenossen, die über Ricardo, Tutti und Anibis Schnäppchen machen möchten: Welche Abklärungen sollte man treffen, wenn man eine gebrauchte Apple Watch kaufen möchte?

Modellnummer in Erfahrung bringen und Modell googlen

Das wichtigste ist die Modellnummer der Apple Watch. Besitzt man den alphanumerischen Code, findet man mit Googlen innert Sekunden heraus, um welches Modell es sich handelt.

Die Modellnummer findet man folgendermassen heraus:

  1. Apple Watch mit einem iPhone koppeln
  2. Apple Watch.app
  3. General
  4. About

Ich bat deshalb den Verkäufer, mir einen Screenshot zu senden, was er am nächsten Tag auch tat:

Bei der Uhr handelt es sich also um das Modell MLC72S/A. Eine kurze Google-Suche zeigt, dass es sich bei der Uhr die Version mit einem goldenen Aluminium-Body handelt:

Apple Watch Sport MLC72 42mm Gold Aluminum Case with Midnight Blue Sport Band

Falschaussage 1.

Seriennummer in Erfahrung bringen und Garantie prüfen

Dank der Seriennummer, welche man auf dem Screenshot ebenfalls sieht, kann man bei Apple unter Check Your Service and Support Coverage auch den Garantiestatus abfragen.

Und siehe da, die Aussage von „ca. 1 Jahr“ Garantie für die Apple Watch mit Seriennnummer FHMQ9DTYGR7N löste sich vor meinen Augen in Luft auf:

Quelle: Check Your Service and Support Coverage

Falschaussage 2.

Nicht nur das, Apples Web-Site sagt mir gleichzeitig auch, um was für ein Modell es sich handelt: WATCH SPORT 42MM (1ST GEN). Es handelt sich also um die Originale Apple Watch, deren Verkauf im April 2015 begann und nun schon zwei Generationen veraltet ist.

Falschaussage 3.

Mal schauen, was der Ricardo-Kundendienst tut … wahrscheinlich nichts, denn man will ja nicht seine Einkommensquelle absägen.

Tags: , , , , ,
Labels: Apple, Gesellschaft

Keine Kommentare | neuen Kommentar verfassen

Samstag, 29. Juli 2017

Nervig: Mit iOS 10 kann man Kontakte in der Spotlight-Suche nicht mehr verändern

Bis iOS 10 war die Welt in Ordnung: Regelmässig kommt es vor, dass ich die iCloud-Kontaktkarte einen meiner Kontakte aktualisieren muss.

Global Suche (auch bekannt als „iOS Spotlight Search“) nach dem Namen des Kontakts, antippend, gewünschtes Feld ergänzen oder verändern, fertig.

Mit iOS 10 ist das nicht mehr möglich. Man findet mit Spotlight zwar den Kontakt, doch das sich danach öffnende Kontaktsheet verfügt über keinen Editier-Modus.

Stattdessen muss man Contacts.app öffnen, die Person dort suchen und danach mittels Edit den Eintrag anpassen.

Verdammt mühsam. Hoffen wir, dass iOS wieder die von iOS 9 gewohnte Funktionalität zurückbringt.

PS: Ich scheine nicht der einzige zu sein, der sich daran stört: iOS10 Problem – Can not edit a contact found using spotlight search

Tags: , , , , , , , , , ,
Labels: Apple

1 Kommentar | neuen Kommentar verfassen

Samstag, 29. Juli 2017

Backup der Raspberry Pi SD-Karte anfertigen

Kürzlich hatte ich während eines Anfalls aus geistiger Umnachtung versucht, meinen Raspberry Pi 3 von Raspbian Jessy auf Raspbian Stretch zu „lüpfen“. Scheiss-Idee. Im Gegensatz zu Debian ist Raspbian Stretch leider noch nicht stabil genug, um auf einem produktiven Raspberry Pi zu laufen.

Nicht nur das, es war tatsächlich so, dass ich zwar seit wohl fünf Jahren hier in der Wohnung einen Raspberry Pi betreibe — und nicht wusste, dass man auf einfachste Weise eine Kopie einer sauber aufgesetzten Raspbian-Installation anfertigen kann.

Das Vorgehen ist im Internet mehrfach beschrieben; ich habe mich an den Artikel Back-up a Raspberry Pi SD card using a Mac gehalten.

Das Vorgehen:

  1. Raspberry Pi herunterfahren
  2. Die SD-Karte mit einer Pinzette aus dem Gerät holen
  3. Die SD-Karte mit einem Adapter an einen Mac (oder Linux-Rechner) anschliessen
  4. Mit diskutil list oder df die Device-Adresse der SD-Karte herausfinden; in meinem Fall /dev/rdisk4
  5. Die gesamte SD-Karte in eine Datei auf dem lokalen Mac klonen:
    # dd if=/dev/rdisk4 of=~/Desktop/emeidi-dashboard.img bs=1m

Fertig! Verbockt man sich in Zukunft den Raspberry Pi, schliesst man einfach wieder die SD-Karte an den Mac an und schreibt das Image zurück.

Dies funktioniert auch wieder auf der Kommandozeile mit dd (mit umgekehrten if– und of-Parametern), doch hier war ich zu Faul und habe stattdessen das quelloffene Etcher mit graphischer Oberfläche und Fortschrittsanzeige verwendet.

Übrigens: Nachdem ich das Image testhalber auf eine zweite SD-Karte zurückgeschrieben und verifiziert hatte, dass der Raspberry Pi 3 vom Backup bootet, habe ich das Image mit ZIP komprimiert und so eine Platzreduktion von 50 Prozent hingekriegt.

Tags: , , , , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Samstag, 29. Juli 2017

postfix ausgehende E-Mails mit einem bestimmten Betreff automatisch verwerfen lassen

arpwatch und Apple-Geräte wie Apple TV und Time Capsules sind keine guten Freunde.

Überwacht man das lokale Netzwerk mit arpwatch und hat im selben Netzwerk einen Apple TV sowie mindestens eine Time Capsule stehen, wird man damit konfrontiert, dass die IP des Apple TVs (scheinbar, aus Sicht von arpwatch) konstant die MAC-Adresse wechselt.

Ich vermute Folgendes hinter diesem komischen Sympton: Geht der Apple TV schlafen, simuliert die Time Capsule den Apple TV und seine Funktionen irgendwie im Netzwerk — wahrscheinlich, damit man auf iOS-Geräten den Apple TV weiterhin „sieht“ und als AirPlay-Ziel anwählen kann. Erfolgt dann tatsächlich eine solche Anfrage, erweckt die Time Capsule den Apple TV irgendwie aus den Schlaf und das iOS-Device kann dann auf den Fernseher streamen. Man möge mich korrigieren, wenn ich (völlig) falsch liege.

Leider hat dieses Verhalten den unerwünschten Nebeneffekt, dass arpwatch konstant meine INBOX vollballert mit Meldungen zur Apple TV IP, welche ständig die MAC-Adresse zu wechseln scheint.

Da ich kein Netzwerkprofi bin und nicht C programmieren kann, verwehrt sich mir der Weg, arpwatch mit einer Funktion auszustatten, MAC-Wechsel von Apple-Geräten zu ignorieren.

Ich setze deshalb später in der Verarbeitungskette an und verwende einen Filter in postfix, um Mails mit einem bestimmten Betreff nicht mehr an mein Mailkonto weiterzuleiten. Dies ist ganz simpel, sofern man bereits eine funktionierende postfix-Installation am Laufen hat:

/etc/postfix/header_checks

/^Subject:.*flip flop \(apple-tv.domain.local\).*/ DISCARD

/etc/postfix/main.cf

...
header_checks = regexp:/etc/postfix/header_checks

Und Ruhe ist. Wenn man sich nicht sicher ist, ob postfix überhaupt etwas blockt, oder wenn man befürchtet, dass postfix zu viele Mails verwirft, hilft /var/log/postfix.log weiter:

$ cat /var/log/postfix.log | grep discard
...
Jul 27 22:41:23 SERVER postfix/cleanup[8564]: A8BCB1560312: discard: header Subject: flip flop (apple-tv.domain.local) from local; from=<root@SERVER>

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 23. Juli 2017

1Password kann ja auch TOTP (Google Authenticator)

Auf meinem iPhone habe ich Google Authenticator installiert, welcher mir Einmalpasswörter für eine Ladung von Geräten in meinem Heimnetzwerk (Synology NAS, Anleitung hier) sowie Web-Services (Gmail, Rainloop Webmail, WordPress etc.) liefert. Im Fachjargon nennt man das Time-based One-time Password Algorithm TOTP.

Da ich zu Hause manchmal das Smartphone in einem anderen Raum liegenlasse und ich mir in solchen Fällen den Fussweg zum Telefon sparen möchte, habe ich mich nach einer Desktop-Variante von Google Authenticator umgesehen. In einem Artikel werden einige Varianten erläutert, doch bei den meisten handelt es sich um Google Chrome-Extensions. Solche möchte ich nicht verwenden, da ich verhindern möchte, dass Google meine geheimen Schlüssel erfährt und sie zwischen allen Chrome-Instanzen hin- und hersynchronisiert.

Leider funktioniert JAuth 2 unter macOS Sierra nicht (verlangt nach dem nicht installierten Java 6, RLY?), weshalb ich mich nach anderen Lösungen umsehen musste.

Plötzlich die zündende Idee — moment mal, ich habe ja 1Password auf meinem iPhone, iPad sowie meinem MacBook wie auch meinem Mac mini installiert. Kann die Software nicht auch mit TOTP umgehen?

Und tatsächlich: 1Password bringt alles an Bordmitteln mit, um QR-Codes einzulesen und dann in Echtzeit im jeweiligen Zugangsdaten-Eintrag die sechsstelligen Zahlen anzuzeigen. Halt einfach ein wenig versteckt. Doch weiss man einmal, wo suchen, geht es Ruckzuck und der QR-Code ist in der App im jeweiligen Eintrag der Credentials gespeichert.

Natürlich bedeutet das aber auch, dass wer meine 1Password-Datenbank stehlen kann, neben Benutzernamen und Passwort auch gleich den zweiten Faktor zum Login in sensitivere Konten besitzt.

Zum Glück laufen meine spezialisierten TOTP-Apps für die wirklich kritischen (und wertvollen) Anwendungen (sprich: Online-Banking) in eigenen, schön abgeschottenen Containern auf dem iPhone: Credit Suisse SecureSign und Raiffeisen PhotoTAN. Bei Postfinance verwende ich übrigens Swisscoms Mobile ID; d.h. der zweite Faktor ist hier in Hardware ausgelagert, was Vor- und Nachteile hat.

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 23. Juli 2017

iPhone-Videos auf der Kommandozeile für den E-Mail-Versand eindampfen

Heute musste ich unseren Vermieter wie jeden Sommer in der Starkregensaison mahnen, doch bitte den Dachkännel unseres Hauses zu reinigen.

Um dem Hausverwalter aufzuzeigen, wie prekär die Situation ist, habe ich wie letztes Jahr ein Video beigelegt, das den aus dem Kännel überlaufenden Wasserfall zeigt.

Damit das 14 MB grosse iPhone-Video im .m4v-Format per E-Mail versendet werden kann, musste ich es aber zuerst eindampfen (und mein Gefluche auf der Audiospur entfernen). Das macht man mit ffmpeg auf der Kommandozeile folgendermassen:

$ ffmpeg -i IMG_5193.m4v -an -b:v 2000k IMG_5193.NOAUDIO.mp4
  • Das Argument -an weist ffmpeg an, die Audiospur zu entfernen.
  • Mit dem Argument -b:v 2000k schraube ich die Bitrate des Videos auf 2000 KB/s herunter (mein iPhone 5s hat gemäss VLC ein Video mit einer Bitrate von 10000 KB/s produziert).

Das neun Sekunden dauernde Video wog im E-Mail dann nur noch 2.6 MB und liegt nun bereits auf dem Mailserver unserer Hausverwaltung.

Tags: , , , , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Sonntag, 23. Juli 2017

eSpeak zu einer weiblichen Stimme verhelfen

Momentan pröble ich daran herum, automatisch generierten, von einem Computer gesprochenen Text auf unseren Sonos-Lautsprechern auszugeben. HAL für zu Hause, sozusagen.

Dank der fantastischen Python-Bibliothek SoCo gepaart mit espeak grundsätzlich keine Hexerei.

Leider gab es in der derzeit laufenden Beta-Phase Probleme mit dem WAF — dem Wife Acceptance Factor.

Die blechern klingende männliche Roboterstimme habe ich nun mit folgenden Parametern zu einer Frauenstimme umgewandelt. Gruselig sei es immer noch, heisst es nun, aber die Stimme ist immerhin nun klar weiblich:

espeak -ven-us+f4 -s 140 -w "/var/www/html/sonos/sonos-alert.wav" "Red Alert. Wife approaching."

Quelle: Female Voice using eSpeak

Tags: , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 20. Juli 2017

Wo überall auf der Welt Pferdefleisch gegessen wird (werden darf)

Ein, zwei Jahre nach Beginn unserer Beziehung mit meiner Frau musste ich eines Grillabends realisieren, dass man in Kalifornien kein Pferdefleisch verzehrt. Denn seit 1998 ist der Handel mit Pferdefleisch zum Verzehr verboten, wie ich etwas später verwundert feststellen durfte:

[…] making it a felony for any person in the state to possess, transfer, receive, or hold a horse (defined to include ponies, donkeys and mules) with the intent to kill it, or have it killed, where the person knows, or should have known, that any part of the carcass will be used for human consumption.

Quelle: California Proposition 6 (1998)

Vor zwei Tagen dann beim Mittagessen auf der Arbeit eine ähnliche Diskussion: Die gebürtige Finnin im Team erzählt davon, dass man zu Hause Rentiere und Elche esse, nicht aber Pferde. Und der eine deutsche Kollege stimmt bei, dass in seiner Heimat (im Nordwesten Deutschlands) Pferdefleisch auch nicht auf dem Tagesmenu vorkomme.

In mir wächst noch während dem Mittagessen (ohne Pferdesteak auf dem Teller, notabene) der Bedarf, im Netz eine Weltkarte der pferdefleischverzehrenden Länder zu finden. Das ist gar nicht so einfach. Doch schlussendlich wurde ich fündig:

Quelle: Horse Slaughter

Gemäss dieser Web-Seite sind es zumindest folgende Länder, in denen dann und wann ein saftiges Pferdesteak auf dem Grill landen darf und kann:

  • China
  • Kazakhstan
  • Indonesia
  • Japan
  • Mongolia
  • Tonga
  • Philippines
  • South Korea
  • Austria
  • Belgium
  • France
  • Germany
  • Hungary
  • Iceland
  • Italy
  • Malta
  • Netherlands
  • Norway
  • Serbia
  • Slovenia
  • Sweden
  • Switzerland
  • United Kingdom
  • Ukraine
  • Mexico
  • Chile

Tags: , , , , ,
Labels: Essen, Leben

2 Kommentare | neuen Kommentar verfassen

Donnerstag, 20. Juli 2017

Apache nervt mit Warnmeldungen, dass das DAV-Modul bereits geladen sei

Seit Jahr und Tag nerve ich mich ab Log-Zeilen in der folgenden Form, welche im syslog und in E-Mail-Nachrichten zu cron-Jobs auftauchen:

[Mon Jul 17 06:25:06.171427 2017] [so:warn] [pid 724] AH01574: module dav_module is already loaded, skipping

Und zwar immer dann, wenn Apache 2.4 neu gestartet wird (bspw. mittels apache2ctl graceful).

Lustigerweise findet sich im Netz keine Lösung des Problems — ein Novum, das mich daran zweifeln lässt, ob neben mir überhaupt noch jemand mit diesem nervigen Problem zu kämpfen hat.

Ich habe bereits mehrere Anläufe genommen, um im Netz eine Lösung zu dem Problem zu finden. Doch erst beim gefühlten Dutzendsten Versuch fand ich tief versteckt in den Google-Resultaten dann doch noch die Lösung:

# error at apache2 startup
    AH01574: module dav_module is already loaded, skipping
# solution; edit /etc/apache2/mods-available/dav.load
    <IfModule !mod_dav.c>
        LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
    </IfModule>

Quelle: adrhc’s blog (ACHTUNG: Zertifikatsfehler!)

Geniale Idee des Kollegen aus Rumänien (der TLD nach zu urteilen): Indem man den Inhalt der Datei /etc/apache2/mods-available/dav.load in eine IfModule-Abfrage packt, verhindert man, dass mod_dav ein zweites Mal geladen wird.

Seither ist Ruhe.

Was ich hingegen immer noch nicht weiss: Wo mod_dav zum ersten Mal geladen wird. Ich fand keine zweite Lade-Anweisung irgendwo in den Konfigurationsdateien unterhalb von /etc/apache2.

Tags: , , , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Mittwoch, 5. Juli 2017

Properties und Methoden eines PowerShell-Objektes anzeigen

Ich programmiere zwar seit einigen Jahren hie und da PowerShell-Scripts, aber bis heute wusste ich nicht, dass man Properties und Methoden eines PowerShell-Objektes derart einfach ausgeben kann. Die Web-Site msXfaq.de half weiter.

Properties

$var = Get-Date
$var | fl *
DisplayHint : DateTime
DateTime    : Dienstag, 29. Oktober 2013 00:16:08
Date        : 29.10.2013 00:00:00
Day         : 29
DayOfWeek   : Tuesday
DayOfYear   : 302
Hour        : 0
Kind        : Local
Millisecond : 229
Minute      : 16
Month       : 10
Second      : 8
Ticks       : 635186025682291672
TimeOfDay   : 00:16:08.2291672
Year        : 2013

Methoden

$var = Get-Date
$var | gm *
TypeName: System.DateTime

Name                 MemberType     Definition
----                 ----------     ----------
Add                  Method         datetime Add(timespan value)
AddDays              Method         datetime AddDays(double value)
AddHours             Method         datetime AddHours(double value)
AddMilliseconds      Method         datetime AddMilliseconds(double value)
AddMinutes           Method         datetime AddMinutes(double value)
AddMonths            Method         datetime AddMonths(int months)
AddSeconds           Method         datetime AddSeconds(double value)
AddTicks             Method         datetime AddTicks(long value)
AddYears             Method         datetime AddYears(int value)
CompareTo            Method         int CompareTo(System.Object value), int CompareTo(datetime value), int IComparable.CompareTo..
Equals               Method         bool Equals(System.Object value), bool Equals(datetime value), bool IEquatable[datetime].Equ..
IsDaylightSavingTime Method         bool IsDaylightSavingTime()
Subtract             Method         timespan Subtract(datetime value), datetime Subtract(timespan value)
ToFileTime           Method         long ToFileTime()
ToFileTimeUtc        Method         long ToFileTimeUtc()
ToLocalTime          Method         datetime ToLocalTime()
ToLongDateString     Method         string ToLongDateString()
ToLongTimeString     Method         string ToLongTimeString()
ToOADate             Method         double ToOADate()
ToSByte              Method         sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToShortDateString    Method         string ToShortDateString()
ToShortTimeString    Method         string ToShortTimeString()
ToString             Method         string ToString(), string ToString(string format), string ToString(System.IFormatProvider pr..
ToUniversalTime      Method         datetime ToUniversalTime()
DisplayHint          NoteProperty   Microsoft.PowerShell.Commands.DisplayHintType DisplayHint=DateTime
Date                 Property       datetime Date {get;}
Day                  Property       int Day {get;}
DayOfWeek            Property       System.DayOfWeek DayOfWeek {get;}
DayOfYear            Property       int DayOfYear {get;}
Hour                 Property       int Hour {get;}
Kind                 Property       System.DateTimeKind Kind {get;}
Millisecond          Property       int Millisecond {get;}
Minute               Property       int Minute {get;}
Month                Property       int Month {get;}
Second               Property       int Second {get;}
Ticks                Property       long Ticks {get;}
TimeOfDay            Property       timespan TimeOfDay {get;}
Year                 Property       int Year {get;}

Tags: , , , , ,
Labels: Programmierung

Keine Kommentare | neuen Kommentar verfassen