A következő címkéjű bejegyzések mutatása: programozás. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: programozás. Összes bejegyzés megjelenítése

Texture splatting 2020. április 21., kedd - 0:51


A Wikipédia is ír róla egy cikket, képtalálatok közt is sok jó ötletet látni a kifejezésre keresve.

Példa:


Ebbe a problémába én legelőször a Three.js-sel futottam. Más környezetekben már eleve kész megoldás van rá, lásd Unity3D-nél. Rajzolhatsz paint-szerűen 3d-ben, és azonnal tökéletes az egész.

Régen az első ötletem a Metin2 miatt az volt, hogy biztos az egész pálya textúrázása Photoshop-szerűen meg van rajzolva már előre, majd ezt feldarabolták (ez az egész művelet akár automatizált is lehet, a lényeg azon van, hogy előre elkészítve történik a dolog) kis részekre, akárcsak magát a pályát, és egyszerűen betölti a megadott chunk textúráját a megadott területre.

Ez tuti működő, és nagyon CPU-kímélő, cserébe rohadtul helyigényes, de memóriaigényes is. A metinből ki is nézném, de igencsak ott sem ez van a háttérben.

A fenti kép példán jól látszik a lényeg. Adott N textúra, amiket L hosszúságú átmenettel akarunk ellátni egymás felé, bármelyikből bármelyikbe.

A Three.js megoldása shaderes alapú, amit egy tanárEmbör valósított meg példa módon, és tett is közzé, amit köszön neki minden élő, mert remek alap.

Én magam is kísérleteztem vele, az ő megoldásával két nagy gond van (nem is a megoldásával, hisz  csak példaképp hozta létre, nyilván olyan céllal, hogy aki többet akar, az tovább is fejlesztheti).
  1. csak előre meghatározott hosszúságban tud átmenet keletkezni a megoldásával 2 textúra közt
  2. csak egymás után következő textúrák tudnak átmenetelni a másikká.
    • A-ból lehet B, B-ből C, C-ből D, viszont A-ból D nem, stb.
Az meg már csak mellékes, hogy ő magassághoz kötötte a dolgot. Adott Y magasságot elérve van egyik-másik textúra.

De ez a módszere alapja shaderrel.
Lényegében:

A domborzatra, vagy síkra (mindegy) minden textúra ki van rajzolva egyszerre. Ugyanakkor a shader ad egy virtuális magasságot a textúráknak, amik le tudnak menni 0-ra vagy alá is (ekkor meg sem jelennek, hanem egy default fekete kirajzolási szín veszi át a helyüket, amit a textúrák egyébként ki tudnak takarni). És tulajdonképp a trükk annyi, hogy bizonyos magasságtól indulva hullámszerűen az egyik textúra elkezd kiemelkedni 1 irányába, míg az épp látszódó elsüllyed 0 felé, és idővel helyetcserélnek, így képezve adott pontokon az átmenetet. És ugyanez megy végbe más-más Y magasságoknál a textúrákon.

És hogy lehetne ezt javítani?

Mármint olyan értelemben, hogy bármelyik textúra bármelyikbe át tudjon menni, és akár változtatható hosszúságú átmenettel is?

A netes leírások alapján sokan színhez kötik a textúrát egy térképen, mint fenti képen látható. Így alapvetően 3 vagy 4 szín jelöl 3/4 textúrát, és ezek egymásba kábé bármilyen átmenettel át tudnak menni. A hiba ezzel kettő: a textúrák mennyisége, és hogy egy majdnem real méretarányú textúrára valósítják meg. És pont a spórolás a lényege a dolognak. Szóval faja, hogy egy ekkora képen több tíz pixel átmenetével szép átmenetet képeznek a textúrák közt is, de egy játékbéli térképen majd 4-5 pixel is soknak fog hatni, több métert fed át a játékon belül (már amennyiben a Metinhez hasonlóan kb 300-500 pixeles térképek vannak, amik több száz métert fednek le a játékon belül).

Megoldás röviden: az RGB minden betűje. Tulajdonképp ugyanezt megcsinálva, de mondjuk jól kihasználva a színeket egy PNG képpel már 256 textúrát tárolhatunk akár (trükközéssel még többet is). Hogyan? (És itt jön a lényeg, ami előtt rizsázok mióta.) Mondjuk a red sáv jelöli a kép pixelében az original textúrát (hogy miből induljon az átmenet), a zöld szín a "melyikké" textúra indexét, és a kék szín utolsó helyen pedig az átmenet állapotát százalékban. Ennyi. Már csak meg kéne valósítani, hogy a shaderes megoldással ez király legyen, és ez némi gondolkodást igényel majd, meg számítást.
Magát a kis térképet, amin ez a miből, mibe és hány% típusúan, a pixelben lévő színek összetételét meg vizualizálhatjuk is egyből 3d-ben, akár egy Unity-szerű painttal (ilyet is akarok), és végül a memóriában tárolt bittérkép alapján menthet egy PNG képet a megtervezett térképről, így már szinte tényleg semmi munka nem lesz vele, és teljesen Unity hatást kapunk készítés közben és használati performancia közben is.

Idővel majd megvalósítom, már egyszer elkezdtem, félig kész is volt, de félbehagytam, és törölték a tárhelyem is, talán viszont volt mentés /de akkor is 0-ról csinálom újra, tökmindegy/.

Ezt a bejegyzést majd folytatom, ha lesz kedvem a leírtakat is megvalósítani.

OSM && Dévaványa 2020. január 2., csütörtök - 10:52


Úgy adódott, hogy már régi tervem, hogy random helyeket átültessek 3D-be, egy játékba, és most részben nekifogtam.

Mert amúgy tökre szeretnék egy GTA-t csinálni, ráadásul valós helyszínen játszódót. Legalábbis annyira, hogy az utak megegyezzenek a valóssal, és a főbb pontokon keresztülnézve egy arrafelé jártas ember, pl. aki az adott hely környékén lakik, az igenis tudja, hogy ha előre menne egy utcányit, akkor mit találna ott, és merre mehetne tovább, a játékon belül is, mint a valós helyen.

Az első ilyen célpont életemben Dévaványa volt, mert hát kicsi hely, és a lakhelyem volt 20 évig.

A nagy terveim félbeszakadtak, mikor Miskolcra felköltöztem, akkor inkább Miskolcot akartam már célnak kitűzni, és állandóan egész BP lebegett a szemem előtt, de az halál nagy feladat volna, bármilyen sok segítséggel is.

Szóval összességében egy játékmotort mégis Dévaványára érdemes építeni, esetleg egyszer, ha végtelen időm lesz, akkor nagyobb városokba is bele lehetne fogni.

Szóval itt újévi, hajnali merengésből nekifutva, sok random téma köszöntött bátyámmal. Volt régen egy GTA Vice City szervere, azon és a fennmaradt videóin röhögtünk, majd elkezdtem keresgélni.

Valamiért python 3D játékmotort, de nem találtam olyat, ami szimpi, csak a PyOgre-t, mert az Ogre-t régről ismerem a Game Maker-es portja miatt. Aztán dobtam az ötletet, végül az lett, hogy hát lehetne Unity3D. Mármint ha egy random, nem-találom-fel-újra-a-kereket típusú Vice City klón játékot akarok csinálni, miben fognék hozzá. A unity jó. Bénáztam vele kicsit, majd miután kész volt a TPS kameranézet, és irányítás: térkép kellene.

Netes leírásokból kiindulva a GTA VC térképét lehet exportálni modellként, csak haláli sok munka. Nekem erre nincs időm, és energiám. Annyiba kerülne, hogy nem éri meg.

És akkor jött: hát .. akkor újra Dévaványa? És nekifogtam.

Felcsaptam az OSM oldalát, és exportáltam Dévaványa területét valami XML formátumban.
Megnéztem az adatokat, és bedobtam a MySQL adatbázisomba egy egyszerű szerkezetet nekik, alakítgattam az adatokat látva. Majd közben írtam egy béna, de gyors és működő PHP parsert az XML-hez, ami a számomra lényeges node-okat beküldi a DB-be. Ez elég pöpecül sikerült is, néhányezer adat volt mindössze. Én csak a pontokat importáltam, meg a "way-eket", amik nem csak pontokat összekötő vonalak, hanem akár area-k is lehetnek (elvileg);


Erre közben összedobtam egy HTML5 megjelenítőt is, ami nagyjából jól működik, most elég királyul vonalakkal összeköt minden pontot a megfelelővel. Zsírul néz ki.


Ha minden egybetartozó vonalat random színezünk, akkor meg szépen elszeparálódnak a dolgok..


 No mindegy. Ez csak ilyen érdekesség. Az OSM király! Ezekből a vektoros adatokból, szemben azzal, ha pl. Google térkép screenshotból generálnám, elég pontos 3D-s utakat tudok majd generálni modell formátumba; vagy ha azt épp nem, de a pálya minimális helyre tömörítve el fog férni, az utak adatait tárolva, amit így már bármilyen nekem tetsző módon kezelhetek, és realtime generálhatom a pályát az elmentett koordináták alapján. Majd egyszer.

Excel Wolf3D 2020. január 1., szerda - 6:04


Valójában Google Sheet, a halál se használ Excelt ma már, nyilván.

Volt egy prog.hu-s cikk, amiben valaki csinált egy full 3d-s raycast cuccost, ami király.
Nem mostani a cikk, már jópár napos, de én most vettem észre, keresgélve. Aztán ez tényleg tök sok kedvet adott, hogy hát egy nagyon easy raytrace cuccot nem is lenne bonyolult még az én tudásommal sem összerakni egy ilyen táblázatkezelőben, hiszen csak pár vonal, koordináta, meg szögfüggvény kell hozzá.

Először csak hülyeségből kialakítottam neki egy felületet, de az ilyen dolgok mindig úgy berántanak, hogy nem tudom abbahagyni, míg valami látványos nem sikerül belőle a lehetőségekhez mérten.




Kellett hozzá végül valami szkript is, netes segítséggel meg is írtam. Mert akartam irányító nyilakat, de sajnos csak szkripttel oldható meg normálisan. Az is elég gáz, mert így folyton egy külső fájlt hívogat driveon keresztül, és gyáá.. Mi ez már.. Mindegy, a cél szentesíti az eszközt.

Szóval most egész tűrhetően kész is lett, egy kis videót is csináltam róla, egyszer majd talán folytatom, vagy befejezem, és publikálom is..



"a kaja Shazam-ja" 2019. január 8., kedd - 3:36


Elkezdtem nézni a Szilícium-völgy sorozatot, mert király.

A 4. évad 4. részében Jìan-Yáng és Erlich új baromsághoz fog. Az sikerül belőle, hogy készül egy demó-alkalmazás, ami telefonos; lefotózhatsz vele egy hotdogot, és kiírja, hogy Az hotdog. Jön a csavar: ha pedig mást fotózol le, akkor azt írja ki, hogy Nem hotdog. :D

Zseniális. Most lelőttem egy elég jó poént, bocsánat, de erre épül a bejegyzés, szóval muszáj volt.

Elgondolkodtam, hogy milyen menő lenne írni saját AI-t, ami felismer dolgokat.. Felismer dolgokat.. "Hmm, Bezzeg a Google-be ha feltöltök egy képet, rávágja, hogy mit is töltöttem fel.."

És tényleg!

Szóval, ha valami XHR kéréssel, vagy PHP-s cURL-lal meg tudnám hívni ezt a bizonyos keresést, és a forráskódból egy jól irányzott regex-szel kicsórnám azt a picike "Legjobb tipp erre a képre: " utáni szövegecskét, majd kiírnám a képernyőre, akkor kész is vagyok.

Ennyi? Basszus, ez túl egyszerűen tűnik, megoldásra, viszont nagyon hatásos lenne; sok nem-programozó túlértékelné, hiszen a többségnek eszébe sem jutna, hogy a Google képkeresés ugyanezt csinálja; // sokan arról sem tudnak, hogy lehet képet keresni a guglin...

Ja, mondani könnyű. Megvalósítani is az volt, fél óra maximum. Hogy működjön Chrome böngészőben, egy extension-nel, ami minden cross-origin kérést, és egyebet engedélyez.

Teszthez elég volt, mert működik minden.. De élesben hogy oldom meg?

Mindent kipróbáltam, illetve közben elég sok ember leírását olvastam a CORS-ról, a CORB-ról. Régebben csak a SOP volt a gond, de ez annak része, vagy válfaja.
Megpróbáltam .htaccess-ben mindent allow-olni, megpróbáltam PHP-s cURL hívással lekérni az adatokat, mert sajnos az AJAX meghalt CORS hibával mindig. Ha pedig a sokak által ajánlott dataType: jsonp; (vagy simán json) formátummal próbálkoztam, akkor meg inkább CORB hibát kaptam.
Egy a lényeg, ez nem sikerül. Pont ezen bukott el minden.

Míg nem találtam meg valaki hozzászólását, ami mindent megoldott..
https://cors.io/
És ez épp az, aminek hangzik. Ha akár csak üresen, egy ? után egy URL-t adsz meg a címnek, akkor ez az oldal megcsinálja a requestet, és a resultot kiírja. Amivel már tudok mit kezdeni.

Tehát: nem tudom, hogy a Google be fog-e rágni a használati módért, és bot-ellenőrzést csinál-e (aztán pedig ezt elbukva megáll a működő "appom"), vagy hogy a cors.io meddig bírja, stb..

De amíg ez az előbbi kettő probléma nem következik be, addig jó vagyok. ^^

Íme az eredmény, képfeltöltéssel (max 1.5 MB, JPG/JPEG/PNG):

http://users.atw.hu/kaszapatrik/gis/


// Megjegyzés: nekem mobilos Chrome-on örökké várakozik, bár a képet feltölti. :(

EDIT (2019. 01. 11.):

Eljött, amitől féltem. Mégis elkapta a "gyanús forgalom" miatt a Google Captcha-ja.. :/ Ennyit erről. Pedig épp most jutott eszembe felnőtt tartalom szűrőt faragni az ötletből, majd Githubra, mint első projekt, feltölteni...


SOP és AJAX 2018. november 27., kedd - 10:02


Sokat SOPtam már a Same-origin policy miatt.

Röviden ez egy olyan biztonsági eljárás a böngészőkben, alapértelmezetten, logikus módon bekapcsolva, hogy ha valami komolyabb dolog történik egy másik host közbenjárásával, akkor azt megtiltja a böngésző - így elkerülve azt, hogy pl. egy weblapon lévő képet átemeljünk a canvasunkra, mert hátha az nem is kép, hanem vírus. Vagy mai esetemben, hogy jquery ajax-szal POST kérést küldjek egy PHP-nak, ami másik webcímen van.

Ugyanis olyan helyzet adódott, hogy kéne egy rendszert írnom, ami automatizálja (egy kattintásra rövidít) egy megszokott adatmentési folyamatot, amiben szerepel két kép elmentése, egy email elmentése, és pár fájl/mappa létrehozása/átnevezése. Ehhez egy weblap adatbázisára van szükség, és sajnos nem igazán tudtam hozzáférni. Szóval a terv az volt, hogy egy kattintásra megnyílik az adatbázis adott sorának típusával GET-ben egy oldal, ami feldolgozza az összes adatot a sorból, és megfelelő formátumban. És a célom az volt, hogy ezeket az adatokat, többek közt a két kép URL-jét is GET formába szerializálva a linkbe építem, ami egy localhostos oldalra irányít át. Majd a localhoston lévő kis PHP progi a többit elintézi, hisz az már a saját gépen tud mappákat nyitogatni, létrehozni, átnevezni fájlokat, meg a képeket letölteni, pl. cURL hívással.

Persze a cURL-lal is szívtam, mire sikerült megkerülnöm az SSL-t..

$ch = curl_init('https://weboldal.hu/image.jpg'); $fp = fopen('localhostom/letoltottkep.jpg', 'wb'); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp);
De ugye a GET hátránya, hogy nem nagyon lehet végtelen hosszúságú stringet továbbítani, ezért POST-tal kellett volna megoldani, viszont nem voltam biztos benne, hogy lehetséges, hogy egy random URL-ről JS-ből küldve POST kérés lefusson pl. a localhoston. Jól működött a dolog, a teszt alatt kiderült, hogy megfelelő engedélyekkel még fordítva is megy. Localhost POST AJAX megkapta az eredményt a webre feltöltött PHP-tól. Csak a headerrel keleltt kicsit bénázni. Örülök. :D

header("Access-Control-Allow-Origin: *"); header('Access-Control-Allow-Credentials: false'); header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); header('Content-Type: text/html; charset=utf-8');
Gondoltam leírom, hátha más is szenved, vagy csak nem volt ilyesmiben biztos /mint én is/, de érdekelné.

Hacker módszerek 2018. július 23., hétfő - 22:30


Milyen... csalogató bejegyzéscím ez. A script kiddiek kedvenc elfoglaltsága, hogy ilyesmi kulcsszavakra keresve egyszerű megoldást találjanak midenféle hackerkedéssel kapcsolatos anyaghoz, hogy aztán letöltve 1-2 programot 2 kattintással feltörjék a NASA-t. Vagy hát a céljuk ilyesmi, de ez persze nem így megy. Kis koromban engem is érdekelt az ilyesmi, ezért én is egy rakat infót keresgéltem.

Valójában a hacker (aki én nem vagyok, félreértés ne essék) - bár ma már egy szétromantizált fogalom, de a valódi jelentése - egy olyan embert jelent, akinek az informatikai, azon belül sok témakörre kiterjedő szaktudása (részben security, részben op.rendszerek, programnyelvek, mindenféle ismeret) lévén ismernie kell (és ismeri is) a lehető legtöbb hibalehetőséget, minden helyzetben. Weblapoknál, programoknál, hálózatoknál, alkalmazásoknál. Ahol csak kell.

No, ezért nem vagyok, leszek én hacker. Ehhez tényleg nagy "kockafejnek" kell lenni. Szuper-szakbarbárnak. Én meg lusta dög vagyok, hogy akár csak gondoljak is ilyesmire.

Az én elenyésző tudásom, ami van, leginkább weblapos dolgokban merül ki, csak a hackerkedés felszínét súrolja. Ez is amiatt, hogy a legfőbb, legtipikusabb biztonsági réseket ismernem kell, hogy az általam megírt weblapok már védve legyenek ilyesmikkel szemben.

Tulajdonképp ma már csak azért érdekel, és azért tanulok mindenféle módszerről, amivel tönkre lehet tenni egy weboldalt, vagy elhelyezni rajta fájlokat, szöveget, kódot, vírust, hogy ne történhessen meg az én kreálmányaimnál. Maradjunk a weblapoknál..

A legtipikusabb esetek egy weblapon minden esetben a backenden történnek, azaz az én esetemben PHP-n. Mik az ilyen esetek (összefoglalóan: exploitok)?
  • XSS - amikor van egy űrlap, kitöltheti a felhasználó, az bekerül az adatbázisba, és a beírt adat megjelenik egy másik lapján az oldalnak. Pl. a profilodon beírhatsz egy mottót, amit mások láthatnak. És ez az egész folyamat, amit írtam, nincs levizsgálva, semmilyen módon védve. Ebből mi következik? Konkrétan bármilyen kóddal bővítheti a weblapot, és az le fog futni a profilt megnyitó személynél. Ezzel adatokat is lehet lopni, és más dolgokat is lehet művelni.
  • SQL injection - az előző esethez hasonló a dolog. Hozzáteszem, itt még van esély arra is, hogy a HTML részek szűrve vannak, pl. egy elég gyenge strip_tags PHP parancs által. Ez a módszer még az adatbázisba bekerülés előtt/közben csap le. Úgy, hogy a mottó mezőbe nem a mottónkat írjuk be, hanem aposztrófokat, amivel lezárjuk az adatbázis művelet parancsát, és utána kiegészíthetjük egyéb PHP kódokkal, amit a szerver lefuttat; simán úgy veszi, mintha az általunk beírt kód eredetileg is a fájl része lett volna. Ez veszélyes. Így lehet 2 perc alatt tönkretenni egy oldalt, elmenteni az adatbázisát, szóval adatokat lopni, stb. Ez persze könnyen kivédhető, ha minden esetben a legrosszabbra számítunk. Az összes mezőt ártalmatlanítani kell, ahol user képes adatot felvinni az oldalra. Ha számról beszélünk, legalább egy implicit típuskonverziót, szóval $szam = (int) $_POST['szam'], ha szöveg, akkor pedig legalább egy htmlspecialcharst írjunk a post adat köré, legalább egy ENT_QUOTES második paraméterrel!
  • multibyte character exploit - vagy valami hasonló. Erről, illetve ilyesmiről egyszer olvastam valamerre. A lényeg az, hogy a weben sok helyen kell megadni a karakterkódolást. Ettől függ, hogy van-e pl. Ő és Ű betű az oldalon, vagy csak ilyen háztető formájú izé van az O és U felett. Azok nem igazi ŐŰ betűk. Ezt most nem magyarázom feleslegesen. Viszont olvastam ilyet régebben, hogy bár szűrve voltak az aposztrófok az adatbázisba érkezve, DE bizonyos karakterkódolású aposztrófokat nem escapeelt a védelem szerveroldalon. Escapeel = ártalmatlanít, mondjuk így röviden. Ami nem lett volna baj, de mivel más karakterkódolású volt a kliensoldal, meg a PHP, meg még az adatbázis is, így a beírás megtörtént (valahogy így volt), de bekerülni már a rendes aposztróf került be. Kiolvasásnál meg szintén az került ki. És amikor ez az adatbázis adat ki lett írva egy oldalon, és megnyitotta az oldalt egy ember, akkor viszont lefutott a kód, kitörve a PHP-s kiírásból. Ezért sem szabad tökölni hatvan féle kódolással, mindenhol UTF-8.
  • MIME type exploit - sok oldalon lehet feltölteni képet, vagy esetleg fájlokat/mást, de a leggyakoribb a kép. Na most, tisztázzunk valamit. Ha készíteni kell egy (fájl, vagy) képfeltöltő cuccot, PHP-ban, minimum korlátozzuk elfogadólistásra a feltölthető dolgokat. Ugyanis, ha valaki fogja magát, feltölt egy PHP fájlt, akkor felkerült a szerverre egy PHP fájl. Ez tudjuk mit jelent. Bővítette a weblapot, és bármit csinálhat a fájlból; törölheti az egész weblapot, letöltheti az adatbázist, stb. Elég megnyitnia a feltöltött fájlját. Ilyet nem játszunk. Ha már képet várunk feltöltési elemnek, azt nem árt több módon is megvizsgálni, hogy valóban kép-e. Ne bízzunk a content type-ban ($_FILES['file']['type']). Ez manipulálható, elég egy régi/egyedi böngésző. És máris annyi az ellenőrzésnek, hisz ez is kliensoldalról küldött információ. A fájlnév vizsgálat sem árt. De vigyázni kell. Lehet csinálni olyat, hogy a feltöltött fáljnál az utolsó pont utáni részt megnézzük, akkor viszont legyünk alaposak. Ne pontos egyezést nézzünk, hanem egy globális cserével szedjük ki a php végződést, és hasonló dolgokat a kiterjesztésből. Ugyanis pontos egyezésnél ha csak a PHP-t vizsgáljuk, akkor simán feltölthet egy megszivtad.php3 fájlt. Ami ugyanúgy lefut, ha megnyitja. És nem ez az egyetlen lehetőség. Legtutibb, ha írsz egy jó regexet, ami mindent töröl ettől a ponttól, ami p-től kezdődik, van benne h, és még a végén is van legalább egy p betű.
És ez a pár eset csak olyan, amikkel én összefutottam, vagy amiket megtanultam figyelni. Mert ha ezekre figyel az ember, akkor a weblapjának nem lesz baja, hacsak nem kezdi érdekelni egy igazán komoly hacker(csapatot) valami okból kifolyólag. Attól ritkán kell félnünk, azt hiszem.

Ennek a posztnak egyébként, így belegondolva semmi értelme. Talán annyi, hogy ezeket leírva egy nálam kezdőbb tanulhat valami minimálisat, vagy kap ötletet, hogy mire keressen rá. Az mégiscsak több, mint a semmi.

Megjegyzés: ha valamilyen számítást kliensoldalon elvégeztél, JS-sel, akkor mielőtt kiírod adatbázisba, ugyanazon lépésekkel számoltasd át a PHP-val is, és ha egyeznek, akkor (is a) PHP általi értéket írd a DB-be. Biztos ami biztos. Főleg, ha webshopot kezdesz fejleszteni valakinek. Elég gáz, ha egy input mező átírásával féláron, vagy tizedáron lehet rendelni egy árucikket.
Megjegyzés2: ha rejtvényt csinálsz, vagy kuponos rendszert, vagy bármilyen ellenőrizendő adatbevitelt: ajax-szal csináld, ellenőrzésekkel és megszakításokkal. Ne a kliensoldalba rakd a "megoldást", vagy a kinyerhető adatokat. Még titkosítva se. Ha te vissza tudod fejteni (pl. a kuponkódot, annak adatait), akkor más is. Főleg, ha kliensoldali a visszafejtő funkció..

Filmajánló /sorozat/: Mr. Robot, A célszemély, Snowden

Eloszlás (distribution) #matek 2018. július 14., szombat - 1:31


Elkezdtem csinálni egy "fél órás" projektet. Egy Cleverbothoz hasonló csetbotot. Alapesetben ezt közel sem fél óra lenne megcsinálni, főleg, ha csicsázzuk a dolgot mindenféle extra dologgal, elágazásokkal, vizsgálatokkal, fene tudja. Alapvetően az egyszerűsége annyiban van egy YAML struktúrát használó bothoz képest (vagy valami ilyen, már nem emlékszek, bátyám foglalkozott ezzel többet), hogy nem kell előre megírni ötmillió beszélgetést, hogy értelmesnek látszódjon, hanem magától tanul.

Ezt majd részletezem másik bejegyzésben, viszont szükségem volt egy normál eloszláshoz hasonló véletlenszerű generálásra. A chatbothoz. De nem találtam, vagy nem értelmeset, vagy magas gépigényűt, stb. Miért?

Mármint, minek ez nekem, meg mi ez? Egyszerű. Igazából egy súlyozott véletlenszerűen választó szkript kellett nekem. Példa: a "hogy vagy?" kérdésre tegyük fel, hogy 100-ból 70 ember azt írja, hogy "jól.", 20 azt, hogy "megvagyok.", és 10 azt, hogy "rosszul". Ez százalékban is pont így jön ki.

Az én tanuló chatbotom az ugyanolyan kérdésre ugyanolyan adott válaszokat nem jegyzi fel magának többször, helyette egy számlálót növel mindössze. Ez a számláló mutatja, hogy mire mennyiszer mondták azt, hogy ... blablabla. Pl. az előző példa - hogy a chatbottal való beszélgetés közben hányszor mondták a "hogy vagy?" kérdésre, hogy "jól.".

Ez a chatbot visszafelé is így működik. Tehát ha Te írod neki, hogy "hogy vagy?", erre ő válaszol az ezutáni emberi válaszok közül valamelyikkel, véletlenszerűen. De minél többen mondtak egy adott választ, annál valószínűbb, hogy ő is azt fogja rá mondani. Na, erre kellett nekem ez a normál eloszlás. Ha valamit 500-an mondtak, és valamit csak 1x, akkor szinte soha ne azt a "csak egyszer" választ adja, hanem azt, amit 500 ember.

De erre épkézláb megoldást nem találtam (emberi nyelven / JÓ programozói megoldással; nem matematikusi megfogalmazást), csak 2-3 feltett, de nagyjából megválaszolatlan Stack Overflow kérdést. De az egyik béna tömbös megválaszolása után eszembe jutott egy viszontlag memória- és CPU kímélő megoldás a problémára. Most teszteltem is, jónak tűnik.

Előbb leírom a konkrét PHP kódot (phptester.net-en nyomtam le, de bárhogy lehet tesztelgetni):

$results = array('Jól', 'Megvagyok', 'Rosszul'); $odds = array(70, 20, 10); $max = 0; for($i = 0; $i < count($results); $i++) $max += $odds[$i]; $rand = mt_rand(0, $max); $choosenIndex = 0; /* echo "Esély: $rand<br />"; */ for($i = 0; $i < count($results); $i++) { $rand = max(0, $rand - $odds[$i]); if($rand == 0) break; else $choosenIndex++; } echo ' - Hogy vagy? <br /> - ' . $results[$choosenIndex];

Van egy tömbnyi választandó elemem, meg egy tömbnyi ugyanolyan sorrendbe feltöltött esélyem. Persze, megoldható kétdimenziós tömbbel is, vagy ilyesmi, de én most az egyszerűség kedvéért így csináltam.

Nem is bonyolult így nézve, ugye? Az esélyek bármennyik lehetnek. Végül van egy maximum számom, a randomizálás tetőpontja. Ez az összes elem esélye összeadva. 70+20+10 (lehetne 5000+20+10 is, működik úgy is, ofc).

Majd egy változót tényleg randomizálunk 0 és max közt. Kell még egy index változó, ami a számok alapján kiválasztottnak ítélt tömbindexet mutatja majd.

Innentől logikus. Csinálunk egy akkora for ciklust, mint a tömb elemeinek száma. A randomunkból minden "körben" kivonjuk az épp ciklusváltozó szerinti sorrendben következő esélyek tömb számát. Nem muszáj 0-ra redukálni, de úgy szebb. Ezután ellenőrizzük, hogy a randomunk kevesebbegyenlő-e, mint 0. Ha igen, akkor elértünk oda, hogy a jelenlegi index esik abba a szakaszba, amivel párosul a választott tömbelem a másik tömbben. Ha nem, akkor túlléptünk egy elemnek a lehetőségén. Ennyi.

Ezt nem is igazán tudom elmagyarázni, ezért lerajzolom, így befejezésképp:


"Joke" vírus 2018. június 14., csütörtök - 8:26


A sulis évek alatt mindenféle nyomorult VBScript készült a kezeim alatt. Bár mivel nem igazán vagyok BASIC párti, ezért leginkább 2 soros kódokból másoltam össze, script-kiddie módra..

A vizsgáink miatt az én kedvelt sulis szervergépemben lévő 500 gigás vinyó is fel lett használva a Win2016 szerver telepítéshez, így előre tudtam: törlésre van ítélve minden a gépen. Szóval még időben az összes szutykomat fogtam, becsomagolva feltöltöttem emlékbe Google Drive-ra.

Hát, vége a vizsgának, a terem vissza lett pakolva. Itt ülök a gépnél, és üres. Új Win7-et kapott. Gondoltam lehúzom rá emlékbe, a következő generációnak az eddigi vackaimat, erre a Chrome szerint vírusos. Biztos-ami-biztos alapon feldobtam a Virustotal-ra. Szomorúan tapasztaltam, hogy aszerint is "vírusos" - de amikor jobban megnéztem a nevüket..



Ó. Szóval már a CD nyitogatós VBScript is vírus, meg exploit. Meg a 'golyó' alkalmazásom (előugró ablak, "Golyót akarsz?" - igen/nem. Ha nemre nyomsz, nem tűnik el, igen esetén shutdown 10 mp múlva)...

Szóval megnyugodtam... "Joke".

Életem végéig fizetek 2018. június 13., szerda - 1:24


Mint minden ember. De mennyit?

Kicsit elgondolkodtam, hogy körülbelül mekkora összeg lehet az, amennyit egy ember elkölthet élete végéig. Vagy mondjuk úgy, hogy mint 20 éves fiatal, nekem most mennyi pénzt kéne kapnom ahhoz, hogyha – a kapott összegtől függetlenül – ugyanazt az életvitelt folytatnám. Biztos, hogy léteznek kivételes esetek, és sok minden közbe tud jönni, amire nem számol az ember.

Nem is egy tényként gondoltam én erre amúgy (hogy ami kijönne eredményül, annyi is lesz), hanem egy viszonylag átlagos számításként, ami azért néhány extra esetet is bevesz átlagba.

Végül egy Google táblázatba meg is csináltam a dolgot. Ez a kitöltetlen verziója, szerintem le tudjátok másolni, és kitölteni a kis keretezett mezőket. Hátha röhögtök egy jót a végeredményen..

Hangsúlyozom, nem szabad komolyan venni.

A táblázat viszonylag figyelembe veszi az életkorotokat, az életed végéig egy átlag 80 éves korig tartó időszakot jelent (a mostani korodtól fogva). 50 felett nagy baromságok jöhetnek ki, ugyanis néhány számításnál nem raktam abszolútérték függvényt, vagy legalábbis egy MAX(szám, 0) függvényt, mert lusta voltam. Valamint, ilyen eseteket is felszámol pénzként, mint naponta költött átlagos összeg (piára, cigire, hamburgerre, stb), havi átlag nagyobb hobbikra/szokásokra/betegségre költött (nagyobb) összeg, gyereknevelés 25 éves korukig (számuktól függően), napi átlag ételre költött pénz (legalább egy főtt ebéd gondolom, de akár vacsora/reggeli, bár inkább rezsi), nyaralás, háziállat, ház, autó, rezsi (100.000 Ft átlaggal számolva + személyenkénti 20.000 Ft plusz pénzzel, amibe beletartozik mindenféle, pl. telefonfeltöltés, új farmer, fenetudja), 50 év feletti átlagot véve betegségek miatti +5000 Ft / fő gyógyszerre, meg ilyesmik. Ja meg átlagot véve 3 eset / fő, amikor valamire nagyobb összeget kell kiadni (ez meg átlag 200.000 lett), pl baleset, gyorshajtás, egyéb bírság, esetleg öltöny szabatása, franc se tudja, kivel mi történhet. Meg ilyesmik.

Természetesen lusta voltam tényleg alapos lenni, ezért ha gyereknevelési adat is meg van adva, azt egyből felszámolja költségként, nem késleltetve, hogy majd X év múlvától.. De mondom, csak poén az egész, viszont érdekességnek nagyon jó!

Van használva láthatatlanított segédtáblázat, de a fő számítást tartalmazó függvény ez:

=IF(COUNTIF($C$31:$C$40; "<>") > 0; SUM($F$7:$F$16) + ($C$26 * 25 * ((365,25 * 3000) + (12 * 30000))) + IF($C$27 = "igen"; ((65 - AVERAGE($C$31:$C$40)) / IF($C$28 <> ""; $C$28; 1) * 50000 * COUNTIF($C$31:$C$40; "<>")); 0) + IF($C$42 = "nem"; ($C$43 + ((75 - AVERAGE($C$31:$C$40)) * ((12 * 100000) + (12 * COUNTIF($C$31:$C$40; "<>") * 20000)))); ((80 - AVERAGE($C$31:$C$40)) * ((12 * 100000) + (12 * COUNTIF($C$31:$C$40; "<>") * 20000)))) + IF($C$44 = "nem"; ($C$45 + IF($C$45 <> ""; (75 - AVERAGE($C$31:$C$40)) * (12 * 15000); 0)); IF($C$45 <> ""; (80 - AVERAGE($C$31:$C$40)) * (12 * 15000); 0)) + IF($C$46 = "igen"; ($C$47 * (3 * 12 * 5000)); 0) + IF(AVERAGE($C$31:$C$40) > 50; (COUNTIF($C$31:$C$40; "<>") * (80 - AVERAGE($C$31:$C$40)) * 12 * 5000); (COUNTIF($C$31:$C$40; "<>") * 30 * 12 * 5000)) + (COUNTIF($C$31:$C$40; "<>") * 3 * 200000) + ((80 - AVERAGE($C$31:$C$40) - IF($C$42 = "igen"; 0; IF(COUNTIF($C$62:$C$71; "<>") > 0; AVERAGE($C$62:$C$71); 0))) * 365,25 * IF($C$29 <> ""; $C$29; 3000)); 0)

No, és akkor leírom, hogy mi alapján, és mit számol:
(hátralevő évek / fő = 80 - életkor)
  • A számítás akkor indul csak, ha legalább egy életkor mező ki van töltve.
  • Hozzáadja a segédtáblázatot
    • napi költések összege * 365,25 (nap) * hátralevő évek / fő
    • rendszeres hobbi/egyéb összege * 12 (hónap) * hátralevő évek / fő
  • Hozzáadja: tervezett gyerekek száma * 25 (évig) * ( [365,25 (minden napra) * 3000 Ft] + [12 (minden hónapra) * 30.000 Ft] ) extra költséget
  • Ha "igen" a szoktatok nyaralni mező, akkor hozzáad (65 - átlagéletkorotok) évnyi (tehát 65 éves korotokig számol nyaralással) / éves időköz a nyaralások között (ami ha üres, akkor 1 évente) * 50.000 Ft (rászánt pénz) főnként (tervezett gyerekeket nem beleszámolva)
  • Ha nincs még ház, akkor a megadott tervezett lakás ára + 5 év kihagyást véve (majd lesz ház addigra) a hátralevő életetekig havi 100.000 Ft rezsi plusz, valamint főnként 20.000 Ft plusz
    • ha van ház, akkor nincs tervezett ház ár + nincs 5 éves kihagyás a rezsi szempontjából, tehát azonnal innentől fel lesz számolva a rezsi
  • Ha még nincs autó, akkor a tervezett autó ára (ha nincs ár beírva, nincs tervezett autó sem) + 5 év múlvától havi 15.000 Ft átlag fenntartási költség
    • ha van autó, akkor nincs tervezett autó ár + nincs 5 éves kihagyás a fenntartási költség szempontjából
  •  Háziállatok megadott száma * 3 (évig élnek pl.) * 12 (hónap) * 5000 Ft ("fenntartási" költség)
  • Ha átlagéletkorotok 50 felett van, akkor főnként (80 - átlagéletkor (életetek végéig) ) * 12 (hónap, tehát havonta) * 5000 Ft (költség gyógyszerekre)
    • ha még nincs 50 felett az átlagéletkor, akkor főnként 30 év van számolva, mint betegeskedős időszak (idősebb korban valószínűleg)
  • Különleges események bekövetkezése miatt (ami minden ember életében elkerülhetetlen pár alkalommal) főnként 3 * 200.000 Ft (baleset, házfelújítás, fenetudja)
  • Átlagos hátralevő életetek években (mínusz ha még nincs ház = még szülőknél laktok; ez esetben a megadott munkáig való hátralévő átlagidőtök évben) * 365,25 (nap, tehát minden nap) * (ha megadtatok napi ételre fordított összeget, az, különben 3000 Ft)
Ennyiből áll a számítás. Mindenféle szituáció bele van keverve, leginkább a legnagyobb dolgok, amik a legtöbb ember életében előjönnek. Hátha nem hagytam ki semmi lényegest.

Furcsaság, hogy így utólag, ha egy ember 1 évét számoljuk az én összedobott, saját kútfőből kitalált átlagértékeimmel (tehát 1 életkornak beírunk 79-et), akkor az eredmény 3.195.750 Ft lesz, ami szerint a létfenntartásra 267 ezer forint kéne egy főre havonta. Ez Magyarországra nézve nem túl reális összeg, tehát a táblázatom alapján egy közmunkás havi 5x éhen halt már...

Viszont minden adatot mellőzve, ha két ember 1 évét vesszük figyelembe, akkor alig több, mint 4.095.750 Ft jön ki; ez havi 342 ezer forint, tehát átlagban eszerint olcsóbb (már ugye feltételezve az együttélést, és a közös fizetését a dolgoknak). Míg egyedül egy főre annyi jut, amennyi a költség volt, így két ember esetén egy főre (a táblázatom alapján, ofc) 171 ezer jut. Az egyfős eset felénél több, a háromnegyedénél kevesebb. Vajon mennyire reális az arány, ha már a konkrét érték nem is?

Codeacademy 2018. május 25., péntek - 1:23


Úgy adódott, hogy le kéne valamilyen szinten mérni a képességeimet a programozás, weblapozás és hasonló tevékenységek körében. További instrukciónak kaptam, hogy a Codeacademy-n tegyem ezt meg, van rá ingyenes lehetőség.


Lassan befejezem rajta a JS témakört. Nem mondom, hogy nehéz, de azért időbe telik átrágni magam rajta. Én úgy voltam vele, hogy a HTML, a CSS és a pure JS azok a dolgok, amik már biztosan mennek, és nem sok újat tudnak kérni/mutatni. Pár aprósággal ugyan találkoztam, de tényleg nem sok újat mutatott az oldal, és nem is kért számon.

Leginkább az idegesített fel, hogy túlteljesítenék folyton. Értve ezt úgy, hogy gyorsabban szeretnék haladni, mint ahogy a feladat elvárja, emiatt pedig nem enged tovább, mert elcseszem az egész feladatkört azzal, hogy "előre dolgozok".

Emiatt nem egyszer csinálta, hogy space indentre pontosan ugyanaz volt a kódom, amit elvárt, pl. 10 sor, amiben az osztályt létrehoztam, de mivel egy console.log()-ot írtam már bele, és egy rövid változó volt kiíratva (ami a következő instrukció lett volna a sorban), már emiatt nem engedett tovább, és erre sajna a sokadik ilyen után jöttem rá. Emiatt kezdtem újra sok exercise-t.

Valamint egy idegölő dolog, amitől nem tudok szabadulni; lehet csak nálam van így (Firefox legújabb verziót használok), de a pontosvessző beírása (AltGr + M-től jobbra lévő vessző billentyű) esetén ugyanaz történik, mintha a Back gombra kattintanék.. És odavész a beírt kódom, amit még nem futtattam le.... És ez milliószor történt, ezért az összes kódolásom során Ctrl+V-t használtam pontosvessző helyett, és így a vágólapomon folyton egy pontosvessző kimásolva szerepel...

Ennyit a negatívumról. Mert mindössze ennyi van vele kapcsolatban. Nem enged sokszor előredolgozni. Ezen kívül elég tetszetős a rendszere.

Tehát konkrétan a weblap felépítése, miközben egy gyakorlatot végzünk, épp olyan, mint a CodinGame-é.Hasonlóan játékosan, többnyire érthetően vannak leírva a leckék/feladatok. Alapvetően 2, néha csak 1, egész gyakran 3 oszlopra bontva látjuk a szerkesztés közben az oldalt. Balra az instrukciók. Leírás, feladat, stb. Középen a szövegszerkesztő rész, jobbra az eredmény (konzol, terminal, létrehozott weblap, stb).

Szóval úgy vagyok vele, hogy sok idő túl lenni az alapokon, de csak egyszer kell megcsinálni. Vannak achivementek (gyűjthető jelvények, pontszám, fenetudja). Ráadásul nekem elsőre (a 200$-os tanfolyamtól eltekintve) felajánlotta, hogy próbáljam meg a ReactJS-t. Az most 57%-ra van kész, majd befejezem (az ingyenes részeket).

Mindig is érdekelt, hogy mire is jó ez a sok plusz framework, hisz' úgy voltam vele, hogy a jQuery már mindent tud, ezen felül mit tudnak még cseszni. De annyira nem érdekelt, hogy utánanézzek. Most már kicsit tisztább a kép, majd végigmegyek a tanfolyamokon, legalábbis az ingyeneseken.

C++ funkció létrehozás tömb paraméterrel 2018. március 25., vasárnap - 19:27


// Nem gondoltam volt, hogy  épp a hónap végén írkálok sok bejegyzést, mikor a hónap kétharmadában semmi nem volt..

Annyi baj van manapság... Utálom a CPP-t, a pointereket, meg azt, hogy feleslegesen van bonyolítva.
Egyik Stack Overflow keresésem kommentjei közt írta valaki, hogy:

"A C és C++ nem alkalmazás készítésére való programozói nyelvek. Rendszerprogramozói nyelvek. ... Ne gondolkodj magas (prog. nyelv) szinten. Gondolkodj alacsony szinten."

És milyen igaza van. De ettől még idegesítő, hogy egy épkézláb example-t nem talál az ember egy egyszerű dologhoz. Azaz sok példaprogramot találtam, csak épp mind máshogy írta, én meg aztán így nem voltam biztos semmiben. Végül több alapján kikísérleteztem magamnak a megfelelő megoldást, amit le is írok, hátha más ("kezdő") programozó is szenved ezzel, és esetleg megtalálja ezt a bejegyzést.. Én ezzel a kis online cuccal teszteltem, nem akartam emiatt külön projektet nyitni VC2008-ban.

A konkrét probléma tehát:
  • funkció létrehozása C++-ban
    • a funkciónak egy (fix elemszámú) tömb legyen a paramétere
    • a funkciónak egy másik (fix elemű) tömb legyen a visszatérési értéke
Mivel Quaternion-ból próbáltam (elvileg sikerült is) Mátrixot "konvertálni", ezért floatokkal dolgoztam végig, ráadásul egy 4 elemű tömb volt a bemenet, és egy 16 elemű a visszatérés.

Mindenesetre a megoldás kódja:

Metin2 + HTML5 + CPP! 2018. március 22., csütörtök - 0:55


Korábbi bejegyzésem megtalálható ide kattintva.

Előzetes, régi hírek


Amúgy annak a végeredményét nem közöltem a bejegyzésben, ami annyi volt, hogy csináltam saját animációt Blenderben, itt egy rövidke videó róla. Hozzáteszem, amiatt, illetve azután tanultam meg a Blender alapjait. Modell formátuma COLLADA, annál döntöttem végül, az volt egyedül igazán jól kezelhető és megfelelő struktúrájú, még ha tárhely szempontjából nem is a legkevesebb helyet foglaló formátum (leírónyelvszerű, szerkeszthető is akár notepaddal).

Sok ideig pihentettem a dolgot, mert nagyon sok munka a továbbiakban, valamint időm sincs sok. Rengeteg dolog lefoglal mostanában. // suli, munka, család, betegség, kampányidőszak

Ezzel a HTML5-ös Metinnel kapcsolatban sok probléma merülhet fel. Boncolgattam magamban a kérdést, mitől Metin a Metin? Mi az a fő dolog, amitől olyan különleges (nem feltétlen jó értelemben) a többi játékhoz képest?

Én arra jutottam, hogy a grafikája. Egyszerűen az a kombó, ahogy kinéz a térkép + a karakterek + a textúrák + a gui. Erre még ugye rátesz részben a zene (de az kevésbé). Szóval a látvány összhatása adja azt a Metin-érzetet.

Már itt elkezdődnek a problémák.. Ugyanis ebből a játékból a legnehezebb kiszedni a dolgokat, eskü. Nem találkoztam még durvább fájltárolási módszert használó 3D játékkal (ami persze külső fájlokból szedi a cuccokat össze). Legtöbb game contentjének kiszedéséhez max. 2 program kell, általában 1 is elég, de ehhez? Van hozzá soktíz, és azok fele sem működik, vagy már nem érhető el sehol, vagy bizonyos dolgokhoz még azok is kevesek, ami van.

Na jó, reálisan: a textúrák, a modellek exportálhatóak, bár kell hozzá 2-3 program. A térképet is volt szerencsém sikeresen exportálni egy jó kis progival (ami BlackYuko-nak köszönhető). Azzal már összedobtam egy kis kék map1 felülnézet-forgatási kombót, úgy tesztből, amit itt meg lehet tekinteni. (Egyelőre textúrának a minimap van ráhúzva, és üres az egész.) Sőt, ebből csináltam egy FPS demót is, bár nagyon tré az egész, de egy 10 perces teszt, szóval ne várj sokat.

Viszont az animáció a modellekhez NEM nagyon exportálható. Ezért is csináltam teszt erejéig saját animációt, meg béna, összedobott irányítást, itt lehet megnézni. Firefoxra terveztem, Chrome-on nem igazán szeret indulni (lusta vagyok kijavítani, mert demó vacak) - a betöltési sorrend a hiba amúgy.

Aktuális


Nem rég DeFa olyat talált, hogy mocsok egy mód meglepődtem. És nem hogy nem mai, több, mint egy éves kezdeményezés, csak valahogy most kezd beindulni...


Valami török srác, aki saját elmondása szerint PopuGames nevű csapattal/csapatként már több éve (ha jól emlékszek 2014 óta) készít mobilos játékokat, főként jó/híres PC játékok átiratát... khm.. Unity-vel.
Jó, emiatt nem nézem le, mert a Unity egy jó dolog, csak más okokból kifolyólag úgy érzem, hogy ez a srác se programozás terén nincs a toppon (matekból sem hiszem), se úgy alapvetően bármiből, ami kellhet játékfejlesztéshez. De ne legyen igazam!

Az a lényeg, régóta fejleszti, és szó mi szó, működik, amit csinál, még ha .. konkrétan semmit nem is ő csinált az egészből, azon kívül, hogy pár alap Metines elemet összeválogatott Unity-ben.
Viszont az gáz, hogy az elmúlt kb 3 hónapban elvileg sokat dolgozott a játékkal, sőt, mostanában csak azzal foglalkozik, és semmi haladás nincs. Se egy új NPC nem került be, se állatok, se semmi. Csak harcos lehetsz egyébként, blabla.

Szóval nem igazán fejlődik a dolog, mégis hatalmas Metines tömegeket ér el, amit csinál. Emiatt irigy vagyok kicsit, ugyanis nemhogy meg tudnám én is csinálni ezt - de még jobban is, minden szempontból. És én haladnék is vele.

Ebben már csak az animáció exportálás hátráltat - ugyanis az eredeti animációk elengedhetetlenek, hogy meglegyen az összkép a Metinről. Rákérdeztem tehát a török srácnál, először YT-n, aztán FB-n, végül a webold(uk)on, ahol végre kaptam is választ, majdnem egyből. A kérdésem egyébként főleg annyi volt, hogy az animációt 3DS Max-szal exportálta?


Nájsz reszponz. Szóval, le lettem pattintva.
Megértem amúgy, bár azért vicces, hogy neki 18 hónapja van a projektben. Gondoltam, már csak emiatt is jó lenne kicsit reagálni erre válaszként, hogy "nekem x nap volt mindössze". Vagy legfeljebb pár hét, no persze beleszámolva a magánéletet is, meg a napi teendőket.

Lényeg a lényeg, feltámasztja bennem a versenyszellemet a dolog. Sok a dolgom, kevés az időm, de akkor is szeretném ezt a .. lehetőséget én megszerezni. Metines körben én akarok híressé válni, "hőssé", mint aki böngészős (ergo kis változtatással mobilos) Metint készített. Egyrészt, mint magyar, a törökkel szemben (azt is nézve, hogy internesönel is a törököknél a legnagyobb divat a Metin, nemhogy Magyarországhoz viszonyítva - és így mekkora lenne "legyőzni" őket..... Még az "őket" is idézőjeles.)

Az egyetlen dolog, ami ebben meggátol, az maga a modellek animációja. Amint azt (valahogy) tudnám exportálni én is (Blenderben használható formátumba, tehát legvalószínűbb, hogy COLLADA-ként) - azonnal nekifogok, és szánok rá napi { x | x ∈ ( 2 ≤ x < 5 ) } órát, vagy formálisan ilyesmi..

De ugye /Metinhez, működő/ program nincs, ami a .GR2 fájlokból exportálná az animáció adatait, ha a fájlban nem található Mesh információ, és Skeleton információ. Metin így csinálja ugye.

Viszont van egy kizárólag a modellt exportáló progi C++-ban írva, a Mesh converter, aminek történetesen a forráskódja is letölthető.. Nem fűztem sok reményt ilyesmihez, nem akarok mindenfélét megtanulni, hogy ezt végbevigyem, mert nincs annyi időm. Még ha kedvem lenne is..

De gondoltam, egy próbát megérhetne... Viszont az én GCC-m nem tudja az MSVC kódot fordítani.. És emiatt egy kb. 6+ gigás MS Visual Studio 2018-at letölteni? Fenét.. De nem bírtam ki, egy 2008-ast letöltöttem. És sikerült a buildelés!

Ezután szép sorban átbogarásztam, hogy mi kellhet nekem C++ téren, csak pár dolog volt. Tanulgattam kicsit legalább. Valamint rájöttem, hogy marhára sok segítségem van, lévén megvan a forráskód, de még a granny2.dll használatához is van egy struktúra fa fájl!

Ekkor rájöttem, hogy tulajdonképp ebben a Converter progiban már "minden" megvan így, ami a Granny Viewerben, csak nekem GUI nélkül. Az, hogy az anim exportra nem írtak rövid szkriptet, már más kérdés.. Szóval megírom én.. Egész pontosan az adatok exportálása már működőképes, már csak a .DAE fájlokat kell tanulmányoznom, hogy milyen formában, struktúra alapján mentsem el az adatokat fájlba, hogy aztán importálhassam őket mondjuk Blenderbe, vagy legalább 3DS Max 7-be..





A forráskódbővítésem lényegi része egyébként mindössze ennyi (1-1 változtatás még volt a fájlban, de ez a lényeg):



// Ha valami sikerül, folyt. köv.

Újabb végtelen térképgenerátor 2018. január 5., péntek - 1:47


... merthogy már csináltam hasonlót..  De hatalmas a különbség a kettő között.

Igaz, a suliban kezdtem el, de nem volt rá elég az idő, hogy ott be is fejezzem, ezért gondoltam így esti levezető időtöltésként befejezem. Rémálom GUI-t tervezni, hogy mások is tudják használni a dolgokat... (Bezzeg a suliban egy funkció kivételével a scriptet átirkálva is tökéletesen működött már... :P )

A korábbi, ami itt érhető el, az egy HTML5-ös bejárt, területet megjegyző, de ettől még új területet random generáló térképhez való megoldás volt. Amiben az volt a pláne, hogy a végtelenségig bármilyen irányba bővíthető a térkép (0-s koordináta alatt is).

Ez viszont nem (csak) működésben érdekes, hanem a dizájnja is nagyon szép. Sőt, igazából ez szinte csak grafika. Ugyanis ez tetszőlegesen testre szabható procedurálisan generált "terrain" (avagy annak textúrája, de heightmapként is használható, ha úgy van rá szükség) generáló, amihez Perlin zajt használtam fel. Nem elég, hogy – bár egyszerre csak kis szeletekben, de – végtelen méretű terrain generálható vele (a Perlin-féle módszernek köszönhetően), aminél az illesztések tökéletesen passzolnak, hanem semmi erőforrást nem igényel akármelyik koordináta megtekintése.

Lényegében mondhatjuk úgy, hogy bár pszeudo random generál egy 'seed' (kezdőérték) alapján domborzatot (de akár textúrákhoz is tökéletes, majd mutatok képet lejjebb), ezért akárhol le tudja az adott teret generálni. Az más kérdés, hogy egy nagyobb rész generálása nagyobb erőforrást igényel. (256x256 pixeles tér átlag ötszázad másodperc a laptopomon /ha be van lassulva, kéttizedig felmegy/, de pl. egy 1024x1024-es textúra már 2 másodperc (ami amúgy így sem sok), míg a 2048x2048-as textúra már közel 10 mp, nagyobbat meg csak egyet próbáltam, a dupláját, ki is akadt a gépem.. De jobb vas többet bír. Vagy kisebb darabokat elmentesz, arrébbmész a koordinátarendszeren, és a végén paintban egyberakod őket.. :P )

Ja, ahogy írtam - seed alapján generál, tehát ha egy tér megtetszik, megosztható bárkivel, SŐT, konkrétan a Te beállításaiddal átküldhető, így terveztem meg.

Miközben ezt a bejegyzést írom, még nem vagyok kész, az utolsó simítás következik.
Már menüből teljesen alakítgatható az egész, mindössze a rétegződés infója nincs még figyelembe véve (ugyanis van benne magasságkoordináta, tehát a 2D megjelenítés ellenére térbeli a generált struktúra - nem csoda, az egész generáló kód alapja a ThreeJS egyik példafájljából van (ami meg 3D terrain) - én meg ugyanazt csak canvasra rajzolom ki (amit textúrának használ eredetileg a cucc), meg adok hozzá GUI-t.)

No, kész is vagyok. Viszonylag. Íme a képek:
Első próbálkozás
Az ötletadó mintájára
Textúra is generálható

Valószínűleg emiatt - ha lesz egy kis kedvem még majd holnap, meg pár percem a suliban - hozzácsapom a 3D megjelenítést is (mivel az már csak egy copy-paste), hogy az amúgy épp legenerált térképet körbe is lehessen forgatni gyönyörűen, csak úgy poénból..

Edit: (2018. jan. 05.)
Volt kedvem, hozzá is csaptam a 3D-t. Lehet az oldalon váltani köztük (a tetején). Print:

És mobilon is tökéletesen működik.

Egyébként az ötletet végső soron egy weboldal adta, mikor egy tök érdekes szakdolgozat olvasása után (informálódás, tanulás céljából) rátaláltam, és tetszett az elképzelés, meg a megvalósítás, csak én sajátot akartam, ami valamivel jobb is.

4096x4096-os térkép itt.