Feladjam? Ne adjam fel?

Ez a kérdés az élet minden területén felmerülhet az emberben. Most mégis inkább a kis önjelölt programozókhoz szólnék. Számtalanszor találkoztam már olyan emberekkel, akik programozni próbáltak, de nem igazán bíztak magukban, vagy annyi kudarc érte őket, hogy úgy érezték ezek után már biztos, hogy nekik nem való a programozás. Fel kéne adni? Ez a legnagyobb hülyeség, amire gondolhatsz! Először is fel kell tenned magadnak a címben szereplő helyett a következő kérdést:

Akarom csinálni?
Érdekel, és nem csak azért csinálom, mert ez menő?

Ezek nem nehéz kérdések. Ennyi az egész. Két egyszerű kérdésre egy egyszerű válasz. Igen vagy Nem. Kit érdekel, ha nem megy elsőre, másodszorra, sokadszorra, ha szinte szórakoztat, amit csinálsz? Persze nem olyan szórakoztató a sikertelenségek sorozata. De elárulok egy titkot. Ezt hívják tanulásnak.

Megosztás/Mentés

Meghívós loginrendszer - R.E. Login v2.0

R.E. Login v2.0

Az R.E. Login újabb verziója, vadi új objektum orientált motorral. Megőrizve az elődje funkcióit, de némileg kibővítve azt, és lehetőséget biztosítva további fejlesztések egyszerűbb elvégzésére. Ebből kifolyólag valószínű lesz is folytatás. Addig is köszöntsük szeretettel új barátunkat, az R.E. Login v2.0 -át.
R.E. Login v2.0.3 letöltése
Kövesd a projektet és keresd a legfrissebb verziókat a:
https://sourceforge.net/projects/relogin/ oldalon.


Figyelem: Ez a rendszer már elavult. Hibákat tartalmazhat és az új PHP verziókkal nem teljesen kompatibilis. Az init.php-be beillesztve az alább írt sorok egyikét a hibaüzenetek eltüntethetők, de a login használata csak saját felelősségre javasolt.

error_reporting(E_ALL | E_STRICT); // E_STRICT hibaüzenetek elrejtése
vagy
error_reporting(0); //minden hibaüzenet elrejtése

Kapcsolódó oldalak

Szerkesztve: 2010.04.04. 23:02
A loginban sikerült felfedezni pár hibát. Ezek javítva lettek. A hibák a következők voltak:

  • Profil módosítás fájl kimaradt a beállításokból, így csak changeprofile.php néven működött
  • Ugyanezen okból adminnak más profiljában is a saját profiljára mutató link volt.
  • Apró elírás a telepítőben. STMP volt SMTP helyett az egyik megjegyzésben
  • A telepítő nem ellenőrizte, hogy az SMTP host és port meg van-e adva. Sem az e-mail címeket.

Továbbá egy kiegészítés:

  • Most már opcionális az SMTP használat is. ha netán valakinek nem lenne semmilyen SMTP szerver használatára lehetősége, akkor SMTP nélkül küldi a leveleket.

Más nem változott. Ha bárki hibát észlel, kérem szóljon.
Köszönet tbence-nek az észrevételeiért és hibajelentésért.

A Login funkciói nagy vonalakban:

  • Regisztráció ( Opcionális meghívó mód, regisztráció blokkolása )
  • Beléptetés
  • Meghívó küldés
  • Privát üzenet küldés ( Kimenő, bejövő postafiók, Hír küldés )
  • Felhasználói profil
  • Gravatar és MKAvatar használat
  • Admin felület ( Tulajdonos és Admin rangot megkülönböztetve )
  • Bővíthető ranglista
  • Felhasználó lista
  • Online lista
  • Felhasználó keresése usernév szerint
  • Elfelejtett jelszó funkció

Megosztás/Mentés

Perzisztens PHP objektumok - R.E. DBObjects v2.1

Ez az osztálykönyvtár perzisztens megvalósítását teszi lehetővé PHP osztályoknak. Ezen kívül tartalmazza az R.E. Pagination néhány funkcióját, hogy a perzisztens objektumokat tartalmazó listát is lehessen inicializálni oldalanként.

R.E. DBObjects letöltése
Dokumentáció letöltése
Dokumentáció megtekintése

Előnyei

  • Frissítésnél és törlésnél nincs szükség sql kódok írására.

  • Az egyes adatbázis mezők objektum tulajdonságként kezelhetők. Így akár osztályon belül módosítható is az elérésük __get __set metódusokkal.

  • Egyedi metódusok definiálhatók a jellemzők kezelésére.

  • A kódolás egyszerűbb, gyorsabb, átláthatóbb.

Hátrányai

  • Összetett kulcsokat még nem tud kezelni.

  • Minden táblának tartalmaznia kell auto_increment elsődleges kulcsot.

  • A frissítés, törlés, lekérdezés valamivel lassabb lehet. Ez nyilvánvalóan adódik az előnyök megvalósításának idejéből.

  • Még nem képes több adatbázis kapcsolat egyidejű kezelésére

Példa a használatára:

<?php
//Ennek az osztálynak includeolása szükséges egyedül.
require_once 'REDBObjects/REDBObjects.class.php';
//Az összes mysql modult betölti a könyvtárból.
REDBObjects::uses('mysql');

mysql_connect('localhost', 'root', 'password');
mysql_select_db('teszt');

$list = new IsMySQLListClass(array(
        'teszt'=>array('*')
));
$list->tableName_signal = 'T_'; //Ez az alapértelmezett is
$list->table_field_sep = '__'; //Az alapértelmezett az egy darab _ jel
//sql kód FROM utáni részét kell megadni limit nélkül.
//Plusz hogy hány rekordot kérdezzen le egy oldalra
$list->page("teszt where field like 'A%'", 10);
foreach ($list as $key => $object)
{
        print $object->T_teszt__id.', '.$object->field.'<br />'.PHP_EOL;
        if ($object->id == 2)
        {
                //Frissíti a field tulajdonság értékét.
                $object->field = 'P';
                $object->update();
        }
}
?>

Megosztás/Mentés

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:

select * from tablaneve limit 40, 10;
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:

select SQL_CALC_FOUND_ROWS * from tablaneve limit 40, 10;
select found_rows();

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:

select * from tablaneve limit 40, 10;
select found_rows()-40;

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

select * from teszt limit 40, 10;
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