| Subcribe via RSS

Publicados ya cuatro capítulos del Curso de PHP

Octubre 29th, 2009 | No Comments » | Posted in mis-proyectos, php, programacion

Ya están publicados los primeros cuatro capítulos del curso de PHP en el Rincón del PHP.

Si tenéis dudas sobre PHP pasaos por el foro, que está nuevecito y responderé a cualquier consulta gustosamente (relacionada con PHP, claro).

Tags:

Procesos en C: Crear un nuevo proceso con fork()

Octubre 26th, 2009 | No Comments » | Posted in C/C++, programacion

Siguiendo con los artículos sobre procesos voy a poner aquí un sencillo ejemplo para ilustrar el funcionamiento de la función fork().

Esta función es la que se encarga de crear un nuevo proceso dentro de un proceso. El nuevo proceso creado es una copia exacta del original, con la única diferencia que cada uno de ellos tiene su propio identificador de proceso (pid).

#include <stdio.h>
 
int main() {
	int pid;
 
	printf("PADRE: Soy el proceso padre y mi pid es: %d\n", getpid());
 
	pid = fork();
 
	// En cuanto llamamos a fork se crea un nuevo proceso. En el proceso
	// padre 'pid' contendrá el pid del proceso hijo. En el proceso hijo
	// 'pid' valdrá 0. Eso es lo que usamos para distinguir si el código
	// que se está ejecutando pertenece al padre o al hijo.
 
	if (pid) // Este es el proceso padre
	{
		printf("PADRE: Soy el proceso padre y mi pid sigue siendo: %d\n", getpid());
		printf("PADRE: Mi hijo tiene el pid: %d\n", pid);
	}
	else // Proceso hijo
	{
		printf("HIJO: Soy el proceso hijo y mi pid es: %d\n", getpid());
		printf("HIJO: mi padre tiene el pid: %d\n", getppid());
	}
}

En un próximo post explicaré cómo convertir el proceso hijo en un nuevo proceso totalmente diferente (con el conjunto de funciones ‘exec’). Esto nos permitirá lanzar un programa desde dentro de otro.


¿Necesitas ayuda con algún trabajo de clase? Entra en BuscoProfe.com

Tags: , , ,

El Rincón del PHP – Web dedicada a la programación en PHP

Octubre 25th, 2009 | 1 Comment | Posted in mis-proyectos, php, programacion

Siguiendo con nuestros contínuos lanzamientos :-) hace un par de días pusimos en marcha la nueva web del Rincón del PHP.

La idea de la web es ser un punto en el que poder encontrar información sobre PHP, cursos y un foro donde podamos conocernos, compartir ideas y exponer dudas.

Entra en el Rincón del PHP, los foros están nuevecitos ¿te animas a estrenarlos?

Tags: ,

Procesos en C: Ejemplo de un sencillo cronómetro con SIGALRM

Octubre 19th, 2009 | No Comments » | Posted in C/C++, programacion

Continuando con el artículo de la semana pasada sobre procesos en C hoy os dejo aquí un sencillo ejemplo de un cronómetro:

// Para las funciones pause y alarm:
#include <unistd.h>
// Para las constantes SIGALRM y similares
#include <signal.h>
 
#include <stdio.h>
 
// Esta es la función que se va a ejecutar cada vez que se reciba la
// señal SIGALRM
void contar_segundos() {
	// Usamos static para que se conserve el valor de "segundos"
	// entre cada llamada a la función
	static int segundos=0;
 
	segundos++;
	printf("Han pasado %d segundos.\n", segundos);
}
 
int main() {
	// Asociamos la señal SIGALRM a la función contar_segundos
	signal(SIGALRM, contar_segundos);
 
	// Ponemos en marcha un bucle
	while(1) {
		// Establecemos una alarma para dentro de un segundo
		alarm(1);
		// Pausamos la ejecución del programa para que 
		// se quede esperando a recibir una señal.
		pause();
	}
}

¿Necesitas ayuda con algún trabajo de clase? Entra en BuscoProfe.com

Tags: , , ,

Procesos en C: Señales (SIGINT)

Octubre 13th, 2009 | 1 Comment | Posted in C/C++, programacion

Desde hace un tiempo tengo la idea de escribir sobre el tema de procesos y señales en C.

Las señales se usan para la comunicación entre procesos y manipularlos. Un ejemplo muy conocido de señal es la señal SIGINT, que se envía cuando el usuario pulsa CTRL+C durante la ejecución de un programa. Cuando el programa que estamos ejecutando recibe esta señal finalizará su ejecución.

En el siguiente ejemplo vamos a ver cómo podemos hacer para que el programa realice alguna acción especial cuando el usuario pulse CTRL+C. La acción a ejecutar va a ser mostrar el mensaje: “¿Por qué me interrumpes?”:

// Para las funciones pause y alarm:
#include <unistd.h>
// Para las constantes SIGALRM y similares
#include <signal.h>
 
#include <stdio.h>
 
// Esta función es la que vamos a usar como controlador de la señal SIGINT
void despedida() {
	printf("------------------------\n");
	printf("¿Por qué me interrumpes?\n");
	printf("------------------------\n");
	raise(SIGTERM);
}
 
int main() {
 
	// Asociamos la señal SIGINT con la funcion "senal"
	signal(SIGINT, despedida);
 
	// Comenzamos un bucle que hará que el programa muestre sin
	// parar el mensaje "Nada nuevo por aquí"
	while(1) {
		printf("Nada nuevo por aquí.\n");
	}
}

En este programa, cuando el usuario pulse CTRL+C, en lugar de cerrarse directamente, se ejecutará la función que hemos asociado con esta señal (la funcion despedida).

La función despedida muestra el mensaje “¿Por qué me interrumpes?” y genera la señal SIGTERM (”raise” envía una señal al propio proceso). Si no hiciéramos esto el proceso no se detendría nunca (hasta que lo “matemos” con kill). Si te aburres haz la prueba con esta funcion:

void despedida() {
	printf("------------------------\n");
	printf("¿Por qué me interrumpes?\n");
	printf("------------------------\n");
}

Otra posibilidad es usar la función signal de nuevo para indicar al proceso que use la acción por defecto de SIGINT (SIG_DFL – Signal Default):

void despedida() {
	printf("------------------------\n");
	printf("¿Por qué me interrumpes?\n");
	printf("------------------------\n");
	signal(SIGINT, SIG_DFL); // Indicamos al programa que use la acción por defecto
	raise(SIGINT);
}

¿Pero por qué no podemos simplemente llamar a raise(SIGINT);?

Se podría pensar que bastaría con llamar a raise(SIGINT):

void despedida() {
	printf("------------------------\n");
	printf("¿Por qué me interrumpes?\n");
	printf("------------------------\n");
	raise(SIGINT);
}

El problema es que la señal SIGINT va a ser procesada por la función “despedida”. De esta forma, cuando pulsemos CTRL+C, se llamará a la función despedida. La función despedida genera de nuevo la señal SIGINT, que va a ser procesada de nuevo por ella misma. El resultado es que cuando pulsamos CTRL+c el proceso comenzará a ejecutar una y otra vez la función despedida mostrando el mensaje “¿Por qué me interrumpes?” sin parar.

¿Por qué? Cada vez que se pulse CTRL+C se ejecuta la función “despedida” en lugar de ejecutarse la acción por defecto (cerrar el programa).


¿Necesitas ayuda con algún trabajo de clase? Entra en BuscoProfe.com

Tags: , , ,

Introducción a Bash: control de flujo en nuestro script (if/else)

Mayo 25th, 2009 | No Comments » | Posted in Bash, linux, programacion

Hoy vamos a añdadir un poco más de salsa a nuestra introdicción a Bash. Vamos a ver cómo funciona el if/else.

La estructura de un if/else en bash es la siguiente:

if [ condicion ]; then
      ...
else
      ...
fi

(el “else” es opcional).

Ojo, los corchetes deben ir siempre separados de la condición por un espacio.

Comparaciones aritméticas:

Aquí tenéis una lista de comparaciones que se pueden hacer entre números.

  • -lt : menor que (less than)
  • -gt : mayor que (greater than)
  • -le : menor o igual (less or equal)
  • -ge : mayor o igual (greater or equal)
  • -eq : igual a (equal)
  • -ne : distinto de (not equal)

Compraraciones con cadenas

  • = : igual
  • != : distinto
  • < : menor que
  • > : mayor que
  • -n c1 : se cumple si la cadena c1 no está vacía
  • -z s1 : se cumple si la cadena c1 está vacía

If anidados

Desde luego, se pueden usar if/else dentro de otros if/else, se pueden anidar sin problemas.

Ejemplo

Y para ilustrar todo esto vamos a ver un sencillo ejemplo que espera que le pasemos una palabra como parámetro:

#!/bin/bash
 
if [ $# -eq 0 ]; then
	echo "Dime algo, por favor"
else
	if [ $1 = 'hola' ]; then
		echo "Hola! que tal?"
	else
		echo "No te entiendo, solo entiendo la palabra 'hola'"
	fi
fi

Si lo guardamos en un fichero llamado if.sh y le damos permisos de ejecución (chmod +x if.sh) esto es lo que responderá dependiendo de qué parámetros usemos:

$ ./if.sh
Dime algo, por favor
$ ./if.sh nada
No te entiendo, solo entiendo la palabra 'hola'
$ ./if.sh hola
Hola! que tal?
Tags: , ,

Wordpress: listar subpáginas dentro de una página

Mayo 18th, 2009 | 1 Comment | Posted in programacion, wordpress

Si quieres que cuando se visualice una página se muestren también sus páginas “hijas” puedes usar el siguiente código en tu plantilla:

<?php
  if($post->post_parent)
  $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
  else
  $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
  if ($children) { ?>
  <ul>
  <?php echo $children; ?>
  </ul>
  <?php } ?>

Sacado del codex de WordPress.

Tags:

Code Igniter: llamar a un controlador desde consola o desde otro fichero.php

Abril 30th, 2009 | No Comments » | Posted in code igniter, php, programacion

Si has trabajado con Code Igniter encontrarás este “truquillo” de mucha utilidad. Te permitirá llamar a un controlador desde consola o desde otro fichero PHP. Por ejemplo:

1) Supón que tienes una tarea (en un cron) que tiene que llamar a un controlador de tu aplicación Code Igniter. Supongamos que tienes un controlador que se llama ’saludar’ y quieres llamar a la función ‘decir_hola’ de ese controlador. No puedes hacer la llamada así:

php /var/www/saludar/decir_hola

ni:

php /var/www/index.php/saludar/decir_hola

(pruébalo)

2) También es posible que necesites recibir parámetros $_GET pero, por ejemplo, no sabes en el orden en el que te los van a enviar.

En ambos casos puedes crear un fichero llamado, por ejemplo, redirigir.php con el contenido siguiente:

<?php
// Recoger parámetros o cualquier otra tarea previa que necesites antes de llamar al controlador
...
// Fin de tareas previas
 
$_SERVER['PATH_INFO']    = 'saludar/decir_hola';
 
require('index.php');
?>

o incluso, podemos pasarle parámetros desde la consola:

<?php
$_SERVER['PATH_INFO']    = $argv[1];
require('index.php');
?>

(Si usas el fichero .htaccess no olvides añadir este fichero redirigir.php para que se pueda ejecutar).

Tags: , ,

Curso de PHP: Ejercicios de cadenas y funciones

Abril 29th, 2009 | No Comments » | Posted in php, programacion

Dado que llevo bastante tiempo impartiendo cursos de PHP en Bilbao ya va siendo hora de poner un poco de orden y actualizar los ejercicios.

Según los vaya poniendo “bonitos” los iré publicando aquí.

En esta primera tanda pondré algunos ejercicios de cadenas y funciones que servirán de repaso a mis alumnos. A ver si se animan algunos a hacerlos, que haciendo el esfuerzo de resolverlos es como se aprende, no mirando cómo los resuelve otro (este es un pequeño tirón de orejas para un par de personas :-D ).

<?php
/*
 * Para los siguientes ejercicios se deben/pueden usar las siguientes funciones:
 * 
 * - substr($cadena, $comienzo, $longitud);
 * 		Extrae una subcadena de una cadena:
 * 		$cadena - es la cadena de la que queremos sacar una subcadena
 * 		$comienzo - es la posición a partir de la que empezamos a extraer. El primer carácter
 * 		está en la posición 0.
 * 		$longitud - con este parámetro indicamos la longitud de la cadena. Es opcional, si
 * 		no lo ponemos nos cogerá todo desde el comienzo que hemos especificado hasta el final.
 * 
 * - strlen($cadena);
 * 		Cuenta el número de caracteres que tiene la cadena.
 * 
 * - strtoupper($cadena);
 * 		Convierte una cadena en mayúsculas.
 */
 
/*
 * Ejercicio 1:
 * 
 * Escribir una función que convierta la primera letra de una cadena en mayúsculas.
 * 
 */
 
echo '<h1>Ejercicio 1</h1>';
 
function corregir_primera_letra($cadena)
{
 
}
 
echo corregir_primera_letra('gorka'); // --> debe mostrar: Gorka
echo "<br/>";
echo corregir_primera_letra('GORKA'); // --> debe mostrar: GORKA
echo "<br/>";
echo corregir_primera_letra('Gorka'); // --> debe mostrar: Gorka
echo "<br/>";
 
/*
 * Ejercicio 2:
 * 
 * ¿Daría algún error si usamos una cadena de una sola letra? ¿Sabrías por qué?
 * 
 */
 
echo '<h1>Ejercicio 2</h1>';
echo corregir_primera_letra('G');
echo "<br/>";
 
/*
 * Ejercicio 3:
 * 
 * ¿Funcionaría bien la siguiente función? Por el nombre es evidente que no pero
 * ¿por qué? 
 */
 
function corregir_primera_letra_version_mala($cadena)
{
	$letra = substr($cadena, 0, 1);
	$letra = strtoupper($letra);
	$resto = substr($cadena, 1);
	$cadena_corregida = $letra . $cadena;
	return $cadena_corregida;	
}
 
/*
 * Ejercicio 4:
 * 
 * Crear una función que coja una cadena, ponga la primera en mayúsculas y
 * el resto en minúsculas.
 */
 
function corregir_mayusculas($cadena)
{
 
}
 
echo '<h1>Ejercicio 4</h1>';
echo corregir_primera_letra('gorka'); // --> debe mostrar: Gorka
echo "<br/>";
echo corregir_primera_letra('GORKA'); // --> debe mostrar: Gorka
echo "<br/>";
echo corregir_primera_letra('Gorka'); // --> debe mostrar: Gorka
echo "<br/>";
 
/*
 * Ejercicio 5:
 * 
 * Escribir una función que cuente el número de 'a' minúsculas que hay en una frase.
 * (usar for en lugar de foreach)
 */
 
function contar_letra_a($cadena)
{
 
}
 
echo '<h1>Ejercicio 5</h1>';
echo contar_letra_a('gorka'); // --> debe mostrar: 1
echo "<br/>";
echo contar_letra_a('La bala mata la vaca'); // --> debe mostrar: 8
echo "<br/>";
echo contar_letra_a('El oso osó asir a la osa'); // --> debe mostrar: 4
echo "<br/>";
 
/*
 * Ejercicio 6: (este es para nota)
 * 
 * Escribir una función que cuente el número de mayúsculas de una cadena.
 * 
 */
 
function contar_mayusculas($cadena)
{
 
}
 
echo '<h1>Ejercicio 6</h1>';
echo contar_mayusculas('gorka'); // --> debe mostrar: 0
echo "<br/>";
echo contar_mayusculas('La bala mata la vaca'); // --> debe mostrar: 1
echo "<br/>";
 
/*
 * Ejercicio 7: (este es para nota)
 * 
 * Si usamos una cadena como la que viene a continuación ¿contará bien? ¿por qué?
 * ¿cómo corregirías la función? (pista: problemas con la letra 'Ñ')
 * 
 */
echo '<h1>Ejercicio 7</h1>';
echo contar_mayusculas('El Ñoño Niñato Ñoñeaba sin parar');
echo "<br/>";
 
function contar_mayusculas_corregida($cadena)
{
 
}
 
echo contar_mayusculas_corregida('El Ñoño Niñato Ñoñeaba sin parar');
echo "<br/>";
?>
Tags: , , ,

Bash: listar los usuarios de un ordenador

Abril 24th, 2009 | No Comments » | Posted in Bash, linux, programacion, ubuntu

Dado que últimamente estoy haciendo bastantes cosillas con bash voy a poner una serie de “truquillos” aquí.

NOTA: El ejemplo que propongo aquí es un copia/pega de un script que creé para un servidor y una finalidad muy concretas.

En cierto servidor necesitaba tener un listado de los usuarios. Una posibilidad puede ser ir al directorio home y ver allí los usuarios (cada usuario tendrá un directorio ‘home’).

for directorio in /home/*; do
	echo ./actualizador_cada.sh $directorio.
done

dará como resultado:

/home/gorka
/home/alumno
/home/lost+found
/home/mysql
...

Si queremos que no nos muestre ‘/home’ podemos eliminar esa parte de cada directorio usando una subcadena:

echo ${directorio:6}

(esto mostrará una subcadena de $directorio desde la posición 6 hasta el final)

for directorio in /home/*; do
	echo ${directorio:6}
done

dará como resultado:

gorka
alumno
lost+found
mysql
...

NOTA: esto funciona en un sistema en el que los usuarios tengan directorios ‘home’ iguales a su nombres de usuario.

Seguramente verás que hay algunos usuarios que no te interesan (en mi caso sólo me interesaban los usuarios “reales”) así que añadí unas líneas para eliminar los que no interesaban (mysql, lost+found, etc…):

usuarios_no_validos=( 'mysql' 'lost+found')
for directorio in /home/*; do
	valido=1
	usuario=${directorio:6}
	for usuario_no_valido in ${usuarios_no_validos[@]}; do
		if [ $usuario_no_valido = $usuario ]; then
			valido=0
		fi
	done
	if [ $valido -eq 1 ]; then
		echo $usuario
	fi
done
Tags: , , ,