Pieniä kysymyksiä ohjelmoinnista

Onko 4 merkkiä pitkä, base62 enkoodattu merkkijono (jokainen merkki aakkosista 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz) 32-bittinen? Siis kun UUIDv6 on 128-bittinen, kun siinä on 36 heksadesimaalilukua, ja yksi heksadesimaali vie 4 bittiä (32 * 1 * 4), mutta base62-kirjain vie 2 heksadesimaalia, jolloin 4 * 2 * 4 -> 32?
 
Onko 4 merkkiä pitkä, base62 enkoodattu merkkijono (jokainen merkki aakkosista 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz) 32-bittinen? Siis kun UUIDv6 on 128-bittinen, kun siinä on 36 heksadesimaalilukua, ja yksi heksadesimaali vie 4 bittiä (32 * 1 * 4), mutta base62-kirjain vie 2 heksadesimaalia, jolloin 4 * 2 * 4 -> 32?
Wikipedia näyttää että base62 olisi kuusi bittiä per merkki (ei suoraa speksiä, mutta listauksessa on kuusi bittiä per merkki), eli 1,5 hexaa tai 0,75 tavua. Käy järkeen koska muuten siinä olisi hukkatilaa.

Eli neljä merkkiä olisi 3 tavua tai 24 bittiä (4*6).

Edit:
Sekoilua

Edit2:
En saanut otetta miten uuid v6 liittyy tähän. Se on 128 bittinen arvo, joka heksoina esitettynä sisältää 32 merkkiä. base62 enkoodattuna se olisi laskelmieni mukaan 21,5 merkkiä pitkä.

Edit3:
Koska base62 sisältää 62 verran tietoa kuudessa bitissä (64) jää vähän informaatiota yli, jolloin se tekee muunnoksista hankalampia mikäli käytetään myös nuo tuo yli jäänyt data.
 
Viimeksi muokattu:
Wikipedia näyttää että base62 olisi kuusi bittiä per merkki (ei suoraa speksiä, mutta listauksessa on kuusi bittiä per merkki), eli 1,5 hexaa tai 0,75 tavua. Käy järkeen koska muuten siinä olisi hukkatilaa.

Eli neljä merkkiä olisi 3 tavua tai 24 bittiä (4*6).

Edit:
Sekoilua

Edit2:
En saanut otetta miten uuid v6 liittyy tähän. Se on 128 bittinen arvo, joka heksoina esitettynä sisältää 32 merkkiä. base62 enkoodattuna se olisi laskelmieni mukaan 21,5 merkkiä pitkä.

Edit3:
Koska base62 sisältää 62 verran tietoa kuudessa bitissä (64) jää vähän informaatiota yli, jolloin se tekee muunnoksista hankalampia mikäli käytetään myös nuo tuo yli jäänyt data.
UUID:n otin esille varmaan sillä, että siinä voi päätellä bittimäärän perusteella todennäköisyyden että se generoi duplikaatin, ja tässä yritän pienessä päässäni järkeillä että jos otan randomisti base62 -taulukosta merkkejä (chars[rand(0, 61)]), ja laitan niitä peräkkäin, niin kuinka monta niitä pitää olla että siinä on vähintään vaikkapa 24 tai 32bittiä (ja näin laskea myös sen collisio-todennäköisyyden)?
 
UUID:n otin esille varmaan sillä, että siinä voi päätellä bittimäärän perusteella todennäköisyyden että se generoi duplikaatin, ja tässä yritän pienessä päässäni järkeillä että jos otan randomisti base62 -taulukosta merkkejä (chars[rand(0, 61)]), ja laitan niitä peräkkäin, niin kuinka monta niitä pitää olla että siinä on vähintään vaikkapa 24 tai 32bittiä (ja näin laskea myös sen collisio-todennäköisyyden)?
Tarkoitatko siis että jos sinulla on 128 bittinen arvo, niin haet sitä että kuinka suurella todennäköisyydellä saat saman arvon jos rakennat arvon jonosta arvoja välillä 0-61? Se riippuu allokoitko jokaiselle arvolle täydet 6 bittiä vai sallitko kuuteen bittiin mahtuvan ylijäämän kierrättämisen eteenpäin kokonaisarvoon, jolloin saat useamman arvon mahtumaan tuohon 128 bittiin.

Jos sisällytät 6 tavun ylijäämät base62:sta menee laskenta nopeasti katsottuna jotakuinkin tämän mukaan: What is Base62 Conversion?
Jos taas käytät kuusi tavua per merkki jätät tuosta 128 tavun arvosta osan käyttämättä koska se ei ole kuudella jaollinen tai vaihtoehtoisesti otat vain kahden tavun arvoisen merkin loppuun. Onko peräkkäin laittaminen tavoitteen mukaista?

Base62 arvo ei ole jaollinen 24 tai 32 bitin maksimiarvon kanssa. Jos haluat tietää kuinka monta base62 merkkiä on arvoltaan vähintään 24 bittiä, on vastaus viisi. Kysymys ei kuitenkaan ole niin yksinkertainen, sillä neljä base62 merkkiä on arvoltaan 14 776 336, kun taas 24 bittiä on arvoltaan 16 777 216. Viisi base62 merkkiä meneekin pitkälle yli. Jos nuo noin kaksi miljoonaa väliin jäävää arvoa vielä jaetaan base62 merkeistä koostuvalle merkkijonolle saadaan huomattavasti enemmän mahdollisuuksia kuin mihin neljällä merkillä päästään. Onko tämän taustalla koulutehtävä jonka tarkoituksena on ymmärtää binääriarvoja?
 
UUID:n otin esille varmaan sillä, että siinä voi päätellä bittimäärän perusteella todennäköisyyden että se generoi duplikaatin, ja tässä yritän pienessä päässäni järkeillä että jos otan randomisti base62 -taulukosta merkkejä (chars[rand(0, 61)]), ja laitan niitä peräkkäin, niin kuinka monta niitä pitää olla että siinä on vähintään vaikkapa 24 tai 32bittiä (ja näin laskea myös sen collisio-todennäköisyyden)?
Jos kiinnostava asia on tuo lopussa suluissa oleva todennäköisyys sille että kaksi satunnaista base62 merkkijonoa ovat samat, niin eikö sen voi laskea ihan tavanomaisella todennäköisyyslaskennalla? Yhden saman merkin todennäköisyys on silloin 1/62 ja saman N merkkiä pitkän merkkijonon (1/62)^N. Tuotahan voi sitten verrata halutessa vastaavaan bittijonon todennäköisyyteen jossa yhden saman bitin todennäköisyys on 1/2. Tuosta laskimella 32 bittisten bittijonojen samanlaisuuden todennäköisyys (1/2)^32 = 2,328e-10. Sitten kokeilemalla vähintään yhtä epätodennäköinen base62 merkkijono: (1/62)^6 = 1.761e-11. Eli jo 6 base62 merkkiä pitkien merkkijonojen "yhteentörmäyksen" todennäköisyys on pienempi kuin 32 bittisten bittijonojen.
 
Jos kiinnostava asia on tuo lopussa suluissa oleva todennäköisyys sille että kaksi satunnaista base62 merkkijonoa ovat samat, niin eikö sen voi laskea ihan tavanomaisella todennäköisyyslaskennalla? Yhden saman merkin todennäköisyys on silloin 1/62 ja saman N merkkiä pitkän merkkijonon (1/62)^N. Tuotahan voi sitten verrata halutessa vastaavaan bittijonon todennäköisyyteen jossa yhden saman bitin todennäköisyys on 1/2. Tuosta laskimella 32 bittisten bittijonojen samanlaisuuden todennäköisyys (1/2)^32 = 2,328e-10. Sitten kokeilemalla vähintään yhtä epätodennäköinen base62 merkkijono: (1/62)^6 = 1.761e-11. Eli jo 6 base62 merkkiä pitkien merkkijonojen "yhteentörmäyksen" todennäköisyys on pienempi kuin 32 bittisten bittijonojen.
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
 
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
Tuo luo neljä 8 bittistä satunnaisarvoa. Jos muunnat ne base62 merkeiksi ja saat vain neljä merkkiä, tarkoittaa se että muunnos on häviöllinen. Kahdeksan bittinen (1 tavu) arvo on välillä 0-255 ja base62 on 0-61. Esim. arvo 128 kääntyisi häviöttömästi base62 merkeiksi "24" (jos nopeasti laskin oikein). Nelitavuinen arvo sitten on jo jotain aivan muuta base62:ksi käännettynä. Häviöllinen muunnos riippuu millä tavalla se on tehty.

Jos saat neljä kirjainta, voi olla että ne ovat esim. iso 8859 tai extended ASCII muodossa ja siksi vievät 8 bittiä per merkki. Uint8 kääntyykin näppärästi suoraan tuohon muotoon ilman ongelmia. Tietämättä sen tarkemmin millä tuon käännöksen teet on vaikea asiaa analysoida enempää.

EDIT:
Laskin uusiksi...
 
Viimeksi muokattu:
... tarkoittaa se että muunnos on häviöllinen...
Oikeassa olet, törmäsin tähän itsekin kun aloin miettimään miten sen merkkijonon voi dekoodata (vastaus: ei voi, koska informaatiota häviää). Sain kuitenkin ongelmaani ratkaisun (joka siis oli että kuinka monta merkkiä tarvitsee, että todennäköisyys että saa kaksi samaa on "tarpeeksi pieni" (<0.2%)) – päädyin siihen että 4 merkkiä riittää, bittimäärä oli tässä oikeastaan vain sivuseikka. Kiitos vastaajille. PS. käytin Collision Calculator -sivun laskinta todennäköisyyden laskemiseen, vaikutti se että se osasi hommansa, ja lähdekoodin silmäilyn mukaan ottaa huomioon myös syntymäpäiväongelman.
 
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.
 

Uusimmat viestit

Statistiikka

Viestiketjuista
261 424
Viestejä
4 537 285
Jäsenet
74 796
Uusin jäsen
Kummila

Hinta.fi

Back
Ylös Bottom