Evitando que aparezcan errores en PHP con error_off()

Muchas veces al diseñar aplicaciones que van creciendo la falta de debug exhaustivo o el despiste de los beta testar puede hacer que aparezcan errores visibles para los usuarios finales… estos errores de los que hablo son los famosos WARNING que salen cuando alguna variable no hace lo que debería o falla alguna función.
Para mitigar esto sin recurrir a complejos métodos que gestionen almacenen o modifiquen en exceso nuestro código os dejo una función muy sencilla que puede hacer que desaparezcan de 2 maneras muy sencillas…

function error_off($metodo=''){q
	if($metodo==''){	// ocultar los errores comentandolos en HTML!
		ini_set('display_errors',		1);
		ini_set('error_prepend_string',	'<!--');
		ini_set('error_append_string',	'-->');
	} else {			//ocultar los errores
		ini_set('display_errors',	0);
		ini_set('error_reporting',	0);
	}
}

Para generar un error de prueba vamos a hacer que un implode() (función que junta todos los valores de un array en un string, genere un error al no facilitarle los dos parámetros mínimos que necesita.

<?php implode('nada'); ?>

Si queremos que la funcion haga que este tipo de errores no aparezcan solo tenemos que poner error_off();

<?php 
error_off();
implode('nada');
 ?>

Si por el contrario queremos que aparezcan en el codigo, pero no en la pagina web (como comentarios HTML solo tenemos que poner error_off(1);

<?php 
error_off(1);
implode('nada');
 ?>

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).

function liveUp(id, img, h, w, zenit, wait){
	if(img==null)		img		= 'star.png';
	if(h==  null)		h		= '32';
	if(w==  null)		w		= '32';
	if(zenit== null)	zenit	= 50;
	if(wait== null)		wait	= 100;
	$(id).each(
		function(i, domEle){
			var d			= new Date().getTime();
			var liveUpId	= id+'_'+i+'_'+d; //i;'_LiVE_Up'+
			liveUpId		= liveUpId.replace('#', '_');
			var offset		= $(domEle).offset();
			var object		= '<img id="'+liveUpId+'" src="'+img+'" height="'+h+'" width="'+w+'" />';
			
			$('body').append(object);
			
			$('#'+liveUpId)
				.animate({opacity: 1.0}, wait)
				.css({'visibility':'visible', '':''})
				.css({'position':'absolute'})
				.css({'top':offset['top'], 'left':(offset['left']+($(domEle).width()/2)-(w/2) )})
				.animate({opacity: 0.0, top: offset['top']-zenit}, 1000, 
					function (){
						$('#'+liveUpId).remove();
					}
				)
			;
		}
	);
}

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 style="background:gray; color: white;">
	<head>
	    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
	    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js" type="text/javascript"></script>
		<script type="text/javascript">

			function liveUp(id, img, h, w, zenit, wait){
				if(img==null)		img		= 'star.png';
				if(h==  null)		h		= '32';
				if(w==  null)		w		= '32';
				if(zenit== null)	zenit	= 50;
				if(wait== null)		wait	= 100;
				$(id).each(
					function(i, domEle){
						var d			= new Date().getTime();
						var liveUpId	= id+'_'+i+'_'+d; //i;'_LiVE_Up'+
						liveUpId		= liveUpId.replace('#', '_');
						var offset		= $(domEle).offset();
						var object		= '<img id="'+liveUpId+'" src="'+img+'" height="'+h+'" width="'+w+'" />';
						
						$('body').append(object);
						
						$('#'+liveUpId)
							.animate({opacity: 1.0}, wait)
							.css({'visibility':'visible', '':''})
							.css({'position':'absolute'})
							.css({'top':offset['top'], 'left':(offset['left']+($(domEle).width()/2)-(w/2) )})
							.animate({opacity: 0.0, top: offset['top']-zenit}, 1000, 
								function (){
									$('#'+liveUpId).remove();
								}
							)
									
						;
					}
				);
			}
			
			//direccion de la imagen... en base64 para que funcione directamente con el archivo
			var url_imagen = 'data:image/png;base64,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'; 		</script>
		<title></title>
	</head>
	<body>
		<br /><br /><br /><br /><br /><br /><br /><br /><br />
		<b id="estrella" onclick="liveUp('#estrella', url_imagen, 20, 20)">
			pulsa aqui para ver como sale una estrella de 20px por 20px
		</b>
		<br /><br /><br /><br /><br /><br /><br /><br /><br />
		<b id="logo" onclick="liveUp('#logo', 'http://www.tierra0.com/wp-content/themes/satori/images/LogoTierra0-2.gif', 100, 200, null, 200)">
			pulsa aqui para ver como sale el logo de google pero mucho mas lento
		</b>
		<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>
	</body>
</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);.

function youtube($id, $debug = false) {
	$_id = parse_url($id);
	parse_str($_id['query']);
	unset($_id);
	$id = empty($v) ? $id : $v;

	$url = 'http://es.youtube.com/watch?v='.$id;
	// Obtencion de los datos desde la web // // //
	//	(si esta parte te resulta demasiado lenta sustitullela por $query = @file_get_contents($url);
	$cookie = tempnam ("/tmp", "YOUTUBE");
	$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
	$c	=	curl_init($url);
        	curl_setopt($c,	CURLOPT_COOKIEJAR,		$cookie);
        	curl_setopt($c,	CURLOPT_COOKIEFILE,		$cookie);
			curl_setopt($c,	CURLOPT_FOLLOWLOCATION,	true);	// no sigue las redirecciones
			curl_setopt($c,	CURLOPT_HEADER,			false);	// no mostrar el header denro de la salida
			curl_setopt($c,	CURLOPT_RETURNTRANSFER,	1);
			curl_setopt($c,	CURLOPT_USERAGENT,		$user_agent);

	$query=	curl_exec($c);
			curl_close($c);
	
	// // // // // // // // // // // // // // // //
	
	$exp_info = '!&t=(.+)&!U';
	preg_match_all($exp_info,$query,$t);
	
	$exp_info = "!<meta name=\"title\" content=\"(.+)\">!U";
	preg_match_all($exp_info,$query,$titulo);
	
	$exp_info = "!<meta name=\"description\" content=\"(.+)\">!U";
	preg_match_all($exp_info,$query,$descripcion);
		
	$exp_info = "!<span class=\"watch-video-added post-date\">(.+) de (.+) de (.+)</span>!U";
	preg_match_all($exp_info,$query,$fecha);
	
	$exp_info = "<meta name=\"keywords\" content=\"(.+)\">";
	preg_match_all($exp_info,$query,$tags);
	
	$exp_info = "!href=\"/user/(.+)\"!U";
	preg_match_all($exp_info,$query,$user);
	
	$t				= $t[1][0];
	$titulo			= $titulo[1][0]; 
	$descripcion	= $descripcion[1][0];
	$fecha			= ($fecha[1][0]&&$fecha[2][0]&&$fecha[3][0]) ? $fecha[1][0].' de '.$fecha[2][0].' de '.$fecha[3][0] : '';
	$tags			= $tags[1][0];
	$user			= $user[1][0];
			
	$salida["id"]			= $id;
	$salida["t"]			= $t;
	$salida["url"]			= $url;
	$salida["iurl"]			= "http://img.youtube.com/vi/".$id."/2.jpg";
	$salida["reproductor"]	= "http://www.youtube.com/p.swf?video_id=".$id."&iurl=http://img.youtube.com/vi/".$id."/2.jpg&t=".$t;
	$salida["video"]		= "http://youtube.com/get_video.php?video_id=".$id."&t=".$t;
	$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>";
    
	$salida["title"]		= utf8_decode(html_entity_decode($titulo));
	$salida["descripcion"]	= utf8_decode(html_entity_decode($descripcion));
	$salida["fecha"]		= $fecha;
	$salida["tags"]			= utf8_decode(html_entity_decode($tags));
	$salida["usuario"]		= utf8_decode(html_entity_decode($user));

	if($debug){
		//sistema de diagnostico
		$salida['debug']				= $query;
		$s['la url de lectura es']		= $url;
		$s['lectura de video']			= ($query		)	? 'si' : 'no' ;
		$s['t encontrado']				= ($t			)	? 'si' : 'no' ;
		$s['titulo encontrado']			= ($titulo		)	? 'si' : 'no' ;
		$s['descripcion encontrada']	= ($descripcion	)	? 'si' : 'no' ;
		$s['fecha encontrada']			= ($fecha		)	? 'si' : 'no' ;
		$s['tags encontrados']			= ($tags		)	? 'si' : 'no' ;
		$s['usuario encontrado']		= ($user		)	? 'si' : 'no' ;
		$s['contenido para debug']		= $salida;
		return	$s;
	}
	
	if($t == ""){ //Error de conexion
		return false;
	} else { // todo OK
		return $salida;
	}
}

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.

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

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