Programozás

Programozással kapcsolatos ötletek, megoldások

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

PHP grafika - R.E. PHP Graph v1.0

Törpi a sztár

Ez a program egy PHP grafikus osztálykönyvtár próbálna lenni. És úgy néz ki, hogy eddig sikerült is neki. némely részei 2 éve porosodnak a gépemen, és most gondoltam úgy, hogy eljött az ideje ezen változtatni.
Letöltés: R.E. PHP Graph v1.0
Dokumentáció letöltése
Dokumentáció online megtekintése
Példa képek


Tudnivalók:
A dokumentációban nagyjából minden le van írva. De azért nagy vonalakban miről is van szó. A Graph.class.php-t kell beilleszteni a programba elsőként. Majd létre kell hozni egy grafika objektumot, amire rá lehet pakolni egyéb objektumokat:

  1. <?php
  2. require_once 'rephpgraph/Graph.class.php';
  3. $graph = new Graph(150,150);
  4. $graph->type = 'png';
  5. $graph->transparent = true;
  6. ?>

A szélességet és a magasságot kell csak megadni. Valamint megadható a kép típusa, és hogy legyen-e áttetsző a háttérszín. Ha szükség van objektumokra, akkor azt importálni kell a Graph osztály statikus importObject() metódusával. Ha paraméter nélkül hívjuk, akkor minden objektumot importál (Azaz osztályt). Ha stringet kap, akkor az osztály nevét kéri csak. Ha tömböt kap, akkor a tömbben kapja az osztályok neveit.
Az importIterator() ugyanezen elven működik. Csak iterátorokat importál.

Ezek után létre lehet hozni egy tetszőleges objektumot. És a $graph objektum add metódusával hozzá adható a képhez.

  1. <?php
  2. require_once 'rephpgraph/Graph.class.php';
  3. $graph = new Graph(150,150);
  4. $graph->type = 'png';
  5. $graph->transparent = true;
  6.  
  7. $ora = new AnalogClock(74,mktime(7,10,30));
  8. $ora->x = $graph->width-$ora->width/2;  //óra középpontjának koordinátái a képen
  9. $ora->y = $graph->height-$ora->height/2;
  10. $ora->background = $ora->createColor(0,0,130);
  11. $ora->transparent = true;
  12.  
  13. $graph->add($ora); //óra felvétele  aképre
  14.  
  15. $graph->flush(); //kép megjelenítése
  16.  
  17. ?>

A $graph objektum flush() metódusa küldi ki a képet a kimenetre. De lehetőség van lementeni is a képet a

  1. <?php
  2. $graph->save('fajlneve.png');
  3. ?>

metódushívással, vagy akár letöltésre kiküldeni a böngészőnek:

  1. <?php
  2. $graph->saveClient('fajlneve.png');
  3. ?>

Ennek kimenete:

Analóg óra
Természetesen az óra nem csak statikus időt tartalmazhat, hanem mindig az aktuális időt is.
Terveim közt szerepel még több objektum megírása, de egyelőre sok más elfoglaltság mellett halasztom a dolgot.

Megosztás/Mentés

PHP tortadiagram kezelő v1.1

Tortadiagram

Ez a php program Különböző adatok egymáshoz viszonyított arányát ábrázolja tortadiagramon.
Használatához mysql adatbázisra van szükség. Az adatbázis kapcsolódáshoz szükséges adatokat a config.php-ben lehet beállítani. Az 1.0 verzióhoz képest nem változott semmi, csak hibajavítások történtek. 4 éve még nem figyeltem az apróságokra annyira. Illetve beépítettem egy kijelentkezést is.
Letöltés: Tortadiagram kezelő v1.1


Telepítése
Ha a config.php-t beállítottad, másold fel a fájlokat a szerverre, és nyisd meg az index.php-t. Ekkor a telepítés megtörténik, és az sql.sql fájlt törli a program.
Ha az adatok helyesek a config.php-ben, de mégsem sikerül a telepítés, lehet, hogy már létezik a diagram tábla az adatbázisban. Ekkor ezt törölni kell és újra próbálkozni.

Adminisztráció
Mindent az admin.php oldalon tudsz beállítani. Nyisd meg ezt a szerveren böngészőből, és kezdd el felvenni az adatokat. Beállíthatod milyen színnel jelenjen meg a diagramon bármelyik adat. Törölhetsz és módosíthatsz. Jelszó szükséges. Alapértelmezetten: "password". De ezt is beállíthatod a config.php-ben.

Használata
Ahol a diagramot a mellette található színmagyarázatokkal megjelenítenéd, használd a következő php kódot:

  1. <?php include('tortadiagram/inc.php'); ?>

Ahol feltételeztem, hogy diagram fájljait a tortadiagram mappában lehet megtalálni.
Ha csak a tortadiagramra van szükség, akkor a következő html kód használható:
<img src="tortadiagram/diagram.php" alt="diagram" />

Képernyőképek

Megosztás/Mentés