Recent intr-un proiect am avut nevoie de un web browser propriu. In loc sa folosesc un activeX de Internet Explo(r/d)er am ales sa imi constriuesc propria componenta din mai multe considerente: in primul rand proiectul era in Java si nu doream sa folosesc JNI (java native interface- pentru cei care nu sunt familiarizati cu termenul in doua cuvinte este vorba de o tehnologie ce va permite sa accesati cod nativ din programele de java.) si al doilea motiv era ca nu aveam nevoie de un web browser foarte complex care sa suporte ‘nspe mii de plugin-uri.
Iata un exemplu minimal :
JScrollPane scrollPane = new JScrollPane(jep);
JFrame f = new JFrame(”Simple Web Browser”);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.getContentPane().add(scrollPane);
f.setSize(512, 342);
f.show();
Desi un limbaj destul de nabagat in seama de majoritatea programatoriilor Javascript incepe sa isi arate adevarata valoare odata cu dezvoltarea aplicatiilor web. Am ramas destul de mirat intr-un mod placut de http://azarask.in/projects/algorithm-ink un site ce ofera un engine de generare a fractaliilor 2d in browser. M-am intersat mai mult si se pare ca engine-ul respectiv este open source, se poate descarca de la http://azarask.in/projects/algorithm.tar.gz .
Pentru astazi va propun un mic tutorial in care o sa va arat cum se ‘dezvaluie’ un string dintr-un input de pe orice forumlar care este mascat..ma refer la campurile acelea in care se introduce parola.
Ideia de baza este una foarte simpla tot ce trebuie sa facem este sa luam fiecare proces in parte si daca acesta contine un fomular ce are campuri mascate atunci le dezvaluim( trimitem un mesaj catre componenta pentru a reseta carcaterul de masca).Haideti sa aruncam o privire la cod, am incercat sa ma folosesc doar de WinAPI pentru a evita eventualele dependente de platforme sau mai stiu eu ce.
//functia principala
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
EnumWindows(EnumWindowsProc,0);
return 0;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
// se ‘enumereaza’ toate procesele ce contin ferstre
EnumChildWindows(hwnd,EnumWindowsProc2,lParam);
return TRUE;
}
BOOL CALLBACK EnumWindowsProc2(HWND hwnd,LPARAM)
{
//se reseteaza caracterul de masca pentru input-ul de parola
::SendMessage(hwnd,EM_SETPASSWORDCHAR,0,0);
InvalidateRect(hwnd,NULL,FALSE);
return TRUE;
}
Iata o demonstratie:
Singura remarca care s-ar putea face este ca programul nu functioneaza pentru procesele care contin formulare ierarhizate pe mai mult de 2 nivele. Acest neajuns se poate rezolva printr-o tehnica mult mai avansata ,care cere anumite cunostiinte destul de serioase despre sistemul de operare, si anume DLL injection, tehnica pe care sper sa am timp sa o abordez ceva mai pe larg in masura in care timpul mi-o permite si mai ales daca sunt cititori intersati .
Desi nu prea obijnuiesc sa ma uit la TV prea des, zilele acestea am vazut un documentar pe arte, un post TV destul de avangardist in felul sau ..dar nu despre asta este vorba. In documentar era vorba despre diverese proiecte hi-tech, printre aceste unul foarte intersant numit Blue brain.
Cica tipii astia ce se ocupa de proiectul respectiv vor sa fac un reverse-enginering pe creierul mamiferelo si sa produca un fel de simulator al neocoretexului folosind un supercomputer.Se vorbea la un moment dat despre posibilitatea de a creea un calculator care este capabil sa invete precum invata un copil sau chear se merge mai departe, teoretic s-ar putea creea un avatat al unei persoane adica proiectia constiintei sale intr-un calculator, evident problema prinicipala ar reprezenta-o interfata intre creierul uman si calculator..dar zic eu ca nu suntem pe departe …si matrix vi se parea pura fictiune .
Am gasit pe youtube un filmulet destul de intersant
Asa ca si un fel de concluzie : omul este masura tuturor lucrurilor.
Un tutorial interesant interactiv dureaza cam 15 minute merita sa incercati ..cine stie poate cineva se va apuca sa programeze masiv in el.La prima vedere limbajul este destul de dragut ..cumva orientat pe cod se vede ca a evoluat din un limbaj de scripting .
Pentru cei care nu stiu cross site scripting-ul est o vulnerabilitatea de securitate ,specifica aplicatiilor web, ce permite injectare de cod distrugator in paginile web vizualizate de catre utilizator. Ea este o vulnerabilitate client side adica nu are efect propriu-zis asupra informatie de pe server ..ati putea spune ca nu este un pericol din moment ce este client side dar sa ne imaginam urmatoare situatie : ce ar insemna daca pe site-ul unei banci , pe una dintre pagini exista un fromular in care toti clientii sunt rugati sa isi introduca datele personale, iar infromatia se va trimite undeva in internet,..ei bine in acest caz este grav.
Pentru a rezolva problema a inputurilor nesecurizate am realizat utmatoarea Continue reading »
Daca tot avem fani MS pe aici hai sa amintim de un nou produs MS, gratuit, pt. cei ce vor sa invete programare, simplu: SmallBasic.
Nu l-am testat insa am citit un pic despre el si am vazut citeva exemple de cod. Targetul sint persoanele ce vor sa invete programare, pornind de la Basic (oarecum), intr-un limbaj ce are cit mai putine cuvinte cheie. Are vreo 4 Mb pt. download insa necesita .NET Framework 3.5 (vezi manualul PDF in eng.).
Avantajul care il vad eu pe linga simplitate e ca ii invata pe oameni programarea cu obiecte (de genul TextWindow.WriteLine() sau GraphicsWindow.Clear() ) ce apoi poate fi usor inteleasa in contextul .NET.
Editorul e foarte simplu, cu help inclus. De exemplu programul gen ‘hello world’ e cam asa:
Interesat oarecum de clasamentul actual al limbajelor de programare am inceput sa caut in stanga si in dreapta si printre tonelede informatii inutile afisate de Google am dat si peste un site http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html in care este dat clasamentul cica oficial:
Pe cat de mare mi-a fost uimirea sa constat ca Java este primul in top pe atat am fost de dezamagit de C# , ma asteptam ca el sa fie folosit de o comunitate mult mai vasta apropiata ca si numar de Java. Poate ca ma asteptam la pre multe
Dupa cum bine se stie PHP-ul este un limbaj orientat pe cod iar suportul pentru clase a aparut abia mai tarziu.
Astazi m-am gindit sa va arat un mic tutorial, si ca sa fiu mai practic am sa realizez citeva clase ce implementeaza majoritatea operatiilor necersare in lucrul cu baza de date in principiu este vorba de patru clase MysqlQuerry MysqlConnector MysqlController si MysqlResource.
Si ca sa profitam la maxim de flexibilitatea oferita de progrmarea obiectuala haideti ca si clasele noastre sa implementeze fiecate cite o interfata…poate considerati acest pas inutil dar sa ne inchipuim ca dorim sa realizam o aplicatie ce foloseste un server de Mysql dar in timp s-ar putea sa facem o migratie catre un alt server tot ce trebuie sa facem este sa realizam clase ce implementeaza interfetele si modificariile in aplicatia noastra vor fi minime minime atita vreme cit interfata este respectata.
Mai jos este dat codul pentru fiecare dintre interfete
DbQuerry
Cod:
interface DbQuerry {
/**
* @ReturnType void
* @ParamType querry
*/
public function execQuery($querry);
}
DbController
Cod:
interface DbController {
/**
* @ReturnType void
* @ParamType name string
* @ParamType colomns
*/
public function createTable($name, $colomns);
/**
* @ReturnType void
* @ParamType name string
*/
public function deleteTable($name);
/**
* @ParamType name string
* @ParamType clone string
*/
public function cloneTable($name, $clone);
/**
* @ParamType name string
* @ParamType connector Database.DbConnector
*/
public function createDatabase($name);
/**
* @ParamType name string
* @ParamType connector Database.DbConnector
*/
public function deleteDatabase($name);
/**
* @ReturnType Database.DbResource
*/
public function getLink();
}
DbConnector
Cod:
interface DbConnector {
/**
* @ReturnType Database.DbResource
*/
public function getLink();
/**
* @ReturnType void
*/
public function disconnect();
/**
* @ReturnType void
*/
public function reconnect();
}
DbTable
Cod:
interface DbTable {
/**
* @ParamType colomns
* @ParamType values
*/
public function insert($colomns, $values);
/**
* @ParamType condition
*/
public function delete($condition,$operation=’AND’);
/**
* @ParamType colomns
* @ParamType values
* @ParamType conditions
*/
public function update($colomns, $values, $conditions);
/**
* @ParamType condition
*/
public function select($colomns,$condition=”");
/**
* @ReturnType Database.DbResource
*/
public function getData();
/**
* @ReturnType integer
*/
public function getRowsNumber();
}
Aplicatia va lucra doar cu interfatele (de fapt cu implementari ale interfetelor) si in acest mod se respecta bine cunoscutul principuiu al segregarii interfetelor de implementare.
Acum haideti sa arunacam o privire asupra implemetarii interfetelor
/**
* @ParamType colomns
* @ParamType values
*/
public function insert($colomns, $values) {
if(is_array($colomns))
$colomns=implode(”,”,$colomns);
if(is_array($values))
$values=implode(”,”,$values);
$this->execQuery(”INSERT INTO $this->name ($colomns) VALUES (’$values’)”);
}
/**
* @ParamType condition
*/
public function delete($condition,$operation=’AND’) {
if(is_array($condition))
$condition=implode(” $operation “,$condition);
$this->execQuery(”DELETE FROM $this->name WHERE $condition”);
}
/**
* @ParamType colomns
* @ParamType values
* @ParamType conditions
*/
public function update($colomns, $values, $conditions) {
if(!is_array($colomns))
$colomns=explode(”,”,$colomns);
if(!is_array($values))
$values=explode(”,”,$values);
if(is_array($conditions))
$conditions=implode(” AND “,$conditions);
if(count($colomns)!=count($values))
throw new SintaxErrorException(”values and colomn must have the same size.”);
$this->execQuery(”UPDATE $this->name SET $rez WHERE $conditions”);
}
/**
* @ParamType condition
*/
public function select($colomns,$condition=”") {
if(is_array($colomns))
$colomns=implode(”,”,$colomns);
if(is_array($condition))
$condition=implode(” AND “,$condition);
if($condition!=”")
$this->tableResource=$this->execQuery(”SELECT $colomns FROM $this->name WHERE $conditions”);
else
$this->tableResource=$this->execQuery(”SELECT $colomns FROM $this->name “);
}
/**
* @ReturnType Database.DbResource
*/
public function getData() {
if($this->tableResource==null)
throw new MysqlTableException(”no data selected in table”);
return new MysqlResource($result);
}
/**
* @ReturnType integer
*/
public function getRowsNumber() {
if($this->tableResource==null)
throw new MysqlTableException(”no data selected in table”);
return mysql_num_rows($this->tableResource->getResource());
}
/**
* @ParamType querry
*/
public function execQuery($querry) {
return $this->controllerLink->execQuery($querry);
}
};
Pentru a trata diversele erori ce pot aparea in timpul lucrului cu baza de date se lucreaza cu exceptii.Iata un exemplu ce foloseste clasele de mai sus, sa presupunem ca avem un tabel cu doua cimpuri id si nume:
O observatie foarte importanta este ce in cazul catchurilo ordinea este importanta astfel de exmplu daca aveam primul chatch MysqlException de fiecare data cind aparea o exceptie se intra pe primul catch deoarece MysqlException este o calsa din care se deriveaza celelalte tipuri astfel o exceptie de tipul MysqlSintaxException este si de tipul MysqlException.
Pentru a va face o face o imagine asupra ierarhiei de clase am atasat o imagine