Pieniä kysymyksiä ohjelmoinnista

No sehän tässä on ongelma, etten ymmärrä mistä se bittisyys tässä tulee. Jos generoin randomisti 4 tavua (esim. js:llä window.crypto.getRandomValues(new Uint8Array(4)), saan 32 bittiä informaatiota, ja lopuksi konvertoin sen base62-merkkijonoksi, se sisältää edelleen 32 bittiä informaatiota, ja on joka kerta täsmälleen 4 merkkiä pitkä. Siis miten on mahdollista, että neljän base62 -merkin laittaminen peräkkäin eri menetelmällä yhtäkkiä onkin vain 24-bittinen? Se on tällaista kun ei ole teoriataustaa, ja järkikin juoksee välillä melkein takaperin :D
En ole hirveästi javascriptiä tai htmlää kirjoittanut mutta tein What is Base62 Conversion? ohjeilla yksinkertaisen muuntimen:
HTML:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
merkit = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
numero = self.crypto.getRandomValues(new Uint32Array(1))[0];
base62 = "";

x = numero;
while (x > 0) {
    base62 += merkit[x % 62];
    x -= x % 62;
    x /= 62;
}
base62 = base62.split('').reverse().join('');

document.getElementById("demo").innerHTML = numero + " = " + base62;
</script>
</body>
</html>
Tuolla saan kyllä 6 merkkisiä arvoja tuosta 32 bittisestä (Uint32) numerosta. Esimerkki tulos:
3581715481 = 3uOVoX
Teet ilmeisesti jokaiselle 4 lle tavulle erikseen base62 muunnoksen? Tästähän tulee eri arvo kuin jos nuo neljä tavua tulkittaisiin 32 bittisenä lukuna. Yhden tavun muunnoksesta tulee 1 tai 2 merkkiä tulokseksi eli jos nuo lyöt yhteen siitä tulee 4-8 merkkiä yhteensä. Onko mahdollista että otat jokaisesta muunnoksesta vahingossa vain yhden merkin mukaan tulokseen?
 
Toivottavasti tänne mahtuu yksi simppeli skriptaamiseen liittyvä avunpyyntö.

Windows command promptiin tarvitsen tiedostojen massauudelleennimeämiseen skriptin, jonka pitäisi suoriutua seuraavasta tempusta:

Nykyinen:

y:\kansio\tiedosto.iso
y:\toinen kansio\toinen tiedosto.iso
jne.

Tavoite olisi:
y:\kansio\kansio.iso
y:\toinen kansio\toinen kansio.iso
jne.

Toisin sanoen iso-tiedostot pitäisi saada uudelleennimettyä kunkin isäntäkansion nimen mukaiseksi. Kussakin kansiossa on vain yksi tiedosto.

Vinkkejä otetaan vastaan.
 
Powershelliä onnistuis että looppaa kansiot läpi ja lukee kansion nimen ja sillä uudelleen nimeää filun
 
Toimisiko


Get-ChildItem -Directory | ForEach-Object {
$newName = (Get-ChildItem $_.FullName | Where-Object { $_.Extension -eq '.iso' }).BaseName
Rename-Item $_.FullName -NewName $newName
}

Toki kokeile ensin joillain dummy fileillä :)


edit: jaa, juuri päinvastoin..


Get-ChildItem -File -Filter *.iso | ForEach-Object {
$folderName = $_.Directory.Name
$newName = $folderName + $_.Extension
Rename-Item $_.FullName -NewName $newName
}
 
Viimeksi muokattu:
Osaako joku selittää tai ohjata sopivaan matskuun, että miten NextJS:n ISG (Incremental Site Generation) toimii? NextJS:n omat sivut selittävät miten yksi sivu koodataan niin että se päivittyy, mutta miten jos tehdään muutos, jonka pitäisi vaikuttaa isoon määrään sivuja.

Esimerkki: muokkaan sivustollani teosta. Muokkauksista riippuen tämä voi vaikuttaa yhteen tai useampaan henkilösivuun, asiasanasivuun, kirjasarja-sivuun (vaihdan kirjasarjan toiseksi -> kaksi sarjasivua muuttuu) jne.

Tuo sivustoni kun on sellainen, että yksittäiset sivut päivittyvät hyvin harvoin, mutta sivuja alkaa olla luokkaa 10,000, ja jotain sivuja päivitetään käytännössä päivittäin, joten kokoaan staattista sivustosta ei kannata tehdä - koko sivuston buildaaminen jokaisesta muutoksesta olisi ihan liian raskasta.

Ja löytyykö jostain jotain hyvää selitystä miten sivusto ylipäätään pitäisi suunnitella jos haluaa käyttää SSR:ää? Miten ne interaktiiviset osat erotetaan staattisesta sisällöstä? Riittäkö jos ne on omissa komponenteissaan?
 
Ja siis unohtui mainita tuo revalidate, joka on tulossa seuraavaan versioon, ilmeisesti jos rakentaa jonkunlaisen häkkyrän, joka tunnistaa mitkä muut sivut pitää revalidoida, niin se ratkaisisi tuon ongelman?
 
Oli mennyt ihan kokonaan ohi @Nasty76 ja @juhaa vastaukset - myöhästyneet kiitokset vaivannäöstä.

Minä huijasin ja laitoin Autopilotin asialle, joka loihti minulle toimivan skriptin:

Koodi:
@echo off
setlocal enabledelayedexpansion
for /D %%d in (*) do (
    for %%f in ("%%d\*.iso") do (
        ren "%%f" "%%~nd%%~xf"
    )
)
endlocal
 
Hei. Kysymys liittyen c++:saan. Mouse_event functioni ei toimi kunnolla ilman ylimääräistä overheadia, joka on tässä:
Koodi:
std::cout << "Printing x and y cordinates: " << x << ", " << y << "\n";
Tuon kyseisen std::cout overheadin avulla hiiren liike on sulavaa ja jos taas en käytä tuota koodinpätkää niin hiiren liike on pätkivää. Sleep_for:in käyttö auttaa jokseenkin asiaa, mutta se ei ole siltikään yhtä sulavaa kuin std::coutin käyttö. Miten saisin tuon saman sulavuuden ilman, että consolini täyttyy turhasta tekstistä? Löytyykö esim. c++:ssan standard librarystä jotain, jolla voisin tuottaa ylimääräistä overheadia tuohon kyseiseen functioon?
 
Hm, kokeilepa std::cout << std::flush();

Vaikuttaa enemmänkin siltä, että hiiren sijainti ei välity heti ja cout pakottaa sen. Eli oikea ratkaisu on tietysti keksiä mistä vika johtuu eikä tehdä tällaisia hackeja.
 
Hm, kokeilepa std::cout << std::flush();

Vaikuttaa enemmänkin siltä, että hiiren sijainti ei välity heti ja cout pakottaa sen. Eli oikea ratkaisu on tietysti keksiä mistä vika johtuu eikä tehdä tällaisia hackeja.
Tuon std::coutin bufferin flushaus ei auta tuohon hiiren pätkimiseen. Itselläni on sellainen teoria, että tuo mouse_event ei vain kirjaimellisesti pysy tuon funktion mukana. Lopulta se johtaa siihen, että mouse_event täyttyy edellisistä call:eista ja hiiren liike muuttuu pätkiväksi. En itse keksi mitään muuta tapaa kuin vain epäoptimisoida esim. lisätä turhia laskuja tuon funktion loppuun. Voisin myös testata tuota SendInput:ia, koska mouse_event on ”vanhentunut/syrjäytetty” winuser funktio.
 
Viimeksi muokattu:
Tuon std::coutin bufferin flushaus ei auta tuohon hiiren pätkimiseen. Itselläni on sellainen teoria, että tuo mouse_event ei vain kirjaimellisesti pysy tuon funktion mukana. Lopulta se johtaa siihen, että mouse_event täyttyy edellisistä call:eista ja hiiren liike muuttuu pätkiväksi. En itse keksi mitään muuta tapaa kuin vain epäoptimisoida esim. lisätä turhia laskuja tuon funktion loppuun. Voisin myös testata tuota SendInput:ia, koska mouse_event on ”vanhentunut/syrjäytetty” winuser funktio.

Arvaan että jos johtuu liian nopeasta päivityksestä niin sama toistuu sendinputilla. Kumpikin vaan lisää eventtejä jonoon.

Eli varsinainen ongelma voisikin olla siinä että jostain syystä lähetät liikaa mouse eventtejä vaikka ei tarvitsisikaan ?
Tyyliin lähetetään paikka vain jos on muuttunut (tarpeeksi ?), samoin napit ?
 
Vähän samoilla linjoilla tuohon mouse eventtiin eli päivityksiä tulee liikaa ja / tai niitä ei ehditä käsitellä. Eikai mouse event funktiossa kutsuta jotain draw metodia tai muuta ruudun päivitystä tai logiikkaa? Se (liian raskas funktio) voisi aiheuttaa jotain tuollaista pätkimistä.

Hiiren käsittelyyn vain se mitä tarvitaan ja ruudun päivitys ja muu logiikka hoidetaan muualla.
 
Vähän samoilla linjoilla tuohon mouse eventtiin eli päivityksiä tulee liikaa ja / tai niitä ei ehditä käsitellä. Eikai mouse event funktiossa kutsuta jotain draw metodia tai muuta ruudun päivitystä tai logiikkaa? Se (liian raskas funktio) voisi aiheuttaa jotain tuollaista pätkimistä.

Hiiren käsittelyyn vain se mitä tarvitaan ja ruudun päivitys ja muu logiikka hoidetaan muualla.

Ms dokumentaatiosta: "The mouse_event function synthesizes mouse motion and button clicks."

Tuolla ei siis kuulu vastaanottaa inputtia vaan tungetaan eventtejä jonoon.
Kysyjä ei kyllä kertonut mitä on oikeasti tekemässä mutta normaalisti hiiren liike ohjelmalle tulee wm_mousexxx viesteinä jolloin pitää piirtää tai antaa piirto toiselle threadille.

Voin tietysti olla väärässäkin pikalukemisella mutta noin se ainakin ennen on mennyt.
Ei myöskään tiedetä onko vain konsoliohjelma jolla halutaan hiiri haltuun vai ikkunoitu joka kirjoittaa lokia/tms konsoliin...
 
Ms dokumentaatiosta: "The mouse_event function synthesizes mouse motion and button clicks."

Tuolla ei siis kuulu vastaanottaa inputtia vaan tungetaan eventtejä jonoon.
Kysyjä ei kyllä kertonut mitä on oikeasti tekemässä mutta normaalisti hiiren liike ohjelmalle tulee wm_mousexxx viesteinä jolloin pitää piirtää tai antaa piirto toiselle threadille.

Voin tietysti olla väärässäkin pikalukemisella mutta noin se ainakin ennen on mennyt.
Ei myöskään tiedetä onko vain konsoliohjelma jolla halutaan hiiri haltuun vai ikkunoitu joka kirjoittaa lokia/tms konsoliin...
Anna hieman kontekstia tuosta ohjelmasta. Eli kyseessä on siis konsoliohjelma joka liikuttaa hiirtä x ja y tasoihin nähden haluttuun pisteeseen asti. Esim. haluan, että hiiri liikkuu 200 pikseliä positiiviseen suuntaan molemmissa tasoissa jolloin koodi näyttää tältä:
Koodi:
mouse_event(MOUSEEVENTF_MOVE, (DWORD)200, (DWORD)200, NULL, NULL).
En kuitenkaan halua, että liike on suoraan 200 pikseliä, koska tuolloin liike olisi todella nopeaa. Haluan siis, että liike on hitaampaa, jolloin teen liikkeen esim. kymmenessä eri mouse_event call:issa:
Koodi:
mouse_event(MOUSEEVENTF_MOVE, (DWORD)20, (DWORD)20, NULL, NULL)
Oma funktioni osaa siis laskea halutun pisteen ja hiiren tämän hetkisen pisteen eron, joten kyseinen funktio toistuu niin monta kertaa kunnes haluttuun pisteeseen on päädytty. Voin itse muuttaa tuon "smoothing" factorin lineaarisesta funktiosta esim. exponentiaaliseen- tai logaritmiseen funktioon, jolloin mouse_event call:eja tulee vielä enemmän.

Tein väliaikaisena ratkaisuna sen, että laitoin tuon funktion loppuun sortaus algoritmin, joka sorttaa vectorin kaikki numerot järjestykseen. Tuolla tavalla consolini ei täyty turhasta tekstistä ja itse mouse_event ei aiheuta pätkivää liikettä. Tietenkin tuo on ongelman kiertämistä eikä sen korjaamista, mutta en tällä hetkellä keksi muuta tapaa korjata tuota ongelmaa.
 
Anna hieman kontekstia tuosta ohjelmasta. Eli kyseessä on siis konsoliohjelma joka liikuttaa hiirtä x ja y tasoihin nähden haluttuun pisteeseen asti. Esim. haluan, että hiiri liikkuu 200 pikseliä positiiviseen suuntaan molemmissa tasoissa jolloin koodi näyttää tältä:
Koodi:
mouse_event(MOUSEEVENTF_MOVE, (DWORD)200, (DWORD)200, NULL, NULL).
En kuitenkaan halua, että liike on suoraan 200 pikseliä, koska tuolloin liike olisi todella nopeaa. Haluan siis, että liike on hitaampaa, jolloin teen liikkeen esim. kymmenessä eri mouse_event call:issa:
Koodi:
mouse_event(MOUSEEVENTF_MOVE, (DWORD)20, (DWORD)20, NULL, NULL)
Oma funktioni osaa siis laskea halutun pisteen ja hiiren tämän hetkisen pisteen eron, joten kyseinen funktio toistuu niin monta kertaa kunnes haluttuun pisteeseen on päädytty. Voin itse muuttaa tuon "smoothing" factorin lineaarisesta funktiosta esim. exponentiaaliseen- tai logaritmiseen funktioon, jolloin mouse_event call:eja tulee vielä enemmän.

Tein väliaikaisena ratkaisuna sen, että laitoin tuon funktion loppuun sortaus algoritmin, joka sorttaa vectorin kaikki numerot järjestykseen. Tuolla tavalla consolini ei täyty turhasta tekstistä ja itse mouse_event ei aiheuta pätkivää liikettä. Tietenkin tuo on ongelman kiertämistä eikä sen korjaamista, mutta en tällä hetkellä keksi muuta tapaa korjata tuota ongelmaa.

Jos hiiren siirto tökkii ja viivettä lisäämällä toimii niin silloin ongelma on yleensä ajastuksessa. Eventit lähtee siis liian nopeasti, oikeastihan koneen kannalta hiiri on todella hidas.
Ramppi tiwtyin askeiln vaatii aina sopivan odotuksen askelten väliin. Odotuksrn laskenta sen mukaan kuinka kauan siirtymän pitäisi kestää.
Sopiva odotus on yleensä "parempi" kuin sort/vastaava koska odotus ei syö cpu aikaa muilta.
 
Tietääkö kukaan onko mitenkään mahdollista hakea pörssisähkön tuntihintoja google sheets taulukkoon ja jos on niin löytyykö jotain esimerkki koodia? Googlailu ei ole tuottanut tulosta.

Sähköauton tuntikohtaiset latausmäärät jo taulukkoon menee niin saisi suoraan laskettua lataushinnan euroina.
 
Tietääkö kukaan onko mitenkään mahdollista hakea pörssisähkön tuntihintoja google sheets taulukkoon ja jos on niin löytyykö jotain esimerkki koodia? Googlailu ei ole tuottanut tulosta.

Sähköauton tuntikohtaiset latausmäärät jo taulukkoon menee niin saisi suoraan laskettua lataushinnan euroina.


Saisko tämän palvelun avulla jotenkin?
 
Tietääkö kukaan onko mitenkään mahdollista hakea pörssisähkön tuntihintoja google sheets taulukkoon ja jos on niin löytyykö jotain esimerkki koodia? Googlailu ei ole tuottanut tulosta.

Sähköauton tuntikohtaiset latausmäärät jo taulukkoon menee niin saisi suoraan laskettua lataushinnan euroina.
No siis Sheets tarjoaa näemmä mahdollisuuden hakea taulukkoon joko CSV-muotoista, XML-muotoista tai HTML-taulukkomuotoista kamaa simppelillä funktiolla. Ks. linkki

Jos tarvii tehdä jotain monimutkaisempaa, niin ilmeisesti Apps Script palvelun avulla pystyy tekemään kaikenlaista näiden ulkoisten kutsujen lisäksi. Varmaan tulee kyseeseen, jos rajapinta palauttaa JSON:ia ja se pitäs saada johonkin mukavaan taulukkomuotoon. Ks. linkki

Mut varmaan ensimmäinen on katsoa rajapinta, joka palauttaa jossain muodossa halutun datan ja sen jälkeen ruveta katsomaan noita edellisiä, että millä datan saa haluamassaan muodossa taulukkoon.
 
No tämä näyttäs kaikista helpoimmalta: Hinta nyt | Porssisahko.net

Jotain simppeliä Node-esimerkkiäkin on. Hakee tietonsa ilmeisesti Nord Poolin rajapinnoista, jotka taas näyttäs vaativan vähän perehtymistä, jos niitä haluais ite suoraan hyödyntää. Tällai siis kahden minuutin vilkaisulla.

Sieltä vaan kokeilemaan. Eka, että saat tulemaan ylipäänsä jotain dataa taulukkoon tuolta. Sen jälkeen miettimään, millaisen konversion tarviit, että saat tuon kaman siististi taulukkoon.
 
ENTSO-E tarjoaa ilmaisen rajapinnan kun pyytää siihen avaimen. Sitä pystyisi varmaankin käyttämään tuossa, ja tekoälyhän avustaa sujuvasti koodin vääntämisessä jos kaikki asiat ei ole tuttuja.
 
Päivittäin tulee seurailtua pörssikursseja Nordnetin sivuilta mutta tuolla muutama asia on kuitenkin alkanut tökkiä lievästi vastaan. Kun menee katsomaan jonkin osakkeen kurssia (esimerkkinä Sampo), niin eteen tuleva näkymä on lievästi kökkö: graafin tyyppi on viiva ja aikavälinä on 1 päivä (kuva ennen).
Screenshot_2024-04-10_180905.png

Jos haluaa vähänkään informatiivisempaa näyttöä, niin aikaväliksi pitäisi laittaa 12 kk ja asetuksista saa aina hakata päälle kynttilät, ruudukon, SMA:t, EMAn, yms. indikaattorit (kuva jälkeen).
Screenshot_2024-04-10_181113.png

Löytyykö mitään vinkkejä, että mitenkähän tuota saisi automatisoitua niin, että nuo haluamansa asetukset saisi päälle helposti esim. yhdellä napin painalluksella ilman, että tarvitsee aina hakata noita samoja asetuksia päälle tuolta kukkuu-valikosta silloin, kun sivulla vierailee? Ohjelmoitua on tullut jonkin verran mutta mitään nettisivujen käpistelyä javascriptillä tai vastaavaa ei ole tullut milloinkaan harrastettua, niin olen aika käsi tässä asiassa.
 
Päivittäin tulee seurailtua pörssikursseja Nordnetin sivuilta mutta tuolla muutama asia on kuitenkin alkanut tökkiä lievästi vastaan. Kun menee katsomaan jonkin osakkeen kurssia (esimerkkinä Sampo), niin eteen tuleva näkymä on lievästi kökkö: graafin tyyppi on viiva ja aikavälinä on 1 päivä (kuva ennen).
Screenshot_2024-04-10_180905.png

Jos haluaa vähänkään informatiivisempaa näyttöä, niin aikaväliksi pitäisi laittaa 12 kk ja asetuksista saa aina hakata päälle kynttilät, ruudukon, SMA:t, EMAn, yms. indikaattorit (kuva jälkeen).
Screenshot_2024-04-10_181113.png

Löytyykö mitään vinkkejä, että mitenkähän tuota saisi automatisoitua niin, että nuo haluamansa asetukset saisi päälle helposti esim. yhdellä napin painalluksella ilman, että tarvitsee aina hakata noita samoja asetuksia päälle tuolta kukkuu-valikosta silloin, kun sivulla vierailee? Ohjelmoitua on tullut jonkin verran mutta mitään nettisivujen käpistelyä javascriptillä tai vastaavaa ei ole tullut milloinkaan harrastettua, niin olen aika käsi tässä asiassa.
Asenna selaimeen userscript-laajennus (esim. Chromessa Tampermonkey näyttäisi olevan suosittu), johon voit sitten luoda esim. sivukohtaisia skriptejä, jotka ajetaan sivun latauksen yhteydessä. Sen jälkeen riippuukin sitten sivusta ja omista tarpeista, miten helposti skripteillä saa tehtyä haluamansa. JavaScriptillä homma joka tapauksessa toimii. Käytännössä saatat haluta esim. lisätä skriptillä painikkeen ja lisätä painikkeelle click-tapahtumakäsitteljän, joka tekee haluamasi temput. Kaikessa tässä on olennaista, että pystyy valitsemaan haluamansa elementit nettisivulta: paikka, johon painike lisätään, sekä mahdollisesti vivuat ja painikkeet, joita painiketta klikkaamalla halutaan ohjelmallisesti "klikata" (voi kenties myös kutsua sivulla olevaa koodia vähän koodista riippuen, mutta "klikkailu" saattaa toimia luotettavammin silloin, kun se ylipäänsä onnistuu).

Elementtien valinta on varmaan se isoin kysymysmerkki, sillä osalla nettisivuista valintaan käytettävissä olevat tunnisteet saattavat olla satunnaista kuraa, joka muistaakseni pahimmillaan vaihtuu jopa joka sivulatauksella. Usein toki nämä ovat myös varsin järkeviä, joten valinnan helppous selviää lähinnä tutkimalla. Toki kerran kirjoitetun koodin lahoamisvaara sivun päivitysten yhteydessä on ilmeinen...
 
Rakenteeltaan yksinkertaisilla sivuilla tuo saattaisi toimia, mutta mitä tutkailin Nordnetin nettisivujen rakennetta, niin oli kyllä sellaista ripulia, että sieltä ei minun taidoilla "klikkailla" skripteillä yhtään mitään nappeja. :rolleyes:
 
Rakenteeltaan yksinkertaisilla sivuilla tuo saattaisi toimia, mutta mitä tutkailin Nordnetin nettisivujen rakennetta, niin oli kyllä sellaista ripulia, että sieltä ei minun taidoilla "klikkailla" skripteillä yhtään mitään nappeja. :rolleyes:
Piti oikein käydä kurkkaamassa ja ainakin itselläni nuo asetukset säilyivät kun sulki välilehden tai sammutti selaimen. Kun meni uudestaan samalle sivulle niin kynttilät sun muut oli edelleen päällä. Eli ilmeisesti nuo asetukset tallentuvat johonkin cookieen tai vastaavaan ainakin joksikin aikaa.
 
Minulla nollautuu asetukset, kun koneen (tai selaimen) lyö kiinni ja avaa uudelleen.

Kyllä se sen tiedon näköjään tallentaan local storageen avaimeen "indicator/GRAPH_USER_PERIOD". Eli jos et erikseen tuota pyyhi (tai et käytä siis jotain selainta tai selainlaajennosta joka sen tekee), niin kyllä sen pitäisi se muistaa. Mitä selainta käytät ja onko käytössä jotain yksityisyyshimmeleitä?
 
Mitä selainta käytät ja onko käytössä jotain yksityisyyshimmeleitä?
Firefoxi käytössä, tiedä sitten onko alla näkyvillä säädöillä mitään vaikutusta.
Capture.PNG

Mitää yksityisyyttä suojelevia laajennoksia ei ole. Kokeilin myös ihan perusasetuksilla olevalla Edgellä, niin tämäkin hävitti asetukset selaimen uudelleenkäynnistyksen jälkeen.
 
Firefoxi käytössä, tiedä sitten onko alla näkyvillä säädöillä mitään vaikutusta.

Mielenkiintoista. Testasin Firefoxilla (macOS) ja täällä toimii kuten pitää. Jopa noilla tiukemmilla asetuksilla, jotka pastesit. Eli:

1. Avaa firefox.
2. Avaa Helsingin pörssi tänään - OMXH markkinakatsaus
3. Paina kuvaajan alta "6 kk"
4. Sulje selain ja avaa uudestaan.
5. Avaa Helsingin pörssi tänään - OMXH markkinakatsaus

Mulla näkyy yhä valittuna 6 kk. Ja käytössä ei siis mitään incognito/private-ikkunaa vaan ihan normi.

Se mihin tuon pitäisi tallentua löytyy näin:

1. Mene tuolle sivulle.
2. Avaa valikosta Tools -> Browser tools -> Web Developer tools
3. Avaa välilehti Storage
4. Avaa vasemmalta Local storage -> Sijoittaminen ja säästäminen
5. Tuolla valinta on tosiaan tallennettu avaimeen indicator/GRAPH_USER_PERIOD. Sinne esim. jos käsin kirjoittaa arvoksi "YTD" ja uudelleenlataa sivun, tulee valinnaksi YTD graafiin.

Joku sun FF:ssä nyt sitten pyyhkii tuon local storagen tai ei edes talleta sinne mitään. En osaa tarkemmin sanoa syytä.
 
Kun kävi tuota local storagea katsomassa, niin siellä ne avaimet arvoineen näytti napottavan, kun laittoi ne haluamansa asetukset päälle. Minulla tuo Firefox on mallia portable (ja käyttöjärjestelmä Win10), niin tiedä sitten johtuuko tuosta, että arvot eivät jää local storageen. Toisaalta katsoin myös Edgellä, joka ei ole portable, niin sielläkin arvot näkyvät local storagessa mutta eivät ole enää sitten, kun selaimen on käynnistänyt uudelleen. Jostain myös luin, että selaimen välimuistin tyhjentäminen tyhjentäisi tuon local storagen ja se tyhjennys olikin FF:ssa päällä, kun selain sulkeutuu. Otin tuon pois päältä mutta silti sama meno jatkuu.

Kun erehdyin katsomaan selaimen konsolia sivua ladattaessa ensimmäisellä kerralla, niin local storageen liittyvää erskaa näyttää pukkaavan.
Capture.PNG


Mystistä... :hmm:
 
^Tekisi mieli arvata, että koneella on jotakin useampaankin selaimeen vaikuttavaa, esim. virustentorjunta, joka aiheuttaa tuollaista, mutta onhan tuo aika erikoisen kuuloinen tapaus... Voisiko jokin jossakin estää esim. jonkin tietyn skriptin latauksen/suorituksen kaikissa selaimissa?
 
Räpläsin aikaisemmin joitakin asetuksia ja nyt se näyttää toimivan. Samalla hävisi yhdellä toisellakin sivulla ollut "asetusongelma". Nyt kun vielä tietäisi, että mikä asetus se lopulta tuon teki... :facepalm:
 
Alla olevaan google sheets scriptiin pitäisi lisätä ominaisuus joko korvaa D sarakkeessa kaikki solut joissa "0" tyhjällä, löytyisikö täältä osaajaa, joka voisi vähän auttaa tuossa? Kiitos!



C++:
function doGet(e) {
  Logger.log( JSON.stringify(e) );  // view parameters

  var result = 'Ok'; // assume success
 
    var ss = SpreadsheetApp.getActiveSpreadsheet();
//give your sheet name below instead of Sheet1
var sheet = ss.getSheetByName("data");

var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();

var currentDate = new Date();
var oneweekago = new Date();
oneweekago.setDate(currentDate.getDate() - 6);

for (i=lastrow;i>=2;i--) {
var tempdate = sheet.getRange(i, 1).getValue();

if(tempdate < oneweekago)
{
  sheet.deleteRow(i);
}
}

  if (e.parameter == undefined) {
    result = 'No Parameters';
  }
  else {
    var id = '1Nr-Fc8cxj6RCmoJMX3irvHIRyv4147SFkLxxxxxx';//docs.google.com/spreadsheetURL/d
    var sheet = SpreadsheetApp.openById(id).getActiveSheet();
    var newRow = sheet.getLastRow() + 1;
    var rowData = [];
    //var waktu = new Date();
    rowData[0] = new Date(); // Timestamp in column A
 
    for (var param in e.parameter) {
      Logger.log('In for loop, param='+param);
      var value = stripQuotes(e.parameter[param]);
      //Logger.log(param + ':' + e.parameter[param]);
      switch (param) {
       case 'kwhh1': //Parameter
          rowData[1] = value; //Value in column B
          break;
        case 'kwhh2':
          rowData[2] = value;
          break;
        case 'price':
          rowData[3] = value;
          break;
        case 'temp1':
          rowData[4] = value;
          break;
        case 'temp2':
          rowData[5] = value;
          break;
        case 'count':
          rowData[6] = value;
          break;                 
          default:
          result = "unsupported parameter";
      }
    }

    Logger.log(JSON.stringify(rowData));

    // Write new row below
    var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
    newRange.setValues([rowData]);
  }
 

  // Return result of operation
  return ContentService.createTextOutput(result);
}

/**
* Remove leading and trailing single or double quotes
*/
function stripQuotes( value ) {
  return value.replace(/^["']|['"]$/g, "");
}
 
Alla olevaan google sheets scriptiin pitäisi lisätä ominaisuus joko korvaa D sarakkeessa kaikki solut joissa "0" tyhjällä, löytyisikö täältä osaajaa, joka voisi vähän auttaa tuossa? Kiitos!



C++:
function doGet(e) {
  Logger.log( JSON.stringify(e) );  // view parameters

  var result = 'Ok'; // assume success

    var ss = SpreadsheetApp.getActiveSpreadsheet();
//give your sheet name below instead of Sheet1
var sheet = ss.getSheetByName("data");

var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();

var currentDate = new Date();
var oneweekago = new Date();
oneweekago.setDate(currentDate.getDate() - 6);

for (i=lastrow;i>=2;i--) {
var tempdate = sheet.getRange(i, 1).getValue();

if(tempdate < oneweekago)
{
  sheet.deleteRow(i);
}
}

  if (e.parameter == undefined) {
    result = 'No Parameters';
  }
  else {
    var id = '1Nr-Fc8cxj6RCmoJMX3irvHIRyv4147SFkLxxxxxx';//docs.google.com/spreadsheetURL/d
    var sheet = SpreadsheetApp.openById(id).getActiveSheet();
    var newRow = sheet.getLastRow() + 1;
    var rowData = [];
    //var waktu = new Date();
    rowData[0] = new Date(); // Timestamp in column A

    for (var param in e.parameter) {
      Logger.log('In for loop, param='+param);
      var value = stripQuotes(e.parameter[param]);
      //Logger.log(param + ':' + e.parameter[param]);
      switch (param) {
       case 'kwhh1': //Parameter
          rowData[1] = value; //Value in column B
          break;
        case 'kwhh2':
          rowData[2] = value;
          break;
        case 'price':
          rowData[3] = value;
          break;
        case 'temp1':
          rowData[4] = value;
          break;
        case 'temp2':
          rowData[5] = value;
          break;
        case 'count':
          rowData[6] = value;
          break;                
          default:
          result = "unsupported parameter";
      }
    }

    Logger.log(JSON.stringify(rowData));

    // Write new row below
    var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
    newRange.setValues([rowData]);
  }


  // Return result of operation
  return ContentService.createTextOutput(result);
}

/**
* Remove leading and trailing single or double quotes
*/
function stripQuotes( value ) {
  return value.replace(/^["']|['"]$/g, "");
}
Kieli taitaa olla javascript ja käytössä Googlen oma apikirjasto?

Takautuvasti vai syöttövaiheessa? Onko sarake D sidottu johonkin syötössä tunnettuun parametriin (hinta?) vai pitääkö sen olla kiinteästi sarake D (joka vaikuttaa ns. vaaralliselta jos joskus tulee tarve muuttaa taulukon järjestystä?
 
Tietääkö kukaan onko mitenkään mahdollista hakea pörssisähkön tuntihintoja google sheets taulukkoon ja jos on niin löytyykö jotain esimerkki koodia? Googlailu ei ole tuottanut tulosta.

Sähköauton tuntikohtaiset latausmäärät jo taulukkoon menee niin saisi suoraan laskettua lataushinnan euroina.

Tässä oma implementaatio omaan käyttöön jota ajelen silloin tällöin. Tästä idea varmaan selviää ja skripti/outputti lienee helppoa portata haluamalleen tekniikalle.
Koodi:
#!/usr/bin/env perl

use utf8;
use strict;
use warnings;

use JSON;

&json_open();

exit(0);



sub json_open {
        my ($arg) = @_;

        my $f = 'XXX.json';
        my $c = "LC_ALL=C curl -s -o $f " .
                "-X GET " .
                "-H 'Content-Type: application/json' " .
                "-H 'Accept: application/json; charset=UTF-8' " .
                "https://api.porssisahko.net/v1/latest-prices.json";

        my @c = `$c`;

        #
        &json_open_op({ file => $f });

        unlink($f);
}

sub json_open_op {
        my ($arg) = @_;

        my $z = json_time_tz();

        if(open(FILE, $arg->{file})) {
                my @f = <FILE>;

                close(FILE);

                #
                my $t = decode_json(join("", @f));

                if($t->{'prices'}) {
                        for(my $i = 0; $i < @{ $t->{'prices'} }; $i++) {
                                my $c = $t->{'prices'}[$i];

                                if($c->{'price'}) {
                                        my @s = split(/[-T:\.]/, $c->{'startDate'});
                                        my @e = split(/[-T:\.]/, $c->{'endDate'});

                                        #
                                        print   $s[2] . "." . $s[1] . "." . $s[0] .
                                                " klo " . $s[3] . ":" . $s[4] . " - " .
                                                $e[3] . ":" . $e[4] . $z .
                                                " @ " . $c->{'price'} . " c/kWh" . "\n";
                                }
                        }
                }
        }
}

sub json_time_tz {
        my ($arg) = @_;

        my @e = localtime(24 * 60 * 60);
        my @f = gmtime(24 * 60 * 60);

        return sprintf("%+03d:00", $e[2] - $f[2]);
}
30.04.2024 klo 21:00 - 22:00+02:00 @ 6.811 c/kWh
30.04.2024 klo 20:00 - 21:00+02:00 @ 9.674 c/kWh
30.04.2024 klo 19:00 - 20:00+02:00 @ 10.957 c/kWh
30.04.2024 klo 18:00 - 19:00+02:00 @ 16.366 c/kWh
30.04.2024 klo 17:00 - 18:00+02:00 @ 15.124 c/kWh
30.04.2024 klo 16:00 - 17:00+02:00 @ 10.689 c/kWh
30.04.2024 klo 15:00 - 16:00+02:00 @ 8.26 c/kWh
30.04.2024 klo 14:00 - 15:00+02:00 @ 5.652 c/kWh
30.04.2024 klo 13:00 - 14:00+02:00 @ 3.14 c/kWh
30.04.2024 klo 12:00 - 13:00+02:00 @ 1.859 c/kWh
30.04.2024 klo 11:00 - 12:00+02:00 @ 2.988 c/kWh
30.04.2024 klo 10:00 - 11:00+02:00 @ 3.875 c/kWh
30.04.2024 klo 09:00 - 10:00+02:00 @ 5.445 c/kWh
30.04.2024 klo 08:00 - 09:00+02:00 @ 6.515 c/kWh
30.04.2024 klo 07:00 - 08:00+02:00 @ 7.77 c/kWh
 
Kieli taitaa olla javascript ja käytössä Googlen oma apikirjasto?

Takautuvasti vai syöttövaiheessa? Onko sarake D sidottu johonkin syötössä tunnettuun parametriin (hinta?) vai pitääkö sen olla kiinteästi sarake D (joka vaikuttaa ns. vaaralliselta jos joskus tulee tarve muuttaa taulukon järjestystä?
En tiedä mikä kieli on, mutta google sheets taulukosta kun avaan valikon Apps-skripti, niin sieltä tuo koodi löytyy. Ei ole merkitystä missä vaiheessa nollat poistetaan, nyt haluan poistaa parametrin hinta nollat, koska tulevat näkyviin myös sarakekaaviossa, mutta osaan muokata koodia jos saraka vaihtuu joskus.
 
En tiedä mikä kieli on, mutta google sheets taulukosta kun avaan valikon Apps-skripti, niin sieltä tuo koodi löytyy. Ei ole merkitystä missä vaiheessa nollat poistetaan, nyt haluan poistaa parametrin hinta nollat, koska tulevat näkyviin myös sarakekaaviossa, mutta osaan muokata koodia jos saraka vaihtuu joskus.
Kokeile tätä, en takaa että toimii sillä iha hatusta puhelimella muokkasin, enkä muista millä arvolla sheets pitää tyhjää solua:
C++:
function doGet(e) {
  Logger.log( JSON.stringify(e) );  // view parameters

  var result = 'Ok'; // assume success

    var ss = SpreadsheetApp.getActiveSpreadsheet();
//give your sheet name below instead of Sheet1
var sheet = ss.getSheetByName("data");

var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();

var currentDate = new Date();
var oneweekago = new Date();
oneweekago.setDate(currentDate.getDate() - 6);

for (i=lastrow;i>=2;i--) {
var tempdate = sheet.getRange(i, 1).getValue();

if(tempdate < oneweekago)
{
  sheet.deleteRow(i);
}
}

  if (e.parameter == undefined) {
    result = 'No Parameters';
  }
  else {
    var id = '1Nr-Fc8cxj6RCmoJMX3irvHIRyv4147SFkLxxxxxx';//docs.google.com/spreadsheetURL/d
    var sheet = SpreadsheetApp.openById(id).getActiveSheet();
    var newRow = sheet.getLastRow() + 1;
    var rowData = [];
    //var waktu = new Date();
    rowData[0] = new Date(); // Timestamp in column A

    for (var param in e.parameter) {
      Logger.log('In for loop, param='+param);
      var value = stripQuotes(e.parameter[param]);
      //Logger.log(param + ':' + e.parameter[param]);
      switch (param) {
       case 'kwhh1': //Parameter
          rowData[1] = value; //Value in column B
          break;
        case 'kwhh2':
          rowData[2] = value;
          break;
        case 'price':
          rowData[3] = Number(value) === 0 ? "" : value;
          break;
        case 'temp1':
          rowData[4] = value;
          break;
        case 'temp2':
          rowData[5] = value;
          break;
        case 'count':
          rowData[6] = value;
          break;                
          default:
          result = "unsupported parameter";
      }
    }

    Logger.log(JSON.stringify(rowData));

    // Write new row below
    var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
    newRange.setValues([rowData]);
  }


  // Return result of operation
  return ContentService.createTextOutput(result);
}

/**
* Remove leading and trailing single or double quotes
*/
function stripQuotes( value ) {
  return value.replace(/^["']|['"]$/g, "");
}
 
Miten Pythonilla (tai jopa Numpyllä, vektoreina) tehtäisiin tämmöinen AND juttu? Kun en jotenkin nyt keksi helppoa nopeaa tapaa ollenkaan. Keltainen ja oranssi pitäisi ANData keskenään ja ne ovat binäärejä 0 tai 1. Tämä on mini esimerkki, oikeassa on noin 200 x 50.

andi.png
 
Miten Pythonilla (tai jopa Numpyllä, vektoreina) tehtäisiin tämmöinen AND juttu? Kun en jotenkin nyt keksi helppoa nopeaa tapaa ollenkaan. Keltainen ja oranssi pitäisi ANData keskenään ja ne ovat binäärejä 0 tai 1. Tämä on mini esimerkki, oikeassa on noin 200 x 50.

andi.png
Kyseessä on kahden vektorin ulkotulo. Esim:
Koodi:
import numpy as np
a = np.array([[0,0,1]])
b = np.array([[1,0,1,0]])
print(a.T @ b)
antaa vastaukseksi
0000
0000
1010
 
Kiitos! Ja näköjään tuo hämärä .T @ kohta on "laajennettuna"

print(np.matmul(np.transpose(a),b))
Tajusin just, että Numpyssä on ulkotulolle oma funktio, jolla homman saa tehtyä vielä helpommin:
Koodi:
import numpy as np
a = np.array([0,0,1])
b = np.array([1,0,1,0])
print(np.outer(a, b))

Tällä tavalla tehtäessä ei tarvitse käyttää a:lle ja b:lle tuplahakasulkuja, koska outer-funktio hoitaa matriisialgebran automaattisesti, vaikka a ja b ovat yksiulotteisia objekteja.
 
Olisiko jossain hyvää opasta tai jotain näiden server-komponenttien käytöstä, mitkä on jo NextJS:ssä käytössä ja tulee tänä kesänä vanilla-Reactiin? Koittanut lueskella, mutta en saa ihan perusasioistakaan kiinni, eli miten arkkitehtuuri pitäisi tehdä.

Esimerkiksi jos minulla on lista, ja listan yläpuolella nappeja lajittelua ja yksityiskohtien määrän valintaa varten niin miten tuollainen pitäisi tehdä? Ladataanko lista aina uudestaan serverin päässä kun käyttäjä painaa nappia, eli clientille tulee aina vain html:ää?
 
Mikähän voi mättää jun Nextjs:n refresh kestää 10-20s vaikka tyyliin CSS-luokkaa muuttaa yhdestä elementistä. On todella rasittavaa devata tällä suorituskyvyllä.

Läppäri on aika vanha (2017 Thinkpad T470s, mutta ei se kai voi niin paljoa vaikuttaa? Prossu on i5-7200U ja muistia 20GB. Sveltekit tällä pyörii kuitenkin ihan ilman ongelmia.

Projektissa tällä hetkellä alle 10 komponenttia, joten ei voi olla koostakaan kiinni.
 

Liitteet

  • Immagine 2024-06-18 172233.jpg
    Immagine 2024-06-18 172233.jpg
    32 KB · Luettu: 85
Mikähän kieli kannattaisi opetella työllistymisen kannalta, kun on vuosikausia tunkannut pääasiassa Python+Django/React -yhdistelmää? Työpaikkailmoituksissa Pythonia kysytään lähinnä apukielenä tai data engineering -hommissa, mutta webin puolella Django/Flask/FastAPI on täysin marginaalissa. Taikasanoja tuntuvat olevan JS/TS, Java ja C# mutta aika takamatkalta saa lähteä, jos yrittää kilpailla Node- tai .NET-konkareiden kanssa.
 
Mikähän kieli kannattaisi opetella työllistymisen kannalta, kun on vuosikausia tunkannut pääasiassa Python+Django/React -yhdistelmää? Työpaikkailmoituksissa Pythonia kysytään lähinnä apukielenä tai data engineering -hommissa, mutta webin puolella Django/Flask/FastAPI on täysin marginaalissa. Taikasanoja tuntuvat olevan JS/TS, Java ja C# mutta aika takamatkalta saa lähteä, jos yrittää kilpailla Node- tai .NET-konkareiden kanssa.
Suurin valtti työnhaussa on hyvät perusohjelmointitaidot ja vuorovaikutuskyvyt. En olisi niin huolissani jos olet hyvä tiimipeluri ja taitava React ja js koodaaja, saat varmasti hommia joissa pääset opettelemaan Muutakin. TS perusteet on aika helppo oppia varsinkin jos osaa js:n hyvin.
 
Suurin valtti työnhaussa on hyvät perusohjelmointitaidot ja vuorovaikutuskyvyt. En olisi niin huolissani jos olet hyvä tiimipeluri ja taitava React ja js koodaaja, saat varmasti hommia joissa pääset opettelemaan Muutakin. TS perusteet on aika helppo oppia varsinkin jos osaa js:n hyvin.
Oma kokemus työnhausta ei kyllä yhtään tue tätä väitettä. Voi tietysti olla, että kaikki HR-väki valehtelee, mutta useimmiten sanotaan, ettei osaaminen vastaa mitä haetaan. Ei musta siis vaikuta, että tavallinen osaaminen riittää lainkaan.
 
Edit: siirsin oman vastaukseni YK:n ketjuun ettei mene täällä ohjelmointikeskustelu yleiseksi IT-alan höpinäksi:
 
Viimeksi muokattu:
Onko kellään kokemusta cloudflare tunneleista? Ymmärsinkö oikein että jos mulla on nyt reverse proxyssa esim. grafana.domain.com, niin sen sijasta käyttäisin sitä jotenkin cloudflaresta kokonaan ilman tuota subdomainia?
 
Onko kellään kokemusta cloudflare tunneleista? Ymmärsinkö oikein että jos mulla on nyt reverse proxyssa esim. grafana.domain.com, niin sen sijasta käyttäisin sitä jotenkin cloudflaresta kokonaan ilman tuota subdomainia?
Tuossa tapauksessa on mahdollista laittaa cloudflaren softa sinne grafana-serverille, joka tekee tunnelin siitä cloudflareen. Sitten voit cloudflaren nimipalvelin asetuksissa laittaa grafana.domain.com osoittamaan siihen tunneliin. Tällä välttää sen ettei tuolta grafana-serveriltä tarvitse avata yhtään porttia internettiin.
 

Statistiikka

Viestiketjuista
302 430
Viestejä
5 147 846
Jäsenet
82 143
Uusin jäsen
AlexL

Hinta.fi

Back
Ylös Bottom