ResoDS WeB
Ya está funcionando y a punto la web de mi proyecto más ambicioso actualmente: http://resods.sourceforge.net/ - ResoDs
Perl, Bash Script, Pascal, C, C ++, Python, php, html ...
Ya está funcionando y a punto la web de mi proyecto más ambicioso actualmente: http://resods.sourceforge.net/ - 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 -ldswifi9El 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.
LIBSPA := -lpa9 -ldsmi
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> |
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); ?> |
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; } |
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).
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 |
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 |
#!/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 |
#!/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 |
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; } ?> |
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'); } }?> |
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 ...
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> |
<?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); ?> |
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.
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; } |
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 |
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.