Jan 17

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 :

import javax.swing.event.HyperlinkEvent;
import javax.swing.*;
import java.io.*;
import javax.swing.event.HyperlinkListener;

public class SimpleWebBrowser {
static JEditorPane jep = new JEditorPane();
public static void main(String[] args) {

String initialPage = “http://www.google.ro/”;
if (args.length > 0) initialPage = args[0];

jep.setEditable(false);

jep.addHyperlinkListener(new HyperlinkListener() {

public void hyperlinkUpdate(HyperlinkEvent e) {
try {
jep.setPage(e.getURL());
} catch (IOException ex) {
Logger.getLogger(SimpleWebBrowser.class.getName()).log(Level.SEVERE, null, ex);
}
}
});

try {
jep.setPage(initialPage);
}
catch (IOException e) {
System.err.println(”Usage: java SimpleWebBrowser url”);
System.err.println(e);
System.exit(-1);
}

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();

}

}

Si iata cum ar arata “miniborwser-ul”

Tagged with:
Dec 30

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 .

Dec 01

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.

//declarare functii
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
BOOL CALLBACK EnumWindowsProc2(HWND hwnd,LPARAM lParam);

//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 :D .

Tagged with:
Nov 24

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 :D .
Am gasit pe youtube un filmulet destul de intersant

Asa ca si un fel de concluzie : omul este masura tuturor lucrurilor.

Tagged with:
Nov 17

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 .

http://tryruby.hobix.com/

E Live! Very Happy

Tagged with:
Nov 16

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 »

Tagged with:
Nov 16

Daca tot avem fani MS pe aici Laughing 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:

Cod:
TextWindow.WriteLine(”Hello World”)

Incercati, poate o sa va placa.

Tagged with:
Nov 14

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:

Position
Nov 2008
Position
Nov 2007
Delta in Position Programming Language Ratings
Nov 2008
Delta
Nov 2007
Status
1 1 Java 20.299% -0.24% A
2 2 C 15.276% +1.31% A
3 4 C++ 10.357% +1.61% A
4 3 (Visual) Basic 9.270% -0.96% A
5 5 PHP 8.940% +0.25% A
6 7 Python 5.140% +0.91% A
7 8 C# 4.026% +0.11% A
8 11 Delphi 4.006% +1.55% A
9 6 Perl 3.876% -0.86% A
10 10 JavaScript 2.925% 0.00% A
11 9 Ruby 2.870% -0.21% A
12 12 D 1.442% -0.26% A
13 13 PL/SQL 0.939% -0.24% A
14 14 SAS 0.729% -0.40% A–
15 18 ABAP 0.570% -0.08% B
16 19 Pascal 0.511% -0.13% B
17 17 COBOL 0.510% -0.20% B
18 25 ActionScript 0.506% +0.04% B
19 23 Logo 0.489% -0.04% B
20 16 Lua 0.473% -0.27% B

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 :(

Nov 12
Nov 11

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

MysqlQuerry

Cod:
class MysqlQuerry implements DbQuerry {
/**
* @AttributeType Database.MysqlResource
*/
private $resource;
/**
* @AttributeType boolean
* */
public static $debug=false;

/**
* @ParamType resource Database.MysqlResource
*/
public function setResource(MysqlResource $resource) {
$this->resource=$resource;
}

/**
* @ParamType resource Database.MysqlResource
*/
public function MysqlQuerry(MysqlResource $resource) {
$this->setResource($resource);
}

/**
* @ParamType querry
*/
public function execQuery($querry) {
if(MysqlQuerry::$debug==true)
echo($querry);

$result=mysql_query($querry,$this->resource->getResource());
if(!$result){
$error=mysql_error();
throw new MysqlSintaxException($error);
}

$resource=new MysqlResource($result);

if(MysqlQuerry::$debug==true)
echo(mysql_info($this->resource->getResource()));

return $resource;
}
}

MysqlController

Cod:
class MysqlController extends MysqlQuerry implements DbController {
/**
* @AttributeType string
*/
private $databaseName;

/**
* @AttributeType DbResource
*/
private $resource;

/**
* @ParamType dbName
* @ParamType connector Database.MysqlConnector
*/
public function MysqlController($dbName, MysqlConnector $connector) {
parent::MysqlQuerry($connector->getLink());
$this->databaseName=$dbName;
$this->resource=$connector->getLink();

}

/**
* @ReturnType void
* @ParamType name string
* @ParamType colomns
*/
public function createTable($name, $colomns) {

if(is_array($colomns))
$colomns=implode(”,”,$colomns);
$this->execQuery(”CREATE TABLE $name ($colomns)”);
}

/**
* @ReturnType void
* @ParamType name string
*/
public function deleteTable($name) {
$this->execQuery(”DELETE TABLE $name”);
}

/**
* @ParamType name string
* @ParamType clone string
*/
public function cloneTable($name, $clone) {
$this->execQuery(”CREATE TABLE $clone LIKE $name”);
$this->execQuery(”INSERT $clone SELECT * FROM $name”);
}

/**
* @ParamType name string
*/
public function createDatabase($name) {
$this->execQuery(”CREATE DATABASE $name”);
}

/**
* @ParamType name string
*/
public function deleteDatabase($name) {
$this->execQuery(”DELETE DATABASE $name”);
}
/**
* @ParamType querry
*/
public function execQuery($querry) {
mysql_select_db($this->databaseName,$this->resource->getResource());
return parent::execQuery($querry);

}
/**
* @ReturnType Database.DbResource
*/
public function getLink(){
return $this->resource;
}
};


MysqlConnector

Cod:
lass MysqlConnector implements DbConnector {
/**
* @AttributeType string
*/
private $password;
/**
* @AttributeType Database.DbResource
*/
private $link;
/**
* @AttributeType string
*/
private $user;
/**
* @AttributeType string
*/
private $host;

/**
* @ReturnType boolean
*/
public function pingServer() {
$result= mysql_ping($this->getLink());
return $result;
}

/**
* @ParamType host
* @ParamType user
* @ParamType password
*/
public function MysqlConnector($host=null, $user=null, $password=null) {
$this->host=$host;
$this->user=$user;
$this->password=$password;
$this->reconnect();
}

/**
* @ReturnType Database.DbResource
*/
public function getLink() {
return $this->link;
}

/**
* @ReturnType void
*/
public function disconnect() {
mysql_close($this->getLink()->getResource());
}

/**
* @ReturnType void
*/
public function reconnect() {
$result=mysql_connect($this->host,$this->user,$this->password);
if($result==false){
$error=mysql_error();
throw new MysqlConnectionException($error);
return;
}

$this->link=new MysqlResource($result);
}
/**
* @ReturnType void
*/
public function __destruct(){
$this->disconnect();
}
};


MysqlResource

Cod:
class MysqlResource implements DbResource {
private $resource;

/**
* @ParamType resource
*/
public function MysqlResource($resource) {
$this->resource=$resource;
}

public function getResource() {
return $this->resource;
}

}


MysqlTable

Cod:
class MysqlTable extends MysqlQuerry implements DbTable {
/**
* @AttributeType string
*/
private $name;
/**
* @AttributeType string
*/
private $tableResource=null;
/**
* @AttributeType DbController
*/
private $controllerLink;
/**
* @ParamType name
* @ParamType connector Database.MysqlConnector
*/
public function MysqlTable($name, MysqlController $controler) {
parent::MysqlQuerry($controler->getLink());
$this->name=$name;
$this->controllerLink=$controler;
}

/**
* @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.”);

$rez=array();

for($i=0;$i<count($colomns)-1;$i++){
$rez.=$colomns[$i]=”=’$values[$i]‘,”;
}
$rez.=$colomns[$i]=”=’$values[$i]‘”;

$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”);

$i=0;
$result=array();

while($row=mysql_fetch_object($this->tableResource->getResource()))
{
$result[$i++]=$row;
}

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:

Cod:
<?php

try
{
$connector=new MysqlConnector(”host”,”user”,”parola”);
$controller=new MysqlController(”nume_baza_de_date”,$connector);
$table=new MysqlTable(”nume_tabel”,$controller);
$table->select(”*”,”id=’1′”);
$data=$table->getData()->getResource();

for($i=0;$i<count($data);$i++)
{
echo($data->id);
}

}

catch $ex)
{
echo(”eroare de sintaxa:”.$ex->getMesage());
}
catch(MysqlTableException $ex)
{
echo(”eroare:”.$ex->getMessage());
}
catch(MysqlConnectionException $ex)
{
echo(”eroare :”.$ex->getMessage());
}
catch(MysqlException $ex)
{
echo(”eroare :”.$ex->getMessage());
}
..

?>

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

Tagged with:
preload preload preload