Pieniä kysymyksiä ohjelmoinnista

Siinä varmaan täytyy mitata aikaa ja sitten jotain muuta asiaa.
En usko, että aikaa käytetään monissa jutuissa ollenkaan, kun koneiden, levyjen jne. nopeus vaihtelee paljon. Täytynee vain testailla mitä asennuksen eri vaiheet kestää, kopioitavien tiedostojen määrät ja koot, rekisterin muokkaukset yms. ja jakaa osuudet noiden mukaan.
 
Eiköhän 99% kaikista progress palkeista perustu ihan puhtaasti siihen, että tiedetään suunnilleen kuinka monta operaatiota (vaikka nyt esim. kopioitavaa/käännettävää tiedostoa, rekisterimuutosta yms.) on tehtävänä ja näitä seuraamalla saadaan edistyminen laskettua.
Karkean aika-arvion saa sitten ihan puhtaasti laskemalla kulunut aika / edistymis-%. Harvassa on tilanteet, joissa tarvittaisiin tätä sivistyneempää toteutusta.
 
asennuksessa voi olla se että kun tiedetään että valmis asennus vie esim 4.7 gigaa niin pidetään kirjaa kirjotettujen tiedostojen koosta sekä kuluneesta ajasta ja lasketaan palkin pituus sekä aika-arvio siitä.

Esim:
estimation.png
 
Osaisko joku kertoa, miten latauspalkit toimivat? Tarkoitan niitä, joissa näkyy, kun joku asia lataantuu nollasta sataan prosenttiin. Tiedoston latautuminen verkosta on aika triviaali, mutta esimerkiksi jonkun ohjelman asentuminen koneelle, tai koodin kääntyminen.

http requissa on kai edes turha esittää prosentteja tai aikaa! Giffin/css transun looppaus pitäis olla jo defacto. Ellei sitten jollain prefligterilla kerrota datan määrä ja lasteta putkesta perille tulleet bitit.

Tuossa kun työn määrä tiedetään, esim n levylle kirjoitusta.
Voidaan jokaisen iteraaton välissä laskea ihan vaan prosentti i++/n.
 
Osaako joku vähä jeesata noden kanssa, yritän poistaa JSON tiedostosta tavaraa splice():llä mutta jotain olennaista taitaa puuttua.

Koodi:
// jsoni muuttujaks
var obj = require("./json.json);

// select valikon body-parser post value (formista)
var key = req.body.sel

// sitte loopilla json objektia läpi kunnes mätsää tohon 'key' muuttujaa (mätsään json objektin 'id' arvoon
  for (var t = 0; t < obj.length; t++) {
    if (key == obj[t].id) {
      obj.splice([t], 1);
    }
  }

Tommone setti kyllä poistaa muuttujasta oikeen elementin (?), mutta ei itse JSON tiedostosta. Tarvineeko tohon sitte jonku writeFile() hässäkän vielä kaveriks? Itsellä menee sormi suuhun.
 
En tiedä ymmärsinkö kysymystä oikein, mutta muuttuja on nimensä mukaisesti muuttuja tietokoneen muistissa ja ilmeisesti jos haluamasi lopputulos on filun kirjotus levylle, niin se pitää tallentaa sinne write:lla. Esim:

Writing JSON object to a JSON file with fs.writeFileSync

Muutenkin olisi hyvä tapa käyttää aina const:a ja let:a casesta riippuen var:n sijaan jos haluaa mennä funktionaalisen ohjelmoinnin suuntaan, vaikka const ei "oikeasti" ole immutable.

Delete:llä voit muuten poistaa suoraan key:llä elementin json:sta.

Remove json element
 
Viimeksi muokattu:
En tiedä ymmärsinkö kysymystä oikein, mutta muuttuja on nimensä mukaisesti muuttuja tietokoneen muistissa ja ilmeisesti jos haluamasi lopputulos on filun kirjotus levylle, niin se pitää tallentaa sinne write:lla. Esim:

Writing JSON object to a JSON file with fs.writeFileSync

Muutenkin olisi hyvä tapa käyttää aina const:a ja let:a casesta riippuen var:n sijaan jos haluaa mennä funktionaalisen ohjelmoinnin suuntaan, vaikka const ei "oikeasti" ole immutable.

Delete:llä voit muuten poistaa suoraan key:llä elementin json:sta.

Remove json element

Joo, uumoilin että pitää vielä itse jsonia rukata mutta koodi ei tahtonu taipua. Ongelmaksi vaan jää, että kun tallennan ton obj muuttujan josta on poistettu elementti 'key' muuttujan perusteella niin tilalle jää null.

Eli [{ ... }, null, { ... } ] jos olen poistanut tokan elementin tosta välistä.

Tällä tallennan/muokkaan:

Koodi:
fs.writeFileSync("./json.json", JSON.stringify(obj, null, 4));

E: tai otetaas takapakkia eli delete obj[key] jätti nullin JSON:iin, mutta splice():llä pysyy puhtaana. Nyt homma skulaa, tai sitten demo efekti :P
 
Viimeksi muokattu:
Joo, uumoilin että pitää vielä itse jsonia rukata mutta koodi ei tahtonu taipua. Ongelmaksi vaan jää, että kun tallennan ton obj muuttujan josta on poistettu elementti 'key' muuttujan perusteella niin tilalle jää null.

Eli [{ ... }, null, { ... } ] jos olen poistanut tokan elementin tosta välistä.

Tällä tallennan/muokkaan:

Koodi:
fs.writeFileSync("./json.json", JSON.stringify(obj, null, 4));

E: tai otetaas takapakkia eli delete obj[key] jätti nullin JSON:iin, mutta splice():llä pysyy puhtaana. Nyt homma skulaa, tai sitten demo efekti :p

vähän aihetta sivuten, ei varsinaisesti liity ongelmaan! mutta... :joy::joy:

for, forEach ja each kannattaa unohtaa heti alkuunsa Js kanssa.
muumuassa filter, map ja reduce ovat tehokkaimmat työkalut mitä js tarjoaa taulukoille.
Näillä voit mm ketjuttaa 'loopattavia' toimintoja. ja selkeyttää koodia aikalailla.

Esim.
Kuvitellaan että haluat korottaa kaikkien oluiden hintaa eurolla ja laskea lopuksi oluiden keski hinnan...

Koodi:
let oluidenKHinta = kaikkiTuotteet
  .filter(tuote => tuote.kategoria === 'olut')
  .map(olut => (olut.hinta += 1))
  .reduce((acc, cur, idx, arr) => {
    return ++idx < arr.length ? (acc += cur) : (acc += cur) / arr.length
  })

Koodi:
let oluidenKHinta = kaikkiTuotteet
  .filter(tuote => {
    if (tuote.kategoria === 'olut') {
      return tuote
    }
  })
  .map(olut => {
    return (olut.hinta += 1)
  })
  .reduce((acc, cur, idx, arr) => {
    if (++idx < arr.length) {
      return (acc += cur)
    }
    return (acc += cur) / arr.length
  })

Ja sinun tapauksessa

Koodi:
let id = 3
let array = [{ id: 2 }, { id: 3 }, { id: 1 }]
// eli jokainen true palautuu uutena taulukkona
let newArray = array.filter(element => element.id !== id)

// newArray === [{ id: 2 }, { id: 1 }]
 
Koodailin tuossa tekstipohjaisen UNO-pelin. Onko tämän tasoinen projekti portfoliotavaraa jos ajatellaan junioripaikkoja vai onko tämä vielä liian simppeli? Peliä voi pelata 2-4 pelaajaa ja toimintakortit ja kaikki muut perussäännöt toimii.

Varmaan ainakin testit ja graafisen käyttöliittymän tohon tarvitsisi lisäksi?
 
Koodailin tuossa tekstipohjaisen UNO-pelin. Onko tämän tasoinen projekti portfoliotavaraa jos ajatellaan junioripaikkoja vai onko tämä vielä liian simppeli? Peliä voi pelata 2-4 pelaajaa ja toimintakortit ja kaikki muut perussäännöt toimii.

Varmaan ainakin testit ja graafisen käyttöliittymän tohon tarvitsisi lisäksi?
Oliko tässä linkkiä itse koodiin?
 
Oliko tässä linkkiä itse koodiin?
En ole laittanut koodia GitHubiin vielä, koska siinä ei ole vielä käyttöliittymää. Siis edes tekstipohjaista. En ole myöskään tehnyt minkäänlaista virheenhallintaa. Tällä hetkellä tuossa on omat luokat kortille, pakalle, pelaajalle ja pelille.

Tarkoitus oli tehdä myös joku simppeli tekoäly tietokonepelaajille, mutta ennen kuin turaan enempää aikaa tämän kanssa niin mietin vaan näin yleisesti, että onko tämän tasoisessa projektissa ainesta portfolioon asti, koska jos ei ole niin jätän suoraan kaiken hienosäädön tekemättä ja siirryn tekemään jotain toista projektia.
 
En ole laittanut koodia GitHubiin vielä, koska siinä ei ole vielä käyttöliittymää. Siis edes tekstipohjaista. En ole myöskään tehnyt minkäänlaista virheenhallintaa. Tällä hetkellä tuossa on omat luokat kortille, pakalle, pelaajalle ja pelille.

Tarkoitus oli tehdä myös joku simppeli tekoäly tietokonepelaajille, mutta ennen kuin turaan enempää aikaa tämän kanssa niin mietin vaan näin yleisesti, että onko tämän tasoisessa projektissa ainesta portfolioon asti, koska jos ei ole niin jätän suoraan kaiken hienosäädön tekemättä ja siirryn tekemään jotain toista projektia.

On. Missä tahansa aiheessa on ainesta, mutta oleellista on tehdä ns. valmista. Eli tee käyttöliittymä, virheenhallinta, testit, jonkinlainen dokumentaatio jne. Rekrytoija voi sittwn helposti kokeilla tekelettäsi ja saa nopeasti kiinni, mistä on kyse.
 
Koodailin tuossa tekstipohjaisen UNO-pelin. Onko tämän tasoinen projekti portfoliotavaraa jos ajatellaan junioripaikkoja vai onko tämä vielä liian simppeli? Peliä voi pelata 2-4 pelaajaa ja toimintakortit ja kaikki muut perussäännöt toimii.

Varmaan ainakin testit ja graafisen käyttöliittymän tohon tarvitsisi lisäksi?

Projektin aiheella ei kyllä ole mitään väliä ja se onkin sun murheistas pienin, joten sitä on turha miettiä! Teet mitä teet mutta tee se noudattamalla jo hyväksi havaittuja tapoja.

Enemmän kiinnittäisin huomiota kommentointiin, dokumentointiin, testeihin, mahdollisiin suunnittelumalleihin ja siihen kuuluisaan uudelleen käytettävyyteen.

Kukaan ei jaksa reverse-engineerailla mitää spagettikoodia varsinkaan rekrytoija. :bored:
 
Ok. Tämä UNO-projekti lähti ohjelmoinnin moocin peruskurssin viimeisestä tehtävästä, jossa piti suunnitella jotain pientä tekoälyjuttua valmiiseen UNO-pelipohjaan.

Moocissa on kielenä Java ja itse olen kuitenkin seurannut kurssia Pythonilla ilman pääsyä lähdemateriaaleihin. Päätin tehdä siis alustavana tehtävänä koko pelin itse, mutta siihen menikin yllättävän kauan aikaa ja kurssi on nyt ollut pari viikkoa tauolla. Taidan ensin kahlata tuon moocin toisen puoliskon läpi ja sen jälkeen palata tähän projektiin.
 
Mikä kumma on kun deleteOne ei pelitä mongoDB:ssä.

Koodi:
const db = client.db(dbName);

var query = {
            "id": req.body.sel
          };

          //console.log(query);  // jos valittu id 1 niin console output: { id: 1 }

          try {
            db.collection("collection")
            .deleteOne(query)
              client.close();
          } catch (e) {
            print(e);
            }

Lisätään vielä että poistaa kyllä jos käyttää req.bodyn sijaan staattista arvoa. Esim: var query = { "id" = 1 } tai var query = { "username": "Spongebob Squarepants" }

Tässä vielä esimerkki elementistä:

Koodi:
{
    "_id": {
        "$oid": "5c066ff8bf6028f8d12e6c31"
    },
    "id": 1,
    "username": "Spongebob Squarepants",
    "country": "Bikini Bottom",
    "date": "2018-11-29T11:03:11.741Z",
    "message": "Howdy Squidward"
}
 
Viimeksi muokattu:
Olisko datatyyppi väärin. Varmaan str vaikka pitäisi olla int. Tai sit täs on joku js metka, että pitää kirjoittaa callbackinä toi.
 
Mikä kumma on kun deleteOne ei pelitä mongoDB:ssä.

Koodi:
const db = client.db(dbName);

var query = {
            "id": req.body.sel
          };

          //console.log(query);  // jos valittu id 1 niin console output: { id: 1 }

          try {
            db.collection("collection")
            .deleteOne(query)
              client.close();
          } catch (e) {
            print(e);
            }

Lisätään vielä että poistaa kyllä jos käyttää req.bodyn sijaan staattista arvoa. Esim: var query = { "id" = 1 } tai var query = { "username": "Spongebob Squarepants" }

Tässä vielä esimerkki elementistä:

Koodi:
{
    "_id": {
        "$oid": "5c066ff8bf6028f8d12e6c31"
    },
    "id": 1,
    "username": "Spongebob Squarepants",
    "country": "Bikini Bottom",
    "date": "2018-11-29T11:03:11.741Z",
    "message": "Howdy Squidward"
}

Mitä on req.body.sel:ssä? Ja noin yleensä: mitä tarkoittaa 'ei toimi'? Mitä tapahtuu, mitä virheitä tulee? Onhan bodyparser käytössä?
 
Olisko datatyyppi väärin. Varmaan str vaikka pitäisi olla int. Tai sit täs on joku js metka, että pitää kirjoittaa callbackinä toi.

Console.log(typeof req.body.sel) kertoo että postattu arvo on String eli oikeilla jäljillä olit.

Jos luon uuden muuttujan 'id' ja vedän parseInt() postatulle arvolle:

Koodi:
var id = parseInt(req.body.sel);
var query = { "id": id };

Niin homma pelittää, mutta onko toi ns. "hyväksyttävä käytäntö" :D Pitää tutkia tota body-parserin dokumentaatiota että millä sen sais ettei muuta Int:ejä Stringeiksi.

Kiitoksia.
 
Viimeksi muokattu:
Jos "tiedät" että id on aina numero, niin voinet käyttää Number(id) jolloin se tulkitaan integerinä. Tämä antaa tulokseksi NaN jos se sisältää jotain muuta kuin pelkkiä numeroita.
 
Niin homma pelittää, mutta onko toi ns. "hyväksyttävä käytäntö" :D Pitää tutkia tota body-parserin dokumentaatiota että millä sen sais ettei muuta Int:ejä Stringeiksi.

Kiitoksia.

Koodi:
const bodyParser = require('body-parser');

// Init middleware.
app.use(bodyParser.json());

Tämän pitäs hoitaa tyypit oikein. Esim '1'-> 1 ja 'true' -> true
 
Miten toteutetaan Javalla tietokantahaku jonka tulos tulostetaan jsp -sivulle?
Rivien määrä ei ole etukäteen tiedossa.
 
Miten toteutetaan Javalla tietokantahaku jonka tulos tulostetaan jsp -sivulle?
Rivien määrä ei ole etukäteen tiedossa.

Sanoisin, että helpoiten tietokantahaku, ja sitten foreach-loopilla tunget taulukkoon haun tulokset. JSP ei sinänsä ole tuttua, mutta tuolla nullin linkkaamalla sivulla näytti olevan melko hyvä esimerkki aiheesta.
 
Pelkkä tulostus on tarkoitus tehdä jsp -sivulle, muu koodi on muualla, muttta kiitoksia.

Kysymyskin oli aika yleinen, vastasin sen perusteella.
Oikeasti mahdolliset tavat riippuvat siitä mitä frameworkia käytät (tai jos et käytä mitään), missä se muu koodi on, teetkö kantahaun itse vai jonkun framen/kirjaston kautta jne.
Mutta kuten yllä, yleisesti for/while loopilla kantahaun tulosjoukosta rivien haku listalle. Jsp- koodissa toinen loop jossa tulostetaan. Listan alkiona kannattaa käyttää rivin "muotoista" dto- objektia.
 
Kysymyskin oli aika yleinen, vastasin sen perusteella.
Oikeasti mahdolliset tavat riippuvat siitä mitä frameworkia käytät (tai jos et käytä mitään), missä se muu koodi on, teetkö kantahaun itse vai jonkun framen/kirjaston kautta jne.
Mutta kuten yllä, yleisesti for/while loopilla kantahaun tulosjoukosta rivien haku listalle. Jsp- koodissa toinen loop jossa tulostetaan. Listan alkiona kannattaa käyttää rivin "muotoista" dto- objektia.

Siis en vähätellyt vastaustasi.
Ei ole vain niin paljoa tietämystä, että olisin osannut kuvailla kysymykseni tarkemmin.
 
Siis en vähätellyt vastaustasi.
Ei ole vain niin paljoa tietämystä, että olisin osannut kuvailla kysymykseni tarkemmin.

En ottanutkaan vähättelynä. Tämän tyyppisissä tapauksissa saa yleensä parempia vastauksia kertomalla ensin enemmän koska mahdollisuuksia on vaikka kuinka
 
Osaako joku neuvoa tyhmää. Oon maalannut itseni taas nurkkaan, enkä löydä ratkasua.

Eli body-parserilla otan tietoa .EJS-sivulta tietoa checkboxeilla. Jos valitsee vain yhden niin deleteOne pelittää. Tarkotuksena on kuitenkin, että pystyy valitsemaan ja poistamaan monta. Olen heittänyt vaan perus if (req.body.sel.length === 1) deleteOne, else deleteMany. Homma toimii koska voin koska voin käyttää Number() funktiota deleteOne:n kanssa. En saa sitä kuitenkaan deleteManyn mongo syntaksiin.


Ongelmana on, että kun body-parser lähettää monta arvoa, ne menee arrayhin joissa ne on String muodossa, eli console.log(req.body.sel) antaa ["value1", "value2"] jos valittu value 1 ja value 2 checkboxit.

Tietokannassa tiedot on Int:ejä joten mitään ei tapahdu paitsi käsien heiluttelua.

Koodi:
          var id = req.body.sel;
          //console.log(id); output ["5", "7"]

          if (id.length === 1) {
            var queryOne = { "id": Number(id) };
              try {
                db.collection("demojson")
                .deleteOne(queryOne)
                  client.close();
                  res.redirect("/delete");
                  console.log("Deleted one message");
              } catch (e) {
                print(e);
              }
            } else {
                var queryMany = { "id": { $in: id } };
                //console.log(id); //output ["5", "7"]
                //console.log(Number(id)); //output NaN
                  try {
                    db.collection("demojson")
                    .deleteMany(queryMany)
                      client.close();
                      res.redirect("/delete");
                      console.log("Deleted many messages");
                  } catch (e) {
                    print(e);
                  }
              }

$toInt ollut testissä, mutta sitäkään en oo saanut sijoteltua tonne queryMany:yn

E: Jaaha, array map oli mitä haettiin. Eli
Koodi:
var arrayId = id.map(Number);
var queryMany = { "id": { $in: arrayId } };
 
Viimeksi muokattu:
Java ja mySQL -tietokanta kyseessä.
Eli kun luo uuden käyttäjän ja yrittää lisätä dataa tietokantaan, niin lykkää seuraavanlaista virhettä:

Koodi:
Cannot add or update a child row: a foreign key constraint fails (`xxxxxxx_harjoitusDB`.`items`, CONSTRAINT `items_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `user` (`userID`))
Ja jotta asia ei olisi ihan näin yksinkertainen, niin jos kirjaudun ulos ja takaisin tupiin samalla käyttäjällä, kaikki toimii kuten pitääkin.

mySQL skripti:
Koodi:
CREATE TABLE user (
userID INT NOT NULL auto_increment,
PRIMARY KEY (userID),
name VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT NULL UNIQUE,
password VARCHAR(60) NOT NULL)
ENGINE=INNODB;

CREATE TABLE items (
id INT NOT NULL auto_increment,
userID INT NOT NULL,
itemName VARCHAR(30) NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(userID) REFERENCES user(userID))
ENGINE=INNODB;


Käyttäjän lisäys sekä datan lisäys tietokantaan:
Koodi:
    //Lisää uuden käyttäjän tietokantaan
    public void addUser(User uusi) throws SQLException {
        String sqlLause = "INSERT INTO user(name, email, password) VALUES(?, ?, ?)";
        try (Connection conn = ds.getConnection()) {
            try (PreparedStatement pstm = conn.prepareStatement(sqlLause)) {
                pstm.setString(1, uusi.getName());
                pstm.setString(2, uusi.getEmail());
                pstm.setString(3, uusi.getPassword());
                pstm.executeUpdate();
            }
        }
    }

    //Lisää uuden tuotteen tietokantaan
    public void addItem(String itemName, int userID) throws SQLException {
        String sqlLause = "INSERT INTO items(userID, itemName) VALUES(?, ?)";
        try (Connection conn = ds.getConnection()) {
            try (PreparedStatement pstm = conn.prepareStatement(sqlLause)) {
                pstm.setInt(1, userID);
                pstm.setString(2, itemName);
                pstm.executeUpdate();
            }
        }
    }
}
 
Java ja mySQL -tietokanta kyseessä.
Eli kun luo uuden käyttäjän ja yrittää lisätä dataa tietokantaan, niin lykkää seuraavanlaista virhettä:

Koodi:
Cannot add or update a child row: a foreign key constraint fails (`xxxxxxx_harjoitusDB`.`items`, CONSTRAINT `items_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `user` (`userID`))
Ja jotta asia ei olisi ihan näin yksinkertainen, niin jos kirjaudun ulos ja takaisin tupiin samalla käyttäjällä, kaikki toimii kuten pitääkin.

Eli sait tuon virheen yhden kerran ja sen jälkeen toimi ?

Koska items- taulussa on vierasavain niin siihen kenttään syötettävät arvot pitää löytyä user- taulusta commitoituna ennen inserttiä.
Tämän virheen saa aikaan esim syöttämällä rivin user- tauluun mysql clientilla ilman committia ja sen jälkeen ajamalla tuon ohjelman joka ottaa uuden yhteyden kantaan eikä näe toisen kantasession syöttämää riviä koska ei ole ajettu committia.

Koodista ei näy mikä ds- objekti on, on siis mahdollista että ds.getConnection() palauttaa aina uuden kantayhteyden jolloin pitää itse tehdä commit (jos autocommit ei ole päällä).
Jos ei ole tarvetta tehdä erillisessä connectissa niin käytä samaa connectia tai sitten kumpaankin metodiin pitää lisätä conn.commit().
Ehkä ds on toteutettu niin että se tekee commitin automaattisesti kun suljetaan, siis silloin kun ohjelman suoritus loppuu.

Jos getConnection() palauttaa aina uuden Connection- objektin niin muista myös sulkea ne käytön jälkeen...
 
Eli sait tuon virheen yhden kerran ja sen jälkeen toimi ?

Koska items- taulussa on vierasavain niin siihen kenttään syötettävät arvot pitää löytyä user- taulusta commitoituna ennen inserttiä.
Tämän virheen saa aikaan esim syöttämällä rivin user- tauluun mysql clientilla ilman committia ja sen jälkeen ajamalla tuon ohjelman joka ottaa uuden yhteyden kantaan eikä näe toisen kantasession syöttämää riviä koska ei ole ajettu committia.

Koodista ei näy mikä ds- objekti on, on siis mahdollista että ds.getConnection() palauttaa aina uuden kantayhteyden jolloin pitää itse tehdä commit (jos autocommit ei ole päällä).
Jos ei ole tarvetta tehdä erillisessä connectissa niin käytä samaa connectia tai sitten kumpaankin metodiin pitää lisätä conn.commit().
Ehkä ds on toteutettu niin että se tekee commitin automaattisesti kun suljetaan, siis silloin kun ohjelman suoritus loppuu.

Jos getConnection() palauttaa aina uuden Connection- objektin niin muista myös sulkea ne käytön jälkeen...

autocommit näyttäisi olevan päällä, sillä tuosta commit() -komennosta tulee virhe.
Tuo virhe tulee vain silloin kun luon uuden käyttäjän ja yritän lisätä tietokantaan tietoa, mutta jos kirjaudun ulos ja takaisin sisälle, niin lisäys toimii normaalistin.
 
autocommit näyttäisi olevan päällä, sillä tuosta commit() -komennosta tulee virhe.
Tuo virhe tulee vain silloin kun luon uuden käyttäjän ja yritän lisätä tietokantaan tietoa, mutta jos kirjaudun ulos ja takaisin sisälle, niin lisäys toimii normaalistin.

Viittaa kyllä siihen että autocommit ei ole päällä. Jos tulee virhe niin laita aina virheilmoitus mukaan, muuten ei voi kuin arvata...
Toimiiko jos teet ensin getConnection ja sen jälkeen samalla connectilla insertin molempiin tailuihin?
Jos toimii niin getConnection palauttaa uuden ja edellinen jää auki ilman committia.
Ja mikä se ds oikeasti on? Ja millä asetuksilla?

Edit: tuli vielä mieleen että pitää ehkä tehdä myös pstmt.close()
 
Viimeksi muokattu:
Viittaa kyllä siihen että autocommit ei ole päällä. Jos tulee virhe niin laita aina virheilmoitus mukaan, muuten ei voi kuin arvata...
Can't call commit when autocommit=true

Toimiiko jos teet ensin getConnection ja sen jälkeen samalla connectilla insertin molempiin tailuihin?
Ei toimi, sama virhe.

Ja mikä se ds oikeasti on? Ja millä asetuksilla?
Tähän en osaa vastata.

Edit: tuli vielä mieleen että pitää ehkä tehdä myös pstmt.close()
Tätäkin kokeilin.
 
Viimeksi muokattu:
Jos sulla on koodi joka kääntyy ja voit ajaa sen niin jossain on määritetty muuttuja ds ja sen luonti.

Ja jos kyseessä ei ole commit- ongelma niin sitten käytät addItem() kutsussa väärää userID- arvoa, sillä saa tuon fk- virheen aivan varmasti.

Jotta voi varmasti sanoa missä on vika pitäisi oikeastaa nähdä koko koodi ja sen lisäksi data jota on käytetty (pohjalla kannassa ennen ajoa sekä ajo(i)ssa syötetyt).
 
Jos sulla on koodi joka kääntyy ja voit ajaa sen niin jossain on määritetty muuttuja ds ja sen luonti.

Ja jos kyseessä ei ole commit- ongelma niin sitten käytät addItem() kutsussa väärää userID- arvoa, sillä saa tuon fk- virheen aivan varmasti.

Jotta voi varmasti sanoa missä on vika pitäisi oikeastaa nähdä koko koodi ja sen lisäksi data jota on käytetty (pohjalla kannassa ennen ajoa sekä ajo(i)ssa syötetyt).

Olette aivan oikeassa, uusi käyttäjä saa jostain syystä userID -arvoksi 0. Palauttaa oikean arvon kun kirjaudun ulos ja takaisin.
Pastesin tuonne servletit jotka liittyy käyttäjään sekä tietokantaan lisäyksen.
[Java] Java_servlet_excercise - Pastebin.com

edit: Eli vika löytyi. Ongelmana oli se, että tuo addUser -metodi ei palauttanut tuota luotua userID -arvoa. Alla muokattu metodi.

Kiitoksia avusta!

Koodi:
    public int addUser(User user) throws SQLException {
        String sqlLause = "INSERT INTO user(name, email, password) VALUES(?, ?, ?)";
        int userID = 0;
        try (Connection conn = ds.getConnection()) {
            try (PreparedStatement pstm = conn.prepareStatement(sqlLause, Statement.RETURN_GENERATED_KEYS)) {
                pstm.setString(1, user.getName());
                pstm.setString(2, user.getEmail());
                pstm.setString(3, user.getPassword());
                pstm.executeUpdate();
                try (ResultSet rs = pstm.getGeneratedKeys()) {
                    if (rs.next()) {
                        userID = rs.getInt(1);
                    }
                }
            }
        }
        user.setUserid(userID);
        return userID;
    }
}
 
Viimeksi muokattu:
Olette aivan oikeassa, uusi käyttäjä saa jostain syystä userID -arvoksi 0. Palauttaa oikean arvon kun kirjaudun ulos ja takaisin.
Pastesin tuonne servletit jotka liittyy käyttäjään sekä tietokantaan lisäyksen.
[Java] Java_servlet_excercise - Pastebin.com

edit: Eli vika löytyi. Ongelmana oli se, että tuo addUser -metodi ei palauttanut tuota luotua userID -arvoa. Alla muokattu metodi.

Kiitoksia avusta!

Koodi:
    public int addUser(User user) throws SQLException {
        String sqlLause = "INSERT INTO user(name, email, password) VALUES(?, ?, ?)";
        int userID = 0;
        try (Connection conn = ds.getConnection()) {
            try (PreparedStatement pstm = conn.prepareStatement(sqlLause, Statement.RETURN_GENERATED_KEYS)) {
                pstm.setString(1, user.getName());
                pstm.setString(2, user.getEmail());
                pstm.setString(3, user.getPassword());
                pstm.executeUpdate();
                try (ResultSet rs = pstm.getGeneratedKeys()) {
                    if (rs.next()) {
                        userID = rs.getInt(1);
                    }
                }
            }
        }
        user.setUserid(userID);
        return userID;
    }
}

Hyvä että selvisi. Toinen mahdollinen tapa olisi ollut tehdä insertin jälkeen haku samoilla arvoilla mutta tämä on ehdottomasti parempi.
 
Tässäpä olisi "paketti", jota voisi hyödyntää johonkin: akveo/ngx-admin
Vaikuttaa kuitenkin aivan turkasen monimutkaiselta lisätä esim. oma teema omilla väreillä.

Menny pian päivä, että löytää ne kohdat joihin pitää tehdä muutoksia uuden teeman käyttöönottamiseksi.
Ilmeisesti tuota ei ole tehty kovin "dynaamiseksi", kun ei ole mitään yhtä paikka, johon voisi vain määritellä teeman ja luoda sille oman kansion ja tiedostot, jotka sovellus sitten lukee minkä tahansa valitun teeman kohdalla?

Nyt olen jo useampaan kohtaan käynyt puukottamassa ja viimein sain sentään buildin läpi.
Teema ei kuitenkaan vielä toimi vaan ilmeisesti pitää vielä yhtä tiedostoa muokata, että se tulee esille teeman valintaan.

Pieni kysymykseni siis, että onko esim. uuden teeman luominen yleensä näin haasteellista vai olisiko kehittäjä voinut tehdä parempia valintoja?
Dokumentaatiotakaan, kun ei ole...
 
Tässäpä olisi "paketti", jota voisi hyödyntää johonkin: akveo/ngx-admin
Vaikuttaa kuitenkin aivan turkasen monimutkaiselta lisätä esim. oma teema omilla väreillä.

Menny pian päivä, että löytää ne kohdat joihin pitää tehdä muutoksia uuden teeman käyttöönottamiseksi.
Ilmeisesti tuota ei ole tehty kovin "dynaamiseksi", kun ei ole mitään yhtä paikka, johon voisi vain määritellä teeman ja luoda sille oman kansion ja tiedostot, jotka sovellus sitten lukee minkä tahansa valitun teeman kohdalla?

Nyt olen jo useampaan kohtaan käynyt puukottamassa ja viimein sain sentään buildin läpi.
Teema ei kuitenkaan vielä toimi vaan ilmeisesti pitää vielä yhtä tiedostoa muokata, että se tulee esille teeman valintaan.

Pieni kysymykseni siis, että onko esim. uuden teeman luominen yleensä näin haasteellista vai olisiko kehittäjä voinut tehdä parempia valintoja?
Dokumentaatiotakaan, kun ei ole...

Siellähän ne on ngx-admin/tree/master/src/app/@theme/styles alla.

Tutkaile noita scss ja ts tiedostoja, ota pohjaksi vaikka theme.default.ts. Sitten vaan compilea.

Tässä vähän tarkemmin:
https://akveo.github.io/nebular/docs/guides/enable-theme-system#enable-theme-system
 
Siellähän ne on ngx-admin/tree/master/src/app/@theme/styles alla.

Tutkaile noita scss ja ts tiedostoja, ota pohjaksi vaikka theme.default.ts. Sitten vaan compilea.

Tässä vähän tarkemmin:
https://akveo.github.io/nebular/docs/guides/enable-theme-system#enable-theme-system
Näin tein ja pääsin tosiaan jyvällekin, mutta olen hieman hämmästynyt työmäärän suhteen.

Ja varsinainen teema/muokkaus tapahtuukin sitten node_modules/@nebular/theme/styles/themes/_[theme_name].scss

Kaippa tuossa joku logiikka on, mutta tuntuu jotenkin oudolta muokata node_modules alla olevia tiedostoja.
 
Siellähän ne on ngx-admin/tree/master/src/app/@theme/styles alla.

Tutkaile noita scss ja ts tiedostoja, ota pohjaksi vaikka theme.default.ts. Sitten vaan compilea.

Tässä vähän tarkemmin:
https://akveo.github.io/nebular/docs/guides/enable-theme-system#enable-theme-system

Mites tähän lisätään sivu, jonka sisältö tuotetaan osittain tai vaikka kokonaan jotain node moduulia hyödyntäen?

Nimim. tuli taas ruutu täyteen virheilmoituksia:
Koodi:
4 x critical dependecy: the request of a dependecy is an expression
module not found: error: can't resolve './package'
module not found: error: can't resolve 'crypto'
module not found: error: can't resolve 'http'
jne... Failed to compile.

Näyttäisivät kaikki liittyvän tuohon asentamaani node moduuliin (html-metadata), jota haluaisin hyödyntää.
 
Lisää typeriä kysymyksiä JavaScriptistä. Eli JQuery avaa piilotetun divin "form1" kun klikkaa li luokan "msg" itemiä, ongelmana että toi divi on listan itemin sisällä eli kun avattua/esiin tuotua divin inputtia yrittää klikata niin se menee uudestaan piiloon. Mitään ei tapahdu jos se on listan ulkopuolella. Tarkotuksena on että siis jokainen listan itemi avaa oman text inputin, ei kaikkia kerralla. Milläs tapaa sen sais aikaan? parent(), closest()?


Koodi:
    <% loopsi.forEach(function(user){ %>
          <li class="msg">
          <%= user.username %>:
          <%= user.message %>
          <div class="form1">
            <input type="text" name="editMsg">
          </div>
          </li>
    <% }) %>

Koodi:
$(document).ready(function() {
    $(".msg").click(function() {
      $(this).find(".form1").slideToggle(1000);
    });
  });
 
Näin? (en testannut toimiiko)
Koodi:
<% loopsi.forEach(function(user){ %>
          <li class="msg">
          <span class="click-me">
          <%= user.username %>:
          <%= user.message %>
          </span>
          <div class="form1">
            <input type="text" name="editMsg">
          </div>
          </li>
    <% }) %>
Koodi:
$(document).ready(function() {
    $(".msg .click-me").click(function() {
      $(this).parent().find(".form1").slideToggle(1000);
    });
  });
Et siis voi bindata click-eventtiä suoraan li-elementtiin jos tuo input jota myös joutuu klikkaamaan on sen alla.
 
Näin? (en testannut toimiiko)
Koodi:
<% loopsi.forEach(function(user){ %>
          <li class="msg">
          <span class="click-me">
          <%= user.username %>:
          <%= user.message %>
          </span>
          <div class="form1">
            <input type="text" name="editMsg">
          </div>
          </li>
    <% }) %>
Koodi:
$(document).ready(function() {
    $(".msg .click-me").click(function() {
      $(this).parent().find(".form1").slideToggle(1000);
    });
  });
Et siis voi bindata click-eventtiä suoraan li-elementtiin jos tuo input jota myös joutuu klikkaamaan on sen alla.

Juu jopa mä tajusin sen, mutta en keksinyt millä sen sais ratkastua. Tää spaniin kääriminen toimii mainiosti.
 
Millä ohjelmalla kannattaisi tai millä tavalla kannattaisi lähteä kehittämään omaa "ohjelmaa" Ubuntulle? Tulisi tarpeeseen tuollainen visuaalinen ZFS-hallinnointiohjelma, joka siis hyvin paljon pohjaa vain peruskomentoihin, ja niistä tuleviin tietojen muotoiluun visuaaliseen muotoon? Quickly on uusimmista Ubuntuista poistettu, joten se ei toimi. Pythonia monet sanoo että sillä kannattaa koodata, mutta millä ohjelmalla tai pohjalla sitä kannattaisi alkaa tekemään?

En ole aiemmin Ubuntulle tai Linuxille koodannut mitään ohjelmaa kokonaan, mutta FreeBSD ja Linux koodeja on tullut kyllä pyöriteltyä, halua oppia lisää ja ainahan googlen maailmasta löytää ohjeita ja ainahan /? tai man -komennot toimivat :)
 
Millä ohjelmalla kannattaisi tai millä tavalla kannattaisi lähteä kehittämään omaa "ohjelmaa" Ubuntulle? Tulisi tarpeeseen tuollainen visuaalinen ZFS-hallinnointiohjelma, joka siis hyvin paljon pohjaa vain peruskomentoihin, ja niistä tuleviin tietojen muotoiluun visuaaliseen muotoon? Quickly on uusimmista Ubuntuista poistettu, joten se ei toimi. Pythonia monet sanoo että sillä kannattaa koodata, mutta millä ohjelmalla tai pohjalla sitä kannattaisi alkaa tekemään?

En ole aiemmin Ubuntulle tai Linuxille koodannut mitään ohjelmaa kokonaan, mutta FreeBSD ja Linux koodeja on tullut kyllä pyöriteltyä, halua oppia lisää ja ainahan googlen maailmasta löytää ohjeita ja ainahan /? tai man -komennot toimivat :)

Ei kyllä mitää tietoa oikeasti! :sori:

Mutta tämän kommentin innoittaman voisin joulun välipäivinä kokeilla mitä nodella saa aikasesksi kun, naittaa electronjs, shelljs ja vähän webbiä päälle. :btooth:
 
Millä ohjelmalla kannattaisi tai millä tavalla kannattaisi lähteä kehittämään omaa "ohjelmaa" Ubuntulle? Tulisi tarpeeseen tuollainen visuaalinen ZFS-hallinnointiohjelma, joka siis hyvin paljon pohjaa vain peruskomentoihin, ja niistä tuleviin tietojen muotoiluun visuaaliseen muotoon? Quickly on uusimmista Ubuntuista poistettu, joten se ei toimi. Pythonia monet sanoo että sillä kannattaa koodata, mutta millä ohjelmalla tai pohjalla sitä kannattaisi alkaa tekemään?

En ole aiemmin Ubuntulle tai Linuxille koodannut mitään ohjelmaa kokonaan, mutta FreeBSD ja Linux koodeja on tullut kyllä pyöriteltyä, halua oppia lisää ja ainahan googlen maailmasta löytää ohjeita ja ainahan /? tai man -komennot toimivat :)
Olen käyttänyt GTK:ta ja Gladella luonut graafisen käyttöliittymän. Se luo XML-tiedoston, jonka voi ladata ohjelman alussa, samaan tapaan kuin Androidille kehittäessä muistaakseni.
Python käy kieleksi ihan hyvin tai mikä tahansa muu kieli, joka tukee GTK:ta.

Varmaan Qt:llekin löytyy samantapainen ohjelma, mutta en ole Qt:ta käyttänyt.
 
Olen käyttänyt GTK:ta ja Gladella luonut graafisen käyttöliittymän. Se luo XML-tiedoston, jonka voi ladata ohjelman alussa, samaan tapaan kuin Androidille kehittäessä muistaakseni.
Python käy kieleksi ihan hyvin tai mikä tahansa muu kieli, joka tukee GTK:ta.

Varmaan Qt:llekin löytyy samantapainen ohjelma, mutta en ole Qt:ta käyttänyt.

Tcl/tk kävisi myös natiivina.
Kielen ja kirjastojen valintahan on vaan siitä kiinni mitä jo osaa ja mitä haluaa opetella. Ja tietysti siitä tekeekö/haluaako natiivi/www käyttöliittymän.
 
Olen käyttänyt GTK:ta ja Gladella luonut graafisen käyttöliittymän. Se luo XML-tiedoston, jonka voi ladata ohjelman alussa, samaan tapaan kuin Androidille kehittäessä muistaakseni.
Python käy kieleksi ihan hyvin tai mikä tahansa muu kieli, joka tukee GTK:ta.

Varmaan Qt:llekin löytyy samantapainen ohjelma, mutta en ole Qt:ta käyttänyt.

Tcl/tk kävisi myös natiivina.
Kielen ja kirjastojen valintahan on vaan siitä kiinni mitä jo osaa ja mitä haluaa opetella. Ja tietysti siitä tekeekö/haluaako natiivi/www käyttöliittymän.
Tulisi aikalailla natiiviksi tuohon Ubuntulle, ihan kuin normiapplikaatioksi. Tämän puolesta mietinkin että mikä kieli olisi hyvä. Joskus aikoja sitten on Pythonia tullut koodattua, mutta ne taidot on jo aikalailla unohtuneet, joten tekisi mieli opetella jokin kieli hyvin, ja oppia sillä koodaamaan.
 
Pari tuntia googlen äärellä ajaa nyt kysymään täältäkin apua...

Yksinkertaisuudessaan haluaisin tietyn Facebook-sivun (menneet,)nykyiset sekä tulevat tapahtumat automaagisesti Googlen kalenteriin. Pelkkä tapahtuman nimi, paikka ja ajankohtakin riittää ilman mitään kuvauksia.

Osaan kyllä exportata oman profiilini tapahtumat, mutta nyt haluaisin tietyn sivun tapahtumat erilliseen kalenteriin. Löysin ehkä yhden mahdollisen valmiin palvelun, mutta se oli maksullinen. Mahdollista on myös exportata yksittäisiä tapahtumia .ics:ksi, mutta sekin menee työlääksi ja käsin tehtäväksi. Onko kenelläkään tiedossa valmista ja toimivaa pakettia, koska itsellä ei (ainakaan vielä) ole rahkeita tuollaista itse koodailla?
 
Pari tuntia googlen äärellä ajaa nyt kysymään täältäkin apua...

Yksinkertaisuudessaan haluaisin tietyn Facebook-sivun (menneet,)nykyiset sekä tulevat tapahtumat automaagisesti Googlen kalenteriin. Pelkkä tapahtuman nimi, paikka ja ajankohtakin riittää ilman mitään kuvauksia.

Osaan kyllä exportata oman profiilini tapahtumat, mutta nyt haluaisin tietyn sivun tapahtumat erilliseen kalenteriin. Löysin ehkä yhden mahdollisen valmiin palvelun, mutta se oli maksullinen. Mahdollista on myös exportata yksittäisiä tapahtumia .ics:ksi, mutta sekin menee työlääksi ja käsin tehtäväksi. Onko kenelläkään tiedossa valmista ja toimivaa pakettia, koska itsellä ei (ainakaan vielä) ole rahkeita tuollaista itse koodailla?

Eikös tuo mene ihan sen export nappulan linkin kopiomalla?

Koodi:
https://www.facebook.com/events/ical/upcoming/?uid=11111111111&key=aaaaaaaaaaaaa

Ja sitten lisäät googleen kalenterin url osoitteesta.

url pysyy käsittääkseni aina samana ja google sekä facebook sitten sopivaksi katsomallaan intervallilla tuota päivittelee!


Edit: kappas vaan pitikin olla yhden sivun tapahtumat. En tiedäkkään mahtaako onnistua. :eek:
 
Viimeksi muokattu:

Statistiikka

Viestiketjuista
261 844
Viestejä
4 548 959
Jäsenet
74 855
Uusin jäsen
Nåksuu

Hinta.fi

Back
Ylös Bottom