Desarrollo: Obtener la lista de contactos en Android - ContactsContract

El día de hoy comparto un ejemplo de como acceder mediante código, al directorio (agenda) de contactos de cualquier teléfono con sistema Android. El proceso es bastante sencillo, posteriormente trabajaremos en enviar sms, ejecutar llamadas o incluso, actualizar datos de nuestra agenda.

Para entendernos mejor, en primer lugar comparto el código para que lo ejecuten y luego empecemos a analizar paso a paso las herramientas :

MainActivity.java

public class MainActivity extends Activity {
   // TextView textDetail;    private ListView listView;
    private List<Contacto> list = new ArrayList<Contacto>();
 

    @Override    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(new AdapterContacto(getlistContactos(), this));   
    }
    public List  getlistContactos(){
        List<Contacto> list = new ArrayList<Contacto>();
        int count=0; 
Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); while (phones.moveToNext()) { count++; String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Contacto objContact = new Contacto(); objContact.setName(name); objContact.setPhoneNo(phoneNumber); list.add(objContact); } phones.close(); System.out.println(count); return list; }
}



Contacto.java

public class Contacto {
    private String name;
    private String phoneNo;


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhoneNo() {
        return phoneNo;
    }
    public void setPhoneNo(String phoneNo) {
        this.phoneNo = phoneNo;
    }

}

AdapterContacto.java
public class AdapterContacto extends BaseAdapter {
    private List<Contacto> list;
    Context context;

    AdapterContacto (List<Contacto> list, Context context){
        this.list = list;
        this.context = context;
    }


    @Override    public int getCount() {
        // TODO Auto-generated method stub        return list.size();
    }
    @Override    public Object getItem(int arg0) {
        // TODO Auto-generated method stub        return list.get(arg0);
    }
    @Override    public long getItemId(int arg0) {
        // TODO Auto-generated method stub        return arg0;
    }
    @Override    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub        View v = convertView;
        if (v == null)
        {
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.listcontacto, null);
        }
        TextView contactName = (TextView)v.findViewById(R.id.tvname);
        TextView contactPhone = (TextView)v.findViewById(R.id.tvphone);


        Contacto msg = list.get(position);
        contactName.setText(msg.getName());
        contactPhone.setText(msg.getPhoneNo());

        return v;
    }

}
Dentro de la carpeta RES/layout:
Activity_main.xml 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >
    <ListView        android:id="@+id/list"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:cacheColorHint="#00000000" >
    </ListView>
</LinearLayout>

listcontacto.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/relativelay"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="vertical" >
    <TextView        android:id="@+id/tvname"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_marginLeft="3dp"        android:layout_marginTop="3dp"        android:ellipsize="end"        android:maxLines="1"        android:text="Title"        android:textColor="#000000"        android:textSize="17dp"        android:textStyle="bold" >
    </TextView>
    <TextView        android:id="@+id/tvphone"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_below="@+id/tvname"        android:layout_marginLeft="3dp"        android:layout_marginTop="10dp"        android:ellipsize="end"        android:maxLines="1"        android:text="Phone no"        android:textColor="#000000"        android:textSize="14dp" >
    </TextView>
</RelativeLayout>


Por último, para que todo esto funcione, debemos activar los permiso para la lectura de datos guardados en el smartphone:

Manifest.xml 


<uses-permission android:name="android.permission.READ_CONTACTS"/>


Al finalizar, tendremos lo siguiente:
(imagen referencial, en otro post les compartiré como cargar las fotos)


Onsubmit en formulario HTML : llamada jquery post no funciona (AJAX)

Un tip sencillo:

Si estás validando campos de un formulario (tu acción es un submit desde el botón) o simplemente deseas enviar la solicitud get o post por Ajax y desde el formulario haces la llamada a onsubmit... y lo recibes con $.post, debes cambiar este último a $.ajax para que funcione.


Antes :

 $.post( "/guardar", { TUSCAMPOSPORENVIAR},
        function( info) {

Reemplaza :

$.ajax({
            url: '/guardar',
            global: false,
            type: 'POST',
            data: {TUSCAMPOSPORENVIAR },
            async: false,
            success: function(info) {}
 });


Redes sociales : Tamaños de imágenes para facebook, twitter, linkedin, pinterest y youtube

La información incluye el tamaño que deberían tener de las imágenes que se suben a plataformas como Twitter, Facebook, Google+, Instagram, LinkedIn, Tumblr y Pinterest. Además también incluye algunos detalles importantes a tener en cuenta.
Veamos:
TWITTER
  • Foto de fondo: 1280 x 1024
  • Foto de encabezado: 1500 x 500
  • Foto de perfil: 400 x 400
  • Foto de publicación: 440 x 220
FACEBOOK
  • Foto de portada: 851 x 315
  • Foto de perfil: 180 x 180
  • Foto de publicación: 1200 x 900
  • Foto de enlace: 1200 x 627
GOOGLE+
  • Foto de portada: 1088 x 608
  • Foto de perfil: 250 x 250
  • Foto de publicación: 497 x 279
INSTAGRAM
  • Foto de perfil: 110 x 110
  • Foto de publicación: 640 x 640
PINTEREST
  • Foto de perfil: 165 x 165
  • Foto de publicación: 222 x 150
TUMBLR
  • Foto de perfil: 128 x 128
  • Foto de publicación: 570 x 750
YOUTUBE
  • Foto de portada: 2460 x 1440
  • Tamaño del video: 1280 x 760
LINKEDIN
  • Foto de logo: 100 x 60
  • Foto de portada: 974 x 300

  • CLIC EN LA IMAGEN

Aprobé el examen PMP, con estos 3 pasos y tips de estudios. - Preguntas y respuestas

09 de Mayo del 2015, un día antes del día de la madre en Perú, rendí mi examen para certificarme como PMP, y aprobé! 


Fueron 4 horas de intensa concentración, desde las 6 de la mañana estuve preparando mi día para dedicarlo al examen y así fue. Antes de cerrar el día, quiero escribir estas líneas para servir de motivación a quieres están un poco indecisos sobre si darlo o no, y para quienes tienen el interés de empaparse de como es el proceso de preparación para rendir una de las certificaciones más solicitadas en el mundo de gestión de proyectos. Me tomó 1 mes entero estudiar fielmente en base a libros que iré describiendo a continuación, así que tómense unos minutos para leer y hacerse de los documentos que compartiré para que tengan una buena base de estudios. Quiero aclarar que estas fueron todas mis herramientas para sentirme listo e ir a dar el examen.  

¿ Por qué certificarse en PMP® ?

Todo el mundo habla de esta certificación, y por qué? qué tiene que no tengan las demás?.  Tal vez ha visto otras certificaciones en dirección de proyectos (p. ej: IPMA) pero en menos de 3 lineas voy a ser directo y decirte que ser PMP, no solo es una certificación de reconocimiento internacional, sino que cuando se obtiene la certificación se está demostrando que se tiene la experiencia, la formación y las competencias necesarias para gestionar un proyecto grande de forma exitosa. 

¿Por qué las principales empresas a nivel mundial, contratan profesionales PMP®? 

Limita el intrusismo profesional y por lo tanto las sorpresas. 
Garantiza a la empresa que el profesional tiene unos conocimientos y experiencia tales que garantiza el conocimiento de técnicas de gestión de proyectos estándar que han demostrado su eficacia, por lo que si se aplican en sus proyectos, éstos podrán mejorar. 
Sirve como canal de comunicación entre profesionales. 
El uso de un vocabulario común de gestión de proyectos acelera la integración entre todos. 
Homogeniza los equipos de trabajo. 
Para ser PMP se tiene que firmar un código ético. 
Mejora la imagen profesional de la Compañía, al poder aumentar la seguridad de sus clientes en el conocimiento en gestión de proyectos. 
Finalmente, y lo que es más importante, el disponer de mejores profesionales, permitirá aumentar la eficiencia en la gestión de recursos, aumentando sus beneficios y mejorando su posición en el mercado respecto a la competencia. 

Bueno, quizá esto ya lo sabías, pero es bueno que uno se lo recuerde a si mismo a cada momento para darse ánimos y empuje de cara al examen. 

Ahora si, empezamos, y te muestro los 3 pasos básicos para entrenarte :

1. EL AMIGO PMBOK

    No hay PMP sin pmbok, es tu guía, sin el no será posible, y desde ahora tendrá que ser tu biblia profesional (biblia porque tiene poco más de 600 hojas y tienes que creer en él). Recuerda que es tu guía, y como tal, no es necesario que lo leas por completo pero sí que lo consultes. Es tu marco de referencia, al final sin darte cuenta, vas a saber mas del pmbok de lo que te imaginas.

TIP de estudio  :  


- Usa posits de colores, ubica, un lugar en tu casa, cuarto u oficina, donde obligatoriamente tengas que detenerte unos minutos y en un estado relajado. Usa los posits para montar un cuadro con las 10 áreas de conocimiento vs los 5 procesos de dirección de proyectos. En total debes reflejar los 47 procesos ubicándolos donde corresponda. ¿por qué en un lugar donde esté relajado? Yo use la pared de mi cuarto, justo frente a mi cama. Cada día y cada noche, mientras me alistaba, abrochaba mi camisa o me ponía la pijama, lo hacia mirando el cuadro y memorizando los procesos. TODOS LOS DIAS DURANTE UN MES. La mente es así, para memorizar debes repetírselo N veces, y mejor si es por una gráfica a colores.    

( Click a la imagen para agrandar )


  - Al lado de cada área de conocimiento hay unos números que indican cuantos procesos tiene cada áreas :

INTEGRACION        6
ALCANCE                 6
TIEMPO                     7
COSTO                      4
CALIDAD                 3
RRHH                        4
COMUNICACIONES 3
RIESGO                     6
ADQUISICIONES    4
INTERESADOS        4 

  Lo mismo para cada proceso de dirección :

INICIO                        2 
PLANIFICACION       24 
EJECUCION              8 
SEG. Y CONTROL    11 
CIERRE                    2
       
Con esa numeración, no te olvidarás nunca (no solo servirá para tu examen) la distribución de los 47 procesos. 


2. LA PROFESORA EN CASA :  RITA MULCAHY 

    Estas con suerte, existe una profesora particular, que te enseña día a día como aprobar el examen de certificación. No vas a tener que estudiar todo el pmbok, vas a estudiar las fijas, lo que viene, lo que tienes que asumir para el examen y lo que no. Rita Mulcahy, en su libro "Preparación para el examen del PMP (v. 5 )" ha creado el mejor libro de estudios. 

     Antes de dar el examen, vas a tener que leer por completo este libro, debes leerlo/estudiándolo, aprovecha para hacer un resumen de este libro (que ya es un buen resumen del pmbok y de los trucos para rendir el examen). 

TIP de estudio  :  

     -Cada vez que termines un área del conocimiento, debes desarrollar el examen final. Apunta tus respuestas en una hoja aparte, y lleva ese control hasta el final. Para que sientas que vas por buen camino, debes verificar que por cada 50 preguntas como máximo haces 15 malas, y debes hacerlo en menos de 50 minutos. Luego que leíste todo el libro, guíate del orden de dificultad de las áreas de conocimiento, y empieza a resolver nuevamente las preguntas en ese orden. Si en total has completado de 200 preguntas, unas  140 correctas +- 10. estas listo para ir a dar el examen.    

     - PMI-ismos, muy ilustrativos, muy didácticos. Síguelos, entenderlos te hará responder bien unas 10 a 20 preguntas en el examen. 



un merecido homenaje a la Señora Rita Mulcahy


3. SIMULACRO DE EXAMEN AL CUADRADO

    Así es, consigue un par de simulacros. No es necesario más, tengo más de 5 simulacros con sus respuestas que fueron de uso en mi diplomado, además de ppts de los talleres de preparación detallado y muchos ejercicios prácticos. No puedo compartirlo abiertamente, pero si te los hago llegar si me mandas un correo a fencaladavega@gmail.com con el asunto "examen PMP"


Adelanto 2 link de ejemplo del material, si ya has leido todo el PMBOK podrás responder sin problemas y sentirte listo si los apruebas. 

   - 100 preguntas con sus respuestas  ( de preferencia oculta las respuestas y al final lo cotejas)

   - Archivo excel donde están todas las áreas de proceso, todas las entradas, herramientas y técnicas, y sus salidas. Dale el uso que mejor le encuentres. 

(update Julio 2017: si tienes problemas para ver los documentos, escríbeme para ayudarte  fencaladavega@gmail.com  asunto : examen PMP )

Por ahora esto es todo, ojalá pronto me de un tiempo para escribir un post contando todos los requerimientos para presentarse al PMI, la forma de sustentar las horas en proyectos y la aventura de ir a dar el examen en Prometic. Puedo adelantar que solo me quedó 25 minutos para volver a dar otra pasada al examen, dejando las formulas para el último, quizá te sea de referencia ese metodo para el momento en el examen.


Como bien sabes, una vez que consigues tu certificación PMP esta tiene una validez de tres años. Para renovarla por otros tres años, has de cumplir una serie de requisitos que, recientemente, han sido modificados por el PMI. 

sigue este enlace COMO RENOVAR TU PMP Y CUMPLIR LOS 60 PDUs


Google : Si tu web no es responsive o no tienes version mobile, desaparece

El 26 de febrero Google anunciaba a través de su Blog Oficial de Webmaster, en el post: Finding more mobile-friendly search results que las webs que no estén preparadas para móviles, el 21 de abril sufrirán una penalización. Esto tendrá un efecto claro en las búsquedas en PC, pero especialmente en móviles, donde aquellas no adaptadas perderán posicionamiento. Incluso, algunos ya afirman que esas webs podrían llegar a desaparecer para “google” si no se adaptan.
Por ello, ha empezado a enviar mensajes a los webmasters de webs que no están preparadas para el Día D: el 21 de abril, como en este ejemplo.
optimización móvil google webmaster tools aviso
Este anuncio sobre la necesidad de versiones responsive, no es muy llamativo, pues Google siempre ha valorado las webs que tengan una gran usabilidad, siendo reconocido que un factor SEO importante.
Sin embargo, lo llamativo de esta noticia, en la publicación del anuncio, por primera en la historia, Google ha reconocido oficialmente un factor para el posicionamiento, poniendo fecha específica para la actualización del algoritmo.
No solo un factor un posicionamiento SEO, si no casi que es obligatorio tener una web preparada para móviles, al arriesgarse a desaparecer de Google.
Google ha puesto a disposición de los webmasters, curiosos y demás, una herramienta que comprueba si la web esta optimizada para móviles, añadiendo simplemente la URL.

Códigos útiles .htaccess para sitios web

Hoy en día, la mayoría de ofertas de alojamiento web son para el servidor web Apache. Es una solución mucho más barata en comparación con la plataforma IIS en Windows. Apache es bien conocido por su capacidad para usar .htaccess, donde podemos controlar determinados aspectos de nuestro sitio web, incluyendo el rendimiento.

Uno de los más populares es redirigir cualquier dominio sin www al dominio con www. En este ejemplo, si intenta tener acceso a http://webempresa.com, el servidor le redirigirá a http://www.webempresa.com. Esto puede garantizar que el PageRank no se divide en dos. Para su información, Google trata a estos dos dominios como diferentes. He aquí algunos de los códigos.htaccess que se pueden utilizar en sus sitios web.

Redirigir la URL sin www a la dirección con www

Como explique anteriormente, el siguiente código redirigirá de la URL de su dominio sin www a la URL de su dominio con www.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^webempresa.com
RewriteRule (.*) http://www.webempresa.com/$1 [R=301,L] 

Como cambiar de la URL www para la dirección URL sin www

Y el siguiente código debe redirigir al usuario de la dirección URL de su dominio con www a la dirección URL sin www.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.webempresa.com [NC]
RewriteRule ^(.*)$ http://webempresa.com/$1 [L,R=301]


Impedir listar el directorio

Si tiene una carpeta en el servidor web utilizada para almacenar archivos como los e-docs, software legal, etc,, si la carpeta no tiene archivo index.html, los visitantes pueden ver todos los archivos dentro de la carpeta sin problemas. En este caso puede utilizar el código siguiente para evitar que esto suceda.

Options -Indexes

Orden de ejecución de archivos

Si tiene tanto el archivo index.html como el archivo index.php en la carpeta /public_html, el archivo index.html tiene mayor prioridad y se ejecutara en primer lugar. Aunque la mayoría de scripts web utilizan el archivo index.php como punto de partida. Si se puede eliminar el archivo index.html, se soluciona el problema, aunque no siempre es asi y en estos casos hay una mejor solución que es utilizar el siguiente código para dar prioridad al archivo index.php en vez de index.html.

DirectoryIndex index.php index.html

Comprimir archivos CSS, JavaScript, XML y texto

El siguiente código está diseñado para comprimir el código de salida CSS, JavaScript, XML y de texto antes de ser mostrado en el navegador. La idea básica es ahorrar tiempo en la carga y no consumir tanto ancho de banda.


AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript


Almacenamiento en caché de imágenes

Cada vez que recibimos visitas en la web, el servidor web obtiene todos los archivos necesarios, tales como archivos CSS y JavaScript, así como fotos e imágenes para poder mostrarla. Podemos usar el código de abajo para gestionar los archivos de caché, y que cuando un visitante vuelva a visitarnos por segunda vez, el servidor cargue el archivo de la caché lo que acelerará el tiempo de carga sitio web.


ExpiresActive On
ExpiresByType image/gif A432000
ExpiresByType image/jpg A432000
ExpiresByType image/jpeg A432000
ExpiresByType image/png A432000
ExpiresByType image/ico A432000
ExpiresByType image/bmp A432000
ExpiresByType text/css A432000
ExpiresByType text/javascript A432000
ExpiresByType application/javascript A432000
ExpiresByType application/x-javascript A432000


El código anterior guarda caché de los archivos durante cinco días o 432.000 segundos. Puede cambiar el período de almacenamiento en caché, asegurándose de utilizar el valor expresado en segundos.

Proteger el archivo .htaccess

El siguiente código evita que su archivo .htaccess puedan ser leído directamente desde el navegador web.


order allow,deny
deny from all

Prevenir el hotlinking

A veces, otros webmasters, hacen suyas las imágenes de nuestras webs, artículos, etc., afectando con ello el ancho de banda de que disponemos en nuestro Hosting. Si ademas ellos tienen una gran cantidad de visitantes al día, estos van a utilizar nuestro ancho de banda del servidor para visualizar nuestras imagenes en la web ajena a nosotros. Se puede utilizar el código que se muestra a continuación para evitar el hotlinking, y de esta forma reemplazar la imagen original por otra con algún aviso para hacerles saber que la imagen es nuestra o que el hotlinking es una mala práctica.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?webempresa\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpg|gif|bmp|png)$ http://hotlink.webempresa.com/no_se_permite_hotlinking.jpg [L]


Puede subir la imagen a un sitio de alojamiento de imágenes como ImageShack para evitar que su ancho de banda se vea afectado.

Cambiar la ubicación de la carpeta de dominio a otra carpeta de /public_html

Si ya tiene un sitio web en el /public_html, y quiere actualizar la página web, pero no quiere que los demás lo vean, pero tampoco quiere afectar al sitio web en producción existente, la forma más fácil es la construcción de la nueva página web en una subcarpeta de /public_html, por ejemplo, /public_html/web2.

Al finalizar todas las pruebas y mejoras, quiere reemplazar el antiguo sitio web con el nuevo pero transferir archivos y carpetas a la carpeta /public_html es bastante molesto. La mejor solución es usar.htaccess para decirle a Apache que utilice la carpeta /public_html/web2 en lugar de /public_html para el dominio.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^webempresa\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.webempresa\.com$
RewriteCond %{REQUEST_URI} !^/web2/
RewriteRule (.*) /web2/$1 [L]


Crear URLs de uso fácil o "amigables"

¿Cuál de las dos URL a continuación parece más amigable?

http://tusitio.com/acercade
http://tusitio.com/paginas/acercade.html


Cuando se trata de direcciones URL, siempre y cuando el significado sea claro, cuanto más corto es, mejor. htaccess con una llamada al módulo de Apache mod_rewrite permite configurar las direcciones URL como quieras. El servidor puede mostrar el contenido de "/paginas/acercade.html" cada vez que alguien visita "http://tusitio.com/acercade".

A continuación algunos ejemplos:

RewriteEngine on
RewriteRule ^acercade/$ /paginas/acercade.html [L]
RewriteRule ^caracteristicas/$ /caracteristicas.php [L]
RewriteRule ^comprar/$ /comprar.html [L]
RewriteRule ^contacto/$ /paginas/contacto.htm [L]


Forzar el uso de SSL

Este código fuerza a utilizar SSL, no permitiendo conexiones http. Para evitar escuchas en http:// utilizamos por debajo la directiva ErrorDocument.

SSLOptions + StrictRequire
SSLRequireSSL


Cuando una línea comienza por # es un comentario que no tiene ningún efecto.

Cuando alguien visita su sitio el servidor web Apache verifica si tiene un archivo .htaccess en algún lugar de su espacio web a partir de la carpeta raíz o la carpeta principal y rastrea todas las carpetas hasta llegar al archivo solicitado. Si encuentra un archivo .htaccess, sus directivas se aplican a la solicitud actual.

Es importante saber que el archivo .htaccess debe ser legible por el servidor Apache. Por tanto es importante consultar con su Hosting si se requiere algún permiso especial que hayan establecido para los archivos .htaccess. En general los permisos correctos para este archivo son 644.

Estas apenas son unas pinceladas de las muchas posibilidades que tiene la correcta gestión del archivo .htaccess que en la mayoría de sitios webs, del nivel que sean, suele pasar desapercibido y es relegado al estatus de un archivo más, cuando el potencial del mismo es tan grande como quiera otorgarle el usuario.

Como hacer más rápida la carga de una página web en un servidor Apache

Configurar en el archivo .htaccess de un servidor Apache, los parámetros Expires y Cache-Control para hacer cacheables las páginas y lograr que carguen con más velocidad y rapidez. Reducir y minimizar las peticiones HTTP. Elevar el rendimiento de un sitio web y reducir el ancho de banda necesario.
Como hacer más rápida la carga de una página web en un servidor ApacheUnos de los métodos más prácticos, sencillos y recomendados para lograr que una página web o blog, cargue más rápidamente, es configurar los parámetros necesarios en el servidor web donde está alojada.
Esto permite hacer cacheables las paginas, o sea mantener en la memoria del navegador los elementos que la componen. 
Todos los navegadores poseen una cache (memoria) para reducir el tamaño y la cantidad de peticiones HTTP necesarias.
Los servidores pueden usar los parámetros Expires o Cache-Control Header en las respuestas, para informarle al navegador del cliente, el tiempo que puede ser cacheado un componente o elemento de la página solicitada.
Agregando solo unas líneas en el archivo de configuración del servidor, puedes hacer que las páginas de tu sitio web carguen un 40% más rápido en el navegador de tus lectores.



Pasos al solicitar una página web a un servidor con el navegador web


¿Que significa todo esto?
Al usuario hacer la solicitud al navegador de cargar determinada página web, primeramente se establece una conexión preliminar entre este y el servidor, en la cual se intercambian varios datos como los encabezados HTTP o headers, permisos necesarios, etc.
Uno de los datos que devuelve el servidor, es el tiempo de duración que podrán tener los diferentes archivos en la cache o memoria del navegador, de forma predeterminada este tiempo es corto para asegurar la frescura de lo que se muestra al usuario.



Peticiones HTTP innecesarias realizadas


Un ejemplo, al cargarse una página llamada imágenes-lindas.htm en un sitio web al que nunca se ha accedido con anterioridad, el navegador necesita de un tiempo determinado para mostrarla completamente, este tiempo está en relación con la cantidad de elementos que la componen y la velocidad de la conexión.
Existe gran cantidad de páginas en la red que contienen multitud de elementos, ya sea imágenes, archivos flash, scripts, hojas de estilo css, etc. por lo que es necesario varias peticiones de forma simultánea. 
Accedes a la misma página imágenes-lindas.htm, dos días después y el navegador requerirá casi el mismo tiempo, como si fuera la primera vez ya que tendrá que cargar todos los elementos de nuevo.

Ventajas de evitar las peticiones HTTP innecesarias


Estableciendo los parámetros de Expires o de Cache-Control, para que permanezcan más tiempo en la cache, elementos que no se modifican frecuentemente como imágenes, archivos flash y que además requieren de varias peticiones cada vez que se acceda a dicha página, hará que en futuros accesos los elementos citados de cargarán de la cache, por lo que la velocidad de carga casi será instantánea.
Este método ofrece dos ventajas:
• Se reduce el tiempo de carga de la página web, al reducir la cantidad de peticiones HTTP necesarias.
• Se reduce por lo tanto el tamaño de las peticiones trayendo consigo el consumo de menos ancho de banda y el incremento del rendimiento general.



¿Cómo conocer la configuración actual de mi servidor?


Puede comprobarse facilmente el tiempo que permanece en la cache del navegador, los elementos de una página determinada, para eso haz lo siguiente:
En el navegador Google Chrome introduce en la barra de direcciones:
chrome://view-http-cache/http://norfipc.com/
Sustituye "http://norfipc.com" por la dirección URL de la página solicitada.
Chrome mostrará los encabezados HTTP y entre ellos el valor de "Cache-Control" y de "Expires", si así están configurados en el servidor web que aloja dicha página.
En el navegador Google Chrome también puede usar las herramientas de desarrolladores, que devuelve toda la información necesaria.



Como usar la consola de Chrome para ver los encabezados HTTP


Hazlo de la siguiente forma:
• Da un clic en la esquina superior derecha del navegador y escoge: Herramientas -> Herramientas para desarrolladores.
• Un clic en la pestaña "Network"
• Recarga la página (F5)
• En la lista de archivos escoge la página principal, en este ejemplo: index.html
• Abre la pestaña "Headers" para ver los encabezados.
Se muestra "Request Headers" (encabezados enviados por el navegador) y "Response Headers" (respuestas del servidor web)
En la siguiente imagen que es una captura de pantalla, solo mostramos las respuestas, puede verse los valores de Cache-Control y de Expires que usamos en nuestro sitio.
Usar la consola del navegador Google Chrome para ver los encabezados HTTP



Parámetros que definen el tiempo en la cache del navegador de los elementos de las páginas


Los parámetros que definen en un servidor que utilice Apache, el tiempo en que el navegador puede usar los recursos de la cache son: Expires y Cache-Control: max-age.
Especifican el tiempo de frescura (freshness lifetime) que es el tiempo durante el cual el navegador puede usar la cache sin comprobar si existe una nueva versión disponible en el servidor.
Se ha hablado de las ventajas que son indudables, la desventaja es que un cliente puede acceder a una página web que ha sido modificada recientemente y no percatarse ni darse cuenta de los cambios efectuados, ya que el navegador solo mostrará lo que posee guardado en la cache, a no ser que se refresque el navegador mediante el botón correspondiente o la tecla F5.
De los dos parámetros: Expires y Cache-Control: max-age solo es posible utilizar uno de los dos, no se puede emplear los dos simultáneamente.

¿Cómo configurar los encabezados Expires y Cache-Control en Apache?


En los servidores Apache se pueden configurar los parámetros de su funcionamiento de dos formas.
1- En el archivo httpd.conf, principal herramienta de configuración del servidor, solo el administrador tiene el acceso y los permisos para modificarlo.
2- El archivo .htaccess, archivo individual de cada subdominio en el que se pueden establecer muchos de los parámetros aplicables en este caso solo a los archivos donde se encuentre.
Es el método más práctico y sencillo y el único que podemos usar si alojamos nuestro sitio en un servidor de terceros.

¿Qué es el archivo .htaccess en Apache, como configurarlo?


Es solo un sencillo archivo de texto plano que para los usuarios de Windows luce algo diferente, no posee nombre, solo la extensión de archivo .htaccess.
Si tratas de crear un archivo así en Windows lógicamente recibirás un mensaje de error, pero es posible copiar o descargar una a nuestro equipo y modificarlo.
Descarga más abajo un archivo .htaccess de ejemplo.
Puedes emplear un archivo .htaccess en cualquier carpeta o subcarpeta del servidor para especificar los parámetros de ese directorio.
Si lo usas en un servidor local, tienes que asegurarte que en el archivo httpd.conf, esté especificado: "AllowOverride All" en los permisos del directorio raiz donde se va a usar, si no es así no tendrá efecto, por ejemplo:
<Directory "C:/servidor/ejemplo"> 
AllowOverride None
</Directory> 



¿Cómo usar los encabezados Cache-Control para hacer las páginas cacheables?


Solo es necesario copiar y pegar el siguiente código en un archivo .htaccess:
# 1 MES
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|js|xml|txt|css)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

# 1 SEMANA
<FilesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=604800, public, must-revalidate"
</FilesMatch>
El carácter # significa que la línea es un comentario.
En este ejemplo se emplean dos opciones diferentes para un mes y una semana respectivamente.
La primera opción establece para todos los archivos de imágenes, flash y otros archivos auxiliares, un mes la duración de la cache. Todos los archivos que posean las extensiones: 
ico|pdf|flv|jpg|jpeg|png|gif|swf|js|xml|txt|css. Puedes agregar cualquier otro a la lista.
La segunda opción se usa solo para los archivos html, htm y php que son los que con más frecuencia se modifican en mi sitio, en este caso especifíca la duración en cache de una semana.
Si deseas especificar para esos u otros tipos de archivo un tiempo superior o inferior, utiliza las siguientes opciones, solo introduce las extensiones de los archivos necesarias.
# 1 AÑO
<FilesMatch "\.()$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>

# 1 DIA
<FilesMatch "\.()$">
Header set Cache-Control "max-age=86400, must-revalidate"
</FilesMatch>
Descarga un archivo .htaccess de ejemplo y que te servirá de plantilla.

Descargar archivo .htaccess Descargar archivo .htaccess

¿Cómo usar el encabezado Expires para hacer las páginas cacheables?


Google recomienda el uso del encabezado Expires en vez de Cache-Control por ser soportado de forma más amplia.
Expires es posible emplearlo en Apache mediante dos directivas: ExpiresDefault y ExpiresByType, el primero define de forma general como debe el navegador cachear los recursos y con el segundo se puede definir, de acuerdo al tipo de archivo.
En ambos casos el tiempo a perdurar el documento en la cache del navegador, se puede establecer con el parámetro "access" y a continuación un intervalo.
Se pueden utilizar los siguientes intervalos:
years, months, weeks, days, hours, minutes, seconds
El uso de ExpiresDefault es sencillo, solo es necesario especificar en el archivo .htaccess dos líneas.

Ejemplo para que perdure por un año (Intervalo máximo para no violar las normas del RFC):
ExpiresActive on
ExpiresDefault "access plus 1 year"

Ejemplo para que perdure por seis meses:
ExpiresActive on
ExpiresDefault "access plus 6 months"

Utilizar ExpiresByType sería similar, pero especificando cada tipo de archivo, por ejemplo:
ExpiresActive on
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType text/css "access plus 2 months"
ExpiresByType text/javascript "access plus 2 weeks"

La solución ideal puede ser combinando ambas directivas.
El siguiente ejemplo (recomendado) es para usarlo en un sitio web, en el que se modifique frecuentemente el contenido de las páginas (solo el texto):
ExpiresActive on
ExpiresDefault "access plus 6 months"
ExpiresByType text/html "access plus 2 weeks"

Otras formas de usar la directiva Expires, utilizando el intervalo en segundos.
ExpiresActive On
ExpiresDefault A0
# 1 AÑO
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>

# 1 MES
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A2592000
</FilesMatch>

# 1 SEMANA
<FilesMatch "\.(txt|xml|js|css|htm|html|php)$">
ExpiresDefault A604800
</FilesMatch>
El tiempo se expresa en AXXX, donde XXX son los segundos que posee el intervalo.

Precauciones al hacer cacheables las páginas web


Pero ¡Cuidado!, si se hacen todos los elementos de una página cacheables, se corre el riesgo de que el usuario al solicitarla no la cargue del servidor, vea solo la copia en la cache del navegador, esto trae como consecuencia que no existirá acceso físico a tu sitio y no contará como una visita. Siempre es necesario para evitar lo anterior, que algunos de los elementos de la página tengan un tiempo de expiración corto.
No es nada difícil, para eso puede insertarse un snippet de Facebook o el +1 de Google, expiran en minutos.
Si no sabes como hacerlo lee la siguiente página: Como insertar los botones Me Gusta y plusone +1 en las páginas web

Desactivar el parámetro ETags


Otro parámetro que de paso podemos configurar en el archivo .htaccess adecuadamente es: ETags.
Para verificar si un archivo en un servidor es el mismo que el que se encuentra en la cache del navegador se usan dos parámetros: Last-Modified y ETags, no se pueden usar simultáneamente, si no de forma alternativa de la misma forma que Expires y Cache-Control.
Para conocer si tu servidor web utiliza Last-Modified o ETags accede a Gtmetrix y haz una simple prueba a cualquier página de tu sitio.
Entity tags (ETags) es un mecanismo creado para determinar cuando el contenido en la cache en el navegador coincide con el que se encuentra en el servidor web, esto ocasiona conflictos en los casos de una misma información almacenada en diferentes servidores, con el objetivo de asegurar una efectiva dispersión geográfica, ya que no coinciden exactamente, en estos casos el navegador perderá tiempo haciendo consecutivas peticiones con el objetivo de comprobar y validar las fechas.
Si no necesitas en lo absoluto utilizar las posibilidades de validación que ETags provee, es recomendado desactivarlo por completo, para eso solo es necesario incluir en el archivo .htaccess la siguiente línea:
FileETag none
Es necesario esperar por el reinicio del servidor para que los cambios tomen efecto.

¿Cómo comprobar el resultado de los cambios realizados?


Para comprobar los efectos en el rendimiento de un sitio web donde se efectúen los cambios, utiliza cualquiera de los servicios para comprobar la velocidad de carga de cualquier página que se encuentre alojada en dicho sitio o subdominio donde se utilice y modifique el archivo .htaccess antes y despues.
Puedes utilizar:
◄ Gtmetrix
◄ Page Speed de Google en tu navegador web.
◄ Page Speed Online.
Todos los cambios anteriores también se pueden efectuar en un servidor local previamente.

Páginas donde encontrar mas información online


Todas las recomendaciones anteriores son aconsejadas y han sido tomadas de las siguientes páginas, en las que puedes encontrar más información útil para mejorar e incrementar la velocidad en tu sitio web.

Best Practices for Speeding Up Your Web Site.
http://developer.yahoo.com/performance/rules.html

Speed Up Sites with htaccess Caching.
http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html

Optimize caching
http://code.google.com/speed/page-speed/docs/caching.html

CommentFB