Näytä kirjoitukset

Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.


Viestit - Mistofelees

Sivuja: [1] 2 3 ... 29
1
Tämä on nyt pyörinyt 20 tuntia ongelmitta. En viitsi palauttaa edellistä tilannetta vain testauksen takia. Tämän kanssa on nyhrännyt niin monta päivää, että pitää jo päästä seuraavan projektin kimppuun.

2
Itsellä DDNS:n korvasi monet vuodet oma scripti, joka lähetti minulle sähköpostissa kodin uuden IP:n, jos ISP päätti muuttaa sitä.
Vieläkin se on varajärjestelmänä, mutta käytän silti pääosin kuitu-reitittimen valmistajan tarjoamaa DDNS:ää.
Oma http-sivusto on reitittimen DMZ:lla, josta ei ole pääsyä taloon sisälle. Taloon pääsee vain ssh:lla ja siinäkin on fail2ban koputtelijoiden kiusana.

3
Pistin C:n kiertämään ikuisuuskehää.
Ei tarvinnut tietokantaa, kun ohjelma tallettaa $GPRMC-lauseen tmpfs:llä olevaan tiedostoon ja pistää tiedoston pointterin heti takaisin rivin alkuun rewind-komennolla.
Tämä on nyt pyörinyt toistakymmmentä tuntia, vaikka nostin prosun nopeuttakin

Pistää miettimään, mihin kerneli kompastui, kun scripti kutsui C:llä kirjoitettua ohjelmaa toistuvasti tuhansia kertoja

Koodia: [Valitse]

  do{    // Ikuisuussilmukka:
    do {
      len=0;
      line[0]='\0';
      do{  // Luetaan lausetta portista. Max pituus 88mrk
        c=serialGetchar(usart);
        if ((35<c)&&(c<90)&&(len<88)){  // Rajataan merkistöä ja pituutta
           strncat(line, &c, 1);
           len++;
        }
        if (len>87){
           line[0]='\0'; len=0;   // Tuli roskarivi, liian pitäkä.
        } 
      }while(c!=10);       // Kierretään rivin loppuun asti:
    }while(strncmp("$GPRMC",line,6)!=0);     // Kierretään, kunnes on saatu $GPRMC-rivi haaviin:
    uline[0]='\0';       // Tyhjennetään array:
    memmove(uline, line+7, len); // $GPRMC pois lauseen alusta
    rewind(fout); // pointteri tiedoston alkuun. Tulostetaan samalle riville
    fputs(uline, fout);
  }while(1);   // Ikuisuussilmukka ei katkea normaalikeinoin, closet ovat turhat

4
Olen tässä yrittänyt keksiä tapoja rautavikojen selvittmiseen.
Pitää seuraavaksi siirtää /var/log tmpfs:ltä muistikortille. Useampiakin muistikortteja on jo kokeiltu.
Pitää myös tehdä dummy ohjelma, joka vaan kiertää kehää.

5
Tuota pitää varmaan kokeilla. En tosin tietokantojen kanssa, vaan vaikka normaalin lineaarisen tiedoston.
Kokeilinkin jo sitä, että gps tulosti suoraan tiedostoon tmpfs:llä ja se tuntui toimivan hyvin, joten siirryin käyttämään wait komentoa.

Systeemi kaatui taas hetki sitte, joten wait ei auttanut. Sattumalta llaite oli töllössä kiinni ja sain kaapattua kameralla virheilmoituksen:
-"INFO: rcu_sched detected stalls on CPUs/tasks"
Kuukkeli kertoi, että tämä saattaa olla kernelin ongelmia:

Linux-image-current-sunxi=21.08.2,  5.10.60-sunxi
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"

Koneena on Orange Pi Lite, joten jakeluna on Armbian 21.08.1

6
Nuo eivät ole ympäristömuuttujia, vaan bash scriptin muuttujia, jotka annetaan syötteinä tuolle C-kieliselle ohjelmalle.
Jos tuon haluaisi ajaa suoraan komentoriviltä, pitäisi tietenkin antaa muuttujille ensin arvoja.

En kyllä väitä, että ympäristömuuttujatkaan olisivat aivan hanskassa, koska en yleensä tarvitse kuin muutamia.

Tuo systeemin crashi kyllä ihmetyttää. Se ei ilmeisesti voi johtua pid:n ylivuodostakaan. Eiköhän Linux sentään osaa pyöräyttää pid:n takaisin nollille, kun yläraja tulee vastaan ?

Sain juuri kaapattua kameralla virheilmoituksen, joka kuitenkin oli niin kryptinen, että menee hetki, ennenkuin pääsen sitä purkamaan.

7
Olen kirjoitellut ohjelmistopakettia, joka veneessä ja matkailuautossa kerää esim paikkatietoa, esittää sen paikallisesti kulkuneuvon serverin omilla nettisivuilla ja lähettää kotiserverille. Vekottimessa on näyttölaitteena 4x20 I2C LCD.

Data lähetetään LCD:lle omatekoisella C-kielisellä ohjelmalla (  ./LCDtulosta clr "$D $T UTC"@1,1 "LAT: $lat"@2,1 "LON: $lon"@3,1 )
GPS:ää luetaan omatekoisella C-kielisellä ohjelmalla, joka printtaa $GPRMC -lauseen.

Sitten alkoivat ongelmat.
Systeemi kaatui ja kone meni jumiin epäsäännöllisesti 5min - 12h ajon jälkeen. BASH:n rajallisilla työkaluilla syyn löytäminen oli todella hankalaa.
Epäilin jo muistikortteja, prosessoria ja virtalähdettäkin.

Tämä auttoi hieman, tällä pääsi näkemään, missä kone kaatui:
trap 'echo "Vika rivillä $LINENO" >> /home/bin/i2cLCD/testi.txt' ERR
samaten pitkin scriptiä sirotellut echo "Ax">>/home/bin/i2cLCD/testi.txt -lauseet

'timeout' GPS:ää kutsuvalla rivillä auttoi selviämään GPS:n jumeista

Lopullinen ratkaisu suorastaan hävettää.
- Pistetään GPS työntämään tulostuksensa tiedostoon (tiedosto tietenkin tmpfs:llä !)
- Ajetaan C-ohjelmia taustalla ('&'), jotta niistä saadaan puristettua PID
- Pistetään scripti odottamaan GPS-ohjelman kypsymistä
- Haetaan tiedostosta rivi ja jatketaan

Kaikkine roskineenkin scriptin pyörähdykseen menee n. 2 sek, joten LCD:lle tulostuskin voidaan pistää taustalle '&'. I2C LCD:n ruudun täyttämiseen menee n. 1 sek.

Scripti ja C-ohjelmat itsessään ovat niin pitkät, etten viitsi niitä pistää tähän, mutta tässä on tarjolla mekanismi, jolla GPS:n lukeminen tuntuu onnistuvan
Koodia: [Valitse]
      timeout 3 /home/bin/i2cLCD/gps >$TMPFILE &
      pid=$!
      wait $pid
      read uline < $TMPFILE

Seuraava murhe on siinä, mitä tapahtuu, kun PID:n arvo kasvaa yli naapurin aidan. Osaako systeemi aloittaa PID-laskurin nollasta, vai tuleeko overflow ?

8
Kiitos !

Bash on niin täynnä omituisia koukeroita, että olen usein toivonut, että m$ ja *n?x olisivat ottaneet komentotulkiksi  Basic:n.
TAI että olisin itse ottanut aikojen alussa csh:n käyttöön.
Nyt ei viitsisi enää vaihtaa, koska servereillä ja pöytäkoneissa on jo satoja bash:lla kirjoitettuja scriptejä.

9

En löydä mistään tietoa C:n kielletyista komentoriviargumenteista.
'$' argumentin ensimmäisenä merkkinä ei toimi.
Jos '$' on keskellä sanaa, se ja loppusana katoavat

Onko joku temppu, jolla C:n saisi hyväksymään dollarimerkin komentorivillä ?
'$GPRMC ' on selkeämpi parametri, kuin 'GPRMC'


10
Kiitos. Mielenkiintoista päästä tutkimaan Pythonilla kirjoitettua koodia, Siitä on akaa, kun viimeksi olen Pythonia käyttänyt.
Tämä C lähti liikkeelle siiitä, kun kirjoitin OrangePi:lle C-pätkän, joka tulostaa suoraan 4-riviselle I2C LCD-näytölle. Tuli himo kokeilla C:tä muutenkin.

11
Kiitos korjauksesta. Käänsin ja pistin kestotestiin.
Itselleni C on vieras kieli.

10 min ajon aikana tuli neljä timeout:a ja sitten koko kone meni jumiin, eikä vastaa mihinkään. Ei edes ping tai ssh.
IVO-boot auttaa.

Vika ei ole tekemässäsi korjauksessa, vaan jossain muualla järjestelmässä.
Tämä kone ei muuten jumittele, mutta tämä sarjaportin luku on sille liikaa.

Tässä on itsellä sellainen ongelma, että käyttämäni GPS-moduli sylkee satunnaisesti röykkiöittäin roskaa.
Moduli olisi muuten nepea ja tarkka, joten en viitsisi luopua

Mielestäni pistin tälle palstalle toisen version ohjelmasta. Siinä sarjaporttia luetaan merkki kerrallaan. Sitä ei nyt kuitenkaan näy missään.

12
Tuota timeouttia olen kasvatellut eri tavoin.
Tässä on tuon C-kielisen osan sorsat

Koodia: [Valitse]
#define TERMINAL    "/dev/ttyS2"
#define FALSE 0
#define TRUE !(FALSE)

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
/**********************/
int set_interface_attribs(int fd, int speed){
    struct termios tty;
    if (tcgetattr(fd, &tty) < 0) {
        printf("Error from tcgetattr: %s\n", strerror(errno));
        return -1;
    }
    cfsetospeed(&tty, (speed_t)speed);
    cfsetispeed(&tty, (speed_t)speed);

    tty.c_cflag |= (CLOCAL | CREAD);    /* ignore modem controls */
    tty.c_cflag &= ~CSIZE;
    tty.c_cflag |= CS8;         /* 8-bit characters */
    tty.c_cflag &= ~PARENB;     /* no parity bit */
    tty.c_cflag &= ~CSTOPB;     /* only need 1 stop bit */
    tty.c_cflag &= ~CRTSCTS;    /* no hardware flowcontrol */

    /* setup for non-canonical mode */
    tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
    tty.c_lflag &= ~(ECHO | ECHONL | ISIG | IEXTEN);
    tty.c_oflag &= ~OPOST;

    /* fetch bytes as they become available */
    tty.c_cc[VMIN] = 50;
    tty.c_cc[VTIME] = 3;

    if (tcsetattr(fd, TCSANOW, &tty) != 0) {
        printf("Error from tcsetattr: %s\n", strerror(errno));
        return -1;
    }
    return 0;
}
int main(){
    char *port = TERMINAL;
    int fd;
    unsigned char c;
    unsigned char line[120];
    unsigned char temp[120];
    unsigned char jatkuu=1;
    unsigned int len;

    fd=open("/dev/ttyS2",O_RDONLY);
    if (fd < 0) {
        printf("Error opening %s: %s\n", port, strerror(errno));
        return -1;
    }
    /*baudrate 9600, 8 bits, no parity, 1 stop bit */
    set_interface_attribs(fd, B9600);
    do {
        len = read(fd, &line, sizeof(line));
            if(strncmp("$GPRMC",line,5)==0){
                jatkuu=0;
                // Leikataan alusta 7 merkkiä ja lopusta 8 merkkiä:
                memmove(temp, line + 7, len -7-5 + 1);
                printf("LEN=%d %s\n",len,temp);
            }
       
    } while (jatkuu);
    close(fd);
}

13
Kirjoitin Bash:lla kevyen scriptin, joka kutsuu toistuvasti C:llä kirjoitettua ohjelmaa 'GPS'
'GPS lukee sarjaportissa olevan GPS:n lähettämää tekstivirtaa, poimii siitä $GPRMC-lauseen, tulostaa sen ja poistuu.

Scripti pyörii 5 - 20 kierrosta. jonka jälkeen se jämähtää.
Vika on kirjoittamassani 'GPS'-ohjelmassa ja tarkemmin sen lukulauseessa
int n = read(fd, &line, sizeof(line));

Onko jotain tapaa, millä näkisi, mikä on vikana ? muistin ylivuotoja, tms

Olen kirjoittanut tuon GPS ainakin sata kertaa uudestaan eri rakenteilla

Scripti on vain testausta varten:
Koodia: [Valitse]
#!/bin/bash
lkm=0
while true; do
   ./gps;   lkm=$((lkm+1));   echo "lkm=$lkm"
done

14
Laitteessa ei välttämättä ole lainkaan screeniä, näppistä eikä hiirtä kiinni.
Kotipurkin äärestä poistuessa sen pitäisi ottaa auton tai veneen reititin käyttöön. Veneeltä poistuessa pitäisi siirtyä auton retittimelle.
Varsinainen roaming on turhaa, vaikka mukava sekin tietenkin olisi, jottei tiedoston siirto katkeaisi.

15
Valitan, että hieman viipyi.

Tarkoitus on siirtää konetta kodin, asuntoauton ja veneen välillä. Jokaisessa näistä on oma GSM-reitittimensä, joiden nimet ja IP-osoitteet poikkeavat toisistaan.

16
Lunttilappu on mukava, kun tietää komennon nimen vanhastaan, muttei muista syntaksia tai parametrejä.

Itse kaipaisin puhdasta lineaarista tiedostoa, jossa olisi käskyt akkosjärjestyksessä, lyhyt selitys niiden toiminnasta ja yksinkertainen esimerkkilause. Ei mitään uutta asennettavaa ohjelmaa, vaan tiedosto, johon voisi itse lisätä omia kommenttejaan.

Nykyisin, kun hakee Kuukkelilla sopivaa työkalua, joutuu joko plaraamaan eipäs-juupas-keskusteluja erilaisilla forumeilla tai php:n kaltaisia opassivuja, joissa on mopo päässyt karkuun ja esimerkkeinä on monen sivun sekamelskoja, joista ei asia selviä.

17
Miten Linuxin saa siirtymään voimakkaimmalle reitittimelle ?

Tarkoitus on kasata kannettava Linux-kokoonpano, jota siirretään eri reitittimien vaikutusalueelle.
Reitittimet, niiden SSID ja salasanat ovat tiedossa, joten ne voisi kirjoittaa listaan, josta kone valitsisi parhaan.

Missä yleensäkin on kirjattuna käytetyn reitittimen tiedot ?
Jollei löydy mitään valmista, voisin keittää kasaan oman scriptin.

18
ONGELMA RATKESI SAMAN TIEN. Minulla oli kirjoitusvirhe runuser-komennossa.
Jätän tämän kuitenkin tänne varoittavaksi esimerkiksi ;)

crontab kutsuu lyhyttä scriptiä, joka ensin muokkaa hieman dataa ja paiskaa sen sitten serverille, jossa se liitetään (append) lokitiedoston loppuun.
Scripti kutsuu wiringop:n ohjelmia, jotka vaativat rootin oikeudet
Scp käyttää käyttäjätunnusta, joka on sama molemmissa koneissa.
SCP:n tunnistautumisessa käytetään public keytä.
SCP-komento toimii ilman salasanaa, jos sitä ajetaan käyttäjän oikeuksin.
Kun scriptiä ajetaan roottina, ohjelma kysyy käyttäjän salasanaa.
Scriptiä on pakko ajaa roottina, koska LCDtulosta sisältää kutsuja wiringop ohjelmiin.

Miten bash scriptin sisällä saisi tuon scp-rivin ajettua ilman salasanakyselyä ?

Tiivistelmä scriptistä:
Koodia: [Valitse]
#!/bin/bash
declare -a arr
NowC=$(date +"%H:%M")
IP=$(hostname -I)
IP=$(echo -n "${IP//[[:space:]]/}")
while true; do
   IFS="," read -r osoite line < /dev/ttyACM0
   if [[ $osoite == '$GPRMC' ]]; then
       uline=${line%?}
       set -f; IFS=','; arr=($uline)
      break
   fi
done
$(/home/bin/wiringop/i2cLCD/LCDtulosta clr $NowC@1,10 "LAT: ${arr[2]}"@2,1 $IP@4,1)
runuser -l -c "echo $uline | ssh luuseri@omaserveri 'cat - >> /home/luuseri/Sijainti/vaunu.txt' "

Tuo LCDtulosta on omatekemä C-kielinen ohjelma, joka tulostaa annetut merkkijonot LCD:lle annettuihin kohtiin. Ohjelma kutsuu wiringop -kirjastoja. Koneena on OrangePi Lite.

19
Ubuntu tietokoneissa / Vs: Onedrive, tilin vaihto?
« : 10.02.21 - klo:16.59 »
Itsellä on Onedrivessa perheen käytössä HOME-sopimuksella 6kpl 1TB varmuuskopioituja levareita yhteensä 99€/y sopi meidän käyttöömme. Vastaavan raudan asentaminen kotiserverille olisi sekin maksanut jotain: vähintään 18 1TB levaria maksaa jotain ja kuluttaa sähköä. Jos yhden levarin kulutus olisi vaikkapa 5W, olisi kulutus 90W. Vuodessa 788 kWh. Jos kWh maksaa 0.10€, olisi hinta 78€ + siirtokulut. Levarin käyttöiäksi voi laskea 5v, ja hinta n. 50€/kpl, joten rauta maksaa n. 180€/y. Kaikkineen tämä olisi tullut maksamaan siis 238€/y raudasta koottuna. Säästöä siis 139€/y.
Toki kotiserverissäkin on oma backup-järjestelmänsä, mutta siinä on liikaa epävarmuustekijöitä.

rclone täytti kaikki tarpeeni hieman viriteltynä. Linuxin onedrive sopisi paremmin toisenlaiselle käyttäjälle, jolla kone on käytössä 8/5 tai 8/7

Tein rclonea varten scriptin läppäriin. Se on vielä hieman vaiheessa, mutta alustavasti näyttäisi toimivan mukavasti.
Kuten näkyy, olin sen verran laiska, että jaoin varmuuskopioitavat materiaalin kolmeen komentoon. Näin tätä on mielestäni helpompi hallita.
Scripti on /home/bin hakemistossa, koska läppärissä ja serverissä / on ssd-levyllä, joka on käytännössä kirjoitussuojattu.

Koodia: [Valitse]
#!/bin/bash
rclone sync /home/bin Omalevy:/Musta/bin --filter-from /home/bin/rclone/bin_clone.txt
rclone sync /home/misty/Documents Omalevy:/Musta/Documents --filter-from /home/bin/rclone/doc_clone.txt
rclone sync /home/misty/Arduino Omalevy:/Musta/Arduino --filter-from /home/bin/rclone/ardu_clone.txt

Esimerkkinä tuo Ardu_clone.txt -filtteritiedosto ardu_clone.txt:

Koodia: [Valitse]
# rclonen käsittelylista
# '+' include
# '-' exclude
# '**' recursive
# Roskatiedostot:
- *~
- *.tmp
- tmp.*
# hakemiston exludaus:
- /MyApp_1/

Tätä scriptiä ajan käsin. Kotiserverille tulee vastaava crontabin ohjaamaksi

20
Ubuntu tietokoneissa / Vs: Onedrive, tilin vaihto?
« : 08.02.21 - klo:00.32 »
Turhaa optimismia.
Hetken aikaa järjestelmä toimi, kuten toivoin. Nyt se taas lataa väärältä tunnukselta tavaraa läppäriin, vaikka selaimessa on selvästi se aktiivina, jonka haluan. .
Eikö tälläiseen ohjelmaan olisi voitu pistää argumenttia, jolla olisi voinut kertoa, millä tunnuksella toimitaan ?
Yleisestikin hyvin umpimielinen ohjelma, jossa käyttäjän vaikutusmahdollisuudet on puristettu alle minimin.

Kyllästyin ja asensin rclonen. Sen asennuksen ajaksi kannattaa nämmä kirjautua ulos hotmailista.

Sivuja: [1] 2 3 ... 29