Cesar D. Rodas, web development. Technology news. PHP, MySQL, Apache, C, Bash, ASM

Archive for February, 2007

Primeros Pasos para crear un lenguaje interpretado

Wednesday, February 28th, 2007

Si alguna vez, asi como , tenes la idea de crear un lenguaje Interpretado. Acá te va algunas recomendaciones y ejemplos…

  • Definir que es lo “novedoso” del nuevo lenguaje
  • Ventajas de este sobre otros ya existentes.
  • Definir las reglas gramaticales
  • Manos a la obra: Crear el Analizador sintáctico, y el tokenizer

Aquí va un pequeño ejemplo de un analizar de sintaxis. Yo utilizo Lemon Parser Generator, por que no utiliza variables globales, lo que posibilita que varios threads puedan tener independencia uno de otro.
Para instalar Lemon parser deben copiar el siguiente texto y guardar en un archivo, luego darle permiso de ejecucion, y ejecutarlo:

#!/bin/bash
if [ ! -x lemon ]; then
wget http://www.hwaci.com/sw/lemon/lemon.c #obtener el archivo
wget http://www.sqlite.org/cvstrac/getfile/sqlite/tool/lempar.c
gcc -I . lemon.c -o lemon
if [ -x lemon ]; then
echo ‘lemon compiled successfully’
else
echo ‘lemon failed to compile’
fi
fi

if [ -x lemon ]; then
cp -p lemon /usr/bin/
cp -p lempar.c /usr/bin/
fi

Más adelante mas ejemplos de como utilizar estos utilitarios y crear tu propio lenguaje!

DNS Server in PHP

Wednesday, February 21st, 2007

Ayer recordé viejos buenos tiempos de phpclasses, y vi un DNServer escrito en Python!, y me dio envidia que haya en Python y no en PHP!. Entonces no dormí hasta terminar un servidor de DNS en php. Y ahí presento el código fuente. Es Public Domain, significa que el código es gratis y libre, y a diferencia del GNU puede formar parte de un programa propietario.

Yesterday I was remembering old times in phpclasses, and I saw a DNServer written in Python!, so I had much envies because that is in Python and not in PHP. So i didn’t sleep until finish a DNS server in php. Here is the source code. This is public domain, this mean that the code is free (as in freedom) and free(priceless). And could be part of a Proprietary software.

<?

class DNServer
{
var
$func;
var
$socket;
var
$types;

/*
** Function Constructor.
** The argument is the name of a function that became
** a callback function. See the example
*/
function DNServer($callback)
{
set_time_limit(0);

$this->func = $callback;

$this->types = array(
“A” => 1,
“NS” => 2,
“CNAME” => 5,
“SOA” => 6,
“WKS” => 11,
“PTR” => 12,
“HINFO” => 13,
“MX” => 15,
“TXT” => 16,
“RP” => 17,
“SIG” => 24,
“KEY” => 25,
“LOC” => 29,
“NXT” => 30,
“AAAA” => 28,
“CERT” => 37,
“A6″ => 38,
“AXFR” => 252,
“IXFR” => 251,
“*” => 255
);

$this->Begin();
}

function Begin()
{
$this->socket = socket_create(AF_INET,SOCK_DGRAM, SOL_UDP);
if (
$this->socket < 0)
{
printf(“Error in line %d”, __LINE__ - 3);
exit();
}
if (
socket_bind($this->socket, NULL, “53″) == false)
{
printf(“Error in line %d”,__LINE__-2);
exit();
}

/*
* Server Loop
*/
while(1)
{

$len = socket_recvfrom($this->socket, $buf, 1024*4, 0, $ip, $port);
if (
$len > 0)
{
$this->HandleQuery($buf,$ip,$port);
}
}
}

function HandleQuery($buf,$clientip,$clientport)
{

$dominio=“”;
$tmp = substr($buf,12);
$e=strlen($tmp);
for(
$i=0; $i < $e; $i++)
{
$len = ord($tmp[$i]);
if (
$len==0)
break;
$dominio .= substr($tmp,$i+1, $len).“.”;
$i += $len;
}
$i++;$i++; /* move two char */
/* Saving the domain name as queried*/
print $DomainAsQueried;

$querytype = array_search((string)ord($tmp[$i]), $this->types ) ;

$dominio = substr($dominio,0,strlen($dominio)-1);
$callback = $this->func;
$ips = $callback($dominio, $querytype);

$answ = $buf[0].$buf[1].chr(129).chr(128).$buf[4].$buf[5].$buf[4].$buf[5];
$answ .= chr(0).chr(0).chr(0).chr(0);
$answ .= $tmp;
$answ .= chr(192).chr(12);
$answ .= chr(0).chr(1).chr(0).chr(1).chr(0).chr(0).chr(0).chr(60).chr(0).chr(4);
$answ .= $this->TransformIP($ips);

if (socket_sendto($this->socket,$answ, strlen($answ), 0,$clientip, $clientport) === false)
printf(“Error in socket\n”);
}

function TransformIP($ip)
{
$nip=“”;
foreach(
explode(“.”,$ip) as $pip)
$nip.=chr($pip);

return $nip;
}
}

/* Ej: */
function dnshandler($dominio,$tipo)
{
return
“64.64.64.64″;
}

$dns = new DNServer(“dnshandler”);

?>

PDBM

Wednesday, February 14th, 2007

Paraguayan DataBase Manager (el nombre mato!! xD) es un proyecto que inicie, que no es GNU, en este caso es Public Domain, ya que tiene que ser asi para que sea mas útil. Básicamente es una base de datos primitiva como DBD, QDBM, GDBM. Tiene una arquitectura clave-valor (la clave tiene que ser única).

Entres sus virtudes tienen que es facil compilar (hasta yo compilo!! buena esa!), se puede compilar en Linux y Hasefroch, API similar a DBD pero con mejoras, permite la existencias de varios procesos escribiendo y leyendo la Base de datos al mismo tiempo. Y mas.

Ademas ya que tiene una arquitectura simple estoy viendo la posibilidad que sea transacional ACID.

El proyecto ahora mismo esta pausado porque estoy haciendo el Proyecto SCV, pero calculo que en un mes termino este proyecto y reactivo de vuelva a full con PDBM.

Saddor Current Versioning

Wednesday, February 14th, 2007

Hola a todos, he comenzado un proyecto, el SCV http://saddorcv.cvs.sourceforge.net/. La idea basica es hacer un servidor como el CVS o SVN, con una interface cliente-servidor web. Es una sola aplicacion que se descargará y podrá crear, borrar, y actualizar varios repositorios desde una interfaz web.

La mayor ventaja que tendra es que será facil de usar y configurar.

Mas detalles proximamente aqui…

Todo el proyecto esta siendo desarrollado para que sea una sola ejecutable (facil de user, y/0 compilar), escrito con C con motor DB de SQLite, un servidor web (null-webserver o shttpd, por ahora gana el shttpd, pero creo que va a ganar el null-webserver) todo en una sola aplicacion.

Podrá ser compilado en Linux y en Hasefroch

Enter your email address:

Delivered by FeedBurner

this Site

Archives

February 2007
S M T W T F S
    Mar »
 123
45678910
11121314151617
18192021222324
25262728  

Syndication

Google