Pieniä kysymyksiä ohjelmoinnista

Pertti Kosunen

Basic Input/Output System
Liittynyt
19.10.2016
Viestejä
3 107
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.
 
Liittynyt
17.10.2016
Viestejä
4 589
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.
 

TheMeII

Übertaktungspotenzial
Liittynyt
13.11.2016
Viestejä
6 984
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:
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
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.
 
Liittynyt
09.03.2018
Viestejä
374
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.
 
Liittynyt
14.12.2016
Viestejä
1 297
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:
Liittynyt
09.03.2018
Viestejä
374
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:

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
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 }]
 
Liittynyt
23.10.2016
Viestejä
658
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?
 
Liittynyt
17.10.2016
Viestejä
37
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?
 
Liittynyt
23.10.2016
Viestejä
658
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.
 
Liittynyt
17.10.2016
Viestejä
14 550
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.
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
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:
 
Liittynyt
23.10.2016
Viestejä
658
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.
 
Liittynyt
09.03.2018
Viestejä
374
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:
Liittynyt
16.10.2016
Viestejä
543
Olisko datatyyppi väärin. Varmaan str vaikka pitäisi olla int. Tai sit täs on joku js metka, että pitää kirjoittaa callbackinä toi.
 
Liittynyt
17.10.2016
Viestejä
14 550
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ä?
 
Liittynyt
09.03.2018
Viestejä
374
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:
Liittynyt
17.10.2016
Viestejä
219
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.
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
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
 
Liittynyt
06.11.2016
Viestejä
1 748
Miten toteutetaan Javalla tietokantahaku jonka tulos tulostetaan jsp -sivulle?
Rivien määrä ei ole etukäteen tiedossa.
 
Liittynyt
17.10.2016
Viestejä
219
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.
 
Liittynyt
17.01.2018
Viestejä
1 997
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.
 
Liittynyt
06.11.2016
Viestejä
1 748
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.
 
Liittynyt
17.01.2018
Viestejä
1 997
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
 
Liittynyt
09.03.2018
Viestejä
374
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:
Liittynyt
06.11.2016
Viestejä
1 748
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();
            }
        }
    }
}
 
Liittynyt
17.01.2018
Viestejä
1 997
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...
 
Liittynyt
06.11.2016
Viestejä
1 748
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.
 
Liittynyt
17.01.2018
Viestejä
1 997
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:
Liittynyt
06.11.2016
Viestejä
1 748
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:
Liittynyt
17.01.2018
Viestejä
1 997
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).
 
Liittynyt
06.11.2016
Viestejä
1 748
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:
Liittynyt
17.01.2018
Viestejä
1 997
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.
 
Liittynyt
20.04.2017
Viestejä
580
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...
 
Liittynyt
17.10.2016
Viestejä
985
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
 
Liittynyt
20.04.2017
Viestejä
580
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.
 
Liittynyt
20.04.2017
Viestejä
580
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ää.
 
Liittynyt
09.03.2018
Viestejä
374
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);
    });
  });
 
Liittynyt
17.10.2016
Viestejä
4 589
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.
 
Liittynyt
09.03.2018
Viestejä
374
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.
 
Liittynyt
07.03.2017
Viestejä
184
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 :)
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
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:
 
Liittynyt
02.11.2016
Viestejä
1 174
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.
 
Liittynyt
17.01.2018
Viestejä
1 997
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.
 
Liittynyt
07.03.2017
Viestejä
184
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.
 
Liittynyt
14.12.2016
Viestejä
180
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?
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
779
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:
Toggle Sidebar

Statistiikka

Viestiketjut
237 377
Viestejä
4 159 027
Jäsenet
70 410
Uusin jäsen
allun90

Hinta.fi

Ylös Bottom