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 ... 30
1
Kirjoitin php:llä ohjelman, joka kaivaa spottihinnan esille.
Ohjelma näyttää pitkältä, koska lisäsin siihen reilusti kommentteja
Jos testaat tätä, pistä tähän viestiketjuun kommentti, niin tiedän lisätä kommentteja.

Päivämäärien käsittely on vielä työn alla.

Koodia: [Valitse]
#!/usr/bin/php
<?php
/*******************************************************************************
 261122 PTMusta, "Mistofeles", cordite(at)outlook.com
 Jos jaat ohjelmaa eteenpäin, toivon, että yllä oleva puumerkkini säilyisi
 If you copy and modify this program, I hope you don&#39;t remove my namestamp above

 Ohjelma on tässä muodossaan testattu 
 Linux Mint 20.3 Una, 5.4.0-132-generic, php 7.4
 Ubuntu 22.04.1 LTS, 5.15.0-53-generic, php 8.1
 Toimii varmasti muissaskin Linux-versioissa ainakin pienin muutoksin
 M$:n käyttöjärjestelmäyritelmä on kokeilijan vastuulla

 Ohjelma hakee ENTSO-E-palvelimelta sähkön spot-hinnan
 Tätä varten pitää rekisteröityä ENTSO-E -järjestelmään ja anoa [u]security tagia[/u] ohjeiden mukaan sähköpostilla
 OHJEITA:
 https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html#_parameters
 https://transparency.entsoe.eu/content/static_content/download?path=/Static%20content/web%20api/RestfulAPI_IG.pdf
******************************************************************************************\
// Tulostetaan tämä ja huomispäivä
// Kellonajat ovat UTC

$alkaa=date(&#39;Ymd0000&&#39;);

$huominen = new DateTime(&#39;tomorrow&#39;);
$loppuu=$huominen->format(&#39;Ymd0000&&#39;);

//********OHJELMAN YDIN***************/
/
// Rakennetaan http-osoiterivi:
// (MUOKKAA riveille tuodaan päivämäärä)
$d1="https://transparency.entsoe.eu/api?";
// Pistä tähän oma Security tagisi (ota hakaset pois):
$d2="securityToken=[b]<Security Tagi>[/b]";  
// DocumentType A44: pricedocument:
$d3="documentType=A44&";        
// Maakoodit löytyvät:
// https://eepublicdownloads.entsoe.eu/clean-documents/EDI/Library/Market_Areas_v2.1.pdf
$d4="In_Domain=10YFI-1--------U&";
$d5="out_Domain=10YFI-1--------U&";
$d6="periodStart=".$alkaa;
$d7="periodEnd=".$loppuu;
$data=$d1.$d2.$d3.$d4.$d5.$d6.$d7;

// Lähetetään pyyntö, talletetaan muuttujaan:
$contents file_get_contents($datafalse);

// Pannaan raakadatatalteen siltä varalta, että halutaan tutkia:
// Ei välttämätön
$fp=fopen("raakadata",&#39;w&#39;);
fwrite($fp,$contents);
fclose($fp);
//************************************//
// Tästä eteenpäin haetun datan muokkausta ja tiivistystä
// Haettavat rivit:
// <start>2022-08-25T22:00Z</start>
// <end>2022-08-26T22:00Z</end>
// <position>1</position>
// <price.amount>206.93</price.amount>

// Käsitellään muuttuja rivi kerrallaan
// Irroitetaan <start><position> ja <price.amount>

// Talletetaan vain tämän ja huomisen tiedot:
$fd=fopen("loppudata.txt",&#39;w&#39;);

// Linuxissa rivin loppumerkiksi riittää "\n"
// M$Wintoosasta en halua tietää mitään
$separator "\n";

$rivi strtok($contents$separator);
while (
$rivi !== false) {
    
// Rivin alusta roskat pois:
    
$rivi=trim($rivi," \n\r\t\v\x00");
    
// onko etsittävä merkkiono tällä rivillä
    
$needle="start>";
    
$pos=strpos($rivi,$needle);
    if (
$pos != false){
        
// Rivin lopusta ja alusta tagit pois
        
$start=str_replace("</start>","",$rivi);
        
$start=str_replace("<start>","",$start);
        echo
"START:$start,";
        
// Poimitaan tunti
        
$hour=substr($start,11,2); 
        
// echo"HOUR:$hour\n";
    
}
    
   
//<end> on meille turha  
    
$needle="end>";
    
$pos=strpos($rivi,$needle);
    if (
$pos != false){
        
$endo=str_replace("</end>","",$rivi);
        
$endo=str_replace("<end>","",$endo);
        
// echo"END: $endo\n";
    

    
// <position> on tasatunti startsta alkaen       
    
$needle="position>";
    
$pos=strpos($rivi,$needle);
     if (
$pos != false){
            
$posi=str_replace("</position>","",$rivi);
            
$posi=str_replace("<position>","",$posi);
     }        
    
     
// Vihdoinkin se oleellisin: hinta
     
$needle="amount>";
     
$pos=strpos($rivi,$needle);
     if (
$pos != false){
         
$price=str_replace("</price.amount>","",$rivi);
         
$price=str_replace("<price.amount>","",$price);
         
$price/=10;

         
// Lasketaan hinnan kellonaika
         
$hetki=$hour+$posi;
        
// Vuorokausi vaihtuu:
        
if($hetki==24){
            
$hour-=24;
            
$hetki=&#39;00&#39;;
            
$day+=1// $day -arvon laskennassa on virhe:
         
}
         echo
"$day $hetki:00,   $price\n";
         
fwrite($fd,$posi.",".$price."\n");
         
    }
    
// Poimitaan seuraava rivi käsittelyyn:
    
$rivi=strtok($separator);
}


2
Kiitos vastauksesta. Tällä kertaa se ei  kuitenkaan auttanut.
Koitin kaikkia mahdollisia käsiliikkeitä php:n ja Apache2:n kanssa ja sain laumoittain mielenkiintoisia virheilmituksia.

Poistin (purge) Apache2 ja php ja tarkastin vielä, että kaikki rääppeetkin ovat poistuneet
Asensin molemmat takaisin ja vielä php8.1-gd:nkin, jota phplot kaipaa.
Lopuksi vielä kerran uudelleenkäynistetään apache2 palvelin.

Uudelleenasennus ja confailu tuotti sen verran tulosta, että nyt osa php-sivuista nousee jaloilleen
Osassa aiemmin hyvin toimineita on häiriöitä. Kaikki phplot graafit kieltäytyvät tulostumasta.

Osa php-scripteistä toimii huonosti tai suorastaan väärin, mikä viittaa siihen, että php7.4:n jälkeen php:n runkoon ja virheentarkastukseen on tehty muutoksia. Hyvä niin, vaikka se tuottaakin töitä. Pitäisi vaan saada parempaa debugia,
jotta jahti sujuisi ketterämmin.

Nyt sitten vaan puukottamaan kaikkia webbisivuja. Onneksi php-ohjelmia ei ole montaa sataa.
(Kaikki sivut ovat käsin väännettyjä tageillä. Ei yhtään SQL:ää, eikä valmiita koodipaketteja)
Melkein kaikki ongelmat ratkesivat lopulta Apachen confeja puukottamalla.

3
Osta vaan ihan oma virtuaaliserveri, jota ohjaat sitten ssh-clientillä Androidin puolelta.

Oma kuitu helpottaa. Itsellä on kotiserveri, jolle pääsen reitittimen VPN:n kautta. sekä toinen yksinkertaisempi DMZ:lla.
Kännykässä käytän xfiles:ä, jossa on scp.

Edelleen odotan täyspainoista Linux-tablettia tai kännykkää ilman Android layeriä siinä välissä. Kiinasta oli jotain tarjolla, mutta ilmeisesti Google sanoi rumasti.

4
-" Jos haluat toimivan ja juuri päivitetyn serverin, sinulla pitää olla kaksi konetta".
Pakko ilmeisesti uskoa ja hankkia toinen serveri pääserverin rinnalle.

Suoritin tänään distro-upgraden serveriin.
Tulos oli jokseenkin odotettu.
Systeemi nousee pystyyn. Kaikki tähän asti testaamani toimii (ainakin pääsin kirjautumaan)

MUTTA:
Kaikki php:tä sisältävät webbisivut ovat rikki :(

Ei ole ensimmäinen kerta. PHP on ollut varsinainen riesa näiden päivitysten kanssa. Esimerkiksi 'split'-komennon korvaaminen 'explodella' aiheutti minulle parin viikon ylimääräiset työt firman servereiden päivityksessä.
Järkevä ylläpitäjä olisi linkittänyt splitin explodeen php:n ytimessä, jolloin asiakkaille ei olisi aiheutunut niin paljoa kiroamista.
Sain tämän korjattua tekemällä scriptin, mutta työtä oli silti paljon, koska servereitä oli lauma.

Ilmeisesti vika ei tälää kertaa ole PHP:ssä, vaan Apache2:ssa.
Etsimiseen menee taas hel*ti aikaa.

5
Yleistä keskustelua / Arduino IDE 2.0 ?
« : 14.11.22 - klo:19.15 »
Miten tuon Arduinon uuden IDE:n saa asennettua Linuxiin ?
Arduinon omilla sivuilla oleva ohje on pahasti vajaa.
Latasin heidän ZIP-pakettinsa ja levitin sen omaan hakemistoonsa.
Sieltä löytyy ohjelma 'arduino-ide', joka kyllä lähtee pyörimään, mutta ainakaan kahden tunnin odottelulla ei ole tapahtunut mitään muuta kuin että mustalla ruudulla supistelee Arduinon pöllönkuva.
Meinasin mennä kysymään Arduinon forumilta, jolla olen ennenkin asioinut, mutta nyt siellä vaaditaan kaksisuuntaista mielialahäiriötä, jota varten pitäisi ladata jotain lisäohjelmia kännykkään. Pitäköön tunkkinsa.

6
Onkohan kenelläkään valmiina dokumentoitua ohjelmanpätkää, joka laskisi CRC-16 X-25 tarkistussumman?
(mieluiten C tai php, mutta muukin käy)

Olen nyt haaskannut muutamia tunteja katsellen netistä tälläistä, mutta kaikki ovat huonosti dokumentoituja. Ei mitään selitystä siitä, missä muodossa data pitäisi tajoilla ja missä muodossa se tulee ulos.
Dokumentoinnissa on myös unohdettu kertoa, onko CRC-16 CCIT:lle, Kermitille, X-25:lle ...

Netissä olleet selitykset itse laskenta-algoritmista ovat olleet kovasti risti-riitaisia. 

7
Lainaus
Python silti tällä hetkellä yksi käytönnöllisimmistä kielistä ja kehityy vain  :)
Olen tämän myös todennut käytännössä, mutta silti kaipaan noita sulkuja.
Tämä olisi aivan erilaista, jos työskentelisi vain yhdellä koneella ja isolla ruudulla
Kun hyppii koneelta toiselle ja vaihtaa editoria, tulee helposti  sekaannuksia.
Eräät editorit jopa poistavat oma-alotteisesti white-spaceja.
Olisivatpa sulut edes sallittuja, vaikkeivat olisikaan pakollisia.

8
En haluaisi siirtyä php:stä Pythoniin kesken projektia.
Sitäpaitsi inhoan Pythonia, koska siinä ei voi käyttää sulkuja ohjelman osien niputtamiseen. Pilattu hyvä ohjelmointikieli ylläpitäjän itsepäisyydellä.

9
Kyllästyin taistelemaan tuon kanssa ja kirjoitin php:llä scriptin, joka hoitaa homman nilkuttaen.
Scripti ei vielä osaa GT06:n kaipaamaa kättelyä, joten se kaataa yhteyden muutaman minuutin välein, jolloin myös ohjelma kaatuu.
Data kyllä tulee oikeassa muodossa ja tarkkuus on tarkastettu.

Kaikkea ei ehdi päivässä, kun pitää muutakin touhuta..

10
Laite (GT06 GPS tracker) lähettää binääristä dataa 30 sek välein n. 40 tavua kerrallaan.
Tämä data pitäisi saada kaapattua talteen ja muokattua seuraavan ohjelman käyttöön.
Saan datan tiedostoon loitsulla
Koodia: [Valitse]
[b]nc -kl 9998 |od -An -tu1 > /tmp/tracker.tmp[/b]
Nyt pitäisi vielä saada tuolle kaapatulle datalle tehtyä pari muokkausta ennenkuin seuraava ryöppy tulee.
- Ilmeisesti komentoriville ei pysty pipe:n perään lisäämään erillistä komentoa ? Ainakaan itse en onnistunut.
- Tein putken päähän bash scriptin, jossa on pari riviä. Tulkki ei kuitenkaan suostu suorittamaan, kuin ensimmäisen näistä riveistä
Koodia: [Valitse]
[b] #!/bin/bash
od -An -tu1 $1
echo "Hello"[/b]

Tuokin on outoa, että vaikka ohjaan datan tulostumaan tiedostoon '>', kirjoitus ei ala puhtaalta pöydältä, vaan ikäänkuin olisin käyttänyt '>>'.

Onko ajatuksia ?

11
Onko niin, että Linuxin omilla työkaluilla ei pysty käsittelemään I2C-piiriä, jossa on enemmän sisäisiä osoitteita, kuin 256 ?
Itse haluaisin käyttää EEPROM:a Raspberryssä.

Olen nyt pari viikkoa vääntänyt tämän kanssa ja viimein löytyi smbus:n dokumentti, jossa sanotaan, että osoite on 8-bittinen:
https://www.kernel.org/doc/Documentation/i2c/smbus-protocol
-" Comm  (8 bits): Command byte, a data byte which often selects a register on the device.
Data  (8 bits): A plain data byte. Sometimes, I write DataLow, DataHigh for 16 bit data.
Count (8 bits): A data byte containing the length of a block operation."

i2c-dev.h headerissa osoitteet on määritelty '__u8', mikä ilmeisesti tarkoittaa 8-bittistä osoitetta.

Kirjoittamalla osoitteen High-8 Comm-byteen ja Low-8 Datan ensimmäiseksi tavuksi sain jotain aikaan, mutta kokeilut ovat kesken ja toimivuus huono.

Olenkin ihmetellyt, miksi kaikki netissä olevat esimerkit ovat vain 256 tavulle, samaten kaikki kehutut apuohjelmat, joilla pitäisi hallita muistipiirejä, esim I2Ctools:n I2Ctransfer ja I2Cset

12
Väänsin C:llä kaksi ohjelmaa EEPROM:n komentamiseen. Kohteena FM24C64 FRAM muisti.
Toisella kirjoitetaan merkkijono EEPROM:lle ja toisella luetaan ja tyhjennetään.
Nämä ovat osa omaa GPS-tracker-rakennelmaa, eivätkä sinänsä täysin yleiskäyttöisiä, mutta ehkä niistä saa vinkkiä johonkin muuhun kehittelyyn, vaikkeivat kovin kaunista koodia olekaan.
Nämä toimivat ainakin omassa kokoonpanossani kuten pitääkin.

Paketissa on myös ohjelma GPS:n $GPRMC-lauseen lukemiseen, sekä 4-riviselle LCD:lle tulostamiseen.

KORJAUS:
Kuvittelin jo kaiken olevan hyvin, koska kaikki testit näyttivät vihreää.
I2C:n kirjoittamisessa löytyikin ongelma. ohjelma kirjoittaa kaiken ensimmäiselle 256 tavulle ja kiertyy aina alkuun.
Kirjoitusrutiini käyttää siis vain alempaa 8 bittiä osoitteessa.:
- Mikään ja yksikään netistä löytämäni ohjeet eivät kerro, miten EEPROM:lle kirjoitetaan, jos muistin koko on suurempi, kuin 256 tavua.

WiringPi ja OrangePi ovat parhaillaan tutkinnassa.
Tätä menoa kirjoitan kohta oman low-level-paketin, jolei muuta ratkaisua löydy.

Pidätelkää hengitystä ;(

13
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.

14
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.

15
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

16
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ää.

17
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

18
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.

19
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 ?

20
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ä.

Sivuja: [1] 2 3 ... 30