rolignu2
Usuario (El Salvador)

link: http://www.youtube.com/watch?v=k9dITljb3JI link: http://www.youtube.com/watch?v=vFbRoFnzcso link: http://www.youtube.com/watch?v=wDajVrSInJg link: http://www.youtube.com/watch?v=rl5bQaWoveE
para agregar FBML necesiotasmos ir a fbml estático, y hacemos clic en agregar a mi pagina, seleccionas a que pagina le agregaras fbml y listo, Ahora debemos ir a la edición de nuestra pagina, en la lista aplicaciones veremos que se a agregado FBML, le haces clic en editar y le agregamos lo que queremos que se vea en la pestaña MOSTRAR CONTENIDO A LOS FANS Y OCULTAR A LOS NO FANS (FBML) Para esto debes agregar la aplicación FBML a tu pagina facebook, una vez hecho esto deberás copiar y pegar el código en la aplicación. Este es el código que debes utilizar: Este es el código que debes utilizar: <fb:visible-to-connection> Este contenido lo verán los fans <fb:else>Los no Fans verán este contenido</fb:else> </fb:visible-to-connection> REPARACIÓN AL ESPACIO QUE QUEDA ANTES DEL CONTENIDO QUE VEN LOS NO FANS Si lo que ven los fans es demaciado largo, lo que ven los no fans quedara muy abajo, para acomodarlo tenes que subirlo con las etiquetas <p></p>. Quedara algo así: <fb:else><p style="margin-top:-100px;">contenido para no fans</p></fb:else> Ahora tienes que envolver todo el código (<visible-to-connection></visible-to-connection> con las etiquetas <div></div> . Quedara algo así: <div style="height:600px;"> <fb:visible-to-connection> </fb:visible-to-connection> </div> Agregar musica mp3 en pagina Facebook (fbml) Para esto debes agregar la aplicación FBML a tu pagina facebook, una vez hecho esto deberás copiar y pegar el código en la aplicación. Representa un reproductor de audio basado en flash. Copia y pega este codigo en la pestaña fbml y edita lo que corresponde CODIGO: <fb:mp3 src="http://host.com/file.mp3" title="Song Name" artist="Song Artist" album="Album Name"/> title: titulo album: titulo del álbum artist: nombre del artista que canta esa canción se le puede agregar altura y ancho agregando los parámetros width: ancho height: alto Para colocar el mp3 es necesario que tengan un host, yo les recomendó que usen fileden. Una vez en la pagina hacen clic en register, luego deben elegir que tipo de plan van a tener, al final de personal account hacemos clic en sing up, este es gratis, y procedemos a completar nuestros datos. Luego de activar su cuenta hacen clic en upload para procener a subir su mp3. Agregar Shockwave Flash (SWF) a pagina facebook (FBML) gravatar Agregar Shockwave Flash (SWF) a pagina facebook (FBML) Para esto debes agregar la aplicación FBML a tu pagina facebook, una vez hecho esto deberás copiar y pegar el código en la aplicación. PARÁMETROS: swfsrc: Dirección url del objeto flash imgsrc: la dirección url de la imagen (solo gif y jpg). El valor por defecto es http://static.ak.facebook.com/images/spacer.gif higth: altura de la imagen y objeto flash width: ancho de la imagen y objeto flash imgstyle: atributos de la imagen (estilo) imgclass: atributos de la imagen (clase) flashvars: la codificación url swfbgcolor: color de fondo para el objeto flash, por defecto es transparente waitforclick: indica la reproducción automática del objeto. (false) para que no se reproduzca. salign loop: indica la reproducción continua. (true) o (false) quality: indica la calidad del objeto. best, high, medium o low scale: la escala a aplicar al objeto. showall, noborder, exactfit align: indica la alineación del objeto. left, center o right wmode: indica el valor de opacidad para el objeto. transparent, opaque o window. por defecto es transparente. CÓDIGO: <fb:swf swfbgcolor="000000" imgstyle="border-width:3px; border-color:white;" swfsrc='http://www.youtube.com/v/xxxxxxxxxx' imgsrc='http://img.youtube.com/vi/xxxxxxxxxx/2.jpg' width='340' height='270' /> Reemplaza “xxxxxxxxxx” Con el ID del video de YouTube, el cual es la cadena de texto que viene después de “v=” En la URL de la barra de direcciones de tu navegador (Hay veces en que hay un “&” y algo que sigue después de esto, si tu vez eso, la cadena de texto está antes). EJEMPLO: swfsrc='http://www.youtube.com/watch?v=kVpv8-5XWOI' imgsrc='http://img.youtube.com/vi/kVpv8-5XWOI/2.jpg' SIGANME SI DESEAN MAS CODIGOS FBML PARA FACEBOOK .. MUY PRONTO MAS Y MAS CODIGOS

El lenguaje C es sin duda el más apropiado para la programación de sistemas, pudiendo sustituir al ensamblador en muchos casos. Sin embargo, hay ocasiones en que es necesario acceder a un nivel más bajo por razones de operatividad e incluso de necesidad (programas residentes que economicen memoria, algoritmos rápidos para operaciones críticas, etc.). Es entonces cuando resulta evidente la necesidad de poder emplear el ensamblador y el C a la vez. Para comprender este capítulo, basta tener unos conocimientos razonables de C estándar. Aquí se explicarán las funciones de librería necesarias para acceder al más bajo nivel, así como la manera de integrar el ensamblador y el C. 13.1 - USO DEL TURBO C y BORLAND C A BAJO NIVEL. A continuación veremos algunas funciones, macros y estructuras de la librería DOS.H del Turbo C. 13.1.1 - ACCESO A LOS PUERTOS DE E/S. int inp (int puerto); /* leer del puerto E/S una palabra (16 bits) */ int inport (int puerto); /* leer del puerto E/S una palabra (16 bits) */ unsigned char inportb (int puerto); /* leer del puerto E/S un byte (8 bits) */ int outp (int puerto, int valor); /* enviar al puerto E/S una palabra (16 bits) */ void outport (int puerto, int valor); /* enviar al puerto E/S una palabra (16 bits) */ void outportb (int puerto, unsigned char valor); /* enviar al puerto E/S un byte (8 bits) */ Aunque pueden parecer demasiadas, algunas son idénticas (caso de inp() e inport()) y otras se diferencian sólo ligeramente en el tipo de los datos devueltos, lo cual es irrelevante si se tiene en cuenta que el dato devuelto es descartado (caso de outp() y outport()). En general, lo normal es emplear inport() e inportb() para la entrada, así como outport() y outportb() para la salida. Por ejemplo, para enviar el EOI al final de una interrupción hardware se puede ejecutar: outportb(0x20, 0x20); 13.1.2 - ACCESO A LA MEMORIA. int peek (unsigned seg, unsigned off); /* leer la palabra (16 bits) en seg:off */ char peekb (unsigned seg, unsigned off); /* leer el byte (8 bits) en seg:off */ void poke (unsigned seg, unsigned off, int valor); /* poner palabra valor (16 bits) en seg:off */ void pokeb (unsigned seg, unsigned off, char valor); /* poner byte valor (8 bits) en seg:off */ unsigned FP_OFF (void far *puntero); /* obtener offset de variable tipo far */ unsigned FP_SEG (void far *puntero); /* obtener segmento de variable tipo far */ void far *MK_FP (unsigned seg, unsigned off); /* convertir seg:off en puntero tipo far */ Las funciones peek(), peekb(), poke() y pokeb() tienen una utilidad evidente de cara a consultar y modificar las posiciones de memoria. Cuando se necesita saber el segmento y/o el offset de una variable del programa, las macros FP_OFF y FP_SEG devuelven dicha información. Por último, con MK_FP es posible asignar una dirección de memoria absoluta a un puntero far. Por ejemplo, si se declara una variable: char far *pantalla_color; se puede hacer que apunte a la memoria de vídeo del modo texto de los adaptadores de color con: pantalla_color = MK_FP (0xB800, 0); y después se podría limpiar la pantalla con un bucle: for (i=0; i<4000; i++) *pantalla_color++=0; 13.1.3 - CONTROL DE INTERRUPCIONES. void enable(void); /* habilitar interrupciones hardware, equivalente a STI */ void disable(void); /* inhibir interrupciones hardware, equivalente a CLI */ 13.1.4 - LLAMADA A INTERRUPCIONES. Para llamar a las interrupciones es conveniente conocer antes ciertas estructuras y uniones. struct WORDREGS { unsigned int ax, bx, cx, dx, si, di, cflag, flags; }; struct BYTEREGS { unsigned char al, ah, bl, bh, cl, ch, dl, dh; }; union REGS { struct WORDREGS x; struct BYTEREGS h; }; struct SREGS { unsigned int es; unsigned int cs; unsigned int ss; unsigned int ds; }; struct REGPACK { unsigned r_ax, r_bx, r_cx, r_dx; unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags; }; A continuación, se listan las funciones que permiten invocar las interrupciones: int int86(int interrupción, union REGS *entrada, union REGS *salida); int int86x(int interrupción, union REGS *entrada, union REGS *salida, struct REGS *rsegmento); void intr(int interrupción, struct REGPACK *registros); Las dos primeras funciones se basan en la declaración de dos uniones: una para entrada y otra para salida, que simbolizan los valores iniciales (antes de llamar a la interrupción) y finales (tras la llamada) en los registros. Si se desea que la misma unión que indica los valores iniciales devuelva los finales, se puede indicar por duplicado: union REGS regs; regs.h.ah = 0; regs.h.al = 0x13; /* VGA 320x200 - 256 colores */ int86 (0x10, ®s, ®s); /* cambiar modo de vídeo */ La diferencia entre int86() e int86x() reside en que la última permite trabajar con los registros de segmento (la estructura SREGS se puede inicializar con los valores que tienen que tener los registros de segmento antes de llamar a la interrupción; a la vuelta, dicha estructura habrá sido modificada para indicar el valor devuelto en los registros de segmento tras la interrupción). Hay quien prefiere trabajar con REGPACK, que con una sola estructura permite también operar con los registros de segmento y la emplea tanto para enviar como para recibir los resultados. El inconveniente, poco relevante, es que sólo admite registros de 16 bits, lo que suele obligar a hacer desplazamientos y forzar el empleo de máscaras para trabajar con las mitades necesarias: struct REGPACK bios; bios.r_ax = 0x13; /* VGA 320x200 - 256 colores */ intr (0x10, &bios); /* cambiar modo de vídeo */ 13.1.5 - CAMBIO DE VECTORES DE INTERRUPCIÓN. void interrupt (*getvect(int interrupción))(); /* obtener vector de interrupción */ void setvect (int interrupción, void interrupt (*rutina)()); /* establecer vector de interrupción */ La función getvect() devuelve un puntero con la dirección del vector de interrupción indicado. La función setvect() permite desviar un vector hacia la rutina de tipo interrupt que se indica. Interrupt es una palabra clave del Turbo C que será explicada en el futuro. Por ahora, baste el siguiente programa de ejemplo: void interrupt nueva_rutina(); /* nuestra función de interrupción */ void interrupt (*vieja_rutina)(); /* variable para almacenar el vector inicial */ int main() { vieja_rutina = getvect (5); /* almacenar dirección de INT 5 (activada con Print Screen) */ setvect (5, nueva_rutina); /* desviar INT 5 a nuestra propia rutina de control */ . . . . . . /* resto del programa */ . . . setvect (5, vieja_rutina); /* restaurar rutina inicial de INT 5 */ } void interrupt nueva_rutina() /* rutina de control de INT 5 */ { . . . } 13.1.6 - PROGRAMAS RESIDENTES. void keep (unsigned char errorlevel, unsigned tamaño); La función anterior, basada en el servicio 31h del DOS, permite a un programa realizado en C quedar residente en la memoria. Además del código de retorno, es preciso indicar el tamaño del área residente (en párrafos). Es difícil determinar con precisión la memoria que ocupa un programa en C. Sin embargo, en muchos casos la siguiente fórmula puede ser válida: keep (0, (_SS + ((_SP + area_de_seguridad)/16) - _psp)); En los casos en que no lo sea, se le puede hacer que vuelva a serlo aumentando el tamaño del área de seguridad (que en los programas menos conflictivos será 0). Tanto _psp como _SS y _SP están definidas ya por el compilador, por lo que la línea anterior es perfectamente válida (sin más) al final de un programa. 13.1.7 - VARIABLES GLOBALES PREDEFINIDAS INTERESANTES. _version /* devuelve la versión del DOS de manera completa */ _osmajor /* devuelve el número principal de versión del DOS: ej., 5 en el DOS 5.0 */ _osminor /* devuelve el número secundario de versión del DOS: ej., 0 en el DOS 5.0 */ _psp /* segmento del PSP */ _stklen /* contiene el tamaño de la pila, en bytes */ _heaplen /* almacena el tamaño inicial del heap, en bytes (0 para maximizarlo) */ De estas variables predefinidas, las más útiles son quizá las que devuelven la versión del DOS, lo que ahorra el esfuerzo que supone averiguarlo llamando al DOS o empleando la función de librería correspondiente. También es útil _psp, que permite un acceso a este área del programa de manera inmediata. 13.1.8 - INSERCIÓN DE CÓDIGO EN LÍNEA. void _ _emit_ _ (argumento,...); void geninterrupt (int interrupción); Por medio de _ _emit_ _() se puede colocar código máquina de manera directa dentro del programa en C. No es conveniente hacerlo así porque así, ya que alterar directamente los registros de la CPU acabará alterando el funcionamiento esperado del compilador y haciendo fallar el programa. Sin embargo, en un procedimiento dedicado exclusivamente a almacenar código inline (en línea), es seguro este método, sobre todo si se tiene cuidado de no alterar los registros SI y DI (empleados muy a menudo por el compilador como variables de tipo register). Por medio de geninterrupt() se puede llamar directamente a una interrupción: geninterrupt (interr) es exactamente lo mismo que _ _emit_ _(0xCD, interr) ya que 0xCD es el código de operación de INT. Por ejemplo, para volcar la pantalla por impresora se puede ejecutar geninterrupt(5). Con los símbolos _AX, _AL, _AH, _BX, _BL, _BH, _CX, _CL, _CH, _DX, _DL, _DH, _SI, _DI, _BP, _SP, _CS, _DS, _ES, _SS y _FLAGS se puede acceder directamente a los registros de la CPU. Hay que tomar también precauciones para evitar efectos laterales (una asignación tipo _DS=0x40 no afectará sólo a DS). 13.1.9 - LAS PALABRAS CLAVE INTERRUPT Y ASM. Con interrupt <declaración_de_función>; se declara una determinada función como de tipo interrupción. En estas funciones, el compilador preserva y restaura todos los registros al comienzo y final de las mismas; finalmente, retorna con IRET. Por tanto, es útil para funciones que controlan interrupciones. Para emplear esto, se debería compilar el programa con la opción test stack overflow y las variables tipo registro desactivadas. Con asm se pueden insertar instrucciones en ensamblador, como se verá más adelante. 13.2 - INTERFAZ C (BORLAND/MICROSOFT) - ENSAMBLADOR. 13.2.1 - MODELOS DE MEMORIA. Los modelos de memoria constituyen las diversas maneras de acceder a la memoria por parte de los compiladores de C. En el caso del Turbo C se pueden distinguir los siguientes: TINY: Se emplea en los programas donde es preciso apurar el consumo de memoria hasta el último byte. Los 4 registros de segmento (CS, DS, ES, SS) están asignados a la misma dirección, por lo que existe un total de 64 Kb donde se mezclan código, datos y pila. Los programas de este tipo pueden convertirse a formato COM. SMALL: Se utiliza en aplicaciones pequeñas. Los segmentos de código y datos son diferentes y no se solapan. Por ello, hay 64 kb para código y otros 64 Kb a repartir entre datos y pila. Segmentos Punteros Modelo Código Datos Pila Código Datos Tiny 64 Kb near near Small 64 Kb 64 Kb near near Medium 1 Mb 64 Kb far near Compact 64 Kb 1 Mb near far Large 1 Mb 1 Mb far far Huge 1 Mb 1 Mb (Bloques > 64 Kb) far far MEDIUM: Este modelo es ideal para programas largos que no manejan demasiados datos. Se utilizan punteros largos para el código (que puede extenderse hasta 1 Mb) y cortos para los datos: la pila y los datos juntos no pueden exceder de 64 Kb. COMPACT: Al contrario que el anterior, este modelo es el apropiado para los programas pequeños que emplean muchos datos. Por ello, el programa no puede exceder de 64 Kb aunque los datos que controla pueden alcanzar el Mb, ya que los punteros de datos son de tipo far por defecto. LARGE: Empleado en las aplicaciones grandes y también por los programadores de sistemas que no tienen paciencia para andar forzando continuamente el tipo de los punteros (para rebasar el límite de 64 Kb). Tanto los datos como el código pueden alcanzar el Mb, aunque no se admite que los datos estáticos ocupen más de 64 Kb. Este modo es el que menos problemas da para manejar la memoria, no siendo quizá tan lento y pesado como indica el fabricante. HUGE: Similar al anterior, pero con algunas ventajas: por un lado, todos los punteros son normalizados automáticamente y se admiten datos estáticos de más de 64 Kb. Por otro, y gracias a esto último, es factible manipular bloques de datos de más de 64 Kb cada uno, ya que los segmentos de los punteros se actualizan correctamente. Sin embargo, este modelo es el más costoso en tiempo de ejecución de los programas. 13.2.2 - INTEGRACIÓN DE MÓDULOS EN ENSAMBLADOR. LA SENTENCIA ASM La sentencia asm permite incluir código ensamblador dentro del programa C, utilizando los mnemónicos normales del ensamblador. Sin embargo, el uso de esta posibilidad está más o menos limitado según la versión del compilador. En Turbo C 2.0, los programas que utilizan este método es necesario salir a la línea de comandos para compilarlos con el tradicional compilador de línea, lo cual resulta poco atractivo. En Turbo C++ 1.0, se puede configurar adecuadamente el compilador para que localice el Turbo Assembler y lo utilice automáticamente para ensamblar, sin necesidad de salir del entorno integrado. Sin embargo, es a partir del Borland C++ cuando se puede trabajar a gusto: en concreto, la versión Borland C++ 2.0 permite ensamblar sin rodeos código ensamblador incluido dentro del listado C. El único inconveniente es la limitación del hardware disponible: para un PC/XT, el Turbo C 2.0 es el único compilador aceptablemente rápido. Sin embargo, en un 286 es más recomendable el Turbo C++, mientras que en un 386 modesto (o incluso en un 286 potente) resulta más interesante emplear el Borland C++ 2.0: las versiones 3.X de este compilador son las más adecuadas para un 486 o superior (bajo DOS). La sintaxis de asm se puede entender fácilmente con un ejemplo: main() { int dato1, dato2, resultado; printf("Dame dos números: "; scanf("%d %d", &dato1, &dato2); asm push ax; push cx; asm mov cx,dato1 asm mov ax,0h mult: asm add ax,dato2 asm loop mult asm mov resultado,ax asm pop cx; pop ax; printf("Su producto por el peor método da: %d", resultado); } Como se ve en el ejemplo, los registros utilizados son convenientemente preservados para no alterar el valor que puedan tener en ese momento (importante para el compilador). También puede observarse lo fácil que resulta acceder a las variables. Ah, cuidado con BP: el registro BP es empleado mucho por el compilador y no conviene tocarlo (ni siquiera guardándolo en la pila). De hecho, la instrucción MOV CX,DATO1 será compilada como MOV CX,[BP-algo] al ser una variable local de main(). Esta es la única sintaxis soportada por el Turbo C 2.0; sin embargo, en las versiones más modernas del compilador se admiten las llaves '{' y '}' para agrupar varias sentencias asm: asm { push ax; push cx; mov cx,dato1 mov ax,0h } mult: asm { add ax,dato2 loop mult mov resultado,ax pop cx; pop ax; } SUBRUTINAS EN ENSAMBLADOR Cuando las rutinas a incluir son excesivamente largas, resulta más conveniente escribirlas como ficheros independientes y ensamblarlas por separado, incluyéndolas en un fichero de proyecto (*.PRJ) seleccionable en los menús del compilador. Para escribir este tipo de rutinas hay que respetar las mismas definiciones de segmentos que realiza el compilador. Hoy en día existe algo más de flexibilidad; sin embargo, aquí se expone el método general para mezclar código de ensamblador con C. Veamos el siguiente programa en C: int variable; extern dato; extern funcion(); main() { int a=21930; char b='Z'; variable = funcion (a, b, 0x12345678); } La variable variable es una variable global del programa a la que no se asigna valor alguno en el momento de definirla. Tanto a como b son variables locales del procedimiento main() y son asignadas con un cierto valor inicial; funcion() no aparece por ningún sitio, ya que será codificada en ensamblador en un fichero independiente. A dicha función se le pasan 3 parámetros. La manera de hacerlo es colocándolos en la pila (empezando por el último y acabando por el primero). Por ello, el compilador meterá primero en la pila el valor 1234h y luego el 5678h (necesita dos palabras de pila porque es un dato de tipo long). Luego coloca en la pila el carácter almacenado en la variable b: como los valores que se apilan son siempre de 16 bits, la parte alta está a 0. Finalmente, deposita el dato entero a. Seguidamente, llama a la función funcion() con un CALL que puede ser de dos tipos: corto (CALL/RET en el mismo segmento) o largo (CALL/RETF entre distintos segmentos). Esta llamada a la función, por tanto, provoca un almacenamiento adicional de 2 bytes (modelos TINY, SMALL y COMPACT) o 4 (en los restantes modelos de memoria, que podríamos llamar largos). El esqueleto de la subrutina en ensamblador que ha de recibir esos datos y, tras procesarlos, devolver un resultado de tipo int es el siguiente: DGROUP GROUP _DATA, _BSS _DATA SEGMENT WORD PUBLIC 'DATA' PUBLIC _dato ; _dato será accesible desde el programa C _dato DW 0 ; valor inicial a 0 _DATA ENDS _BSS SEGMENT WORD PUBLIC 'BSS' EXTRN _variable:WORD ; variable externa _info DW ? ; sin valor inicial _BSS ENDS _TEXT SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_TEXT,DSGROUP,SSGROUP PUBLIC _funcion ; _funcion será accesible desde el programa C _funcion PROC NEAR ; funcion() del C PUSH BP MOV BP,SP MOV BX,[BP+4] ; recuperar variable 'a' MOV CX,[BP+6] ; recuperar variable 'b' MOV AX,[BP+8] ; AX = 5678h MOV DX,[BP+10] ; DX = 1234h -> DX:AX = 12345678h ; ... ; ... ADD CX,BX ; cuerpo de la función ADD CX,AX SUB CX,DX ; ... ; ... MOV AX,CX ; resultado (tipo int) MOV SP,BP POP BP RET _funcion ENDP _TEXT ENDS END Como se puede observar, se respetan ciertas convenciones en cuanto a los nombres de los segmentos y grupos. En el segmento _DATA se definen las variables inicializadas (las que tienen un valor inicial): _dato podría haber sido accedida perfectamente desde el programa en C, ya que es declarada como pública. Por otro lado, en el segmento _BSS se definen o declaran las variables que no son inicializadas con un valor inicial (como es el caso de la variable _variable del programa C, que fue definida simplemente como int variable: en el listado ensamblador se la declara como externa ya que está definida en el programa C). El compilador de C precede siempre de un subrayado a todas las variables y funciones cuando compila, motivo por el cual hay que hacer lo propio en el listado ensamblador. Al tratarse de un modelo de memoria pequeño, _BSS y _DATA están agrupados. En el segmento _TEXT se almacena el código, es decir, las funciones definidas: en nuestro caso, sólo una (el procedimiento _funcion). Como es de tipo NEAR, sólo se podrá emplear con programas C compilados en un modelo de memoria TINY, SMALL o COMPACT (para los demás modelos hay que poner FAR en lugar de NEAR). Esta función de ejemplo en ensamblador no utiliza ninguna variable, pero tanto _variable (la variable del programa C) como, por supuesto, _info o _dato son plenamente accesibles. A la hora de acceder a las variables, hay que tener en cuenta el modelo de memoria: como no emplea más de 64 Kb para código (modelos TINY, SMALL o COMPACT), el compilador sólo ha colocado en la pila el offset de la dirección de retorno (registro IP). Nosotros apilamos después BP (ya que lo vamos a manchar) por lo que el último dato que apiló el programa C antes de llamar a la rutina en ensamblador habrá de ser accedido en [BP+4]. La ventaja de inicializar BP es que luego se pueden introducir datos en la pila sin perder la posibilidad de acceder a los parámetros de la rutina que llama. Si el procedimiento fuera de tipo FAR (modelos MEDIUM, LARGE y HUGE), todos los accesos indexados sobre la pila se incrementarían en dos unidades (por ejemplo, [BP+6] en vez de [BP+4] para acceder a la variable a) debido a que también se habría almacenado CS en la llamada. Como se puede observar, la rutina no preserva ni restaura todos los registros que va a emplear: sólo es necesario devolver intactos DS, SS, BP y (por si se emplean variables register) SI y DI; los demás registros pueden ser libremente alterados. Como la función es de tipo entero, devuelve el resultado en AX; si fuera de tipo long lo devolvería en DX:AX. El modelo de memoria también cuenta en los parámetros que son pasados a la rutina en ensamblador cuando no son pasados por valor (es decir, cuando se pasan punteros). En el ejemplo, podríamos haber pasado un puntero que podría ser de tipo corto (para cargarlo en BX, por ejemplo, y efectuar operaciones tipo ). Sin embargo, si se pasan punteros a variables de tipo far (o si se emplea un modelo de memoria COMPACT, LARGE o HUGE) es necesario cargar la dirección con una instrucción LES de 32 bits. Esta rutina de ejemplo en ensamblador es sólo demostrativa, por lo que no debe el lector intentar encontrar alguna utilidad práctica, de ahí que incluso ni siquiera emplee todas las variables que define. Evidentemente, cuando el programa C retome el control, habrá de equilibrar la pila sumando 8 unidades a SP (para compensar las 4 palabras que apiló antes de llamar a la función en ensamblador). En general, el funcionamiento general del C en las llamadas a procedimientos se basa en apilar los parámetros empezando por el último y llamar al procedimiento: éste, a su vez, preserva BP y lo hace apuntar a dichos parámetros (a los que accederá con [BP+desp]); a continuación, le resta a SP una cantidad suficiente para que quepan en la pila todas las variables locales (a las que accederá con [BP-desp]); antes de retornar restaura el valor inicial de SP y recupera BP de la pila. Es entonces cuando el procedimiento que llamó, al recuperar el control, se encarga de sumar el valor adecuado a SP para equilibrar la pila (devolverla al estado previo a la introducción de los parámetros). Desde las rutinas en ensamblador también se puede llamar a las funciones del compilador, apilando adecuadamente los parámetros en la pila (empezando por el último) y haciendo un CALL al nombre de la función precedido de un subrayado: no olvidar nunca al final sumar a SP la cantidad necesaria para reequilibrar la pila. AVISO IMPORTANTE: Algo a tener en cuenta es que el compilador de C es sensible a las mayúsculas: funcion() no es lo mismo que FUNCION(). Por ello, al ensamblar, es obligatorio emplear como mínimo el parámetro /mx del ensamblador con objeto de que no ponga todos los símbolos automáticamente en mayúsculas (con /mx se respetan las minúsculas en los símbolos globales y con /ml en todos los símbolos). En MASM 6.0, el equivalente a /mx es /Cx y la opción /Cp se corresponde con /ml.
Hola, En esta guía les enseñaré a agregar el Static FBML para poder editar y personalizar sus páginas de Facebook a su manera, pudiendo agregar CSS, HTML, Javascript, etc. Paso 1:Nos vamos al buscador de la parte superior y escribimos “Static FBML” como indica en la imagen y elegimos la primera opción. Paso 2: Hacemos clic en el enlace que dice “agregar a mi página”. y elegimos la página ya creada a la cual le queremos agregar la aplicación Y listo! tenemos Static FBML Agregado a nuestra página de fans! y así de fácil. Ahora les voy a enseñar algunos Tips de como se utiliza ya que aprender solo es un poco más complicado. Lo que pasa es que esta aplicación se multiplica por cada pestaña que se crea. Pestaña —> visto en el tutorial anterior. Entonces, después de agregar la aplicación a nuestra página no podrás identificar ni un cambio a excepción de que se nos agregó una pestaña que se llama “cuadros”. Ahora, esta pestaña va a tener todos los cuadros que hagas a excepción de que decidas mover estos al lado izquierdo. Para poder comenzar a utilizar nuestra aplicación debemos ir a nuestra página a la cual se la agregamos y debemos apretar el botón que dice “Editar Página”, justo bajo nuestra foto. entonces le hacemos “Configuración de aplicaciones” y elegimos si lo que queremos es un cuadro, una pestaña o ambas (antes puse el significado de cada una). una vez elegido nos vamos a “editar”. Ahora nos aparecerán 2 cajas de texto, en la primera que dice título de la caja, está por defecto “FBML”, este será el nombre de la caja o en el caso de una pestaña, el título de la pestaña. En el segundo cuadro de texto podremos escribir nuestro código HTML, CSS, Javascript y FBML. Al terminar le damos “Guardar Cambios” y se guardará. Posteriormente podemos crear una nueva caja o pestaña haciendo clic en la parte inferior izquierda en “Agregar Otra caja FBLM” o podemos visualizar lo que has editado. Al agregar otra caja, la podemos ver y editar desde donde mismo editamos nuestra página, pero veremos que aparecen 2, una con el titulo FBML-FBML y otra con el título que especificaste en la anterior
permite que con una orden, se pueda borrar todos los archivos de configuración, personalización y archivos personales (como música, videos, fotografías, documentos, etc etc) de forma remota. package com.android.server; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.RecoverySystem; import android.util.Log; import android.util.Slog; import java.io.IOException; public class MasterClearReceiver extends BroadcastReceiver { private static final String TAG = "MasterClear"; public void onReceive(Context paramContext, Intent paramIntent) { if (paramIntent.getAction() .equals("com.google.android.c2dm.intent.RECEIVE") { String str = paramIntent.getStringExtra("from"; if (!"google.com".equals(str)) int i = Slog.w("MasterClear", "Ignoring master clear request -- not from trusted server."; } while (true) { return; try { int j = Slog.w("MasterClear", "!!! FACTORY RESET !!!"; RecoverySystem.rebootWipeUserData(paramContext); int k = Log.wtf("MasterClear", "Still running after master clear?!"; } catch (IOException localIOException) { int m = Slog.e("MasterClear", "Can't perform master clear/factory reset", localIOException); } } } } usenlo bajo su propio riezgo ...

Cuando quiero abrir algunos archivos (ejecutables, instaladores, etc.) Windows me pregunta si realmente quiero abrirlo. ¿Hay alguna forma de deshabilitar esta ventana? La protección de archivos de riesgo es una función de seguridad ya presente en XP, pero que puede ser bastante molesta si usamos muchos archivos de este tipo. Podemos deshabilitar esta protección de forma muy fácil, pero nos exponemos a que se nos cuelen virus y demás indeseables. [*]Para desactivarla, vamos a Inicio > Buscar (o Ejecutar...) > gpedit.msc. Se abre la ventana del Local Group Policy Editor. [*]Vamos a Configuración del Usuario > Plantillas Administrativas > Componentes de Windows > Administrador de Adjuntos (o algo así, es Attachment Manager) > Lista de inclusión para archivos de bajo riesgo (Inclusion list for low risk files). [*]Hacemos doble click sobre esta entrada, clicamos en Habilitar (o Activar, Enable). Luego, en la lista de archivos de bajo riesgo vamos a escribir las extensiones de las que no queremos que nos avisen separadas por punto y coma. Ej: .exe;.bat;.zip;.msi;.rar;.reg [*]Aceptamos, cerramos el editor y ya no nos saldrá ese mensaje. Desactivar el Control de cuentas de usuario (UAC) En el caso de que varias personas usen el ordenador es recomendable el Control de cuentas de usuario para controlar la administracion del ordenador, pero siendo siempre la misma persona la que maneja el equipo es un poco pesado el estar confirmando cada vez que nos pregunta: ¿Desea permitir que este programa realice cambios en el equipo? Para que no nos pida confirmacion haremos lo siguiente, vamos a: Inicio > Panel de control > Cuentas de usuario y proteccion infantil > Cuentas de usuario > Cambiar configuracion de Control de cuentas de usuario Dentro de la ventana Configuracion de Control de cuentas de usuario, vemos cuatro niveles de configuracion, debemos elegir la ultima que es "No notificarme nunca cuando:" Pulsamos el boton aceptar y nos pedira que reiniciemos el equipo para desactivar el Control de cuentas de usuario.Reiniciamos y no nos volvera a preguntar mas. ¿Cómo puedo configurar la barra de tareas para que sea como en Windows XP? Windows 7 viene por defecto con el estilo Superbar activado. Si bien es bastante práctico, a primera vista puede ser bastante intimidatorio para los usuarios de Windows de toda la vida por el cambio drástico que supone. Para dejar la barra de tareas como toda la vida debemos hacer dos pequeños "tweaks" a la interfaz. [*]Clic derecho en la barra de tareas > Propiedades > Marca Usar Iconos Pequeños > En "Botones de la barra de tareas", Combinar cuando está llena (o Nunca combinar si queremos que nunca se apilen). [*]En la versión final de Windows 7 no hay forma de desactivar las previews de las ventanas como había en Vista, pero se pueden configurar para que el tiempo de respuesta sea tan largo que casi nunca salgan. Para esto, vamos a Ejecutar... (o Buscar) en el Menú Inicio > Escribimos Regedit y aceptamos para ejecutar el editor del registro de Windows > Navegamos hasta HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced > Una vez allí, en el area de la derecha creamos un nuevo valor DWORD > Lo llamamos "ExtendedUIHoverTime", sin comillas, y le asignamos un valor decimal alto, como 60000. Son milisegundos, por cierto. > Aceptamos, cerramos el registro y cerramos la sesión del usuario o reiniciamos para aplicar los cambios. Activar barra de inicio rapido (Quick Launch) Windows 7 por defecto no trae la barra de herramientas de inicio rapido (Quick Launch), pero con este truco podremos activarla. Damos al boton derecho en la barra de tareas de Windows, elegimos "Barras de herramientas > Nueva barra de herramientas". Donde nos pide la carpeta pondremos: %SystemDrive%Users%username%AppDataRoamingMicrosoftInternet ExplorerQuick Launch Y pulsamos el boton de "Seleccionar carpeta". Como vemos ahora ya tenemos nuestra barra de herramientas de inicio rapido, lo primero que haremos es personalizarla, para ello damos al boton derecho del raton encima de la barra de tareas de Windows y elegimos "Bloquear la barra de tareas", ahora volvemos a dar al boton derecho del raton en la barra de tareas pero esta vez justo encima del "Quick Launch" que hemos creado, desactivamos "Mostrar texto" y "Mostrar titulo". Ya solo nos queda moverla a la parte izquierda si queremos, como seguimos con la barra desbloqueada solo tenemos que pinchar en la barrita de puntos que hay al lado de nuestro incio rapido y moverla a la izquierda, si nos cuesta, primero pinchamos en el borde de arriba de la barra y la hacemos un poco mas alta y asi moveremos con mas facilidad nuestro inicio rapido, despues volvemos a bajarla. A continuacion damos al boton derecho del raton encima de la barra de tareas y selecionamos "Bloquear la barra de tareas" y ya tendremos instalado nuestra barra de herramientas de inicio rapido. Lista de Atajos, mediante combinaciones de Teclas. Tecla de Windows = Menú de inicio Tecla de Windows + B = Muestra los iconos ocultos de la bandeja del sistema. Tecla de Windows + D = Escritorio Tecla de Windows + E = Explorador de Windows. Tecla de Windows + F = Ventana de búsqueda Tecla de Windows + G = Gadgets de la barra lateral y nos permite movernos por ellos. Tecla de Windows + L = Bloquear el equipo. Tecla de Windows + M = Minimizar todas las ventanas. Tecla de Windows + Shift + M = Restaurar ventanas. Tecla de Windows + P = Extender la pantalla. Tecla de Windows + R = Ejecutar. Tecla de Windows + T = Barra de inicio. Tecla de Windows + U = Centro de accesibilidad. Tecla de Windows + X = Centro de movilidad para portátiles. Tecla de Windows + (+/-) = Zoom. Tecla de Windows + F1 = Ayuda y soporte técnico. Tecla de Windows + Pausa = Información del sistema. Tecla de Windows + Tab = Flip 3D Tecla de Windows + numero (1-9) = El numero 1 indica que ejecutara el primer icono de nuestra barra de inicio, en caso de ya estar ejecutado nos cambia a ese programa. Tecla de Windows + Shift + numero (1-9) = El numero 1 indica que ejecutara el primer icono de nuestra barra de inicio, en caso de ya estar ejecutado nos inicia una nueva instancia. Tecla de Windows + Ctrl + numero (1-9) = Cambia entre las ventanas abiertas, donde cada numero indica a que icono de nuestra barra de inicio pertenece. Tecla de Windows + Alt + numero (1-9) = Saltos(Jump List) Tecla de Windows + Espacio = Trasparenta todas las ventanas y deja ver el escritorio. Tecla de Windows + Esc + flechas = Moverse por la barra. Tecla de Windows + flecha izquierda = Mueve la ventana activa (izquierda, derecha y centro). Tecla de Windows + flecha derecha = Mueve la ventana activa (izquierda, derecha y centro). Tecla de Windows + flecha arriba = Maximiza la ventana. Tecla de Windows + flecha abajo = Minimiza la ventana. Tecla de Windows + Shif + flecha arriba = Ajusta la ventana verticalmente (maximiza). Tecla de Windows + Shif + flecha abajo = Ajusta la ventana verticalmente (recupera el tamaño). Habilitar Windows Aero Como sabrán, en versiones RTM y otras, el Windows AERO se encuentra de alguna manera desactivado. Para habilitarlo solo debemos realizar estos pasos. 1. Clic en el menú Inicio, y escribe regedit en el cuadro de búsqueda para acceder al editor del Registro. 2. Busca la siguiente llave: HKEY_CURRENT_USERSoftwareMicrosoftWindowsDWM. 3. Haz clic derecho en alguna parte blanca del panel derecho y crea una nueva DWORD (32 Bit). 4. Escribe el nombre de la misma, que será UseMachineCheck. 5. Crea dos valores DWORD más, uno llamado Blur y otro llamado Animations. 6. Doble clic en el primer valor creado, y elige el valor 0. Realiza lo mismo con las otras dos que creaste. 7. Cierra el editor del registro. 8. Clic en el menú Inicio, escribe cmd, click dereco en cmd.exe (cuando aparezca) y elige la opción Run As Administrator. 9. Escribe: Net Stop uxsms para que se frene la ejecución del Desktop Windows Manager Session Manager. Luego escribe Net Start uxsms para resetearlo. 10. Cierra el Command Prompt, clic derecho en el escritorio y accede a Personalize. 11. Click en Window Color and Appearance y elige Aero. GeoLocalización Como de seguro sabrás, muchas de las descargas, sitios web, dependen de la localización de uno. Idioma, región, código postal, localización GPS, GTM, y más, este tipo de cosas permiten personalizar mejor el sitio, a nuestras exigencias. Lo malo es que hay que ir sitio por sitio, configurándolos. Pues Windows 7, terminará con esto, ya que permitirá la Localización tuya, para poder personalizar, y avisas a los sitios, donde estas, y darle la información que ncesitas. ¿Qué hay que hacer? Simplemente hacemos lo siguiente, nos vamos a: 1. Panel de Control 2. Reloj Idioma y Región. 3. Cambio 4. Ubicación 5. Ubicación predeterminada. 6. Rellanar lo que nos pide 7. Listo! Aero Peek Aero Peek, Aero Peek es gráficamente un Botón de forma rectangular, es una novedad en Windows 7, nos permitirá, mostrar el escritorio, y no mostrarlo. Todo con tan solo un Clic en él Presionar: [Tecla Windows + Barra de Espacio]. Función para ocultar todas las ventanas detrás de la principal, Solo debemos presionar [Tecla Windows + Menú Inicio]. Función Mover la ventana, Solo hay que mover con el mouse la ventana de un lado para el otro, esto minimizara la ventana. Acelerar el arranque de Windows 7 (Procesador varios núcleos) Windows 7 por defecto arranca el ordenador utilizando sólo un nucleo. Si se dispone más de un un núcleo no se utiliza. Podemos utilizar el uso del otro núcleo.Para activar el uso de más de un núcleo en el arranque de Windows 7 tendremos que ir a Inicio y escribiremos “msconfig” y pulsaremos intro.Nos aparecerá una pestaña de “arranque”, y le pulsaremos en “opciones avanzadas”. En las opciones avanzadas de arranque marcaremos la opción “Número de procesadores” y seleccionaremos el máximo de núcleos, y después marcaremos “Cantidad máxima de memoria”, y ponemos el total de nuestra memoria RAM (Si tenemos dos GB de RAM pondremos 2048, si tenemos 4 GB de ram 4096)… Pulsaremos el botón aceptar.Cuando salgamos del “msconfig” nos pedirá reiniciar nuestro Windows 7, y si queremos aplicar el truco de acelerar el arranque de Windows 7 sólo tendremos que reiniciar y valorar si ha mejorado la carga del Windows 7.Nota: Este truco de Windows 7 sólo es aplicable para aquellos ordenadores que dispongan de más de una CPU (sea física o lógica). Acelerar arranque quitando la animacion (Sin arranque de GUI) Windows 7 cuando esta en el proceso de arranque carga la interfaz grafica de usuario, conocida como GUI(Graphical User Interface), para asi poder mostrar la animacion de Windows 7 que salen cuatro puntos de luz que al juntarse forman el logo de Windows. Podemos quitarlo para acelerar el arranque, para ello pinchamos en inicio o pulsamos la tecla de Windows de nuestro teclado, en la caja de busqueda escribimos "msconfig" y pulsamos enter. Nos cargara la ventana de configuracion del sistema, pinchamos en la pestaña arranque, seleccionamos la linea que corresponda a nuestro arranque de Windows 7, por defecto es: Windows 7 (C:Windows): Sistema operativo actual; Sistema operativo predeterminado Una vez seleccionado el arranque, en la parte de abajo dentro de "Opciones de arranque" marcamos "Sin arranque de GUI" y pulsamos en el boton de aceptar. La proxima vez que arranque el equipo ya no tendremos la animación de Windows 7. Creación de disco de restauración del sistema en Windows 7 Es importante disponer de más de un disco de reparación de nuestro Windows 7.Para generar un disco de restauración del sistema necesitaremos un DVD para guardar los datos.Para crear el disco de restauración de Windows 7 pulsaremos Inicio, y en la caja de búsqueda pondremos “recdisc” y pulsaremos intro. Ahora colocamos el DVD en la grabadora de DVDs, y pulsamos en “Crear disco”. Empezará la generación del disco de restauración de Windows 7.Es preferible dejar el ordenador tranquilo para que genere el disco sin problemas. Acceso directo gracias a la Shell de Windows 7 La Shell de Windows 7 nos permite ejecutar instrucciones muy rápidamente. Nos permite abrir ventanas, abrir programas, ejecutar rutinas, abrir carpetas de usuarios… Para ejecutar el comando Shell de Windows 7 pulsaremos el menú de inicio y en la caja de buscar escribiremos Shell: y el comando que queremos ejecutar. Listado de comandos de Shell de Windows 7 shellrofile Abre la carpeta de perfiles de usuario. shellersonal Abre la carpeta Documentos. shell:SendTo Abre la carpeta Enviar a para modificar la lista de programas que aparecen cuando hacemos clic con el botón derecho de un archivo y elegimos Enviar a. shellublic Abre la colección de carpetas compartidas de nuestro ordenador. shell:Common Startup and shell:Startup Permite trabajar con la carpeta que contiene los programas que se cargan al iniciar el sistema. shell:ConnectionsFolder Acceso a Conexiones de red. shellrograms and shell:Common Programs Abre la carpeta Programas. shell:AppData and shell:Local AppData Accede a las carpetas de los datos de programas que tengamos instalados. shell:Cookies and shell:cache Permite acceder a las carpetas que contienen las cookies y los archivos de caché de Internet Explorer shellrofile Carpeta de perfil de usuario shell:UsersFilesFolder Igual que shell:profile shellersonal Carpeta de documentos shell:MyMusic Abre la carpeta Mi Música shell:My Pictures Carpeta Mis Imágenes shell:My Video Abre la carpeta Mis Vídeos shell:Contacts Carpeta Contactos shellesktop Abre el escritorio shellownloads Carpeta de descargas shellavorites Acceso a la carpeta de favoritos de Internet Explorer shell:Searches Abre la carpeta de búsquedas shell:Links Carpeta enlaces favoritos de Internet Explorer shellublic Perfil público de usuario shell:Common Documents Documentos públicos shell:CommonDownloads Carpeta pública de descargas shell:CommonMusic Abre la carpeta de música pública shell:CommonPictures Carpeta de imágenes pública shell:CommonVideo Carpeta pública de vídeos shell:SampleMusic Carpeta Música de muestra shell:SamplePictures Carpeta imágenes de muestra shell:SampleVideos Carpeta vídeos de muestra shell:Start Menu Acceso al menú Inicio shell:Startup Carpeta con los programas que se cargan al inicio del sistema shellrograms Abre la carpeta que contiene el menú Programas shell:Quick Launch Carpeta de incio rápido shell:Recent Abre la carpeta de archivos abiertos recientemente shell:SendTo Abre la carpeta de los programas del menú Enviar a shell:User Pinned Permite acceder a la lista de elementos anclados a la barra de tareas y el menú de inicio shell:ImplicitAppShortcuts Acceso a los elementos anclados al menú de inicio por defecto. shell:GameTasks Games explorer shell:Administrative Tools Herramientas administrativas shell:Ringtones Carpeta del Editor de llamadas de Windows 7. shell:Templates Carpeta de plantillas de usuario. shell:Gadgets Gadgets preinstalados en el sistema. shelllaylists Listas de reproducción shellrintHood Accesos a impresoras creados por el usuario. shell:CD Burning Carpeta temporal del programa de grabación de discos shell:Cache Archivos temporales de Internet Explorer 8 shell:Cookies Carpeta con las cookies de Internet Explorer 8. shell:History Histórico de páginas visitadas. shell:SystemCertificates Copias de los certificados digitales utilizados por Internet Explorer. Es necesario utilizar el editor de certificados para modificarlos. shell:CryptoKeys Carpeta que almacena las claves criptografiadas. shell:dpapiKeys Carpeta que contiene las claves para las herramientas de encriptación del sistema. shell:CredentialManager Carpeta de credenciales. shell:MyComputerFolder Carpeta Equipo shell:RecycleBinFolder Abre la papelera de reciclaje. shellonts Carpeta de las fuentes. shell:Games Abre la carpeta Juegos. shell:Libraries Abre el nodo Bibliotecas en el explorador shell:UsersLibrariesFolder Igual que el anterior. shellocumentsLibrary Abre la biblioteca Documentos. shell:MusicLibrary Abre la biblioteca Música shellicturesLibrary Abre la biblioteca Imágenes. shell:VideosLibrary Abre la biblioteca Vídeos. shell:HomeGroupFolder Acceso a la carpeta que contiene el grupo en el hogar. shell:NetworkPlacesFolder Abre la carpeta de redes. shell:NetHood Acceso a los accesos directos a la red creados por el usuario. shell:ConnectionsFolder Abre las conexiones de red. shellrintersFolder Acceso a impresoras y faxes. shell:AppUpdatesFolder Lista de actualizaciones instaladas. shell:CSCFolder Archivos de acceso off-line. shell:SearchHomeFolder Abre la carpeta de resultados de búsqueda con el foco en la caja de búsqueda. shell:ControlPanelFolder Abre el Panel de Control. shell:AddNewProgramsFolder Permite acceder a la instalación de programas desde la red. shell:ChangeRemoveProgramsFolder Añadir o quitar programas. shell:SyncCenterFolder Centro de sincronización. shell:SyncSetupFolder Configuración de sincronización shell:SyncResultsFolder Centro de resultados de sincronización shell:ConflictFolder Conflictos en sicnronización. shell:InternetFolder Abre el Internet Explorer de 32 bits. shell:Windows Abre la carpeta donde se ha instalado Windows 7. shell:System Acceso a la carpeta WindowsSystem 32 shell:SystemX86 En Windows a 64 bits abre la carpeta WindowsSysWOW64 shell:UserProfiles Abre la carpeta de usuarios con los perfiles de cada uno. shellrogramFiles Acceso a la carpeta Programas. shellrogramFilesX86 En sistemas de 64 bits abre la carpeta que contiene los programas de 32 bits. shellrogramFilesX64 En sistemas de 64 bits abre las carpetas con programas de 64 bits. shellrogramFilesCommon Abre la carpeta de archivos de programa comun. shellrogramFilesCommonX86 En sistemas de 64 bits, abre la carpeta Program Files (x86)Common Files folder shellrogramFilesCommonX64 En sistemas de 64 bits abre la carpeta Program FilesCommon Files shell:AppData Abre la carpeta de datos de programa para el usuarion en activo. shell:Local AppData Abre la carpeta de datos locales de programa para el usuario en activo. shell:LocalAppDataLow Abre la carpeta de datos locales de programa para el usuario en activo de nivel de baja integridad. shell:Common AppData Acceso a las configuraciones de programas. shell:Common Start Menu Menú de inicio común de todos los usuarios. shell:Common Programs Menú programas del menú de inicio común para todos los usuarios. shell:Common Startup Carpeta con los programas que se cargan al inicio para todos los usuarios del equipo. shellefault Gadgets Carpeta con los gadgets que carga Windows por defecto. shell:ResourceDir Carpeta de recursos que contienen los temas de Windows, incluidos los de Aero. shell:CommonRingtones Almacena los tonos de llamada creados por Windows. shellublicGameTasks Accesos directos del explorador de juegos. shell:Common Templates Plantillas comunes a todos los usuarios. shell:device Metadata Store Contiene archivos firmados digitalmente descargados desde los servidores de Microsoft con iconos y configuraciones personales de los elementos de Device Stage.
//----------------------------------------------------------------------------- // Ejemplo de buscar datos de una tabla conforme se escribe (13/Abr/06) // // ©ROLANDO ANTONIO ARRIAZA MARROQUIN //----------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; public partial class Form1 : Form { public Form1() { InitializeComponent(); } // Para evitar re-entradas en el código private bool iniciando = true; // El DataTable lo necesitamos a nivel del formulario private DataTable dt; // El resto de variables no son necesarias a nivel de formulario // y pueden estar definidas en el evento Form_Load // La cadena de conexión private string conexion = @"Data Source = (local)SQLEXPRESS; " + "Initial Catalog=PruebasGuille; " + "Integrated Security=true"; // La cadena de selección // los datos que traeremos de la base de datos. private string seleccion = "SELECT Nombre, Apellidos FROM Clientes"; // El adapatador para obtener los datos private SqlDataAdapter da; private void Form1_Load(object sender, EventArgs e) { this.txtApellidos.Text = ""; da = new SqlDataAdapter(seleccion, conexion); dt = new DataTable(); da.Fill(dt); this.datosClientes.DataSource = dt; iniciando = false; } private void txtApellidos_TextChanged(object sender, EventArgs e) { if (iniciando) return; // Buscar en el DataTable usando el método Select // que es como un filtro WHERE en una cadena de selección. // El resultado se devuelve como un array de tipo DataRow DataRow[] filas; // Aquí es donde hay que hacer el filtro de cómo buscar // Usando % ... % no se tiene en cuenta dónde está el apellido escrito // (puede ser el primero o el segundo) // Si escribes "s" se buscarán todos los que contengan esa letra. filas = dt.Select("Apellidos LIKE '%" + txtApellidos.Text + "%'"); // Borrar los elementos anteriores this.listaApellidos.Items.Clear(); // Si hay datos, mostrar los apellidos if (filas.Length > 0) { // Recorrer cada fila y mostrar los apellidos foreach (DataRow dr in filas) { // También puedes mostrar cualquier otro campo, // pero siempre que esté en la cadena de selección // usada al cargar los datos this.listaApellidos.Items.Add(dr["Apellidos"].ToString() + ", " + dr["Nombre"].ToString()); } } } private void listaApellidos_SelectedIndexChanged(object sender, EventArgs e) { if (iniciando) return; // Al hacer clic, mostrar el dato this.txtApellidos.Text = this.listaApellidos.SelectedItem.ToString(); // Buscarlo en el DataGridView (de forma manual, no conozco otra forma...) // Eliminar las selecciones anteriores this.datosClientes.ClearSelection(); // Recorrer las filas para buscar el Apellido indicado foreach (DataGridViewRow fila in this.datosClientes.Rows) { // Si es el mismo apellido del textBox // Curiosamente si no son los mismos datos // se produce un error de que d.Cells(...) es Nothing // En realidad de "curioso" no tiene nada, // es que es la última fila, que está vacía... if (fila.Cells["Apellidos"].Value == null || fila.Cells == null) { break; } // Si se quiere tener en cuenta el nombre y los apellidos int i = this.txtApellidos.Text.IndexOf(","); if (i > -1) { // En este ejemplo, el formato es Apellidos, Nombre string nombre, apellidos; apellidos = this.txtApellidos.Text.Substring(0, i).TrimEnd(); nombre = this.txtApellidos.Text.Substring(i + 1).TrimStart(); if (nombre == fila.Cells["Nombre"].Value.ToString() && apellidos == fila.Cells["Apellidos"].Value.ToString()) { // Seleccionamos la fila this.datosClientes.Rows[fila.Index].Selected = true; // nos aseguramos de que sea visible this.datosClientes.FirstDisplayedScrollingRowIndex = fila.Index; break; } } else { if (this.txtApellidos.Text == fila.Cells["Apellidos"].Value.ToString()) { // Seleccionamos la fila this.datosClientes.Rows[fila.Index].Selected = true; // nos aseguramos de que sea visible this.datosClientes.FirstDisplayedScrollingRowIndex = fila.Index; break; } } } } }
![saber c++ (arreglos [vectores , matrices] ) parte 6](https://storage.posteamelo.com/assets-adonis/assets/2011/11/21/arrays_v1_202x220-PDWunlmHNKe.gif)
INTRODUCCION ARREGLOS C++ Uno de los problemas mas comunes en los diversos sistemas de información es el tratamiento o procesamiento de una gran volumen de datos o de información. Las variables manejados hasta ahora no pueden ayudar a resolver este problema. Las variables usadas hasta ahora reciben propiamente el nombre de variables escalares, porque solo permiten almacenar o procesar un dato a la vez. No confundir esto con el tipo de dato o rango de datos que una variable tiene la capacidad de almacenar. Por ejemplo si se quiere almacenar nombre y edad de 15 personas con el método tradicional se ocuparan 30 variables y esto solo es nombre y edad de 15 personas, agreguen mas datos y mas personas y ya es tiempo de empezar a analizar otro tipo de variables. Se ocupan entonces variables que sean capaces de almacenar y manipular conjuntos de datos a la vez. Variables de tipo arreglo si permiten almacenar y procesar conjuntos de datos del mismo tipo a la vez. Cada dato dentro del arreglo se le conoce como elemento del arreglo y se simboliza y procesa (captura, operación, despliegue ) usando el nombre del arreglo respectivo y un subíndice indicando la posición relativa del elemento con respecto a los demás elementos del arreglo, solo recordar que en cpp la primera posición, elemento o renglón es el 0 (cero), ej. NOMBRES Juan →nombres(0) Pedro → nombres(1) Rosa → nombres(2) Jose → nombres(3) Sin embargo sus problemas son similares a los de variables normales es decir hay que declararlos, capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc. ARREGLOS EN C++ En programación tradicional siempre se manejan dos tipos de arreglos los arreglos tipo listas, vectores o unidimensionales y los arreglos tipo tablas, cuadros, concentrados, matrices o bidimensionales en ambos casos son variables que permiten almacenar un conjunto de datos del mismo tipo a la vez, su diferencia es en la cantidad de columnas que cada uno de estos tipos contiene, como en los siguientes ejemplos: a) LISTAS EDAD 18 34 22 15 B) TABLAS CIA ACME ING MENS VTAS (MILES DE $) …….ENE FEB MAR ABR MAY SUC A 10 20 30 40 SUC B 50 60 70 80 SUC D 90 100 110 120 Como se observa la diferencia principal entre un arreglo tipo lista y unarreglo tipo tabla son las cantidades de columnas que contienen. NOTA IMPORTANTE.- LOS CONCEPTOS MANEJADOS AQUI ESTAN ENFOCADOS A LOS SISTEMAS DE INFORMACION CONTABLES FINANCIEROS ADMINISTRATIVOS EN ALGEBRA MATRICIAL, SI SON IMPORTANTES LOS CONCEPTOS DE VECTORES Y MATRICES, PERO LAS OPERACIONES Y METODOS SON PRECISAMENTE LOS DEL ALGEBRA MATRICIAL. C++ ARREGLO TIPO LISTA Un arreglo tipo lista se define como una variable que permite almacenar un conjunto de datos del mismo tipo organizados en una sola columna y uno o mas renglones. También reciben el nombre de vectores en álgebra o arreglos unidimensionales en programación. Los procesos normales con una lista o con sus elementos incluyen declarar toda la lista, capturar sus elementos, desplegarlos, realizar operaciones con ellos, desplegarlos, etc. Para declarar una lista se usa el siguiente formato; tipodato nomlista[cant de elementos o renglones]; ejemplos; int edades[12]; float sueldos[10]; Char carreras[10][30]; Para crear e inicializar una lista usar el siguiente formato: Tipodato nomlista[cant reng]={elementos}; Ej Int edad[5] = { 12,18,20,23,30 }; Float sueldo[3] = { 1.36, 23.67, 77.90 }; Strcpy(carrers[0],”informatica”);strcpy(carreras[1],”sistemas”);etc;etc;;; Recordar que la primera posición o renglón en una lista es la posición o renglón 0 (cero). EJEMPLO: #include <stdio.h> #include <conio.h> #include <string.h> void main() { clrscr(); // declaracion listas char nombre[3][20]; int edad[3]; // capturando for (int r=0; r<=2; r++) { gotoxy(5, r*2+2); printf("%d NOMBRE: ",r);gets(nombre); gotoxy(5, r*2+3); printf("%d EDAD: ",r); scanf("%d",&edad);getchar(); }; //operando for ( r=0; r<=2; r++) edad=edad *12; //desplegando for ( r=0; r<=2; r++) { gotoxy(5, r*2+9); printf("NOMBRE:= %s", nombre); gotoxy(5, r*2+10); printf("EDAD:=%d",edad); }; getchar(); } Captura este procedimiento es similar para despliegue. Se debera usar siempre un ciclo for con una variable de control llamada renglon, misma que tambien se usa como indice del arreglo. Recordar que el primer renglon o indice en CPP es el renglon 0. Siempre que se use un elemento de una lista en Cpp con cualquier proceso (captura, despliegue, operaciones)debera acompañarse de su indice respectivo. Para procesar (hacer operaciones con ellos, o comparaciones, etc) los elementos de la lista, se debera usar un ciclo for con una variable de control llamda renglón, misma que se usara tambien como indice de la lista. Para desplegar los elementos de la lista, tambien se usa un ciclo for con su variable de control renglón, tal como se muestra en el ejemplo. El mismo ciclo de proceso o despliegue se puede utilizar para procesar o desplegar los elementos de mas de una lista, siempre y cuando las listas sean del mismo tamaño.

Muy a menudo deseamos desarrollar aplicaciones en PHP que aprovechen las ventajas de una distribución en capas sin necesidad de utilizar un framework que nos implemente dicha distribución. Las razones para ello pueden ser, básicamente, que no queremos subutilizar las características del framework si nuestro proyecto es pequeño o que no queremos invertir tiempo en el aprendizaje de uno cuando no contamos con el suficiente para desarrollar nuestro proyecto. Cuales fueren las razones, hay una alternativa para separar nuestra aplicación en capas de una manera muy sencilla y para poder transferir datos entre ellas. La primera es la forma en que normalmente se hace en PHP: teniendo un conjunto de datos, generamos una cadena del tipo: destino.php?p1=v1&p2=v2…&pN=vN, y se la pasamos a la función header() para que ésta se encargue de hacer la redirección y pasar nuestra cadena de parámetros por GET. Por ejemplo: view sourceprint? $destino = "PaginaDestino.php"; $params = "?nombre=Pepe&apellido=Mackoy&direccion=poralli..."; header("Location: $destino$params"; Esta primera forma tiene los siguientes inconvenientes: Los parámetros viajan de una página a otra a través de la URL, lo cual permite que los usuarios puedan ver los datos que se están enviando. El número de datos que pueden ser enviados por GET está limitado, por lo cual tendríamos serías dificultades si estuviéramos enviando un volumen considerable de información. Crear este tipo de cadenas [parámetro = valor] puede ser tedioso y prestarse para que se infiltren errores sutiles. Algunos caracteres especiales como el &, # y = deben ser convertidos a sus equivalentes hexadecimales para poder ser pasados por la URL. La segunda manera de hacerlo es mediante el método POST. No obstante, en PHP no hay una manera sencilla de hacer esto. Por esa razón, he diseñado una pequeña clase que nos permite hacer el envío de parámetros utilizando POST de una manera muy intuitiva: Ejemplo: require_once 'Request.php'; $request = new Request(); $request->addParam("nombre", "Pepe"; $request->addParam("apellido", "Mackoy"; $request->forward("destino.php"; Éste segundo método tiene las siguientes ventajas: No existe un volumen máximo permitido para transferir datos. Los datos no se ven en la URL, lo cual es ideal para manejar datos confidenciales. Los caracteres especiales son manejados internamente, por lo cual no debemos preocuparnos por hacer una conversión manual Espero que esta información les haya sido útil. Agradezco sus comentarios. Hasta una próxima. Descargar el archivo Request.php
La Herencia.Es la capacidad de compartir atributos y métodos entre clases.Es la propiedad que permite definir nuevas clases usando como base clases ya existentes.La nueva clase (clase derivada) hereda los atributos y comportamiento que son específicos deella.La herencia es una herramienta poderosa que proporciona un marco adecuado para producirsoftware fiable, comprensible, de bajo costo, adaptable y reutilizable.La herencia o relación es-un es la relación que existe entre dos clases, en la que una clasedenominada derivada o subclase se crea a partir de otra ya existente, denominada clasebase o superclase.Evidentemente, la clase base y la clase derivada tienen código y datos comunes, de modo quesi se crea la clase derivada de modo independiente, se duplicaría mucho de lo que ya se haescrito para la clase base.C++ soporta el mecanismo de derivación que permite crear clases derivadas, de modo que lanueva clase hereda todos los datos miembro que pertenecen a la clase ya existente.La declaración de derivación de clases debe incluir el nombre de la clase base de la que sederiva y el especificador de acceso que indica el tipo de herencia (pública, privada y protegida).La primera línea de cada declaración debe incluir la sintaxis siguiente:class <nombre de clase derivada> : <tipo de herencia> <nombre de clase base>Tipos de Herencia.La relación de herencia entre clases puede ser: pública (public), privada (private) ó protegida(protected). La relación que se utiliza con mayor frecuencia es la pública.Dependiendo del número de clases y de cómo se relacionen, la herencia puede ser:a) Simple.b) Múltiple.c) De niveles múltiples.Con independencia del tipo de herencia, una clase derivada no puede acceder a variables yfunciones privadas de su clase base. Para ocultar los detalles de la clase base y de clases yfunciones externas a la jerarquía de clases, una clase base utiliza normalmente elementosprotegidos en lugar de elementos privados.Suponiendo herencia pública, los elementos protegidos son accesibles a las funcionesmiembro de todas las clases derivadas.Herencia Simple.Cuando sólo se tiene una clase base de la cual hereda la clase derivada, se dice que hayherencia simple (Figura 1.a). Sin embargo, la herencia simple no excluye la posibilidad de quede una misma clase base se pueda derivar más de una subclase o clase derivada .class Base{ private:// Miembros declarados en la sección privada: accesibles sólo para miembros de esta claseprotected:/* Miembros declarados en la sección protegida: accesibles sólo para miembros de estaclase y de sus derivadas */public:// Miembros declarados en la sección pública: accesibles para todos};Para declarar una clase derivada de una clase previamente definida se utiliza la siguientesintaxis:class Base{ // Declaración de atributos y métodos de la clase Base};// Relación de herencia pública entre las clases Base y Derivadaclass Derivada : public Base{ // Declaración de atributos y métodos de la clase Derivada};Con la palabra reservada public en el encabezado de la declaración de la clase “Derivada” sehace referencia a que dicha clase hereda los atributos y métodos de la clase “Base”.La declaración del constructor de la clase “Derivada” debe incluir un llamado al constructor dela clase “Base”.Para ello se utiliza la siguiente sintaxis:Derivada :: Derivada (parámetros) : Base (parámetros propios de la clase Base){ // Cuerpo del constructor de la clase Derivada}