jueves, 13 de diciembre de 2007

La imperiosa necesidad de la confidencialidad

Hace varias semanas atrás terminé de leer el libro "Criptonomicón", de Stephenson. Uno de los grandes temas abordados en él fue sin duda el de la confidencialidad. La necesidad que tienen no sólo los individuos sino también las organizaciones de mantener en secreto su información crucial es lo que ha permitido la evolución de los criptosistemas y otros mecanismos que garanticen -si es que puede existir alguna garantía- que esa información no será conocida por ningún otro que no sea aquél a quien va dirigida.

Sin embargo el derecho a la confidencialidad se ha encontrado en controversia al ser confrontado con la obligación de los gobiernos de garantizar la seguridad. Mucho se ha dicho acerca de las diferentes maneras que tienen los gobiernos de conocer y controlar el flujo de la información. Por ejemplo, pocos han oído acerca de Carnivore*, la herramienta de software usada hasta hace algunos años por el FBI de los Estados Unidos para analizar (con la orden judicial correspondiente) el tráfico de correo electrónico que pasa por un proveedor de servicios de Internet (ISP) y que permite leer los encabezados de los mensajes de correo electrónico en busca de indicios de alguna conspiración o hecho ilegal (cuando digo "hasta hace algunos años" no quiero decir que ya no lo hace, sino que ha optado por otras alternativas de software que logran el mismo fin). Por otra parte, también muy pocos han escuchado acerca de las posibilidades de codificación de mensajes usando, por ejemplo, PGP (Pretty Good Privacy, Privacidad Bastante Buena), que es un programa utilizado para autentificar (estar seguros de que una persona que envía un mensaje es realmente quien dice ser) y, especialmente, dar privacidad por medio de la criptografía ("esconder" un mensaje para que, en caso de ser interceptado o leído por un tercero, no pueda ser entendido) no sólo en transmisiones en vivo (como lo haría un protocolo como SSL, por ejemplo) sino aún en datos almacenados en algún medio. Sin duda, un juego de gato y ratón en el que prevalece el más astuto o, en ocasiones, el más persistente.

La pregunta es, ¿hasta dónde es importante la confidencialidad? Por supuesto que a ninguno le agrada la idea de que alguien más conozca la información que uno considera privada. ¿Cuántos casos no sabemos de gente que ha leído el correo electrónico de otra persona sin su consentimiento, o ha averiguado cuánto dinero gana consiguiendo acceso a algún reporte de estado de cuenta bancario del afectado? Los gobiernos de algunos países consienten la idea de intervenir en las conversaciones (telefónicas o de correo electrónico, por ejemplo) con la justificante de prevenir algún delito. La respuesta, por supuesto, no es trivial. Sin embargo, es innegable el hecho de que todos tenemos derecho a conservar en secreto aquello que consideramos que no deba ser conocido por los demás pues nos haría vulnerables, a menos que ese secreto ponga en riesgo la vida o la integridad de los demás, en cuyo caso deberíamos ser capaces de descifrar dichos mensajes a tiempo y tomar acciones en consecuencia.

La frontera entre ocultar y conocer es muy sutil, y la legislación muy pobre, pero en mi humilde opinión (IMHO) todo este asunto de conocer o no conocer la información ajena, o de ocultar o no nuestra información se debe resumir en una palabra: respeto.

:wq!

* El enlace original a Carnivore ya no existe en el sitio del FBI, por eso incluí la referencia de archive.org, donde es posible encontrar versiones antiguas de páginas web.

jueves, 22 de noviembre de 2007

¡Felices 100000 años!

Pues llegó el día.

Hoy es mi cumpleaños número 100000 en binario (oigan, en hexadecimal es mucho más atractivo: 0x20). Generalmente no soy muy dado a considerar mi cumpleaños como una fecha muy importante (aunque definitivamente lo es), pero en esta ocasión y por tratarse de un número significativo, estoy haciendo una excepción (¿o debo decir "lanzando una excepción"?, throw new java.lang.Exception();... no, porque una excepción es una condición inesperada en un programa, y en mi caso este cumpleaños sí lo estaba esperando).

Y no es sólo porque 32 sea la cantidad de bits que forman una dirección IPv4, o porque 32 es el código ASCII del carácter espacio, o el tamaño que generalmente reservan en memoria las variables de tipo entero en un programa, o la quinta potencia de dos (2^5), o el punto de congelación del agua (en grados Fahrenheit) al nivel del mar, o porque 32 son las piezas que hay al iniciar un juego de ajedrez, o mejor aún, porque en matemáticas el 32 es el noveno número feliz o el tercer número de Leyland... no, no sólo es por eso, también es porque he dado 32 vueltas alrededor del sol.

Realmente no tengo un comentario tan profundo el día de hoy, sólo quería compartir con ustedes este momento; disculpen tanta simpleza, pero no todos los días se cumplen 100000 años. ;-)

:wq!

viernes, 12 de octubre de 2007

define:googlear

Es increíble como pasa el tiempo. Aún recuerdo cuando era "más joven" y asistía regularmente a las bibliotecas. Cuando era niño me gustaba pasar a la biblioteca cuando salía de la escuela, aunque llegara tarde a la casa. La gente que me conoce sabe que me gusta mucho leer, y leo prácticamente cualquier cosa, siempre y cuando valga la pena. Mi gusto por la lectura es algo así como una necesidad primaria para mi espíritu curioso, y vaya que si algo me disgusta es no saber algo o quedarme con la duda.

Pero muchas cosas han cambiado. Con la entrada de Internet a nuestras vidas, cada vez menos gente acude a las bibliotecas, especialmente desde que se inventaron los motores de búsqueda de WWW (hay otros tipos de buscadores, como Gopher, Archie o Veronica, pero sin duda los más conocidos son los de WWW).

Les puedo asegurar que en la actualidad la gran mayoría de la gente que frecuenta Internet depende de algún buscador. Tengo una hermana que se sorprende de cómo encuentro tan rápido prácticamente cualquier cosa en Internet (esta va para ti, Juli). En particular, yo utilizo Google (por cierto, dicen que es uno de los mejores lugares para trabajar, y no lo dudo), y en esta ocasión quiero compartirles algunos trucos o hacks de Google para que sus búsquedas en WWW sean más provechosas. Por cierto, ¿alguien llegó aquí por una búsqueda en Google? Sería interesante saberlo.

Lo más sencillo de esto es la clásica búsqueda que todo mundo hace, por ejemplo, buscar la palabra Knaverit (que es el seudónimo que uso, por si no lo han notado) encontrará algunas de mis entradas en mis blogs, o la palabra héroes nos traerá, sin duda, enlaces a sitios dedicados a la ya popular serie de televisión (que, por cierto, es de mis favoritas). ¿Pero qué tal si lo que estás buscando algo sobre los héroes en la historia y no quieres ver las páginas de la serie? Bastaría con usar héroes -serie para que, gracias al signo "menos" (-) se excluyan las páginas que contengan la palabra "serie". Claro que es mucho más fácil especificar a qué héroes estás buscando, como héroes grecia o héroes desconocidos, pero ¿y si lo que quieres es realmente comprar el DVD, pero que cueste entre $45 y $50 dólares? (porque con eso de que algunos dicen que si no es caro, no vale la pena) pues muy fácil: usa DVD héroes $45..$50 (los ".." indican un rango de valores), o haz la prueba con algún precio más barato, qué tal entre 10 y 20 dólares... por ahí hubiéramos comenzado, ¿no?.

Para aquellos que desean refinar sus métodos de búsqueda un poco más, les tengo otras sugerencias: ¿necesitas saber qué es un "encabezado"? Puedes usar define:encabezado, y te mostrará las páginas que definen esa palabra; o define:buscador para saber que un buscador es un sitio Web que te ayuda a encontrar otros sitios (o define:googlear, para saber qué quise decir con el título de esta entrada). Por cierto, ¿y si lo que quiero es buscar algo en un solo sitio? (es decir, limitar la búsqueda) Ya ven que a veces esto de buscar se vuelve una tarea titánica, pero es muy fácil con la etiqueta site:, por ejemplo: redes site:romeosanchez-0xCAFE.blogspot.com te mostrará lo que he escrito sobre redes en este weblog, o criptonomicon site:www.gandhi.com.mx te llevará a las opciones de compra del libro que recomendé hace poco, en una conocida librería de México, o incluso algo como blog site:www.eluniversal.com.mx te mostraría las noticias de un periódico referentes al tema "blog", o cualquier otro que se te ocurra.

Muy poca gente sabe que en Google se pueden hacer cosas como las que voy a contar a continuación; por ejemplo, que se puede usar como una calculadora: así, una expresión como 12 * 22 o 15% of 67 pondría el resultado de esa operación aritmética; o si alguien tiene la duda de qué valor en decimal es mi famoso 0xCAFE hexadecimal, puede buscar 0xCAFE to decimal y verá el resultado. Incluso pueden convertir entre unidades, como 100 USD in pesos. Todo eso es chido.

Hay muchos ejemplos más, pero para no cansarlos me limitaré a unos pocos, por ejemplo: related:www.hispasec.com mostraría sitios relacionados con seguridad, o related:www.google.com daría la lista de otros buscadores relacionados (en el sentido funcional) con Google.

Ya por último, debo recordarles que algo como ~poesia buscaría sitios no sólo con la palabra poesía, sino también con sus sinónimos (por ejemplo, literatura), o "Romeo y Julieta" (así, entre comillas) haría una búsqueda exacta del contenido entre comillas, pero... esperen.... esta última búsqueda trae resultados que no me interesan, así que la refinaré un poco: "Romeo y Julieta" -cigars ; sí, así es mucho mejor, porque yo no fumo :-D. También una búsqueda de tipo el * camino (con un asterisco, *) me encontraría sitios con contenidos como el mismo camino, el único camino, el buen camino, el largo camino, etc., porque el asterisco (*) representa cualquier cantidad de palabras, en este caso, entre la preposición "el" y el sustantivo "camino". En fin, es cuestión de experimentar. Se queda de tarea.

Así que ya lo saben. No es ningún secreto. Los motores de búsqueda en Internet son una herramienta indispensable en la actualidad, pero no hay que creerse todo lo que está en Internet, pues no todo es cierto. Pienso que ningún buscador reemplaza la escencia de la consulta bibliográfica y el olor a hojas de libro, pero sí hace mucho más fácil el suplir una necesidad básica del hombre: salir de la duda.

:wq!

miércoles, 10 de octubre de 2007

Entre Objetos, Java, C# y... ¿Sinclair BASIC?

Hace algunos días fui requerido para ir a dar un seminario acerca de cómo desarrollar aplicaciones para Windows en .NET, usando C#. No había tenido oportunidad de usar VisualStudio 2005, pues el último que había usado era el 2003, y me llevé la grata sorpresa de que tiene algunas ventajas con respecto a la versión anterior (ya sé, ya está la nueva versión 2008 en Beta, pero no la he visto, lo siento). Me dediqué unos días a revisar la versión 2005 y debo decir que sí me quedé con buena impresión del IDE.

Durante la presentación les expliqué a los asistentes, a través de una demostración, la manera de desarrollar rápidamente una aplicación sencilla con acceso a datos, con muy poco código qué programar. Es increíble cómo muchas de las cosas que anteriormente nos llevaba horas desarrollar, ahora con las herramientas adecuadas se pueden hacer en cuestión de minutos (ya lo dije anteriormente cuando hablé acerca de NetBeans 5.5). Claro está que nada reemplaza la satisfacción de hacer un programa "desde cero", pero hay proyectos en los que el tiempo apremia (pensándolo bien, en todos los proyectos el tiempo apremia). Todos los asistentes (al menos la mayoría, creo yo) quedaron asombrados de la facilidad de uso del IDE y de cómo en pocos minutos ya teníamos la aplicación terminada (me extendí un poco porque, como ustedes imaginarán, me gusta hablar demasiado).

Días después me llamaron para que diera una clase sobre Programación Orientada a Objetos (OOP) para un grupo de estudiantes de un curso de Java. En la lección expliqué acerca de la relevancia de los lenguajes orientados a objetos (como Java, C++ y C#) y cómo es que el paradigma de orientación a objetos nos ayuda a escribir código mucho más legible, reutilizable y relativamente rápido. Hice un recuento breve acerca de la evolución de los paradigmas de programación y cómo en la actualidad los sistemas emplean el máximo poder de cómputo para lograr cosas cada vez más poderosas. Todos se mostraron interesados, en particular porque algunos nunca habían escuchado (o entendido) acerca de términos como encapsulamiento, herencia y polimorfismo. Fue una mañana muy interesante.

En ambas charlas concluimos lo siguiente: los sistemas actuales cada vez demandan desarrollos de software más robustos en el menor tiempo posible. Tanto Sun Microsystems como Microsoft Microsoft están dando batalla para lograr que los desarrolladores tengan cada vez mejores herramientas que les permitan tener más tiempo libre ;-) (¿por qué no tenía algo así antes?). Lo importante ahora es no depender tanto del uso de las herramientas, y seguir cultivando las mejores prácticas de programación, que corren el riesgo de ser olvidadas por quienes abusan del uso de IDEs o de ser completamente ignoradas o desconocidas.

Creo que independientemente de las tecnologías que pueda llegar a conocer, en el fondo siempre seré un desarrollador de software. Me gusta programar y creo que no lo hago tan mal ;-). Habrá que ver qué es lo que sigue para las siguientes generaciones de herramientas de desarrollo de software.

Como punto final, en la clase de OOP uno de los alumnos confesó haber comenzado a programar con una Timex Sinclair 1000, igual que con la que comencé a programar (esto es demasiado curioso, puesto que no mucha gente que yo conozca usó ese modelo en particular). Es que haciendo un poco más de memoria (cosa difícil para mi), realmente antes de GWBASIC usé el Sinclair BASIC. Para los que estén un poco interesados en la "prehistoria" y quieran saber qué usaba (yo) para programar hace 20 años, en este enlace encontrarán un emulador de Timex Sinclair 1000 hecho en Java.

:wq!

lunes, 24 de septiembre de 2007

Criptoanálisis de sobremesa

Esta tarde me ocurrió algo extraño durante mi tiempo de comida. Últimamente he estado leyendo el libro de Neal Stephenson, "Criptonomicón" (en español se publicó en tres tomos, y estoy por terminar el tercero). Debido a que no dispongo por lo general de mucho tiempo libre, aprovecho mi tiempo de comida para leer un poco (después de comer, por supuesto). Como decía, hoy estaba en un conocido restaurante de hamburguesas y me puse a leer mi libro, justamente en la parte cuando Lawrence Waterhouse estaba rompiendo un código nipón con ayuda del computador que él había inventado, cuando una persona que estaba sentada como a cuatro mesas de mi (perdón, no es que esté inventando una nueva unidad de medida, quise decir a algo así como a 10 metros) me gritó desde su lugar (gritó, porque a esa distancia no podía haberle escuchado de otra manera) y me dijo: "¡oye, te felicito!, ¡ya casi no hay gente que traiga consigo libros y los lea!"; a lo que yo respondí (también gritando): "¡gracias!, ¡siempre procuro hacerlo!". Imagino que en este momento alguien podría estar diciendo que qué tiene que ver este comentario con el weblog. Lo que sucede es que esta persona me preguntó que qué leía. Yo sólo le mostré la portada del libro y dijo: "ah, es sobre criptografía, de los rompedores de código de la Segunda Guerra Mundial". Me sorprendió justamente que una persona x (en el sentido algebraico de identidad desconocida, no peyorativo) conozca sobre el contenido de ese libro, particularmente porque su lectura no es algo tan trivial, pues Stephenson asume cierto conocimiento sobre el tema, aunque en el desarrollo de la historia se ocupa de aclarar muchos puntos e incluso en algunas partes dedica varios párrafos a explicar con detalle algún tema matemático, físico o de cualquier otra índole que requiera una explicación por parte de él (eso es lo que creo que piensa, porque en ocasiones me parece que entra demasiado en ciertos detalles). Volviendo al punto, esta persona y yo "conversamos", él desde su mesa y yo desde la mía, por espacio de unos 5 minutos, acerca de cómo la tecnología que nosotros vemos en la actualidad, en realidad hace tiempo que se ha comenzado a usar (antes de que se "abra al público"). Hablamos de la Guerra Fría, de la Segunda Guerra Mundial, un poco de Internet y hasta de los avances en materia de genética. En fin, una charla interesante y poco ortodoxa, que lamentablemente tuve que interrumpir pues debía volver (yo) a la oficina.

Soy un aficionado al criptoanálisis (y digo aficionado, porque no me dedico a ello de manera profesional, aunque mi trabajo pudiera llegar a requerirlo). En general soy lector asiduo de todo lo que tenga que ver con seguridad de cómputo, cualquiera que sea su faceta: desde el desarrollo de software hasta transmisiones seguras de datos, y no es paranoia. Estoy convencido que la seguridad es lo que regirá el futuro de todo lo que hagamos con los sistemas de cómputo (en realidad no hay que esperar mucho, ya hay bastantes cosas qué ver).

Si les gusta todo el asunto del criptoanálisis, la historia, no tienen problema en leer un libro de 1,500 páginas y tienen un amplio criterio (yo sé por qué se los digo, no se vayan a escandalizar por cierto contenido del libro), les recomiendo leer el "Criptonomicón". Hay muy buenas reseñas acerca del libro, así que no pienso hacer el ridículo dando la mía, tan sólo sepan que estoy enfrascado en su lectura y que espero terminar de leerlo pronto.
Hoy coloqué mi separador en la página donde me quedé, cerré mi libro, me levanté de la mesa, me despedí de mi interlocutor desconocido (x), y me fui pensando en que las cosas que en otro tiempo fueron un misterio, están cada vez más al alcance de las manos de cualquier persona que tenga el valor y el tiempo suficiente para explotarlas.
:wq!

lunes, 4 de junio de 2007

La seguridad en tiempos de Internet

El sábado pasado ofrecí una plática en una Universidad acerca de algunos temas relacionados con la seguridad en Internet. Debo decir que, para satisfacción mía, fue un grupo muy participativo y bastante interesado en los temas tratados. Me llamó mucho la atención una pregunta que alguien me hizo durante la exposición (voy a parafrasearla): "¿quiénes son los responsables de educar a los usuarios de Internet acerca de los temas de seguridad?". La realidad es que en gran parte la responsabilidad es de quienes están involucrados directamente con la información. El problema es que muchas veces, si no es que siempre, damos por hecho que los demás saben exactamente lo que se tiene qué hacer y lo que no; y en temas que se han vuelto tan cotidianos, como es el caso de Internet, esto no es la excepción. La inquietud que revela esta pregunta es muy interesante, pero al mismo tiempo preocupante: no hay mucha divulgación acerca de cómo estar protegidos en Internet, y los peligros aumentan cada vez más.

Pero también la responsabilidad es de quienes tienen conocimiento del tema. Es una cuestión de responsabilidad social. Por ejemplo, si yo sé que alguien está en algún riesgo de cualquier tipo (no necesariamente informático), mi deber es advertirle. En resumen, si alguien sabe acerca de cómo tomar medidas de seguridad al estar en Internet, debería compartirlo con los demás.

Para la plática del sábado preparé una presentación con algunos consejos de seguridad personal que debemos tomar en cuenta cuando se navega o trabaja en Internet. Me pareció que la plática del sábado resultó muy productiva, tanto que decidí comentarlo aquí. Me gustaría compartir algunos puntos sobresalientes de la charla:
  1. Es importante conocer las amenazas a las que estamos expuestos cuando realizamos actividades en Internet.
  2. Tomar acciones preventivas para protegernos de ataques tales como robo de información, suplantación de identidad y manipulación de datos. Para esto, conocer acerca de cómo prevenir el spam, el phishing, virus, worms y spyware, entre otros ataques.
  3. Ser precavido, incluso desconfiado, cuando se trata de proporcionar información personal a través de Internet.
  4. Si es posible, comparta los consejos de seguridad con más gente que lo necesite. Mientras mejor informados estemos, seremos menos vulnerables.
  5. Cuidar a los niños y enseñarles cómo usar de manera segura las herramientas que Internet ofrece.

Si gusta puede bajar la presentación sobre Seguridad en Internet. No hay problema si alguien quiere compartirla; es más, ojalá puedan compartirla para que otras personas tomen nota de los consejos. La verdad es que no es lo mismo leer la presentación que escuchar la exposición y ver las demostraciones en vivo, pero de cualquier forma espero que sea de utilidad la información que contiene.

Espero que estos consejos sean útiles y que hagamos que nuestras experiencias en Internet sean mucho más provechosas. Obviamente no se trata de volvernos paranoicos, pero en la medida en que protejamos la privacidad de nuestra información, viviremos más tranquilos.

Ah, una cosa más: me gustaría leer aquí sus comentarios, especialmente si asistió a la plática del sábado. Por favor, hágame saber su opinión.

:wq!

jueves, 24 de mayo de 2007

Sun Tech Days 2007 y NetBeans

La semana pasada (del 16 al 18 de mayo) estuve en la Ciudad de México en los "Sun Tech Days 2006-2007 - A World Wide Developer Conference", que es el ciclo de conferencias que organiza Sun Microsystems durante el año en todo el mundo para dar a conocer las últimas novedades y evangelizar a todos aquellos que no han tenido la oportunidad de experimentar la tecnología de Sun, y que en México es la quinta vez que se realiza (sólo me he perdido dos). Debo admitir que me hubiera gustado más haber estado en el JavaOne 2007 en San Francisco, CA, pero no se pudo. Aún no pierdo la esperanza, tal vez el 2008 se pueda (cualquier patrocinador es bienvenido).

Seguramente algunos de ustedes saben que soy un fiel seguidor y promotor de la tecnologías de Sun Microsystems, sin embargo quiero ser lo más objetivo posible en esta narración. Todas las conferencias en general cumplieron mis expectativas, aunque obviamente hay cosas que pueden mejorar en la organización. No quiero extenderme mucho, así que sólo hablaré de un tema en particular: el nuevo NetBeans 5.5.

Como ya habrán leído anteriormente en mi entrada "¿IDE o no IDE?", en mi experiencia profesional casi no he utilizado herramientas para desarrollo de aplicaciones y prácticamente todo el tiempo programo tecleando todas las líneas, sin ayuda de cosas como el autocompletar o las sugerencias de código. Sin embargo, después de atender a las demostraciones del nuevo NetBeans 5.5 he cambiado mi opinión respecto al uso de los IDEs. Me impresionó la facilidad y rapidez con la que las aplicaciones Java para web y para dispositivos móviles se pueden desarrollar usando NetBeans. Mi sugerencia sigue siendo la misma: usa algún IDE con el que te sientas bien, pero definitivamente después de todo lo que vi de NetBeans me he decidido a instalarlo (ya lo hice) y a usarlo regularmente. Tengo especial interés en retomar el desarrollo de aplicaciones para móviles, que dejé hace ya algún tiempo, justo después de haber obtenido la certificación como SCMAD (Sun Certified MAD... :D, o sea Sun Certified Mobile Application Developer). También el desarrollo de Web Services y aplicaciones usando Java Server Faces (JSF) y AJAX es extremadamente fácil con NetBeans, se los recomiendo.

Otra de las características que se agradecen del nuevo NetBeans son los Add-ons (Mobility Pack y Visual Web Pack son sólo unos ejemplos). Hay uno en particular que consideron muy útil: el Profiler, que se puede usar para monitorear en tiempo real el uso de memoria de una aplicación, los objetos que crea, el tiempo que permanecen en memoria, etc. Sin duda algo muy útil para gente interesada en mejorar el desempeño de sus aplicaciones (como yo). En este particular, hubo una sesión muy padre referente a desempeño, dada por Jorge Vargas que me pareció bastante interesante, especialmente porque los chavos que lo dieron son mexicanos y sin duda conocen muy bien de lo que están hablando. Las conferencias que no podía perderme eran las de Sang Shin acerca de Web Services (que tiene una serie de cursos en linea sobre Java EE y ¡gratis!, en su sitio javapassion) y las de Carol McDonald sobre Java EE. Este año faltó Ángela Caicedo, pero Fabiola Gallegos (de Sun, Czech Republic) hizo una excelente demostración en vivo de Java ME y a todos nos apantalló (incluyéndome, ¿cómo ven?).

Por lo demás todo transcurrió muy bien, salvo los linuxeros que nunca faltan y que casi siempre van a este tipo de eventos a cuestionar los términos de licenciamiento y otras cosas por el estilo. También sufrí mucho (y no fui el único) cuando le tocó hablar al chino... en definitiva el inglés y el chino no combinan. Me llamó la atención que una gran mayoría de los asistentes eran muchachos universitarios, y eso es buena señal, pues las universidades ahora están tomando más en serio el papel de involucrar a los estudiantes con el mundo real, y este tipo de eventos en realidad son invaluables desde el punto de vista académico. Por cierto, si alguien requiere alguna conferencia sobre Java en su Universidad o en algún otro lugar, pueden ponerse en contacto conmigo.

Hay mucho qué contar, pero por lo pronto lo dejaré hasta aquí. Si pueden bajen el NetBeans y comprueben lo que les he dicho. Posiblemente en alguna entrada futura agregue algún tutorial o aplicación demo, para quienes estén interesados en desarrollar aplicaciones Java, e incluso tal vez inicie un blog sólo para eso... no sé, luego les aviso.

:wq!

jueves, 22 de febrero de 2007

Conjugando el inexistente verbo "subnetear"

[Actualización, 12 de febrero de 2008: He publicado un ejemplo del procedimiento mostrado a continuación, ligeramente más detallado, pero para una red Clase B en esta entrada. Espero que sea de utilidad.]

Debido a numerosas preguntas que he recibido acerca de cómo dividir una red TCP/IP en sub-redes (¿tan mal maestro soy?), he decidido poner un ejemplo paso a paso para hacerlo con una red de clase C. Les advierto que lo que van a leer a continuación (si es que deciden continuar leyendo) requiere un conocimiento previo de conceptos como red, máscara de sub-red, dirección IP, VLSM y CIDR, etc. y no es apto para cardíacos... :-D

Supongamos que tenemos la red 192.16.3.0/24. El /24 es notación CIDR y representa a una máscara de 24 bits ( 255.255.255.0 ). En esta red nos quedan 8 bits en la parte de hosts, así que tenemos (28)-2 posibles combinaciones, es decir, 256-2 = 254 hosts. Esto puede ser un gran desperdicio de direcciones, por esta razón se nos pide dividirla.

La máscara /24 en binario, es tan fácil como 24 bits "1" consecutivos, y el resto "0"s:

255.255.255.0
11111111.11111111.11111111.00000000
<--------------------- red*host--->

Supongamos que, para no desperdiciar la red, nos piden obtener sub-redes con capacidad para 50 hosts cada una. Para dividir la red, necesitamos pedir "prestados" (aunque en realidad son "regalados", porque nunca los devolvemos ;)) los bits necesarios para obtener las sub-redes que tengan capacidad para los 50 hosts que necesitamos por cada sub-red. Así tenemos:

El número de hosts por sub-red debe ser mayor o igual que 50:
2n-2 >= 50
Al buscar 'n', "sabemos" que (26)-2=64-2=62, por lo tanto 6 bits de hosts nos cubren muy bien los 50 que necesitamos. Si n fuera 5, 25=32, y 32 no nos alcanzan para los 50. ¿de acuerdo? (Hay un procedimiento para obtener 'n' usando logaritmos, pero como son ingenieros sé que ya se lo saben, así que ya no lo pongo).

Bueno, como ahora sabemos que necesitamos 6 bits de hosts para cubrir los 50 y en la máscara original (/24) nos sobraban 8 bits, eso quiere decir que para las nuevas sub-redes tendremos sólo 2 bits, de esta manera:

255.255.255.192
11111111.11111111.11111111.11000000
<------------------------red*host->

(la máscara es ahora de 26 bits, o sea, /26 en CIDR, porque a los 24 originales le sumamos los 2 que nos regalaron).

(el número binario 11000000 es el 192 decimal).
¿Notas que al principio del último octeto puse los 2 bits "1" que dijimos?

Hasta este punto hemos determinado la cantidad de bits que vamos a usar para crear nuevas sub-redes con hasta 62 hosts cada una (recuerda que nos pidieron 50).

Ahora viene lo bueno: necesitamos saber las direcciones de red de las nuevas sub-redes. Para esto voy a concentrarme únicamente en los 2 bits que me regalaron del último octeto, para sacar las posibles combinaciones:

.00000000 (este es el 0 decimal)
.01000000 (este es el 64 decimal)
.10000000 (este es el 128 decimal)
.11000000 (este es el 192 decimal)
^^

Por lo tanto, las nuevas direcciones de red serán:

192.16.3.0/26
192.16.3.64/26
192.16.3.128/26
192.16.3.192/26

Fácil, ¿no? Ahora sólo nos resta conocer, para cada nueva sub-red, las direcciones de hosts válidas.

Ahora prepárense para la siguiente definición: La primera dirección obtenida de una sub-red es la propia dirección de la sub-red (ya sé, se oyó muy cantinflesco, pero así es), y son justamente las que acabamos de obtener. Ahora bien, la última dirección de una sub-red es la dirección de broadcast, y corresponde a poner todos los bits de host en "1":

.00111111 (este es el 63 decimal)
.01111111 (este es el 127 decimal)
.10111111 (este es el 191 decimal)
.11111111 (este es el 255 decimal)
^^


Aquí hay que ser muy observadores: fíjate que los primeros 2 bits están exactamente igual que en las combinaciones que usamos para sacar las direcciones de red. Lo único que cambié fueron los últimos 6 bits "0" por "1", y ya tenemos las direcciones de broadcast para cada sub-red.

Por lo tanto, lo que necesitamos ahora es obtener las direcciones que nos quedan para hosts en cada una de las sub-redes obtenidas:

sub-red 1
192.16.3.0/26 (dirección de red)
192.16.3.63/26 (dirección de broadcast)
192.16.3.1/26 hasta 192.16.3.62/26 (rango de direcciones para host: son 62)

sub-red 2
192.16.3.64/26
192.16.3.127/26 (dirección de broadcast)
192.16.3.65/26 hasta 192.16.3.126/26 (rango de direcciones para host: son 62)

sub-red 3
192.16.3.128/26
192.16.3.191/26 (dirección de broadcast)
192.16.3.129/26 hasta 192.16.3.190/26 (rango de direcciones para host: son 62)

sub-red 4
192.16.3.192/26
192.16.3.255/26 (dirección de broadcast)
192.16.3.193/26 hasta 192.16.3.254/26 (rango de direcciones para host: son 62)

Y eso es todo. Hay que poner mucha atención en las máscaras usadas para no confundirse y recuerden: el verbo "subnetear" no existe. ;-)

:wq!

Actualización, 12 de febrero de 2008: He publicado un ejemplo del procedimiento ligeramente más detallado, pero para una red Clase B en esta entrada. Espero que sea de utilidad.

jueves, 1 de febrero de 2007

¿IDE o no IDE?

En el más reciente curso de Java que tuve el privilegio de impartir (en serio, no es broma) y que concluye precisamente este próximo sábado 3 de enero, me preguntaron: "¿tú qué IDE usas regularmente?". Posiblemente decepcioné a más de dos cuando respondí: "no uso ninguno en particular... uso EditPlus".

Llámenme anticuado si quieren, pero en cuestiones de programación tengo unos gustos poco comunes. En primer lugar por lo regular no uso IDEs. Para ponerlos un poco en contexto, un IDE (Integrated Development Environment) es un ambiente de desarrollo que integra muchas herramientas con el propósito de facilitar la vida a los desarrolladores de software. Estoy de acuerdo. Sin embargo, no los uso por una sencilla razón: mi entorno de programación hace 20 años era muy simple: un editor de textos, un intérprete o compilador (según el caso), un prompt de sistema operativo y ¡listo!, programa hecho. Las ayudas eran casi nulas, y dependíamos de nuestra memoria o de un buen libro de referencia para seguir la sintaxis y usar las instrucciones propias del lenguaje. Tal vez por esta razón me acostumbré a esa simplicidad del editor (sí, aunque lo duden, el edlin de DOS y el vi de UNIX son sencillos de usar), que cuando aparecieron los IDEs permanecí renuente a utilizarlos. Pensándolo bien, no debí usar el tiempo pretérito; quise decir que desde que aparecieron los IDEs me he rehusado a utilizarlos (hasta donde el proyecto me lo permite, ni modo, la anarquía no se me da). Prefiero mi editor de textos y teclear de memoria las instrucciones.

Puedo parecer un poco incongruente por lo que voy a decir a continuación, pero confío en su criterio. Yo sí recomiendo a mis alumnos que utilicen un IDE, pero que no dejen de conocer el lenguaje; muchos se confían porque su herramienta les completa automáticamente los nombres de clases o de métodos, les indica con otro color las líneas con errores de sintaxis y les sugiere la corrección (¡incluso algunos IDEs corrigen por sí solos!, ¡increíble!). Sólo por reforzar mi punto, he sido testigo, muchas veces, de casos en los que el programador lleva horas sentado frente a un error en su programa sin poder acertar a decir cuál es, esperando que el IDE, de alguna manera milagrosa, lo resuelva. Que quede claro: el hecho de que yo no use un IDE no implica que no los recomiende, por el contrario, los animo a usarlos, pero con la debida precaución.

Si comienzas a programar en Java, recomiendo usar BlueJ. BlueJ es ideal para comprender mejor los conceptos de orientación a objetos, con la ventaja de un IDE que escribe código automático a partir de un diagrama UML. Para los más agresivos, están NetBeans, Java Studio Creator (de Sun), JDeveloper (de Oracle), Eclipse o JBuilder (de Borland). Yo he usado todos ellos y puedo decir muchas cosas (buenas y malas) de cada uno. Sin embargo, creo que la decisión es tuya. Busca un IDE que sea fácil de usar, no uno donde te tardes más en configurar tu ambiente que en escribir tu programa.

¡Ah!, ¡casi lo olvidaba! Al principio dije que usaba EditPlus. Es una herramienta muy útil, no es un IDE pero se cree uno de ellos. Es un editor de textos como muchos, pero bastante eficiente (quiero decir rápido), resalta sintaxis con colores, puedes configurar programas para que se ejecuten desde su menú, hacer búsquedas de textos usando expresiones regulares (ER) en varios directorios, y muchas cosas más. Tal vez tú conozcas alguno mejor, pero este me ha convencido y me ha hecho recordar muchas veces que las mejores cosas de la vida son las más sencillas... y que quizá debería tener un IDE instalado en esos momentos en que olvido los métodos de la clase String. ;)

:wq!

miércoles, 17 de enero de 2007

A 20 años de mi primera vez

Parece que fue ayer.

(Un paréntesis: antes de que alguien se forme falsas expectativas, debo aclarar un punto: estoy hablando de mi primera vez... en hacer un programa de computadora, ¿de acuerdo? Bueno, aclarado el punto, continúo:)

No fue ayer, pero fue hace 20 años, cuando hice mi primer primerísimo "Hello, world!", en un lenguaje casi extinto, de esos que ya casi nadie recuerda, si es que acaso alguna vez lo conoció. Estoy hablando de GWBASIC. No, no dije VisualBasic, sino GWBASIC. Sí, el de los números de línea.

He aquí mi primer programa:

10 REM Mi primer Hello, world!
20 PRINT "Hello, world!"
30 END
run

Hello, world!
Ok

(Uy, ya me dieron ganas de llorar por la nostalgia.)

¿Ya se acordaron? Bueno, pues este fue mi primer primerísimo programa, y de ahí surgió todo lo demás por pura diversión. Naturalmente para hacer ese programa seguí cuidadosamente las instrucciones de uno de los pocos manuales de BASIC que existían en ese tiempo; después hice otro, lo ejecuté, luego otro, lo ejecuté, y así sucesivamente, mientras iba aprendiendo la sintaxis y todo aquello, entre uno que otro consejo acerca de cómo programar correctamente (y no andar haciendo herejías de programación, como las llamé posteriormente).

En la actualidad programo mucho más en Java que en cualquier otro lenguaje, pero indiscutiblemente el BASIC será por siempre (y a pesar de todo) mi lenguaje de programación consentido.

Si alguien está interesado en saber más de GWBASIC, escriba su comentario y con gusto ampliaré la información. Si no, no hay problema, generalmente pocos se interesan por las antigüedades, aunque esta es para mi gusto una que me trae buenos recuerdos.

:wq!

lunes, 15 de enero de 2007

Hello, World!

"Hello, world!"

¿Quién no recuerda estas palabras cuando hizo su primer programa en cualquier lenguaje de programación? Por supuesto me estoy refiriendo a los programadores que en algún momento de sus vidas dedicaron unos minutos frente a una computadora, teclearon algunas instrucciones que al ser ejecutadas mostraran en el monitor la tan esperada (y trillada) frase: "Hello, world!"; los que nunca han programado una computadora, no se preocupen, esta es sólo una de tantas frases que, aparentemente sin significado, forman parte del léxico común de la gente que ha hecho de las computadoras su "modus vivendi", o su pasatiempo, o las dos cosas.

No me considero una autoridad en materia de desarrollo de software, pero algunos años en esto me han dado cierta experiencia. En realidad, aunque es mi trabajo, me divierto haciendo software. Además de desarrollar sistemas de cómputo tengo varios años en la industria de la capacitación, dando cursos certificados de Java, Solaris, Cisco y Microsoft, y es precisamente esta dualidad de actividades (desarrollo de software y capacitación en tecnologías) lo que me motivó a iniciar este weblog, sin muchas pretensiones, sólo el de compartir de vez en cuando algunas de las cosas que salen en el día a día de los sistemas.

Que tengan un buen día,

:wq!