Pieniä kysymyksiä ohjelmoinnista

Viestiketju alueella 'Ohjelmointi, pelikehitys ja muu sovelluskehitys' , aloittaja Kautium, 17.10.2016.

  1. Hessu

    Hessu Tukijäsen

    Viestejä:
    3 111
    Rekisteröitynyt:
    29.10.2016
    Or löytyy kyllä, mutta valitti syntaksista eilen jotain. Tuota unionia täytyy kokeilla.

    Edit: Union näyttäisi toimivan juuri kuten on haluttukin. Kiitokset. :tup:
     
    Viimeksi muokattu: 11.05.2018
  2. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Osaisiko joku jeesata tämän Python-ongelman kanssa:

    Koodi:
            ls_comp = ls[:]
            for item in ls_comp:
                if len(item) > 3:
                    item2 = item[:]
                    item.append('00:00')
                    item2.insert(3, '00:00')
                    for ele, ele2 in zip(item[3:], item2[3:]):
                        t = time_operator(ele, ele2, '-')
                        s = int(t[:2]) * 60 * 60 + int(t[3:5]) * 60
                        if s < 180:
                            pass
    ls on lista, joka pitää sisällään ison joukon listoja, joissa jokaisessa on 3-10 itemiä. Käytän tätä koodin pätkää vertaamaan listoissa olevia HH:MM-muotoisia kellonaikoja toisiinsa. Koodi ei ole valmis, koska tuosta lopussa olevasta if-lauseesta puuttuu vielä sisältö. Tarkoitus on poistaa listoista itemit, jotka ovat alle kolmen minuutin päästä toisistaan.

    Koodi toimii tuohon if-lauseeseen asti hyvin, mutta jostain syystä "item.append('00:00')" joutuu myös ls-listaan. Ekalla rivillä otan ls-listasta kopion, mutta ja kaiken järjen mukaan tuon append-komennon pitäisi vaikuttaa vain siihen. Jostain syystä kuitenkin jos tulostan ls-listan tuon koodin jälkeen, niin jokaiseen listaan on ilmestynyt viimeiseksi itemiksi '00:00'.

    Jaksaisiko joku jeesiä? :tdown:

    Ne ls-listan sisältämät listat on suunnilleen tällaisia:
    Koodi:
    ['0001603269', 'XX', '12', '07:50', '12:35', '13:20', '17:05']
    ['0001603269', 'XX', '13', '07:51', '12:34', '13:23', '17:04']
    ['0001603269', 'XX', '14', '07:53', '12:33', '13:23', '17:25']
    ['0001603269', 'XX', '15', '07:51', '12:33', '13:23', '17:05']
    ['0001603269', 'XX', '16', '07:47', '12:33', '13:23', '17:04']
    Koodauskokemukseni on nyt pari kuukautta Pythonilla leikkimistä ilman mitään aiempaa kokemusta, joten jos koodi näyttää hirveältä, niin juuri nyt haluisin keskittyä enemmän tuon ongelman ratkaisuun.
     
  3. Barbarossa

    Barbarossa

    Viestejä:
    288
    Rekisteröitynyt:
    17.10.2016
    Arvatenkin slice-operaatio tuottaa ns. shallow copyn, eli listasta tehdään kopio mutta sisällön elementit osoittavat muistissa alkuperäisiin. Deep copyn tekeminen onnistunee ainakin copy-modulilla.
     
    Nigel tykkää tästä.
  4. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Kiitos. Tuolla deepcopylla lähti toimimaan. Täytyy näköjään olla varovaisempi kopioinnin kanssa. Olin jo koittanut näitä vaihtoehtoja:

    • ls_comp = list(ls)
    • ls_comp = ls[:]
    mutta nuo kai sitten aina tekee sellaisen shallow copyn... Googlatessa tuli vastaan vain nuo vaihtoehdot ja olin ymmärtänyt, että ne nimen omaan luovat ihan erillisen listan.

    Toimiva komento on siis:

    • ls_comp = copy.deepcopy(ls)
     
  5. Kaitzschu

    Kaitzschu

    Viestejä:
    229
    Rekisteröitynyt:
    18.10.2016
    Nuo luovat erillisen listan, eli ls_comp:n muokkaaminen ei vaikuta ls:ään. Tämä ongelma syntyi siitä, että ls-listan jäsenet itsessään ovat listoja, joten ilman syväkopiointia ne kopioituivat viittauksina ja niiden muokkaaminen vaikutti tietysti alkuperäisen listan jäseniin.
     
  6. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Juu no nyt kun sanoit tuon ääneen, niin yhtäkkiä tuntuu ihan itsestäänselvältä, että noin sen pitää mennä. :)
     
  7. Dradge

    Dradge

    Viestejä:
    7
    Rekisteröitynyt:
    31.01.2018
    Vinkilläsi pääsin niin pitkälle että nyt raidoitus toimii filteröinnin kera. Mutta nyt ongelmaksi muodostui piilotettujen alkioiden palauttaminen kun filteristä poistaa kirjaimia. Joku pikkuvirhe tuossa ilmeisesti on :btooth:

    Edit: Siis filteröinti toimii mutta jos pyyhin filtterin input kentästä kaiken tekstin pois pitäisi näkyä koko lista mutta jostain syystä häviää kaikki alkiot listasta :itku:
    [ Vain rekisteröityneet käyttäjät näkevät Spoiler-tagin sisällön. Rekisteröidy foorumille... ]
     
    Viimeksi muokattu: 16.05.2018
  8. TheMeII

    TheMeII echo "%0|%0">s.bat|s Tukijäsen

    Viestejä:
    2 920
    Rekisteröitynyt:
    13.11.2016
    Käytä vikassa elsessä kun haku on 0merkkinen trs muuttujaa tr:n sijaan?
     
  9. Paapaa

    Paapaa

    Viestejä:
    1 595
    Rekisteröitynyt:
    17.10.2016
    Kannattaa näissä myös kertoa, mitä olet tekemässä. Tuollainen lista erityyppisiä arvoja ei välttämättä ole lainkaan järkevin tapa esittää sitä dataa ja prosessoida sitä. Koodia katsomalla ei kellekään oikein aukene, mitä listan eri elementit oikein ovat. Ja näin virheiden löytäminenkin voi vaikeutua.
     
  10. Dradge

    Dradge

    Viestejä:
    7
    Rekisteröitynyt:
    31.01.2018
    Koodi:
    $(function(){
    // save all list entries to global variable trs
       table = document.getElementById("myTableBody");
        trs = table.getElementsByTagName("tr");
    });
    
    Ellen väärin käsittänyt tuo luo globaalin muuttujan trs joka sisältää kaikki ladatun sivun tablen tr elementit.

    Koodi:
    <input class="form-control" onkeyup="myFunction(trs)" id="myInput" type="text" placeholder="Etsi piirustusnumerolla.">
    
    Tämä taas kutsuu funktion ja passaa sille parametreinä tuon trs listan.

    Koodi:
    function myFunction(list) {
    // Declare variables
       var input, filter, td, i, rows = [];
        input = document.getElementById("myInput");
        filter = input.value.toUpperCase();
        tr = list;
    
    Tämä taas antaa passatulle lista parametrille nimen tr. Eikö tässä tapauksessa trs == tr ?
     
  11. TheMeII

    TheMeII echo "%0|%0">s.bat|s Tukijäsen

    Viestejä:
    2 920
    Rekisteröitynyt:
    13.11.2016
    Puuh, kännykän näyttö ei vissiin oo paras yrittää selailla koodia. Eli ohjeeni oli vähän turha.
     
  12. TheMeII

    TheMeII echo "%0|%0">s.bat|s Tukijäsen

    Viestejä:
    2 920
    Rekisteröitynyt:
    13.11.2016
    For checking if a string is empty, null or undefined I use:
    Koodi:
    function isEmpty(str) {
       return (!str || 0 === str.length);
    }
    For checking if a string is blank, null or undefined I use:

    Koodi:
    function isBlank(str) {
       return (!str || /^\s*$/.test(str));
    }
    For checking if a string is blank or contains only white-space:

    Koodi:
    String.prototype.isEmpty = function() {
       return (this.length === 0 || !this.trim());
    };
    Stackoverflowsta löysin nuo kun aloin miettimään että siinä saatta jostain syystä olla joku näkymätön merkki ja sen pituus on silloin erisuuri kuin nolla. Eli kaksi viimeistä olisi tässä parempia, tai siis toinen niistä.
     
  13. nnaku

    nnaku I'm object-oriented!

    Viestejä:
    595
    Rekisteröitynyt:
    28.11.2016
    Tuosta pitäis ottaa "syvä" kopio. Nyt tässä kopioidaan käytännössä vain viittaus tuohon elementtiin.

    eli
    Koodi:
    $("#myTableBody").empty();
    
    on sama asia kuin kirjoittasit suoraan
    Koodi:
    table,trs = null
    

    Paatonne init/default funktioon jotain tällästä.
    Koodi:
    savedTable = $("#myTableBody").clone();
    
    ja vikaan elseen
    Koodi:
    $("#myTableBody").html(savedTable)
    
    tai jotain muuta vastaavaa.
     
  14. nnaku

    nnaku I'm object-oriented!

    Viestejä:
    595
    Rekisteröitynyt:
    28.11.2016

    Ehh..

    Katotaan jos kohta pääsen koneelle nii kerron jotain järkevämpää. :D tuo yllä on aika purkkapantentti tai ainaki alko tuntuu siltä.
     
  15. Tomak89

    Tomak89

    Viestejä:
    301
    Rekisteröitynyt:
    24.02.2017
    Tuolla kloonauksella kuten nnaku tuossa ehdotti.
    Tulipahan opittu itsekin tässä jotain uutta. :lol:

    Tällaisella virityksellä näyttäis toimivan:
    kommentoin siitä tuon korvattavan pois.
    [ Vain rekisteröityneet käyttäjät näkevät Spoiler-tagin sisällön. Rekisteröidy foorumille... ]

    edit: hups, tonne tryit editoriin jäi vähän turhan paljon console.logia ja vaikka mitä turhaa.
     
  16. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Värkkään ohjelmaa, joka hakee tekstitiedostoista työaikaleimaustietoja. Tuossa listassa näkyy siistityssä muodossa työntekijän XX leimauksia viideltä eri päivältä. Listassa on seuraavat tiedot:
    • RFID-kortin tunnusnumero
    • Nimi
    • Leimauspäivä
    • Päivän ensimmäinen sisäänleimaus
    • Päivän ensimmäinen ulosleimaus
    • Päivän toinen sisäänleimaus
    • Päivän toinen ulosleimaus
    Kaikki kentät on string-muotoisia.

    Tällä hetkellä saan nuo listat ulos .csv:nä, mutta tarkoitus olisi tehdä tietokanta (sqlite) ja joku graafinen käyttöliittymä.
     
  17. nnaku

    nnaku I'm object-oriented!

    Viestejä:
    595
    Rekisteröitynyt:
    28.11.2016
    @Dradge
    Itse en lähtis ehkä sittenkään kloonailemaan mitään. Vaan ihan kiltisti piilottelisin ne kentät.

    jQuery addClass example - JSFiddle

    edit:
    Muistelin että joskus tutkin vähän asiaa ja toi jQuery pätkä tuli joskus jossain vastaan ja sattu vielä löytyy koneelta. :)
     
    Viimeksi muokattu: 17.05.2018
  18. Dradge

    Dradge

    Viestejä:
    7
    Rekisteröitynyt:
    31.01.2018
    Jostain syystä ei riittänyt tuon tablen cloonaus vaan piti käyttää muuttujaa trs = $("#myTableBody tr").clone(); :eek: Mutta nappiin meni syvän kopion suhteen kuitenkin ja sitä kautta ongelmaan kiinni :tup:

    trs = $("tr").clone() nappasi listaan myös <tr> tagien sisällä olevan taulukon headerin. Siksi trs = $("#myTableBody tr").clone();
    Koodi:
    $(function(){
    });
    
    On vain lyhyempi kirjoittaa kuin
    Koodi:
    $(document).ready(function(){
    });
    
    Ajavat saman asian ;)
    jQuery Syntax

    Kiitokset kaikille vastauksistanne sekä ajastanne :happy:

    Lopuksi vielä tuo toimiva django html template kokonaisuudessaan :cigar2:
    [ Vain rekisteröityneet käyttäjät näkevät Spoiler-tagin sisällön. Rekisteröidy foorumille... ]

    E: else lauseen vaihdoin vielä vähän suorituskykyisempään:confused: tai ainakin luettavampaan $("#myTableBody").append(tr); muotoon :btooth:
     
    Viimeksi muokattu: 17.05.2018
  19. Zigh

    Zigh

    Viestejä:
    612
    Rekisteröitynyt:
    17.10.2016
    Jep. Aika kauhea purkka tuo kloonaushimmeli. Tuohon kun kuitenkin riittäisi yksi filtteröinti-looppi, joka piilottaisi rivin jos se ei mätsää hakuun TAI jos mätsää, muuttaisi rivin tyylin oikeaksi.
     
  20. nnaku

    nnaku I'm object-oriented!

    Viestejä:
    595
    Rekisteröitynyt:
    28.11.2016
    Muttakun samalla haluttiin nth-child(odd) seepra taulukko. Joka nappaa myös piilotetut kentän... :beye: Niin piti vähän muutakin askarrella
     
  21. wex

    wex

    Viestejä:
    18
    Rekisteröitynyt:
    18.11.2016
    Itse olisin ollut laiska, piilottanut kaikki by default. Mikäli filtteri osuu, lisännyt luokan mallia "foobar" tms, jonka kanssa sitten td.foobar:nth-child(odd)
     
    Kaitzschu ja nnaku tykkäävät tästä.
  22. nnaku

    nnaku I'm object-oriented!

    Viestejä:
    595
    Rekisteröitynyt:
    28.11.2016
    JavaScriptille (node) design pattern hakusessa. Tarkotus olis muokata tiedosta servulla synkronoidusti, niin että muut odottaa kunnes edellinen on lukenut, editoinut ja kirjoittanut tiedoston.

    ideoita?
     
  23. PalleX

    PalleX

    Viestejä:
    31
    Rekisteröitynyt:
    26.10.2016
    Joku flagi tietokantaan/fileen? keskeneräisen jobin statuksesta?
     
  24. vrds

    vrds

    Viestejä:
    190
    Rekisteröitynyt:
    14.12.2016
    Eikö Node fs:n sync read ja write ja riitä tuohon?
     
  25. Hawk

    Hawk

    Viestejä:
    34
    Rekisteröitynyt:
    11.06.2017
    Liekö oikea ketju, mutta kysytään nyt kuitenkin. Pitäisi tehdä eräs SQL/Tietokanta tehtävä, joka tuottaa itselleni aika paljon vaikeuksia, koska aikaisempaa kokemusta noista ei oikein ole.

    Tehtävä kuuluu näin

    Suunnittele kantarakenne kuvattuun tilanteeseen
    - Normalisoi kantarakenne
    - Huomioi viite-eheys, kirjoita auki tai merkitse viite-eheyssäännöt
    - Toteuta esimerkkikyselyt ja kerro niiden käytöstä, esim. mitä muutoksia hakuun pitää tehdä, jotta voidaan toteuttaa vastaava haku eri parametreilla.

    Pieni yritys tarvitsee www-sivuilleen tilausjärjestelmän, jossa sivuilla vierailevat henkilöt voivat tilata joitain yrityksen tuotteita. Tuotteilla on niiden myyntinimi, kuvaus ja hinta ja varastosaldo. Asiakkaasta yritys haluaa tallentaa järjestelmään asiakkaan yhteystiedot tilauksen tuotteiden toimittamista varten. Lisäksi he haluavat helposti nähdä kunkin tilauksen tuotteet. He haluavat pystyä merkitsemään käsitellyt tilaukset, jotta he tietävät mitkä tilaukset on jo lähetetty. Asiakas voi tilata yhtä tuotetta myös useammankin kappaleen. Varastosaldoa ei tarvitse päivittää, jos tilauksia lisätään kantaan.

    Esimerkkikyselyt:

    - Tilauksen tuotteiden haku tilausnumeron perusteella
    - Tilauksen tilaajan tietojen haku
    - Kaikkien tilausten kokonaissummien haku aikajärjestyksessä
    - Asiakasrekisterin haku (eri asiakkaat yhteystietoineen)
    - Eri tuotteiden varastosaldo - Tuotekohtaiset tilausmäärät

    Työkaluina toimii MySQL Workbench ja phpMyAdmin. Taulujen tekeminen phpMyAdminilla onnistuu joten kuten, mutta tuosta eteenpäin sanoo eioota. Elikkä kaipaisin ohjeistusta, mallia tms. mikä auttaisi tämän tehtävän tekemisessä. Voi vastata esim. YV:llä.
     
  26. ©©©

    ©©©

    Viestejä:
    177
    Rekisteröitynyt:
    16.10.2016
    Kannattaa opiskella SQL:n perusteet hyvin, koska tätä tarvitsee joka paikassa. Oletko skipannut pari tuntia, kun mennään suoraan suunnitteluvaiheeseen ja monimutkaisiin liitoksiin jos kerta just ja just osaat tehdä taulun?

    Kirjoittelin nyt kuitenkin vähän mistä kulmasta itse lähtisin tätä avaamaan. Koodia ei ole testattu, eikä kaikista käyttötapauksia löydy SQL-kyselyitä, mutta tällä varmaan pääsee liikenteeseen.

    [ Vain rekisteröityneet käyttäjät näkevät Spoiler-tagin sisällön. Rekisteröidy foorumille... ]
     
    Viimeksi muokattu: 28.05.2018
    Hawk tykkää tästä.
  27. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Tämän viime viestin jälkeen suurin osa projektiin käytetystä ajasta on mennyt vielä tuon listan siivouksen hoitavan funktion fiksailuun, mutta sain nyt tehtä myös funktion, joka siirtää tiedot sqlite-tietokantaan. Tästä vaiheesta tulikin mieleen yksi kysymys.

    Funktio luo kaksi taulukkoa (gen_data ja badge_data). Gen_datassa on kuukausikohtaiset tiedot ja badge_datassa päiväkohtaiset tiedot. Haluaisin sitoa month_id-kentän export_id-kenttään siten, että badge_data-taulukkoon ei saisi lisättyä sellaista riviä, jonka month_id ei vastaa jotain gen_data-taulussa olevaa export_id:tä. Onko tällaisen ominaisuuden lisääminen vaikeaa?

    Koodi:
    def db_writer(input_data: tuple):
    
        gen_data, badge_data = input_data[0], input_data[1]
    
        db = sqlite3.connect('wh_db.sqlite')
    
        c = db.cursor()
    
        c.execute("CREATE TABLE IF NOT EXISTS gen_data"
                  "(export_id INTEGER PRIMARY KEY, export_date TEXT, "
                  "export_time TEXT, from_date TEXT, to_date TEXT)")
    
        c.execute("CREATE TABLE IF NOT EXISTS badge_data"
                  "(day_id INTEGER PRIMARY KEY, badge_id TEXT, name TEXT, date TEXT, first_entry TEXT, first_exit TEXT, "
                  "second_entry TEXT, second_exit TEXT, month_id)")
    
        record_exists = c.execute("SELECT export_date, export_time FROM gen_data WHERE export_date = ? AND export_time = ?", (gen_data[0], gen_data[1]))
    
        if record_exists.fetchone() is None:
    
            c.execute("INSERT INTO gen_data (export_date, export_time, from_date, to_date)"
                      "VALUES (?, ?, ?, ?)", gen_data)
    
            id = c.execute("SELECT export_id FROM gen_data WHERE export_id = (SELECT MAX(export_id) FROM gen_data)")
            month_id = id.fetchone()
    
            for line in badge_data:
                line.append(month_id[0])
                print(line)
                c.execute("INSERT INTO badge_data (badge_id, name, date, first_entry, first_exit, second_entry, second_exit, month_id)"
                          "VALUES (?, ?, ?, ?, ?, ?, ?, ?)", line[4:])
        else:
            print("A record for given export date already exists.")
    
        db.commit()
        c.close()
        db.close()
     
  28. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Vissiin foreign key on suunnilleen se mitä tässä haen takaa. Eli month_id:stä pitää tehdä foreign key, joka viittaa export_id:hen.

    Kannattaako muuten kellonajat syöttää tietokantaan ihan vaan tekstinä vai kannattaisiko muuntaa ne datetime-objekteiksi? Aikavyöhykejutuista ei tässä tarkoituksessa ole mitään hyötyä.
     
  29. Tuke

    Tuke

    Viestejä:
    16
    Rekisteröitynyt:
    21.10.2016
    Foreign key on oikea työkalu tuohon.
    Kannattaa ehdottomasti tallentaa muuna kuin tekstinä. Jos tietoa pitää hakea tai järjestää ajan mukaan niin se on huomattavasti helpompaa kun se on tallennettu sopivassa formaatissa.
     
  30. PalleX

    PalleX

    Viestejä:
    31
    Rekisteröitynyt:
    26.10.2016
    Suositeltava muoto on UTC unix timestamp
     
    Viimeksi muokattu: 02.06.2018
  31. ©©©

    ©©©

    Viestejä:
    177
    Rekisteröitynyt:
    16.10.2016
    Tosiaan foreign key -liitos:

    Koodi:
    CREATE TABLE IF NOT EXISTS badge_data
    (
      id INTEGER PRIMARY KEY,
      day_id INTEGER,
      badge_id TEXT,
      name TEXT,
      date TEXT,
      first_entry TEXT,
      first_exit TEXT,
      second_entry TEXT,
      second_exit TEXT,
      month_id,
      FOREIGN KEY(month_id) REFERENCES gen_data(export_id)
    );
    
    ja tosiaan kaikki ajat kannattaa kääntää unix timestampeiksi ja tallentaa integerinä, koska SQLite ei tue DATETIME datatyyppiä. Konvertiossa kannattaa sitten katsoa, että jos sinun string-muotoiset aikaleimat ovat Suomen ajassa niin ne pitää ensiksi muuttaa UTC-aikaan ja vasta sitten unix timestampiksi, muuten käy siten että Suomen aikaa käsitellään UTC-aikana.

    Lisäksi ihmettelen miksi sinulla on day_id laitettu primary keyksi, eikö tauluun ole tarkoitus lisätä usean henkilön saman päivän tietoja? Yllä oma tulkinta taulusta. Myös kiinnittäisin paljon homiota koodin jäsentelyyn ja missä on mitäkin dataa. Esim. SQL-lauseet ei mielestäni koskaan kuulu samaan funktioon missä on datan käsittelyn logiikka.

    Tässä oma jäsentely:

    [ Vain rekisteröityneet käyttäjät näkevät Spoiler-tagin sisällön. Rekisteröidy foorumille... ]

    [ Vain rekisteröityneet käyttäjät näkevät Spoiler-tagin sisällön. Rekisteröidy foorumille... ]
     
  32. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Kiitos hyvistä neuvoista. Siirsin SQL-lauseet toiseen paikkaan ja tuosta minun db_writer-funktiosta tulikin heti paljon helpommin tulkittava. Tuo day_id oli vähän hämäävä. Tarkoitin sillä siis ihan vaan juoksevaa rivi-id:tä. Badge_gen-taulun 'date' kolumni taas oikeasti viittaa päivään. Lopullisessa taulukossa rakenne on siis:
    Koodi:
    create_badge_data_table = """
        CREATE TABLE IF NOT EXISTS badge_data
        (
            id INTEGER PRIMARY KEY,
            badge_id TEXT,
            name TEXT,
            day TEXT,
            first_entry TEXT,
            first_exit TEXT,
            second_entry TEXT,
            second_exit TEXT,
            month_id,
            FOREIGN KEY(month_id) REFERENCES gen_data(export_id)
        );
    """
    
    Miten tuon foreign key -liitoksen luuluu toimia? Vaikka olen lisännyt sen badge_datan month_id-kenttään, niin pystyn silti lisäämään badge_dataan rivejä, joissa on joku ihan hatusta vedetty month_id.

    Olen lisännyt noita testirivejä esimerkiksi näin:
    Koodi:
    c.execute("INSERT INTO badge_data (month_id) VALUES (467)")
    
    Eikö tuosta kuuluisi joku errori tulla?
     
  33. Tuke

    Tuke

    Viestejä:
    16
    Rekisteröitynyt:
    21.10.2016
    SQLitessä taitaa olla foreign key -tarkistukset disabloituna oletuksena taaksepäin yhteensopivuuden takia.
     
  34. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    No tämähän se oli. Olin jo kertaalleen foreign_keysin aktivoinut, mutta kun poistelin ja loin tuota tietokantaa moneen kertaan, niin asetus oli mennyt pois päältä. Ilmeisesti aina tietokannan luomisen jälkeen pitää käydä tuo asetus laittamassa päälle.

    Nyt siis sain tuon toimimaan ja tulee tämä errori: FOREIGN KEY constraint failed: INSERT INTO badge_data(month_id) VALUES(345), jos koitan lisätä epäkelpoa id:tä.
     
  35. ©©©

    ©©©

    Viestejä:
    177
    Rekisteröitynyt:
    16.10.2016
    Kannattaa laittaa se suoraan aina tuohon connect metodin jälkeen:

    Koodi:
    db = sqlite3.connect(DB_NAME)
    c = db.cursor()
    c.execute('PRAGMA foreign_keys = 1')
    Varmaan kannattaa miettiä ihan PostgreSQL käyttöä niin säästyy monelta ihmetykseltä. Lisäksi suosittelen esim. SQLAlchemyä niin ei tarvitse itse murehtia noista SQL-lauseista ja connection pooleista yksinkertaisissa tapauksissa.

    Sit sellainenkin tuli mieleen, että voit määritellä unique constraintin tuolle gen_data taululle niin sinun ei itse tarvitse noita checkailla turhaan koodissa:

    Koodi:
            CREATE TABLE IF NOT EXISTS gen_data
            (
                export_id INTEGER PRIMARY KEY AUTOINCREMENT,
                export_date TEXT,
                export_time TEXT,
                from_date TEXT,
                to_date TEXT,
                CONSTRAINT uniq_export_datetime UNIQUE (export_date, export_time)
            );
    Jolloin tämä on turhaa:

    Koodi:
        record_exists = c.execute(
            SQLQuery.get_record,
            (gen_data[0], gen_data[1])
        ).fetchone()
    
        if record_exists:
            print("A record for given export date already exists.")
            return None
     
    Viimeksi muokattu: 02.06.2018
    Nigel ja Kaitzschu tykkäävät tästä.
  36. KariJoo

    KariJoo

    Viestejä:
    100
    Rekisteröitynyt:
    25.10.2017
    Ja tähän väliin Java-aiheinen kysymys. eli UbuntuLinuxiin työn alla pieni konsolissa pyörivä ohjelma. Tarkoituksena saada käyttäjälle notifikaatio kun jotain tapahtuu, eli yksinkertaisin voisi olla jonkinlainen piip-ääni. Ja vielä silleen ettei tarvitsisi mitään filua ladata. Vaan miten hitossa tuon saa tehtyä.
    -java.awt.Toolkit.getDefaultToolkit().beep(); ei toimi
    -System.out.print("\007"); ei toimi

    Muuta ideaa? Ja ei, tästä ei tehdä Applettia.
     
  37. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Koitin lisätä tuota unique constraintia, mutta erroria pukkaa taulua luodessa. Olen katsonut syntaksia moneen kertaan, mutta ei tunnu aukeavan.

    Virheilmoitus:
    Koodi:
    File "C:/Users/Utente-006/Documents/Programming/WhHandler/main.py", line 210, in _db_writer
        c.execute(SQLQuery.create_gen_data_table)
    sqlite3.OperationalError: near "(": syntax error
    
    Ja sql-lause näyttää tältä:

    Koodi:
    CREATE TABLE IF NOT EXISTS gen_data
    (
        export_id INTEGER PRIMARY KEY AUTOINCREMENT,
        export_date TEXT,
        export_time TEXT,
        from_date TEXT,
        to_date TEXT
        CONSTRAINT uniq_export_datetime UNIQUE (export_date, export_time)
    );
    
    Katselin muualtakin ohjeita, mutta tuollein sen pitäisi olla kai oikein :confused:
     
  38. Villae

    Villae

    Viestejä:
    19
    Rekisteröitynyt:
    18.10.2016
    to_date TEXT-rivin lopusta puuttuu pilkku?
     
  39. Xiyng

    Xiyng

    Viestejä:
    978
    Rekisteröitynyt:
    19.10.2016
    Asiasta mitään tietämättä tämä näyttää hyödylliseltä. Tuo taitaa pikemminkin johtaa työpöytäilmoitukseen kuin ääneen, mutta sekin saattaisi kelvata.
     
  40. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Jep, thanks.

    Muokkasin tuota gen_data-taulua nyt niin, että siinä ei ole enää tekstimuotoisia export_date- ja export_time-kenttiä, vaan yksi kenttä unix timestampille. Lisäksi from_date- ja to_date-kentät on nyt timestamp-muodossa.

    [​IMG]

    Lisäksi myös badge_data-taulun päivämääräkenttä on nyt timestamp. En tiedä onko tästä viimeisestä muunnoksesta mitään hyötyä, mutta tulipahan tehtyä. Nuo itse leimaukset jätän tekstimuotoon.

    upload_2018-6-4_12-1-1.png upload_2018-6-4_12-27-59.png

    (Sähläsin noitten liitteiden kanssa enkä saa niitä enää pois.)
     
  41. arcane

    arcane

    Viestejä:
    557
    Rekisteröitynyt:
    23.10.2016
    Voisi tälle kai uuden topicin perustaa myös:

    Onko suosituksia hyvistä verkkokursseista 2D-peliohjelmoinnin perusteista tai peliohjelmointiympäristöistä? Tutoriaaleja löytyy paljonkin, mutta minulla loppuu motivaatio seurata Unityn videomuotoisia tutoriaaleja, joissa toistetaan perässä kaikki toimet ja pahimmillaan video on kuvattu jollain luennolla. Jos video laahaa tai käy läpi jotain ihan ohjelmoinnin perusjuttuja, on vaikea skipata sitä ylimääräistä osuutta, kun jotain oleellista jää sitten tekemättä.

    Lähinnä kiinnostaa tosiaan 2D, ehkä pysyen monissa asioissa simppelimpänä, joten olisi varmaan hyvä jos kurssilla ei käytettäisi Unreal Engineä. Saa myös sisältää teoreettisempaa tavaraa konsepteista tai käytettyjen työkalujen tarjoamista seteistä, tai mennä sivupoluille äänien/efektien/spritejen/muiden assettien tekemiseen.
     
  42. zamerok

    zamerok Team SER

    Viestejä:
    105
    Rekisteröitynyt:
    14.01.2017
    Suosittelen katsomaan Handmade Heroa (youtube). Siinä koodataan 2D-peli alusta asti C:llä ja jokainen vaihe selitetään. Itsellä nyt 30. jakso menossa :)
    Vaatii kyllä vähän kärsivällisyyttä ja oikeaa kiinnostusta jotta jaksaa jokaisen jakson (varsinkin alun platform-koodauksen) katsoa läpi, mutta suosittelen katsomaan jokaisen jakson järjestyksessä koska muuten ei välttämättä ymmärrä kaikkea ja voi helposti turhautua.
     
  43. arcane

    arcane

    Viestejä:
    557
    Rekisteröitynyt:
    23.10.2016
    Oliko tämä vitsi? Kuulostaa kaikin puolin juuri siltä, mitä en hae. Tässä on monta vikaa:

    - C-ohjelmointi
    - Tuntien pituiset videot, joita on joku 500...
    - Kaiken tekeminen alusta asti

    Joskus nimenomaan yritin kiinnostua matalan tason ohjelmoinnista Gameboy Advancen kanssa, mutta suurin osa näkemästäni C-koodista on niin luotaan työntävää, ettei se oikein maistunut.

    Lähempänä hakemaani taitaa olla esimerkiksi GameMaker Studio 2, Löve tai joku Javascript/HTML5 Canvas -pohjainen engine, tai Unityn 2d-ominaisuudet.

    Ongelma vaan on se, etten löydä oikein mielekästä materiaalia, tai laatuvaatimukseni ovat liian korkealla. Haluaisin nimittäin mieluusti jotain "lue tekstiä, pari tehtävää, lue tekstiä, pari tehtävää" -tyylistä materiaalia, jossa joko rakennettaisiin yksi peli tehtävien muodossa ja samalla käytäisiin myös 2D-ohjelmoinnissa vaadittavaa matematiikkaa, tai tehtävät voisivat olla vaikka jonkun yksittäisten toiminnallisuuksien/juttujen lisäämistä jo puolivalmiisiin runkoihin. Tämä olisi ainakin minulle mielekäs tapa opiskella ja ehkä samalla saada ajatuksia miten voisin taitoja hyödyntää, kuin noudattamalla vaan orjallisesti video-ohjeita tai yrittää videoiden pohjalta siirtyä tekemään jotain enemmän tai vähemmän eri ideaa.

    [edit] Löven suositus tosiaan tuli toisaalta, sen tutoriaalit ainakin näyttäisivät olevan jo lähempänä sitä mitä haen. Ehkä voisin niitä ainakin kokeilla seuraavaksi.
     
    Viimeksi muokattu: 15.06.2018
  44. zamerok

    zamerok Team SER

    Viestejä:
    105
    Rekisteröitynyt:
    14.01.2017
    Ei se vitsi ollut, vaan ajattelin että jos pelialalle haluaa niin on ihan hyvä ymmärtää vähän laajemmin miten pelimoottorit ja sen komponentit toimivat. Tietysti pitää miettiä mitä roolia haluat pelikehityksessä, eli onko engineen liittyvää koodausta vai ihan pelilogiikan koodausta. Uskoisin että sinulle jälkimmäinen on se oikeampi vaihtoehto.

    Handmade Herossa juurikin käydään 2D-matematiikkaa laajasti läpi.

    Ehkä youtube on sinulle väärä paikka etsiä. Kaupallisiakin tutoriaaleja löytyy ja niiden luulisi olevan laadukkaampia. Esimerkiksi täältä: Online Courses - Anytime, Anywhere | Udemy (nuo "tarjoukset" ovat sitten ilmeisesti aina voimassa, viimeksi katsoin viikko sitten ja silloinkin oli "5h jäljellä").
     
  45. arcane

    arcane

    Viestejä:
    557
    Rekisteröitynyt:
    23.10.2016
    Niin no - ehkä olisi pitänyt lähtökohdat määrittää tarkemmin: Pelialalle ei ole ainakaan tällä hetkellä niin mitään aikomusta, ihan vain harrastepohjaista tutustumista ja alkeita. :) Kun koodaa 9-17 työssä fullstackia, ei ihan riitä innostus vielä alkaa kovin intensiivisesti opiskelemaan.

    Youtubesta en tosiaan arvellutkaan löytävän mitään minulle suoraan sopivaa, enkä sieltä ole oikeastaan haeskellutkaan. Udemy, Course ja Edx ovat vähintään niminä tuttuja, mutta niiden laatu voi olla ihan mitä tahansa. Kokemuksia on mm. Ruby on Rails kurssista, jossa ensin pari viikkoa huonosti videoituja luentoja ja jotain kompamonivalintakysymyksiä, sitten yhtäkkiä isokokoinen Rails-koodi eteen ja "täällä on myös yksi bugi". Onneksi tässä tapauksessa maksajana en ollut minä, ja kurssin pystyi helposti jättämään keskenkin. Linkittämäsi Udemyn kurssit ovat tähtimääriltään kovia, mutta kun katsoo sisältöä, niin "50h on-demand videos", "Certificate of completion" ja sisällysluettelossa joku 9 kysymyksen quiz joka osion lopussa... kuulostaa kumman tutulta.

    Sokkona en tuollaisesta materiaalista ala maksamaan yhtikäs mitään. Nuo "tää on 190$ kurssi mutta vain sulle 10$" on suurin piirtein yhtä luotettavan kuuloinen kuin TV shop.

    Tämän takia toivoinkin, että ehkä joku muu on jo löytänyt jotain hyviä kursseja, kirjoja tai tekstipohjaisia tutoriaaleja, johon osaa ohjata - maksullisia tai ei. Hyvästä kurssista voisi lompakko avautuakin. Mutta ehkä odotukseni ovat vain utopistiset, kun toivomuksissa olisi löytää Ohjelmoinnin MOOC tai Full stack Open 2018 tapaista ja tasoista materiaalia.
     
  46. Nigel

    Nigel

    Viestejä:
    216
    Rekisteröitynyt:
    23.10.2016
    Miten olio-ohjelmointia kannattaisi lähteä harjoittelemaan? Mulla on perusteet joten kuten hallussa, koska tuolla Udemyn Python-kurssilla tästäkin aiheesta oli oma osionsa, mutta en siltikään oikein osaa sitä soveltaa. Nyt kun olen pari omaa skriptiä tehnyt, niin lähden aina ratkaisemaan ongelmaa proseduraalisesti enkä edes harkita luokkien käyttöä.

    Nyt siis aloitan suunnittelun jakamalla skriptin osiin ja teen noista osista erilliset funktiot. Nämä funktiokutsut laitan sitten vaan peräkkäin main()-funktioon. Toimii ihan hyvin näissä pikkuohjelmissa, mutta tämä ei varmaan ole paras lähestymistapa, jos joskus pääsee sellaiselle tasolle, että pystyy tekemään jotain isompaa.
     
  47. jarif

    jarif

    Viestejä:
    313
    Rekisteröitynyt:
    01.01.2017
    Kumma miten mulle ysärin alussa oliojutut kolahti ihan kybällä, kun tutustuin Dataflex 3 -kehittimeen ja C++:aan. Olin sitä ennen tehnyt juttuja Pascalilla ja C:llä ja silloinkin tein asioista "oloita" tyyppeinä tai struckteina ja niille sopivat funkkarit.

    Mutta sitten tuli C++ ja Object Pascal ja lopulta Java ja vähän Pythoniakin, ja aina on on olioilla menty. Se vain tuntuu niin luontaiselta. Olio on asia, ja siihen liittyvät metodit eli funkkarit.

    Sitä vierastan, kun ihmiset puhuu scripteistä. Oikeat ongelmointikielet ei liity mitenkään skripteihin ;)
     
  48. jarif

    jarif

    Viestejä:
    313
    Rekisteröitynyt:
    01.01.2017
    Oliot on itsenäisiä asioita ja niihin liittyviä toimintoja. Ensimmäiset oliokielet kuten Ada oli "object based", mutta kun mukaan tuli lisää juttuja, niin syntyi "object oriented". Tähän liittyy kehittyneempiä juttuja kuten periyvyys ja monimuotuisuus.

    Tietty nykyään on mukana jopa Javassa ja C++:ssa funktionaalisia juttuja, ja ne vaan täydentää asiaa.
     
  49. Xiyng

    Xiyng

    Viestejä:
    978
    Rekisteröitynyt:
    19.10.2016
    En osaa antaa kovin hyviä lähtökohtia, mutta yksi tapa on varmastikin ohjelmoidessa miettiä aina, minkä kaiken voi ajatella olioksi ja sitten kyseisistä asioista olioita. Kun olioita tarpeeksi käyttää, asiat alkavat hahmottua paremmin, mutta aluksi asiaa voi joutua miettimään enemmän ihan tietoisestikin, koska harva varmaan ajattelee asioita luontaisesti olioina, vaikka jälkikäteen katsottuna monet asiat voikin sellaisiksi ajatella.
     
  50. ©©©

    ©©©

    Viestejä:
    177
    Rekisteröitynyt:
    16.10.2016
    Tietokannan taulu on hyvä esimerkki luokasta ja yksi rivin taulusta on yksi luokan olio (instanssi). Luokka voi sitten periä metodeja isäntäluokalta jolla käsitellään tietokannan yhteyksiä ja tallennusmekanismeja.
    Yleisesti jos sinulla on jokin datamalli jonka tietojen käsittelyyn tarvitaan dedikoituja funktioita niin silloin kannattaa harkita luokkien käyttöä. Funktiot voidaan sitten laittaa luokkaan metodeiksi, jolloin datan malli ja käsittely on yhdessä paikassa.
     
    ted tykkää tästä.