Importando y exportando archivos csv con PHP

Los ficheros CSV (abreviatura de comma-separated values) son de gran utilidad, dado que nos permiten importar y exportar datos fácilmente en un formato libre que puede ser abierto por casi cualquier hoja de cálculo.

Para el ejemplo de generación de CSV vamos a suponer que habéis lanzado una consulta contra una base de datos SQL y ya tenéis los datos recuperados en el array pertinente (en este caso le llamaré $datos en el ejemplo), pero además de imprimirlos en pantalla tenéis que exportarlos a un formato con el que pueda trabajar, por ejemplo, Excel (cuando estaba en Nática tuve que hacer algo similar pero con ASP). Bueno, pues la cosa iría como en el siguiente ejemplo:

$file = fopen("exportacion.csv","w"); //abrimos el archivo csv para escritura
$s = ","; //establecemos un separador

while($registro = mysql_fetch_array($datos) ) {
	$fila = $registro['id'].$s.$regisro['nombre'].$s.$registro['telefono']."\n";
	fwrite($file,$fila);
}
fclose($file);

Bueno, la cosa es simple. Primero abrimos el archivo (en este caso le llamé exportacion.csv) en modo de escritura. Establecemos una variable con un valor como separador (en este caso, la coma) y recorremos el array con un bucle while, creando una variable $fila con todos los datos que guardamos en cada iteración del bucle. Con todo esto ya tenemos generado nuesto .csv

Pero ¿y el caso contrario? ¿Y si lo que queremos es abrir un fichero csv desde nuestro php para imprimirlo en pantalla o para guardarlo en la base de datos? Bueno, en el siguiente ejemplo veremos como leer el archivo:

$file = fopen ( "exportacion.csv" , "r" );
while (( $data = fgetcsv ($file,1000,",")) !== FALSE ){
    $i = 0;
    foreach($data as $row) {
        echo "registro $i: $row<br/>";
        // Imprime toda la fila
        $i++ ;
    }
    echo "<br/><br/>";
}
fclose ( $file );

 

Bueno, la explicación es rápida también. Primero abrimos el archivo de antes en modo lectura. Tras esto, usando la función fgetcsv recuperamos la información del archivo y con el bucle foreach recorremos todas las filas, en este caso imprimiéndolas. Podríamos, por ejemplo, usar la función split para partir la fila por las comas y acceder así a los valores por separado de cada una

En fin, espero que esto os sirva como ayuda e introducción para trabajar con estos archivos en php

Trabajando con el plugin Lightbox de jQuery

Sigo con los desarrollos en PHP matando mi tiempo de parado (creo que me matricularé en un curso de desarrollo para Android de Aula Mentor mañana, por meterme al fin en el mundo de las apps móviles aunque, por otra parte, no tenga smartphone, ni lo tendré hasta que no tengan un SO totalmente libre), y el otro día me vi en la situación idónea para utilizar Lightbox, un plugin para jQuery con licencia Copyleft, fácil de implementar y con un resultado vistoso.

En fin, lo primero que debéis hacer es descargaros el plugin desde la página de su creador y la librería jQuery. De la página del creador os bajaréis un zip con cuatro carpetas:

  • La carpeta js contiene el código javascript del plugin, en versión comprimida (la que pone min, que ocupa menos porque se come los espacioes en blanco) y en una versión más legible (por si queréis meterle mano y modificarlo). Bueno, también podéis modificar la min, pero al estar sin sangrado ni saltos de línea para ocupar menos no hay dios que lea el código. Hay un tercer archivo que pone pack, que la verdad no se muy bien para qué vale (los estudiaré a fondo más adelante)
  • En la capeta css encontraréis la hoja de estilos para usar el plugin.
  • En la carpeta images hay varias imágenes que utiliza el plugin para la presentación (botones de NEXT, PREV  y CLOSE).
  • Finalmente la carpeta photo incluye varias imágenes de ejemplo, podéis borrarla sin problema.
  • También hay un archivo index.html que incluye un ejemplo con las imágenes de la carpeta photo.

Bien, copia a tu proyecto la biblioteca jQuery, el archivo .css y el archivo .js (si vas a usarlo a saco, sin modificar, usa el .min.js porque ocupa menos) del plugin y la carpeta images. Tras esto debes chargar los archivos en la cabecera del proyecto, dentro de una etiqueta SCRIPT para ls .js y de LINK para los CSS, tal que así:

<script type="text/javascript">// <![CDATA[
type</span>="text/javascript" src="js/jquery-1.7.1.min.js">
// ]]></script>
<script type="text/javascript">// <![CDATA[
type</span>="text/javascript" src="js/jquery.lightbox-0.5.min.js">
// ]]></script>
rel="stylesheet" type="text/css" href="css/jquery.lightbox-0.5.css"/>

Bueno, he usado las rutas de mi proyecto, acordaos de usar las vuestras cuando lo implementéis.
Luego lo más tópico es crear una lista de thumbnails, usando una estructura de lista desordenada, algo tipo:

</pre>
<div id="<span class=">dvFotoFilo"></div>
<pre>
<ul>
<ul>
	<li><a class="hiddenSpellError">class="foto" href="photo/0.jpg"><img src="photo/0.jpg" alt="" width="125px" height="93px" /></a></li>
</ul>
<ul>
	<li><a class="hiddenSpellError">class="foto" href="photo/00.jpg"><img src="photo/00.jpg" alt="" width="125px" height="93px" /></a></li>
</ul>
<ul>
	<li><a class="hiddenSpellError">class="foto" href="photo/000.jpg"><img src="photo/000.jpg" alt="" width="125px" height="93px" /></a></li>
</ul>
</ul>
</div>

La estructura es simple: Un div para las fotos, dentro de dicho div una lista desordenada y dentro de cada elemento de la lista un enlace a la ruta de la imágen que queréis mostrar, y dentro de dicho enlace una versión reducida de la imagen. En este caso estoy usando la imagen grande reducida con propiedades css, pero podéis crear un thumbnail del tamaño adecuado, que sería más recomendable porque acelerará la carga. En cualquier caso la clave es la clase (class = «foto») que se aplicará al elemento, porque la necesitaremos en el siguiente punto, que es invocar la función lightbox del plugin, con el siguiente script:

$(document).ready(function(){
$('.foto').lightBox();
});

El script es simple como el mecanismo de un chupete: usamos el selector para coger todos los elementos con la categoría foto y le aplicamos  la función lightBox() de la librería .js del plugin.
Con esto ya tenemos implementado lightbox en nuestra página. He utilizado la estructura de lista desordenada, pero podéis utilizar cualqueir estructura html, simplemente recordad la regla «» y en la función de invocación llamáis a dicha clase.

Consultas parametrizadas con PHP y MySQL

ESTA ENTRADA ESTÁ ANTICUADA. EL USO DE LA LIBRERÍA mysql YA NO SE RECOMIENDA EN PHP POR OBSOLETO. EN ESTE ENLACE TIENES UNA OPCIÓN MEJOR, CON MySQLi. PARA VER COMO HACERLO CON PDO PRUEBA CON ESTE.

Sigo con mi desarrollo freelance en PHP (para matar estos tiempos de desempleo), y hoy me he visto en la situación de tener que usar consultas parametrizadas. ¿Por qué usar consultas parametrizadas? Básicamente por seguridad, dado que las consultas parametrizadas son la mejor opción, a día de hoy, para evitar la inyección SQL (siempre y cuando estén bien implementadas). Lo habitual en las consultas MySQL en PHP es chuzarle tal cual los parámetros, concatenando cadenas de texto, lo que es muy inseguro, como en este ejemplo:

$sql = "SELECT * FROM tabla WHERE condicion1 = ".parametro1." and condicion2 = ".parametro2."";

En Java tenemos la función PreparedStatement como una gran ayuda, pero en PHP en principio no (aunque con PDO creo que hay algo similar, pero no he trabajado con dicho framework), así que lo que haremos será crear nuestro propio método para crear consultas parametrizadas y otro para tratar los parámetros.

Pero lo primero es crear la consulta sql tal que así:

$sql = "SELECT * FROM tabla WHERE condicion1 = ? and condicion2= ?";

Este es el formato de consulta parametrizada típico de Java, utilizando interrogaciones en lugar de los valores.

Bien, una vez tenemos así la idea es generar dos funciones. La primera comprobará el tipo de parámetro, si es cadena, array, número o nulo. Si es de cadena lo devolverá entre comillas y con los caracteres especiales ya escapados. Si es un array lo devolverá como una cadena de valores separados por comas, si es un nulo devolverá la cadena NULL y si no es ninguno de esos tres dará por hecho que se trata de un número y lo devolverá tal cual. El código sería el siguiente:

function prepareParam($parametro)
{
if(is_string($parametro))
{
// Si el parámetro es una cadena retorna cadena
return "'".mysql_scape_string($parametro)."'";
}
else if(is_array($parametro))
{
// Si es un array devolvemos una lista de los parámetros
// separados por comas.
$devolver = '';
foreach($parametro as $par)
{
// Cuando retorno es vacio ('') quiere decir que no
// tenemos que añadir la coma.
if($devolver == '')
{
$devolver .= prepararParametro($par);
}
else
{
$devolver .= ','.prepararParametro($par);
}
}
return $devolver;
}
else if($parametro == NULL)
{
// Si es nulo devolvemos la cadena 'NULL'
return 'NULL';
}
else
{
// Devolvemos el parametro.
return $parametro;
}

En fin, me disculpo por enésima vez por el sangrado. En fin, Pilarín, continuamos. Ya tenemos nuestro tratamiento de parámetros, ahora nos queda hacer la función que inserte los parámetros dentro de la consulta, y esta será la siguiente. Una función que recibe la cadena con la consulta y una lista de parámetros, parte la consulta por las interrogaciones, procesa los parámetros y se los chuza dentro:

function preparedStatement($cons_sql, $param = array())
{
// Partimos la consulta por los símbolos de interrogación
$partes = explode("?", $cons_sql);

$devolver = '';
$num_parametros = count($param);

// Recorremos los parametros
for($i = 0; $i < $num_parametros; $i++)
{
// Juntamos cada parte con el parametro correspondiente preparado
//con la función antes creada.
$devolver .= $partes[$i].prepareParam($param[$i]);
}

$num_partes = count($partes);
// Si hay más partes que parametros quiere decir que hay una parte final que hay que concatenar
if($num_partes > $num_parametros)
{
$devolver.= $partes[$num_partes -1];
}

// Devolvemos la consulta preparada
return $devolver;
}

Con esto ya tenemos nuestro PreparedStatement, casero y mejorable (podríamos, por seguridad, hacer que comprobara si el número de parámetros pasado coincide con el número requerido en la consulta, por ejemplo).

Existe otra forma de parametrizar utilizando una función nativa de PHP, sin tener que recurrir a bibliotecas externas, que era la que nos enseñaban en el San Clemente cuando hice allí el ciclo (idea de Rafa Veiga, que era el profesor que daba Proyecto Integrado): La idea es utilizar la función sprintf, que funciona como un printf (si has programado en C seguro que conoces dicha función) pero no imprime en pantalla, simplemente almacena en la variable la cadena construída de forma parametrizada. Dicho así suena un poco rollo, pero con este ejemplo lo entenderás:

$sql = sprintf("SELECT * FROM pi_usuarios WHERE nick = '%s' and password = '%s'", $_POST['nick'],$_POST['passwd']);

Bueno, esto era un fragmento de código de mi proyecto de curso de PHP. Básicamente la consulta recupera todos los registros de la tabla pi_usuarios cuyos valores nick y password coincidan con los que se han pasado por un método post (si hubiera más de uno, devolvería un error, si hubiera menos también, pero eso es tema para otro día que hablemos de tratamiento de errores en php). En cualquier caso os explico: la función sprintf (al igual que printf) sustituirá los %s por valores de cadena de texto que vendrán especificados tras la coma (en este caso las variables $_POST[‘nick] y $_POST[‘passwd’]). Dichos %s van entre comillas porque van a ser tratados en la consulta sql como cadenas, la idea es que paséis entre comillas todo lo que en la consulta, de forma nativa, iría entre comillas, y sin ellas lo que no las necesite (valores numéricos, mismamente). Lo que no se es si este sistema ayuda a evitar la inyección sql de forma efectiva o no, pero al menos se ve más claro que construyendo la consulta a base de concatenar cadenas.

En fin, espero que os haya sido útil.

Paginación con PHP+MySQL

Hoy me encontraba con la necesidad de hacer uso de la paginación en un desarrollo PHP. Nunca lo había hecho previamente en este lenguaje, aunque sí había tenido que hacerlo en VB.NET (tablas paginadas a gogo en mi paso por Nática SL) y en Java. Entre la experiencia con otros lenguajes y las búsquedas en San Google he encontrado como hacerlo.

Para esto vamos a utilizar dos funciones de MySQL: SQL_CALC_FOUND_ROWS, que nos permite calcular el número de resultados de una consulta sin LIMIT, y FOUND_ROWS, que nos permite recuperar el resultado de la última ejecución de la función anterior. Estos dos métodos nos ahorrarán hacer una consulta COUNT para saber el total de resultados, que necesitaremos para calcular la cantidad de páginas que se mostrarán.

Supongo que ya sabéis crear una conexión con una base de datos MySQL en PHP, así que es lo primero que debéis hacer.

Lo siguiente es definir una variable con el número máximo de resultados a mostrar por página:

 $max = 10

En mi caso la fijé en 10 resultados. Luego hay que definir qué página se mostrará, que en principio se pedirá usando el método GET:

$pagina = (int) $_GET[‘pag’];

if($pagina<1)

{

$pagina = 1;

}

$offset = ($pagina-1)*$max;

Luego viene la creación de la consulta paginada y de la consulta para conocer el total.

$sql = «SELECT SQL_CALC_FOUND_ROWS id, name FROM clientes LIMIT $offset, $max»;

$sqlTotal = «SELECT FOUND_ROWS() as total»;

Tras esto, recogemos los Result Set de ambas consultas, con los que podemos calcular el total y almacenar los resultados.

$resultSet = mysql_query($sql);

$rsTotal = mysql_query($sqlTotal);

$filasTotal = mysql_fetch_assoc($rsTotal);

$total = $filasTotal[‘total’];

Bueno, ahora sólo nos queda crear una tabla en la que mostrar los resultados, con los enlaces a las distintas páginas debajo.

border=»1″ bordercolor=»#0000EE»>
<thead>
<tr>
<td>Id</td>
<td>Name</td>
</tr>
</thead>
<tbody>
<?php
while ($fila = mysql_fetch_assoc($resultSet))
{
$id = $fila[«id»];
$name = htmlentities($fila[«nombre»]);
?>
<tr>
<td><?php echo $id; ?></td>
<!–?php echo $name; ?>–>
</tr>
<?php
}
?>
</tbody>
<tfoot>
<tr>
colspan=»2″>
<?php
$totalPag = ceil($total/$max);
$enlaces = array();
for( $i=1; $i<=$totalPag ; $i++)
{
$enlaces[] = «href=\»?pag=$i\»>$i«;
}
echo implode(» – «, $links);
?>
</td>
</tr>
</tfoot>
</table>

Tenéis que perdonar el deficiente sangrado del código, pero al ponerlo como comentario siempre queda descojonado. En cualquier caso podéis probar a copiar y pegar en un editor como Aptana Studio, donde el sangrado automático arreglaría la cuestión.

En fin, espero que esto os sea de ayuda.

Creando y añadiendo un «favicon» a nuestra web

A día de hoy todavía se ven webs sin favicon por ahí (el icono que podéis ver en el navegador cuándo la visitáis o que queda como enlace corto cuando añadís la página a favoritos). No es que sea fundamental, desde luego, pero hace bonito y no cuesta mucho hacer uno.

Haciendo un poco de «captain Obvious» lo primero que necesitarás es una imagen. Fíjate por ejemplo en esta de wordpress, en la de gmail, en la de facebook o en la de Twiteer ¿qué ves? Un diseño sencillo y sólido. No te mates con una imagen con muchos detalles porque el tamaño en que se mostrará es muy pequeño, intenta más bien un diseño sencillo, preferiblemente en dos colores y con una letra o símbolo muy reconocibles como elemento principal. Este icono ha de ser tu «meme» en internet.

Puedes crear la imagen haciendo uso del programa de edición de imagen GIMP, totalmente libre y bajo licencia GPL, o de Inkscape. El caso es que cuando tengas diseñada tu imagen (si tienes un logo, una buena idea es poner simplemente la primera letra de este sobre tu color corporativo, y ya tienes un icono seguramente muy válido), debes guardarla en un tamaño y formato válido para su uso como icono. El tamaño ideal es alrededor de 16 x 16 px. Las opciones de formato más válidas son usar un archivo .ico, un .png o un .gif.

El .ico, si está muy comprimido, me ha dado algún problemilla con Opera y Chrome/Safari, el .gif es ideal si queréis usar un icono animado, y yo suelo utilizar .png, que además suelo comprimir lo máximo posible (tampoco es que requieran una gran definición ya que se ven miniaturizados).

Finalmente llega el momento de incluirlo en vuestra página. Basta con añadir una línea dentro del bloque head  de vuestro HTML con esta estructura:

<link rel="shortcut icon" href="directorio/vuestraimagen.laextensiónquesea" />

Importante, el parámetro rel antes que href siempre. Aunque para insertar un css o una librería de javascript en principio sea indiferente, en este caso a mi me ha fallado alguna vez poniendo primera la dirección del recurso.

En fin, con esto ya tenéis mis consejillos de cómo elaborar e insertar vuestro icono. Enjoy it!

IZArc vs 7zip: Duelo empaquetado y comprimido

Aunque mucha gente todavía sigue insistiendo en usar versiones crackeadas de WinRAR por cabezonería (¿para qué usas software de pago sin licencia disponiendo de excelentes opciones gratuitas, melón?) cada vez son más, no se si porque los fabricantes se han encabronado con la licencia y ahoras es más complicado copiarlos, los que apuestan por usar un compresor o archivador de ficheros gratuito.

Haciendo memoria creo que el primer compresor que utilicé fue ARJ para MS-DOS, para descomprimir una copia de PCBasket 4.0 guardada en disquettes. Tras eso llegaron a mi interfaces gráficas más amigables como fueron los populares WinZip y WinRAR, que utilicé durante años. Allá por 2006 me pasé a IZArc por una temporada (con un breve escarceo de por medio con FilZip, pero no me acabó de convencer), y sería en 2009 cuando mi profesor de Sistemas Operativos y Redes me descubriría 7zip. He de decir que antaño no me preocupaba de temas como el tipo de licencia, cosa que ahora hago.

Y llega la gran batalla ¿7zip o IZArc? De los archivadores que he probado son los mejores, y ambos existen para Linux, Windows y MacOS (aunque los usuarios de Mac seguro que podéis buscar un archivador privativo, con DRM, con varios programas de software espía y a un módico precio de unos 30 o 40 dólares, pero con una manzanita en el logo, botones redondeados en relieve, diseño Ikea y por la subscripción a tres años os envían a casa un pelo de Steve Jobs aka “El más rico del cementerio”).

Empecemos por la licencia. IZArc, de IZSoftware, aunque gratuito no es libre, su código es privativo. 7zip, de Igor Pavlov (algo diseñado por un tío con nombre de malo de peli de James Bond gana puntos) además de gratis es libre, bajo licencia GPL aunque sí incorpora algún plugin privativo (el de .RAR, por ejemplo). Yo sólo por esto ya me quedo con 7zip, pero seguramente a más de uno os importe un carajo la licencia, así que vamos con puntos técnicos.

A nivel de disponibilidad, además de los ya citados Linux, Windows y MacOS, también están disponibles para BSD, AmigaOS, MS-DOS y WindowsMobile, ambos. Si bien en principio 7zip sólo tiene entorno gráfico para la versión de Windows (en el resto se ejecuta en línea de comandos), existen desarrollos alternativos (como Q7Z para Linux o #7Z para MacOS) que os aportarán ese entorno más amigable y cómodo.

A nivel de funcionalidades IZArc implementa una más, la de reparar archivos dañados, que 7zip no posee. Por otra parte habría que decir que tampoco funciona demasiado bien (la mayor parte de las veces que he intentado reparar archivos corruptos con IZArc este no ha sido capaz de recuperarlos, aunque en un pequeño número sí logró salvar el archivo).

A nivel de formatos ambos son capaces de abrir zip, tar, gz, bz, 7z, rar, lha, lzh, arj, cab e imágenes ISO. IZArc, por su parte, permite además abrir ace y arc. En cambio 7zip nos permitirá abrir xz, msi, cpio, imágenes dmg/HFS de Apple y paquetes deb o rpm.

Aunque en lectura gane 7zip en formatos de escritura gana IZArc. Ambos pueden escribir archivos zip, tar, gzip, bzip2 y 7z. Pero IZArc permite también cab y lha/lzh, mientras que es xz el único formato que 7zip escribe e IZArc no.

Finalmente llegamos a la cuestión de la eficiencia. Aquí le doy dos puntos a 7zip. Primero porque es el que consigue un mayor ratio de compresión, logrando entre un 1 y un 5% más que IZArc comprimiendo el mismo archivo en zip y en 7z. En cuanto a velocidad, con un archivo .tar.gz de 2.3 gigas (5.4 descomprimido, era una imagen de disco de VMWare) el 7zip logró hacerlo casi un 20% más rápido (hablamos de unos 15 segundos de diferencia).

Me gustaría hablaros de seguridad y sobre cual logra la encriptación más fuerte (ambos la permiten), pero la verdad es que no lo se, y no me he puesto tan profundamente a probar. Pero seguramente internet os de interesantes respuestas sobre el tema.

En fin, espero que esta comparativa os haya aclarado las cosas, ahora es cosa vuestra probar y decidir.

Una SOPA con auténtico sabor americano

Si nos paramos un segundo a pensar, la SOPA tiene todos los componentes repugnantes de la política norteamericana posterior a la segunda guerra mundial.

Stop On-line Piracy Act, para los españolitos de a pie que no están muy enterados del tema es la versión yankee de la Ley Sinde, y como todo lo yankee es más grande, más caro, más violento y más intrusivo. Richard Stallman ya avisó hace años que esto se nos vendría encima, y como siempre le llamaron paranoico y radical… y al final, aquí estamos, con el agua al cuello y la marea llevándonos mar adentro.

Y en el fondo es una ley 100% yankee. Tiene todos los componentes nefastos de la política americana de las últimas décadas: imperialismo, liberalismo económico por encima de libertad individual, multinacionales mangoneando al gobierno, interés privado sobre interés público, caza de brujas, violación impune del derecho a la intimidad… eso es el genuino sabor americano del siglo XX y no Marlboro.

United Fruit promovió guerras en América Latina para defender sus intereses. El contubernio de empresas petroleras hizo lo propio en Medio Oriente. Hollywood lo ha tenido más fácil, no han necesitado movilizar tropas, no han tenido que despertar críticas por las muertes de sus tropas porque les ha bastado con una nueva ley que recorte las libertades, otra más, algo a lo que ya se han acostumbrado porque desde los tiempos del Comité de Actividades Antiamericanas de McCarthy estos recortes, disfrazados de “seguridad nacional” y de “leyes patrióticas” son el pan de cada día.

La gran industria del entretenimiento, la que comandan FOX, Disney o Warner, la gente como Rupert Murdoch o el por suerte ya fallecido Steve Jobs exigen leyes para mantener sus privilegios. Porque no es tanto la piratería lo que temen, no son estas supuestas “pérdidas económicas” lo que les da miedo de verdad, lo que les tiene acojonados es perder el control sobre la distribución. Les da miedo perder el control sobre lo que compra la gente. Están acostumbrados a sus entregas de premios manipuladas, sus grandes campañas publicitarias, el que su producto sea el único que esté disponible en las grandes superficies comerciales. Con internet pierden esto, porque una persona creativa puede hacer una campaña publicitaria más efectiva que la que todos sus millones pueden pagar, porque la maqueta autoproducida de cuatro melenudos de Richmond está igual de disponible que la producción millonaria de la última imitadora de Madonna que se hayan sacado de la manga, porque es igual de fácil ver el corto de unos estudiantes de animación coruñeses que la última producción de Pixar. Eso les asusta todavía más. Les asusta que el escritor novel pueda ser tan leído como el escritor que tiene un Nobel. Les asusta que leas este artículo en este blog, en lugar del artículo que ellos han situado en su periódico. El cine y la televisión han sido armas básicas para el imperialismo cultural americano, para normalizar su modo de vida entre nosotros sin que nos demos ni cuenta, y temen perder eso. La PiPa además haría ilegal el publicar contenidos que permitan saltarse estas leyes (como yo ya he hecho aquí) o distribuir programas que rompan su software DRM. Incluso dejaría la puerta abierta a que fuera ilegal distribuir un software que te permita reproducir contenidos sin DRM… podría llegar un día en que saques una maqueta con tu grupo grabada en tu casa y nadie pueda escucharla porque no estás en una gestora de derechos de autor.

Y no sólo eso, la PiPA además, les permitiría prácticamente poder monitorizar y espiar a cualquiera por sospechoso de «piratería». Prácticamente legalizaría la intromisión en la privacidad de la gente, sin consecuencia alguna para sus agencias de control. Para los no estadounidenses puede que sólo implique que un tipo del FBI te pueda leer los e-mails, pero allí combinado con el Acta Patriótica (una ley más propia de la Alemania nazi o la China más represora que de una democracia) les permitiría controlar movimientos como Ocuppy Wall Street.

Lo decía ayer mi amigo Brais: “Tenemos que ser como Mafalda y no tragarnos la SOPA”. Podemos elegir: podemos tener un internet libre, que nos garantice el acceso a conocimientos, opiniones, cultura y entretenimiento o podemos dejar que internet sea el nuevo centro comercial donde las cámaras sean software que espía nuestros correos y tráfico, y donde sólo tengamos tiendas como Amazon, iTunes o AndroidStore. Llamadme paranoico, también se lo llamaron a Stallman hace dos décadas…

Cómo saltarse un bloqueo DNS (windows y linux)

Ante todo, que sepan las autoridades competentes que esto no es una guía para delinquir ni quebrantar leyes democráticas. Más bien lo veo como una ayuda a gente que ha tenido la mala suerte de nacer en países del chichinabo, tiranías que aprueban leyes antidemocráticas en beneficio de algunos lobbys adinerados, donde la desobediencia civil está justificada. Si tu gobierno decide utilizar el bloqueo DNS para evitar que accedas a una web, puedes probar con esto para saltártelo.

Bueno, no perderé el tiempo explicando qué es DNS, si lo sabes bien y si no tienes la universal sabiduría de Wikipedia. Pero ¿qué es el bloqueo DNS? Imaginemos que el gobierno español (llámase PP o PSOE) aprobara una ley que les permitiera bloquear el acceso a una serie de páginas web, ya sea para favorecer a los cuatro capitalistas adinerados de siempre o para censurar contenidos que no quieren que lleguen a la opinión pública. Una medida podría ser obligar a los servidores DNS alojados dentro del país a borrar de sus listas dichas páginas. Puedes creer que suena descabellado, pero China lo ha hecho, Turquía lo ha hecho y los EEUU lo harán dentro de nada por obra y gracia de la SOPA.

La solución: utilizar un servidor DNS que esté fuera del país, lejos de leyes de protección de privilegios de editor (creo que a día de hoy llamarlos derechos de autor es insulto a la palabra derechos).

En Windows el procedimiento es el siguiente: En Panel de Control váis a «Ver estado y tareas de red». Ahí buscáis «Cambiar configuración del adaptador». Localizáis la tarjeta de red que queréis modificar y hacéis click derecho sobre ella para acceder a «Propiedades». En propiedades normalmente está marcado por defecto «Obtener la dirección del servidor DNS automáticamente». Ahí tenéis que cambiar y seleccionar la opción de abajo «Usar las siguientes direcciones de servidor DNS». Yo voy a recomendar Telecomix Censorship Proof DNS como servidor principal, cuya ip (que es lo que debéis poner en el cuadro de texto de «Servidor DNS preferido») es 91.191.136.152 y como servidor alternativo (el otro cuadro de texto) el de Google, cuya ip es 8.8.8.8

En Linux podéis hacerlo desde el entorno gráfico, pero creo que es mejor hacerlo por comandos porque así es más universal y no depende de la distribución que tengáis. Sólo tenéis que buscar el archivo /etc/resolv.conf y ahí buscar las líneas que ponen nameserver seguido de una dirección IP. Sólo tenéis que cambiar esta IP por las arriba citadas (o por la que queráis utilizar) y reiniciar los servicios de red para tener dicha configuración cambiada.

En el siguiente enlace podéis encontrar una guía muy interesante sobre este tema, llamada Manual de Desobediencia a la Ley Sinde en la que veréis otras formas de configurar el dns (cambiándolo en el router) o como configurar un proxy; aunque me gustaría recordar que yo no estoy animando a incumplir ninguna ley por injusta, antidemocrática, absurda y fascistoide que esta sea.

Eliminar «virus» mediashifting.com / 95p.com en Windows

Si te has encontrado con que todos los buscadores te redireccionan automáticamente a las páginas web 95p y mediashifting seguramente estés dándote de cabezazos con mil soluciones en varios foros. Yo llevo un rato intentando eliminar este rootkit desde hace un rato, y creo que al fin lo he conseguido.

De primeras ni Avast free, ni Avira, ni Spyware Doctor, ni el Malware-bytes ni Spybot Search and Destroy son capaces de cargárselo (digo a día de hoy, a saber si dentro de unos días en la pertinente actualización lo arreglarán).

En muchos combos recomiendan usar combofix ( que parece una solución potente aunque algo drásctica), yo me lo he cargado con TDSSKiller. Es sencillo.

Lo primero es descargar TDSSKiller desde la página de Kaspersky y descomprimirlo.

Luego hacéis click derecho sobre tdsskiller.exe y lo ejecutáis con permisos de administador.

Una vez arrancado haced click en Change Parameters y seleccionáis Verify Driver Digital Signature y  Detect TDLFS File System. Pulsáis Start Scan (y mientras haga el escaneo no hagáis nada más con el ordenador) y si detecta objetos maliciosos o sospechosos marcáis «cure» en el combo y pulsáis Continue.

Tras esto, con alguna utilidad de mantenimiento como CCleaner, limpiad el registro. Y la cosa debería ir ya. Si no os funciona pues probad con combofix, con cuidadito de no cargaros nada (da bastante el coñazo este programa, pero es efectivo, eso sí, se recomienda desinstalarlo al acabar la tarea).