Mittwoch, 15. März 2017

cvsignore2gitignore

Habe heute mein erstes Python Projekt auf GitHUB veröffentlicht :-). Es konvertiert .cvsignore,v RCSFiles zu .gitignore,v RCSFiles. Wozu braucht man das? Dies hilft bei der Umstellung von einer CVS- auf eine Git-Versionsverwaltung. Die mir bekannten Konvertierungsskripte unterstützen nicht die Umwandlung der .cvsignore-Dateien. Dies kann das kleine Python Skript vorab erledigen.

https://github.com/stroeter/cvsignore2gitignore

cvsignore2gitignore

Script to transform cvsignore,v RCSFiles to gitignore,v files. Background: if you convert a cvs repository to git using cvs2git it does not transform the .cvsignore-files. You can run this python script on a copy of your cvs-repository before calling cvs2git to get this job done. The script replaces all .cvsignore,v files by .gitignor,v files where the entries are prefixed by a slash. The cvs history information will stay the same.

syntax

python3 cvsignore2gitignore.py <PathToCopiedRepository>

You might have to adjust the RCSFile-encoding to “utf–8” within the script (default is “cp1252”) calling the script without params will run the transformation with some test-data from the zipfile example-cvsignore.zip

limitation

  • does not transform several ignore entries per line.
  • entries with @ char aren’t supported.
  • This is my first python script, so don’t expect any syntactic sugar ;->

requirement

  • a copy of the cvs repository directory containing the *,v-RCSFiles.
  • python3 3.4 interpreter instaled

used resources

cvsbook/RCS-Format.html

Sonntag, 19. Juni 2016

Erstes Arduino Projekt umgesetzt

"Houston, der Arduino sendet jetzt die korrekten Temperaturwerte des via OneWire angeschlossenem  Dallas 18B20 IC über die serielle..." :-) - Danke an Chris für die Starthilfe.



Sehr fein - Die Arduino Entwicklung funktioniert sogar via Eclipse Umgebung! 




Sonntag, 15. Mai 2016

Raspberry Pi - Pakete automatisch aktualisieren mit unattended-upgrades, apt-listchanges und apticron

unattended-upgrades installieren

sudo apt-get install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Konfigurieren

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Unattended-Upgrade::Origins-Pattern {
    // "origin=Raspbian,archive=stable,label=Raspian";
    "origin=Raspbian,archive=stable";
    "origin=Raspberry Pi Foundation,archive=stable";       
};
Zusätzlich in der Konfigutaionsdatei die Optionen für Mailbenachrichtigung und Autodelete anpassen.

Logausgabe:

/var/log/unattended-upgrades/unattended-upgrades.log

Testlauf:

sudo unattended-upgrades --dry-run

apt-listchanges

Zeigt die Changelog Informationen bei Upgrades an.
sudo apt-get install apt-listchanges
sudo dpkg-reconfigure apt-listchanges
//config liegt unter: /etc/apt/listchanges.conf

Benachrichtigen mit apticron

apticron informiert per mail über neu verfügbare Pakete:
sudo apt-get install apticron
sudo dpkg-reconfigure apticron  

Quellen:

Donnerstag, 5. Mai 2016

Raspberry Pi SD Karten Backup unter Mac OS

Spätestens nach dem zweiten Neuaufsetzen des Raspian OS macht es Sinn sich einmal Gedanken zur Datensicherung des kompletten SD-Images zu machen. :->
Wunschliste zur SD Karten Sicherung:
  • Zuverlässig
  • Handhabung: einfaches Sichern und Wiederherstellen
  • schnell
  • resourcenschonend
Auf raspberrypi.org gibt es zum Backup der Raspi Daten eine gute Zusammenfassung. Unter INSTALLING OPERATING SYSTEM IMAGES finden sich Beschreibungen zu den einzelnen Betriebssystemen.

Schneller zippen: pigz statt gzip verwenden

pigz ist kompatibel mit gzip, nutzt aber mehrere Prozessorkerne. Für das 1.3GB große Jessie-Image ergaben sich auf einem MacBook Air mit 1,8 GHz Intel Core i7 folgende Werte:
$ time pigz --best --keep --force 2016-03-18-raspbian-jessie-lite.img`
real    0m46.547s
Dateigröße: 296,7 MB

$time gzip --best --keep --force 2016-03-18-raspbian-jessie-lite.img`
real    2m6.290s
Dateigröße: 296,8 MB

Image von SD-Karte erstellen (Mac OS)

  1. SD-Karte einlegen
  2. mit ‘diskutil list’ die Disknummer der SD-Karte ermitteln (3)
  3. Unmount SD-Karte mit diskutil unmountDisk /dev/disk<disk# from diskutil>. Zum Beispiel diskutil unmountDisk /dev/disk3
  4. Copy SD-Karte auf Image Datei: sudo dd bs=1m if=/dev/rdisk3 | pigz > raspi-ths-jessie-20160501.img.gz (CTRL-T trackt den Fortschritt)

Image auf SD-Karte schreiben (Mac OS)

  1. SD-Karte einlegen (ohne Schreibschutz)
  2. mit diskutil list die Disknummer der SD-Karte ermitteln (3)
  3. Unmount SD-Karte mit diskutil unmountDisk /dev/disk<disk# from diskutil>. Zum Beispiel diskutil unmountDisk /dev/disk3
  4. Copy Image Datei auf SD-Karte: sudo gunzip -c raspi-ths-jessie-20160501.img.gz | sudo dd bs=1m of=/dev/rdisk3            (CTRL-T trackt den Fortschritt)

Tontech Touch Screen MZ61581 am Raspberry Pi

Eigentlich sollte der Raspberry ja “headless” als Server im Netz laufen. Letztendlich konnte ich dann doch nicht widerstehen und bestellte das Tontech Touch Display Model MZ61581 bei Amazon. Die mitgelieferte Installationsanleitung kam etwas sehr winzig und dürftig daher. Mein erster Installationsversuch schredderte auch erfolgreich die SD-Karte und der Raspi hing beim booten. Nach Neuinstallation (und Backup) klappte es dann folgendermaßen:

Installation

Die Installation erfolgte auf einem Raspberry Pi 3 mit Raspian “Jessie” gemäß dem Blogeintrag von Davies-Barnard Tontec Touch Screen Set Up

Kalibrierung

Zunächst wie in der Tontech-Anleitung beschrieben die Kalibrierungssoftware installieren. Dann via (SSH-)Shell das Setup starten:

pi@raspi:~ $ DISPLAY=:0.0 xinput_calibrator

Zum persistenten Speichern das Snippet aus der Konsolenausgabe nach /usr/share/X11/xorg.conf.d/99-calibration.cont kopieren:

Section "InputClass"
  Identifier      "calibration"
  MatchProduct    "ADS7846 Touchscreen"
  Option  "Calibration"   "248 3839 404 3714"
  Option  "SwapAxes"      "0"
EndSection

Fazit

Nach kurzer Recherche im Netz ließ sich das Display fix konfigurieren. Die Beschreibungen von Tontech machen einen durchwachsenen Eindruck (die aktuellen Beschreibungen sind im Internet nur als MS-*.docx Dateien abgelegt, die unter Mac oder iOS falsch gerendert werden - schwarze Schrift auf schwarzer Box - toll. Vor der Installation auf jeden Fall ein Backup des Systems ziehen! Das mitgelieferte Gehäuse erfüllt seinen Zweck und ist recht pfiffig konstruiert. Mir wäre ein noch stabileres, weniger “knarzeliges” Gehäuse lieber. Für Bastelzwecke, Prototypen mit eigener GUI geht es aber voll OK :-) Als Desktop Ersatz verbietet sich die Lösung schon allein wegen der geringen Auflösung. Wer keinen Wert auf ein kleines Display mit kompaktem Gehäuse für den Raspi legt ist mit dem kapazitativen Raspberry 7’er Touchdisplay sicherlich besser bedient.

Sonntag, 3. April 2016

Status-Mails mit dem Raspberry versenden

Mailversand ist eine Möglichkeit für den Raspberry sich bemerkbar zu machen. Ob “Platte voll”, neue Sicherheitsupdates verfügbar oder Backup-Status: eine Mail an den Admin ist schnell zugestellt - wenn alles korrekt konfiguriert ist. Hier die Beschreibung der aktuellen Mail Konfiguration auf meinem Raspian System (Jessie).

Extra Mailadresse für Statusmails Postfach (GMX)

Alle lokalen Mails (an root, webserver, ..) werden dazu an eine externe Emailadresse weitergeleitet. Hierzu verwende ich zur Sicherheit einen separaten Mailaccount. Per Postfach-Regel leitet dieser Account die Nachrichten an den eigentlichen Administrator (meine private Emailadresse) weiter. Aus historischen Gründen fiel meine Wahl auf GMX - ein anderer Provider wie z.B. Google erfüllt den gleichen Zweck.

Message Transfer Agent SSMTP

Die Mails werden via SSMTP dem zuvor angelegten Mail-Account zugestellt. Als Beschreibung diente mir system-mails-ohne-einen-mail-server-mit-ssmtp-verschicken von Christoph Langner.

Installation

>sudo apt-get install ssmtp mailutils mpack

Konfiguration: /etc/ssmtp/ssmtp.conf

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=MyStatusMail@gmx.de

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=mail.gmx.net:465

# Where will the mail seem to come from?
rewriteDomain=gmx.net

# The full hostname
hostname=gmx.net

UseTLS=YES
AuthUser=MyMAIL@gmx.de
AuthPass=MYVERYSECRETPASSWORD

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

/etc/ssmtp/revaliases

Für lokale Accounts die gültige Absenderadressen in /etc/ssmtp/revaliases eintragen:

root:MyMAIL@gmx.de:mail.gmx.net:465
pi:MyMAIL@gmx.de:mail.gmx.net:465
www-data:MyMAIL@gmx.de:mail.gmx.net:465

ssmtp Testen:

>ssmtp -v echo@tu-berlin.de
(mit STRG-D abschicken)

Forwarding lokaler Postfächer mit heirloom-mailx

Zunächst das Paket “heirloom-mailx” installieren:

>sudo apt-get install heirloom-mailx

Das Forwarding der restlichen lokalen Mail-Accounts wird für heirloom mailx, ein branch vom “nail” System, in der Datei /etc/nail.rc definiert. Dort die folgenden Alias-Einträge hinzufügen:

# alias Definitionen für Mailweiterleitung 
# (root wird via ssmtp bereits an externe mailadresse weitergeleitet)
# alias root root<myStatusMail@gmx.de>
alias pi root

alias mailer-daemon root
alias postmaster root
alias nobody: root
alias hostmaster root
alias usenet root
alias news root
alias webmaster root
alias www root
alias ftp root
alias abuse root
alias noc root
alias security root

Testmail an lokale System-Accounts senden:

>echo "Hallo dies ist eine Testmail an root" | mail root
>echo "Hallo dies ist eine Testmail an pi" | mail pi

Mittwoch, 4. Februar 2015

Posted Apache Ant 1.9.4 Bug 57533 - NullPointerException FileUtil.rename

posted Bug 57533 regarding the Apache Ant Tool 1.9.4  - NullPointerException FileUtil.rename / ResourceUtils.copyFile() if copyUsingFileChannels failed 
- wunderbar: should be fixed in the next release

Sonntag, 4. Januar 2015

Computerspielemuseum Berlin November 2013

Nicht nur bei schlechtem Wetter lohnt sich für Computer-Interessierte ein Besuch im Computerspielemuseum Berlin. Schon etwas schräg zu sehen, das die Geräte mit denen ich als Kind und Jugendlicher gespielt und gearbeitet habe jetzt reif fürs Museum sind - aber so ist die Technik.




An diesem Gerät habe ich mit Schulfreunden in "Freistunden" viel Zeit verbracht. Putzige Erinnerung: dreimal kräftig aufs Gehäuse klopfen und das Gerät machte ein Reset...


..der Nachfolger TI 99/4A war mein erster "eigener" Rechner
M.U.L.E.  haben wir Tag und Nacht gespielt - Spiel und Entwickler waren ihrer Zeit weit voraus. 


Oje, das haben wir früher auch abgetippt...
..Solche Kisten gab's bei uns in der Schule für die Pioniere des Informatikunterrichts (ohne coole Signatur) 







Zwischen den Jahren: Hardware ausmisten

...erste Programmierer-Artefakte
Zwischen den Jahren - typische Zeit zum aufräumen und sortieren. Nach über 30 Jahren ist es einmal an der Zeit, mich von meinem ersten eigenen Rechner zu trennen. Damals fiel die Wahl auf das Modell TI-99/4A. Also rein in die e-Bucht und weg damit.

sehr praktisch: Das Gerät hatte sogar einen Tassenwärmer rechts eingebaut  
CBM 8296-D
Bei der Gelegenheit kann direkt ein weiteres altes Schätzchen weg (mit dem ich nie gearbeitet hatte)- ein defekter Commodore CBM 8296-D findet in der e-Bucht hoffentlich auch noch einen findigen Bastler. .. 


weitere Links:
Bernd Leitenberger: "In Memoriam Ti 99 / 4a ... oder wie man ein gutes Produkt klein bekommt."

Mittwoch, 11. September 2013

Tomcat auf dem Raspbery Pi

RaspberryPi - der komplette Rechner 
Der Raspberry Pi ist ein kleines, preiswertes Platinchen auf dem ich zu Testzwecken einen Tomcat Server installiert habe.  Hier meine Stichpunkte zur Konfiguration.

JAVA und Tomcat installieren

sudo apt-get install oracle-java8-jdk

sudo apt-get install tomcat8
sudo apt-get install tomcat8-admin
sudo apt-get install tomcat8-user
sudo apt-get install tomcat8-docs



// Tomcat-Installationsverzeichnisse catalina.base über aktiven Prozess finden:
ps -Af|grep "tomcat"

/usr/lib/jvm/java-7-openjdk-armhf/bin/java 
  -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties 
  -Djava.awt.headless=true 
  -Xmx128m 
  -XX:+UseConcMarkSweepGC 
  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
  -Dcom.sun.management.jmxremote=true 
  -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed 
  -classpath /usr/share/tomcat7/bin/bootstrap.jar:
         /usr/share/tomcat7/bin/tomcat-juli.jar 
  -Dcatalina.base=/var/lib/tomcat7 
  -Dcatalina.home=/usr/share/tomcat7 
  -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp 
  org.apache.catalina.startup.Bootstrap start


Danach die psi-probe und manager-Benutzer in der /var/lib/tomcat7/conf/tomcat-users.xml konfigurieren (mc)
<tomcat-users>
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="user"/>
  <!-- psi probe roles -->
  <role rolename="probeuser" />
  <role rolename="poweruser" />
  <role rolename="poweruserplus" />

  <user username="pi"       password="password" roles="manager-gui,user"/>
  <user username="admin"    password="password" roles="manager-gui,user"/>
  <user username="MeinName" password="password" roles="manager-gui,user"/>
  <user username="script"   password="password" roles="manager-script"/>
</tomcat-users>

Manager-WebApp-URL: http://raspberrypi:8080/manager

Screenshot: Tomcat Manager WebApp




PSI Probe installieren:

Tomcat muss hierzu mit folgendem Property starten: 
  -Dcom.sun.management.jmxremote=true
Die PSI probe WebApp wird remote über Manager WebApp installiert.

PSI probe URL: http://raspberrypi:8080/probe/

Screenshot: psi-probe WebApp

Weitere Memos zur Raspberry Pi Config 


// Zugang
ssh pi@raspberrypi


Hilfsprogramme
sudo apt-get install mc tightvncserver

Hilfreiche Kommandos
sudo raspi-config


APT Paketinfo aktualisieren
sudo apt-get update
sudo apt-get dist-upgrade

Paketsuche mit apt-file
sudo apt-get install apt-file


sudo apt-file update
apt-file search -l "xyz"
wget http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_armhf.deb
wget http://launchpadlibrarian.net/218525709/chromium-browser_45.0.2454.85-0ubuntu0.14.04.1.1097_armhf.deb
wget http://launchpadlibrarian.net/218525711/chromium-codecs-ffmpeg-extra_45.0.2454.85-0ubuntu0.14.04.1.1097_armhf.deb
sudo dpkg -i libgcrypt11_1.5.0-5+deb7u3_armhf.deb
sudo dpkg -i chromium-codecs-ffmpeg-extra_45.0.2454.85-0ubuntu0.14.04.1.1097_armhf.deb
sudo dpkg -i chromium-browser_45.0.2454.85-0ubuntu0.14.04.1.1097_armhf.deb

Sonntag, 27. Januar 2013

Backup der Time Machine-Daten einer Buffalo Linkstation

Beim erstellen der Time Machine Backups des HEIM-NAS musste ich feststellen, das der Speicherplatz auf der externe USB Festplatte schnell knapp wurde. Ursache: Time Machine arbeitet mit  harten Datei-Links und kopiert lediglich die Delta Daten. Das Backup der LinkStation mini dupliziert jedoch nicht diese Links sondern kopiert die Daten erneut. So kommt es, das auf dem NAS die Time Machine Daten lediglich 90 GB belegen auf der externen XFS formatierten Festplatte belegen sie jedoch mehr als das Dreifache. Fraglich ist auch, ob ein Restore der Sicherung funktioniert und taugt. Mals sehen, was der Buffalo Support dazu schreibt...

...zwei Wochen und drei Support Mails später: Die Linkstation unterstützt das Backup/Restore der TM-Daten nicht OutOfTheBox. Aber warum auch kompliziert, wenn es auch einfach geht? Letztendlich sicherte ich die auf dem NAS abgelegten TM-SparseBundles via MAC-Rechner direkt auf USB Platten.

1. USB Platten müssen MacOS/Journaled FS besitzen
2. Häkchen bei "Eigentümer auf diesem Volume ignorieren" soll laut Apple Support-Doku NICHT gesetzt sein.
3. TimeMachine auf allen Rechnern gestoppt/deaktiviert, sowie auf dem NAS ausgeschaltet
4. Im Finder die TimeMachine Freigabe eingebunden (CTRL-K/ afp:<NASName>/TimeMachine )
5. Via Finder die Sparse-Bundles der Rechner auf USB-Platten kopiert.
fertig.  

Mittwoch, 16. Januar 2013

Sonntag, 30. Dezember 2012

Datenpflege/Multimedia Heim-Archiv

Ja ja - die Zeit zwischen den Jahren: da wird bei schlechtem Wetter die "Ablage" bearbeitet. Ich habe da unser Heim-Multimedia NAS einmal aufgeräumt...

(Re)Import von CDs via iTunes

Einige CDs in unserem Archiv waren mit lausigen Bitraten encodiert. Speziell bei den Klassik CDs hörte sich das nicht gut an. Also: Reimport der CDs via iTunes. Da noch zusätzlich zwei USB-CDBrenner zum einlesen zur Verfügung standen, ging das Einlesen verhältnismäßig flott.

Metadaten pflegen

Vor dem Einlesen sollten die Disk-Metadaten angepasst werden. (z.B. Genre oder Disk-Titel)

Encodieren

Ein Arbeitskollege gab den Tip die Daten direkt "lossless" abzulegen - Entsprechend encodiert lauscht man den Stücken in CD Qualität. Beim Synchronisieren mit iOS Devices bietet iTunes optional eine Konvertierung an.

Reicht der Speicherplatz beim Archiv nicht für "Lossless" so sollte AAC (Advanced Audio Codec) verwendet werden (320 kbps, vbr).

Lyrics und Cover Art

Zu den Metadaten gehören ebenfalls Cover und Song-Texte. Erstere lassen sich via Suchmaschine finden. Für die Song-Texte leitete das Programm "Get Lyrical" auf dem Mac gute Dienste.

Archivierung

In unserem Heimnetz liegen alle Multimedia-Daten auf einem zentralen NAS (Buffalo Linkstation mini). Die Datensicherung erfolgt jeweils als "Vollbackup" auf externen USB-Disks (zwei Sätze, XFS Formatiert für das Timemachine-Backup und Dateien > 4 GB. Lassen sich notfalls auf einem (virtuellen) Linux System einbinden). 

Vergleich NAS-Daten und archivierte Daten

Mit dem diff-Befehl lassen sich komplette Verzeichnisse vergleichen:

// 1. Vergleich mit diff: 
diff -qr /Volumes/BAK1-200905/201203111801/mp3/ /Volumes/media/mp3 | grep -v -e 'DS_Store' -e 'Thumbs' | tee diff.txt

// 2. filtern und sortieren:
more diff.txt | grep -v -e "\._" -e "\.AppleDouble"|sort

Donnerstag, 8. November 2012

Vorschlag für drei enhancements bzgl. eclipse/compare


  • Bug 393769 "Compare Word doc failed with 64 bit JVM and 32 bit Office (Failed to create Ole Client)"
  • Bug 393772 "Word Compare does not honor "general/editor/Allow in-place system editor" setting - always opened as a embedded window"
  • Bug 393776 -enh: configureable external compare tool (by file suffix?)


Montag, 10. September 2012

eclipse Bug Posting: Bug 389136 external dragged window views can not be maximized

eclipse Bug Posting: Bug 389136 external dragged window views can not be maximized

(fixed in 4.2 SR1)

Freitag, 3. August 2012

Kommentar zu "IDE Project Files In Version Control - Yes or No? Of Course, Not!"



Zu einem Posting auf http://java.dzone.com in der javalobby musste ich dann doch noch etwas kommentieren..
"A yes or no answer seems to be a little bit to easy to me. It depends onIf you work in a homogenous infrastructure where every developer has to use the same IDE it makes sense to me, also to reuse the projects settings. The costs for configuring an IDE-project correctly are not that low. We use eclipse projects that make use of more than 30 external libraries. If you want to work properly with them, use the debugger etc, you have to configure their sourcecode and javadoc location. I'am not a maven-expert, but I think a *.pom file would not automatically deliver this information to the IDE of your choice. For an eclipse project in a homogenous IDE infrastructure it makes also sense to me to check in the code-templates, compiler warning- and compliance- settings. So I would choose an pragmatic approach and first check the benefits and the costs and then decide what should be placed under version control and what not.
Nevertheless, in my point of view there should be additionally buildfiles (ant,maven,bat,sh or what else ) to create the project via commandline or your continues integration tool that are placed under version control, too. The goal should be that an developer can easy load a project within his IDE to maintain the project and that he can easy build the projects artefacts via commandline or ci-tool."   

Freitag, 20. Juli 2012

Mittwoch, 18. Juli 2012

eclipse bug posting Bug 385368 - History View changes contents when focused

Bug 385368 - History View changes contents when focused

(eclipse 4.2 Bugeintrag)

(duplicate von Bug 384068 - Unexpected partVisible and partBroughtToTop events lead to wrong History view updating in Link with...  - soll in 4.2.1 gefixed sein)

Sonntag, 12. Februar 2012

Versteckte Finder Dateien auf USB Stick für Autoradio löschen

Aktuelle Autoradios besitzen neuerdings auch einen USB Anschluss. Mal eben einen USB Stick mit MP3 Dateien für die Wiedergabe gefüttert - schon kann auf andere Musikkonserven während der Fahrt verzichtet werden. Das funktioniert mit unserem Autoradio auch ganz prima - würde es nur nicht über die unter MAC OS ebenfalls kopierten Finder Dateien stolpern. Stößt es auf diese, so pausiert die Wiedergabe einige Sekunden bis ein lautes Fehler-Piepen erklingt. Ziemlich nervig. Mit einem kleinen Terminal Skript lassen sich die versteckten Dateien aber leicht löschen.

So sieht das Skript "CleanupUSB.command" momentan aus:

    #!/bin/bash
    VOL=/VOLUMES/USBSTICK
    rm -Rf $VOL/.Trashes
    rm -Rf $VOL/.Spotlight-V100
    find $VOL -name "._*" -delete
    find $VOL -name ".DS_Store" -delete
  
Die USB Sticks haben eindeutige Volume-Namen,  wodurch das Skript mit absoluten Pfaden recht einfach ausfällt.

Im Terminal lassen sich die versteckten störenden "._" - Dateien anzeigen

Freitag, 6. Januar 2012

Smarter aufzeichnen mit dem vernetzten persönlichen Videorecorder (EyeTV als PVR)

Ein anständiger Festplattenrekorder macht das Fernsehkonsumenten Leben inzwischen wesentlich leichter: Aufnahmen sind dank der EPG schnell programmiert, die Geräte nehmen wenig Platz weg und können hunderte Filme archivieren.  Und Timeshift für das "Live" Fernsehen gibt es gratis dazu. Ich möchte auf diese Dienste nicht mehr verzichten - ca 95% des Fernsehens konsumiert unser Haushalt inzwischen aus der digitalen Konserve.
Die zeitliche Entkopplung, wann eine Fernsehsendung betrachtet wird, funktioniert mit den marktgängigen Geräten inzwischen problemlos. Etwas anspruchsvoller wird es, wenn die Aufzeichnungen mal schnell an einem anderen Ort ohne den Festplattenrecorder betrachtet werden sollen. Die Geräte dieser Gerätegattung geben sich, was den Zugriff auf die Videodaten angeht, meistens sehr verschlossen. Hinzu kommen Restriktionen durch die Verschlüsselung der Sender. Und an einen bequemen Videoschnitt, um z.B. Werbeunterbrechungen zu entfernen, ist meist gar nicht zu denken.

1. PROBLEMSTELLUNG
Innerhalb einer Wohnung sollen aufgenommene Fernsehaufzeichnungen mit verschiedenen Geräten, die über ein Netzwerk verbunden sind, wiedergeben werden. Dies soll ohne kopieren oder Neukodierung der Daten erfolgen.
Skizze Szenario vernetzter PVR


1.1. Funktionale Anforderungen

  • verwalten der Aufnahmen (programmieren / löschen)
  • Videoschnitt ermöglichen
  • Universal Plug and Play (UPnP) Unterstützung für Videowiedergabe (PS3, SetTop Box, Mobile Devices/Tablett PC App )
  • Wiedergabe auf Computer


1.2 Sonstige Anforderungen

  • zeitnaher Zugriff auf neue Aufnahmen. Kein erneutes kodieren oder umkopieren der Aufnahmen
  • Energiesparende Lösung


2. LÖSUNGSMÖGLICHKEITEN
2.1 PVR Hardware Device (Siemens Gigaset M740AV) und Cowfish Streaming Server
Ein Gerät, das die Möglichkeit bietet die Aufnahmen auf einem NAS abzulegen, ist die DVB-T Box von Siemens mit eingebauten Twin-Tuner.  Zwei entsprechend vernetzte Geräte hatten wir seit der Verfügbarkeit von DVB-T in unserem Haushalt in Betrieb. Zur Wiedergabe der Aufnahmen auf einem Rechner und zum leichteren Videoschnitt entwickelte ich eine JAVA Software, den "Cowfish Streamig Server" (siehe http://sourceforge.net/projects/cowfishserver  bzw. http://cowfishserver.sourceforge.net ).

Seitdem sich jedoch die EPG der Siemens Boxen nicht mehr aktualisieren liess, mussten wir uns nach einer anderen PVR Lösung umsehen. Leider wird das Gerät seit einigen Jahren nicht mehr weiterentwickelt. Eine vergleichbare fertige Hardwarelösung ist mir bei der Recherche jedoch noch nicht aufgefallen.

2.2 Computer Lösung (EyeTV/Mediacenter)
Anstatt eines fertigen Gerätes lässt sich natürlich auch ein Computer mit der entsprechenden Zusatzhardware in einen digitalen Videorecorder umwandeln. Mit entsprechenden Software-Erweiterungen liesse sich eine Videoverteilung sicherlich realisieren. Ein Arbeitskollege gab mir den Tip hierzu EyeTV einmal näher anzusehen. Was ich dann auch tat :->

2.3 Internet Videorecorder / Video On Demand
Sicherlich das Ding der Zukunft. Momentan finde ich das Angebot aber noch zu unattraktiv.


2.4 Meine Idealvorstellung (Hardware PVR Device)
Die Siemens DVB-T Boxen waren schon recht nah an meiner Idealvorstellung eines PVR Devices dran. So könnte ein Gerät aussehen:

  • Das Gerät wird mit dem lokalen Netzwerk verbunden
  • Konfiguration und Programmierung erfolgt via Web-Interface (Web Browser)
  • Null Energieverbrauch, sofern das Gerät nicht aufzeichnet oder verwaltet wird. Wake On Lan für Administration und Programmierung.
  • Aufnahmen werden auf externen Netshares abgelegt (UPnP NAS). WOL Option für NAS
  • Filter für EPG: "will ich nicht sehen", Flexibel konfigurierbare Aufnahmeregeln.
  • Videoschnittlösung für Aufnahmen. 


3. UMSETZUNG MIT EyeTV UND AppleScript
Als "Mac Haushalt" in welchem die Software EyeTV bereits seit längerem im Betrieb ist, fiel die Auswahl auf die Elgato Fernsehsoftware.  Mit dieser lassen sich auf Apple Rechnern Fernsehaufnahmen leicht programmieren,  schneiden und natürlich  auch betrachten.

Folgende Punkte mussten jedoch noch angepasst werden:

  1. Das Verzeichnis für die aufgenommenen Sendungen enthält auch immer den Timeshift-Buffer und die geplanten Aufnahmen.  Greifen mehrere EyeTV Instanzen parallel auf dasselbe zentrale Verzeichnis zu kommt es zu Konflikten mit dem TimeshiftBuffer und den geplanten Aufnahmen. Auch wäre das NAS für den Timeshift Buffer zu langsam. Letztendlich müssen lediglich die komplett aufgenommenen Sendungen auf dem NAS abgelegt werden. Hierzu bietet EyeTV jedoch keine Konfigurationsmöglichkeit.
  2. Die Energiebilanz ist hässlich, da der Mac nicht automatisch nach erfolgter Aufnahme in den Ruhezustand wechselt oder den Rechner ausschaltet. Das Aufwecken bzw. booten des Rechners für programmierte Aufnahmen funktioniert hingegen tadellos. 

Nach kurzer Recherche fanden sich Lösungsmöglichkeiten für die Zwei Punkte mittels der AppleScript Schnittstelle von EyeTV:

  1. Im EyeTV Archive-Verzeichnis wird ein symbolischer Link auf das ein via SMB gemountetes NAS Verzeichnis angelegt (ln -s /Volumes/media/SharedEyeTV/ SharedEyeTV). Nach abgeschlossener Aufnahme verschiebt ein AppleScript die Aufnahme in die NAS Freigabe.  In Christopher Kampmeier's Blog "Fun with EyeTV and AppleScript" fand ich das AppleScript Grundgerüst. Speziell die Aufteilung in RecordingDone und RecordingDone-called habe ich übernommen. Hinzu kamen noch zusätzliche mount Befehle für das NAS, da MacOS diese zwischendurch gerne wieder vergisst. Des weiteren muss eyeTV neu gestartet werden, damit die Aufnahmeliste aktualisiert wird.
  2. Der Wechsel in den Ruhezustand wird ebenfalls via AppleScript-Hook durchgeführt. Steht in den nächsten 3 Stunden keine Aufnahme an, so wird der Rechner heruntergefahren. Steht in den nächsten 30 Minuten keine Aufnahme an, so wechselt er in den Ruhezustand.  Die Skriptlogik hierzu fand ich im MacUser.de Community Forum im Posting des Users "oneOeight" "EyeTV3 RecordingDone Script zum ausschalten". Hinzu kamen noch Prüfroutinen, ob iTunes gerade ein Musikstück wiedergibt, oder ob in den letzten n Sekunden eine Interaktion durch den Benutzer stattfand. In diesen Fällen soll der Rechner nicht heruntergefahren werden.





3.1 Die AppleScript Dateien
Die folgenden AppleScript Dateien müssen in das Verzeichnis
   /Library/Application\ Support/EyeTV/Scripts/TriggeredScripts
abgelegt werden:

  • ExportDone.scpt
  • RecordingDone.scpt
  • RecordingDone-called.scpt
Der Pfad zum "mounten" des NAS muss für andere Installationen sicherlich angepasst werden...


3.1.1 RecordingDone.scpt

-- this script reuses modified AppleScript snippets of the following sources:
-- a) Christopher Kampmeier's Blog "Fun with EyeTV and AppleScript" (Script Structure)
-- b) MacUser.de Community Forum, by user oneOeight "EyeTV3 RecordingDone Script zum ausschalten"
-- TST 2012/01

-- If you would like to unit test the RecordingDone script, you can rename it, 
-- make several recordings and then call the renamed script directly from a 
-- terminal window like this:
--     $ osascript RecordingDoneTest.scpt 2
-- Where “2″ represents the second recording in your list.


property ARCHIVE_DIR : "~/Documents/EyeTV\\ Archive/"
property LOGFILE : ARCHIVE_DIR & "/osascript.log"


on RecordingDone(recordingID)
do shell script "echo \"recordingID = " & recordingID & "\" >" & LOGFILE & ""
do shell script "nohup osascript /Library/Application\\ Support/EyeTV/Scripts/TriggeredScripts/RecordingDone-called.scpt " & recordingID & " >> " & LOGFILE & " 2>&1 &"
end RecordingDone

on run argv
set myItem to item 1 of argv as integer
tell application "EyeTV"
set rec to unique ID of item myItem of recordings
end tell
my RecordingDone(rec)
end run



3.1.2 ExportDone.scpt

-- this script reuses modified AppleScript snippets of the following sources:
-- a) Christopher Kampmeier's Blog "Fun with EyeTV and AppleScript" (Script Structure)
-- b) MacUser.de Community Forum, by user oneOeight "EyeTV3 RecordingDone Script zum ausschalten"
-- TST 2012/01


-- If you would like to unit test the RecordingDone script, you can rename it, 
-- make several recordings and then call the renamed script directly from a 
-- terminal window like this:
--     $ osascript RecordingDoneTest.scpt 2
-- Where “2″ represents the second recording in your list.

property ARCHIVE_DIR : "~/Documents/EyeTV\\ Archive/"
property LOGFILE : ARCHIVE_DIR & "/export.log"


on ExportDone(recordingID)
do shell script "echo \"recordingID = " & recordingID & "\" >>" & LOGFILE & ""
do shell script "nohup osascript /Library/Application\\ Support/EyeTV/Scripts/TriggeredScripts/RecordingDone-called.scpt " & recordingID & " >> " & LOGFILE & " 2>&1 &"
end ExportDone

on run argv
set myItem to item 1 of argv as integer
tell application "EyeTV"
set rec to unique ID of item myItem of recordings
end tell
my RecordingDone(rec)
end run       

3.1.3 RecordingDone-called.scpt
-- this script reuses modified AppleScript snippets of the following sources:

-- a) Christopher Kampmeier's Blog "Fun with EyeTV and AppleScript" (Script Structure)
-- b) MacUser.de Community Forum, by user oneOeight "EyeTV3 RecordingDone Script zum ausschalten"
-- TST 2012/01


-- RecordingDone-called.scpt
--   copyRecord()            : moves recording from local HDD to a shared network drive 
--   checkEnergySaving(): switches mac to sleeps or shutdown after EyeTV completes a recording 

property ARCHIVE_DIR : "~/Documents/EyeTV\\ Archive"
property NETSHARED_DIR : "/Volumes/media/video/SharedEyeTV"


on run argv
set recordingID to item 1 of argv
-- manually started converter job?
set posix_recording_path to getPOSIXRecordingPath(recordingID)
if not (posix_recording_path contains "SharedEyeTV") and noExportJobFor(recordingID) then
try
moveRecordToNAS(recordingID)
on error errorText
log "copy record failed: " & errorText
end try
checkEnergySaving()
end if
end run

on checkEnergySaving()
if not eyeTVisBusy() then
-- Quelle für Vorlage: MacUser.de Community Forum, user oneOeight "EyeTV3 RecordingDone Script zum ausschalten"
set ausschalten to my keineAnstehendeAufnahmeIn(180)
set ruhezustand to my keineAnstehendeAufnahmeIn(30)
tell application "EyeTV" -- fuer activate und display dialog
if ausschalten then
activate
beep
set antwort to display dialog "TV Aufnahme beendet - Ausschalten?" buttons {"nein", "ja"} default button "ja" giving up after 30
if button returned of antwort = "ja" or button returned of antwort = "" then
log (current date) & "shut down computer"
tell application "Finder" to shut down
end if
else if ruhezustand then
activate
beep
set antwort to display dialog "TV Aufnahme beendet - Ruhezustand?" buttons {"nein", "ja"} default button "ja" giving up after 30
if button returned of antwort = "ja" or button returned of antwort = "" then
log (current date) & "setting computer to sleep"
tell application "System Events" to sleep
end if
end if
end tell
end if
end checkEnergySaving

on noExportJobFor(recordingID)
tell application "EyeTV"
return not is_exporting
end tell
return true
end noExportJobFor

on moveRecordToNAS(recordingID)
set posix_recording_path to getPOSIXRecordingPath(recordingID)
set myid to recordingID as integer
try
mount volume "smb://mediax/media" --mount destination file
end try
set cmd to "cp -R \"" & posix_recording_path & "\" \"" & NETSHARED_DIR & "\""
log "running \"" & cmd & "\""
do shell script "" & cmd & ""
tell application "EyeTV"
delete recording id myid
end tell
if not eyeTVisBusy() then
restartEyeTV()
end if
end moveRecordToNAS

on getPOSIXRecordingPath(recordingID)
tell application "EyeTV"
set myid to recordingID as integer
set recording_location to location of recording id myid as text
set AppleScript's text item delimiters to "."
set recording_path to text items 1 through -3 of recording_location as string
set AppleScript's text item delimiters to ""
set recording_path to POSIX path of recording_path & ".eyetv"
end tell
return recording_path
end getPOSIXRecordingPath


on restartEyeTV()
with timeout of 60 seconds
tell application "EyeTV"
quit
end tell
delay 10
tell application "EyeTV"
launch
end tell
end timeout
end restartEyeTV

on eyeTVisBusy()
tell application "EyeTV"
return is_recording or is_exporting or is_saving_clip_as_recording
end tell
end eyeTVisBusy

-- steht innerhalb der nächsten xx Minuten (zeit) keine Aufnahme an?
-- Quelle für Vorlage: MacUser.de Community Forum, by user oneOeight "EyeTV3 RecordingDone Script zum ausschalten"
on keineAnstehendeAufnahmeIn(zeit)
tell application "EyeTV"
try
set limit to zeit * minutes
set ausmachen to true
set vorlauf to (prepad time + 2) * minutes
set jetzt to current date
repeat with aufnahme in start time of programs
set diff to aufnahme - jetzt
if diffvorlauf then set diff to diff - vorlauf
if diff ≥ 0 and difflimit then set ausmachen to false
end repeat
end try
end tell
return {ausmachen}
end keineAnstehendeAufnahmeIn


3.1.4 InitEyeTV.scpt - AppleScript bei Anmeldung ausführen
Letztendlich übernimmt noch ein weiteres kleines AppleScript als Anmeldeobjekt bei der Anmeldung das Mounten des NAS Laufwerks und den Neustart der eyeTV-Software, damit die im NAS abgelegten Aufnahmen gelistet werden.


--  mount shared eyetv folder 
-- and restart eyetv to reload recordings 
--
-- launch this script at user login
-- T.Stroeter/Januar 2012 

property MOUNTVOLUME : "smb://mediax/media"


on run argv
mountSharedArchive()
restartEyeTV() -- restart to reload recordings
end run



on mountSharedArchive()
try
mount volume MOUNTVOLUME --mount destination file
log "mounted " & MOUNTVOLUME
on error errorText
log errorText
end try
end mountSharedArchive

on restartEyeTV()
with timeout of 60 seconds
tell application "EyeTV"
quit
end tell
delay 5
tell application "EyeTV"
launch
end tell
end timeout
end restartEyeTV




3.2 Bekannte Probleme
  • Die Daten müssen für die EyeTV-Lösung von der lokalen Platten auf das NAS umkopiert werden (kostet Zeit).
  • Die Wiedergabe unter EyeTV kann stocken, wenn das NAS die Daten zu langsam liefert. Im Gegensatz zu anderen VideoPlayer verwendet eyeTV hier offensichtlich einen zu kleinen internen Buffer für die Wiedergabe.



3.3 Todos: 
-besseres Logging: ablegen in Aufnahme-Ordner
-stabileres Shutdown nach geplanten Export Jobs


3.4 Energiebilanz
Der EyeTV PVR läuft auf unserem "Küchen iMac", 20 Zoll Modell Mitte 2007 mit 2.4GHz Core 2 Duo und 4GB RAM. Bei Aufnahme mit ausgeschalteten Display benötigt er noch 45W. Der Verbrauch im  Standby Betrieb war für das Messgerät nicht mehr anzeigbar.
Energieverbrauch des iMac 20 Zoll während der Aufnahme...
..und im Ruhezustand (Standby) 

Die Siemens Gigabset Boxen benötigten im Vergleich dazu während der Aufnahme um die 11W, im Standby um die 0,3W.

Als NAS wird eine Buffalo Linkstation mini im Dauerbetrieb verwendet. Während der Aufnahme benötigt diese ca 12,2W. Ohne Last sind es mit 7,8 W. Durch eine Zusatzsoftware für Windows und Apple Rechner ließe sich das NAS noch in einen Schlafzustand schicken und aufwecken, wodurch weitere 2-3 W gespart werden.


4. Verwendete Quellen

a) Christopher Kampmeier's Blog "Fun with EyeTV and AppleScript"
http://kampmeier.com/chris/blog/?p=451 Feb 2011
Enthielt bereits das AppleScript Grundgerüst, speziell die Aufteilung in RecordingDone und RecordingDone-called, welche ich übernommen habe.

b) MacUser.de Community Forum, User "oneOeight" "EyeTV3 RecordingDone Script zum ausschalten
  Skriptlogik, um den Rechner zuverlässig nach einer Aufnahme auszuschalten.


c) AppleScript Language Guide
    Onlineversion - lässt sich auch als komplettes PDF laden.
d) Buch "AppleScript - Der automatische Mac"
     Detlef Schulz/ Smart Books 2009