lunes, 16 de septiembre de 2013

Versión Impresa de Aptitus - Clasificados del Grupo El Comercio

Desde hace unas semanas ya se encuentra disponible en el sitio aptitus.pe la versión Impresa, en un formato HTML5 compatible con los navegadores Web Internet Explorer 8 en adelante, Google Chrome, Mozilla Firefox, Safari y todo aquel que cuente con soporte html5.

El enlace para poder acceder a la versión impresa, que se publica todos los domingos dentro de los Clasificados de El Comercio es esta: http://aptitus.clasificados.pe/impresa .

Aptitus - Impresa

miércoles, 26 de diciembre de 2012

Renace el diario "La Prensa" 100% digital

Luego de muchos años volvió el diario "La Prensa" de Perú, en su versión web

Diario La Prensa
Plataforma web basada 100% en Software Libre, como es costumbre dentro del área de Plataforma Digital del Grupo El Comercio.

El lanzamiento del sitio fue el mismo día del supuesto, apocalíptico y tan mentado "Fin del Mundo": 21-12-2012. El Diario El Comercio de Perú publicó una nota sobre la salida del (casi) nuevo diario online.

Larga vida a La Prensa!

domingo, 16 de diciembre de 2012

Ejemplo de Redis con PHP usando el cliente Predis

Existen varios clientes para trabajar con Redis desde PHP:  (Fuente: http://redis.io/clients )
  • Predis
  • Phpredis
  • Rediska
  • RedisServer
  • Credis
  • Redisent
Para este ejemplo vamos a utilizar Predis. Lo primero que tenemos que hacer es clonar predis desde github:

$ git clone git://github.com/nrk/predis.git

Luego, creamos un archivo "test-predis.php" con este contenido para probar conexión, seteo de datos alfanuméricos, listas, update de valores y expiración.


<?php
require "predis/autoload.php";
Predis\Autoloader::register();

try {
    $redis = new Predis\Client();
echo "Successfully connected to Redis";
echo "<hr>";

$redis->set("hello_world", "Hi from php!");
$value = $redis->get("hello_world");

var_dump($value);
echo ($redis->exists("Santa Claus")) ? "true" : "false";

echo "<hr>";

$redis->set("I 2 love Php!", "Also Redis now!");
$value = $redis->get("I 2 love Php!");

$redis->set("I 2 love Php!", "Also Redis now!");
$value = $redis->get("I 2 love Php!");

echo "<hr>";

$redis->hset("taxi_car", "brand", "Toyota");
$redis->hset("taxi_car", "model", "Yaris");
$redis->hset("taxi_car", "license number", "RO-01-PHP");
$redis->hset("taxi_car", "year of fabrication", 2010);
$redis->hset("taxi_car", "nr_starts", 0);

echo "License number: " . 
    $redis->hget("taxi_car", "license number") . "<br>";

// remove license number
$redis->hdel("taxi_car", "license number");

// increment number of starts
$redis->hincrby("taxi_car", "nr_starts", 1);

$taxi_car = $redis->hgetall("taxi_car");
echo "All info about taxi car";
echo "<pre>";
var_dump($taxi_car);
echo "</pre>";
uso de uso de 
echo "<hr>";

$list = "PHP Frameworks List";
$redis->rpush($list, "Symfony 2");
$redis->rpush($list, "Symfony 1.4");
$redis->lpush($list, "Zend Framework");

echo "Number of frameworks in list: " . $redis->llen($list) . "<br>";

$arList = $redis->lrange($list, 0, -1);
echo "<pre>";
print_r($arList);
echo "</pre>";

// the last entry in the list
echo $redis->rpop($list) . "<br>";

// the first entry in the list
echo $redis->lpop($list) . "<br>";

echo "<hr>";

// set the expiration for next week
$redis->set("expire in 1 week", "I have data for a week");
$redis->expireat("expire in 1 week", strtotime("+1 week"));
$ttl = $redis->ttl("expire in 1 week"); // will be 604800 seconds

// set the expiration for one hour
$redis->set("expire in 1 hour", "I have data for an hour");
$redis->expire("expire in 1 hour", 3600);
$ttl = $redis->ttl("expire in 1 hour"); // will be 3600 seconds

// never expires
$redis->set("never expire", "I want to leave forever!");

}
catch (Exception $e) {
    echo "Couldn't connected to Redis";
    echo $e->getMessage();
}

Es importante que en /etc/redis.conf estén configurados estos valores:

maxmemory 2048000
maxmemory-policy allkeys-lru

El primero es para fijar la memoria para caché en 2 mb y el segundo para la expiración de las keys.




sábado, 8 de diciembre de 2012

Creando un grid con JQWidgets y jqxgrid con data de MySQL


En este ejemplo se muestra un simple listado de la data de una tabla en mysql reutilizando la libreria jqxgrid de los JQWidgets.  Este fué mi procedimiento:

Sistema Operativo: Fedora 16 64bits
Web Server para estáticos: nginx 1.2.5 (http://nginx.org/en/download.html)
Web Server para PHP: apache (prefork mpm), usando nginx como proxy reverso.
MySQL Community Server 5.5.2

  1. Crear una BD en mysql llamada "myTable" con los siguientes campos:+-------------------+-----------------------+------+-----+---------+----------------+
    | Field             | Type                  | Null | Key | Default | Extra          |
    +-------------------+-----------------------+------+-----+---------+----------------+
    | id                | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | CodigoUsuario     | mediumint(9)          | YES  |     | NULL    |                |
    | NombreUsuario     | varchar(255)          | YES  |     | NULL    |                |
    | FechaNacimiento   | varchar(50)           | YES  |     | NULL    |                |
    | CorreoElectronico | varchar(255)          | YES  |     | NULL    |                |
    +-------------------+-----------------------+------+-----+---------+----------------+

     
  2. Cómo no quería ingresar la data a mano, use uno de los generadores de Data mas populares:  http://www.generatedata.com/ . Muy útil, rápidamente cargué 1500 filas a la tabla, usando el Result Type=SQL . Grabé el texto resultante en un archivo .sql y ejecuté desde consola: mysql test < midata.sql
  3. Desde consola creé la carpeta "static" y configuré el nginx para que sirva el contenido:vi /etc/nginx/conf.d/virtual.conf
    server {
        add_header    Cache-control public;
        expires        max;
        listen       80;

        location /static/ {
            root    /;
            index    index.html;
        }

        location = /favicon.ico {
            empty_gif;
            return 204;
        }
        location /sample/ {
            proxy_pass http://127.0.0.1:8080;
        }
    }
  4. Hice los cambios en el /etc/httpd/conf/httpd.conf para servir la aplicaciòn desde una ruta en /var/www/sample/
  5. Desde consola, volver a cargar la configuración del apache:
    service httpd reload
  6. Volver a cargar la configuración del nginx:service nginx reload
  7. Descargar el JQWidgets desde http://www.jqwidgets.com/download/ , hacia la carpeta /static/
  8. En la ruta /var/www/sample crear el archivo de conexión mysql: connect.php<?php
    # FileName="connect.php"
    $hostname = "localhost";
    $database = "bigdata";
    $username = "root";
    $password = "";
    ?>
  9. En la misma ruta, crear el archivo que nos traerá la data: data.php<?php
    include('connect.php');
    $connect = mysql_connect($hostname, $username, $password)
    or die('Could not connect: ' . mysql_error());
    mysql_select_db($database, $connect);
    $bool = mysql_select_db($database, $connect);
    if ($bool === False){
       print "can't find $database";
    }

    $query = "SELECT * FROM myTable";
    $from = 0;
    $to = 200;
    $query .= " LIMIT ".$from.",".$to;

    $result = mysql_query($query) or die("SQL Error 1: " . mysql_error());
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        $customers[] = array(
            'CodigoUsuario' => $row['CodigoUsuario'],
            'NombreUsuario' => $row['NombreUsuario'],
        'FechaNacimiento' => $row['FechaNacimiento'],
        'CorreoElectronico' => $row['CorreoElectronico']
          );
    }

    echo json_encode($customers);
    ?>
  10. Ahora creamos la página que mostrará el grid: index.php
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>GRID</title>
    <link rel="stylesheet" href="/static/jqwidgets/styles/jqx.base.css" type="text/css" />
    <link rel="stylesheet" href="/static/jqwidgets/styles/jqx.classic.css" type="text/css" />
    <script type="text/javascript" src="/static/scripts/jquery-1.8.2.min.js"></script>
    <script type="text/javascript" src="/static/jqwidgets/jqxcore.js"></script>
    <script type="text/javascript" src="/static/jqwidgets/jqxbuttons.js"></script>
    <script type="text/javascript" src="/static/jqwidgets/jqxscrollbar.js"></script>
    <script type="text/javascript" src="/static/jqwidgets/jqxmenu.js"></script>
    <script type="text/javascript" src="/static/jqwidgets/jqxdata.js"></script>
    <script type="text/javascript" src="/static/jqwidgets/jqxgrid.js"></script>
    <script type="text/javascript" src="/static/jqwidgets/jqxgrid.selection.js"></script>
    <script type="text/javascript">
         $(document).ready(function () {
             // prepare the data
             var source =
             {
                 datatype: "json",
                 datafields: [
                     { name: 'CodigoUsuario'},
                     { name: 'NombreUsuario'},
                     { name: 'FechaNacimiento'},
                     { name: 'CorreoElectronico'}
                 ],
                 url: 'data.php'
             };

             $("#jqxgrid").jqxGrid(
             {
                 source: source,
                 theme: 'classic',
                 columns: [
                   { text: 'Codigo de Usuario', datafield: 'CodigoUsuario', width: 250},
                   { text: 'Nombre de Usuario', datafield: 'NombreUsuario', width: 150},
                   { text: 'Fecha de Nac.', datafield: 'FechaNacimiento', width: 180},
                   { text: 'E-Mail', datafield: 'CorreoElectronico', width: 200}
               ]
             });
         });
     </script>
    </head>
    <body>
    <div id="jqxgrid"></div>
    </body>
    </html>
  11. Listo, entramos a http://localhost/sample/index.php

Es importante usar una herramienta sobre el navegador para validar que todos nuestros scripts estén funcionando correctamente. En este ejemplo, utilicé firebug 1.10.6 sobre Firefox 16.0.2.
Decidí usar nginx para servir los estáticos debido al tamaño de éstos:

.css: 84.4 kb , .js: 408.3 kb.

NGINX es un servidor ligero de gran performance y que, correctamente configurado, te ahorra mucho en el consumo de ancho de banda de  aplicaciones en las que se haga uso intensivo de css, js e imágenes.
No olvidar agregar o actualizar estas lineas en /etc/nginx/nginx.conf, dentro de http {}

    sendfile        on;
    keepalive_timeout  65;
        gzip              on;
        gzip_buffers      16 8k;
        gzip_comp_level   9;
        gzip_http_version 1.1;
        gzip_min_length   10;
        gzip_types        text/plain text/css image/png image/gif image/jpeg application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_vary         on;
        gzip_static       on;
        gzip_proxied      any;
        gzip_disable      "MSIE [1-6]\.";