Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Vláďa J

Stran: 1 [2] 3
16
Vývoj / Re:Výpis adresářů a souborů v C++
« kdy: 15. 05. 2012, 09:31:33 »
kocour_easy> Díky, tohle je přesně to, co jsem potřeboval. Na Boost File System jsem také koukal, ale mi přijde trochu jako kanonem na vrabce.

Ale narazil jsem na další problém, spíš teda nejasnost. Potřebuju názvy souborů a adresářů uložit do pole, to si potom seřadit a dál to používat. Doteď jsem progrqamoval jenom v interpertovanych jazycích a tam to nebyl vůbec žádnej problém. Ale pokud to chápu dobře, tak v C si musím nejdřív říct, kolik paměti budu potřebovat. Ale jak to udělat, když to dopředu nevím? V C++ jsem koukal, že třeba string už nepotřebuje dopředu vědět, jak bude dlouhý.

Jak to tedy udělat správně? Napadlo mě udělat si pole pointerů a těma ukazovat na jednotlivý řetězce. Je to správnej přístup? Jak to prakticky udlat?

Stačí mě trochu nakopnout, zbytek už si najdu nebo vymyslím. Díky.

17
Vývoj / Výpis adresářů a souborů v C++
« kdy: 13. 05. 2012, 22:35:45 »
Zdravím,

dneska jsem se začal učit programovat v C++ a tak trochu tápu. Po hodině marnýho hledání jsem se rozhodl, že se radši zeptám.

Pro potřeby mýho programu (snažím se při učení alespoň vyprodukovat něco užitečnýho) potřebuju získat výpis podadresářů a souborů. Našel jsem následující kód:

Kód: [Vybrat]
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int
main (void){
    DIR *dp;
    struct dirent *ep;   
    dp = opendir ("./");
    if (dp != NULL){
        while (ep = readdir (dp))
            puts (ep->d_name);
        (void) closedir (dp);
    }
    else
        perror ("Couldn't open the directory");   
    return 0;
}

V podstatě to dělá to, co potřebuju. Akorát ještě musím projít rekurzivně všechny adresáře a neumím zjistit, jestli je něco adresář nebo soubor. Našel jsem, že struktura dirent by mohla mít položku d_type, ale minimálně na Windows s MinGW to nefunguje.

18
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 28. 12. 2011, 21:52:19 »
Logik> Všechno tohle jsem zkoušel. Funkci na automatický generování SQL dotazu tam samozřejmě mám už teď k plochý tabulce.
Zkoušel jsem jí předělat na použití se normalizovanou databází. Jednoduchý dotazy fungují dobře, jenže to začíná být značně komplikovaný v okamžiku, kdy použiju dynamický playlisty. Jako příklad jednoho běžnýho playlistu jsem uvedl hudba s hodnocením 3 a vyšším. Tedy dynamický playlist má podobu rating >= 3 AND genre <> "Speech". Tohle je samozřejmě nepoužitelné. Sloupec rating je v tabulce se všemi písničkami, genre je naopak v samostatné tabulce.

Takže by asi bylo nutné ten dynamický playlist vytvořit už tak, aby s tímhle počítal. To by asi nějak šlo.

Vztah jednotlivých sloupců je samozřejmě M:N. Každé album může mít víc autorů i žánrů, ke každému interpretovi patří několik žánrů atd. Udělal jsem tedy tabulky žánr, interpret a album a další 3 asociační tabulky mezi každou z nich. V hlavní tabulce s názvem "Library" jsou potom reference do všech 3 předchozích tabulek.

Ale zasekl jsem se na jiné věci. Pořád se trochu motám v tom, jak použít JOIN. Zkusím lehce shrnout mé myšlenkové pochody:

Dejme tomu, že použiju můj již zmíněný dynamický filtr a formuluji jej jako podmínku
Kód: [Vybrat]
SELECT artist FROM artist_table WHERE artist_id IN
    (SELECT artist_ref FROM Library WHERE rating >= 3 AND genre_ref IN
        (SELECT genre_id FROM genre_table WHERE genre <> 'Speech')
    )

Jenže tohle mi vyhodí opakující se autory, jak tento dotaz přepíšu tak, aby vypadly pouze unikátní záznamy bez použití DISTINCT / GROUP BY?

Dál potom mohu chtít vyjet seznam písniček pro playlist. To bude dvourozměrné pole se všemi dostupnými informacemi ke každé písničce. Můžu analogicky s předchozím dotazem získat toto:
Kód: [Vybrat]
SELECT * FROM Library WHERE rating >= 3 AND genre_ref IN
        (SELECT genre_id FROM genre_table WHERE genre <> 'Speech')
    )

Jenže místo autora budu mít autor_id, místo alba bude album_id atd. Jak upravím dotaz tak, abych získal i sloupce autor, obrázek_autora, album, autor_alba atd.? Zkoušel jsem to a výsledkem byla vždycky nějaká hrůza se spoustou JOINů a podmínek ON a výpis trval nekonečně dlouho. Přitom by mělo jít o triviální věc (z hlediska logiky databáze). Na tohmle jsem se zasekl a nevím, jak dál. Všude jsem našel pouze příliš jednoduché příklady, které obsahovaly maximálně 2 tabulky.

Zatím jsem po vzoru Járy Cimrmana průkopníkem slepých uliček. Až si někdy říkám, jestli mi za to ta vteřina, o kterou to urychlím, stojí. Jenže já blbec jsem prefekcionista a pokud to jde udělat líp, tak to tak udělat prostě chci.

19
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 27. 12. 2011, 17:13:24 »
Použití GROUP BY místo DISTINCT nemá na rychlost vůbec žádný vliv. Pokud použiju JOIN tak, jak je to v druhém případě (a ještě doplním AND rating >= 3, aby to odpovídalo), tak se výpi naopak cca 3x zpomalí.

Takže asi zůstanu u použití "IN".

Jenom mě ještě napadla jedna věc. Jak co nejrychleji vypíšu všechny stopy (tedy celou tabulku Library) tak, aby ve výpisu byly všechny sloupce tabulky Library, ale například artist_ref se nahradilo sloupci artist a artist_picture a analogicky se sloupci genre_ref a album_ref.

20
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 27. 12. 2011, 16:14:17 »
Díky za nakopnutí. Už mi to do sebe trochu zapadá. V mém případě je to trochu složitější. Nakonec tenhle ód vypadá slibně:
Kód: [Vybrat]
SELECT artist FROM artist_table WHERE artist_id IN
    (SELECT DISTINCT artist_ref FROM Library WHERE rating >= 3 AND genre_ref IN
        (SELECT genre_id FROM genre_table WHERE genre <> 'Speech'))

je v podstatě stejně rychlý jako původní
Kód: [Vybrat]
SELECT DISTINCT artist_ref FROM Library WHERE rating >= 3 AND genre_ref <> 0
Oba na mém stolním počítači zaberou 0,015s při 22 000 záznamech, což je OK. Teď jenom vymyslet, jak takový kód vygenerovat automaticky. To bude, obávám se, solidní oříšek.

21
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 27. 12. 2011, 13:42:37 »
Kit> Vnořený dotaz vím, co je, ale nevím, jak ho použít. Mohl bys mi prosím poradit?

Pro zjednodušení uvedu následující příklad. Mám 3 tabulky - žánr, interpret a skladby. Tabulka žánr má sloupce žánr, žánr_id analogicky tabulka interpret má sloupce interpret a interpret_id. Mezi nima je asociační tabulka. Tedy stejně jako jsem to psal v mém včerejším příspěvku.

Na to je ale ještě napojená tabulka se skladbami, která má sloupce název, hodnocení, žánr_ref a interpret_ref. Poslední dva sloupce jsou cizí primární klíče odkazující na první dvě tabulky.

Jak z těchto tří tabulek co nejrychleji zjistím všechny interprety, kteří hrají žánr "Rock" a z tohoto žánru mají alespoň jednu skladbu s hodnocením vyšším než 3?

Když jsem měl vše pouze v jedné tabulce, stačil naprosto triviální dotaz
Kód: [Vybrat]
SELECT DISTINCT artist FROM Library WHERE genre = "Rock" AND rating > 3
Takový dotaz byl i na UMPC s Atomem provedený nejpozději do vteřiny. Pokud použiju nyní s více tabulkami analogický dotaz, trvá na hodně rychlém počítači více než 10s. Takže místo urychlení jsem to mnohonásobně zpomalil. :-(

Celý problém je o to komplikovanější, že SQL dotazy se musí generovat automaticky podle toho, co si uživatel přeje vyfiltrovat.

22
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 27. 12. 2011, 00:21:54 »
Tak jsem se opět unáhlil. Nefunguje to. Sice tuším proč, ale nevím, co s tím.

Například když kliknu na dynamický playlist, který se jmenuje "Hudba 3+" a vyjedu si znovu sloupce "žánr", "interpret", "album", tak se všechny položky vyjedou několikrát.

konkrétně u žánru se použije tento příkaz:
Kód: [Vybrat]
SELECT genre, genre_id FROM genre_table JOIN Library ON genre_table.genre_id = Library.genre_ref WHERE rating >= 3 AND genre <> "Speech" ORDER BY genre ASC
Skladeb, které tomu odpovídají, je v knihovně 6 a tak se žánr objeví 6x stejný. Samozřejmě to můžu jednoduše ošetřit přidáním "DISTINCT", jenže se obávám, že tím zase všechno zpomalím.

Ještě hůř to dopadne u alba. V knihovně je zatím pouze jedno s 28 stopami. Použije se tento dotaz:
Kód: [Vybrat]
SELECT album, album_picture, album_id FROM genre_table JOIN genre_album ON genre_table.genre_id = genre_album.genre_ref JOIN album_table ON genre_album.album_ref = album_table.album_id JOIN Library ON genre_table.genre_id = Library.genre_ref AND album_table.album_id = Library.album_ref WHERE rating >= 3 AND genre <> "Speech" ORDER BY album ASC

A na ten mi vypadne to samé album 168x. Nechápu proč a už vůbec nevím, co s tím dělat.

Dokážete mi někdo poradit, co jsem zvoral?

23
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 26. 12. 2011, 23:27:16 »
Tak to jsem se trochu unáhlil, v případě 4 sloupců (žánr, interpret, album, skladba) to budou pouze 3 porovnávací tabulky, protože tabulka se skladbama žádnou porovnávací s ostatníma nepotřebuje (vše je unikátní). Zatím na malém počtu písniček to funguje k mé spokojenosti, akorát z toho lezou příšerné SQL dotazy typu:
Kód: [Vybrat]
SELECT title, track FROM genre_table JOIN genre_artist ON genre_table.genre_id = genre_artist.genre_ref JOIN artist_table ON genre_artist.artist_ref = artist_table.artist_id JOIN artist_album ON artist_table.artist_id = artist_album.artist_ref JOIN album_table ON artist_album.album_ref = album_table.album_id JOIN Library ON genre_table.genre_id = Library.genre_ref AND artist_table.artist_id = Library.artist_ref AND album_table.album_id = Library.album_ref WHERE genre='Soundtrack' AND (album_artist='Wings' OR artist='Wings') AND album='James Bond Themes' ORDER BY track ASC

24
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 26. 12. 2011, 20:04:03 »
Rád bych se ještě vrátil k tomuto tématu a požádal o pár rad.

Něco jsem dal dohromady, ale nejsem s tím spokojený. Respektive jsem to celý zprasil, protože mi některý věci nedošly.

Zásadní problém je v tom, že tak jak jsem tabulky poskládal, tak by ke každému umělci musel příslušet jeden žánr, ke každému albu jeden umělec atd. Předpokládám, že jediný rozumný způsob, jak tohle vyřešit, je vytvoření porovnávací tabulky mezi všema tabulkama. To už jich ale bude šílená spousta, nebude to nakonec kontraproduktivní?

Vypadalo by to asi takhle:

ŽánrŽánr_id
Folk-rock1
Country2
Rock & Roll3

InterpretInterpret_id
Elvis Presley1
Pavel Bobek2

Žánr_idInterpret_id
12
21
22
31
32

Podobné porovnávací tabulky by potom byly mezi všema třídícíma tabulkama. Dává to smysl? Je to takhle správně?

A jak se potom udělá JOIN takových tabulek?

Taky mě trápí, jak implementovat autora alba. Chtěl bych, aby v UI v seznamu "Interpret" bylo obojí. To znamená, že tam bude jak Country Beat Jiřího Brabce, jakožto autor alba, tak i Nadě Urbánková, Jiří Grossman nebo Ladislav Vodička, jakožto interperti jednotlivých písniček.

Jediná rozumná věc, která mě napadla, je přidat autora alba do tabulky alb, protože každé album má logicky pouze jednoho autora. Pokud vytvářím seznam interpretů/autorů, vyjedu si s "DISTINCT" autory alb a celou tabulku "Interpret". Potom oba seznamy spojím a vymažu duplicity. Zdá se mi to ale dost krkolomné. Bohužel jsem na nic lepšího nepřišel. Položka "Autor alba" do toho vnáší spoustu různých nesystematičností a výjimek, kterým bych se rád vyhnul, ale nevím jak. Každopádně tohle je spíš podružný problém, protože to funguje, jenom se mi to nelíbí. Důležité pro mě je, jak udělat ty tabulky.

Díky všem za rady.

25
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 19. 12. 2011, 09:38:11 »
mimi.vx> No podle mě to je celkem fuk, jestli použiju SQLite z Pythonu nebo Qt. Jelikož celá logika programu je v Pythonu a v Qt (respektive QML) je pouze UI, tak mi to přišlo takhle logičtější. Na přehrávání používám Phonon z Qt. Ale možná přejdu GStresmer nebo QtMultimediaKit.

Logik> Díky za perfektní rady. Zkusím to nějak zpracovat. Já už to mám v podstatě všechno funkční (s pomocí jedný tabulky), akorát některý věci prostě trvají dýl než by se mi líbilo a taky začíná váznout udržovatelnost. Proto jsem to začal řešit.

26
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 16. 12. 2011, 01:45:47 »
Tak díky vašim radám už se mi to tak trochu rýsuje, ale mám ještě dva problémy, které neumím nějak vhodně vyřešit.

První je jednoduchá otázka - je lepší použít DISTINCT nebo GROUP BY? Jaký je v tom vlastně rozdíl?

Druhá věc je trošku složitější na vysvětlení, ale snad to zvládnu. Chtěl bych mít tabulku, kde budou sloupce album, autor alba, cesta k obalu a id alba (syntetický primární klíč). Album a interpret alba ho jednoznačně určují.

Problém nastává, jak takovou tabulku vytvořit. Když prohledávám písničky, tak nevím, jestli album, ze kterého písnička je, už v databázi není a už vůbec netuším id toho alba. Napadá mě tedy několik možností, jak to řešit, ale všechny se mi zdají dost krkolomné. Jediný aspoň trošku rozumný postup mě napadá tohle:
1) Zjistím, jestli už album je v tabulce s alby
2) Pokud ne, přidám ho s novým id, pokud už existuje, zjistím jeho id
3) Do tabulky s detaily o písničkách zapíšu id alba

Zdá se mi trochu zbytečné, abych s každou písničkou zjišťoval, jestli už daná kombinace alba a interpreta existuje. Nejde to nějak zjednodušit? Mně nějak došly nápady...

27
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 14. 12. 2011, 17:41:53 »
Tak jsem si zkoušel na internetu něco najít, ale nastudoval jsem pouze spousty teorie, ale praktický ukázky jsem nikde nenašel. :-(

Každopádně minimálně na to, abych zobrazil všechny žánry, interprety a alba, bude výhodné mít samostatnou tabulku. Ta ještě bude obsahovat cestu k obrázku (interpreta nebo alba). Akorát nevím, jak to správně provázat. V Excelu jsem namaloval takový graf, jak by to asi mělo vypadat:



Filtrovat se bude vždy pouze zleva doprava. Čili nikdy asi nebudu chtít vědět, kdo všechno vydal album s názvem "Best of".

Samozřejmě ta poslední tabulka bude mít mnohem víc sloupců a údajů. Je logické, že sloupce žánr a autor nemusí mít syntetický primární klíč, naopak album ho mít musí.

Potřeboval bych pomoc s tím, jak tuto strukturu prakticky vytvořit (přímo SQL příkazy). Stačí nějaký nástřel, zbytek už si odvodím a domyslím. A nebo alespoň odkaz s praktickými ukázkami, jak spojovat tabulky.

Potom také nevím, jak v tomto případě vyhledám následující věci:
1) Všechny alba a písničky od Elvise s hodnocením vyšším než 3.
2) Všechny interprety, alba a písničky ze 60. let
3) Všechno kromě Country

Předpokládám, že pro vyhledání písniček samotných mi vytvoření dalších tabulek nic nepřinese, ale urychlí se tím výrazně výpis ostatních sloupců. U prvních 2 výpisů z mých příkladů se asi neurychlí vůbec nic, předpokládám.

Ještě závěrem podotýkám, že do databáze se údaje ukládají automaticky proskenováním adresáře s písničkami. Každá písnička tedy pouze jednoho interpreta, jedno album atd. Pokud je jedna písnička na dvou albech, není to pro mě ta samá písnička (bude to jiný soubor). Písničky by mohly mít teoreticky víc žánrů, ale tím bych to asi nechtěl komplikovat, takže i ten bude pouze jeden.

Jak tedy prakticky na to?

28
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 13. 12. 2011, 19:50:24 »
Kit> Cesta k souboru je unikátní. Každý soubor je jedna písnička. Pokud by šlo o CUE sheet nebo třeba MKA, tak přidám nakonec dvojtečku a číslo stopy. Takže pokud tam není jiný problém, nechal bych to asi tak.

S 30 sloupci to myslím tak. Že zatím používám pouze jednu tabulku, která má jeden sloupec pro každou informaci o písničce (název, autor, album, žánr, hodnocení, počet přehrání, formát, bitrate, čas, BPM atd.)

29
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 13. 12. 2011, 18:00:05 »
Logik> Díky, tohle zní rozumně. Jdu se učit databázové relace. Nemáš někde nějaký odkaz na vhodný studijní materiál?

Co jsem ale zatím tak nastudoval, odpovídala by ale mému případu spíš relace 1:N. Předpokládám, že každá písnička má pouze jednoho autora, jedno album, jeden žánr atd. V praxi to tak být samozřejmě nemusí, ale to asi teď řešit nebudu.

Ještě akorát nevím, zda je rozumné používat jako primární klíč pro písničku cestu k souboru. Není lepší místo toho použít třeba číslo (kvůli rychlosti) nebo to je fuk?

Ještě jednou díky. Jsem v databázích opravdu naprostý laik a říkal jsem si, že to musí jít udělat nějak líp.

30
Vývoj / Re:Pomoc se strukturou databáze
« kdy: 13. 12. 2011, 16:31:27 »
Díky všem za užitečné reakce.

Trošku upřesním, co tedy vlastně potřebuji. Mám kolekci písniček (řádově tisíce, možná i přes 10k). Přehrávač vypadá a funguje tak, že má 5 sloupců. V prvním jsou playlisty (dynamické neboli chytré, i obyčejné) v dalším je žánr, potom autor (nebo autor alba), album a písnička. Dynamický playlist je jakékoliv SQL query. Každý sloupec filtruje ty za sebou. To znamená, že pokud vyberu dynamický playlist, který omezí výběr na písničky s hodnocením vyšším než 3, a v autorech vyberu třeba Beatles, budou už v dalším sloupci pouze alba obsahující písničky od Beatles s hodnocením vyšším než 3.

Podobně funguje například iTunes (aspoň myslím, nepoužívám ho) nebo Songbird.

Zatím to funguje tak, že všechny písničky jsou v tabulce s cca 30 sloupci. Pokud označím nějaký výběr ve sloupci x, aktualizuji všechny sloupce od x+1 do 5. To znamená, že pokud ve 3. sloupci vyberu Beatles, query pro 4. sloupec bude vypadat následovně: SELECT DISTINCT album, album_art FROM Library WHERE rating > 3 AND (album_artist='The Beatles' or artist ='The Beatles').

Pokud přidávám skladby z knihovny do playlistu, použiju stejný query, ale nasypu tam všechny sloupce. Cesta k souboru je v tabulce použitá jako unikátní klíč.

Je tohle rozumné nebo ne? Šlo by to udělat jinak a líp?

Nemo7> Bohužel nevím, jak prostudovat strukturu databáze jiného programu. Jinak bych to udělal u foobaru, což je podle mě nejlepší desktopový přehrávač s velkým náskokem. Banshee je, pokud vím, psaný v .NET a v tom bych se asi dost topil, takže zdroják mi taky nepomůže. :-(

Logik> Mohl bys to trochu rozvést, jak jsem psal, v databázích se moc nevyznám.

Na závěr ještě doplním pár konkrétních problémů, s jejichž řešením se malinko trápím. Například v sloupci interpretů bych chtěl mít i autory alba. Zcela konkrétně mám například v databázi album "Jako kotě si příst" od Jiřího Grossmanna. Na něm je písnička, kterou zpívá Jiří Schelinger. Chtěl bych mít v jednom sloupci jak Jiřího Grossmana tak i Jiří Schelingera. Zároveň by se ale neměly duplikovat. Momentálně to řeším tak, že si vyjedu sloupce "artist" a "album_artist", které potom projedu, promažu a spojím do jednoho, což není zrovna nejrychlejší. Jde to vyřešit nějak elegantněji?

Druhý konkrétní problém je to, že například mám v seznamu album a písničky z něj jsou ve více adresářích (podle interpretů). V každém adresáři je potom obrázek alba, který je ale stejný. Pokud si vyjedu alba příkazem SELECT DISTINCT album, album_art FROM Library WHERE nějaká podmínka, tak položka album_art (cesta k obalu alba) je různá a album tam mám několikrát duplicitně. Dá se nějak udělat (jinak než manuálně promazat), aby se DISTINCT týkal pouze prvního sloupce?

Ještě jednou díky všem za podnětné rady a nápady.

Stran: 1 [2] 3