27 febrero 2009

Que se vallan todos que no quede ni uno solo!

Hola a casi todos los ""politicos"", vengo a comentarles que son todos una manga de forros mal paridos que no hacen mas que comprase consoladores y meterselos por el orto, y esa cristina que le compra agranda penes a nestor, porque no hacen lo que tienen que hacer en vez de comprase diamantes y ropa nueva todos los dias? ustedes deberian ir a la silla electrica por todos los crimenes que hay en Argentina, que se hacen los peronistas si son mas pelotudos que las palomas, hagan algo por el amor de Buda! y dsp salen los tipos a protestar porque una calle se hace doble mano, como le contestaron a uno que estaba protestando
"yo estoy llendo a trabajar, vos que haces aca? porque no estas trabajando?"
(silencio muy largo de parte del "protestante", el mismo que daria un ""politico"" si se le pregunta porque no esta trabajando)
como dijo Susana Gimenez recien, los que matan tienen que morir, una cosa es morir en un accidente y otra cosa es que te maten porque se acordaron del quinto puto que se los cojio y te quisieron matar.
dsp me dicen "te acordas como era en el 2001? ahora con este gobierno estamos mejor"
otra pelotudez mas, yo pregunto, estamos mejor? si, hay mas trabajo, menos pobreza, pero de nada sirve tener trabajo si dsp te roban el sueldo con todos los impuestos y ensima dsp te roban, de nada sirve no ser mas pobre si dsp te van a terminar matando, aparte de que ni que tengamos el super trabajo y re baja la pobreza, ah eso si, con -30% de inflacion vamos mejorando.
eso de los putos derechos humanos, metanselos bien por la concha, vos cristina, frente para la victora, que derechos humanos tenian todas las personas que mataron los montoneros?? tanto que mandar a la carcel a los militares, porque no mandas a las demas agrupaciones paramilitares a la carcel tambien eh? porque vos perteneciste a alguna y entonces quedarias vos presa?? todos los que estan a cargo del pais y dejan que la delincuencia siga creciendo deberian ir a la carcel! y dsp le niegan la policia a macri, que pedazos de forros que son, y los maestros que quieren cobrar 500% mas de lo que cobra un empleado de cualqueir otro lado, porque no en vez de reclamar esas cosas reclaman por mas seguridad? estamos en un pais de mierda, ojala que vuelva Agosti y los mande todos a la re concha bien de su madre (bueno creo que me pase un poco con eso) y hacen desaparecer a todos esos pelotudos que andan suelto...

BASTA DE PELOTUDECES!!!!!

salu2!

(huy al fin me descarge de todo esto! tantas ganas tenia de hacerlo!! :D :D )

21 febrero 2009

Desactivar eco en Linux

Hola,
habran notado que las funciones de entrada y salida estandar por la consola son todas con eco, es decir, que lo que el usuario escribe en la consola es visualizado, por lo que por ejemplo si le pedimos una contraseña al usuario es algo inseguro usar fgets porque otras personas pueden ver la contraseña.

la primera opcion es obsoleta
sacado de "man"


SYNOPSIS
#include unistd.h (los signos de mayor y menor faltan aca..)

char *getpass( const char * prompt );

DESCRIPTION
This function is obsolete. Do not use it.

getpass lo que hace es imprimir "prompt", desactivar el eco, obtener una cadena y retornar esa cadena, por ejemplo

char contra[30];
strncpy(contra, getpass("Ingrese la conrtaseña"), 30);

aunque se llame getPASS no significa que necesariamente tiene que ser una contraseña...

pero hay otra forma de obtener una cadena sin el eco.
este metodo es cambiando las opciones de tty (la consola actual) obteniendo la cadena y volver las opciones de tty a como estaban
para eso tenemos 2 funciones
vamos a necesitar a
termios.h
unistd.h
para poder usarlas:

int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);

el primero obtiene las opciones (o atributos) de tty y la segunda especifica las opciones
en fd ponemos 0 (que seria la entrada estandar), la estructura termios contiene flags

tcflag_t c_iflag; /* input modes */
tcflag_t c_oflag; /* output modes */
tcflag_t c_cflag; /* control modes */
tcflag_t c_lflag; /* local modes */
cc_t c_cc[NCCS]; /* control chars */

nosotros tenemos que modificar c_lflag, sacandole el bit ECHO
y para tcsetattr el segundo argumento usamos TCSANOW para que se haga en el momento los efectos

la idea es obtener las opciones de tty y guardarlas en una estructura, cambiar c_lflag sacandole ECHO, poner las opciones con el flag modificado, obtener la cadena, volver a colocar ECHO en el flag y poner las opciones nuevamente:

#include stdio.h /*como sabran, aca tienen que colocar los signos de mayor y menor...*/
#include termios.h
#include unistd.h

int main(void)
{
struct termios tty;
char s[200];
tcgetattr(0, &tty);/*obtenemos*/
tty.c_lflag &= ~ECHO;/*sacamos eco*/
tcsetattr(0, TCSANOW, &tty);/*ponemos*/
fgets(s, 200, stdin);/*obtenemos la cadena*/
tty.c_lflag |= ECHO;/*ponemos eco*/
tcsetattr(0, TCSANOW, &tty);/*ponemos*/
return 0;
}
fijense que con tcgetattr ponemos 0 y en fgets usamos stdin, eso es porque tcgetattr espera el identificador del archivo y fgets espera una estructura FILE *

bueno, con eso podemos obtener algo del teclado sin eco

salu2!

19 febrero 2009

Fork

Hola,
fork(), una funcion que al principio me costo entender...
para empesar, fork esta en
unistd.h
fork lo que hace es crear una copia exacta del proceso que llamo a la funcion, cuando digo exacta digo EXACTA, esto significa que una vez ejecutada la funcion fork vamos a tener 2 procesos iguales (la unica diferencia es el PID). digo que es exacta porque toda la memoria del proceso se copia, por lo que si antes de ejecutar fork habiamos leido del teclado una cadena y la guardamos en memoria, en el nuevo proceso (llamemoslo hijo) vamos a tener guardada la cadena que se ingreso, a su vez tambien se copian los registros del cpu, por lo que el proceso hijo se va a empezar a ejecutar inmediatamente dsp de la funcion fork.
cuando el "padre" ejecuta fork, fork le retorna el pid del nuevo proceso creado, y dentro del proceso hijo, fork retorna 0, y en caso de error retorna -1.
quisa es confuso esto de que fork detro del padre retorna el pid del hijo y que dentro del hijo retorna 0, asique les muestro este codigo, que no es el real, pero es la idea

Código
pid_t fork(void)
{
pid_t ppid, cpid;
/*esto solo se ejecuta en el padre*/
ppid = getpid();
/*...*/
/*hace la copia del proceso*/
/*...*/
/*a partir de aca se ejecuta en el hijo*/
if(ppid == getpid())
return cpid; /*suponiendo que en cpid guardamos el pid del hijo*/
return 0;
}
fork guarda inicialmente el pid del padre, copia el proceso y ahora el if siguiente se ejecuta tanto en el padre como en el hijo, asique se fija si el pid actual es el mismo que el del padre, si lo es entonces retorna el pid del hijo, si es diferente significa que se esta ejecutando en el hijo por lo que retorna 0

para que sirve fork? una de las cosas que se pueden hacer es esto
Código
#include 
#include
/*...*/
char nproc[] = "/usr/bin/kate";
/*...*/
if(!fork()) /*si fork retorna 0*/
execl(nproc, nproc, 0);
printf("Se ejecuto Kate\n");
/*...*/
de esta forma en vez de reemplazar el proceso actual por "kate" (por lo que se pierde el programa y se reemplaza literalmente por kate) lo que hacemos es llamar a fork y desde el hijo ejecutar execl y reemplazar el hijo por kate, asi el proceso padre sige en ejecucion

salu2!

17 febrero 2009

kde 4.2 yo y mi slackware

Hola, que tal, les voy a contar lo que me paso para que a otros no le pase, porque supongo que no soy el unico pelot**o sobre la tierra, aparte de que estoy contento de tener kde 4 y queria mostrarlo Lengua
http://img14.imageshack.us/img14/8273/kde45la2.jpeg
http://img9.imageshack.us/img9/4910/kde44tp1.jpeg
http://img16.imageshack.us/img16/9209/kde43vn6.jpeg
resulta que tengo mi hermoso Slackware 12.1 en la pc, pero venia con kde 3.5.
navegando por internet me fije de que kde habia lanzado la generacion "4", con la vercion 4.2 como la ultima estable, me fije las capturas de pantalla y estaba muy lindo, asique me dispuse a descargar todos los paquetes que te pide compilar, que son 20 mas o menos,
http://www.kde.org/download/#v4.2
lo primero que hize fue eliminar kde 3.5 y qt3, asique me quede sin kde, tenia fluxbox, esta bueno...
pienzo igual que Ken Thompson (idolo total)

Citar
The X server has to be the biggest program I've ever seen that doesn't do anything for you.
http://en.wikiquote.org/wiki/Kenneth_Thompson
aunque es lindo que el escritorio tenga buenos graficos, no tube problemas en usar fluxbox hasta de usar solamente la consola sin iniciar Xfree.

empiezo a compilarlos los paquetes de kde y cada uno tenia como 10 dependencias diferentes, bueno, una larga lucha buscandolos e intentando instalarlos, que a su vez cada tanto esas dependencias tmb tenian dependencias, pero bueno, dsp de mucho laburo haciendo siempre lo mismo
Código
cmake ../
make
sudo make install

cmake ../
echo ANDATE A LA RE ***A MADRE QUE TE PARIO
cmake ../
make
sudo make install
me quedaban 3 paquetes, si señor, pude instalar la mayoria pero me faltaban 3 paquetes, que aunque instale las dependencias me daba errores de que algo no estaba declarado o que no encontraba X archivo, podia iniciar kde, pero no tenia los iconos y cada tanto saltaba error xD
esos 3 p**os paquetes fueron lo peor que kde pudo haber progrmado... hasta que buscando sobre los errores se me ocurrio, asi se me cruzo, nisiqueira pense que iba a pasar lo que paso, me acorde que las dependencias de kde4, casi todas estaban aca:
http://packages.slackware.it/browse.php?q=current/testing/packages/kde4/deps
y quise entrar a http://packages.slackware.it/ (los paquetes para slackware) y buscar kde, y me di cuenta de esto:
http://packages.slackware.it/browse.php?q=current/testing/packages/kde4/kde
estaban los paquetes que yo me descarge e intente compilar por casi 1 semana, pero aca estaban ya configurados para slackware
<)" border="0"> <)" border="0"> <)" border="0"> <)" border="0"> <)" border="0"> )" border="0"> )" border="0"> )" border="0"> )" border="0"> |=( |=( |=( |=( |=( |=( |=( |=( :'( :'( :'( :'( :'( :'( :'( xD xD xD xD xD xD xD xD

osea, me ahorraba la molestia de compilar y toda la bola

<)" border="0"> <)" border="0"> <)" border="0"> <)" border="0"> <)" border="0"> )" border="0"> )" border="0"> )" border="0"> )" border="0"> |=( |=( |=( |=( |=( |=( |=( |=( :'( :'( :'( :'( :'( :'( :'( xD xD xD xD xD xD xD xD

asique, soy un tremendo pelot**o, si alguien quiere instalar algo grande e importante como es KDE, valla directo a los paquetes de su distribucion porque sino se va a volver flogger
http://es.wikipedia.org/wiki/Flogger
yo me salve porque estoy con el heavy metal y soy inmune al virus flogger xD
asique, ramc, vos que querias instalar kde4.2 en slackware, los paquetes estan en slackware-current/testing, osea, no forma parte de la 12.1 ni la 12.2, es de la version en desarrollo de slackware.... que pelotudez no buscar ahi todo no?

salu2!

06 febrero 2009

Libreria BMP para C

Hola, hace un tiempo hize un par de funciones para leer BMPs, me olvide de postearlo aca xD

pueden leer de http://foro.code-makers.es/1_cm_ezine-t3059.0.html;msg14996#msg14996 una explicacion sobre las funciones y esas cosas

copian el archivo bmp.h a algun lugar y dsp con #include lo agregan al programa, si, es muy trucho para ser una "libreria", pero es lo que hay xD
aca para descargarlo
http://www.badongo.com/file/13268052

/********************************************************************/
/*
Read BMP image format only with the ansi standars! (valid for all the compilers)

Ni0 -- SSW team

Buenos Aires - Argentina

9/8/2008
last update 25/1/2009
*/

#ifndef __BMP_H
#define __BMP_H

#include stdio.h /*correct this... you know what to do :P*/
#include stdlib.h

#define MAXBMP 10
#define BMPERROR -1
#define BMPOK 0

/*all the posible errors*/
#define BMPERROR_NOERROR (BMPERROR_OPEN - 1)
#define BMPERROR_OPEN 1
#define BMPERROR_FULL (BMPERROR_OPEN + 1)
#define BMPERROR_COMPRES (BMPERROR_OPEN + 2)
#define BMPERROR_MAGICNUMBER (BMPERROR_OPEN + 3)
#define BMPERROR_POS (BMPERROR_OPEN + 4)
#define BMPERROR_NOTUSED (BMPERROR_OPEN + 5)
#define BMPERROR_CLOSE (BMPERROR_OPEN + 6)
#define BMPERROR_OFFSETZERO (BMPERROR_OPEN + 7)
#define BMPERROR_BADXY (BMPERROR_OPEN + 8)
#define BMPERROR_TABLE (BMPERROR_OPEN + 9)
#define BMPERROR_POINTSIZE (BMPERROR_OPEN + 10)
#define BMPERROR_PIXEL (BMPERROR_OPEN + 8)

int getrgb(int, unsigned long, unsigned char *, unsigned char *, unsigned char *);
int getbmperror(void);
int openbmp(char *);
int closebmp(int);
int getbmpxydeep(int, int *, int *);
unsigned long getbmppixel(int, int, int);

int bmp_error = BMPERROR_NOERROR;

typedef struct bmp_header_{
char mn[3];/*magic number... pointer to string "BM\0"*/
long size;
long res;
long image_data;
long header_size;
long x;
long y;
short planes_number;
short point_size;
long compres;
long image_size;
long x_resolution;
long y_resolution;
long color_used;
long important_colors;
unsigned long *color_table;
}_bmp_header;

char bmp_used[MAXBMP] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
FILE* bmp_int[MAXBMP];
_bmp_header bmp_header[MAXBMP];

int getbmprgb(int pos, unsigned long pixel, unsigned char *r, unsigned char *g, unsigned char *b)
{
if(pos <> MAXBMP){
bmp_error = BMPERROR_POS;
return BMPERROR;
}
if(r == 0 || g == 0 || b == 0){
bmp_error = BMPERROR_OFFSETZERO;
return BMPERROR;
}
if(bmp_header[pos].point_size == 24){
*b = (unsigned char)(pixel / 0x10000);
*g = (unsigned char)(pixel / 0x100);
*r = (unsigned char)pixel;
return BMPOK;
}
if(bmp_header[pos].point_size == 16){ /*i think this is wrong*/
*b = (unsigned char)pixel/0x800;
*g = (unsigned char)(pixel & 0x7E0)/0x20;
*r = (unsigned char)(pixel & 0x1F);
return BMPOK;
}
if(bmp_header[pos].point_size == 8 && pixel > 256){
bmp_error = BMPERROR_PIXEL;
return BMPERROR;
}
if(bmp_header[pos].point_size == 4 && pixel > 16){
bmp_error = BMPERROR_PIXEL;
return BMPERROR;
}
if(bmp_header[pos].point_size == 1 && pixel > 2){
bmp_error = BMPERROR_PIXEL;
return BMPERROR;
}
*b = (unsigned char)bmp_header[pos].color_table[pixel] / 0x10000;
*g = (unsigned char)bmp_header[pos].color_table[pixel] / 0x100;
*r = (unsigned char)bmp_header[pos].color_table[pixel];
return BMPOK;
}

int getbmperror(void){ return bmp_error; }

int openbmp(char *file)
{
int pos, rp;
for(pos = 0; pos != MAXBMP; pos++)
if(bmp_used[pos] == 0)
break;
if(pos == MAXBMP){
bmp_error = BMPERROR_FULL;
return BMPERROR;
}
bmp_int[pos] = fopen(file, "rb");
if(!bmp_int[pos]){
bmp_error = BMPERROR_OPEN;
return BMPERROR;
}
bmp_header[pos].mn[2] = 0;
fread(bmp_header[pos].mn, 1, 2, bmp_int[pos]);
fread(&bmp_header[pos].size, 1, 52, bmp_int[pos]);
if(bmp_header[pos].compres != 0){
bmp_error = BMPERROR_COMPRES;
return BMPERROR;
}
if(bmp_header[pos].mn[0] != 0x42 || bmp_header[pos].mn[1] != 0x4D){
bmp_error = BMPERROR_MAGICNUMBER;
return BMPERROR;
}
if(bmp_header[pos].point_size == 16 || bmp_header[pos].point_size == 24)
rp = 0; /*isn't necesary*/
else if(bmp_header[pos].point_size == 8)
rp = 256;
else if(bmp_header[pos].point_size == 4)
rp = 16;
else if(bmp_header[pos].point_size == 1)
rp = 2;
else {
bmp_error = BMPERROR_POINTSIZE;
return BMPERROR;
}
if(bmp_header[pos].point_size < color_table =" (unsigned" color_table ="="" bmp_error =" BMPERROR_TABLE;" bmp_error =" BMPERROR_NOERROR;"> MAXBMP){
bmp_error = BMPERROR_POS;
return BMPERROR;
}
if(bmp_used[pos] == 0){
bmp_error = BMPERROR_NOTUSED;
return BMPERROR;
}
free(bmp_header[pos].color_table);
if(fclose(bmp_int[pos]) == EOF){
bmp_error = BMPERROR_CLOSE;
return BMPERROR;
}
bmp_used[pos] = 0;
return BMPOK;
}

int getbmpxydeep(const int pos, int *x, int *y)
{
if(pos <> MAXBMP){
bmp_error = BMPERROR_POS;
return BMPERROR;
}
if(bmp_used[pos] == 0){
bmp_error = BMPERROR_NOTUSED;
return BMPERROR;
}
if(x == 0 || y == 0){
bmp_error = BMPERROR_OFFSETZERO;
return BMPERROR;
}
*x = bmp_header[pos].x;
*y = bmp_header[pos].y;
bmp_error = BMPERROR_NOERROR;
return bmp_header[pos].point_size;
}

unsigned long getbmppixel(const int pos, const int x, const int y)
{
int extra = 0, deep = 0;
unsigned long pixel = 0, aux;
if(pos <> MAXBMP){
bmp_error = BMPERROR_POS;
return BMPERROR;
}
if(bmp_used[pos] == 0){
bmp_error = BMPERROR_NOTUSED;
return BMPERROR;
}
if(x <> bmp_header[pos].x || y <> bmp_header[pos].y){
bmp_error = BMPERROR_BADXY;
return BMPERROR;
}
if((bmp_header[pos].point_size * bmp_header[pos].x) % 32 == 0)
extra = 0;
else
extra = 32 - ((bmp_header[pos].point_size * bmp_header[pos].x) % 32);
fseek(bmp_int[pos], ((-1) * y * (bmp_header[pos].x * bmp_header[pos].point_size + extra)) / 8, SEEK_END);
extra = (x - 1) * bmp_header[pos].point_size;
fseek(bmp_int[pos], (int)(extra / 8), SEEK_CUR);
fread(&pixel, 1, (int)((bmp_header[pos].point_size + 7) / 8), bmp_int[pos]);
if((bmp_header[pos].point_size % 8) != 0){
aux = 0xFFFFFFFF >> (32 - bmp_header[pos].point_size);
extra = ((x - 1) * bmp_header[pos].point_size) % 8;
aux = aux << pixel =" pixel" pixel =" pixel">> extra;
}
bmp_error = BMPERROR_NOERROR; /*if the pixel is 0xFFFFFFFF it may be confused with BMPERROR*/
return pixel;
}
#endif /*ifndef __BMP__H*/
/***********************************************************/

05 febrero 2009

Que hacer en caso de ataque nuclear

hola
jajaja me tope con esto:
http://blogs.vandal.net/94249/vm/17207852008
es un folleto distribuido en los años 50 en estados unidos sobre que hacer en caso de guerra nuclear
esta interesante... hace tiempo habia leido otro, un poco mas moderno, decia que tenias que rodearte de cosas, cuantras mas cosas mejor, muebles colchones sillas mesas, etc., asi intentas disminuir la radiacion y que habia que tener cuidado con los incendios, porque todo se prende fuego; tambien decia como hacer un traje anti radiación casero jajaja xD
pero principalmente, una vez que la bomba callo, YA NO HAY TIEMPO PARA NADA, y que NO HAY QUE MIRAR LA EXPLOCIÓN por mas lejos que te encuentres.

jajaja xD

salu2!

04 febrero 2009

Opcion que le agrege al Freets on Fire

Hola!
bueno, es la 2º vez que uso las livertades 1 y 3 del software libre:


The freedom to study how the program works, and adapt it to your needs (freedom 1). Access to the source code is a precondition for this.

The freedom to improve the program, and release your improvements (and modified versions in general) to the public, so that the whole community benefits (freedom 3). Access to the source code is a precondition for this.

http://www.gnu.org/philosophy/free-sw.html

adelanto que NO SE Python.

el Frets On Fire es un juego que tocas la guitarra con el teclado
http://fretsonfire.sourceforge.net/
http://es.wikipedia.org/wiki/Frets_on_fire


la idea del juego es reproducir una cancion y te van apareciendo las teclas que tenes que tocar, que suele ser parecido a como se toca en la guitarra (aunque aveces meten cada fruta...)

pero como yo no soy ni Michael Romeo ni Joe Satriani, suelo confundirme y tocar mal, pero yo amo el Heavy Metal, y la mayoria de las canciones que tengo son de Metal xD y cuando me confundo la musica se para, y no regresa hasta que no toques bien. Muchas canciones son muy buenas y yo muy malo, y no quiero no escuchar el tema cuando me confundo, asique que hice? le agrege una opcion dentro de opciones para elejir se toque siempre la cancion, osea, si te confundis se sige escuchando la musica.

solo tube que modificar pocas lineas, en total son 3 arhcivos,pero no pasan mas de 6 lineas que agrege

src/GameEngine.py, linea 59, la linea que agrege es la ultima, pero les muestro desde la 59 para que se pongan en contexto
aca es donde agrege que existe otra variable dentro del juego
la linea que agrege es muy larga y se sale del post, osea, a la derecha el codigo continua, aunque no se vea
Código
#Config.define("opengl", "svgquality",   int,   NORMAL_QUALITY,  text = _("SVG Quality"), options = {LOW_QUALITY: _("Low"), NORMAL_QUALITY: _("Normal"), HIGH_QUALITY: _("High")})
Config.define("audio", "frequency", int, 44100, text = _("Sample Frequency"), options = [8000, 11025, 22050, 32000, 44100, 48000])
Config.define("audio", "bits", int, 16, text = _("Sample Bits"), options = [16, 8])
Config.define("audio", "stereo", bool, True)
Config.define("audio", "buffersize", int, 2048, text = _("Buffer Size"), options = [256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536])
Config.define("audio", "delay", int, 100, text = _("A/V delay"), options = dict([(n, n) for n in range(0, 301)]))
Config.define("audio", "screwupvol", float, 0.25, text = _("Screw Up Sounds"), options = {0.0: _("Off"), .25: _("Quiet"), .5: _("Loud"), 1.0: _("Painful")})
Config.define("audio", "guitarvol", float, 1.0, text = _("Guitar Volume"), options = dict([(n / 100.0, "%02d/10" % (n / 9)) for n in range(0, 110, 10)]))
Config.define("audio", "songvol", float, 1.0, text = _("Song Volume"), options = dict([(n / 100.0, "%02d/10" % (n / 9)) for n in range(0, 110, 10)]))
Config.define("audio", "rhythmvol", float, 1.0, text = _("Rhythm Volume"), options = dict([(n / 100.0, "%02d/10" % (n / 9)) for n in range(0, 110, 10)]))
Config.define("video", "fontscale", float, 1.0, text = _("Text scale"), options = dict([(n / 100.0, "%3d%%" % n) for n in range(50, 260, 10)]))

#esta es la linea agregada:
Config.define("audio", "songallways", bool, False, text = _("Song allways on"), options = {False: _("No"), True: _("Yes")})



src/Settings.py, linea 184, igual que la anterior, muestro desde la 184 pero esta al final lo que agrege
aca agrege para que la variable se modifique dentro del menu de options-audio
Código
    audioSettings = [
(_("Volume Settings"), volumeSettingsMenu),
ConfigChoice(engine.config, "audio", "delay"),
ConfigChoice(engine.config, "audio", "frequency"),
ConfigChoice(engine.config, "audio", "bits"),
ConfigChoice(engine.config, "audio", "buffersize"),
#esto es lo que agrege
ConfigChoice(engine.config, "audio", "songallways"),
]

src/GuitarScene.py, las lineas son 205, 220 y 265 (no son exactas porque despues de agregar varias cosas se modifican, pero es por ahi, yo les pongo una parte del codigo anterior asi pueden encontrar lo que hay que modificar)
aca es donde hice que al equivocarse si la opcion esta en True entonces que la cancion siga, el juego lo que hacia es ponerle el volumen en 0, lo que hice es agregar antes un if y listo xD

linea 205:
Código
    if self.guitar.getMissedNotes(self.song, pos) and not self.guitar.playedNotes:
#este es el if que agrege
if not self.engine.config.get("audio", "songallways"):
self.song.setGuitarVolume(0.0)
self.player.streak = 0

linea 220:
Código
  def endPick(self):
score = self.getExtraScoreForCurrentlyPlayedNotes()
if not self.guitar.endPick(self.song.getPosition()):
#esta es la linea que agrege
if not self.engine.config.get("audio", "songallways"):
self.song.setGuitarVolume(0.0)
self.player.addScore(score)

linea 265:
Código
#despues del else
if self.guitar.startPick(self.song, pos, self.controls):
self.song.setGuitarVolume(self.guitarVolume)
self.player.streak += 1
self.player.notesHit += len(self.guitar.playedNotes)
self.player.addScore(len(self.guitar.playedNotes) * 50)
self.stage.triggerPick(pos, [n[1].number for n in self.guitar.playedNotes])
if self.player.streak % 10 == 0:
self.lastMultTime = pos
else:
#esta es la que agrege
if not self.engine.config.get("audio", "songallways"):
self.song.setGuitarVolume(0.0)
self.player.streak = 0
self.stage.triggerMiss(pos)
self.sfxChannel.play(self.engine.data.screwUpSound)
self.sfxChannel.setVolume(self.screwUpVolume)


espero que le sirva a alguien, le envie un mail al que hizo el proyecto diciendole de esto, asique quisa proximamente salga en las proximas verciones del juego Lengua

salu2!

02 febrero 2009

solucion para compilar ipx en Slackware

Hola,
tengo GNU/Linux Slackware 12.1 con el kernel 2.6.28, y quise compilar unos programas para poder hacer funcionar IPX, estos programas son

ipx_interface.c
ipx_internal_net.c
ipx_route.c
ipx_configure.c

y al aprecer todo eso forma el "ipx-1.0" (digo esto porque no me acuerdo de donde lo baje y no lo encontre de nuevo, aunque al aprecer forma parte de caldera o algo asi) y todos esos los uso para poner en marcha el ipx en la red

bueno, pero resulta que al hacer
$ make
me salian errores como

/usr/include/linux/ipx.h:9: error: expected specifier-qualifier-list before 'sa
_family_t'

/usr/include/linux/ipx.h:26: error: expected specifier-qualifier-list before '_
_be32'

/usr/include/linux/ipx.h:32: error: expected specifier-qualifier-list before '_
_be32'

/usr/include/linux/ipx.h:58: error: expected specifier-qualifier-list before '_
_be32'

ipx_configure.c: In function 'main':

ipx_configure.c:63: error: 'ipx_config_data' undeclared (first use in this func
tion)

quisa hay otra solucion para esto, pero yo le encontre una, hay que modificar dos archivos para que esto ande

antes que nada aviso que pongo
#include asd/cabecera.h
sin los <> (cabecera.h va en el medio de
<>), porque sino desaparece esa linea, asique le quite los <>, ustedes los tienen que agregar

el primer archivo es

/usr/include/linux/ipx.h

en las primeras lineas, tenemos esto (acuerdense de agregar los <>):

#include linux/socket.h


le cambiamos linux por sys, nos queda:

#include sys/socket.h

y justo abajo de esa linea, AGREGAMOS


#include linux/types.h

osea, las primeras lineas de /usr/include/linux/ipx.h son asi:

#ifndef _IPX_H_

#define _IPX_H_

#include linux/sockios.h

#include sys/socket.h

#include linux/types.h

#define IPX_NODE_LEN 6

#define IPX_MTU 576


muy bien, ahora modificamos el archivo ipx_configure.c que esta en la carpeta ipx-1.0
en la linea 64 (o una mas o una menos, dsp de que modifique tanto el ipx_configure.c no estoy seguro de que sea la linea 64, pero esta por ahi) aparece

int got_auto_pri = 0;

int got_auto_itf = 0;

ipx_config_data data;



progname = argv[0];

tenemos que cambiar ipx_config_data data; le agregamos "struct" al principio:

struct ipx_config_data data;

osea, nos queda asi el principio de la funcion main

int s;

int result;

char errmsg[80];

char val;

int option_index = 0;

int got_auto_pri = 0;

int got_auto_itf = 0;

struct ipx_config_data data;


y despues de eso ya pueden compilar y hacer todo lo que quieran con su IPX
espero que a alguien le sirva y no haberme olvidado de nada

salu2!