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!