| Subcribe via RSS

Extraer elementos aleatoriamente de un array en PHP

Noviembre 27th, 2008 | No Comments » | Posted in php, programacion

Os dejo aquí un pequeño código que os permitirá extraer elementos de manera aleatoria de un array. La explicación un poco más abajo.

Este ejemplo toma un array y muestra dos elementos escogidos de manera aleatoria.

<?
$elementos = array('tortilla de patata', 'bonito con tomate',
'morcilla con pimientos', 'salmón ahumado');
$claves = array_rand($elementos, 2);
foreach($claves as $clave)
{
	echo $elementos[$clave];
}
?>

Explicación:

$elementos = array('tortilla de patata', 'bonito con tomate',
'morcilla con pimientos', 'salmón ahumado');

Esto es un array, no necesita mucha explicación. Un detalle importante, estoy escribiendo esto cerca de la hora de comer, por eso todos los elementos son platos que me encantan.

$claves = array_rand($elementos, 2);

Esta función nos devuelve un array $claves que contendrá dos (porque así lo hemos indicado) elementos que serán dos índices (o claves) aleatorios del array $elementos.

foreach($claves as $clave)

Con este foreach recorreremos el array de claves aleatorias y mostramos con el echo mostramos los valores.

Un pequeño apunte: antes de la versión de PHP 4.2.0 era necesario inicializar el generador de números aleatorios:

srand((float) microtime() * 10000000);
Tags: , , ,

cURL y PHP: hacer una llamada a una página en segundo plano

Noviembre 11th, 2008 | 1 Comment | Posted in php, programacion

Hace un par de días os hablaba de cURL. Hoy vamos a ver un sencillo ejemplo con esta librería.

En este ejemplo, vamos a conectarnos desde nuestro servidor con Google y vamos a pedirle que nos busque resultados que contengan la palabra ‘curl’:

<?
if(function_exists('curl_init')) // Comprobamos si hay soporte para cURL
{
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL,
		"http://www.google.es/search?hl=es&q=curl");
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	$resultado = curl_exec ($ch);
 
	print_r($resultado);
}
else
	echo "No hay soporte para cURL";
?>

Lo primero que debemos hacer es iniciar la sesión cURL:

$ch = curl_init();

esto nos devuelve un “manejador” $ch que identifica a la sesión cURL recién creada.

Ahora vamos a indicarle cuál es la URL a la que nos queremos conectar:

curl_setopt($ch, CURLOPT_URL,
		"http://www.google.es/search?hl=es&q=curl");

En este caso vamos a realizar una búsqueda en google sobre el término ‘curl’.

Establecemos un tiempo máximo de respuesta:

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

Esta línea la veremos más abajo:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

Si en el servidor al que nos conectamos hubiese alguna redirección (código 302) y nos interesa seguirla entonces debemos decírselo a cURL:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

En este caso no es necesario, pero lo he dejado como nota didáctica.

Finalmente hacemos la llamada:

$resultado = curl_exec ($ch);

Como hemos establecido el parámetro CURLOPT_RETURNTRANSFER, curl_exec va a devolver la respuesta del servidor y la va a almacenar en la variable $resultado. Si no hubiésemos establecido ese parámetro curl_exec hubiese devuelto verdadero o falso dependiendo de si la operación se ha realizado con éxito.

Este es un ejemplo muy sencillo sin valor más allá del didáctico, pero puede tener muchas aplicaciones. Por ejemplo se puede usar en pasarelas de pago como PayPal para hacer una llamada en segundo plano al servidor.

Tags: , ,

libCurl en PHP

Noviembre 7th, 2008 | 2 Comments | Posted in php, programacion

libCurl es una biblioteca (o, como suele decirse: librería) para la transferencia de archivos que soporta varios protocolos (FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS y FILE).

Lo más habitual es que el soporte para cURL venga “de serie” en una instalación PHP. Si no es así tienes dos opciones:

1) Compilar el PHP añadiendo el soporte para cURL (necesitas tener la librería libCurl instalada antes de compilar el PHP). Aquí tienes instrucciones en inglés sobre cómo compilar PHP con soporte cURL.

2) Instalar el paquete php5-curl de tu distribución Linux (el nombre del paquete puede variar).

En algunas versiones tendrás que editar el fichero php.ini y modificar la línea:

;extension=php_curl.so

quitando el símbolo ‘;’ y dejarla así:

extension=php_curl.so

En otras basta con asegurarse que tenemos el fichero curl.so en el directorio:

/usr/lib/php5/extensions

Eso sí, una vez añadido el soporte para cURL deberemos reiniciar Apache:

/etc/init.d/apache restart

¿Cómo puedo comprobar si cURL está disponible en mi instalación Apache/PHP?

Puedes probarlo con el siguiente código:

<?php
if(function_exists('curl_init'))
   echo "Hay cURL";
?>

o puedes hacerlo con la función:

que te mostrará esta y otras valiosas informaciones sobre tu servidor.

En una próxima entrega veremos un ejemplo de trabajo con cURL.

Tags: , , ,

Introducción a la GSL (GNU Scientific Library) - Evaluar un polinomio

Octubre 23rd, 2008 | No Comments » | Posted in C/C++, programacion

Recientemente he tenido que desarrollar un pequeño programa usando la librería GSL (GNU Scientific Library). Esta es una potente librería disponible en C para realizar complejos cálculos científicos. Este artículo va a servir como introducción a dicha librería.

Lo primero que necesitamos para trabajar con esta librería en Ubuntu es el paquete libgsl0-dev. Si no me equivoco el paquete libgsl0dbl, necesario para ejecutar programas hechos con esta librería, viene “de serie” en el sistema.

Vamos a ver el funcionamiento de la librería evaluando el polinomio: 4×2+3x+2 cuando x = 2:

/* ejemplo_gsl.c */
#include <stdio.h>
#include <gsl/gsl_poly.h>
 
int main (void)
{
  double coeficientes[] = { 2, 3, 4 };
  double x = 2;
  double resultado = gsl_poly_eval (coeficientes, 3, x);
  printf ("4*x2 + 3*x + 2 = %f\n", resultado);
  return 0;
}

El polinomio se evalúa usando la función gsl_poly_eval(), que tiene como parámetros:

- coeficientes: un array que contiene los coeficientes del polinomio.
- 3: es el tamaño del array de coeficientes.
- x: contiene el valor que queremos evaluar.

Para compilar el ejemplo bastaría con hacer:

gcc -o ejemplo_gsl ejemplo_gsl.c -lgsl -lgslcblas

Este programa daría como resultado:

4*x2 + 3*x + 2 = 24.000000
Tags: , , ,

Programación en C: Compilando con gcc

Octubre 16th, 2008 | No Comments » | Posted in C/C++, programacion

Voy a iniciar una serie de artículos sobre la compilación de programas en C con gcc. Esta serie de artículos estará centrada en la compilación en Linux.

NOTA: Si usas Ubuntu y no encuentras gcc en tu sistema echa un vistazo aquí.

Para el ejemplo vamos a usar el siguiente sencillo programa:

/* primero.c - Una versión del típico hola mundo */
#include <stdio.h>
 
int main()
{
	printf("Compilado con GCC\n");
	return 0;
}

Para compilar este sencillísimo programa basta con ejecutar la orden:

gcc -o primero primero.c

donde:

-o primero: la opción -o nos permite especificar el nombre del ejecutable que se va a generar. Si no especificamos nada el nombre que se genera por defecto es a.out.

primero.c: el fichero que contiene el código fuente del programa.

Compilando con dos ficheros fuente

Ahora supongamos que tenemos dos ficheros fuente:

primero.c:

#include <stdio.h>
 
int main()
{
	printf("Compilado con GCC\n");
	segundo();
	return 0;
}

segundo.c:

#include <stdio.h>
 
int segundo()
{
	printf("Función segundo\n");
}

Si probamos la orden anterior tendremos el un resultado similar a éste:

/tmp/ccuAuHGn.o: In function `main':
primero.c:(.text+0x1e): undefined reference to `segundo'

La forma correcta de compilar en este caso sería:

gcc -o primero primero.c segundo.c

Y si lo ejecutamos:

Compilado con GCC
Función segundo

Todo muy sencillito hasta ahora. En la próxima entrega veremos cómo compilar nuestro programa con librerías adicionales.

Tags: , , ,

Optimizar código PHP (Benchmarks)

Octubre 1st, 2008 | No Comments » | Posted in php, programacion

En The PHP Benchmark podemos encontrar una comparativa que nos da una idea de qué código es mejor usar en cada ocasión.

Entre otras cosas, como es bastante lógico, podemos ver que es mejor usar:

$size = sizeof($x);
for ($i=0; $i<$size; $i++)
{...}

que:

for ($i=0; $i {...}

La razón es que en la primera opción ya está calculado el tamaño del array $x, y en la segunda forma tenemos que calcular el tamaño cada vez. Para hacernos una idea de la diferencia, la segunda forma tarda unas 350 veces más en ejecutarse en el ejemplo que proponen.

De todas formas, hay otros benchmarks que difiere en algunas conclusiones. Sin embargo, para hacerse una idea está bien. Se puede tener en cuenta sobre todo en los que se ve clara la diferencia.

Vía: Sentido Web.

Tags: , , ,

Crear una copia de nuestro proyecto sin las carpetas .SVN

Agosto 20th, 2008 | No Comments » | Posted in programacion, svn

Hace unos meses publiqué una entrada en la que explicaba cómo eliminar las carpetas .SVN de un proyecto. Algún usuario me ha pedido más información y un ejemplo sobre cómo crear una copia de un proyecto que usa Subversion pero sin las dichosas carpetas .SVN.

Tal y como comenté puede hacerse mediante el comando:

svn export repositorio directorio_detino

Para no complicarme la vida voy a poner un ejemplo práctico de un proyecto que tengo ahora. El proyecto se llama “uib” y está en mi memoria USB (que se monta como /media/KINGSTON) y está en la carpeta SVN. La copia sin las carpetas de Subversion va a estar en ‘/home/gorka/proyectos/uib_distro’. Por lo tanto el comando quedaría así:

svn export file:///media/KINGSTON/SVN/uib/trunk /home/gorka/proyectos/uib_distro

Ojo, yo uso la organización de directorios que comenté en este post sobre primeros pasos con SVN, por eso uso la carpeta ‘trunk’.

Y si el directorio destino (/home/gorka/proyectos/uib_distro) ya existiera habría que añadir al final la opción:

--force
Tags: , , ,

Kohana, la ¿evolución? de Code Igniter

Agosto 14th, 2008 | No Comments » | Posted in php, programacion

Los que me conocéis ya sabéis que soy un enamorado de Code Igniter. Sin embargo, recientemente he descubierto Kohana, que es un fork de mi amado framework.

¿Cuál es la diferencia entre Code Igniter y Kohana? Entre otras tenemos estas:

- Principalmente que está llevado por una comunidad cuya principal prioridad es Kohana, al contrario que Ellislab (empresa creadora de Code Igniter) cuya prioridad es Expression Engine, su producto estrella. La principal ventaja es que las modificaciones y mejoras se aplican más rápidamente en Kohana.

- Kohana funciona sólo con PHP5, mientras Code Igniter funciona también con PHP4. Ya sé que PHP4 ya no tiene soporte pero existen todavía muchos servidores que aún no se actualizado (y lo que tardarán todavía).

- En Kohana se puede acceder a la variable $_GET a través de un array (en Code Igniter el array $_GET no “existe”).

- Kohana está totalmente orientada a objetos (incluso los helpers son clases).

- En Kohana han sacado el directorio “Application” del directorio “System” y lo han puesto en el raíz. Esto puede parecer una tontería, pero de esta forma tienes totalmente independiente tu aplicación de los ficheros del framework.

Ya estoy empezando a usar Kohana para algunos proyectos. Claro que, únicamente lo hago en aquellos que estoy seguro que no se alojarán en servidores con PHP4 :-P.

Tags: , , , ,

PHP: Cambiar el set de caracteres en una consulta MySQL

Agosto 12th, 2008 | No Comments » | Posted in mysql, php, programacion

Existe una función, que he de reconocer no conocía, que permite cambiar el set de caracteres (charset) cuando hacemos una consulta a MySQL.

Por ejemplo, si queremos asegurarnos que los datos que vamos a introducir en la base de datos van a estar en UTF-8 usaremos:

mysql_set_charset('utf8',$link);

(donde el parámetro $link, como en casi todas las funciones para mysql, es opcional).

Esta función se ha incorporado en la versión PHP 5 (5.0.7) y por lo visto también está disponible en la versión PHP 4 (a partir de la 4.1.13). En los comentarios de la documentación de PHP han aportado este código que hace que mysql_set_charset funcione también en versiones anteriores de PHP:

<?php
 if (function_exists('mysql_set_charset') === false) {
     function mysql_set_charset($charset, $link_identifier = null)
     {
         if ($link_identifier == null) {
             return mysql_query('SET NAMES "'.$charset.'"');
         } else {
             return mysql_query('SET NAMES "'.$charset.'"', $link_identifier);
         }
     }
 }
 ?>
Tags: , , ,

Javascript: pedir al usuario confirmación de una acción

Agosto 1st, 2008 | No Comments » | Posted in javascript, php, programacion

Un código muy útil para pedir al usuario confirmación antes de ejecutar una acción, por ejemplo borrar algún elemento de una base de datos. Para esto basta con crear esta función JavaScript:

<script>
function confirmar(url)
{
	if(confirm('¿Estas seguro de visitar esta url?'))
	{
		window.location=url;
	}
	else
	{
		return false;
	}	
}
</script>

y usarla de la siguiente forma:

<a href="accion.html" onclick="return confirmar('accion.html')">[ Visitar ]</a>

Actulización 14/08/2008: Acabo de darme cuenta que a la cabecera de la función le faltaba el parámetro ‘url’. Ya está corregido.

Tags: , , ,