Streaming de ficheros zip en php

carlosgarciafaria at gmail punto com

Streaming de ficheros zip en php

En Uhuru Labs tenemos varias secciones con archivos descargables. Algunos de ellos son ficheros comprimidos en .zip como MMP, la extensión para VLC que creamos hace ya un año.

El caso es que subimos la versión y no nos dimos cuenta durante bastante tiempo de que teníamos un error grave a la hora de descargar los ficheros comprimidos. Resulta que sí que descargaba un fichero .zip, pero al descomprimirlo este se convertía en un fichero .cpgz y al descomprimir este volvía a aparecer el fichero .zip. Era un bucle infinito de descompresiones!!

El error lo teníamos en la descarga del archivo, ya que utilizamos un script php que, aparte de proporcionar el archivo comprimido según el proyecto y la versión de este, nos avisa por correo de la descarga realizada. En este script ponemos los datos del header y luego vamos leyendo el archivo requerido y mandandolo mediante la orden flush().

Para corregir el error, una vez creados los datos de la cabecera hay que hacer un ob_clean(), limpiando así el buffer de salida antes de empezar a mandar nada.

El código quedaría así:

    $fname = basename($file_path);
    // file size in bytes
    $fsize = filesize($file_path);
    $fext = strtolower(substr(strrchr($file_path,"."),1));

    $mtype = $fichero[0]['post_mime_type'];    

    // Browser will try to save file with this filename, regardless original filename.
    // You can override it if needed.
    $asfname = $fname;

    // set headers
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Type: $mtype");
    header("Content-Disposition: attachment; filename=\"$asfname\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . $fsize);

	ob_clean(); 

    // download
    // @readfile($file_path);
    $file = @fopen($file_path,"rb");
    if ($file) {
      while(!feof($file)) {
        print(fread($file, 1024*8));
        flush();
        if (connection_status()!=0) {
          @fclose($file);
          die();
        }
      }
      @fclose($file);
    }

Cómo bajar las fuentes de Google en OSX

Siguiendo los pasos indicados en la página inicial del proyecto Google Fonts en Google Code me bajé todas las fuentes para poder utilizarlas en mis diseños.

Estos son los pasos:

  1. Bajar e instalar Mercurial según la versión de OSX (Lion – 10.7, Snow Leopard – 10.6, etc…)
  2. Abrir el Terminal (Aplicaciones/Utilidades/Terminal) y poner la siguiente orden:
    hg clone https://googlefontdirectory.googlecode.com/hg/ destino

    Donde destino es el nombre del directorio donde se guardarán las fuentes

Con estos dos simples pasos empezará a descargarse toda la base de datos de fuentes del proyecto. Una vez finalizada si sale una nueva fuente en Google Fonts solo con utilizar la siguiente orden en el Terminal estando dentro del directorio destino se actualizará el proyecto bajando solo las nuevas fuentes:

hg pull

+info: http://code.google.com/p/googlefontdirectory/

Cambiar entre tiendas en Magento

Tenemos un cliente en Logocomunica que tiene dos tiendas en la misma instalación de Magento. Quería que hubiese una forma de pasar de una a otra tienda mediante un switcher o algo por el estilo.

Buscando por internet he encontrado un snippet que saca un combo para cambiar de una tienda a otra.

Snippet for switching between websites por la gente de Inchoo

Lo que he hecho ha sido coger ese snippet, meterlo en una carpeta llamada selectarea dentro de la carpeta template de mi tema y luego en el archivo de layout page.xml, dentro del bloque header he incluído esta línea justo encima de la línea que indica el bloque del buscador (se puede incluir en el sitio que queramos de todas formas):

<block type="core/template" name="select.area" as="selectArea" template="selectarea/select.area.phtml"/>

Luego tuve que cambiar el nombre del los websites para que pusiera lo que yo quería, pero eso es tema aparte.

Vídeos youtube en Magento

Parece algo sencillo, y en realidad lo es, lo que pasa es que hay un par de pegas que hacen que escriba este post.

Si queremos meter un video de youtube en un bloque estático o en una página en Magento, simplemente con ir a la url del video y obtener el código para compartir. Ahora es mucho más limpio ya que es una url que incluye todo en un tag <iframe> con lo que no hay tantos tags crípticos.

1. Una de las pegas que he encontrado es que se puede meter código html directamente en Magento, pero con la particularidad de que al acceder al contenido una vez guardado este, ciertos tags, como en este caso el tag <iframe> no se muestra en el editor.

Para arreglar esto hay que decirle al javascript utilizado en el editor del administrador que se pueden utilizar tags <iframe>. Lo que hay que hacer es incluir la línea:

 extended_valid_elements : 'iframe[src|style|width|height|scrolling|marginwidth|marginheight|frameborder],style,script',

en los settings del editor en:  js/mage/adminhtml/wysiwyg/tiny_mce/setup.js, cerca de la línea 96 donde pone var settings = {, dentro de este bloque es donde hay que añadir la línea, por ejemplo debajo de theme_advanced_resizing : true,

2. La otra pega, y esta ya es global, tanto para Magento como para cualquier web, es que puede ser que en la misma página tengamos un lightbox o una ventana modal que se muestre al pinchar en un enlace. Al mostrarse esta ventana modal ésta queda por debajo del video. Para solucionar esto, habrá que añadir a la url del video el parámetro wmode=opaque. Quedaría algo así:

 <iframe src="http://www.youtube.com/embed/XXXXXXXX?wmode=Opaque" width="354" height="221" frameborder="0"></iframe>

Hay que tener en cuenta que si tenemos algún parámetro más en la url tendremos que poner un & en lugar del ? :

<iframe src="http://www.youtube.com/embed/XXXXXXXX?foo=bar&amp;wmode=Opaque" width="354" height="221" frameborder="0"></iframe>

Con esto tendremos los vídeos como tienen que verse y no montándose encima de nuestras ventanas modales.

+info
+info

Borrar XCode3 ( Developer-old )

Una vez instalado XCode 4 se mueve la carpeta del anterior XCode3 a /Developer-old

Para borrar los archivos anteriores y recuperar 5GB de espacio en disco se debe ejecutar la siguiente orden desde el terminal:

sudo /Developer-old/Library/uninstall-devtools --mode=all

Después de hacer esta operación aún quedará la carpeta /Developer-old con alguna carpeta dentro (Application, Documentation, Extras) que ocupan en total unos míseros 20 megas. Con borrar esta carpeta nos habremos librado de la anterior versión de XCode.

Tip sencillo pero útil…

+ info en inglés

Cambiar posición del símbolo euro en Magento

Hoy me ha llegado una nueva tarea de un cliente. Como cliente español que es quería el símbolo del euro de los precios detrás del importe, es decir que pusiera esto 190,00 € en lugar de € 190,00 como están acostumbrados los angloparlantes.

Me ha llevado un buen rato encontrar como se hacía ya que yo tengo la sana (por lo menos la mayoría de las veces) costumbre de buscar las cosas en inglés. Al ser algo específico del idioma castellano pues hasta que se me ha ocurrido buscar en castellano pues he perdido un ratico. En fin, he buscado en castellano y he encontrado este post de los foros de magento donde indica como cambiar la posición del símbolo euro.

Resumiendo, lo que hay que hacer es cambiar en el archivo es.xml situado en lib/Zend/Locale/Data el currencyFormat:

<currencyFormats>
<currencyFormatLength>
<currencyFormat>
<pattern>¤ #,##0.00</pattern>
</currencyFormat>
</currencyFormatLength>
</currencyFormats>

por esto otro…

<currencyFormats>
<currencyFormatLength>
<currencyFormat>
<pattern>#,##0.00 ¤</pattern>
</currencyFormat>
</currencyFormatLength>
</currencyFormats>
<currencies>

Y atención porque aquí viene lo importante. No lo avisa en el post explícitamente pero yo lo acabo de comprobar. Resulta que el cambio no es inmediato, da igual que refresques la caché, que la deshabilites, que te borres las cookies o la caché del navegador. Lo importante aquí es la paciencia, porque al cabo de un rato cambia solo!!!!

Increíble pero cierto, se ve que ese valor debe estar asociado a la sesión de la aplicación o algo así y hasta que no pasa un buen rato no se reflejan los cambios (supongo que en ese rato nadie debe utilizar la página o el timeout para expire no llegará nunca).

En mi caso ha tardado una hora o así ya que la web no está abierta al público todavía, así es que lo dicho, paciencia.

Otra cosa más al saco de Magento…

Aplicación Android no carga las imágenes de alta densidad

Para la aplicación que estamos haciendo en Uhuru Labs tenemos como objetivo varios tamaños de pantalla a diferentes resoluciones. Para ello hay que adecuar los elementos gráficos que utilizamos en la aplicación para que sean vistos en los diferentes tipos de pantalla.

Haciendo pruebas hace un tiempo, ya que andamos un tanto verdes en el asunto, nos dimos cuenta, probando en un HTC Desire, que la aplicación no cargaba las imágenes adecuadas para la pantalla de este dispositivo, y eso que estaban bien posicionadas en su directorio correspondiente (hdpi).

Buscando por internet dimos con que hay que indicarle a la aplicación mediante el archivo Manifest.xml a que tipo de pantallas está enfocada la aplicación mediante estas líneas:

<supports-screens android:resizeable=["true" | "false"]
                  android:smallScreens=["true" | "false"]
                  android:normalScreens=["true" | "false"]
                  android:largeScreens=["true" | "false"]
                  android:xlargeScreens=["true" | "false"]
                  android:anyDensity=["true" | "false"] />

+info: http://developer.android.com/guide/topics/manifest/supports-screens-element.html

jScrollPane – scrollbars con jQuery y CSS

Para el próximo proyecto que vamos a hacer en casa vamos a hacer web, evidentemente. Para ello ya estoy diseñando con Photoshop los diferentes elemento que tendrá la web. Buscando por internet inspiración prodigiosa encontré la web de cargo collective, donde tienen un buen porrón de webs chulas.

Una de ellas es Apollo11 que contiene fotos antiguas del proyecto Apollo de la NASA.

En fín, yo a lo que iba es que me gustó mucho el scrollbar que tienen en esa web. Tirando del hilo me encontré con que estaba hecho con un plugin para jQuery, jScrollPane. Ah! Mi querido jQuery, que haría yo sin tí…

Así es que ya tengo esa parte de la web diseñada, ahora habrá que ver si, después de maquetar, me funciona bien en todos los navegadores, pero en principio debería quedar tal que así:

Google WebFonts v2

Que tiemble MyFonts, FontSquirrel y demás servicios online de tipografías chulas. Ya está aquí Google WebFonts v2.

Con esta aplicación web puedes hacerte una colección de las tipografías proporcionadas por Google y luego descargártela. Estaría bien que luego se pudieran compartir por seguir el rollo social y esas cosas que tanto se llevan ahora con la guerra que se llevan con google plusone y todo el cotarro.

En fin, igual he dado alguna idea…

Freehand MXa en OSX Snow Leopard

Supongo que esta entrada ya está obsoleta nada más publicarla, pero como utilizo este blog como base de datos de conocimiento, para que no se me vayan olvidando las cosas…

Bueno, el caso es que ayer, instalándole a mi nuevo Macbook Pro la última versión de Freehand, sí, habéis oido bien, Freehand… y es que muchos clientes siguen usando este útil aunque obsoleto software, así es que hay que instalarlo. Bueno, pues resulta que al ir a arrancarlo directamente se cerraba, sin dar ninguna clase de error.

Buceando por internet buscando una solución para Snow Leopard encontré este post que soluciona el no poder arrancar Freehand en OSX 10.6. Lo único que hay que hacer es bajarse el archivo de registro, descomprimirlo y pegarlo en Macintosh HD\Library\Application Support\Macromedia.

Solo con esto ya arranca Freehand a la primera. Enhorabuena a los premiados.