Tabla de Contenidos

Programación

SCRIPTS

Introducción a AWK

IOCTLs

Console IOCTLs Under Linux

Reproductor de CD

The Linux CDROM interface

Sockets en Linux

Notas generales de programación

Actualizacion a PHP 5.3.2

split() reemplazarla por explode()

How to fix ‘Function eregi() is deprecated’ in PHP 5.3.0

I used to use eregi for validating email address input that matches to the regular expression.

<?php
if(!eregi("^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$", $str)) {
    $msg = 'email is not valid';
}
else {
$valid = true;
}
?>

That would return true if given email address is matches to username@domain.ext pattern. Unfortunately, after upgrading PHP to the earlier version (5.3.0), it wont work properly. This is because eregi is one of several functions that are deprecated in the new version of PHP.

Solution: Use preg_match with the 'i' modifier instead. i means that regular expression is case insensitive. So the code become like this:

<?php
if(!preg_match("/^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$/i", $str)) {
    $msg = 'email is not valid';
}
else {
$valid = true;
}
?>

http://takien.com/513/how-to-fix-function-eregi-is-deprecated-in-php-5-3-0.php

Obtener el usuario segun su UID

En este caso queremos obtener el usuario que corresponde al UID 506

#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>
 
int main()
{
  struct passwd *pw;
 
  pw = getpwuid(506);
 
  if (pw == NULL) {
    printf("NULL!\n");
  }
  else {
    printf("name: %s\n", pw->pw_name);
  }
}

Parsear el contenido de un tag XML con sed

A veces necesitamos extraer el contenido de un tag XML dentro de un script, aca un ejemplo simple

	<state can_be_paused="0">running</state>
sed 's/<[^>]*[>]//g'

Salida:

	running

Agregar comillas a direcciones IP en archivo CSV

Por ejemplos nos dieron un archivo CSV con todos los campos delimitados por comas, menos las direcciones IP

"10.1.1.5","255.255.255.0","Equipo de Red","Red de casa","","DHCP","","","","",""
sed 's/[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}/"&"/g'

Agregar texto al final de una linea que matchea con cierto patrón

Ejemplo en la linea que se refiere al kernel en el archivo menu.lst quiero cambiar la opción de memoria para el dominio 0.

Entonces necesito cambiar de algo asi:

kernel /xen.gz-2.6.18-164.10.1.el5

A algo asi:

kernel /xen.gz-2.6.18-194.8.1.el5 dom0_mem=96

Ejecuto esto:

sed -e 's/kernel.*/& dom0_mem=96/g' menu.lst

Redondear un numero en BASH

echo "tmp=$variable; tmp /= 1;tmp" | bc

Pasar mayúculas y minúsculas

echo hola | tr '[:lower:]' '[:upper:]'
echo HOLA | tr '[:upper:]' '[:lower:]'

Ejecutar asyncronicamente en Perl o como emular un nohup desde adentro

use strict;
use POSIX qw/setsid/;
my $pid = fork();
die "can't fork: $!" unless defined $pid;
exit 0 if $pid;
setsid();
open (STDIN, "</dev/null");
open (STDOUT, ">/dev/null");
open (STDERR,">&STDOUT");
exec "comando a ejecutar";

can you get cp to give a progress bar like wget

http://chris-lamb.co.uk/2008/01/24/can-you-get-cp-to-give-a-progress-bar-like-wget/

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}

Sockets en PHP

servidor-tcp.php

<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($con = stream_socket_accept($socket)) {
    fwrite($con, 'La hora local es ' . date('n/j/Y g:i a') . "\n");
    fclose($con);
  }
  fclose($socket);
}
?>

servidor-udp.php

<?php
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
    die("$errstr ($errno)");
}
 
do {
    $pqt = stream_socket_recvfrom($socket, 1, 0, $peer);
    echo "$peer\n";
    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0,
    $peer);
} while ($pqt !== false);
 
?>

ascii.c

#include <stdio.h>
 
int main()
{
   int n;
   for (n=16; n<256;n+=4)
      printf ("%d.- %c  %d.- %c  %d.- %c  %d.- %c  %d.- %c  %d.- %c  %d.- %c\n", 
      n, n, n+1, n+1, n+2, n+2, n+3, n+3, n+4, n+4, n+5, n+5, n+6, n+6);
   return 1;
}

Problema clásicos de programación

Peluquero dormilón

/*
Author: dhb@email.it
Your comments are welcome.
 
Peluquero dormilón
Introducción
Una ciudad tiene una peluquería con dos puertas y unas pocas sillas.
Los clientes entran por una puerta y salen por la otra.
Dado que el negocio es chico, a lo sumo un cliente o el peluquero se pueden mover en al a la vez.
El peluquero pasa su vida atendiendo clientes, uno por vez.
Cuando no hay ninguno, el peluquero duerme en su silla.
Cuando llega un cliente y encuentra que el peluquero está durmiendo, el cliente lo despierta,
se sienta en la silla del peluquero y duerme mientras el peluquero le corta el pelo.
Si el peluquero está ocupado cuando llega un cliente, el cliente se va a dormir a una de las otras sillas.
Despúes de un corte de pelo, el peluquero abre la puerta de salida para el cliente y la cierra cuando el cliente se va.
Si hay clientes esperando, el peluquero despierta a uno y espera que el cliente se siente.
Sino, se vuelve a dormir hasta que llegue un cliente.
Implementación
La implementación propuesta esta desarrollada en C usando semáforos.
Semáforos: 
Clientes (customers): número de clientes en espera sin contar el que se esta cortando el pelo
Barberos (barber): número de peluqueros (barberos) inactivos.
Exmut: exclusión mutua.
Condiciones iniciales: customers = 0, barber = 0, exmut = 1
Código
*/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
 
#define TRUE 1
#define FALSE 0
#define CHAIRS 3 //Sillas Disponibles
#define CANT_CUST 5 //Cantidad de Clientes
#define T_CUST 0 //Tiempo de llegada de Clientes
#define T_CORTE 3 //Tiempo de corte de pelo
 
typedef int semaphore;
 
//Prototipo de funciones
void *customer (void *);
void *barber (void *);
void up (semaphore *);
void down (semaphore *);
 
semaphore sem_barber=0, sem_customer=0,sem_mutex=1;
int waiting=0;
 
//Main function
int main (void) {
 pthread_t barb_t,cust_t[CANT_CUST];
 int i;
 
 pthread_create(&barb_t,NULL,barber,NULL);
 for (i=0;i<CANT_CUST;i++){
    sleep(T_CUST);
    pthread_create(&cust_t[i],NULL,customer,NULL);
 }
 
 pthread_join(barb_t,NULL);
 return(0);
}
 
void *customer (void *n) {
 printf ("Customer:entrando hay %d esperando\n",waiting);
 down (&sem_mutex);
 if (waiting < CHAIRS) {
  waiting++;
  up (&sem_customer);
  up (&sem_mutex);
  down (&sem_barber);
  printf ("Customer:Me estan cortando el pelo.\n");
 }
 else {
  up (&sem_mutex);
  printf ("Customer:Me fui no hay lugar.\n");
 } 
}
 
void *barber (void *j) {
 printf ("Barber:Empiezo a trabajar\n"); 
 while (TRUE) {
  down (&sem_customer);
  down (&sem_mutex);
  waiting--;
  up (&sem_barber);
  up (&sem_mutex);
  printf ("Barber:Comienzo el corte de pelo de un cliente quedan %d esperando.\n",waiting);
  sleep (T_CORTE);
  printf ("Barber:Termine de cortar el pelo de un cliente quedan %d esperando.\n",waiting);
 }
}
 
void up (semaphore *sem) {
 *sem+=1;
}
 
void down (semaphore *sem) {
  while (*sem<=0){};
  *sem-=1;
}

Uso de la Función div()

Sintaxis:

div_t div(int num, int denom);

Descripcion: Calcula el cociente y resto de la división del numerador num entre el denominador denom. Si la división es inexacta, el cociente resultante es el entero de menor magnitud que es el más próximo al cociente algebraico. Si el resultado no puede ser representado, el comportamiento no está definido; de lo contrario, quot * denom + rem igualará num.

#include <stdlib.h>
#include <stdio.h>
 
int main()
{
   div_t d;
   int num, denom;
 
   puts( "Escriba el numerador y el denominador (separados por un espacio):" );
   scanf( "%d %d", &num, &denom );
   d = div( num, denom );
   printf( "ldiv( %d, %d ) : cociente = %d, resto = %d\n", num, denom, d.quot, d.rem );
 
   return 0;
}