Linux (wiki) als Operating Systeem voor de PC in de robot is om diverse redenen geschikt. Linux is licentievrij en het sluit naadloos aan op de hardware. Alhoewel ik vaak met Linux werk en deze beschrijving dus ook over Linux gaat kunnen de meeste elementen ook onder Windows worden geïnstalleerd. Binnen Linux kan worden gekozen uit verschillende distributies (distrowatch). Ik heb hier gekozen voor Ubuntu (home) omdat het gratis, simpel en snel is. Het is met de installatie cd of USB stick bovendien makkelijk te testen zonder iets aan uw Windows computer te veranderen of te installeren.
- Seriële poorten vrijgeven
|
Seriële poorten worden onder Linux gezien alsof het bestanden zijn van het soort /dev/ttyUSB0. Zij hebben daardoor ook Permissions en Eigenaren etc. Als je een python3 programma start als sudo dan zullen de poorten openen, maar niet als gewone user.
dmesg | grep ttyU laat alle mogelijke seriële poorten zien.
ls -l /dev/ttyUSB0 laat per seriële poort benodigde instellingen zien, waaronder de group.
sudo usermod -a -G dialout richard voeg de gebruiker toe die de seriële poort altijd mag gebruiken.
Vergeet niet dat je moet rebooten voordat een wijziging in groepen daadwerkelijk plaatsvind. Je kunt het daarna bekijken met groups.
|
- Ubuntu installatie
|
- Ubuntu flavours
- Desktop
De standaard cliënt Ubuntu installatie.
- Studio
Ubuntu Studio (homepage) is te afwijkend in zijn algemene systeem sturing. Er bestaan ook nauwelijks tutorials voor. Lijkt ook veel minder compleet voor dat werk. Gaf ook geen verrassende resultaten op het gebied van muziek of video maken. Kan er zelfs geen bootable USB stick mee maken. Het zou bijzonder snel moeten zijn ivm midi, maar ook Desktop Ubuntu is al ruim snel genoeg op een beetje aardige hardware om goed met muziek om te gaan. Omdat deze laptop ook wordt gebruikt voor mobiel muziek componeren is Ubuntu Studio geïnstalleerd.
- Ubuntu installatie
Alle flavours worden op dezelfde manier geïnstalleerd.
- Het installatieprogramma moet in ons geval op een USB stick worden gezet van minimaal 4Gb (Windows tutorial of Ubuntu tutorial). Om van een USB geheugen stick te kunnen booten moet tijdens het opstarten van een laptop meestal op F12 worden gedrukt.Kies in dat menu voor UEFI en je krijgt het installatiemenu. Vervolgens kan in het bios worden gekozen uit de locatie van booten.
- Zorg dat u een up-to-date bios heeft. Upgraden is makkelijker in deze fase dan in een latere fase.
- . Ubuntu (wiki, homepage) heeft een eigen tutorial voor de installatie.
- Aandachtspunten tijdens de installatie:
- Voor een server kies ik voor een LTS versie om te installeren van de Ubuntu website, maar voor een cliënt kies ik meestal voor de meest recente versie.
- Als bestandssysteem wordt ext4 genomen door de installer.
- Apache open office wordt automatisch meegeïnstalleerd.
- Na de installatie volgt er een uitgebreide update.
- Voor de geïnstalleerde release van Ubuntu kijk met: lsb_release -a
|
- Hoe werkt apt?
|
Advanced Package Tool oftewel APT (wiki) is een heel handige tool van Debian als je pakketten wilt installeren of onderhouden wat niet via het software menu kan. Ubuntu uitleg, Debian uitleg.
|
- Dual booting
|
Dual booten met Windows 10 is geen enkel probleem. Dit kan vooral handig zijn als een computer voor meerdere taken moet worden gebruikt, zoals bijvoorbeeld Karma. Installeer altijd eerst Windows en dan pas Linux. Dual booten wordt geregeld door het instellen van partities, oftewel het verdelen van uw harde schijf. Dit gebeurt tijdens de installatie. Grub zal standaard Linux opstarten, maar voor mijn muzikanten laptop is het handiger om standaard naar Windows10 te booten:
- Wijzigen boot parameters
Open een terminal en doe daar:
sudo gedit /etc/default/grub
Wijzig GRUB DEFAULT=0 in GRUB DEFAULT=4. Vervolgens opslaan en activeren met:
sudo update-grub
|
- LAPP
|
LAPP (wiki) is een welbekend acroniem voor een combinatie van een set programma’s die onder Linux veel wordt gebruikt en volledig met elkaar zijn geïntegreerd. Het acroniem staat voor:
Linux (wiki), wij gebruiken Ubuntu. Wordt verder op deze pagina behandeld.
Apache2 (wiki) is onze webserver. Zie verder op eigen pagina.
PostgreSQL (wiki) is onze database. Zie verder op eigen pagina.
Php (wiki) is een server-side script taal voor webpagina`s. Zie verder op eigen pagina.
Secure server (wiki) is een server-side beveiligings protocol Zie verder op eigen pagina.
Met deze set programma’s heeft u een basisinrichting voor een Linux server of cliënt. Wij voegen er nog diverse programma`s aan toe:
Python3 (wiki), een programmeertaal. Zie verder op eigen pagina.
PgAdmin4, database beheer server. Zie verder op eigen pagina.
Ftp, File transfer server. Zie verder op eigen pagina.
Email server. Zie verder op eigen pagina.
Gebruikersprogramma`s, zoals GIMP. Zie verder op eigen pagina.
Internet veiligheid. Zie verder op eigen pagina.
Al met al is ons acroniem dus meer UAPPPPFEGI dan LAMP. Volg de links onder aan de pagina om een complete set-up uit te voeren.
|
- Firewall UFW
|
Ubuntu installeert als firewall ufw (toelichting). Ufw wordt wel automatisch meegeïnstalleerd, maar het is standaard disabled. Er bestaat een gui (Gufw) die simpel uit het software centrum kan worden geïnstalleerd.
ufw version
sudo ufw app list
sudo ufw status
sudo ufw enable
sudo ufw disable
sudo ufw allow OpenSSH
|
//This is an include, so no parsing needed
$qry2 = ("SELECT onderdelen.*,
soortonderdeel.id
FROM onderdelen
JOIN soortonderdeel ON onderdelen.idsrtodd = soortonderdeel.id
WHERE onderdelen.partid = $idpart
;");
$result2 = pg_query($con1, $qry2);
$row4 = pg_fetch_array($result2); //Make the fields accesible
foreach( $row4 AS $key => $val ){
$$key = stripslashes( $val );
}
$jaar = substr($changeddate,0,4);
$maand = substr($changeddate,5,2);
$dag = substr($changeddate,8,2);
$lastupdate = ("$jaar $maand $dag");
$prtsrttxt = get_txt($con1, 26, 1, $idsrtodd);
$jaar = substr($createddate,0,4);
$maand = substr($createddate,5,2);
$dag = substr($createddate,8,2);
$create_stamp = ("$dag $maand $jaar");
//GENERAL INFO FOR EVERY USER **************************************************
echo (" ");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3923); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo (" (edit)");
}
echo ("Algemene informatie test | ");
if ($codetext) { //Code like KY-026 or NA-41
echo ("");
$tmp = get_txt($con1, 9, $koekje[2], 3739); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //Class for colour
}else{ //So you are not allowed to translate
echo $tmp; //Show screenname of this field in user language
} //End of If you want to translate this fieldname at screen
echo ("  | ");
if ($codelink) {
echo ("$codetext");
}else{
echo ("$codetext");
} //End of if ($pinoutlink)
echo (" | ");
} //End of if ($codetext)
$tmp = get_txt($con1, 9, $koekje[2], 3741); //Fieldname at screen
if ($prijseurinclbtw > 0){ //Show price indication
$prijs_formatted = number_format($prijseurinclbtw / 100, 2, ',', '.');
echo ("$tmp   | ");
echo ("");
if ($urlprijs){
echo ("€  $prijs_formatted");
}else{
echo ("€  $prijs_formatted");
} //End of if ($urlprijs > "")
echo (" | ");
} //End of if ($prijseurinclbtw > 0)
if ($sketchtext) { //Link to OWN SOFTWARE
$tmp = get_txt($con1, 9, $koekje[2], 3738); //Fieldname at screen
echo ("$tmp   | ");
if ($sketchlink) {
echo ("$sketchtext");
}else{
echo ("$sketchtext");
} //End of if ($sketchlink)
echo (" | ");
} //End of if ($sketchtext)
$tmp = get_txt($con1, 9, $koekje[2], 3744); //Fieldname at screen
if ($pinouttext) { //Pinout
echo ("$tmp   | ");
if ($pinoutlink) {
echo ("$pinouttext");
}else{
echo ("$pinouttext");
} //End of if ($pinoutlink)
echo (" | ");
}
$tmp = get_txt($con1, 9, 1, 3735); //Fieldname at screen
$tmp2 = get_txt($con1, 26, 1, $row4[16]); //Group name in its language
echo ("$tmp   | "); //MENU GROUP
echo ("");
echo ("$tmp2 | ");
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
$tmp = get_txt($con1, 9, $koekje[2], 3918); //Fieldname at screen LANGUAGE
if ($row4[26] == 1) {$imgname = "nederland.png";}
if ($row4[26] == 2) {$imgname = "deutschland.png";}
if ($row4[26] == 3) {$imgname = "uk.png";}
if ($row4[26] == 4) {$imgname = "france.png";}
echo ("$tmp | ");
echo ("");
echo (" | ");
$tmp = get_txt($con1, 9, $row4[27], 3919); //Fieldname at screen
$statuskey = get_status_key($con1, $status);
$tmp2 = get_txt($con1, 61, $koekje[2], $statuskey); //Fieldname at screen
echo ("$tmp   | "); //STATUS
echo ("$status $tmp2 | ");
}
$tmp = get_txt($con1, 9, 1, 3966); //Fieldname at screen
echo ("$tmp   | "); //LAST CHANGED
$tmp = substr($changeddate, 0, 10);
echo ("$tmp | ");
echo (" ");
return;
////////////////////////////////////////////////////////////////////////////////
function get_status_key($con, $num){
$qry = ("SELECT id FROM status WHERE nr = $num ;");
$result = pg_query($con, $qry);
$row = pg_fetch_array($result);
return ("$row[0]");
}
// LIST ALL SOFTWARE THAT WILL RUN OM THIS PART *****************************
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry2=("SELECT tblsystext.txtname
, software.urlmain
, software.sftname
, software.sftid
, software.controller
FROM software
LEFT JOIN tblsystext ON software.controller = tblsystext.recordid
WHERE position(' $idpart ' in software.prtlst) > 0
AND software.rstid = 2
AND tblsystext.lanid = $koekje[2]
AND tblsystext.txlid = 19
ORDER BY sftname ASC
, controller ASC
;");
$result = pg_query($con1, $qry2);
if (pg_num_rows($result)>0) { //Only if at least 1 program exists
echo (' ');
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3922); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" |
---|
");
while($col = pg_fetch_array($result)){
$col[0] = ("$col[0]");
echo (" ");
echo ("$col[2]   | ");
echo ("$col[0] | ");
if ($koekje[0] > 0 and $koekje[3]>0){ //User is logged in and translates
echo ("");
echo ("(Edit) | ");
}
echo (' ');
}
echo (' ');
}
?>
// LIST ALL ROBOTS THAT INCLUDE THIS PART ***********************************
// $idpart
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry_bpp=("SELECT farmbotversie.id
, farmbotversie.part_list
, tblsystext.txtname
FROM farmbotversie
LEFT JOIN tblsystext ON farmbotversie.id = tblsystext.recordid
WHERE tblsystext.txlid = 27
AND tblsystext.lanid = $koekje[2]
ORDER BY tblsystext.txtname ASC
;");
$result_bpp = pg_query($con1, $qry_bpp);
$header = 0;
while($colbpp = pg_fetch_array($result_bpp)){ //Only if at least 1 robot exists
if(substr_count($colbpp[1], " $idpart ") > 0){
if ($header == 0) {
echo ("");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3879); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" | ");
$header++;
} //End of if ($header == 0)
echo ("");
echo ("$colbpp[2]");
//Show software van deze bot
$qry=("SELECT software_basedir
FROM farmbotversie
WHERE id = $colbpp[0];");
$result = pg_query($con1, $qry);
$col = pg_fetch_array ($result ,0);
$dir1 = "/var/www/html/robotigs/software/$col[0]";
$arr1 = glob($dir1, GLOB_ONLYDIR);
if (isset($arr1[0])){
$folder = $arr1[0];
$countertmp = 0;
echo ("");
foreach (scandir($folder, 1) as $filename) {
if ($filename<>"." AND $filename <>".."){
if ($countertmp == 0){
$countertmp++;
} //End of if ($countertmp == 0)
$tmp = "/";
$dir = substr($folder, 14) ."/";
$link = $tmp .$dir .$filename;
$showname = substr($filename, 0 ,-4);
echo ("- ");
echo "$showname";
echo ("
");
} //End of if ($filename<>"." AND $filename <>".."){
} //End of foreach (scandir($folder, 1) as $filename)
echo ("");
} //End of if (isset($arr1[0]))
echo (" | ");
}
}
if ($header > 0){
echo (" ");
}
?>
Warning: include(/var/www/html/robotigs/includes/wishlistperpart.php): Failed to open stream: No such file or directory in /var/www/html/robotigs/includes/parts_header.php on line 128
Warning: include(): Failed opening '/var/www/html/robotigs/includes/wishlistperpart.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/robotigs/includes/parts_header.php on line 128
| //Location:/robotigs/includes/ picts_show.php
// Requieres: $pict_list and several picture handling javascript routines
//*** FROM HERE ON THE PICTURE CORNER STARTS -----------------------------------
if ($pict_list){ //There are 1 or more pictures to be printed
echo ("");
$counter = 0;
$aantal = str_word_count($pict_list, 0, "0123456789");
$lijst = str_word_count($pict_list, 1, "0123456789");
while($counter < $aantal){
$pictkey = $lijst[$counter];
$qryy1 = ("SELECT *
FROM illustrations
WHERE ill_id = $pictkey
;");
$resulty1 = pg_query($con1, $qryy1);
while($row = pg_fetch_array($resulty1)){ //Fields accesible by their name
foreach( $row AS $key => $val ){
$$key = stripslashes( $val );
}
}
$image = ("/robotigs/documentatie/plaatjes/$ill_name");
$pictfull = str_replace('_small', '', $image); //Pictfull=biggest version
$alt = ("Just wait till your 57....");
$txtname = get_txt($con1, 18, $koekje[2], $ill_id); //Robot illustrations subtitles
echo ("");
echo (' ');
$nummer = $counter + 1;
$txtAfb = get_txt($con1, 9, $koekje[2], 3865); //Pic Afb
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo ("$txtAfb $nummer: ");
echo ("$txtname");
echo (" ");
echo ("Ontkoppelen ");
if ($counter==0){
echo ("Up ");
}else{
echo ("Up ");
}
if ($nummer == $aantal){
echo ("Down");
}else{
echo ("Down");
}
}else{ //Else of if Meaning the current useer is logged in
echo ("$txtAfb $nummer: $txtname");
}
echo (''); //End of this picture
$counter++; //Prepair for next picture
}
echo (' | '); //All pictures are printed
} //End of if there are 1 or more pictures to be printed ----------------------
?>