Pieniä kysymyksiä ohjelmoinnista

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: 65
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.
 
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.
Eli periaatteessa perinteistä reverse proxya ei tarvitse ollenkaan? Onko tuossa tunnelissa mitään kaista rajoitusta?
 
Sanokaapas tietäjät, mikä on, kun en saa tulostettua näytölle mitään maan tietoja? GET palauttaa maan tiedot kyllä oikein konsoliin, mutta tulostuksessa mättää joku. Epäilys on, että ongelma on map-metodissa tai syntaksissa (country.name.common).

Tietoja haen täältä: studies.cs.helsinki.fi/restcountries/

import React, { useState } from 'react';

function CountrySearch() {
const [searchQuery, setSearchQuery] = useState('');
const [countries, setCountries] = useState([]);



const fetchCountries = async (query) => {
try {
const response = await fetch(`https://studies.cs.helsinki.fi/restcountries/api/name/${query}`);
if (!response.ok) {
throw new Error('Country not found');
}
const data = await response.json();
console.log("Fetched data:", data);
// const country = data[0];
//console.log("Country:", country.name.common);
setCountries(data);
} catch (error) {
console.error('Error fetching countries:', error);
setCountries([]);
}
}
const handleSearchChange = (event) => {
setSearchQuery(event.target.value);
};
const handleSearch = (event) => {
event.preventDefault();
fetchCountries(searchQuery);

};

return (
<div>
<h2>Country data</h2>
<form onSubmit={handleSearch}>
<div>
Country: <input type="text" value={searchQuery} onChange={handleSearchChange} />
</div>
<div>
<button type="submit">search</button>
</div>
</form>
<h2>Countries</h2>
<ul>
{Array.isArray(countries) && countries.map(country => (
<li key={country.ccn3}>
<h3>{country.name.common} ({country.name.official})</h3>
<p><strong>Capital:</strong> {country.capital?.[0]}</p>
<p><strong>Region:</strong> {country.region}</p>
</li>
))}
</ul>
</div>
);
}
const App = () => {
return <CountrySearch />;
}
export default App
 
Katsopa mikä tyyppi sieltä https://studies.cs.helsinki.fi/restcountries/api/name/{NAME} -endpointista tulee. Nyt luulet/toivot että se on array, mutta onko se? /all-endpointin paluutyyppi puolestaan olisi array.
ChatGPT lopulta osasi auttaa. Seuraavalla pätkällä lähti toimimaan. Tuo ei ole tuttua vielä itselleni, mutta ilmeisesti countries ei ole array, vaan se pitää pakottaa siihen muotoon?

{(Array.isArray(countries) ? countries : [countries]).map(country => (
<li key={country.ccn3}>
<h3>{country.capital}</h3>
 
Tuo ei ole tuttua vielä itselleni, mutta ilmeisesti countries ei ole array, vaan se pitää pakottaa siihen muotoon?

No riippuu ihan mitä haluat tehdä. Mutta yksittäisen maan kysely antaa vastaukseksi vain yksittäisen objektin. Eli tämän yhden maan tiedot, eikä mitään muuta. Tuo /all taas palauttaa listan objekteja eli usean maan tiedot. Alla esimerkki:

Koodi:
const country1 = {
    name: "Sweden"
}

const country2 = {
    name: "Finland"
}

const allCountries = [ {name: "Spain"}, {name: "Germany"} ]

Jos haluat käyttää tuollaisen listan map-metodia, niin sitten sun pitää kääriä yksittäinen maa listaan jotta voit sitä käyttää. Tai sitten luot oman komponentin yksittäisen maan ja usean maan näyttämiseen ja annat ensimmäiselle vain sen objektin ja jälkimmäiselle listan. Nämä voi tehdä monella tavalla.
 
Tarviiko cloudflare tunnelien kanssa ollenkaan ufw:ta? Nmapin mukaan vain ssh portti on auki, mutta ufw inactive.
 
Tarviiko cloudflare tunnelien kanssa ollenkaan ufw:ta? Nmapin mukaan vain ssh portti on auki, mutta ufw inactive.
Ei pitäs varmaan kommentoida asioita, joista ei oikein tiedä, nimittäin kun tuo Cloudflaren tarjooma ei oo tuttua, mutta et varmaan halua IP- tai porttiluvituksia siellä serverillä tehdä, vaan lähtökohtaisesti Cloudflaren päässä, jossa varmastikin mahdollisuudet konfiguroida, mistä tuonne tunneliin sallitaan yhteydet.

(Grafanan kyllä laitoin tarjolle juuri toiseen pilveen, että sinällään tuttuja kuvioita)
 
Serverien firewall yleensä estää ulkoapäin tulevaa liikennettä koska sieltä ne vihulaiset on tulossa mutta serveristä lähtevää ulosmenevää liikennettä firewallit eivät defaulttina estä.

Cloudflaren demoni kun käynnistetään sinun serverissä niin se "soittaa kotiin" eli ottaa sinun serveristä yhteyden cloudflaren servereihin ja sen jälkeen koko liikennöinti hoidetaan tällä samalla yhteydellä. Koska tämä alkaa ulospäin menevänä liikenteenä niin firewallien default configuroinnit ei tätä estä ja siksi tätä tunnelia varten ei tarvitse avata firewallin default konffauksen lisäksi mitään portteja vaan kaikki saa olla kiinni.

Jos sinulla ei ole mitään firewallia käynistetty niinkuin tuo "ufw inactive" tuntuisi kertovan niin tämä kuulostaa vaaralliselta. Pistä firewall vaan aktiiviseksi olipa se mikä tahansa joko ufw tai joku muu ja kaikki portit kiinni mitä sinä et itse tarvitse tämän tunnelin lisäksi.

Tai toimiihan kaikki toki ilmankin mitään firewallia jos sinä niin haluat. Tällöin tosin sen sun webbiserverin portti johon tunnelin liikenne ohjataan on auki myös tunnelin ohitse kenties koko maailmalle joka on yleensä epätoivottua. Yleensä kait eräs motivaatio tunnelin käyttöön on että vihulaiset ei pääse häiriköimään webbiserveriä suoraan avoimesta portista vaan kaikki liikenne kulkee cloudflaren kautta joka suodattaa osan häiriköinnistä pois.

Cloudflare mainostaa kahta mahdollisuutta konffata se tunneli kokonaan yhdestä paikasta joko sinun serveristä käsin cli komennoilla tai sitten cloudflaren webbisivulta käsin molemmat tunnelin päät samalla kertaa. Tämän lisäksi on kolmas mahdollisuus jota cloudflare ei kovasti mainosta eli tunnelin kummatkin päät konffataan erikseen. Serverin pää "config.yml" tiedostoa editoimalla ja cloudflaren pää webissä "DNS" sivulta ja minusta tämä kolmas on paljon selkeämpi kuin kumpikaan noista mitä cloudflare enemmän mainostaa etenkin jos yhteen tunneliin yritetään laittaa paljon erilaista liikennettä. Ehkä yhden webbisivun konffaus on helpoin tehdä cloudflaren webin "tunnel" sivulta niinkuin cloudflare kovasti houkuttelee konffauksen tekemään.
 
Viimeksi muokattu:
Minä jotenkin aattelin, ettei tuo serveri näkyis oletuksena muulle maailmalle mitenkään (ei julkista IP:tä tai nimeä), vaan entry point on jossain pilvessä, jossa voidaan konfiguroida se, miten liikennettä halutaan johonkin privaattiresurssiin päästää..

Se on ihan hyvää käytäntöä, että kaikki portit on kiinni, mitä ei jossain ympäristössä tarvita, mutta esim. AWS-maailmassa noi tehdään verkkotason access control listeissä tai instance tason security groupeissa, eikä serverillä, jossa ne minusta olis väärässä paikassa, kun yhteyksien pitäs tulla blokatuksi jo ennen, kuin mitään ei haluttua on päässy serverille saakka.

Tarvis varmaan kokeilla tuommoisen tunnelin konfigurointi. Ei oo vaan meikäläisen hommissa Cloudflarea tarvinnu, vaan kaikki menny näiden isojen pilvitoimijoiden pilvessä, mikä ei jossain konesaleissa ole sit asunut ja tietoliikenne jonkun toisen toimittajan tai asiakkaan itsensä vastuulla. Mut kiinnostaa, miten nää on eri toimijoilla tehty, miks tähän aloitin edes kirjoittamaan tuossa aiemmin.
 
Viimeksi muokattu:
Kai näitä voi tehdä monella tapaa riippuen tapauksesta ja tarpeesta, mutta kuuntelin vähän kummastuneena jotain keskustelua, kun oli laitettu Java Spring Boot -sovellus tarjolle jonnekin ja tehty IP whitelistaus sinne appikseen Springin securitylla. Missä se on kyllä minun makuuni väärässä paikassa, kun minusta fiksussa suunnittelussa appiksen edessä ois joku kuormantasaaja ja palomuuri, vaikka nykyään joku web application firewall, joka hoitais tuon IP-suodatuksen ja esim. rate limittauksen ja päästäis sovellukselle asti vain sallitun liikenteen. Noista pilvitarjoajien WAF:eista saa vielä tyypillisesti mukavat statistiikat + lokituksen, josta katsoa sovellukselle tulevaa liikennettä versus jotkut Javan lokit, joita sais sitten ite kerätä ja työntää jonnekin, vaikka sitten Grafanaan, missä pystyy kattomaan, mitä on tapahtunut. (muoks. tai pitää ne sovelluksen lokit ottaa joka tapauksessa talteen, mutta ite pitäs sit väsätä visualisoinnit, jos haluais ymmärtää, mitä tuossa sisääntulevassa liikenteessä on tapahtunut jollain aikavälillä.)

Tossa Grafanan ylläpitämisessäkin kuitenkin jonkin verran hommaa, kun hallitset ite asennuksen, tietoliikenteen, dashboardit, käyttäjät ja pääsynhallinnan. Ja jos käytetään lokien katseluun, niin päälle vielä kaikki lokien keruu, lokien tallennuspaikat ja niiden varmistukset, järkevät retentioajat jne jne., että ihan mielellään ite käyttää jotain valmista, vaikka ny Datadogia tai jotain vastaavaa, jos joku vaan suostuu maksamaan laskun :D
 
Viimeksi muokattu:
No laitoin tuon ufw päälle. Ei kai siitä haittaakaan ole kun vain portti 22 on auki.
Yleensä "ylimääräisestä" palomuurista ei ole haittaa, toki se aavistuksen syö resursseja mutta nykylaitteilla häviävän vähän ellei palomuurissa ole jotain todella monimutkaisia sääntöjä. Päinvastoin, ylimääräinen palomuuri saattaa pelastaa päivän jos sitä edeltävä palomuuri syystä tai toisesta vuotaa.

Kun töissä on tottunut mahdollisuuksien mukaan blokkaamaan joka paikasta kaiken ylimääräisen liikenteen niin kotonakin on nykyään suunnilleen jokaisessa laitteessa mihin palomuurin saa, se käytössä. Toki tuo tuo aavistuksen lisää ylläpidettävää mutta kun on seuraillut tätä nykypäivän maailmanmenoa kun suunnilleen joka päivä uutisoidaan jostain tietomurrosta niin mieluummin yksi "turha" palomuuri kuin ei muuria.
 
Meinasin itekin kirjoittaa jossain välissä, että jonkinlaisena lisäturvana ei varmaankaan ole haittaa tuollaisista ylimääräisistä palomuureista, mutta ne on tosiaan sit yks paikka lisää ylläpidettävänä, kun yhteyksiä hallitaan ja samalla tarkoittaa minusta sitä, että siltä serveriltä pitäs olla portti 22 auki internetiin SSH:ta varten, mikä ei varsinaisesti ole suositeltavaa. Eikö noita kriittisiä SSH-reikiä ole paljastunut aika hiljattain useampia.. (muoksista. jos sen SSH:n pystyy avaamaan vain johonkin yhteen staattiseen osoitteeseen, josta ite liikennöi ylläpidossa, niin se lienee jo parempi)

Ts. ihan tuon ylläpidon kannalta luottaisin varmaan mieluummin alustan tarjoajan palomuuriin kuin alkaisin esim. availemaan erikseen tota SSH:ta ylläpitoa varten ja tekemään kaikki nuo yhteysavaukset moneen paikkaan.
 
Viimeksi muokattu:
Meinasin itekin kirjoittaa jossain välissä, että jonkinlaisena lisäturvana ei varmaankaan ole haittaa tuollaisista ylimääräisistä palomuureista, mutta ne on tosiaan sit yks paikka lisää ylläpidettävänä, kun yhteyksiä hallitaan ja samalla tarkoittaa minusta sitä, että siltä serveriltä pitäs olla portti 22 auki internetiin SSH:ta varten, mikä ei varsinaisesti ole suositeltavaa. Eikö noita kriittisiä SSH-reikiä ole paljastunut aika hiljattain useampia.. (muoksista. jos sen SSH:n pystyy avaamaan vain johonkin yhteen staattiseen osoitteeseen, josta ite liikennöi ylläpidossa, niin se lienee jo parempi)

Ts. ihan tuon ylläpidon kannalta luottaisin varmaan mieluummin alustan tarjoajan palomuuriin kuin alkaisin esim. availemaan erikseen tota SSH:ta ylläpitoa varten ja tekemään kaikki nuo yhteysavaukset moneen paikkaan.
Eikö se defacto suojauksissa ole palomuuri + vpn + ssh ? Tietty vielä porttinumerot muut kuin oletukset. Ja ne 2FA tunnistautumiset.
 
Eikö se defacto suojauksissa ole palomuuri + vpn + ssh ? Tietty vielä porttinumerot muut kuin oletukset. Ja ne 2FA tunnistautumiset.
Enpä tiedä sanoa tuosta enempiä.. Varmaan tuo defacto riippuu verkkoympäristöstä ja mitä ollaan tekemässä. Julkipilveä on yhdistetty asiakkaan ympäristöihin VPN-tunneli rakentamalla. Yhdessä paikassa oli mahdollisuus käyttää AWS Direct Connectia, joka on ihan dedikoitu kiinteä putkensa. Mut kyllä, onhan nämä kaikenlaiset VPN-ratkaisut hirveän yleisiä.

Tuossa edellisessä oli vaan ajatuksena se, että jos serverille laitetaan päälle ufw tai joku vastaava, mutta jätetään portti 22 auki maailmalle, niin voinee kritisoida sitä, tuleeko tuosta lisäturvaa vai ei.
 
Viimeksi muokattu:
Tunteeko kukaan Basic macro-kieltä? Olen tekemässä macroa LibreOffice Calcille ja minulla on seuraavan kaltainen pulma arrayn kanssa:

a(2) = 10
For i = 0 To 3 Step 1
a(i) = b + a(i)
Next

Pitäisi siis saada arraylle a() lisättyä sen aikaisempi arvo.
 
Tunteeko kukaan Basic macro-kieltä? Olen tekemässä macroa LibreOffice Calcille ja minulla on seuraavan kaltainen pulma arrayn kanssa:

a(2) = 10
For i = 0 To 3 Step 1
a(i) = b + a(i)
Next

Pitäisi siis saada arraylle a() lisättyä sen aikaisempi arvo.
Mikäs tuo b on?
 
Kysyn täältä ennen kuin alan hakkaamaan SQL:ää. Minun pitää saadaa SQL tietokantatauluun lisättyä rivejä yksi kerrallaan. Rivien perusteella luodaan sanoma, joten usean rivin kerrallaan lisääminen ei toimi (olen kokeillut :D ). Eli pitää siis hakea toisista tauluista arvoja ja lisätä ne yhteen tauluun rivi kerrallaan. Tämä homma tehdään vain kerran tai hyvin satunnaisesti joten suorituskyvyllä ei ole merkitystä. Onko kursori järkevin toteutustapa vai voiko homman tehdä jotenkin muuten? Lisättäviä rivejä on noin 100.
 
Kysyn täältä ennen kuin alan hakkaamaan SQL:ää. Minun pitää saadaa SQL tietokantatauluun lisättyä rivejä yksi kerrallaan. Rivien perusteella luodaan sanoma, joten usean rivin kerrallaan lisääminen ei toimi (olen kokeillut :D ). Eli pitää siis hakea toisista tauluista arvoja ja lisätä ne yhteen tauluun rivi kerrallaan. Tämä homma tehdään vain kerran tai hyvin satunnaisesti joten suorituskyvyllä ei ole merkitystä. Onko kursori järkevin toteutustapa vai voiko homman tehdä jotenkin muuten? Lisättäviä rivejä on noin 100.
Et maininnut mikä kanta on kyseessä. Mitä tarkoittaa sanoma tässä kontekstissa?

Kursoria on tullut käytettyä lähinnä suurissa eräajoissa ja se tuntuu vähän kärpäsen ampumiselta tykillä näin pieneen hommaan. Ihan for loop voisi olla simppelimpi jos oikeasti on pakko toimia rivi kerrallaan.
 
Kanta on Microsoft SQL Server. Sain jo homman tehtyä kursorilla. Kokeilin testiympäristössä viidellä sanomalla. Tämä ei ole minun pääasiallista työtä niin ei tarvitse olla niin viimeisen päälle tehty toteutus kunhan saa homman hoidettua.
Menemättä liikaa yksityiskohtiin sanoma on datajoukko, joka lähetetään toiseen järjestelmään. Tiedot poimitaan tästä tietokannasta mihin heräte luodaan herätteen avaimien perusteella.
En ole saanut for looppia toimimaan kun SQL ei ole samankaltaista kuin C, mutta joskus olisi pakko tehdä asioita SQL:n kannalta vähän hölmösti..
Minun puolesta homma OK, voidaan kuitenkin jatkaa keskustelua mikäli tästä jollekin muulle on hyötyä!
 
Olen tekemässä Fitech kurssin tehtävää, mutta en tajua tätä:
Kirjoita yksiparametrinen funktio summaLukuunAsti(asti), joka kutsuttaessa palauttaa lukujen 0 ja asti välillä olevien lukujen summan. Huom! Funktion ei tule ottaa lukuja 0 ja asti huomioon. Esimerkiksi kutsu summaValilta(3) palauttaa arvon 3. Vastaavasti kutsu summaValilta(4) palauttaa arvon 6. Voit olettaa, että luku a on aina suurempi kuin 0. Vinkki: voit harjoitella tässä toistolausetta, mutta tämän ratkaisuun löytyy myös matemaattinen kaava.
Voisiko joku neuvoa?
 
Olen tekemässä Fitech kurssin tehtävää, mutta en tajua tätä:
Kirjoita yksiparametrinen funktio summaLukuunAsti(asti), joka kutsuttaessa palauttaa lukujen 0 ja asti välillä olevien lukujen summan. Huom! Funktion ei tule ottaa lukuja 0 ja asti huomioon. Esimerkiksi kutsu summaValilta(3) palauttaa arvon 3. Vastaavasti kutsu summaValilta(4) palauttaa arvon 6. Voit olettaa, että luku a on aina suurempi kuin 0. Vinkki: voit harjoitella tässä toistolausetta, mutta tämän ratkaisuun löytyy myös matemaattinen kaava.
Voisiko joku neuvoa?
summaLukuun siis palauttaa summan lukujen 1 ja asti-1 välillä?

summaValilta(3) meinaa siis 1+2.
summaValilta(4) meinaa siis 1+2+3.
jne.

e: ennoo iha varma kyl itekkää, jännän epäselvästi kerrottu. Itekki menin nyt vähä solmuun :D

esim onko
summaValilta(2) 1 ja
summaValilta(1) 0 ?

e: näissä kahdessa siis hämää, ku pitäis summata jotain, mut nollaa eikä argumenttia lasketa. Varmaan ihan oikein palauttaa noin tai sit virheviestiä?
 
Viimeksi muokattu:
summaLukuun siis palauttaa summan lukujen 1 ja asti-1 välillä?

summaValilta(3) meinaa siis 1+2.
summaValilta(4) meinaa siis 1+2+3.
jne.

ennoo iha varma kyl itekkää, jännän epäselvästi kerrottu.

On se juuri noin. " Vastaavasti kutsu summaValilta(4) palauttaa arvon 6. " --> "summaValilta(4) meinaa siis 1+2+3."
 
Joo, ilmeisesti haetaan joko aritmeettista summaa, joka pitäisi osata muodostaa funktiossa tuollai 1 ja (argumentti - 1) välisistä luvuista, tai sitten perinteinen toistolausetoteutus ja summan kasvattaminen toistolausekkeen sisällä.

Pitänyt varmaan vaan tehtävänikkarin keksiä tuollainen lisähämmästys, ettei voi ihan suoraan kopsata jostain netin syövereistä :D

Voisko kysyjä laittaa jotain omaa runkoa näkyviin ja avata, mikä ei tarkalleen aukea, kun vähän hankala tätä on sen paremmin selittää kuin sata ja tuhat lähdettä netissä, joka toistolauseita ja summaamista käsittelee.
 
Kiitos vinkeistä. Vastaus olikin yksinkertainen ja mun pienet aivot ei vain käsittäneet kysymystä :D

main() {
print(summaLukuunAsti(4));
}
summaLukuunAsti(asti){
var summa = 0;
for (var i = 0; i < asti; i++) {
summa = summa + i;
}
return summa;
}
 
Kiitos vinkeistä. Vastaus olikin yksinkertainen ja mun pienet aivot ei vain käsittäneet kysymystä :D

* snip*
Täällon tämmönen koodiblokkitoiminto, jota kannattaa koodeissa käyttää, niin ei oo niin kamalaa lukea kuin sisentämätöntä perustekstiä.

Koodi:
main() {
  print(summaLukuunAsti(4));
}

summaLukuunAsti(asti){
  var summa = 0;
  for (var i = 0; i < asti; i++) {
     summa = summa + i;
  }
    return summa;
  }

Tässä on varmaan pieni gotcha sen suhteen, mitä tuon funktion pitäs palauttaa argumentilla 1, jos kerran kaikki nollaa suuremmat kelpaa argumentiksi ja jos tuo tehtävänanto myös sanoo, että et sais ottaa lukua 0 huomioon tuolla for-loopissa.

Eli jos summaLukuunAsti(1) pitäs olla 1 edellisillä ehdoilla, niin joudut vähän vielä miettimään tota toteutusta ja miten käsittelet tuon keissin.

(oon kyllä niin sekaisin työviikosta taas, että toivottavasti en vaan ite sekoile jotain :D)
 
Täällon tämmönen koodiblokkitoiminto, jota kannattaa koodeissa käyttää, niin ei oo niin kamalaa lukea kuin sisentämätöntä perustekstiä.

Koodi:
main() {
  print(summaLukuunAsti(4));
}

summaLukuunAsti(asti){
  var summa = 0;
  for (var i = 0; i < asti; i++) {
     summa = summa + i;
  }
    return summa;
  }

Tässä on varmaan pieni gotcha sen suhteen, mitä tuon funktion pitäs palauttaa argumentilla 1, jos kerran kaikki nollaa suuremmat kelpaa argumentiksi ja jos tuo tehtävänanto myös sanoo, että et sais ottaa lukua 0 huomioon tuolla for-loopissa.

Eli jos summaLukuunAsti(1) pitäs olla 1 edellisillä ehdoilla, niin joudut vähän vielä miettimään tota toteutusta ja miten käsittelet tuon keissin.

(oon kyllä niin sekaisin työviikosta taas, että toivottavasti en vaan ite sekoile jotain :D)
Tästä pääsisikin mukavasti yksikkötestien kirjoittamiseen.. :)
 
Täällon tämmönen koodiblokkitoiminto, jota kannattaa koodeissa käyttää, niin ei oo niin kamalaa lukea kuin sisentämätöntä perustekstiä.

Koodi:
main() {
  print(summaLukuunAsti(4));
}

summaLukuunAsti(asti){
  var summa = 0;
  for (var i = 0; i < asti; i++) {
     summa = summa + i;
  }
    return summa;
  }

Tässä on varmaan pieni gotcha sen suhteen, mitä tuon funktion pitäs palauttaa argumentilla 1, jos kerran kaikki nollaa suuremmat kelpaa argumentiksi ja jos tuo tehtävänanto myös sanoo, että et sais ottaa lukua 0 huomioon tuolla for-loopissa.

Eli jos summaLukuunAsti(1) pitäs olla 1 edellisillä ehdoilla, niin joudut vähän vielä miettimään tota toteutusta ja miten käsittelet tuon keissin.

(oon kyllä niin sekaisin työviikosta taas, että toivottavasti en vaan ite sekoile jotain :D)

Okei, kuitenkin tuo meni läpi ja mallivastaus oli samanlainen :D
 
Ok, sitten se varmasti on ok. Tuo oli tuo tehtävänanto vaan vähän hämärä, ja ois saattanu ite kysyä tekijältä, mitä tuon pitäs palauttaa ykkösellä.
ihan jo oppimisen kannaltaki olisi hyvä kysyä olisiko jokin toinen ratkaisu kelvannut. 0,1,2 oli kuitenki sellaiset ainoat erikoisemmat arvot argumentille, joiden tuottama palaute tehtäväannon mukaan voisi olla mielestäni tulkinnanvaraisia. Ehkä aattelen liian pitkälle.
 
Tehtävänannossa sanotaan että "voit harjoitella toistolauseketta" mutta mainitaan myös että löytyy matemaattinen kaavakin. Eli eikös tässä haeta yksinkertaista Gaussin summaa ensimmäiselle n:lle kokonaisluvulle:
1726851733125.png
Missä pikkutwistinä n on asti-1.

Pikaiseen raapaistu malliratkaisu:
Koodi:
(defun summaLukuunAsti (asti)
  (/ (* (- asti 1) (+ (- asti 1) 1)) 2)
)
 
ihan jo oppimisen kannaltaki olisi hyvä kysyä olisiko jokin toinen ratkaisu kelvannut. 0,1,2 oli kuitenki sellaiset ainoat erikoisemmat arvot argumentille, joiden tuottama palaute tehtäväannon mukaan voisi olla mielestäni tulkinnanvaraisia. Ehkä aattelen liian pitkälle.
Tuo noissa "koulutehtävissä" on itsellänikin aina ongelmana kun ajattelee liian "täydellisesti", jää aina nuo poikkeustapaukset vaivaamaan kun niitä ei ole speksattu millään tavalla. Tuossa on se huono puoli että yleensä oikeassa elämässä kaikissa tapauksissa vastaus pitää olla jotenkin deterministinen eli esimerkiksi noissa 0, 1, -1 -tapauksissa pitäisi olla määritelty mitä funktio palauttaa. Mielestäni tuo on väärä tapa opettaa ettei oteta poikkeuksia huomioon. Joko pitää antaa rehdisti virhe tai joku määrätty arvo mutta ei saisi olla tuollaista "epämääräisessä tapauksessa vastaus voi olla jotain, mitä vaan".
 
Tuo noissa "koulutehtävissä" on itsellänikin aina ongelmana kun ajattelee liian "täydellisesti", jää aina nuo poikkeustapaukset vaivaamaan kun niitä ei ole speksattu millään tavalla. Tuossa on se huono puoli että yleensä oikeassa elämässä kaikissa tapauksissa vastaus pitää olla jotenkin deterministinen eli esimerkiksi noissa 0, 1, -1 -tapauksissa pitäisi olla määritelty mitä funktio palauttaa. Mielestäni tuo on väärä tapa opettaa ettei oteta poikkeuksia huomioon. Joko pitää antaa rehdisti virhe tai joku määrätty arvo mutta ei saisi olla tuollaista "epämääräisessä tapauksessa vastaus voi olla jotain, mitä vaan".
Virheenkäsittely on kyl tärkeä osa koodausta, että sinänsä oikeassa vastauksessa voisi/pitäisi olla se.
 
Dockerin kanssa vähän ongelmia. Yritän saada kontin latamaan tiedoston hostilta, mutta se ei onnistu. Voluumi komento on muotoa: home/example/public/test.json:/public/test.json Mutta kontti näyttää että tiedostoa ei ole saatavilla. Eikö noiden voluumien idea ole se että jos host koneella on jotain tiedostoja niin kontti voi käyttää niitä kuin kontin sisäisiä filuja.
 
Dockerin kanssa vähän ongelmia. Yritän saada kontin latamaan tiedoston hostilta, mutta se ei onnistu. Voluumi komento on muotoa: home/example/public/test.json:/public/test.json Mutta kontti näyttää että tiedostoa ei ole saatavilla. Eikö noiden voluumien idea ole se että jos host koneella on jotain tiedostoja niin kontti voi käyttää niitä kuin kontin sisäisiä filuja.

Pikaisella vilkaisulla näyttäisi että sulta saattaa puuttua /-merkki tuosta "home"-kansion edestä.
 
Tuo merkki jäi tuosta viestistä vain. Kokeilin bind mountin tekemistä eri imagella ja se onnistui. En jaksa enää säätää tämän kanssa vaan keksin jonkun kierto viritelmän.
 
Tuo merkki jäi tuosta viestistä vain. Kokeilin bind mountin tekemistä eri imagella ja se onnistui. En jaksa enää säätää tämän kanssa vaan keksin jonkun kierto viritelmän.

Tulevaisuutta varten: Voi olla oikista kysymys, siis kontissa suorittavan käyttäjän.
 
Saisiko neuvoja tämmöiseen tehtävään. En osaa laittaa tuota viimeistä kohtaa:
Tehtäväpohjassa on ohjelma, joka lukee käyttäjältä tehtäviä kunnes käyttäjä syöttää tyhjän merkkijonon (syote == ''). Tämän jälkeen ohjelma tulostaa tehtävien lukumäärän ja tehtävät sekä kysyy käyttäjältä poistettavaa tehtävää. Täydennä ohjelmaa ensin siten, että käyttäjän syöttämä poistettava tehtävä poistetaan listalta. Täydennä ohjelmaa tämän jälkeen vielä siten, että mikäli lista on tehtävän poistamisen jälkeen tyhjä, ohjelman suoritus poistuu toistolauseesta.

Koodi:
import 'dart:io';

main() {
  var lista = [];
  print('Syötä tehtäviä, tyhjä lopettaa.');

  while (true) {
    var syote = stdin.readLineSync();
    if (syote == '') {
      break;
    }

    lista.add(syote);
  }

  while (true) {
    tulostaTehtavat(lista);
    print('Mikä poistetaan? (tyhjä lopettaa)');
    var syote = stdin.readLineSync();
    if (syote == '') {
      break;
    }
    
   lista.remove(syote);

  }

  print('Kiitos!');

}

tulostaTehtavat(lista) {
  var koko = lista.length;
  print('Tehtäviä jäljellä: $koko');
  for (var i = 0; i < lista.length; i++) {
    print(lista[i]);
  }
}
 
Saisiko neuvoja tämmöiseen tehtävään. En osaa laittaa tuota viimeistä kohtaa:
Tehtäväpohjassa on ohjelma, joka lukee käyttäjältä tehtäviä kunnes käyttäjä syöttää tyhjän merkkijonon (syote == ''). Tämän jälkeen ohjelma tulostaa tehtävien lukumäärän ja tehtävät sekä kysyy käyttäjältä poistettavaa tehtävää. Täydennä ohjelmaa ensin siten, että käyttäjän syöttämä poistettava tehtävä poistetaan listalta. Täydennä ohjelmaa tämän jälkeen vielä siten, että mikäli lista on tehtävän poistamisen jälkeen tyhjä, ohjelman suoritus poistuu toistolauseesta.

Koodi:
import 'dart:io';

main() {
  var lista = [];
  print('Syötä tehtäviä, tyhjä lopettaa.');

  while (true) {
    var syote = stdin.readLineSync();
    if (syote == '') {
      break;
    }

    lista.add(syote);
  }

  while (true) {
    tulostaTehtavat(lista);
    print('Mikä poistetaan? (tyhjä lopettaa)');
    var syote = stdin.readLineSync();
    if (syote == '') {
      break;
    }
   
   lista.remove(syote);

  }

  print('Kiitos!');

}

tulostaTehtavat(lista) {
  var koko = lista.length;
  print('Tehtäviä jäljellä: $koko');
  for (var i = 0; i < lista.length; i++) {
    print(lista[i]);
  }
}
Tuon lista.removen jälkeen vertaat listan pituutta ja jos on nolla eli tyhjä niin breikkaat ulos.
 
Saisiko neuvoja tämmöiseen tehtävään. En osaa laittaa tuota viimeistä kohtaa:
Tehtäväpohjassa on ohjelma, joka lukee käyttäjältä tehtäviä kunnes käyttäjä syöttää tyhjän merkkijonon (syote == ''). Tämän jälkeen ohjelma tulostaa tehtävien lukumäärän ja tehtävät sekä kysyy käyttäjältä poistettavaa tehtävää. Täydennä ohjelmaa ensin siten, että käyttäjän syöttämä poistettava tehtävä poistetaan listalta. Täydennä ohjelmaa tämän jälkeen vielä siten, että mikäli lista on tehtävän poistamisen jälkeen tyhjä, ohjelman suoritus poistuu toistolauseesta.
En ole satavarma sainko kiinni siitä, mitä haluat tehdä. Mutta oletan, että halutaan poistua suoraan "Kiitos!" -vaiheeseen silloin, kun lista on tyhjänä. Helpointa siis lienee, että `while(true)` sijaan tarkastetaankin, onko lista tyhjä: `while(lista.isNotEmpty)`. Ymmärsinköhän oikein?

JavaScript:
import 'dart:io';

main() {
  List<String> lista = [];

  print('Syötä tehtäviä, tyhjä lopettaa.');

  while (true) {
    String? syote = stdin.readLineSync();
    if (syote == '') {
      break;
    }

    lista.add(syote!);
  }

  while (lista.isNotEmpty) {
    tulostaTehtavat(lista);
    print('Mikä poistetaan? (tyhjä lopettaa)');

    String? syote = stdin.readLineSync();

    if (syote == '') {
      break;
    }

    lista.remove(syote);
  }

  print('Kiitos!');
}

tulostaTehtavat(List<String> lista) {
  int koko = lista.length;

  print('Tehtäviä jäljellä: $koko');
  for (var i = 0; i < lista.length; i++) {
    print(lista[i]);
  }
}
 

Statistiikka

Viestiketjuista
258 378
Viestejä
4 493 486
Jäsenet
74 122
Uusin jäsen
Elmeri Hannukainen

Hinta.fi

Back
Ylös Bottom