Archivo

Archivo del autor

¡La web a mi gusto!

Viernes, 21 de Agosto de 2009 blakeyed Sin comentarios

A menudo, encontramos páginas web que pueden no ser compatibles con el navegador que estamos utilizando, o el sistema operativo en el que nos encontramos. Por ejemplo, últimamente, estoy usando Firefox 3.5 sobre Gentoo GNU/Linux. Es normal encontrarse webs diseñadas para Internet Explorer, o incluso puede que por las tipografías utilizadas no encajen bien en nuestro sistema.

En mi caso, hay una web que visito muy a menudo, y es la de mi proveedor de hosting en la que a veces, por ejemplo cuando quiero mandar un ticket; me veo obligado a utilizar el scroll horizontal, ya que al no especificar el ancho del textarea como propiedad en el CSS, lo han hecho en caracteres (con la propiedad COLS); veo un textarea mucho más grande que mi pantalla y cuando quiero revisar el mensaje que estoy mandando tengo que desplazarme constantemente de derecha a izquierda.

La solución fácil, sería que ellos cambiaran la forma en la que dimensionan el textarea, pero hay multitud de ocasiones en las que eso no se puede pedir. Tenemos el ejemplo del Manifiesto de Apoyo al autónomo de Punto Radio; la página, internamente está muy mal diseñada, y tras varios emails con el webmaster y éste decirme que la página no fallaba (la solución sería añadir un estilo a los input text del nombre y los apellidos, y ahí especificar el tamaño en pixels, se seguiría viendo igual en todas partes).
Punto Radio
Pero para nosotros y para andar por casa, vamos a utilizar el DOM Inspector (en el menú Herramientas), desde el que, como vemos más abajo hemos podido modificar la propiedad size de los input text en cuestión. (Para seleccionar el textbox pulsamos en el botón de arriba a la izquierda de la nueva ventana y luego pinchamos sobre el elemento dentro de la página; tras ello nos dejará seleccionar y modificar las propiedades con el botón derecho).
Punto Radio - Ahora se ve bien

Esto está bien para una web que vas a visitar una vez nada más. Pero hay veces que tienes que visitar una web de este tipo muchas veces, y es en este punto cuando tenemos que recurrir a extensiones como Chickenfoot o GreaseMonkey; estos dos, nos permiten ejecutar código javascript y dispararlo en un momento determinado, por ejemplo, al entrar en una web.

Para eso hice este script, que voy a utilizar para cuando tenga que enviar un ticket a mi proveedor de hosting:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var alltags = new Array();

function redimensionalo(que)
{
    que.style.width='600px';
}

function CogeElementoPorClase(tipo, clase, quehacer)
{
  var alltags=document.getElementsByTagName(tipo);

  for (i=0; i<alltags.length; i++)
  {
    if (alltags[i].className==clase)
    {
    quehacer(alltags[i]);
    }
  }
}

CogeElementoPorClase('textarea', 'ClaseTextarea', redimensionalo);

El script, cogerá el textarea que tenga la clase ‘ClaseTextarea’ y llamará a la función redimensionalo que modificará su ancho y le establecerá 600px (como el elemento no tiene id no podemos utilizar getElementById). Gracias a una de las dos extensiones que mencioné antes, podremos hacer que ese script se ejecute nada más entrar en la sección de tickets de mi proveedor.

Aunque no termina todo ahí, podemos automatizar muchas acciones con estos dos programas, extraer información, hacer clicks en ciertas zonas de las páginas, etc; muchas veces necesitamos hacer tareas repetidas veces y estas extensiones pueden solucionarnos el día.

Geolocalización de una IP

Domingo, 26 de Julio de 2009 blakeyed Sin comentarios

A veces, nos es de bastante utilidad geolocalizar a un visitante, bien puede ser para mostrarle una publicidad relevante o porque prestamos un servicio que sólo existe en determinados países, para escoger automáticamente el idioma de nuestra web, o por motivos estadísticos, para saber de dónde provienen nuestras visitas, como medida en una red social para detectar automáticamente dónde estás… en fin, hay un sinfín de utilidades.

Lo más común para geolocalizar a los visitantes es verificar su dirección IP y consultar en una base de datos a qué país pertenece. Hay empresas que comercializan estas bases de datos, y las hay con mucha precisión (algunas pueden decirnos hasta la ciudad donde está conectada la persona con esa dirección IP). Aunque vengo a hablaros de un servicio gratuito: Ip to Country de Webhosting.info.

En las web citada viene mucha información de cómo utilizar la base de datos y código de ejemplo, por lo que no me extenderé mucho.

En resumen, tenemos que decargar el fichero CSV, que contiene la tabla que debemos incluir en nuestra base de datos (por ejemplo, PhpMyAdmin tiene la posibilidad de importar ficheros CSV). Seguidamente, hay que tener en cuenta que en esta tabla, la IP no está en el formato que estamos acostumbrados (4 números de 8bits separados por puntos), está en formato long, lo que es los 32bits (en PHP podemos hacer la conversión con ip2long()). Para hacer nuestro programa hemos de saber que la IP que queremos geolocalizar tiene que estar comprendida entre ip_from (primera ip que viene en la tabla) e ip_to (segunda ip).

Categories: PHP Tags: , , , , ,

Conseguir la IP del usuario

Viernes, 24 de Julio de 2009 blakeyed 2 comentarios

Os dejo el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function gf_obtiene_ip () {
  // Las variables _SERVER nos lo pueden decir
  $metodos = array("CLIENT_IP","HTTP_X_FORWARDED_FOR","HTTP_X_FORWARDED","HTTP_FORWARDED_FOR","HTTP_FORWARDED","REMOTE_ADDR");

  $i = 0;

  while ( ($i<count($metodos) ) || (!isset($ip) ) )  
    {
      $valor = $metodos[$i];
      if (isset($_SERVER[$valor]))
    $ip =$_SERVER[$valor];
      else if (isset($_ENV[$valor]))
    $ip =$_ENV[$valor];

      $i++;
  }
  return ( isset($ip) ) ? $ip: false;
}

Con este script intentamos evitar que se detecte como la IP del usuario la de un proxy intermedio recorriendo todas las variables que podemos encontrar en $metodos.

Categories: PHP Tags: , , ,

Tuberías con nombre para comunicación entre procesos

Domingo, 19 de Julio de 2009 blakeyed 2 comentarios

Las tuberías con nombre son un método de comunicación FIFO entre procesos (también se les llama fifos). FIFO son las siglas de First In First Out, es decir, el primero que llega es que primero que se marcha, como en una cola, el primero que llega es el que antes termina.

Observad lo que hacen las macros depura_int y depura_string, nos darán el número de línea y el archivo donde están, así como el nombre de la variable y el valor que tiene en ese momento.

Normalmente las tuberías son anónimas, aunque el hecho de tenerlas con un nombre en nuestro sistema de ficheros puede sernos de gran utilidad. Como ejemplo, podemos verlo en funcionamiento en la siguiente imagen:

Cómo hacer una pipe con nombre en 1 minuto

Cómo hacer una pipe con nombre en 1 minuto

Primero vemos el terminal de abajo, en el que se ejecuta lo siguiente:

1
2
$ mkfifo prueba
$ cat prueba

Seguidamente en el otro terminal se escribe lo siguiente:

1
$ echo "Esto es una prueba" > prueba

Automáticamente el texto “Esto es una prueba” aparece en el primer terminal. ¡Hemos logrado enviar un mensaje!

De la misma forma podemos programar aplicaciones que utilicen estas características de forma muy fácil en casi cualquier lenguaje de programación, para los ejemplos utilizaré C. Debemos hacer dos programas, uno que escriba en la tubería (pipe) y otro que lea de ella. Empezamos por pipewrite.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
  FILE *mipipe;
  char buffer[128];
  int i=0;

  if (mkfifo("pipetest", S_IWUSR |  /* El usuario puede escribir */
                 S_IRUSR |  /* El usuario puede leer */
                 S_IRGRP |  /* El grupo puede leer */
                     S_IROTH    /* Otros pueden leer */
         )!=0)
    printf ("Hubo un problema al crear la pipe\n");

  mipipe=fopen("pipetest", "w"); /* Lo abrimos como un fichero normal y corriente */

  /* Con esta línea leemos hasta que se cierre la tubería por el otro */

  while (i<10)
    {
      sprintf(buffer, "CADENA ENVIADA Número: %i\n", i+1);
      fputs(buffer, mipipe);
      i++;
    }

  fclose(mipipe);       /* Cerramos la tubería por aquí también */

Y ahora pipecilla.c (o el programa que leerá la pipe):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
  FILE *mipipe;
  char buffer[128];
  if (mkfifo("pipetest", S_IWUSR |  /* El usuario puede escribir */
                 S_IRUSR |  /* El usuario puede leer */
                 S_IRGRP |  /* El grupo puede leer */
                     S_IROTH    /* Otros pueden leer */
         )!=0)
    printf ("Hubo un problema al crear la pipe\n");

  mipipe=fopen("pipetest", "r"); /* Lo abrimos como un fichero normal y corriente */

  /* Con esta línea leemos hasta que se cierre la tubería por el otro */
  while (!feof(mipipe))      
    {
      if (fgets(buffer, 128, mipipe))
      printf ("RECIBIDO: %s", buffer);
    }

  fclose(mipipe);       /* Cerramos la tubería por aquí también */
}

Ahora compilamos y ejecutamos en terminales diferentes de nuevo:
Probando pipes
En el terminal de pipewrite.c, al ejecutar el programa da un mensaje de error, es porque la pipe ya existe (se creó en el programa anterior).

Esta forma de comunicación es unidireccional, puede ser últil por ejemplo para publicar el estado de un programa (un reproductor de audio podría publicar la canción que está sonando como en xmms-infopipe), o para modificar el comportamiento de un software mientras éste está en ejecución. Pero si queremos que nuestras aplicaciones dialoguen (en full-duplex), debemos tener dos pipes simultáneas, en ese caso, la aplicación 1, por ejemplo deberá leer en la tubería 1 y escribir en la tubería 2; y la aplicación 2, deberá escribir en la tubería 1 y leer en la tubería 2.

Google Adsense en Facebook

Viernes, 17 de Julio de 2009 blakeyed 15 comentarios

Debido a la conversión de Javascript a FBJS y algún que otro filtro que supongo que ponen los de Facebook, porque creo que no les hace mucha gracia que los desarrolladores publiquen publicidad y ésta les quite público a la publicidad propia; los banners de Google Adsense no se verán (es más, además de que el propio código Javascript no creo que se ejecute bien, al mirar la página por dentro no hay rastro de los banners.

Pero es cierto que Adsense es una de las mejores formas para rentabilizar un sitio web, y son pagadores serios, por tanto, nosotros como desarrolladores de Facebook queremos ganar algo de dinero con las aplicaciones aunque sólo sea para rentabilizar un poco el hosting.

Es cierto que los motores de Google no pueden entrar en las aplicaciones ya que requieren login dentro de Facebook, lo que sí podemos hacer es incluirlo en iframes; es un tema algo delicado ya que los términos y condiciones de Google Adsense no son muy claros con el tema de los frames, por lo que depende de las interpretaciones, pero por ahora es la única forma que conozco para introducir la publicidad. Aunque también es cierto que hay vida más allá de Adsense.

Para incluir el iframe desde FBML debemos hacer lo siguiente:

1
<fb:iframe src="http://dominio/directorio/adsense.php" width="728" height="90" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"></fb:iframe>

Y es muy recomendable incluir dentro de adsense.php (que puede ser (x)html plano) un título, keywords, y algún que otro metadato para que la publicidad que salga sea más adecuada con nuestra aplicación.

Desarrollando aplicaciones para Facebook

Jueves, 16 de Julio de 2009 blakeyed 1 comentario

Hace un tiempo me animé a crear mi primera facebook app, la llamé Campo de Minas, porque pretendía utilizar esa app para hacer pruebas.

Para empezar el desarrollo, lo primero que hay que hacer es entrar en la aplicación para desarrolladores. Por una parte me gusta lo bien montado que está todo, la forma de introducir la información; aunque por otra parte es un sistema lento. Se tarda mucho tiempo en introducir la información navegando por todas la páginas.

Una vez dentro, dispuesto a ponerme a programar, y tras leerme un poco de la documentación, podemos observar la gran API que existe, y las posibilidades para embeber aplicaciones dentro de Facebook. Tenemos lenguajes como FBML, FBJS, FQL, que intentan reemplazar a HTML, Javascript y SQL, para utilizar la API de Facebook. Como punto positivo podemos destacar la seguridad con respecto a Facebook, se han cubierto bien las espaldas, ya que las consultas a las bases de datos de Facebook están filtradas (no estoy diciendo que sea un sistema invulnerable); por otra parte el Javascript está filtrado, los nombres de nuestras funciones, estilos, etc, son filtrados, por lo que evitan errores en el caso de que hagamos algo con un nombre repetido. Por otra parte, tendremos un acceso fácil a las ventanas que Facebook nos aporta como son la de invitar gente, publicar en el perfil, etc.

El hecho de tener tantas posibilidades, y de la sustitución de los lenguajes, nos impide algo importante: la posibilidad de probar nuestra aplicación offline, lo que es muy útil cuando estamos en el proceso de desarrollo, al menos para ejecutar la aplicación desde nuestro servidor local; es normal, si utilizamos recursos que no están en nuestro ordenador. De todas formas, siempre podremos dividir la aplicación en dos: el conector con Facebook, y nuestra propia aplicación; poco a poco quiero desarrollar algunas cosas más y con esto, incluiré algunos ejemplos en el blog.

El alojamiento de la aplicación corre de nuestra cuenta, por lo que Facebook sólo almacena los logotipos de nuestra aplicación y los enlaces.

Otra de dependencia tecnológica

Lunes, 13 de Julio de 2009 blakeyed Sin comentarios

El mercado del software es curioso. Todos conocemos el caso de las revistas en las que vienen muestras gratuítas de champú… probamos el champú, y si vemos que es mejor que lo que estamos utilizando y la relación calidad-precio compensa, podemos empezar a comprar el nuevo champú. (Cuando hablo de champú, puede ser gel, perfume, suavizante, ambientador…).

Pero desde que la informática se empieza a ver como un negocio, se utiliza una táctica parecida:

  • Se organizan cursos gratuítos para utilizar un determinado programa
  • Se regalan las versiones de estudiante.
  • Se hacen descuentos importantes a Universidades/Colegios…

Aunque el efecto, es ligeramente diferente que en el de las muestras gratuítas; estamos hablando del mundo en el que tecnológicamente hablando, casi todo el mundo desconoce la oferta de software, y en ocasiones el único software que conoce es el que ofrecen en el curso/le han regalado/le han hecho descuento… al aprender a utilizarlo, se convierte como por arte de magia en el único programa capaz de hacer la tarea que la persona requiere, y en muchas ocasiones cuando se le ofrece un segundo programa que hace una tarea parecida, ante la opción de aprender a utilizar otro programa, sabiendo utilizar ya uno, suele ser de rechazo. Por lo tanto, lo que importa es llegar el primero.

A partir de ahí, después de conocer sólo un programa, cuando una de esas personas, en su vida profesional se vea obligada a utilizar ese programa, estará obligada a comprar el programa.

Ante la posibilidad de competencia, todos los fabricantes de software quieren ser los primeros en algún sentido; aunque hay un problema fundamental, los diferentes programas no suelen ser compatibles entre sí, por lo que si una persona hace un curso de Micro$oft Office y para él sólo existe esa suite ofimática, y para otra persona sólo existe Corel WordPerfect Suite o Lotus SmartSuite; entre ellos no podrá existir una comunicación bidireccional, ya que por ejemplo Corel WordPerfect soporta formatos de M$. Office, pero no al revés.

Yo creía que la interoperabilidad era fundamental.

Pero hace unos años, no existía la capacidad de comunicación que existe actualmente, y era muy importante qué empresa pagara más por tener sus programas en más ordenadores (aunque fueran copias ilegales, eso tampoco importaba); podía ser el peor programa que existiera, pero al ser el más famoso, se utilizaba más; hoy en día el marketing sigue siendo una parte fundamental, pero también el boca a boca (boca a oreja). Y ciertas empresas de software aún intentan mantener el modelo antiguo, es decir, si se desarrolla un mal producto, ahora no sólo es necesario venderlo bien, porque igualmente puede ser rechazado.

Pero volviendo al tema de la dependencia, ahora nos encontramos con otro gran hecho, cuando hay mucha oferta, las personas/empresas eligen qué programa necesitan (relación calidad-precio, usabilidad…) y con el tiempo tendrán que coexistir; ya que los documentos/archivos generados serán útiles si pueden ser compartidos con otras personas. Y no es plan de tener que instalar en un mismo ordenador, por ejemplo 4 ó 5 suites ofimáticas.

Todo esto me decidí a escribirlo a raíz de ver dos noticias:

  • MathWorks regala versiones reducidas de Matlab para miembros de la comunidad Universitaria y hace importantes descuentos en la adquisición del programa completo. (Visto en publicidad AdSense). Es cierto que Matlab es un referente, es muy potente, multiplataforma, ya tiene un nombre en el mundo del software y quiere seguir teniéndolo. Es un lenguaje propio, y no soportará otro lenguaje que traiga otra suite matemática. Y probablemente, la competencia no soporte Matlab, al menos al 100%. Por cierto, hay una alternativa libre que pinta muy bien: Octave.
  • Además, leo en Muy Computer que Autodesk regala AutoCad 2010 a estudiantes, siendo sólo necesario tener una dirección de e-mail de la Universidad.
  • Además, Microsoft regala Visual Studio a estudiantes (En algunos ciclos formativos)

Veo positivo que se regalen versiones de programas caros, que sería casi imposible utilizarlos fuera de la Universidad/Clases/Empresa de forma legal, aunque, y eso es responsabilidad de los usuarios, no debemos depender de un software determinado ya que el conocimiento es poder, pero si ese conocimiento depende de una empresa, el poder virtualmente propio, es  posesión de la gran empresa que hay detrás.

Categories: General Tags:

Plantillas de correo dinámicas automáticas en Thunderbird

Domingo, 12 de Julio de 2009 blakeyed Sin comentarios
Nuevo mensaje en Mozilla Thunderbird

Nuevo mensaje en Mozilla Thunderbird

Me pareció casi increíble que Mozilla Thunderbird no pudiera incluir plantilas en los e-mails automáticamente de serie. (Es cierto que soporta plantillas, pero tienes que pulsar en la plantilla antes de crear el mail).

Afortunadamente, encontré hace tiempo la extensión ExternalTemplateLoader de Kaosmos. Nos introducir una plantilla que se cargará automáticamente cuando redactemos/respondamos/reenviemos un mensaje.  Pero además, esa plantilla podemos cargarla desde un archivo local o alojada en un servidor de Internet. Con lo cual podremos también, crear plantillas dinámicas.

Para hacer plantillas dinámicas, tenemos varias posibilidades:

  • Si lo que queremos hacer dinámico es cambiar una frase, un texto, una foto que cambie cada cierto tiempo, podemos crear un cron job que genere el archivo html de plantilla cada cierto tiempo, eso nos ahorraría tener que generar la plantilla cada vez que vamos a escribir un mail.
  • Si queremos monitorizar algo, crear un identificador por cada email que vayamos a enviar, escribir un informe, contabilizar los mails, etc; no queda más remedio que generar la plantilla cada vez que vayamos a redatar un mail.

En futuros posts incluiré ejemplos de cada uno de los métodos.

Para todos los que nos cuesta levantarnos por la mañana

Sábado, 11 de Julio de 2009 blakeyed Sin comentarios

Encontré un enlace interesante hace unos días: http://www.howtowakeupearly.com/ hay ciertas cosas de sentido común, y otras que no todo el mundo se puede permitir: “acostarse temprano, por ejemplo; pero hay consejos originales :)

Categories: General Tags:

Kernels para (*)Ubuntu

Viernes, 10 de Julio de 2009 blakeyed Sin comentarios

Tengo que aclarar que no soy muy de Ubuntu, he probado muchas versiones y no me terminan de convencer, es cierto que hace unos dos años que no la pruebo, aunque tenga una de las instalaciones más sencillas que he visto, nunca me ha convencido del todo, hay cosas que veo muy lentas, mucho más que en otras distribuciones.

Pero hace unos días me decidí a probarla de nuevo, en concreto Kubuntu 9.04, y aunque me ha gustado bastante, y está cerca de convertirse en una seria candidata para mis próximas instalaciones, es verdad que no incluirán el kernel 2.6.30 en las actualizaciones, y por razones de compatibilidad con dispositivos WiFi, necesitaba instalar dicho kernel.

Gracias al blog de Jorge Ivan Meza encontré un enlace donde podemos descargar kernels preparados para instalar en Ubuntu: http://kernel.ubuntu.com/~kernel-ppa/mainline/ tal vez no sea nada bueno, pero seguro que a alguien le resulta útil este post.

Categories: General Tags:

Visita otras webs de la red