jueves, 30 de septiembre de 2010

Promoviendo el cloud computing?

Cloud computing, web 2.0, Ajax en cierta forma todos se refieren a lo mismo y mas que un concepto es una tendencia a que los programas de computadora convencionales sean accesados a travez de internet. ¿Mmm y eso como para que? Aaaa!!! es buenísimo por que no se necesita mas que tener un buen navegador de internet en tu computadora y ni siquiera tiene que ser tu propia computadora puede ser la de tu casa, la de un ciber, la escuela, un smarthphone, cualquiera que tenga conexión a internet. No se tiene que lidiar con esos insoportables ingenieros de sistemas que creen que si no sabes programar no sabes de computación y miran a todos los demás como analfabetas informáticos, solo por que no sepas instalar java no significa que tengas retrazo mental, si dispersas nominas y deduces impuestos por que habrías de preocuparte por esas pequeñeces.

Echa un vistazo a mi web de demostración para ver como prodría ser una aplicación en la nube: http://leonelhs.users.sourceforge.net/

lunes, 6 de septiembre de 2010

El protocolo http messenger

En un intento por tener una conexión al msn messenger via web, me di a la tarea de profundizar sobre el protocolo messenger, aun que este protoclo esta muy documentado para el modo convencional(aplicaciones de escritorio), no lo es asi para las aplicaciones web como el ebuddy, inclusive el propio microsoft ofrece un sdk con todo lo que se nesesita para su desarrollo, este no contiene codigo fuente y es muy pesado para aplicaciones de dipositivos de baja memoria(que ese seria el objetivo de este analisis). A pesar de que no termine de analizarlo todo, me ha servido para tener un mejor entendimiento y comprensión sobre el protocolo http en general, una vez mas y si a alguien le interesa comparto este codigo que consiste en un sitio asp.net que es capaz de conectarse y loguearse con exito al messenger via web, esperando que alguien mas pudiera darle continuidad.

Algunos recursos para empezar:
Una herramienta impresindible de analisis de paquetes: http://www.wireshark.org/
Un cliente con la que pueda conectarse via http: http://www.amsn-project.net/ (tengo la sospecha que este cliente guarda tus contactos y tu dirección)




Licencia de Joomla(La mejor sintesis de una licencia GNU que he visto)



ImprimirE-Mail

Acerca de la Licencia GNU/GLP de Joomla Opensource


El software Joomla CMS es de uso gratuito, y de libre distribución (OpenSource), bajo licencia pública general (GNU/GLP). [ver traducción no oficial al español de la licencia GNU de software libre]

Es bueno que sepas que eres el propietario de TU sitio Joomla pero NO eres propietario del sistema Joomla que utilizas para el mismo (en el sentido en que no podrías venderlo como si fuese tuyo). Esto quiere decir que hay ciertas leyes de Copyright que hay que respetar. Ten en cuenta que el dinero que alguien paga por la construcción de un sitio utilizando Joomla no es por concepto de la compra del software (porque este es gratuito), sino que el cliente paga por los SERVICIOS que se derivan de Joomla: de instalación, configuración, diseño, y puesta en marcha del sitio, además del respectivo soporte.

De todas formas, jamás nadie podrá "cobrar" por la utilización de Joomla o impedir que alguien utilice este sistema si no se violan los términos de la licencia GNU/GLP, además es necesario que sepas que el Copyright sobre los contenidos de cada sitio le pertenecen al propietario del mismo. Una cosa es el copyright de Joomla y otra muy distinta es el copyright de los contenidos de un determinado sitio.

Resumiendo, en términos legales...

Vos SÍ podés:

  • Remover el crédito en el pié de página que tiene la leyenda: "powered by Joomla..."
  • Usar el software para cualquier propósito.
  • Estudiar cómo trabaja el sistema y adaptarlo a las propias necesidades, sin la necesidad de verte obligado a publicar o redistribuir esas modificaciones.
  • Redistribuirlo, es decir distribuir copias del sistema para que más personas puedan acceder a él.
  • Cobrar por redistribuir el sofware o por prestar servicios relacionados con el mismo.
  • Hacer mejoras al programa, y redistribuirlo bajo los mismos términos GNU/GLP, pudiendo agregar el propio Copyright, al original de Joomla, y anotando los cambios de código, enmiendas y agregaciones al código fuente original.

Vos NO podés ni debés:

  • Quitar las declaraciones de Copyright y créditos del código fuente de Joomla
  • Cobrar por el software Joomla en sí mismo (no confundir con cobrar por redistribución o por servicios relacionados al software)
  • Modificar o ampliar el código fuente de Joomla con el objeto de revender o cobrar por el software.
  • Alterar el código fuente de Joomla con el objeto de darle a este otra denominación o librarse de la licencia GNU/GLP, para propósitos de venta.
  • Alterar o eliminar la licencia GNU/GLP de distribución de Joomla.
  • Pretender que Joomla es tuyo, para hacer de él lo que quieras.

En resumen: La filosofía opensource se basa en la cooperación de desarrollo y la iniciativa de compartir software libremente sin que los usuarios tengan que pagar licencias ni derechos por el uso del mismo. Obviamente hay una clara realidad: en este mundo de "tiempos escasos" nadie regala nada por altruísmo puro. Los mismos desarrolladores de Joomla por ejemplo realizan soporte y desarrollos basados en Joomla de forma comercial a negocios o empresas privadas que solicitan sus servicios. Por ello digamos que las herramientas opensource son gratuitas, pero el tiempo de los desarrolladores no lo son. Y el tiempo significa dinero. Cualquier persona puede crear sitios con Joomla y cobrar por sus servicios y aquel que no tenga tiempo o ganas de hacerlo, tendrá que pagar por ello de la misma manera en que una persona que no tenga o disponga del dinero para pagar un desarrollo web tendrá que disponer de tiempo, trabajo, esfuerzo, e investigación para lograr sus propósitos.


fuente original:http://www.joomlaos.net/licencia-de-joomla.php

miércoles, 1 de septiembre de 2010

Algo de ingeniería poco convensional

Si alguna vez te has encontrado con el problema de meterle datos a un software propietario como generalmente son los de manejo de nomina los cuales tienen características muy restrictivas, como uno que yo conozco, que no voy a mencionar para no promoverlo, este no te permite agregar registros a la base de datos por que está encriptada, de modo que la única forma de meterle o sacarle datos es a travez de sus interfaces de usuario. Y que pasa si ya se tiene la base de datos de los empleados y se tiene que capturar de nuevo en ese sistema propietario por que alguien tiene mucho dinero para pagar su licencia (¡es su dinero!) , para no tener que hacer esto manualmente una solucion que no requiere mayor esfuerzo es un pequeño programa que manda teclasos en automatico, ¿como es esto? En un archivo de texto pongo la informacion cambinado con instrucciones del teclado y se corre como un sencillo escript que contendria algo como esto:

Abre programa: Nomicostoso //programa a manipular
presiona teclas: Alt A //accedemos al menu
presiona tecla: N //selecciona la opcion nuevo
presiona teclas: "leonel hernandez sandoval"
presiona teclas: Ctrl S //guarda el registro

y luego se repite para n registros.

Con lo facil que es alojar un proyecto en google code respecto de otros repositorios, comparto esta aplicación y si a alguien le pudiera servir de algo, siéntase libre de hacer con esta lo que desee.


sábado, 16 de enero de 2010

Solo para variar

Un hombre poseía 11 camellos, y dejó un curioso testamento, que decía que a su hijo mayor le daba la mitad de los camellos, a su hijo mediano le daba la cuarta parte, y al hijo menor la sexta parte. Cuando el hombre murió, los hijos quisieron repartir los camellos tal y como decía el testamento, pero vieron que no podían.

Mientras los hijos estaban pensando en cómo repartir los camellos, pasó por allí un sabio montado en su camello, al cual pidieron ayuda. El sabio juntó su camello con los 11 de los hijos.

Sabio: Bien, decidme cuántos camellos hay ahora.
Hijos: Hay doce camellos.
Sabio: Bien, la mitad de ellos, es decir, seis, serán para el hijo mayor. La cuarta parte de ellos, tres, para el hijo mediano. La sexta parte de ellos, dos, para el pequeño. He repartido en total los doce camellos, y sobra uno, el mío. El testamento se ha cumplido.

Los tres hijos quedaron conformes con el reparto, y el sabio se fue con su camello. En realidad el testamento no se ha cumplido al 100%, pues el hijo mayor tiene 6 camellos de 11, es decir, 6/11, que es algo más que 1/2. El mediano tiene 4 camellos de 11, es decir, 3/11, algo mayor que 1/4. Y el pequeño tiene 2 camellos de 11, es decir, 2/11, algo mayor que 1/6. Como se ve, el 1/12 sobrante se lo han repartido entre todos.

miércoles, 26 de noviembre de 2008

Support Vector Machine

Support vector machine es una técnica avanzada de IA para el reconocimiento de patrones basada en funciones kernel.
Bien y eso que!, bueno, bueno vamos a ver como se hace un svm para el proceso de aprendizaje supervisado de una compuerta xor. Puesto que en internet se encuentra mucha información acerca del tema, no voy a reparar en detalles, como lo serian los optimizadores de lagrange y las funciones kernel y todo el principio matemático(matrices, derivadas, sistemas de ecuaciones, etc), ya que mi objetivo es mostar una manera rápida de construir un svm con python y sympy, sin complicados procedimientos matemáticos, claro que también se puede hacer en matlab, pero bueno no nos gustan las cajas negras y por eso no lo hacemos en matlab.

Primero vamos a derivar manualmente, respecto de a1, a2, a3, a4:
a1 + a2 + a3 + a4 + a1*a4 + a2*a4 + a3*a4 - a1*a2 - a1*a3 - a2*a3 - 9*a1^2/2 - 9*a2^2/2 - 9*a3^2/2 - 9*a4^2/2
Y luego solucionamos el sistema de ecuaciones.

No, es una broma!, para eso tenemos las rutinas proporcionadas por sympy para no quebrarnos la cabeza.

Bien veamos el codigo.

from sympy import *

xor = [[-1,-1],[-1,1],[1,-1],[1,1]]
signos = [-1,1,1,-1]
literals = var('a1 a2 a3 a4')
equis = var('x1 x2')

alfa = []
for i in range(len(xor)):
alfa.append(signos[i] * literals[i])

alfas = Matrix(alfa)

k = zeros(len(xor))
for i in range(len(xor)):
for j in range(len(xor)):
k[i,j] = (1+(Matrix(xor[j]).transpose() * Matrix(xor[i]))[0])**2

ecuation = (alfas.transpose() * k * alfas)[0] * -1/2

for i in literals:
ecuation += i

siseq = diff(ecuation, literals)

solution = solve(siseq, literals)

def kernel(list):
nlist=[]
for i in list:
nlist.append([1, i[0]**2, i[0]*i[1]*sqrt(2), i[1]**2, i[0]*sqrt(2), i[1]*sqrt(2)])
return nlist

kersol = kernel(xor)

w = Matrix([0,0,0,0,0,0])

for i in range(len(xor)):
w += signos[i]*Matrix(kersol[i]) * solution[literals[i]]

compxor = Matrix(kernel([equis])[0]).transpose() * w


#entonces compxor nos debe dar como resultado -x1*x2 y es asi como se comporta una compuerta xor, donde x1 y x2 son la entradas, mas que ovio verdad.




Aquí vemos una imagen que nos representa dos clases ya separadas, esta imagen la tome de la aplicacion en linea: http://svm.dcs.rhbnc.ac.uk/pagesnew/GPat.shtml. Espero que este siempre disponible en línea, si no ya hare mi propia aplicación para graficar los resultados de la svm.

martes, 11 de noviembre de 2008

Matematicas con python

Ok basta de palabrería vamos ha ver algunas cosas de buena programación con python, antes que nada me gustaria platicarles hacerca de mi ultimo descubrimiento, se trata de sympy.

Sympy es una librería para calculo simbolico (cas), -¿qué es eso del calculo simbólico?, -a pues es una maravilla, se trata de un muy completo ambiente que puede hacer operaciones matemáticas entre números reales y símbolos. por ejemplo se pueden hacer operaciones como 2*a+4*a=6a, -¿y bien y esto tan sencillo para que puede servir?. A pues nos habre todo un mundo de posibilidades de calculo, por que este principio no solo aplica a la aritmética, sympy puede hacer operaciones de matrices, integración simbólica, algebra lineal, entre otras operaciones tal como lo haríamos en el cuaderno que llevamos a clases, además de las bondades del lenguaje de programación python.

Para mostrar algo de las posibilidades ilimitadas de cálculo de sympy voy a mostrar parte del código de un clasificador bayesiano, que es una técnica de reconocimiento de patrones, elaborado como tarea para la asignatura de inteligencia artificial en el Itesi.


#Como primera parte aquí tenemos dos vectores con par de puntos (x,y), que nos representan dos patrones linealmente separables:
w1 = [[2, 6], [3, 4], [3, 8], [4, 6]]
w2 = [[1, -2], [3, 0], [3, -4], [5, -2]]

#Ahora procederemos ha hacer algunas operaciones algebraicas y de matrices para separar la clase w1

#nótese que en la línea de abajo se dan de alta algunas variables simbólicas
vars = var('x y')
size = len(vars)

#este es un procedimiento para a calcular la media de un vector
#hasta aquí es solo código python
def mean(vector, dim):
mean = [0,0]
for i in range(0,dim):
for j in vector:
mean[i] += j[i]
mean[i]/=len(vector)
return mean

m1 = mean(w1, size)

#lo interesante viene a continuación, se trata de la conversión entre vectores y matrices
#y sus consecuentes operaciones
def matriz_sigma_inversa(vector, mean):
array_mtx = range(0,len(vector))
sum_mtx = zeros(len(mean))
for i in array_mtx:
array_mtx[i] = Matrix(vector[i]) - Matrix(mean)
sum_mtx += (array_mtx[i] * array_mtx[i].transpose())
return (sum_mtx * 1/len(vector)).inv()

#es aquí donde se realizan las operaciones simbólicas entre números y literales "x", "y"
def matriz_vector_mean(mean, literals):
return Matrix(literals) - Matrix(mean)

#wow podria ser esto mas facil!!!
mtx_sig_w1 = matriz_sigma_inversa(w1, m1)
mtx_med_w1 = matriz_vector_mean(m1, vars)
mtx_tran_w1 = matriz_vector_mean(m1, vars).transpose()
det_w1 = mtx_sig_w1.det()

#ahora tenemos la ecuación de la clase w1, hacer esto para la clase w2
gw1 = (mtx_tran_w1 * mtx_sig_w1 * mtx_med_w1 * -1/2)[0] + (ln(det_w1)*-1/2 + ln(0.5)).evalf()

#igualamos ha cero la ecuación
bayes = gw1-gw2

#y finalmente despejamos "y", lo cual nos dará como resultado una ecuación cuadrática
#que al ser graficado nos mostrara el hiperplano que separa alas clases w1 de w2
solve(bayes, y)

Bien eso es fácil, no son muchas operaciones pero imaginemos un vector de tres dimensiones con muchos mas puntos para graficar, esto si que llevaría mucho tiempo hacer a la antigua.


Ahora veamos la grafica con gnuplot de un espacio vectorial de tres dimenciones.

Por supuesto que esto se puede hacer todo desde python, ya hablaremos de la maravilla de gnuplot en otra ocacion.
.