tus camisetas frikis en camisetafriki.com

Archive

Archive for the ‘Programacion’ Category

PHP: explode vs split

May 14th, 2010 1 comment


El otro día, hablando con mi compañero de curro, le planteé la duda de por qué usaba split en lugar de explode para separar cadenas en un array dado un delimitador, cómo no supo responderme ni yo tampoco sabía la diferencia, fui a mirar el manual en php.net y la diferencia realmente es que:

  • explode() toma como parámetros la cadena con el delimitador, la cadena sobre la que se aplica y un parámetro opcional para limitar el número de elementos que se van a separar conteniendo el último el resto de la cadena sin partir
  • split() toma como parámetro una expresión regular cómo delimitador, la cadena sobre la que se aplica y un parámetro opcional para limitar el número de elementos.

La función split en realidad es mucho más flexible para según que cosas pero más costoso si sólo queremos partir por un carácter que suele ser lo habitual, entonces es mejor usar explode(). Además, desde PHP 5.3, split() está obsoleta (por lo que provocará un Warning) y se recomienda usar preg_split() en su lugar, que además admite otro parámetro flag para modificar su comportamiento.

Espero que hayáis aprendido una cosa más :)

Referencias:
explode()
split()
preg_split()

Categories: Programacion Tags:

Autenticarse en Google a través de un proxy y PHP

March 16th, 2010 No comments

Como en los otros posts (I y II) sobre la API de Google Calendar no quedó muy claro el proceso de conexión y autenticación Google, voy a pegarte un trocito de código que además de cargar las librerías necesarias para usar las APIs de Google, también te enseña como hacerlo a través de un proxy, como es el caso de mi empresa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
	require_once 'Zend/Loader.php';
	Zend_Loader::loadClass('Zend_Gdata_App_HttpException');  
	Zend_Loader::loadClass('Zend_Gdata_ClientLogin');  	  
	Zend_Loader::loadClass('Zend_Http_Client_Exception');  
	Zend_Loader::loadClass('Zend_Http_Client');  
	Zend_Loader::loadClass('Zend_Http_Client_Adapter_Proxy'); 
	Zend_Loader::loadClass('Zend_Gdata_Calendar');
 
	$config = array(  
	    'adapter'    => 'Zend_Http_Client_Adapter_Proxy',  
	    'proxy_host' => 'proxy.empresa.es',  
	    'proxy_port' => 8080  ,
		'proxy_user' => 'usuario_proxy',
		'proxy_pass' => 'contraseña_proxy',
		'proxy_auth' => Zend_Http_Client::AUTH_BASIC
	); 
 
	$proxiedHttpClient = new Zend_Gdata_HttpClient('http://www.google.com:443', $config); 
 
 
	$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
	$user = "usuario@gmail.com";
	$pass = "password";
 
	try {  
		$httpClient = Zend_Gdata_ClientLogin::getHttpClient($user, $pass , $service,  $proxiedHttpClient);  
	} catch (Zend_Gdata_App_HttpException $httpException) {  
	exit("An error occurred trying to connect to the proxy server\n" .          
		$httpException->getMessage() . "\n");  
	}  
 
 
	// Create an instance of the Calendar service
	$service = new Zend_Gdata_Calendar($proxiedHttpClient);

En caso de que el proxy no requiera usuario y contraseña, omitiremos las líneas de proxy_user y proxy_pass.

Una vez auténticados, ya podemos operar con el objeto $service para operar con Google Calendar en este caso pero también sirve para Google Docs, Youtube, etc. añadiendo las librerías correspondientes.

Cabe destacar que si te da un error de SSL (stream_socket_enable_crypto() [streams.crypto]: this stream does not support SSL/crypto in …) debes incluir la extensión OpenSSL en el php.ini añadiendo la linea extension=”openssl.so” y reiniciando el servidor para que se active.

También es posible que de un error Fatal error: Call to undefined method Zend_Http_Client::setClientLoginToken() in C:\xampp\php\ZendGdata\library\Zend\Gdata\ClientLogin.php on line ***, por eso he cambiado una línea que ponía
new Zend_Http_Client(’http://www.google.com:443?, $config);
por la que pone
new Zend_Gdata_HttpClient(’http://www.google.com:443?, $config);

Ahora ya podemos por ejemplo listar todos nuestros calendarios así:

36
37
38
39
40
41
42
43
44
45
46
47
48
try {
	    $listFeed= $service->getCalendarListFeed();
	} catch (Zend_Gdata_App_Exception $e) {
	    echo "Error: " . $e->getMessage();
	}
 
	echo "<h1>Calendar List Feed</h1>";
	echo "<ul>";
	foreach ($listFeed as $calendar) {
	    echo "<li>" . $calendar->title .
	         " (Event Feed: " . $calendar->id . ")</li>";
	}
	echo "</ul>";

Fuentes:
GData Tips
Zend Framework
http://archive.netbsd.se/?ml=squirrelmail-plugins&a=2007-07&t=4669364

Categories: Programacion Tags:

Android Developer Lab Madrid 2010

February 15th, 2010 No comments

Este sábado pasado asistí al Android Developer Lab organizado por Google y que se celebró en Fuenlabrada, en la Universidad Rey Juan Carlos I.

El día antes corría el rumor por twitter de que Google estaba regalando su nuevo móvil Nexus One a los asistentes de los demás eventos de Android que estaban haciendo por Europa. Ese rumor se volvió confirmación mientras se celebraban los eventos de Paris y NY (sólo que en Nueva York regalaban Motorola Droid). Así que con ese aliciente, el madrugón del Sábado para estar allí a las 10 de la mañana no sabía tan mal.

Al llegar lo primero que hicieron fue repartir los teléfonos a los asistentes registrados que éramos bastantes y llenamos la sala de conferencias.

El evento en sí, me resulto un poco decepcionante, puede ser que fuese influenciado en que el inglés del ponente me resultaba más difícil de entender que el de su compañero que hablaba menos. También porque no hicimos nada de networking (iba con @mr_villa y su amigo @olerud). Parece ser que hubo gente de And.roid.es, de GeeksPhone, Droiders y de Inizziativa (ganadores del ADC2). Pero especialmente porque pedían que llevásemos un portátil con el SDK 2.1 instalado, supuestamente para ver algo de código, pero de eso nada.

Después de la charla de introducción con datos de lo bueno que es Android y de lo que está creciendo y de ver cómo los usuarios de Android usan más sus aplicaciones y las borran menos que respecto al iPhone, nos invitaron a comer unos sandwiches y unas cocacolas para seguir después con otra pequeña charlita sobre el SDK y las APIs de desarrollo donde enseñaron un par de snippets de código para emplear geolocalización y fondos animados.

En general, si no hubiese sido por el Nexus One del cual haré una reseña en breve, la charla me habría resultado decepcionante aunque doy por hecho que otras personas la habrán aprovechado mucho más que yo desvirtualizando otros usuarios de twitter con los que se comunican, al estilo de lo que hicimos nosotros en el congreso de webmasters.

Categories: Programacion, Tecnología Tags:

Mésa multitáctil, reconociendo dedos + proyección de imagen

January 30th, 2010 1 comment

Pues por fin hemos integrado ambas partes, el reconocimiento de dedos y tracking con la retroproyección de la imagen en pantalla y la verdad es que funciona bastante bien. En el vídeo que hay más abajo se puede ver el resultado. Va bastante lento debido a que el ordenador que hemos conectado es un netbook con un procesador Atom de 1Gb de RAM y una gráfica Intel GMA de las báscias, aún así, hace el tratamiento de imagen bastante bien pero cuando hagamos la prueba con el Core2Duo será otro cantar y la aplicación de demostración irá como un avión. Entre tanto dejo aquí el vídeo.

Reconociendo dedos en la mesa táctil

November 24th, 2009 No comments

Como algunos ya sabéis, Naranjo y yo andamos montando una mesa multitáctil al estilo de la Microsoft Surface, pero en plan casero, y ahorrarnos unos 11000€ que vale el bicho.

El caso es que estamos construyéndola desde cero, montando nosotros la estructura de la mesa, a nuestro gusto, pensada para sentarse alrededor con sillas normales como si fuese una mesa de comedor. La idea original es usarla para juegos de rol, donde en el centro tengamos la pantalla y desde la posición sentada podamos llegar a cualquier punto de la mesa. Así podríamos mostrar mapas de las regiones, del campo de batalla, la cuadrícula de combate, etc. Pero por supuesto nuestra ambición va más allá, queremos terminarla y ofrecerla como un producto terminado a cualquiera que esté interesado en disponer de una mesa multitáctil. Además, queremos desarrollar más aplicaciones que hagan un uso innovador de esta tecnología y convertirlo en algo a tener en cuenta de cara al futuro de las nuevas tecnologías e interfaces multitouch.

Hay unas cuantas fotos de la construcción de la mesa más abajo y también encontrarás el vídeo que he colgado en YouTube en el que se ve como la aplicación creada por NuiGroup reconoce los dedos con el montaje que tenemos hecho que de momento no son más que un monton de leds infrarrojos dispuestos en 8 grupos de 8 leds un poco al tuntún y una webcam modificada para que filtre la luz natural y vea la infraroja.

Vídeo de la primera prueba de tracking con un portátil

iWeekend Madrid

November 22nd, 2009 No comments

Hacía tiempo que no escribía por aquí!

Estan siendo unos días intensos, desde que terminó en congreso he estado hablando con gente muy interesante a través de twitter, y me he ido enterando a través de ellos de otros eventos orientados al negocio en internet, muy en auge, y otro tipo de iniciativas emprendedoras.

Después de perderme el Evento Blog España de Sevilla que pintaba muy muy bien, y el FICOD en Madrid por ser entre semana, a los cuales me habría encantado ir y que al menos pude seguir por twitter e internet, al menos estoy asistiendo al iWeekend.

Consiste en juntarnos 50 personas interesadas en emprender un proyecto y elegir entre todos, una de las ideas propuestas para ser lanzada durante los días que dura el evento. El domingo tiene que haber una versión funcional muy básica de la idea, y esto se está haciendo en 10 lugares simultáneamente, lo cual es un indicador de que la iniciativa está gustando. En Madrid es la segunda edición ya.

La idea que se ha seleccionado para Madrid es un sitio web donde emprendedores buscan microinversiones de instituciones y particulares colgando sus ideas de empresa para ser revisadas por dichos inversiones que pueden elegir cuanto invertir en cada propuesta. Yo, para no ser menos, estoy en la parte de desarrollo, pero es un gustazo trabajar en equipo, con los demás desarrolladores y con los demás equipos, sobre todo los de diseño, que son los directamente relacionados con nosotros. Esperamos lanzar una beta funcional para el domingo a última hora.

Además, estoy aprendiendo mucho sobre como lanzar una empresa, cosas a tener en cuenta, modelos de financiación, gente que ya ha emprendido, etc. Hoy nos ha dado una charla uno de los fundadores de BuyVip y nos ha contado su experiencia y la verdad es que me parece apasionante todo este mundo. ¡Mamá! ¡quiero ser emprendedor!

Por otra parte, a través de twitter se puede seguir los comentarios del resto de iWeekends que se están desarrollando en paralelo siguiendo las etiquetas de #iweekend, #iw_mad, #iwcs, etc…

Cuando tenga un rato colgaré fotos pero se pueden ir viendo algunas en el Blog de Patricia Araque.También puedes ver una lista de twitteros del iWeekend de Madrid aquí

@laurixi y yo agotados tras el segundo dia de iWeekend y viendo la presentación del plan de negocio

@laurixi y yo agotados tras el segundo dia de iWeekend y viendo la presentación del plan de negocio

Diseño elegido para el logo de emprendemás

Diseño elegido para el logo de emprendemás

Categories: Interesante, Programacion, Tecnología Tags:

[Javascript] Crear objetos en Javascript

August 19th, 2009 No comments

Como siempre se me olvida, voy a apuntar aquí cómo se hacen objetos o clases nuevas en javascript.

Lo primero es crear una función con el nombre del objeto, ya demás puede llevar parámetros, por ejemplo:

function miObjeto(parametro1, parametro2)
{
this.primerParam = parametro1;
this.segundoPara = parametro2;
}

Fijarse que para añadir atributos, se usa this.atributo.

Con eso podemos crear instancias de esa clase así:
var instancia1 = new miObjeto(“p1″,”p2″);

Si ahora hiciesmos un alert(instancia1.primerParam); nos saldría “p1“.

Hasta ahora esto vendría a ser como un struct de C, pero si queremos convertirlo en un objeto, con métodos, se declaran así:

miObjeto.prototype.metodo = function(parametro1,parametro2)
{
this.primerParam = parametro1;
this.segundoParam = parametro2;
}

ahora podemos llamar así:
instancia1.metodo(“a1″,”a2″);
y al hacer el alert(instancia1.primerParam); nos daría “a1“.

Así de simple se usa el método prototype, para prototipar nuevas funciones a un objeto, hale, ya os he desvelado el secreto de esas webs tan chulas en javascript, ¡a trabajar!.

Categories: Programacion Tags:

Google Calendar API + PHP (II), consultar eventos de otros calendarios

July 9th, 2009 No comments

Bueno, sigo en mis trece de hacer que esto funcione, y quién sabe, hacer algo rentable de ello.

El caso es que como ya conseguí insetar los eventos en mi calendario recién creado, quería ver que los eventos que iba a meter no existían ya.

Para esto lo más cómodo es averiguar la cadena que identifica al calendario, pero ojo, porque no es ni el id del calendario ($calFeed[i]->id->text) ni la URL ($calFeed[i]->link[0]->href) sino una cadena que las contiene. Lo más rapido es quitar la URL base que no nos interesa para que nos quede el userID del calendario (que parece ser distinto para cada calendario).

$user = str_replace(Zend_Gdata_Calendar::CALENDAR_FEED_URI.'/default/', "", $calFeed[6]->id->text);

Después, hacemos una query a ESE calendario:

1
2
3
4
5
6
7
8
9
$gdataCal = new Zend_Gdata_Calendar($client);
	$query = $gdataCal->newEventQuery();
	$query->setUser($user);
	$query->setVisibility('private');
	$query->setProjection('full');
	$query->setOrderby('starttime');
	$query->setStartMin($fechaIni);
	$query->setStartMax($fechafin);
	$eventFeed = $gdataCal->getCalendarEventFeed($query);

Y luego ya, podemos reccorer sus eventos:

10
11
12
13
14
15
16
foreach ($eventFeed as $event)
	{
	 	echo "Comprobando ".$event->title->text."<br>";	    
		foreach ($event->when as $when) {
			echo $when->startTime."<br>";
		}
	}

Si no queremos hacer una búsqueda por parámetros sino sacarlos todos, es más fácil, primero sacamos el enlace al calendario:

1
$url = $calFeed[1]->link[0]->href;

Y después pedimos los eventos:

2
$events = $gdataCal->getCalendarEventFeed($url);

(Fuente: http://www.zfforums.com/zend-framework-components-13/web-web-services-22/gdata-how-get-other-calendar-than-default-one-245.html)

De verdad que no se por qué la API esta está tan mal documentada…

Google Calendar API + PHP (I)

July 5th, 2009 1 comment

Bueno, llevo un par de días pegándome con una chorrada de aplicación que se me había ocurrido hacer por entretenimiento y al final ha resultado la mar de estresante, aunque eso si, puedo decir que he aprendido algunos entresijos de las APIs de Google, en concreto de la de calendar, aunque en definitiva son todas parecedas, ya que se basan en el envío de XML a través de métodos POST previa autenticación con Google por 3 vías diferentes.

Como hay miles de tutoriales por ahí para empezar, prefiero comentar problemas que haya ido encontrando, además, como todo buen programador masoquista, paso de usar la libreria-para-tontos de PHP basada en Zend Framework que hay creada para usar, aunque al final he tenido que sucumbir, no por voluntad propia, sino por un error 411 Length Required que no hacía más que salirme por mucho que cambiase las cabeceras del POST, así que solución 1, pasarse a la librería Zend, solución 2, ver como porras lo hace la librería para copiarlo xD

Para mas inri, el error me lo estaba dando al crear un nuevo calendario enviando por POST el xml que hace falta para indicar que se desea crearlo, me pasé a la librería Zend pensando que ahí habría algún método mágico tipo createCalendar al igual que hay uno para crear eventos. Craso error amigo mío, cuando veo que ni por asomo hay una función para crear calendarios. Menos mal que rebuscando por ahí, un alma caritativa da una solución que ya se me había ocurrido y no sabía hacer, que es, nuevamente, enviar por POST el xml a pelo (pero esta vez con la libreria Zend) y voilá! funcionó :D

Para crear un calendario nuevo, se debe escribir el XML correspondiente, se puede usar una plantilla como la siguiente:
$xmlEntry = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' xmlns:gCal='http://schemas.google.com/gCal/2005'> <title type='text'>[TITLE]</title> <summary type='text'>[SUMMARY]</summary> <gCal:timezone value='Spain/Madrid'></gCal:timezone> <gCal:hidden value='false'></gCal:hidden> <gCal:color value='[COLOR]'></gCal:color> <gd:where rel='' label='' valueString='Madrid'></gd:where> </entry>";

De ahí solo hay que rellenar 3 cosas, [TITLE] que es el nombre del calendario, [SUMMARY] que es el resumen (y no es importante) y [COLOR] que define el color de la etiqueta del calendario y no puede ser cualquier color sino uno de estos:
'#A32929'
'#B1365F',
'#7A367A',
'#5229A3',
'#29527A',
'#2952A3',
'#1B887A',
'#28754E',
'#0D7813',
'#528800',
'#88880E',
'#AB8B00',
'#BE6D00',
'#B1440E',
'#865A5A',
'#705770',
'#4E5D6C',
'#5A6986',
'#4A716C',
'#6E6E41',
'#8D6F47',

(que no se cual es cual…)

Total, que una vez sustituidos los campos de la plantilla con nuestros datos del calendario, pues hay que autenticarse si no lo estamos ya, y enviar el POST así:

function crearCalendario($nombre, $resumen, $client)
{
	$gdataCal = new Zend_Gdata_Calendar($client);
	$uri = 'http://www.google.com/calendar/feeds/default/owncalendars/full';	
	$xmlEntry = str_replace('[TITLE]', $nombre, $xmlEntry);
	$xmlEntry = str_replace('[SUMMARY]',	$resumen, $xmlEntry);
	$gdataCal->post($xmlEntry, $uri);
}

También se puede guardar el xml en un archivo plantilla, por ejemplo createcal.xml y cargarlo antes de sustituir:
$xml = file_get_contents('createcal.xml');

Después de ejecutar esto vamos a Google Calendar (o listamos de nuevo los calendarios) y vemos que el calendario que le hemos dicho se ha creado correctamente.

Por cierto, para los que usan WAMP como servidor local de prueba, para usar las librerias Zend hay que ir al php.ini pero no el de la carpeta PHP sino al de Apache (C:\wamp\bin\apache\Apache2.2.11\bin\php.ini) y buscar la línea que empieza por ;include_path, quitarle el ; del principio y añadir al final la ruta del disco duro hasta la carpeta library del directorio donde hemos descargado el Zend (línea 528: include_path = “.;c:\php\includes;C:\wamp\apps\ZendGdata-1.8.4\library”)

Tooltip en css y javascript para menu desplegable que funciona en internet explorer 6

March 19th, 2009 2 comments

Antes de que sigas leyendo, no, no es posible hacer un tooltip en cada opción del desplegable en IE6 ya que ni el atributo title ni los eventos de ratón están disponibles para la etiqueta option. Para otros navegadores consulta mi post anterior.

Para hacer un tooltip funcional en IE6, se debe incluir el código siguiente:

1
2
3
4
5
6
7
8
9
10
11
<style>
#tooltip {
  position: absolute;
  display:none;
  padding:1px 2px 1px 2px;
  border: 1px solid black;
  background-color:#FFFF99;
  width:400px;
  z-index:1000;
}			
</style>

Esto crea la clase tooltip en CSS para asignar al div que almacenerá el texto del tooltip.

Ahora incluimos las funciones en javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script language="javascript" type="text/javascript">
// This function checks the mouse event
function checkEvent(e) {
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	showHideToolTip(targ, e, e.type)
}
// This function shows/hides the tooltip
function showHideToolTip (theDropDown, e, eType)
{
 var toolTipObj = new Object();
 toolTipObj = document.getElementById("tooltip");
 toolTipObj.innerHTML = theDropDown.options[theDropDown.selectedIndex].text;
 if(eType == "mouseout"){
  toolTipObj.style.display = "none";
   } else
 {
  toolTipObj.style.display = "inline";
  toolTipObj.style.top = e.y + 15;
  toolTipObj.style.left = e.x + 10;
 }
}

Esto sirve para comprobar el evento sobre el control y para mostrar u ocultar el tooltip.

Luego solo hay que añadir en el html el siguiente div

<div id="tooltip"></div>

Y añadir al select o dropdown que tengamos lo siguiente antes de cerrar el tag (>):

onMouseOver="checkEvent(this.event);" 
onMouseOut="checkEvent(this.event);" 
onMouseMove="checkEvent(this.event);"

Ver demo (solo IE7+)

Categories: Programacion Tags: , ,