Archivo de la etiqueta: FAQs Help and Tutorials

Instalación de impresoras en Mac OS X – Mac OS X Tips

AppleAunque parezca mentira hay impresoras, sobre todo las láser, que no acaban de llevarse bien con Mac OS X, sobre todo si tienen que acceder a la impresora vía red. Me ha sucedido que algunos Mac en un principio se configuran bien con la impresora láser de red, pero a la hora de imprimir 1 pagina se puede convertir en mas de 100 y todas con caracteres extraños en el principio del papel.
Googleando descubrí estas paginas web, y siguiendo los pasos de la primera y cambiando el driver en el Mac por el nuevo, la impresión funciona correctamente.
Como nota dire que la impresora de red laser es una Ricoh.

http://www.linuxfoundation.org/collaborate/workgroups/openprinting/macosxpxlmono
http://gimp-print.sourceforge.net/MacOSX.php

Enhanced by Zemanta

Funciones anonimas en PHP – PHP Tips

El otro día en la entrada cargando clases php automaticamente en el ultimo ejemplo usaba una función anomima o clausura para lanzar la función spl.

La definición que nos da la documentación es:

Las funciones anónimas, también conocidas como clausuras (closures), permiten la creación de funciones que no tienen un nombre especificado.
 

Estas funciones fueron introducidas en PHP 5.3 y su uso es prácticamente igual que cuando definimos funciones en Javascript.


//Ejemplo de definición de función en Javascript

var miFuncion = function (nombre) {

document.write('Tu nombre es ' + nombre);

};

miFuncion('Ruben'); // Escribe 'Tu nombre es Ruben'


// Ejemplo de definición de función anónima en PHP

$miFuncion = function ($nombre) {

echo 'Tu nombre es '. $nombre;

}

$miFuncion('Ruben'); //Escribe 'Tu nombre es Ruben'

Se puede ver en los dos ejemplos que el uso y definición de ambas es prácticamente igual. Otro de los usos para estas funciones es como callback en funciones tengan esa opción.


echo preg_replace_callback('~-([a-z])~', function ($coincidencia) {
return strtoupper($coincidencia[1]);
}, 'hola-mundo');
// Devuelve holaMundo

Para mas información sobre las funciones anónimas http://www.php.net/manual/es/functions.anonymous.php

Enhanced by Zemanta

Cargando clases PHP automaticamente – PHP Tips

Una de las cosas que pueden resultar mas tediosas, por lo menos para mi, a la hora de programar es ir cargando las dependencias necesarias del fichero para que todo funcione. Con PHP podemos usar las funciones de auto carga para que cada vez que se llame a una clase esta se cargue.

Supongamos el siguiente escenario, tenemos todas las clases en el directorio clases y el fichero donde se define cada una de estas tiene el mismo nombre que la clase. Podríamos crear la siguiente función y con esta cuando creemos un nuevo objeto de la clase se cargara automáticamente.


function __autoload($clase) {
    include 'clases/' . $clase . '.php';
}

A partir de  PHP 5 >= 5.1.2 podemos usar la función spl_autoload_register para la carga automática de clases.


function miAutocargador($clase) {
    include 'clases/' . $clase . '.php';
}

spl_autoload_register('miAutocargador');

Y para simplificarlo un poco mas, a partir de la versión PHP 5.3 podemos lanzar una función anónima para realizar lo mismo de antes


spl_autoload_register(function ($clase) {
    include 'clases/' . $clase . '.php';
});

Para que esto funcione, tiene que cargarse esta función en el fichero en el que queramos que se ejecute la carga, lo ideal en estos casos es si se tiene un fichero de constantes o funciones auxiliares, que se utilicen en todo el proyecto incluir esta función en este.

Mas información:

http://www.php.net/manual/es/function.spl-autoload-register.php

Enhanced by Zemanta

Uso de Foreach y For (Parte III Diferencias) – PHP Tips

Esta es la ultima entrada de la trilogía del uso de Foreach y For, en ella vamos a ver las principales diferencias y ventajas de uno sobre otro.

El foreach no es un bucle

De primeras la principal diferencia la tenemos en la propia definición, ya que el foreach no es un bucle sino un constructor, el cual solo puede iterar en arrays y objetos, en cambio el for es un bucle, es decir, se repite tantas veces como nosotros queramos.

El foreach no puede recorrer cadenas de texto.

En uno de los ejemplos de uso de for, veíamos como podíamos recorrer carácter a carácter una cadena de texto, en cambio con el foreach no podemos hacerlo

En el foreach no es necesario poner el tamaño del array.

En el uso del for, a la hora de recorrer un array, tenemos que especificar hasta que posición tenemos que recorrerla, en cambio en foreach nos lo recorre del principio a fin. Esto supone una ventaja sobre el for, ya que en este si no especificamos bien el tamaño podemos obtener un error.

Cosas que apriori no se pueden hacer con el foreach

Modificar los valores de un array/objeto

Como vimos en la entrada del foreach, apriori no se pueden modificar los elementos de un array usando el foreach, y en realidad si que se puede hacer pasando el valor por referencia.

Recorrer un array al revés

Si vemos el funcionamiento del foreach, este realiza una copia del array, sitúa el puntero en el primer elemento y lo recorre hasta el final, según esto no seria posible recorrer un array de forma inversa, algo que con el bucle for, podríamos hacerlo de una manera sencilla, pero podemos hacerlo también con el foreach usando la función array_reverse dentro de la definición del foreach


$array = array(1, 2, 3, 4);
foreach (array_reverse($cadena) as $var) {
echo $var.PHP_EOL;
}

En este ejemplo se nos mostraría los valores de la $array empezando desde el final, y si mostramos $array una vez finalizado, podremos ver que los valores no han modificado su orden, ya que el array_reverse se aplica solo a la copia de $array.

 

Conclusiones

Tengo que decir que en mi día a día uso mas veces el foreach que el for, el for solo lo utilizo cuando tengo que mostrar un numero determinado de mensajes, y en el caso de recorrer arrays suelo usar siempre el foreach, lo veo mas seguro, y me permite recorrer de una manera sencilla arrays con clave de texto.

Con estas entradas he intentado cubrir las características tanto del bucle for como del constructor foreach, seguramente me habré dejado algún ejemplo o alguna característica. Agradeceré vuestros comentarios, sugerencias y preguntas.

 

 

 

Enhanced by Zemanta

Uso de Foreach y For (Parte II el Bucle Foreach) – PHP Tips

PHP Programming languageEn la primera entrada del Uso de Foreach y For hablaba sobre el uso del bucle for

Veamos primero la definición del constructor foreach en la documentación de PHP:

Constructor Foreach

El constructor foreach proporciona un modo sencillo de iterar sobre arrays. foreach funciona sólo sobre arrays y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:

foreach (expresión_array as $valor)
    sentencias
foreach (expresión_array as $clave => $valor)
    sentencias

La primera forma recorre el array dado por expresión_array. En cada iteración, el valor del elemento actual se asigna a $valor y el puntero interno del array avanza una posición (así en la próxima iteración se estará observando el siguiente elemento).

La segunda forma además asigna la clave del elemento actual a la variable $clave en cada iteración.

Recorrer Arrays

Tal como dice la definición foreach nos sirve para recorrer arrays de una manera sencilla, bastante mas sencilla que con el bucle for, ya que no necesitamos conocer la longitud del array para recorrerla y el array puede tener claves tanto numéricas como no numéricas.


$array = array('Uno'=>'Hola', 'Dos'=>'Mundo, 'Tres' => 'Hello');

// Mostramos todas los valores del array

foreach ($array as $var) {

echo $var.PHP_EOL;

}

// Mostramos todas las claves y los valores del array

foreach ($array as $key => $var) {

echo $key .  " " . $var . PHP_EOL;

}

Recorrer objetos

Otra de las características que tiene foreach es la posibilidad de iterar sobre objetos, es decir, podriamos mostrar por pantalla todas las propiedades de un objeto.


$coche = new stdClass();
$coche->color = 'rojo';
$coche->ruedas = '4';
$coche->puertas = '3';
$coche->combustible = 'gasolina';

foreach ($coche as $key => $var) {
echo $key. " " . $var .PHP_EOL;
}

¿Podemos modificar los valores del array/objeto usando el foreach?

La respuesta es si, aunque con matices. Cuando recorremos un array o un objeto con foreach no recorremos el objeto en si sino una copia de ese objeto la cual se destruye una vez finalizada la iteración. Para poder modificar los valores tenemos que pasar el valor por referencia


foreach ($coche as $key => &$var) {
$var = $var." modificado";
}

Aqui el bucle foreach nos recorrería el array/objeto $coche y modificaría sus valores añadiendo “modificado” al final de cada uno de ellos.

Referenciar $var sólo es posible si el array iterado puede ser referenciado (es decir, si es una variable). El siguiente código no funcionará:


foreach ( array(1, 2, 3) as &var) {

$var = $var * 2;

}

Es decir, el array/objeto tiene que estar definido fuera del foreach para que pueda ser referenciado.

Utilizar arrays anidados con list PHP >= 5.5.0

Una de las novedades de la versión 5.5.0 de PHP es la posibilidad de recorrer un array de arrays y utilizar el array interior en las variables del bucle proporcionando list() como el valor.

// Este codigo solo funciona con PHP >= 5.5.0
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a, $b)) {
// $a contiene el primer elemento del array interior,
// y $b contiene el segundo elemento.
echo "A: $a; B: $b\n";
}
/* Mostrara
A: 1; B: 2
A: 3; B: 4
*/

http://es1.php.net/manual/es/control-structures.foreach.php

Enhanced by Zemanta

Ficheros .user.ini – PHP Tips

Una de las novedades que trajo la versión 5.3 de PHP fue la de soportar ficheros INI, al estilo .htaccess a nivel de directorios, siempre y cuando lo tengamos configurado el SERVER API como CGI/FastCGI.

Esto quiere decir que, al igual que podemos especificar con .htaccess propiedades en cada directorio, podemos hacerlo con PHP a nivel de directorio o a nivel de raíz del sitio. Por ejemplo, si tenemos nuestra web en un hosting externo lo mas normal es que no podamos cambiar propiedades en el php.ini, pues bien, lo que si podemos hacer es crear nuestro fichero .user.ini y especificar esas propiedades en ese fichero, pero no todas, solo se reconocerán las configuraciones que tengan los modos PHP_INI_PERDIR y PHP_INI_USER.

Mas Información http://www.php.net/manual/es/configuration.file.per-user.php

Enhanced by Zemanta

Formato Fecha en MySQL – MySQL Tips

Una de las “pegas” que tiene MySQL es que por defecto gestiona las fechas en modo ’00-00-0000′ es decir año-mes-dia. Y siempre nos toca crear una función para transformar estas fechas tanto al pasarlas a la base de datos, como para recuperarlas. A la hora de la recuperación algo que nos puede ahorrar trabajo es, a la hora de realizar la consulta, devolver la fecha formateada, para ello utilizaremos DATE_FORMAT.

Nuestra consulta podría quedar de la siguiente manera


SELECT id, name, DATE_FORMAT(date, '%d-%m-%Y) as date

Como primer parámetro de DATE_FORMAT especificamos el campo que contiene la fecha, y luego como segundo parámetro especificamos el formato en el cual queremos que nos devuelva la fecha en este caso sera ’00-00-0000′

 

Mas información en http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format

Enhanced by Zemanta

Conexion a MySQL con Python 101

English: Python logo Deutsch: Python LogoMySQL

Dejo aquí lo que seria los parámetros básicos para conectarnos a una base de datos MySQL con Python y que nos devuelva los resultados de una consulta

import MySQLdb as dbapi
bbdd = dbapi.Connect(host='localhost',user='myuser',passwd='mypass',db='mydb')
cursor = bbdd.cursor()
sql = "SELECT * FROM table WHERE field like %s"
params = 'myparam'
cursor.execute(sql, params)
for datos in cursor.fetchall():
    print datos

Por defecto el paramstyle en la conexión con MySQL es “format”
en el cual los especificadores se poner de la misma manera que lo haríamos con el printf en C

Si quisieramos establecer otro tipo de especificador lo hariamos de la siguiente manera

bbdd.paramstyle = "qmark" # los especificadores con ? "select * from table where valor=?"
bbdd.paramstyle = "numeric" # numero indicando la posicion "select * from table where :1"
bbdd.paramstyle = "named" #el nombre del valor :nombre "select * from table where :nombre"

Formato moneda con PHP – PHP Tips

The PHP logo displaying the Handel Gothic font.
Image via Wikipedia

Con la función money_format  money_format( $formato, $numero ),  podemos convertir un numero en el formato de moneda sin necesidad de estar agregando el símbolo, establecer el numero de decimales que tendrá el numero, el separador de miles y el separador de decimales. En formato lo mas sencillo es poner “%i” o “%n” siendo la primera el formato internacional para la configuración regional y la segunda el formato nacional para la configuración regional.

Estas opciones las coges de las locales que tengamos definidas en el sistema, y aquí viene lo divertido de la historia.

Primero establecemos el formato monetario con setlocale.

$numero = 12345.67;
setlocale(LC_MONETARY, 'es_ES');
echo money_format('%i', $numero) ."\n"; // devuelve 12.345,6,7 EUR
echo money_format('%n', $numero) ."\n"; //devuelve 12.345,67 €

Es posible que probéis estos ejemplos y no funcionen, uno de los motivos es si estais usando ubuntu o cualquier distro basada en Debian, en estas distros hay que poner en vez de es_ES , es_ES.UTF-8, o puede que estéis probando esta función en windows y no funcione a lo cual me remito a lo que dice la documentacion de PHP:

“La función money_format() sólo está definida si el sistema tiene capacidad strfmon. Por ejemplo, Windows no lo hace, así que money_format() no está definido en Windows.”

Por lo tanto si tenemos la aplicación corriendo en un windows no podremos utilizar esta función tan util.

+ Info: http://es.php.net/manual/es/function.money-format.php

Error 404 personalizado – Apache Tips, PHP Tips

Deutsch: Bildschirmfoto eines 404-Fehlers bei ...
Image via Wikipedia

Una de las maneras de obtener información del servidor donde tenemos alojada nuestra web es solicitando una pagina que no exista y así nos devuelva la pagina
que tiene el servidor por defecto de pagina no encontrada en la cual suele venir el modelo versión y demás detalles. Una solución rápida para esto es crear
nuestra pagina de error 404. Para ello tendremos que editar el fichero .htaccess en la raíz de nuestra pagina web y poner lo siguiente:
Nota: Consideramos que el servidor web es apache

ErrorDocument 404 /404.php

Con esto le estamos diciendo que cuando se produzca un error 404 nos muestre la pagina 404.php
Dicha pagina la podemos poner como queramos y el mensaje que queramos.
Otra opción que tenemos, por si no queremos hacer una pagina de error es pasarle directamente el mensaje a la configuración

ErrorDocument 404 "Lo sentimos la pagina web solicitada no existe"

Lo mismo que con el 404 ( pagina no encontrada ) lo podemos hacer con otros codigos como el 403 y demás.

Ahora bien, hay un caso, que tenemos que tener cuidado, pongamos que hacemos la típica aplicación en la cual tenemos que estar registrados para acceder a las secciones y queremos evitar
que nos accedan directamente a las paginas. La programación de la cabecera de los ficheros podría ser

if ( session_id != null ) {
    session_regenerate_id();
} else {
    session_start();
}
if (!$_SESSION['auth']) { 
// Redirección a la pagina
    header("Location:404.php"); // Redirigimos a la pagina de error o a la que queramos
    exit(0);
}

Imaginemos que queremos crear una función para no tener que escribir todo esto en cada cabecera, y lanzamos esa función en cada pagina, y pensamos que tenemos que cambiar la ruta del
header para cada sección. A la vez pensamos que hemos hecho la redirección 404 en el .htaccess como a continuacion:

header("HTTP/1.0 404 Not Found"); // Esta manera
header("Status: 404 Not Found"); // O esta manera

Y decimos mira mando un header de 404, este me lo interpreta el .htaccess y me manda a la pagina
seleccionada… ERROR eso no funciona, y para colmo decir que no necesitaríamos hacer nada mas ya que esta funcionaria dentro de las carpetas, siempre y cuando no existiera la pagina 404.php, y si no ahí va un truco, que el header apunte a notfound.html, esta va a ser una pagina que no crearemos en ningún sitio, el header la llamara, como no existe hará que el .htaccess lance la pagina 404.php que tenemos en la raíz

+ Info