<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El Blog de Luis &#187; Programación</title>
	<atom:link href="http://lgallardo.com/tag/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://lgallardo.com</link>
	<description>http://lgallardo.com &#62; Un poco de Linux, PS3, PSP y tecnología</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:52:21 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Reparar tablas de MySQL</title>
		<link>http://lgallardo.com/2012/01/12/reparar-tablas-de-mysql/</link>
		<comments>http://lgallardo.com/2012/01/12/reparar-tablas-de-mysql/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 14:00:11 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=3875</guid>
		<description><![CDATA[Si por alguna razón se llegan a encontrar con un mensaje como el siguiente al consultar una tabla: mysql&#62; select * from data_values_queued; ERROR 1194 (HY000): Table 'data_values_queued' is marked as crashed and should be repaired La forma de ver y reparar el problema es la siguiente. CHECK TABLE Primero se procede a verificar la [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/' rel='bookmark' title='Sentencias preparadas de MySQL en C (ejemplo completo)'>Sentencias preparadas de MySQL en C (ejemplo completo)</a></li>
<li><a href='http://lgallardo.com/2011/07/14/conector-mysql-para-openwrt-mips/' rel='bookmark' title='Conector MySql para OpenWrt (MIPS)'>Conector MySql para OpenWrt (MIPS)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="MySQL fix" href="http://farm8.staticflickr.com/7151/6681306521_1459a85f7c_o.jpg" target="_blank"><img class="aligncenter" src="http://farm8.staticflickr.com/7151/6681306521_d8362964d1_m.jpg" alt="MySQL fix" width="240" height="124" /></a></p>
<p>Si por alguna razón se llegan a encontrar con un mensaje como el siguiente al consultar una tabla:</p>
<pre>mysql&gt; select * from data_values_queued;
ERROR 1194 (HY000): Table 'data_values_queued' is marked as crashed and should be repaired</pre>
<p>La forma de ver y reparar el problema es la siguiente.</p>
<h2>CHECK TABLE</h2>
<p>Primero se procede a verificar la tabla, para determinar el problema:</p>
<pre>mysql&gt; check table data_values_queued;
+----------------------------+-------+----------+----------------------------------------------------------+
| Table                      | Op    | Msg_type | Msg_text                                                 |
+----------------------------+-------+----------+----------------------------------------------------------+
| datbas1.data_values_queued | check | warning  | 4 clients are using or haven't closed the table properly |
| datbas1.data_values_queued | check | error    | Size of datafile is: 4200         Should be: 4220        |
| datbas1.data_values_queued | check | error    | Corrupt                                                  |
+----------------------------+-------+----------+----------------------------------------------------------+
3 rows in set (0.05 sec)</pre>
<p>Aquí vemos que la tabla no fue cerrada adecuadamente, por ejemplo producto de un apagón. En mi caso descarto el primer mensaje porque el motor que uso es <em>InnoDB</em>, el cual permite concurrencia en las tablas.</p>
<h2>REPAIR TABLE</h2>
<p>Ahora para reparar la tabla se puede usar la siguiente sentencia:</p>
<pre>mysql&gt; repair table data_values_queued ;
+----------------------------+--------+----------+----------------------------------------+
| Table                      | Op     | Msg_type | Msg_text                               |
+----------------------------+--------+----------+----------------------------------------+
| datbas1.data_values_queued | repair | warning  | Number of rows changed from 144 to 143 |
| datbas1.data_values_queued | repair | status   | OK                                     |
+----------------------------+--------+----------+----------------------------------------+
2 rows in set (0.00 sec)</pre>
<p>&nbsp;</p>
<p>Ya con esto habremos reparado la tabla. Veamos si es así:</p>
<pre>mysql&gt; select * from data_values_queued;
+---------+--------+----------+---------------------+
| id      | iodbId | value    | timestamp           |
+---------+--------+----------+---------------------+
| 1476194 |    170 | 297      | 2012-01-11 08:40:45 |
| 1476193 |    170 | 296      | 2012-01-11 08:40:17 |
| 1476176 |     71 | 11692    | 2012-01-11 05:06:46 |
| 1476177 |     72 | 12061    | 2012-01-11 05:06:46 |
| 1476178 |     73 | 11820    | 2012-01-11 05:06:46 |
| 1476179 |    107 | 11703    | 2012-01-11 05:06:46 |</pre>
<pre>...</pre>
<pre>| 1476258 |    170 | 282      | 2012-01-11 11:07:43 |
+---------+--------+----------+---------------------+
143 rows in set (0.00 sec)</pre>
<h2>Referencias</h2>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/check-table.html" target="_blank">CHECK TABLE Syntax</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/repair-table.html" target="_blank">REPAIR TABLE Syntax</a></li>
</ul>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/' rel='bookmark' title='Sentencias preparadas de MySQL en C (ejemplo completo)'>Sentencias preparadas de MySQL en C (ejemplo completo)</a></li>
<li><a href='http://lgallardo.com/2011/07/14/conector-mysql-para-openwrt-mips/' rel='bookmark' title='Conector MySql para OpenWrt (MIPS)'>Conector MySql para OpenWrt (MIPS)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2012/01/12/reparar-tablas-de-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sentencias preparadas de MySQL en C (ejemplo completo)</title>
		<link>http://lgallardo.com/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/</link>
		<comments>http://lgallardo.com/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 18:21:20 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=3356</guid>
		<description><![CDATA[En el trabajo me tocó hacer una interfaz a una base de datos MySQL desde C puro, y buscando en Internet di con el libro de MySQL Developer&#8217;s Library de Paul DuBois el cual tiene un ejemplo muy bueno de cómo hacer sentencias preparadas usando el conector de C de MySQL en el capítulo 7. [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2012/01/12/reparar-tablas-de-mysql/' rel='bookmark' title='Reparar tablas de MySQL'>Reparar tablas de MySQL</a></li>
<li><a href='http://lgallardo.com/2011/07/14/conector-mysql-para-openwrt-mips/' rel='bookmark' title='Conector MySql para OpenWrt (MIPS)'>Conector MySql para OpenWrt (MIPS)</a></li>
<li><a href='http://lgallardo.com/2009/06/18/respaldo-completo-en-cpanelautomatic-full-backup-on-cpanel/' rel='bookmark' title='Respaldo completo en cPanel'>Respaldo completo en cPanel</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="MySql logo" href="http://farm6.static.flickr.com/5194/5863838834_0729b09cb0.jpg"><img class="alignnone" src="http://farm6.static.flickr.com/5194/5863838834_0729b09cb0.jpg" alt="MySql logo" /></a></p>
<p>En el trabajo me tocó hacer una interfaz a una base de datos MySQL desde C puro, y buscando en Internet di con el libro de <a href="http://www.kitebird.com/mysql-book/" target="_blank"><span style="font-size: small;">MySQL Developer&#8217;s Library de </span>Paul DuBois</a> el cual tiene un ejemplo muy bueno de cómo hacer sentencias preparadas usando el conector de C de MySQL en el <a href="http://www.megaupload.com/?d=14A6MLF6" target="_blank">capítulo 7</a>. Y aunque en el libro explica como ejecutar una sentencia SQL teniendo parámetros preparados (preapared statements) para luego explicar como obtener los datos de la consulta, al final no se ve todo en conjunto por lo que me dispuse a colocar un ejemplo completo:</p>
<blockquote>
<pre>void iodb_getNumAddresses(int id, int *numAddresses){

 MYSQL *conn;
 MYSQL_STMT *stmt;
 char *sql;

 // Bind variables
 MYSQL_BIND param[1], result[1];

 int myId, myNumAddresses;
 my_bool is_null[1];

 sql = "select count(*) from addresses where id = ?";

 // Open Database
 openDB(&amp;conn);

 // Allocate statement handler
 stmt = mysql_stmt_init(conn);

 if (stmt == NULL) {
  print_error(conn, "Could not initialize statement handler");
  return;
 }

 // Prepare the statement
 if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) {
  print_stmt_error(stmt, "Could not prepare statement");
  return;
 }

 // Initialize the result column structures
 memset (param, 0, sizeof (param)); /* zero the structures */
 memset (result, 0, sizeof (result)); /* zero the structures */

 // Init param structure
 // Select
 param[0].buffer_type     = MYSQL_TYPE_LONG;
 param[0].buffer         = (void *) &amp;myId;
 param[0].is_unsigned    = 0;
 param[0].is_null         = 0;
 param[0].length         = 0;

 // Result
 result[0].buffer_type     = MYSQL_TYPE_LONG;
 result[0].buffer         = (void *) &amp;myNumAddresses;
 result[0].is_unsigned    = 0;
 result[0].is_null         = &amp;is_null[0];
 result[0].length         = 0;

 // Bind param structure to statement
 if (mysql_stmt_bind_param(stmt, param) != 0) {
  print_stmt_error(stmt, "Could not bind parameters");
  return;
 }

 // Bind result
 if (mysql_stmt_bind_result(stmt, result) != 0) {
  print_stmt_error(stmt, "Could not bind results");
  return;
 }

 // Set bind parameters
 myId            = id;

 // Execute!!
 if (mysql_stmt_execute(stmt) != 0) {
  print_stmt_error(stmt, "Could not execute statement");
  return;
 }

 if (mysql_stmt_store_result(stmt) != 0) {
  print_stmt_error(stmt, "Could not buffer result set");
  return;
 }

 // Init data
 (*numAddresses) = 0;

 // Fetch
 if(mysql_stmt_fetch (stmt) == 0){
  (*numAddresses) = myNumAddresses;
 }

 // Deallocate result set
 mysql_stmt_free_result(stmt); /* deallocate result set */

 // Close the statement
 mysql_stmt_close(stmt);

 // Close Database
 closeDB(conn);

}</pre>
</blockquote>
<p>Aquí lo importante a resaltar es que se tiene dos estructuras especiales del API MySQL, <em>param</em> y <em>result</em>, las cuales configuran los parámetros que usará la sentencia preparada así como el sitio donde se guardarán los resultados, respectivamente. En este ejemplo, al hacer la consulta se tendrá el valor en la variable <em>numAddresses</em>.</p>
<h2>Referencias</h2>
<ul>
<li><a href="http://www.megaupload.com/?d=14A6MLF6" target="_blank">MySQL Developer&#8217;s Library: Capítulo 7</a> (PDF)</li>
<li><a href="http://www.kitebird.com/mysql-book/" target="_blank">Página del libro MySQL Developer&#8217;s Library</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/c.html" target="_blank">MySQL C API</a></li>
</ul>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2012/01/12/reparar-tablas-de-mysql/' rel='bookmark' title='Reparar tablas de MySQL'>Reparar tablas de MySQL</a></li>
<li><a href='http://lgallardo.com/2011/07/14/conector-mysql-para-openwrt-mips/' rel='bookmark' title='Conector MySql para OpenWrt (MIPS)'>Conector MySql para OpenWrt (MIPS)</a></li>
<li><a href='http://lgallardo.com/2009/06/18/respaldo-completo-en-cpanelautomatic-full-backup-on-cpanel/' rel='bookmark' title='Respaldo completo en cPanel'>Respaldo completo en cPanel</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalación de Subclipse en Debian (y derivados)</title>
		<link>http://lgallardo.com/2011/02/27/instalacion-de-subclipse-en-debian-y-derivados/</link>
		<comments>http://lgallardo.com/2011/02/27/instalacion-de-subclipse-en-debian-y-derivados/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 14:00:51 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=2923</guid>
		<description><![CDATA[&#160; Enlace al video Si estás interesado en instalar Subclipse como cliente SVN para Eclipse, puedes seguir de forma general los pasos explicados a continuación, los cuales son independiente del sistema operativo y serán válidos para Windows, Mac o Linux, salvo el procedimiento de cómo instalar y configurar la librería JavaHL en Debian (y derivados [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2010/12/15/herramientas-de-desarrollo-de-cc-para-eclipse-en-debian/' rel='bookmark' title='Herramientas de desarrollo de C/C++ para Eclipse en Debian'>Herramientas de desarrollo de C/C++ para Eclipse en Debian</a></li>
<li><a href='http://lgallardo.com/2011/11/01/instalacion-de-subdownloader-en-debian/' rel='bookmark' title='Instalación de SubDownloader en Debian'>Instalación de SubDownloader en Debian</a></li>
<li><a href='http://lgallardo.com/2010/04/03/empaquetenado-codigo-python-para-symbian/' rel='bookmark' title='Empaquetenado código Python para Symbian'>Empaquetenado código Python para Symbian</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p style="text-align: center;"><embed type="application/x-shockwave-flash" width="420" height="340" src="http://blip.tv/play/hPMngqeYbgA" allowscriptaccess="always" allowfullscreen="true"></embed><br />
<a href="http://blip.tv/file/4818275" target="_blank">Enlace al video</a></p>
<p>Si estás interesado en instalar Subclipse como cliente SVN para Eclipse, puedes seguir de forma general los pasos explicados a continuación, los cuales son independiente del sistema operativo y serán válidos para Windows, Mac o Linux, salvo el procedimiento de cómo instalar y configurar la librería <em>JavaHL</em> en Debian (y derivados como Ubuntu).</p>
<h2>Instalación de Subclipse:</h2>
<p>De forma general, estos son los pasos para instalar Subclipse en Eclipse:</p>
<ol>
<li>Abrir Eclipse, e ir a <em>Help &gt; Install New Software.</em></li>
<li>Agregar el url de Subclipse para la versión de Eclipse que se tenga. Por ejemplo, para Galileo se debe agregar <em>http://subclipse.tigris.org/update_1.6.x</em></li>
<li>Seleccionar todos los componentes mostrados: <em>Core SVNkit Library, Optional JNA Library (recommended)</em> y <em>Subclipse.</em></li>
<li>Aceptar el acuerdo de licencia para iniciar la instalación. Casi finalizando la instalación nos aparecerá un mensaje advirtiendo que se instalará software no firmado, aquí aceptamos.</li>
<li>Al finalizar nos pedirá reiniciar Eclipse.</li>
</ol>
<h2>Librería JavaHL en Debian</h2>
<p>Sino quieres usar la librería <em>SVNKit</em> sino <em>JavaHL</em> entonces debes instalar el siguiente paquete:</p>
<blockquote>
<pre> aptitude install libsvn-java</pre>
</blockquote>
<p>Luego se tienen dos alternativas para indicarle a Eclipse la existencia de dicha librería:</p>
<ol>
<li>Lo correcto es tratar de hacer que Eclipse lea el archivo de configuración con la ruta a la librería <em>JavaHL</em>. Yo la verdad no he logrado dar con el archivo <em>eclipse.ini</em> para el usuario, solo el archivo general <em>/etc/eclipse.ini</em>. Allí como root se puede puede agregar la línea mostrada en negritas, quedando algo como esto:</li>
<blockquote>
<pre>-startup
plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.0.200.v20090520
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
<strong>-Djava.library.path=/usr/lib/jni</strong>
-Xms128m
-Xmx512m</pre>
</blockquote>
<li>La otra solución es hacer un enlace simbólico a la librería, esto es:</li>
<blockquote>
<pre>ln -s /usr/lib/jni/libsvnjavahl-1.so /usr/lib/</pre>
</blockquote>
<li>Reiniciar Eclipse y verificar yendo a <em>Preferences &gt; Team &gt; SVN</em>, donde debe aparecer la versión de la librería.</li>
</ol>
<h2>Librería SVNKit</h2>
<p>Con la instalación al principio se descargó la librería SVNKit, la cual puede usarse en sustitución de JavaHL, sin necesidad de configurar ningún archivo adicional de inicialización y con la ventaja de ser multiplataforma, es decir, que en Windows y Mac también servirá. Para esto solo hay que ir a <em>Window&gt; Preferences &gt; Team &gt; SVN</em> y seleccionar en la interfaz SVN a usar la opción que diga <em>SVNKit</em>:</p>
<p style="text-align: center;"><a title="SVNKit" href="http://farm6.static.flickr.com/5131/5446166406_7dcebaaeaa.jpg"><img class="alignnone" src="http://farm6.static.flickr.com/5131/5446166406_7dcebaaeaa.jpg" alt="SVNKit" /></a></p>
<p>Ya con esto podrás usar este cliente SVN en Eclipse!!</p>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2010/12/15/herramientas-de-desarrollo-de-cc-para-eclipse-en-debian/' rel='bookmark' title='Herramientas de desarrollo de C/C++ para Eclipse en Debian'>Herramientas de desarrollo de C/C++ para Eclipse en Debian</a></li>
<li><a href='http://lgallardo.com/2011/11/01/instalacion-de-subdownloader-en-debian/' rel='bookmark' title='Instalación de SubDownloader en Debian'>Instalación de SubDownloader en Debian</a></li>
<li><a href='http://lgallardo.com/2010/04/03/empaquetenado-codigo-python-para-symbian/' rel='bookmark' title='Empaquetenado código Python para Symbian'>Empaquetenado código Python para Symbian</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2011/02/27/instalacion-de-subclipse-en-debian-y-derivados/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Plugin Sociable hackeado para bit.ly</title>
		<link>http://lgallardo.com/2010/07/12/plugin-sociable-hackeado-para-bit-ly/</link>
		<comments>http://lgallardo.com/2010/07/12/plugin-sociable-hackeado-para-bit-ly/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 11:30:14 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=2430</guid>
		<description><![CDATA[Estuve probando varios plugins para que los usuarios del blog puedan compartir las entradas en las redes sociales como Twitter o Facebook y el que más me gustó fue Sociable. Pero al probar con Twitter y con Identi.ca me di cuenta que utiliza awe.sw como herramienta para acortar el URL, pero el servicio está colapsado [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2009/10/17/como-instalar-el-plugin-de-flash-en-debian/' rel='bookmark' title='Cómo instalar el plugin de Flash en Debian'>Cómo instalar el plugin de Flash en Debian</a></li>
<li><a href='http://lgallardo.com/2009/06/18/respaldo-completo-en-cpanelautomatic-full-backup-on-cpanel/' rel='bookmark' title='Respaldo completo en cPanel'>Respaldo completo en cPanel</a></li>
<li><a href='http://lgallardo.com/2009/04/17/articulos-en-varios-idiomas-en-wordpressmultilingual-wordpress-posts/' rel='bookmark' title='Artículos en varios idiomas en WordPress'>Artículos en varios idiomas en WordPress</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Sociable WordPress Plugin" href="http://farm5.static.flickr.com/4095/4785976156_dff7195b04.jpg"><img src="http://farm5.static.flickr.com/4095/4785976156_dff7195b04.jpg" alt="Sociable WordPress Plugin" /></a></p>
<p>Estuve probando varios plugins para que los usuarios del blog puedan compartir las entradas en las redes sociales como <em>Twitter</em> o <em>Facebook</em> y el que más me gustó fue <em><a href="http://blogplay.com/plugin" target="_blank">Sociable</a></em>. Pero al probar con <em>Twitter</em> y con<em> Identi.ca</em> me di cuenta que utiliza <a href="http://awe.sm/" target="_blank">awe.sw</a> como herramienta para acortar el URL, pero el servicio está colapsado y no están dando invitaciones. De esta forma me puse a investigar maneras de hacerlo funcionar con <a href="http://bit.ly" target="_blank">Bit.ly</a> y me encontré con un <a href="http://webexpedition18.com/articles/how-to-sociable-wp-plugin-with-auto-tinyurl-or-bitly-shortening/" target="_blank">artículo</a> que describe exactamente lo que quería, sin embargo el código usa la función <em>file_get_contents</em>, la cual arroja el siguiente error en mi servidor:</p>
<blockquote>
<pre>Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/g/gallardo/web/wp-content/plugins/sociable/sociable.php on line 813</pre>
</blockquote>
<p>Que es el resultado de no tener activa la variable <em>allow_url_fopen</em> habilitada en PHP. Después de consultar con mi proveedor de hosting, me aconsejaron que usará <a href="http://www.php.net/manual/en/curl.examples-basic.php" target="_blank">cURL</a> en vez de <em>file_get_contents</em>, por lo que tuve que hacer algunas modificaciones al archivo <em>sociable.php</em>, y agregar el archivo <em>sociable-bitly.php</em> que es donde se acorta los URLs con <em>cURL</em>.</p>
<p>Ambos archivos los coloqué en un zip <a href="http://lgallardo.com/wp-content/uploads/2010/07/sociable.3.5.2-hacked.zip" target="_blank">sociable.3.5.2-hacked.zip</a> por si alguien necesita usarlo. Pero ojo,  que no es el plugin completo sino son únicamente estos archivos para copiar en la carpeta <em>/sociable</em> del plugin oficial. Otro detalle es que se debe editar el archivo <em>sociable-bitly.php</em> para colocar el login y el API Key de Bit.ly en las siguientes líneas:</p>
<blockquote>
<pre>$bitlylogin = 'yourbitlylogin';
$bitlyapikey= 'yourbitlyapikey';</pre>
</blockquote>
<p>Se podría hacer más cosas con este plugin, como por ejemplo quitar por completo el código de awe.sw, crear los campos de entrada para Bit.ly en el panel de administración, o integrarlo con tinyurl. Esperemos que la próxima versión oficial tenga algunos de estos cambios.</p>
<h2>Referencias:</h2>
<ul>
<li><a href="http://webexpedition18.com/articles/how-to-sociable-wp-plugin-with-auto-tinyurl-or-bitly-shortening/" target="_blank">How To: Sociable WP Plugin With Auto TinyURL Or Bit.ly Shortening</a></li>
<li><a href="http://www.php.net/manual/en/book.curl.php" target="_blank">Client URL Library</a></li>
</ul>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2009/10/17/como-instalar-el-plugin-de-flash-en-debian/' rel='bookmark' title='Cómo instalar el plugin de Flash en Debian'>Cómo instalar el plugin de Flash en Debian</a></li>
<li><a href='http://lgallardo.com/2009/06/18/respaldo-completo-en-cpanelautomatic-full-backup-on-cpanel/' rel='bookmark' title='Respaldo completo en cPanel'>Respaldo completo en cPanel</a></li>
<li><a href='http://lgallardo.com/2009/04/17/articulos-en-varios-idiomas-en-wordpressmultilingual-wordpress-posts/' rel='bookmark' title='Artículos en varios idiomas en WordPress'>Artículos en varios idiomas en WordPress</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2010/07/12/plugin-sociable-hackeado-para-bit-ly/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Empaquetenado código Python para Symbian</title>
		<link>http://lgallardo.com/2010/04/03/empaquetenado-codigo-python-para-symbian/</link>
		<comments>http://lgallardo.com/2010/04/03/empaquetenado-codigo-python-para-symbian/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 05:00:12 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=2103</guid>
		<description><![CDATA[Digamos que quieres empaquetar una aplicación Python para teléfonos Symbian de forma que puedas distribuir software en archivos de instalación .sis. ¿Cómo puedes hacerlo? Fácil, con ensymble. Instalación de ensymble En Debian puedes instalarlo desde los repositorios escribiendo: aptitude install ensymble Empaquetado de una aplicación Si tienes un archivo llamado aplicacion.py y quieres convertirlo en [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2011/07/14/conector-mysql-para-openwrt-mips/' rel='bookmark' title='Conector MySql para OpenWrt (MIPS)'>Conector MySql para OpenWrt (MIPS)</a></li>
<li><a href='http://lgallardo.com/2011/02/27/instalacion-de-subclipse-en-debian-y-derivados/' rel='bookmark' title='Instalación de Subclipse en Debian (y derivados)'>Instalación de Subclipse en Debian (y derivados)</a></li>
<li><a href='http://lgallardo.com/2010/11/06/ps3split-script-para-picar-archivos-mayores-a-4gb/' rel='bookmark' title='ps3split: script para picar archivos mayores a 4GB'>ps3split: script para picar archivos mayores a 4GB</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="PyS60" href="http://farm5.static.flickr.com/4014/4478517476_2f19a3591c.jpg"><img class="alignnone" src="http://farm5.static.flickr.com/4014/4478517476_2f19a3591c_m.jpg" alt="PyS60" /></a></p>
<p>Digamos que quieres empaquetar una aplicación <em>Python</em> para teléfonos <em>Symbian </em>de forma que puedas distribuir software en archivos de instalación <em>.sis</em>. ¿Cómo puedes hacerlo? Fácil, con<em> ensymble.</em></p>
<h2>Instalación de ensymble</h2>
<p>En Debian puedes instalarlo desde los repositorios escribiendo:</p>
<blockquote>
<pre>aptitude install ensymble</pre>
</blockquote>
<h2>Empaquetado de una aplicación</h2>
<p>Si tienes un archivo llamado <em>aplicacion.py</em> y quieres convertirlo en un archivo de instalación <em>.sis</em>, solo escribe:</p>
<blockquote>
<pre>ensymble py2sis aplicacion.py</pre>
</blockquote>
<h2>Empaquetado de directorios</h2>
<p>Algunas veces necesitas empaquetar directorios para distribuir librerías. En este caso debes copiar la estructura de directorios que deseas en tu teléfono y copiar allí tus archivos. Por ejemplo, digamos que quieres hacer un archivo <em>.sis</em> para una librería <em>Python</em> que creaste, llamada <em>milib</em> donde los archivos <em>configuraciones.py</em> y <em>red.py</em> serán guardados:</p>
<blockquote>
<pre>mkdir MiLib/pyhon/lib/milib
cp configuraciones.py MiLib/pyhon/lib/milib
cp red.py MiLib/pyhon/lib/milib

ensymble simplesis --caption="MiLib" --version=1.0.2 MiLib</pre>
</blockquote>
<p>Con la última orden terminarás con un archivo llamado <em>MiLib_v1_0_2.sis</em>. Este archivo instalará un directorio llamado  <em>E:\\Python\Lib\milib</em> (o <em>C:\\Python\Lib\milib</em> dependiendo de donde lo instales) con tus dos archivos <em>Python</em>.</p>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2011/07/14/conector-mysql-para-openwrt-mips/' rel='bookmark' title='Conector MySql para OpenWrt (MIPS)'>Conector MySql para OpenWrt (MIPS)</a></li>
<li><a href='http://lgallardo.com/2011/02/27/instalacion-de-subclipse-en-debian-y-derivados/' rel='bookmark' title='Instalación de Subclipse en Debian (y derivados)'>Instalación de Subclipse en Debian (y derivados)</a></li>
<li><a href='http://lgallardo.com/2010/11/06/ps3split-script-para-picar-archivos-mayores-a-4gb/' rel='bookmark' title='ps3split: script para picar archivos mayores a 4GB'>ps3split: script para picar archivos mayores a 4GB</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2010/04/03/empaquetenado-codigo-python-para-symbian/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Octave: una alternativa a MATLAB</title>
		<link>http://lgallardo.com/2009/10/15/octave-una-alternativa-a-matlab/</link>
		<comments>http://lgallardo.com/2009/10/15/octave-una-alternativa-a-matlab/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 05:00:39 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=1510</guid>
		<description><![CDATA[Siempre me había preguntado si existía una alternativa Software Libre a MATLAB para hacer algunas prácticas de laboratorio de la universidad, al estilo de las que puedes encontrarte en materias como procesamiento de señales y comunicaciones. Buscando en Internet me encontré con Octave, así que decidí probarlo y darle una oportunidad. Veamos cómo instalarlo, cómo [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2010/04/29/%c2%bfy-cuanto-tarda-en-compilar-el-kernel-en-una-pc-de-escritorio/' rel='bookmark' title='¿Y cuańto tarda en compilar el kernel en una PC de escritorio?'>¿Y cuańto tarda en compilar el kernel en una PC de escritorio?</a></li>
<li><a href='http://lgallardo.com/2009/08/17/jolicloud-una-distro-para-netbooks/' rel='bookmark' title='Jolicloud una distro para netbooks'>Jolicloud una distro para netbooks</a></li>
<li><a href='http://lgallardo.com/2009/11/12/galculator-una-calculadora-para-xfce/' rel='bookmark' title='Galculator: una calculadora para XFCE'>Galculator: una calculadora para XFCE</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="sombrero" href="http://farm3.static.flickr.com/2558/4010897091_49aa817e36.jpg"><img class="alignnone" src="http://farm3.static.flickr.com/2558/4010897091_49aa817e36_m.jpg" alt="sombrero" /></a></p>
<p>Siempre me había preguntado si existía una alternativa Software Libre a MATLAB para hacer algunas prácticas de laboratorio de la universidad, al estilo de las que puedes encontrarte en materias como procesamiento de señales y comunicaciones. Buscando en Internet me encontré con Octave, así que decidí probarlo y darle una oportunidad. Veamos cómo instalarlo, cómo luce y mis comentarios al respecto&#8230;</p>
<h2>Instalando Octave</h2>
<p>En Debian basta con instalar el siguiente paquete:</p>
<blockquote>
<pre>aptitude install qtoctave</pre>
</blockquote>
<p>Esto instala Octave como intérprete de órdenes, algunos de sus componentes y una interfaz gráfica Qt para usar Octave como haríamos con MATLAB. Si se requiere de otros componentes de Octave se pueden instalar de acuerdo a las necesidades de cada quien. En mi caso yo tuve que instalar el componente decominicaciones:</p>
<blockquote>
<pre>aptitude install octave-communications</pre>
</blockquote>
<h2>Interfaz QtOctave</h2>
<p>La interfaz gráfica permite, entre otras cosas, trabajar con el interprete de órdenes de Octave, ver el listado de variables, editar un archivo .m, y ver el histórico de órdenes; muy similar a como haríamos en MATLAB.</p>
<div class="wp-caption aligncenter" style="width: 510px"><a title="QtOctave" href="http://farm3.static.flickr.com/2487/4011674300_5113de96d0_b.jpg"><img title="Edición de un archivo.m" src="http://farm3.static.flickr.com/2487/4011674300_5113de96d0_b.jpg" alt="QtOctave" width="500" height="260" /></a><p class="wp-caption-text">Edición de un archivo.m</p></div>
<p style="text-align: left;">En la imagen de arriba vemos un script hecho para la práctica de Comunicaciones II (Universidad Simón Bolívar, Caracas &#8211; Venezuela), en el cual se generan algunos códigos de línea para ver cómo lucen en tiempo, sus densidades espectral de potencia, cuán inmune son al ruido y sus patrones de ojo; usando las funciones proporcionadas por la profesora de la materia las cuales fueron hechas en MATLAB. Veamos las imágenes que pude generar:</p>
<p style="text-align: center;"><a title="Tiempo" href="http://farm3.static.flickr.com/2487/4010893463_1b0d4d5a56.jpg"><img title="Señal en tiempo" src="http://farm3.static.flickr.com/2487/4010893463_1b0d4d5a56.jpg" alt="Tiempo" width="240" height="181" /></a><a title="Frecuencia" href="http://farm3.static.flickr.com/2551/4010893465_497e029319.jpg"> <img title="Señal en frecuencia" src="http://farm3.static.flickr.com/2551/4010893465_497e029319.jpg" alt="Frecuencia" width="240" height="181" /></a></p>
<p style="text-align: center;"><a title="Subplot" href="http://farm3.static.flickr.com/2569/4011721619_82e5cfc64c_o.png"><img src="http://farm3.static.flickr.com/2569/4011721619_633b296385_m.jpg" alt="Subplot" width="240" height="181" /></a> <a title="Patron del Ojo" href="http://farm3.static.flickr.com/2618/4011659925_ab26011f92_o.png"><img src="http://farm3.static.flickr.com/2618/4011659925_c5e37b03fd_m.jpg" alt="Patron del Ojo" width="240" height="181" /></a></p>
<h2 style="text-align: left;">Compatibilidad con MATLAB</h2>
<p>Aunque muchas de las órdenes y funciones de MATLAB son reconocidas, no todo está implementado igual o de hecho puede que no esté presente en Octave. Por ejemplo, tuve que editar el archivo scope.m para comentar la orden cla (<span>clear current axes) y la declaración de las variables globales no funcionaron para las funciones en los cripts del Toolbox que me proporcionaron para la práctica. Si tienes algún problema con una orden o función de MATLAB puedes consultar el <a href="http://users.powernet.co.uk/kienzle/octave/matcompat/" target="_blank">listado de compatibilidad Octave &lt;-&gt; MATLAB</a><br />
</span></p>
<h2><span>Comentarios finales</span></h2>
<p><span>A mí parecer Octave es una alternativa real a MATLAB. Pueden decir que no es tan completo como MATLAB&#8230;si, es cierto, pero quién usa MATLAB al 100%?  Por otro lado, </span><span>creo que esta sería una opción para erradicar las malas costumbres de otros sistemas operativos y malos hábitos como comprar licencias privativas que, aunque me consta que en los laboratorios de la universidad tienen sus licencias 100% legales, al final los estudiantes siempre terminan adquiriendo el software pirata para poder hacer sus prácticas en casa. </span></p>
<p><span>¿Se pueden adaptar estos laboratorios a Octave? Yo creo que si. Incluso los estudiantes de post-grado podrían crear código (ejemplo fft6) para contribuir con el proyecto Octave aumentando las librerías de funciones&#8230;Por mi parte, voy a comunicarle mis hallazgos a mi profesora a ver qué opina!<br />
</span></p>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2010/04/29/%c2%bfy-cuanto-tarda-en-compilar-el-kernel-en-una-pc-de-escritorio/' rel='bookmark' title='¿Y cuańto tarda en compilar el kernel en una PC de escritorio?'>¿Y cuańto tarda en compilar el kernel en una PC de escritorio?</a></li>
<li><a href='http://lgallardo.com/2009/08/17/jolicloud-una-distro-para-netbooks/' rel='bookmark' title='Jolicloud una distro para netbooks'>Jolicloud una distro para netbooks</a></li>
<li><a href='http://lgallardo.com/2009/11/12/galculator-una-calculadora-para-xfce/' rel='bookmark' title='Galculator: una calculadora para XFCE'>Galculator: una calculadora para XFCE</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2009/10/15/octave-una-alternativa-a-matlab/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Clases y Objetos en PHP</title>
		<link>http://lgallardo.com/2009/06/26/clases-y-objetos-en-phpphps-classes-and-objects/</link>
		<comments>http://lgallardo.com/2009/06/26/clases-y-objetos-en-phpphps-classes-and-objects/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 03:17:46 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=1134</guid>
		<description><![CDATA[Antes de comenzar a trabajar con clases y objetos, debemos conocer primero la diferencia entre la programación tradicional y la programación orientada a objetos (POO). En la programación tradicional los problemas son resueltos ejecutando una acción tras otra, en otras palabras, escribes un programa donde las acciones son ejecutadas una por una para resolver un [...]]]></description>
			<content:encoded><![CDATA[<p><a title="blocks" href="http://static.flickr.com/2585/3664450394_df2b4a6bb6.jpg"><img class="alignleft" src="http://static.flickr.com/2585/3664450394_df2b4a6bb6_t.jpg" alt="blocks" width="67" height="80" /></a>Antes de comenzar a trabajar con clases y objetos, debemos conocer primero la diferencia entre la programación tradicional y la programación orientada a objetos (POO). En la programación tradicional los problemas son resueltos ejecutando una acción tras otra, en otras palabras, escribes un programa donde las acciones son ejecutadas una por una para resolver un problema.</p>
<p>Por ejemplo, si deseas sumar dos números en PHP, basta con el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>?
<span style="color: #666666; font-style: italic;">// Define dos numeros</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Suma ambos numeros</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;a+b=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$c</span><span style="color: #339933;">;</span>
?<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></div></div>

<p><span id="more-1134"></span></p>
<h2>Programación Orientada a Objetos (POO)</h2>
<p>En POO los problemas se resuelven desde otro punto de vista. Tienes que ver el problema (y su solución) como objetos con propiedades y comportamiento. Por ejemplo, puedes definir un objeto &#8220;escritorio&#8221; con algunas propiedades (ancho, alto, profundidad, color, etc) y comportamiento (estático). Si ahora piensas en un carro, algunas de las propiedades pueden ser el número de ruedas, modelo, año, etc, y su comportamiento puede ser &#8220;moviéndose&#8221; o &#8220;detenido&#8221;.</p>
<p>Ahora vamos a pensar en un ejemplo práctico. Imagina que quieres sumar dos números complejos. En PHP no hay una representación para los números complejos, es decir, no puedes ejecutar esta suma así no más:</p>
<blockquote>
<pre>2+3j
<span style="text-decoration: underline;">1+2j</span> +
3+5J</pre>
</blockquote>
<p>Debes resolver este problema con objetos. Primero que nada, debes escribir una clase (la definición del objeto)  para los números complejos donde definirás sus propiedades y comportamiento. En este caso las propiedades son la parte real e imaginaria, y su comportamiento son las operaciones que puedes ejecutar con dos números (sumar, restar, multiplicar, dividir). Vamos a ver el código PHP:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>?
<span style="color: #000000; font-weight: bold;">class</span> Complejo<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Propiedades</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;">// La parte real</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$y</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;">// La parte imaginaria </span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Constructor (Inicialización del objeto)</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y <span style="color: #339933;">=</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Comportamiento</span>
    <span style="color: #000000; font-weight: bold;">function</span> sumar<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Creamos un nuevo objeto: el número complejo (0,0)</span>
        <span style="color: #000088;">$c</span>     <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Complejo<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Sumamos la parte real</span>
        <span style="color: #000088;">$c</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x     <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Sumamos la parte imaginaria</span>
        <span style="color: #000088;">$c</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y    <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Devolvemos el número complejo resultante</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$c</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">function</span> restar<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Aquí la parte real e imaginaria se restan y son</span>
        <span style="color: #666666; font-style: italic;">// pasadas como argumentos para un nuevo objeto,</span>
        <span style="color: #666666; font-style: italic;">// el cual será retornado como resultado</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Complejo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x<span style="color: #339933;">-</span><span style="color: #000088;">$b</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x<span style="color: #339933;">,</span><span style="color: #000088;">$a</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y<span style="color: #339933;">-</span><span style="color: #000088;">$b</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
?<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></div></div>

<p>Ahora podemos guardar este código como Complejo.php. Aquí omití las otras dos operaciones (multiplicar y dividir).</p>
<h2>Probando nuestros Números Complejos de PHP</h2>
<p>Para probar si la clase funciona, podemos usarlo en un script como este:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>?
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">&quot;Complejo.php&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Definimos un nuevo número complejo</span>
<span style="color: #000088;">$numero</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Complejo<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Parte real: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$numero</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x<span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&amp;lt;br&amp;gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Parte imaginaria: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$numero</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y<span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&amp;lt;br&amp;gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Ahora vamos a probar la suma</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Complejo<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Complejo<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Suma $a y $b</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>sumar<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Mostrar el resultado</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;La suma es: (&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$c</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>x<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;,&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$c</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>y<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;)&quot;</span><span style="color: #339933;">;</span>
?<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></div></div>

<h2>Referencias:</h2>
<ul>
<li><a href="http://us3.php.net/manual/en/language.oop5.php" target="_blank">Classes and Objects (PHP5)</a></li>
<li><a href="http://en.wikipedia.org/wiki/Complex_number" target="_blank">Complex Numbers</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2009/06/26/clases-y-objetos-en-phpphps-classes-and-objects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Respaldo completo en cPanel</title>
		<link>http://lgallardo.com/2009/06/18/respaldo-completo-en-cpanelautomatic-full-backup-on-cpanel/</link>
		<comments>http://lgallardo.com/2009/06/18/respaldo-completo-en-cpanelautomatic-full-backup-on-cpanel/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 05:48:02 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=1049</guid>
		<description><![CDATA[Ayer tuve algunos problemas con la actualización de WordPress 2.8 y, supuestamente, qtranslate (un plugin para soportar varios lenguajes). El asunto es que pude restablecer WordPress 2.7.1 de un respaldo antiguo, pero me di cuenta que databa de hace un mes&#8230;malo, malo. Decidí investigar sobre respaldos automáticos con cPanel y me encontré con la entrada [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/' rel='bookmark' title='Sentencias preparadas de MySQL en C (ejemplo completo)'>Sentencias preparadas de MySQL en C (ejemplo completo)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a title="logo_cpanel" href="http://static.flickr.com/2476/3637218793_8a73212f49.jpg"><img class="alignleft" src="http://static.flickr.com/2476/3637218793_8a73212f49.jpg" alt="logo_cpanel" width="141" height="132" /></a>Ayer tuve algunos problemas con la actualización de <em>WordPress</em> 2.8 y, supuestamente, <em>qtranslate</em> (un plugin para soportar varios lenguajes). El asunto es que pude restablecer <em>WordPress</em> 2.7.1 de un respaldo antiguo, pero me di cuenta que databa de hace un mes&#8230;malo, malo. Decidí investigar sobre respaldos automáticos con <em>cPanel</em> y me encontré con la entrada <a href="http://www.justin-cook.com/wp/2006/12/27/automatic-cpanel-backup-domain-mysql-with-cron-php/" target="_blank">Automatic cPanel backup (domain &amp; MySQL) with cron &amp; PHP</a> de Justin Cook. Allí hay un script para ejecutar la petición de respaldos completos de <em>cPanel</em> con redirección a un servidor ftp en una máquina remota. Debido a que no tengo un servidor ftp, cambié unas líneas para hacer respaldos localmente, de forma que pueda obtener esos respaldos desde la herramienta de respaldos completos de <em>cPanel</em>. Aquí está lo que hice:</p>
<h2>PHP Script</h2>
<blockquote>
<pre>&lt;?php
// Info required for cPanel access
$cpuser = "username";
$cppass = "password";
$domain = "example.com";
$skin = "x3";

// Notification information
$notifyemail = "you@example.com";

// Secure or non-secure mode
$secure = <strong>1</strong>;

// Set to 1 to have web page result appear in your cron log
$debug = 0;

// ** NO EDIT BELOW THIS LINE ***

if ($secure) {
   $url = "ssl://".$domain;
   $port = 2083;
} else {
   $url = $domain;
   $port = 2082;
}

$socket = fsockopen($url,$port);

if (!$socket) {
   echo "Failed to open socket connection… Bailing out!\n"; exit;
}

// Encode authentication string
$authstr = $cpuser.":".$cppass;
$pass = base64_encode($authstr);

$params = \
"dest=homedir&amp;email=$notifyemail&amp;server=&amp;user=&amp;pass=&amp;port=&amp;rdir=";

// Make POST to cPanel
fputs($socket,\
"POST /frontend/".$skin."/backup/dofullbackup.html?".$params." HTTP/1.0\r\n");
fputs($socket,"Host: $domain\r\n");
fputs($socket,"Authorization: Basic $pass\r\n");
fputs($socket,"Connection: Close\r\n");
fputs($socket,"\r\n");

// Grab response even if we don't do anything with it.
while (!feof($socket)) {

$response = fgets($socket,4096);

if ($debug) echo $response;
}
fclose($socket);
?&gt;</pre>
</blockquote>
<p>Puedes descargar este ejemplo <a href="http://lgallardo.com/wp-content/uploads/2009/06/fullbackup.zip" target="_blank">aquí</a>&#8230;</p>
<h2>Cron jobs</h2>
<p>Para tener un respaldo cada 15 días guarda el script de arriba como fullbackup.php y configura el cron en la herramienta de administración de <em>cPanel</em> como se muestra a continuación:</p>
<p style="text-align: center;"><a title="cron-cpanel-web" href="http://static.flickr.com/3659/3637171805_291cee9181.jpg"><img class="alignnone" src="http://static.flickr.com/3659/3637171805_291cee9181.jpg" alt="cron-cpanel-web" /></a></p>
<h2 style="text-align: left;">Referencias  <a href="http://www.justin-cook.com/wp/2006/12/27/automatic-cpanel-backup-domain-mysql-with-cron-php/" target="_blank"></a></h2>
<ul>
<li><a href="http://www.justin-cook.com/wp/2006/12/27/automatic-cpanel-backup-domain-mysql-with-cron-php/" target="_blank">Automatic cPanel backup (domain &amp; MySQL) with cron &amp; PHP</a></li>
</ul>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/' rel='bookmark' title='Sentencias preparadas de MySQL en C (ejemplo completo)'>Sentencias preparadas de MySQL en C (ejemplo completo)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2009/06/18/respaldo-completo-en-cpanelautomatic-full-backup-on-cpanel/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Curso de programación HP48</title>
		<link>http://lgallardo.com/2009/05/12/curso-de-programacion-hp-48programming-the-hp-48/</link>
		<comments>http://lgallardo.com/2009/05/12/curso-de-programacion-hp-48programming-the-hp-48/#comments</comments>
		<pubDate>Tue, 12 May 2009 05:00:51 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[HP-48]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=786</guid>
		<description><![CDATA[Hace un tiempo subí un curso de programación para las calculadoras HP-48g / HP 48gx. El asunto es que perdí la contraseña en ese servidor (angelfire) y no lo pude actualizar más. Así que es tiempo de recuperar lo que es mio: voy a poner el curso completo aquí con más ejemplos y, de ser [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2009/10/16/%c2%bfquieres-ganarte-un-curso-de-ingles/' rel='bookmark' title='¿Quieres ganarte un curso de inglés?'>¿Quieres ganarte un curso de inglés?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="HP-Program" href="http://static.flickr.com/3388/3520469085_6749b4bab4.jpg"><img class="alignnone" src="http://static.flickr.com/3388/3520469085_6749b4bab4.jpg" alt="HP-Program" /></a></p>
<p>Hace un tiempo subí un curso de programación para las calculadoras HP-48g / HP 48gx. El asunto es que perdí la contraseña en ese servidor (angelfire) y no lo pude actualizar más. Así que es tiempo de recuperar lo que es mio: voy a poner el curso completo aquí con más ejemplos y, de ser posible, mejor explicado.</p>
<p>Vamos a comenzar de nuevo&#8230;</p>
<h2>¿Qué es un programa?</h2>
<p>Todo lo que esté entre los caracteres &lt;&lt; &gt;&gt; es tomado  como un programa. Por ejemplo, puedes escribir esto en la calculadora:</p>
<p><code>&lt;&lt; 1 2 + &gt;&gt;<br />
</code></p>
<p>Este programa pone en la pila de la HP los números 1 y 2, y finalmente los suma. Para editar cualquier programa en el modo USER-RPL solo colóquelo  en la pila y pulse &#8220;EDIT&#8221;. Para guardarlo colóquelo en la pila, luego coloque un nombre y presione el botón &#8220;STO&#8221; (también puede escribirlo). Aquí está el ejemplo:</p>
<blockquote><p>3:  &lt;&lt; 1 2 + &gt;&gt;<br />
2:  &#8216;Nombre&#8217;<br />
1:  STO</p></blockquote>
<p>Esto por ahora. En la próxima entrega cubriré la definición de variables&#8230;</p>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2009/10/16/%c2%bfquieres-ganarte-un-curso-de-ingles/' rel='bookmark' title='¿Quieres ganarte un curso de inglés?'>¿Quieres ganarte un curso de inglés?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2009/05/12/curso-de-programacion-hp-48programming-the-hp-48/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Agregando subtítulos a archivos avi</title>
		<link>http://lgallardo.com/2009/04/14/agregando-subtitulos-a-archivos-aviadding-subtitles-to-avi-files/</link>
		<comments>http://lgallardo.com/2009/04/14/agregando-subtitulos-a-archivos-aviadding-subtitles-to-avi-files/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 05:00:15 +0000</pubDate>
		<dc:creator>Luis Gallardo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://lgallardo.com/?p=560</guid>
		<description><![CDATA[En artículos anteriores vimos formas de convertir videos ogv en archivos de  formato avi desde la consola, y luego nos concentramos en ver  cómo integrar esta conversión con Nautilus, el navegador de archivos de Gnome. Ahora veremos cómo agregar subtítulos a los archivos de video .avi a partir de archivos de texto .srt. Para ello [...]
Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2009/04/10/convirtiendo-videos-a-avi/' rel='bookmark' title='Convirtiendo videos a AVI'>Convirtiendo videos a AVI</a></li>
<li><a href='http://lgallardo.com/2009/04/11/conversion-de-videos-ogv-a-avi-desde-gnome/' rel='bookmark' title='Conversión de videos ogv a avi desde Gnome'>Conversión de videos ogv a avi desde Gnome</a></li>
<li><a href='http://lgallardo.com/2009/06/06/acciones-personalizadas-en-thunarcustom-actions-in-thunar/' rel='bookmark' title='Acciones personalizadas en Thunar'>Acciones personalizadas en Thunar</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a title="Subtítulos" href="http://static.flickr.com/3404/3435341572_9973a50331.jpg"><img class="alignleft" src="http://static.flickr.com/3404/3435341572_9973a50331_t.jpg" alt="Subtítulos" width="90" height="68" /></a></p>
<p>En artículos anteriores vimos formas de c<a href="http://lgallardo.com/2009/04/10/convirtiendo-videos-a-avi/" target="_blank">onvertir videos ogv en archivos de  formato avi </a>desde la consola, y luego nos concentramos en ver  <a href="http://lgallardo.com/2009/04/11/conversion-de-videos-ogv-a-avi-desde-gnome/" target="_blank">cómo integrar esta conversión con Nautilus</a>, el navegador de archivos de Gnome. Ahora veremos cómo agregar subtítulos a los archivos de video .avi a partir de archivos de texto .srt. Para ello usaremos el comando <em>mencoder</em> con la opción <em>-sub</em>, como vemos en el ejemplo siguiente:</p>
<blockquote><p>mencoder <strong><span style="color: #ff0000;">archivo.avi</span></strong> \<br />
-ovc lavc -oac mp3lame \<br />
-sub <strong><span style="color: #ff6600;">archivo.srt</span></strong> \<br />
-font &#8220;/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf&#8221; -subfont-autoscale 2 \<br />
-o <strong><span style="color: #000080;">archivo-sub.avi</span></strong></p></blockquote>
<p>En este ejemplo <em>mencoder</em> toma como entrada el &#8220;archivo.avi&#8221;, codifica el video con lavc (mpeg4) y el audio con mp3lame (mp3), le pega los subtítulos contenidos en &#8220;archivo.srt&#8221;, usa el estilo de fuentes DejaVuSans, escala los subtítulos al ancho del video, y finalmente lo guarda en &#8220;archivo-sub.avi&#8221;.</p>
<p><span id="more-560"></span></p>
<h2>En un Script</h2>
<p>El ejemplo anterior se pude colocar en un script para evitar tener que escribir todos los parámetros en la consola. Para simplificar un poco las cosas, supondremos que el archivo de texto se llama igual que el archivo de video, es decir si tenemos un archivo llamado &#8220;ejemplo.avi&#8221;, debe haber un archivo de subtítulos llamado &#8220;ejemplo.srt&#8221;. Entonces vamos a crear el sript &#8220;AddSub2Avi&#8221; el cual contendrá lo siguiente:</p>
<blockquote><p>#!/bin/bash<br />
mencoder $1 -ovc lavc -oac mp3lame \<br />
-sub &#8220;$(echo $1 | sed &#8216;s/avi$/srt/&#8217;)&#8221; \<br />
-font &#8220;/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf&#8221; -subfont-autoscale 2 \<br />
-o &#8220;$(echo $1 | sed &#8216;s/avi$/\-sub\.avi/&#8217;)&#8221;</p></blockquote>
<p>Ahora bastará con ejecutar este script desde un terminal, pasándole como parámetro el nombre del archivo de video avi:</p>
<blockquote><p>./AddSub2Avi ejemplo.avi</p></blockquote>
<h2>Integración con Gnome</h2>
<p>Podemos copiar este script en la carpeta <em>~/.gnome2/nautilus-scripts</em> para poder ejecutarlo desde el navegador de archivos al hacer clic derecho sobre el archivo avi que queramos añadirle subtítulos. Solo tenemos que tener en cuenta que debe haber un archivo .srt con el mismo nombre del archivo .avi original.</p>
<blockquote><p>cp ./AddSub2Avi ~/.gnome2/nautilus-scripts</p></blockquote>
<p>Artículos relacionados:<ol>
<li><a href='http://lgallardo.com/2009/04/10/convirtiendo-videos-a-avi/' rel='bookmark' title='Convirtiendo videos a AVI'>Convirtiendo videos a AVI</a></li>
<li><a href='http://lgallardo.com/2009/04/11/conversion-de-videos-ogv-a-avi-desde-gnome/' rel='bookmark' title='Conversión de videos ogv a avi desde Gnome'>Conversión de videos ogv a avi desde Gnome</a></li>
<li><a href='http://lgallardo.com/2009/06/06/acciones-personalizadas-en-thunarcustom-actions-in-thunar/' rel='bookmark' title='Acciones personalizadas en Thunar'>Acciones personalizadas en Thunar</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://lgallardo.com/2009/04/14/agregando-subtitulos-a-archivos-aviadding-subtitles-to-avi-files/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

