2017-04-04

Swift Playgrounds - Boxed in (Eingesperrt)

func goAndDo() {
  moveForward()
  if isOnClosedSwitch {
    toggleSwitch()
  } else if isOnGem {
    collectGem()
  }
}

for i in 1 ... 8 {
  if isBlocked {
    turnLeft()
  }
  goAndDo()
}

Swift Playgrounds ‒ Coden lernen 1

Nachtrag: Heißt jetzt "Programmieren lernen"
"Swift Playgrounds - Coden lernen"
 ist wirklich ein schönes iOS-App zum Programmieren lernen. Herausstechendes Merkmal ist die Aufwendige Animation während man eine Spielfigur mit Programmcode Aufgaben erledigen läßt. Mit QuickType kann man sich den Programm-Code zusammenklicken. Oder verwendet das Coding Keyboard, welches durch ziehen der Tasten nach unten schnellen Zugang zu Sonderzeichen gewährt.
Leider habe ich einen logisch Fehler in der aktuellen Version 1.2 gefunden. Geschlossene Schalter werden als ausgeschaltet behandelt und offene als eingeschaltet. Das ist zumindest bei elektrischen Schaltern einfach falsch. Habe den Bug gemeldet. Mal sehen ob das korrigiert wird.

2016-04-28

USB-Festplatte auf Fehler prüfen bzw. reparieren


Symptome


Vor zwei Tagen hat meine kaum benutzte, 1 Jahr alte, externe USB-Harddisk das Lesen einer großen Datei (4,36 GB DVD-ISO-Image) mit einem einen Input/Output Error abgebrochen. Das Disk Utility (dt. Festplattendienstprogramm) meldete nach Erste Hilfe / Volume überprüfen: Das Volume SeagateHD ist anscheinend in Ordnung. Ich habe darauhin die betroffene Datei gelöscht und erneut kopiert und versucht eine MD5-Checksumme der Datei zu berechnen – wodurch die ganze Datei gelesen wird. Der Vorgang brach erneut mit einem I/O Error ab. Auch das neu Partitionieren und Formatieren brachte keine wirkliche Besserung. Nach dem erneuten Kopieren der Daten auf die Platte war allerdings eine andere Datei defekt. Auch das aus Auswechseln von USB-Adapter[1] und USB-Kabel brachte keine Besserung.

Kein S.M.A.R.T.


Leider kann man unter Mac OS X bei USB-Platten den S.M.A.R.T-Status nicht auslesen. Man müsste die Platte in den Macbook einbauen um den S.M.A.R.T-Status auslesen zu können. Mittlerweile habe ich eine Lösung für SMART am Mac gefunden, was ich aber lieber in einem neuen Blog-Eintrag erörtern möchte. Die Lösung ist die Installation des SAT-SMART-Driver.

Vermutliche Ursache


Ich bin zu dem Schluss gekommen, dass die Platte mehrere Oberflächenfehler hat und das bei meinen Formatier-/Kopier-Aktionen vom HDD-Controller als defekt erkannte Sektoren automatisch repariert worden sind (engl. Bad Sector Reallocation) als ich die Datei erneut überspielt habe. Allerdings sind nicht alle Fehler erkannt worden, weil meine Leseversuche vom Filesystem abgebrochen wurden sobald ein defekter Block anhand erkannt wurde. Die Datei hatte aber weitere fehlerhafte Blöcke von denen wiederum nur der erste bei erneuten Lesen erkennt wurde, weil der Lesevorgang sofort vom Filesystem abgebgrochen wird.

Intensive Prüfung


Um den Fehler genauer zu Untersuchen benutzt man unter Windows die Tools vom Festplattenhersteller. In meinen Fall wäre das SeaTools for Windows gewesen. Leider gelang es mir nicht die SeaTools for Windows auf einer Virtuellen Maschine (Parallels mit Windows XP SP3) zu installieren, das die Installation immer Stecken blieb. Da ich sonst keinen PC habe und mir auch keine BootCamp-Installation dafür antun wollte, habe ich das Problem wie folgt im Mac OS X Terminal angegangen.
  1. Mit dem Disk Utilitydie Disk-ID ermittelt:
    admin$ diskutil list /dev/disk0
        #:                    TYPE NAME          SIZE       IDENTIFIER
        0:   GUID_partition_scheme              *128.0 GB   disk0
        1:                     EFI               209.7 MB   disk0s1
        2:               Apple_HFS SSD128        127.7 GB   disk0s2
     /dev/disk1
        #:                    TYPE NAME          SIZE       IDENTIFIER
        0:   GUID_partition_scheme              *1.0 TB     disk1
        1:                     EFI EFI           209.7 MB   disk1s1
        2:               Apple_HFS SeagateHD     999.9 GB   disk1s2
    Meine Seagate-Harddisk hatte also die Disk-ID disk1. (Das kann sich nach jedem Abziehen ändern.)

  2. Die Disk-ID habe ich dann verwendet, um die ganzen 1TB zu lesen, ohne das ein Fehler den Vorgang abbricht.
    admin$ sudo dd if=/dev/rdisk1 of=/dev/null conv=noerror bs=131072
    Password:
    
  3. Da der Befehl dd keine Fortschrittsanzeige hat, habe ich die Festplattenativität mit dem Utility (dt. Dienstprogramm) Activity Monitor (dt. Aktivitätsanzeige) von Mac OS X überwacht:


    Die Einbrüche der Datenrate am Anfang und in der Mitte des Diagramms sind sehr schlecht. Wenn die Datenrate gegen Null geht wurde ein Fehler gefunden, der auch durch mehrmalige Leseversuche der Platte nicht korrigiert werden konnte:


    Am Ende wurden dann auch Fehler wie folgende ausgegeben:
    dd: /dev/rdisk1: Input/output error
    1507+0 records in
    1507+0 records out
    395051008 bytes transferred in 20.936606 secs (18868914 bytes/sec)
    dd: /dev/rdisk1: Input/output error
    3815477+1 records in
    3815477+1 records out
    1000204623360 bytes transferred in 11894.348695 secs (84090743 bytes/sec)
Wie gesagt, das Disk Utility hat bei der Prüfung keine Fehler gefunden und erlaubt auch keine Prüfung aller Blöcke

Selbstreparatur anstoßen


Moderne Festplatten merken sich die gefundenen Fehler und führen eine Bad Sector Reallocation durch, wenn die Platte angewiesen wird die defekten Sektoren neu zu beschreiben. Dafür haben moderne Platte einen Haufen ungenutzer Sektoren in reserve. Wenn also eine kaputte Datei gelöscht und der freigewordene Platz mit einer neuen Datei überschrieben werden soll, wird der ganze Sektor an mit dem defekten Block aussortiert und stattdessen einer der Reserve-Sektoren verwendet. Da er mühsam ist eine ganze Platte von Hand mit Daten zu füllen und ich auch die Partitionstabelle überschreiben wollte, habe ich wieder zum Terminal gegriffen.
  • Mit dem diskutil kann man alle Blöcke löschen.
    admin$ diskutil randomDisk 1 rdisk1
    Randomly erasing the disk 1 times
    Started erase on disk1
    [ \ 0%................................................... ]  1% 26:27:57 
    
    Das diskutil hat netterwese eine Progressbar. Bei 26,5 Stunden auch nötig! 26,5 Stunden – WTF!

  • Leider habe ich erst später festgestellt, dass das mit zeroDisk statt randomDisk 5-mal schneller ist.
Leider hat die Platte auch nach dieser Lese- und Schreib-Aktion immer noch 2 I/O-Error, wenn ich sie erneut mit dd wie oben beschrieben überprüfe. Deshalb habe ich Kontakt mit Seagate aufgenommen. Nachdem ich meine Amazon-Rechnung für die Platte an Segate gemailt habe wurde mir die Garantie auf 2 Jahre verlängert.



Fußnote
[1]Die Seagte Backup Plus Portable STBU1000200 (1 TB, 2½ Zoll, 5400 rpm) besteht aus USB 3.0 Adapter/Kabel und einem USM-Modul (Universal Storage Media) welches nur ein Gehäuse um eine 2½ Zoll Platte ist. Durch den abziehbaren Adapter kann man die Platte auch an andere Schnittstellen wie FireWire 800, eSATA oder Thunderbolt, wenn man einen entsprechenden Adapter hat. Leider gab es diese Adapter nur kurzzeitig und sehr teuer einzel zu kaufen. Und auch die USM-Module (Festplatten im USM-Gehäuse) waren eigentlich immer teurer als eine Platte inkl. USB-Adapter. Daher ist es kein Wunder das dieses von der Fachpresse gelobte Standard quasi tot ist. USM-Gehäuse für selbstgemachte USM-Module gibt es wohl nur noch von StarTech. Einen USB-3.0-Adapter bekommt man noch von MAIWO direkt aus China.

2013-10-09

Mac OS X Installations DVD auf fremder Hardware installieren

Neulich hatte ich das Problem, dass ich auf meinem 1999er iMac G4 Mac OS 10.4 (Tiger) installieren wollte, aber nur eine Installations-DVD von einem MacBook zur Hand hatte. Auf dem iMac ist bereits 10.5 (Lion) installiert, aber die DVD-Player-Software läuft darunter leider nicht absturzfrei. Um DVDs schauen zu können habe ich mir deshalb Tiger auf einer zweiten Partition der internen Platte installiert. Weil ich wie gesagt nur die MacBook-Installtions-DVD zu Hand hatte, habe ich das für die Installation verantwortlich OSInstall.mpkg wie folgt manipuliert.
  1. Lion auf dem iMac gebootet.

  2. Mit dem Disk Utility (Festplatten Dienstprogramm> eine 16 GB große Partition für Tiger (Name Ten4) angelegt und die Lion-Partition entsprechened verkleinern lassen.

  3. Die neue Ten4-Partition mit HFS+ formatiert (gelöscht).

  4. Mit dem Menupunkt Neu > Neues Image von Ordner ...
    ein SPARSE Image (Image-Typ R/W oder DVD-Master sollten auch funktionieren) der ersten Installations-DVD erstellt.

  5. DVD ausgeworfen, Install Disc 2 eingelegt und SPARSE-Image gemountet (Doppelklick).

  6. Terminal geöffnet und mit
    cd /Volumes/Mac\ OS\ X\ Install\ Disc\ 1/System/Installation/Packages/
    open -e OSInstall.mpkg/Contents/OSInstall.dist
    die Steuerungsdatei des Installationspaketes in TextEdit geöffnet.

  7. In der OSInstall.dist-Datei habe ich dann die ECMAscript-Funktion hwbeModelCheck() gefunden und an derem Ende (16 Zeilen tiefer) return false; in return true; geändert, damit der Modell-Check nie fehlschlägt.

  8. Hinweis: Vor dem Nachmachen bitte erst den nächsten Punkt lesen.
    Anschließen habe ich die Installation im Terminal mit sudo installer -verbose -pkg OSInstall.mpkg -target /Volumes/Ten4 -lang de gestartet, was nach Eingabe mein Login-Passwortes ohne weitere Rückfragen die beide Installtions-DVDs inkl. Bundled Software installiert hat. Das hat Stunden gedauert und eigentlich wollte ich ein abgespecktes System ohne Bundled Software.

  9. Weil ich es dann doch etwas kleiner wollte kam ich dann doch auf die Idee den Installer vom Image mit grafischer Benutzeroberfläche zu starten, um eine benutzerdefinierte Installation durchführen zu können. Das habe ich im Terminal mit folgenden Befehl erreicht: open OSInstall.mpkg. Alternativ hätte ich das Image auch auf eine DVD brennen und davon booten können. So konnte ich aber nebenbei diesen Blog-Artikel schreiben. ;-)

  10. Ganz so einfach war es dann doch nicht. Kernel Panic "unable to find driver for PowerMac4,2" beim booten. :-(
    Man braucht wohl doch Installations-CDs/DVDs von einem PowerMac.
Quellen: installer man-page (OS X 10.5)
hints.macworld.com

2010-10-30

BSD Tastenkürzel

Ctrl + A  Go to the beginning of the line you are currently typing on
Ctrl + E  Go to the end of the line you are currently typing on
Ctrl + L                Clears the Screen, similar to the clear command
Ctrl + U  Clears the line before the cursor position. If you are at the end of the line, clears the entire line.
Ctrl + H  Same as backspace
Ctrl + R  Let’s you search through previously used commands
Ctrl + C  Kill whatever you are running
Ctrl + D  Exit the current shell
Ctrl + Z  Puts whatever you are running into a suspended background process. fg restores it.
Ctrl + W  Delete the word before the cursor
Ctrl + K  Clear the line after the cursor
Ctrl + T  Swap the last two characters before the cursor
Esc + T  Swap the last two words before the cursor
Alt + F  Move cursor forward one word on the current line
Alt + B  Move cursor backward one word on the current line
Tab  Auto-complete files and folder names

2009-07-27

Automount unterdrücken

Problem: Mein SanDisk Cruzer U3-USB-Memory-Stick meldet neben dem eigentlichen USB-Massenspeicherlaufwerk noch eine virtuelles CD-ROM an, sobald man ihn anschließt. Unter Leopard wird sogar ein virtueller CD-Brenner erkannt. Leopard fragt dann jedes mal, ob das eingelegte Medium formatiert werden soll!?! Das ist etwas nervig.

Lösung: Anlegen einer Datei /etc/fstab (kurz fstab) mit folgendem Inhalt:

# fstab
#
# Warning - this file should only be modified with vifs(8)
# Failure to do so is unsupported and may be destructive.
#
# edited 2009-07-28 by Dirk
# 
# Identifier,  mount point,  fs type,  options
#
LABEL=U3\040System none cd9660 ro,noauto
LABEL=Mobile\040Partner none hfs ro,noauto

Hinweise zur fstab-Datei

  1. Seit Leopard soll man die fstab nur noch mit dem Kommando sudo vifs editieren. vifs sorgt beim Editieren dafür, dass die fstab nicht gleichzeitig vom System bearbeitet wird. (Meines Erachtens kommt das auf einem normalen Leopard-System, auf dem die Datei vorher noch nocht einmal existiert, nicht vor.)
  2. Alle Zeilen die mit # anfangen sind nur Kommentarzeilen.
  3. Die erste Zeile, die mit LABEL anfängt verhindert das mounten des U3 Systems vom SanDisk Cruzer Contour Stick.
  4. Der Datenträger wird dabei durch seinen Namen (Volume Label) identifiziert. \040 steht dabei für ein Leerzeichen.
  5. Die erste Zeile, die mit LABEL anfängt verhindert das mounten der Datenpartition meines UMTS-Surf-Sticks.
Quellen: macosxhints.com (en)
infinitemac.com
discussions.apple.com - Mount nur für bestimmte Benutzer
macseven.com

2009-06-30

CCC-Images mit ASR zurückspielen

Problem: Wenn man OSX-System von einem Image wieder herstellen will, benötigt man in der Regel ein weiteres bootbares OSX-System von dem man das aus machen kann.

Lösung: Man bootet dazu von der Installations-DVD und verwendet von dort das Festplattendienstprogramm oder den ASR-Befehl. Ich habe mich für ASR entschieden, weil man so die Installations-DVD nur im Single-User-Mode zu booten braucht (Cmd+S beim booten). Das geht schneller. Außerdem kann man so auch noch die verwendeten Puffer bestimmen, was den Vorgang zusätzlich beschleunigt.

Zuerst solltem dem Image ggf. noch fehlende Check-Summen hinzufügen ...
sudo asr imagescan -s /Volumes/Backups/TigerHD_2009-06-30.dmg

Anschließend kann man den eigentlichen Kopiervorgang starten. --buffers 1 --buffersize 32m ist dabei eine Optimierung für Kopien von Platte zu Platte.

sudo asr restore -s /Volumes/Backups/TigerHD_2009-06-30.dmg -t /Volumes/Platte/ --verbose --erase --buffers 1 --buffersize 32m

siehe auch Blog-Eintrag Volumes mit ASR kopieren

Quellen: uMac - Restoring an ASR image via command-line (en)
old ASR man page (en)
new ASR man page (en)
fp548.com - Disk Imaging for Mac OS X Made Easy (en)
bombich.com - Guide to backing up mac OS X (en)