Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Conoce mejor un paquete: java.lang

Conoce mejor un paquete: java.io y escritura en ficheros

Conoce mejor un paquete: java.util

Dejo a su disposicion esta guia rapidisima del paquete util de java….

Verificar que un pagina cumpla con el standart XHTML 1.0

Cuando hablamos de validar un website… hablamos de que sea cual sea el navegador que utilicemos para visualizar la misma ( siempre y cuando sean versiones actuales) esta siempre se visualizara de la manera correcta. (en terminos bulgares… se vera igual en todos los navegadores..)

* Firefox
* IE
* Safari



Por que preferir a firefox ???

Consejos para un sano y rapido Desarrollo de Software

En este articulo, aprenderemos alguna practicas que pueden reducir considerablemente los tiempos, costos y velocidad de produccion, cuando de un proyecto de desarrollo de software se trata.

Te recomiendo seguir estos consejos si realmente deseas disminuir la tension que por lo regular viene de la mano de un desarrollo.

Introduccion
El desarrollo de software actualmente implica colaboracion, donde se definen roles claros y actividades sobre un equipo de desarrollo. No importa que tan bien se implemente un proceso para el desarrollo de software sobre la organizacion X, o el mucho dinero que al final cuesta la ultima infreestructura en IT y sus herramientas, Continuamente veo los mismos problemas que incrementan el tiempo y agregan tiempo extra (anexando el factor riesgo a el proyecto software), a la ya programada fecha de entrega.

Suelen pasar cosas como estas, considera cuantas veces te ha pasado algo asi:

 • Se pierde tiempo esperando a que una solicitud en base de datos sea implementada (..eso lo miraba muy seguido en el tiempo que labore para telefonica movistar mexico..)
 • Tiempo muerto de medio dia o mas que eso a causal de una desicion de negocios a realizarce.
 • Se presentan retrasos despues de haber realizado alguna nueva libreria de programacion... y ya no se tiene tiempo para la curva de aprendizaje que viene con respecto a esta.
 • Tiempo que se pierde al buscar un bug sobre tu reciente Entorno de desarrollo.
 • El tiempo costoso de entrenamiento que se invierte sobre un nuevo miembro del equipo de desarrollo.

He contribuido en algunos proyectos propios y de diferentes industrias y he visto como importantes organizaciones se enfrentan a los retos de crear complejos proyectos de software. Pude observar que cada proyecto de software por lo regular fue administrado de maneras muy diferentes uno de el otro. Y en base a eso llegue a ciertas conclusiones en base a mis observaciones:

a) Mejorar los procesos de negocio antes de iniciar el desarrollo.
b) Crear un solido equipo de desarrollo.
c) Mejorar procesos para solicitudes de servicio.
d) Minimizar el uso de reportes para la medicion del software realizado.
e) Mejorar comunicacion con el equipo de negocios.
f) Usar el lenguaje de programacion indicado.
g) Usar la interface de desarrollo adecuada.

Como crear un solido equipo de Desarrollo ?
Uno de los mayores exitos de una compania de software es el haber consolidado un equipo de desarrollo con un largo historial de colaboracion. Los dias en que el software era creado por una sola persona han finalizado. La complejidad en los proyectos de software es lo que ahora demanda la industria.. complejidad que solo puede ser abordada mediante el trabajo en equipo.

Nadie deberia de pensar, que el equipo de desarrollo esta compuesto de “solo programadores” que son intercambiables y rotables a otros equipos. Un equipo de desarrollo debera de tener cierto nivel de estabilidad, ya que eso incrementara el nivel de colaboracion entre sus miembros. Entre mas tiempo trabajen juntos los desarrolladores entonces por consecuencia mejor sera su rendimiento. Desarrolladores experimentados no pueden ser remplazados como piezas de Lego con algun nuevo talento. Siempre se debera de buscar la permanencia de los miembros en el equipo.

Es necesario el motivar a los programadores como parte de la organizacion… para esto debes de considerar lo siguiente:

Paga bien
1.- Paga a tus programadores de manera relativa a la medida de tu organizacion y el retorno economico que ofrece el fruto de su trabajo.
2.- Ofrece incrementos salariales por anos basado en mejoras profesionales ofrecidas por la empresa. Recuerda que tus desarrolladores de software no son solo programadores.

Ofrece un claro esquema de carrera
Aun con un buen salario, algunos desarrolladores de software tienden a dejar sus puestos si la empresa para la que laboran no les ofrece un plan de carrera disponible. Por esa razon cuidadosamente se debe investigar los objetivos de cada miembro de tu equipo de desarrollo. Alguna gente desea ser promovida a posiciones administratibasy otros prefieren quedarce dentro del equipo de desarrollo. Cualquiera que sea la causa, el claro esquema de carrera debera de estar presente en la compania como una parte de la cultura de la compania.

Ofrece entrenamiento profesional
Enfoquemos esto al entrenamiento que otorge al equipo de desarrollo una ventaja competitiba en la organizacion.

Mantener un politica de “no tiempo extra o trabajo los fines de semana”
El desarrollo de software esta muy condicionado a la concentracion de los los desarrolladores y sus emociones. Una mala pieza de software puede ser el producto de el trabajo realizado sobre un entorno de trabajo malo, o del producto de trabajar en fin de semana con presiones.

Enfocarce en el progreso mas que en las hors trabajadas
Si una organizacion hace incapie en mantener un enfoque en el tiempo que el desarrollador pasa en la empresa… en lugar de enfocarce en el progreso de su trabajo.. estara cometiendo un error.. que a la larga termina por afecta la productibidad del equipo de trabajo.

Rotando roles sobre cada proyecto
Reta a los desarrolladores a jugar diferentes roles sobre un proyecto. Cada miembro obtendra con esto la oportunidad de adquirir distintos niveles de responsabilidad, logrando con esto una versatilidad que se traduce en el nunca fallar dentro de la rutina. Un ejemplo de esto seria: Retar un desarrollador a liderear un equipo de desarrollo en cierta ocacion, y en la siguiente oportunidad que ese desarrollador realice el diseno del software y finalmente en otra ocasion que este programador ejecute la implementacion, prueba y documentacion de otro proyecto.

Recompensas profesionales en base a conocimientos traidos del exterior
Si un desarrollador de software escribe un articulo tecnico, u obtiene un certificacion profesional este esfuerzo deberara de ser recompensado.

Mejorar los procesos de negocio antes de iniciar el desarrollo
El proceso de negocio en tu organizacion puede tener algunos pasos innecesarios que tal vez no esten estandarizados. Algunos pasos solo pueden ser solo trabajados por personal con experiencia con un cargo que requiere su ejecucion. Por lo general, la gente de los departamentos conoce el como ejecutar tarea que tienen que ver con su rol, pero puede no estar familiariarizado con el resto de procesos fuera de su departamento. Esto hace dificil el colaborar con sugerencias y mejoras hacia los procesos. El desarrollo de software es algo que solo es manejado por requerimientos derivados de procesos de negocio que ya estan implementados. Si el proceso de negocio no ha sido propiamente estandarizado o se hizo reingeniera antes de que el desarrollo de software empezara, algunas preguntas surgiran. Preguntas en base al retraso que representara esto… esto podria representar presiones hacia usted… preciones generadas por aquellos que toman las desiciones de negocios….

El desarrollo de software y la realizacion de reingenieria en los procesos de negocio por lo general no es algo que se pueda hacer en paralelo. La peor que se puede hacer es redefinir los procesos de negocio a la mitad de cualquier desarrollo de software.

Mini tutorial XML

Estoy seguro que algunos de los visitantes de gulsin.org alguna vez se habran preguntado que ondas con el XML.
Y han sacado sus conjeturas si es xml un lenguaje programacion?….que relacion tiene este con el html….. Cual es la sintaxis y reglas que este debe de seguir…. razon por la que escribo esto.

Siempre he pensado que es mucho mas facil y rapido leer a un tipo en la red que se da a entender en unas pocas palabras en el tutorial que el mismo publica, que leernos el libro de principio a fin del topico que andamos buscando, claro que el libro nos garantiza un buen conocimiento y resultado… pero seamos francos el tiempo en que se cocina este buen resultado suele ser de una semana como minimo a un mes… y por lo regular la gente se interesa en un tema en especifico que habra que presentar aplicado a su trabajo..(si de esto vive ) tal vez en una hora o 48 horas despues.

Por lo que este minitutorial abarca los conceptos mas fundamentales del XML:

1.- Introduccion al XML y sus Fundamentos
2.- Definiciones del tipo de Documento (DTDs)
3.- Espacios de nombres (Namespaces)

1.- Introduccion al XML y sus Fundamentos

1.1.- Relacion entre HTML Y XML

XML es un lenguaje de metamarcas, como lo HTML.
HTML actualmente ha dejado de existir como tal para convertirce en XHTML, lenguaje de metamarcas derivado del XML.
Por lo que podemos concluir que si ya usaste HTML, entonces ya tuviste contacto con XML sin saberlo.

XML es tan portable como lo es HTML ( todo aquel html que cumple con las normas w3c..aclarando.. ). Gracias a esto, al igual que una pagina html puede ser visualizada en solaris, linux, mac y windows, un documento XML tambien lo sera, y por esta razon se menciona que XML ofrece un formato ideal para la portabilidad de datos entre plataformas.

1.2.- Lo Fundamental del XML
Todo documento XML esta integrado por: Elementos vacios o no vacios, con o sin atributos y con o sin caracteres de Datos
Veamos un ejemplo de un documento XML que describe a una persona

persona-01.xml
xml1

Analicemos lo anterior… el tag “persona” se puede tomar como “nodo raiz” de mi documento persona-01.xml, mientras que “nombre y profesion” serian “nodos hijo”. El nodo “nombre” es un nodo vacio y este solo contiene atributos “nombre_pila y
apellido_paterno”. Mientras que el nodo “profesion” contiene el conjunto de caracteres “Ingeniero en Sistemas de computo” y por lo mismo a este no se le considera un nodo vacio. Los nodos vacios tienden a terminar con / o bien podriamos declarar el documento persona-01.xml de la siguiente forma y tambien seria correcto. Observece que aqui se aprecia mejor que “nombre” es un nodo vacio.

persona-01.xml
xml2

La linea 0 del documento persona-01.xml declara la version de xml, el tipo de codificacion y la opcion de usar o no un archivo extra que definira todas las posible partes de nuestro documento xml, cuando esta opcion esta en “yes” el archivo extra que define las partes de nuestro documento xml no sera requerido. El archivo extra recibe el nombre de DTD ( Definicion del tipo de documento ).

2.- Definiciones del tipo de Documento (DTDs)
El DTD es un archivo que condiciona que elementos pueden aparecer dentro de un documento XML.
Esto lo podemos entender agregando a nuestro documento persona-01.xml un DTD:

persona-01.xml
xml3

Bueno expliquemos linea por linea lo que dice este archivo DTD..
La primera linea dice… El elemento persona estara compuesto de 2 elementos, nombre y profesion.
La segunda linea dice… El elemento profresion contendra datos de caractarer parseables…(ese es el significado de PCDATA)
La tercera linea dice… El elemento nombre es un un elemento vacio.
Y La cuarta y ultima linea nos dice que nombre contendra 2 atributos del tipo Datos de Caracter… (ese es el significado de CDATA).

2.1-Validando documentos XML
La mayoria de las librerias que parsean XML (existen en perl, python, java.. etc.) al leer el documento XML lo validaran con respecto a su dtd. Aqui un ejemplo de documento xml que al ser cargado por el parser SAX (un parser XML en java), SAX detecta que el archivo dtd pide un elemento “profesion”… el cual no aparece en el documento invalid_persona.xml, ya que el usuario olvido incluirlo… entonces podemos concluir… que gracias a el archivo dtd, logramos darnos cuenta del error en el documento xml que estabamos parseando.

$ java sax.SAXCount -v invalid_persona.xml
[ERROR] "profesion must be declared"

Si deseas profundizar mas en las declaraciones de archivos DTD la informacion te la anexo a esta liga

3.- Espacios de nombres (Namespaces)
Los Espacios de nombres en XML cumplen 2 propositos:

* Distinguir entre elementos y atributos provenientes de diferentes vocabularios, pero que comparten el mismo nombre.
* Agrupar todos los elementos y atributos relacionados provenientes de una aplicacion XML, para que entonces un software pueda reconocer estos.

El primer proposito es facil de explicar, pero el segundo es mucho mas importante en la practica.

Los espacios de nombres son implementados al anexar un prefijo a cada elemento y atributo. Cada prefijo esta vinculado a una URI mediante xmlns:”prefijo”.

Aqui todo sobre los espacios de nombres

Me mudo a leon Gto.

.

Hola a todos los que me leen…
Este post es solo para avisarles que dejo el Distrito Federal.

Motivado por la idea muy personal de hay cosas mucho mejores, mas importantes aun que el exito profesional y el dinero como una de sus concecuencias. Me voy a leon en busca de ellas.

Hasta luego..

Tunning PostgreSQL 8.2 sobre GNU/LINUX

Autor: Ing.Edwin Plauchu
mail to: j4nusx@gmail.com

Instalando Postgresql
Antes de instalar “postgresql 8.2″ , verifiquemos que este, no este ya instalado, si esto no fuese asi utilice descargue las fuentes de postgresql de la ftp de postgres:


wget -c http://ftp7.de.postgresql.org/pub/ftp.postgresql.org/latest/postgresql-8.2.5.tar.bz2

Compilando Postgresql 8.2

Procedemos a desempaquetar nuestras fuentes

pianodaemon@pianodaemon:~> tar -xvjf ./postgresql-8.2.5.tar.bz2

Aplicaremos las opciones de compilacion que aqui se muestran:

./configure --prefix=/home/postgresql/ --without-zlib && make && make install

Explicacion de los parametros anteriormente citados:

–prefix=/home/postgresql/ <---- Instalara postgresql en el home del usuario del sistema "postgresql"

–without-zlib <---- Desactiva el uso de compresion en nuestras tablas, sacrificando espacio, pero ganando velocidad de lectura en archivo de disco.

El usuario postgresql

Postgresql solo podra ser ejecutado por el usuario postgresql, mismo que debera de pertenecer al grupo postgresql.
Asi que procederemos a la creacion del mismo y de su grupo, posteriormente asignaremos el directorio /home/postgresql, solo al usuario y grupo postgresql:

pianodaemon@pianodaemon:~> groupadd postgresql
pianodaemon@pianodaemon:~> useradd -d /home/postgresql/ -g postgresql -s /bin/bash postgresql
pianodaemon@pianodaemon:~> chown -R postgresql:postgresql /home/postgresql/

Configuración Post-Instalación

Vamos a crear un directorio data (directorio de archivos en disco que almancenan las tablas de nuestras bases de datos), esto lo haremos logeados como el usuario postgresql:

pianodaemon@pianodaemon:~> su - postgresql
postgresql@pianodaemon:~> pwd
/home/postgresql/
postgresql@pianodaemon:~> mkdir ./DATA

Inicializando el directorio data:

postgresql@pianodaemon:~> ./bin/initdb -D ./DATA/
The files belonging to this database system will be owned by user "postgresql".
This user must also own the server process.

The database cluster will be initialized with locale es_ES.UTF-8.
The default database encoding has accordingly been set to UTF8.

fixing permissions on existing directory ./DATA ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers/max_fsm_pages ... 32MB/204800
creating configuration files ... ok
creating template1 database in ./DATA/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    ./bin/postgres -D ./DATA
or
    ./bin/pg_ctl -D ./DATA -l logfile start

Si obtuviste la pantalla anterior, el directorio data fue inicializado con exito.

Shell Script requerido para el arranque y parada de Postgresql

El siguiente shell script, esta realizado en bash, para llevar a cabo su ejecucion:

#!/bin/sh
# Start/stop/restart postgresql.
#
# To start PostgreSQL automatically at boot, be sure this script is executable:
# chmod 755 /etc/rc.d/rc.postgres

# --> Before you can run PostgreSQL, you must have a database.  Use initd.
#
# Note that step one is becoming the 'postgres' user. It's important to do this
# before making any changes to the database, or postgres won't be able to write
# to it later

# Set up variables
PGROOT=/home/postgresql
PGDATA=/home/postgresql/DATA
PGUSER=postgresql
PGLOG="$PGDATA/postgres.log"
PGDAEMON="$PGROOT/bin/postmaster"
PGCTL="$PGROOT/bin/pg_ctl"

if echo 'c' | grep -s c >/dev/null 2>%1; then
  ECHO_N="echo -n"
  ECHO_C=""
else
  ECHO_N="echo"
  ECHO_C='c'
fi

set -e

# Start postgresql:
postgresql_start() {
  $ECHO_N "Starting PostgreSQL: "$ECHO_C
  su - $PGUSER -c "$PGDAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
  echo "ok"
}

# Stop postgresql:
postgresql_stop() {
  $ECHO_N "Stopping PostgreSQL: "$ECHO_C
  su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast" >>$PGLOG 
2>&1
  echo "ok"
}

# Restart postgreSQL:
postgresql_restart() {
  $ECHO_N "Restarting PostgreSQL: "$ECHO_C
  su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast" >>$PGLOG 
2>&1
  echo "ok"
  su - $PGUSER -c "$PGDAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
  echo "ok"
}

case "$1" in
  'start')
  postgresql_start
  ;;
  'stop')
  postgresql_stop
  ;;
  'restart')
  postgresql_restart
  ;;
  *)
  echo "Usage $0 {start|stop|restart}" 1>&2
  exit 1
  ;;
esac
exit 0

Optimizando PostgreSQL

El reto de nuestra afinación va a consistir en optimizar el uso de memoria para postgres, minimizando en lo posible el número de intercambios con la swap (pagein). El mejor ajuste de los parámetros de configuración será aquél que obtenga la máxima disponibilidad en memoria para la BD, sin perjudicar al resto de elementos, que también deben permanecer en memoria.

SHARED_BUFFERS

El número de shared_buffers es el parámetro que más afecta al rendimiento de PostgreSQL. Este valor, de tipo entero, indica el número de bloques de memoria o buffers de 8KB (8192 bytes) que postgres reservará, como zona de trabajo, en el momento del arranque para procesar las consultas. De forma predeterminada (en postgresql.conf), su valor es de 1000. Un número claramente insuficiente para conseguir un rendimiento mínimamente aceptable.

Estos buffers se ubican dentro de los denominados segmentos de memoria compartida. Es importante saber que el espacio ocupado por el número de buffers que pretendamos asignar, nunca podrá exceder al tamaño máximo que tengan los segmentos de memoria. En caso contrario, postgres se negará a arrancar avisando con un error que no puede reservar el espacio solicitado.

Una buena recomendación (lee el artículo de B. Momjian[1]) es la de empezar asignando un 10% del total de la memoria RAM para shared_buffers y a partir de ahí, ir aumentando o disminuyendo dicho porcentaje en función del rendimiento y la paginación.

Comenzamos:

El 10% de 1 GB: (1048576 KB/10) = 104857 KB
shared_buffers: (104857 KB/8 KB) = 13107

Asignamos este valor a la variable shared_buffers (postgresql.conf)

En Linux, de forma predeterminada, el tamaño de un segmento de memoria compartida es de 32MB. Podemos comprobarlo haciendo (el resultado es en nº de bytes):

postgresql@pianodaemon:~> cat /proc/sys/kernel/shmmax
33554432

El espacio que requiere el número de buffers, es superior al tamaño del segmento:

13107 buffers ocupan 107372544 bytes (13107 * 8192 bytes/bloque)
107372544 > 33554432

Asi que asignaremos al kernel de linux un nuevo tamaño de segmento por default(agregue esta linea en /etc/sysctl.conf).

kernel.shmmax=107372544

Para comprobar el rendimiento, aplica EXPLAIN[2] a tus consultas. Para ver la paginación del servidor, puedes usar herramientas como vmstat o ipcs (consulta sus páginas man).
[editar] WORK_MEM

Este parámetro configura el espacio de memoria que postgres utiliza para realizar ordenaciones de tablas o de resultados parciales de consultas, sobre todo en cláusulas ORDER BY, CREATE INDEX o MERGE JOIN.

Este valor es más dificil de configurar porque depende, por un lado, de lo grande que sean las tablas o resultados que hay que ordenar, y por otro, del número de peticiones simultáneas para esa misma consulta (para cada una se empleará la misma cantidad de memoria).

Una buen comienzo es asignar entre un 2% y un 4% del total de la memoria si prevemos pocos accesos simultáneos a grandes sesiones de ordenación y mucho menor, si esperamos muchos accesos simultáneos a sesiones de ordenación pequeñas. Como antes, lo mejor es ir probando distintos valores y ver en qué pueden afectar a la paginación adversa. El valor hay que expresarlo en KB.

En nuestro ejemplo, hemos optado por usar un 4% de la memoria:

El 4% de 1 GB: 41943 KB   (1048576 KB*4)/100
work_men = 41943

Como instalar Oracle 11g sobre Centos 5

Lo primero sera ajustar los siguiente parametros en el kernel… para esto, bastara con modificar el fichero /etc/sysctl.conf.
Y agregar la siguientes lineas.

# Parametros requeridos para Oracle
kernel.shmall =  2147483648
kernel.shmmax  =  2147483648
kernel.sem    = 1024 64000 1024 1024
kernel.shmmni = 4096
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=4194304
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=262144

Para que linux tome los cambios el kernel debemos ejecutar

$ sysctl -p

listo… si la anterior accion no te reporto ningun error, entonces podemos continuar.

Editemos tambien el archivo /etc/security/limits.conf :

* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536

En una consola de línea de comandos crear los directorios, usuarios y grupos requeridos por oracle:

$ mkdir /oracle && mkdir /oraInventory
$ groupadd dba && groupadd oinstall
$ useradd -c "Oracle software owner" -g oinstall -G dba oracle -d /home/oracle -s /bin/bash && passwd oracle
$ chown -R oracle.oinstall /oracle
$ chown -R oracle.oinstall /oraInventory

Una vez creado este usuario nos logeamos como el y procedemos a settear ( otro maldito verbo que no existe ) las variables de entorno que ha de requerir nuestra instalacion de Oracle y la ejecucacion de la base de datos en si. Asi que debemos adicinar estos valores en el archivo .bash_profile del usuario oracle.

export ORACLE_BASE=/oracle
export ORACLE_SID=ORA11
export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG=SPANISH_SPAIN.UTF8
unset USERNAME

Centos 5 no es una versión certificada, para que Oracle piense que se está instalando en un Oracle Linux Enterprise hacemos lo siguiente:

echo "Enterprise Linux Enterprise Linux AS release 4 (October Update 4)" > /etc/redhat-release

Ejecutamos la instalación ejecutando ./runInstaller y ahí es como una instalación normal.
Una vez finalizada la instalación dejaremos el archivo /etc/redhat-release como estaba con:

echo "CentOS release 5 (Final)" > /etc/redhat-release

java en todos lados … ?

« Entradas anteriores · Entradas mas recientes »