Artículos+recientes

En defensa de los derechos fundamentales en internet

Derechos de internetAnte la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que:

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red, en España ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Se ha publicado en multitud de sitios web. Si estás de acuerdo y quieres sumarte a él, difúndelo por Internet.

eMule: nuevos servidores y correcciones de velocidad

eMulePor peticiones on y off-line os dejo más instrucciones sencillas para poder tener una mejor búsqueda de archivos, descarga mas rápida y mas servidores validos.

Lista de servidores actualizados:

  1. Seleccionar todas las direcciones y copiarlas.
    http://www.gruk.org/server.met
    http://www.peerates.net/servers.php
    http://usuarios.lycos.es/guillespi/server.met
    http://www.peerates.net/servers.php
    http://www.picsystems.net/emule/servermet/all_server.met
  2. servidor

  3. Hacer click en en Preferencias > Servidor > Editar...
  4. En la ventana del block de notas que aparece borrar todo el texto
  5. pulsar edición > pegar
  6. reiniciar el emule

Si se prefiere solo añadir puntualmente unos cuantos servidores, se puede hacer click en los enlaces que aparecen arriba.

Otro de los servidores mas famosos que no suele estar dentro de ninguna lista es el creado por TusSeries.com . Se trata de un servidor de emule “en beta” pero que funciona realmente bien. Para incluirlo solo hay que hacer click en el siguiente enlace: servidor de emule de TusSeries.

Tablas de velocidad
Para alcanzar la mejor velocidad de emule hay que cambiar algunos parámetros de velocidad. Los pasos son los siguientes.
hacemos el Test de velocidad para ver que velocidad alcanza realmente nuestra linea.
Según los resultados cambiamos los valores por los de la tabla siguiente.
(Situar la flecha encima de los textos subrayados de la tabla para obtener información adicional de la configuración.)

Velocidad 1MB / 300 kbps 2MB / 300 kbps 3MB / 300 kbps 4MB / 512 kbps 6MB 8MB hasta 20 megas con ADSL2+
Capacidad Descarga 100 KB/s 204 KB/s 306 KB/s 400 KB/s 612 KB/s 816 KB/s 2040 KB/s
Límite Descarga sin límite sin límite sin límite sin límite sin límite sin límite sin límite
Capacidad Subida 22 KB/s 22 KB/s 22 KB/s 35 KB/s 45 KB/s 44 KB/s 70 KB/s
Límite Subida 22 KB/s 22 KB/s 22 KB/s 45 KB/s 35 KB/s 44 KB/s 70 KB/s
Tamaño de la cola 5000 5000 5000 5000 5000 5000 5000
Conexiones máximas 1000 1000 1000 1000 1000 1000 1000
Máx. Fuentes/archivo 1000 1000 1000 1000 1000 1000 1000
Nuevas Conexiones máx.5/seg. 60 60 60 60 60 60 60
Máx. Conexiones a medio abrir 9 9 9 9 9 9 50
(tabla extraída de testdevelocidad.es)

Es importante tener los puertos abiertos para obtener una buena velocidad, es lo que se suele llamar tener una ID alta.
Al terminar hay que guardar los valores y cerrar el emule para que cargue los datos.

Filtro AntiSpam
Muchos de los servidores actuales contienen datos de Spam corruptos que impiden que obtengamos resultados al hacer búsquedas.
Para evitar que esto nos pase podemos establecer un filtro que elimine las conexiones malintencionadas y limpie los resultados finales.
para hacer esto tenemos que:
Seguridad eMule

  1. Entramos en Preferencias > Seguridad.
  2. En la seccion de Filtrar IP activamos Filtrar servidores.
  3. en Actualizar desde URL borramos el contenido y escribimos
  4. http://surfnet.dl.sourceforge.net/sourceforge/emulepawcio/ipfilter.dat y pulsamos el boton cargar.
  5. En caso de no encontrar el boton de cargar reiniciamos el emule.

Si todo funciono correctamente, el archivo .dat será actualizado y se borraran automáticamente muchos de los servidores.

Efecto con jQuery tipo LiveUp

estrellas liveUpOs acordáis de SuperMario cuando cogía una vida nueva? pues el otro día pensando en como avisar a los usuarios de alertas gráficamente sin abrir alert() o PopUp innecesarios me acorde de eso mismo.. y fruto de esa idea ha salido este código..

Se trata de una función que al ejecutarla muestra una imagen sobre el elemento indicado, desvaneciéndose y subiendo en un tiempo determinado.

Para ejecutar la función tenemos que poner como primer parámetro el identificador del objeto, ya sea el nombre del tag HTML, del ID o de la clase como en cualquier elemento jQuery es decir, si es un ID con # delante y si es una clase con . delante.
El siguiente parámetro es la dirección de la imagen que queremos que se abra cuando se ejecute la función. El tercer y cuarto valor es respectivamente el alto y ancho de la imagen que vamos a mostrar, el quinto (la variable zenit) es la altura que va a alcanzar la imagen al desaparecer (por defecto esta en 100px). El ultimo valor es el tiempo que tarda en desvanecerse el objeto seleccionado, el tiempo predeterminado es 1 segundo pero si se quiere poner uno hay que ponerlo en ms (1s = 1000).

JavaScript:
  1. function liveUp(id, img, h, w, zenit, wait){
  2.     if(img==null)      img        = 'star.png';
  3.     if(h==  null)      h    = '32';
  4.     if(w==  null)      w    = '32';
  5.     if(zenit== null)    zenit   = 50;
  6.     if(wait== null)  wait = 100;
  7.     $(id).each(
  8.         function(i, domEle){
  9.             var d         = new Date().getTime();
  10.             var liveUpId    = id+'_'+i+'_'+d; //i;'_LiVE_Up'+
  11.             liveUpId        = liveUpId.replace('#', '_');
  12.             var offset    = $(domEle).offset();
  13.             var object    = '<img id="'+liveUpId+'" src="'+img+'" height="'+h+'" width="'+w+'" />';
  14.            
  15.             $('body').append(object);
  16.            
  17.             $('#'+liveUpId)
  18.                 .animate({opacity: 1.0}, wait)
  19.                 .css({'visibility':'visible', '':''})
  20.                 .css({'position':'absolute'})
  21.                 .css({'top' :o ffset['top'], 'left':(offset['left']+($(domEle).width()/2)-(w/2) )})
  22.                 .animate({opacity: 0.0, top: offset['top']-zenit}, 1000,
  23.                     function (){
  24.                         $('#'+liveUpId).remove();
  25.                     }
  26.                 )
  27.             ;
  28.         }
  29.     );
  30. }

Este código es una función que usa jQuery y jQuery.Easing para ejecutar los efectos base.. ha sido testado en Firefox3, Safari4 y IE7.0.5730.11IC bajo winXP.

A continuación os dejo un ejemplo. Para hacerlo funcionar solo tenéis que guardar con extensión html.

HTML:
  1. <html style="background:gray; color: white;">
  2.     <head>
  3.         <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
  4.         <script src="http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js" type="text/javascript"></script>
  5.         <script type="text/javascript">
  6.  
  7.             function liveUp(id, img, h, w, zenit, wait){
  8.                 if(img==null)      img        = 'star.png';
  9.                 if(h==  null)      h    = '32';
  10.                 if(w==  null)      w    = '32';
  11.                 if(zenit== null)    zenit   = 50;
  12.                 if(wait== null)  wait = 100;
  13.                 $(id).each(
  14.                     function(i, domEle){
  15.                         var d         = new Date().getTime();
  16.                         var liveUpId    = id+'_'+i+'_'+d; //i;'_LiVE_Up'+
  17.                         liveUpId        = liveUpId.replace('#', '_');
  18.                         var offset    = $(domEle).offset();
  19.                         var object    = '<img id="'+liveUpId+'" src="'+img+'" height="'+h+'" width="'+w+'" />';
  20.                        
  21.                         $('body').append(object);
  22.                        
  23.                         $('#'+liveUpId)
  24.                             .animate({opacity: 1.0}, wait)
  25.                             .css({'visibility':'visible', '':''})
  26.                             .css({'position':'absolute'})
  27.                             .css({'top':offset['top'], 'left':(offset['left']+($(domEle).width()/2)-(w/2) )})
  28.                             .animate({opacity: 0.0, top: offset['top']-zenit}, 1000,
  29.                                 function (){
  30.                                     $('#'+liveUpId).remove();
  31.                                 }
  32.                             )
  33.                                    
  34.                         ;
  35.                     }
  36.                 );
  37.             }
  38.            
  39.             //direccion de la imagen... en base64 para que funcione directamente con el archivo
  40.             var url_imagen = 'data:image/png;base64,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';   </script>
  41.         <title></title>
  42.     </head>
  43.     <body>
  44.         <br /><br /><br /><br /><br /><br /><br /><br /><br />
  45.         <b id="estrella" onclick="liveUp('#estrella', url_imagen, 20, 20)">
  46.             pulsa aqui para ver como sale una estrella de 20px por 20px
  47.         </b>
  48.         <br /><br /><br /><br /><br /><br /><br /><br /><br />
  49.         <b id="logo" onclick="liveUp('#logo', 'http://www.tierra0.com/wp-content/themes/satori/images/LogoTierra0-2.gif', 100, 200, null, 200)">
  50.             pulsa aqui para ver como sale el logo de google pero mucho mas lento
  51.         </b>
  52.         <p>Ejemplo creado en tierra0.com, mas info en <a href="http://www.tierra0.com/2009/09/07/efecto-con-jquery-tipo-liveup/">tutorial de liveUp</a></p>
  53.     </body>
  54. </html>

Para problemas ruegos y preguntas los comentarios, y para donaciones, invitadme a un café ;)

Función de extracción de datos Youtube() en PHP version4

LogoYoutubePHPContinuo con el desarrollo de una nueva versión de esta función que tan famosa parece estarse haciendo.. como todo el mundo sabe su funcionamiento es muy sencillo, se le pasa una variable que puede ser la URL de un video de youtube o su ID y da como resultado un montón de datos sobre el video ordenados dentro de un array, teniendo un segundo parámetro que podemos activar en caso de error y que nos facilita información interna sobre la función..

Esta 4º versión de la función ha salido sobre todo gracias al generoso "cafe" al que me ha invitado @Tx y a los apuntes sobre errores que ha encontrado @Nach en los textos con acentos y similares. De modo que el funcionamiento general de la función es exactamente el mismo.

La otra novedad que tiene esta actualización es el modo en que se realiza la petición de datos, ya que ahora lo hace prácticamente a la misma velocidad pero indicando a youtube que somos un navegador firefox, de manera que así obtendremos los mismos datos que un navegador web normal a su misma velocidad.
Esta modificación se encuentra entre las lineas 9 y 23 de manera que si alguien tiene problemas con esta nueva manera de obtener los datos o encuentra que tiene un consumo de memoria o de tiempo mayor puede volver al modo anterior solo sustituyendo ese párrafo por query = @file_get_contents($url);.

PHP:
  1. function youtube($id, $debug = false) {
  2.     $_id = parse_url($id);
  3.     parse_str($_id['query']);
  4.     unset($_id);
  5.     $id = empty($v) ? $id : $v;
  6.  
  7.     $url = 'http://es.youtube.com/watch?v='.$id;
  8.     // Obtencion de los datos desde la web // // //
  9.     //  (si esta parte te resulta demasiado lenta sustitullela por $query = @file_get_contents($url);
  10.     $cookie = tempnam ("/tmp", "YOUTUBE");
  11.     $user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
  12.     $c  = curl_init($url);
  13.             curl_setopt($c, CURLOPT_COOKIEJAR,      $cookie);
  14.             curl_setopt($c, CURLOPT_COOKIEFILE,    $cookie);
  15.             curl_setopt($c, CURLOPT_FOLLOWLOCATION,  true);    // no sigue las redirecciones
  16.             curl_setopt($c, CURLOPT_HEADER,      false);   // no mostrar el header denro de la salida
  17.             curl_setopt($c, CURLOPT_RETURNTRANSFER,  1);
  18.             curl_setopt($c, CURLOPT_USERAGENT,      $user_agent);
  19.  
  20.     $query= curl_exec($c);
  21.             curl_close($c);
  22.    
  23.     // // // // // // // // // // // // // // // //
  24.    
  25.     $exp_info = '!&t=(.+)&!U';
  26.     preg_match_all($exp_info,$query,$t);
  27.    
  28.     $exp_info = "!<meta name=\"title\" content=\"(.+)\">!U";
  29.     preg_match_all($exp_info,$query,$titulo);
  30.    
  31.     $exp_info = "!<meta name=\"description\" content=\"(.+)\">!U";
  32.     preg_match_all($exp_info,$query,$descripcion);
  33.        
  34.     $exp_info = "!<span class=\"watch-video-added post-date\">(.+) de (.+) de (.+)</span>!U";
  35.     preg_match_all($exp_info,$query,$fecha);
  36.    
  37.     $exp_info = "<meta name=\"keywords\" content=\"(.+)\">";
  38.     preg_match_all($exp_info,$query,$tags);
  39.    
  40.     $exp_info = "!href=\"/user/(.+)\"!U";
  41.     preg_match_all($exp_info,$query,$user);
  42.    
  43.     $t        = $t[1][0];
  44.     $titulo   = $titulo[1][0];
  45.     $descripcion    = $descripcion[1][0];
  46.     $fecha      = ($fecha[1][0]&&$fecha[2][0]&&$fecha[3][0]) ? $fecha[1][0].' de '.$fecha[2][0].' de '.$fecha[3][0] : '';
  47.     $tags         = $tags[1][0];
  48.     $user         = $user[1][0];
  49.            
  50.     $salida["id"]         = $id;
  51.     $salida["t"]            = $t;
  52.     $salida["url"]      = $url;
  53.     $salida["iurl"]   = "http://img.youtube.com/vi/".$id."/2.jpg";
  54.     $salida["reproductor"]  = "http://www.youtube.com/p.swf?video_id=".$id."&iurl=http://img.youtube.com/vi/".$id."/2.jpg&t=".$t;
  55.     $salida["video"]        = "http://youtube.com/get_video.php?video_id=".$id."&t=".$t;
  56.     $salida["html"]   = "<object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http://www.youtube.com/v/".$id."\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"http://www.youtube.com/v/".$id."\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"425\" height=\"350\"></embed></object>";
  57.    
  58.     $salida["title"]        = utf8_decode(html_entity_decode($titulo));
  59.     $salida["descripcion"]  = utf8_decode(html_entity_decode($descripcion));
  60.     $salida["fecha"]        = $fecha;
  61.     $salida["tags"]   = utf8_decode(html_entity_decode($tags));
  62.     $salida["usuario"]    = utf8_decode(html_entity_decode($user));
  63.  
  64.     if($debug){
  65.         //sistema de diagnostico
  66.         $salida['debug']                = $query;
  67.         $s['la url de lectura es']    = $url;
  68.         $s['lectura de video']      = ($query  )    ? 'si' : 'no' ;
  69.         $s['t encontrado']        = ($t   )    ? 'si' : 'no' ;
  70.         $s['titulo encontrado']   = ($titulo      )  ? 'si' : 'no' ;
  71.         $s['descripcion encontrada']    = ($descripcion )    ? 'si' : 'no' ;
  72.         $s['fecha encontrada']      = ($fecha  )    ? 'si' : 'no' ;
  73.         $s['tags encontrados']      = ($tags    ) ? 'si' : 'no' ;
  74.         $s['usuario encontrado']        = ($user        )   ? 'si' : 'no' ;
  75.         $s['contenido para debug']    = $salida;
  76.         return  $s;
  77.     }
  78.    
  79.     if($t == ""){ //Error de conexion
  80.         return false;
  81.     } else { // todo OK
  82.         return $salida;
  83.     }
  84. }

Esta función responde un array con las variables del video siempre que el video no haya sido borrado, caso en el que devuelve false.
Un ejemplo practico.

PHP:
  1. $datos = youtube('http://es.youtube.com/watch?v=aWCD69urAqQ&fmt=18');
  2. if($datos){
  3.     foreach($datos as $nombres => $valor){
  4.         echo $nombre.' = '.$valor."<br />\n";
  5.     }
  6. } else {
  7.     echo 'el video que intentaba ver no existe';
  8. }

Si aun queda algún error solo tenéis que comentarlo ah!, y las donaciones/cafés son bienvenidas ;)

Ejemplo de upload simple para uno o varios archivos

rocketFileDado que me comentaron aun con el ultimo post que no se aclaraban muy bien como subir archivos esta vez no voy a poner una función si no un código de ejemplo para subir uno o varios archivos a nuestro servidor.
El código es muy fácil y esta muy comentado así que espero que no haya ningún problema en seguirlo o modificarlo.
Se trata de un formulario muy simple con una caja para subir el archivo y un botón de enviar. Se puede modificar y poner todas las cajas que queramos para subir todos los archivos que queramos. Como plus le he incorporado una sentencia que hace que si esa caja esta vacía no se envíe el formulario hasta que se complete.

la segunda parte hace una comprobación de si se ha enviado algún archivo para subir, si es así no pone nuestro formulario y en vez de eso pone todos los datos que podemos obtener de la subida del archivo. Si se ha enviado un archivo para subir pero ocurrió algún error, nos lo indicara también. En caso de no haber enviado nada pondrá el formulario.

Cada echo la lista de echo seguidos de comentarios son todas las variables que podemos usar en nuestro script. En caso de subir varios archivos a la vez este apartado se duplicara por cada archivo subido.

PHP:
  1. <html>
  2.     <head>
  3.         <title></title>
  4.     </head>
  5.     <body>
  6.         <?php
  7.         //formulario simple para subir el archivo (a traves de este mismo archivo)
  8.         $fomulario = '<form method="post" enctype="multipart/form-data" onsubmit="return (this.archivo.value!=\'\')">
  9.             <input type="file" name="archivo"/>
  10.             <button type="submit">Subir a la web</button>
  11.         </form>';
  12.        
  13.         //direccion donde queremos dejar el archivo
  14.         $path = './';
  15.        
  16.         //si se ha enviado uno o varios archivos no ponemos el formulario
  17.         if(count($_FILES)>0) {
  18.             //obtenemos todos los archivos uno por uno
  19.             foreach($_FILES as $name => $values){
  20.                
  21.                 //comprobamos que esten en la carpeta que nosotros queremos
  22.                 if( move_uploaded_file($values['tmp_name'],$path.$values['name']) ){
  23.                
  24.                     echo 'El archivo ha sido subido correctamente.<br/>';
  25.                     echo 'Otros datos del archivo:<br/>';
  26.                     echo 'Nombre del objeto del formulario: '.    $name.                    '<br/>';
  27.                     echo 'Nombre original del archivo: '.         $values['name'].      '<br/>';
  28.                     echo 'Tipo de archivo: '.                  $values['type'].      '<br/>';
  29.                     echo 'Nombre del archivo temporal: '.         $values['tmp_name'].   '<br/>';
  30.                     echo 'Error producido al subir el archivo: '.   $values['error'].    '<br/>';
  31.                     echo 'Tama&ntilde;o del archivo: '.    $values['size'].  '<br/>';
  32.                     echo '<br/>';
  33.                                    
  34.                 } else {
  35.                     //si no estan en la carpeta que nosotros queremos
  36.                     echo 'Ha ocurrido un error.<br/>';
  37.                
  38.                 }
  39.             }
  40.         } else {
  41.             //muestra el formulario si no se ha realizado ningun envio de archivo
  42.             echo $fomulario;
  43.         }
  44.         ?>
  45.     </body>
  46. </html>

El método de uso es muy sencillo. Copia el código de arriba, crea un archivo con extensión php, pega el codigo dentro y guardalo.
Una vez realizado esto solo tienes que cambiar el texto asociado a la variable $path de la linea 14 y poner la dirección de donde quieres que se guarden los archivos una vez en el servidor.
Un usuario "anónimo" ha echo un aporte a este articulo indicando que la función copy() no es la mas adecuada para este tipo de casos aun que sea la mas extendida entre los ejemplos. La mas adecuada es move_uploaded_file() como vemos en la linea 22 que realiza una comprobación previa de que el archivo que va a mover ha sido enviado por HTTP POST desde un formulario, y no es un archivo de dentro de nuestro servidor, evitando de esta manera problemas de seguridad.