Archive for the ‘Informática’ Category

Mujeres informáticas: seguimos dando vueltas a la noria

28 28UTC agosto 28UTC 2017

Bueno, aunque sea verano y uno se lo tome todo con vagancia, a veces hay que escribir, aunque sea para no olvidar del todo cómo se hace. Y hoy he leído algo que me ha dado ganas de tomar alguna nota aquí.

Entre los muchos problemas que padecen las mujeres está el enfoque chapucero del feminismo que se ve algunas veces. Es el enemigo en casa. Y ese enfoque chapucero se manifiesta muy a menudo, y me interesa especialmente, porque sí, señoras y señores: soy feminista. Si me dan su permiso.Y si no, también.

Se manifiesta la chapuza en el lenguaje. En todo eso que se habla a veces sobre el sueldo de las mujeres. Y también en el enfoque que se da a la presencia de mujeres en las ingenierías, y en la informática en particular.

Me interesan esos problemas, porque me gustaría ayudar a solucionarlos. Y por eso querría saber todo lo posible. Para buscar una solución hay que entender el problema. Sin embargo, esto está lleno de listillos de libro, que dicen “Eso lo arreglaba yo en dos días”, pero cuando les prestas atención, no tienen  ni idea de nada. No saben nada, no aportan ninguna solución concreta.

Hoy he visto otro ejemplo. Este artículo:

Cómo la informática pasó de ser un trabajo para mujeres a estar dominada por hombres

Parece muy interesante. Pero, como suele ocurrir en estos casos, no responde a la pregunta del titular. No aporta más que opiniones vacías, del autor y de las entrevistadas. Opiniones sin fundamento alguno, suposiciones, posturas personales, que resultan obvias, manidas y por eso mismo inútiles. Todo lo que pone ahí ya se le había ocurrido a alguien; y todo lo que pone ahí no se ha demostrado nunca ni ha tenido ningún efecto positivo.

La formación en ingeniería  es también una formación de carácter. Uno puede ser creativo, busca la belleza, busca soluciones elegantes, pero hay un pequeño problema: lo que hace un ingeniero tiene que funcionar. No hay brindis al sol. Si funciona, sí; ponte todo lo exquisito que quieras. Si no funciona, no nos hagas perder el tiempo. Y en este asunto se habla mucho, se habla gratis, se habla sin pruebas y se repiten una y otra vez cosas que quizás conforten al que las dice, pero hasta ahora no han funcionado en absoluto.

Se cita en el artículo el famoso memorando de James Damore en el que decía no sé qué cosas (no lo he leído) pero entre ellas, al parecer, que hay razones biológicas por las que las mujeres están menos representadas en ingeniería. Una tal  Susan Wojcicki incluso cita emotivamente, como si hubiera sido un suceso desgraciado, a su hija, que le preguntó “¿Mamá, es cierto que hay razones biológicas por las cuales hay menos mujeres en la tecnología y puestos directivos?” No sé lo que contestó Susan Wojcicki; fuera la que fuera su respuesta, no creo que empezara diciendo “Hija, la pregunta es pertinente”. (Su hija, por cierto, hizo una pregunta clara, directa e inteligente, sin prejuicios.)

Tanto Laura Morillo como María José Escalona, citadas en el artículo, empiezan sus respuestas con (y luego repiten alguna otra vez) “creo que” o “no creo que”. Lo cual es legítimo, pero no deberíamos olvidarlo: es lo que creen. Sin más. María José Escalona (que no sé qué aspecto tiene) dice, como algo relevante: “A mí me han llegado a decir: ‘Vaya, no pareces informática'”.

¡Fíjate lo que le han llegado a decir! El caso es… que a mí también me han dicho eso más de una vez. ¿Qué conclusión podemos sacar? (Yo, personalmente, ninguna).

Morillo dice: “He estado mirando un poco su documento [el de Damore] y no presenta realmente cuáles son las fuentes donde, dice él, se demuestran esos factores”. Ciertamente, será así. ¿Dónde están las fuentes que apoyan sus propias afirmaciones, las de Morillo o Escalona? Tampoco las hay: “creen que”. Como Damore, al parecer.

Escalona cita The Big Bang Theory y el estereotipo según el cual la chica más mona [sic] es justo la que no viene del campo de la ciencia. ¿En serio vamos a citar una serie paródica que se basa salvajemente en los estereotipos? ¿En serio el estereotipo más llamativo es el de Penny? ¿Acaso no se hace sangre constantemente con Howard Wolowitz por ser ingeniero, frente a los físicos teóricos? ¿Se le ha ocurrido a Escalona que quizás The Big Bang Theory quite a los hombres las ganas de estudiar ingeniería? ¿O de estudiar ciencia en general, porque los superiores son gente como… Sheldon Cooper?

Escalona cita también un estereotipo de Los Simpson, donde Homer se hace informático para ponerse gordo. ¿Hay en ese estereotipo algo relacionado específicamente con las mujeres? ¿Hay algo en el estereotipo geek, o friki, que vaya dirigido específicamente a las mujeres?

En fin, que tenemos otro artículo cargado de opiniones, sin fundamento alguno y sin nada que aportar. Nada que explique lo que está pasando ni cómo solucionarlo.

Feminismo del chapucero. No es lo que necesitamos.

 

 

Anuncios

Reducir tamaño de vídeo con ffmpeg

3 03UTC marzo 03UTC 2017

Este artículo es una chuleta. No te va a apasionar su lectura. Pero como hay mil opciones para hacer las cosas, cuando encuentro una que me vale y no quiero volver a probar, la apunto aquí.

Mi cámara, un poco vieja, graba vídeos .MOV. Ocupan mucho.

Para reducirlos, me ha dado por hacer esto:

 ffmpeg -i video.mov -strict -2 -acodec aac -vcodec libx264 video.mp4

Y ya está.

 

Aclarar un vídeo con ffmpeg

3 03UTC febrero 03UTC 2017

Otra chuleta de algo que debería ser trivial pero cuando te pones tienes que andar buscando.

Vídeo grabado en la oscuridad. ¿Cómo lo aclaro?

Pues lo más directo y lo más pedestre es una corrección gamma, que con ffmpeg se podría hacer así:

ffmpeg -i entrada.mp4 -vf mp=eq2=1.5:1:0:1:1:1:1:1 salida.mp4

El parámetro de la corrección gamma es el 1.5 (subir de 1 aclara, bajar de 1 oscurece). Los demás son valores por defecto.

No sería raro que de una versión a otra de ffmpeg esa línea de órdenes no funcionara, porque cada poco cambian parámetros y filtros. Pero bueno, aquí y ahora me ha funcionado.

 

Adaptar tamaño de un iFrame a la página contenida

29 29UTC diciembre 29UTC 2016

Cuando uno incluye una página web dentro de otra con un marco de tipo IFrame, se suele encontrar el problema de que tiene que ponerle un tamaño al IFrame sin saber cuál tendrá realmente la página de dentro (que de hecho puede variar). Y entonces aparecen unas bonitas barras de desplazamiento para hacer scroll dentro del IFrame. Esas odiosas barras dentro de una página que de por sí ya tenía barras.

Si uno lo intenta arreglar con JavaScript, y la página contenida no viene exactamente del mismo host que la contenedora, aparecen cuestiones de seguridad: los navegadores no permiten a la página contenida (que es la que conoce su propio tamaño) actuar sobre la contenedora. Lo que se llama Cross-Origin Resource Sharing, o CORS. Así que no puede ir alegremente desde la contenida a modificar el IFrame para que tenga el tamaño adecuado.

Internet está lleno de explicaciones sobre cómo solventar esto. A pesar de ello, no todos están explicados con claridad, y me hicieron falta unas cuantas pruebas para hacerlo funcionar. (Por cierto, no deja de ser una chapuza, y los propios IFrames no me gustan nada; como decía Bartleby, “preferiría no hacerlo”, pero en fin).

Total, que aquí está mi resumen.

La página contenida tiene que avisar a su contenedor para decirle su propio tamaño. Así que en la página contenida se podría incluir un código como este:

function notificarAlturaAlContenedor() {
 window.top.postMessage(document.body.offsetHeight + 50, "*");
}

if (document.addEventListener) {
 document.addEventListener("DOMContentLoaded", notificarAlturaAlContenedor, false);
 window.addEventListener("load", notificarAlturaPadre, false);
} else {
 document.attachEvent("onreadystatechange", notificarAlturaAlContenedor);
 window.attachEvent("onload", notificarAlturaAlContenedor);
}

La función notificarAlturaAlContenedor es la que importa, y envía un mensaje a la ventana contenedora. Este envío de mensajes parece ser el único mecanismo que se admite para CORS.

Debajo hay código que se ejecuta para asignar dicha función a los eventos que indican cuándo se ha cargado la página. Es decir, hacen que cuando se ha cargado la página (la contenida) se invoque a notificarAlturaAlContenedor() (si no… no la llamaría nadie). No he estudiado a fondo este código, y no sé si es realmente imprescindible todo él; sospecho que utiliza diversas opciones para asegurarse de que funciona en diversos navegadores.

Por supuesto, si la página contenida cambia dinámicamente de tamaño por medio de su propio JavaScript o lo que sea, en ese momento puede invocar explícitamente a notificarAlturaAlContenedor() para actualizar su tamaño.

Ya tenemos una página que “avisa” a su contenedor, enviándole un mensaje con su tamaño (ese “50” es arbitrario, es un margen adicional para asegurarse de que las barras de scroll no aparezcan). Falta que el contenedor, es decir, la página principal que tiene su IFrame, reciba este aviso y actúe en consecuencia, haciendo el IFrame más grande (o más pequeño).

Y para eso se puede poner esto en la página contenedora:

window.addEventListener('message', function(event) {
   document.getElementById("idDelIFrame").height=event.data;
 }, false);

Ese código añade una función que “escucha” los mensajes que le llegan. Dicha función es una función anónima, con el código escrito ahí mismo; y lo que hace la función es buscar el IFrame contenedor (que en este ejemplo se supone que tendrá id=”idDelIFrame”) y fijarle la nueva altura, que no es más que el contenido del mensaje (data).

Esto me ha funcionado. A partir de ahí, se puede estudiar con más calma qué es todo eso que sale ahí, pero creo que la base de lo que se está haciendo queda mínimamente comprensible. Como digo, hay mil ejemplos por ahí, seguramente mejores; pero al haber mil… yo al menos no los he entendido todos. Así que me lo apunto.

Android

22 22UTC julio 22UTC 2016

Pues ya he hecho mi primera aplicación en Android.

Y mi impresión final es:

¿OTRA VEZ?

¿OTRA VEZ?

A pesar del tiempo que lleva Android por aquí, no había programado nada por varias razones. Una de ellas, que era insufrible intentar ejecutar ese entorno de desarrollo. Mi ordenador era demasiado viejo. Y ahora que lo he renovado, me decidí a practicar un poco. Nada del otro mundo; una libreta de contactos corporativa. Una aplicación muy sencilla, que llama a un servicio web que le devuelve los contactos. La aplicación los presenta y permite buscar o llamar. Supongo que hay miles. Una sola pantalla, y además cedí a presentar la información componiendo HTML, que suele ser lo que me resulta más fácil. Además, esto ya lleva unos años por aquí, ya ha avanzado mucho, así que las herramientas tienen que ser ya muy utilizables, me dije.

Y viví el día de la marmota.

Primero: cuando vas a instalar Eclipse, resulta que ya no mola, que ya no le dan soporte y tiene que ser el Android Studio. No es que esté mal, pero está basado en IntelliJ y es un poco diferente y hay que adaptarse. Bueno, no pasa nada.

Hay que instalarse 1 GB de herramientas para empezar… y de ahí ir subiendo. No hablamos de modelado 3D; creo que nunca he usado una herramienta de desarrollo que ocupase tanto para un chisme tan pequeño y que hace tan pocas cosas. Pero bueno, no pasa nada.

La documentación es bastante mejorable. Tienes que andar adivinando. No hay hojas de ruta decentes para iniciarse, no hay una explicación de conceptos que te permita, a partir de ahí, orientarte. Te vas encontrando las cosas una por una, deslavazadas y sin previo aviso. Bueno, no pasa nada.

Quien desarrolló este sistema de programación decidió reinventar todas las ruedas posibles. Ya no son pantallas, ni diálogos; ahora son actividades. Por alguna razón, toda la historia del desarrollo de interfaces de usuario ya no vale, aunque esto no deje de ser un ordenador con una pantalla (pequeña) y un sistema operativo mucho más sencillo que los de escritorio. Además, hay un batiburrillo, un caos, sorprendente. Una appbar no es lo mismo que una toolbar, y una de las dos está obsoleta, o quizás no. Todo así. Pero bueno, no pasa nada.

Cuando empecé a programar aplicaciones nativas en Windows, vi que era extremadamente complejo, pero se entendía por qué; aquello eran palabras mayores. Ventanas, multitarea, asincronía. Cualquiera que, viniendo de la programación clásica en Pascal o C o COBOL o BASIC, leyera el Programming Windows, de Charles Petzold, que era la biblia del asunto (prácticamente la única fuente; recordemos, Internet no estaba en las casas ni en las empresas), se encontraba con bucles de mensajes (¿qué coño era aquello?), mensajes entre ventanas, hilos (sin tener realmente hilos), montones de tipos de datos, miles de constantes, prefijos para poder aclararse con los nombres de las variables… El Hola, mundo de Windows requería un montón de estudio y mucho código. Pero era comprensible; eras un pionero desarrollando algo como no se había visto antes.

De aquello han pasado casi treinta años (¡en informática!) Hace muchísimo que llegaron los objetos, lenguajes de programación nuevos, editores sensibles a la sintaxis (sí, amigos; no siempre han estado ahí), herramientas increíbles. Estamos en otro siglo, y eso en informática es mucho decir.

Sin embargo, una mierda de aplicación en Android vuelve a requerir el despliegue de una fontanería impresionante. Tienes que enlazar unos identificadores con otros, editar aquí y allá, crear una clase y otra y otra. Vuelves a emplear tu mente, tu tiempo y tu esfuerzo en aprender montones de cosas inútiles, no en desarrollar tu puta aplicación. En lo que se refiere a desarrollo, estamos como en los ochenta; tienes que volver a empezar, como si trabajaras en ensamblador. U enorme porcentaje de tiempo dedicado a cosas totalmente irrelevantes e improductivas.

Y no me lo podía creer. ¿Otra vez? ¿OTRA VEZ? ¿¡OTRA VEZ!?

Una aplicación en Android es… una aplicación de ventanas, con una sola ventana en pantalla, y en vez de en un ordenador estás en un teléfono, que es un ordenador con ciertos periféricos. Todo eso está inventado hace décadas. Hay una enorme experiencia acumulada. ¿Por qué se empieza desde cero otra vez?

Pero eso no es todo.

En Windows, Microsoft hacía verdaderos encajes de bolillos para manejar la compatibilidad entre versiones, y con hardware terriblemente variable. Aun así, todos vivimos el infierno de las DLL. Por suerte, se sacaron enseñanzas de aquello, y hoy en día ya apenas ocurre.

Entonces llega Android, y… es un absoluto desastre. Las aplicaciones funcionan, como funcionan, cuando funcionan (la mía, una sola ventana -perdón, activity– cutre, casca cuando pones el teléfono horizontal), pero reza si cambias de versión de Android. A cada nueva versión, toman decisiones drásticas, que no sé por qué no se plantearon en un principio, y tu aplicación deja de funcionar. En mi caso, la aplicación, además de poder llamar, identifica las llamadas (con un enfoque muy poco intrusivo) y también permite saber de quién es el teléfono que tienes entre manos (para autentificarlo contra tu servidor sin tener que pedirle nombre de usuario, por ejemplo).

Bueno, pues en Android 6 ya no funciona ninguna de las dos cosas. En Android 4, al instalar la aplicación decides darle permisos o no, y ya está. En Android 6 cambian algo tan fundamental como eso; ahora, al parecer, hay que dar permisos a la aplicación en tiempo de ejecución. ¿De verdad que algo tan fundamental como el esquema de permisos se está improvisando de esta manera? Hablamos de la versión 4.4.4, no de la 1.0. Por cierto, todas las aplicaciones release de Android tienen que ir firmadas. ¿No pueden establecer un sistema de confianza para los certificados, y que si el usuario sabe quién eres y se fía de ti, el sistema operativo te deje trabajar en paz? ¿De verdad que no pudieron pensar todo esto el primer día?

Pero bueno, no pasa nada. Si la rueda la reinventa Google, está todo bien aunque sea una chapuza miserable.

La solución para las ingenieras

2 02UTC julio 02UTC 2016

Hay pocas estudiantes de ingeniería. De ingeniería informática en particular.

Es un tema que me interesa desde hace mucho. En un JENUI hubo una ponencia hablando de esto… y la ponente era alemana. Es decir, que no se podía culpar al atrasado país ibérico ni al cerril macho patrio; en la avanzada, europea, moderna y civilizada Alemania las cifras eran iguales, si no peores.

No solo eso; pasa lo mismo en todo el mundo. Hay pocos fenómenos que resulten tan coherentes, repetidos en países distintos, culturas relativamente diferentes, de uno y otro lado del charco. Las feministas dirán inmediatamente que no; que todas las culturas donde hay estudios de ingeniería son un régimen patriarcal, y por tanto no es extraño que ocurra lo mismo en todas ellas. Pero el caso es que en este asunto no he encontrado más que suposiciones e hipótesis. Ni un razonamiento sólido. Cuando alguien llegaba con un estudio que supuestamente arrojaba luz sobre el problema (y algunos recibieron atención de la prensa) yo lo leía y me decepcionaba absolutamente. Bueno, esto daría para un artículo largo. De hecho, con un compañero acabamos escribiéndolo y presentándolo a un congreso.

El caso es que leo un par de artículos en El Mundo. Por supuesto, no se acuerda de las ingenieras en informática; es probable que la autora ni siquiera supiera que la informática es una ingeniería. Pero eso son los prejuicios de ella, no los míos.

Uno es un artículo… de YoDona, y se titula Así son las ingenieras españolas. El artículo menciona las típicas historias sobre malentendidos o casos concretos de machismo, pero por supuesto no arroja ninguna luz sobre por qué las mujeres no se matriculan hoy en día (es más; en el caso de informática la tasa de matriculación no ha ido aumentando, sino disminuyendo).

El otro, y también de YoDona, es aún más… interesante. Se titula ¿Operación biquini? No, operación neurona para las niñas. Si te preguntas a qué viene ese título, no eres el único; y si encuentras la respuesta, no dejes de decírmelo. ¿Neurona para las niñas? ¿Biquini? Alucino.

En este artículo sí se aborda el asunto de las campañas para favorecer la matriculación de mujeres en ingeniería. Y unos presuntos expertos de una empresa llamada Smartick dan unas pautas. Brillantes. Cosas como estas que cito (literalmente):

  • Que en los estudios se demuestre la aplicación práctica para su vida diaria.
  • Que entiendan que ser bueno en matemáticas te abrirá puertas en el futuro.
  • Complementar la enseñanza de las mates con juegos.
  • Enseñar que las ‘mates’ molan a todos porque ayudan a entender mejor el mundo.
  • Sin matemáticas no se tiene capacidad crítica sobre noticias o informaciones.
  • Actitud positiva hacia las matemáticas, que mejora con la tecnología.
  • No hablar mal de las matemáticas, no fomentar patrones de conducta.
  • Buscar la aplicación práctica de los números, por ejemplo, en las recetas de cocina.
  • Motivar a las niñas para que no se priven de oportunidades futuras.
  • Para evitar estereotipos negativos de su capacidad intelectual, como “las niñas son de letras, se les dan mal las matemáticas”.
  • Queremos que haya mujeres en los puestos de dirección y política, para lo que necesitan dominar las matemáticas.
  • Intentar estimular a las niñas a que realicen actividades de construcción, robótica…

Por una parte, cosas como “motivar a las niñas para que no se priven de oportunidades futuras” es tan útil como “motivar a los conductores para que no beban antes de conducir”. Ya, tú. Si hasta ahí llegamos todos. De esos puntos ¿cuántos son medidas concretas que se puedan llevar a cabo?

Por otra parte… desafío al lector a que en cada uno de esos puntos evalúe si tiene algo que ver con las niñas, o los niños con pene no necesitan que se les demuestre la aplicación práctica de las matémáticas, o complementar las mates con juegos, o que no se hable mal de las mates… Vamos, por qué eso va a ayudar a que las niñas se acerquen a la ingeniería. O por qué si se hace no va a conseguir que se acerquen más niñas pero también más niños varones, con lo que el efecto neto será nulo.

Y finalmente… me ha encantado en particular el ejemplo incluido en el punto 8. La aplicación práctica de los números… por ejemplo, en las recetas de cocina. Me pregunto por qué citan ese ejemplo en concreto hablando de niñas. Viva la eliminación de estereotipos.

Lo dicho: si alguna vez lees algo coherente, no obvio o no basado en suposiciones gratuitas, no dejes de decírmelo. Todavía no he encontrado nada.

 

Using filters with LDAP authentication for Meeting Room Booking System

24 24UTC septiembre 24UTC 2015

Maybe you think you need a system for managing meeting room reservations. If that’s the case, chances are you’ve considered MRBS (Meeting Room Booking System). Probably not a bad idea: it’s free and not difficult to install and run (I’m using MRBS 1.4.11, PHP 5.1.4, MySQL 5.0.22… and off you go). Plus, it’s localized.

In addition, maybe you’ve got an LDAP server and you want that one to manage authentication. That’s not difficult, and the docs explain how to do it.

If you don’t want every LDAP user to be able to create and delete reservations, one of the available mechanisms is to use a filter. There is a configuration variable, $ldap_filter, that allows you to specify the users that the system will find and hence authenticate. The problem is: initially, it will probably not work.

In my case, the LDAP server is Microsoft Active Directory. The user name can be found in a field named sAMAccountName. If you try to do something like this in your config.inc.php file:

$ldap_filter = "(|(sAMAccountName=alloweduser1)(sAMAccountName=alloweduser2))";

it will not authenticate anybody, even if that search filter is perfectly valid.

Well, the trick is: MRBS puts parentheses around your $ldap_filter expression. So you must write your $ldap_filter without them. In the previous example, this will work:

$ldap_filter = "|(sAMAccountName=alloweduser1)(sAMAccountName=alloweduser2)";

Of course, there are lots of reasons an LDAP can fail (usually because you write some incorrect value in the configuration) but, in my case, the reason was this one.

Testing SMTP and IMAP with GreenMail

14 14UTC agosto 14UTC 2015

If you want to write some SMTP, POP3 or IMAP client code, maybe you’ll consider using GreenMail. This is a Java library that implements a mail server, and you can easily use it for testing purposes. You include it in your project, and in your tests, you can just start the server, send fake messages to it, or fetch them. You can connect to it and directly test IMAP, POP3, SMTP and their secure versions.

You can do something like this:

// ALL means you start all the protocols / servers 
// (SMTP, IMAP...) but you can choose only
// some of them.

GreenMail server = new GreenMail(ServerSetup.ALL);
server.start();

/* Do your stuff */

server.stop();

“Your stuff” can be sending mail to your local host, and then checking. You can create a user before sending him an email:

// Creating the user
server.setUser("testuser@localhost.com", 
	"testuser",
	"testpassword");
// Sending him an email
GreenMailUtil.sendTextEmailTest(
	"testuser@localhost.com",
	"sender@localhost.com", 
    	"First message subject",
	"This is the first body");

but if you don’t, a mailbox is automatically created when an email is received. Cool.

There is one annoying problem. In theory, according to documentation, GreenMail listens to port 3025 for SMTP. But when you try the above code, you find that mail sending is not working, and you get a connection refused exception.

Then you add a rule to your firewall to make sure port 3025 is allowed, to no avail.

And finally, in my case, a look at netstat or tcpview or whatever shows that GreenMail SMTP is listening to port 25, just as usual in any other SMTP server, in spite of what the documentation says. GreenMailUtil.sendTextEmailTest(), on the other hand, seems to be trying to connect to 3025, so it doesn’t match.

I’m not sure why this is happening. But my solution was to explicitly create my SMTP server at port 3025. Instead of using the predefined ServerSetup.ALL or other constants, you can be more explicit and create an array of ServerSetup objects, specifying port, address and protocol. So I changed the above code and created my servers like this:

ServerSetup[] ss = {
    	new ServerSetup(
		3025, 
		"127.0.0.1", 
		"smtp"),
    	ServerSetup.IMAP
};

server = new GreenMail(ss);

Notice that the string for the protocol “smtp” MUST be lowercase. In this case I use IMAP as well because I wanted to test IMAP, but it’s up to you which serversetups you include in that list. The IMAP predefined one worked well for me, so I didn’t explicitly create a new object for that one.

I’m not sure whether all of this is in the documentation, which is far from perfect. I had to find it myself just by trying and debugging.

Of course, that “3025” is here to make it clearly visible in the example; in your production code, you should use some constant that you can easily change just in case future versions of GreenMail switch to a different port 🙂 The same considerations apply to other constants in the code, which you should, as usual, subject to your coding expertise. Just in case.

Hitting a URL from Java

11 11UTC agosto 11UTC 2015

The simplest (and quickest) form I’ve found so far to hit a URL from Java code (or, for that matter, to invoke a REST web service, which is more or less the same) is:

	public static String hitUrl(String urlString) throws Exception {
		URL url = new URL(urlString);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestProperty("Accept", "text/html");

		if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
			throw new RuntimeException("Failed : HTTP error code : "
					+ conn.getResponseCode());
		}

		BufferedReader br = new BufferedReader(new InputStreamReader(
			(conn.getInputStream())));

		String buff;
		String res = "";
		while ((buff = br.readLine()) != null) {
			res = res + buff + "\r\n";
		}

		conn.disconnect();
		return res;
	}
	

Setting up Selenium

10 10UTC agosto 10UTC 2015

I’ve just started to have a look at Selenium to automatically test web sites from Java code (and hopefully do other things). This is just a note on how to install Selenium in a few words. It’s quite easy once you’ve figured out what is relevant or not.

  • Selenium is a set of Java libraries that allow you to manage a browser from your code. (They rely on an additional native .EXE file as well; more on this later).
  • There are several things: Selenium RC, Selenium WebDriver, Selenium Server. Forget about everything except WebDriver. RC is an older version (Selenium 1.0), and you will use the server only if you do some special things. Initially, you need Selenium WebDriver (which is equivalent to say “Selenium 2.0”) and that’s it.
  • You have to download Selenium itself. It’s a .zip file (some 20 MB) with a lot of .jar files inside. Take those .jar files (all of them; there are two at the root and a bunch of them inside a directory), copy them wherever you like, and add all of them to your project build path in Eclipse (with “Add external .JARs”).
  • There is an additional thing you will need. When you try to use some “browser”, there is an external (plaftorm-native) executable that handles that browser. And you’ll have to download that executable separately, copy it to some directory of yours, and refer to it from your code. This “driver” is sometimes called “server”, because of how Selenium libraries communicate with it, but it has nothing to do with “Selenium server” as mentioned above (an unfortunate and confusing double use of the word “server”).

So, in my case, I had to do something like this:

  1. Download Selenium itself from here: http://docs.seleniumhq.org/download/. In my case, I downloaded the Java version. But you can use other languages.
  2. Unpack, get the .jar and add them to the build path of muy project (add external jars).
  3. Download the Internet Explorer executable (from here: http://selenium-release.storage.googleapis.com/index.html; don’t get confused if they call it “IEDriverServer” when “server” should be reserved for other uses in this context, but this is the file you need). Or maybe the Chrome executable from here: http://chromedriver.storage.googleapis.com/index.html?path=2.16/ Or the Firefox, or whatever; it’s up to you which browser you want to automate.
  4. Put the executable wherever you want. And then add this line to your code:
    System.setProperty(“webdriver.chrome.driver”, “exe/ChromeDriver/chromedriver.exe”);
    or this one:
    System.setProperty(“webdriver.ie.driver”, “myexefolder/IEDriver/IEDriverServer.exe”);
    or whatever, stating the relative or absolute path where your exe file is. This line must be executed before you call the constructor for the driver: WebDriver driver = new InternetExplorerDriver(); or whatever.
  5. [UPDATE] There is a “generic” browser, which comes from the HtmlUnit framework. This is a Java implementation of a non-GUI browser; it works as a browser, and emulates JavaScript as well. If you use this one, you don’t need external executables, since it’s included in the Selenium libraries, and in addition it’s cross-platform. In that case, remember that HtmlUnitDriver has JavaScript disabled by default, and you have to explicitly enable it; have a look at https://code.google.com/p/selenium/wiki/HtmlUnitDriver.

That’s it. From there, you’ll be able to do things like driver.get(someUrl); and so on.