2010. dec. 10.

Közelebbi szög

Nemrégiben több alkalommal is találkoztam azzal a problémával, hogy két szög közül melyik áll közelebb egy harmadikhoz. Nyilván az, amelyiket kivonva a harmadikból és annak véve az abszolút értékét kisebb számot kapunk. Ez jó is lenne, ha a szögek nem fordulnának körbe 2π-nél.
De körbefordulnak.
Tehát például a 3°-hoz közelebb van a 355°, mint a 20°. Érthető?

Nem akartam azzal szórakozni, hogy mindegyiket adott intervallumba forgassam, meg megnézzem, hogy van-e közöttük "körbefordulási hely".

Ezután egy unalmas irodalomórán jutott eszembe az egyszerű, nagyszerű, bár inefficiens (Van ilyen szó! Már van.) megoldás: (Nyilván nem nekem először.)

double get_closer_angle(double to, double a, double b)
{
  return ((cos(a-to) > cos(b-to))?a:b);
}

Nyilván lehetne bele sokféle ellenőrzést, hogy melyik mivel egyenlő, és akkor rögtön visszatérni vele, mert két koszinusz nem megy olyan hamar, de ahova kellett, elég volt így.
C++-ban a szögfüggvények miatt radiánban dolgozik, de ez a módszer lényegén nem változtat.

2010. nov. 27.

Napi agy#@$&kapás...

Programozásverseny, multicast-el küldenek adatokat.
SMFL-t akartam a hálózathoz, mert az jó és egyszerű, de sajnos multicast-et nem tud.
Sima winsock nem jó, mert bár windowson fog futni, én linuxon fejlesztem.
Kell egy wrapper. Ezt találtam: SimpleSockets.
Tök jó, DE...

CPassiveSocket osztály BindMulticast függvénye kér két IP-címet meg egy portot.
A két cím const uint8*. Hát mi jut eszébe az embernek(?!), ha IPv4 cím és bájt tömb?
Ez:

uint8 ip[4] = {224,0,0,1};
(Feltételezve C++0x-ben lévő extended initilizer lists megértődését...)

De pedig nem, mert Host.h-ban van egy ilyen:

typedef unsigned char uint8;

És mit ért meg a BindMulticast függvény?
Ezt:

(const uint8*)"224.0.0.1"

Hát majdnem csúnyákat ordítozva vertem a fejem a falba...
Akkor legalább const char[]-t kérne, hogy tudjam, hogy szöveg...
Áárgh...

2010. nov. 2.

Apró snippet télire

Még a tavalyi fűtésszezonban készült, de most lett rá megint szükség.
További leírás nem szükséges. Ez egy ilyen poszt.

#!/bin/bash
while (true)

do
   notify-send "Nézd a tüzet!";
   sleep 600;
done;


Különben komolyan használom.

2010. nov. 1.

YouTube RickRoll

Tudtam én eddig is, hogy a Google-nál rengeteg elvetemült ember(?) dolgozik, de ez most megint jó volt:

Bekapcsolva a HTML5 Beta-t, azokon a videókon, amik tényleg Flash nélkül játszódnak le, jobb gombbal kattintásra előjön egy helyi menü. Mi van benne? Ez:


Az alsó csak visszavisz oda, ahol ki/bekapcsolni lehet a HTML5-ös lejátszót.
De a fölső? Nem működik ám, dehogyis. Ide mutat... Ezek betegek.

2010. szept. 19.

Pathfinder

Már régen írtam ezt a kis programot, de akkor is nagyon büszke voltam rá.
A* algoritmussal egész gyorsan megadja egy szövegfájllal megadott labirintusban az S-betűtől az E betűig vezető utat. Tudom, vannak gyorsabb módszerek, de ez mindig tökéletes megoldást ad, már ha van egyáltalán valamilyen. A szövegfájlnak "téglalap alakúnak" kell lennie, tehát minden sorának azonos hosszúságúnak. (Másmilyennel nem teszteltem, nem is emlékszek már rá, hogy írtam-e bele valamit, hogy mit csináljon a "nem jó" fájlokkal, de most nem nézem meg. Legyen téglalap és jó lesz.) Ahol szóköz, vagy . vagy _ van, azt bejárható területnek veszi, ahol #, +, -, /, \, |, x, X, *, azt falnak. Kötelezően megadandó egy S és E betű, mint Start és End. Ez nem case-sensitive. A kimeneti fájlba a ^, v, > és < karakterekkel rajzolja be az utat. (Hát nem édes? :DxD)

Most került elő egy facebook-post révén, és sikeresen hozzátettem még egy képből ASCII és fordítva alakító progit.
Azok nem olyan szépek, de hamar készültek, rövidek, ideális körülmények között működnek. Csak hardcode-oltak a fájlnevek, de az mindegy, ha már úgyis nektek kell lefordítanotok.

Tudomásom szerint szabványos C++, binárist nem adok, aki le tudja fordítani, annak nem is kell, aki nem tudja, az ne is akarjon binárist. Lehet a forrásban gyönyörködni.
Csak a két segédprogramnak van függősége, az SFML, mert könnyű vele képeket kezelni. A főprogramnak nincs.

Pathfinder: http://pastebin.com/3M3TCGs8
png_to_text: http://pastebin.com/X8PDxSUd
text_to_png: http://pastebin.com/9QFKYYKK

2010. szept. 5.

Többplatformos fejlesztőkörnyezet

Amint ígértem, problémamegoldás.

A lényeg: tudni kell a kódot szerkeszteni, lefordítani és a programot futtatni 2 platformon, ráadásul winen penrájvról, telepítési jogok nélkül.

CodeBlocks Windowsra:
Egész jó cross-platform IDE, sok fordítót tud alkalmazni.
Lehet belőle beépített MinGW-set szedni, ami viszont egyrészt régi, másrészt valamilyen TDM kiadás, ami nem kompatibilis az előre fordított SFML libekkel.
(Az meg nekem kell, mert jó.)
Más gond szerintem nincs vele, tehát használható, ha valakinek nem kell előre fordított library, vagy fordít belőle sajátot. Akinek kell SFML, de nem fordít sajátot, annak letöltendő az épp pár napja kiadott installer mingw 4.5-höz, ami jó SFML-hez.

Ezt feltelepítve és az eredménnyel a CodeBlocks MinGW könyvtárát felülírva meg is van a frissített, "sima kiadású" fordító az IDE-be.

Megkérdezi, hogy MSYS-t telepítsen-e. Ez remek megoldás lenne, mert így nem is annyira kell a CodeBlocks, hanem egyszerű, jól megszokott Linux shellt kapunk win alatt - ott magától értetődő a make használata -, de az fstab fájlt igazítani kell a pendrive aktuális betűjeléhez, (csak a mingw könyvtárát kell becsatolni, de relatív útvonalat nem lehet megadni) és ha jól tudom, plusz egy dll függőséget is ad, ezért nekem marad a C::B. Hogy azt a dll-t lehet-e helyettesíteni statikus linkeléssel, nem próbáltam.További hátrány, hogy bár Notepad++ remekül alkalmazható lenne kódolásra, nem találtam módot egygombos fordításra/futtatásra, illetve azt is igazítani kellett volna a betűjelhez.

Továbbá beállítandó a CodeBlocks-ban a fordító binárisainak lelőhelye, az executables résznél a make-t meg ki kell javítani a mingw32- kezdetűre. Más betűjelre hurcolva itt nyomkodni kell majd az Autodetect-et. (hát... ez MSYS-nél is gond volt... viszont itt csak egy gombnyomás!)
Saját Makfile használatára - mert az nekünk jó - van egy külön opció a projekt beállításaiban, és a bizonyos körülmények között futtatandó parancsok/targetek (pl. egy fájl fordítása, teljes pucolás, stb.). Ezek testre/ízlésre/Makefile-ra szabandók.

A Makefile-ban így lehetséges a platform megállapítása:
ifeq($(shell uname -s), Linux)
#ami linuxon kell
else
#ami windowson kell
endif

Amint lefordítjuk az első programot, átdobjuk haver gépére, látjuk, hogy dll kell neki. Ennek kiküszböléséhez a -static-libgcc opciót adjuk át a fordítónak (Makefile-ban), a MinGW/lib/gcc/4.5.0/libstdc++.dll.a, MinGW/lib/gcc/4.5.0/libstdc++.dll.a-gdb.py, MinGW/lib/gcc/4.5.0/debug/libstdc++.dll.a fájlokat pedig nevezzük át, hogy ne találja meg, így kénytelen lesz statikusan linkelni. (azt hiszem az MSYS még ezen kívüli dll Linuxon meg úgyse nagyon szokás statikusan linkelni a dolgokat.

Már csak azért, mert szeretem az egy exe-s projekteket.
Azt mondják, "Amit megtanulsz, azt nem vehetik el tőled.".
Szerintem "Amit statikusan linkelsz, az nem fog hiányozni az exe mellől.".
Akinek ez nem fontos, másolgassa csak az exe mellé a dll-eket, amikért sír.

Linux:
Mivel jelen esetben nem kell hurcolni pendrájvon, a lehetőségek végtelenek. Nem mintha egyébként nem lennének azok, de így meg annál is inkább.
Amit én használok, az gedit, három "külső eszközzel", amik sorban az all, run és clean targetekkel futtatják make-t az aktív dokumentum könyvtárában egy billentyűleütésre. Szintaxis-kiemelést is tud, ennél több nem is kell.

2010. szept. 4.

Az első poszt

Már régen terveztem, hogy indítok egy blogot.
Ez olyanféle technikai blog lesz, ha valami nagyon nagy (vagy épp rém egyszerű) problémát sikerül megoldani több órányi guglizással és próbálgatással, a megoldást ide leírom, hogy más megtalálja.

Bár nem hiszem, hogy magyarul sokan megértenék, de legalább aki ezt olvassa, az jobban értékeli, mint az, aki nem olvasna ilyent. Értitek?

Ha meg elfelejtek posztot írni, törlöm a blogot, de azért legyen, ha kell.

Továbbá itt fogom verni a mellemet az ötletes, vicces, idióta, vagy akármilyen rendhagyó programkód-részlettel, feltételezve, hogy megértitek, akár értékelitek.
Csak mert arckönyvön a legtöbben egyikre sem alkalmasak. Ami nem baj, sőt!

Meg ha lesz más akkor más is lesz.

Igen, tegeződök.