Nelze zapisovat do document.cookie, aneb sušenky na lokálu

Práce s cookies v Javascriptu je otrava. Pokud nepoužijete jQuery plugin, musíte si je sami vyrábět i parsovat a každá odchylka od správného formátu znamená chybu. A to ani nemluvím o domain a path.

Aby toho nebylo málo, může se vám stát i to, že do cookie zapíšete data, zápis vrátí true, ale data po přečtení nikde. Po večeru debugování kódu který byl naprosto v pořádku jsem zjistil, že problémem je localhost.

Z nějakého důvodu neumí Chrome a IE9 ukládat javascriptové cookies na doménách, které v názvu nemají tečku. Ano, zní to šíleně, ale je to fakt. U Chrome dokonce existuje issue, ale má nálepku won’t fix.

Co s tím? Ladit aplikace v jiném prohlížeči (Firefox i Opera jsou v pořádku) anebo jednoduše přejmenovat localhost například na www.localhost.tst

Rubriky: Ústavní | Napsat komentář

Serializace v Javě, aneb NotSerializableException

Po dlouhém odpoledni ladění Člobrda, projektu do letošního semináře Javy, jsem našel užitečný JVM flag, který si potřebuji zapamtovat.

Pokud se pokoušíte serializovat třídu, například pro její poslání po síti, která je složitější, může se vám snadno mezi proměnné třídy vloudit nějaká neserializovatelná. Při snaze zapsat objekt do ObjectOutputStreamu dostanete NotSerializableException s prostým názvem problémové třídy. Jestliže ale na první pohled netušíte, jakou vazbou jsou obě třídy propojené, zřejmě strávíte dlouhý čas laděním (jako já :-) ).

Pomůže vám magický parametr virtuální mašiny, který nastavíte v konfiguraci projektu, v části Run.

-Dsun.io.serialization.extendedDebugInfo=true 

Výstup pak vypadá velice příjemně a dohledat problémovou vazbu již není tak složité :-)

clobrdo.control.Controller	
   - custom writeObject data (class "java.util.ArrayList")	
   - object (class "java.util.ArrayList", [clobrdo.control.Controller@742136c6])	
   - field (class "clobrdo.model.GameState", name: "observers", type: "class java.util.ArrayList")	
   - root object (class "clobrdo.model.GameState", clobrdo.model.GameState@3e052c6f)
Rubriky: Užitečné | 1 komentář

Internetové bankovnictví 2.0

Pamatujete si, když jste byli malí a rodiče vás učili jak zacházet s penězi? Je několik velice známých triků k dosažení alespoň základní finanční kázně. Například pokud se vám neustále ztrácí peníze, stačí si jednoduše vést seznam příjmů a výdajů a na konci měsíce všechno sečíst, případně zjistit které položky by se daly omezit. Podobně při spoření vždy skvěle fungovala „obálková metoda“ – když si šetřím na kolo a na mobil, vezmu dvě obálky a slíbím si, že ihned po výplatě vezmu jistou částku a tu vložím do každé z obálek. A to opakuji dokud nemám dost abych si kolo či mobil koupil.

Asi není žádným tajemstvím, že většina lidí se svými penězmi neumí pracovat. A internetové bankovnictví tomu vůbec nepomáhá – jediné co můžu udělat je nechat si vypsat pohyby na účtu za nějaké období. Já bych ale mnohem radši viděl detailnější statistiky!

Začal bych tím, že by bylo možné otagovat jednotlivé zdroje a cíle transakcí. (Smysl by to samozřejmě mělo jen u opakovaných plateb jako například výplata nebo naopak platba paušálu za telefon.) To by umožnilo získat například průběh velikosti výplaty v posledních letech. Anebo mnohem zajímavější statistiky jako třeba měsíční zůstatek – v každém měsíci odečtu příjmy a výdaje, čímž dostanu „zbylý čistý příjem“ – ten pak můžu sledovat opět v závislosti na čase a zjistit, že přestože jsou mé příjmy i paušální výdaje stejné, v zimních měsících utrácím více než přes léto. Také by to byl velice užitečný ukazatel pro spoření, který ukáže, kolik si můžu dovolit odkládat bokem, aniž bych se „měsíčně“ nedostal do mínusu.

A v souvislosti se spořením bych měl ještě jeden nápad. Podobně jako si můžete v poštovní aplikaci navolit filtry, které příchozí zprávy nasměrují do odpovídajících složek, bylo by i příchozí transakce možné filtrovat a rozdělovat. Namísto složek by byly ony dětské obálky a platby, nebo ještě lépe části plateb, by přicházely do těchto obálek. Můžu si pak pohodlně spořit, přesouvat finance z jedné obálky do jiné … anebo tyto nové funkce vůbec nepoužívat a spokojit se s prostým účtem jako doposud.

Rubriky: Jen tak | 1 komentář

Lenovo Y560 Hardware Assisted Virtualization (HAV)

Kvůli testování aplikací na různých systémech si občas hraji s VirtualPC a vždycky jsem přemýšlel, co že je to ten HAV. Inu, jde o úplnou virtualizaci, kdy procesor virtualizuje například i instrukční sadu cílového systému. Ve výsledku by měl (nebo spíše mohl) virtualizovaný systém běžet rychleji. Uvidíme :-)

Mé milé Lenovo, stejně jako většina moderních počítačů tuto technologii podporuje, jen je defaultně vypnutá. Pro její zapnutí stačí zajít do BIOSu (F2 při bootování) a na kartě Configuration přepnout poslední položku (má v názvu virtualization) na Enabled. Po uložení a restartu by již měla být technologie HAV aktivní.

Ověřit si to můžete s Windowsím HAV Detection Tool.

Samozřejmě Lenovo není jediná značka podporující HAV. Pokud máte počítač mladší než dva roky, je dobrá šance že hardwarovou virtualizaci bude umět. Zapnutí hledejte opět v BIOSu.

Rubriky: Užitečné | Napsat komentář

Privátní GitHub repozitář pro studenty zdarma

Věděli jste, že GitHub podporuje studenty a rozdává privátní repozitáře? A k čemu že to může být dobré?

Uvedu pro příklad moji situaci. Aktuálně píšu bakalářku, která má sice zatím jen nějakých 10+10 (.h + .c) souborů, ale líbilo by se mi použít verzování.
První důvod je očividný – zálohování – je důležité, ať už jde o ochranu před selháním disku anebo jen o možnost procházet si historii.

Druhý důvod jsou branche – ty jsou úžasné v případě, že jste implementovali nějakou experimentální fíčuru a ještě není jisté, jestli v projektu zůstane nebo ne. Pokud jde o rozsáhlejší změny, často pak po odebrání fíčury zůstává v kódu nepořádek, typicky pomocné proměnné a podmínky ošetřující stavy, které již nemohou nastat. S gitem jednoduše vytvořím větev, a pokud jsem s výsledkem spokojený, sloučím ji s hlavní větví. Samozřejmě stále zůstává zachována historie úprav a vše je dohledatelné.

A do třetice issues. Jde vlastně o náhradu lístečků s poznámkami nalepených na okrajích monitoru. Původní záměr byl sice v poskytnutí možnosti bugreportů veřejnosti s volitelným přiložením opravného patche (upravená větev repozitáře), ale tento systém je dost dobře použitelný i v případě že na projektu pracuje pouze jeden člověk a repozitář je neveřejný. Jakmile narazím na něco, co bych chtěl opravit, upravit anebo zlepšit, ale zrovna na to nemám čas, vytvořím si issue. A poznámkové lístečky v okolí počítače můžu zahodit :-)

Pro práci na školních projektech (stejně jako pro práci na komerčních projektech) je nezbytný právě privátní, tedy neveřejný repozitář (jinak se vytavujete možnosti zneužití a předvolání ke komisi kvůli plagiátění). A jak že jej získat? Je to celkem snadné. Stačí pěkně poprosit a popsat projekt, pro který chcete repo použít. Většině případů je vyhověno ;-)

Rubriky: Užitečné | 3 komentáře

5. semestr na FIT VUT

Nepřítel stupňuje tlak a snaží se prolomit obranu!

Asi tak bych jednou větou popsal pátý semestr. Teď už můžu potvrdit, že obtížnost semestrů stoupá a pátý je pomyslné vyvrcholení. Celkem jsem měl kromě ISP sedm povinných (6P + 1PVH) předmětů, plus navíc ještě volitelnou španělštinu. A samozřejmě nechyběly fiťácké zabijárny ISA a IMS.

Zákeřnost předposledního semestru nestaví ani tolik na dvou obtížných předmětech, jako na faktu že pokud člověk některý předmět neudělá, bude muset opakovat a jít do čtvrťáku. Někoho to netrápí, ale jelikož můj plán je co nejdříve dokončit školu a konečně jít vydělávat, každý rok je pro mě zdržením. Nehledě na to, že má člověk další rok na to, aby zapomenul co se naučil a ke státnicím se musel drtit znova.

Vypíchnul bych některé (pro mě) důležité momenty pátého semestru

  • navštívil jsem Setkání studentů s vedením fakulty a ztratil veškeré iluze
  • nejtěžší předmět semestru (IMS) jsem dal za B
  • nejlehčí předmět semestru (ITU) jsem dal za C, jinými slovy epic fail

Informační systémy jsem považoval za jeden z nejlehčích předmětů semestru, jelikož se programováním webových IS už nějakou dobu přiživuji. Možná jsem i ve skrytu duše doufal, že se dozvím něco nového, co bych v praxi i použil. V podání p. Hrušky je ale IIS s prominutím naprostá sračka! Osnova přednášek v kartě předmětu vás může nalákat, jenže velice brzy zjistíte, že asi chodíte na jiný předmět nebo co. Osnova je totiž naprosto jiná, praktické příklady jsou vypuštěné a zbývá jen nudná teorie o transakcích a OLAP kostce. Druhá věc jsou skripta, která jsou psaná hned pro tři předměty najednou. Vše se samozřejmě krásně prolíná a „nějak si tam najděte, co patří k IIS“. Skoro bych si myslel, že grant od EU nebyl autorovi dost dobrý, tak to takto odfláknul. Aby toho nebylo málo, tak jsou skripta barevnější než omalovánky a nepotkal jsem snad nikoho, kdo byl schopný se z nich učit déle než půl hodiny v kuse. Pak přicházel tik do oka a u slabších jedinců krev z nosu :-)
A vše naprosto úžasně doplňuje páně profesorův nekonečný odpor ke studentům a nechuť informace jakkoliv rozumně předat. Výstup byl jakési mumlání do mikrofonu, a jelikož používal „ruční“ mikrofon a ne připínací, neustále kolísala hlasitost když se mikrofon přibližoval a oddaloval od úst.
Sečteno podtrženo – na přednáškách by měla být pro každého připravená pistole s jedním nábojem. Na druhou stranu chválím projekty pod vedením manželů (?) Burgetových. Nakonec jsem urval C a jsem rád, že mám tento příšerný předmět z krku :-P

Mikroprocesorové a vestavěné systémy byly naopak celkem průměrný předmět. Přesto že šlo víceméně pouze o hardware, probíraly se relativně zajímavé věci kolem periferií. Cvičení obnášela několik kratičkých programů v ASM/C (najdete je i zde ve Skladišti) a přístup doktora Strnadela se mi taky velice líbil. Přiznávám, že na přednášky jsem zejména z časových důvodů moc často nechodil, ale přesto oceňuji kvalitní oporu (kterou si můžete vzít ke zkoušce ;-) ) a pěkně zpracovaný předmět.
Mé hodnocení taky dost ovlivňuje projekt – sice jsem naprosto projel refresh-war, ale paradoxně na mě zbylo nejjednodušší ze všech zadání :-D I s instalací vývojového prostředí mi naprogramování celého projektu trvalo cca 5 hodin. Oproti tomu jiní se dřeli i týden a ještě museli testovat v laboratoři a obhajovat u cvičícího :-)
Hardware obecně moc nemusím a předmět nebyl těžký, takže jsem jej moc nehrotil a u učení na zkoušku dal přednost jiným, proto pouze D.

Modelování a simulace považuji, a jistě nejsem sám, za nejtěží předmět tohoto semestru. Doktor Peringer ani Hrubý nikomu nic zadarmo nedají a každoročně tento předmět množství studentů opakuje. Přestože se mi půlsemka povedla celkem pěkně, upřímně jsem se obával o zápočet, protože jsem nevěřil, že náš projekt projde přísnou kritkou cvičícího. Teď můžu říct, že dost dělá i pověst a ve skutečnosti to tak hrozné není. Náš projekt nefungoval dokonale (vizualizace; simulace probíhala správně), ale jelikož jsme správně vybrali co budeme modelovat, co očekáváme za výstupy a jak se z toho můžeme v praxi poučit, dostali jsme dost bodů a samozřejmě i zápočet. Tady asi nastává, byť pro mě trochu nepochopitelně, hlavní zádrhel IMS projektů – neschopnost správně zvolit, co vlastně modeluju. V našem případě šlo o simulaci obvodů složených z logických hradel. Ta mají v reálu nenulová zpoždění, což může zejména u složitých sítí způsobovat nestabilní a neočekávané stavy. Když si to takhle řeknete, je to vlastně celkem easy. Našli by se ale i tací, kteří by modelovali výstupní napětí, vnitřní impedance a kdoví co ještě.
Samotná zkouška pak taky nepřekvapila ničím šíleným. V tomto je doktor Peringer férový, a dokonce ještě vypíchnul věci, které u zkoušky určitě budou. Přesně jak říkal, šlo mu nejenom o to, umět spočítat příklad naučeným postupem, ale taky vědět, co že to vlastně počítám a proč ten výpočet funguje tak, jak funguje.
Ve výsledku pro mě tedy bylo IMS příjemné překvapení a konečně jsem si vyzkoušel „těžko na cvičišti, lehko na bojišti“ – byl jsem v takovém stresu a nejistotě, že jsem se naučil naprosto všechno a odměnou mi bylo krásné B.

Periferní zařízení, další hardwarový předmět, toho ve mně moc nezanechal. Vesměs šlo jen o popisování komunikace na různých typech sběrnic. Bohužel to byly sběrnice asi tisíc let staré a nejnovější probraná sběrnice bylo USB. Třeba o takovém HDMI, které je v současnosti dost aktuální, ani zmínka. Další příklad zkostnatělosti některých předmětů. Nemám v plánu se někdy v periferiích vrtat, a tak si nemyslím, že mi znalosti z IPZ někdy k něčemu budou (snad jen kdybych měl tu smůlu u státnic). Nadšení ovšem odpovídají i výsledky, proto pouze E.

Síťové aplikace a správa sítí je další velmi obávaný předmět v bakaláři. Podání doktora Matouška se mi velice líbilo, a přestože byla přednáška už v sedm ráno, nikdy jsem nechyběl. Nic to ale nemění na tom, že jde o fakt těžký předmět. Osobně sítě stejně jako hardware zrovna moc nemusím, ale předmět je pěkně zpracovaný a má předhledné materiály, takže to šlo. Projekt, v mém případě sledování a logování síťového provozu, byl zajímavý, a dokonce si i dovedu představit jeho použití v praxi. Celkem se mi povedl, ale zároveň jsem ztratil dost bodů v testech na cvičení. Jelikož bylo ale ze zkoušky minimum, nebylo nutné se přetrhnout. Zkouška byla pro nesíťaře jako jsem já dost hardcore, takže nešlo o pěknou známku, ale o holé přežití :-) Napsal jsem ji přesně na minimální hranici bodů, což mi ale na E stačilo.

Tvorba uživatelských rozhraní byl relativně zajímavý předmět. Spíš by ale mohl být pojatý jako nějaký seminář. Nejvíc mě nadchla přednáška vedená Víťou Beranem, kdy všechny nahnal do prvních lavic (zase tolik nás tam nebylo) a hodina se nesla formou pokecu. Skvělá demonstrace kolektivního vědění :-)
Jiné přednášky ale byly celkem nudné, takže mé dojmy jsou rozporuplné. Asi jsem od předmětu čekal něco jiného, než že se seznámím s Qt, xWidgets a jinými. Spíš mě zajímalo jak obecně navrhnout rozhraní, jaké jsou zásady pro přehlednou grafiku a podobně. Tak „umělecky“ založený kurz ale na FITu asi nenajdu, ikdyž bych jistě nebyl sám, kdo by jej ocenil.

Právní minimum – humanitní formalita, bez které nelze jít ke státnicím. Musím říct, že přestože se mi forma předmětu moc nelíbila (průlet všemi možnými odvětvími práva, ale vše pouze povrchově), ale přednes byl vynikající :-) Přesto jsem ale několikrát vynechal, zejména v období projektů.

A co dál?
Mkrněte třeba jak mi to jde s bakalářkou :-P

Rubriky: Ústavní | 3 komentáře

VBO v OpenGL 3+ a jak je použít

Na začátek bych chtěl upozornit, že nejsem expert na OpenGL. Právě naopak, jsem samouk a veškeré poznatky, které bych zde chtěl shrnout, jsem nabral při studiu a pokusech v rámci své bakalářské práce (radiozita na GPU).

Historie

Zde toho moc nepovím, protože jsem starší OpenGL (1) používal pouze velmi zlehka. Každý správný tutoriál vám ale poví, že s příchodem verze 3 se radikálně změnil přístup k vykreslování a vlastně vůbec všemu. Dříve se objekty kreslily pomocí příkazů na vykreslení primitiv, obalených v bloku (glBegin .. glEnd). Tohle už není pravda a v současnosti se používá přístup, který se lehce podobá použitím dosplay listů v dřívějších verzích.

Zakládá se na tom, že grafické karty mají stále větší paměti (omezující je šířka sběrnice počítače, a proto je přesun dat o modelech z paměti počítače do paměti karty drahá operace) a jsou plně univerzální, tedy programovatelné. Myšlenka je tedy taková, že do katry nasypeme hromadu dat a kartu poté naprogramujeme tak, aby věděla jak má data interpretovat, tedy kreslit.

Převést tuto myšlenku do praxe mi dalo při práci na BP zatím nejvíce zabrat, a jelikož článků a návodů je na internetu minimum (asi nejlepší zdroj je fórum GameDev.net), rozhodl jsem se sepsat vlastní poznatky a třeba pomoct někomu, kdo se ocitne ve stejné pozici jako nedávno já a bude hledat nějaké OpenGL čtivo.

Data

Budu předpokládat, že data máme v takové formě, která nám dovoluje získat souřadnice všech vrcholů modelů, indexy (vazby) a případně barvy či jiné vlastnosti (např. normály). Kreslení probíhá po primitivech, nejčastěji trojúhelnících (čtverce jsou aktuálně deprecated a je možné že tento trend bude pokračovat ve prospěch trojúhelníků). Kreslící části programu předáme souřadnice vrcholů (například osm vrcholů krychle * 3 hodnoty) a tzv. indexy, které určují propojení mezi vrcholy.

Pro jednoduchý trojúhelník by indexy byly 0, 1, 2. Pokud bychom chtěli kreslit čtverec (třeba stěnu krychle), rozsekneme jej úhlopříčkou na dva trojúhelníky a ty vykreslíme. Za předpokladu, že jsou vrcholy čtverce definované po řadě a ne na přeskáčku, mohly by indexy vypadat například takto: 0, 1, 2, 0, 2, 3. Kreslící funkce potom ví, že bude kreslit trojúhelníky, a bude brát vždy tři hodnoty a z nich složí jeden trojúhleník. Pokud bychom přepnuli na kreslení úseček, stejná data by vyprodukovala tři úsečky (0, 1; 2, 0 a 2, 3). Nad tímto chováním se chvíli zamyslete a ujistěte se, že jej chápete, bude to potřeba.

VBO – Vertex Buffer Object

Začneme tím, že si data připravíme. Jak jsem již říkal, data nejsou nijak strukturovaná a v tomto kroku si je můžeme představit jako obrovské pole nějakých hodnot. Tomuto poli se říká VBO a jde o jakýsi kontejner na data, která se později nahrají do paměti grafické karty. Opravdu nic víc neumí, jen schraňuje data.

Řekněme, že chcete vykreslit model definovaný vrcholy, kde vrchol (vertex) má tři souřadnice datového typu float. Navíc byste rádi, aby byl objekt barevný. Pro jednoduchost nebudeme uvažovat textury, ale pouze barvu pro každý vrchol (mezi vrcholy se barva interpoluje). Pro každý vrchol tedy budeme potřebovat 6 float hodnot. Když bude mít model 100 vrcholů, bude mít naše VBO velikost 600 prvků. Zajímavé je, že data do něj budeme skládat lineárně, nejdříve souřadnice a poté barvy. Na každém (i*6)-ém indexu tedy bude první hodnota souřadnice následovaná dalšími dvěma a pak třemi floaty pro barvu. Doufám že je to pochopitelné, protože schopnost dopočítat se k  pozicím dat bude později důležité.

Náš buffer bychom mohli vytvořit takto

unsigned int buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, pocetHodnot * sizeof(float), ukazatelNaData, GL_STATIC_DRAW);

Nejdříve vytvoříme proměnnou, která bude uchovávat id bufferu – pomocí ní budeme později vybírat, který buffer chceme použít. Jestli je lepší použít jeden VBO se všemi daty anebo použít VBO na vrcholy, další na data a podobně, to zatím netuším a zřejmě záleží na preferencích programátora. Funkční jsou oba přístupy. Buffer s indexy ale musí být vždy samostatný, jelikož je jiného typu, a všechna data v něm jsou vždy interpretovaná jako indexy.
Dále buffer vybereme jako aktivní (bind), tedy následující operace s bufferem budou prováděny nad právě aktivním bufferem. Třetím příkazem do bufferu nasypeme data; jde o obdobu příkazu memcpy.

Důležité je také zvolit správný typ bufferu. Těch je několik a můžete se o nich dočíst v dokumentaci. Zjednodušeně by se dalo říct, že GL_ARRAY_BUFFER slouží k obecnému použití, zatímco GL_ELEMENT_ARRAY_BUFFER je speciální buffer k uložení indexů.

Kouzelný indexový buffer

Ke kreslení je sice ještě daleko. Chtěl bych ale zmínit důležitou věc, a to vazbu mezi indexy a ostatními daty. Přestože se následující může zdát zřejmé, trvalo mi nějakou dobu než jsem si tuto funkčnost uvědomil.

Mějme buffer s indexy pro čtverec (složený ze dvou trojúhelníků): 0, 1, 2, 0, 2, 3. A dále buffer se souřadnicemi vrcholů. Zároveň předpokládejme, že jsme kreslící funkci nějak dali vědět, že kreslí trojúhelníky a že každé tři hodnoty v bufferu souřadnic odpovídají jednomu vrcholu.

První věc co mě při pohledu na příklad někde na internetu napadla, bylo že v souřadnicovém bufferu musím mít velikostIndexBufferu * 3 hodnot souřadnic. To je ale špatný přístup! Zrádné je, že produkuje celkem uvěřitelné výsledky a ne vždy se může chyba projevit.
Správný postup je mít v souřadnicovém bufferu pouze čtyři * 3 hodnoty souřadnic. Oproti ostatním bufferům totiž indexový buffer funguje tak, že hodnoty indexů jsou odkazy do ostatních bufferů.

Kreslící funkce tedy bere indexy z bufferu a pomocí nich sesbírá data z ostatních (běžných) bufferů a ta potom použije k vykreslení. Jestliže tedy přijde například index 2, podívá se funkce do bufferu souřadnic na pozici 2 * 3, kde načte tři po sobě jdoucí hodnoty. (Stále předpokládáme, že funkce ví že kreslí trojúhelníky a že každý vrchol má tři souřadnice.)

Opět je dobré se nad tímto trochu zamyslet a přebrat si to. Důležité je to zejména ve chvíli, kdy připravujete data pro poslání do grafické karty. Musíte totiž udržovat správné vazby mezi indexy a daty v ostatních bufferech.

Prokládání dat

Na závěr bych ještě rád zmínil prokládání dat, tedy možnost uložení více vlastností v jednom VBO. Už jsem říkal, že není nutné mít pro každou vlastnost jeden buffer a lze data uložit třeba jen do jediného (+1 speciální buffer pro indexy). V takovém případě používá OpenGL „adresování“ pomocí počtu hodnot a offsetu. Zatím jsem stále mluvil o tom, že kreslící funkci dáme „nějak“ vědět, jak má neorganizované pole dat interpretovat. Detaily teď nebudu rozvádět, o tom bych se rád zmínil později, v chystaném článku o VAO, atributech shaderů a dalších věcech.

Při definování kde v bufferu je která vlastnost se používá offsetu a počtu hodnot. Najdete je například jako parametry funkce glVertexAttribPointer. Mějme opět VBO, kde je pro každý index z indexového bufferu uložená barva vrcholu (3 hodnoty), jeho souřadnice (3 hodnoty) a třeba ještě pozice textury (2 hodnoty).

Data tedy budou vypadat takto (první indexy jsou vždy vrcholy):
barva[0][0], barva[0][1], barva[0][2], pozice[0][0], pozice[0][1], pozice[0][2], textura[0][0], textura[0][1], barva[1][0], barva[1][1], barva[1][2], pozice[1][0],…

Barvu potom definujeme jako 3 po sobě jdoucí hodnoty, kde offset (stride, mezera) mezi dvěma barvami je 5 hodnot : 3 hodnoty souřadnice + 2 hodnoty textury. (Pozor, offset je v bajtech, proto nezapomeňte násobit sizeof(float) ). A ještě doplníme, že první hodnota má offset (v rámci VBO) 0, tedy začíná hned z kraje.

Podobně například texturu nadefinujeme jako 2 hodnoty, stride bude 6 : 3 hodnoty souřadnice + 3 hodnoty barv, a offset v rámci VBO bude 6, protože z kraje bufferu předchází textuře šest hodnot. Opět zřejmě použijete ukazatelovou aritmetiku, proto nezapomeňte násobit velikostí použitého datového typu.

Rubriky: Užitečné | 1 komentář

Čistá instalace Windows 7 Home Premium OA Lenovo

První věc, co jsem s novým Lenovo notebookem udělal, byla čistá instalace Windows 7. Byl jsem ale trochu nejistý, protože štítek na spodní straně říkal, že edice je Windows 7 Home Premium OA Lenovo a k notebooku samozřejmě nebyly žádné systémové disky. (Nemůžu si pomoct, ale mám z toho vždycky takový divný pocit, když nemám v ruce poctivé DVD se systémem.) Systém byl sice předaktivovaný, ale taky plný bloatware.

Celý příspěvek

Rubriky: Jen tak | 9 komentáře

Lenovo Y560 s přepínatelnou grafikou

Od včerejšího dne jsem se stal šťastným majitelem notebooku Lenovo. Značku jsem znal již dlouho jako výrobce kvalitních, ale na pohled skutečně ošklivých strojů. Naštěstí ale Lenovo pochopilo, že vychytávky řady ThinkPad průměrný uživatel nedocení a strohost designu ho naopak odradí. Proto přichází řada IdeaPad, z níž mě osobně nejvíc zaujaly modely G a Y.

Celý příspěvek

Rubriky: Jen tak | 11 komentáře

CST: C Stats – statistiky zdrojových kódů

Tento zajímavý skriptík v Pythonu jsem napsal jako projekt do předmětu IPP a myslím, že si zaslouží samostatné zveřejnění. Jde o počítání statistik použitých výrazů, klíčových slov a komentářů ve zdrojových kódech v jazyce C.

Celý příspěvek

Rubriky: Jen tak | Napsat komentář