Optimizando el arreglo $_FILES de PHP

En PHP, cuando usamos un formulario para cargar varios archivos al mismo tiempo con …

<input type="file" name="array_of_files[]" multiple>

… el encargado de recibir los archivos es el arreglo $_FILES, que tiene la nada usable sintaxis $_FILES['field']['key']['index'], que no ayuda en nada para recorrer el arreglo en un loop.

Por suerte, podemos optimizar el arreglo $_FILES para que su sintaxis sea $_FILES['field']['index']['key'], usando lo siguiente:

<?php
function fixFilesArray(&$files)
{
    $names = array( 'name' => 1, 'type' => 1, 'tmp_name' => 1, 'error' => 1, 'size' => 1);
 
    foreach ($files as $key => $part) {
        $key = (string) $key;
        if (isset($names[$key]) && is_array($part)) {
            foreach ($part as $position => $value) {
                $files[$position][$key] = $value;
            }
            unset($files[$key]);
        }
    }
}
?>

Ahora, ya podemos recorrer el arreglo cómodamente:

<?php
fixFilesArray($_FILES['array_of_files']);
 
foreach ($_FILES['array_of_files'] as $position => $file) {
    var_dump($file);
}
?>

De esas joyas que uno encuentra en los comentarios de la documentación de PHP.

Bash Script Magic

Si algo hace a Linux poderoso es el manejo adecuado de la terminal, y cuando se usan bash scripts la magia se hace presente. Es por ello, que he querido compartir con ustedes algunos de esos scripts que uso día con día, estoy seguro a más de uno le serán útiles.

Cabe mencionar que todos los scripts abajo mencionados se aplican a todos los archivos (del tipo en cuestión respectivamente) del directorio actual.

Convertir imágenes PNG en JPG

Para este script (y el siguiente) es necesario tener instalado imagemagick.

#!/bin/bash
for file in *.png; do
    convert "$file" "${file%.png}.jpg"
    rm "$file"
done

Redimensionar imágenes JPG

#!/bin/bash
for f in *.jpg; do convert $f -resize 1024 $f; done;

El número 1024 representa en nuevo ancho (width) de la imagen, pueden cambiarlo obviamente.

Convierte archivos de texto de ISO-8859-1 a UTF-8

#!/bin/bash
for file in *.srt; do
    iconv -f ISO-8859-1 -t utf-8 "$file" -o "${file%.srt}.utf8.srt"
    rm "$file"
done
rename .utf8.srt .srt *.utf8.srt

En este caso particular, estoy indicando el uso de archivos SRT (.srt), utilizados como subtítulos en videos, que normalmente se encuentran en la web en formato ISO-8859-1.

¿Cómo saber qué formato tienen tus archivos? Usa el comando file:

file *.srt

Convertir archivos de subtítulos SRT a SSA

Para este script, es necesario tener ffmpeg instalado.

#!/bin/bash
for file in *.srt; do
    ffmpeg -v quiet -i "$file" "${file%.srt}.ssa"
done

Tener los subtítulos en SSA tiene algunos beneficios (más delante menciono uno de ellos).

Crear video MKV a partir del video MP4 y del subtítulo SRT

Para los últimos scripts, es necesario tener instalado MKVToolNix (en ArchLinux » mkvtoolnix-cli)

#!/bin/bash
for video in *.mp4; do
    mkvmerge -o "${video%.mp4}.mkv" \
        --forced-track 0:no --compression 0:none --language 1:eng \
        --forced-track 1:no --compression 1:none -a 1 -d 0 -S -T \
        --no-global-tags --no-chapters "(" "$video" ")" --language 0:spa \
        --forced-track 0:no --compression 0:none -s 0 -D -A -T \
        --no-global-tags --no-chapters "(" "${video%.mp4}.srt" ")" \
        --track-order 0:0,0:1,1:0 --clusters-in-meta-seek \
        --engage no_cue_duration --engage no_cue_relative_position
done

Nota: Los subtítulos ya deben estar en UTF-8 (usar script arriba mencionado).

Este script (y el siguiente) tienen opciones adicionales para que los videos MKV sean compatibles con la mayoría de los reproductores de DVD / Bluray caseros.

Crear video MKV a partir del video MP4 y de los subtítulos SRT y SSA

#!/bin/bash
for video in *.mp4; do
    mkvmerge -o "${video%.mp4}.mkv" \
        --language 0:eng --default-track 0:yes --forced-track 0:no --compression 0:none \
        --language 1:eng --default-track 1:yes --forced-track 1:no --compression 1:none \
        -a 1 -d 0 -S -T --no-global-tags --no-chapters "(" "$video" ")" \
        --language 0:spa --default-track 0:yes --forced-track 0:no --compression 0:none \
        -s 0 -D -A -T --no-global-tags --no-chapters "(" "${video%.mp4}.srt" ")" \
        --language 0:spa --default-track 0:no --forced-track 0:no --compression 0:none \
        -s 0 -D -A -T --no-global-tags --no-chapters "(" "${video%.mp4}.ssa" ")" \
        --track-order 0:0,0:1,1:0,2:0 --clusters-in-meta-seek \
        --engage no_cue_duration --engage no_cue_relative_position
done

El video MKV resultante con este último script, pueden abrirlo en HandBrake y crear un video MP4 redimensionado y con los subtítulos pegados (¡gracias al uso de SSA!), para que puedan verlo en cualquier dispositivo móvil (por ejemplo, en mi ZTE Open con Firefox OS los veo con una resolución 480×320 perfectamente bien).

Inminente llegada del Kernel 3.13 a ArchLinux, ahora con soporte modular para PS/2

Teclado PS/2 en ArchLinux

Luego de una buena espera, el Kernel Linux 3.13 está a unas horas de llegar al repo [core] de ArchLinux, pero los desarrolladores nos avisan de un detallito que podría ocasionar problemas en algunos equipos: Ahora el soporte para teclados (keyboards) y ratones (mouse) con interfaz PS/2 será modular, o sea, ya no formará parte predeterminada del kernel.

¿Aún usas algún dispositivo de entrada PS/2? ¡Yo sí! ¿Qué debemos hacer? Antes que nada, no hay que dejar que panda el cúnico (como diría el gran Chespirito, ¡que casualmente hoy cumple 85 años!), sólo basta seguir los siguientes pasos:

  1. ¡Aún no actualices al nuevo kernel! Si lo haces, luego del reboot no podrás acceder a tu teclado o mouse PS/2.
  2. Antes que nada, cerciórate que en la línea HOOKS= del archivo /etc/mkinitcpio.conf tienes agregado keyboard. Si no es así, agrégalo, guarda el archivo (necesitas ser root), y ejecuta mkinitcpio -P.
  3. Ejecuta el siguiente comando:
    dmesg -t | grep '^i8042'
  4. Si aparece un mensaje que diga: “i8042: PNP: No PS/2 controller found. Probing ports directly.“, entonces debes agregar atkbd a la línea MODULES= en el archivo mkinitcpio.conf y ejecutar mkinitcpio -P.
  5. Si luego de reiniciar, aún no tienes acceso a tus dispositivos PS/2, debes agregar earlymodules=atkbd modules-load=atkbd a tu línea del kernel en tu bootloader instalado (GRUB, Syslinux, etc).

Eso es todo, no es un procedimiento complicado, pero repito: Si tienes un teclado o mouse PS/2, DEBES verificar el procedimiento mencionado ANTES de actualizar al Kernel Linux 3.13 (el cual debe llegar en unas pocas horas al repo [core] de ArchLinux).

Opera para Linux ha muerto :-(

Opera para Linux ha muerto

Hace unos momentos leía el post oficial sobre la liberación de la versión 19 del navegador web Opera, y con tristeza volvía a confirmar que aún no sacaban una versión para Linux. La esperanza aún seguía viva.

Sin embargo, minutos después el colega @Zagurito de PortalLinux, me informaba de una pésima noticia: Opera para Linux ha muerto :-(

La noticia publicada por Andreas Tolfsen (ex trabajador en Opera, como podemos corroborar en su website), dice textualmente:

At my previous employer, a small browser vendor that decided to abandon its own rendering engine and browser stack, I stopped using our product because Linux wasn’t a priority. Numerous reasons were given, such as low market share, “only geeks use it”, all journalists use Macs, &c.

This was to the point of ridiculing the platform and the people working on it, frequently citing “Linux jokes” such as “you’ll probably have to recompile your kernel first” whenever the question was seriously raised about when we’d start at least getting the core libraries working.

And when I say it wasn’t a priority, I mean that we didn’t even have something that was in a compilable state. A few people had started fixing up the broken code to get something that would compile on Linux in their own free time. After a few weeks of hacking, they were told by management to stop what they were doing and instead focus their volunteer efforts on the project goals, being to ship a Windows and Mac version.

So the company began the process of forcefully moving developers who’d worked on Linux for over 15 years to platforms they felt uncomfortable and unproductive working on.

This is a much longer tale, but it tells the story of a company alienating not only their loyal user base, but also a significant proportion of their own developers. The result? Lack of motivation and resignations.

Well done.

Ustedes, los lectores de este humilde blog, saben de mi gusto por Opera, he escrito sobre él bastante, y me entristece mucho esta noticia. A partir de hoy para mí, Opera se va al basurero de recuerdos tristes, donde le hará compañía a IE.

Firefox 26 y su Gestor de Aplicaciones

Firefox 26 y el nuevo Gestor de Aplicaciones

Acaba de ser liberado Firefox 26, ¡y viene cargado de novedades! Aquí las más importantes:

  • Nuevo Gestor de Aplicaciones (App Manager) que permite implementar y depurar webapps en teléfonos con Firefox OS y por medio del Firefox OS Simulator (tal y como podemos apreciar en la imagen al inicio del post).
  • Ahora todos los plug-ins de Java son ‘click to play’ de manera predeterminada.
  • El administrador de contraseñas ahora soporta campos de contraseñas generados vía script.
  • Las actualizaciones en Windows ya no requieren que el usuario tenga permisos de escritura en el directorio de instalación de Firefox (esta característica requiere el Mozilla Maintenance Service).
  • Soporte para H.264 en Linux vía gstreamer.
  • Soporte para decodificar MP3 en Windows XP.
  • Ahora el Social API soporta Social Bookmarking a través de su funcionalidad SocialMarks.
  • Soporte para la propiedad de orientación de imágenes en CSS.
  • Ahora cuando se muestra una imagen JPG sola, se usa la orientación EXIF.
  • Carga mejorada de páginas al no decodificar imágenes que no son visibles.

Como siempre, les exhorto a verificar la lista completa de novedades

Directas de Firefox 26 en Español

Firefox 26 en Español para Windows:

Firefox 26 en Español para MacOS X:

Firefox 26 en Español para Linux (32 bits):

Firefox 26 en Español para Linux (64 bits):

También pueden visitar la página oficial de descargas.

Copiando y Pegando texto entre Vim y X Window

Vim LogoUna de las cosas más frustrantes con las que me encontré hace mucho tiempo, al conocer Vim, es el dolor de cabeza que implicaba el copiar/cortar y pegar texto desde Vim a cualquier otra aplicación bajo X Window en Linux, y viceversa. Recuerdo haber instalado varios plugins, haber configurado de diversas maneras URxvt para lograr el objetivo, pero ninguna de estas “soluciones” me dejaba satisfecho.

Hace apenas pocas semanas, por fin me decidí a usar exclusivamente Vim para toda edición de texto (luego de varios intentos frustrados en el pasado), y todos los días Vim me sorprende con su poder, cada día descubro algo nuevo… pero había dejado pendiente el detalle arriba mencionado. Hoy por fin me puse a investigar más a fondo, y no paro de reirme de lo sencillo que es solucionar el bendito problema, ¡sin plugins ni trucos raros!

Primer problema: ¡Vim no tiene soporte para xterm_clipboard!

Dentro de Vim, ejecuta

:version

En la salida se muestran todas las opciones con las que Vim ha sido compilado, algunas precedidas con “+” (opción habilitada) y otras con “-” (opción no habilitada). La opción que nos interesa en este caso, es xterm_clipboard, ¿tienes “+” o “-” en ella? Si tienes “+”, ¡no tienes nada de qué preocuparte!. ¿Tienes “-“? Entonces lo lógico es que debes compilar Vim con dicha opción.

¿Odias compilar a mano? La mayoría lo hacemos, no te apures, ¿y entonces? ¡Hay una solución sencilla! En vez de tener instalado el paquete vim, ¡instala el paquete gvim! Con Gvim instalado, aún puedes ejecutar Vim en la terminal, ¡y ya incluye el soporte a xterm_clipboard!

Segundo problema: ¡Nunca recuerdo usar el registro +!

Vim usa registros para almacenar texto, y el registro + es el usado para compartir texto desde y para X Window (sea cual sea el entorno de escritorio que estés usando). O sea, para copiar texto deberíamos usar "+y y para pegar texto el respectivo "+p, ¡lo cual es muy común de olvidar!, ya que estamos muy acostumbrados a sólo usar y y p para ello.

¿La solución? Si usas una versión reciente de Vim (7.3.74 en adelante), ¡estás de suerte!, basta con agregar lo siguiente a tu ~/.vimrc para crear un alias entre ambos registros:

set clipboard=unnamedplus

¡Eso es todo! ¡No más dolores de cabeza al copiar, cortar y pegar texto entre Vim y las aplicaciones de tu entorno de escritorio favorito!

The Original Hacker: Jugando con la Inteligencia

The Original Hacker

Vaya sorpresa que nos dió mi amiga Eugenia Bahit el día de hoy, presentando su nuevo proyecto The Original Hacker: Jugando con la Inteligencia, una revista mensual en formato PDF, sobre temas que interesarán a todo verdadero hacker.

Si no conocen a Eugenia, les puedo comentar que es argentina, Arquitecta de Software y hacker especializada en tecnologías GLAMP (GNU/Linux, Apache, MySQL, Python y PHP) y eXtreme Programming; además, es la fundadora de Hackers & Developers Magazine.

Para no sonar repetitivo, los invito a leer el anuncio oficial en Debian Hackers de la mano de la propia Eugenia, para que tengan una idea más exacta del genial contenido que veremos mes a mes.

¿Qué esperas? ¡Descarga ya el No. 1 de The Original Hacker!

Liberado Firefox 25 con soporte Web Audio

Firefox 25

Un ciclo más se cumple, y ya tenemos con nosotros la nueva versión de nuestro navegador web favorito: Firefox 25. Sus novedades no son muchas, pero si sustanciales, y vale la pena mencionar las más importantes:

  • Soporte para Web Audio.
  • La barra de búsquedas ya no se comparte entre pestañas (tabs), y ha mejorado su aspecto (como podemos apreciar en la imagen de arriba).
  • Ahora si dejamos de usar Firefox por varios meses, nos ofrecerá nuevamente migrar el historial y configuraciones de algún otro navegador.
  • Ahora al resetear Firefox no se pierde la sesión de navegación actual.
  • Soporte para CSS3 background-attachment:local para controlar el desplazamiento de fondo.
  • Más funciones de ECMAScript 6 han sido implementadas (math, Map#forEach, Set#forEach, Array.of, Number.parseInt y Number.parseFloat).
  • El contenido de documentos iframe ahora puedes ser especificados inline.
  • Corregido el error en la pestaña new tab que mostraba miniaturas (thumbnails) vacíos o faltantes.
  • Correcciones diversas en la seguridad del navegador.

Como siempre, les exhorto a verificar la lista completa de novedades

Descargas Directas de Firefox 25 en Español

Firefox 25 en Español para Windows:

Firefox 25 en Español para MacOS X:

Firefox 25 en Español para Linux (32 bits):

Firefox 25 en Español para Linux (64 bits):

También pueden visitar la página oficial de descargas.