02 martie 2012

PHP: arrays, magic arrays

  Cerință: fiind dat un tabel users, ce conține câmpurile (id, firstName, lastName, email) și câteva înregistrări, să se scrie o clasa UserCollection pentru parcurgerea si afisarea utilizatorilor dintr-un tabel folosind un vector de obiecte de tip User
Facilități:
* sortarea crescator/descrescator dupa un camp specificat (Trebuie folosit un mecanism de sortare vectori)
* introducerea de restrictii; un set de restrictii poate fi reprezentat de un array (cheie ⇒ valoare), avand urmatoarea semnificatie: Selecteaza din tabel doar inregistrarile unde coloana “cheie” are valorile “valoare”. Exemplu: daca array-ul de restrictii este de forma (“email” ⇒ “test@email.com”) atunci lista va contine doar utilizatorii care au campul email egal cu valoarea “test@email.com”;
informatiile legate de sortare si de restrictii pot fi trimise in constructorul clasei, si retinute ca membri ai clasei;
* metode suplimentare:
getNextUser(): intoarce un obiect de tip User, sau false (daca nu mai sunt utilizatori in colectie);
_ _toString (): afiseaza intr-un format intuitiv colectia;
* un mecanism prin care parametrii de sortare/restrictii sa poata fi modificati fara a fi necesara re-instantierea clasei UserCollection;

Rezolvările se găsesc aici.

27 februarie 2012

Have fun with chatbots

ELIZA - este printre primele sisteme de prelucrare naturală a limbajului, capabilă să realizeze o conversație limitată cu un utilizator. Program destul de simplu, folosește pattern matching pentru a procesa intrările (inputs) și a le traduce în ieșiri (outputs) convenabile. Astfel, Eliza nu are nevoie să știe nimic despre lume. Se spune că răspunsurile ei sunt similare cu cele ale unui psihoterapeut.
Dr. Romulon - bazat pe platforma de chat ALICE, Dr. Romulon este mai avansat decât Eliza având un set mai larg de răspunsuri. Dar doctorul are o memorie slabă.
Chato - ”Chato is a new chatbot, it is still learning about the world.
It has an AIML heart, and uses some new PHP code for a brain.”

Human: is Eliza your wife?
Dr. Romulon: she is my ancestor.
Human: grandmother?
Dr. Romulon: A deeper algorithm is needed to respond to that correctly.
Human: do you believe in aliens?
Dr. Romulon: Yes I think Dr. Wallace was created by aliens.
Human: who is dr.Wallace?
Dr. Romulon: He is a famous computer scientist, the author of ALICE, and a graduate of Carnegie Mellon.
Human: do you love dr.Wallace?
Dr. Romulon: Yes I love him like a father.

24 februarie 2012

Clase si lucrul cu BD in php


IUser.interface.php
define ("DB", "pwdatabase1");
define ("USER", "root");
define ("PASS", "");
 
interface IUser {
   public function __construct ($id);
   public function __toString ();
}


Pornind de la aceasta interfata, am scris clasa User care o extinde si implementeaza metodele __construct si __toString; in plus exista metodele Update , Insert si Search care interactioneaza cu BD (am considerat un tabel numit users , cu 3 coloane: Id | Name | Description). Clasa MyException este construita pt a fi folosita la generarea exceptiilor de la initializarea unui User cu id invalid.

Clasa Bonus este asemanatoare cu User, doar ca face insert/update pe un tabel cu oricate coloane (pt asta se dau numele coloanelor si valorile lor ca parametri). Metoda Search ar fi asemanatoare.


<?php

interface IUser {
   public function __construct ($id);
   public function __toString ();
}

class MyException extends Exception {

protected $message;
public function __construct() {
$this->message = 'Id incorect ';
}
}

class User implements IUser {

public $username;
public $id;
public $description;

public function __construct($id){


if (gettype($id)!='integer')
throw new MyException();
$connection = new mysqli('localhost','root','','lab2'); // linia 2
$query = "SELECT * from users where Id = ?"; //linia 3
$stmt = $connection->prepare($query); //linia 4
$stmt->bind_param("i",$id); //linia 5
$stmt->execute(); //linia 6
$stmt->bind_result($this->id,$this->username,$this->description); //linia 7
$stmt->fetch(); // linia 8
$stmt->close(); 
$connection->close();
}

public function __toString (){
return '['.$this->id.', '.$this->username.', '.$this->description."]\n";
}

public function Update ($id,$name,$desc) {

$connection = new mysqli('localhost','root','','lab2'); 
$query = "Update users set Name = ?, Description = ? where Id = ?"; 
$stmt = $connection->prepare($query); 
$stmt->bind_param("ssi",$name,$desc,$id); 
$stmt->execute(); 
$stmt->fetch(); 
$stmt->close(); 
$connection->close();
}

public function Insert ($id,$name,$desc) {


$connection = new mysqli('localhost','root','','lab2'); 
$query = "Insert into users values(?, ?,?)"; 
$stmt = $connection->prepare($query); 
$stmt->bind_param("iss",$id, $name, $desc); 
$stmt->execute(); 
$stmt->fetch(); 
$stmt->close(); 
$connection->close();
}

static function Search ($Nume){


$connection = new mysqli('localhost','root','','lab2'); //linia 2
$query = "SELECT * from users where Name='".$Nume."'"; //linia 3
$result = $connection->query($query); //linia 4
$row = $result->fetch_assoc() ; //linia 5
return new User(intval ($row["Id"]));
}

}

class Bonus {

public $id;
public $coloane;
public $tabel;

public function __construct($id, $tabel){


$this->id = $id;
$this->tabel = $tabel;
if (gettype($id)!='integer')
throw new MyException();
$connection = new mysqli('localhost','root','','lab2'); 
$query = "SELECT * from ". $this->tabel  ." where Id = " . $id; 
$result = $connection->query($query);
$row = $result->fetch_row();
$i = 1;
while (isset($row[$i])) {
$this->coloane[$i-1] = $row[$i];
$i++;
}
$connection->close();
}

public function __toString (){

$str = '['.$this->id;
for ($i=0; $i<count($this->coloane); $i++)  
$str = $str . ','. $this->coloane[$i] ;
$str = $str . ']';
return $str;
}

public function Update ($id, $col, $val) {

$connection = new mysqli('localhost','root','','lab2'); 
$query = "Update ". $this->tabel . " set ";
for ($i=0; $i<count($col); $i++) {
$query = $query . $col[$i] . "='" . $val[$i] . "'";
if ($i<count($col)-1)
$query = $query . ",";
}
$query = $query . " where id=?";


$stmt = $connection->prepare($query);
$stmt->bind_param("i",$id);
$stmt->execute();
$stmt->fetch();
$stmt->close(); 
$connection->close();
}

public function Insert ($id,$col,$val) {


$connection = new mysqli('localhost','root','','lab2');
$query = "insert into " . $this->tabel . " (id, ";
for ($i=0; $i<count($col); $i++) {
$query = $query . $col[$i];
if ($i<count($col)-1)
$query = $query . ",";
}
$query = $query . ") values (" . $id . ",";
for ($i=0; $i<count($val); $i++) {
$query = $query . $val[$i];
if ($i<count($val)-1)
$query = $query . ",";
}
$query = $query . ")";
echo $query;
$result = $connection->query($query); 
$connection->close();
}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////

try {

$user = new User(3);
echo $user;

//$user->Insert(4,'Ion','ne miscam');
//$user->Update(4,'Ion','okaa');
//$rezultat = $user->Search('Ion');
//echo $rezultat;

$bon = new Bonus(1, 'mytab');
echo $bon;
//$bon->Update(1, array('nume', 'prenume'), array('popescu','ion'));
//$bon->Insert(2, array('nume', 'prenume', 'email'), array("'lal'", "'salu'", "'lalsalu@bg.com'"));

} catch (MyException $e) {
echo 'Exceptie -> Message: ' .$e->getMessage();
}

?>

Pentru conectarea la baza de date se pot folosi:
  • interogari simple
  • prepared statements
La o interogare simpla se foloseste metoda query a obiectului de tip mysqli creat si rezultate se extrag prin metodele fetch_row/fetch_assoc/etc . [vezi constructorul clasei Bonus]
La un prepared statement, se foloseste metoda prepare a unui obiect de tip mysqli, parametrii se adauga prin metoda bind_param iar rezultatele se extrag cu bind_result. [vezi constructorul clasei User]

22 februarie 2012

Udacity goal

Udacity stands for "we are audatious, for you, the student". This is an audatious step. I am against education that is only available to the top 1% of all students. I am against tens of thousands of dollars of tuition expenses. I am against the imbalance that the present system brings to the world. I want to empower the 99%. I want to democratize education. Education should be free. Accessible for all, everywhere, and any time.
Help me spread the world. I can't do this alone.
Sebastian Thrun, cofondator Udacity

20 februarie 2012

Aplicatii cu socketi TCP si UDP, Java

Prima aplicatie [1] este o aplicatie simpla cu socketi TCP, "mai multi" clienti se conecteaza la un server, trimit mesaje de "Hello", iar serverul paseaza aceste conexiuni catre un serviciu numit TCPServiceThread. Acesta preia socketul conexiunii cu clientul respectiv si ii trimite un raspuns "ACK". Serverul ruleaza pt un numar maxim de conexiuni acceptate dupa care se inchide.

In a doua aplicatie [2] apare o un obiect serializabil ce va fi trimis prin socketi (nu se mai transmite un mesaj). Clientul se conecteaza la server si primeste un obiect de tipul Persoana construit de server.

Urmatorul exemplu [3] este cu socketi UDP. Aici, spre deosebire de TCP se construiesc pachete de datagrame cu parametrii specifici (sir de trimis, limite, obiect de tip InetAddress si port). Serverul primeste datagrama si i-o paseaza serviciului pt a raspunde cu ACK.

In ultimul exemplu [4] avem 2 obiecte serializabile: Request si Response. Clientul trimite un obiect de tip Request serverului ce contine 2 numere naturale intre care trebuie aflate cate numere prime sunt. Serverul paseaza obiectul primit de la client catre un TCPServiceThread care preia conexiunea si construieste obiectul de tip Response pentru client, caruia i-l trimite. Totodata, serverul pastreaza o stare interna ce tine minte numarul total de nr prime gasite de-a lungul functionarii.

[1] http://dl.dropbox.com/u/24465060/TCP.zip
[2] http://dl.dropbox.com/u/24465060/TCP_Serializabil.zip
[3] http://dl.dropbox.com/u/24465060/UDP.zip
[4] http://dl.dropbox.com/u/24465060/TCP_ex.zip

P.S. De acum inainte partajez arhive prin dropbox, este mai sigur decat Mediafire si altele de genul, pe cale de inchidere.