
Practicas de ProgramacionDespués de las numerosas peticiones por parte de los lectores, de las prácticas de laboratorio de progración del año pasado, aquí las dejo, para que les hecheis un vistazo, con el codigo fuente y todo lo que he usado.
Dadle un buen uso de él:
Microsoft Certified Solution Developer, Parte ILos Korsarios y Missha, grandes defensores del software libre y del Copyleft, hemos comenzado uno de los cursos de Microsoft(Hay que conocer al Enemigo ¿no?), el MSCD, es decir Microsoft Certified Solution Developer(Certificado Microsoft de Desarrollador de Soluciones).
Es un curso de programación sobre la plataforma .NET en Visual Basic .NET, una nueva tecnología basada en el Framework, una especie de maquina virtual(aunque los de Microsoft no la llamen asi) sobre la cual corren los programas desarrollados en esta plataforma.
A mi modo de ver, esta plataforma tiene dos ventajas fundamentales a destacar:
La integración de otros lenguajes, y no solo Visual Basic, en la plataforma .Net consiguiendo así a aquellos programadores que odian Visual, puedan trabajar em la plataforma mediante J++.NET, C++.NET o C#.
Esta nueva tecnología hace desaparecer la dependencia entre Aplicación y Sistema Operativo, pudiendo trabajar estos programas en otros entornos, tales como Linux o Mac, simplemente teniendo instalado el Framework para cada plataforma.
En principio, esto puede ser perjudicial para Windows, ya que el que elija como Sistema Operativo Linux, también podrá acceder a aplicaciones como Word o Excel, animando asi la proliferación de otros sistemas, pero en cambio le abre las puertas a la venta de sus productos a estos usuarios.
Personalmente, creo que esta apuesta es una maniobra muy inteligente, del tipo, "si no puedes con ellos, unete", aunque como diría mi compañero y amigo David, ".Net es un una compleja operación de Copy&Paste sobre Java".
Continuare Informando sobre el tema, Saludos Korsarios.
Porqué no usar Notepad para HTMLNavegando por ahí oimos un día que había gente que hacía páginas webs con Notepad, pero suponemos que lo que quisieron decir es que hacen el código a mano. Por eso hemos elaborado un decalogo de las 10 razones por las cuales no se debe usar Notepad para hacer HTML o CSS:
1- No Colorea el Código.
2- En win9x no tiene tecla rápida para guardar.
3- En win9x no tiene la herramienta Reemplazar.
4- Solo puede deshacer en una ocasión.
5- No te detecta errores de syntaxis.
6- Carece de ayuda para insertar el código.
7- No tiene editor en vista de diseño.
8- No tiene vista preliminar de la página.
9- No Autocompleta.
10- Carece de validador de código html, ni css.
Siguiendo estas 10 razones todos deberiais llegar a la conclusión de que Notepad no es un buen editor y recomendamos otros que a nuestro gusto poseen mejores herramientas para la creación web:
Pero bueno, ya puestos a ser los mas Machos porque no usar el Edit de MS-DOS :)
(Este post fue editado en su totalidad con notepad.)
Saludos Korsarios.
Hittest en AllegroComo detectar zonas geométricas
En este tutorial he intentado conseguir detección de colisiones entre el ratón y una figura que tengamos en pantalla.
En principio he establecido tres figuras para la detección de las formas:
1. Un Rectángulo.
2. Un Círculo.
3. Un Triángulo.
La detección de estas formas es independiente del tamaño o la colocación de las mismas.
El Rectángulo:
La función que se encarga de detectar la colisión con el rectángulo tiene la siguiente cabecera:
bool DetectaCuadro(int Xini,int Yini, int Xfin, int Yfin);
Los parámetros que le pasamos son los puntos X e Y que definen la esquina superior-izquierda del rectángulo, y los puntos X e Y que definen la esquina inferior-derecha del rectángulo.
A partir de esos valores podemos decir que cualquier posición de la pantalla que se encuentre entre esos 2 puntos, pertenecerán indudablemente al Rectángulo definido:

Y la función quedaría de la siguiente manera:
bool DetectaCuadro(int Xini,int Yini, int Xfin, int Yfin){
if(mouse_x>Xini && mouse_x
}else{
return false;
}
}
Como vemos, si la posición del ratón en X se encuentra entre los puntos inicial y final del rectángulo en eje de abcisas y la posición en Y del ratón se encuentra entro los puntos inicial y final del rectángulo en el eje de coordenadas, el ratón esta sobre el rectángulo y por lo tanto la función devuelve true.
El Circulo:
La función que se encarga de detectar la colisión con el círculo tiene la siguiente cabecera:
bool DetectaCirculo(int posx,int posy,int radio);
los parámetros que le pasamos a esta función son la posición X e Y del centro de la circunferencia y el radio de la misma.
Teniendo en cuenta estos parámetros, podemos decir que cualquier punto de la pantalla cuya distancia al centro de la circunferencia, sea menor o igual que el radio, se encuentra dentro de dicha circunferencia.

Siendo así, la función que he desarrollado queda de la siguiente manera:
bool DetectaCirculo(int centrox,int centroy,int radio){
int distancia;
distancia=abs(sqrt(pow(centrox-mouse_x,2)+pow(centroy-mouse_y,2)));
if(distancia<=radio){
return true;
}else{
return false;
}
}
En primer lugar, calculamos la distancia desde la posición del ratón al centro de la circunferencia mediante el teorema de Pitágoras:
Distancia = Ö (centroX – mouse_x)2 + (centroY – mouse_y)2
La hipotenusa del triangulo formado por centroX/mouse_x y centroY/mousey, es la distancia entre el centro de la circunferencia y la posición del ratón, por lo tanto comprobamos que esa distancia sea menor o igual que el radio, para determinar si el puntero esta sobre la circunferencia.
El Triangulo:
Para la resolución de este tipo de figura el proceso se complica un poco, si queremos tener en cuenta cualquier tipo de triangulo.
En primer lugar establecemos cual será el proceso mediante el cual calcularemos cual es la superficie del triangulo:

Como se observa en el dibujo, el área del triangulo esta definido por la zona común en el centro que comparten las tres rectas creadas por la prolongación de los lados del triangulo.
Para hallar estas rectas necesitaremos las coordenadas de los 3 vértices del triangulo.
bool DetectaTriangulo(float posx1,float posy1,float posx2,float posy2,float posx3,float posy3);
Donde el punto (posx1,posy1) es el punto del triangulo mas a la derecha, (posx2,posy2) es el punto centro de la circunferencia y (posx3,posy3) es el punto mas a la izquierda de la circunferencia.
Con estos puntos obtenemos las rectas:
Linea1: ( posx1,posy1) (posx2-posy2)
Linea2: ( posx1,posy1) (posx3-posy3)
Linea3: ( posx2,posy2) (posx3-posy3)
Para poder trabajar con estas rectas las transformaremos en forma de ecuación punto-pendiente, de la siguiente manera:
f(x)=[((Yfinal-Yinicial)/(Xinicial-Xfinal)) * (x-x1)]+y1
De esta forma podremos establecer si un punto se encuentra a un lado u otro de la recta f(x).
Una vez halladas las ecuaciones pertinentes procederemos a establecer las zonas activas:
Si la posición del ratón en Y es mayor o igual (véase que las coordenadas en allegro aumentan hacia abajo) que el valor de f(x) en la coordenada X del ratón quiere decir que el puntero se encuentra en la zona por debajo de la recta, en otro caso se encuentra en la zona por encima de la recta.

Como vemos, para cada recta elegiremos la zona activa que nos permita detectar la colisión con el área del triangulo:
if(linea1 sumando las tres condiciones obtenemos la forma triangular que buscamos. bool DetectaTriangulo(float posx1,float posy1,float posx2,float posy2,float posx3,float posy3){
La función finalmente quedaría así:
float linea1,linea2,linea3;
bool contacto=false;
linea1=(((posy2-posy1)/(posx2-posx1))*(mouse_x-posx1))+posy1;
linea2=(((posy3-posy1)/(posx3-posx1))*(mouse_x-posx1))+posy1;
linea3=(((posy3-posy2)/(posx3-posx2))*(mouse_x-posx2))+posy2;
if(linea1
}else if(linea1>mouse_y && linea2
contacto=true;
}else if(linea1==mouse_y){
contacto=true;
}
return contacto;
}
TeleformaciónAunque se ha hecho esperar aquí esta ya el ppt de la conferencia sobre portales de teleformación que impartimos Jose y yo en Forman. Por cierto somos los webmasters de su web, se admiten criticas... constructivas ;P.
Aquí tenéis la parte mas teórica, después siguió una parte practica que fue sin duda las mas divertida. Analizamos la usabilidad y accesibilidad de distintos portales de teleformación, así como la tecnología con la que están implementados y la seguridad que ofrecen. Desde estas cuatro perspectivas esta abordado el problema de la teleformación.
Por cierto antes de que se me acuse de plagio citare algunas de mis fuentes:
rs-labs
areas.net
xpertia
...algunos otros
Espero que os guste Korsarios leed y propagad.
Tipografia en AllegroEn allegro las funciones textprintf y textout utilizan el parámetro font que será la tipografía que se usara en el texto. Esa fuente normalmente la indicamos como "font", que es una variable puntero de tipo FONT que apunta a una fuente por defecto de Allegro.
Como este puntero, podemos crear otros del mismo tipo FONT que apunten a otras fuentes que nosotros queramos.
Para apuntar nuestra variable fuente a una tipografía determinada, debemos encapsularla dentro de un archivo .dat. Este archivo lo cargaremos en dentro del programa mediante una variable puntero DATAFILE, de la siguiente forma:
DATAFILE *MisDatos;
FONT *MiFuente;
MisDatos=load_datafile("fuente.dat");
MiFuente=(FONT *)MisDatos[0].dat;
El parámetro (FONT *) debe pasarse, para forzar la devolución de un dato tipo FONT.
Ahora la variable "MisDatos" apunta a una variable anónima que contiene el archivo "fuente.dat" en forma de Array de datos y la variable "MiFuente" apunta a la posición 0 del Array de datos apuntado por "MisDatos", que contiene la fuente.
Para usarlo, por ejemplo con el textprintf ya no usaremos "font" como tipografía para nuestro texto, sino que usaremos "MiFuente", de la siguiente manera:
textprintf_centre(screen, MiFuente, 200, 200, 0xFF6600, "Hola Mundo");
Esto devolverá el la frase "Hola Mundo" en la posición (200,200) de color Anaranjado y fuente "MiFuente".
Como encapsular la fuente en un archivo .dat
Para crear los archivos .dat necesitaremos hacer uso del GRABBER.
El Grabber es una aplicación que te facilita allegro y que esta en la carpeta "C:\Dev-Cpp\Allegro\tools\". Esta aplicación permite encapsular archivos externos de forma solo debemos cargar el DATAFILE, aparte de que al estar en formato binario nos permite proteger nuestros archivos.
El único problema que tenemos a la hora de incluir la fuente, es que el grabber no acepta el formato TrueType (los ttf) a los que estamos acostumbrados, por lo que necesitamos convertirlos a otro formato, como por ejemplo PCX, con el programa TTF2PCX que puedes encontrarlo en:
Una vez hecho esto abrimos el Grabber, y nos vamos al menú Object > New > Font y nos aparecerá un cuadro de dialogo donde le asignaremos un nombre a nuestra fuente. En el recuadro de contenido se añadirá el objeto Font que acabamos de crear.
Hacemos doble click sobre el objeto recién creado y nos aparece una pantalla con una lista de fuentes, de distintos tamaños. Presionamos el botón import para importar el PCX que creamos anteriormente y que contiene nuestra tipografía.
Al se añadirá nuestra fuente a la lista y procederemos a eliminar las demás.
Pulsamos exit para volver a la pantalla principal, nos vamos al menú file > save y guardamos nuestro archivo .dat.
Todo esta listo para utilizar la nueva fuente.
A este archivo .dat también podemos añadirle imágenes, sonidos, paletas de colores... accediendo a ellos mediante las distintas posiciones del Array, por ejemplo:
Si con el Grabber he creado un archivo .dat con los siguientes elementos:
- Fuente1
- BmpCuadro
- SampleEfecto
- MidiCancion
Accederemos a ellas en el programa como:
FONT *fuente;
BITMAP *imagen;
SAMPLE *sonido;
MIDI *canción;
fuente = (FONT *)MisDatos[0].dat; -> Fuente1
imagen = (BITMAP *)MisDatos[1].dat; -> BmpCuadro
sonido = (SAMPLE *)MisDatos[2].dat; -> SampleEfecto
cancion = (MIDI *)MisDatos[3].dat; -> MidiCancion
Espero que este tutorial os sea útil a todos aquellos interesados en Allegro.
TrackBackDespués de leer a unos y a otros, no me quedó demasiado claro en que consistían los dichosos trackback. Así que decidí hacer unas pruebas entre dos post de este mismo blog, permití los ping y le lance uno de un post a otro.
Son geniales, ahora no solo los enlaces constituyen una fuente de nuevas paginas web, gracias a los trackback podemos relacionar unos post con otros. Esto no parece tan sorprendente ¿verdad? La potencia radica cuando estas relaciones se pueden establecer incluso entre blogs distintos. Para ello solo tienes que pinchar en enlace justo al final de este post, el que reza trackback, copiar la url y hacerle un ping desde tu panel de movable, sí en ese en el que escribes los post. Movable es genial :). A partir de ahora ya podéis TrackBackearnos, no lo olvidéis. Leed y propagad Korsarios¡¡¡
Selectores css meadosDando una vuelta por la web del WASP encontré un enlace a un muy interesante explicador de selectores css. Es una web en la cual introduces la url de una hoja de estilos o cualquier trozo de código CSS y te lo devuelve explicado en lenguaje natural, tanto en inglés como en castellano, realmente puede ser muy util para los que empiezan y para esas veces que te topas con selectores muy complejos...
¿y porqué meados? os preguntareias, pues va por un aparato muy simpático que vi en microsiervos el cual sirve para jugar a una especie de videojuego mientras meas, con el chorrito matas a los marcianetes, teneis un video que os dejará más clara la idea de lo que es. Saludos!
La RecursividadDespues del comentario de mi amigo paco me pregunto si la recursividad es entendida de manera correcta, asi que planteare el ejemplo de buscaminas, pero el que hice en flash, no sea que David Bueno se enfada y me cruje la nota, pero que quede claro que es una aproximacion a la hecha con flash, ya que existen algunas limitaciones que se suplen con otros metodos.
En primer lugar establecemos cual es la condicion para que al destapar una casilla se vayan abriendo todas y seria:
Pulsamos la casilla y comprobamos si el numero de minas cercanas es cero.
si lo es, llamamos a la funcion buscaCeros.
function buscaCeros(posx, posy) {
for (i=-1; i<=1; i++) {
for (j=-1; j<=1; j++) {
if (_root.matriz[posx+i-100][posy+j-100].nmina== 0 && matriz[posx+i-100][posy+j-100].estado!="levantado") {
buscaCeros(posx+i,posy+j);
}
_root["cuadro"+(posx+i)+"i"+(posy+j)].estado="levantado";
}
}
}
Analicemoslo mas profundamente:
al llamar a la funcion hacemos un barrido de las casillas que hay alrededor de la que hemos pulsado, con los dos for anidados, las levantamos y comprobamos cada una de las casillas con las siguientes condiciones:
Miro si la casilla tampoco tiene minas alrededor.
_root.matriz[posx+i-100][posy+j-100].nmina== 0
Los for hacen el barrido de las casillas de alrededor, pero cuando i=0 y j=0 la casilla q esta comprobando es la del centro, osea, la que comenzo todo el proceso, por lo tanto debo decirle que esa casilla no cuenta puesto que ya ha sido levantada. Si no hicieramos esto se produciria un bucle infinito que acabaria con el desbordamiento de la pila(Pakito, seguro que te pasa eso).
matriz[posx+i-100][posy+j-100].estado!="levantado"
Una vez comprobado que cumple estas 2 condiciones vuelvo a llamar a la funcion, pero ahora con la nueva casilla que acabo de descubrir que es un cero.
buscaCeros(posx+i,posy+j);
Y asi se haria la funcion recursiva. Ahora extrapola un poco y transformala a C++ que es practicamente lo mismo.
Nota solo para aquellos interesados en la version real en flash.
Flash solo te permite una pila de 256 posiciones, cantidad que se sobrepasa con facilidad. Para solucionar esto se usa otro metodo, que es el siguiente:
function buscac(posx, posy) {
for (i=-1; i<=1; i++) {
for (j=-1; j<=1; j++) {
_root["cuadro"+(posx+i)+"i"+(posy+j)].gotoAndStop(FtgEjecutor);
}
}
}
Y en fotograma ejecutor hago lo siguiente:
if(_root.matriz[this.px][this.py].nmina==0){
buscaC(px,py);
}
Con ello consigo evitar que la funcion se quede abierta hasta que las sucesivas llamadas recursivas le devuelvan el control, ya que la funcion acaba y ya fuera se vuelve a llamar, teneiendo en la pila solo 1 procedimiento ejecutandose.
Buscaminas C++ versionSi hace tiempo postee sobre el buscaminas en flash, ahora aunque obligado por la facultad, he acabado el buscaminas en C++.
En un principio pense que iba a ser un paseo, ya que si lo habia echo una vez podria hacerlo una segunda aunque fuera en otro lenguaje, pero nada mas lejos de la realidad. Me ha costado sudar sangre para poder acabarlo, mas que nada porque he empollado las Allegro_GUI, los DATAFILES, los GFX_MODES y del Increible GRABBER, de los que hablare en otro post mas adelante para que podais aplicar los cambios de fuentes, efectos de pantalla y encriptacion de ficheros. Miestas tanto sigo adelante con mi aprendizaje sobre Allegro.
Hasta la vista Korsarios.
SQL InjectLa mayor parte de los desarrolladores web conocen el riesgo de recoger cadenas, ya sea por post o por get, y concatenarlas a algo que va dirigido a nuestro servidor de base de datos. Y digo bien, la mayoría porque hay una minoría, quiero pensar que es así, que lo desconocen. Algunos pertenecientes a empresas cuyo nombre es de lo más rimbombante.
Yo después de pelearme con el tema, tanto en php como en asp. Y después de leer artículos tan interesantes como el que posteo en su día Jose, he decido que lo mas seguro, aunque seguramente no lo mas rápido es una función que se encarga de filtrar todos y cada uno de los caracteres que componen la presunta cadena.
Así en PHP:
function filtraCadena($cadena,$longCad){
$cadenacorrecta="abcdefghijklmnñopqrstuvwxyz
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789";
$correcta=true;
if ((strlen($cadena)>$longCad) || (strlen($cadena)==0)){
$correcta=false;
}else{
$i=0;
while (($i<=(strlen($cadena)-1)) && $correcta){
if(!strstr($cadenacorrecta,$cadena[$i])){
$correcta=false;
}
$i++;
}
}
return $correcta;
}Y en ASP:
function filtraCadena(cadena,longCad)
cadenacorrecta="abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789"
correcta=true
if ((len(cadena)>longCad) or (len(cadena)=0)) then
correcta=false
else
i=1
while ((i<=(len(cadena))) and correcta)
if(instr(cadenacorrecta,mid(cadena,i,1))=0) then
correcta=false
end if
i=i+1
wend
end if
filtraCadena=correcta
end function
Simon dice... NO A LA GUERRAHola Korsarios, ya me harte del simon y me he dicho a mi mismo, "Alvaro, dale un achuchon y terminala joe, que ya es hora, y haber si dejas de hablar solo". Y asi fue mi simon esta listo.
fuera de paraphernalias, no le he metido nada demasiado espectacular en la presentacion, pero si le he hecho un guiño a mi queridisimo Commodore 64 haciendo una simulacion como si cargara el juego en el.
Tambien en la musica de fondo, me he buscado la genial cancion del Kung Fu Master (gracias Jose) y unos "bips" y "dics" para pulsar los botones.
Los botones son pcx creados con Photoshop, que aunque no son demaisado artisticos, al menos no son unos tristes cuadros de color.
Como veis no me he explayado demasiado en este juego, pero me he dedicado mas a aprender otras cosas de allegro que me interesaban mas y no ma dao tiempo para las "Chorradillas".
Hasta la proxima, que sera con el buscaminas.
Allegro AnimationHoy ma dado por ahi, y voy a descubrir como realizar una animacion en allegro, es decir, conseguir que un BITMAP realize una serie de movimientos por la pantalla. Este metodo es basicamente aplicar los metodos anteriores del anterior post, "ACTIONSCRIPT MOTIONS", es decir, establecer un movimiento controlado por una funcion matematica, en este caso va a ser un movimiento circular, como si fuera un planeta que rota alrdededor de otro.
El metodo es sencillo, se trata de crear un bitmap dibujo que es el que mostraremos y otro bitmap al cual no cargamos imagenes, sino lo creamos con las dimensiones del anterior, y acontinuacion cada vez que que dibujamos la imagen que queremos, debemos borrar lo que habia antes con el bitmap mascara que hemos creado. todo esto quedara mas claro si veis el codigo a continuacion:
de esta manera:
void Movimiento (){
int px=0,py=300,fi=0;
BITMAP *luna,*tierra,*mascara;
float i=0;
InicializaAllegro();
// CARGAMOS LA IMAGEN DEL BITMAP LUNA
luna=load_pcx("img/luna.pcx",NULL);
// CREAMOS UN BITMAP CON LAS DIMENSIONES DEL ANTERIOR
mascara=create_bitmap(luna->w,luna->h);
while(!mouse_b&1==1){
rest(10);
// BORRA LO QUE HUBIERA ANTERIORMENTE
draw_sprite(screen,mascara,px,py);
// CALCULA LA NUEVA POSICION DEL BITMAP
px=(cos(i+fi)*100)+300;
py=(sin(i+fi)*100)+300;
i+=0.1;
// DIBUJA EL BITMAP EN LA NUEVA POSICION
draw_sprite(screen,luna,px,py);
}
return 0;
}
Hay que tener encuenta que la funcion "sin()" y "cos()", estan incluidas en MATH.H, asi que habra que inlcuirla en nuestra aplicacion.
Sus primeros pasos...A pesar de haberme apartado un poco de php, ya que las circunstancias me obligan a hacer uso de ASP, pronto pondré algunos de los últimos scripts que he desarrollado. Supongo que no son la panacea así que no pongáis demasiadas esperanzas. Hoy posteo para poner algunas direcciones interesante que todo desarrollador web debe conocer. Cuando se inicia la construcción de una web tenemos que tener muy en cuenta la compatibilidad con los navegadores mas antiguos, o no tanto. En nuestro afán por utilizar lo mejor y lo mas nuevo solemos olvidar que la mayor parte de los usuarios no suelen actualizar su navegador tan a menudo como nosotros. Por tanto debemos probar nuestras paginas en el mayor numero de navegadores posible. Lamentablemente no siempre podemos tener instalado todos los navegadores del mercado, y mucho menos todas las versiones. Estas webs nos ofrecen un servicio que emula gran parte de los navegadores que a pesar de antiguos aún se utilizan (Mosaic, Netscape 1.0, Internet Explorer 2.0 y HotJava entre otros
). Aunque ciertamente se usen poco, hay otros muy conflictivos, recordemos Navigator 4. Por eso debemos utilizar otras herramientas como topstyle. Este potente editor de css, nos provee una herramienta capaz de decirnos que estamos utilizando y con que navegadores es compatible o no. A pesar de todos estos programas, a pesar de utilizar uno y mil hacks , a pesar de todo seguramente no consigamos que nuestra web vaya en todos los navegadores,al menos como en su momento la concebimos, pero al menos lo habremos intentado. Leed y propagad¡¡¡ Korsarios.
Stdio vs iostreamAhora que he retomado el mundo del C++, me he dado cuenta de que en la facultad utilizan la libreria iostream.h para recoger y mostrar datos en las aplicaciones...verdad que apesta??. Por eso me gustaria hacer un llamamiento a todos aquellos amantes de C y que amen de verdad a la libreria stdio.h, a que, tal y como hizo Akhenaton con su Dios Sol, proclameis a stdio como unica y verdadera libreria estandar de entrada y salida, y derribemos a esa farsante que es iostream.
Nos envenenan con su cin y cout, y signos de redireccionamientos(<< o >>) haciendonos creer que son buenos y positivos para nuestra programación, pero yo os digo compañeros que no son comparables al majestuoso printf y scanf.
No digo que iostream no sirva para nada, pues estaria mintiendo, ya que posee otras funcionalidades, pero nunca estas funcionalidades haran que olvide a stdio.
Es más, os insto a que en PHP useis printf y no echo, que en asp creeis una funcion para el Response.write y que incluso en MS-DOS creeis un alias para el dir de manera que sea printf_directories.
Espero que mis ruegos no caigan en saco roto y todos los que leais mi articulo quedeis enamorados como lo quede yo un dia de STDIO, The Library.
Adivina.cppEl otro dia estaba por aqui a eso de las 23:30 me puse con la practica 1 de laboratorio y me dije a mi mismo, porque no acabarla y postearla en internet para que mis queridos compañeros de teleco puedan disfrutar de ella.
Y puse todo mi ingenio para acabarla esa misma noche, y hasta las 5 estuve con ella. Consegui acabar la practica y aqui esta, Adivina numero.
Espero que sabreis valorar el esfuerzo de perfeccionamiento por mi parte.
ActionScript MotionsUna de las problematicas que encontramos a la hora de observar las animaciones y aplicaciones en flash, el elevado peso de los archivos, que hacen muy tediosa la espera para la carga.
Para esto existen tecnicas y metodos que reducen el tamaño del swf.
En esta primera parte veremos como transformar las animaciones creadas con las herramientas del editor, por animaciones creadas en Action Script, con lo que conseguiremos reducir el peso del archivo,aunque ganará en complejidad.
Articulo 1- Movimientos de Clips
Si queremos hacer una interpolacion de movimiento en linea recta desde X=0-Y=0 hasta X=200-Y=100. Podemos tomar dos caminos.
Con Interpolacion:
En el primer fotograma seleccionamos el MovieClip y lo situamos en las coordenadas X=0-Y=0, selecionamos el fotograma final y creamos alli un fotograma clave, ahora asignamos al MovieClip la posicion X=200-Y=150. Finalmente selecionamos el fotograma inicial y creamos la interpolacion de Movimiento. Si quisieramos aceleracion deberiamos modificar el control extrañamente traducido “borrado” en el panel de propiedades de la interpolacion.
Con Action Script:
Seleccionamos el movieclip y en el panel de acciones le asignamos El siguiente codigo:
onClipEvent(Load){
_x=Xinicial=0;
_y=Yinicial=0;
Xfinal=200;
Yfinal=150;
pasos=50;
}
onClipEvent(enterFrame){
if(_x<Xfinal || _y<Yfinal){
_x+=(Xfinal-Xinicial)/pasos;
_y+=(Yfinal-Yinicial)/pasos;
}
}
Siendo Xinicial e Yinicial la posicion inicial de MovieClip, Xfinal e Yfinal las posiciones finales y pasos el numero de Movimientos hasta llegar al final del recorrido.
Si quisieramos aceleración el codigo seria este:
onClipEvent(Load){
_x=Xinicial=0;
_y=Yinicial=0;
Xfinal=200;
Yfinal=150;
Deceleracion=8;
}
onClipEvent(enterFrame){
_x+=(_x-Xfinal)/deceleracion;
_y+=(_y-Yfinal)/deceleracion;
}
Siendo deceleracion el factor de frenado del MovieClip.
Este metodo es extensible, no solo para un recorrido rectilineo, sino q es extensible para cualquier recorrido representable por una funcion.
Por ejemplo un recorrido senoidal podriamos representarlo como:
_y=(Math.sin(inc)*amp)+Yinicial;
inc+=0.01;
Siendo inc una variable que se incrementa y amp la amplitud del seno.
En el caso de querer realizar un recorrido complejo no representable con una funcion simple es preferible el uso de Interpolaciones con guias, pero si el recorrido no resulta ser demasiado complejo se puede realizar mediante la representacion de una funcion por partes combinando distintas funciones, por ejempo:
onClipEvent(Load){
_x=Xinicial=0;
_y=Yinicial=0;
Xfinal=300;
Xfinal2=400;
Yfinal=450;
inc=0;
}
onClipEvent(enterFrame){
if(_x<Xfinal){
_x+=5;
_y=(Math.sin(inc)*70)+Yinicial;
inc+=0.2;
}else{
_x+=5;
_y+=_x/2;
}
}
Esta Funcion esta compuesta por 2 funciones pues esta definida por partes. Asi pues para X<Xfinal es una funcion senoidal _y=70*Math.sin(inc), y para X>=Xfinal es una recta _y=_x/2.
Desarrollo de aplicaciones web segurasResulta curioso observar la facilidad con la que cualquier usuario con unos mínimos conocimientos de programación web puede saltarse las protecciones de user y password de muchas aplicaciones web que hay por ahí colgadas actualmente, en especial las desarrolladas en ASP.
Como muchos habreis imaginado, me estoy refiriendo al conocido problema de la inyección de sentencias SQL mediante la introducción de comillas simples en los campos de registro de usuario. Este problema resulta realmente fácil de solucionar simplemente parseando lo que el usuario introduce con el fin de evitar la entrada de caracteres maliciosos.
Para los que deseeis introduciros un poco más en este tema (creo que esto le va a gustar a nuestro amigo Jero) os recomiendo que echeis un ojo a un par de artículos aparecidos en Kriptopolis que tratan sobre el tema. El primero de ellos os introducirán el tema del SQL injection y solo necesitareis ligeros conocimientos de ASP y SQL para entenderlo. El segundo artículo , del mismo autor, Kamborio se adentra un poco más y explica algunas técnicas con las que un malintencionado usuarios podría llegar a obtener mucha información muy valiosa, si bien este artículo requiere un poco más de conocimientos de SQL y se ciñe a aplicaciones desarrolladas en ASP usando el servidor MS SQL Server.
Para los korsarios que esto se os quede corto, os recomiendo encarecidamente la lectura del PFC de RomᮠMedina-Heigl Hernández, disponible en su web personal en formato PDF, titulado "Análisis de seguridad, optimización y mejora de un portal web basado en PHP y MySQL" y que no tiene desperdicio. El texto detalla en su capítulo 2.3 los ataques más comunes que pueden sufrir las aplicaciones web y en especial habla en profundidad del SQL Injection.
Bueno, espero que no seas muy malos y aprovecheis esta información para desarrollar mejores y más seguras aplicaciones web. Saludos
Prog-AmandoInicio esta nueva sección, que estara dedicada a todos aquellos post que tengan que ver con programacion, con un codigo muy sencillo. Aunque supongo que a alguien le puede ser de utilidad. De hecho hasta que no me regalaron la webcam ni siquiera me lo habia planteado. Yo he encontrado la respuestas en programacion.com. Solo consiste en darle salida a la imagen de nuestra webcam hacia la web. No os bastara con el codigo necesitareis un programa a parte que capture las imagenes cada cierto tiempo y las mande al server. Entonces el codigo coje esa imagen y la actualiza, como veis muy sencillo. El programa que yo he utilizado es Dorgem. Un programa bastante bueno, y en openource, genial.( Para actualizar las imagenes he utilizado flash, por aquello de que es mas dificil que alguien guarde las imagenes en su disco duro) Por problemas con la cache esto ha dejado de ser asi, pero sigo buscando alguna solucion para que flash no coja la imagen de los temporales, deseadme suerte. Para que funcione solamente debeis configurar Dorgem para que suba las imagenes al mismo directorio del swf, pero por supuesto os animo a que lo personaliceis como os guste. En fin espero que a alguien le sirva de ayuda. Hasta otra Korsarios.