The New Cult of Dead Cow

February 21, 2007






Extends y New en PHP5

Filed under: Programacion, PHP, php-ORM, Web

Trabajando en phpORM, se dio la necesidad de poder crear un objeto del tipo clase Hija desde el codigo de la clase ORM

phpORM dispone de una clase base llamada ORMBase, sin embargo esta clase es abstracta, es decir, no puede ser utilizada directamente. Para usar phpORM se debe crear una clase que herede de phpORM.


Este codigo podria servir en cualquier situacion que debamos crear una clase heredable ( abstracta ) y necesitemos crear objetos  sin saber el nombre de las clases Hijas.

<?php

abstract class Base
{

    function nuevo()
    {
        $className = get_class($this);
        return new $className();
    }
   
   
    function quiensoy()
    {
        echo “soy Base\n”;
    }

}

class Hija extends Base
{
   
    function quiensoy()
    {
        echo “soy hija\n”;
    }

}

$a = new Hija();
$b = $a->nuevo();

$b->quiensoy();

?>

La funcion nuevo dentro de la clase Base, es la que se encarga de crear el objeto. Este objeto sera siempre del mismo tipo que el objeto que hizo la llamada.

Technorati Tags:

February 1, 2007






php-ORM

php-ORM es un nuevo y pequeño motor de persistencia de objetos para PHP5. Se ha tratado de realizarlo lo mas usable y flexible posible. Y aunque todavia esta en desarrollo ya va teniendo muy buena pinta.

Entre las cosas que ya puede hacer estan:

  • Recuperar un registro de la base de datos usando su PK
  • Guardar cambios del registro en la base de datos
  • Recuperar un registro de la base de datos usando algun campo UNIQUE
Y este es nuestro TODO-List:
  • Permitir la busqueda usando cualquier campo
  • Terminar el soporte para las claves foraneas
  • Terminar la pagina web.

Este es un ejemplo de un script que usa php-ORM:

<?php

    require(’ORM.php’);

    class Test extends ORM
    {
        protected $tablename = "notarios";
       
        protected $PK = array("id2");
        protected $names = array("id2"=>"id","login"=>"login","clave"=>"passwd","appaterno"=>"appaterno","apmaterno"=>"apmaterno", "nombre"=>"nombre", "email"=>"email", "telefono"=>"telefono", "celular"=>"celular");
       
        protected function createObject($pk)
        {
            return new Test($pk);
        }
       
    }

    $a = new Test(null);
    $b = $a->getOneBy("login","czarate");
    echo $b->login;
    echo "\n\n";
?>


Eso es lo minino que hay que definir en php-ORM para que funcione con nuestra base de datos.

Para los que se animen a probarlo, la pagina web del proyecto es php-ORM

Technorati Tags: php, orm, programacion

powered by performancing firefox

January 31, 2007






Propiedades en PHP5

Las propiedades son metodos que te permiten acceder a los atributos de una clase de una manera ordenada. Me explico, tenemos la siguiente clase:

class Persona{ public nombre; public edad; }
Cuando la queremos usar hacemos lo siguiente:
$per = new Persona(); $per->nombre = "Arthas"; $per->edad = 24;
Sin embargo nada nos impide hacer :
$per = new Persona(); $per->nombre = 23; per->edad = "Lo que sea";
Las propiedades en cambio nos permiten asegurarnos que el acceso a los atributos de una clase, se hacen de la manera especificada por nosotros. Ejemplo:
class Persona{ public nombre; public edad; public __set($attr,$value) { switch ($attr) { case "nombre": if ( ) { $this->nombre = $value; } else { throw new Exception("Informacion no valida"); } } } }
Asi cuando hacemos uso de las propiedades, podemos controlar como se accesa a la informacion. El problema viene cuando heredamos una clase, y en la clase hija queremos redefinir las politicas de control sobre algunas de las propiedades. Por ejemplo, quisiera que en la clase heredada solo se grabaran los 15 primeros caracteres. La unica manera es redefinir todo el metodo __get, cargandonos con eso toda una gran cantidad de trabajo. O sea volveriamos al copy & paste, para tener de nuevo el metodo completo y luego hacer las modificaciones que necesitaramos :S. NADA mas fuera de la OO. En fin, la única solución que se me ocurre es crear una función que reemplace el acceso a esa propiedad, por ejemplo setNombre($value), pero esto no impediria que se ingrese por el metodo antiguo. Bueno si a alguien se le ocurre otra forma de hacerlo , por favor aviseme. Haber si para php6, la gente de Zend se les ocurre separar el codigo de acceso para cada propiedad. Algo mas o menos asi:
class Persona{ private nombre; property nombre { function __get() { return $this->nombre; } function __set($value) { //Codigo de validacion $this->nombre = $value; } } }

December 16, 2006






Hacking JQuery && JTip

Una de las librerias que mas utilizo para el desarrollo web es JQuery. Es más, ya habia hablado de ella en ocasiones anteriores. Su mayor punto fuerte, es la facilidad para poder escribir codigo javascript y la posibilidad de relacionar los eventos de nuestra pagina con nuestro javascript sin tener q tocar ni una linea de nuestro HTML ( un golazo a favor de la separación en capas ).

Como dijera antes, JQuery es una libreria muy compacta que tiene casi todo y no le falta casi nada.
Pero que pasa cuando requieres algo que no habian pensado los desarrolladores o que simplemente ignoraron por considerarlo poco común ?

Pues para eso JQuery permite la inclusión de plugins que nos permiten expandir nuestras funcionalidades hasta cosas no imaginadas. Uno de lo que mas utilizo es JTip, este plugin me permite crear tooltips para los anchors de mi pagina. Estos tooltips pueden incluir cualquier cosa, en realidad son un html completo.

Sin embargo la joda era que solo se incluian para etiquetas anchor. Hoy sin embargo, necesite ampliarlo para cualquier tipo de etiqueta.

Los cambios los tuve que realizar en la siguiente función

function JT_init(){
$(”.jTip”)
.hover(function(){JT_show($(this).attr(”href”),this.id,this.name)},function(){$(’#JT’).remove()})
.click(function()
{
if ($(this).attr(”return”) == null)
response = false;
else response = $(this).attr(”return”);
return response;
});
}

  1. El marcador original era $(”a.jTip”), lo cual solo permitia su uso con tags anchor. Al colocarlo solo $(”.jTip”), permite su uso en cualquier etiqueta con la clase jTip.
  2. El parametro original era this.href, pero eso no funcionaba en otros elementos que no fuera anchor. El parametro href es necesario porque indica donde esta la ayuda a mostrarse en el tooltip.
  3. El bloque de codigo original era return false;, lo cual indicaba que aunque se hiciera click en las etiquetas que servian de tooltip, estas no debian conducir a ninguna parte. Lo cual era logico para tags anchors, pero otros tags como los radiobuttons, checkbox necesitan que se procese el evento. La solución pasa por decirle al script que sino tiene el atributo return, entonces considere el comportamiento por defecto, o sea falso. Pero si tiene el atributo return, debe considerar el comportamiento en el indicado, que puede ser verdadero o falso.

Si desean descargar mi version modificada de jTip, pueden hacerlo de aca.

November 9, 2006






Mal Servicio de Telefonica

Filed under: Linux, Articulo, Ubuntu, Loki

Estás navegando de lo mas tranquilo en internet, chateando, revisando tu correo cuando de repente, ya no puedes ingresar a la pagina de google …

Tu primera reacción, se cayo internet !! Juas … Pero tus contactos del MSN, Yahoo, GTalk siguen en linea … recontra juas ¿? ¿ que paso acá ?

Muy simple telefonica volvio a fallar. El servicio ofrecido por telefonica no solo incluye los cables de telefonica por donde pasa la información de internet, sino que también te proveen acceso a sus servidores DNS.

Qué es un servidor DNS ?? Pues un servidor DNS es como una guia telefonica pero para internet. Para poder visitar cualquier sitio web necesitas de una direccion IP. Pero como memorizar direccion IP no rula, se usan nombres como www.google.com, bueno pues son los servidores de DNS los encargados de transformar el nombre fácil y memorizable que tu manejas en la dirección que se necesita para conectarse a ese servidor.

¿ Porque se caen tanto los servidores DNS de telefonica ? Pues ve tu a saber. A estas alturas y despues de 150 peleas con su servicio tecnico he llegado a la resignación en lo que respecta a ellos. Al menos me queda el consuelo de saber que peor no pueden ser … ? o si ? ..

Sin embargo podemos solucionar las molestias causadas por telefonica cuando se caen sus servidores DNS, simplemente tenemos que dejar de usarlos … o mejor dicho dejar de usar esos y usar otros.

El servicio se llama OpenDNS, es un servicio gratuito y funcionan realmente bien. OpenDNS te ofrece mayor seguridad en tu navegación bloqueando ciertos sitios que tratan de obtener tu informacion personal ( tarjetas de credito, contraseñas, etc ), ofrece un excelente tiempo de respuesta gracias a sus consultas cacheadas, y corrige errores al momento de tipear el nombre del sitio, como podría ser yahoo.cm , OpenDNS lo entiendo como yahoo.com

Que es lo que hay que hacer pues en nuestro archivo /etc/resolv.conf poner estas dos lineas adelante de cualquier otra linea de diga nameserver.

nameserver 208.67.222.222
nameserver 208.67.222.220

Esto porque ? Pues cada linea representa un servidor de DNS, y lo que hace el sistema es consultar a la primera linea por el nombre de servidor del cual queremos su direccion IP. Si el servidor estuviera “apagado” entonces y solo entonces consultara al segundo servidor, y asi sucesivamente. Entonces para consultar siempre a OpenDNS ponemos esas lineas adelante.

Para configurarlo en Windows:

Y listo ya tienes tus nuevos DNS configurados …

May 19, 2006






Mono Desktop Enviroment

Gnome, uno de los escritorios mas populares de Linux/BSD sufrio durante su desarrollo de algunos problemas que los llevaron a adoptar alternativas de solucion que luego en el tiempo resultaron ser una trampa para el mismo Gnome, puesto que complicaban el desarrollo y penalizaban el rendimiento (Segun relata el mismo De Icaza en su presentacion de Mono).

En esa situacion surge el proyecto mono, que pretende ofrecer una solucion mas limpia a los diversos problemas que adolecieron el desarrollo de aplicaciones Gnome y del mismo Gnome.

Hoy, con una plataforma mono mucho mas desarrollada, nos proponemos como objetivo construir un escritorio basado integramente en Mono y GTK#. Se pretende excluir las librerias de gnome, que apesar de considerar que son muy utiles, son tambien una carga apreciable en su ejecucion.

El primer paso para la construccion de este escritorio, es la aplicacion Mono Desktop Manager, que vendria a ser el reemplazo de GDM.

No se pretende desplazar al escritorio Gnome, sino crear un experimento que nos permita mejorar y aprender muchas cosas y divertirnos haciendolo. Si te gusta Mono y te interesaria apoyar podes ponerte en contacto con:
NeCuDeCo y Nachxs



December 17, 2005






DataBase for Objects

Filed under: Programacion, Mono, OpenBss, Boo

Buscando alternativas para el manejo de los datos en OpenBSS y alertado por un mail en la lista de desarrollo, dirigi mi mirada a db4o, este framework permite realizar el almacenamiento de Objectos (Java o .Mono) de una forma totalmente transparente.

Anteriormente enzo, estuvo experimentando con Hibernate que permitia guardar los objetos en una base de datos relaciones, sin embargo recuerdo que tuvo muchas dificultades con el proyecto. DB4O, no solo nos permite un uso sencillo de su funcionalidad ( aunque no por es menos potente) sino que ademas nos permite llevar el producto donde sea sin complicadas instalaciones, debido a que es una base de datos empotrada, al mismo estilo sqlite aunque sin tener las deficiencias de este ultimo.

Otro de los puntos a favor de esta tecnologia es su bajo consumo de recursos, y buen tiempo de respuesta (actualmente es usada la el control de las lineas ferreas de los trenes “bala” en España). Lamentablemente no existe una version del proyecto que pueda ser usada directamente en php o en python.

A continuacion un pequeño ejemplo de su uso:


	
import System
import System.IO
import com.db4o
	
class Pilot:
	private _name as string
	private _points as int
	
	def constructor(name as string,points as int):
		_name = name
		_points = points
	
	Name as string:
		get:
			return _name
	
	Points as int:
		get:
			return _points
	
	def AddPoints(p as int):
		_points = _points + p
	
	override public def ToString():
		return _name + \" / \" + _points
	
print \"Creando Contenedor\"
db = Db4o.openFile(\"data.yap\")
db.set(Pilot(\"Mario\",2))
q = db.query()
q.constrain(typeof(Pilot))
result = q.execute()
while ( result.hasNext()):
	Console.WriteLine(result.next().ToString())
db.close()

November 30, 2005






MonoTella

Despues de pasar cerca de 2 semanas metido en windows para poder terminar un trabajo de Dinamica de Sistemas, y casi pelearme con todo el mundo (Es increible como te cambia el humor despues de pasar mas de 8 horas en windows), al fin logre terminar el bendito curso. Y convencido como estoy que nadie mas en el mundo debe tener que soportar usar windows para poder pasar curso alguno, decidi embarcarme en la construccion de monotella que hasta donde tengo entendido seria el primer programa libre para desarrollar diagramas de forrester (tanta era mi deseperacion que hubiera usado un programa hecho en java o incluso uno de KDE :S).

Esta basado como no en mono y gtk, de momento estoy revisando el trabajo de CeronMan y MarioC en el canvas de monouml. Pienso que puedo tomar eso como base y evitarme mucho trabajo.

Para los que no sepan que un diagrama de forrester ahi les dejo unas pantallas. :D

Si alguien estuviera interesado (o interesada) en participar comuniquese conmigo cualquier ayuda es bienvenida.


Diagrama de Forrester

October 20, 2005






Otra modificacion a monologue

Filed under: Programacion, Mono, OpenBss

Despues de la mas que acertada observacion que recibi de parte de Alex, sobre mi mas que apurada modificacion a monologue, le he dedicado un tiempo a corregir dichas observaciones, esperando tambien que siga siendo igual de inquisidor (Y). Ahora monologue, aparte de soportar ya correctamente el formato Atom, tambien hice correcciones para el formato RSS 2.0, el cual no mostraba el contenido completo, ni links , ni imagenes.

Para usar estos cambios, hay que agregar un parametro en el nodo Blogger del archivo bloggers.xml, por ejemplo:


<bloggercollection>
	<blogger Name=\"Blogspot\" RssUrl=\"http://necudeco.blogsome.com/feed\" IrcNick=\"\" Head=\"\" Type=\"Rss\" />
</bloggercollection>

Para los que quieran usar esta nueva version de monologue, o ver el codigo lo pueden encontrar en el forge de OpenBSS. Agradecere cualquier sugerencia o correcion.

October 11, 2005






Avances en OpenBss

Filed under: Uncategorized, OpenBss

Luego de una larga charla entre enzo, juanpe y joil (nuevo integrante de OpenBss), divimos el diseño de los modulos :

  • Stocks
  • P.o.S.
  • Suppliers
  • Accounting

Para esto usamos el planificador de tareas de forge.novell.com, asi que los miembros del grupo vayan dandose una vuelta por el svn de Openbss

Tambien se hablo, del diseño de la pagina web para lo cual yo propuse usar gekko (CMS) mientras q angel habia propuesto jaws. Supongo que en los proximos dias estaran las dos opciones listas para ser evaluadas.

Otro tema importante pero que no se toco ahi, es el comportamiento de monologue con ciertos rss, que q voya tener q aplicarle otro parche mas. Lo que pasa es que algunos rss en su estructura no usan el tag description sino el content y eso por eso que blogs como el mio, no son mostrados de manera completa en por monologue sino que simplemente un resumen. Esto imposibilita que pongo links y que incluya imagenes. Aparte de ser imposible de leer un post mas o menos largo sin salir del site.






















Get free blog up and running in minutes with Blogsome
Theme designed by B A Khan