Category Archives: Computer

My first raspberry Pi

Today i got my first Raspberry Pi!

Many followed

The first-generation Raspberry Pi Model B was released in February 2012, followed by the simpler and cheaper Model A.

Later i bought the Pi2, Pi3, Pi4 and the Zero’s

I like the little buggers! I’ve used them for many projects.

Aloha gave me a banana pi to try, and i’ve tried the orange pi.

Aparantly i already registered at the raspberry store 2012-02-14.
28 of May i got a “activation code” to order

Now (2023 .. all shops out of stock )

Web controller for Acdsee

UPDATE: 2023 It’s still working

I made a webcontroller for viewing images on a big TV.

Using a Acdsee instance with MCE Controller installed and a webserver.

https://tig.github.io/mcec/example_commands.html

Rate the picture 1-5, clear rating, slideshow start, escape, open/close image, zoom-in out and zoom-reset. Previous and next image fullscreen and delete/yes

Some used defined keys (see php file)

 if ($cmd=="I"){ $put="chars:+"; };
 if ($cmd=="O"){ $put="chars:-"; };
 if ($cmd=="R"){ $put="chars:*"; };
 if ($cmd=="Y"){ $put="chars:y"; };
 if ($cmd=="F"){ $put="chars:f"; };
 if ($cmd=="D"){ $put="delete"; };
 if ($cmd=="N"){ $put="right"; };
 if ($cmd=="P"){ $put="left"; };
 if ($cmd=="ENTER"){ $put="enter"; };
 if ($cmd=="ESC"){ $put="escape"; };

PHP Script for the buttons and creating the TCP packets for MCE.

<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js"></script>
<?php
  $ip           = "remoteserver";
  $port         = "5150";

if (empty($put)) $put = "";
if (empty($line)) $line = "";
$cmd=$_POST['cmd'];
 if ($cmd=="I"){ $put="chars:+"; };
 if ($cmd=="O"){ $put="chars:-"; };
 if ($cmd=="R"){ $put="chars:*"; };
 if ($cmd=="Y"){ $put="chars:y"; };
 if ($cmd=="F"){ $put="chars:f"; };
 if ($cmd=="D"){ $put="delete"; };
 if ($cmd=="N"){ $put="right"; };
 if ($cmd=="P"){ $put="left"; };
 if ($cmd=="ENTER"){ $put="enter"; };
 if ($cmd=="ESC"){ $put="escape"; };
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
    $task = send_cmd("$put", $fp);

 if ($cmd=="1" || $cmd=="2" || $cmd=="3" || $cmd=="4" || $cmd=="5" || $cmd=="0"){
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:ctrl", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("$cmd", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:ctrl", $fp);
  fclose($fp);
        };
if ($cmd=="S") {
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:alt", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("$cmd", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:alt", $fp);
  fclose($fp);
        };

 if ($cmd=="fnietF"){
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:shift", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:ctrl", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("$cmd", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:ctrl", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:shift", $fp);
  fclose($fp);
        };



//}
  echo "<html><head><title></title></head>";
  echo "<body><center><H1>";
$callself=$_SERVER['PHP_SELF'];
echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"1\"><input type=\"submit\" value=\"1\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"2\"><input type=\"submit\" value=\"2\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"3\"><input type=\"submit\" value=\"3\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"4\"><input type=\"submit\" value=\"4\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"5\"><input type=\"submit\" value=\"5\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"0\"><input type=\"submit\" value=\"Rate Clear\" /></form>\n";
echo "</div>";

echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"S\"><input type=\"submit\" value=\"SLIDESHOW\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"ESC\"><input type=\"submit\" value=\"ESC\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"ENTER\"><input type=\"submit\" value=\"OPEN/CLOSE\" /></form>\n";
  fclose($fp);
echo "</div>";

echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"I\"><input type=\"submit\" value=\"ZOOMIN\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"R\"><input type=\"submit\" value=\"ZOOMRESET\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"O\"><input type=\"submit\" value=\"ZOOMOUT\" /></form>\n";
echo "</div>";

echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"P\"><input type=\"submit\" value=\"PREV\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"D\"><input type=\"submit\" value=\"DEL\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"Y\"><input type=\"submit\" value=\"Y\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"F\"><input type=\"submit\" value=\"FULL\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"N\"><input type=\"submit\" value=\"NEXT\" /></form>\n";
echo "</div>";
  echo "</body></html>";
  function send_cmd($cmd, $fp){
    fwrite($fp, $cmd);
    fwrite($fp, "\n");
        return;
  }
?>

New shirts for our group “Prutsers”

Design made with Inkscape

Joke about this: Someone’s granny said: “Indeed prutsers .. 3 is far to hot for those shirts”

Prutser .. as used many times on this site.

Definitions of botcher. someone who makes mistakes because of incompetence. synonyms: blunderer, bumbler, bungler, butcher, fumbler, sad sack, stumbler. type of: incompetent, incompetent person.

Used in our context: Not serious about the things we create, fast fun and easy .. then we take it apart and make something else.

Using Graphviz and dot language to plot friends and family

I’ve been using the dotty language for many things, this is a who is who displayer.
iptables rules displayer, open ports, gluster brinks/nodes. netstat ports.,
Wil post more about this later


installing
apt-get install graphviz

View it on a website using mojozoom javascipt

demo : https://media.henriaanstoot.nl/websites/dotviewer/index.html

dot file example (changed names to protect the innocent)

           digraph G {
                size="960,960"
                graph [fontsize=16];
                node  [fontsize=16];
                ericewc [shape=diamond]
                notoasat [shape=diamond]
                rwke [shape=diamond]
                prtsu [shape=diamond]
                wkmre [shape=diamond]
                hsocol [shape=diamond]
                stm [shape=diamond]
                scoisenr [shape=diamond]
                lpetg [shape=diamond]
                ptoi [shape=diamond]
                nrnag -> rean;
                rean -> grrdea;
                rean -> kmoina;
                nrnag -> aabrrba;
                aabrrba -> edide;
                aabrrba -> taamra;
                wkmre -> renei;
                renei -> ilem;
                cpb -> mttne;
                cpb -> mhyme;
                ghnhlaid -> hsanvk;
                hsanvk -> mray;
                ghnhlaid -> erbnete -> kene;
                erbnete -> ebnno;
                erbnete -> hsan;
                erbnete -> anek;
                nehri -> hetctur;
                nlicoe -> hetctur;
                ueoqnim -> hetctur;
                hetctur -> aisovwkrs;
                aisovwkrs -> amnroa;
                aisovwkrs -> gioud;
                aisovwkrs -> aulra;
                rwke -> lemtcu;
                lemtcu -> rhary;
                lemtcu -> gmc;
                prtsu -> ico;
                prtsu -> hloaa;
                nehri -> prtsu;
           }

Making the graphics

dot -Tsvg -obig.svg goed.dot
#gs -q -dNOPAUSE -dBATCH -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=png16m -sOutputFile=big.png big.ps
convert big.svg big.png
convert -resize 800x800 big.png bigsmall.png

Onkyo web control hack

Back in 2009 i’ve posted my web controller for Onkyo in a forum.

Several people build on that source and made android/iphones app using this as example.

It uses pfsockopen with raw packets in php.
Spend a lot of work reverse engineering the tcp headers to be send.
Another fun trick was re-using a trick i’ve used for my ipcam controller and dartabase. (Dart game application)

Below a PDF with first page of forum

I’ve made a alteration in my logitechmediaserver (squeezebox server) which embedded a onkyo volume control part in the gui.

Volume Onkyo in LMS

Part of code

<?php
// :colorscheme elflord
// Henri Aanstoot
// Onkyo Reciever Web Interface 2009
// Version 0.6b - 23 Oct 2009
// EDIT THIS
$receiveripnumber="your.onkyo.ip.here";
$receiverlistenport="60128";
// maximum to set volume (0-100) 
// !! some have 64 max????
$volumemax=60;
// (i had to enable this port by going onto the menu's on my Onkyo
// ---- NO EDITING BELOW THIS LINE

// trick browser into staying on same page
$ibrowser = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone");
if ($ibrowser == false) {
header("HTTP/1.0 204 No Response");
}
// test write to file
//$fp=fopen("test.txt", "wb");
// write to Receiver 
$fp = pfsockopen($receiveripnumber, $receiverlistenport, $errno, $errstr, 30);
//get command from post form
$command=$_POST['cmd'];
//get volume if cmd is numeric
if(is_numeric($command)) 
 {
if ($command > $volumemax) { $command=$volumemax; }
echo $command;
  $vol=str_pad(dechex($command), 2, '0', STR_PAD_LEFT);
  $command="!1MVL$vol";
 }
// Calculate header and datapacket lengths
$length=strlen($command); 
$length=$length+1;
$total=$length+16;
$code=chr($length);
// total eiscp packet to send 
$line="ISCP\x00\x00\x00\x10\x00\x00\x00$code\x01\x00\x00\x00".$command."\x0D";
#fputs($fp,$line,$total);
// write
fwrite($fp, $line);
// rest status part
//    while (!feof($fp)) {
//        echo fgets($fp, 128);
//    } 

fclose($fp);

if ($ibrowser == true) {
print "<html>
<head>
<title>Sending Command...</title>`
<meta http-equiv=\"refresh\" content=\"0;url=index.php\">
</head>
<body></body>
</html>";
}

?>

List of command’s

header,Power
!1PWR00,Poweroff
!1PWR01,Poweron
header,Muting
!1AMT00,Audio muting off
!1AMT01,Audio muting on
!1AMTQSTN,Audio muting stat
header, Speaker A/B (Main/Front?)
!1SPA00,Speaker A Off
!1SPA01,Speaker A On
!1SPB00,Speaker B Off
!1SPB01,Speaker B On
header,Sound modus
!1LMD00,STEREO
!1LMD01,DIRECT 
!1LMD02,SURROUND
!1LMD03,FILM
!1LMD04,THX
!1LMD05,ACTION
!1LMD06,MUSICAL
!1LMD07,MONO MOVIE
!1LMD08,ORCHESTRA
!1LMD09,UNPLUGGED
!1LMD0A,STUDIO-MIX
!1LMD0B,TV LOGIC
!1LMD0C,ALL CH STEREO
!1LMD0D,THEATER-DIMENSIONAL 
!1LMD0E,ENHANCED 7/ENHANCE
!1LMD0F,MONO 
!1LMD11,PURE AUDIO 
!1LMD12,MULTIPLEX
!1LMD13,FULL MONO
!1LMD14,DOLBY VIRTUAL
!1LMD40,5.1ch Surround
!1LMD40,Straight Decode*1
!1LMD41,Dolby EX/DTS ES
!1LMD41,Dolby EX*2
!1LMD42,THX Cinema
!1LMD43,THX Surround EX
!1LMD50,U2/S2 Cinema/Cinema2
!1LMD51,MusicMode
!1LMD52,Games Mode
!1LMD80,PLII/PLIIx Movie
!1LMD81,PLII/PLIIx Music
!1LMD82,Neo:6 Cinema
!1LMD83,Neo:6 Music
!1LMD84,PLII/PLIIx THX Cinema
!1LMD85,Neo:6 THX Cinema
!1LMD86,PLII/PLIIx Game
!1LMD87,Neural Surr*3
!1LMD88,Neural THX
!1LMD89,PLII THX Games
!1LMD8A,Neo:6 THX Games
!1LMDUP,Listening Mode Wrap-Around Up
!1LMDDOWN,Listening Mode Wrap-Around Down
header,Input Selector
!1SLI00,VIDEO1    VCR/DVR
!1SLI01,VIDEO2    CBL/SAT
!1SLI02,VIDEO3    GAME/TV
!1SLI03,VIDEO4    AUX1(AUX)
!1SLI04,VIDEO5    AUX2
!1SLI05,VIDEO6
!1SLI06,VIDEO7
!1SLI10,DVD
!1SLI20,TAPE(1)
!1SLI21,TAPE2
!1SLI22,PHONO
!1SLI23,CD
!1SLI24,FM
!1SLI25,AM
!1SLI26,TUNER
!1SLI27,MUSIC SERVER 
!1SLI28,INTERNET RADIO
!1SLI29,USB
!1SLI30,MULTI CH
!1SLI31,XM*1
!1SLI32,SIRIUS*1
!1SLIUP,Selector Position Wrap-Around Up
!1SLIDOWN,Selector Position Wrap-Around Down

Staircase pictures

Maybe you also have a white area to fill, here is a suggestion.

For years we collected picture frames, weird and ugly.
We wanted to have a collection of images in our staircase, to fill the white area.
The images are all something we like, have interest in or are personal.

It needed to be on 3 walls, so here was my first design.

Around the corner picture frame i made

A joke my employer didn’t like

I worked for a highly secure position in a financial place.

We had to use so-called RSA keys.

These keys we needed to get access to the servers.

That morning i came in office and had the following conversation with the manager:

ME: It’s far too easy to lose my RSA key, so I left it at home.
Manager: So how are you getting any work done?
ME: Well … i can get the login codes from here, while opening a browser to a popular social site. Here is my webcam, pointing to my RSA key.
(For everyone to see)
Manager: …. blank stare
ME: Now i can access it from anywhere!
Manager: … buttt

I recorded the key, so it displayed only a few old codes.
(It was a looping animated GIF, which looked like a webcam picture)

When explaining he laughed. A two minute joke, two hours making it ..


Working on the NS train displays

Working to get the Dutch Railways Signs working.

I was working on the backend, but frequently was asked to help working on the boards.

I can’t post any other pictures, because they are revealing to much information

I’ve worked on the boards, backend and a peer2peer VPN solution

Restricted Content
To view this protected content, enter the password below: