Entries Tagged 'Programacion' ↓

Descomprimir archivos de un rpm

Seguramente muchos de ustedes han necesitado de algun archivo que esta contenido en un RPM y no han encontrado la manera de extraerlo.

Existe un programita llamado rpm2cpio. Por ejemplo lo que yo quise hacer es extraer los archivos del manual de MySQL en formato HTML de MySQL-server-4.1.12-1.i386.rpm

El comando para hacer esto es ubicar el archivo RPM y ejecutar:

rpm2cpio MySQL-server-4.1.12-1.i386.rpm | cpio -icduv *.htm

Y listo!

Esto extraera los archivos indicados en la carpeta actual incluyendo directorios.

Los argumentos de cpio:

i : Extrae los archivos
c : Formato portable
d : Crear directorios completos
u : Incondicional (reemplaza los archivos si existieran)
v : Muestra los archivos descomprimidos en pantalla

Grafos

Los grafos son un tipo de estructuras de datos; no voy a explicar exactamente de que se tratan los grafos pero pueden encontrar mas información al respecto aqui.

Llegar a implementar en forma básica listas, árboles y grafos es una parte importante en los inicios de la carrera de un programador. Por lo que estoy preparando pequeño artículo sobre como implementar grafos.

Lo interesante de este articulo, que desarrollé hace algunos años, es que lo combiné con un algoritmo de ordenación grafica basada en distancias y para que el parpadeo no moleste lo implementé con double buffering.

Aquí un recorte de muestra del programa en ejecución.

Grafo Visual C++

Pueden descargarse un demo ejecutable, por lo pronto, en el siguiente enlace:

grafos.zip

Cuando lo tenga completamente listo voy a publicarlo documentado y podrán descargarlo con código fuente que podran compilar en diferentes sistemas operativos. Espero que luego les pueda servir como punto de inicio y llegar mas lejos con las estructuras de datos.

Update: Pueden descargar el artículo de la siguiente dirección:

Implementacion de Double Buffer en Visual C++:
http://www.latindevelopers.com/vcpp/bitmap/doble-buffer/

Detectar el pais de procedencia del visitante en PHP

PHP Logo Los webmasters nos preocupamos mucho por saber quienes son los que visitan nuestras páginas, para ello utilizamos herramientas muy útiles como contadores de visitas, analizadores de tráfico, etc.

Por otro lado, uno puede programar su propio sistema de análisis de tráfico haciendo un extracto de todas las variables de entorno que contienen esta información. Dependiendo del servidor Web (Apache, IIS, etc.)

Hace mucho tiempo encontré una base de datos (actualizada periódicamente) que contiene todos los números de IP que se pueden encontrar en la red. Estos están almacenados en forma de rangos y también indican el País o la ubicación geográfica de cada rango. Con esta información es fácil determinar el país de procedencia del visitante simplemente con saber su número de IP.

La dirección donde pueden descargar esa base de datos es:

http://ip-to-country.webhosting.info/node/view/6

Dichos datos están delimitados por comas (CSV) con el fin de ser actualizados rápidamente a cualquier gestor de datos que lo permita. Incluyendo a MySQL por su puesto.

Importando el archivo csv en MySQL

El archivo que contiene la base de datos de IP tiene esta estructura:

"0033996344","0033996351","GB","GBR","UNITED KINGDOM"
"0050331648","0083886079","US","USA","UNITED STATES"
"0094585424","0094585439","SE","SWE","SWEDEN"
...

Paso 1: Crear la tabla ipdatabase (u otra que deseen) con la siguiente estructura:

CREATE TABLE ipdatabase
(
  ip_from int(10) unsigned,
  ip_to int(10) unsigned,
  country_code2 char(2),
  country_code3 char(3),
  country_name varchar(50),
  KEY ip_from (ip_from),
  KEY ip_to (ip_to)
);

Paso 2: Importar los datos con LOAD DATA:

LOAD DATA LOCAL INFILE 'ip-to-country.csv'
INTO TABLE test_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';

Paso 3. Finalmente escribir el codigo para detectar el pais:


<?$link = mysql_connect(“localhost” , [...] , [...]);mysql_select_db(“ipdatabase”,$link);

$sql = “SELECT country_code2,country_name     FROM ipdatabase “.       “WHERE IP_FROM<=inet_aton(’$REMOTE_ADDR’) “.       “AND IP_TO>=inet_aton(’$REMOTE_ADDR’) “;

if( $res = mysql_query($sql,$link)){  $row =mysql_fetch_row($res);  echo “<br>Numero de IP: <b>$REMOTE_ADDR:</b><br>”;  echo “Pais : “.$row[0].” - “.$row[1];  echo “<img src=/images/flags/”;  echo strtolower($row[0]).“.gif width=18 height=12>”;  mysql_free_result($res);}else{ echo mysql_error($link);}mysql_close($link);?>

He estado haciendo pruebas con esta base, pueden ver el script PHP en acción en esta dirección:
http://www.latindevelopers.com/country.php .

Este script lo integraré a Latindevelopers.com en las proximas semanas.

Update:
Habia olvidado poner el codigo fuente del archivo country.php:

Modificaciones a WordPress

Como habrán podido notar he mudado mi Blog hace ya mucho tiempo) de Blogger.com al sistema de publicación WordPress. WordPress esta escrito en PHP, la instalación es muy sencilla, es un súper blog-management absolutamente recomendable para quienes todavía no lo estén utilizando o piensan cambiar.

Desde el momento de la instalación he estado revisando el código fuente para hacer algunas modificaciones. El tema actual me gusta pero es muy común, así es que voy a tratar de hacer algunas mejoras de contenido. Tarea sencilla por que WordPress esta escrito en PHP y almacena los contenidos en MySQL.

WordPress Logo

Por lo pronto aumenté una sección de “Envíos Recientes” al estilo Blogger, y reacomodé el tema principal para poder incrustar los anuncios.

Para obtener los envíos anteriores al post actual utilizo la siguiente sentencia SQL en PHP, en el archivo single.php del tema por defecto:

$sql = "SELECT  year( post_date ) Anho,
          right(concat('0',month(post_date)),2) Mes,
          post_name,post_title FROM wp_posts
        WHERE binary `post_status` = 'publish'
          AND post_date  < '$post->post_date’
        ORDER BY  `post_date` DESC LIMIT 10″;

Todavia no he revisado la documentación de las funciones, por lo que el resultado de la consulta anterior puede obtenerse de otro modo.

Programmer’s Block

Los escritores y compositores alguna vez han tenido que padecer del “Bloqueo de Escritor”, es una situación en la cual el ingenio y la creatividad propia de ellos desaparece por un periodo de tiempo (días, meses, años) en el cual no pueden escribir un solo párrafo coherente.

Desde hace algunas semanas me encuentro en una situación similar, pero en este caso el término correcto sería “Bloqueo de Programador”… es decepcionarte sentarse frente al computador sin poder programar o continuar/modificar los proyectos que tengo pendientes. Lo único que he estado haciendo es responder mis correos y dedicar el tiempo libre a terminar de leer “El Codigo DaVinci”.

Estoy seguro que el stress es una de las causas de este mal. Voy a ver como “despejo” mi mente en estos días.

Fibonacci y el Código Davinci

El codigo Da VinciPara quienes estamos relacionados con la Programación y las Ciencias de la Computación, alguna vez nos hemos que tenido que topar opn la serie de Fibonacci, ya sea para programarla o para estudiar su comportamiento. Cada número de esta famosa serie se obtiene de la suma de los dos anteriores.

La serie de Fibonacci tiene muchas aplicaciones, no solo en la computación sino también en ciencias que en las cuales las matematicas aparentemente no tienen mucho que ver.

Me tomo por sorpresa leer acerca de ésta (y otras cosas mas) en el libro: El código da Vinci de Dan Brown, por que es utilizada para encriptar un mensaje. No solo se trata de la serie de Fibonacci sino también del numero Phi = 1.618 llamado también la divina proporción. Algunas cuestiones matematicas estan muy relacionadas con la naturaleza las cuales se debe tener en cuenta al momento de pintar un cuadro.

Escribiré un post acerca de este interesante libro cuado termine de leerlo. Mientras tanto…

Sabemos que generar estos números es sencillo de programar. Debido a que los valores de la serie se hacen grandes muy grandes, el reto es generar la mayor cantidad de numeros de Fibonacci. Los tipos de datos números en los lenguajes de programación (int, double, float) tienen sus límites y el asunto es romper esos límites.

El siguiente es un programa es la forma recursiva de obtener el numero N de la serie de Fibonacci:

unsigned long Fibonacci(unsigned int n)
{
    if ((n == 0) || (n == 1))
	{
        return 1;
	}
	else
	{
        return (Fibonacci(n -1 ) + Fibonacci(n - 2));
    }
}

Puede que el programa sea dañino para la salud del Sistema Operativo, por ello también les escribí una versión no recursiva.

unsigned long Fibonacci(unsigned int n)
{
    if ((n == 0) || (n == 1))
	{
        return 1;
	}

	unsigned long last = 1;
	unsigned long curr = 1;
	unsigned long tmp  = 0;

	while(n > 2)
	{
		tmp = curr;
		curr = curr + last;
		last = tmp;
		n--;
	}
	return curr;
}

Con la primera función el calculo del numero 30 de Fibonacci demorará a l rededor de 5 segundos, para el numero 40 demorará unos minutos dependiendo del procesador que tengan. Si utilizan una cray esto sucederá un unos cuantos milisegundos. Hay quienes dicen que una cray se sale de un bucle infinito en 6 segundos.

Con el segundo programa logré calcular el numero 47 (2971215073), a partir del numero 48 empieza el desbordamiento. Existen otras formas de obtener el esto de números.

El programa para probar cualquiera de las dos formas es:

int main(int argc, char* argv[])
{
	if(argc <= 1)
	{
		cout<<”Modo de uso :”<<endl;
		cout<<”\t”<<argv[0]<<” N “<<endl<<endl;
		return 1;
	}
	cout<<Fibonacci(atoi(argv[1]));
	cout<<endl;
	return 0;
}

Si tienen problemas para compilar no olviden agregar el parámetro –lstdc++ al gcc (linux)

EXPRESS OLE DB - Visual C++

Cuando uno empieza a desarrollar aplicaciones en Visual C++ y tiene la necesidad de acceder a datos, se presentan muchas alternativas para ello. Muchas de las alternativas no se llevan bien entre ellas mismas lo que hace que la migración o el cambio de tecnología sea doloroso (ADO, DAO, OLE DB, etc)

Sypram es una compañía que ha desarrollado una librería que permite realizar una conexión a una base de datos desde Visual C++: EXPRESS OLE DB es una librería completa que extiende el uso de OLE DB sin la complejidad de éste. Es de muy fácil utilización y una alternativa muy robusta para el acceso a base de datos en Visual C++.

Actualmente utilizo esta librería en mis aplicaciones, pero aun sigo utilizando DAO como segunda alternativa.

Lo mejor de todo es que esta librería es de de distribución LIBRE. Puede ser descargada desde:
http://sypram.com/Download.htm

ASCII Art

ASCII Art es una forma arte basado en caracteres ASCII (American Standart
Code for Information Interchange), el lienzo es un archivo de texto plano, y la herramienta cualquier editor de archivos de texto.

Encontré miles de paginas relacionadas con éste arte. Pero con un solo link basta, Google tiene en su directorio un completo repertorio de enlaces a páginas que contienen ASCII Art:

http://directory.google.com/Top/Arts/Visual_Arts/ASCII_Art/


 .'/,-Y"     "~-.
 l.Y             ^.
 /\               _\_
i            ___/"   "\
|          /"   "\   o !
l         ]     o !__./
 \ _  _    \.___./    "~\
  X \/ \            ___./
 ( \ ___.   _..--~~"   ~`-.
  ` Z,--   /               \
    \__.  (   /       ______)
      \   l  /-----~~" /      -Row
       Y   \          /
       |    "x______.^
       |           \
       j            Y

Este arte se ha extendido tanto que existen herramientas como Figlet para los tipos de letra, aqui una muestra:

 _          _   _           _                _
| |    __ _| |_(_)_ __   __| | _____   _____| | ___  _ __   ___ _ __
| |   / _` | __| | '_ \ / _` |/ _ \ \ / / _ \ |/ _ \| '_ \ / _ \ '__|
| |__| (_| | |_| | | | | (_| |  __/\ V /  __/ | (_) | |_) |  __/ |
|_____\__,_|\__|_|_| |_|\__,_|\___| \_/ \___|_|\___/| .__/ \___|_|

También se han desarrollado técnicas que convierten una imagen de mapa de bits en un ASCII Art, en este caso se utilizan técnicas y algoritmos avanzados que tienen que ver con la tonalidad y densidad de los caracteres.

ASCII Art

En este enlace pueden ver esta fotografía representada en formato ASCII:

http://www.latindevelopers.com/ivancp/images/picture.htm

de navisoft a latindeveloper

Muchos de nosotros adoptamos (o se nos denomina) con seudónimo esto sucede cuando empezamos nuestra vida en el ciberespacio o cuando nuestros amigos simplifican nuestros nombres, comportamiento o parecido con algo. Algunos toman especial atención a la forma o pronunciacióndel nick, en fin… Incluso se pueden encontrar nick’s sumamente raros o extravagantes (huachafos) aqui una muestra de algunos nick’s que pueden ser considerados dentro de esa clasificación:

- - –^[nick]^– - -

•·.·´¯`·.·• nick•·.·´¯`·.·•

`·.¸¸.·´´¯`··._.· nick`·.¸¸.·´´¯`··._.·

(¯`·._) nick(¯`·._)

¯¨’*·~-.¸¸,.-~*’ nick¯¨’*·~-.¸¸,.-~*’

Oº°‘¨ nick¨‘°ºO

Algunos adoptan nombres de personajes famosos como neo o morfeo (de Matrix) en combinación de caracteres extraños que adornen la espresión.

En realidad, depende de cada uno. Es como la tonada de los celulares.

En el caso del mio (navisoft) empezó gracias a que una gran amiga (Danitza) me empezo a decir “navi” (inversa de ivan) y como casi todos los fanaticos de la programación (y todo lo relacionado) hice una combinación este apodo con “soft” … algo huachafo hoy en dia… Me quedé con ese nick varios años hasta hoy.

Hoy decidí cambiar por muchas razones, entre ellas por que “navisoft” ya es una marca registrada y ya no me agrada. Por otro lado Latindevelopers.com ha crecido y no se ve bien que el admin tenga un nick infantil como navisoft.

De ahora en adelante cambio de nick pero seré el mismo… es mas trataré de mejorar en todo lo que pueda… por que nadie es perfecto.

Ahora mi nick es “latindeveloper”.

MySQL cada vez mejor

MySQL esta con nosotros desde hace ya mucho tiempo. Hemos podido notar que este gestor esta evolucionando cada vez y se esta convirtiendo en el gestor de datos que todos desearíamos que fuese.

MySQL se ha convertido en una seria amenaza para los gestores de datos como Oracle o SQL Server.

Segun un artíulo que encontre por la red:

MySQL toma nuevo impulso y ya es una seria amenaza para Oracle, IBM y Microsoft
Según varios analistas, la base de datos de código abierto MySQL puede convertirse en una serie competencia para gigantes como Oracle, IBM y hasta Microsoft. La última versión de esta plataforma libre incluye nuevas características -como sub-búsquedas y un nuevo formato binario- que fortalecen aún más su posición como una alternativa a las grandes empresas.

Estas no son novedades para quienes utilizamos constantemente MySQL, pero el resto ya lo esta empezando a tomar en serio.