30 marzo 2010

Leer entrada estándar (STDIN) en Java

Por motivos académicos, tengo que aprender a programar en Java; así que, tras haber aprendido C/C++ y al ser Java un lenguaje mucho más orientado a objetos que C++, quería practicar un poquito haciendo la traducción de algunos programas que he escrito en C++ a Java. Para ello necesito leer datos de la entrada estándar; pero tras buscar referencias, tanto en la documentación de Java como en diferentes blogs y paginas, no he conseguido encontrar una manera más o menos sencilla de hacerlo.

De todas maneras, tras leer un poco más a fondo algunas referencias y la documentación, he conseguido hacerlo de una manera algo más sencilla, imitando el comportamiento del while(cin >> var) de C++:

C++ Java
#include <iostream>
using namespace std;

int main(int argc, char **argv) {
  int n;
  while (cin >> n) {
    /* Código */
  }
}
import java.util.Scanner;

class main {
  static public void main(String[] args) {

    Scanner scanf = new Scanner(System.in);

    while (scanf.hasNextInt()) {
      int n = scanf.nextInt();
      /* Código */
    }
  }
}

Aquí tenéis la documentación del elemento Scanner.

Espero que este post os haya servido de ayuda.

Actualización 31/03/2010: Por desgracia, la solución supuestamente sencilla no sirve para leer char; para ello tenéis que hacer esto:

try { char c = (char) System.in.read(); }
catch (Exception e) {}

Si alguien conoce otra manera más sencilla y menos chapucera que lo que he escrito en este post, que lo comente.

Actualización 2: Si los char van a estar separados por espacios o saltos de línea, puedes hacer una de estas dos:

// scanf.next() devuelve un String
char c = scanf.next().charAt(0);
char c = scanf.next().toCharArray()[0]; // Ambas son equivalentes

Un saludo,
Morpheus

HP PSC 2175 en Windows desde GNU/Linux

Desde hace aproximadamente un año llevo utilizando mi impresora conectada en GNU/Linux desde Windows, y creo que es algo que algunos aún querrán conseguir. Así pues, he escrito este tutorial para mostrar la chapuza que he hecho para conseguirlo.

Esto sólo lo he probado en WinXP, pero supongo que es probable que también sirva en WinVista o Win7; ha sido probado desde Debian Squeeze y Ubuntu Jaunty. La impresora en cuestión es una HP PSC 2175 all-in-one.

Una vez dados los datos, vamos allá:

Lo primero que tienes que hacer es asegurarte de que tienes la siguiente configuración en tu archivo /etc/samba/smb.conf:

[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
browseable = yes
read only = yes
guest ok = no

Recuerda que tu equipo tiene que estar en el mismo grupo de trabajo que los ordenadores con los que quieres compartir tu impresora (por defecto Workgroup). Si no es así, puedes cambiar la red con la aplicación shares-admin (esta aplicación no se suele encontrar en los menús de Gnome, tendrás que ejecutar el comando desde una consola) o bien editando en el mismo smb.conf:

# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = GrupoDeTrabajo

Ahora tienes que compartir la impresora conectada a tu Lignux. Para ello, utiliza la aplicación system-config-printer, que podéis encontrar en Sistema->Administración->Impresoras:

Configuración de la impresora como compartida
Selecciona la Impresora y edítala, dejándola como compartida

Configuración del servidor para publicar Impresoras compartidas
Configura el servidor para que publique las impresoras compartidas en la red (Archivo->Opciones del Servidor)

Una vez hecho esto, le toca el turno a Windows.

Si todo está bien, deberíamos ver nuestro equipo de trabajo en Windows, y este debería contener la impresora como recurso compartido (además de los que tuvieras previamente):

Vista de recursos compartidos del equipo en la red local de Windows

Clicamos dos veces sobre la impresora a la que queremos conectarnos (en mi caso Impresora) y nos dará dos mensajes de alerta; el último nos informará de que no se encuentran los controladores instalados, y nos ofrecerá buscarlos en su lista; aceptamos, llegando al siguiente menú:

Menú de selección de controladores

Como podéis ver, nuestra impresora no se encuentra en esa lista por mucho que hayamos instalado los drivers, así que intentamos encontrar una impresora lo más parecido a la nuestra, en mi caso HP PSC, aunque esto no es algo relevante porque más adelante redefiniremos los controladores.

Una vez instalada, necesitaremos los controladores que vamos a utilizar para conectarnos a la impresora de Lignux. Para ello necesitaremos el programa PDF Creator, que podéis descargar de la página pdfforge.org. Lo descargáis e instaláis. Este programa nos instalará una impresora PDF con un nombre por defecto de "PDF Creator", que además de ser muy útil para previsualizar los documentos antes de imprimirlos y juntar archivos pdf, nos servirá como controlador para nuestra impresora.

Ahora vamos a "Impresoras y faxes" y seleccionamos la impresora que hemos agregado:

Impresoras y Faxes, del Panel de Control de Windows

Nos aparecerá la ventana de gestión de impresión. Abrimos el menú de Propiedades, en Impresora->Propiedades, y en la pestaña "Opciones Avanzadas" seleccionamos como controlador PDF Creator:

Propiedades de Impresora, opciones avanzadas

Le damos a aceptar y listo.

Tras esto, la impresora debería imprimir correctamente cualquier archivo; así lo hace en mi caso.

Espero que este tutorial os haya servido de ayuda, o bien que os sirva de base para encontrar la solución.

Un saludo,
Morpheus

07 marzo 2010

La Lista de Sinde: entrega el 9 de marzo

Hoy recibido un correo de LaListaDeSinde informándome de que el próximo martes 9 de marzo procederán a entregar la lista (que cuenta con más de 1000 páginas) ante el Ministerio de Industria a las 11 de la mañana (en el correo pone a las 12); tras ello, leerán el siguiente comunicado:

Hoy hemos venido a esta instución a pedir el mismo trato y atención que pocas semanas atrás le dieron a unos de los lobbies mas conocidos que la industria multinacional del entretenimiento ha creado en este país: "La coalición de creadores" (de la que recibieron una lista) representa unos intereses que presionan al legislador para proteger el beneficio económico de unos accionistas; las personas, asociaciones y profesionales que nos autoinculpamos con esta lista queremos también que acepten nuestra lista y la tengan en cuenta, por que nos sentimos responsables de proteger como parte de la sociedad civil varios derechos que vemos en juego, y no sólo estamos hablando de la libertad de expresión.

Compartir es bueno, más que bueno, necesario. Una humanidad que no comparte es una humanidad que camina hacia la oscuridad y hacia el pasado, la historia nos demuestra que cuanto más ha cooperado y compartido más ha avanzado. El corazón de la red es la réplica de la información, es la copia de "ceros y unos", de millones de palabras, de imágenes, de conocimiento; el político que no comprenda esto falta a su deber de tener conocimiento sobre lo que trata, y generalmente desacierta y se pone en evidencia, pero el precio lo pagamos entre todos y todas.

No tiene sentido, es del pasado y es absolutamente inviable. ¿Cuanta gente especialista tendrá que repetirselo?. Ustedes hacen caso a los científicos cuando sus investigaciones tienden a un fin lucrativo, pero no cuando estos les hablan de la neutralidad en la red... Tim Berners Lee y miles de especialistas se lo han dicho claro: NO SE DEBE Y NO SE PUEDE controlar ni censurar la red. No se debe porque significa no haberse sabido adaptar e intentar frenar a quienes les han superado, lastrando el avance social y económico. No se puede porque la red ha sido diseñada tal como es precisamente para garantizar que sea incensurable, cada vez más millones de personas con ordenadores desobedencen cada día los intentos de censura y represión, y no paran de crecer. Compartir es algo imparable, la sociedad planetaria ya ha ganado, es imposible remar contra ese océano, mejor fluir bién.

Las hackers crearán los medios y aplicaciones que hagan falta para que podamos seguir intercambiando cultura y conocimiento. No es una opción gastar millones de Euros en sistemas destinados (por suerte) al fracaso garantizado de antemano, dejen de tirar nuestro dinero y comprendan la situación. Por cada sistema que inventen saldrán centenares de herramientas alternativas seguras que garanticen nuevamente la movilidad de información y comunicaciones por todo el planeta, cientos de miles de personas trabajan para que eso no cambie por gobiernos que se vendan a los intereses de ACTA y empresas, y estamos ganando, pero nos criminalizan a millones de personas, ¿donde está el avance con esta ley?.

Estas leyes son chapuzas que no van a frenar ni mucho menos el derecho de copia privada, dedican su tiempo contra algo que no pueden parar, y ustedes ya lo saben; aún así no les importa, por el camino, cerrar webs que se autoinculpen de esta lista como las de asociaciones vecinales, secciones sindicales, comunidades de vecinos, organizaciones de derechos civiles, partidos políticos, asociaciones culturales, profesores universitarios, artistas, etc... Estas entidades, personas y asociaciones se ven en el triste deber de arriesgar su seguridad jurídica y económica para proteger un bién mayor: "Se tiene la responsabilidad moral de desobedecer normas injustas" Martin Luther King.

¿Porqué hablan de piratería y mienten cuando lo que quieren es censurar La Red y eliminar la Libertad de Expresión?, refuerzan su falacia relacionando la piratería con el derecho a copia privada, manipulan las palabras y difunden confusión, mezclan piratería con la Ley de Economía Sostenible donde realmente en su Disposición Final 1 están preparando un sistema censor para proteger unos intereses disparatados que año tras año tienen más beneficios aunque pierdan sus posiciones de monopolio. Se gastan cientos de millones de Euros promocionando caminos destinados al fracaso técnico y económico para una industria que se niega a innovar y adaptarse, se están gastando un dinero para nada. No somos piratas, somos ciudadanos y ciudadanas que, sinceramente, no hacemos mal a nadie, al contrario, trabajamos y vivimos en la red, queremos que sea la herramienta que ya es, recortar su libertad no es una opción. Nosotras no asaltamos barcos en alta mar ni secuestramos aviones en el espacio aéreo internacional, sólo compartimos cultura porque la cultura se defiende compartiéndola.

Habrá que estar atento a la repercusión que le dan los medios.

Un saludo,
Morpheus