Category Archives: Programación

IDE’s, eterno debate

Usa un IDE por comodidad, pero no para que cubra tu desconocimiento

un Pobrecito Hablador (de /.)

Ahora mismo podría escribir un libro por lo timado que me siento al ser suspendido por un par de incompetentes profesores que no saben mirar mas diseños que el modelo planteado como solución por ellos, pero mejor no, que en ese caso me cabrearé cada vez que lo lea y esperemos que en par de días se me pase el cabreo.

Ruby on Rails

Bastante curioso oye, actualmente hay tres tecnologías clave en el desarrollo web (bueno cuatro, pero java es lo peor del mundo, así que lo ignoro) PHP, ASP.NET y RoR.

(Nota: el comando que ejecuto se podría resumir en que se pilla la cabecera http que nos devuelve el servidor)

PHP

[blaxter@helicon]:~$ wget -S –spider http://www.php.net
–15:27:55– http://www.php.net/
=> `index.html’
Resolviendo www.php.net… 64.246.30.37
Connecting to www.php.net|64.246.30.37|:80… conectado.
Petición HTTP enviada, esperando respuesta…
HTTP/1.1 200 OK
Date: Sat, 11 Feb 2006 14:06:42 GMT
Server: Apache/1.3.26 (Unix) mod_gzip/1.3.26.1a PHP/4.3.3-dev
X-Powered-By: PHP/4.3.3-dev
Last-Modified: Sat, 11 Feb 2006 14:13:35 GMT
Content-language: en
Connection: close
Content-Type: text/html;charset=ISO-8859-1
Longitud: no especificado [text/html]
200 OK

ASP.NET

[blaxter@helicon]:~$ wget -S –spider http://asp.net
–15:26:18– http://asp.net/
=> `index.html’
Resolviendo asp.net… 66.129.67.14
Connecting to asp.net|66.129.67.14|:80… conectado.
Petición HTTP enviada, esperando respuesta…
HTTP/1.1 302 Found
Connection: keep-alive
Date: Sat, 11 Feb 2006 14:26:24 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Location: http://asp.net/Default.aspx?tabindex=0&tabid=1
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 43204
200 OK

RoR

[blaxter@helicon]:~$ wget -S –spider http://rubyonrails.org/
–15:25:18– http://rubyonrails.org/
=> `index.html’
Resolviendo rubyonrails.org… 70.84.143.109
Connecting to rubyonrails.org|70.84.143.109|:80… conectado.
Petición HTTP enviada, esperando respuesta…
HTTP/1.1 200 OK
Date: Sat, 11 Feb 2006 14:25:23 GMT
Server: Apache
X-Powered-By: PHP/5.0.3
Vary: Accept-Encoding
X-Powered-By: The blood, sweat and tears of the fine, fine TextDrive staff
Served-By: TextDrive’s Textpache
Keep-Alive: timeout=5, max=80
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Longitud: no especificado [text/html]
200 OK

Comentar que la página de RoR no tiene mucha parte dinámica, así que tiene excusa para no usar algo mas avanzado como es RoR, posiblemente la parte de php se centre exclusivamente en includes() y poco mas, si me apuras templates y/o logs varios.

Gran programa

Esto que navegando me encuentro con este gran código, con tatuaje de un tio incluido

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

Claramente me ha picado la curiosidad, si hacemos un copy paste, compilamos y ejecutamos, veremos que sale “hello word!”. Vayamos por partes y pongamos el código más legible:

int i;
main(){
for( ;i["]<i;++i){--i;}"]; read('-'-'-',i+++"hello, world!\n",'/'/'/'));
}
read(j,i,p){
write(j/p+p,i---j,i/i);
}


Esta claro, tenemos un bucle for que llama en cada iteracion a la función read, la cual está definida posteriormente como un write. En la invocacion del read, el primer parametro será siempre 0, y el tercero es siempre 1 y el segundo parametro vemos que es un incremento de i (i++) mas una cadena (una cadena es un puntero), es decir le estamos pasando el caracter i-esimo de esa cadena a la función read.
Veamos ahora esa función read, como j es 0 y p es 1, el write queda así:

write(1, i–, 1);

. Es decir estamos escribiendo el caracter anterior al puntero dado por el stream 1 (stdout).
Esto empieza a tener ya sentido, no?. Ahora veamos la guarda del bucle for, del main():

for(;i[“]<i;++i){–i;}”]; ……

No tiene inicialización, y como guarda vemos algo que se podría expresar mas claramente como *(i+ “]<i;++i){–i;}” ), y vemos que esa cadena tiene una longitud igual a la frase “hello world!”, asi que se ejecutará tantas veces como longitud de la frase.

Por lo tanto ya tenemos todo, tenemos un bucle que se ejecuta tantas veces como la frase que queremos escribir y en cada iteración pasamos un puntero al caracter (i+1)-esimo el cual será decrementado e imprimido, asi hasta que terminemos de saludar al mundo ;).

So easy, isn’t it?.

Script recomprension MP3

  • Mi caso: se me ha jodido el ipod y voy a pasar de tener 15gb a 2gb, mmmm, tengo la música casi toda a 192..320 de bitrate, aja, ¡hay que bajar ese bitrate!.
  • Mi caso II: pillo una canción con bastantes bajos, agudos y muy variada vamos, … , la oigo a 320, 192, 128….no consigo adivinar cual es cual, OK, soy sordo, gran ventaja! :D.
  • Conclusión: convertir toda mi musica a 128 con lo que un album de 100mb me pasará a 40mb, reduzco en un 60%, no esta mal.
  • Herramientas a usar: lame. Me leo el man, aja, veo que puedo convertir fácilmente, pero hay un gran problema, llamado Id3, los cuales los quiero mantener, son la base de cualquier biblioteca musical decente. OK, me haré un script para leerlos y pasárselo como parámetros al lame, el cual me convertirá las canciones (e insertará la información del id3 que le paso).

    No problem, perl al poder, script pequeño pero útil. En definitiva es un simple script para recomprimir mp3 sin perder los id3 de éstos, aqui esta.

    • BUG_1: Algunos nombres de ficheros con caracteres que podríamos denominar como raros falla, mayormente porque en el script se “escapan” dichos caracteres, y posiblemente alguno me habré dejado. Una solución para esto es simplemente renombrar los ficheros problemáticos.
    • BUG_2: cuando el id3 del genero no está conforme al estandar Id3V1 (es decir una lista determinada de generos, lame –genre-list para verlos), peta también, mejor porque así he detectado incoherencias en los id3 y los he arreglado.

    Por lo demás va a la perfección :). 50gb de musica convertida en 20 :D. Y desde entonces toda la música que me estoy bajando la convierto con este script :).

    En ambos casos, estos “bugs” (o features?), por supuesto, no hacen que se borren los mp3’s ni nada. Simplemente saldrá un lista de los comandos que han fallado (y posiblemente verás en dicho comando un parámetro del estilo –tg “__un_género__” el cual no es un género válido id3 o algún símbolo raro en el nombre del fichero, puedes copypastear dicho comando y sabrás exactamente el porqué falla).

    Las instrucciones para usarlo son simples. Hay que tener en cuenta que el script trabajará con los mp3 únicamente del directorio actual. Esto lo he hecho así porque suelo tener los mp3 divididos por discos (como es lo normal creo yo) y gracias a otro script primero detecto qué discos tienen bitrate mayor que 128, y luego voy carpeta por carpeta usando este. Proceso que se podría automatizar, cierto; pero me gusta así.

    $ wget http://www.bicosyes.com/code/recompress.txt
    $ chmod +x recompress.txt
    $ sudo mv recompress.txt /usr/bin/recompress # o a algún sitio en tu path
    $ sudo aptitude install lame libterm-progressbar-perl libmp3-info-perl
    $ cd MUSICA/directorio_con_mp3
    $ recompress

Convertir Subs

Bueno siempre estoy poniendo post de series o personales y esto parece casi un blog rosa xD. Vamos a poner algo interesante esta vez.

Me estoy bajando una serie (Gilmore Girls), y resulta que los subs que hay en español estan realizados para un video de 25fps (video en español vamos), diría que los que los hicieron no fueron muy agiles, pues el video que hay compartido en la mula es claramente los dvd’s en ingles y si quieres subs lo lógico es que sean para el video en ingles, el cual esta a diferente fps, por lo tanto habrá desincronización.

La solución es convertir los tiempos, hay un programa para windows que lo hace, pero como no quiero usar windows, me he hecho un programita simple, pero útil. Es en ANSI C y se compila con un tipico “gcc fichero.c -o NombreEjecutable” luego para usarlo simplemente “NombreEjecutable FICHERO_ENTRADA FICHERO_SALIDA”. Hay un par de Define’s que se pueden variar a necesidad. Yo ya he convertido todos los subtitulos y van ahora a la perfeción :). Aqui pego el código, no creo que alguien lo quiera pero ahi queda xD. Por supuesto permito copiarlo y tal, pero vamos que son cuatro lineas xD.


#include
#include
#include
/********************************************/
#define FPS_IN 25.0 // FPS ENTRADA
#define FPS_OUT 23.978 // FPS SALIDA
/********************************************/
int lookAhead(FILE *F, int n){
// PRE: F=
// POST: lookAhead=d_x AND F=
int c;
for(c=1;c
// POST: end_of_file = (x>n)
return (0xffffffff==lookAhead(F,1));
}
int end_of_line(FILE *F){
// indica si estamos final de linea, valido para formato WIN/UNIX/MAX
int c;
c = lookAhead(F,1);
if (c == 0x0D) c = lookAhead(F, 2);
return (c == 0x0A);
}
void skip_line(FILE *F){
// salta la linea actual, valido para formato WIN/UNIX/MAX
int c;
while (!end_of_line(F))
fgetc(F);
if (end_of_line(F)){
c = fgetc(F);
if (c == 0x0D) c = fgetc(F);
}
}
int esNum(int character){
return (character>=48 && character<=57); } int leeNum(FILE *F, int n){ int veces; int ok=1; for(veces=0; veces ", 5, sizeof(char), Fout);
pilla_tiempo(F, &h, &m, &s, &ms);
convertir(h,m,s,ms, &h2, &m2, &s2, &ms2);
pon_tiempo(Fout, h2, m2, s2, ms2);
new_line(Fout); skip_line(F);
}
void abrirFicheros(FILE *in, FILE *out, char *f1, char *f2){
in=fopen(f1, "r");
out = fopen(f2, "w");
}
int main(int argc, char **argv){
FILE *F, *Fout;
if (argc != 3 && argc != 2){
printf("ERROR:\tUSO %s SUB_ENTRADA.srt SUB_SALIDA.srt\n", argv[0]);
exit(1);
}else
abrirFicheros( F,
Fout,
argv[1],
(argc==3 ? argv[2] : strcat(argv[1], ".srt"))
);
while (!end_of_file(F))
if (linea_OK(F))
Convierte_Linea(F, Fout);
else
clonaLinea(F, Fout);
fclose(F); fclose(Fout);
}

Codigo subs.c

Editores PHP

Pues para poner algo util, despues de estar la tarde de ayer probando bastantes editores php, voy a poner los que creo que son los mejores. Mucha gente dira, booo lo mejor notepad (o vi, nedit, kwrite @ linux..), pero cuando te pones a hacer algo de dimension media o grande, facilita mucho la tarea tener un buen entorno.

NuSphere PhpED: Es el primero que me convencio, tienes un buen debugger, ventana de exploracion de codigo con tus clases, variables, funciones; tambien te auto completa variables, funciones; documentacion para aburrir, ademas es bastante ligero. Aunque lo que no me gusta es el debugger que no lo veo muy comodo del todo, y al conectarse a mi base de datos local me fue imposible(o soy mu tonto y no se, es otro opción). En definitiva bastante comodo pero no perfecto.

Zend studio: Realmente impresiona la primera vez que lo ejecutas, tiene todas las caracteristicas del anterior, aunque en este para mi gusto diría que el debugger es bastante mejor, aunque tienes que instalarte un server del programa que se instala por encima del apache(o tu servidor web) y del php. Puedes usar el servidor web + php que esten en otra maquina, que en segun que situacion puede ir bastante bien. Pero es bastante pesado en cuanto a carga, aunque eso si tiene lo que se dice de todo, analizador de codigo que te previene de errores(bastante mas exacto de lo que creía), uso de cvs, documentacion, etc, etc… Despues de probarlo, creía que habia encontrado el editor perfecto.

PHP Designer: Cuando empece a bajarlo vi, 2mb… no puede ser muy completo pense, jaja estaba bastante equivocado, tiene todas las caracteristicas de un editor, aunque eso si le faltan unas cosas: Manejar la Base de datos, Cvs, debugger remoto. Si no te hacen falta esas cosas (incluidas en el Zend) en mi opinión este es el editor perfecto, su debugger es muy simple pero es realmente comodo programar. En resumen, es un editor php sin opciones adicionales, pero muy comodo.

Yo recomendaría Zend studio para quien quiera tener todas las herramientas imaginables y PHP designer para tener un megaNotepadDefinitivo-php. Yo creo que me quedare con este último :).

editado: en verdad al final usé (y uso actualmente) zend studio bajo linux. Es simplemente perfecto y al final usas todas sus caracteristicas y te facilita la vida a lot of 😀 (el debugger es perfecto, y el poder realizar consultas a la DB son caracteristicas que una vez que las usas no puedes vivir sin ellas simplemente)