Programozás

Programozással kapcsolatos ötletek, megoldások

PHP ellenőrzőkód - R.E. Captcha v1.0

Captcha kép 1

Captcha kép 2

Újabb taggal bővült az "R.E. termékcsalád", (R.E. mint RimElek) mert hogy már szinte védjegyem. Ezúttal egy Captcha PHP osztály személyében. Itt bal oldalt található is két példa kép. Mint látható, az egyiken egy matematikai műveletet kell elvégezni, a másikon pedig csak felismerni a véletlenszerűen megjelenített karaktersorozatot. Mindkét esetben megzavarva a képet a szintén véletlenszerűen generálható vonalakkal.


R.E. Captcha v1.0 letöltése
R.E. Captcha v1.0.1 letöltése
Dokumentáció letöltése
Dokumentáció online megtekintése

A fent említett két mód között már mondanom sem kell, hogy hogyan vált a program. Természetesen véletlenszerűen. Persze nem csak fix betűtípussal használható. Tetszés szerint megadható bármilyen ttf betűtípus fájl. Állítható a betűméret, a kép méret és a kép típusa is. ( jpg, png, gif ) Ezen kívül a háttérszín is, bár leginkább világos háttérszín mellett mutat jól tapasztalataim szerint. Még érdekesség, hogy mivel gyakran fordultak hozzám oylan kérdéssel, hogy egy PHP-val generált képet hogyan lehet megjeleníteni egy html fájlban, így két megjelenítési lehetőséget is beépítettem.

Megosztás/Mentés

LL(1) grammatika - Szó felismerés Macro Assemblerben

LL1 grammatika

Ez a program egy egyelőre fix szabálykészlet alapján egy LL(1) grammatika elemzést végez. Egy bekért inputot próbál megfeleltetni a szabályoknak. Majd kiírja, hogy sikerült-e vagy sem. Közben az elemző vermének tartalmát is lépésenként megjeleníti, valamint az épp beolvasott karaktert, hogy követni lehessen a folyamatot.

A program egy egyetemi előadáshoz készült. Az előadáshoz, és a program elkészítéséhez szükséges információkat Dévai Gergely ( ELTE-IK ) prezentációjából szereztem.



Az előző néhány assembly programhoz hasonlóan, ezt is masm 6.11 fejlesztőkörnyezettel fordítottam. Lényeges információ a sikeres fordítás szempontjából :) Megint csak nem kommentelném a forráskódot hosszan, hiszen a kódban levő kommentek is elég részletesek. Ha valaki véletlenül hibát vélne felfedezni a programban, kérem szóljon, hogy abból is tanuljak. Az alábbi program ugyanis nálam több gépen is működött teszteléskor, ám mikor egyetemen az előadáson be szerettem volna mutatni, azon a gépen már nem futott le, amelyiken ki kellett volna vetítenem. Ma (2010.04.10.) rájöttem, hogy kihagytam a dsinit eljárás végén a ret kulcsszót. Valószínű ezért nem működött a program megfelelően.

A prezentációk és a program letölthető a következő linken is:
Letöltés


Megosztás/Mentés

Kurzor pozicionálás és string kiírás Microsoft macro Assemblerben

writeto_string logo

A már pascalból jól ismert gotoxy és writeto eljárásokat tartalmazza a program. Egy stringet lehet kiírni vele a DOS képernyőn bárhova pozicionálva. A program masm 6.11 -el lett fordítva, és notepad++ -ban szerkesztve. Valószínű nem ez lesz az utolsó assembly program, amit közzé teszek. De egyelőre meg kell elégednetek ennyivel :)


Megosztás/Mentés

Karakterek bekérése, kiírása és törlése Microsoft Macro Assemblerben

instrdel logo

Hogy legyen valami új is, íme egy Microsoft Macro Assemblerben írt programocska. Bekér egy karakterláncot, majd azt utána kiírja a következő sorban. Ezt megtoldva azzal a funkcióval, hogy backspace hatására törlődik az előzőleg bekért karakter. Ez természetesnek tűnhet, de ez sem történik meg magától. Le kell programozni.



A programot masm 6.11 -el fordítottam. Ez egyben kódszerkesztő is, de mivel nem színezi a forrást, azt notepad++ -ban írtam.

De nem húzom az időt. Mutatom a forráskódot.

Megosztás/Mentés

PHP lapozó - R.E. Pagination v1.0

Ahogy ígértem, én is elkészítettem saját lapozó osztálykönyvtáramat.

Legyen szó MySQL adatbázisról, xml-ről vagy egyszerű szövegfájlról, amiben az egyes "mezőket"
valamilyen karaktersor választja el egymástól, ez az osztálykönyvtár meg fog birkózni vele.
Rengeteg opcióval konfigurálható. Megadható, hogy egy oldalon hány elemet jelenítsen meg.
Megadható, hogy hogy nézzen ki egy oldalra mutató link a linklistában, illetve az, hogy
maga a link lista hány oldal linkjét tartalmazza egyszerre. Ezen kívül az előző, következő
legelső és legutolsó oldalra mutató linkek szövege, valamint a $_GET változóban az index neve,
ami az oldalszámot fogja jelenteni a lapozóban.

Új lapozókat is lehet írni hozzá. Az AREPagination és AREPItems absztrakt osztályokat örökítve.
De minden új osztályt az install.php -ben is hozzá kell adni az osztálykönyvtárhoz, hogy
az REPClasses osztály import() metódusával anélkül lehessen importálni az osztályokat, hogy tudnánk
annak pontos útvonalát a projectben. A REPClasses osztály installedClasses() metódusa pedig
visszaadja az összes telepített osztály nevét. Ha netán nem tudnánk, milyen osztályokból lehet gazdálkodni.
(Bár ez a fájlrendszeren is kideríthető)

REPagination letöltése
Dokumentáció letöltése
Dokumentáció online megtekintése

Megosztás/Mentés

Számláló 16F877-es mikrovezérlőre 7 szegmenses LED kijelzővel

A programot PIC Simulator IDE nevű programmal írtam és teszteltem. Ez az első önálló PIC programom. 0-tól 9-ig elszámol, majd újrakezdi. Valójában az indirekt címzés gyakorlására írtam a programot. Amihez a szükséges információkat a Tudomány és Technika weboldaláról szereztem.



Lássuk a forráskódot a megjegyzésekkel:

Megosztás/Mentés

MySQL count() függvény használata limit záradékkal

Bele is vágnék. Ki gondolta volna, hogy egyszer meg akarom számolni majd hány sort kérdeztem le adatbázisból, amikor használtam a limit záradékot, és én magam mondtam meg, hogy maximum hány sor lehet. Most mégis eljött ez a nap. Nézzük a következő lekérdezést:

select count(*) from tablaneve limit 40, 10

Logikusnak tűnne, hogy amennyiben van legalább 50 rekordom a tablaneve táblában, akkor visszaadja a 10-et a count(*) hatására, és ha nincs, akkor pedig annyit, amennyit le tudott kérdezni. De ez nincs így. Nem fog visszaadni egyetlen sort sem. Még csak nullát sem ad eredményül.

Mit lehet tehát tenni?

Létezik mysql-ben a found_rows() nevű furcsa függvény, amit meghívva megkapjuk az előző lekérdezésre illeszkedő sorok száma + a limitben megadott offset értéket. Tehát:

  1. select * from tablaneve limit 40, 10;
  2. select found_rows();

Megkapjuk, hogy 50, amennyiben volt legalább 50 sor. Ha csak 45 sor van az adatbázisban, akkor 45-öt eredményez. Az SQL_CALC_FOUND_ROWS opciót használva az első lekérdezésben azt lehet megmondani a mysql-nek, hogy az utána futtatandó found_rows() függvény hagyja figyelmen kívül a limit-et, és az összes sor számát adja vissza. Tehát:

Kimenete lehet akár 300 is, ha a tablaneve táblában 300 rekord van.
Ezek ismeretében tehát a sorok számát meghatározhatjuk, ha az SQL_CALC_FOUND_ROWS használata nélkül lekérdezzük a rekordokat, majd a found_rows() visszatérési értékéből kivonjuk az offset értéket:

  1. select * from tablaneve limit 40, 10;

Persze így lehet negatív szám is az eredmény. De ha ez probléma, akkor azon is segít egy if.

  1. select * from teszt limit 40, 10;
  2. select if(found_rows() < 40, 0, found_rows()-40);

A másik megoldás két egymásba ágyazott select, ahol a belső select eredménye tölti be a külső select-ben a tábla szerepét, és akkor már használható a count(*) is:

select count(*) from (select * from tablaneve limit 40, 10) as t

Aliast kötelező adni a belső select -nek.
Persze ha nem SQL-ben lett volna szükség erre a számolásra, akkor például PHP-ből meghívtam volna a lekérdezésre a mysql_num_rows() függvényt, és kész vagyok. De a leírtak arra adnak megoldást, amikor már sql-ben szükség van az értékre.

Megosztás/Mentés

Páros sorok megfordítása fájlban bash scripttel

Minek irkálok ilyen scripteket? Ez speciel egyetemi szorgalmi feladat volt, s ha már megírtam ne vesszen el szegény.

A Script:

  1. if [ ! -f $1 ];
  2. then
  3.         echo "Első paraméter hiányzik, vagy nem létezik a fájl!"
  4.         exit 1
  5. fi
  6. if [ $# -lt 2 ];
  7. then
  8.         echo "Második paraméter hiányzik"
  9.         exit 1
  10. fi
  11.  
  12. num=`wc -l $1 | cut -d" " -f1`
  13. ret=();
  14. i=0;
  15. while  [ $num -gt 0 ];
  16. do
  17.         tmp=`tail -n ${num} $1 | head -n1`
  18.         b=$((num % 2))
  19.         if [ $b -eq 0 ];
  20.         then
  21.                 ret[$i]=`echo $tmp | rev`
  22.         else
  23.                 ret[$i]=`echo $tmp`
  24.         fi
  25.         let i++
  26.         num=$((num-1))
  27. done;
  28. num=$i
  29. while [ $i -gt 0 ];
  30. do
  31.         index=$((num-i))
  32.         if [ $index -gt 0 ];
  33.         then
  34.                 echo "${ret[$index]}" >> $2
  35.         else
  36.                 echo "${ret[$index]}" > $2
  37.         fi
  38.         let i--
  39. done;

Használata:
Mentsd el "rev.sh" néven, majd futtasd terminálban:

./rev.sh ./src.txt ./dst.txt

Ahol az src.txt a fájl, amiből olvas, és a dst.txt a fájl, amibe visszaírja az eredményt. Minden második sorát az src.txt -nek megfordítja és úgy írja be a dst.txt-be az src.txt tartalmát. A két fájl neve meg is egyezhet.

Megosztás/Mentés

Fájlok átnevezése kisbetűsre linuxon (rekurzív bash script)

Minden különleges idegen karaktert nem ismer, de a rename hívás után megadható a többi karakter mintájára új is.

  1. #!/bin/bash
  2.  
  3. if [ $# -lt 1 ];
  4. then
  5.         echo "Add meg a mappa útvonalát!";
  6.         exit 1
  7. fi
  8.  
  9.  
  10. function getftype()
  11. {
  12.         str=`ls -dl "$1"`
  13.         echo ${str:0:1}
  14. }
  15.  
  16. function tolowercase()
  17. {
  18.         cd "$1"
  19.         for i in *
  20.         do
  21.                 ftype=`getftype "$i"`
  22.                 if [ "$ftype" == "d" ];
  23.                 then
  24.                         tolowercase "`pwd`/$i"
  25.                 fi
  26.         done;
  27.         rename 'y/A-ZÁÉÍÓÖŐÚÜŰ/a-záéíóöőúüű/' *
  28.         cd ..
  29. }
  30.  
  31. cd "$1"
  32. tolowercase "`pwd`"

Használata:
Másold a fenti forráskódot egy tolcdc.sh ( to lowercase directory content ) nevű fájlba, majd futtasd terminálban a következőképpen.

./tolcdc.sh ./mappautvonala

Ahol a ./mappautvonala annak a mappának az útvonala, amiben rekurzívan szeretnéd átnevezni a a fájlokat, mappákat kisbetűsre.

Megosztás/Mentés

Javascript visszaszámláló - Napi sorsoló

Ebben a cikkben bemutatom, hogyan lehet olyan idő visszaszámláló szkriptet írni, ami minden nap egy konkrét időpontig számol vissza, de ez az időpont lehet a másnap reggeli időpont is akár. Ehhez figyelembe kell venni a szerveridőt is, másképp a kliens ( talán hibás ) órájára lenne bízva, hogy mikor van vége a visszaszámlálásnak. Persze a visszaszámlálásnak akkor van értelme, ha a végén valami történik is. Így szerveroldalon PHP-ból gondoskodni kell arról is, hogy például lefusson egy sorsoló program, ami aztán az eredményeket megjeleníti. Ezt vagy Crontab időzítővel, ha a tárhelyen rendelkezésre áll, vagy eltárolva például adatbázisban, hogy aznap lefutott-e már a sorsolás, és ha még nem, de az idő már lejárt, akkor fusson le. És írja ki az eredményt. Persze a következő sorsolásig a visszaszámlálás már elindul. Ennek megvalósítását mindenkinek magára bízom. Én csak a számlálást mutatom be.

Megosztás/Mentés