Zoom sobre texto con CSS3 usando transiciones

Otra nueva entrada sobre las virtudes de CSS3, en este caso vamos a hacer una pequeña introducción a las transiciones creando un código que nos permita que la letra de un párrafo aumente de tamaño cuando el ratón esté sobre ella.

Para ello por un lado tendremos que definir la transición sobre el elemento a modificar y luego la modificación cuando se produzca el evento.

Lo primero sería así:

.aumenta {
    font-size: 1.1em;
    width: 300px;
 
    -moz-transition: font-size 500ms linear 0s; 
    -webkit-transition: font-size 500ms linear 0s;
    -o-transition: font-size 500ms linear 0s;
    transition: font-size 500ms linear 0s;
}

Explicación: tras definir el tamaño del texto para la clase aumenta (1.1 em) definimos la transición. Hay varios métodos para la transición, así que he usado la propiedad shorthand de transition. El primer parámetro (font-size) es para especificar a qué propiedad se aplicará la transición, el segundo el tiempo que tardará, el tercero que se hará siempre a la misma velocidad (linear) y el cuarto que se haga sin delay.

Y ahora que tenemos la transición definida para todos los navegadores (ojo!!! Explorer 9 no soporta todavía transiciones, dice Bill Gates que igual para la 10) toca definir cómo se transformará el texto cuando esté sobrevolado por el ratón:

.aumenta:hover{
    font-size:1.6em;
}

Definimos que en el evento hover la fuente pase a ser más grande. Con esto ya tenemos nuestra transición lista.

Escalar imagen con CSS3 al hacer hover

Bueno, una minientrada rápida:

¿Necesitas que una imagen se agrande cuando pases el cursor por encima (o encoja, que también se puede)? Tradicionalmente la cosa sería hacerlo con javascript, pero ahora sólo con CSS3 es posible. En el siguiente ejemplo verás como hacer que la imagen crezca un 20%:

img:hover{ 
    -webkit-transform: scale(1.2);
    -moz-transform: scale(1.2);
    -o-transform: scale(1.2);
    -ms-transform: scale(1.2);
    transform: scale(1.2)
}

La idea es usar transform scale() y pasarle el tamaño que queremos darle como parámetro. Por cuestiones de compatibilidad hemos añadido los métodos concrectos para webkit, mozilla, opera y explorer. Cuestiones a tener en cuenta: Pues la primera, no pasarse ampliando para que la imagen no pierda definición en exceso. La segunda, ten en cuenta tamaños de márgenes y padding para que al crecer no te desplace el resto de elementos.

Truquito CSS fácil y rápido para este día de carnaval.

Leyendo ficheros CSV con PHP

A petición de Jorge de Saliceta, que lo reclamó en la entrada sobre lectura de ficheros en PHP va la explicación sobre cómo leer ficheros CSV con PHP. No es la primera vez que en este blog hablamos sobre el formato CSV (comma separated values).

Bueno, si te vas a la entrada de lectura de ficheros verás que para la lectura secuencial, línea a línea, usábamos la función fgets(). Bueno, pues existe una función similar, llamada fgetcsv(), pensada para trabajar con archivos de este tipo. En lugar de devolver una cadena de texto como fgets(), esta función lo que devuelve por cada línea recorrida es un array, donde cada valor separado por una coma ocupa una de las posiciones del mismo. Veamos un ejemplo:

//supongamos la siguiente fila en un csv:
//Manolo, Rodríguez, Málaga, Fontanero
//y que está guardado en el archivo prueba.csv
//Aplicaríamos el siguiente código

<?php
$file = fopen("prueba.csv","r");
$result = fgetcsv($file);
fclose($file);
?> 

//esto devolvería un array con el siguiente resultado:
Array
(
[0] => Manolo
[1] => Rodríguez
[2] => Málaga
[3] => Fontanero
) 

Cuestiones a tener en cuenta hay varias. La primera es que si pilla una línea en blanco devolverá una matriz con un sólo campo con el valor NULL. La segunda es que existen varios parámetros que podemos pasar: Obligatorio, desde PHP5, sólo es el archivo a parsear, pero también acepta la longitud máxima de línea (si la sabes pásalo, porque hará que la función vaya más rápido), el delimitador de campo (por defecto, la coma), el «cercado» de campo (por defecto comillas dobles… ya se que lo de cercado no es muy claro, en inglés sería enclosure) y el caracter de escape (por defecto, la barra invertida). Al igual que con fgets() puede haber problemas para detectar los finales de fila en archivos creados en un Mac, y también hay que tener en cuenta que la función tiene en cuenta la configuración local, así que si estás trabajando con UTF8 tenlo en cuenta a la hora de calcular el tamaño máximo de línea o con los archivos codificados en one-byte.

Finalmente os dejo un gran ejemplo del funcionamiento de esta función sacado de la web de php:


<?php
$fila = 1;
if (($gestor = fopen("test.csv", "r")) !== FALSE) {
    while (($datos = fgetcsv($gestor, 1000, ",")) !== FALSE) {
        $numero = count($datos);
        echo "<p> $numero de campos en la línea $fila: <br /></p>\n";
        $fila++;
        for ($c=0; $c < $numero; $c++) {
            echo $datos[$c] . "<br />\n";
        }
    }
    fclose($gestor);
}
?>

Leer ficheros de texto con PHP

Uno de esos posts a petición de un lector: ¿cómo leer un fichero de texto con PHP? Bueno, a día de hoy no es una práctica muy usada, tal vez sea algo que suena más a tiempos pasados, pero hace año y pico en un trabajo por ejemplo tuve que hacerlo (y no veáis la lata que daba tratar los datos cuando una tabla de MySQL habría ahorrado muchísimo trabajo, pero eso es otra historia).

Bueno, para leer un fichero debemos usar la función fopen(), pasándole como primer parámetro la dirección del fichero a abrir y como segundo el modo (para lectura r, para escritura w).

Entonces, para leer fopen(«archivo.txt», «r»), y ahora tenemos dos opciones: cargar todo el contenido de golpe o ir leyendo línea a línea.

Para cargar todo el contenido de golpe la cosa sería más o menos así:

function leer_completo($direccion_fichero){
   $fichero = fopen ($direccion_fichero, "r");   
   $contenido = fread($fichero, filesize($direccion_fichero));
   return $contenido;
} 

Esto devolvería una variable con todo el contenido del fichero. Para la lectura línea a línea en cambio necesitaremos un bucle y la función fgets() en lugar de fread().


<?php
$gestor = @fopen("/tmp/inputfile.txt", "r");
if ($gestor) {
    while (($búfer = fgets($gestor, 4096)) !== false) {
        echo $búfer;
    }
    if (!feof($gestor)) {
        echo "Error: fallo inesperado de fgets()\n";
    }
    fclose($gestor);
}
?>

En este caso ya os pego el ejemplo que aparece en la web oficial de php. En ese caso se especifica a fgets() el parámetro del tamaño a leer. Y es que puedes especificarle el tamaño de bloque que debe hacer en cada lectura o, por el contrario, no pasarle ningún parámetro y que lea hasta el final de línea. Esto último puede dar problemas con archivos creados en un Mac, pero se puede solventar activando la opcion en tiempo de ejecución auto_detect_line_endings.

Otro día, si queréis, hablamos de csv, o de escritura… estoy abierto a sugerencias.

Cinco frameworks a tener en cuenta para desarrollo web

Soy evangelista de jQuery, lo sabéis, estoy enamorado, tando de jQuery (sobre todo para frontend), jQueryUI (este mejor para backend) o jQueryMobile. Es fácil de usar, productivo y libre, por lo que merece la pena usarlo. Pero no todo en esta vida es jQuery, por lo que hoy voy a hablar de cinco frameworks que os pueden interesar:

  • backbone.js: Con una documentación muy completa, este proyecto está siendo una de las estrellas de los frameworks javascript de los últimos dos años. Además de un catálogo de eventos y un API bastante entendible, el atractivo de backbone.js es que nos permite implementar el patrón Model-View-Controller en nuestra apliación de javascript. Sí, MVC en el lado del cliente. Piensa todo el código que se aprovechará, y la independencia que ganarás sobre el marcado.
  • Image Mapster:: En este caso nos encontramos con un plugin de jQuery para crear interacción con las imágenes. ¿Quieres un mapa donde haya un enlace sobre cada provincias? ¿quieres unas siluetas en negro que al sobrevolarlas con el ratón muestren la foto de la persona? Echa un ojo a la página de demos y hazte una idea de las posibilidades de este framework.
  • QUnit: Y si arriba hablábamos de implementar el patrón MVC en Javascript ¿por qué no hacer tests unitarios? QUnit es un proyecto de los creadores de jQuery, en principio pensado para testear su propio código, y que han liberado para uso y disfrute de la comunidad.
  • Canvas Query: Usar el elemento Canvas de HTML5 con sintaxis de jQuery. Eso es lo que nos ofrece Canvas Query, una herramienta que facilitará la vida del desarrollador que se lance a trastear con Canvas. Principalmente está pensado para el desarrollo de juegos en HTML5, donde puede tornarse una enorme ayuda a la hora de manipular sprites, jugar con paletas de colores…
  • Junior: Y termino con un framework para la creación de apps móbiles en HTML5. He de decir que ayer me encontré uno que me gustaba más, trasteando por la web, pero que no apunté el nombre… por lo que le he perdido la pista. En todo caso, este Junior puede ser una buena alternativa a jQueryMobile, dándonos una presentación diferente, más atractiva. Implementa varias librerías, como la antes citada backbone.js.

Y una cosa que me pregunto ¿realmente hacen falta tantos frameworks de maquetaciones tipo grid y metro? Los hay a patadas en los últimos tiempos.

Crear un chat con PHP y jQuery

En este caso no se trata de un artículo original, sino de una medio traducción medio interpretación de este original en inglés. Podéis descargaros todo el código desde el enlace.

Se trata de un chat web simple, programado en php y basado en Ajax, haciendo uso de jQuery, con función de login y logout y soporte para varios usuarios.

El tutorial comienza creando un archivo index.php tal cual este:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<title>Chat - Customer Module</title>  
<link type="text/css" rel="stylesheet" href="style.css" />  
</head>  
<div id="wrapper">  
    <div id="menu">  
        <p class="welcome">Welcome, <b></b></p>  
        <p class="logout"><a id="exit" href="#">Exit Chat</a></p>  
        <div style="clear:both"></div>  
    </div>  
    <div id="chatbox"></div>  
    <form name="message" action="">  
        <input name="usermsg" type="text" id="usermsg" size="63" />  
        <input name="submitmsg" type="submit"  id="submitmsg" value="Send" />  
    </form>  
</div>  
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.0.js"></script>  
<script type="text/javascript">  
// jQuery Document  
$(document).ready(function(){  
});  
</script>  
</body>  
</html>

Como podéis ver se trata de un marcado HTML normal. La referencia a jQuery del código original está anticuada, en este ejemplo ya veréis una apuntando una dirección actualizada. En cuanto a la estructura hay tres grandes divs: el #wrapper, que contiene los otros dos y el formulario de envío de mensaje; el #menu, que sólo es un mensaje de bienvenida y un botón de logout y, finalmente, el #chatbox, que es donde se incluirán los mensajes.

El css sería tal que así:

    /* CSS Document */  
    body {  
        font:12px arial;  
        color: #222;  
        text-align:center;  
        padding:35px; }  
    form, p, span {  
        margin:0;  
        padding:0; }  
    input { font:12px arial; }  
    a {  
        color:#0000FF;  
        text-decoration:none; }  
        a:hover { text-decoration:underline; }  
    #wrapper, #loginform {  
        margin:0 auto;  
        padding-bottom:25px;  
        background:#EBF4FB;  
        width:504px;  
        border:1px solid #ACD8F0; }  
    #loginform { padding-top:18px; }  
        #loginform p { margin: 5px; }  
    #chatbox {  
        text-align:left;  
        margin:0 auto;  
        margin-bottom:25px;  
        padding:10px;  
        background:#fff;  
        height:270px;  
        width:430px;  
        border:1px solid #ACD8F0;  
        overflow:auto; }  
    #usermsg {  
        width:395px;  
        border:1px solid #ACD8F0; }  
    #submit { width: 60px; }  
    .error { color: #ff0000; }  
    #menu { padding:12.5px 25px 12.5px 25px; }  
    .welcome { float:left; }  
    .logout { float:rightright; }  
    .msgln { margin:0 0 2px 0; }  

Poca cosa que comentar, pero entre esto y el marcado ya tenemos la apariencia definida del chat.

Ahora toca el formulario de login en PHP:

    <?  
    session_start();  
    function loginForm(){  
        echo' 
        <div id="loginform"> 
        <form action="index.php" method="post"> 
            <p>Please enter your name to continue:</p> 
            <label for="name">Name:</label> 
            <input type="text" name="name" id="name" /> 
            <input type="submit" name="enter" id="enter" value="Enter" /> 
        </form> 
        </div> 
        ';  
    }  
    if(isset($_POST['enter'])){  
        if($_POST['name'] != ""){  
            $_SESSION['name'] = stripslashes(htmlspecialchars($_POST['name']));  
        }  
        else{  
            echo '<span class="error">Please type in a name</span>';  
        }  
    }  
    ?>     

En este caso se trata de un login simple, no comprueba usuarios registrados en una base de datos. Sobre su funcionamiento hay poco que comentar: nos pide un nombre y lo incluye dentro de una variable de sesión (de ahí la llamada a session_start()). El uso de htmlspecialchars() es para evitar ataques XSS.

Lo siguiente es motrar tanto el nombre de usuario en el Welcome como el formulario si el usuario no está logueado. La idea es dejar el primer archivo, el index.php tal cual este:

    <?php  
    if(!isset($_SESSION['name'])){  
        loginForm();  
    }  
    else{  
    ?>  
    <div id="wrapper">  
        <div id="menu">  
            <p class="welcome">Welcome, <b><?php echo $_SESSION['name']; ?></b></p>  
            <p class="logout"><a id="exit" href="#">Exit Chat</a></p>  
            <div style="clear:both"></div>  
        </div>  
        <div id="chatbox"></div>  
        <form name="message" action="">  
            <input name="usermsg" type="text" id="usermsg" size="63" />  
            <input name="submitmsg" type="submit"  id="submitmsg" value="Send" />  
        </form>  
    </div>  
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>  
    <script type="text/javascript">  
    // jQuery Document  
    $(document).ready(function(){  
    });  
    </script>  
    <?php  
    }  
    ?>  

Bien, ahora vamos con el código de Javascript para la funcionalidad de logout. Dentro del script que ya tenemos creado en nestro código insertamos:

    <script type="text/javascript">  
    // jQuery Document  
    $(document).ready(function(){  
        //If user wants to end session  
        $("#exit").click(function(){  
            var exit = confirm("Are you sure you want to end the session?");  
            if(exit==true){window.location = 'index.php?logout=true';}  
        });  
    });  
    </script>  

Esto no sólo nos permite enviar una llamada por el método GET para desconectar al usuario, sino que también nos sacará una ventana de confirmación antes de hacerlo. Y claro está, tendremos que tocar nuestro código del index.php para comprobar que se ha hecho una petición de logout y destruir la sesión que se había creado en el login:

    if(isset($_GET['logout'])){  
        //Simple exit message  
        $fp = fopen("log.html", 'a');  
        fwrite($fp, "<div class='msgln'><i>User ". $_SESSION['name'] ." has left the chat session.</i><br></div>");  
        fclose($fp);  
        session_destroy();  
        header("Location: index.php"); //Redirect the user  
    }  

Este código, además, escribe en un archivo de logs (más tarde vemos para qué se usará) que el usuario se ha desconectado y redirecciona de nuevo a la página principal.

Lo siguiente es manejar las inserciones de mensajes de los usuarios. Hay que empezar por definir una función de jQuery para enviar los mensajes por el método POST haciendo uso de Ajax. El proceso sería recoger el evento de click del formulario, leer los datos del campo de texto, enviarlos al script de php que los va a tratar y borrar el campo de texto para que quede de nuevo en blanco:

    //If user submits the form  
    $("#submitmsg").click(function(){  
        var clientmsg = $("#usermsg").val();  
        $.post("post.php", {text: clientmsg});  
        $("#usermsg").attr("value", "");  
        return false;  
    });  

Y claro, esto implica crear el archivo post.php para manejar los datos en el lado del servidor. Un archivo que llevaría este código:

    <?  
    session_start();  
    if(isset($_SESSION['name'])){  
        $text = $_POST['text'];  
        $fp = fopen("log.html", 'a');  
        fwrite($fp, "<div class='msgln'>(".date("g:i A").") <b>".$_SESSION['name']."</b>: ".stripslashes(htmlspecialchars($text))."<br></div>");  
        fclose($fp);  
    }  
    ?>  

De nuevo iniciamos sesión, comprobamos que el usuario está logueado, recogemos el texto del mensaje del array $_POST y escribimos el mensaje junto al nombre de usuario en el log del chat.

Finalmente llevamos a la parte de mostrar los mensajes de chat en pantalla. Lo primero es cargar el log del chat dentro del #chatbox si este existe, para ahorrarnos tiempo:

    <div id="chatbox"><?php  
    if(file_exists("log.html") && filesize("log.html") > 0){  
        $handle = fopen("log.html", "r");  
        $contents = fread($handle, filesize("log.html"));  
        fclose($handle);  
        echo $contents;  
    }  
    ?></div>  

Lo siguiente es la carga por Ajax de los datos contenidos en el archivo de log. La cosa se arreglaría con el método de jQuery para Ajax:

    //Load the file containing the chat log  
        function loadLog(){  
            $.ajax({  
                url: "log.html",  
                cache: false,  
                success: function(html){  
                    $("#chatbox").html(html); //Insert chat log into the #chatbox div  
                },  
            });  
        }  

El parámetro url nos indica a qué archivo intentamos acceder por Ajax, cache es para definir si queremos cachear el archivo o no (en este caso, por lógica, no, porque queremos recargarlo en cada llamada) y finalmente la función que se ejecutará en caso de éxito (en este caso insertar el log en el div #chatbowx).

Para añadir autoscrolling, modificas el código anterior añadiendo lo siguiente:

    //Load the file containing the chat log  
    function loadLog(){  
        var oldscrollHeight = $("#chatbox").attr("scrollHeight") - 20; //Scroll height before the request  
        $.ajax({  
            url: "log.html",  
            cache: false,  
            success: function(html){  
                $("#chatbox").html(html); //Insert chat log into the #chatbox div  
                //Auto-scroll  
                var newscrollHeight = $("#chatbox").attr("scrollHeight") - 20; //Scroll height after the request  
                if(newscrollHeight > oldscrollHeight){  
                    $("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); //Autoscroll to bottom of div  
                }  
            },  
        });  
    }  

Básicamente consiste en ir modificando el tamaño para ocultar la parte de arriba y ampliar la de abajo. Simple truquillo. Ahora nos falta que el chat se auto recargue, cosa que haremos desde javascript:

setInterval (loadLog, 2500);

Esto lanza la función loadLog cada dos segundos y medio, logrando recargar los datos.

En el artículo orginal además encontraréis al final una serie de artículos con consejos varios para mejorar el código (en inglés) y todo el código completo para descargar.

Charles Bradley – No time for Dreaming (2011)

Sacar tu disco debut a los 62 años… pues es algo que no suele verse en el mundillo musical. Bien es cierto que aunque No time For Dreaming es el primer LP de Charles Bradley este ya había publicado singles con anterioridad, y con regularidad, desde 2002, pero con todo no era un chaval cuando se lanzó a esto de la música. Nacido en Gainesville, Florida, criado en Brooklyn y curtido a lo largo de toda América, la cual recorrió alternando trabajos como cocinero, camarero, mozo de almacén e imitador de James Brown. Y es que Bradley comenzó en la música haciendo temas del padrino del soul.

No time for Dreaming
No son tiempos para los soñadores

No hay sitio para modernismos en la música de Bradley, una escucha a su sonido y pensarás que estás escuchando un disco de principios de los 60. Es clásico, es old school, es un tío que no oculta su pasión por James Brown, Wilson Pickett, Ike Turner o Marvin Gaye. Si ves cualquier vídeo suyo en directo alucinarás, el tío es un huracán al más puro estilo Brown, corre, salta, vibra… un showman pero a la vez un elegante vocalista de soul.

En cuanto a los temas, combina las clásicas canciones de desamor, que desgrana con una voz grave y masculina, como Heartaches and pain o I believe in your Love con temas más positivos como Loving you baby o In You (I Found a Love). Pero donde da verdaderamente la intensidad es en las canciones de temática más social, sobre los barrios marginales en los que se ha criado. Sobre la violencia de los ghettos, sobre el duro día a día del trabajador. Golden Rule, Why it’s so hard o The World (Is Going Up in Flames), canciones que hablan sobre nacer pobre y morir pobre, canciones que sólo el que se levanta antes de que salga el sol y camina entre la lluvia y el frío para encerrarse en el trabajo sabe transmitir. Ojito también a los temas instrumentales, sobre todo los dejes latinos de Since Our Last Goodbye, sorprendente temazo, aunque la breve Trouble in the Land tampoco está mal.

En fin, un curioso disco de soul añejo a cargo de un músico con una vida dura detrás que hace que los temas sean verdaderas canciones sentidas y no meros productos embalados para su venta en serie. Música hecha con sinceridad y con calidad, de lo mejor que salió en 2011. No es rock and roll, cierto, pero es un trabajo excelso que no debes perderte.

Redimensionar imágenes en PHP

Es habitual que cuando en una web trabajamos con imágenes tengas que presentar la misma en varios tamaños. Una opción es redimensionarla en pantalla con CSS… pero es una mala opción. Es una mala opción porque lo que haces es cargar una imagen grande y luego procesarla para hacerla pequeña, por lo que ralentizas la carga de la página. ¿La solución? Guardar una copia reducida de la imagen, lo que se llama un thumbnail.

¿Y cómo reducir la imagen? Bueno, PHP incluye la librería GD que nos permite tratar y creawr imágenes. Y además, en este caso, vamos a redimensionar la imagen manteniendo la proporción.

//Ruta de la original
$rtOriginal="/images/example.jpg";
	
//Crear variable de imagen a partir de la original
$original = imagecreatefromjpeg($rtOriginal);
	
//Definir tamaño máximo y mínimo
$max_ancho = 150;
$max_alto = 150;

//Recoger ancho y alto de la original
list($ancho,$alto)=getimagesize($rtOriginal);

//Calcular proporción ancho y alto
$x_ratio = $max_ancho / $ancho;
$y_ratio = $max_alto / $alto;

Con esto ya tenemos los datos para mantener las proporciones de la imagen. Ahora toca calcular el tamaño:

if( ($ancho <= $max_ancho) && ($alto <= $max_alto) ){
//Si es más pequeña que el máximo no redimensionamos
	$ancho_final = $ancho;
	$alto_final = $alto;
}
//si no calculamos si es más alta o más ancha y redimensionamos
elseif (($x_ratio * $alto) < $max_alto){
	$alto_final = ceil($x_ratio * $alto);
	$ancho_final = $max_ancho;
}
else{
	$ancho_final = ceil($y_ratio * $ancho);
	$alto_final = $max_alto;
}

Con esto ya tenemos el tamaño de la imagen con las proporciones guardadas. Finalmente nos queda crear la imagen y guardarla:

//Crear lienzo en blanco con proporciones
$lienzo=imagecreatetruecolor($ancho_final,$alto_final);	

//Copiar $original sobre la imagen que acabamos de crear en blanco ($tmp)
imagecopyresampled($lienzo,$original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto);

//Limpiar memoria
imagedestroy($original);

//Definimos la calidad de la imagen final
$cal=90;

//Se crea la imagen final en el directorio indicado
imagejpeg($lienzo,"./images/thumb.jpg",$cal);

Todo el cálculo, por otra parte, es necesario sólo si quieres mantener la proporción, si no la cosa queda más sencilla:

//Ruta de la original
$rtOriginal="/images/example.jpg";
	
//Crear variable de imagen a partir de la original
$original = imagecreatefromjpeg($rtOriginal);
	
//Definir tamaño máximo y mínimo
$ancho_final = 150;
$alto_final = 150;

//Recoger ancho y alto de la original
list($ancho,$alto)=getimagesize($rtOriginal);

$lienzo=imagecreatetruecolor($ancho_final,$alto_final);	

//Copiar $original sobre la imagen que acabamos de crear en blanco ($tmp)
imagecopyresampled($lienzo,$original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto);

//Limpiar memoria
imagedestroy($original);

//Definimos la calidad de la imagen final
$cal=90;

//Se crea la imagen final en el directorio indicado
imagejpeg($lienzo,"./images/thumb.jpg",$cal);

Esto para imágenes jpg. Para png la diferencia sería usar imagepng() para crear, y para gif imagegif(). En la web de php puedes investigar más sobre la librería GD y sacarle todo el jugo.

Convierte tu navegador en un block de notas

Este es un pequeño truco que he leído en el facebook de un colega, y desconocía su existencia.

Si en la barra del navegador escribes la siguiente línea:

data:text/html, <html contenteditable>

Verás una página en blanco. Si pulsas podrás escribir sobre ella, como si fuera el notepad o el gedit. Y para salvar, ctrl+S y te lo guardará, añadiendo las pertinentes etiquetas html.

Una simple curiosidad.

Cinco leyendas del basket que puede que no conozcas

Habitualmente en este blog hablo de jugadores NBA o jugadores destacados de las competiciones FIBA europeas, pero en esta ocasión toca un punto para lo exótico. Porque hay jugadorazos que han quedado un tanto olvidados en estas latitudes occidentales por no haber jugado ni en Europa ni en la NBA, pero que mostraron su calidad en otras competiciones. Por lo que aquí va mi lista de cinco jugadores exóticos:

  • Kosuke Takeuchi: Comienzo con un jugador en activo, un chaval fijo en las ligas de verano de la NBA pero que nunca ha dado el salto. Takeuchi no es un veterano, realmente no se ha ganado el título de leyenda, pero es un jugador muy interesante que pasa totalmente desapercibido, y pega mucho con el perfil de los siguientes. Y es que Japón no es una selección habitual en los torneos de selecciones, y su liga no es demasiado conocida. Nacido en 1985 ha estado en el punto de mira de los T-Wolves, pero ha preferido no arriesgarse y quedarse en Japón tras no haber sido drafteado en 2007. Lideró a  los Aisin Seahorses a varios títulos de la JBL y actualmente destaca en las filas de los Toyota Alvark , además de despuntar en los juegos Asiáticos con la selección japonesa. Es un ala-pivot de 2-05 y 100 kilos muy ágil, con un juego de pies rápido y buena muñeca de media distancia, brazos largos y gran capacidad para el rebote. ¿Llegará al status de los siguientes? Quien sabe, pero creo que es un jugador a tener en cuenta mientras esté activo.
    Takeuchi
    Kosuke Takeuchi

     

  • Ruperto Herrera: A principios de los 70, cuando la NBA apenas miraba al extranjero, este alero de 1.98 estuvo en el punto de mira de muchos equipos. Ruperto Herrera comenzó su carrera a mediados de los 60 en la sección de baloncesto del Industriales, donde jugaría hasta 1982 y a los que lideraría a varios títulos de campeón de liga. Herrera era un comunista convencido, por lo que jamás aceptó abandonar Cuba para labrarse una carrera más lucrativa en otros países. Como internacional disputó cuatro juegos olímpicos (entre México ’68 y Moscú ’80), además de varias apariciones en los juegos Centroamericanos y del Caribe y en el campeonato del Mundo. Lideró a Cuba a su mayor hito baloncestístico: la medalla de bronce en loas olimpiadas de Munich. Además cosechó varios éxitos en los Juegos Centroamericanos, un bronce en los Panamericanos del ’71 y una cuarta plaza en el mundial del 74. Se trataba de un jugador trabajador y rocoso, con una capacidad anotadora muy irregular, capaz de partidos de 30 puntos seguidos de otros de 5. Tras su retirada entró a formar parte del Comité Olímpico cubano.

    Ruperto Herrera
  • Andrew Gaze: Probó suerte en la NBA con los Spurs que ganaron en campeonato del Lock-out pero no consiguió minutos, aunque sí le mandaron un anillo desde la franquicia a pesar de haberle cortado antes de los play-off. Previamente había estado en los Washington Bullets y los Seattle Supersonics pero tampoco le hicieron hueco. También jugó un año en la liga universitaria, llegando a disputar las finales de 1989. Está claro, Andrew Gaze no tuvo suerte en los Estados Unidos. Pero en su país, Australia, es una leyenda, y con razón. ¿Motivos? Por ejemplo el haber formado parte de su selección en 5 juegos olímpicos (entre 1984 y 2000), o el haber jugado más de 20 años en la liga de su país, retirándose con un promedio de más de 30 puntos por partido, el haber logrado 15 nominaciones consecutivas al equipo ideal de la liga australiana o el haber conseguido 7 MVP’s de esta competición. Sí, este escolta de dos metros, con un impresionante tiro exterior se merece el título de legendario, una verdadera ametralladora.

    Andrew Gaze
    Andrew Gaze
  • Marquinhos: Marcos Antônio Abdalla «Marquinhos» Leite. Antes que Splitter, antes que Varejao, antes que Nené, antes que Hettsheimeir el gran pivot brasileño fue Marquinhos. Con sólo 18 años jugó el mundial de 1970, y cuajó una gran actuación en las olimpiadas de Munich ’72. Llegó a la liga universitaria tras su impresionante actuación olímpica y destacó siendo nombra All-America. A pesar de su último año universitario con 18.7 puntos y más de 10 rebotes por partido, no llamó la atención y fue elegido en décima ronda del draft de 1976 por Portland, lo que le llevó a volver a Brasil para desarrollar su carrera profesional, que se movería entre su país natal y el pallacanestro italiano, donde jugó tres temporadas a enorme nivel. También lograría ganar dos medallas en los munudiales de baloncesto (plata en 1970 y bronce en 1978) y cuatro en los juegos panamericanos (oro en 1971, bronces en 1975 y 1979 y plata en 1983). Como podéis ver en la foto de abajo, además lucía un mostacho y una melena dignos de liderar una banda de doom metal.

    Marquinhos Leite
    Marquinhos
  • Pero Cameron: Con 1.98 y 125 kilos de peso uno veía a este neozelandés y pensaba «qué coño pina un jugador de Rugby en la selección de baloncesto». Uno de los motivos por los que no perderse los mundiales de basket y olimpiadas en la primera década de este siglo era poder ver a este enorme jugador en acción. Saltó a la palestra en Indianapolis 2002, donde se le eligió como parte de un quinteto ideal huérfano de estadounidenses (él, Ginobili, Stojakovic, Yao Ming y Nowitzki) aunque sobrado de talento (menos Cameron el resto fueron all stars en la NBA). Cameron era un jugador atípico, con un tamaño que le hacía jugar de cuatro pero los fundamentos de un tres: buena muñeca, buen manejo de balón, capaz de jugar de espaldas o de frente al aro indistintamente, inteligente para generar espacios y gran defensor. La mayor parte de su carrera la pasó jugando entre su país y la liga australiana, donde fue MVP y campeón de liga varias veces. Extrañamente sí se aventuró a recorrer otros países, pero sus primeros destinos fueron Irán, Malasia y Reino Unido, ligas no precisamente fuertes. Probó suerte en Turquía, pero ya con 32 años, y no logró un rendimiento espectacular, si bien a esas alturas la edad ya no ayudaba. Se retiró tras el mundial de 2010 como uno de los mejores jugadors que ha dado Oceanía.

    Pero Cameron
    Pero Cameron

Cinco jugadore que por diversas cuestiones no suelen ser recordados cuando se habla de grandes del baloncesto y con los que siempre tendremos la duda ¿y si hubieran tenido minutos en la NBA? ¿Y si hubieran caído en un grande Europeo? Los eternos «what if?» que siempre estarán ahí.