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.

15 februarie 2012

Primul curs online de la MITX

6002x (Circuits & Electronics) este primul curs online, oferit gratuit de MITX, începând pe 5 martie până pe 8 iunie. Acest curs este deocamdată experimental, urmând ca după terminare și în urma feedback-urilor primite să se lanseze noi cursuri online. Deși certificarea este gratuită de această dată, în viitor MITX va percepe o taxă pentru obținerea de certificat (care probabil va avea o greutate mai mare decât statements of accomplishment obținute la cursurile Udacity sau Coursera). Mai multe detalii aflați aici.

P.S. dacă nu v-a plăcut electronica/electrotehnica în facultate, aveți șansa acum să vă luați revanșa, unul dintre profesorii cursului având reputația de a face lucrurile complicate să pară foarte simple :)

05 februarie 2012

Sisteme distribuite (ebook)

Distributed Systems: Concepts and Design (5th Edition) by George Coulouris, Jean Dollimore, Tim Kindberg and Gordon Blair:

Continut:
1. Caracterizarea sistemelor distribuite (intro, exemple, tendinte, studiu de caz: www)
2. Modele de sisteme (fizice, arhitecturale, modele fundamentale)
3. Networking & internetworking (tipuri de retele, principii, protocoale)
4. IPC (..., studiu de caz: MPI)
5. Remote invocation (RPC, RMI, studiu de caz: Java RMI)
6. Comunicatie indirecta (de grup, sisteme publisher-subscriber, cozi de mesaje, memorie partajata)
7. OS support (procese, thread-uri, etc)
8. Obiecte si componente distribuite (studiu de caz: CORBA, Enterprise JavaBeans, Fractal)
9. Servicii web (securitate XML)
10. Sisteme peer-to-peer
11. Securitate (algoritmi de criptografie, semnaturi digitale)
12. Sisteme de fisiere distribuite
13. Servicii de nume
14. Time & global states (sincronizari, ceasuri fizice si logice)
15. Coordonare si acord (excluziune distribuita, alegeri, probleme de consens)
16. Tranzactii si controlul concurentei
17. Tranzactii distribuite
18. Replicare (+servicii tolerante la defecte)
19. Mobile & ubiquitous computing
20. Sisteme distribuite multimedia (studiu de caz Tiger, BitTorrent)
21. Studiu de caz Google (arhitectura, proiectare, paradigme de comunicatie, stocare de date, servicii distribuite)

ENJOY

03 februarie 2012

UDACITY - cursuri online noi



UDACITY este proiectul inceput de profesorul german Sebastian Thrun, care dupa experienta coplesitoare pe care a avut-o cu ai-class (cursul online de inteligenta artificiala tinut toamna trecuta), si-a dat seama ca nu mai poate preda intr-o clasa obisnuita de cateva zeci de studenti, si ca trebuie sa se dedice in continuare dezvoltarii "invatamantului in masa". In total, peste 20.000 de studenti au promovat ai-class, din orice colt al lumii, varsta sau orientare profesionala. Crezul profesorului este ca educatia de calitate trebuie sa fie disponibila pentru oricine, indiferent de conditiile sociale si materiale.


UDACITY isi deschide portile cu 2 cursuri numite
  • CS101: Building a search engine 
  • CS373: Programming a robotic car
Primul este un curs pentru incepatori, in special cu elemente de Python si construirea treptata (in 7 saptamani) a unui motor de cautare:)
Cel de-al doilea se vrea o continuare la ai-class, in care se vor prezenta principiile programarii unei masini-robot:) Mai multe detalii gasiti desigur aici[1].


Pe viitor, UDACITY pregateste si alte cursuri, dupa cum se poate vedea pe site:
  • Theory of computation
  • Operating Systems
  • Computer Networks
  • Dystributed Systems
  • Computer Security
  • Algorithms and data structures
  • Software engineering practices
  • Building web apps


Mai mult, UDACITY are de gand sa devina o universitate in toata regula care sa ofere certificari, dupa cum spune si Sebastian Thrun:
In the next months, we will offer an entire computer science curriculum through Udacity,and offer certification services so that an entire degree can be obtained online.
Desigur - timp sa ai, cursurile sunt deosebit de interesante, aveti numai de castigat inscriindu-va.
In paralel, puteti consulta si linia de cursuri asa-zise "de la Stanford", care acum poarta insigna Coursera [2].
Coursera este analogul UDACITY, insa ai carei fondatori sunt Andrew Ng (ml-class) si Daphne Koller (pgm-class). Si daca esti o "sora", poti intra in grupul nostru de pe facebook [3]

[1] http://www.udacity.com/
[2] http://www.cs101-class.org/hub.php
[3] http://www.facebook.com/groups/compscisters/