Alle Beiträge von adlerweb

[Gentoo] Installation von dev-ruby/ffi-1.9.4 schlägt fehl

Die Installation von dev-ruby/ffi-1.9.4, welches als Dep gezogen wurde, machte auf einem Server Probleme. Unter anderem war folgende Meldung zu lesen:

cannot load such file -- rspec/core/rake_task

Woher die Anforderung kam oder warum keine Dep da ist konnte ich nicht direkt sehen, ein manuelles Installieren von dev-ruby/rspec sollte jedoch die nötigen Voraussetzungen schaffen um das Kompilieren zu ermöglichen.

[Gentoo] Slot-Conflice durch Perl-Updates

Schon etwas älter, aber ab und zu stoße ich trotzdem drauf: Durch Perl kommt es bei Updates zu einem Slot-Conflice / Blocked Packages. Die Lösung wird z.T. gleich mitgeliefert:


* Remove all perl-core packages from your world file
* emerge --deselect --ask $(qlist -IC 'perl-core/*')
* Update all the installed Perl virtuals
* emerge -uD1a $(qlist -IC 'virtual/perl-*')
* Afterwards re-run perl-cleaner
perl-cleaner --reallyall

Arch Linux: Grafik-Software streikt nach Mesa-Update (10.2.7-2)

Seit vermutlich dem letzten Mesa-Update auf 10.2.7-2 vom letzten Wochenende ist offenbar OpenGL nicht mehr voll funktionsfähig – in meinem Fall verabschiedete sich Hugin mit der folgenden Meldung:

/usr/share/hugin/data/plugins/crop_cp.py
   CAT:Control Points
   NAM:Crop Control Points
/usr/share/hugin/data/plugins/woa.py
   CAT:Control Points
   NAM:Warped Overlap Analysis
/usr/share/hugin/data/plugins/top_five.py
   CAT:Control Points
   NAM:keep 5 CPs per image pair
/usr/share/hugin/data/plugins/shooting_pattern.py
   CAT:initial distribution
   NAM:6-1-1 Shooting Pattern
LLVM ERROR: Cannot select: intrinsic %llvm.x86.sse41.pblendvb
Speicherzugriffsfehler (Speicherabzug geschrieben)

Der Fehler ist schon im Arch-Bugtracker zu finden. Eine aktualisierte Mesa-Version (10.2.7-3) findet sich in Testing, hiermit tritt der Fehler nicht mehr auf.

Edit: Laut Website soll 10.2.7-3 wohl seit gestern in extra sein, auf meinem Mirror war dies jedoch noch nicht der Fall.

PEBCAK: Negative Temperaturen gibt’s ja auch…

In der BitNotice #44 hatte ich „mal schnell“ ein Script gebaut um die Werte eines DS18B20 Temperatursensors über einen Raspberry Pi in Volkszähler zu schaufeln. Was irgendwie nicht so ganz aufgefallen ist: Das Script konnte nur Plusgrade. Jetzt steht auf Github eine überarbeitete Version mit „-“ und etwas mehr Fehlerbehandlung. Danke an Peter, dessen Kühltruhe den Fehler aufgedeckt hat.

CAcert mit Chrome/Chromium unter Linux

CAcert ist an sich ja eine tolle Sache: Kostenfreie SSL-Zertifikate ermöglichen es auch kleinen Projekten Verschlüsselung zu nutzen ohne mit selbstsignierten Gerümpel anzufangen. Leider ist diese Zertifizierungsstelle nur bei wenigen Browsern vorinstalliert.

Unter Windows mit IE oder auf nahezu allen PC-Systemen per Firefox ist die Installation üblicherweise mit einem einfachen Klick auf der Webseite der CA erledigt – Chrome/Chromium unter Linux nutzen jedoch offenbar eine eigene Zertifikatsdatenbank.

Da die Warnungen und das manuelle prüfen auf Dauer natürlich nervig sind verweise ich mal einfach auf den offiziellen Installationsguide – hier ergänzt um einen kurzen Identitätscheck (Stand August 2014, gültig bis März 2033).

 

cd /tmp

wget -O cacert-root.crt "http://www.cacert.org/certs/root.crt"
wget -O cacert-class3.crt "http://www.cacert.org/certs/class3.crt"

openssl x509 -in cacert-root.crt -fingerprint -sha1 -noout
#Hier muss 13:5C:EC:36:F4:9C:B8:E9:3B:1A:B2:70:CD:80:88:46:76:CE:8F:33 erscheinen
openssl x509 -in cacert-class3.crt -fingerprint -sha1 -noout
#Hier muss AD:7C:3F:64:FC:44:39:FE:F4:E9:0B:E8:F4:7C:6C:FA:8A:AD:FD:CE erscheinen

certutil -d sql:$HOME/.pki/nssdb -A -t TC -n "CAcert.org" -i cacert-root.crt 
certutil -d sql:$HOME/.pki/nssdb -A -t TC -n "CAcert.org Class 3" -i cacert-class3.crt

Nach der Installation erkennt Chrome/Chromium die neue CA sofort, ein Neustart von System oder Browser ist nicht notwendig.

Ranttime #8 – Die Digitale Agenda 2014-2017 – Ein Kommentar

Links zum Thema

Inhalt:

  • 0:00 Intro / Die Internet-Troika
  • 3:23 Industrie 4.0
  • 5:12 Chancen für Start-Ups / Von Abmahnern und Patenttrolle
  • 6:34 Netzneutralitätsprioritätsvergabe
  • 8:41 Die DeMail ist sicher.
  • 10:32 Die Digitale Gesellschaft: Wir sind das Netz…
  • 14:15 Vertrauen als Währung
  • 14:55 EU-Datenschutz
  • 15:33 Was ist „kritische Infrastuktur“?
  • 17:04 Das Internet ist kein rechtsfreier Raum
  • 18:25 Mit Sandsäcken gegen den Daten-Tsunami
  • 23:44 Funkfrequenzen sind kein Kabel
  • 25:05 Damit Weißes länger weiß bleibt
  • 25:36 Closed Data, Open Data, Missing Data
  • 26:09 Überwachungsterror
  • 27:04 Hausaufgabenvergesser
  • 27:32 Der Bundestrojaner, dein Freund und Helfer
  • 28:20 Undefiniert ist genauer als Zahlen zu nennen?
  • 29:14 Lehrstunde Vectoring
  • 29:30 Offene WLANs, Störerhaftung und die Anonymität
  • 31:14 Frequenzpooldämpfung: Tetra/BOS-Funk
  • 32:22 Volkssport Google-Bashing
  • 32:52 [fefe] Förderung? Bleibt ja in der Familie
  • 33:25 [fefe] Meldepflicht
  • 34:21 [div] Folgenloses Geschwätz
  • 34:44 Mein Fazit

Poor mans PC-Interface – Multimeter per Webcam auslesen

Improvisieren? Kann ich. Derzeit teste ich mit einem Gerät herum, welches sich in regelmäßigen Abständen einschaltet – interessant für mich wäre es nun diese Zyklen genauer zu kennen. Zwar habe ich einige Energiekostenmessgeräte, damit lässt sich jedoch nur Min/Max bzw. der Durchschnitt errechnen, nicht jedoch wie oft das Gerät nun tatsächlich läuft. Hier würde ein Multimeter mit PC-Anbindung helfen, leider käme hierzu nur mein UniT in Frage, welches im Dauerbetrieb jedoch recht schnell mit leerer Batterie seinen Dienst einstellen würde. Meine „großen“ HPs besitzen zwar eine GPIB-Schnittstelle, den passenden PC-Adapter habe ich allerdings noch nicht fertig.

Bleibt nur ein anderer Ansatz: Optische Erkennung. Als Multimeter hält mein Rohde&Schwarz/Keithley her – durch die LEDs ist dessen Anzeige am einfachsten lesbar. Direkt davor sitzt nun eine Webcam, welche die Anzeige im Auge behält. Über die Software „motion“ stellt mein Linux-Server einen MJPEG-Stream bereit – ich bin diesen Weg gegangen, da ein ständiges Reinitialisieren der Kamera für einzelne Screenshots gerne zu Hängern führt.

Bild: https://adlerweb.info/blog/wp-content/uploads/2014/08/cam1.jpg

Ein kleiner PHP-Daemon fragt nun regelmäßig das letzte Bild ab, hierzu wird ein (modifizierter) Code des motion-Projektes verwendet:

$camurl='http://127.0.0.1:8081/';
$boundary="\n--";

$f = fopen($camurl,"r") ;

   if(!$f)
   {
        //**** cannot open
        echo "error";
   }
    else
   {
        //**** URL OK
         $r='';
         unset($p);
         while (substr_count($r,"Content-Length") != 2) $r.=fread($f,512);

         $start = strpos($r,chr(0xFF));
         $end   = strpos($r,$boundary,$start)-1;
         $frame = substr("$r",$start,$end - $start);

         //In $frame sind nun die rohen JPEG-Daten - diese können ausgegeben werden, gespeichert werden oder per imagecreatefromstring (gd) in PHP weiter verarbeitet werden
   }

Weiterhin wird das Bild passend beschnitten, gedreht und in ein invertiertes Schwarz-Weiß-Bild umgewandelt:

$src = imagecreatefromstring($frame);
$dst = imagecreatetruecolor(173,75);

imagecopy($dst, $src, 0, 0, 225, 66, 173, 75);
$dst = imagerotate($dst, 10, 0);
imagefilter($dst, IMG_FILTER_NEGATE);
imagefilter($dst, IMG_FILTER_GRAYSCALE);
imagefilter($dst, IMG_FILTER_CONTRAST, -100);

Im Anschluss wird über eine Reihe von „imagecolorat“-Abfragen für jede der 7-Segment-Stellen ein Array generiert – jedes Segment ist entweder an (1) oder aus (0). Zur besseren Erkennung wird jedes Segment an mehreren Stellen abgefragt und der Durchschnitt mit einem Schwellwert bewertet, so ist das System unempfindlicher gegen Rauschen.

Bild: https://adlerweb.info/blog/wp-content/uploads/2014/08/7SEG-208×300.png
(Im Array ist der Index entsprechend 0-6, nicht 1-7)

Am Ende steht ein Mapping, welches die erkannte Anzeige in einen Integer umwandelt

function seven2int($p) {
    $map[1][1][1][0][1][1][1] = 0;
    $map[0][1][0][0][1][0][0] = 1;
    $map[0][0][1][0][0][1][0] = 1;
    $map[1][0][1][1][1][0][1] = 2;
    $map[1][0][1][1][0][1][1] = 3;
    $map[0][1][1][1][0][1][0] = 4;
    $map[1][1][0][1][0][1][1] = 5;
    $map[1][1][0][1][1][1][1] = 6;
    $map[0][1][0][1][1][1][1] = 6;
    $map[1][0][1][0][0][1][0] = 7;
    $map[1][1][1][1][1][1][1] = 8;
    $map[1][1][1][1][0][1][0] = 9;
    $map[1][1][1][1][0][1][1] = 9;

    if(isset($map[$p[0]][$p[1]][$p[2]][$p[3]][$p[4]][$p[5]][$p[6]])) {
        return $map[$p[0]][$p[1]][$p[2]][$p[3]][$p[4]][$p[5]][$p[6]];
    }else{
        return false;
    }
}

Die (passend multiplizierten) Werte ergeben den Messwert. Die Erkennung ist zwar nicht 100%ig, jedoch bei der verfügbaren Auflösung wesentlich zuverlässiger als ein klassischer OCR und ausreichend um ein paar Kurven zu zeichnen. Derzeit werden etwa 80-90% der Captures erkannt. Die meisten Fehler kommen durch ungünstiges Timing – wenn die Kamera eine Aufnahme macht während die LED-Anzeige gerade aktualisiert kommt es zu halben Zahlen.

Bild: https://adlerweb.info/blog/wp-content/uploads/2014/08/Unbenannt.png