<?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>Linux Hispano &#187; programación</title> <atom:link href="http://www.linuxhispano.net/etiqueta/programacion/feed/" rel="self" type="application/rss+xml" /><link>http://www.linuxhispano.net</link> <description>Noticias, tira, podcast, juegos, Linux y software libre</description> <lastBuildDate>Thu, 09 Feb 2012 22:01:44 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Diferencia entre DELETE, TRUNCATE y DROP en SQL</title><link>http://www.linuxhispano.net/2012/02/06/diferencia-entre-delete-truncate-y-drop-en-sql/</link> <comments>http://www.linuxhispano.net/2012/02/06/diferencia-entre-delete-truncate-y-drop-en-sql/#comments</comments> <pubDate>Mon, 06 Feb 2012 10:12:14 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[delete]]></category> <category><![CDATA[drop]]></category> <category><![CDATA[drop database]]></category> <category><![CDATA[drop table]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[sql]]></category> <category><![CDATA[truncate]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8874</guid> <description><![CDATA[Cuando manejamos una base de datos SQL, además de manejar creaciones de tablas (CREATE TABLE), inserciones (INSERT), consultas (SELECT) y actualizaciones (UPDATE); dentro de las operaciones básicas también tenemos las que implican borrado. Borrado de diferentes tipos: de filas que &#8230; <a
href="http://www.linuxhispano.net/2012/02/06/diferencia-entre-delete-truncate-y-drop-en-sql/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Cuando manejamos una base de datos SQL, además de manejar creaciones de tablas (CREATE TABLE), inserciones (INSERT), consultas (SELECT) y actualizaciones (UPDATE); dentro de las operaciones básicas también tenemos las que implican borrado. Borrado de diferentes tipos: de filas que cumplan una serie de condiciones, de todos los datos de una tabla o de la tabla con su estructura. Veamos cada una de ellas, con su sintaxis y un ejemplo.</p><p>Manejamos para el ejemplo una tabla entradas, que trata sobre la entradas de un blog y que almacena básicamente la siguiente información: identificador, título, cuerpo y tiempo de salida.</p><p><strong>DELETE</strong></p><p>Borra una serie de filas de la tabla. Podemos usar una claúsula WHERE para limitar las filas a borrar, a las que cumplan una condición. La sintaxis sería:</p><pre>DELETE FROM nombre_tabla WHERE condicion</pre><p><span
id="more-8874"></span></p><p>Para nuestro caso:</p><pre>DELETE FROM entradas WHERE id = 2;</pre><p><strong>TRUNCATE</strong></p><p>A diferencia de DELETE, TRUNCATE elimina todas las filas de la tabla sin borrar la tabla. También <a
href="http://www.linuxhispano.net/2010/02/03/resetear-autoincremento-en-mysql/" target="_blank">resetea los contadores de auto incremento a 0</a>. No borra la tabla como tal, la llamada estructura, por lo que luego puede comenzar a hacer inserciones. La sintaxis es:</p><pre>TRUNCATE TABLE nombre_tabla;</pre><p>Y para nuestro caso:</p><pre>TRUNCATE TABLE entradas;</pre><p><strong>DROP</strong></p><p>Finalmente llegamos a DROP. A diferencia de la anterior, DROP no sólo elimina los datos, sino que también eliminar la estructura de la tabla.</p><pre>DROP TABLE nombre_tabla;</pre><p>Y para nuestro caso:</p><pre>DROP TABLE entradas;</pre><p><strong>DROP DATABASE</strong></p><p>A modo de bonus os traigo una instrucción más. Es idéntica a la anterior pero en lugar de borrar una tabla, borra una base de datos al completo. Podemos incluir en la sentencia IF EXISTS de forma que evitemos el error en caso de que no exista la base de datos (muy útil a la hora de <a
href="http://www.linuxhispano.net/2011/03/31/hacer-backup-y-restaurar-copia-de-seguridad-con-mysql/" target="_blank">hacer copias de seguridad</a> de las bases de datos).</p><pre>DROP DATABASE [IF EXISTS] nombre_base_datos;</pre><p>Y para nuestro caso:</p><pre>DROP DATABASE blog;</pre><p>Señalar que en MySQL no eliminar la estructura de permisos asociada a la base de datos. Para ello usaremos <a
target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/grant.html" target="_blank">GRANT</a>, pero de eso ya hablaremos en otra entrada en la que comentaremos los permisos con <a
target="_blank" href="http://linuxhispano.net/etiqueta/mysql" target="_blank">MySQL</a>.</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2012/02/06/diferencia-entre-delete-truncate-y-drop-en-sql/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Enviar correo usando un servidor SMTP con PHP</title><link>http://www.linuxhispano.net/2012/02/02/enviar-correo-usando-un-servidor-smtp-con-php/</link> <comments>http://www.linuxhispano.net/2012/02/02/enviar-correo-usando-un-servidor-smtp-con-php/#comments</comments> <pubDate>Thu, 02 Feb 2012 11:09:48 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[correo]]></category> <category><![CDATA[php]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[servidor]]></category> <category><![CDATA[smtp]]></category> <category><![CDATA[spam]]></category> <category><![CDATA[wordpress]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8829</guid> <description><![CDATA[Dentro de las funcionalidades básicas de cualquier aplicación web se encuentra la comunicación con el usuario a través de correo electrónico. Tenemos la opción fácil y directa de usar la función mail() de PHP que usa un demonio de SMTP propio &#8230; <a
href="http://www.linuxhispano.net/2012/02/02/enviar-correo-usando-un-servidor-smtp-con-php/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Dentro de las funcionalidades básicas de cualquier aplicación web se encuentra la comunicación con el usuario a través de correo electrónico. Tenemos la opción fácil y directa de usar la función <a
target="_blank" href="http://php.net/manual/es/function.mail.php" target="_blank">mail()</a> de <a
target="_blank" href="http://www.linuxhispano.net/etiqueta/php/" target="_blank">PHP</a> que usa un demonio de <a
href="http://www.linuxhispano.net/?s=smtp" target="_blank">SMTP</a> propio (suele ser <a
href="http://www.sendmail.com/sm/open_source/" target="_blank">sendmail</a>), sin embargo, los filtros de spam harán su labor y aunque seamos confiables, tenemos todas las papeletas para que nos tachen de los contrario y el correo no llegará a su destino.</p><p><a
href="http://www.linuxhispano.net/wp-content/uploads/2012/02/Mail.png"><img
class="aligncenter size-full wp-image-8987" title="Mail" src="http://www.linuxhispano.net/wp-content/uploads/2012/02/Mail.png" alt="Enviar correo usando servidor SMTP con PHP" width="256" height="256" /></a></p><p>La solución es usar un servidor SMTP externo, aquí mismo explicamos <a
href="http://www.linuxhispano.net/2011/03/02/suscribir-comentarios-en-wordpress-usando-gmail/" target="_blank">cómo hacer uso del servidor SMTP de Gmail para usarlo dentro de WordPress</a>, pero vamos a explicaros un método válido para cualquier aplicación que desarrolléis con PHP.</p><p>Lo primero que tenemos que hacer es descargar la clase que se encargará del trabajo, es software libre bajo licencia GPL, hablamos del proyecto <a
target="_blank" href="http://sourceforge.net/projects/phpmailer/" target="_blank">PHPMailer</a>. Descargamos la última versión disponible para nuestra versión de PHP (aquí hablaremos de la versión más actual, la que corresponde con PHP 5) y descomprimimos.</p><p><span
id="more-8829"></span></p><p>La clase tiene otras funcionalidades, pero nosotros como sólo vamos a enviar correo, usaremos el código de los ficheros:</p><ul><li>class.phpmailer.php</li><li>class.smtp.php</li></ul><p>El procedimiento es el siguiente: incluimos los ficheros en cuestión, instanciamos un objeto, asignamos sus atributos (asunto, remitente, destinatario, cuerpo del mensaje) y finalmente ejecutamos un método que lo envía.</p><p>Veamos un ejemplo completo:</p><pre>require(‘class.phpmailer.php’);
require(‘class.smtp.php’);
$mail = new PHPMailer();
$body = “Cuerpo del mensaje”;
$mail-&gt;IsSMTP();
// la dirección del servidor, p. ej.: smtp.servidor.com
$mail-&gt;Host = “direccion_servidor”;
// dirección remitente, p. ej.: no-responder@miempresa.com
$mail-&gt;From = “Dirección_remitente”;
// nombre remitente, p. ej.: "Servicio de envío automático"
$mail-&gt;FromName = “Nombre_remitente”;
// asunto y cuerpo alternativo del mensaje
$mail-&gt;Subject = “Asunto”;
$mail-&gt;AltBody = “Cuerpo alternativo
    para cuando el visor no puede leer HTML en el cuerpo”;
// si el cuerpo del mensaje es HTML
$mail-&gt;MsgHTML($body);
// podemos hacer varios AddAdress
$mail-&gt;AddAddress(“dirección_destino”, “Nombre_destino”);
// si el SMTP necesita autenticación
$mail-&gt;SMTPAuth = true;
// credenciales usuario
$mail-&gt;Username = “Usuario”;
$mail-&gt;Password = “Contraseña”;
if(!$mail-&gt;Send()) {
echo “Error enviando: ” . $mail-&gt;ErrorInfo;
} else {
echo “¡¡Enviado!!”;
}</pre>]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2012/02/02/enviar-correo-usando-un-servidor-smtp-con-php/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Inserta un botón de Twitter en tu web</title><link>http://www.linuxhispano.net/2012/01/19/inserta-un-boton-de-twitter-en-tu-web/</link> <comments>http://www.linuxhispano.net/2012/01/19/inserta-un-boton-de-twitter-en-tu-web/#comments</comments> <pubDate>Thu, 19 Jan 2012 16:45:27 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[botón]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[web]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8858</guid> <description><![CDATA[A día de hoy, es básico integrar las redes sociales en nuestros sitios web para aprovechar todas las sinergias posibles. Un ejemplo de ello es Twitter y las posibilidades que nos ofrece: compartir enlaces, twittear, seguir, etiquetar o mencionar. Podemos dejar &#8230; <a
href="http://www.linuxhispano.net/2012/01/19/inserta-un-boton-de-twitter-en-tu-web/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p
style="text-align: center;"><a
href="http://www.linuxhispano.net/wp-content/uploads/2012/01/twitter-logo.png"><img
class="aligncenter  wp-image-8906" title="twitter-logo" src="http://www.linuxhispano.net/wp-content/uploads/2012/01/twitter-logo.png" alt="Logo de Twitter" width="294" height="294" /></a></p><p>A día de hoy, es básico integrar las redes sociales en nuestros sitios web para aprovechar todas las sinergias posibles. Un ejemplo de ello es <a
target="_blank" href="https://twitter.com/fjcarazo" target="_blank">Twitter</a> y las posibilidades que nos ofrece: compartir enlaces, twittear, seguir, etiquetar o mencionar.</p><p>Podemos dejar al usuario, que copie nuestra URL y se encargue de difundirnos voluntariamente o podemos intentar facilitarle la vida. Si usas <a
target="_blank" href="http://www.linuxhispano.net/etiqueta/wordpress" target="_blank">WordPress</a> puedes usar uno de los múltiples <a
href="http://wordpress.org/extend/plugins/tags/twitter" target="_blank">plugins</a> disponibles. Si no lo usas o quieres hacerlo a mano incluso con <a
href="http://www.linuxhispano.net/etiqueta/wordpress" target="_blank">WordPress</a> sigue los pasos que aquí vamos a comentar.</p><p>Primero, accedemos a la web de recursos pertinente de <a
target="_blank" href="https://twitter.com/fjcarazo" target="_blank">Twitter</a>: <a
target="_blank" href="https://twitter.com/about/resources/buttons" target="_blank">Botones de Twitter</a>. Elegimos el botón, por ejemplo &#8220;Seguir&#8221; y rellenamos en el formulario que aparece. Dentro de él:</p><ul><li>Nombre de usuario</li><li>Si el botón es grande</li><li>Idioma</li></ul><p><a
href="http://www.linuxhispano.net/wp-content/uploads/2012/01/botones_de_twitter.png"><img
class="aligncenter size-full wp-image-8905" title="botones_de_twitter" src="http://www.linuxhispano.net/wp-content/uploads/2012/01/botones_de_twitter.png" alt="Botones de Twitter" width="550" height="381" /></a></p><p>Y nos devolverá el enlace listo para insertar en código HTML.</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2012/01/19/inserta-un-boton-de-twitter-en-tu-web/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Formatear y redondear un número en MySQL</title><link>http://www.linuxhispano.net/2012/01/18/formatear-y-redondear-un-numero-en-mysql/</link> <comments>http://www.linuxhispano.net/2012/01/18/formatear-y-redondear-un-numero-en-mysql/#comments</comments> <pubDate>Wed, 18 Jan 2012 19:00:05 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[formatear]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[número]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[redondear]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8873</guid> <description><![CDATA[Cuando trabajamos con cantidades con decimales en MySQL, es posible que queramos formatear nuestro número. Este problema es muy usual si usamos números en coma flotante: FLOAT y DOUBLE. Yo siempre suelo recomendar excepto para aplicaciones de muy alto rendimiento &#8230; <a
href="http://www.linuxhispano.net/2012/01/18/formatear-y-redondear-un-numero-en-mysql/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Cuando trabajamos con cantidades con decimales en MySQL, es posible que queramos formatear nuestro número. Este problema es muy usual si usamos <a
target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/floating-point-types.html" target="_blank">números en coma flotante</a>: FLOAT y DOUBLE. Yo siempre suelo recomendar excepto para aplicaciones de muy alto rendimiento usar el tipo <a
target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html" target="_blank">DECIMAL</a>, de forma que guardemos el valor exacto y no aproximado (otro día hablaremos de la representación de números decimales en forma de coma flotante y las ventajas e inconvenientes que tiene).</p><p>Imaginemos que guardamos las cantidades de un determinado importe en DOUBLE, al hacer una consulta nos sale una cantidad de números decimales demasiado grande. La idea es redondear el número de forma que sólo aparezcan sólo dos decimales:</p><pre>SELECT ROUND(importe, 2)
FROM compras;</pre><p><span
id="more-8873"></span></p><p>Si queremos formatear el número de forma que aparezca separado por comas los miles y por un punto la parte decimal (estilo americano), usaremos la función <a
target="_blank" href="http://dev.mysql.com/doc/refman/5.0/es/miscellaneous-functions.html" target="_blank">FORMAT</a>. También le indicamos cuántos decimales queremos.</p><pre>SELECT FORMAT(12332.1,4);</pre><p>La salida sería: &#8217;12,332.1000&#8242; y será una cadena, no un número.</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2012/01/18/formatear-y-redondear-un-numero-en-mysql/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Unir cadenas en MySQL</title><link>http://www.linuxhispano.net/2012/01/16/unir-cadenas-en-mysql/</link> <comments>http://www.linuxhispano.net/2012/01/16/unir-cadenas-en-mysql/#comments</comments> <pubDate>Mon, 16 Jan 2012 10:58:39 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[cadena]]></category> <category><![CDATA[concatenar]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[unir]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8869</guid> <description><![CDATA[Es muy frecuente que a la hora de almacenar los nombres y apellidos, por ejemplo, de unas personas en la base de datos los pongamos en dos columnas separadas. A la hora de hacer consultas, necesitaremos hacer unirlas, es decir &#8230; <a
href="http://www.linuxhispano.net/2012/01/16/unir-cadenas-en-mysql/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Es muy frecuente que a la hora de almacenar los nombres y apellidos, por ejemplo, de unas personas en la base de datos los pongamos en dos columnas separadas. A la hora de hacer consultas, necesitaremos hacer unirlas, es decir concatenarlas.</p><p>En <a
href="http://www.linuxhispano.net/etiqueta/mysql/" target="_blank">MySQL</a> esta operación puede ser directa, imaginemos una tabla personas con la siguiente estructura:</p><ul><li>DNI: varchar que es clave primaria</li><li>Nombre: varchar</li><li>Apellidos: varchar</li></ul><p>Queremos hacer una consulta en la que aparezca el dni seguido de los apellidos y el nombre unidos y separados por una coma. Sólo tendremos que hacer lo siguiente, usar la función <a
target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat" target="_blank">CONCAT()</a>:</p><p><span
id="more-8869"></span></p><pre>SELECT dni, CONCAT(apellidos, ', ', nombre)
FROM personas;</pre><p>La función acepta un número indeterminado de parámetros de tipo cadena y devuelve la concatenación de las mismas.</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2012/01/16/unir-cadenas-en-mysql/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>¿Cómo conocer desde un plugin el directorio del fichero wp-config.php en WordPress?</title><link>http://www.linuxhispano.net/2012/01/11/como-conocer-desde-un-plugin-el-directorio-del-fichero-wp-config-php-en-wordpress/</link> <comments>http://www.linuxhispano.net/2012/01/11/como-conocer-desde-un-plugin-el-directorio-del-fichero-wp-config-php-en-wordpress/#comments</comments> <pubDate>Wed, 11 Jan 2012 12:44:03 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[cms]]></category> <category><![CDATA[php]]></category> <category><![CDATA[plugin]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[wordpress]]></category> <category><![CDATA[wp-config]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8827</guid> <description><![CDATA[Si estamos desarrollando un plugin para WordPress, en ocasiones, necesitaremos llegar al fichero wp-config.php para hacer una serie de comprobaciones o para leer unos datos de configuración. Sin embargo, no siempre será la misma ruta ya que nuestro plugin o &#8230; <a
href="http://www.linuxhispano.net/2012/01/11/como-conocer-desde-un-plugin-el-directorio-del-fichero-wp-config-php-en-wordpress/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Si estamos desarrollando un plugin para <a
target="_blank" href="http://www.linuxhispano.net/etiqueta/wordpress/">WordPress</a>, en ocasiones, necesitaremos llegar al fichero <a
href="http://ayudawordpress.com/introduccon-al-wp-configphp-de-wordpress/" target="_blank">wp-config.php</a> para hacer una serie de comprobaciones o para leer unos datos de configuración.</p><p>Sin embargo, no siempre será la misma ruta ya que nuestro plugin o tema puede que esté instalado en un directorio no estándar o que la llamada se haga estando en un directorio a un nivel distinto. Para ahorrarnos problemas de rutas os presento el método siguiente:</p><pre>while(!is_file('wp-config.php')){
  if(is_dir('../'))
      chdir('../');
  else
      die('Could not find WordPress.');
}</pre><p><span
id="more-8827"></span></p><p>Una vez lo habéis encontrado, podéis incluirlo:</p><pre>include( 'wp-config.php' );</pre><p>O mostrar el directorio en cuestión con la función oportuna:</p><pre>getcwd()</pre>]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2012/01/11/como-conocer-desde-un-plugin-el-directorio-del-fichero-wp-config-php-en-wordpress/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Cómo obtener geodatos de una dirección IP en PHP</title><link>http://www.linuxhispano.net/2012/01/07/como-obtener-geodatos-de-una-direccion-ip-en-php/</link> <comments>http://www.linuxhispano.net/2012/01/07/como-obtener-geodatos-de-una-direccion-ip-en-php/#comments</comments> <pubDate>Sat, 07 Jan 2012 02:36:55 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[ciudad]]></category> <category><![CDATA[geodatos]]></category> <category><![CDATA[ip]]></category> <category><![CDATA[latitud]]></category> <category><![CDATA[longitud]]></category> <category><![CDATA[php]]></category> <category><![CDATA[programación]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8801</guid> <description><![CDATA[Cuando desarrollamos servicios web, puede resultarnos de interés conocer geodatos de nuestro visitante: ciudad, región, código de área, etc. ¿Cómo averiguar estos datos usando PHP? Muy simple, haciendo una llamada a geoplugin.net. Si hacemos una llamada del siguiente tipo (la dirección &#8230; <a
href="http://www.linuxhispano.net/2012/01/07/como-obtener-geodatos-de-una-direccion-ip-en-php/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Cuando desarrollamos servicios web, puede resultarnos de interés conocer geodatos de nuestro visitante: ciudad, región, código de área, etc. ¿Cómo averiguar estos datos usando <a
target="_blank" href="http://www.linuxhispano.net/etiqueta/php" target="_blank">PHP</a>? Muy simple, haciendo una llamada a <a
href="http://www.geoplugin.net/" target="_blank">geoplugin.net</a>.</p><p>Si hacemos una llamada del siguiente tipo (la dirección IP es la del servidor DNS de la UCO): <a
target="_blank" href="http://www.geoplugin.net/php.gp?ip=150.214.110.3">http://www.geoplugin.net/php.gp?ip=150.214.110.3</a>, obtenemos una salida en forma de cadena con <a
target="_blank" href="http://www.php.net/manual/es/function.serialize.php" target="_blank">un objeto de PHP serializado</a>.</p><p>Por lo tanto nos limitaremos a:</p><ol><li>Hacer una llamada a dicho servicio web</li><li>Descargar el resultado de la petición en forma de cadena con la función <a
target="_blank" href="http://php.net/manual/es/function.file-get-contents.php" target="_blank">file_get_contents()</a></li><li>Usar el proceso inverso a serializar para recuperar los diferentes valores</li></ol><p><span
id="more-8801"></span></p><p>Podemos usar $_SERVER['REMOTE_ADDR'] para obtener la dirección IP de nuestro visitante. Aquí tenéis un ejemplo completo:</p><pre>$meta = unserialize(file_get_contents('
http://www.geoplugin.net/php.gp?ip='.$_SERVER['REMOTE_ADDR']));
$latitud = $meta['geoplugin_latitude'];
$longitud = $meta['geoplugin_longitude'];
$ciudad = $meta['geoplugin_city'];</pre>]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2012/01/07/como-obtener-geodatos-de-una-direccion-ip-en-php/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>¿Cómo crear tu propio shortcode en WordPress?</title><link>http://www.linuxhispano.net/2011/12/22/como-crear-tu-propio-shortcode-en-wordpress/</link> <comments>http://www.linuxhispano.net/2011/12/22/como-crear-tu-propio-shortcode-en-wordpress/#comments</comments> <pubDate>Thu, 22 Dec 2011 14:45:10 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[api]]></category> <category><![CDATA[php]]></category> <category><![CDATA[plugin]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[shortcode]]></category> <category><![CDATA[tema]]></category> <category><![CDATA[wordpress]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8662</guid> <description><![CDATA[Si manejáis WordPress sabréis que existen o al menos os suenan los shortcode (códigos cortos en español). ¿Qué hacen? Cuando estamos redactando una entrada, podemos hacer una llamada a uno de ellos para conseguir una funcionalidad extra. Por ejemplo, el típico &#8230; <a
href="http://www.linuxhispano.net/2011/12/22/como-crear-tu-propio-shortcode-en-wordpress/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Si manejáis <a
target="_blank" href="http://www.linuxhispano.net/etiqueta/wordpress" target="_blank">WordPress</a> sabréis que existen o al menos os suenan los <a
href="http://codex.wordpress.org/Shortcode_API" target="_blank">shortcode</a> (códigos cortos en español). ¿Qué hacen? Cuando estamos redactando una entrada, podemos hacer una llamada a uno de ellos para conseguir una funcionalidad extra. Por ejemplo, el típico caso de la galería de imágenes: [ gallery ] (pongo espacios entre ellos para que no salte la galería.</p><p><a
href="http://www.linuxhispano.net/wp-content/uploads/2011/12/wordpress_codex.png"><img
class="aligncenter size-full wp-image-8673" title="wordpress_codex" src="http://www.linuxhispano.net/wp-content/uploads/2011/12/wordpress_codex.png" alt="WordPress codex" width="275" height="251" /></a></p><p>Algunos plugins y temas nos proporcionan más códigos cortos de este tipo. Sin embargo, si manejáis <a
target="_blank" href="http://codex.wordpress.org/" target="_blank">la API de WordPress</a>, a lo mejor vosotros mismos queréis crear vuestros propios <em>shortcode</em>. ¿Cómo?</p><p><span
id="more-8662"></span></p><p>Uniendo un <em>shortcode</em> a una función. Si no tenemos atributos es directo:</p><pre>//[mishortcode]
function mishortcode_func( $atts ){
 return "Este es mi shortcode";
}
add_shortcode( 'mishortcode', 'mishortcode_func' );</pre><p>En caso de que tengamos atributos, habrá que descomponer el array de atributos que recibe la función.</p><pre>// [mishortcode miatributo0="mivalor0" miatributo1="mivalor1"]
function mishortocde_func( $atts ) {
	extract( shortcode_atts( array(
		'miatributo0' =&gt; 'mivalor_por_defecto_0',
		'miatributo1' =&gt; 'mivalor_por_defecto_1',
	), $atts ) );
	return "He recibido = {$miatributo0} y {miatributo1}";
}
add_shortcode( 'mishortcode', 'mishortocde_func' );</pre><p>En este caso, soportará hasta dos atributos. Si no se le pasa ningún atributo, cogerá los dos por defecto y en caso de que se le pase uno o los dos, estos serán sus valores y el que no reciba valor, recibirá el valor por defecto que le hemos asignado. Igual que en PHP (en <a
href="http://www.linuxhispano.net/2011/06/16/curso-php-orientado-a-objetos-sobrecarga/" target="_blank">esta entrega del curso de PHP</a> se explica cómo se puede simular la sobrecarga usando atributos por defecto).</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/12/22/como-crear-tu-propio-shortcode-en-wordpress/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>WP Questions: pregunta o responde preguntas sobre WordPress con recompensa económica</title><link>http://www.linuxhispano.net/2011/11/14/wp-questions-pregunta-o-responde-preguntas-sobre-wordpress-con-recompensa-economica/</link> <comments>http://www.linuxhispano.net/2011/11/14/wp-questions-pregunta-o-responde-preguntas-sobre-wordpress-con-recompensa-economica/#comments</comments> <pubDate>Mon, 14 Nov 2011 18:17:17 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Noticias]]></category> <category><![CDATA[asesoría]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[php]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[wordpress]]></category> <category><![CDATA[wpquestion]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8085</guid> <description><![CDATA[La asesoría y consultoría es algo básico dentro de los modelos de negocio del software libre. WordPress es a día de hoy uno de los proyectos más dinámicos dentro de todo el panorama libre: es el CMS más popular y &#8230; <a
href="http://www.linuxhispano.net/2011/11/14/wp-questions-pregunta-o-responde-preguntas-sobre-wordpress-con-recompensa-economica/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>La asesoría y consultoría es algo básico dentro de los modelos de negocio del software libre. <a
href="http://www.linuxhispano.net/etiqueta/wordpress/" target="_blank">WordPress</a> es a día de hoy uno de los proyectos más dinámicos dentro de todo el panorama libre: es el CMS más popular y su crecimiento sigue siendo constante.</p><p
style="text-align: center;"><a
target="_blank" href="http://wpquestions.com/affiliates/register/name/carazo"><img
class="aligncenter size-full wp-image-8353" title="wpquestions" src="http://www.linuxhispano.net/wp-content/uploads/2011/11/wpquestions.jpg" alt="WP Questions logo" width="150" height="150" /></a></p><p>Dentro de los modelos de negocio del software libre, la consultaría es un pilar básico. Existe el asesoramiento clásico, donde particulares o empresas ofrecen mediante comunicaciones a otros particulares o empresas; soluciones para problemas puntuales.</p><p>Sin embargo, gracias a los sistemas en la nube, es posible extrapolar este servicio para hacerlo llegar al gran público. <a
target="_blank" href="http://wpquestions.com/affiliates/register/name/carazo" target="_blank">WordPress Questions</a> es un proyecto creado por <a
target="_blank" href="http://www.krubner.com/" target="_blank">Lawrence Krubner</a> y <a
target="_blank" href="http://www.darrenhoyt.com/" target="_blank">Darren Hoyt</a>. Nos ofrece una plataforma en la que todos podemos ser:</p><ul><li>Asesores de WordPress, recibiendo una recompensa económica por cada asesoramiento prestado</li><li>Usuarios, podemos preguntar cualquier cosa sobre WordPress y obtener una respuesta rápida y fiable a cambio de un precio que nosotros fijaremos entre 1 y 100 dólares.</li></ul><div><span
style="font-size: small;"><span
class="Apple-style-span" style="line-height: 24px;"><span
id="more-8085"></span></span></span></div><p>Os dejo un vídeo presentándolo (está en inglés):</p><p><object
width="560" height="315" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param
name="allowFullScreen" value="true" /><param
name="allowscriptaccess" value="always" /><param
name="src" value="http://www.youtube.com/v/SvTLK9r8biI?version=3&amp;hl=es_ES" /><param
name="allowfullscreen" value="true" /><embed
width="560" height="315" type="application/x-shockwave-flash" src="http://www.youtube.com/v/SvTLK9r8biI?version=3&amp;hl=es_ES" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/11/14/wp-questions-pregunta-o-responde-preguntas-sobre-wordpress-con-recompensa-economica/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Eliminar warning y errores típicos en PHP</title><link>http://www.linuxhispano.net/2011/11/12/eliminar-warning-y-errores-tipicos-en-php/</link> <comments>http://www.linuxhispano.net/2011/11/12/eliminar-warning-y-errores-tipicos-en-php/#comments</comments> <pubDate>Sat, 12 Nov 2011 19:30:02 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[aviso]]></category> <category><![CDATA[error]]></category> <category><![CDATA[notice]]></category> <category><![CDATA[php]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[warning]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8259</guid> <description><![CDATA[Cuando programamos en PHP existe una serie de errores y warnings que son muy típicos y que para el programador más novel pueden suponer un problema. Aquí recopilamos algunos de los más típicos, pero ya que estamos, me gustaría que &#8230; <a
href="http://www.linuxhispano.net/2011/11/12/eliminar-warning-y-errores-tipicos-en-php/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Cuando programamos en <a
href="http://www.linuxhispano.net/etiqueta/php/" target="_blank">PHP</a> existe una serie de errores y warnings que son muy típicos y que para el programador más novel pueden suponer un problema. Aquí recopilamos algunos de los más típicos, pero ya que estamos, me gustaría que todos nos contarais errores y soluciones a los mismos que encontráis a menudo.</p><p><a
href="http://www.linuxhispano.net/wp-content/uploads/2011/11/php_logo.gif" class="broken_link"><img
class="aligncenter size-full wp-image-8338" title="Logo PHP" src="http://www.linuxhispano.net/wp-content/uploads/2011/11/php_logo.gif" alt="Logo PHP" width="350" height="184" /></a></p><p><strong>Warning: Cannot modify header information &#8211; headers already sent by</strong></p><p>Que también podemos encontrar como &#8220;<em>Warning: session_start(): Cannot send session cache limiter &#8211; headers already sent</em>&#8221; o &#8220;<em>Warning: session_start() [function.session-start]: Cannot send session cookie &#8211; headers already sent by</em>&#8220;. Se produce cuando intentamos modificar las cabeceras del paquete HTTP, cuando ya hemos dejado de emitirlas y estamos emitiendo el cuerpo del paquete.</p><p>¿Por qué ocurre esto? Podéis verlo <a
target="_blank" href="http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol" target="_blank">dentro del protocolo</a>. Para solucionarlo deberemos ser muy cuidadosos en dos aspectos:</p><ul><li>Nunca comenzar a emitir el cuerpo antes de tiempo, con un sólo espacio en blanco delante de <em>&lt;?php</em>  ya habríamos provocado el problema (se empieza a emitir un espacio en blanco como parte del cuerpo).</li><li>No emitir la cabecera en mitad del cuerpo. Es decir, no usar funciones que la puedan modificar como <a
target="_blank" href="http://php.net/manual/es/function.session-start.php" target="_blank">session_start</a>, cuando estamos ya en el cuerpo de nuestro contenido HTTP.</li></ul><div><span
style="font-size: small;"><span
class="Apple-style-span" style="line-height: 24px;"><span
id="more-8259"></span></span></span></div><p><strong>Fatal error: Cannot redeclare nombre_función</strong></p><p>En <a
target="_blank" href="http://www.linuxhispano.net/etiqueta/php/" target="_blank">PHP</a> no existe la sobrecarga (<a
href="http://www.linuxhispano.net/2011/06/16/curso-php-orientado-a-objetos-sobrecarga/" target="_blank">aunque podéis imitarlas</a>), por lo tanto las declaraciones de las funciones serán únicas en todo el código. Si estamos trabajando en un proyecto grande y queremos asegurarnos que la función se declara cuando no exista y no se declare cuando sí exista hacemos lo siguiente, usar <a
href="http://php.net/manual/en/function.function-exists.php" target="_blank">function_exists de PHP</a>, veamos un ejemplo.</p><pre>if(!function_exists('mi_funcion'))
{
    function mi_funcion()
    {
        /* */
    }
}</pre><p><strong>Notice: A session had already been started &#8211; ignoring session_start()</strong></p><p>La situación es la siguiente, tenemos la sesión iniciada, con <em>session_start() </em>y debido a que cargamos otro componente de la página que no sabe si la sesión está iniciada, volvemos a hacer la llamada. No se trata de un error sino de una <a
target="_blank" href="http://php.net/manual/en/function.error-reporting.php" target="_blank">notice</a>, pero aún así podemos evitarla:</p><pre>if (!isset ($_COOKIE[ini_get('session.name')])){
    session_start();
}</pre><p><strong>Notice: Constant MI_CONSTANTE already defined in</strong></p><p>Cuando usamos constantes en PHP (para guardar por ejemplo los datos de conexión a la base de datos), es posible que redeclaremos en dos script diferentes la misma variable y salte un aviso. Para evitarlo haremos lo siguiente:</p><pre>if (defined('PRUEBA')){
    echo PRUEBA;
}</pre><p><strong>Notice: Use of undefined constant MI_CONSTANTE &#8211; assumed &#8216;MI_CONSTANTE&#8217;</strong></p><p>Si a la hora de definir constantes cometemos el error de no usar comillas (me da la sensación de que alguna vez ha estado permitido), PHP no devuelve un error, pero sí un aviso. Os enseño el error y cómo solucionarlo:</p><pre>define(DB_HOST, "localhost"); // notice
define("DB_HOST", "localhost"); // bien</pre><p><strong>Faltan muchos, ¿cuál quieres comentar?</strong></p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/11/12/eliminar-warning-y-errores-tipicos-en-php/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Comprobar de qué tipo es una variable u objeto en C#</title><link>http://www.linuxhispano.net/2011/10/31/comprobar-de-que-tipo-es-una-variable-u-objeto-en-c/</link> <comments>http://www.linuxhispano.net/2011/10/31/comprobar-de-que-tipo-es-una-variable-u-objeto-en-c/#comments</comments> <pubDate>Mon, 31 Oct 2011 14:03:44 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[.net]]></category> <category><![CDATA[c]]></category> <category><![CDATA[c sharp]]></category> <category><![CDATA[carácter]]></category> <category><![CDATA[char]]></category> <category><![CDATA[curso]]></category> <category><![CDATA[dato]]></category> <category><![CDATA[decimal]]></category> <category><![CDATA[entero]]></category> <category><![CDATA[float]]></category> <category><![CDATA[flotante]]></category> <category><![CDATA[linux+]]></category> <category><![CDATA[mono]]></category> <category><![CDATA[monodevelop]]></category> <category><![CDATA[número]]></category> <category><![CDATA[objeto]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[single]]></category> <category><![CDATA[tipo]]></category> <category><![CDATA[unicode]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=8073</guid> <description><![CDATA[Cuando tenemos un objeto de tipo genérico Object en C#, podemos hacer con él las operaciones básicas de cada objeto pero en ocasiones, necesitaremos convertirlo en un objeto menos abstracto para poder hacer operaciones más concretas. Aunque esta entrada no &#8230; <a
href="http://www.linuxhispano.net/2011/10/31/comprobar-de-que-tipo-es-una-variable-u-objeto-en-c/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Cuando tenemos un objeto de tipo genérico <a
target="_blank" href="http://msdn.microsoft.com/es-es/library/system.object(v=vs.80).aspx" target="_blank">Object</a> en C#, podemos hacer con él las operaciones básicas de cada objeto pero en ocasiones, necesitaremos convertirlo en un objeto menos abstracto para poder hacer operaciones más concretas.</p><p>Aunque esta entrada no forma parte del <a
href="http://www.linuxhispano.net/cursos/curso-c-con-mono/" target="_blank">curso de Mono</a>, sí está muy relacionada con <a
href="http://www.linuxhispano.net/2010/10/29/curso-c-con-mono-tipos-de-datos-y-uso-de-referencias/" target="_blank">esta entrega dedicada a tipos de datos</a>.</p><p>Si tenemos una variable u objeto y no sabemos su tipo con seguridad, disponemos de dos métodos que usaremos para ver cuál es realmente el tipo del mismo. Veamos:</p><ul><li><a
target="_blank" href="http://msdn.microsoft.com/es-es/library/system.object.gettype.aspx" target="_blank">getType()</a>: obtiene el tipo de la instancia actual</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.type.gettype.aspx" target="_blank">Type.GetType(&#8220;tipo de objeto&#8221;)</a>: lo usamos para obtener una referencia con la que comparar</li></ul><p>Por ejemplo, ¿cómo saber si el objeto &#8220;auxiliar&#8221; es un entero con signo de 32 bits (el entero más estándar, el que usamos al poner <em>int </em>simplemente)?</p><p><span
id="more-8073"></span></p><pre>if(auxiliar.GetType() == Type.GetType("System.Int32"))
   return true;
else
   return false;</pre><p>Al igual que con enteros, podemos hacer la comprobación para cualquier tipo:</p><ul><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.boolean.aspx" target="_blank">Boolean</a>: valor booleano</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.byte.aspx" target="_blank">Byte</a>: ocho bits sin signo</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.char.aspx" target="_blank">Char</a>: carácter UNICODE</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.datetime.aspx" target="_blank">DateTime</a>: fecha con tiempo</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.decimal.aspx" target="_blank">Decimal</a>: número decimal</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.double.aspx" target="_blank">Double</a>: pnto flotante de precisión doble</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.int16.aspx" target="_blank">Int16</a>: entero con signo de 16 bits</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.int32.aspx" target="_blank">Int32</a>: ídem pero de 32 bits</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.int64.aspx" target="_blank">Int64</a>: ídem pero de 64 bits</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.sbyte.aspx" target="_blank">SByte</a>:  8 bits con signo</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.single.aspx" target="_blank">Single</a>: punto flotante de precisión simple</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.uint16.aspx" target="_blank">UInt16</a>: entero sin signo de 16 bits</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.uint32.aspx" target="_blank">UInt32</a>: ídem pero de 32 bits</li><li><a
target="_blank" href="http://msdn.microsoft.com/en-us/library/system.uint64.aspx" target="_blank">UInt64</a>: ídem pero de 64 bits</li></ul> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/10/31/comprobar-de-que-tipo-es-una-variable-u-objeto-en-c/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Curso programación de videojuegos con SDL – Conclusiones. ¿Quién usa SDL?</title><link>http://www.linuxhispano.net/2011/09/16/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-conclusiones-%c2%bfquien-usa-sdl/</link> <comments>http://www.linuxhispano.net/2011/09/16/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-conclusiones-%c2%bfquien-usa-sdl/#comments</comments> <pubDate>Fri, 16 Sep 2011 10:40:05 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[c]]></category> <category><![CDATA[conclusiones]]></category> <category><![CDATA[curso]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[sdl]]></category> <category><![CDATA[videojuegos]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=7525</guid> <description><![CDATA[El resultado no es en absoluto profesional, pero espero que este ejemplo os haya demostrado lo fácil (o al menos no tan difícil) que puede llegar a ser desarrollar un juego. Existen otras muchas maneras de hacerlo, pero SDL es &#8230; <a
href="http://www.linuxhispano.net/2011/09/16/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-conclusiones-%c2%bfquien-usa-sdl/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>El resultado no es en absoluto profesional, pero espero que este ejemplo os haya demostrado lo fácil (o al menos no tan difícil) que puede llegar a ser desarrollar un juego. Existen otras muchas maneras de hacerlo, pero SDL es quizás la alternativa más potente en dos dimensiones de las que existen en el universo del software libre. Recordando siempre que podemos usarla conjuntamente con <a
target="_blank" href="http://es.wikipedia.org/wiki/OpenGL" target="_blank">OpenGL</a> para conseguir gráficos tridimensionales.</p><p><a
href="http://www.linuxhispano.net/wp-content/uploads/2011/09/civilizationcalltopower.jpg"><img
class="aligncenter size-full wp-image-7528" title="civilizationcalltopower" src="http://www.linuxhispano.net/wp-content/uploads/2011/09/civilizationcalltopower.jpg" alt="" width="600" height="450" /></a></p><p>Otras opciones además de <a
target="_blank" href="http://es.wikipedia.org/wiki/Allegro_(biblioteca_de_programaci%C3%B3n)" target="_blank">Allegro</a> y <a
target="_blank" href="http://clanlib.org/wiki/Main_Page" target="_blank">ClanLib</a> de las que he hablado, son por ejemplo plataformas destinadas expresamente al desarrollo de videojuegos, como el Proyecto Fénix (el compilador alternativo al famoso DIV propietario). Sin embargo, como ya comenté anteriormente, estas opciones pueden parecer más fáciles pero son menos potentes que <a
title="Curso programación de videojuegos con SDL" href="http://www.linuxhispano.net/cursos/curso-programacion-de-videojuegos-con-sdl/" target="_blank">SDL</a>.</p><p>En cuanto al juego que hemos creado, no sería difícil incluirle un sistema de puntuación, un sistema de vidas, un cálculo de la distancia crítica mejorado, distintos tipos de fases&#8230; un universo que se nos abre delante de nosotros de creaciones posibles con cada juego que creamos. El código en sí tampoco está demasiado depurado, pero el propósito era intentar realizar un código con la mayor legibilidad posible.</p><p>Otro punto importante a tener en cuenta es que <a
title="Curso programación de videojuegos con SDL" href="http://www.linuxhispano.net/cursos/curso-programacion-de-videojuegos-con-sdl/" target="_blank">SDL</a> no sirve sólo para desarrollar videojuegos. Hemos usado <a
title="Curso programación de videojuegos con SDL" href="http://www.linuxhispano.net/cursos/curso-programacion-de-videojuegos-con-sdl/" target="_blank">SDL</a> para hacer un juego, pero las mismas funciones que sirven para mostrar el avión por ejemplo, pueden servir para una aplicación multimedia de otra clase, además por supuesto del resto de funciones multimedia que nos proporciona.</p><p>En definitiva, espero que este artículo os haya introducido en un mundo al que antes de comenzar a conocerlo puede parecer más complejo de lo que es. Recordad también que <a
target="_blank" title="Curso programación de videojuegos con SDL" href="http://www.linuxhispano.net/cursos/curso-programacion-de-videojuegos-con-sdl/" target="_blank">SDL</a> es multiplataforma y el código que compiláis para vuestro juego en Linux os sirve sin cambiar nada para Windows, sólo tenéis que compilarlo para dicho sistema operativo. Con entornos de desarrollo integrados como <a
href="http://es.wikipedia.org/wiki/Dev-C%2B%2B" target="_blank">Dev-Cpp</a> puede resultar realmente fácil compilarlo para el sistema de Microsoft.</p><p><a
href="http://www.linuxhispano.net/wp-content/uploads/2011/09/wesnoth1.jpg"><img
class="aligncenter size-full wp-image-7529" title="wesnoth" src="http://www.linuxhispano.net/wp-content/uploads/2011/09/wesnoth1.jpg" alt="" width="600" height="450" /></a></p><p><span
style="color: #000000;"><strong>¿Quién usa SDL?</strong></span></p><p>Antes de finalizar el curso es buen momento para recordar ejemplos reales de juegos que han usado <a
title="Curso programación de videojuegos con SDL" href="http://www.linuxhispano.net/cursos/curso-programacion-de-videojuegos-con-sdl/" target="_blank">SDL</a> y han conseguido (y consiguen) resultados realmente buenos. Algunos comerciales, otros muchos libres, engrosan una lista en la que nombres de gran fama saltan a la vista de todos los que hemos jugado alguna vez en nuestro sistema operativo GNU/Linux.</p><p>Como representante comercial podemos nombrar a <em>Civilization </em>“<em>Call To Power</em>”. En cuanto a ejemplos libres hay muchísimo, aquí os dejo algunos de los títulos más importantes:</p><ul><li><a
target="_blank" href="http://www.wesnoth.org/" target="_blank">Battle For Wesnoth</a></li><li><a
target="_blank" href="http://en.wikipedia.org/wiki/SolarWolf" target="_blank">Solarwolf</a></li><li><a
target="_blank" href="http://www.secretmaryo.org/" target="_blank">Secret Maryo Chronicles</a></li><li><a
target="_blank" href="http://xmoto.tuxfamily.org/" target="_blank">X-Moto</a></li><li><a
target="_blank" href="http://toppler.sourceforge.net/" target="_blank">Tower Toppler</a></li><li><a
target="_blank" href="http://smw.supersanctuary.net/site/" target="_blank">Super Mario War</a></li></ul><p>Estos son sólo un ejemplo de un total de miles de juegos que han sido (y serán) programados con SDL. Con esto quiero daros sólo una visión de la potencia y de los resultados que se pueden llegar a conseguir haciendo uso sólo de esta librería.</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/09/16/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-conclusiones-%c2%bfquien-usa-sdl/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Curso programación de videojuegos con SDL – Creando continuidad</title><link>http://www.linuxhispano.net/2011/09/15/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-creando-continuidad/</link> <comments>http://www.linuxhispano.net/2011/09/15/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-creando-continuidad/#comments</comments> <pubDate>Thu, 15 Sep 2011 17:15:45 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[c]]></category> <category><![CDATA[continuidad]]></category> <category><![CDATA[curso]]></category> <category><![CDATA[objetivos]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[sdl]]></category> <category><![CDATA[videojuegos]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=7484</guid> <description><![CDATA[Finalmente, sólo nos queda darle continuidad a nuestro juego. En función de los objetivos que nos habíamos propuesto, es que los aviones vuelvan a aparecer por la parte superior de la pantalla una vez lleguen al final. Esto es bastante &#8230; <a
href="http://www.linuxhispano.net/2011/09/15/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-creando-continuidad/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Finalmente, sólo nos queda darle continuidad a nuestro juego. En función de los objetivos que nos habíamos propuesto, es que los aviones vuelvan a aparecer por la parte superior de la pantalla una vez lleguen al final. Esto es bastante simple ya que solamente tenemos que copiar y pegar la inicialización de los aviones enemigos dentro de una condición que compruebe si ha llegado ya al final de la pantalla por la parte inferior.</p><p
style="text-align: center;"><a
href="http://www.linuxhispano.net/wp-content/uploads/2011/09/resultadoFinal.png"><img
class="aligncenter size-full wp-image-7503" title="resultadoFinal" src="http://www.linuxhispano.net/wp-content/uploads/2011/09/resultadoFinal.png" alt="" width="642" height="478" /></a></p><pre>for(i=0;i&lt;numeroEnemigos;i++)
{
	if(posicionesEnemigos[i].y&gt;=480)
	{
		posicionesEnemigos[i].x=rand()%590+1;
		posicionesEnemigos[i].y=60-rand()%40+1;
	}
	posicion.x=posicionesEnemigos[i].x;
	posicion.y=posicionesEnemigos[i].y;
	SDL_BlitSurface(enemigos[i], NULL, buffer, &amp;posicion);
}</pre><p>Como podéis apreciar dentro del bucle principal, incluimos la condición y en caso de ser cierta, la inicialización de nuevo de la posición.</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/09/15/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-creando-continuidad/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>Curso programación de videojuegos con SDL – Colisiones</title><link>http://www.linuxhispano.net/2011/09/14/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-colisiones/</link> <comments>http://www.linuxhispano.net/2011/09/14/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-colisiones/#comments</comments> <pubDate>Wed, 14 Sep 2011 13:30:08 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[c]]></category> <category><![CDATA[curso]]></category> <category><![CDATA[objetivos]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[sdl]]></category> <category><![CDATA[videojuegos]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=7415</guid> <description><![CDATA[Una vez ya tenemos los enemigos moviéndose, el doble búfer implementado e incluso si queremos la pantalla completa pasemos a establecer algún objetivo en el juego. Para este ejemplo el objetivo será evitar que nuestro avión se choque con los &#8230; <a
href="http://www.linuxhispano.net/2011/09/14/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-colisiones/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Una vez ya tenemos los enemigos moviéndose, el doble búfer implementado e incluso si queremos la pantalla completa pasemos a establecer algún objetivo en el juego. Para este ejemplo el objetivo será evitar que nuestro avión se choque con los aviones enemigos. Una vez se choquen terminaremos el juego. Aunque esto en un juego real no pasaría dado que es un ejemplo didáctico, es la opción que tomamos. Podríamos también poner un número de vidas por ejemplo, pero esto ya alargaría demasiado el ejemplo (tened en cuenta que tendríamos entonces que escribir con letras y números en nuestra pantalla de SDL, lo que no es tan fácil). Lo que si haremos será que cada vez que desaparezcan los enemigos posicionarlos de nuevo en el comienzo para que vuelvan a aparecer.</p><p><a
href="http://www.linuxhispano.net/wp-content/uploads/2011/09/distancia.png"><img
class="aligncenter size-full wp-image-7417" title="distancia" src="http://www.linuxhispano.net/wp-content/uploads/2011/09/distancia.png" alt="" width="327" height="220" /></a></p><p><strong>Comprobando si existe colisión</strong></p><p>Para comprobar si existe colisión calcularemos la distancia entre el jugador y cada uno de los enemigos. Para calcular la distancia, primero hallaremos el centro de cada uno de los enemigos y del jugador para posteriormente calcular la distancia euclidea entre ambos puntos.</p><p>Ya que las dimensiones son:</p><ul><li>Jugador: 59&#215;42</li><li>Enemigo: 50&#215;40</li></ul><p>El centro de cada uno de ellos debe estar desplazado de la posición en la que están dibujados (teniendo en cuenta que SDL dibuja desde la posición superior izquierda del objeto):</p><ul><li> Jugador: (30,21)</li><li>Enemigo: (25,20)</li></ul><p>Veamos cuál es la distancia límite a la que pueden estar el jugador y un enemigo (si la distancia es menor se considerará que ha habido una colisión y por lo tanto el juego se termina):</p><ul><li>Distancia crítica=(30²+21²)^(1/2)+(25²+20²)^(1/2) aproximadamente 69.</li></ul><p>Es decir el punto en el que se tocan los extremos de las superficie enemigo con la superficie jugador. Este modo de calcular la distancia no es el más exacto, pero es bastante orientativo. Si quisiéramos calcular la distancia de manera más exacta deberíamos estudiar mejor la geometría y las dimensiones reales de nuestro dibujo (despreciando la parte con transparencia en los extremos).</p><p>La función que hace esta comprobación sería la siguiente:</p><pre>int existeColision(int x, int y, int numeroEnemigos,
   struct posicion* posicionesEnemigos)
{
   int i;
   int centroJugador[2]={x+30,y+21};
   struct posicion* centroEnemigos;
   double distancia;
   centroEnemigos=(struct posicion*)malloc
(sizeof(struct posicion)*numeroEnemigos);
   for(i=0; i &lt; numeroEnemigos; i++)
   {
	centroEnemigos[i].x=posicionesEnemigos[i].x+25;
	centroEnemigos[i].y=posicionesEnemigos[i].y+20;
	distancia=sqrt(pow((double)centroJugador[0]-
centroEnemigos[i].x,2)+pow((double)centroJugador[1]-centroEnemigos[i].y,2));
	if(distancia &lt;= 69)
		return 1;
   }
   return 0;
}</pre><p>Una vez tenemos la distancia crítica pasemos a ver como ha quedado la función (devuelve 1 si existe colisión, 0 en caso contrario).</p><p>Tened en cuenta la diferencia entre centro y posición. El centro es el centro de la superficie y la posición su extremo superior izquierdo.</p><p>Paso por paso:</p><ol><li>¿Qué recibe?</li></ol><ul
style="font-size: medium;"><li><em>int x</em>: entero con coodenada X de la posición del jugador.</li><li><em>int y</em>: entero con coordenada Y de la posición del jugador.</li><li><em>int numeroEnemigos</em>: número de enemigos.</li><li><em>struct posicion* posicionesEnemigos</em>: vector con las posiciones de los enemigos.</li></ul><ol
start="2"><li> Cálculo del centro (30 y 21, por las dimensiones de la superficie del jugador 59 y 42):</li></ol><ul><li><em>int centroJugador[2]={x+30,y+21};</em></li></ul><ol
start="3"><li>Declaración del vector con las coordenadas del centro de los enemigos. Aprovechamos la estructura de datos posición, ya que nos sirve para almacenar las coordenadas X e Y del centro:</li></ol><ul><li><em>struct posicion* centroEnemigos;</em></li><li><em>centroEnemigos=(struct posicion*)malloc(sizeof(struct posicion)*numeroEnemigos);</em></li></ul><p><span
class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, Helvetica, 'Nimbus Sans L', sans-serif; font-size: 16px; line-height: 24px;">Para cada enemigo además:</span></p><ol><li>Calculamos las coordenadas de su centro:</li></ol><ul
style="font-size: medium;"><li><em>centroEnemigos[i].x=posicionesEnemigos[i].x+25;</em></li><li><em>centroEnemigos[i].y=posicionesEnemigos[i].y+20;</em></li></ul><ol
start="2"><li>La distancia euclídea entre el centro del jugador y el centro que acabamos de calcular (la expresión no se ve demasiado bien pero es simplemente aplicar la raíz a la suma de los cuadrados de las diferencias de las coordenadas X e Y).</li></ol><ul
style="color: #444444; font-family: 'Helvetica Neue', Arial, Helvetica, 'Nimbus Sans L', sans-serif; font-size: 16px; line-height: 24px;"><li><em>distancia=sqrt(pow((double)centroJugador[0]-centroEnemigos[i].x,2)+pow((double)centroJugador[1]-centroEnemigos[i].y,2));</em></li></ul><ol
start="3"><li>Vemos si la distancia es menor o igual que la distancia crítica:</li></ol><ul><li>if(distancia&lt;=68) return 1;</li></ul><p>Para que el juego terminase en caso de que existiera colisión haríamos una llamada dentro del bucle</p><pre>while(!terminar)
{
  ...
  if(existeColision(posicionJugadorX,posicionJugadorY,
numeroEnemigos,posicionesEnemigos))
    terminar=1;
  ...
}</pre>]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/09/14/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-colisiones/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Curso programación de videojuegos con SDL – Mejorando aspectos gráficos</title><link>http://www.linuxhispano.net/2011/08/27/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-mejorando-aspectos-graficos/</link> <comments>http://www.linuxhispano.net/2011/08/27/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-mejorando-aspectos-graficos/#comments</comments> <pubDate>Sat, 27 Aug 2011 00:00:34 +0000</pubDate> <dc:creator>F. Javier Carazo Gil</dc:creator> <category><![CDATA[Tutoriales]]></category> <category><![CDATA[c]]></category> <category><![CDATA[curso]]></category> <category><![CDATA[gráficos]]></category> <category><![CDATA[mejora]]></category> <category><![CDATA[programación]]></category> <category><![CDATA[sdl]]></category> <category><![CDATA[videojuegos]]></category> <guid
isPermaLink="false">http://www.linuxhispano.net/?p=7157</guid> <description><![CDATA[Habréis podido observar que los aviones parpadean al moverse por la pantalla. Esto se produce porque dibujamos directamente sobre la pantalla, es decir sobre lo que hemos llamado screen, de manera que dibujamos antes unos objetos y luego otros. Este &#8230; <a
href="http://www.linuxhispano.net/2011/08/27/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-mejorando-aspectos-graficos/">Continuar leyendo <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Habréis podido observar que los aviones parpadean al moverse por la pantalla. Esto se produce porque dibujamos directamente sobre la pantalla, es decir sobre lo que hemos llamado screen, de manera que dibujamos antes unos objetos y luego otros. Este problema es bien sencillo de solucionar con SDL gracias a la llamada <a
target="_blank" href="http://es.wikipedia.org/wiki/Buffer_m%C3%BAltiple" target="_blank">técnica del doble búfer</a> que nos ofrece. Mediante esta técnica dibujaremos sobre un búfer en el que una vez dibujados todos lo necesario, pasaremos a dibujar sobre el screen, de esta manera eliminaremos el parpadeo que creaba la técnica anterior.</p><p>Expliquemos la implementación de esta técnica sobre nuestro ejemplo:</p><ol><li>Declamos un puntero a una variable del tipo SDL_Surface sobre la que “dibujaremos” y despues volcaremos sobre el <em>screen</em>:<br
/> <em>SDL_Surface *buffer;</em></li><li>Creamos este <em>buffer:</em><br
/> <em>buffer = SDL_CreateRGBSurface(SDL_SWSURFACE, 640, 480, 16,0,0,0,0);</em></li><li>Le indicamos al <em>screen </em>que vamos a usar la técnica de doble búfer:<em>screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);</em></li><li>Dibujamos los componentes del juego, fondo, jugador y enemigos sobre el búfer:<br
/> <em>SDL_BlitSurface(fondo, NULL, buffer, &amp;posicion);</em><br
/> <em>SDL_BlitSurface(jugador, NULL, buffer, &amp;posicion);</em><br
/> <em>SDL_BlitSurface(enemigos[i], NULL, buffer, &amp;posicion);</em></li><li>Volcamos sobre la pantalla:<br
/> <em>posicion.x=0;</em><br
/> <em>posicion.y=0;</em><br
/> <em>SDL_BlitSurface(buffer, NULL, screen, &amp;posicion);</em><br
/> <em>SDL_Flip(screen);</em></li></ol><p>No mostramos el código completo, porque como estos cambios han sido menores y son fácilmente identificables. Para terminar esta entrada <a
href="http://www.linuxhispano.net/cursos/curso-programacion-de-videojuegos-con-sdl/" target="_blank">del curso</a> sólo comentar cómo sería el caso de que quisiéramos hacer que el juego se ejecutase en pantalla completa en lugar de en una ventana. Con SDL solamente tendríamos que incluir en el último parámetro <em>SDL_FULLSCREEN</em>:</p><pre>screen = SDL_SetVideoMode( 640, 480, 16, SDL_FULLSCREEN |
SDL_HWSURFACE | SDL_DOUBLEBUF);</pre><p>Como podéis observar los valores se incluyen con OR lógicos (|).</p> ]]></content:encoded> <wfw:commentRss>http://www.linuxhispano.net/2011/08/27/curso-programacion-de-videojuegos-con-sdl-%e2%80%93-mejorando-aspectos-graficos/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
