Firefox Developer Edition, ¡ya disponible!

image host¡El navegador web que todo desarrollador estaba esperando! Su nombre: Firefox Developer Edition.

Para no ser repetitivo, sólo quiero proporcionarles los enlaces necesarios para que estén enterados de todo lo relacionado con este nuevo canal de Firefox (que por cierto, reemplaza al canal Aurora):

Por cierto, si no les agrada su color oscuro, es muy sencillo darle el color original de Australis (ver siguiente imagen).
image host

Magistral el número de aniversario de The Original Hacker

Creo que el título del presente post lo dice todo: ¡Magistral el número de aniversario de The Original Hacker! Se trata de una guía adaptada para que los más novatos, incluso gente que jamás haya usado GNU/Linux ni desarrollado sobre este sistema, puedan montar su propio server. Ya la leí completa, y he quedado muy sorprendido por la excelente calidad de su contenido.

¡Descarga el PDF ahora mismo!

Una abierta felicitación a Eugenia Bahit, por tan sublime trabajo.

image host

El futuro del desarrollo para dispositivos móviles

image host

En los ultimos años hemos experimentado un desenfrenado avance en tecnologías móviles. Los teléfonos inteligentes (smartphones) y tablets son cada vez más frecuentes y, en muchos casos, más vendidos que los equipos de cómputo de escritorio y portátiles tradicionales. la comodidad que brindan al usuario ha sido la clave de su éxito.

Esa misma satisfacción del usuario final ha tenido su contraparte desde el principio: Los desarrolladores y diseñadores han tenido que adaptar su trabajo a cada dispositivo móvil. No suena muy complicado, pero lo es, pues implica conocer diversas plataformas de desarrollo. Por ejemplo, para una app nativa de Android, es necesario utilizar Java, para iOS hay que utilizar Objective-C o Swift, etc. ¿Desarrollar (prácticamente desde cero) una misma aplicación en diversas plataformas?, ¡es duplicar o triplicar esfuerzos! Aunque hay alternativas como Xamarin, que nos permite usar una sola plataforma (C#) para diversas arquitecturas, aún nos encontraremos con limitantes importantes.

¿Existirá una solución a todo este problema? ¡Por supuesto! Y ha estado con nosotros desde hace muchos, muchos años: La Web. Usar estándares como HTML, CSS y JavaScript (ECMAScript) es fácil y rápido de implementar, además de que una misma webapp puede ser accedida literalmente por cualquier arquitectura, incluyendo a Android e iOS. Por ello, muchos desarrolladores están "migrando" de crear "apps nativas" a "webapps adaptables" (la popularidad de PhoneGap es un claro ejemplo de ello), que incluso tienen el beneficio extra de que pueden ser utilizadas en la web tradicional de escritorio.

Muchos aún piensan que las webapps son exclusivas para plataformas como Firefox OS, Tizen o WebOS, pero no podrían estar más alejados de la realidad. Hoy en día, una webapp puede ser ejecutada en cualquier dispotivo móvil con Android o en todos los productos de Apple, como los iPhone o iPad, ambos basados en iOS.

Igualmente, hay muchos desarrolladores que aseguran que las webapps aún no cuentan con el nivel de integración a nivel de hardware con los dispositivos móviles como lo hacen las apps nativas, algo que quizás hace un tiempo era cierto, pero cada día que pasa disponemos de más Web APIs que han incrementado dicha integración.

Así que si deseas desarrollar para dispositivos móviles, ¿vas a aprender y programar en diversas plataformas para crear y recrear tus aplicaciones, o vas a enfocarte en crear una sola aplicación que funcionará en cualquier arquitectura? La respuesta es simple, sólo falta que la apliques.

Solucionar problemas al actualizar a Apache 2.4 en ArchLinux

¡Ha llegado Apache 2.4 a ArchLinux! Es un cambio importante y requiere nuestra intervención manual para hacer que nuestro servidor LAMP vuelva a funcionar sin problemas.

Con la actualización, tenemos nuevos archivos httpd.conf, php.ini y magic, por lo que primero debemos hacer un respaldo de nuestros viejos archivos:

sudo mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.old
sudo mv /etc/httpd/conf/magic /etc/httpd/conf/magic.old
sudo mv /etc/php/php.ini /etc/php/php.ini.old

Entonces, renombramos los nuevos archivos:

sudo mv /etc/httpd/conf/httpd.conf.pacnew /etc/httpd/conf/httpd.conf
sudo mv /etc/httpd/conf/magic.pacnew /etc/httpd/conf/magic
sudo mv /etc/php/php.ini.pacnew /etc/php/php.ini

Apache viene con una serie de Módulos de MultiProcesamiento (Multi-Processing Modules o MPMs) que son responsables de conectar con los puertos de red de la máquina, acceptar las peticiones, y generar los procesos hijo que se encargan de servirlas. En el “nuevo” Apache 2.4 se usa el event MPM (previamente se usaba el prefork, que era más lento y consumía más memoria), que proporciona escalabilidad y buen soporte para alto tráfico de sitios web.

Por lo anterior, hay dos posibles soluciones: Volver a habilitar el prefork, o hacer los cambios necesarios para que el event MPM funcione adecuadamente.

Solución 1: Regresar a mod_mpm_prefork

Si no quieres romperte la cabeza con la migración a las novedades de Apache 2.4, lo que necesitas es volver a habilitar mod_mpm_prefork. Para ello, vamos a abrir el archivo /etc/httpd/conf/httpd.conf

sudo vim /etc/httpd/conf/httpd.conf

… y ahí, reemplazaremos la línea

LoadModule mpm_event_module modules/mod_mpm_event.so

con

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Además, debemos incluir dos líneas adicionales, muy conocidas por nosotros. La primera debemos colocarla en la lista de carga de módulos (LoadModule list) después de LoadModule dir_module modules/mod_dir.so:

LoadModule php5_module modules/libphp5.so

La segunda, al final de la lista de configuraciones adicionales (Include list):

Include conf/extra/php5_module.conf

Y reiniciamos Apache para reflejar los cambios:

sudo systemctl restart httpd.service

Solución 2: Usar el nuevo mod_mpm_event

Si queremos aprovechar todas las bondades y novedades de Apache 2.4, ésta es la solución que debemos seguir.

Como primer paso, vamos a instalar php-fpm desde los repos oficiales:

sudo pacman -S php-fpm

Adicionalmente, instalaremos mod_proxy_handler desde AUR (esperemos que pronto lo agreguen a los repos oficiales):

yaourt -S mod_proxy_handler

En el archivo /etc/php/php-fpm.conf, descomentar la línea (quitar ; del principio):

listen = 127.0.0.1:9000

y comentar la línea (agregar ; al principio):

listen = /run/php-fpm/php-fpm.sock

En el mismo archivo, también debemos descomentar la línea:

listen.allowed_clients = 127.0.0.1

En el archivo /etc/httpd/conf/httpd.conf, agregar al final:

LoadModule proxy_handler_module modules/mod_proxy_handler.so
<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000/"
</FilesMatch>
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

Finalmente, en el archivo /etc/php/php.ini debemos asegurarnos de que la siguiente línea está habilitada (descomentada):

cgi.fix_pathinfo=1

Reiniciar los daemons involucrados:

sudo systemctl restart php-fpm.service
sudo systemctl restart httpd.service

¿Y MySQL / MariaDB? Al usar el nuevo archivo php.ini, debemos volver a decirle a PHP de la existencia del servidor de base de datos. Vamos a abrir el archivo /etc/php/php.ini con tu editor favorito …

sudo vim /etc/php/php.ini

… y descomentar (eliminar el ; al inicio) las siguientes líneas:

extension=mysqli.so
extension=mysql.so
extension=pdo_mysql.so

Finalmente, reiniciemos Apache y MariaDB para aplicar los cambios realizados.

sudo systemctl restart httpd.service
sudo systemctl restart mysqld.service

Fuentes: 1, 2, 3.

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.

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!

Mis Bookmarks – Accede fácil y rápido a tus bookmarks preferidos

Mis Bookmarks

Aún sigo trabajando en la nueva versión del blog, ¡no desesperen! Como compensación, aquí les dejo un proyecto personal: Mis Bookmarks.

Se trata de un pequeño proyecto escrito en HTML y JavaScript, alojado en Github. No usa PHP, sólo tiene como librería a jQuery y Bootstrap (ambos incluídos).

Lo único que tienen que hacer es editar el archivo bookmarks.json con tus propios enlaces favoritos. El primer nivel del archivo JSON son las categorías, el segundo nivel son los bookmarks (nombre / URL).

Un tip: Para usar Mis Bookmarks como la Pestaña “New Tab” en Firefox, entra a about:config y cambia el valor de browser.newtab.url por el URL donde lo tengas localmente almacenado (por ejemplo, http://localhost/mis-bookmarks/).

Enlace: gespadas.github.io/mis-bookmarks

Instalación y configuración del entorno LAMP (Apache + PHP + MySQL) en ArchLinux con systemd

ArchLinux systemd LAMP

Ahora que las nuevas instalaciones de ArchLinux usan systemd de manera predeterminada, algunas cosas han cambiado, entre ellas, ciertos detalles en la instalación y configuración del entorno LAMP (Linux + Apache + MySQL + PHP).

Aprovechando que hace unos días realicé una instalación limpia en mi equipo de producción, también lo hice con dicha instalación y configuración, misma que comparto con ustedes en el presente tutorial.

[Actualización 2014-03-10] ¡Ha llegado Apache 2.4 a ArchLinux! Es un cambio importante y requiere nuestra intervención manual para hacer que nuestro servidor LAMP vuelva a funcionar sin problemas.

Paso 1. Instalación de los paquetes necesarios

Antes que nada, instalemos los paquetes básicos que necesitaremos.

sudo pacman -S apache php php-apache mysql

Paso 2. Ejecutando Apache

Ejecutemos (vía systemd) nuestro servidor web Apache con las configuraciones predeterminadas:

sudo systemctl start httpd.service

Adicionalmente, para que Apache se ejecute de manera automática en los siguientes booteos, usa:

sudo systemctl enable httpd.service

Ahora bien, ¿cómo se llama tu servidor? Eso lo tienes establecido en dos archivos: /etc/hostname y /etc/hosts. Lo más común es que en ambos tengas localhost. Si no es así, reemplaza “localhost” por tu nombre de servidor en el resto del tutorial.

En tu navegador web favorito, entra a http://localhost/ o http://127.0.0.1/ donde veremos algo similar a la siguiente captura de pantalla.

Apache corriendo en ArchLinux con systemd

¡Muy feo! ¿verdad? Es porque localhost no tiene ningún contenido, ¡así que vamos a solucionarlo!.

Paso 3. Creando nuestro index.html

Antes de crear nuestro index.html, debemos tener en cuenta dos detalles que se encuentran establecidos en /etc/httpd/conf/httpd.conf (el archivo de configuración principal de Apache en ArchLinux):

  • Durante el booteo del sistema, el encargado de ejecutar Apache es root, pero por motivos de seguridad, de inmediato se cambia al usuario http (que a su vez pertenece al grupo http).

  • La carpeta predeterminada para el contenido de localhost es /srv/http, cuyo propietario es root de manera predeterminada.

Debido a lo anterior, debemos realizar algunas acciones para poder empezar a crear contenido en nuestro servidor web local.

  1. Primero, debemos agregar nuestro usuario al grupo http.

    sudo gpasswd -a miusuario http

    Debemos cerrar nuestra sesión actual y volver a loguearnos para que el cambio sea aplicado.

  2. Ahora, debemos ceder la propiedad de root a http (tanto para el usuario como para el grupo) de manera recursiva para /srv/http.

    sudo chown -R http:http /srv/http
  3. Debemos establecer permisos de escritura para el grupo http (al cual nos hemos agregado) para la misma carpeta (y todo su contenido).

    sudo chmod -R g+w /srv/http

Ahora si, ya podemos crear nuestro index.html, el cual puede ser desde una simple línea de texto …

echo 'Hola Mundo!' > /srv/http/index.html

… hasta algo más elaborado (usa tu editor preferido y guardalo como index.html en /srv/http/).

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="utf-8">
    <title>¡Bienvenidos a ArchLinux!</title>
    <style>
        body { margin: 0; font-family: Helvetica, Arial, sans-serif; }
        h1 { background: #ccc; margin: 0; padding: 10px; }
        #contenido { margin: 10px auto; padding: 10px; width: 500px; }
    </style>
</head>
<body>
<div id="contenido">
    <h1>¡Bienvenido!</h1>
    <p><strong>Apache</strong> corriendo bajo <strong>ArchLinux</strong> con <strong>systemd</strong>.</p>
</div>
</body>
</html>

index.html en funcionamiento

Paso 4. Configurando PHP

Este paso es el típico de siempre. Vamos a configurar Apache para que reconozca a PHP.

Primero, como root, abre el archivo /etc/httpd/conf/httpd.conf con tu editor favorito. Por ejemplo:

sudo vim /etc/httpd/conf/httpd.conf

Ahí, realiza los siguientes cambios:

  1. En la lista que tiene todos los “LoadModule“, y después de LoadModule dir_module modules/mod_dir.so, agrega la línea:

    LoadModule php5_module modules/libphp5.so
  2. Al final de la lista de todos los “Include“, agrega la línea:

    Include conf/extra/php5_module.conf
  3. Asegúrate que la siguiente línea no esté comentada (que no tenga “#” al inicio) en la sección :

    TypesConfig conf/mime.types
  4. Descomenta (elimina el “#” del inicio) la siguiente línea:

    MIMEMagicFile conf/magic

Ahora, como root, abre el archivo /etc/httpd/conf/mime.types con tu editor preferido (¡seguro que es vim!). Por ejemplo:

sudo vim /etc/httpd/conf/mime.types

Al final de dicho archivo agrega la línea:

application/x-httpd-php5            php php5

¡Listo! Reiniciemos Apache para aplicar los cambios:

sudo systemctl restart httpd.service

Para probar que Apache ya reconoce a PHP, vamos a crear el típico archivo de ejemplo:

echo '<?php phpinfo(); ?>' > /srv/http/info.php

Y finalmente, para verlo entra a tu navegador web, y entra a http://localhost/info.php

PHP reconocido por Apache

Paso 5. Configurando MySQL

Primero, vamos a ejecutar de inmediato el servidor de base de datos MySQL con:

sudo systemctl start mysqld.service

Para que se ejecute en cada booteo, usamos:

sudo systemctl enable mysqld.service

Y antes de que hagamos cualquier otra cosa, debemos establecer la contraseña del usuario “root” de MySQL (no es el mismo que el root del sistema). La forma más sencilla de hacerlo, es ejecutar la siguiente utilería:

mysql_secure_installation

Lo anterior nos preguntará primero la contraseña actual de root, la cual no existe, así que debemos dar [Enter], y entonces escribir (y confirmar) la nueva contraseña. Adicionalmente, la utilería nos preguntará algunos detalles adicionales, a los cuales se sugiere responder las opciones predeterminadas.

Ahora, tenemos que decirle a PHP de la existencia de MySQL. Vamos a abrir el archivo /etc/php/php.ini con tu editor favorito …

sudo vim /etc/php/php.ini

… y descomentar (eliminar el “;” al inicio) las siguientes líneas:

 extension=mysqli.so
 extension=mysql.so

Si deseas realizar alguna modificación en los parámetros de MySQL debes hacerlo editando el archivo /etc/mysql/my.cnf.

Finalmente, reiniciemos Apache y MySQL para aplicar los cambios realizados.

sudo systemctl restart httpd.service
sudo systemctl restart mysqld.service

Comentarios Adicionales

Aunque ya los mencioné, no olviden que los archivos de configuración son:

  • Apache: /etc/httpd/conf/httpd.conf
  • PHP: /etc/php/php.ini
  • MySQL: /etc/mysql/my.cnf

Tampoco olviden que bajo systemd, se utilizan los comandos:

  • Habilitar para cada booteo: sudo systemctl enable <servicio>
  • Ejecutar de inmediato: sudo systemctl start <servicio>
  • Detener de inmediato: sudo systemctl stop <servicio>
  • Reiniciar de inmediato: sudo systemctl restart <servicio>
  • Ver el estado del servicio: sudo systemctl status <servicio>

Donde <servicio> puede ser alguno de los siguientes:

  • Apache: httpd.service
  • MySQL: mysqld.service

Por último, no olviden consultar la documentación oficial para más información:

Verificando la relación entre dos usuarios de Twitter con PHP

Si necesitas saber la relación entre dos usuarios de Twitter, es muy sencillo con PHP.

La llamada API es como sigue:

http://twitter.com/friendships/exists.json?user_a=gespadas&user_b=beyonce

Lo anterior devuelve un archivo JSON con “true” o “false” (cadenas de texto). Obviamente, es “true” si user_a sigue a user_b, y “false” en caso contrario.

Teniendo lo anterior, el código PHP es muy simple:

<?php
$usuario1	= 'gespadas';
$usuario2	= 'beyonce';
$url		= 'http://twitter.com/friendships/exists';
$formato	= 'json';
 
$resultado1 = file_get_contents($url.'.'.$formato.'?user_a='.$usuario1.'&user_b='.$usuario2);
$resultado2 = file_get_contents($url.'.'.$formato.'?user_a='.$usuario2.'&user_b='.$usuario1);
 
echo '<p>@' . $usuario1 . ($resultado1=='true'?' sigue a @':' no sigue a @') . $usuario2 . '</p>';
echo '<p>@' . $usuario2 . ($resultado2=='true'?' sigue a @':' no sigue a @') . $usuario1 . '</p>';
?>

Es sólo un pequeño ejemplo, ya que se puede implementar en aplicaciones más completas.

Vía: Internoetics.