<?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>Desarrollo Web | ahierro.es</title>
	<atom:link href="https://blog.ahierro.es/category/programacion/desarrollo-web/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ahierro.es</link>
	<description>Un blog personal  donde compartir experiencias e inquietudes relacionadas con internet, tecnología y otros asuntos interesantes</description>
	<lastBuildDate>Mon, 17 Jun 2019 21:41:26 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>

<image>
	<url>https://blog.ahierro.es/wp-content/uploads/2018/10/cropped-logo_small-1-2-32x32.png</url>
	<title>Desarrollo Web | ahierro.es</title>
	<link>https://blog.ahierro.es</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Backup de base de datos MySQL con PHP</title>
		<link>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/</link>
					<comments>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Sun, 19 May 2019 08:42:36 +0000</pubDate>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=905</guid>

					<description><![CDATA[<p>Existen múltiples opciones para exportar o realizar copias de seguridad de bases de datos en MySQL: phpMyAdmin, MySQL Workbench, utilizando la línea de comandos, etc. Si nos referimos a una página web, podremos hacer uso de unas u otras en función de las posibilidades que nos ofrezca nuestro proveedor de hosting. Otra de esas posibilidades &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Backup de base de datos MySQL con PHP"</span></a></p>
La entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Existen múltiples opciones para exportar o realizar copias de seguridad de bases de datos en MySQL: phpMyAdmin, MySQL Workbench, utilizando la línea de comandos, etc. Si nos referimos a una página web, podremos hacer uso de unas u otras en función de las posibilidades que nos ofrezca nuestro proveedor de hosting.</p>



<p>Otra de esas posibilidades de las que hablamos es realizar el respaldo con PHP, lo que nos permitirá hacerlo con casi todos los hostings, además de que es fácilmente automatizable. La principal desventaja, por contra, es que es una opción algo más laboriosa, pues tendremos que programar el script. Pero como la rueda casi siempre está inventada, en internet tienes muchas soluciones que te facilitarán la labor.</p>



<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql.png" alt="Backup base de datos Mysql" class="wp-image-929" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql-300x202.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<span id="more-905"></span>



<h2 class="wp-block-heading">MySQL BackUp Lite</h2>



<p>Yo os propongo esta sencilla solución que he desarrollado, de la que os dejo el código a continuación. En cualquier momento puedes acceder a <a rel="noreferrer noopener" aria-label="la versión más actualizada en Github (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">la versión más actualizada de MySQL Backup Lite en Github</a>.</p>




<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
/**
*
* MySql Backup Lite Class
*
* @author     Andres Hierro
* @copyright  2019 Andres Hierro
* @license    http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
* @version    0.0.1
* @link       http://ahierro.es/
*
*
*
* Copyright 2019 Andrés Hierro
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

class MySqlBackupLite {

  private $host;
  private $user;
  private $pass;
  private $name;

  private $fileName = &quot;mySqlBackup.sql&quot;;
  private $fileDir = &quot;./&quot;;
  private $fileCompression = false;

  private $timeZone = &#039;+00:00&#039;;

  private $mySqli;
  private $sqlString = &quot;&quot;;
  private $arrayTables;

  private $tableFieldCount = 0;
  private $tableNumberOfRows = 0;
  private $queryResult;



  public function __construct(array $arrayConnConfig) {

      if (
        (!isset($arrayConnConfig&#x5B;&#039;host&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;user&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;pass&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;name&#039;]))
      ) {
          throw new Exception(&#039;Missing connection data.&#039;);

      }
      $this-&gt;setHost($arrayConnConfig&#x5B;&#039;host&#039;]);
      $this-&gt;setUser($arrayConnConfig&#x5B;&#039;user&#039;]);
      $this-&gt;setPass($arrayConnConfig&#x5B;&#039;pass&#039;]);
      $this-&gt;setName($arrayConnConfig&#x5B;&#039;name&#039;]);

  }



  public function backUp() {

    $this-&gt;connectMySql();
    $this-&gt;getTables();
    $this-&gt;generateSqlHeader();
    $this-&gt;createTableStaments();
    $this-&gt;insertStaments();
    $this-&gt;generateSqlFooter();

  }



  private function setHost($host) {
    $this-&gt;host = $host;
  }



  private function setUser($user) {
    $this-&gt;user = $user;
  }



  private function setPass($password) {
    $this-&gt;pass = $password;
  }



  private function setName($name) {
    $this-&gt;name = $name;
  }



  public function setFileName($name) {
    $this-&gt;fileName = $name;
  }



  public function setFileDir($dir) {
    $this-&gt;fileDir = $dir;
  }



  public function setFileCompression($compression) {
    $this-&gt;fileCompression = $compression;
  }



  private function connectMySql() {

    $this-&gt;mySqli = new mysqli($this-&gt;host, $this-&gt;user, $this-&gt;pass, $this-&gt;name);
    $this-&gt;mySqli-&gt;select_db($this-&gt;name);
    $this-&gt;mySqli-&gt;query(&quot;SET NAMES &#039;utf8&#039;&quot;);

  }



  private function getTables() {

    $queryTables = $this-&gt;mySqli-&gt;query(&#039;SHOW TABLES&#039;);
    while($row = $queryTables-&gt;fetch_row()) {
      $this-&gt;arrayTables&#x5B;] = $row&#x5B;0];
    }

  }



  private function generateSqlHeader() {

    $this-&gt;sqlString  = &#039;SET SQL_MODE = &quot;NO_AUTO_VALUE_ON_ZERO&quot;;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;SET time_zone = &quot;&#039; . $this-&gt;timeZone . &#039;&quot;;&#039; . &quot;\r\n\r\n\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET NAMES utf8 */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;--&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;-- Database: `&#039; . $this-&gt;name . &#039;`&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;--&#039; . &quot;\r\n\r\n\r\n&quot;;

    return;

  }



  private function createTableStaments() {

    foreach($this-&gt;arrayTables as $table){
      $this-&gt;sqlCreateTableStament($table);
    }

  }



  private function sqlCreateTableStament($table) {

    $res = $this-&gt;mySqli-&gt;query(&#039;SHOW CREATE TABLE &#039;.$table);
    $temp = $res-&gt;fetch_row();
		$this-&gt;sqlString .= &quot;\n\n&quot; . str_ireplace(&#039;CREATE TABLE `&#039;,&#039;CREATE TABLE IF NOT EXISTS `&#039;, $temp&#x5B;1]) . &quot;;\n\n&quot;;

  }



  private function insertStaments() {

    foreach($this-&gt;arrayTables as $table){
      $this-&gt;sqlInsertStaments($table);
    }

  }



  private function sqlInsertStaments($table) {

		$this-&gt;getTableData($table);

    if($this-&gt;tableFieldCount == 0) {
      return;
    }


    $i = 0;
		while($row = $this-&gt;queryResult-&gt;fetch_row())	{

      $this-&gt;insertResultHeader($table, $i);
      $this-&gt;insertSingleResult($row);

      $i++;
      $this-&gt;sqlString .= (($i != 0) &amp;&amp; ($i % 100 == 0) || ($i == $this-&gt;tableNumberOfRows)) ? &quot;;&quot; : &quot;,&quot;;

		}

    $this-&gt;sqlString .= &quot;\n\n\n&quot;;

  }



  private function getTableData($table) {

  	$this-&gt;queryResult	= $this-&gt;mySqli-&gt;query(&#039;SELECT * FROM `&#039; . $table . &#039;`&#039;);
    $this-&gt;tableFieldCount = $this-&gt;queryResult-&gt;field_count;
    $this-&gt;tableNumberOfRows = $this-&gt;mySqli-&gt;affected_rows;

  }



  private function insertResultHeader($table, $currentRowNumber) {

  	if ($currentRowNumber % 100 == 0 || $currentRowNumber == 0 )	{
      $this-&gt;sqlString .= &quot;\nINSERT INTO &quot; . $table . &quot; VALUES&quot;;
    }

  }



  private function insertSingleResult($row) {

    $this-&gt;sqlString .= &quot;\n(&quot;;

    for($i = 0; $i &lt; $this-&gt;tableFieldCount; $i++){

      $row&#x5B;$i] = str_replace(&quot;\n&quot;,&quot;\\n&quot;, addslashes($row&#x5B;$i]));

      $this-&gt;sqlString .= (isset($row&#x5B;$i])) ? &#039;&quot;&#039;.$row&#x5B;$i].&#039;&quot;&#039; : &#039;&quot;&quot;&#039;;
      if($i &lt; ($this-&gt;tableFieldCount-1)){
        $this-&gt;sqlString.= &#039;,&#039;;
      }

    }

    $this-&gt;sqlString .=&quot;)&quot;;

  }



  private function generateSqlFooter() {

    $this-&gt;sqlString .=  &quot;\r\n\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&#039;;
    $this-&gt;sqlString .=  &quot;\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&#039;;
    $this-&gt;sqlString .=  &quot;\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&#039;;

  }



  public function downloadFile() {

      ob_get_clean();
      header(&#039;Content-Type: application/octet-stream&#039;);
      header(&quot;Content-Transfer-Encoding: Binary&quot;);
      header(&#039;Content-Length: &#039;. (function_exists(&#039;mb_strlen&#039;) ? mb_strlen($this-&gt;sqlString, &#039;8bit&#039;): strlen($this-&gt;sqlString)) );
      header(&quot;Content-disposition: attachment; filename=\&quot;&quot;.$this-&gt;fileName.&quot;\&quot;&quot;);
    	echo $this-&gt;sqlString; exit;

  }



  public function saveToFile() {

    if (!$backupFile = fopen($this-&gt;fileDir . $this-&gt;fileName, &quot;w+&quot;)) {
        throw new Exception(&#039;Imposible to create file.&#039;);
    }
    fwrite($backupFile, $this-&gt;sqlString);
    fclose($backupFile);

  }


}
</pre></div>


<h2 class="wp-block-heading">Realizar la copia de seguridad</h2>



<p>La solución propuesta nos proporciona dos opciones que podemos utilizar según nuestras necesidades:</p>



<ol class="wp-block-list"><li>Realizar el backup y descargarlo.</li><li>Realizar el backup y guardarlo en un archivo.</li></ol>



<p>En ambos casos incluimos la clase y le pasaremos al método constructor los datos de la conexión a la base de datos en un array como el que ves a continuación:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
include(&#039;MySqlBackup.php&#039;);

$arrayDbConf&#x5B;&#039;host&#039;] = &#039;dbHost&#039;;
$arrayDbConf&#x5B;&#039;user&#039;] = &#039;dbUser&#039;;
$arrayDbConf&#x5B;&#039;pass&#039;] = &#039;dbPassword&#039;;
$arrayDbConf&#x5B;&#039;name&#039;] = &#039;dbName&#039;;
</pre></div>


<h3 class="wp-block-heading">Respaldar y descargar</h3>



<p>Para realizar el backup y descargarlo serán suficientes unas pocas líneas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;downloadFile();

}
catch(Exception $e) {

  echo $e;

}
</pre></div>


<h3 class="wp-block-heading">Respaldar y guardar en un archivo</h3>



<p>Para guardar el resultado en un archivo además deberemos de indicarle el nombre del archivo y el directorio dónde guardarlo.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;setFileDir(&#039;./backups/&#039;);
  $bck-&gt;setFileName(&#039;backupFileNae.sql&#039;);
  $bck-&gt;saveToFile();

}
catch(Exception $e) {

  echo $e;

}
</pre></div>


<h2 class="wp-block-heading">Solo una parte del proceso</h2>



<p>Pero en muchas situaciones, este respaldo sera solo una parte del proceso. Nosotros hemos propuesto un escenario mayor en el que clonamos nuestra web en un servidor local, en breve publicaremos el artículo.</p>





<h2 class="wp-block-heading">Créditos y rerefencias</h2>



<ul class="wp-block-list"><li>Imagen principal: <a rel="noreferrer noopener" aria-label="Tumisu (abre en una nueva pestaña)" href="https://pixabay.com/users/tumisu-148124/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1990406" target="_blank">Tumisu en Pixabay</a>.</li><li>Solución <a rel="noreferrer noopener" aria-label="Mysql Backup Lite: Andrés Hierro, github (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">Mysql Backup Lite: Andrés Hierro, github</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nombres y comentarios en la programación</title>
		<link>https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/</link>
					<comments>https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Fri, 01 Mar 2019 06:22:11 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=547</guid>

					<description><![CDATA[<p>Formación, práctica y constancia son tres de los pilares básicos en los que se sustenta la evolución de cada desarrollador. En ocasiones debemos aprender conceptos complejos de asimilar o de aplicar como parte de este proceso. Sin embargo, en otras ocasiones, son sutiles detalles los que nos hacen mejorar. La elección de los nombres de &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Nombres y comentarios en la programación"</span></a></p>
La entrada <a href="https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/">Nombres y comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Formación, práctica y constancia son tres de los pilares básicos en los que se sustenta la evolución de cada desarrollador. En ocasiones debemos aprender conceptos complejos de asimilar o de aplicar como parte de este proceso. Sin embargo, en otras ocasiones, son sutiles detalles los que nos hacen mejorar.</p>



<p>La elección de los nombres de los distintos elementos que intervienen en la programación es una de esas tareas que si bien no es técnicamente compleja, puede suponer un antes y un después en cuanto a la calidad del código que generamos.</p>



<figure class="wp-block-image"><img decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_por_nombres.png" alt="Comentarios y nombres de elementos" class="wp-image-608" srcset="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_por_nombres.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_por_nombres-300x202.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<span id="more-547"></span>



<p>En esta entrada veremos cómo la elección de nombres adecuados puede contribuir a reducir el número de comentarios necesarios en el código fuente, y por lo tanto a mejorar su limpieza, comprensión y mantenimiento.</p>



<p>Este artículo es el cuarto de una serie de entradas dedicados a los comentarios y cuyo índice podemos encontrar en la entrada <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a>. Así que si estás interesado en mejorar no solo tus comentarios, si no tu programación en general, te recomiendo que leas los tres anteriores: <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a>, <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a>, y <a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/">Mantenimiento de comentarios en la programación</a>.</p>



<h3 class="wp-block-heading">Nombres descriptivos</h3>



<p>Es&nbsp; bastante común ver funciones o métodos precedidos de un comentario que explica cual es su cometido. Esta situación por si misma no es mala siempre que ayude a entender el código a otros desarrolladores. Sin embargo, en muchas ocasiones la elección de un nombre adecuado puede ser suficientemente descriptiva como para evitar el comentario.</p>





<p>Veamos un ejemplo inspirado en una aplicación TPV (Terminal Punto de Venta):</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Devuelve el precio de un producto valorando descuentos y
// rebajas para un cliente autentificado
private bool getPrice(int itemId, int userId) {
{
   ...
}
</pre></div>


<p>Como vemos el nombre del método es descriptivo hasta cierto punto, motivo por el que el comentario ayuda a complementarlo. Pero esto mismo podríamos hacerlo utilizando un nombre más adecuado:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
private bool getAuthentificatedCustomerFinalPrice(int itemId, int userId) {
{
   ...
}
</pre></div>


<p>En este segundo ejemplo al leer el nombre del método sabemos exactamente que esperar de él, así que no es necesario el comentario.</p>



<p>Hemos podido utilizar esta técnica sin ningún problema porque cumplimos la regla que establece que cada función debe hacer una única cosa. Si no la cumplimos e intentamos escoger un nombre descriptivo nos encontraremos con nombres excesivamente largos. Veamos un ejemplo siguiendo el hilo anterior pero en esta ocasión el método realizará dos tareas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
private bool identifyIfCustomerIsLoggedAngGetFinalPrice(int itemId, int userId) {
{
   ...
}
</pre></div>


<p>Cuantas más cosas haga el método, más largo y difícil de elegir será el nombre y esto se traducirá en un código poco legible y difícil de trabajar, volviendo a ser necesarios los comentarios.</p>



<p>Y por supuesto que esta técnica es totalmente aplicable a variables y constantes, escogiendo nombre adecuados eliminaremos la necesidad de explicar el objetivo de las mismas con comentarios. No es lo mismo usar nombres poco descriptivos y acompañarlos de un comentario en la declaración:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Coste de reposición de artículo
private float cost;
</pre></div>


<p>Que utilizar nombre descriptivos, prescindir de los comentarios y saber que contiene exactamente la variable en cualquier punto del programa:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
private float supplierPriceOfList;
</pre></div>


<h3 class="wp-block-heading">Sustituir un pedazo código por una función</h3>



<p>En ocasiones explicamos pedazos de código porque queremos transmitir nuestra intención, porque ayuda a la comprensión de un algoritmo con cierta complejidad, porque nos parece que es engorroso de leer y un comentario lo facilitaría, etc. Pongamos un ejemplo muy sencillo, de nuevo sobre un programa TPV:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Comprobamos si hemos introducido un descuento manual 
if(
   (item.price  &gt; item.proposedPrice)  &amp;&amp;
   (discount.reason is null) &amp;&amp;
   (item.price != item.proposedPrice * customer.discount)
)
{ 
   ... 
}
</pre></div>


<p>El programador que ha escrito este código (yo) ha querido dejar claro que las tres condiciones que ha escrito tenían como intención averiguar si se había introducido un descuento manual.</p>



<p>Pero quizás sea mucho más claro leer el código de esta manera:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
if(manualDiscountIsApplyed())  
{
   ...  
}
</pre></div>


<p>Y para ello solo tenemos que encapsular ese bloque lógico en otro método con un nombre adecuado:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
private bool manualDiscountIsApplyed()  
{  
   bool discountIsApplied = false;  
   if(  
      (item.price &gt; item.proposedPrice) &amp;&amp;
      (discount.reason is null) &amp;&amp;
      (item.price != item.proposedPrice * customer.discount)  
   )  
   {  
      discountIsApplied = true;  
   }  
   return discountIsApplied;  
}  
</pre></div>


<p>Aunque si lo pensamos un instante lo único que hemos hecho ha sido un uso correcto de la programación orientada a objetos, el resto ha sido de nuevo la elección de un buen nombre.</p>



<h3 class="wp-block-heading">Conclusión</h3>



<p>En el desarrollo de software, como en prácticamente todo, cuanto más simple y breve sea la solución, mejor. Lejos de de extender y adornar el código debemos procurar sintetizar y aclarar todo lo posible de forma que sea sencillo de comprender por si mismo, y para ello una elección correcta de nombres es fundamental.</p>



<p>Y como es habitual, sería muy interesante conocer tu punto de vista, ¿qué otra técnica utilizas tú para mejorar la legibilidad del código y evitar comentarios innecesarios? Comparte tu experiencia en un comentario.</p>La entrada <a href="https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/">Nombres y comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mantenimiento de comentarios en la programación</title>
		<link>https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/</link>
					<comments>https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 25 Feb 2019 07:30:33 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=545</guid>

					<description><![CDATA[<p>Uno de los aspectos más delicados con respecto a los comentarios es la limpieza. Al contrario de lo que sucede con el propio código fuente, los comentarios no son procesados por el compilador, lo que quiere decir que éste no nos avisará si hay algo incorrecto o poco fiel con respecto a la realidad. En &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Mantenimiento de comentarios en la programación"</span></a></p>
La entrada <a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/">Mantenimiento de comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Uno de los aspectos más delicados con respecto a los comentarios es la limpieza. Al contrario de lo que sucede con el propio código fuente, los comentarios no son procesados por el compilador, lo que quiere decir que éste no nos avisará si hay algo incorrecto o poco fiel con respecto a la realidad.</p>
<p><img decoding="async" class="alignnone size-full wp-image-606" src="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_mantenimiento.png" alt="Comentarios en programación, mantenimiento" width="650" height="438" srcset="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_mantenimiento.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_mantenimiento-300x202.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></p>
<p><span id="more-545"></span></p>
<p>En multitud ocasiones he visto y he escrito comentarios que ensucian el código y que en el mejor de los casos solo son una molestia visual. En cambio, otras ocasiones, me he tropezado con comentarios que pueden llegar a confundir al programador, sembrar la duda en él o hacer que gaste más tiempo del necesario intentando comprender la discrepancia entre el comentario y el código.</p>
<p>Esto ocurre principalmente porque al igual que sucede con el resto del código fuente, los comentarios requieren de un mantenimiento. Y para conseguirlo es necesario que el desarrollador sea mucho más estricto que con el resto del código: si el compilador no alerta tendremos que ser nosotros quien garanticemos que son correctos. Y el problema radica en que incluso si los comentarios son un verdadero desastre, si el código es correcto el programa funcionará, y muchas veces eso nos basta.</p>
<p>[the_ad id=»1018&#8243;]</p>
<p>Así que en esta entrada trataremos algunos aspectos que hemos de tener en cuenta a la hora de mantener nuestros comentarios. Este artículo pertenece a una serie cuyo índice podemos encontrar en la entrada <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a>.</p>
<h3>Comentarios a evitar</h3>
<p>Hace una semana publicamos una entrada titulada <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a>.  En ella hablábamos de los comentarios que no deberíamos hacer que perduren en el código, y podemos decir que éste es el primer paso que debemos de tomar a la hora de mantener los comentarios. Haciendo un breve resumen hablamos de:</p>
<ol>
<li>Código fuente comentado</li>
<li>Identificación de modificaciones</li>
<li>Código para debugar</li>
<li>ToDos y notas de tareas pendientes</li>
</ol>
<p>Si todavía no has leído este artículo te recomiendo que lo hagas antes de continuar con el siguiente punto.</p>
<h3>Copy &amp; Paste</h3>
<p>¿Cuantas veces has copiado y pegado un fragmento de código en el que existen comentarios? Pongamos el ejemplo de un método cualquiera, queremos crear otro bastante similar  y optamos por copiar y pegar en lugar de escribir desde cero. Acto seguido modificamos el nuevo método, pero, ¿cuantas veces hemos dejado un comentario sin modificar haciendo referencia al funcionamiento del método original?</p>
<p>Como primer planteamiento me preguntaría si el comentario es realmente necesario, pues si no le has dado la importancia adecuada quizás es simplemente porque no la necesita y puede ser eliminado. Pero en caso de que deba ser mantenido no olvides actualizarlo si es necesario. De lo contrario estarás mintiendo al programador que lo lea.</p>
<h3>Modificaciones en el código</h3>
<p>Lo más habitual cuando modificamos unos fuentes es que estemos alterando de una u otra manera su funcionamiento. Si existe un comentario realizado sobre el bloque de código que estamos modificando, deberemos de verificar que tras la modificación el comentario sigue siendo tan necesario y válido como era antes de cambiar una sola línea. De lo contrario volveríamos a tener un comentario erróneo.</p>
<p>Imaginemos que tenemos un método userIsAuthenticated() que devuelve la ID de un usuario en caso de que esté autentificado y 0 en caso de que no lo esté.  Imaginemos que modificamos ese método para que devuelva true si está autentificado y false si no lo está, y a su vez creamos otro método getUserId() que devuelve la ID de un usuario autentificado. En caso de que existiera algún comentario en el método original o en alguna llamada al método también debemos de modificarlo para que refleje el nuevo comportamiento.</p>
<h3>El precio de no mantener los comentarios</h3>
<p>Imaginemos qué estamos revisando un código escrito por otro desarrollador, y a medida que avanzamos notamos que los comentarios son superfluos y en muchos casos imprecisos e incoherentes con respecto al código, ¿qué ocurriría? Probablemente o los ignoraríamos por completo o seguiríamos leyéndolos a regañadientes.</p>
<p>Pero ¿que ocurriría si en lugar de ignorarlos tomamos por bueno la información de los comentarios en lugar de la realidad del código? La respuesta dependerá de cada situación, y en cada una de ellas intervendrán muchos factores, así que dejo esta respuesta a tu criterio, pero personalmente ninguna situación de las que soy capaz de imaginar es positiva.</p>
<h3>Refactorizar comentarios</h3>
<p>Hace no mucho escribíamos también sobre el código oloroso en la entrada ¿<a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">A qué huele el código fuente?</a> y sobre refactorización en la entrada <a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a>.</p>
<p>La refactorización de los comentarios, que hoy estamos llamando mantenimiento, es tan importante como la del propio código. No basta solo con seguir los manuales de buenas prácticas al escribir nuevo código, debemos limpiar y corregir los comentarios irrelevantes, incomprensibles, imprecisos, incoherentes o erróneos que nos encontremos como parte de nuestra labor.</p>
<p>Si decidimos no refactorizar la primera consecuencia será que asumiremos que tanto nosotros como el resto del equipo que trabaje con ese código vamos a tener que convivir con comentarios erróneos. Y la segunda consecuencia que se dará con bastante probabilidad, es que el equipo se contagiará de la dejadez del código y comenzará a emplear malas prácticas, lo que suele acabar en un problema que crece con el paso del tiempo.</p>
<h3>Conclusión</h3>
<p>Debemos tratar los comentarios con la misma delicadeza que tratamos el resto del código, pues un código bien comentado facilita el mantenimiento del software y contribuye a evitar la deuda tecnológica.</p>
<p>¿Y tu qué opinas?, ¿crees que existen más situaciones relacionadas con los comentarios que debamos tener en cuenta en el mantenimiento?, ¿tienes algún consejo o recomendación? Sabes que nos gusta leer tu opinión, compártela en los comentarios.</p>La entrada <a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/">Mantenimiento de comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comentarios a evitar al programar</title>
		<link>https://blog.ahierro.es/comentarios-a-evitar-al-programar/</link>
					<comments>https://blog.ahierro.es/comentarios-a-evitar-al-programar/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 18 Feb 2019 07:36:27 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=596</guid>

					<description><![CDATA[<p>En muchas ocasiones utilizamos los comentarios casi para cualquier cosa, y siendo honestos, es que se prestan a ello y además podemos sacarle mucho partido. El problema es cuando permitimos que los usos alternativos perduren en el tiempo, pues lo único que conseguimos con ello es ensuciar el código. Por supuesto que podemos utilizarlos para &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Comentarios a evitar al programar"</span></a></p>
La entrada <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>En muchas ocasiones utilizamos los comentarios casi para cualquier cosa, y siendo honestos, es que se prestan a ello y además podemos sacarle mucho partido. El problema es cuando permitimos que los usos alternativos perduren en el tiempo, pues lo único que conseguimos con ello es ensuciar el código.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_a_evitar.png" alt="Comentarios a evitar en la programación" class="wp-image-610" srcset="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_a_evitar.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_a_evitar-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-596"></span>



<p>Por supuesto que podemos utilizarlos para ayudarnos a debugar,&nbsp; para ponernos notas, recordatorios o ToDos en en código y mil usos más. Pero los comentarios tienen un único objetivo que es aclarar la intención de un determinado bloque de código, y deberemos ceñirnos a este objetivo para garantizar la limpieza y la mantenibilidad de nuestros fuentes. Todo uso que se aleje de este objetivo (o de la documentación del código) no debe perdurar en el tiempo.</p>





<p>Así que a continuación veremos algunos usos inadecuados de los comentarios que están muy extendidos y que deberíamos evitar.</p>



<p>Este artículo forma parte de una serie que trata de una forma más amplia el uso de los comentarios en la programación, y en la que el artículo <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en la programación</a> utilizaremos como índice.</p>



<h3 class="wp-block-heading">Código comentado</h3>



<p>Cuando estamos trabajando en un proyecto es bastante habitual encontrarnos con código fuente comentado. Suele ocurrir que comentemos&nbsp; un pedazo de código por un motivo temporal y no realicemos una limpieza posterior, con lo que queda ahí para la posteridad. Otro motivo bastante habitual es que realicemos un cambio en el código, no dispongamos de un software de control de versiones y no queramos perder el código original.</p>



<p>Sea cual sea el motivo, ¿qué debe interpretar un desarrollador cuando se encuentra un código comentado? ¿Lo ignora? ¿Lo compara o lo interpreta e intenta relacionarlo con el código no comentado? ¿Qué se supone que debe hacer?</p>



<p>Debemos ser limpios y no dejarnos fragmentos de códigos comentados en nuestros fuentes, y si no disponemos de un software de control de versiones deberíamos darle la máxima prioridad a incluir uno en nuestro proyecto. Puedes ver las entradas <a href="https://blog.ahierro.es/instalar-y-configurar-git-en-una-raspberry-pi-con-ubuntu-mate/">Instalar y configurar Git en una Raspberry Pi con Ubuntu Mate</a> o <a href="https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/">Crear un repositorio remoto en Git desde archivos locales</a>.</p>



<h3 class="wp-block-heading">Identificación de modificaciones</h3>



<p>Un uso menos extendido pero con el que he tropezado en alguna ocasión es una versión «sofisticada» del punto anterior. Realizamos una modificación, comentamos el código original e incluimos ciertos datos como el nombre del desarrollador, la fecha en la que se realizó el cambio y el motivo por el que se hizo.</p>



<p>Veamos el siguiente ejemplos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
// J.J. 15/10/2017  
// Bug: no permitía nombres de 8 caracteres  
// if($userName &gt; 8) {  
if($userName &gt;= 8) {  
   ...  
}
</pre></div>


<p>La molestia visual es evidente, además que que nos llevará más tiempo leer y comprender 4 líneas que una:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
if($userName &gt;= 8) { 
   ... 
}
</pre></div>


<p>Siempre existen circunstancias alrededor de un proyecto, pero de nuevo, si éste no tiene software de control de versiones todos nuestros esfuerzos deberían centrarse en conseguirlo.</p>



<h3 class="wp-block-heading">Código para debugar</h3>



<p>Esto ocurre en mayor medida, aunque no exclusivamente, en proyectos de desarrollo web. Para ayudarnos a debugar nuestro software incluimos líneas extra de códigos que realizan una tarea determinada. Una vez completado el debug las comentamos y permanecen como partes del código fuente eternamente. Esto no hace más que ensuciar el código, la persona que vuelva a tocar esos fuentes probablemente no necesitará debugar en ese punto, o lo hará de otra forma, así que seamos limpios y borremos este tipo de comentarios.</p>



<p>Además, otro hecho que ocurre, es que si continuamente encontramos comentarios que no añaden valor, acabaremos por ignorarlos todos, ¿por qué tenemos que tropezarnos con comentarios de este tipo en el código?</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
/*  
echo &#039;&lt;pre&gt;&#039;;  
printr($var);
echo &#039;&lt;/pre&gt;&#039;;  
die();  
*/  

</pre></div>


<p>Pero sobre todo, asegúrate de disponer de herramientas para debug. Cuando programamos en Java, C++, Basic, C#, etc. no concebimos desarrollar sin herramientas de debug adecuadas, que por lo general vienen incluidas en las IDEs.&nbsp; Así que si eres desarrollador web, asegúrate también de disponer de éstas herramientas. En este mismo blog tenemos una entrada sobre cómo <a href="https://blog.ahierro.es/debugar-php-netbeans-xcode/">Debugar PHP con Netbeans y XCode</a>. Para debugar Javascript también tienes múltiples opciones con herramientas como Chrome DevTools o la consola de Mozilla Firefox.</p>



<h3 class="wp-block-heading">ToDos y notas de trabajo</h3>



<p>En ocasiones nos ponemos notas al programar, yo por ejemplo en ciertas situaciones&nbsp; incluyo alguna línea del tipo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
// todo: añadir validación de longitud máxima al nombre  
if($userName &gt;= 8) {  
...
}
</pre></div>


<p>Existen IDEs que traen soluciones para este tipo de notas, también existen programas que pueden ayudarnos a gestionar estas notas de forma muy efectiva. De cualquier forma, si te gusta trabajar con este tipo de comentarios asegúrate de borrarlo una vez que hayas finalizado la tarea, y si no la vas a terminar, el código fuente no es el lugar dónde indicar las tareas pendientes de completar, así que mejor busca una alternativa.</p>



<h3 class="wp-block-heading">Concluisión</h3>



<p>A pesar de que los comentarios lo aguantan todo, debemos de ser estrictos y hacer un buen uso de ellos, o de lo contrario nunca tendremos un código limpio. Como hemos podido ver, con un software de control de versiones y&nbsp; alguna herramienta para gestionar tareas pendientes podemos reducir drásticamente el número de comentarios inadecuados.</p>



<p>Seguro que tú también te has encontrado con muchos tipos de comentarios inadecuados, ¿de qué tipo eran? ¿qué herramientas utilizas para evitar estos comentarios?&nbsp; Como siempre me gustaría conocer tu experiencia.</p>La entrada <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/comentarios-a-evitar-al-programar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Introducción a los comentarios en programación</title>
		<link>https://blog.ahierro.es/comentarios-en-programacion-introduccion/</link>
					<comments>https://blog.ahierro.es/comentarios-en-programacion-introduccion/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 18 Feb 2019 07:30:49 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=539</guid>

					<description><![CDATA[<p>Son muchos los detalles a los que debemos prestar atención mientras desarrollamos, tantos que en ocasiones relegamos un segundo plano a algunos como pueden ser los comentarios, el estilo del código u otros. A pesar de que en un primer instante pueda parecer un asunto un tanto superficial, los comentarios en la programación son un &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Introducción a los comentarios en programación"</span></a></p>
La entrada <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Son muchos los detalles a los que debemos prestar atención mientras desarrollamos, tantos que en ocasiones relegamos un segundo plano a algunos como pueden ser los comentarios, el estilo del código u otros.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-601" src="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_en_programacion.png" alt="Comentarios en Programación" width="650" height="365" srcset="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_en_programacion.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_en_programacion-300x168.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></p>
<p><span id="more-539"></span></p>
<p>A pesar de que en un primer instante pueda parecer un asunto un tanto superficial, los comentarios en la programación son un tema muy interesante, no por su complejidad, sino porque un correcto uso de ellos puede marcar la diferencia en cuanto a limpieza, facilidad de comprensión del código y su mantenimiento.</p>
<h3>Objetivo de los comentarios</h3>
<p>Los comentarios, cuando hablamos de programación, son bloques de texto escritos en lenguaje natural que están incluidos dentro del código fuente, que el compilador ignora y que por norma general están destinados a que sea el programador el que los interprete.</p>
<p>El objetivo principal de un comentario es dejar constancia en el código fuente de la intención de un determinado bloque de código. Esto es especialmente útil cuando más de un programador tiene acceso al mismo código o para recordar en el futuro por qué tomamos determinada estrategia para el código al que hacemos referencia.</p>
<p>[the_ad id=»1018&#8243;]</p>
<p>Existe también un segundo objetivo muy extendido y de gran utilidad que es para documentar el código. Siguiendo algunas reglas que varían en función de la herramienta, ciertos comentarios pueden ser interpretados por aplicaciones que generan documentación de manera automática. Algunos ejemplos de estas aplicaciones son Javadoc en Java o Doxygen en PHP.</p>
<h3>Características de los comentarios</h3>
<p>Así que dejando al margen del tema de la documentación, para que un comentario aporte todo el valor que se le presupone debe cumplir algunas características.</p>
<ol>
<li><strong>Complementar al código</strong>. Un buen comentario debe transmitir la intención del programador, el concepto, el motivo, la estrategia, pero nunca traducir a lenguaje natural ni explicar el código que hemos escrito, eso ya lo sabe hacer la persona que lee el código.</li>
<li><strong>Ser claro y comprensible</strong>. Escribimos los comentarios para que otros, o nosotros mismos en el futuro, los lean, así que asegurémonos de que cuando lo hagan comprendan perfectamente el mensaje que les estamos transmitiendo. ¿Cuántas veces escribiste una nota que al leerla pasado cierto tiempo no eres capaz de entenderla?</li>
<li><strong>Ser conciso</strong>. No hace falta extendernos o explicar hasta el último detalle, cuanto más concisos seamos más fácil será comprenderlo e invertiremos menos tiempo en ello.</li>
</ol>
<h3>Profundizando en los comentarios</h3>
<p>Realmente esta entrada no era más que una excusa para introducir y dar paso a otros artículos relacionados con los comentarios.</p>
<p>Estos artículos guardarán también cierta relación con una entrada que escribimos hace tan solo unas semanas atrás: <a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente?</a>, tratando el código oloroso y en la que hacíamos referencia a los comentarios como una posible fuente de olores.</p>
<p>Así que a continuación tenéis todas esas entradas que durante las próximas semanas iremos publicando:</p>
<ol>
<li><a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar</a></li>
<li><a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/">Mantenimiento de comentarios</a></li>
<li><a href="https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/">Comentarios y nombres de elementos</a></li>
</ol>
<h3>Conclusión</h3>
<p>Los comentarios, lejos de lo que pueda parecer cuando no se tiene la suficiente experiencia, son un tema que a pesar de su simplicidad pueden marcar la diferencia en nuestro código y al que merece la pena dedicarle cierto tiempo.</p>
<p> </p>La entrada <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/comentarios-en-programacion-introduccion/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Crear un repositorio remoto en Git desde archivos locales</title>
		<link>https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/</link>
					<comments>https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 31 Dec 2018 06:55:49 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Tips & Quick Wins]]></category>
		<category><![CDATA[control de versiones]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[raspberry pi]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.ahierro.es/?p=192</guid>

					<description><![CDATA[<p>Existen múltiples motivos por los que podemos disponer de código fuente antes de versionarlo: que heredemos un proyecto ya existente, que se nos ocurra una idea y en un impetuoso alarde de entusiasmo vayamos directamente al código, etc. Pero para mi el principal motivo es que es la forma más sencilla de comenzar un proyecto &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Crear un repositorio remoto en Git desde archivos locales"</span></a></p>
La entrada <a href="https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/">Crear un repositorio remoto en Git desde archivos locales</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Existen múltiples motivos por los que podemos disponer de código fuente antes de versionarlo: que heredemos un proyecto ya existente, que se nos ocurra una idea y en un impetuoso alarde de entusiasmo vayamos directamente al código, etc. Pero para mi el principal motivo es que es la forma más sencilla de comenzar un proyecto y un repositorio en Git: instalo la aplicación o el framework que necesito, realizo una configuración básica y acto seguido creo el repositorio.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/11/git_logo.jpg" alt="Git" class="wp-image-174" srcset="https://blog.ahierro.es/wp-content/uploads/2018/11/git_logo.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/11/git_logo-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/11/git_logo-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-192"></span>



<p>Por otro lado, en función de diferentes factores relacionados con un proyecto de desarrollo podemos trabajar en equipo, que es lo más probable, o solos. Cuando trabajamos en equipo es lógico que el software de control de versiones se encuentre en un servidor centralizado. Cuando trabajamos solos podemos decidir que solo esté en nuestra máquina.</p>



<p>Personalmente incluso trabajando en solitario en un proyecto me gusta versionar contra en un servidor centralizado por dos motivos principales:</p>



<ol class="wp-block-list"><li>Mayor seguridad ante una eventualidad en mi equipo local, circunstancia que no evita que el proyecto deba estar respaldado por copias de seguridad.</li><li>Posibilidad de trabajar en múltiples dispositivos, una opción más o menos interesante en función de nuestras circunstancias.</li></ol>



<p>En caso de que el proyecto que tengamos entre manos sea de ámbito personal, es más que razonable pensar que no todos disponemos de un servidor en casa dónce centralizar el versionado. Esta situación la podemos resolver con un viejo pc, o si no disponemos de uno con una Raspberry Pi que haga las veces de servidor. Aquí te dejo un enlace al artículo <a href="https://blog.ahierro.es/instalar-y-configurar-git-en-una-raspberry-pi-con-ubuntu-mate/">Instalar y configurar Git en una Raspberry PI con Ubuntu Mate</a>, por si quieres probarlo.</p>





<p>Así que vamos al lío y para ello asumiremos que nuestro servidor está configurado con la ip <em>192.168.1.10</em> y el nombre de nuestro usuario es <em>usuario</em>.</p>



<h3 class="wp-block-heading">Creamos nuestro repositorio remoto</h3>



<p>Lo primero que debemos hacer es crear y configurar correctamente un repositorio vacío en la máquina remota, así que empezaremos por conectarnos a ella:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
ssh usuario@192.168.1.10
</pre></div>


<p>Ya en la consola remota creamos el directorio dónde alojaremos el repositorio que vamos a crear, personalmente creo un directorio en el que incluyo todos los repositorios:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cd ~
mkdir gitRepositoryRoot
cd gitRepositoryRoot
mkdir nuevoProyecto
cd nuevoProyecto
</pre></div>


<p>Y por fin creamos nuestro repositorio vacío y lo configuramos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
git --bare init
git config core.sharedrepository 1
git config receive.denyNonFastforwards true
git config --bool core.bare true
</pre></div>


<p>El último paso en la máquina remota es asignar los permisos adecuados al repositorio:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
find objects -type d -exec chmod 02770 {} \;
</pre></div>


<h3 class="wp-block-heading">Creamos nuestro repositorio local</h3>



<p>Una vez que nuestro repositorio está correctamente creado en el servidor deberemos crear un repositorio local a partir de los fuentes que ya tenemos para posteriormente enlazarlo y enviarlo al repositorio que previamente hemos creado en la máquina remota.</p>



<p>Creamos el repositorio local y añadimos los fuentes existentes que supondremos que se encuentran en <em>/var/www/nuevoProyecto</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cd /var/www/nuevoProyecto
git init
git add *
git commit -m &quot;Commit inicial&quot;
</pre></div>


<p>Creamos el repositorio y añadimos los fuentes:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
git remote add origin ssh://usuario@192.168.1.10/home/usuario/gitRepositoryRoot/nuevoProyecto
git push -u origin master
</pre></div>


<h3 class="wp-block-heading">Comprobamos que todo ha salido bien</h3>



<p>Por último comprobaremos que hemos realizado el proceso correctamente y todo funciona correctamente.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
git checkout origin/master
git branch -f master origin/master
git checkout master
</pre></div>


<h3 class="wp-block-heading">Conclusión</h3>



<p>Trabajemos en grupo o en solitario versionar nuestro código en una máquina remota es una tarea sencilla que aporta grandes beneficios. Cómo siempre me gustaría saber cómo lo haces tú, qué haces distinto, si este artículo te ha ayudado&#8230; Si te animas a compartir deja un comentario.</p>La entrada <a href="https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/">Crear un repositorio remoto en Git desde archivos locales</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry PI como herramienta de apoyo para el desarrollo web</title>
		<link>https://blog.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/</link>
					<comments>https://blog.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 03 Dec 2018 06:15:23 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://www.ahierro.es/?p=157</guid>

					<description><![CDATA[<p>Pocos son los entusiastas de los ordenadores que a día de hoy no han oído hablar de Rasperry PI.&#160; Para los que todavía no la conocen se trata de un pequeño ordenador austero y económico que ocupa poco espacio, consume poca electricidad, no hace ruido y además le podemos instalar algunas distribuciones Linux u otros &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Raspberry PI como herramienta de apoyo para el desarrollo web"</span></a></p>
La entrada <a href="https://blog.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/">Raspberry PI como herramienta de apoyo para el desarrollo web</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Pocos son los entusiastas de los ordenadores que a día de hoy no han oído hablar de Rasperry PI.&nbsp; Para los que todavía no la conocen se trata de un pequeño ordenador austero y económico que ocupa poco espacio, consume poca electricidad, no hace ruido y además le podemos instalar algunas distribuciones Linux u otros sistemas operativos como Windows 10 IOT.</p>



<p>Pues bien, si te gusta trastear tanto como a mi y quieres pasar un buen rato, si tienes un pequeño proyecto personal que quieres «profesionalizar» con un servidor de pruebas, si necesitas un servidor de control de versiones, etc. Una Raspberry PI es una solución muy económica y 100% válida siempre y cuando tus necesidades de hardware no son excesivas y la criticidad de tu proyecto lo permite.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/11/raspberry_pi.jpg" alt="Raspberry PI" class="wp-image-159" srcset="https://blog.ahierro.es/wp-content/uploads/2018/11/raspberry_pi.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/11/raspberry_pi-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/11/raspberry_pi-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-157"></span>



<p>Así que dedicaremos varios artículos a instalar y configurar diversos servidores en una Raspberry Pi para mejorar y complementar nuestro entorno de desarrollo personal.</p>





<p>Para esta serie de entradas utilizo una Raspberry PI 3 Model B sobre la que corre un sistema operativo Ubuntu Mate 16.0.4.2. Todo lo que aquí veremos podemos hacerlo con Raspbian aunque es posible que existan ciertas diferencias en las rutas de algunos archivos u otros pequeños detalles.</p>



<p>Así que vamos al grano y veamos que vamos a hacer con este SBC:</p>



<ol class="wp-block-list"><li><a href="https://www.ahierro.es/habilitar-acceso-ssh-a-raspberry-pi/">Habilitar el acceso mediante SSH</a></li><li><a href="https://blog.ahierro.es/instalar-y-configurar-git-en-una-raspberry-pi-con-ubuntu-mate/">Instalar y configurar un servidor de control de versionado de software, en este caso GIT</a>.</li><li><a href="https://www.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Instalar y configurar un servidor LAMP</a>.</li><li><a href="https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/">Crear nuestro primer repositorio remoto en Git</a>.</li><li>Crear nuestro primer entorno en Laravel.</li><li><a href="https://blog.ahierro.es/vsftp-instalar-y-configurar-un-servidor-ftp-en-raspberry-pi-con-ubuntu/">Instalar y configurar un servidor de FTP</a>.</li><li>Configurar un entorno de integración continua.</li></ol>



<p>Si no dispones de una Raspberry pero si de un viejo pc o de otro u otro mini pc el contenido de esta serie de entradas te servirá de igual manera.</p>



<p>Si echas en falta algo en este servidor para proyectos personales que ayude al desarrollo de un proyecto déjalo en los comentarios.</p>La entrada <a href="https://blog.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/">Raspberry PI como herramienta de apoyo para el desarrollo web</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Debugar PHP con NetBeans y XCode</title>
		<link>https://blog.ahierro.es/debugar-php-netbeans-xcode/</link>
					<comments>https://blog.ahierro.es/debugar-php-netbeans-xcode/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 19 Nov 2018 06:00:12 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tips & Quick Wins]]></category>
		<guid isPermaLink="false">https://www.ahierro.es/?p=123</guid>

					<description><![CDATA[<p>Debugar es una de las primeras cosas que aprendemos cuando comenzamos a desarrollar y nadie en su sano juicio es capaz de poner en duda la importancia de esta tarea. Por otro lado, es increíble la cantidad de desarrolladores para los que si bien en otros lenguajes utilizar un programa para debugar forma parte de &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/debugar-php-netbeans-xcode/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Debugar PHP con NetBeans y XCode"</span></a></p>
La entrada <a href="https://blog.ahierro.es/debugar-php-netbeans-xcode/">Debugar PHP con NetBeans y XCode</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Debugar es una de las primeras cosas que aprendemos cuando comenzamos a desarrollar y nadie en su sano juicio es capaz de poner en duda la importancia de esta tarea.</p>



<p>Por otro lado, es increíble la cantidad de desarrolladores para los que si bien en otros lenguajes utilizar un programa para debugar forma parte de su día a día, cuando programan en php lo hacen de una forma un tanto rudimentaria valiéndose de funciones cómo echo(), print_f(), die()&nbsp; u otras que les ayuden a mostrar en el navegador lo que deberían ver en la herramienta de debug.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/11/debugar.jpg" alt="Configurar XDebug en Netbeans" class="wp-image-137" srcset="https://blog.ahierro.es/wp-content/uploads/2018/11/debugar.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/11/debugar-300x168.jpg 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-123"></span>



<p>Lo reconozco, yo también lo he hecho durante largos periodos de tiempo, y por ese motivo conozco de primera mano la gran diferencia que existe entre utilizar una herramienta adecuada o no hacerlo. Lo peor de todo es que solucionar esta situación es muy sencillo, y basta con un poco de disciplina y 15 minutos de configuración.</p>





<p>Aprovechando que tengo un entorno de desarrollo relativamente nuevo, vamos a ver como se configura. El software que utilizo es:</p>



<ul class="wp-block-list"><li>Ubuntu 18.04.1 LTS</li><li>Apache 2.4.29</li><li>PHP 7.2.10</li><li>NetBeans 8.2</li><li>Mozilla Firefox</li></ul>



<p>Vamos a dar por hecho que ya tenemos este software instalado y nos centraremos en instalar y configurar XDebug.</p>



<h3 class="wp-block-heading">Configuración del servidor</h3>



<p>El primer paso es comprobar si tenemos XDebug instalado, por defecto no suele ser así. Esta comprobación la podemos hacer mediante phpinfo(). Si no está instalado lo instalamos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-get install php-xdebug
</pre></div>


<p>Buscamos el archivo de configuración de la extensión, en mi caso <em>/etc/php/7.2/apache2/conf.d/20-xdebug.ini</em>. Lo editamos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo vim /etc/php/7.2/apache2/conf.d/20-xdebug.ini
</pre></div>


<p>El archivo debería quedar así:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
zend_extension=xdebug.so
xdebug.profiler_enable = On
xdebug.remote_enable=On
xdebug.remote_host=&quot;localhost&quot;
xdebug.remote_port=9000
xdebug.remote_handler=&quot;dbgp&quot;
</pre></div>


<p>La primera línea que habilita la extensión de php ya deberíais tenerla, así que solo tendríamos que agregar el resto. Prestad especial atención al puerto, pues tendrá que coincidir con el que especifiquemos en NetBeans.</p>



<p>Ya sólo nos queda reiniciar Apache y pasaremos a configurar NetBeans:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo service apache2 restart
</pre></div>


<h3 class="wp-block-heading">Configuración de NetBeans</h3>



<p>Ya casi estamos. Abrimos la configuración de NetBeans mediante los menús «Tools» -&gt; «Options». Accedemos a la configuración de PHP y en la pestaña «Debugging» nos aseguramos de que hemos especifiaco el mismo puerto que en la configuración de XDebug para PHP, en nuestro caso el puerto 9000.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/11/xdebug_netbeans_conf_01.jpg" alt="Configurar XDebug en Netbeans" class="wp-image-131" srcset="https://blog.ahierro.es/wp-content/uploads/2018/11/xdebug_netbeans_conf_01.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/11/xdebug_netbeans_conf_01-300x168.jpg 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>Guardamos la configuración, salimos y con esto ya tenemos toda la configuración relativa a XDebug hecha.</p>



<p>La última configuración necesaria para poder debugar se realiza en la configuración de cada proyecto de Netbeans. Para acceder a ella debemos tener visible la ventana de proyectos, botón derecho sobre el propio proyecto y seleccionamos la opción «Properties»del menú.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/11/xdebug_netbeans_conf_02.jpg" alt="Configurar XDebug en Netbeans" class="wp-image-135" srcset="https://blog.ahierro.es/wp-content/uploads/2018/11/xdebug_netbeans_conf_02.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/11/xdebug_netbeans_conf_02-300x168.jpg 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>En la venta de configuración, accederemos al menú «Run Configuration» y nos aseguraremos que los campos «Project URL» y «Index File» están correctamente configurados.</p>





<h3 class="wp-block-heading">Conclusión</h3>



<p>Una configuración muy sencilla que nos ahorrará muchos quebraderos de cabeza. ¿Y tú cómo debugas cuando programas en PHP?</p>La entrada <a href="https://blog.ahierro.es/debugar-php-netbeans-xcode/">Debugar PHP con NetBeans y XCode</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/debugar-php-netbeans-xcode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
