<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Fatal exception</title>
	
	<link>http://www.latindevelopers.com/ivancp</link>
	<description>/* Blog personal de Ivan Cachicatari */</description>
	<lastBuildDate>Sat, 17 Mar 2012 03:09:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ivancp" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="ivancp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Migrar de MS Access a MySQL con relaciones</title>
		<link>http://www.latindevelopers.com/ivancp/2012/03/migrar-de-ms-access-a-mysql-con-relaciones/</link>
		<comments>http://www.latindevelopers.com/ivancp/2012/03/migrar-de-ms-access-a-mysql-con-relaciones/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 03:09:51 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[ms-access]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[vba]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=567</guid>
		<description><![CDATA[He usado herramientas como MySQL Migration Toolkit (*) y Bullzip&#8217;s Access To MySQL, ambos hacen un excelente trabajo pero no exporta las relaciones entre tablas. Hacer esta tarea nos puede tomar varias horas (hasta ahora): Escribí un código VBA para identificar las relaciones generando código MySQL con las sentencias de creación, esto puede ser muy [...]]]></description>
			<content:encoded><![CDATA[<p>He usado herramientas como MySQL Migration Toolkit (*) y Bullzip&#8217;s Access To MySQL, ambos hacen un excelente trabajo pero no exporta las relaciones entre tablas. Hacer esta tarea nos puede tomar varias horas (hasta ahora):</p>
<p>Escribí un código VBA para identificar las relaciones generando código MySQL con las sentencias de creación, esto puede ser muy útil después de la migración usando cualquier herramienta libre.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="vb"><pre class="de1"><span class="kw2">Option</span> <span class="kw2">Explicit</span>
<span class="co1">'Copiar y pegar esta función en un módulo nuevo/existente de MS Access.
</span>
<span class="kw2">Public</span> <span class="kw2">Sub</span> printRelations()
    <span class="kw4">Dim</span> sql, fk <span class="kw4">As</span> <span class="kw1">String</span>
    <span class="kw4">Dim</span> i, j <span class="kw4">As</span> <span class="kw1">Integer</span>
    <span class="kw3">For</span> i = 0 <span class="kw3">To</span> CurrentDb.Relations.Count - 1
        sql = <span class="st0">&quot;ALTER TABLE `&quot;</span> &amp; CurrentDb.Relations(i).ForeignTable &amp; _
            <span class="st0">&quot;` ADD CONSTRAINT `&quot;</span> &amp; CurrentDb.Relations(i).Name &amp; <span class="st0">&quot;` FOREIGN KEY (&quot;</span>
        fk = <span class="st0">&quot;(&quot;</span>
        <span class="kw3">For</span> j = 0 <span class="kw3">To</span> CurrentDb.Relations(i).Fields.Count - 1
            sql = sql &amp; <span class="st0">&quot;`&quot;</span> &amp; CurrentDb.Relations(i).Fields(j).ForeignName &amp; <span class="st0">&quot;` ,&quot;</span>
            fk = fk &amp; <span class="st0">&quot;`&quot;</span> &amp; CurrentDb.Relations(i).Fields(j).Name &amp; <span class="st0">&quot;` ,&quot;</span>
        <span class="kw3">Next</span> j
&nbsp;
        sql = Left(sql, Len(sql) - 1)
        fk = Left(fk, Len(fk) - 1)
        fk = fk &amp; <span class="st0">&quot;)&quot;</span>
        sql = sql &amp; <span class="st0">&quot;) REFERENCES `&quot;</span> &amp; CurrentDb.Relations(i).Table &amp; <span class="st0">&quot;`&quot;</span> &amp; fk &amp; <span class="st0">&quot;;&quot;</span>
&nbsp;
        Debug.<span class="kw4">Print</span> sql
    <span class="kw3">Next</span> i
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></div></div></div></div></div></div></div>


<p>Para ejecutar el código anterior, debemos invocarlo desde la ventana de Inmediato (Ctrl+G), luego solo tendremos que copiar el SQL generado para llevarlo a MySQL.</p>
<p><a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/ms-access-foreign-keys.png"><img src="http://www.latindevelopers.com/ivancp/wp-content/uploads/ms-access-foreign-keys-450x273.png" alt="" title="ms-access-foreign-keys" width="450" height="273" class="aligncenter size-medium wp-image-570" /></a></p>
<p>Enjoy!</p>
<p>(*)MySQL Migration Toolkit esta descontinuado pero aun sigue disponible desde los servidores Mirror de MysQL como: </p>
<p>http://mirrors.dotsrc.org/mysql/Downloads/MySQLGUITools/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2012/03/migrar-de-ms-access-a-mysql-con-relaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL necesita mejorar sus mensajes de error</title>
		<link>http://www.latindevelopers.com/ivancp/2012/03/mysql-necesita-mejorar-sus-mensajes-de-error/</link>
		<comments>http://www.latindevelopers.com/ivancp/2012/03/mysql-necesita-mejorar-sus-mensajes-de-error/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 07:00:43 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=561</guid>
		<description><![CDATA[Acabo de modificar una base de datos, no debió demorar las dos horas que demoré en realizar la tarea si no fuera por que MySQL no ha mejorado aun sus mensajes de error. La tarea fue agregar una nueva clave foránea a una tabla existente, veamos como reproducir lo que me ha pasado: -- Crear [...]]]></description>
			<content:encoded><![CDATA[<p>Acabo de modificar una base de datos, no debió demorar las dos horas que demoré en realizar la tarea si no fuera por que MySQL no ha mejorado aun sus mensajes de error.</p>
<p>La tarea fue agregar una nueva clave foránea a una tabla existente, veamos como reproducir lo que me ha pasado:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="co1">-- Crear las tablas foo y bar</span>
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> foo <span class="br0">&#40;</span>
	id <span class="kw1">INTEGER</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span><span class="sy0">,</span>
	bar_id <span class="kw1">INT</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span>
<span class="br0">&#41;</span>;
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> bar <span class="br0">&#40;</span>
	id <span class="kw1">INTEGER</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span>
<span class="br0">&#41;</span>;
<span class="co1">-- Intentar crear una clave foránea</span>
<span class="kw1">ALTER</span> <span class="kw1">TABLE</span> foo
	<span class="kw1">ADD</span> <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span><span class="br0">&#40;</span>bar_id<span class="br0">&#41;</span> <span class="kw1">REFERENCES</span> bar<span class="br0">&#40;</span>ANY_FIELD<span class="br0">&#41;</span> ;</pre></div></div></div></div></div></div></div>


<p>Al ejecutar la ultima sentencia MySQL devuelve un error genérico que puede significar muchas cosas:</p>
<p><code>Error Code: 1005. Can't create table 'temp.#sql-4bd7_11' (errno: 150)</code></p>
<p>Todo hubiera sido mas fácil si me hubiera dado cuenta que escribí mal el campo de la tabla de deferencia <code>bar(ANY_FIELD)</code> (algunas veces pasa), si el mensaje de horror hubiera dicho: <code>"field bar.ANY_FIELD don't exists"</code> no estaría despierto hasta las 2am buscando una solución,</p>
<p>Estoy usando MySQL  5.5.21 community edition.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2012/03/mysql-necesita-mejorar-sus-mensajes-de-error/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Que hay en MySQL Enterprise?</title>
		<link>http://www.latindevelopers.com/ivancp/2012/03/que-hay-en-mysql-enterprise/</link>
		<comments>http://www.latindevelopers.com/ivancp/2012/03/que-hay-en-mysql-enterprise/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 07:22:51 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=555</guid>
		<description><![CDATA[Muchos nos hemos hecho esa pregunta, Pedro Andrade y Manuel Contreras de Oracle nos aclaran el asunto, aqui los livestreams grabados del ultimo evento Joomla en Guatemala. Watch live streaming video from desdeguate at livestream.com Watch live streaming video from desdeguate at livestream.com]]></description>
			<content:encoded><![CDATA[<p>Muchos nos hemos hecho esa pregunta, Pedro Andrade y Manuel Contreras de Oracle nos aclaran el asunto, aqui los livestreams grabados del ultimo evento Joomla en Guatemala.</p>
<p><iframe width="480" height="295" src="http://cdn.livestream.com/embed/desdeguate?layout=4&#038;clip=pla_5239666c-103d-430b-af58-aade1038fd92&#038;color=0xe7e7e7&#038;autoPlay=false&#038;mute=false&#038;iconColorOver=0x888888&#038;iconColor=0x777777&#038;allowchat=true&#038;height=295&#038;width=480" style="border:0;outline:0" frameborder="0" scrolling="no"></iframe>
<div style="font-size:11px;padding-top:10px;text-align:center;width:480px">Watch <a href=http://www.livestream.com/?utm_source=lsplayer&amp;utm_medium=embed&amp;utm_campaign=footerlinks title=live streaming video>live streaming video</a> from <a href=http://www.livestream.com/desdeguate?utm_source=lsplayer&amp;utm_medium=embed&amp;utm_campaign=footerlinks title=Watch desdeguate at livestream.com>desdeguate</a> at livestream.com</div>
<p><iframe width="480" height="295" src="http://cdn.livestream.com/embed/desdeguate?layout=4&#038;clip=pla_3f7adec8-a2c5-4439-acc0-56a437e9f260&#038;color=0xe7e7e7&#038;autoPlay=false&#038;mute=false&#038;iconColorOver=0x888888&#038;iconColor=0x777777&#038;allowchat=true&#038;height=295&#038;width=480" style="border:0;outline:0" frameborder="0" scrolling="no"></iframe>
<div style="font-size:11px;padding-top:10px;text-align:center;width:480px">Watch <a href=http://www.livestream.com/?utm_source=lsplayer&amp;utm_medium=embed&amp;utm_campaign=footerlinks title=live streaming video>live streaming video</a> from <a href=http://www.livestream.com/desdeguate?utm_source=lsplayer&amp;utm_medium=embed&amp;utm_campaign=footerlinks title=Watch desdeguate at livestream.com>desdeguate</a> at livestream.com</div>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2012/03/que-hay-en-mysql-enterprise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Valores auto_increment personalizados</title>
		<link>http://www.latindevelopers.com/ivancp/2012/02/valores-auto_increment-personalizados/</link>
		<comments>http://www.latindevelopers.com/ivancp/2012/02/valores-auto_increment-personalizados/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 13:00:48 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[stored procedures]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=551</guid>
		<description><![CDATA[En el Perú los formatos numéricos de las facturas es 001-000033 , la serie (001) cambia eventualmente pero el valor auto-incrementado es el mismo: 001-000034 001-000035 001-000036 ... Para manejar esto en MySQL he preparado una solución basada en otro articulo mio: Crear la tabla para guardar los números actuales: CREATE TABLE _sequence &#40; seq_name [...]]]></description>
			<content:encoded><![CDATA[<p>En el Perú los formatos numéricos de las facturas es 001-000033 , la serie (001) cambia eventualmente pero el valor auto-incrementado es el mismo:</p>
<pre>001-000034
001-000035
001-000036
...</pre>
<p>Para manejar esto en MySQL he preparado una solución basada en <a href="http://www.latindevelopers.com/ivancp/2011/11/simulando-secuencias-en-mysql/" target="_blank">otro articulo mio</a>:</p>
<ol>
<li>Crear la tabla para guardar los números actuales:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> _sequence
<span class="br0">&#40;</span>
    seq_name <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span><span class="sy0">,</span>
    seq_group <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span><span class="sy0">,</span>
    seq_val <span class="kw1">INT</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span>
<span class="br0">&#41;</span>;</pre></div></div></div></div></div></div></div>


</li>
<li>Crear una función para obtener el valor siguiente e incrementarlo:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1">delimiter <span class="sy0">//</span>
<span class="kw1">DROP</span> <span class="kw1">FUNCTION</span> <span class="kw1">IF</span> <span class="kw1">EXISTS</span> getNextCustomSeq<span class="sy0">//</span>
<span class="kw1">CREATE</span> <span class="kw1">FUNCTION</span> getNextCustomSeq
<span class="br0">&#40;</span>
    sSeqName <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span><span class="sy0">,</span>
    sSeqGroup <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span class="kw1">RETURNS</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
    <span class="kw1">DECLARE</span> nLast_val <span class="kw1">INT</span>; 
&nbsp;
    <span class="kw1">SET</span> nLast_val <span class="sy0">=</span>  <span class="br0">&#40;</span><span class="kw1">SELECT</span> seq_val
                          <span class="kw1">FROM</span> _sequence
                          <span class="kw1">WHERE</span> seq_name <span class="sy0">=</span> sSeqName
                                <span class="kw1">AND</span> seq_group <span class="sy0">=</span> sSeqGroup<span class="br0">&#41;</span>;
    <span class="kw1">IF</span> nLast_val <span class="kw1">IS</span> <span class="kw1">NULL</span> <span class="kw1">THEN</span>
        <span class="kw1">SET</span> nLast_val <span class="sy0">=</span> <span class="nu0">1</span>;
        <span class="kw1">INSERT</span> <span class="kw1">INTO</span> _sequence <span class="br0">&#40;</span>seq_name<span class="sy0">,</span>seq_group<span class="sy0">,</span>seq_val<span class="br0">&#41;</span>
        <span class="kw1">VALUES</span> <span class="br0">&#40;</span>sSeqName<span class="sy0">,</span>sSeqGroup<span class="sy0">,</span>nLast_Val<span class="br0">&#41;</span>;
    <span class="kw1">ELSE</span>
        <span class="kw1">SET</span> nLast_val <span class="sy0">=</span> nLast_val <span class="sy0">+</span> <span class="nu0">1</span>;
        <span class="kw1">UPDATE</span> _sequence <span class="kw1">SET</span> seq_val <span class="sy0">=</span> nLast_val
        <span class="kw1">WHERE</span> seq_name <span class="sy0">=</span> sSeqName <span class="kw1">AND</span> seq_group <span class="sy0">=</span> sSeqGroup;
    <span class="kw1">END</span> <span class="kw1">IF</span>; 
&nbsp;
    <span class="kw1">SET</span> @ret <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">SELECT</span> concat<span class="br0">&#40;</span>sSeqGroup<span class="sy0">,</span><span class="st0">'-'</span><span class="sy0">,</span>lpad<span class="br0">&#40;</span>nLast_val<span class="sy0">,</span><span class="nu0">6</span><span class="sy0">,</span><span class="st0">'0'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    <span class="kw1">RETURN</span> @ret;
<span class="kw1">END</span><span class="sy0">//</span> 
&nbsp;
delimiter ;</pre></div></div></div></div></div></div></div>


</li>
<li>Crear un procedimiento almacenado para modificar el valor actual:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1">delimiter <span class="sy0">//</span>
<span class="kw1">DROP</span> <span class="kw1">PROCEDURE</span> <span class="kw1">IF</span> <span class="kw1">EXISTS</span> sp_setSeqCustomVal<span class="sy0">//</span>
<span class="kw1">CREATE</span> <span class="kw1">PROCEDURE</span> sp_setCustomVal<span class="br0">&#40;</span>sSeqName <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span><span class="sy0">,</span>  
              sSeqGroup <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">,</span> nVal <span class="kw1">INT</span> <span class="kw1">UNSIGNED</span><span class="br0">&#41;</span>
<span class="kw1">BEGIN</span>
    <span class="kw1">IF</span> <span class="br0">&#40;</span><span class="kw1">SELECT</span> <span class="kw1">COUNT</span><span class="br0">&#40;</span><span class="sy0">*</span><span class="br0">&#41;</span> <span class="kw1">FROM</span> _sequence  
            <span class="kw1">WHERE</span> seq_name <span class="sy0">=</span> sSeqName  
                <span class="kw1">AND</span> seq_group <span class="sy0">=</span> sSeqGroup<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="nu0">0</span> <span class="kw1">THEN</span>
        <span class="kw1">INSERT</span> <span class="kw1">INTO</span> _sequence <span class="br0">&#40;</span>seq_name<span class="sy0">,</span>seq_group<span class="sy0">,</span>seq_val<span class="br0">&#41;</span>
        <span class="kw1">VALUES</span> <span class="br0">&#40;</span>sSeqName<span class="sy0">,</span>sSeqGroup<span class="sy0">,</span>nVal<span class="br0">&#41;</span>;
    <span class="kw1">ELSE</span>
        <span class="kw1">UPDATE</span> _sequence <span class="kw1">SET</span> seq_val <span class="sy0">=</span> nVal
        <span class="kw1">WHERE</span> seq_name <span class="sy0">=</span> sSeqName <span class="kw1">AND</span> seq_group <span class="sy0">=</span> sSeqGroup;
    <span class="kw1">END</span> <span class="kw1">IF</span>;
<span class="kw1">END</span><span class="sy0">//</span>
delimiter ;</pre></div></div></div></div></div></div></div>


</li>
</ol>
<p><strong>Haciendo algunas pruebas:</strong></p>
<ol>
<li>Crear una tabla:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> custom_autonums
<span class="br0">&#40;</span>
   id <span class="kw1">INT</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="kw1">AUTO_INCREMENT</span><span class="sy0">,</span>
   seq_1 <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="co1">-- custom sequence 1</span>
   seq_2 <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="co1">-- custom sequence 2</span>
   <span class="kw1">UNIQUE</span><span class="br0">&#40;</span>seq_1<span class="br0">&#41;</span><span class="sy0">,</span>
   <span class="kw1">UNIQUE</span><span class="br0">&#40;</span>seq_2<span class="br0">&#41;</span>
<span class="br0">&#41;</span>;</pre></div></div></div></div></div></div></div>


</li>
<li>Crear un trigger para la tabla:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1">delimiter <span class="sy0">//</span>
<span class="kw1">DROP</span> <span class="kw1">TRIGGER</span> <span class="kw1">IF</span> <span class="kw1">EXISTS</span> custom_autonums_bi<span class="sy0">//</span>
&nbsp;
<span class="kw1">CREATE</span> <span class="kw1">TRIGGER</span> custom_autonums_bi <span class="kw1">BEFORE</span> <span class="kw1">INSERT</span> <span class="kw1">ON</span> custom_autonums
<span class="kw1">FOR</span> each <span class="kw1">ROW</span>
<span class="kw1">BEGIN</span>
   <span class="kw1">SET</span> <span class="kw1">NEW</span><span class="sy0">.</span>seq_1 <span class="sy0">=</span> getNextCustomSeq<span class="br0">&#40;</span><span class="st0">&quot;seq_1&quot;</span><span class="sy0">,</span><span class="st0">&quot;001&quot;</span><span class="br0">&#41;</span>;
   <span class="kw1">SET</span> <span class="kw1">NEW</span><span class="sy0">.</span>seq_2 <span class="sy0">=</span> getNextCustomSeq<span class="br0">&#40;</span><span class="st0">&quot;seq_2&quot;</span><span class="sy0">,</span><span class="st0">&quot;DBA&quot;</span><span class="br0">&#41;</span>;
<span class="kw1">END</span><span class="sy0">//</span>
&nbsp;
delimiter ;</pre></div></div></div></div></div></div></div>


</li>
<li>Insertando algunos valores:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="kw1">INSERT</span> <span class="kw1">INTO</span> custom_autonums <span class="br0">&#40;</span>id<span class="br0">&#41;</span> <span class="kw1">VALUES</span> <span class="br0">&#40;</span><span class="kw1">NULL</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="kw1">NULL</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="kw1">NULL</span><span class="br0">&#41;</span>;
<span class="kw1">SELECT</span> <span class="sy0">*</span> <span class="kw1">FROM</span> custom_autonums;
<span class="sy0">+</span><span class="co1">----+------------+------------+</span>
<span class="sy0">|</span> id <span class="sy0">|</span> seq_1      <span class="sy0">|</span> seq_2      <span class="sy0">|</span>
<span class="sy0">+</span><span class="co1">----+------------+------------+</span>
<span class="sy0">|</span>  <span class="nu0">4</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000001 <span class="sy0">|</span> DBA<span class="sy0">-</span>000001 <span class="sy0">|</span>
<span class="sy0">|</span>  <span class="nu0">5</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000002 <span class="sy0">|</span> DBA<span class="sy0">-</span>000002 <span class="sy0">|</span>
<span class="sy0">|</span>  <span class="nu0">6</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000003 <span class="sy0">|</span> DBA<span class="sy0">-</span>000003 <span class="sy0">|</span>
<span class="sy0">+</span><span class="co1">----+------------+------------+</span>
<span class="nu0">3</span> <span class="kw1">ROWS</span> <span class="kw1">IN</span> <span class="kw1">SET</span> <span class="br0">&#40;</span><span class="nu0">0.00</span> sec<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


</li>
<li>Alterando los valores actuales:


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="kw1">CALL</span> sp_setCustomVal<span class="br0">&#40;</span><span class="st0">'seq_1'</span><span class="sy0">,</span><span class="st0">'001'</span><span class="sy0">,</span><span class="nu0">675</span><span class="br0">&#41;</span>;
&nbsp;
<span class="kw1">INSERT</span> <span class="kw1">INTO</span> custom_autonums <span class="br0">&#40;</span>id<span class="br0">&#41;</span> <span class="kw1">VALUES</span> <span class="br0">&#40;</span><span class="kw1">NULL</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="kw1">NULL</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="kw1">NULL</span><span class="br0">&#41;</span>;
<span class="kw1">SELECT</span> <span class="sy0">*</span> <span class="kw1">FROM</span> custom_autonums;
<span class="sy0">+</span><span class="co1">----+------------+------------+</span>
<span class="sy0">|</span> id <span class="sy0">|</span> seq_1      <span class="sy0">|</span> seq_2      <span class="sy0">|</span>
<span class="sy0">+</span><span class="co1">----+------------+------------+</span>
<span class="sy0">|</span>  <span class="nu0">4</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000001 <span class="sy0">|</span> DBA<span class="sy0">-</span>000001 <span class="sy0">|</span>
<span class="sy0">|</span>  <span class="nu0">5</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000002 <span class="sy0">|</span> DBA<span class="sy0">-</span>000002 <span class="sy0">|</span>
<span class="sy0">|</span>  <span class="nu0">6</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000003 <span class="sy0">|</span> DBA<span class="sy0">-</span>000003 <span class="sy0">|</span>
<span class="sy0">|</span>  <span class="nu0">7</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000676 <span class="sy0">|</span> DBA<span class="sy0">-</span>000004 <span class="sy0">|</span>
<span class="sy0">|</span>  <span class="nu0">8</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000677 <span class="sy0">|</span> DBA<span class="sy0">-</span>000005 <span class="sy0">|</span>
<span class="sy0">|</span>  <span class="nu0">9</span> <span class="sy0">|</span> 001<span class="sy0">-</span>000678 <span class="sy0">|</span> DBA<span class="sy0">-</span>000006 <span class="sy0">|</span>
<span class="sy0">+</span><span class="co1">----+------------+------------+</span>
<span class="nu0">6</span> <span class="kw1">ROWS</span> <span class="kw1">IN</span> <span class="kw1">SET</span> <span class="br0">&#40;</span><span class="nu0">0.00</span> sec<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


</li>
</ol>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2012/02/valores-auto_increment-personalizados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalar bmon como servicio</title>
		<link>http://www.latindevelopers.com/ivancp/2012/02/instalar-bmon-como-servicio/</link>
		<comments>http://www.latindevelopers.com/ivancp/2012/02/instalar-bmon-como-servicio/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 13:00:30 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[bmon]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=542</guid>
		<description><![CDATA[bmon es una herramienta para monitorear el estado de red actual, es muy útil para saber que cantidad del ancho de banda esta siendo utilizado en ese momento. Lo mas útil es que guarda (en memoria solamente) información histórica de los últimos 60 segundos, minutos,horas y dias; el único problema es que es necesario que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.infradead.org/~tgr/bmon/" target="_blank">bmon</a> es una herramienta para monitorear el estado de red actual, es muy útil para saber que cantidad del ancho de banda esta siendo utilizado en ese momento.</p>
<p>Lo mas útil es que guarda (en memoria solamente) información histórica de los últimos 60 segundos, minutos,horas y dias; el único problema es que es necesario que este corriendo todo el tiempo.</p>
<p><a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/bmon-local.png"><img class="aligncenter size-Big-Preview wp-image-546" title="bmon-local" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/bmon-local-297x300.png" alt="" width="297" height="300" /></a></p>
<p>&nbsp;</p>
<p>En un escenario en el que un servidor Linux es usado como proxy para una red (basicamente) Windows nos será de utilidad acceder a esa información en tiempo real desde cualquier parte de la red.</p>
<p>Para ello podemos dejar ejecutando bmon en una sesión cargada con <a href="http://www.gnu.org/software/screen/" target="_blank">screen</a> al mismo tiempo configuramos bmon para que genere salida HTML cada segundo la cual leeremos desde Apache.</p>
<p>Pasos para instalar y ejecutar:</p>
<ol>
<li>Instalar screen y bmon<code>sudo apt-get install screen bmon</code></li>
<li>Crear el directorio /var/www/bmon-html</li>
<li>Crear el archivo <code>/etc/init/bmon.conf</code>  con el siguiente contenido
<pre>description "bmon bandwidth monitoring process"

start on (local-filesystems and net-device-up and runlevel [2345])
stop on runlevel [016]

exec screen -d -m -S bmon bmon -O html:path=<strong>/var/www/bmon-html</strong></pre>
</li>
<li>Iniciar el servicio:<code>sudo service bmon start</code></li>
<li>Luego estará disponible la pagina  http://localhost/bmon-html/ , y estará actualizada constantemente.<a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/bmon-ubuntu-server.png"><img class="aligncenter size-medium wp-image-547" title="bmon at ubuntu-server" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/bmon-ubuntu-server-405x300.png" alt="" width="405" height="300" /></a></li>
</ol>
<p>Enjoy!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2012/02/instalar-bmon-como-servicio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lo que no me gusta de Linux Mint 12</title>
		<link>http://www.latindevelopers.com/ivancp/2012/01/lo-que-no-me-gusta-de-linux-mint-12/</link>
		<comments>http://www.latindevelopers.com/ivancp/2012/01/lo-que-no-me-gusta-de-linux-mint-12/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 13:00:07 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=531</guid>
		<description><![CDATA[Linux Mint se esta afianzando como la distribución, basada en Ubuntu, mas interesante en lo que a interfaz gráfica de usuario se refiere, me imagino que la a la mayoría no le agradó la idea de usar Unity en primer momento. Con Linux Mint 12 inicialmente tenemos una interfaz con Gnome3 que da la sensación [...]]]></description>
			<content:encoded><![CDATA[<p>Linux Mint se esta afianzando como la distribución, basada en Ubuntu, mas interesante en lo que a interfaz gráfica de usuario se refiere, me imagino que la a la mayoría no le agradó la idea de usar Unity en primer momento.</p>
<p><img class="aligncenter size-medium wp-image-533" title="linux-mint-logo" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/linux-mint-logo-300x95.jpg" alt="" width="300" height="95" />Con Linux Mint 12 inicialmente tenemos una interfaz con Gnome3 que da la sensación de &#8220;menta fresca&#8221;, que es muy amigable pero algunas de sus características no me han gustado tanto:</p>
<ol>
<li><strong>El administrador de conexiones de red no permite mas de un perfil</strong>. Es cierto, cuando uno lleva su maquina a muchos lugares con conexiones diferentes, es muy útil tener perfiles de conexión individuales de tal modo que no tengamos que ir cambiando los números de IP, DNS, etc., cada vez! al igual que Windows, llega a ser fastidioso.  Puedes utilizar algunos aditamentos/scripts que te ayuden pero no hay la misma comodidad.</li>
<li><strong>Las conexiones de red adicionales no conectan automáticamente</strong>. No hay como disfrutar de conectar y usar (plug and play) con las conexiones nuevas (como 3G), Linux Mint 12 necesita que uno active manualmente la red para poder utilizarla, igualmente hay que tomar un tiempo configurando para que sea automático.</li>
<li><strong>El indicador de fecha/hora disminuye su tamaño cuando hay muchos iconos en la barra superior</strong>. Mas de una vez eso me causó problemas, mas aun cuando eres conocido como &#8220;el rey de la puntualidad&#8221;.<img class="aligncenter size-full wp-image-535" title="mint-time-status" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/mint-time-status.png" alt="" width="460" height="52" /></li>
<li><strong>La tecla Super (Windows) no esta muy bien controlada cuando uno tiene instalado Windows en VirtualBox.</strong> Muchos accesos directos de Windows combinan la tecla [Windows] evitando que tengamos que estirar la mano hasta el Mouse, ya se imaginarán usar Windows sin la funcionalidad de la tecla con su nombre.</li>
<li><strong>Las notificaciones visuales cumplen su objetivo pero llegan a ser un fastidio</strong>, por que es necesario acercar el Mouse y cerrar la notificación, a menos que nos guste ver el mensaje durante varios minutos.</li>
<li><strong>No es posible situar ventanas en la parte superior sin que éstas se maximicen</strong>. Es una característica genial que con solo acercar una ventana a la barra superior ésta se maximice como por arte de magia, pero en Linux Mint 12 necesitan ajustar los parámetros para que no ocurra siempre. Por ejemplo para mover a la parte superior la ventana principal de Skype o Pigdin tenemos que hacer malabares para evitar que se maximicen automáticamente.</li>
<li><strong>Ya no puedo usar Negative de Compiz.</strong> Hay otros efectos que se ven geniales, pero Negative me ayuda a bajar la intensidad de brillo de mi laptop cuando estoy en ambientes con poca luminosidad.</li>
<li><strong>Ya no esta disponible las divertidas Fortunes</strong>. Con Linux Mint 11 teníamos configurado por defecto Fortunes, era divertido abrir una terminal, no es difícil de configurar pero debieron mantener esa característica.<img class="aligncenter size-full wp-image-536" title="fortunes" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/fortunes.png" alt="" width="348" height="251" /></li>
<li>Hay mas, pero no creo que sea necesario mencionar el resto de los detalles incómodos que encontré.</li>
</ol>
<p>A pesar de las cuestiones mencionadas, Linux Mint 12 sirve para hacer lo que necesites (como cualquier distribución) pero <del>todas</del> muchas de esas características <strong>son configurables</strong> y podemos hacer que trabajen como nosotros queremos, pero toma un tiempo y la verdad no me interesa hacer eso cuando hay tareas mas importantes y sobre todo si eres un usuario gruñón.</p>
<p>Creo que la balanza se inclina mas al &#8220;No me gusta&#8221;, regresaré a Ubuntu y veré como madura Linux Mint con mucha atención.</p>
<p>Enlaces:</p>
<ul>
<li>Linux Mint: <a title="Linux Mint" href="http://www.linuxmint.com/">http://www.linuxmint.com/</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2012/01/lo-que-no-me-gusta-de-linux-mint-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Readers’ Choice Awards 2011</title>
		<link>http://www.latindevelopers.com/ivancp/2011/12/linux-journal-2011/</link>
		<comments>http://www.latindevelopers.com/ivancp/2011/12/linux-journal-2011/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 01:19:08 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=523</guid>
		<description><![CDATA[Y salieron los premios anuales de la revista Linux Journal, me topé con algunas sorpresas y otras no tanto, y puedo resaltar los ganadores de algunas categorías que me interesan: Mejor distribución de Linux: Ubuntu (faltaba mas) Mejor entorno de escritorio: Gnome 3 (de verdad no esta tan mal) Mejor navegador: Firefox  :/ Mejor gestor [...]]]></description>
			<content:encoded><![CDATA[<p>Y salieron los premios anuales de la revista <a href="http://www.linuxjournal.com/" target="_blank">Linux Journal</a>, me topé con algunas sorpresas y otras no tanto, y puedo resaltar los ganadores de algunas categorías que me interesan:</p>
<ul>
<li>Mejor distribución de Linux: <strong>Ubuntu</strong> (faltaba mas)</li>
<li>Mejor entorno de escritorio: <strong>Gnome 3</strong> (de verdad no esta tan mal)</li>
<li>Mejor navegador: Firefox  <strong>:/</strong></li>
<li>Mejor gestor de base de datos: <strong>MySQL</strong> (seguido muy de cerca por PostgreSQL)</li>
<li>Mejor lenguaje de programación: <strong>Python?</strong> (creo que es hora de empezar con &#8220;esa nota&#8221;)</li>
<li>Mejor juego: <strong>World of Goo </strong>(creo que vale la pena las 20 fichas que cuesta)</li>
</ul>
<p>La lista es larga, son 45 categorías, les sugiero que le hechen un vistazo:</p>
<p><a href="http://www.linuxjournal.com/slideshow/readers-choice-2011" target="_blank">http://www.linuxjournal.com/slideshow/readers-choice-2011</a></p>
<p><a href="http://www.linuxjournal.com/slideshow/readers-choice-2011" target="_blank"><img class="alignnone size-full wp-image-524" title="ReadersChoiceBanner" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/ReadersChoiceBanner.png" alt="" width="400" height="90" /></a></p>
<p>&nbsp;</p>
<p>Y pronto (abril 2012) <a href="http://www.percona.com/live/conferences/" target="_blank">Percona Live: MySQL Conference And Expo 2012</a></p>
<p>Pueden ver y descargar las conferencias del evento 2011 ahi mismo!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2011/12/linux-journal-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eliminar numeros de linea con Vim</title>
		<link>http://www.latindevelopers.com/ivancp/2011/12/eliminar-numeros-de-linea-con-vim/</link>
		<comments>http://www.latindevelopers.com/ivancp/2011/12/eliminar-numeros-de-linea-con-vim/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 17:43:00 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=508</guid>
		<description><![CDATA[¿Quién no ha buscado código fuente en la red? Algunos sitios comparten segmentos de codigo fuente incluyendo el numero de línea, sé que lo hacen intencionalmente por que disfruntan sabiendo que debemos darnos el trabajo de eliminar las numeraciones de linea para poder compilar el codigo brindado, ademas de fijarnos en otros detalles. Aqui una [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/vim-logo.jpeg"><img class="alignright size-full wp-image-313" title="Vim Logo" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/vim-logo.jpeg" alt="" width="116" height="116" /></a>¿Quién no ha buscado código fuente en la red? Algunos sitios comparten segmentos de codigo fuente <strong>incluyendo el numero de línea</strong>, sé que lo hacen intencionalmente por que disfruntan sabiendo que debemos darnos el trabajo de eliminar las numeraciones de linea para poder compilar el codigo brindado, ademas de fijarnos en otros detalles.</p>
<p>Aqui una muestra clásica de un copy paste desde una pagina web hacia Vim (u otro editor):</p>
<p><a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/vim-code-from-web.png"><img class="alignnone size-Big-Preview wp-image-509" title="Codigo fuente con numeros de linea" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/vim-code-from-web-446x300.png" alt="Codigo fuente con numeros de linea" width="446" height="300" /></a></p>
<p>Para un segmento de codigo de unas cuantas lineas no hay ningun problema, pero si se tratan de cientos de lineas, nos tomaría varios minutos&#8230; me da pereza de solo pensarlo.</p>
<p><span style="color: #0000ff;"><strong>Solucion rápida</strong></span>: <a href="http://www.vim.org" target="_blank">Vim</a> nos ofrece una manera facil de reemplazar texto usando <a href="http://vimregex.com/" target="_blank">expresiones regulares</a>. Para este caso es muy fácil armar una expresión que reconozca:</p>
<ol>
<li>Espacios en blanco al inicio <strong>^\s*</strong></li>
<li>Al menos un digito (numero de línea) <strong>[0-9]\+</strong></li>
<li>Unos espacios mas, 0 ó 3 espacios. <strong>\s\{0,3}</strong></li>
</ol>
<p>La expresión regular quedaría así: <strong>^\s*[0-9]\+\s\{0,3}</strong>, luego aplicamos la busqueda y reemplazo en todo el documento con el siguiente comando:  <strong><br />
:%s/^\s*[0-9]\+\s\{0,3}//g </strong><br />
el resultado es el siguiente:</p>
<p><a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/vim-after-grep.png"><img class="alignnone size-Big-Preview wp-image-510" title="VIM: Despues de aplicar el reemplazo grep" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/vim-after-grep-450x300.png" alt="VIM: Despues de aplicar el reemplazo grep" width="450" height="300" /></a></p>
<p>Las expresiones regulares son mucho mas poderosas, este es sólo un caso trivial que nos hace ganar un poco mas de tiempo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2011/12/eliminar-numeros-de-linea-con-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Probando UDFs para MySQL: Title Case</title>
		<link>http://www.latindevelopers.com/ivancp/2011/12/probando-udf-para-mysql-title-case/</link>
		<comments>http://www.latindevelopers.com/ivancp/2011/12/probando-udf-para-mysql-title-case/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 13:00:14 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[udf]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=418</guid>
		<description><![CDATA[Conocemos &#8220;de sobra&#8221; lo que hacen las funciones LCASE y UCASE en MySQL, otros gestores también la implementan con alguna variación en el nombre pero con el mismo resultado. Pero que pasa si queremos una función que convierta un texto al tipo Titulo, conocido también como title case, es decir convertir &#8220;un texto arbitrario&#8221; en [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/logo-mysql-170x115-e1302270861102.png"><img class="alignright size-full wp-image-249" title="Logo mysql" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/logo-mysql-170x115-e1302270861102.png" alt="" width="100" height="67" /></a>Conocemos &#8220;de sobra&#8221; lo que hacen las funciones <a href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_lcase" target="_blank"> LCASE</a> y <a href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_ucase" target="_blank">UCASE</a> en MySQL, otros gestores también la implementan con alguna variación en el nombre pero con el mismo resultado.</p>
<p>Pero que pasa si queremos una función que convierta un texto al tipo Titulo, conocido también como <em>title case</em>, es decir convertir &#8220;<span style="color: #339966;">un texto arbitrario</span>&#8221; en &#8220;<span style="color: #339966;">Un Texto Arbitrario</span>&#8220;, para este caso no existe la función mágica que haga esa conversión y tenemos que escribir una propia.</p>
<p>No es necesario &#8220;reinventar la rueda&#8221; (aunque podría hacerlo), buscando encontré un repositorio de <a href="http://dev.mysql.com/doc/refman/5.0/es/adding-functions.html" target="_blank">funciones UDF</a> para MySQL: <a href="http://www.mysqludf.org/" target="_blank">http://www.mysqludf.org/ </a>, hay varias funciones agrupadas según el objetivo/funcionalidad, solo tienen que descargar el código fuente, compilarlo y agregarlo como funciones nuevas en vuestros servidores MySQL.</p>
<p>He aislado la función <a href="http://www.mysqludf.org/lib_mysqludf_str/#str_ucwords" target="_blank">str_ucwords</a>  (que convierte un texto a &#8220;Title Case&#8221;) en un archivo separado para mostrarles como es que podemos compilar una UDF  para MySQL.Pero <strong>he modificado</strong> el archivo por que solo funcionaba con parámetros constantes, ahora la función acepta nombres de columnas como parámetros.</p>
<p>Pueden descargar el archivo fuente: <a href="http://www.latindevelopers.com/ivancp/wp-content/uploads/ucwords.c">ucwords.c</a></p>
<p>Para compilarlo necesitan unas tres instrucciones:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1"><span class="co0">#Compilamos el programa</span>
<span class="co4">ivancp@ubuntu$ </span><span class="kw2">gcc</span> ucwords.c <span class="re5">-o</span> ucwords.so <span class="re5">-shared</span> <span class="re5">-lmysqlclient</span> -I<span class="sy0">/</span>usr<span class="sy0">/</span>include<span class="sy0">/</span>mysql
&nbsp;
<span class="co0">#Copiamos el archivo de salida en la carpeta de plugins de mysql</span>
<span class="co4">ivancp@ubuntu$ </span><span class="kw2">sudo</span> <span class="kw2">cp</span> ucwords.so <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>mysql<span class="sy0">/</span>plugin
&nbsp;
<span class="co0">#Quitamos el permiso de ejecución del archivo</span>
<span class="co0">#para que pueda cargarlo correctamente</span>
<span class="co4">ivancp@ubuntu$ </span><span class="kw2">sudo</span> <span class="kw2">chmod</span> <span class="re5">-x</span>  <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>mysql<span class="sy0">/</span>plugin<span class="sy0">/</span>ucwords.so</pre></div></div></div></div></div></div></div>


<p>&nbsp;</p>
<ul>
<li>La opción -shared compila el archivo para que pueda ser usado como librería.</li>
<li>La descripción del resto de parámetros van a encontrarla en la entrada: <a title="Leer datos MySQL desde C++ sobre Linux" href="http://www.latindevelopers.com/ivancp/2006/02/mysql-desde-cpp/" target="_blank">Leer datos de MySQL desde C</a></li>
</ul>
<p>Ahora debemos agregar la función  a MySQL:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="mysql"><pre class="de1">mysql<span class="sy1">&gt;</span> <span class="kw1">create</span> <span class="kw1">function</span> str_ucwords <span class="kw1">returns</span> string <span class="kw1">soname</span> <span class="st0">'ucwords.so'</span><span class="sy2">;</span>
Query OK<span class="sy2">,</span> <span class="nu0">0</span> rows affected <span class="br0">&#40;</span><span class="nu0">0.00</span> sec<span class="br0">&#41;</span>
&nbsp;
mysql<span class="sy1">&gt;</span></pre></div></div></div></div></div></div></div>


<p>&nbsp;</p>
<p>Ahora veamos algunas pruebas, esta es una consulta común (los datos están almacenados en mayúsculas o Upper Case):</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="mysql"><pre class="de1">mysql<span class="sy1">&gt;</span><span class="kw1">select</span> nombres <span class="kw1">from</span> tabla<span class="sy2">;</span>
<span class="sy1">+----------------------------------+</span>
<span class="sy1">|</span> nombres                          <span class="sy1">|</span>
<span class="sy1">+----------------------------------+</span>
<span class="sy1">|</span> AGUILAR PALACIOS RICARDO         <span class="sy1">|</span>
<span class="sy1">|</span> ANDIA MARQUEZ LUIS MELITON       <span class="sy1">|</span>
<span class="sy1">|</span> CUYUBAMBA RAMOS VICTOR ALEJANDRO <span class="sy1">|</span>
<span class="sy1">|</span> FELICIANO VELAZCO VICTORIA       <span class="sy1">|</span>
<span class="sy1">|</span> FLORIDA EVANGELISTA LILA REYNA   <span class="sy1">|</span>
<span class="sy1">|</span> LEON LAULATE FERNANDO            <span class="sy1">|</span>
<span class="sy1">|</span> PALACIOS LOPEZ ROXANA BEATRIZ    <span class="sy1">|</span>
<span class="sy1">|</span> REATEGUI RAMIREZ CARLOS          <span class="sy1">|</span>
<span class="sy1">|</span> REINOSO MORI JORGE WILLY         <span class="sy1">|</span>
<span class="sy1">|</span> SALAZAR VALDIVIA WALTER          <span class="sy1">|</span>
<span class="sy1">|</span> SANCHEZ TUTUSIMA CARMEN ROSA     <span class="sy1">|</span>
<span class="sy1">|</span> VELAZCO BERROA PETRONA           <span class="sy1">|</span>
<span class="sy1">+----------------------------------+</span>
<span class="nu0">12</span> rows <span class="kw2">in</span> <span class="kw1">set</span> <span class="br0">&#40;</span><span class="nu0">0.00</span> sec<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>&nbsp;</p>
<p>Aquí esta lo que queremos ver, la consulta primero convierte a minúsculas todo el campo y luego convierte éste resultado a Title Case, vean:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="mysql"><pre class="de1">mysql<span class="sy1">&gt;</span><span class="kw1">select</span> str_ucwords<span class="br0">&#40;</span><span class="kw13">lcase</span><span class="br0">&#40;</span>nombres<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">from</span> tabla<span class="sy2">;</span>
<span class="sy1">+----------------------------------+</span>
<span class="sy1">|</span> str_ucwords<span class="br0">&#40;</span><span class="kw13">lcase</span><span class="br0">&#40;</span>nombres<span class="br0">&#41;</span><span class="br0">&#41;</span>      <span class="sy1">|</span>
<span class="sy1">+----------------------------------+</span>
<span class="sy1">|</span> Aguilar Palacios Ricardo         <span class="sy1">|</span>
<span class="sy1">|</span> Andia Marquez Luis Meliton       <span class="sy1">|</span>
<span class="sy1">|</span> Cuyubamba Ramos Victor Alejandro <span class="sy1">|</span>
<span class="sy1">|</span> Feliciano Velazco Victoria       <span class="sy1">|</span>
<span class="sy1">|</span> Florida Evangelista Lila Reyna   <span class="sy1">|</span>
<span class="sy1">|</span> Leon Laulate Fernando            <span class="sy1">|</span>
<span class="sy1">|</span> Palacios Lopez Roxana Beatriz    <span class="sy1">|</span>
<span class="sy1">|</span> Reategui Ramirez Carlos          <span class="sy1">|</span>
<span class="sy1">|</span> Reinoso Mori Jorge Willy         <span class="sy1">|</span>
<span class="sy1">|</span> Salazar Valdivia Walter          <span class="sy1">|</span>
<span class="sy1">|</span> Sanchez Tutusima Carmen Rosa     <span class="sy1">|</span>
<span class="sy1">|</span> Velazco Berroa Petrona           <span class="sy1">|</span>
<span class="sy1">+----------------------------------+</span>
<span class="nu0">12</span> rows <span class="kw2">in</span> <span class="kw1">set</span> <span class="br0">&#40;</span><span class="nu0">0.00</span> sec<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>&nbsp;</p>
<p>Funciona a la perfección!</p>
<p>Por favor revisen la documentación, en otro post explicaré que deben tener en cuenta para elaborar sus propios UDF:</p>
<p><a href="http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2011/12/probando-udf-para-mysql-title-case/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Mis bugs reportados de MySQL-Workbench</title>
		<link>http://www.latindevelopers.com/ivancp/2011/12/workbench-bugs/</link>
		<comments>http://www.latindevelopers.com/ivancp/2011/12/workbench-bugs/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 13:00:48 +0000</pubDate>
		<dc:creator>ivancp</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[workbench]]></category>

		<guid isPermaLink="false">http://www.latindevelopers.com/ivancp/?p=446</guid>
		<description><![CDATA[Hace algunos meses, mientras usaba MySQL Workbench 3.2.33, noté varios bugs los cuales reporté inmediatamente, Oracle ya publicó la versión 3.2.35 y está apunto de publicar la versión 3.2.36, no había recibido noticias acerca de mis reportes. Siempre es bueno colaborar a la mejora de herramientas libres, en este caso me dí cuenta de algunos [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-249 alignright" title="Logo mysql" src="http://www.latindevelopers.com/ivancp/wp-content/uploads/logo-mysql-170x115-e1302270861102.png" alt="" width="100" height="67" />Hace algunos meses, mientras usaba MySQL Workbench 3.2.33, noté varios bugs los cuales reporté inmediatamente, Oracle ya publicó la versión 3.2.35 y está apunto de publicar la versión 3.2.36, no había recibido noticias acerca de mis reportes.</p>
<p>Siempre es bueno colaborar a la mejora de herramientas libres, en este caso me dí cuenta de algunos detalles, incluso algunos de ellos pasarían desapercibidos. Pasado el tiempo ya, quise saber sobre mis bugs reportados y resulta que todos ya habían sido resueltos, y éstos son:</p>
<p><a href="http://bugs.mysql.com/bug.php?id=60354" target="_blank">60354</a>    Workbench can&#8217;t open a stored procedure<br />
<a href="http://bugs.mysql.com/bug.php?id=60557" target="_blank">60557</a>    Workbench closes without ask to save modified file<br />
<a href="http://bugs.mysql.com/bug.php?id=60562" target="_blank">60562</a>    The action pane won&#8217;t checks the selected database.<br />
<a href="http://bugs.mysql.com/bug.php?id=60576" target="_blank">60576</a>    Workbench adds a extra quote<br />
<a href="http://bugs.mysql.com/bug.php?id=60610" target="_blank">60610</a>    Don&#8217;t assign a correct tab name when open a sql script</p>
<p>Son solamente 5 de cientos de reportes, el equipo que desarrolla MySQL Workbench se encarga de ir resolviendo de a pocos los bugs y van soltando las versiones según les parezca, llegará el día en que los bugs sean solamente unos cuantos por versión, ese día Workbench habrá madurado y será mucho mas estable que hasta ahora.</p>
<p>Cualquiera puede reportar un bug, solo debes ir a la pagina de bugs: http://bugs.mysql.com/report.php detallar lo mejor posible las condiciones donde se genera el &#8220;horror&#8221;. Puede que sea necesario buscar un error similar ya reportado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.latindevelopers.com/ivancp/2011/12/workbench-bugs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

