node.js: codificación correcta de caracteres de un HTTP response

Si en node.js definimos el siguiente callback para dar respuesta a una petición HTTP

var server = http.createServer(function (request, response) {
  response.writeHead(200);
  response.write('el niño es rápido');
  response.end();
});

Esto es lo que obtendremos en nuestro navegador Web:

el niño es rápido

Vemos que el navegador no interpreta bien ni los acentos ni la eñe de la frase. Esto pasa porque estamos incluyendo caracteres que están fueran del rango del código ASCII. El navegador necesita que en la cabecera HTTP le especifiquemos el juego de caracteres correcto. Esto se hace a través del Header HTTP Contec-Type, donde en nuestro caso le indicaremos UTF-8.

Modificamos la función:

var server = http.createServer(function (request, response) {
  res.writeHead(200, {"Content-Type": "text/html;charset=UTF-8"});
  response.write('el niño es rápido');
  response.end();
});

Y ahora el navegador Web interpreta correctamente la respuesta:

el niño es rápido

referencias:
http://nodejs.org/api/http.html
http://howtonode.org/hello-node

Publicado en Sin categoría | Etiquetado , , | Deja un comentario

Oracle. Cómo añadir un nuevo campo autoincremental a una tabla existente e indexarlo.

Supongamos un caso hipotético. Tenemos una tabla usuarios con un mal diseño donde el campo nombre es la clave única:

CREATE TABLE MYUSERS
(
  NOMBRE   VARCHAR2 (50) NOT NULL,
  APELLIDO VARCHAR2 (50) NOT NULL,
  CONSTRAINT PK_MYUSERS PRIMARY KEY (NOMBRE)
);

La poblamos de datos de ejemplo:

INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Rafael','Sanchez');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Daniel','Rodriguez');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Rodolfo','Martínez');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Sebastian','López');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Laura','Martí');
INSERT INTO MYUSERS (NOMBRE, APELLIDO) VALUES ('Sergio','Casas');

Y se decide añadir un campo numérico autoincremental que será la nueva clave única.

Pasos:

1. Crear secuencia INCMYUSERS
2. Eliminar primary key PK_MYUSERS
3. Añadir nuevo campo ID_MYUSERS y que permita valores nulos.
4. Asignar un valor incremental al nuevo campo para cada uno de los registros ya existentes.
5. Modificar el campo ID_MYUSERS para que no permita nulos.
6. Crear nueva primary key PK_MYUSERS

Script:

-- crear secuencia
CREATE SEQUENCE INCMYUSERS INCREMENT BY 1 NOMINVALUE NOMAXVALUE NOCYCLE NOORDER CACHE 20; 
-- eliminar primary key
ALTER TABLE MYUSERS DROP CONSTRAINT PK_MYUSERS;
-- añadir nueva columna 
ALTER TABLE MYUSERS ADD ID_MYUSERS NUMERIC(10);
--dar un valor incremental
DECLARE
	CURSOR MYUSERS_CUR IS
  	SELECT * FROM MYUSERS
  	FOR UPDATE OF ID_MYUSERS;
BEGIN
    FOR MYUSERS_REC IN MYUSERS_CUR
    LOOP
    	UPDATE IMPORT
      	SET    ID_MYUSERS = INCMYUSERS.NEXTVAL
      	WHERE  CURRENT OF MYUSERS_CUR;
    END LOOP;
END;
-- ahora la nueva columna no puede ser nula
ALTER TABLE MYUSERS MODIFY ID_MYUSERS NUMERIC(10) NOT NULL; 
-- crear nueva primary key 
ALTER TABLE MYUSERS ADD CONSTRAINT PK_MYUSERS PRIMARY KEY (ID_MYUSERS);

Resultado:

Publicado en Sin categoría | Etiquetado , | Deja un comentario

TRACERT

TRACERT determina la ruta tomada hasta un destino enviando al destino paquetes de eco del Protocolo de mensajes de control de Internet (ICMP)

U:\>tracert www.3engine.net
Traza a la dirección 3engine.net [91.199.120.8]
sobre un máximo de 30 saltos:
  1    10 ms    <1 ms    <1 ms  10.21.9.2
  2    <1 ms     2 ms    <1 ms  10.255.21.1
  3     *        *        3 ms  
  4     4 ms     2 ms     4 ms  10.255.16.4
  [....]
Traza completa.

Enlaces relacionados:

http://support.microsoft.com/kb/162326
http://www.dba-oracle.com/teas_prae_util26.htm

Publicado en Sin categoría | Etiquetado | Deja un comentario

Format y format array en javacript

Javascript, y por lo tanto node.js, no tiene nada parecido a una función format, pero se puede emular facilmente aprovechando el prototipado de javascript:

// Format emulate
String.prototype.format = function () {
  var args = arguments;
  return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
    if (m == "{{") { return "{"; }
    if (m == "}}") { return "}"; }
    return args[n];
  });
};

Ademas, si necesitas aplicar un format sobre un array puedes hacer esto:

// apply string format to all elements of array and return result
Array.prototype.format=function(prefix)
{
    var result = [];
    this.forEach(function(entry) {
        result.push(prefix.format(entry));
    });
    return result;
};

Ejemplo de uso

console.log("soy el numero {0}".format(1));   
// return soy el numero 1
var misNumeros = [1,2,3];
console.log(misNumeros.format("soy el numero {0}")); 
// return [ 'soy el numero 1', 'soy el numero 2', 'soy el numero 3' ]
Publicado en Sin categoría | Etiquetado , | Deja un comentario

Sleep en Oracle

Si necesitas un delay, por ejemplo, dentro de un Store Procedure puedes hacer uso de sleep:

dbms_lock.sleep
user_lock.sleep

Pero si tienes restringida la ejecución de este SP, este trozo de código emula un delay de una segundo:

DECLARE t1 DATE;
 t2 DATE;
BEGIN t1 := SYSDATE + 1 / 24 / 60 / 60;
  LOOP t2 := SYSDATE;
 EXIT WHEN t2 >= t1;
 END LOOP;
END;
Publicado en Sin categoría | Etiquetado , | Deja un comentario

Notas podcast recomendado: Taller SEO. Lanza tu proyecto con éxito

Una Ponencia en Iniciador. Con la intervención de Jorge González, Consultor Seo, con apoyo de Sesi Sanz.

Taller SEO: Lanza tu proyecto con éxito

Hoy empiezo el estreno de una nueva categoría. Hace ya un tiempo que para aprovechar los trayectos me ha dado por escuchar podcast y tengo la “manía” de anotar lo que me parece mas interesante. Es lo que tiene tener memoria de pez :-)

Este podcast, me ha parecido muy interesante. Es un cursillo acelerado de SEO para principiantes. Tan acelerado que a veces te pierdes y tienes que volver a escuchar algunas partes del audio para coger todas la ideas..


Notas del podcast

  • Antes de empezar debemos preguntarnos ¿qué queremos tráfico o vender?.
  • Si queremos trafico necesitamos hacer keyword research (estudio de palabras clave).
  • Para conseguir un buen posicionamiento hay que buscar keywords con poca competencia. Si pongo ‘sillas hostelería barcelona’ será más fácil posicionarse. Menos tráfico pero mas facil posicionarse.
  • Hay que tener en cuenta las sugerencias que Google da al usuario cuando está escribiendo las keywords en el navegador. Estas sugerencias se basan en el volumen de búsquedas. Que pueden variar si es google.es o google.com por ejemplo.
  • Estar logeado a tu cuenta de gmail puede hacer cambiar las sugerencias. Por lo tanto es importante no estarlo.
  • Keyword suggestion tool es una herramienta que te da toda la lista de palabras relacionadas con una palabra en concreto.
  • Google Keyword Tools es otra herramienta imprescindible que te indica el numero aproximados de búsquedas que devuelve Google para una palabra clave con un 20 a 25% de error. La idea es ir poniendo las palabras relacionadas con las que queremos trabajar.A partir de ahí decidir con que términos queremos trabajar.
  • Otra herramienta interesante es Google Trends
  • Es importante averiguar que keywords está “trabajando” tu competencia tanto en orgánico (SEO) como en adwords (SEM).
  • Una vez seleccionadas las keywords. Debemos agruparlas en las principales y las secundarias. Esto va a servir para definir como vamos a estructurar nuestra Web.
  • Si cogemos como ejemplo la Web bodas.net. Vemos que potencian las palabras clave de ciudades para potenciar la keyword “bodas en barcelona”. Pero como palabras clave secundarias ya que colocan estas keywords al final de la páginas principal. Esto lo detecta Google.
  • Para no perder LinkJuice, relacionado con el PageRank, los enlaces sin importancia tienen que ser no-follow. Esto es así porque cualquier enlace en tu página le estas diciendo a Google que es relevante para tu negocia. Al indicar que el enlace es no-follow le dices a Google que no siga el enlace.
  • Cuantos mas niveles vas bajando en tu jerarquia, menos potencia tiene a nivel de LinkJuice, repercutiendo ene el PageRank.
  • Intenta trabajar sólo una keyword por página.
  • Que cada contenido cargas tenga una URL distinta.
  • El tag H1 o el atributo ALT son importantes para optimizar.
  • Google tiene en cuenta la antigüedad del dominio.
  • Google tiene en cuenta que la keyword por la que posicionas forme parte del dominio.
  • Es importante no hacer pruebas en tu negocio principal porque Google te puede penalizar si te equivocas.
  • LinkBuilding: crea Webs satélites que te lleven a tu web principal, la que quieres potenciar.
  • LinkBuilding: haz infografías.
  • LinkBuilding: intercambia enlaces. Pero cuidado con salir en páginas basura porque penaliza.
  • LinkBuilding: es mejor pocos enlaces pero buenos, que muchos y malos. Los buenos son de páginas con PageRank alto.
  • LinkBuilding: consigue comentarios en blogs.
  • Trabaja el social media (Facebook,Twitter,Linkedin, Google+).
  • Ten en cuenta que Google prioriza google+ porque es suyo.
  • Para que Google te indexe bien y reconozca todas tus páginas tienes que tener un buen sitemap y no tener enlaces rotos.
  • Existe plugins que al añadir una nueva entrada te actualiza el SiteMap.
  • Tienes que dar permisos a los robots de Google. Se hace mediante el fichero robot.txt.
  • Google tiene en cuenta la velocidad de tu web (VPO).
  • Si queremos medir el tráfico de nuestra Web necesitamos Google Analytics.
  • Si queremos saber donde esta posicionada una Web podemos usar Seomoz.
  • Si queremos saber cuantas paginas tiene indexadas Google de una Web: “site:laweb.com”.
  • Un consejo. No hacer uso de Google Analytics hasta unos meses después de lanza la Web. Porque la herramienta indica la tasa de rebote que indica la relevancia de la web. Esto es utilizado por Google para el ranking.
  • La tasa de rebote tiene que ver con el tiempo que un usuario se queda en tu página.
  • Es importante conseguir que el usuario se quede en tu pagina más tiempo.
  • También te puede servir esta tasa para saber que keywords eliminar. Ya que son keywords que si bien hacen que nos visite un usuario, no encuentra lo que busca y se va de la Web enseguida.
  • Cuidado con las plantillas que viene con WordPress u otros CMS. A veces tienen enlaces maliciosos que te hacen perder LinkJuice e incluso ser penalizados por Google. Revisar el código.
  • Recomendado PrestaShop y Magneto para vender. Y WordPress para blog.
  • Google va recorriendo el código Html y le da más relevancia a lo primero que sale.
  • A la hora de buscar en Google. Difiere la manera de buscar en un usuario de un smartphone o el de un PC. En un smartphone vas mas al grano y usas menos palabras. Tenerlo esto en cuenta al buscar las keywords de tu Web.
Publicado en Podcast | Etiquetado | Comentarios desactivados

Pingbacks y Trackbacks

Los pingbacks y trackbacks es un concepto que surge en el mundo de los blogs.
Se trata de un enlace inverso o retroenlace que permite conocer qué enlaces apuntan hacia un determinado artículo; de ese modo, avisa a otro blog que se está citando uno de sus artículos.

Básicamente, si un blog admite trackbacks quiere decir que es capaz de recibir un aviso de otro blog, de forma que los artículos de ambos quedan relacionados entre sí.

Mientras que los pingbacks usan XML-RPC los trackbacks hacen uso de HTTP POST. El pingback se puede hacer de manera automática (auto-descubrimiento) si ambos blogs están configurados para aceptarlo. El trackback en cambio obliga al autor a buscar el link y a pegarlo al hacer el post y aunque esta característica da más control sobre estos mensajes está en desuso por su carácter manual.

Ejemplo de Pingback. Parte del código HTML de una entrada de mi blog. Marcado en amarillo la referencia a la URL con el procedimiento remoto que invocará automáticamente un blog (si soporta esta característica) al publicar una entrada donde se incluya un enlace a mi artículo.

Ejemplo de Trackback. Captura de pantalla de una entrada del blog de Enrique Dans. En este caso el blog tiene activada la opción de trackback y el theme utilizado incluye el enlace al trackback. Vemos que mas abajo se listan los trackbacks producidos (sólo hay uno):

Parte del código de la página donde se puede apreciar la URL trackback:

Recursos:
WordPress FAQ Desenredando Los Misterios De Los Trackbacks Y Pingbacks
La conversación ampliada: pingbacks y trackbacks

Publicado en Sin categoría | Etiquetado , | Comentarios desactivados

Subdominio vs dominio y SEO

Tengo pensado publicar un blog con contenidos bien diferenciados unos de otros. La parte técnica no me preocupa porque a partir de la version 3 de WordPress es posible administrar varios blogs. Anteriormente a la version 3 era posible mediante el plugin WordPress MU pero complicado de mantener.

El dilema surge cuando pienso en el SEO. Después de googlear un poco esta es la conclusión:

  • La ventaja/desventaja con el subdominio es que tiene su propio ranking (llámese alexa, pagerank, etc.).
  • La ventaja/desventaja con el directorio es que contribuye al ranking del dominio principal (domainrank)
  • El pagerank es distinto en cada página y en cada subpágina, así que entiendo que no influye en tener o no tener subdominio.
  • Creo que me decido por los subdominios.

    Recursos:

    http://www.araquebelagua.com/2010/10/25/como-habilitar-la-gestion-de-multiples-blogs-en-wordpress-3-0
    http://www.chicaseo.com/multiples-sitios-en-sub%E2%80%94dominios-y-sin-wildcard-con-wordpress-3-0
    http://www.forowp.org/index.php?topic=898.0

    Publicado en Sin categoría | Etiquetado , | Comentarios desactivados

    Instalar MOTODEV Studio for Android en Ubuntu

    Pasos para instalar MOTODEV Studio for Android en Ubuntu:


    1. Descargar de aquí el binario la versión para Linux (32 o 64 bits). Es posible que antes nos pidan registrarnos.
    2. En consola entrar como admin: sudo -s
    3. Dar permisos de ejecución: chmod 777 ./archivo.bin
    4. Instalar: ./archivo.bin

    Publicado en Sin categoría | Etiquetado , | Comentarios desactivados

    Recuperar un correo ya enviado (Outlook)

    Es posible recuperar un correo que ya ha desaparecido de la bandeja de salida, si el destinatario todavía no hay leído el mensaje.

    1. Vete a la bandeja de elementos enviados. Localiza el mensaje a recuperar. Ábrelo. Selecciona “Otras acciones > Recuperar este mensaje…”:

    2. Si tiene existo la recuperación, recibirás un mensaje como este:

    Publicado en Sin categoría | Etiquetado , | Comentarios desactivados