jueves, 29 de diciembre de 2011

construir un Mojito




Voy a tratar un problema que ocurre por estas fechas navideñas cuando un menor de edad te pide que le prepares un Mojito o cualquier tipo de bebida alcohólica.

Por si no lo habéis notado el ejemplo que os voy a mostrar es como preparar un Mojito en condiciones :)






public class Mojito {
        private final int mRon; //centilitros
        private final int mAzucar; //cucharadas
        private final int mLima; // un trozo es lo recomendable
        private final int mMenta; // 2 hojas está bien
        private final int mRefresco; // decilitros

       public Mojito(int ron, int azucar, int lima, int menta, int refresco){
               mRon = ron;
                mAzucar = azucar;
                mLima = lima;
                mMenta = menta;
                 mRefresco =  refresco ;
        }

/* Como es normal  la cantidad de lima y de menta siempre va ser la misma. Por eso para hacerlo mas cómodo y rápido usamos el siguiente constructor y que cada uno se eche la cantidad de ron, azucar y gaseosa que prefiera */

        public Mojito(int ron, int azucar, int gaseosa){
                this(ron, azucar, 1, 2, gaseosa);
        }

/* El problema ocurre cuando un niño te pide que le prepares una de esas bebidas tan chulas. Así que tenemos que crear otro constructor y usar lo siguiente */

        public Mojito(int azucar, int lima , int gaseosa){
                this(0, azucar, lima, 2, gaseosa);
        }

}

Bien ahora ocurre lo siguiente al crear un mojito pasa lo siguiente

Mojito m = new Mojito(5, 3, 0, 6, 2);

Que cantidad corresponde a que elemento si todos reciben los mismos parametros. Bien esto se soluciona de la siguiente manera.

public class Mojito {
        private final int mRon; // centrilitros
        private final int mAzucar; // cucharadas
        private final int mLima; // un trozo es recomendable
        private final int mMenta; // 2 hojas esta bien
        private final int mRefresco; // decilitros

        private Mojito(Builder builder) {
                mRon = builder.mRon;
                mAzucar = builder.mAzucar;
                mLima = builder.mLima;
                mMenta = builder.mMenta;
                mRefresco = builder.mRefresco;
        }

        public static class Builder {
                private int mRon; // centilitros
                private int mAzucar; // cucharadas
                private int mLima; // un trozo es recomendable
                private int mMenta; // 2 hojas esta bien
                private int mRefresco; // decilitros

                public Builder() {
                }

                public Builder setRon(int ron) {
                        mRon = ron;
                return this;}

                public Builder setAzucar(int azucar) {
                        mAzucar = azucar;
                return this;}

                public Builder setLima(int lima) {
                        mLima = lima;
                return this;}

                public Builder setMenta(int menta) {
                        mMenta = menta;
                return this;}

                public Builder seRefresco(int refresco) {
                        mRefresco = refresco;
                return this;}

                public Mojito build() {
                return new Mojito(this);}
        }
}

De esta forma el crear un mojito será un poco largo pero facil de entender.
Mojito m = new Mojito.Builder().setRon(5)
                                                     .setAzucar(3)
                                                     .setLima(3)
                                                     .setMenta(5)
                                                      .setRefresco(2).build();
El paso anterior no se debe omitir ya que es el que inicializa la cantidad de cada elemento, para ahorrarnos podemos indicar en la Class inicial que cantidad tiene cada elemento.

Bien, explicado esto la creación de los Mojitos es muy sencilla.
        Mojito offical = new Mojito.Builder().build();
        // mojito para niños
        Mojito sinMojito = new Mojito.Builder().setRon(0).build();
        // O ...
        Mojito sinMojito2 = new Mojito.Builder(0).build();

Que disfrutéis de un buen Mojito, hasta la próxima ;) Y Feliz Año Nuevo

viernes, 23 de diciembre de 2011

.htaccess: No mostrar las www

Ya sea por estética o por razones de SEO, podemos añadir las siguientes lineas en nuestro fichero .htaccess, de tal forma que cualquier URL con WWW pasará a no mostrarse las WWW.

RewriteEngine On
RewriteCond% {} HTTP_HOST! ^ tu-sitio-web.com $ [NC]
RewriteRule ^(.*)$ http://tu-sitio-web.com/ $ 1 [L, R = 301]

Pero cuidado que por motivos de SEO no es nada bueno indexar un contenido dos veces (una con www y la otra sin www) 
un saludo y Feliz Navidad!!!

domingo, 11 de diciembre de 2011

API de smushit

Retomo un antiguo amigo que siempre me ha ayudado a la hora de optimizar los elementos gráficos de un proyecto, estoy hablando de Smush.it de Yahoo! Que!!!!!! no me lo creo!! yo tampoco lo creía pero su API es realmente útil, simplifica mucho el trabajo de optimizar las imágenes.

Para los desconocidos de esta herramienta comentar que su función es eliminar los datos poco útiles, información no necesaria en nuestras imágenes. De esta forma logramos un peso menor en el gráfico sin perder calidad.

¿Como se usa esta API?
Es muy sencillo solo tenemos que introducir la URL de nuestra imagen, este la procesa y devuelve una URL de la imagen optimizada. De esta forma con un simple script en JAVA, PHP... se podrá hacer un File, fopen... donde se podrá descargar el nuevo gráfico y trabajar con el.




viernes, 2 de diciembre de 2011

PHP y los números grandes

Uno de los lenguajes de script más utilizado del mundo no es capaz de hacer comparaciones adecuadas.
<?php
$t1 = "1244431010010381771";
$t2 = "1244431010010381772";
if ($t1 == $t2) {
    print "iguales\n";
}
?>

miércoles, 2 de noviembre de 2011

zRAM mejora el rendimiento en Ubuntu

Uno de los desarrolladores de Elementary OS en un intento de mejorar su rendimiento ha creado zRAM, una herramienta basada en compcache que crea una unidad SWAP virtual comprimida en la memoria RAM. Esto resulta en un incremento de la memoria de intercambio en Linux que al estar ubicada en la memoria RAM es mucho más rápida. Como resultado se produce un incremento del rendimiento debido a que se utiliza la memoria de intercambio en RAM antes que la del disco duro.

Según las propias palabras de Sergey Davidoff:

“I decided to give it a try, and the result on my desktop with a quad-core CPU and 2Gb of RAM was fantastic: instead of freezing after running out of RAM, the system worked like nothing happened. I didn’t notice any difference at all. It looked just like adding more RAM! Surprisingly, I got almost the same results on a 6-year-old laptop with Pentium M and 1Gb of RAM! So, I’ve improved the script to automatically adapt to the amount of memory in the system and automatically scale across several CPUs or CPU cores, packaged it in .deb and uploaded to PPA.”
“He decidido probarlo, y el resultado en mi ordenador con cuatro núcleos y 2 Gb de RAM ha sido fantástico. En vez de quedarse colgado al quedarse sin RAM, el sistema siguió funcionando como si nada. No noté ninguna diferencia. ¡Parecía como si hubiese instalado más RAM!. ¡Es sorprendentemente, prácticamente conseguí el mismo resultado en un Portátil de 6 años de antigüedad con un Pentium M y 1 Gb of RAM!. Por tanto, he mejorado el script para que automáticamente se adapte a la cantidad de RAM, el tipo de procesador y el número de núcleos, todo en un paquete .deb y subido al PPA.”
Solo me queda añadir como instalarlo en Ubuntu 11.04 y 11.10 ejecutando:
sudo add-apt-repository ppa:shnatsel/zram
sudo apt-get update
sudo apt-get install zramswap-enabler
Una vez instalado, lo lanzamos:
sudo start zramswap

jueves, 20 de octubre de 2011

Primer manual de BASIC de la historia



El primer BASIC de la historia, creado por por John Kemeny y Thomas Kurtz para correr en el Dartmouth Time Sharing System.









martes, 11 de octubre de 2011

11/10/11

11/10/11 10:11
11 10 11 10 11

lunes, 10 de octubre de 2011

10/10/11

10/10/11 10:10

10 10 11 10 10

sábado, 1 de octubre de 2011

01/10/11

01/10/11 10:01
01 10 11 10 01

jueves, 29 de septiembre de 2011

restaurar gnome en ubuntu 11.04





Una de las últimas actualizaciones de Ubuntu me ha fastidiado el entorno de escritorio, he perdido los efectos de escritorio y no hay forma de restaurarlo de nuevo con compiz.






Este a sido mi caso y la solución que he descubierto es bien sencilla y rápida.
pulsamos ALT+F2 y en la consola ejecutamos:
unity --reset-icons
a continuación restauraremos gnome, antes de todo comentar que el entorno de escritorio volverá a su configuración inicial.
sudo rm -rf .gnome .gnome2 .gconf .gconfd .metacity
y solucionado! :)
espero haberos sido de ayuda, en cualquier caso si el problema sigue no dudéis en comentarme yo intentare solucionarlo lo mejor posible.

lunes, 19 de septiembre de 2011

el maldito initramfs de ubuntu

Si habéis sido victimas de este error, las soluciones son muy escasas. Me ha pasado de forma consecutiva, hasta que he dado con una solución. Bueno en realidad hay varias para probar.


Pasaros antes por este posts "error con initramfs ubuntu", en el se describe diferentes formas que se pueden llevar acabo.


Si continuáis conmigo es muy posible que no haya dado resultado ninguno de los métodos que se explican en el enlace anterior. Por desgracia ya os hacéis a la idea de que os voy a recomendar... la única solución que puedo daros y la única que me ha dado resultado es que formateis el disco y comenzar de 0. Yo he tenido que llegar al extremo de volver a crear la tabla de particiones y definirlas posteriormente.

Pero bueno si lo preferís antes de dar ese paso. Intentar instalar de nuevo el sistema o una versión superior. Si da resultado mis felicitaciones. De lo contrario lo siento mucho solo deciros que ubuntu en menos de 10 minutos ya lo tienes instalado y funcionando.

Espero editar algún día este posts contando con una solución mejor

un saludo

miércoles, 31 de agosto de 2011

Ejecuta un DDoS usando a Google



Hay una forma de utilizar la infraestructura de servidores de Google para realizar ataques de denegación de servicio distribuido sin necesidad de poseer un gran ancho de banda.

En concreto se está utilizando la infraestructura de servidores dedicados a su red social (Google+), que son utilizados como Proxy para descargar ficheros. La utilización de estos servidores Proxy se puede realizar mediante dos URLs diferentes:




* https://plus.google.com/_/sharebox/linkpreview/?c= <URL> &t=1&_reqid= <NUMEROS_ALEATORIOS> &rt=j

* https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url= <URL> &container=focus

Cambiándoles ciertos parámetros ("c" para la primera URL y "url" para la segunda), se puede conseguir que en realidad, sea Google el que realice la petición a la URL indicada por parámetros.
Otra ventaja de utilizar este método, es que realizando las peticiones a través de la primera URL, las direcciones IP de los equipos que están atacando que aparecerán en los archivos del log de la máquina objetivo, serán las de las máquinas de Google.

jueves, 28 de julio de 2011

Estoy de Vacaciones!!!


ver tu web en distintas resoluciones

Para los que se dedican a desarrollar/diseñar webs nos preocupa la forma de visualizar el sitio en diferentes resoluciones y plataformas. Screenfly puede ser de gran ayuda para solventar ese problema, con esta herramienta online podemos visualizar el portal web en diferentes resoluciones. 

miércoles, 27 de julio de 2011

martes, 12 de julio de 2011

cpp #define y las funciones

Curiosa optimización, en uno de los problemas de CC me sorprendió que el siguiente código
tarda 0.77 segundos y consume 2.6M

#include<iostream>
using namespace std;
int t,n;
#define F(i,n) for(int i=0;i<n;i++)
int main()
{
   int i,j;
   scanf("%d",&t);
   F(i,t)
   {
         scanf("%d",&n);
         int ans=1;
         while(n!=1)
         {
                    ans=ans<<1;
                    n/=2;
         }
         printf("%d\n",ans);
   }
return 0;}

Pero sería mas optimo el uso normal.
#include<iostream>
using namespace std;
int t,n;
int main()
{
   int i,j;
   scanf("%d",&t);
   for(int i=0;i<t;i++)
   {
         scanf("%d",&n);
         int ans=1;
         while(n!=1)
         {
                    ans=ans<<1;
                    n/=2;
         }
         printf("%d\n",ans);
   }
return 0;}
Está última se ejecuta en 0.72 y solo consume 2.5M
Si ha algun interes de para que es esté código aquí teneis el enunciado http://www.codechef.com/problems/DCE05

lunes, 27 de junio de 2011

Factores del ranking en los motores de búsqueda 2011


Esta publicación es el resultado de una encuesta a 132 “expertos” en posicionamiento en buscadores (SEO) a nivel mundial y por primera vez se realizó un análisis de una serie de keywords o palabras claves en los resultados del buscador de Google.

Se trata de un reporte que contiene una gran cantidad de datos que pueden ser descargados / visualizados en su forma original así como una serie de gráficos que muestran los resultados de la encuesta a los SEOs y del análisis de las palabras claves.

En resumen, es una lectura casi obligada para todo SEO que tome su trabajo en serio, ya que nos dá una radiografía actual, de cómo los SEOs del mundo están observando el comportamiento de los buscadores.

El siguiente gráfico resume los factores más importantes para el ranking en los buscadores en este momento
Los encuestados han definido las métricas de enlaces a nivel de página como el factor más importante para el ranking, seguido de la autoridad de un sitio a nivel de dominio, así como el uso de palabras claves a nivel de página y luego a nivel de dominio. Y por primera vez han incluido métricas sociales a nivel de página cómo un factor importante para el ranking en los buscadores.

Pero la encuesta también ha tratado de averiguar de cómo ven estos expertos el futuro del SEO, y los resultados están en el siguiente diagrama
Click para ver la imagen completa

Los expertos indican, y esto posiblemente de cara al update de Panda, que el valor que perciban los usuarios a nivel de página y sitio aumentará considerablemente. También las señales sociales a nivel de página y de sitio se convertirán en un factor importante para el ranking, así como las métricas del CTR de la página, el porcentaje de retorno a la página de resultados, y otros más.

El articulo completo lo puedes encontrar en Search Ranking factors 2011, en ingles.

jueves, 23 de junio de 2011

Optimización numérica con CPP

Ejecutando una operación sencilla como a*a*a*a*a*a. Si compilamos lo que realmente ejecutamos son 5 lineas mulsd:
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mientras que si ejecutamos (a*a*a)*(a*a*a)
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13
Acabamos de reducirlo en 3 lineas!!

chuleta para HTML5





Encipher.it encripta tus mensajes


Encipher.it llega para crear una solución sencilla a un problema que muchos usuarios tienen: la necesidad de que algunos de sus mensajes estén cifrados por contener información sensible.

Encipher.it es un encriptador AES que se usa mediante un bookmarklet. El usuario que lo quiera usar se identifica en el servicio en el que quiera usar la criptografía (bien sea Facebook, Twitter o cualquier gestor de correo web, pulsa el marcador y añade una palabra clave).

Para que el usuario al que envía el mensaje criptografiado entienda el texto escrito, sólo tiene que pulsar el mismo marcador y saber cuál es la palabra clave que ha usado quien envía el mensaje.

Sitio oficial | Encipher

jueves, 9 de junio de 2011

Esteganografía, oculta texto en una imagen

La esteganografía, técnica que permite entregar mensajes camuflados dentro de un objeto(contenedor), de forma que no se detecte su presencia y pasen inadvertidos. La estenografía se conoce desde tiempos inmemoriales, teniendo los primeros referentes en la antigua Grecia.

El término proviene de la unión de dos palabras griegas: steganos, (oculto) y graphos (escritura). La esteganografía se ha empleado con éxito a lo largo de la Historia con distintos procedimientos y en particular durante la II Guerra Mundial.

Esteganografía moderna
La estenografía ha evolucionado con la aparición de los ordenadores, ahora no es necesario incluir en el “punto” de una “i” un microfilm, como llegó a hacerse. Actualmente es posible ocultar un texto dentro de ficheros de imagen, audio y vídeo. Algunos programas permiten incluso ocultar, entre otros tipos de archivos, ficheros PDF.

La ventaja de utilizar un ordenador para estos propósitos es que no sólo podemos incluir un mensaje, también podemos cifrar su contenido de forma sencilla. Con esto conseguimos dos mecanismos de seguridad.

Por un lado ocultamos la existencia del mensaje y por otro, en caso de ser descubiertos, el cifrado complicará su lectura en función del algoritmo empleado y la complejidad de la clave utilizada. La esteganografía es razonablemente segura para intercambiar información en la red.

Esteganografía, uso de Steghide
Existen muchos programas libres y de pago con este fin, pero he elegido Steghide por su sencillez. Steghide funciona desde la consola en Windows y GNU/Linux, y es un proyecto de código abierto. La sintaxis no es complicada. Para incluir un mensaje escribiremos:
steghide embed -cf nombre.imagen -ef fichero.texto
Para extraer el mensaje:
steghide extract -sf nombre.imagen
Steghide soporta un número razonable de formatos contenedores: JPEG, BMP, WAV y AU. No soporta ficheros de vídeo, pero si buscas en la red, existe software para ese propósito. Para los usuarios de GNU/Linux comentar que Steghide, en concreto, está disponible en formato RPM, aunque lo incluyen muchas distribuciones.

Asociada con cifrado de mensajes, la esteganografía puede ser útil para almacenar datos en la nube que queramos tener disponibles desde cualquier lugar, simplemente elige una buena contraseña y será difícil que nadie acceda a lo que deseas ocultar. Eso sí, comprueba antes que en el proceso de subida o bajada la imagen no quede alterada.

Web | steghide

miércoles, 8 de junio de 2011

10 cosas de Javascript que (seguramente) no sabías y te sorprenderán

Javascript, el lenguaje de programación interpretado del lado del cliente más importante de la actualidad. Su potencial es muy grande pero, a su vez, guarda en su interior una serie de sorpresas y curiosidades bastante llamativas. Si quieres profundizar más, date un paseo por el artículo fuente de Smashing Magazine.

  • Null es un objeto (desde luego, paradójico)
alert(typeof null); //alerts 'object'

  • NaN es un número (otra paradoja más y el universo implosiona)
alert(typeof NaN); //alerts 'Number'

  • array() False es True
alert(new Array() == false); //evaluates true

  • La función replace() acepta como parámetro funciones callback
alert('10 13 21 48 52'.replace(/\d+/g, '*')); //replace all numbers with *

  • Las expresiones regulares se pueden testear con test() además de con match()
alert(/\w{3,}/.test('Hello')); //alerts 'true'

  • Puedes falsear el alcance de una variable o función (algo muy útil la verdad)
var animal = 'dog';
function getAnimal(adjective) { alert(adjective+' '+this.animal); }
getAnimal('lovely'); //alerts 'lovely dog';

  • Las funciones se pueden ejecutar a si mismas... y al parecer sin caer en un bucle infinito ni nada
(function() { alert('hello'); })(); //alerts 'hello'

  • Firefox no lee y devuelve los colores en hexadecimal sino en RGB

  • 0.1 + 0.2 ! 0.3 (¿otra paradoja? Boooooommm!!!)

  • Undefined puede ser definido, es decir, que no es una palabra reservada (fail!)
undefined = "I'm not undefined!";
var someVar;
alert(someVar == undefined); //evaluates false!

Sin duda ¡¡¡que curioso!!!

Vía | Smashing Magazine

miércoles, 1 de junio de 2011

humans.txt

humans.txt es una iniciativa para conocer a los autores de los sitios web que visitamos. Al igual que el fichero robots.txt, se ha de colocar en la raíz del sitio web y se trata de brindar información acerca de las personas que han intervenido en el proceso de creación así como las tecnologías utilizadas. La estructura del fichero debería ser similar a la siguiente:

/* TEAM */ 
Tu cargo dentro del proyecto: Tu nombre.
Site: E-mail, enlace a formulario de contacto,...
Twitter: tu nombre de usuario en Twitter.
Location: Ciudad, Comunidad, País. [...]
/* THANKS */
Name: nombre o url
[...]
/* SITE */
Last update: YYYY/MM/DD
Standards: HTML5, CSS3,..
Components: Modernizr, jQuery, etc.
Software: Software usado para el desarrollo del site.

humans.txt

martes, 31 de mayo de 2011

Lo que probablemente no sabías de PHP

Utilice ip2long () y long2ip () para almacenar las direcciones IP como enteros en lugar de cadenas en una base de datos. Esto reducirá el espacio de almacenamiento en casi un factor de cuatro (15 bytes para char (15) frente a 4 bytes para el número entero), que sea más fácil para calcular si una determinada dirección cae dentro de un rango, y las búsquedas velocidad y tipo (a veces un poco).

Validar direcciones de correo electrónico mediante la comprobación de que el nombre de dominio existe con checkdnsrr () . Esta construido en función de los controles para garantizar que un nombre de dominio especificado resuelve a una dirección IP. Una función definida por el usuario simple que se basa en checkdnsrr () para direcciones de correo electrónico válida en parte se puede encontrar en los comentarios de los usuarios en la sección de documentación de PHP. Esto es útil para la captura de esas personas ocasionales que piensan que su dirección de correo electrónico es 'usuario@wwwphp.net' en lugar de 'usuario@php.net.

Aprende a amar el operador ternario .

Prevenir los mensajes de error potencialmente sensibles de ser mostrado a los usuarios con el error_reporting (0). Lo ideal sería que los informes de errores deben ser completamente desactivado en un servidor de producción desde el interior de php.ini . Sin embargo, si usted está en un servicio de hosting compartido y no le dan su propio php.ini , entonces su mejor apuesta es agregar error_reporting (0), como la primera línea en cada una de las secuencias de comandos (o utilice con require_once () .) Esto evitará que las consultas SQL potencialmente sensibles y los nombres de ruta que se muestren si las cosas salen mal.

Utilice gzcompress() y gzuncompress() para comprimir de forma transparente y descomprimir cadenas largas antes de guardarlos en una base de datos. Estas funciones integradas de utilizar el algoritmo de gzip y puede comprimir texto hasta un 90%. Puedo usar estas funciones casi cada vez que de lectura / escritura a un BLOB de campo dentro de PHP. La única excepción es cuando necesito todas las funciones de indexación de texto.

lunes, 30 de mayo de 2011

CSS3 efecto texto en 3D


h1 {
       text-shadow: 0 1px 0 #ccc,
       0 2px 0 #c9c9c9, 
       0 3px 0 #bbb,
       0 4px 0 #b9b9b9,
       0 5px 0 #aaa,
       0 6px 1px rgba(0,0,0,.1),
       0 0 5px rgba(0,0,0,.1),
       0 1px 3px rgba(0,0,0,.3),
       0 3px 5px rgba(0,0,0,.2),
       0 5px 10px rgba(0,0,0,.25),
       0 10px 10px rgba(0,0,0,.2),
       0 20px 20px rgba(0,0,0,.15);

domingo, 29 de mayo de 2011

Crear diapositivas de imágenes en HTML5 con SlideMyPics

SlideMyPics es un servicio que nos permite crear slideshows de imágenes en HTML5 de una manera muy sencilla que no nos tomará más de 3 minutos crear una diapositiva con nuestras fotos preferidas.

Su uso es muy simple, sólo tienen que elegir la red social de la cual quieren importar los álbumes y darles acceso con nuestros datos de login. Luego tienen que elegir los álbumes disponibles y seleccionar las fotos que van a agregar a la diapositiva.

Lo bueno es que tiene varias opciones de personalización del diseño, podemos elegir entre tres plantillas distintas, personalizar el fondo de la diapositiva, agregar música de fondo desde videos de YouTube, y obviamente la posibilidad de generar un código único para compartir en sitios web.
Visto en FeedMyApp

sábado, 28 de mayo de 2011

php detecta dispositivo/plataforma

Mobile_Detect es una sencilla clase de PHP que permite la detección de las plataformas para dispositivos móviles más conocidas: Android, Blackberry, Opera Mini, Palm, Windows Mobile, así como las genéricas.

Su uso es muy sencillo. Basta con incluir e instanciar la clase:
include("Mobile_Detect.php");
$detect = new Mobile_Detect();
y comprobar:
if ($detect->isAndroid()) {
    // código para una plataforma Google Android
}
Los métodos disponibles son isAndroid(), isBlackberry(), isOpera(), isPalm(), isWindows(), isGeneric(). Si sólo estamos interesados en saber si el usuario está usando un dispositivo móvil pero sin preocuparnos de qué plataforma:
if ($detect->isMobile()) {
    // cualquier plataforma móvil
}

viernes, 27 de mayo de 2011

Compartir código desde Codr no podría ser más fácil. La página es tan simple que prácticamente es como un editor normal de texto, a secas. Se trata únicamente de un sitio desde donde podremos mostrar a otros el código que vayamos escribiendo.


Codr genera un link único que utilizaremos para que, a quien se lo enviemos, pueda ver el código que deseamos compartir. Además, cabe señalar que todo esto es en vivo, cada que agreguemos una nueva línea o que modifiquemos algo, lo mismo sucederá en la página que visualizan nuestros contactos.

Y si querías más, para los más flojos, o para los que les gusta optimizar su tiempo, tiene la posibilidad de arrastrar un archivo que tengamos en nuestro equipo, y Codr automáticamente lo leerá y copiará su contenido por ti. Codr soporta el remarcado de los siguientes lenguajes: html, css, js, php, py, java, cpp.

Web: Codr

jueves, 26 de mayo de 2011

Generador CRUD online para PHP



PhpScaffold.com es una sencilla herramienta online que puede ser de interés para personas que desean gestionar las operaciones básicas CRUD tablas mediante una aplicación php sin importarle el aspecto gráfico. A partir de una consulta create table obtenida por ejemplo de una exportación mysql es capaz de crear los ficheros PHPs de listado, alta, baja y modificación de elementos de esa tabla.
Generador de código | phpscaffold.com

miércoles, 25 de mayo de 2011

herramientas para comprobar la propagación de los DNS

Cuando estamos empezando un nuevo proyecto que incluye un dominio recién registrado o cuando hemos cambiado de hosting y esperamos la propagación de los DNS es útil ver cómo se va llevando a cabo esta tarea.




Con estas dos herramientas pueden comprobar un dominio y ver cómo se están propagando los DNS en los distintos routers de internet.

martes, 24 de mayo de 2011

Alertas con jQuery



Con Clean jQuery AJAX Alert podremos lograrlo. Su implementación es muy sencilla, son pocas líneas de código las que utilizaremos, y como único parámetro le diremos la URL de la página a la que se redirigirá con una respuesta afirmativa del usuario, y claro, el ID del elemento con el que vayamos a interactuar, como se observa a continuación:
$(function() {
       $('#id_elemento').alertBox({
              href: 'pagina_de_resultado.html'
       });
});
Ver una Demo: Demo

Descargalo desde: thefinishedbox

lunes, 23 de mayo de 2011

GetMySite, para analizar el posicionamiento de tu sitio web

Como el título del post lo sugiere, GetMySite.info te permitirá conocer el lugar que tiene tu sitio web (O cualquier otro también), en los principales buscadores, como son Google, Bing y Yahoo. Además de que también nos brinda información sobre la posición en Alexa.

Y no sólo eso, también podremos encontrar el resumen de los países desde donde más visitan nuestro sitio, además de la posición que este tiene en algunos de ellos. etc, etc.


Visto en: wwwhatsnew

domingo, 22 de mayo de 2011

crea los estilos de tus capas

Layer Styles, herramienta online que te permite crear los estilos de tus layers.

sábado, 21 de mayo de 2011

Tamaño máximo de la contraseña Gmail

No te lo preguntes más, la contraseña mas larga 
que se permite utilizar en las cuentas Gmail 
es de 200 caracteres.

viernes, 20 de mayo de 2011

Cachear una página dinámica PHP

El sistema es bastante simple y en principio se podría aplicar a cualquier sitio. El código sería algo tal que este:

<?php
       $md5 = md5($_SERVER["REQUEST_URI"]); // convertimos la URL a único identificador
       $file = "cache/".$md5.".html"; // donde se guardará el fichero
       $hora = filemtime($file); // comprobamos la hora del fichero si ya existiera
       if(time() <= $hora+86400) { // asignamos un tiempo de cache de 86400 segundos
              include($file); // incluimos el contenido del fichero cacheado
              echo "<!-- ".date('YmdHis', $hora)." -->"; // (opcional) añadimos al pie de página la fecha-hora de la caché
              exit; // salimos
       }
       ob_start(); // abrimos la memoria
?>

AQUI VA LA WEB NORMAL

<?php
       $fp = fopen($file, 'w+'); // abrimos el fichero de caché
       fwrite($fp, ob_get_contents()); // guardamos el contenido de la página generada en el fichero
       fclose($fp); // cerramos el fichero
       ob_end_flush(); // devolvemos la página que se ha generado y cerramos la memoria
?>

Con este sistema podremos incrementar una página dinámica tranquilamente entre un 50% y un 1.000% la velocidad, dependiendo de la carga de base de datos o cálculo que tuviera anteriormente.

jueves, 19 de mayo de 2011

Filtrar elementos nulos en jQuery

Lo primero será tener un array con elementos nulos.
var a=[1,2,0,"a",null,NaN,undefined,7,"","palabra",{}];
Vemos que en el array están presentes elementos como null, NanN, undefined y el cero. Todos ellos elementos nulos.
Para filtrar los elementos volvemos a apoyarnos en la función .grep(), la cual recibía el array con los elementos y la función de filtro. Pero, ¿qué función jQuery nos filtra los elementos nulos de un array?
Pues en ese caso vamos a utilizar el constructor de Boolean. Y es que cuando intentamos instanciar el constructor de Boolean con un elemento nulo, dicho constructor nos devolverá false.
Boolean(NaN); //false
Boolean(undefined); //false
Boolean(null); //false
Boolean(1); //true
El código para filtrar elementos nulos de un array con jQuery utilizando .grep() nos quedará de la siguiente forma:
var b = a.filter(Boolean);
Ya solo nos queda volcar el contenido del array.
$("#resultado").text(b.join(", "));

miércoles, 18 de mayo de 2011

convertir una imagen a HTML/CSS

ImgToCSS es una aplicación curiosa, con un nombre un poquito mentiroso, que probablemente sea útil para aquellos que envían newsletters, permite convertir cualquier imagen con un tamaño que no supere los 250×250 pixeles a formato HTML/CSS.
El mecanismo para realizar este trabajo es muy simple e interesante, por un lado recibe la imagen que nosotros le enviamos en formato JPEG, GIF, BMP, TIFF e ICO. Luego la aplicación procesa esta imagen, determinando el color de cada pixel, el mismo se asigna como color de fondo de una tabla HTML con tantas celdas como pixeles contenga la imagen, obviamente cada celda va a tener 1 pixel x 1 pixel de tamaño. De esta forma vamos a obtener un clon prácticamente perfecto de nuestra imagen en formato HTML.

Por ejemplo yo convertí a este pequeño IronMan:



El resultado es muy pero muy bueno.

Cuando comento que el nombre de la aplicación es un poco mentirosa lo digo porque en si en ningún momento se encuentran implementadas las hojas de estilo, no obstante si deseamos hacerlo simplemente tendremos que tomarnos el trabajo chino de crear clases css por cada color y reemplazarlos en las celdas que lo utilicen.

Web: ImgToCSS

martes, 17 de mayo de 2011

OptimiConsejo para hoy

Está muy bien controlar la descarga asíncrona de nuestra aplicación web.
El uso excesivo de script para lograrlo no es una buena solución.
Piensa que no todos lo soportan.
Y piensa que en algún momento hay que cargar esa cantidad de código.

Buen día ;)

lunes, 16 de mayo de 2011

Mashup de logotipos


¿Qué pasaría si ponemos en una coctelera algunos de los logotipos más conocidos?
Seguramente… ¡algo así!



sábado, 14 de mayo de 2011

Reset CSS elige la adecuada

La utilidad de los reset, nos ayudarán a que independientemente del navegador que se utilice, el contenido se vea lo más parecido posible a lo que realmente planeamos, según como lo hayamos establecido en nuestro CSS. Y para facilitarnos eso de encontrar el reset adecuado, les de recomiendo cssresetr, un sitio desde donde podrán no sólo probar como se verían los distintos tipos de reset que ofrece en la comparativa, sino que si se van al link de la parte derecha que dice CSS: Reset Library, podrán escoger el que los haya convencido y les mostrará su código. El cual pueden copiar y utilizar sin preocupaciones en sus proyecto.
Web: http://cssresetr.com/

viernes, 13 de mayo de 2011

Animaciones Graciosas


Están muy bien... son muy cortas no duran más de medio minuto pero son muy divertidas, además todas tienen una moraleja al final.

Son hechas por Rex Martin A.K.A Ricky Martin, ver más | [rexmartin]



PANCAKES from Rex Martin on Vimeo.


LEMONS from Rex Martin on Vimeo.


CHAIN from Rex Martin on Vimeo.


HORSE from Rex Martin on Vimeo.


I.T. from Rex Martin on Vimeo.


LAPTOP from Rex Martin on Vimeo.

jueves, 12 de mayo de 2011

Grubeco te ayuda a recuperar el Grub

Menuda gracia supone el perder el Grub cuando has instalado otro sistema o se ha desconfigurado.
Pues de la mano de machgeek tenemos la posibilidad de recuperarlo sin problema.

Comenzamos iniciando nuestro PC desde un Live CD de Ubuntu. Una vez hecho esto, descargamos el scripty le damos permisos de ejecución:
$ sudo chmod +x grubreco
Y tras esto ejecutarlo:
$ ./grubreco
Si todo sale bien te saldrá esto:
Operacion completada, al reiniciar no vera el grub, pero si iniciara Ubuntu, luego de esto ejecute en un terminal sudo update-grub y listo!
Como verán nos da unas últimas instrucciones, así que para terminar el proceso, reiniciamos y ejecutamos:
$ sudo update-grub
Volvemos a reiniciar para aplicar los cambios y listo :)

miércoles, 11 de mayo de 2011

Consejos al diseñar para móviles

La navegación en móviles tienen sus propios principios. Los de Hongkiat muestran 10 consejos, para una mejor usabilidad.

Decidir sobre la resolución de la pantalla:

Dividir Páginas Web en pequeñas porciones:

Simplificar el diseño:

Opción Para ver la página completa:

Colocación de navegación. Puede ser en cualquier posición, solo que debe ser intuitiva:

Utilizar enlaces de texto:

Hacer distinción en el enlace seleccionado:


Planificar los hipervínculos en cuanto a su profundidad en el sitio:

Reducir al usuario la necesidad de escribir texto, mejor utilizar métodos de navegación como menús desplegables en las diferentes opciones:

No usar “pop-ups” (ventanas que se abren, aparte de la principal) o refrescamiento automático.


martes, 10 de mayo de 2011

ALERTA - Comic Sans No se usa!!

Why You Hate Comic Sans es una racionalización del odio existente hacia la tipografía Comics Sans, en forma de charla en vídeo y algunos apuntes acerca de las razones puramente técnicas tras el repelús que produce la abominable –aunque ubicua– tipografía.

(…) Llegó un punto a finales de los 90 en el que gracias a los Macintosh todo el mundo podía usar e imprimir con casi cualquier tipografía. Hacia finales de los 90 los tipógrafos nos dimos cuenta de que las palabras eran incapaces de describir la desgarradora experiencia de ver cómo se había abierto la caja de Pandora para revelar que el 95 por ciento de todo lo que se veía diseñado por el campus la universidad era feo: tipografías elegidas sin criterio, interletraje pobre, elección de colores descarriada… todo estaba terriblemente mal: letreros para guiar a la gente por el campus, carteles de fiestas toga y, sí: pósteres de gatitos perdidos (…) Pero todos quedamos cegados ante la increíble revolución que se estaba produciendo: nuestras abuelas podían componer e imprimir todos los pósteres de gatitos perdidos que quisieran (…)
visto en: microsiervos

domingo, 8 de mayo de 2011

Filtrar un array con jQuery

jQuery tiene la posibilidad de filtrar elementos de un array. Para ello contamos con la función .grep(). Comenzamos con un sencillo ejemplo:

1-Creamos un array con números del 1 al 10.
var a=[1,2,3,4,5,6,7,8,9,10];
Crearemos una función que devuelva true cuando cumpla la condición que queramos aplicar y false cuando no la cumpla. Siguiendo el ejemplo buscaremos los elementos mayores que 5:
function mayorQueCinco(elemento,indice){return (elemento <=5);}
A la función le pasamos dos parametros "elemento" que será el elemento del array evaluado y el "indice" indice del array que ocupa el elemento. Ahora aplicamos el método .grep(). Este método nos devuelve otro array con los elementos que cumplen el filtro. En el siguiente ejemplo reutilizaremos la variable. En cierto modo estaría mas optimizado.
var a=[1,2,3,4,5,6,7,8,9,10];
a= jQuery.grep(a,mayorQueCinco);
Echo esto solo quedaría visualizar la información del nuevo array:
$("#resultado").text(a.join(", "));

sábado, 7 de mayo de 2011

Copiar Base de datos de MySQL a MySQL

Si quereis copiar una base de datos de un servidor MySQL a otro servidor MySQL podeis hacerlo ejecutando la siguiente linea:
$ mysqldbcopy --source=login:pass@localhost:3306 --destination=login:pass@localhost:3306 dborigen:dbdestino
mysqldbcopy pertenece a las utilidades de la linea de comandos de MySQL Workbench 

viernes, 6 de mayo de 2011

ahorra tiempo de transferencia con el código 204 No Content

Cuando se hace una petición y se devuelve un 204, se acaba todo, porque básicamente cuando la petición vuelve no se manda “ningún contenido”. ¿Y para qué utilizar esto? Hay un caso en el que se ve todo muy claro.

Muchas veces los contadores de visitas o similares integran en el sitio un pequeño GIF de 1×1, habitualmente, al que se le mandan algunos parámetros. Esto básicamente se usa para recoger estadísticas. La imagen no es que sea una imagen, sino que suele ser algo “programado” que acaba devolviendo una imagen muy pequeña, de pocos bytes… pero ¿qué necesidad hay de devolver información si la imagen simplemente no se muestra?


Esto en vez de devolver el “nada.gif” ¿por qué simplemente no devuelve nada y te ahorras el tiempo que se tarda en descargar información para otras cosas?

Se podría hacer algo como:


Y que este PHP tenga algo similar a:

    <?php
        /*
        [...]
        fwrite();
        [...]
        */
        header("HTTP/1.0 204 No Content");
    ?>

De esta forma, se conseguiría el mismo efecto y se ahorrarían unas décimas de segundo en tiempo de transferencia, a parte de la transferencia en sí.

jueves, 5 de mayo de 2011

(8 métodos de jQuery que deberías conocer) + 4 que quizá ya conocías

jQuery la librería de javascript mas usada. Tiene una multitud de métodos, efectos, animaciones... Me he topado con este post 8-jquery-methods-you-need-to-know en el que explica de forma breve 8 métodos interesantes que se debería conocer si vas a usar esta librería. Yo he incluido algunos mas que me parecen interesantes.

.data() info
Este no lo conocía y me ha parecido muy interesante. Os mostrare un ejemplo:

<div data-type="page" data-hidden="true" data-options='{"name":"John"}'></div>
$("div").data("role") === "page";
$("div").data("hidden") === true;
$("div").data("options").name === "John";
Otra forma de hacer lo mismo
$("div").data("role", "page");
$("div").data("hidden", "true");
$("div").data("role", {name: "John"});
De está forma nos permite almacenar información sobre los elementos de la página.

.stop() info
Con esto podemos llamar a un elemento que se está ejecutando una animación y pararlo. Pudiendo concatenar otra acción cuando este termine, como por ejemplo .fadeOut() vemos un ejemplo de ello:
$(this).find('img').stop(true, true).fadeOut();

.toggleClass() info
Añade o elimina la clase/s en el elemento con el que interactua (es pulsado). Un ejemplo:
$('#opcion').toggleClass('active');
podemos hacer lo mismo realizando este proceso:
if ($('#home').hasClass('active')) {
    $('#home').removeClass('active');
}
else {
    $('#home').addClass('active');
}

.delay(duración, [nombreCola]) info
Sirve para crear un intervalo de espera entre la ejecución de funciones.
$('#content').slideUp(300).delay(800).fadeIn(400);

.each() info
Recorre un objeto ejecutando la función en todos los elementos coincidentes.

Lista: <span>(pulsa para cambiar)</span>
    <ul>
        <li>Platanos</li>
        <li>Manzanas</li>

        <li>Naranjas</li>
    </ul>
    <script>
        $("span").click(function () {
            $("li").each(function(){
                $(this).toggleClass("example");
            });
        });
    </script>

.size() info
devuelve el numero de elementos del objeto.
var size1 = $("li").size();
var size2 = $("li").length;
.length hace el mismo efecto.

.closest() info
Obtiene un grupo de elementos que contenga el elemento padre más cercano que cumpla con el selector especificado, incluyendo al elemento inicial. Comienza comprobando primero si el elemento actual cumple con la selección especificada. Si es así devuelve ese elemento. En caso contrario continúa buscando en el elemento, padre a padre, hasta que encuentra un elemento que cumpla la condición dada. Si no lo encuentra, no devuelve nada.

$('p').find('span')

.position() info
Como su nombre indica obtiene las coordenadas del elemento.

    var p = $("p:first");
    var position = p.position();
    $("p:last").text( "left: " + position.left + ", top: " + position.top );

.noConflict() info
Con esto podemos editar la referencia del " $ "
var j = jQuery.noConflict();
// Ahora, en vez de $, usamos j.
j('#someDiv').hide();
// La siguiente linea referenciará a otra librería con la función $
$('someDiv').style.display = 'none';
.ready() info
Ejecuta la función cuando está listo el elemento indicado.
$(document).ready(function() {
    // ejecuta la función cuando el documento está cargado
});
otra versión mas optimizada.
$(function() {
    // ejecuta la función cuando el documento está cargado
});

.load() info
El evento load se lanza tan pronto el elemento al que hemos asociado el evento ha terminado de cargarse por completo. Este evento puede asociarse a cualquier tipo de elemento que tenga una URL, imágenes, iframes, hojas de estilo o javascripts...
Hay que tener especial cuidado con las imágenes, porque si la imagen la carga desde la caché en ocasiones 
no lanza el evento de cargado. Un ejemplo de este evento podría ser;
<img alt="Book" id="book" src="book.png" />
$('#book').load(function() {
    // Hace algo cuando termina de cargar la imagen por completo
});

.one() info

Es igual que bind, pero en este caso el evento sólo se ejecuta una vez. Por ejemplo, puede interesarnos que cuando pinchemos un botón se muestre un mensaje, pero que la segunda vez que se pinche ya no se muestre, en ese caso podríamos hacer,
$('#boton').one('click', function() {
    alert('Este mensaje se muestra sólo una vez');
});