Sigueme en Twitter

Archivo de artículos en la categoría "Programación"

Ir al inicio

Python SDK 1.2.3 en Google App Engine

20/06/2009

Buenas noticias para los seguidores de Django, hace un par de días sale un nuevo SDK de Google App Engine con soporte para Django 1.0

Otra nueva funcionalidad muy interesante es el poder asignar tareas a una cola y que estas se ejecuten en segundo plano cuando el sistema tenga los recursos necesarios.

1 Comentario

¿Cómo debe de ser el Internet para móviles?

11/06/2009

Me pregunto si ¿nos debemos preparar nuestros contenidos para los móviles o los móviles se deben de preparar para nuestros contenidos?

Es decir, aún se siguen recomendando formatos como WAP y WAP2. Y una de las cosas buenas que ha traído el teléfono de Apple es que ha dejado a estos formatos obsoletos. Con los smartphones las limitaciones de software y memoria que los justificaban ya están olvidadas, ahora la navegación va tan lejos como la pantalla del teléfono lo permita.

O casi

En mi mundo ideal los móviles deberían de adaptarse a mostrar los contenidos lo más fielmente posible, y si no tienen la pantalla adecuada, entonces proveer aplicaciones para obtener esos contenidos por otros medios, como puede ser RSS. Y esta es tarea de sus sistemas operativos, iPhone OS y Android casi lo hacen. Es el turno de Windows Mobile, Palm OS y Symbian OS para que se pongan al parejo.

A menos que sea punto clave para tu negocio, yo no me preocuparía en ofrecer una versión web para móviles con navegadores inferiores al iPhone.

4 Comentarios

PHP 5.3 incluye soporte para “goto”

10/06/2009

Y yo me pregunto: ¿Para que diablos?

No es que me cierre a que las instrucciones goto sean malignas por si solas como aprendes en la escuela. Seguro que han de tener su buena utilidad. Solo que esta la veo en lenguajes estructurados o que no tienen soporte para excepciones, y PHP no cae en ninguno de esos casos.

También podría aplicar la técnica “sino te gusta, no lo uses”. Pero el problema no es así de sencillo, ya me veo en el futuro debuggeando las pastas ininteligibles de HTML+Javascript+PHP que existen, pero ahora “mejoradas” con goto. The horror!

Vía: Reddit

9 Comentarios

¡Mira mamá! ¡un API!

8/06/2009

Este post es un desvergonzado autobombo para anunciar que en Minube ya tenemos un API :D

Esta en una versión temprana de pruebas, así que no nos peguen si algún dato sale mal parseado y muere un gatito en el proceso. Pero estamos ansiosos porque otros desarrolladores lo prueben y entonces podamos expandirlo de acuerdo a sus necesidades.

Enlace: API de Minube

2 Comentarios

Herramientas y tutoriales sobre expresiones regulares

7/06/2009

Hace unos días publicaron en Smashing Magazine (ok ok se que todos la siguen, pero me es imposible no publicar esto) una guía imprescindible sobre expresiones regulares. “Herramientas y tutoriales” es parte del encabezado y es precisamente lo que encontrarás. Montones de ellas.

Tu sabes lo que dicen: Los hombres de verdad no se asustan con expresiones regulares.

Tal parece que todo "perlista" es bueno para hacer expresiones regulares. Será su pedigree.

Bueno no lo dicen. Pero sería bonito si lo hicieran.

Sin Comentarios

Las sesiones de Google I/O 2009

5/06/2009

Si eres uno de esos desafortunados desarrolladores -como yo- que no asistieron a las conferencias Google I/O 09, te puedes sentir menos mal sabiendo que los organizadores tienen planeado subir todas las charlas online.

Todavía no están todas disponibles, pero muchas de ellas ya las puedes ver ya desde aqui.

Sin Comentarios

La cita del día #28

30/05/2009

long long ago; /* in a galaxy far far away */

1 Comentario

Unit Tests en PHP con SimpleTest

29/05/2009

Hacer pruebas automatizadas de tu código siempre es una buena costumbre, en especial cuando te llega el tiempo de tener que refactorizar.

Para este ejemplo vamos a hacer una clase que calcula las áreas de triángulos, rectángulos y cuadrados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Area
{
	function triangle($base, $height) {
		return ($base * $height) / 2;
	}
 
	function rectangle($breadth, $height) {
		return $breadth * $height;
	}
 
	function square($side) {
		return $side * $side;
	}
}

Y vamos a utilizar la herramienta SimpleTest para probar que nuestras funciones están trabajando bien. Para empezar a usarlo solo tienes que bajarlo y colocar la carpeta simpletest dentro de tu proyecto o algún directorio global de PHP.

Una vez instalado podemos comenzar a escribir nuestros casos de prueba.

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
require_once 'simpletest/autorun.php';
require_once 'area.php';
 
class AreaTestCase extends UnitTestCase
{
	var $area;
 
	function setUp() {
		$this->area = new Area();
	}
 
	function testTriangle()
	{
		$result = $this->area->triangle(6, 10);
		$this->assertEqual(30, $result);
	}
 
	function testRectangle()
	{
		$result = $this->area->rectangle(2, 5);
		$this->assertEqual(10, $result);
	}
 
	function testSquare()
	{
		$result = $this->area->square(4);
		$this->assertTrue(is_numeric($result));
	}
}

El incluir autorun.php nos da la habilidad de poder extender la clase UnitTestCase, permitiéndonos ejecutar las aserciones. Además el autorun.php se encarga de correr las pruebas sin necesidad de que tu tengas que instanciar nada y también es suficientemente inteligente para darte si cuenta si estas en la consola o directamente en el navegador.

La funcion setUp se ejecuta automáticamente antes de correr cualquier prueba. Aquí como todas nuestras pruebas hacen uso de la clase Area, entonces aprovechamos para hacer la instancia una sola vez.

Finalmente SimpleTest corre todas las pruebas que note comienzan con el nombre test y nosotros tenemos 3 de ellas:

  • testTriangle: Prueba que el resultado de la operación sea igual a 30.
  • testRectangle: Prueba que el resultado de la operación sea igual a 10.
  • testSquare: Prueba que el resultado de la operación sea un número.

Cualquier otro resultado nos arrojaría errores. Estas pruebas ejecutadas en el navegador se verían así, pero también puedes ejecutarlas en consola sin ningún problema.

Oh si, la confirmación del código perfecto

SimpleTest tiene muchas opciones más como el agrupar casos de prueba, escribir tus propias aserciones, mockups (simulaciones de escenarios) y pruebas web (aunque limitado). Así que no te dejes de llevar por el nombre no es simple, solo es fácil de usar.

Sin Comentarios

Herramientas básicas: Stack Overflow y Server Fault

28/05/2009

Desde hace mucho tiempo que Stack Overflow se convirtió en dieta básica cuando estoy programando. Puedo decir que ahora lo veo casi tan indispensable como Google.

Es un sitio donde puedes hacer una pregunta a un montón de programadores elitistas. Estupendamente bueno para enterarte sobre mejores prácticas, metodologías y en general cualquier forma de hacer mejor las cosas. Tiene apenas un año de ser público pero ya esta tan lleno de contenido, que a menos que sea un tema muy específico, raramente tendrás que hacer una pregunta nueva.

I-n-d-i-s-p-e-n-s-a-b-l-e

Y tiene un sitio hermano que se dedica a la administración de servidores (esa tarea maldita, tan ligada a los programadores). Server Fault (¿no son geniales sus nombres?). Este es muy nuevo y apenas lleva unos días abierto al público, pero con tan buenas referencias y prácticamente la misma comunidad lo voy a tener siempre en cuenta.

Google te sirve para saber como se hacer las cosas. Stackoverflow para saber como hacerlas mejor.

1 Comentario

Sustitución de cadenas vs concatenación en Python

21/05/2009

Tenía la idea de que la sustitución de valores era más rápida que simplemente concatenar cadenas. Pero en Python tal parece que es al revés.

Probando con un caso -muy muy muy- extremo, de 1 millón de iteraciones tenemos resultados interesantes.

1
2
3
4
5
6
STRING1 = 'Esta es la '
STRING2 = 'iteracion numero: '
FINAL = ''
 
for i in xrange(0, 1000000):
	FINAL += STRING1 + STRING2 + str(i) + '\n'

Concatenando de esta manera el resultado de time es:

real	0m1.479s
user	0m1.396s
sys	0m0.081s

Y al cambiar casi todas las concatenaciones por sustituciones de esta manera:

5
6
for i in xrange(0, 1000000):
	FINAL += '%s%s %d\n' % (STRING1, STRING2, i)

Obtenemos estos tiempos:

real	0m1.830s
user	0m1.746s
sys	0m0.081s

Aquí la diferencia no es realmente significativa si tomamos en cuenta el enorme tamaño del bucle. Así que yo sigo prefiriendo no sacrificar la legibilidad del código y seguir utilizando sustituciones en lugar de concatenaciones.

Pero ojo, esto no es una sustitución completa. Si eliminamos la única concatenación que dejamos en el segundo código:

5
6
for i in xrange(0, 10000):
	FINAL = '%s %s%s %d\n' % (FINAL, STRING1, STRING2, i)

Con “apenas” 10,000 iteraciones, vamos a tener tiempos arriba de 2 segundos. Ya imaginarás como sube exponencialmente si aumentamos el rango. No se cual sea la razón, pero parece que no es buena idea sustituir miles de cadenas enormes.

real	0m2.043s
user	0m0.899s
sys	0m1.139s

Esta claro, si para ti es crítico el rendimiento; concatena, sino no hay problema con que utilices sustituciones.

5 Comentarios