<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title></title>
	<atom:link href="http://www.monstruillo.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.monstruillo.com</link>
	<description></description>
	<pubDate>Tue, 07 Aug 2007 21:09:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Clase acceso a bases de datos *.mdb (MS Access)</title>
		<link>http://www.monstruillo.com/archives/16</link>
		<comments>http://www.monstruillo.com/archives/16#comments</comments>
		<pubDate>Tue, 07 Aug 2007 21:09:08 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/16</guid>
		<description><![CDATA[Hace poco me vÃ­ en la necesidad de acceder a unas tablas en unas bases de datos access (*.mdb) y acabÃ© escribiendo esta entrada.
Es sencillo y funciona, como digo al final de la entrada, pero es engorroso a mÃ¡s no poder de modo que acabÃ© escribiendo una pequeÃ±a clase para conectar con una base de [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco me vÃ­ en la necesidad de acceder a unas tablas en unas bases de datos access (*.mdb) y acabÃ© escribiendo <a target="_blank" title="Access, ODBC y WinAPI" href="http://www.monstruillo.com/archives/14">esta</a> entrada.</p>
<p>Es sencillo y funciona, como digo al final de la entrada, pero es engorroso a mÃ¡s no poder de modo que acabÃ© escribiendo una pequeÃ±a clase para conectar con una base de datos access, hacer consultas (SELECTS, INSERTS, UPDATES &#8230; vamos cositas bÃ¡sicas).</p>
<p><a target="_blank" title="Zip de la clase AccessDB" href="http://www.monstruillo.com/wp-content/uploads/2007/08/accessdb.zip">AquÃ­</a> hay un zip con la cabecera y el cuerpo de la clase.</p>
<p>Para comenzar a utilizarla, como ya dije en la entrada anterior hay que enlazar el programa con la biblioteca <span style="font-weight: bold">odbc32.lib</span>. AdemÃ¡s de eso es probalbe que debais cambiar algÃºn #include <> para amoldarlo a donde pongais los archivos. Yo siempre uso una estructura de directorios del tipo de src\headers y src\fonts de modo que el #include en el cuerpo de la clase aparece #include &#8220;..\headers\accessdb.h&#8221;.</p>
<p>Una breve explicaciÃ³n de uso de la biblioteca.</p>
<p>Lo primero que se debe hacer es crear el objeto AccessDB para establecer la conexiÃ³n y lanzar las consultas:</p>
<p style="margin-left: 40px">AccessDB conn;</p>
<p>Una vez tenemos el objeto conn creado ya podemos establecer la conexiÃ³n (capturando errores):</p>
<p style="margin-left: 40px">if (conn.fileConnect(pathToMDBFile) < 0) {</p>
<p style="margin-left: 60px">char errstr[1024];</p>
<p style="margin-left: 60px">conn.getStrError(errstr);</p>
<p style="margin-left: 60px">// se hace lo que sea con este errstr</p>
<p style="margin-left: 60px">return -1; // por ejemplo</p>
<p style="margin-left: 40px">}</p>
<p>Ahora ya estamos conectados y podemos lanzar consultas SQL a diestro y siniestro</p>
<p style="margin-left: 40px">conn.sendQuery(&#8221;SELECT * FROM tablilla_molona&#8221;); // si devuelve < 0 se ha producido un error</p>
<p>En este caso es conveniente recoger los datos para hacer luego con ellos lo que quieras. sendQuery, cuando se usa con un SELECT genera una tabla de resultados de f filas por c columnas (una tabla FxC) y para obtener los datos de ella se hace del siguiente modo:</p>
<p style="margin-left: 40px">// vamos a rellenar una listview (por ejemplo) con todos los datos encontrados:</p>
<p style="margin-left: 40px">int filas = conn.getRows();</p>
<p style="margin-left: 40px">int cols = conn.getCols();</p>
<p style="margin-left: 40px">for (int f=0; f < filas; f++) {</p>
<p style="margin-left: 60px">for (int c=0; c < cols; c++) {</p>
<p style="margin-left: 80px">char valor[1024];</p>
<p style="margin-left: 80px">conn.getData(f, c, valor);</p>
<p style="margin-left: 80px">// aquÃ­ harÃ­amos algo con valor</p>
<p style="margin-left: 60px">}</p>
<p style="margin-left: 40px">}</p>
<p>Una vez hecho todo solo queda desconectar la conexiÃ³n:</p>
<p style="margin-left: 40px">conn.Disconnect();</p>
<p>Y con esto y un bizcocho&#8230; espero que os sea de utilidad a alguno. Y si lo ampliÃ¡is o mejorÃ¡is de algÃºn modo no dejÃ©is de notificÃ¡rmelo y pasarme el nuevo cÃ³digo que estarÃ© encantado de colgarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/16/feed</wfw:commentRss>
		</item>
		<item>
		<title>Access, ODBC y WinAPI</title>
		<link>http://www.monstruillo.com/archives/14</link>
		<comments>http://www.monstruillo.com/archives/14#comments</comments>
		<pubDate>Wed, 09 May 2007 15:13:41 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/14</guid>
		<description><![CDATA[Â¿CÃ³mo acceder a bases de datos de MS Access desde ODBC usando las WinAPI?
Para comenzar se debe enlazar la biblioteca odbc32.lib e incluir las cabeceras sql.h, sqlext.h y sqltypes.h.
Una vez echo esto ya se puede comenzar a llamar a las funciones de la ODBC API.
Para establecer una conexiÃ³n ODBC con un archivo .mdb (MS Access) [...]]]></description>
			<content:encoded><![CDATA[<p>Â¿CÃ³mo acceder a bases de datos de MS Access desde ODBC usando las WinAPI?</p>
<p>Para comenzar se debe enlazar la biblioteca <span style="font-weight: bold">odbc32.lib</span> e incluir las cabeceras <span style="font-weight: bold">sql.h</span>, <span style="font-weight: bold">sqlext.h</span> y <span style="font-weight: bold">sqltypes.h</span>.</p>
<p>Una vez echo esto ya se puede comenzar a llamar a las funciones de la ODBC API.</p>
<p>Para establecer una conexiÃ³n ODBC con un archivo .mdb (MS Access) hay que seguir estos pasos:</p>
<div style="margin-left: 40px">1. Alojar memoria para un entorno ODBC e inicializarlo.</div>
<blockquote>
<div style="margin-left: 40px">SQLHENV env; // El entorno</div>
<div style="margin-left: 40px">SQLRETURN ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &#038;env);</div>
<div style="margin-left: 40px">// ret = { SQL_SUCCESS | SQL_SUCCESS_WITH_INFO | SQL_INVALID_HANDLE | SQL_ERROR }</div>
<div style="margin-left: 40px">SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);</div>
</blockquote>
<div style="margin-left: 40px">2. Alojar memoria para un manejador de conexiÃ³n y realizar la conexiÃ³n.</div>
<blockquote>
<div style="margin-left: 40px">SQLHDBC dbc; // El manejador de conexiÃ³n</div>
<div style="margin-left: 40px">ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &#038;dbc);</div>
<div style="margin-left: 40px">ret = SQLDriverConnect(dbc, (HWND)NULL, (SQLCHAR *) &#8220;DRIVER={Microsoft Access Driver (*.mdb)};, SQL_NTS, DBQ=D:\\basedatos.mdb&#8221;, outConnStr, outConStrLen, &#038;retOutConnStrLen, SQL_DRIVER_COMPLETE);</div>
<div style="margin-left: 40px">// ret = { SQL_SUCCESS | SQL_SUCCESS_WITH_INFO | SQL_NO_DATA | SQL_INVALID_HANDLE | SQL_ERROR }</div>
</blockquote>
<p>Una vez tenemos el manejador de conexiÃ³n podemos comenzar a lanzar sentencias SQL sobre esta conexiÃ³n, para ello seguiremos los siguientes pasos:</p>
<div style="margin-left: 40px">1. Alojar memoria para el manejador de sentencias:</div>
<blockquote>
<div style="margin-left: 40px">SQLHSTMT stmt;</div>
<div style="margin-left: 40px">ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &#038;stmt);</div>
<div style="margin-left: 40px" /></blockquote>
<div style="margin-left: 40px">2. Crear y lanzar la sentencia SQL:</div>
<blockquote>
<div style="margin-left: 40px">SQLCHAR sentencia[1024];</div>
<div style="margin-left: 40px">char tabla[] = &#8220;variable&#8221;; // o lo que sea, es solo una excusa para crear la sentencia <img src='http://www.monstruillo.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </div>
<div style="margin-left: 40px">sprintf(sentencia, &#8220;SELECT * FROM %s&#8221;, tabla);</div>
<div style="margin-left: 40px">SQLExecDirect(stmt, sentencia, sizeof(sentencia));</div>
</blockquote>
<div style="margin-left: 40px">3. Recuperar los datos si los hay:</div>
<blockquote>
<div style="margin-left: 40px">SQLSMALLINT columns;</div>
<div style="margin-left: 40px">SQLNumResultCols(stmt, &#038;columns);</div>
<div style="margin-left: 40px">// Ahora vamos fila por fila sacando las columnas</div>
<div style="margin-left: 40px">while (SQL_SUCCEEDED(SQLFetch(stmt))) {</div>
<div style="margin-left: 80px">SQLUSMALLINT i;</div>
<div style="margin-left: 80px">for (i=0; i <=columns; i++) {</div>
<div style="margin-left: 120px">char buf[1024];</div>
<div style="margin-left: 120px">SQLINTEGER len;</div>
<div style="margin-left: 120px">ret =  SQLGetData(stmt, i, SQL_C_CHAR, buf, sizeof(buf), &#038;len);</div>
<div style="margin-left: 120px">if (SQL_SUCCEEDED(ret)) {</div>
<div style="margin-left: 160px">if (len == SQL_NULL_DATA) strcpy(buf, &#8220;NULL&#8221;);</div>
<div style="margin-left: 160px">// AHORA EN &#8220;buf&#8221; tenemos un dato tratable como una cadena obtenido de la base de datos</div>
<div style="margin-left: 120px">}</div>
<div style="margin-left: 80px">}</div>
<div style="margin-left: 40px">}</div>
<div style="margin-left: 40px">El &#8220;ret&#8221; de SQLGetData puede ser (SQL_SUCCESS | SQL_SUCCESS_WITH_INFO | SQL_NO_DATA | SQL_STILL_EXECUTING | SQL_ INVALID_HANDLE | SQL_ERROR).</div>
</blockquote>
<div style="margin-left: 40px">4. Se liberan los manejadores, en este mismo orden:</div>
<blockquote>
<div style="margin-left: 40px">SQLFreeHandle(SQL_HANDLE_STMT, stmt);</div>
<div style="margin-left: 40px">SQLFreeHandle(SQL_HANDLE_DBC, dbc);</div>
<div style="margin-left: 40px">SQLFreeHandle(SQL_HANDLE_ENV, env);</div>
</blockquote>
<p>Bien sencillo y funciona.<br />
Ale.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/14/feed</wfw:commentRss>
		</item>
		<item>
		<title>Poner un icono en la TrayIcon con WinAPI</title>
		<link>http://www.monstruillo.com/archives/13</link>
		<comments>http://www.monstruillo.com/archives/13#comments</comments>
		<pubDate>Sat, 17 Mar 2007 13:23:44 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/13</guid>
		<description><![CDATA[Â¿CÃ³mo hacer lo mismito que hace el Messenger o el Skype para poner su iconcico en ese rectangulito al lado de la hora en la barra de Windows (a partir de ahora &#8216;TrayIcon&#8217;, para abreviar)?
Hace poco vi en GetAFreeLancer.com la peticiÃ³n de alguien para hacer un programa que entre otras cosas se &#8220;iconificara&#8221; en la [...]]]></description>
			<content:encoded><![CDATA[<p>Â¿CÃ³mo hacer lo mismito que hace el Messenger o el Skype para poner su iconcico en ese rectangulito al lado de la hora en la barra de Windows (a partir de ahora &#8216;TrayIcon&#8217;, para abreviar)?</p>
<p>Hace poco vi en <a title="Get A Free Lancer" target="_blank" href="http://www.getafreelancer.com">GetAFreeLancer.com</a> la peticiÃ³n de alguien para hacer un programa que entre otras cosas se &#8220;iconificara&#8221; en la trayicon y me preguntÃ© Â¿cÃ³mo harÃ­a yo eso? asÃ­ que me puse a investigar un poco (Â¡viva google y las MSDN!) y esto es lo que saquÃ© en claro:</p>
<p>Lo primero que se necesita para poder poner el icono de una aplicaciÃ³n en la trayicon es tener una aplicaciÃ³n con icono&#8230; :P.</p>
<p>Para poner un icono vamos a necesitar unas estructuras de datos y unas funciones que se encuentran en shell32.lib (o shel32.dll si os van mÃ¡s las dlls) con los prototipos de las funciones en shellapi.h, de modo que hay que hacer que el compilador enlace esta librerÃ­a y hay que aÃ±adir el include para . AdemÃ¡s vamos a necesitar definirnos un mensaje para que se comuniquen el iconillo en el trayicon y nuestra aplicaciÃ³n, esto podemos hacerlo asÃ­:</p>
<p>#define MSG_TRAYICON WM_USER + 1</p>
<p>Mediante este mensaje el icono del trayicon le notificarÃ¡ a la aplicaciÃ³n los eventos de ratÃ³n que se hagan en su Ã¡rea (no se si le notificarÃ¡ mÃ¡s eventos, como alguno de teclado, he leido tanto que no lo harÃ¡ como que sÃ­, pero no lo he probado me queda pendiente hacerlo).</p>
<p>Vamos a suponer que tenemos un botoncico que al hacer click sobre Ã©l, la aplicaciÃ³n se nos iconifica en el trayicon y que luego, al hacer doble click con el botÃ³n derecho sobre el icono la aplicaciÃ³n vuelve a mostrarse y el iconillo del trayicon desaparece. Y vamos a suponer que el botoncico tiene un identificador tal que asÃ­: IDICONIFICAR.</p>
<p>Entonces, en la funciÃ³n de gestiÃ³n el bucle de mensajes principal (WndProc) despuÃ©s de capturar el mensaje de el WM_COMMAND (donde se caputra el click en los botones) tendrÃ­amos algo asÃ­ para capturar el click en IDICONIFICAR:</p>
<p>switch(LOWORD(wParam)) {</p>
<p>case IDICONIFICAR:</p>
<p>NOTIFYICONDATA data;</p>
<p>data.cbSize = sizeof(data);<br />
data.hWnd = hWnd;<br />
data.uID = 10001;<br />
data.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICONCILLO));<br />
data.uFlags = NIF_ICON|NIF_TIP | NIF_MESSAGE;<br />
strcpy(data.szTip, &#8220;Estoy iconificao, hazme doble click&#8221;);<br />
data.uCallbackMessage = MSG_TRAYICON;</p>
<p>Shell_NotifyIcon(NIM_ADD, &#038;data);<br />
ShowWindow(hWnd, SW_HIDE);<br />
break;</p>
<p>// &#8230; demÃ¡s botones</p>
<p>}</p>
<p>Con la estructura <span style="font-weight: bold">NOTIFYICONDATA</span> preparamos el iconillo que pondremos en el trayicon:<span style="font-weight: bold">data.cbSize</span> es para proveer algo de seguridad a la hora de leer luego la estructura (si no se pone, no funciona porque no leera nada),<span style="font-weight: bold"> data.hWnd</span> es ventana de la aplicaciÃ³n que se iconificarÃ¡, <span style="font-weight: bold">data.uID</span> es un identificador para el icono en el trayicon, <span style="font-weight: bold">data.hIcon</span> es el manejador del icono que se pondrÃ¡ en el trayicon, <span style="font-weight: bold">data.hTip</span> es el mensaje que se mostrarÃ¡ al dejar el puntero del ratÃ³n sobre el icono durante un momentito, <span style="font-weight: bold">data.uCallbackMessage</span> es el mensaje que hemos creado para que se comuniquen el icono en la trayicon y la aplicaciÃ³n y <span style="font-weight: bold">data.uFlags</span> indica a que campos de la estructura data se va a hacer caso, en este caso al icono, al tip y al mensaje que compartirÃ¡n.</p>
<p>Una vez cargada la estructura usamos Shell_NotifyIcon() para actuar sobre trayicon, se usa esta funciÃ³n tanto para aÃ±adir (NIM_ADD), como para modificar el icono (NIM_MODIFY) o para quitarlo (NIM_DELETE). Como veis se le pasa la acciÃ³n (NIM_*) y la estructura. DespuÃ©s de esto, o antes, segÃºn os apetezca se esconde la aplicaciÃ³n (poner el icono en el trayicon no hace que la aplicaciÃ³n desaparezca de la pantalla, hay que quitarla) con ShowWindow(hWnd, SW_HIDE).</p>
<p>Vale, en este punto la aplicaciÃ³n ya es capaz de &#8220;iconificarse&#8221;, pero Â¿cÃ³mo hacemos para volverla mostrar cuando hago doble click con el botÃ³n izquierdo sobre el icono (por poner un ejemplo)?</p>
<p>Pues en la misma funciÃ³n de control del bucle de mensajes (WndProc, por ejemplo), cuando se capturan los mensajes (switch(message)) como WM_COMMAND, WM_INITDIALOG, etc&#8230; AquÃ­ podemos aÃ±adir algo asÃ­:</p>
<p>case MSG_TRAYICON:</p>
<p>NOTIFYICONDATA data;</p>
<p>data.cbSize = sizeof(data);<br />
data.hWnd = hWnd;<br />
data.uID = 10001;</p>
<p>// El mensaje enviado por el icono estÃ¡ en lParam<br />
switch (lParam) {<br />
case WM_LBUTTONDBLCLK:<br />
Shell_NotifyIcon(NIM_DELETE, &#038;data);<br />
ShowWindow(hWnd, SW_SHOW);</p>
<p>}<br />
break;</p>
<p>}</p>
<p>Ale, asÃ­ de simple&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/13/feed</wfw:commentRss>
		</item>
		<item>
		<title>Manejar BLOBs en MySQL con Perl</title>
		<link>http://www.monstruillo.com/archives/12</link>
		<comments>http://www.monstruillo.com/archives/12#comments</comments>
		<pubDate>Wed, 14 Feb 2007 12:55:20 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/12</guid>
		<description><![CDATA[Antes que nada hay que explicar lo que es un BLOB: Un BLOB es un tipo de datos SQL y su nombre viene de Binary Large OBject y teneis algo mÃ¡s de infromaciÃ³n en la Wikipedia.
Al principio me daba un poquillo de miedo atacar este tipo de datos y no estaba seguro de que fuera [...]]]></description>
			<content:encoded><![CDATA[<p>Antes que nada hay que explicar lo que es un BLOB: Un BLOB es un tipo de datos SQL y su nombre viene de <strong>B</strong>inary <strong>L</strong>arge <strong>OB</strong>ject y teneis algo mÃ¡s de infromaciÃ³n en la <a target="_blank" title="BLOB en la WikiPedia" href="http://es.wikipedia.org/wiki/BLOB">Wikipedia</a>.</p>
<p>Al principio me daba un poquillo de miedo atacar este tipo de datos y no estaba seguro de que fuera buena idea, pero despuÃ©s de ir leyendo por ahÃ­ (no encuentro ahora los links) me acabÃ© convenciendo de que es una buena idea, primero porque te ahorras i-nodes, en lugar de usar un i-node por cada archivo usas un par de i-nodes para todos al estar en una base de datos. Y ademÃ¡s con esto, y al ser archivos multimedia plenamente soportados en todos los sitemas operativos, esto hace mÃ¡s fÃ¡cilmente portable la aplicaciÃ³n. AdemÃ¡s de eso, resulta que es facilÃ³n.<br />
Bueno, <span style="font-style: italic">anem per feina</span>.</p>
<p>Lo primero importar el mÃ³dulo para manejar bases de datos en Perl, yo uso DBI con el DBD_MySQL y si necesitas saber el tipo del archivo como ocurre en mi caso puedes importar tambiÃ©n el File::MMagic:</p>
<p style="margin-left: 40px">use DBI;</p>
<p style="margin-left: 40px">use File::MMagic;</p>
<p>Y suponemos que tenemos una base de datos con una tabla <span style="font-style: italic">archivos </span>tal que asÃ­:</p>
<p style="margin-left: 40px">nombre VARCHAR(255) NOT NULL DEFAULT &#8220;&#8221;</p>
<p style="margin-left: 40px">tipo VARCHAR(50) NOT NULL DEFAULT &#8220;&#8221;</p>
<p style="margin-left: 40px">datos BLOB NOT NULL</p>
<p>Hecho esto continuo con el modo de insertar y hacer un update sobre un campo BLOB:</p>
<p style="margin-left: 40px"># Antes que nada nos conectamos a la base de datos</p>
<p style="margin-left: 40px">$conn = DBI->connect(&#8221;dbi:mysql:base_de_datos:servidor&#8221;, &#8220;usuario&#8221;, &#8220;contraseÃ±a&#8221;) or die &#8220;Lerele: $!&#8221;;</p>
<p style="margin-left: 40px"># Seguidamente abrimos el archivo, le sacamos las entraÃ±as binarias y lo cerramos, despuÃ©s obtenemos el tipo de archivo</p>
<p style="margin-left: 40px">open($archivo, $nombre_archivo);</p>
<p style="margin-left: 40px">read($archivo, $las_entranyas, -s $archivo);</p>
<p style="margin-left: 40px">close($archivo);</p>
<p style="margin-left: 40px">$mm = new File::MMagic;</p>
<p style="margin-left: 40px">$tipo = $mm->checktype_filename($nombre_archivo);</p>
<p style="margin-left: 40px"># DespuÃ©s preparamos la sentencia sql y la lanzamos:</p>
<p style="margin-left: 40px">$conn->prepare(&#8221;INSERT INTO archivos (nombre, tipo, datos) VALUES(?, ?, ?)&#8221;)->execute($nombre_archivo, $tipo, $las_entranyas);</p>
<p style="margin-left: 40px">$conn->disconnect;</p>
<p>y es asÃ­ de sencillo, es igual para hacer un UPDATE.</p>
<p>En caso de querer obtener uno de los archivos y mostrarlos via web, como me ha tocado hacer en el trabajo, es sencillo igualmente. Supongamos que quieres obtener el archivo <span style="font-style: italic">bocata_atun.jpg</span> y mostrarlo en tu web, el programita quedarÃ­a una cosa asÃ­, ojo que ni estoy controlando los posibles errores ni nada, ni siquiera uso un perl estricto, antes tampoco:</p>
<p style="margin-left: 40px">#!/usr/bin/perl</p>
<p style="margin-left: 40px">use DBI;</p>
<p style="margin-left: 40px">#notad que aquÃ­ no se usa el File::MMagic, ni falta que hace, ya tienes almacenado el tipo.</p>
<p style="margin-left: 40px">$nombre = &#8220;bocata_atun.jpg&#8221;;</p>
<p style="margin-left: 40px">$conn = DBI->connect(&#8221;dbi:mysql:basedatos:servidor&#8221;, &#8220;usuario&#8221;, &#8220;contraseÃ±a&#8221;);</p>
<p style="margin-left: 40px">$query = $conn->prepare(&#8221;SELECT tipo, datos FROM archivos WHERE nombre=&#8217;$nombre&#8217;&#8221;);</p>
<p style="margin-left: 40px">$query->execute;</p>
<p style="margin-left: 40px">($tipo, $datos) = $query->fetchrow_array;</p>
<p style="margin-left: 40px">$query->finish;</p>
<p style="margin-left: 40px"># Llega la hora de mostrar ese delicioso bocata de atÃºn:</p>
<p style="margin-left: 40px">print<<EOT;</p>
<p style="margin-left: 40px">content-type: $tipo</p>
<p style="margin-left: 40px">content-disposition: filename=$nombre</p>
<p style="margin-left: 40px">
<p style="margin-left: 40px">$datos</p>
<p style="margin-left: 40px">EOT</p>
<p>Ale es asÃ­ de sencillo, eso sÃ­ notad que entre la cabecera (los content-*) y los $datos hay un \n. Y yo sin haberlo probado antes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/12/feed</wfw:commentRss>
		</item>
		<item>
		<title>EAN-13</title>
		<link>http://www.monstruillo.com/archives/9</link>
		<comments>http://www.monstruillo.com/archives/9#comments</comments>
		<pubDate>Fri, 27 Oct 2006 08:27:10 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[CÃ³digos de Barras]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/9</guid>
		<description><![CDATA[Sigo con otra simbologÃ­a de los cÃ³digos de barras, el EAN-13. Este es el que mÃ¡s nos puede sonar a todos ya que lo podemos encontrar en cualquier comercio. Este es que el cajero o la cajera pasa por el lector cuando vamos a un supermercado.
Esta simbologÃ­a codifica nÃºmeros de hasta 12 dÃ­gitos y es [...]]]></description>
			<content:encoded><![CDATA[<p>Sigo con otra simbologÃ­a de los cÃ³digos de barras, el EAN-13. Este es el que mÃ¡s nos puede sonar a todos ya que lo podemos encontrar en cualquier comercio. Este es que el cajero o la cajera pasa por el lector cuando vamos a un supermercado.</p>
<p>Esta simbologÃ­a codifica nÃºmeros de hasta 12 dÃ­gitos y es un pelÃ­n mÃ¡s complicado que el <a title="Code 39" target="_blank" href="http://www.monstruillo.com/archives/5">Code 39</a> y que el <a title="Interleaved 2 of 5" target="_blank" href="http://www.monstruillo.com/archives/7">Interleaved 2 of 5</a> porque requiere un poco mÃ¡s de trabajo.</p>
<p>Un cÃ³digo de barras EAN-13 estÃ¡ dividido en tres partes:</p>
<ol>
<li>El nÃºmero de sistema.</li>
<li>El cÃ³digo del fabricante.</li>
<li>El cÃ³digo del producto.</li>
<li>El dÃ­gito de control</li>
</ol>
<p>El <span style="font-weight: bold">nÃºmero de sistema</span> consiste en dos dÃ­gitos (a veces son tres) que identifican la autoridad numeradora del paÃ­s o de la regiÃ³n econÃ³mica que le asignÃ³ el cÃ³digo del fabricante al fabricante o distribuidor.</p>
<table border="1">
<tr>
<td>00-13: USA &#038; Canada</td>
<td>20-29: In-Store Functions</td>
<td>30-37: France</td>
</tr>
<tr>
<td>40-44: Germany</td>
<td>45: Japan (also 49)</td>
<td>46: Russian Federation</td>
</tr>
<tr>
<td>471: Taiwan</td>
<td>474: Estonia</td>
<td>475: Latvia</td>
</tr>
<tr>
<td>477: Lithuania</td>
<td>479: Sri Lanka</td>
<td>480: Philippines</td>
</tr>
<tr>
<td>482: Ukraine</td>
<td>484: Moldova</td>
<td>485: Armenia</td>
</tr>
<tr>
<td>486: Georgia</td>
<td>487: Kazakhstan</td>
<td>489: Hong Kong</td>
</tr>
<tr>
<td>49: Japan (JAN-13)</td>
<td>50: United Kingdom</td>
<td>520: Greece</td>
</tr>
<tr>
<td>528: Lebanon</td>
<td>529: Cyprus</td>
<td>531: Macedonia</td>
</tr>
<tr>
<td>535: Malta</td>
<td>539: Ireland</td>
<td>54: Belgium &#038; Luxembourg</td>
</tr>
<tr>
<td>560: Portugal</td>
<td>569: Iceland</td>
<td>57: Denmark</td>
</tr>
<tr>
<td>590: Poland</td>
<td>594: Romania</td>
<td>599: Hungary</td>
</tr>
<tr>
<td>600 &#038; 601: South Africa</td>
<td>609: Mauritius</td>
<td>611: Morocco</td>
</tr>
<tr>
<td>613: Algeria</td>
<td>619: Tunisia</td>
<td>622: Egypt</td>
</tr>
<tr>
<td>625: Jordan</td>
<td>626: Iran</td>
<td>64: Finland</td>
</tr>
<tr>
<td>690-692: China</td>
<td>70: Norway</td>
<td>729: Israel</td>
</tr>
<tr>
<td>73: Sweden</td>
<td>740: Guatemala</td>
<td>741: El Salvador</td>
</tr>
<tr>
<td>742: Honduras</td>
<td>743: Nicaragua</td>
<td>744: Costa Rica</td>
</tr>
<tr>
<td>746: Dominican Republic</td>
<td>750: Mexico</td>
<td>759: Venezuela</td>
</tr>
<tr>
<td>76: Switzerland</td>
<td>770: Colombia</td>
<td>773: Uruguay</td>
</tr>
<tr>
<td>775: Peru</td>
<td>777: Bolivia</td>
<td>779: Argentina</td>
</tr>
<tr>
<td>780: Chile</td>
<td>784: Paraguay</td>
<td>785: Peru</td>
</tr>
<tr>
<td>786: Ecuador</td>
<td>789: Brazil</td>
<td>80 - 83: Italy</td>
</tr>
<tr>
<td>84: Spain</td>
<td>850: Cuba</td>
<td>858: Slovakia</td>
</tr>
<tr>
<td>859: Czech Republic</td>
<td>860: Yugloslavia</td>
<td>869: Turkey</td>
</tr>
<tr>
<td>87: Netherlands</td>
<td>880: South Korea</td>
<td>885: Thailand</td>
</tr>
<tr>
<td>888: Singapore</td>
<td>890: India</td>
<td>893: Vietnam</td>
</tr>
<tr>
<td>899: Indonesia</td>
<td>90 &#038; 91: Austria</td>
<td>93: Australia</td>
</tr>
<tr>
<td>94: New Zealand</td>
<td>955: Malaysia</td>
<td>977: International Standard Serial Number for Periodicals (ISSN)</td>
</tr>
<tr>
<td>978: International Standard Book Numbering (ISBN)</td>
<td>979: International Standard Music Number (ISMN)</td>
<td>980: Refund receipts</td>
</tr>
<tr>
<td>981 &#038; 982: Common Currency Coupons</td>
<td colspan="2">99: Coupons</td>
</tr>
</table>
<p>El <span style="font-weight: bold">cÃ³digo de fabricante</span> es un cÃ³digo Ãºnico asignado a un fabricante por la autoridad numeradora del paÃ­s o de la regiÃ³n econÃ³mica. Todos los productos creados por este fabricante deben usar el mismo cÃ³digo de fabricante.<br />
EAN-13 usa cÃ³digos de fabricante de longitud variable, por lo general la longitud del cÃ³digo de fabricante que se le asigne a una empresa dependerÃ¡ de la cantidad de clases productos que fabrique y de la estimaciÃ³n de nuevas clases de productos que pueda fabricar. Esto significa que, si un fabricante de un paÃ­s donde el nÃºmero de sistema tiene dos dÃ­gitos tiene un cÃ³digo de fabricante de 5 dÃ­gitos, puede tener hasta 100.000 clases de productos diferentes (del 0 al 99.999).</p>
<p>El <span style="font-weight: bold">cÃ³digo de producto</span> es un cÃ³digo Ãºncico asignado por el fabricante, como la autoridad numeradora ya ha dado un cÃ³digo de fabricante Ãºnico se garantiza que el sÃ­mbolo creado serÃ¡ tambiÃ©n Ãºnico. En este caso, el fabricante es el encargado de que no se dupliquen los cÃ³digos de productos.</p>
<p>El <span style="font-weight: bold">dÃ­gito de control</span> es un dÃ­gito adicional (que una vez calculado se aÃ±ade al final del nÃºmero que queremos codificar, creando un nÃºmero final de 13 dÃ­gitos) usado para verificar que el cÃ³digo de barras ha sido escaneado correctamente. El mÃ©todo para calcular el dÃ­gito de control es el siguiente:</p>
<ol>
<li>Si el nÃºmero a codificar no tiene 12 dÃ­gitos se aÃ±aden ceros a la izquierda hasta tener los 12 dÃ­gitos.</li>
<li>Ahora consideramos que el primer dÃ­gito estÃ¡ en una posiciÃ³n &#8220;par&#8221; y se asignan posiciones &#8220;impar&#8221; y &#8220;par&#8221; alternativamente a los demÃ¡s dÃ­gitos de izquierda a la derecha.</li>
<li>Se suman todos los dÃ­gitos en posiciÃ³n &#8220;impar&#8221; y se multiplican por 3.</li>
<li>Se suman todos los dÃ­gitos en posiciÃ³n &#8220;par&#8221;.</li>
<li>Se suman los resultados de (3) y (4).</li>
<li>El dÃ­gito de control es la diferencia positiva entre el resultado de (5) y el nÃºmero divisible entre 10 inmediatamente superior al resultado de (5). Si el resultado de (5) ya es divisible entre 10, entonces el dÃ­gito de control es 0, no 10.</li>
</ol>
<p>Un ejemplo clarificador, el nÃºmero 490178019073 (el de una caja de disquetes que tengo sobre la mesa):</p>
<ul>
<li>Se suman las posiciones &#8220;impares&#8221; y se multiplican por 3: 9+1+8+1+0+3=22  22&#215;3=66</li>
<li>Se suman las posiciones &#8220;pares&#8221;: 4+0+7+0+9+7=27</li>
<li>Se suman los totales 66+27=93</li>
<li>Se busca el nÃºmero inmediatemente superior a 93 divisible entre 10 y se le resta 93: 100-93=7</li>
<li>Por lo que 7 es el dÃ­gito de control y ya tenemos el nÃºmero a codificar: 4901780190737</li>
</ul>
<p>Una vez que tenemos el nÃºmero de 13 dÃ­gitos, ya podemos crear su sÃ­mbolo.</p>
<p>Un sÃ­mbolo EAN-13 tiene la estructura fÃ­sica siguiente:</p>
<ul>
<li>Marca de inicio, codificada como: 101</li>
<li>Segundo dÃ­gito del nÃºmero de sistema.</li>
<li>Los 5 siguientes dÃ­gitos del nÃºmero a codificar (puede ser el cÃ³digo de fabricante si este tiene 5 dÃ­gitos).</li>
<li>Marca central, codificada como: 01010</li>
<li>Los 6 dÃ­gitos restantes del nÃºmero a codificar, incluido el dÃ­gito de control.</li>
<li>Marca de final, codificada como 101</li>
</ul>
<p>Antes de continuar es necesario hacer saber que hay diferencias de codificaciÃ³n entre los dÃ­gitos de la izquierda de la marca central y los dÃ­gitos de la derecha de dicha marca. En la parte izquierda hay dos tipos de codificaciÃ³n, dos paridades &#8220;par&#8221; e &#8220;impar&#8221;, esto es asÃ­ porque el primer dÃ­gito del nÃºmero de sistema se codifica en la paridad de los Ãºltimos 5 dÃ­gitos de la parte izquierda.</p>
<table border="1">
<tr bgcolor="#0000ff" align="center">
<td><font size="2" color="#ffffff"><strong>DIGITO</strong></font></td>
<td><font size="2" color="#ffffff"><strong>Cod. Izquierda</strong></font><font size="2" color="#ffffff"><strong> IMPAR</strong></font></td>
<td><font size="2" color="#ffffff"><strong>Cod. Izquierda</strong></font><font size="2" color="#ffffff"><strong>PAR</strong></font></td>
<td><font size="2" color="#ffffff"><strong>Cod. Derecha</strong></font><font size="2" color="#ffffff"><strong>TODOS</strong></font></td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>0</strong></font></td>
<td align="center">0001101</td>
<td align="center">0100111</td>
<td align="center">1110010</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>1</strong></font></td>
<td align="center">0011001</td>
<td align="center">0110011</td>
<td align="center">1100110</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>2</strong></font></td>
<td align="center">0010011</td>
<td align="center">0011011</td>
<td align="center">1101100</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>3</strong></font></td>
<td align="center">0111101</td>
<td align="center">0100001</td>
<td align="center">1000010</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>4</strong></font></td>
<td align="center">0100011</td>
<td align="center">0011101</td>
<td align="center">1011100</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>5</strong></font></td>
<td align="center">0110001</td>
<td align="center">0111001</td>
<td align="center">1001110</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>6</strong></font></td>
<td align="center">0101111</td>
<td align="center">0000101</td>
<td align="center">1010000</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>7</strong></font></td>
<td align="center">0111011</td>
<td align="center">0010001</td>
<td align="center">1000100</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>8</strong></font></td>
<td align="center">0110111</td>
<td align="center">0001001</td>
<td align="center">1001000</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>9</strong></font></td>
<td align="center">0001011</td>
<td align="center">0010111</td>
<td align="center">1110100</td>
</tr>
</table>
<table border="1">
<tr bgcolor="#0000ff">
<td align="center"><font color="#ffffff"><strong>Num. Sist</strong></font><font color="#ffffff"><strong>1er Dig</strong></font></td>
<td align="center"><font color="#ffffff"><strong>Num. Sist</strong></font><font color="#ffffff"><strong>2o Dig</strong></font></td>
<td align="center"><font color="#ffffff"><strong>1</strong></font></td>
<td align="center"><font color="#ffffff"><strong>2</strong></font></td>
<td align="center"><font color="#ffffff"><strong>3</strong></font></td>
<td align="center"><font color="#ffffff"><strong>4</strong></font></td>
<td align="center"><font color="#ffffff"><strong>5</strong></font></td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>0</strong></font></td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Impar</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>1</strong></font></td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Par</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>2</strong></font></td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Par</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>3</strong></font></td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Par</td>
<td align="center">Par</td>
<td align="center">Impar</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>4</strong></font></td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Par</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>5</strong></font></td>
<td align="center">Impar</td>
<td align="center">Oar</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Impar</td>
<td align="center">Par</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>6</strong></font></td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Par</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Impar</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>7</strong></font></td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Par</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><font color="#ffffff"><strong>8</strong></font></td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Par</td>
<td align="center">Impar</td>
</tr>
<tr>
<td bgcolor="#0000ff" align="center"><strong>9</strong></td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Par</td>
<td align="center">Impar</td>
<td align="center">Par</td>
<td align="center">Impar</td>
</tr>
</table>
<p>Ahora voy con un ejemplo de codificaciÃ³n, el nÃºmero de antes era 4901780190737., pues voy a por Ã©l:</p>
<ol>
<li>Paridad con la que codificar el primer dÃ­gito del nÃºmero de sistema (P: par, I: impar): 4 &#8211;> PIIPP</li>
<li>Marca de inicio: 101</li>
<li>Segundo dÃ­tigo del nÃºmero de sistema, siempre con paridad impar, no lo indica el primer dÃ­gito: 9 &#8211;> 0001011</li>
<li>Primer dÃ­gito de los 5 restantes de la parte izquierda, paridad par: 0 &#8211;> 0100111</li>
<li>Segundo, paridad impar: 1 &#8211;> 0011001</li>
<li>Tercero, paridad impar: 7 &#8211;> 0111011</li>
<li>Cuarto, paridad par: 8 &#8211;> 0001001</li>
<li>Quinto, paridad par: 0 &#8211;> 0100111</li>
<li>Marca central: 01010</li>
<li>Primer dÃ­gito de la parte derecha, solo tienen una paridad: 1 &#8211;> 1100110</li>
<li>Segundo: 9 &#8211;> 1110100</li>
<li>Tercero: 0 &#8211;> 1110010</li>
<li>Cuarto: 7 &#8211;> 1000100</li>
<li>Quinto: 3 &#8211;> 1000010</li>
<li>Sexto (dÃ­gito de control): 7 &#8211;> 1000100</li>
<li>Marca de final: 101</li>
</ol>
<p>Y con esto ya tenemos el cÃ³digo para 4901780190737:</p>
<p>10100010110100111001100101110110001001010011101010110011011101001110010100010010000101000100101</p>
<p>Y aquÃ­ el cÃ³digo de barras en cuestiÃ³n.</p>
<p><img width="128" height="67" id="image11" alt="ean13" src="http://www.monstruillo.com/wp-content/uploads/2006/10/ean131.thumbnail.jpg" /></p>
<p>Ales, otro dÃ­a mÃ¡s&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/9/feed</wfw:commentRss>
		</item>
		<item>
		<title>Interleaved 2 of 5</title>
		<link>http://www.monstruillo.com/archives/7</link>
		<comments>http://www.monstruillo.com/archives/7#comments</comments>
		<pubDate>Wed, 25 Oct 2006 18:22:49 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[CÃ³digos de Barras]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/7</guid>
		<description><![CDATA[MÃ¡s cÃ³digos de barras. Esta vez toca el Interleaved 2 of 5, un pelÃ­n mÃ¡s difÃ­cil e interesante. Veamos quÃ© se le ocurriÃ³ a la mente retorcida que lo creÃ³.
Esta simbologÃ­a se utiliza sobre todo para crear sÃ­mbolos numÃ©ricos en la industria de la distribuciÃ³n y almacenamiento.
Se codifican nÃºmeros con una cantidad de dÃ­gitos par [...]]]></description>
			<content:encoded><![CDATA[<p>MÃ¡s cÃ³digos de barras. Esta vez toca el Interleaved 2 of 5, un pelÃ­n mÃ¡s difÃ­cil e interesante. Veamos quÃ© se le ocurriÃ³ a la mente retorcida que lo creÃ³.</p>
<p>Esta simbologÃ­a se utiliza sobre todo para crear sÃ­mbolos numÃ©ricos en la industria de la distribuciÃ³n y almacenamiento.</p>
<p>Se codifican nÃºmeros con una cantidad de dÃ­gitos par y se codifican en grupos de dos, y ahÃ­ viene porque se le llama &#8220;interleaved&#8221; (entrelazado) porque el primer dato numÃ©rico del par se lo codifica en las cinco barras negras mientras que el segundo dato numÃ©rico del par se lo codifica en las cinco barras blancas del sÃ­mbolo para el par. SÃ­, suena raro, igual no lo he sabido explicar bien, pero lo mejor serÃ¡ ver un ejemplo, pero para ello tenemos que saber como codificar dÃ­gito.</p>
<p>Antes de ir con el ejemplo necesitamos la tabla de codificaciÃ³n y la codificaciÃ³n de las marcas de inicio y final:</p>
<table border="1">
<tr bgcolor="#ff0000">
<td align="center"><font color="#ffffff">CarÃ¡cter</font></td>
<td align="center"><font color="#ffffff">Interleaved 2 of 5</font></td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">NNWWN</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">WNNNW</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">WWNNN</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">WWNNN</td>
</tr>
<tr>
<td align="center">4</td>
<td align="center">NNWNW</td>
</tr>
<tr>
<td align="center">5</td>
<td align="center">WNWNN</td>
</tr>
<tr>
<td align="center">6</td>
<td align="center">NWWNN</td>
</tr>
<tr>
<td align="center">7</td>
<td align="center">NNNWW</td>
</tr>
<tr>
<td align="center">8</td>
<td align="center">WNNWN</td>
</tr>
<tr>
<td align="center">9</td>
<td align="center">NWNWN</td>
</tr>
</table>
<p>Donde N significa barra fina y donde W significa barra gruesa.</p>
<ul>
<li><strong>Marca de Inicio</strong>: 1010</li>
<li><strong>Marca Final</strong>: 1101</li>
</ul>
<p>Como sois gente lista habreis observado que ya no aparecen &#8216;0&#8217;s ni &#8216;1&#8217;s, pero al final obtendermos un cÃ³digo como el del <a title="Code 39" href="http://www.monstruillo.com/archives/5">artÃ­culo anterior</a>.<br />
De modo que como ejemplo, vamos a codificar 123 (sÃ­, otra vez tengo una galletita para vosotros, tiene un nÃºmero de dÃ­gitos impar).</p>
<p>Como tiene un nÃºmero de dÃ­gitos impar con ponerle un 0 delante, solucionado, asÃ­ que tenemos 0123 para codificar.</p>
<p>Lo primero que tenemos que hacer es buscar los equivalentes interleaved para cada carÃ¡cter:</p>
<ul>
<li>0: <font size="2">NNWWN</font></li>
<li>1: <font size="2">WNNNW</font></li>
<li>2: <font size="2">NWNNW</font></li>
<li>3: <font size="2">WWNNN</font></li>
</ul>
<p>Y preparamos cada par de dÃ­gitos intercalÃ¡ndolos:</p>
<li>01: NWNNWNWNNW</li>
<li>23: NWWWNNNNWN</li>
<p>Si os fijais, el primer par comienza con la primera N del &#8216;0&#8242;, luego le sigue la primera W del &#8216;1&#8242;, continÃºa con la segunda N del &#8216;0&#8242; y despuÃ©s estÃ¡ la primera N del &#8216;1&#8242;, y asÃ­ sigue intercalando el &#8216;0&#8242; y el &#8216;1&#8242;.</p>
<p>Hecho esto suponemos que el primer carÃ¡cter del par es una barra negra, que el segundo es una barra blanca y asÃ­ vamos alternando entre barra negra y blanca hasta el final. Y sabiendo, como ya he dicho antes que N es una barra fina y que W es una barra gruesa quedarÃ­a:</p>
<ul>
<li>01: NWNNWNWNNW &#8211;> 10010110110100</li>
<li>23: NWWWNNNNWN &#8211;> 10011001010110</li>
</ul>
<p>de modo que solo nos queda concatenarlo y ponerle las marcas de inicio y de final, quedando:</p>
<p>101010010110110100100110010101101101</p>
<p>Si os fijais, esta vez no hay barras finas blancas entre los dÃ­gitos o los pares de dÃ­gitos, eso es porque esta simbologÃ­a es una de las denominadas <strong>contÃ­nuas</strong>.</p>
<p><img width="150" height="70" alt="0123_intl25" id="image8" src="http://www.monstruillo.com/wp-content/uploads/2006/10/0123_intl25.jpg" /></p>
<p>Otro dÃ­a, mÃ¡s&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/7/feed</wfw:commentRss>
		</item>
		<item>
		<title>Code 39</title>
		<link>http://www.monstruillo.com/archives/5</link>
		<comments>http://www.monstruillo.com/archives/5#comments</comments>
		<pubDate>Tue, 24 Oct 2006 06:54:42 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[CÃ³digos de Barras]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/5</guid>
		<description><![CDATA[Para comenzar vamos con uno de los cÃ³digos de barras mÃ¡s sencillos de crear, la simbologÃ­a Code 39.Esta simbologÃ­a se basa casi en una sustituciÃ³n directa de los carÃ¡cteres siguiendo la siguiente tabla


CarÃ¡cter

Code 39
CarÃ¡cter
Code 39


0
101001101101
M
110110101001


1
110100101011
N
101011010011


2
101100101011
O
110101101001


3
110110010101
P
101101101001


4
101001101011
Q
101010110011


5
110100110101
R
110101011001


6
101100110101
S
101101011001


7
101001011011
T
101011011001


8
110100101101
U
110010101011


9
101100101101
V
100110101011


A
110101001011
W
110011010101


B
101101001011
X
100101101011


C
110110100101
Y
110010110101


D
101011001011
Z
100110110101


E
110101100101
-
100101011011


F
101101100101
.
110010101101


G
101010011011
ESPACIO
100110101101


H
110101001101
$
100100100101


I
101101001101
/
100100101001


J
101011001101
+
100101001001


K
110101010011
%
101001001001


L
101101010011
DELIMITADOR
100101101101


Un sÃ­mbolo Code 39 comienza y acaba por el DELIMITADOR, y cada carÃ¡cter simplemente se sustituye por su equivalente Code 39 [...]]]></description>
			<content:encoded><![CDATA[<p>Para comenzar vamos con uno de los cÃ³digos de barras mÃ¡s sencillos de crear, la simbologÃ­a Code 39.Esta simbologÃ­a se basa casi en una sustituciÃ³n directa de los carÃ¡cteres siguiendo la siguiente tabla</p>
<table width="564" border="1" style="height: 526px">
<tr bgcolor="#ff0000">
<td align="center"><font size="2" color="#ffffff">CarÃ¡cter<strong><br />
</strong></font></td>
<td align="center"><font size="2" color="#ffffff">Code 39</font></td>
<td align="center"><font size="2" color="#ffffff">CarÃ¡cter</font></td>
<td align="center"><font size="2" color="#ffffff">Code 39</font></td>
</tr>
<tr>
<td align="center"><font size="2">0</font></td>
<td align="center"><font size="2">101001101101</font></td>
<td align="center"><font size="2">M</font></td>
<td align="center"><font size="2">110110101001</font></td>
</tr>
<tr>
<td align="center"><font size="2">1</font></td>
<td align="center"><font size="2">110100101011</font></td>
<td align="center"><font size="2">N</font></td>
<td align="center"><font size="2">101011010011</font></td>
</tr>
<tr>
<td align="center"><font size="2">2</font></td>
<td align="center"><font size="2">101100101011</font></td>
<td align="center"><font size="2">O</font></td>
<td align="center"><font size="2">110101101001</font></td>
</tr>
<tr>
<td align="center"><font size="2">3</font></td>
<td align="center"><font size="2">110110010101</font></td>
<td align="center"><font size="2">P</font></td>
<td align="center"><font size="2">101101101001</font></td>
</tr>
<tr>
<td align="center"><font size="2">4</font></td>
<td align="center"><font size="2">101001101011</font></td>
<td align="center"><font size="2">Q</font></td>
<td align="center"><font size="2">101010110011</font></td>
</tr>
<tr>
<td align="center"><font size="2">5</font></td>
<td align="center"><font size="2">110100110101</font></td>
<td align="center"><font size="2">R</font></td>
<td align="center"><font size="2">110101011001</font></td>
</tr>
<tr>
<td align="center"><font size="2">6</font></td>
<td align="center"><font size="2">101100110101</font></td>
<td align="center"><font size="2">S</font></td>
<td align="center"><font size="2">101101011001</font></td>
</tr>
<tr>
<td align="center"><font size="2">7</font></td>
<td align="center"><font size="2">101001011011</font></td>
<td align="center"><font size="2">T</font></td>
<td align="center"><font size="2">101011011001</font></td>
</tr>
<tr>
<td align="center"><font size="2">8</font></td>
<td align="center"><font size="2">110100101101</font></td>
<td align="center"><font size="2">U</font></td>
<td align="center"><font size="2">110010101011</font></td>
</tr>
<tr>
<td align="center"><font size="2">9</font></td>
<td align="center"><font size="2">101100101101</font></td>
<td align="center"><font size="2">V</font></td>
<td align="center"><font size="2">100110101011</font></td>
</tr>
<tr>
<td align="center"><font size="2">A</font></td>
<td align="center"><font size="2">110101001011</font></td>
<td align="center"><font size="2">W</font></td>
<td align="center"><font size="2">110011010101</font></td>
</tr>
<tr>
<td align="center"><font size="2">B</font></td>
<td align="center"><font size="2">101101001011</font></td>
<td align="center"><font size="2">X</font></td>
<td align="center"><font size="2">100101101011</font></td>
</tr>
<tr>
<td align="center"><font size="2">C</font></td>
<td align="center"><font size="2">110110100101</font></td>
<td align="center"><font size="2">Y</font></td>
<td align="center"><font size="2">110010110101</font></td>
</tr>
<tr>
<td align="center"><font size="2">D</font></td>
<td align="center"><font size="2">101011001011</font></td>
<td align="center"><font size="2">Z</font></td>
<td align="center"><font size="2">100110110101</font></td>
</tr>
<tr>
<td align="center"><font size="2">E</font></td>
<td align="center"><font size="2">110101100101</font></td>
<td align="center"><font size="2">-</font></td>
<td align="center"><font size="2">100101011011</font></td>
</tr>
<tr>
<td align="center"><font size="2">F</font></td>
<td align="center"><font size="2">101101100101</font></td>
<td align="center"><font size="2">.</font></td>
<td align="center"><font size="2">110010101101</font></td>
</tr>
<tr>
<td align="center"><font size="2">G</font></td>
<td align="center"><font size="2">101010011011</font></td>
<td align="center"><font size="2">ESPACIO</font></td>
<td align="center"><font size="2">100110101101</font></td>
</tr>
<tr>
<td align="center"><font size="2">H</font></td>
<td align="center"><font size="2">110101001101</font></td>
<td align="center"><font size="2">$</font></td>
<td align="center"><font size="2">100100100101</font></td>
</tr>
<tr>
<td align="center"><font size="2">I</font></td>
<td align="center"><font size="2">101101001101</font></td>
<td align="center"><font size="2">/</font></td>
<td align="center"><font size="2">100100101001</font></td>
</tr>
<tr>
<td align="center"><font size="2">J</font></td>
<td align="center"><font size="2">101011001101</font></td>
<td align="center"><font size="2">+</font></td>
<td align="center"><font size="2">100101001001</font></td>
</tr>
<tr>
<td align="center"><font size="2">K</font></td>
<td align="center"><font size="2">110101010011</font></td>
<td align="center"><font size="2">%</font></td>
<td align="center"><font size="2">101001001001</font></td>
</tr>
<tr>
<td align="center"><font size="2">L</font></td>
<td align="center"><font size="2">101101010011</font></td>
<td align="center"><font size="2">DELIMITADOR</font></td>
<td align="center"><font size="2">100101101101</font></td>
</tr>
</table>
<p>Un sÃ­mbolo Code 39 comienza y acaba por el DELIMITADOR, y cada carÃ¡cter simplemente se sustituye por su equivalente Code 39 de la tabla de arriba dejando entre cada carÃ¡cter una barra fina blanca (es decir, un 0).</p>
<p><strong>Prediquemos con el ejemplo</strong>.</p>
<p>Vamos a codificar &#8220;ARF&#8221;.</p>
<p>Para empezar el DELIMITADOR: <font size="2">100101101101</font></p>
<p>luego continuamos con la A: <font size="2">110101001011</font><br />
seguimos con la R: <font size="2">110101011001</font><br />
y despuÃ©s la F: <font size="2">101101100101</font><br />
para acabar con el DELIMITADOR: <font size="2">100101101101</font></p>
<p>Hay que recordar que entre cada carÃ¡cter, incluidos los delimitadores hay que poner una barra blanca fina. Los marcarÃ© para que se vean:</p>
<p><font size="2">100101101101<strong>0</strong></font><font size="2">110101001011</font><font size="2"><strong>0</strong></font><font size="2">110101011001</font><font size="2"><strong>0</strong></font><font size="2">101101100101</font><font size="2"><strong>0</strong></font><font size="2">100101101101</font></p>
<p>AsÃ­ se codificarÃ­a ARF con Code 39</p>
<p><img width="150" height="70" id="image6" alt="ARF" src="http://www.monstruillo.com/wp-content/uploads/2006/10/ARF_code39.jpg" /></p>
<p>Otro dÃ­a complicarÃ© un poco mÃ¡s las cosas <img src='http://www.monstruillo.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/5/feed</wfw:commentRss>
		</item>
		<item>
		<title>CÃ³digos de Barras</title>
		<link>http://www.monstruillo.com/archives/3</link>
		<comments>http://www.monstruillo.com/archives/3#comments</comments>
		<pubDate>Tue, 24 Oct 2006 06:08:28 +0000</pubDate>
		<dc:creator>monstruillo</dc:creator>
		
		<category><![CDATA[CÃ³digos de Barras]]></category>

		<guid isPermaLink="false">http://www.monstruillo.com/archives/3</guid>
		<description><![CDATA[Hace unas semanas me pidieron que hiciera un programa para crear cÃ³digos de barras, de modo que me puse a buscar informaciÃ³n sobre como se codifican y no me resultÃ³ fÃ¡cil encontrarla, al menos no es espaÃ±ol. Casi que lo Ãºnico que encontraba eran empresas que intentaban venderte sus APIs para crearlos o sus aplicaciones, [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unas semanas me pidieron que hiciera un programa para crear cÃ³digos de barras, de modo que me puse a buscar informaciÃ³n sobre como se codifican y no me resultÃ³ fÃ¡cil encontrarla, al menos no es espaÃ±ol. Casi que lo Ãºnico que encontraba eran empresas que intentaban venderte sus APIs para crearlos o sus aplicaciones, cosa que no me interesaba. De modo que aquÃ­ comienzo unos articulillos sobre los cÃ³digos de barras.</p>
<p>Antes que nada un poco de nomenclatura (lo irÃ© ampliando a medida que vaya recordando o necesitando explicar algÃºn tÃ©rmino):</p>
<ul>
<li><strong>SÃ­mbolo</strong>: Es la impresiÃ³n fÃ­sica de un cÃ³digo de barras.</li>
<li><strong>SimbologÃ­a</strong>: Es cada uno de los cÃ³digos con los que se puede codificar una cadena.</li>
<li><strong>Densidad</strong>: Es la anchura de la barra mÃ¡s fina del sÃ­mbolo.</li>
</ul>
<p>Hay muchas simbologÃ­as con diferentes usos cada una de ellas, algunos ejemplos:</p>
<ul>
<li>Code 39: SimbologÃ­a alfanumÃ©rica usada en la industria capaz de codificar 44 carÃ¡cteres.</li>
<li>Code 128: SimbologÃ­a alfanumÃ©rica para la industria capaz de codificar 128 carÃ¡cteres ASCII.</li>
<li>EAN-13: SimbologÃ­a numÃ©rica utilizada en comercios detallistas, es el tÃ­pico de los supermercados, las tiendas&#8230;</li>
<li>Interleaved 2 of 5:  SimbologÃ­a numÃ©rica utilizada en almacenes de alta densidad.</li>
</ul>
<p>Algunos convenios con los que trabajarÃ©, las lÃ­neas blancas finas las repesentarÃ© con un &#8216;0&#8242;, las lÃ­neas finas negras las representarÃ© con un &#8216;1&#8242;. Cuando se trate de una lÃ­nea mÃ¡s ancha sÃ­mplemente duplicarÃ© o triplicarÃ© el 0 o el 1 segÃºn sea el caso. Por ejemplo, para cÃ³digos de doble densidad, es decir que las lÃ­neas anchas son dos veces mÃ¡s anchas que las finas simplemente duplicarÃ© el carÃ¡cter con el que represento la barra: 00 Ã³ 11, pero hay cÃ³digos de densidad mÃºltiple, que son cÃ³digos en los que hay varias anchuras diferentes dentro de un mismo sÃ­mbolo.</p>
<p>Dicho esto, comenzamos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.monstruillo.com/archives/3/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
