Una pregunta: ¿dispone Java del mecanisme OO de herencia múltiple?
En general diríamos que no, pero la respuesta sería más bien que parcialmente. Y esa parcialidad está a punto de incrementarse.
Podemos decir que hay tres tipos de herencia múltiple: de tipo, de comportamiento y de estado.
La herencia múltiple de tipo está muy relacionada con el polimorfismo ya que define que podemos heredar tipos (en algunos contextos también llamados contratos) desde varias fuentes. Efectivamente Java lo permite mediante la implementación en una clase de múltiples interfaces. Así que este tipo de herencia múltiple siempre ha existido en Java.
La herencia múltiple de comportamiento es la que combina métodos de diferentes fuentes. La próxima versión Java 8 incorpora, como parte del proyecto Lambda, los métodos por defecto. Esto permite añadir métodos a un interface pero incluyendo código por defecto que se utilizaría si la clase que implementa el interface no define el método. Muy parecido a la herencia convencional que ya tenía Java. La diferencia está en el siguiente punto.
La herencia múltiple de estado es la que combina también la definición del estado de la clase, los atributos. Java no incorpora (ni hay planes de momento) de añadir esta funcionalidad como sí tienen otros lenguajes OO como Eiffel o C++.
Sargue's blog
Java, Linux, HPC, hardware, software libre o lo que se me ocurra.
19/01/13
03/01/13
Cutremótica o domótica low-cost (II)
Como me ha recordado un lector tenía pendiente escribir una continuación al artículo donde expuse la problemática que tenía con la calefacción en casa y como lo solucioné con un poco de tecnología (no mucha tampoco).
Ya lo expliqué básicamente en su momento así que veamos detalles. Empecemos por una foto del invento. No pensé en hacer una foto durante el montaje así que esto se ve ya montado, os lo tendréis que imaginar. No es dificil, es una pequeña caja de plástico con un cable USB y otro que lleva la señal al relé.
El relé utilizado es un KMTronic activable por USB.
Al conectarlo a un Linux se detecta como un puerto serie USB y aparece como un dispositivo ttyUSB. En mi caso sólo tengo ese así que siempre será el primero (ttyUSB0).
Finalmente una pequeña aplicación Java interactua con el puerto. El código interesante de la misma es el que activa y desactiva el relé.
El único inconveniente que he encontrado es que a veces el puerto serie USB se ha vuelto "loco" y se ha desconfigurado. No me queda clara la razón, porque no es simplemente por un reinicio. Lo malo en ese caso es que al ser el relé con comunicación unidireccional no se puede saber si está o no activo.
Ya lo expliqué básicamente en su momento así que veamos detalles. Empecemos por una foto del invento. No pensé en hacer una foto durante el montaje así que esto se ve ya montado, os lo tendréis que imaginar. No es dificil, es una pequeña caja de plástico con un cable USB y otro que lleva la señal al relé.
Al conectarlo a un Linux se detecta como un puerto serie USB y aparece como un dispositivo ttyUSB. En mi caso sólo tengo ese así que siempre será el primero (ttyUSB0).
Finalmente una pequeña aplicación Java interactua con el puerto. El código interesante de la misma es el que activa y desactiva el relé.
package net.sargue.domotica.io;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* KMTronic
* http://www.sigma-shop.com/product/67/usb-relay-controller-one-channel-pcb.html
*
* 8 Data, 1 Stop, No Parity, Baud rate : 9600
* OFF command: FF 01 00 (HEX) or 255 1 0 (DEC)
* ON command: FF 01 01 (HEX) or 255 1 1 (DEC)
*
* Ojo que el puerto serie que se crea en el linux (/dev/ttyUSB0) va asociado a una velocidad, y si no es 9600 no funcionará.
* Se puede ajustar con stty -F /dev/ttyUSB0 9600
*/
public class ReleCalefaccion {
private final Logger log = LoggerFactory.getLogger(ReleCalefaccion.class);
private boolean activo;
public ReleCalefaccion() {
desactivar();
}
public synchronized void activar() {
FileOutputStream fos = null;
try {
log.debug("Fixant la velocidad correcta del port serie USB.");
Runtime.getRuntime().exec("/bin/stty -F /dev/ttyUSB0 9600");
Thread.sleep(3000);
log.debug("Activant relé.");
fos = new FileOutputStream("/dev/ttyUSB0");
fos.write(255);
fos.write(1);
fos.write(1);
log.debug("Relé activat.");
activo = true;
} catch (FileNotFoundException e) {
log.error("No trobo el port USB del relay.", e);
} catch (IOException e) {
log.error("Error d'E/S escribint al port USB del relay.", e);
} catch (InterruptedException e) {
log.error("Aquí no es pot dormir?", e);
} finally {
if (fos != null) try {
fos.close();
} catch (IOException e) {
log.error("Error tancant el port USB del relay.", e);
}
}
}
public synchronized void desactivar() {
FileOutputStream fos = null;
try {
log.debug("Fixant la velocidad correcta del port serie USB.");
Runtime.getRuntime().exec("/bin/stty -F /dev/ttyUSB0 9600");
Thread.sleep(3000);
log.debug("Desactivant relé.");
fos = new FileOutputStream("/dev/ttyUSB0");
fos.write(255);
fos.write(1);
fos.write(0);
log.debug("Relé desactivat.");
activo = false;
} catch (FileNotFoundException e) {
log.error("No trobo el port USB del relay.", e);
} catch (IOException e) {
log.error("Error d'E/S escribint al port USB del relay.", e);
} catch (InterruptedException e) {
log.error("Aquí no es pot dormir?", e);
} finally {
if (fos != null) try {
fos.close();
} catch (IOException e) {
log.error("Error tancant el port USB del relay.", e);
}
}
}
public String getEstadoHTML() {
return "" + (activo ? "ON" : "Auto") + "";
}
private String getCssEstado() {
return activo ? "estado-on" : "estado-off";
}
public boolean isActivo() {
return activo;
}
}
El único inconveniente que he encontrado es que a veces el puerto serie USB se ha vuelto "loco" y se ha desconfigurado. No me queda clara la razón, porque no es simplemente por un reinicio. Lo malo en ese caso es que al ser el relé con comunicación unidireccional no se puede saber si está o no activo.
18/12/12
Consumo eléctrico de un servidor o PC
Conozco bastante gente que tiene un ordenador encendido permanentemente. Tanto algún PC a nivel particular como pequeñas empresas que tienen uno o más servidores. Quiero pensar que en estos casos se tiene cierta idea y se ha hecho una elección buscando un consumo eléctrico cuanto menos contenido. Pero, ¿hasta que punto?
No voy a entrar en consumos eléctricos de servidores, NAS u otros componentes. He tenido la idea para este post al ver un anuncio de OVH con unos nuevos servidores de muy bajo coste.
Tomemos el servidor más económico, el mKS 2G. Su coste mensual, con impuestos, es de 12,09 €. Anualmente el desembolso final es de 145,08 €. Por otro lado tomemos las tarifas eléctricas domésticas (monofásicas por debajo de 10 kW, las de casa y la pequeña empresa). Existen dos tarifas, con discriminación horaria y sin ella. Comento según los últimos precios de la T.U.R. cuando escribo este post publicados en el BOE. En ambos casos hay que añadir a los precios publicados el impuesto sobre la electricidad y el IVA.
No voy a entrar en consumos eléctricos de servidores, NAS u otros componentes. He tenido la idea para este post al ver un anuncio de OVH con unos nuevos servidores de muy bajo coste.
Tomemos el servidor más económico, el mKS 2G. Su coste mensual, con impuestos, es de 12,09 €. Anualmente el desembolso final es de 145,08 €. Por otro lado tomemos las tarifas eléctricas domésticas (monofásicas por debajo de 10 kW, las de casa y la pequeña empresa). Existen dos tarifas, con discriminación horaria y sin ella. Comento según los últimos precios de la T.U.R. cuando escribo este post publicados en el BOE. En ambos casos hay que añadir a los precios publicados el impuesto sobre la electricidad y el IVA.
Sin discriminación horaria
El coste de energía en este caso es único a 0,145578 € / kWh. Con impuestos el precio final es de 0,185155363 € / kWh. En este caso los 145,08 € anuales dan para mantener un consumo 24/7 de unos 89 W.
Con discriminación horaria
El coste de energía se divide en dos tramos, una tarifa más económica (0,05907 € / kWh) durante 14 horas y las 10 restantes con una tarifa un poco mayor (0,178438 € / kWh). Añadiendo impuestos y haciendo el cálculo por día nos arroja un resultado de 3,321293797 € / kW·día. La tarifa con discriminación horaria beneficia a los consumos efectuados en los momentos más económicos lo suficiente para que salga también considerablemente mejor con un consumo constante durante todo el día. Los cálculos nos dicen que con los 145,08 € anuales de alquiler del servidor nos daría para mantener un consumo constante de unos 120 W.
Conclusión
El objetivo de este post no era ni analizar el consumo de los equipos informáticos ni publicitar un servicio. Tan sólo quería hacer reflexionar sobre las diferentes escalas de coste y como muchas veces descartamos alternativas sin realmente analizarlas. Estoy convencido que mucha gente que deja el PC siempre conectado no se ha planteado jamás contratar un servidor dedicado aunque en bastantes casos el coste sería menor o como mínimo parecido.
09/12/12
Utilizando pageant (certificados SSH para putty) en cygwin
Desde equipos Windows utilizo Putty como terminal SSH con resultados muy satisfactorios. Al trabajar con numerosos servidores se impone el uso de la autentificación mediante certificados, más cómodo y seguro que trabajar con contraseñas. En ese caso la herramienta pageant de Putty nos permite precargar el certificado en nuestra sesión de Windows para no haber de escribir la contraseña con cada nueva sesión de terminal.
También desde Windows utilizo Cygwin para aprovechar herramientas que conozco y me son muy útiles en entornos Linux. Una de ellas es git, que pese a estar también en versión Windows me funciona mejor bajo el entorno Cygwin. El inconveniente bajo cygwin es que git utiliza la versión ssh del propio Cygwin y este no reconoce las claves precargadas de pageant, sino sólo las de su propio agente ssh-agent.
Quería evitar utilizar otro certificado para el ssh de cygwin y por fortuna no soy el único ya que he encontrado un desarrollador que ha creado ssh-pageant que hace precisamente de puente entre pageant y el ssh de Cygwin. Funciona perfectamente, tan sólo hay que seguir el fichero de instrucciones.
Referencias:
También desde Windows utilizo Cygwin para aprovechar herramientas que conozco y me son muy útiles en entornos Linux. Una de ellas es git, que pese a estar también en versión Windows me funciona mejor bajo el entorno Cygwin. El inconveniente bajo cygwin es que git utiliza la versión ssh del propio Cygwin y este no reconoce las claves precargadas de pageant, sino sólo las de su propio agente ssh-agent.
Quería evitar utilizar otro certificado para el ssh de cygwin y por fortuna no soy el único ya que he encontrado un desarrollador que ha creado ssh-pageant que hace precisamente de puente entre pageant y el ssh de Cygwin. Funciona perfectamente, tan sólo hay que seguir el fichero de instrucciones.
Referencias:
26/11/12
Eliminar espacio en blanco redundante con JSP 2.1
Aquellos que trabajéis con JSP habréis visto que el código generado HTML suele contener bastantes lineas en blanco fruto de directivas y etiquetas que no generan HTML pero mantienen como mínimo un salto de línea (o incluso espacio en blanco). No sólo es molesto para visualizar el código fuente sino que ocupa ancho de banda innecesario.
Desde JSP 2.1 tenemos la opción de activar un mecanismo para eliminar automáticamente este espacio en blanco de más. Podemos incluso configurarlo para todos los JSP de manera sencilla añadiendo este fragmento en el web.xml:
Recientemente estoy actualizando algunas aplicaciones antiguas para aprovechar algunas características de Servlet 3.0 y JSP 2.2 con la idea de publicar Base, el seedwork de desarrollo web que he ido desarrollando con los años.
Desde JSP 2.1 tenemos la opción de activar un mecanismo para eliminar automáticamente este espacio en blanco de más. Podemos incluso configurarlo para todos los JSP de manera sencilla añadiendo este fragmento en el web.xml:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
</jsp-property-group>
</jsp-config>
Recientemente estoy actualizando algunas aplicaciones antiguas para aprovechar algunas características de Servlet 3.0 y JSP 2.2 con la idea de publicar Base, el seedwork de desarrollo web que he ido desarrollando con los años.
Suscribirse a:
Entradas (Atom)
