6 oct 2013

Juego de la vida en C

Hola, esta ves les muestro un programa que realice en C, y este es el juego de la vida, a mi parecer es un programa bastante bueno de implementar si se esta aprendiendo a programar y esto es debido al uso de funciones que se utilizan para su creación.

El código de este programa lo muestro a continuación, no explico el código ya que a mi parecer es algo sencillo de entender, pero si a alguien tiene dudas me lo pueden hacer saber y con mucho gusto les explico cada linea del archivo.

Sin mas que decir muestro el código.


/***********IMPLEMENTACION DEL JUEGO DE LA VIDA****************
** Autor: Jonathan Cruz Orozco.
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>

//cantidad de filas y columnas
#define COLS 40
#define FILS 20

//ciclo de repeticiones
#define NoCicloVida 200

//numero minimo de celulas vivas que han de rodear a una celula viva para que no se muera
#define NoMin 2 //2
//numero maximo de celulas vivas que han de rodear a una celula viva para que no se muera
#define NoMax 3 //4
//numero minimo de celulas vivas que han de rodear a una celula muerta para que vuelva a vivir
#define NoMinVive 2 //2
//numero maximo de celulas vivas que han de rodear a una celula muerta para que vuelva a vivir
#define NoMaxVive 3 //3

//espacio donde estaran las celulas
char vecindad[FILS][COLS];

//Reglas para vivir o morir
int vida[4] = {NoMin,NoMax,NoMinVive,NoMaxVive};

/*****************************+FUNCIONES PROTOTIPO+***************************/
void vecindadInicial();
void poblarVecindad();
void pintarVecindad();
int analizarVecinos(int,int);
void cicloCelular();
/*****************************************************************************/

void vecindadInicial(){
    int i,j;
    for (i = 0; i < FILS; i++){
        for (j = 0; j < COLS; j++){
            vecindad[i][j] = '_';
        }
    }
}

void poblarVecindad(){
int fil,x,y;
srand(time(NULL));

//crear celulas de manera aleatoria
for (fil = 0; fil < COLS; ++fil){
y = rand()%COLS;
x = rand()%FILS;
if(vecindad[x][y]=='_')
vecindad[x][y]='O';
}
}

void pintarVecindad(){
    int i,j;
    for (i = 0; i < FILS; i++){
            printf("\n");
        for (j = 0; j < COLS; j++){
            printf("%c",vecindad[i][j] );
        }
    }
    printf("\n");
}

/*******************************
****                        ****
****        |_|_|_|         ****
****        |_|_|_|         ****
****        |_|_|_|         ****
****                        ****
********************************/

int analizarVecinos(int posf, int posc){
//contador de celulas (vecinos)
int vecinos = 0;
if(posf-1 >= 0 && posc-1 >= 0)
if(vecindad[posf-1][posc-1] == 'O')
vecinos++;
if(posf-1 >= 0)
if(vecindad[posf-1][posc] == 'O')
vecinos++;
if(posf-1 >= 0 && posc+1 <= COLS-1)
if(vecindad[posf-1][posc+1] == 'O')
vecinos++;
if(posc-1 >= 0)
if(vecindad[posf][posc-1] == 'O')
vecinos++;
if(posc+1 <= COLS-1)
if(vecindad[posf][posc+1] == '0')
vecinos++;
if(posf+1 <= FILS-1 && posc-1 >= 0)
if(vecindad[posf+1][posc-1] == 'O')
vecinos++;
if(posf+1 <= FILS-1)
if(vecindad[posf+1][posc] == 'O')
vecinos++;
if(posf+1 <= FILS-1 && posc+1 <= COLS-1)
if(vecindad[posf+1][posc+1] == 'O')
vecinos++;

return vecinos;
}

void cicloCelular(){
int fil,col;
int n_vecinos;

//ciclo principal
for(fil = 0; fil < FILS; fil++){
for(col = 0; col < COLS; col++){
n_vecinos = analizarVecinos(fil,col);

//condiciones para que una celula no muera
if(vecindad[fil][col] == '_'){
if(n_vecinos == NoMinVive || n_vecinos == NoMaxVive)
vecindad[fil][col] = 'O';
else
vecindad[fil][col] = '_';
}
else if(vecindad[fil][col] == 'O'){
if(n_vecinos == NoMin || n_vecinos == NoMax)
vecindad[fil][col] = 'O';
else
vecindad[fil][col] = '_';
}
}
}
}

/* Funcion principal del programa*/
int main(int argc, char *argv[])
{
int i=0;

vecindadInicial();
poblarVecindad();
    
while(i < NoCicloVida){
pintarVecindad();
usleep(100000);
system("clear");
cicloCelular();
i++;
}

return 0;
}

29 sept 2013

PHP

En esta sección se mostraran algunos ejemplo básicos sobre el uso de PHP.

PHP y lenguaje C.

Ejecutar programa en C desde el navegador con PHP.

Hola, en esta ocasión quiero compartir un pequeño ejemplo de como ejecutar un programa hecho en lenguaje C desde el navegador usando PHP.

Para poder realizar este ejemplo debemos de tener lo siguiente instalado en nuestro ordenador:

  • Servidor HTTP Apache.
  • PHP 5.
  • gcc

Para esto se uso una distribución de Linux (Ubuntu).

Bueno, pues manos a la obra.

Abrimos un editor de texto para crear nuestro programa en lenguaje C, para esto yo usaré sublime text, el cual a mi parecer es muy bueno. Copiamos el siguiente código en el editor y lo llamamos prueba.c
#include <stdio.h>

int main(int argc, char *argv[])
{
    char* mensaje;

    if(argc > 0)
    {
        mensaje = argv[1];


        printf("<H1>Ejecutar archivos C desde php</H1>");
        printf("Prueba de envio de parametros desde php<br>");
        printf("El mensaje es: %s<br>",mensaje);

    }
    else
        printf("Error: argumentos no validos\n");
return 1;
}


Podemos observar que he utilizado las etiquetas de html para hacer el salto de linea y el encabezado de la página, pasamos a compilar nuestro programa.

 Ahora es turno de nuestro archivo .php

En nuestro editor de texto escribimos lo siguiente:

<html>
<head><title>Mensaje php-c</title>
</head>
<body>
<?php
    $result = exec("./prueba hola");
    echo $result;
?>
</body>
</html>


Para poder ejecutar nuestro programa en C debemos tener nuestro ejecutable en el mismo nivel que nuestro archivo de php.

Notemos que ejecuto el programa y le paso como argumento la palabra "hola" , para confirmar el buen funcionamiento del programa.

Vamos a nuestro navegador y accedemos a nuestro servidor local, en mi caso sería:

localhost/exec/index.php

Si todo a salido bien debemos observar algo similar a la siguiente imagen.





Espero que este pequeño aporte les ayude, hasta la próxima.







10 jun 2013

Montar partición con formato NTFS en Linux.

Acceder a partición NTFS desde Linux.

En esta ocasión quiero compartir algo que posiblemente sea de ayuda. Esto es el montar una memoria USB con formato NTFS en un sistema Linux. Como podrán notar este tipo de particiones no acepta los comandos de Linux, como cambiar propietario y permisos a un archivo.

Para lograr el cambio de propietario y de permisos en un archivo haremos uso de ntfs-3g. Para saber mas acerca de esta herramienta pueden consultar la siguiente página www.tuxera.com o escribir en la terminal: man ntfs-3g.

Pasos a realizar.


  • Conectar la memoria USB (con formato NTFS) en su equipo.
  • Abrir una terminal como super usuario.
  • Conocer el punto de montaje, para esto escribimos escribimos en la terminal mount.

    Ubicamos nuestra memoria en el mensaje desplegado, en mi caso esta montada en:
    /dev/sdc1 on /run/media/root/TUGAMAN. Lo importante aquí es la ruta /dev/sdc1
  • Dentro del directorio /media/  creamos una carpeta que nombraremos ntfs, escribimos en la terminal:
    mkdir /run/media/ntfs
  • Desmontamos la memoria, para esto en la terminal escribimos:
    umount /run/media/root/TUGAMAN, deben cambiar la ruta anterior por el nombre que a ustedes se les presento.
  • Ahora montamos de nuevo la unidad USB pero ahora hacemos uso de ntfs-3g, escribimos en la terminal:
    mount -t ntfs-3g -o permissions /dev/sdc1 /run/media/ntfsObservaremos el siguiente mensaje en la consola:
    Using default user mapping.
Si todo ha salido bien ya pueden cambiar permisos y propietarios a cada archivo de manera individual.
 
Espero les se de ayuda.
Hasta la próxima.




24 feb 2013

Posibles errores

En esta sección usted podrá encontrar solución a posibles problemas en un sistema Linux.

Error en la configuración del gestor de energía.

Montar partición con formato NTFS en Linux.

Problema de instalación: No se ha instalado correctamente la configuración ...

"Problema de instalación, no se ha instalado correctamente la configuración predeterminada para el gestor de energía. Contacte con el administrador de su sistema".

Este mensaje se me presento ayer por la noche al iniciar sesión en mi sistema Ubuntu, en la ventana de loggin escribía mis datos y me regresaba de nuevo a esta ventana, creí que había un problema con la batería pues últimamente me he percatado de que ya no rinde como los primeros días de uso.

Por suerte al estar investigando encontré la solución, y quiero aclarar que este problema no esta relacionado con la batería del equipo, sino, con la partición raíz ( / ) de nuestro sistema, en mi caso le deje 15 Gb y de tantos programas que he instalado termine por llenar ese espacio, por ese motivo me mostraba el mensaje que he colocado al principio de la página.

Lo que hice para solucionar el problema y poder entrar de manera normal a Ubuntu, fue lo siguiente:

  • Encender el equipo y elegir la opción ... (mode recovery)
  • Iniciar en modo de recuperación (desde linea de comandos)
  • escribir df -h (comando para visualizar las particiones, aquí note, que efectivamente mi partición raíz estaba completamente llena)
  • escribir dpkg --get-selections | grep linux-image (este comando despliega una lista con las actualizaciones del kernel)
  • Posteriormente pase a borrar las imágenes del kernel que ya no eran necesarias, ojo, no borrar la imágen más actual ni la anterior a esa, esta última por precaución.
  • El comando para borrar las imágenes es:
    apt-get --purge remove linux-image-2.6.32.xx-generic (esto último en base a la lista que hayan obtenido con el comando escrito anteriormente)
  • Observamos de nuevo el tamaño de las particiones y podemos notar que la partición raíz ya tiene más espacio.
  • Reiniciamos y entramos a nuestro sistema.
Pero el problema no termina aquí, para que no les vuelva a pasar este problema deben redimensionar la partición raíz para que tenga más espacio ya sea con gparted u otro programa que facilite esta tarea.


 Espero les sirva de ayuda.
Hasta la proxima!!!