17.4.09

ResoDS WeB

Ya está funcionando y a punto la web de mi proyecto más ambicioso actualmente: http://resods.sourceforge.net/ - ResoDs

13.8.08

ResoDS


Hoy me ha venido una de esas ideas magníficas a la cabeza.

Hacer un controlador MIDI externo para el resolume utilizando la nintendo DS

Pues dicho y en camino anda. Llevaba una semana trasteando con la librería PAlib, que facilita mucho la tarea de programar homebrew para la DS. Como necesitaba una interfaz MIDI para controlar el resolume, sólo tuve que buscar un poco en google hasta encontrar DSMI; un conjunto de librería para c++ y programa servidor que ayuda a transmitir señales MIDI vía Wifi.

Tras mucho pensar y muchos errores absurdos, he conseguido una mini-pre-alfa-release con el que puedo cambiar entre los 20 videos que hay en pantalla. Lo que más tiempo me llevo resolver era el hacer un pequeño cambio en el makefile que por defecto se genera al crear un proyecto PAlib con VHAM, añadiendo la librería dsmi al proyecto.
En negrita la librería incluida

LIBS := -lfat -lnds9 -ldswifi9
LIBSPA := -lpa9 -ldsmi
El problema es que en un principio no sabia donde colocar la librería a cargar y luego (hasta que por suerte lo deduje) ponía "-libdsmi" (nombre del archivo cabecera).

Cuando tenga algo más empezaré a colgar código útil.
UPDATE: http://sourceforge.net/projects/resods

9.12.07

ICEH 2.0 - Indentador de Códigos para Entorno Html

He mejorado el script de indentación web. Inicialmente iba a poner otro código aquí y no encontraba el indentador, así que cogí el código que hay más abajo en este blog y lo rehíce de un modo mas bonito y eficaz.

ARCHIVO: INDEX.PHP
<!--  ------------------ -->
<!-- | By Aladaris 2007 |-->
<!--  ------------------ -->
<!-- Se hace uso del script descargar.php obtenido en http://www.php.net -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Indentador</title>
<link rel="STYLESHEET" type="text/css" href="estilo.css"> 
</head>

<body>
<?
   if(trim($HTTP_POST_VARS["inicial"]) != "")
   {
      $code = $HTTP_POST_VARS["inicial"];
      $code = str_replace("<","&·lt;",$code);
      $code = str_replace(">","&·gt;",$code);
      $code = str_replace(" ","&·nbsp;",$code);
      $code = str_replace("\'","&·#39;",$code);
      $code = str_replace('\"',"&·quot;",$code);
      $code = str_replace("\\\\","&·#92",$code);                     
      $code = nl2br($code);   // Sustituimos los saltos de línea por <br>
  $numero = rand(0, 500);
  $numero = $numero - ($numero%5);
      $salida = fopen("indentado".$numero.".txt","w");
      fputs($salida, $code);
      fclose($salida);
      echo ('<p><a href="descargar.php?f=indentado'.$numero.'.txt&num='.$numero.'">Descargar codigo identado</a></p>');
   }
   else
   { ?>
      <table id="tabla" align="center">
       <tr>
         <FORM ACTION="" METHOD="post">
            <td><textarea name="inicial" id="inicial"></textarea></td></tr>
            <tr><td align="right"><input type="submit" value="Indentar" id="boton"></td></tr>
         </form>
       <tr><td><a href="descargar.php?f=index.php">Descargar indentador</a></td></tr>
       <tr><td><a href="descargar.php?f=descargar.php">Descargar el Script de descargas</a></td></tr>
       <tr><td><a href="descargar.php?f=estilo.css">Descargar la hoja de estilo (CSS)</a></td></tr>
      </table>
<? } ?>
</body>
</html>
Script de descarga de archivos:
ARCHIVO: DESCARGAR.PHP
<?php
//Script conseguido en http://www.php.net/
    $archivos = array("indentado".$_GET["num"].".txt", "index.php", "descargar.php", "estilo.css");
    $f = $_GET["f"];
    if(strpos($f,"/")!==false){
        die("<b>ERROR:</b> No puedes navegar por otros directorios");
    }
    if(!in_array($f,$archivos)){
        die("<b>ERROR:</b> No tienes permiso descargar $f");
    }
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$f\"\n");
    $fp=fopen("$f", "r");
    fpassthru($fp);
?>
Hoja de estilos:
ARCHIVO: ESTILO.CSS
/* Hoja d estilo para el indentador web.
   By Aladaris 2007 */
body {
   font-family: Arial, Helvetica, sans-serif;
   background-color: #CCC;
   font-size: x-small;
   padding-left: 5px;
}

a:link     {text-decoration: none; color: #000;}
a:visited  {text-decoration: none; color: #000;}
a:hover    {text-decoration: underline; color: #393;  background-color: #000;}
a:active   {text-decoration: none; color: 393;}

#inicial { /* Estilo del textarea */
   width: 800px;
   height: 600px;
   color: #393;
   background-color: #000;
   border: dotted #CCC;
}

#boton { /* Estilo del boton */
   height: 30px;
   color: #393;
   background-color: #000;
   border: 1 #CCC;
   font-size: x-small;
}

#tabla { /* Estilo de la tabla */
   background-color: #999;
}

11.8.07

Indentador web service html V 1.0

Ahora que poseo un dominio y un poco de espacio en un hosting de verdad hago pública una versión útil de la herramienta de indentación.
Estoy aprendiendo Perl, python y algo más, así que pronto sufrirá mejoras.
Sin más: Indentador web 1.0.
Se pueden descargar los archivos con el código fuente desde la misma página haciendo uso de uno de los dos archivos (recursividad descargadora xD).

9.8.07

Apagar en X minutos

Cuando empecé a hacer este script no conocía el comando shutdown a fondo... Pero como ya lo tenía hecho y necesito proporcionar el tiempo de apagado en minutos (por ejemplo si pongo una pelicula o algo y se que me voy a quedar dormido). Sin más el absurdo de los absurdos :)

#!/bin/bash
# Script que apaga automáticamente la máquina en un tiempo dado en minutos.
# By Aladaris 2007
# GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007
# http://www.gnu.org/licenses/gpl.txt
# EJECUTAR COMO ROOT

hora=`date +%H`      # Alamacenerá la hora actual a partir de ahora
minuto=`date +%M`    # Alamacenerá el minuto actual a partir de ahora
echo "Son las: $hora:$minuto"
echo "Minutos: "
read minutos         # Valor introducido por el usuario
Tminutos=$minutos    # Numero Total de minutos (usado para sleep 1m)[linea 40]

# Convertir minutos en horas si se introduce un valor superior o igual a 60
horas=0              # El equivalente en horas de los minutos
while [ $minutos -ge 60 ]   # -ge indica >=
do
   let minutos=minutos-60
   let horas=horas+1
done

hora=`date +%H`
minuto=`date +%M`
Nminutos=0
Nhoras=0
let Nhoras=hora+horas
let Nminutos=minutos+minuto

# Convertir minutos en horas si se introduce un valor superior o igual a 60
while [ $Nminutos -ge 60 ]
do
   let Nminutos=Nminutos-60
   let Nhoras=Nhoras+1
done
echo "Pasarán $Tminutos minutos hasta que se cierre el ordenador a las [$Nhoras:$Nminutos]"
seguir=1           # Booleana utilizada para repetir el bucle siguiente
while [ $seguir == 1 ]
do
   sleep 1m
   let Tminutos=Tminutos-1
   hora=`date +%H`
   minuto=`date +%M`
   echo "[$hora:$minuto] Quedan $Tminutos minutos hasta que se apague el ordenador"
   
   if [ $Nminutos -le $minuto ]
   then
      if [ $Nhoras -le $hora ]
      then
         seguir=0
      fi
   fi
done
echo "Apagando el sistema"
sleep 3s
shutdown -h
Sí se hace lo mismo con "shutdown -h 15:32"
Y sí, ahora uso KDE.

25.6.07

Resize de imágenes V 1.0, 2.0 y 3.0

Ante la necesidad de tener que reajustar el tamaño de las fotos para poder hacer paquetes de fotos de un tamaño razonable, para su descarga; he indagado un poco y he descubierto el paquete ImageMagick. Con un poco de ayuda del absurdo he hecho este sencillo script:
VERSION 1.0

#!/bin/bash
# Resize de imagenes a 800x600 para hacer paquetes de fotos
# Hace uso del paquete ImageMagick "http://www.imagemagick.org/script/index.php"
contador=0
if [ $1 = "-ayuda" ]
then
   echo ""
   echo "COMO USAR: "
   echo "ajustar [opcion] archivos_de_imagen"
   echo ""
   echo "OPCIONES"
   echo "-n    Borra la carpeta de destino antes de escribir en ella."
   echo ""
   echo "ejemplo: ajustar -n *.jpg"
   echo "Ajustará todas las imágenes de la carpeta actual borrando el contenido de la carpeta destino antes."
else
   if [ $1 = "-n" ]
   then
      rm /ruta/carpeta/imagenes/reajustadas/*.jpg
   fi
   for parametro in $*
   do
      if [ $parametro = "-n" ]
      then
         echo Borrando carpeta de destino ...
      else
         echo Convirtiendo: $parametro
         convert $parametro -sample 800 "/ruta/carpeta/imagenes/reajustadas/$parametro"
         let contador=contador+1
      fi
   done
   echo Convertidas con exito $contador fotos.
fi # FI DE LA AYUDA

Update: 26-06-2007 18:00 || VERSION 2.0
He optimizado parte del código y ahora se puede elegir un ancho; de momento el alto es proporcional al ancho y no creo que vaya a cambiar esto, pues necesito fotos proporcionadas.
#!/bin/bash
# Resize de imagenes a ****x****
# Hace uso del paquete ImageMagick "http://www.imagemagick.org/script/index.php"
contador=0   #Contador de imagenes reajustadas
Nancho=0   #Nuevo Ancho
ancho=800   #Ancho por defecto
if [ $1 = "-ayuda" ]
then
   echo ""
   echo "COMO USAR: "
   echo "ajustar [opcion/es] archivo/s_de_imagen"
   echo ""
   echo "OPCIONES"
   echo "-n    Borra la carpeta de destino antes de escribir en ella."
   echo ""
   echo "-t    Cambia el ancho por defecto (800) por uno dado"
   echo ""
   echo "ejemplo:"
   echo "         ajustar -n -t 600 foto1.jpg foto2.jpg"
   echo ""
   echo "Ajustará los ficheros 'foto1.jpg' y 'foto2.jpg' a un ancho de 600 (y una altura proporcional) borrando primero el contenido de la carpeta destino"
else
   for parametro in $*
   do
      if [ $parametro = "-n" ]
      then
         rm /ruta/carpeta/imagenes/reajustadas/*.jpg
         echo Borrando carpeta de destino ...
      else
         if [ $Nancho = 1 ]
         then
            ancho=$parametro
            Nancho=0
         else
            if [ $parametro = "-t" ]
            then
               Nancho=1
            else
               echo Convirtiendo: $parametro
               convert $parametro -sample $ancho "/ruta/carpeta/imagenes/reajustadas/$parametro"
               let contador=contador+1
          fi
        fi
      fi
   done
   echo ""
   echo "     Convertidas con exito $contador fotos con un ancho de $ancho pixeles"
   echo "Para obetener mas informacion escriba:  ajustar -ayuda"
fi # FI DE LA AYUDA

Update: 01-07-2007 18:00 || VERSION 3.0
He añadido dos suculentas opciones nuevas:
  • Creación de un archivo .zip conteniendo las imagenes reajuatadas
  • Elección de carpeta destino distinta a la dada por defecto

  • #!/bin/bash
    # Resize de imagenes a ****x****
    # Hace uso del paquete ImageMagick "http://www.imagemagick.org/script/index.php"
    # Para darle un uso útil a este script, hay que copiarlo a la carpeta "/usr/bin/"

    contador=0   #Contador de imagenes reajustadas
    Nancho=0   #Nuevo Ancho BOLEANA
    Nconvertidas=0   #Hubo conversión¿?
    Nzip=0   #Zip?
    Ccarpeta=0   #Cambio de carpeta?¿
    Cresize="/media/hda6/foto/resize/"   #Carpeta destino
    ancho=800   #Ancho por defecto
    if [ $1 = "-ayuda" ]
    then
       echo
       echo "COMO USAR: "
       echo
       echo "ajustar [opciones] archivos_de_imagen"
       echo
       echo "OPCIONES"
       echo "-c        Cambia la carpeta destino. -c /ruta/carpeta/valida"
       echo
       echo "-n        Borra la carpeta de destino antes de escribir en ella."
       echo 
       echo "-t xxxxx  Cambia el ancho por defecto (800) por uno dado (xxxxx)."
       echo
       echo "-z x.zip  Crea un archivo ZIP (x.zip) que contendrá las fotos de la carpeta destino."
       echo
       echo "ejemplo:"
       echo "         ajustar -n -t 600 -z dos_fotos.zip foto1.jpg foto2.jpg"
       echo
       echo "   Ajustará los ficheros 'foto1.jpg' y 'foto2.jpg' a un ancho de 600 (y una altura proporcional) borrando primero el contenido 
    de la carpeta destino.Una vez hecho esto se creará el archivador dos_fotos.zip con las imágenes contenidas en la carpeta destino."
    else
       for parametro in $*
       do
          if [ $Nzip = 1 ]
          then
             nombrezip=$parametro
             Nzip=2
          else
             if [ $Ccarpeta = 1 ]
             then
                Cresize=$parametro
                Ccarpeta=0
             else
                if [ $parametro = "-c" ]
                then
                   Ccarpeta=1
                else
                   if [ $parametro = "-z" ]
                   then
                      Nzip=1
                   else
                   if [ $parametro = "-n" ]
                   then
                      rm /media/hda6/foto/resize/*.jpg
                      echo Borrando carpeta de destino ...
                   else
                      if [ $Nancho = 1 ]
                      then
                         ancho=$parametro
                         Nancho=0
                      else
                         if [ $parametro = "-t" ]
                         then
                            Nancho=1
                         else
                            echo Convirtiendo: $parametro
                            convert $parametro -sample $ancho "$Cresize$parametro"
                            let contador=contador+1
                            Nconvertidas=1
                      fi
                    fi
                  fi
                fi
              fi
            fi
          fi
       done
       if [ $Nconvertidas = 1 ]
       then
          echo
          echo "     Convertidas con exito $contador fotos con un ancho de $ancho pixeles."
          echo "     Guardadas en: $Cresize"
       fi
       if [ $Nzip = 2 ]
       then
          zip "$Cresize$nombrezip" $Cresize*.jpg
          echo "     Creado con éxito el archivador $nombrezip."
       fi
       echo
       echo "Para obetener mas informacion escriba:  ajustar -ayuda"
    fi # FI DE LA AYUDA

    30.5.07

    Foro "sencillo"

    Comencemos suavemente, con lo que ya está al 100%. La unidad (o módulo, o include) que se encarga de crear una variable $admin que servirá para restringir el contenido de ciertos contenidos a los administradores del foro. (Sí, al final terminé por usar sesiones y cookies).

    Quizás para entender del todo el código haga falta el resto, pero ya lo iré poniendo.

    login.php

    <?php
    include ("conectar.php");
    $admin = FALSE;
    $result = mysql_query ("SELECT * FROM admin where nombre='".$_COOKIE["admin"]."' AND clave='".$_COOKIE["pass"]."'");
    if ( $row = mysql_fetch_array($result) ) {
       $admin = TRUE;
    }
    ?>


    UPDATE(09 - 06 - 07 /16:46)
    Versión 1.0b del código. Por supuesto para el trabajo que estoy realizando va todo metido dentro de tablas y muy bonito. Una vez esté terminado lo postearé también.



    foro.php

    <?php
    // By Aladaris 2007 -- GNU 
    // http://www.es.gnu.org/modules/content/index.php?id=8 
    // http://www.gnu.org/philosophy/selling.es.html
       include("includes/login.php");
    // ############################## GENERALIDADES ###############################
       if ( $act == "" ) {   // Redireccionamos al indice de TOPICOS si no se especifica acción
     ?><!-- Pequeño Script en Java que se encarga de redirigir al admin al índice de tópicos -->
          <SCRIPT LANGUAGE="javascript">
             location.href = "<? $_self ?>?act=topicos";
          </SCRIPT><?php
       }
    // ############################## ADMINISTRACION ##############################
    // ----------------------------------------------------------------------------
       if ( $act == "logadminF" ) {   // Formulario para el login del ADMIN si NO esta LOGUEADO
           if ( !($admin) ) {
           ?><form method="post" action="<? $_self ?>?act=logadminC">
                Nombre: <INPUT TYPE="text" NAME="nombre" SIZE=28 MAXLENGTH=50><br />
                Clave: <INPUT TYPE="password" NAME="clave" SIZE=28 MAXLENGTH=50><br />
                <input name="submit" type="submit" class="boton" value="Log-In">
             </form><?
           }else{
             setcookie("admin", $nombre, time()-3600);   // Eliminacion de las COOKIES
             setcookie("pass", $clave, time()-3600);
             echo ('Se ha cerrado con éxito la sesión de <b>ADMINISTRADOR</b>');
           }
        }
    // ----------------------------------------------------------------------------
       if ( $act == "logadminC" ) {   // Inicio de sesión mediante la creación de COOKIES
          $result = mysql_query ("SELECT * FROM admin where nombre='$nombre'");
          if ( $row = mysql_fetch_array($result) ) {   // Si exíste ese nombre de ADMINISTRADOR seguimos
             if ( $row["clave"] == $clave ) {   // Comprobamos el PASSWORD
                setcookie("admin", $nombre, time()+3600);   // Las COOKIES duraran 1 Hora
                setcookie("pass", $clave, time()+3600);
                echo ('Sesión iniciada con éxito.');
             }else{
                echo ('Error: La contraseña proporcionada no es válida.');
             }
          }else{
             echo ('Error: No exíste un administrador con ese nombre.');
          }
       }
    // ----------------------------------------------------------------------------
       if ( $act == "adminF" ) {   // Formulario de cambio de clave del ADMIN
          if ( $admin ) {   // Si es un ADMINISTRADOR proseguimos
        ?><!-- Formulario para cambiar la clave del administrador -->
          <form name="nueva clave" method="post" action="<? $_self ?>?act=adminC">
     Clave actual: <INPUT TYPE="password" NAME="pass" SIZE=28 MAXLENGTH=50><br />
     Nueva clave: <INPUT TYPE="password" NAME="newpass" SIZE=28 MAXLENGTH=50><br />
     Repetir clave: <INPUT TYPE="password" NAME="newpass2" SIZE=28 MAXLENGTH=50><br />
             <input name="submit" type="submit" class="boton" value="Cambiar">
          </form>
      <? }else{ 
             echo ('ERROR: No tiene permiso para realizar esta operación. Sólo un <b>ADMINISTRADOR</b> tiene acceso.'); 
          }
       }
    // ----------------------------------------------------------------------------
       if ( $act == "adminC" ) {   // Cambio de clave del ADMIN
          if ( $admin ) {   // Si es un ADMINISTRADOR proseguimos
             if ( $newpass == $newpass2 ) {   // Evitamos errores al cambiar de clave
                $result = mysql_query ("SELECT * FROM admin WHERE nombre='".$_COOKIE["admin"]."'");
                if ( $row = mysql_fetch_array($result) ) {   // Si nos devuelve columna es que es correcto y proseguimos  
                   $sql = ("UPDATE admin SET clave='$newpass' WHERE clave='$pass'");
                   mysql_query($sql);
                   echo ('Contraseña cambiada con éxito.');?>
                <!-- Pequeño Script en Java que se encarga de redirigir al admin al índice de tópicos -->
                   <SCRIPT LANGUAGE="javascript">
              location.href = "<? $_self ?>?act=topicos";
           </SCRIPT>
          <?    }else{
                   echo ('La clave de administrador que ha proporcionado no es correcta, no se realizará ningún cambio.');
                }
             }else{
                echo ('Has escrito mal la nueva contraseña, asegurese de que al repetirla lo hace exactamente igual.');
             }
          }else{ 
             echo ('ERROR: No tiene permiso para realizar esta operación. Sólo un <b>ADMINISTRADOR</b> tiene acceso.');
          }
       }
    // ----------------------------------------------------------------------------
       if ( $act == "eliminarT" ) {   // Eliminar TOPICO y todos los MENSAJES relacionados
          if ( $admin ) {   // Si es un ADMINISTRADOR proseguimos
             echo ('Autentificación correcta, borrando Tópico y sus Mensajes.');
             $sql = ("DELETE FROM topicos WHERE id='$Tid'");
             $sql2 = ("DELETE FROM mensajes WHERE ref_topic='$Tid'");
             mysql_query($sql);
             mysql_query($sql2);?>
          <!-- Pequeño Script en Java que se encarga de redirigir al admin al índice de tópicos -->
             <SCRIPT LANGUAGE="javascript">
        location.href = "<? $_self ?>?act=topicos";
     </SCRIPT>
       <? }else{ 
             echo ('ERROR: No tiene permiso para realizar esta operación. Sólo un <b>ADMINISTRADOR</b> tiene acceso.'); 
          }
       } 
    // ----------------------------------------------------------------------------
       if ( $act == "eliminarM" ) {   // Eliminar MENSAJE
          if ( $admin ) {   // Si es un ADMINISTRADOR proseguimos
             echo ('Autentificación correcta, borrando Mensaje.');
             $sql = ("DELETE FROM mensajes WHERE id='$Mid'");
             mysql_query($sql);?>
             <!-- Pequeño Script en Java que se encarga de redirigir al admin al topico donde se encontraba -->
             <SCRIPT LANGUAGE="javascript">
        location.href = "<? $_self ?>?act=mensajes&Tid=<? echo ($Tid); ?>";
     </SCRIPT>
       <? }else{ 
             echo ('ERROR: No tiene permiso para realizar esta operación. Sólo un <b>ADMINISTRADOR</b> tiene acceso.'); 
          }
       } 
    // ################################# TOPICOS ##################################
    // ----------------------------------------------------------------------------
       if ( $act == "aniadirT" ) {   // Escribir nuevo TOPICO en la BD
          if ( trim($Fnombre) != "" && trim($Ftitulo) != "" ) {   // Comprobamos que no estén en blanco nombre y título
             $sql = ("INSERT INTO topicos (nombre,apellidos,email,titulo,fecha,descripcion) VALUES 
        ('$Fnombre','$Fapellidos','$Femail','$Ftitulo',curdate(),'".nl2br($Fdescripcion)."')");
             mysql_query($sql);
             echo ('Tópico añadido');?>
             <!-- Pequeño Script en Java que se encarga de redirigir al usuario al índice de tópicos -->
             <SCRIPT LANGUAGE="javascript">
        location.href = "<? $_self ?>?act=topicos";
     </SCRIPT>
       <? }else{
             echo ('Introduzca su <b>Nombre</b> y un <b>Título</b>, como mínimo.');
          }
       }
    // ----------------------------------------------------------------------------
       if ( $act == "topicos" ) {   // Ver TOPICOS
          $contador = 1;   // $contador nos sirve para acotar el máximo de tópicos mostrado por página
          $result = mysql_query("SELECT * FROM topicos order by id DESC");
          while ( $row = mysql_fetch_array($result) ) {
             echo ('<div><a href="'.$_self.'?act=mensajes&Tid='.$row["id"].'">'.$row["titulo"].'</a>'); 
             if ( $admin ) {   // Sólo mostramos la opción de borrado al ADMIN
                echo ('  (<a href="'.$_self.'?act=eliminarT&Tid='.$row["id"].'">Borrar</a>)</div>');
             }else{
                echo ('</div>');   // Cerramos la etiqueta DIV
             }
             $contador ++;
          }
          ?>
             <!-- Formulario para añadir un nuevo TOPICO -->
             <form name="nuevo_topico" method="post" action="<? $_self ?>?act=aniadirT">
                <p>Nombre: <input name="Fnombre" type="text" id="Fnombre" size="32"></p>
                <p>Apellidos: <input name="Fapellidos" type="text" id="Fapellidos" size="64"></p>
                <p>E-mail: <input name="Femail" type="text" id="Femail" size="64"></p>
                <p>Título: <input name="Ftitulo" type="text" id="Ftitulo" size="55"></p>
                <p>Descripción:</p>
                <p><textarea name="Fdescripcion" cols="55" rows="6" id="Fdescripcion"></textarea></p>
                <p><input type="submit" name="Submit" value="Publicar"></p>
             </form>
          <?
       }
    // ################################# MENSAJES #################################
    // ----------------------------------------------------------------------------
       if ( $act == "aniadirM" ) {   // Escribir nuevo MENSAJE en la BD
          if ( trim($Fnombre) != "" && trim($Fmensaje) != "" ) {   // Comprobamos que no estén en blanco nombre y mensaje
             $result = mysql_query("SELECT * FROM topicos order by id");   // Evitar mensajes en tópicos inexistentes
             while ( $row = mysql_fetch_array($result) ) {
                if ( $Tid == $row["id"] ) {
                   $sql = ("INSERT INTO mensajes (nombre,apellidos,email,mensaje,fecha,ref_topic) VALUES 
        ('$Fnombre','$Fapellidos','$Feamil','".nl2br($Fmensaje)."',curdate(),'$Tid')");
                   mysql_query($sql); 
                   echo ('Mensaje añadido');?>
                   <!-- Pequeño Script en Java que se encarga de redirigir al usuario al topico donde se añade el mensaje -->
                   <SCRIPT LANGUAGE="javascript">
              location.href = "<? $_self ?>?act=mensajes&Tid=<? echo $Tid ?>";
           </SCRIPT> 
          <?    }   // Cerrando IF
             }   // Cerrando WHILE
          }else{
             echo ('Introduzca su <b>Nombre</b> y un <b>Mensaje</b>');
          }
       }
    // ----------------------------------------------------------------------------
       if ( $act == "mensajes" ) {   // Ver MENSAJES de un TOPICO dado y su DESCRIPCION
          $result = mysql_query ("SELECT * FROM topicos WHERE id='$Tid'");      
          if ( $row = mysql_fetch_array($result) ) {   // Si nos devuelve columna es que es correcto y proseguimos
             $result = mysql_query("SELECT * FROM mensajes WHERE ref_topic=$Tid order by id");
             while ( $row = mysql_fetch_array($result) ) {
                echo ('<div>'.$row["mensaje"]);
                if ( $admin ) {   // Sólo mostramos la opción de borrado al ADMIN
                   echo ('  (<a href="'.$_self.'?act=eliminarM&Mid='.$row["id"].'&Tid='.$Tid.'">Borrar</a>)</div>');
                }else{
                   echo ('</div>');   // Cerramos la etiqueta DIV
                }
             }
             ?>
             <!-- Formulario para añadir un nuevo MENSAJE en el TOPICO especificado -->
             <form name="nuevo_topico" method="post" action="<? $_self ?>?act=aniadirM&Tid=<? echo $Tid ?>">
                <p>Nombre: <input name="Fnombre" type="text" id="Fnombre" size="32"></p>
                <p>Apellidos: <input name="Fapellidos" type="text" id="Fapellidos" size="64"></p>
                <p>E-mail: <input name="Femail" type="text" id="Femail" size="64"></p>
                <p>Mensaje:</p>
                <p><textarea name="Fmensaje" cols="120" rows="10" id="Fmensaje"></textarea></p>
                <p><input type="submit" name="Submit" value="Enviar"></p>
            </form>
            <?
          }else{
             echo ('El tópico al que intenta acceder no existe');
          }
       }?>

    22.5.07

    Foro, sencillo, funcional y simple (o más)

    Pues lo dicho, hoy me han ofrecido un pequeño (pero no por ello menos importante) proyecto para la creación de un 'foro' utilizando PhP y MySql. No se tratará en sí de un foro sino más bien de un tablón de anuncios con tópicos (como los foro, con sus comentarios dentro), sin usuarios y lo mas simple y sencillo posible.
    Hacía tiempo que no me ponía 'serio' con el PhP; lo que me falta es que me pasen la plantilla donde introducir (y por lo que veo, también maquetar y hacer interfaces) para ponerme serio.

    Supongo que al cliente (porque sí, se trata de un trabajillo [gracias Edu ;)]) no le importe que cuelgue aquí el código (no revelaré donde estará corriendo, ya que no va a ser un trabajo muy meticuloso en cuanto a seguridad y sql injection).
    Lo único que puedo decir por ahora es que sólo trabajaré con un archivo php que se usará como plantilla para hacer que todo funcione.

    Sin más, saludos y sí, aún no he dejado esto.

    UPDATE(26 - 05 - 07 /01:55): Al final la especie de foro éste si que tendrá un administrador con privilegios para borrar tópicos (y todos los mensajes que le correspondan) y mensajes en sí mismo.
    Sigo esperando la plantilla para empezar a meter en tablas los formularios y los resultados...

    UPDATE(28 - 05 - 07 /18:35): Ya está todo hecho, he pasado del uso de sesiones (iba a hacerlo para el administrador) ya que el admin solo quiere borrar tópicos y mensajes y además por el dinero que me dan (no es que me queje) paso de complicarme más la vida.
    Sólo queda por implementar el típico máximo de tópicos / mensajes mostrados por página y meterlo todo en la plantilla, que por cierto aun no tengo ...

    14.5.07

    PhP - Indentador V 1.0

    Al fin he conseguido crear una versión funcional del "Indentador de Código para Entornos Htm" ICEH ('hieloh'[x'DDD]).

    Ten encuenta que para poder visualizar correctamente el codigo he añadido el caracter "·" en la sección de "str_replace" justo después del Ampersand, "&". Para que funcione tienes que eliminar esos puntos.

    Ya sin más, el código:

    <!--  ------------------ -->
    <!-- | By Aladaris 2007 |-->
    <!--  ------------------ -->
    <!-- Se hace uso del script descargar.php obtenido en http://www.php.net -->
    <html>
    <head>
      <title>Indentador</title>
    </head>
    <body>
    <?
       if(trim($HTTP_POST_VARS["inicial"]) != "")
       {
          $code = $HTTP_POST_VARS["inicial"];
          $code = str_replace("<","&·lt;",$code);
          $code = str_replace(">","&·gt;",$code);
          $code = str_replace(" ","&·nbsp;",$code);
          $code = str_replace("\'","&·#39;",$code);
          $code = str_replace('\"',"&·quot;",$code);
          $code = str_replace("\\\\","&·#92",$code);                     
          $code = nl2br($code);   // Sustituimos los saltos de línea por <br>
          $salida = fopen("identado.txt","w");
          fputs($salida, $code);
          fclose($salida);
          echo ('<div><a href="descargar.php?f=identado.txt">Descargar codigo identado</a></div>');
       }
       else
       { ?>
          <FORM ACTION="identador.php" METHOD="post">
             <textarea name="inicial" cols="120" rows="40" id="inicial"></textarea></br>
             <input type="submit" value="Identar">
          </form>
    <? } ?>
    </body>
    </html>

    Si ya has mirado el código, habrás comprobado que se hace uso de un script externo llamado descargar.php, y tal y como se cita en la cabecera del código, lo extraje de la web php.net. Paso a copiar el código del script de descarga (repito, no es mio, aunque se sigue ajustando a la filosofia del blog):

    <?php
    //Script conseguido en http://www.php.net/
        $archivos = array("identado.txt", "identador.php", "descargar.php");
        $f = $_GET["f"];
        if(strpos($f,"/")!==false){
            die("No puedes navegar por otros directorios");
        }
        if(!in_array($f,$archivos)){
            die("<b>ERROR!</b> no tienes permiso descargar $f");
        }
        header("Content-type: application/octet-stream");
        header("Content-Disposition: attachment; filename=\"$f\"\n");
        $fp=fopen("$f", "r");
        fpassthru($fp);
    ?>

    ----- Pendiente por publicar -----
    *Comentarios extendidos del code

    11.5.07

    Indentación...

    Sigo buscando un modo para indentar el código. Creo que voy a optar por hacerme algun tipo de aplicación que me sirva para reemplazar los espacios, " ",(y en general cualquier simbolo que pueda interferir con el código del blog) por su correspondiente caracter html.

    UPDATE(14 - 05 - 07 /11:00): Ya he implementado el identador, al final he optado por hacerlo en php que me resulta mucho más cómodo y puedo compartir la herramienta sin necesidad de su descarga. Me queda solucionar un problemilla que crea un doble salto de línea y publico el código.
    Ya lo he usado en la entrada "Linux - Montar imágenes" arreglando el doble salto de línea a mano :P.

    CSS - Personalizando el blog

    He estado mirando como funciona el blogger este y me he dado cuenta de que las plantillas son grandes archivos html, xml o lo que sea, con unas cabeceras inmensas donde se define el estilo. Por eso, y visto que voy a ir poniendo código en este blog, he creado una nueva clase, "codigo" que lo que hace básicamente es dar formato al código que publique. Configura la fuente, situa el texto más centradamente, colorea el fondo y lo rodea por un elegante (xD) "dashed" borde rojo.
    Sin más os copio el fragmento simple de código css que he generado.

    .codigo{
       font-family : times new roman;
       font-size : 85%;
       text-align : justify;
       margin-left : 19%;
       padding : 15px;
       background-color : #FFF8DC;
       border : dashed 2px red;
    }
    Según un par de sitios de referencia que vi para modificar bloggers, lo ideal es copiar ese fragmento de código justo debajo de las declaraciones de los "headings" (< .h1> < .h2> ...).
    Para utilizarlo simplemente hay que poner el codigo deseado entre las siguientes etiquetas:

    < .table class="codigo" border="0" cellpadding="0" cellspacing="0">< .tbody>< .tr>< .td>
    ...Aquí el Código...
    < /td>< /tr>< /tbody>< /table>

    He decidido hacerlo con tablas porque al hacerlos con "div" o "span" no conseguía ajustar el ancho del recuadro (que varíe según la longitud del texto). Es un poco más engorroso, pero investigaré el método para hacerlo mas sencillo.
    (Pongo puntos y espacios para que no se vuelva loco el editor de entradas)

    10.5.07

    Linux - Montar imágenes

    Dando mis primeros pasos en el Bash Scripting he hecho este pequeño script, con interface y todo, para facilitarme el montaje de imágenes de disco *.iso, *.img, *.nrg, *.mdf.

    #!/bin/bash
    #By Aladaris 2007 GNU License
    #Este script facilita la tarea de montar imagenes ya sean de extension *.iso *.img *mdf ó *.nrg
    #
    clear
    echo Este script depende de los paquetes cc2iso y mdf2iso
    echo
    echo Introduce el nombre, ruta incluida, SIN LA EXTENSIÓN:
    read NAME
    clear
    function ppal {
       echo La imagen que se va a montar es: "$NAME"
       echo
       OPTIONS="ISO IMG MDF NRG CAMBIAR DESMONTAR SALIR"
       select opt in $OPTIONS; do
          if [ "$opt" = "ISO" ]; then
             sudo mount -t iso9660 -o loop "$NAME".iso /media/imagen
             ppal
          elif [ "$opt" = "IMG" ]; then
             sudo ccd2iso "$NAME".img "$NAME".iso
             sudo mount -t iso9660 -o loop "$NAME".iso /media/imagen
             ppal
          elif [ "$opt" = "MDF" ]; then
             sudo mdf2iso "$NAME".mdf "$NAME".iso
             sudo mount -t iso9660 -o loop "$NAME".iso /media/imagen
             ppal
          elif [ "$opt" = "NRG" ]; then
             sudo mount -t iso9660 -o loop,offset=307200 "$NAME".nrg /media/imagen
             ppal
          elif [ "$opt" = "CAMBIAR" ]; then
             echo Introduce el nombre, ruta incluida, SIN LA EXTENSIÓN:
             read NAME
             clear 
             ppal
          elif [ "$opt" = "DESMONTAR" ]; then
             sudo umount /media/imagen
             ppal
          elif [ "$opt" = "SALIR" ]; then
             echo Recuerda que el punto de montaje es /media/imagen
             exit
          else
             clear
             echo Opción incorrecta
             ppal
          fi
    done
    }
    ppal

    Iniciando el Blog

    Hace 5 minutos (o menos [lo que se tarde en crear un blog en blogger]) se me ocurrió crear este blog en el que ir publicando todo el código que vaya generando en mi vida y que considere interesante compartir. Me parece una buena idea, que no se si dejaré de lado en un futuro (como casi todo lo que empiezo), para dentro de X tiempo poder observar mi evolución en cuanto a programación.