Monthly Archives: April 2008

Rebol, introducción.

Rebol es otro de los lenguajes que conocí cuando estaba en la Universidad, se veía prometedor para crear fácilmente scripts que involucraran acceso a la red. En ese entonces creo que no me agradó el licenciamiento comercial que tenía (o así lo entendí en su momento) y no profundicé mas en el tema. Casualmente hace poco visité su página (http://www.rebol.com/) y encuentro que su licencia es ahora gratuita: free and will always be free. It is for educational and general use, tanto en su versión básica (Core) para scripts de consola como su versión de escritorio (View) que incluye soporte para GUI.

Leyendo un poco acerca del estado actual y de su futuro próximo me he interesado nuevamente en el tema. Por estos días pienso darle una oportunidad al lenguaje con una tarea muy sencilla que tengo en mente, necesito crear un script sencillo de backup … para un Windows NT 4. Voy a ver cuantas maravillas se pueden hacer con Rebol.

Según el sitio REBOL significa "Relative Expression-Based Object Language" y fue desarrollado por Carl
Sassenrath
, quien fue responsable de la arquitectura de Amiga OS, a finales de los noventas creado para el desarrollo de programas enfocados a las redes y a la computación distribuída. Según se menciona, la meta de REBOL es la de crear una nueva arquitectura de como la información es almacenada, intercambiada y procesada entre diferentes dispositivos conectados a Internet a través de la integración entre conceptos de lenguajes de programación y conceptos de lenguajes de meta datos.

Algunas de las ventajas de REBOL es su alto nivel, el hecho de ser interpretado, su carácter multi plataforma (la documentación menciona que su versión básica se encuentra disponible en mas de 30 plataformas) y multi paradigma, tiene recolección de basura, manejo dinámico de memoria y excepciones entre otras cosas.

Mas información: http://en.wikipedia.org/wiki/Rebol.

Instalación rápida de PostgreSQL para Windows

Los siguientes son los pasos seguidos para instalar PostgreSQL bajo Windows en una unidad US

1. Descargar y descomprimir el archivo postgresql-8.3.1-1-binaries-no-installer.zip.

2. Mover el directorio \pgsql a la unidad USB, g:\ para este ejemplo.

3. Crear el directorio g:\pgsql\data.

4. Crear el repositorio de datos inicial.

dos> g:\pgsql\bin\initdb -D g:\pgsql\data

5. Editar el archivo de configuración de acceso para permitir las conexiones externas.

dos> notepad g:\pgsql\data\pg_hba.conf
# Allow any user on the local system to connect to any database under
# any database user name using Unix-domain sockets (the default for local
# connections).
#
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
local   all         all                               trust
# The same using local loopback TCP/IP connections.
#
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         127.0.0.1/32          trust
host    all         all         0.0.0.0/0             md5

6. Editar el archivo de configuración de la base de datos para permitir conexiones a través de TCP/IP y SSL.

dos> notepad g:\pgsql\data\postgresql.conf
listen_addresses = '*'
authentication_timeout = 1min		# 1s-600s
ssl = on				# (change requires restart)
ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'	# allowed SSL ciphers

7. Crear la llave primaria del servidor (server.key) y el certificado SSL (server.crt). Para esto es necesario contar con la distribución de OpenSSL y su directorio g:\OpenSSL\bin (o donde haya sido instalado) incluído en la variable de ambiente PATH. Tengase en cuenta que este paso es opcional y sólo deberá ejecutarse si se desea establecer el soporte para conexiones SSL con el motor de base de datos (ver parámetro ssl en el paso #6).

dos> cd g:\pgsql\data
dos> openssl req -new -text -out server.req
PEM pass phrase: ***CLAVESECRETA***
Country Name (2 letter code) [AU]: CO
State or Province Name (full name) [Some-State]: Caldas
Locality Name (eg, city) []: Manizales
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Personal Development
Organizational Unit Name (eg, section) []: Sistemas
Common Name (eg, YOUR name) []: jorgeivan
Email Address []: jimezam@gmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Ténganse en cuenta las siguientes consideraciones para especificar los datos mencionados anteriormente.

  1. La frase PEM (***CLAVESECRETA***) es una contraseña de seguridad del certificado, elíjala de acuerdo a sus criterios de seguridad.
  2. Los valores de los campos Country Name, State Name, Locality Name, Organization Name, Organizational Unit Name e Email Address son informativos y deben personalizarse según su propio contexto.
  3. El campo Common Name debe corresponder con el hostname de la máquina que tendrá el certificado (importante).
  4. El Challenge Password y el Optional Company Name pueden obviarse (dejarse en blanco).

La llave generada se encuentra protegida con contraseña, para removerla y permitir el inicio automático del motor de base de datos junto con el sistema operativo se debe realizar la acción siguiente.

dos> openssl rsa -in privkey.pem -out server.key
PEM pass phrase: ***CLAVESECRETA***
dos> del privkey.pem

Para firmar (self-signed) el certificado recién creado ejecutar la acción siguiente.

openssl req -x509 -in server.req -text -key server.key -out server.crt

8. Iniciar el motor de base de datos.

dos> postgres -i -D g:\pgsql\data

Si se desea redireccionar los mensajes de la base de datos a un archivo de log se deben agregar las siguientes modificaciones.

dos> postgres -i -D g:\pgsql\data >logfile 2>&1

Si se desea enviar el proceso del motor de base de datos a background se debe anteponer el comando start de Windows.

dos> start postgres -i -D g:\pgsql\data >logfile 2>&1

9. Modificar la contraseña de acceso del usuario de administración del motor de base de datos.

dos> psql -h 127.0.0.1 -c "ALTER USER USUARIO WITH PASSWORD 'CONTRASEÑA'" -d template1

Téngase en cuenta que debe reemplazarse a USUARIO con el nombre de usuario bajo el cual se ejecuta la base de datos, el mismo con el que se ejecutó initdb y postgres, así como CONTRASEÑA con la contraseña escogida para ese usuario.

10. Crear una base de datos.

dos> createdb.exe base_de_datos

11. Prueba de conexión a la base de datos.

dos> psql -W -U USUARIO base_de_datos

Enlaces de interés:

What's my IP ?

Este servicio nos indica cual es la dirección IP con la cual nos vemos desde Internet, esto es útil saberlo cuando estamos detrás de un proxy.  El servicio incluye además varias herramientas de redes, entre ellas escaneadores de puertos.

Enlace: http://www.whatsmyip.org/

Controladores para cables de datos Sony Ericsson

En la siguiente ubicación se pueden descargar los contraladores de los teléfonos Sony Ericsson mas difundidos.

Otros sitios de interés relacionados son los siguientes.

Manejo de punto flotante con MobileProcessing

Después de estas dos semanas de mucho trabajo, mucho cansancio, muchas cosas atrasadas, una operación de periodoncia y una amigdalitis que me impidió ir a clase este fin de semana y que apenas estoy sobrellevando hoy por fin pude volver a publicar algo.

Por otro lado, estaba preparando un ejemplo diferente para el artículo de las primitivas de imágenes, sin embargo este hace uso de operaciones con números reales y hasta donde había leido MP sólo soportaba valores numéricos enteros. Para suplir esta deficiencia MP provee las funciones itofp (de entero a punto flotante) y fptoi (de punto flotante a entero). La teoría se ve muy sencilla pero en la realidad me había enrredado bastante con las operaciones de mi ejemplo.

Si se desarrollan las aplicaciones para CLDC 1.1 ya no es necesario utilizar estas funciones de punto flotante, por el contrario, es posible utilizar los tipos de datos float y double convencionales y con ellas los métodos de la clase java.lang.Math de Java. Que pequeño detalle tan útil, me hubiera ahorrado media tarde de pruebas ;)

Para hacer esto utilizando el IDE de MP, acceda a los menúes File > Preferences y bajo la hoja Mobile seleccione el valor 1.1 del campo CLDC version.

Ya actualicé mi aplicación con esta mejora, sin embargo me topé con otro problema mayor: aparentemente MP no provee aún una función para dibujar arcos (segmentos de circunferencia) y sin ella mi aplicación queda a medias.

Seguiré investigando.

Primitivas de dibujo con MobileProcessing

De las cosas de MP que tenía pendiente revisar, aunque ya se han utilizado en varios ejemplos publicados hasta ahora, son las primitivas de dibujo que nos permitirán crear gráficos basados en puntos, lineas, triángulos, cuadrados, etc.

Estas son las funciones primitivas que provee MobileProcessing.

point(x, y)
Muestra un punto en la coordenada (x, y).
line(x1, y1, x2, y2)
Traza una línea desde (x1, y1) hasta (x2, y2).
triangle(x1, y1, x2, y2, x3, y3)
Dibuja un triángulo cuyos vértices se ubican en

(x1, y1), (x2, y2) y (x3, y3).

rect(x, y, ancho, alto)Dibuja un cuadrilátero cuya coordenada orígen es (x, y)

y se extiende con el alto y el ancho especificados.

quad(x1, y1, x2, y2, x3, y3, x4, y4)Dibuja un cuadrilátero cuyos cuatro vértices corresponden

a las coordenadas (x1, y1), (x2, y2), (x3, y3) y (x4, y4).

ellipse(x, y, ancho, alto)
Dibuja una elipse cuya coordenada orígen es (x, y) y se

extiende con el alto y el ancho especificados.

A continuación se muestran ejemplos de estas funciones primitivas.

PuntosLíneasTriángulosCuadrados
CuadriláterosElípsesPoligonos

Los polígonos, conjunto de vertices unidos por líneas, pueden crearse de manera libre utilizando la función vertex(x, y). Los llamados a esta función para crear los vértices deben ir inscritos este dos llamados a las funciones: beginShape() y endShape() respectivamente, las cuales enmarcan el inicio y el fin de la definición del polígono. La primera de estas últimas funciones viene con diferentes opciones de configuración según el tipo de polígono libre a generarse, consulte su documentación para información adicional.

La función color() permite crear variables de tipo color. La forma mas utilizada es basada en las definiciones RGB (Rojo – Verde – Azul) de los colores:

color c = color(102, 85, 34);  // Café utilizado en el triángulo del ejemplo.

Existen otras combinaciones de parámetros para manejar una escala de grises y el nivel de opacidad (alpha).

Las siguientes funciones gráficas se encuentran relacionadas con el manejo de colores.

background(color)Modifica el color del fondo.
fill(color)Hace que la figura dibujada por la primitiva esté rellena (si aplica) del color especificado.
noFill()Hace que la figura dibujada por la primitiva NO se encuentre rellena.
stroke(color)Modifica el color del contorno de la figura dibujada al especificado.
noStroke()Hace que la figura dibujada por la primitiva NO tenga contorno.
strokeWeight(grueso)Modifica el ancho de la línea de contorno (si aplica) al especificado.

Téngase en cuenta que las funciones fill hacen referencia al relleno del dibujo mientras que las funciones stroke hacen referencia a la línea exterior, es decir, su contorno.

Después del desarrollo del programa de ejemplo para este artículo concluyo lo siguiente con respecto a las funciones anteriormente mencionadas.

  1. La acción de la función fill aplica para rect, ellipse, triangle, quad y poligonos. No aplica para line o point.
  2. La acción de la función stroke aplica para todas las primitivas, en el caso de line y point les modifica su color.
  3. La acción de la función strokeWeight aplica para triangle, quad, line y poligonos. No aplica para rect, ellipse ni point, al menos con la versión 0007 de MP.

Para desplegar mensajes de texto a través de las primitivas de dibujo se deben realizar los siguientes pasos.

PFont fuente = null;Se crea el objeto que representará la fuente a utilizarse en el texto.
fuente = loadFont(familia, estilo, tamaño);Carga la fuente a utilizarse.

La familia puede ser FACE_SYSTEM, FACE_MONOSPACE o FACE_PROPORTIONAL.

El estilo puede ser STYLE_PLAIN, STYLE_BOLD, STYLE_ITALIC o STYLE_UNDERLINED.

El tamaño puede ser SIZE_SMALL, SIZE_MEDIUM o SIZE_LARGE.

Existen varias variaciones de esta función, consulte su documentación.

textFont(fuente);Asigna la fuente especificada como fuente activa.
text(mensaje, x, y, ancho, alto);Muestra en pantalla el texto mensaje ubicado en las coordenadas x, y de orígen y con un espacio disponible máximo de ancho x alto.

La aplicación de ejemplo para este artículo da uso de las funciones aquí expuestas mediante las siguientes instrucciones.

  • Las teclas izquierda (LEFT) y derecha (RIGHT) cambian la figura actual: rect, ellipse, triangle, quad, line, point y poligonos.
  • Las coordenadas de las figuras line, point y poligonos son generadas al azar, las demás son constantes.
  • Los colores, tanto de relleno como de contorno, son siempre calculados al azar.
  • Las teclas arriba (UP) y abajo (DOWN) aumentan o disminuyen el ancho de las líneas de las figuras (según aplique), esto es visible en modo sin relleno.
  • La tecla asterisco (*) modifica el modo de la figura entre con relleno y sin relleno. Inicialmente el modo con relleno se encuentra activo.
  • La tecla número (#) refresca la grafica que se muestra actualmente en la pantalla.

Enlace: ShapesDemo.

Virus HCQ9D-TVCWX-X9QRG-J4B2Y-GR2TT-CM3HY-26VYW-6JRYC-X66GX-JVY2D

Esta semana algunos equipos de la Fundación amanecieron con un nuevo virus, uno en VBS cuyo script se llama HCQ9D-TVCWX-X9QRG-J4B2Y-GR2TT-CM3HY-26VYW-6JRYC-X66GX-JVY2D.

Para solucionarlo hay que remover varios archivos y reparar algunas llaves del registro.  Por suerte encontré en el blog de MyGeekSide un script que remueve el virus.

Enlace: mata_virus_amvo_usb.vbs.

Aplicación SimpleAccesoDatosWs 0.1

El día de hoy desarrollé una aplicación extremadamente simple para obtener de manera rápida y fácil información de ciertas tablas del sistema de información de un cliente. La idea era hacer una aplicación muy simple pero flexible que permitiera incorporar nuevas consultas con relativa facilidad. El objetivo general era evitar la solicitud de permitir la conexión directa al motor de base de datos desde las oficinas del cliente hasta el servidor de producción para obtener la información y actualizar sus bases de datos internas. Está desarrollada en PHP utilizando la librería NuSOAP.

En el servidor donde se encuentra el servicio web se configuran cada uno de los servicios (orígenes de datos), estos se relacionan con una consulta SQL y con unas etiquetas que se reemplazarán dinámicamente según la información que se suministre durante el llamado.

El cliente para consumir el servicio debe especificar el URL del servicio web, el nombre del servicio solicitado y opcionalmente los parámetros a enviarse para personalizar la ejecución de la consulta SQL en la base de datos. El resultado obtenido del servidor es almacenado en el cliente como un archivo CSV. El cliente accede al servicio web a través de un script de línea de comando (CLI).

Para restringir el acceso al servicio web, el servidor puede limitar los rangos de direcciones IP desde los cuales es posible acceder a él.

Como mencioné, la aplicación es muy sencilla pero puede ser de utilidad para dar una solución rápida y simple a una situación similar o para basarse en ella y crear una solución mas elaborada y elegante.

Para mas información acerca del uso de la aplicación por favor consultar el Manual de usuario.

Enlace:

Aplicación UpTimeCheck 0.1

UpTimeCheck es una aplicación muy simple desarrollada en PHP para verificar y registrar que diferentes sitios web se encuentren en línea.

Esta aplicación corre como un script de CLI (command line interface) y puede ejecutarse por demanda o a través de un proceso cron como es más conveniente. En la configuración pueden especificarse los sitios a revisar sin ningún límite o restricción respecto a su cantidad y algunos parámetros adicionales para personalizar su funcionamiento.

Para más información acerca de la aplicación por favor consultar el archivo README de la misma.

Como para todo en la vida, se reciben sugerencias y reportes de problemas.

Enlace: uptime_0.1.zip

Tiempo del sistema con MobileProcessing

Las siguientes funciones permiten a los programas escritos en MP obtener la información de la fecha y hora del dispositivo en el cual se ejecutan.

day()Obtiene el día de la fecha del sistema
month()Obtiene el mes de la fecha del sistema.
year()Obtiene el año de la fecha del sistema.
hour()Obtiene las horas de la hora del sistema.
minute()Obtiene los minutos de la hora del sistema.
second()Obtiene los segundos de la hora del sistema.

Una función adicional relacionada con la fecha y hora del sistema es millis() la cual retorna la cantidad de milisegundos que han transcurrido desde el inicio de la aplicación.

Ejecutando el siguiente código en el emulador de SUN.

println("Fecha: " + day() + "/" + month() + "/" + year());
println("Hora: " + hour() + ":" + minute() + ":" + second());
println("Han transcurrido: " + millis() + " milisegundos");

Obtuve la siguiente información.

Fecha: 7/3/2008
Hora: 4:45:15
Han transcurrido: 18 milisegundos

Teniendo en cuenta que hoy es 6/4/2008 y que son las 11:45 pm, se concluye que debo investigar un poco mas acerca de la localización que toma el emulador.