martes, 10 de mayo de 2011

Teoría de las Telecomunicaciones tema 5.3: Internet

En este post se encuentra el material que se utilizó durante la exposición del tema 5.3 (Internet) en la materia de Teoría de las Telecomunicaciones del Instituto Tecnológico de Toluca para la carrera de Ingeniería en Sistemas Computacionales.

El material está conformado por las diapositivas de la exposición y un documento que contiene el marco teórico sobre el cual se realizaron dichas diapositivas.

Descargar diapositivas

Descargar documento

domingo, 8 de mayo de 2011

Java: Operadores Incremento/Decremento

Los operadores de pre/post-incremento/decremento pueden ser fuente de confusión a pesar de lo simples que parecen. ¿Qué imprime el siguiente fragmento de código?

  int i = 10, k = 10, x;
  x = (i++*--k) + (i++*--k);
  System.out.println("x=" + x + ",i=" + i + ",k=" + k); 

Hasta donde entendía, los operadores de pre-incremento/decremento se ejecutan antes de evaluar la expresión completa y los de post-incremento/decremento después de evaluar la expresión completa. En nuestro ejemplo, yo pensé que los "--k" eran ejecutados primero, dejando k=8. Después se ejecutaban las operaciones, x = (10*8) + (10*8) = 160. Y por último incrementamos dos veces i, es decir i=12. Para mi sorpresa, el resultado fue: x=178,i=12,k=8.

Esto despertó mi curiosidad de ver lo que realmente estaba ejecutando la máquina virtual de java. Para ello, utilicé el comando javap para obtener una versión más amigable del bytecode que se encuentra en los archivos .class. La siguiente tabla muestra del lado izquierdo la salida de javap y del lado derecho una versión más fácil de leer.

Pasojavap 
1bipush 10
istore_0
i=10
2bipush 10
istore_1
k=10
3iload_0i_temp = i = 10
4iinc 0, 1i=11
5iinc 1, -1k=9
6iload_1k_temp = k = 9
7imulsumando_1 = i_temp * k_temp = 90
8iload_0i_temp = i = 11
9iinc 0, 1i = 12
10iinc 1, -1k = 8
11iload_1k_temp = k = 8
12imulsumando_2 = i_temp * k_temp = 88
13iaddsuma = sumando_1 + sumando_2 = 178
14istore_2x = suma = 178

Observen en el paso 7, que el primer sumando es calculado usando variables temporales (siendo más precisos, es un stack de operandos que usa la JVM). De hecho, en los pasos 3 al 6 se guardan los valores de i y k en el stack de operandos y también se realiza su respectiva operación de post-incremento y pre-decremento. La diferencia es que para i, primero se copia su valor en el stack de operandos y luego se incrementa; y para k, primero se decrementa su valor y después se copia en el stack.

Al momento de ejecutar el paso 7, las dos variables i(11) y k(9) ya fueron modificadas. Los pasos 8-12 son similares a los pasos 3-7. Por último, en los pasos 13-14 se calcula y se guarda el resultado final. Es importante notar que las operaciones de pre/post-incremento/decremento afectan a su operando conforme van siendo evaluadas dentro de una expresión más compleja. La única diferencia entre pre y post es si el valor del operando se copia al stack de operandos antes o depués de ser modificado. Sin embargo, subsequentes ocurrencias de la misma variable dentro de la expresión verán el valor modificado (por ejemplo, la segunda ocurrencia de i o k en la expresión anterior.)

Como ejercicio, ¿cuál es el valor de r al ejecutar la siguiente operación?

  int x = 10;
  int r = ++x * x++ * x

Es claro que los operadores de pre/post-incremento/decremento pueden ser fuente de confusión, tal vez esa es una razón por la cual el lenguaje Python no contiene estos operadores. ¿Qué opinan? ¿Qué resultado obtuvieron en el ejercicio anterior?

Ubuntu como mi Sistema Operativo Primario

Este es el resumen de nuestra experiencia al cambiar de Windows a Ubuntu. En el primer post hablamos de los preparativos para la instalación, el porqué tuvimos que realizar una instalción de cero para poder particionar el disco duro a la medida y del pequeño detalle que tuvimos con la tarjeta de red inalámbrica. En el segundo post presentamos Ninite, una aplicación muy útil para instalar varias aplicaciones en Windows con un solo instalador. En el siguiente post presentamos una lista de aplicaciones que usamos en Windows y sus equivalentes en Ubuntu, como pudimos ver muchas de las aplicaciones ya tienen implementaciones para ambas plataformas. En el cuarto post compartimos unos links para poder compartir fólders con Samba y de cómo montar una partición NTFS automáticamente al reiniciar Ubuntu. En el último post dimos los toques finales a Ubuntu, configuramos: atajos del teclado, autokey para expandir texto, la responsividad de los paneles y la terminal de comandos.

Este viernes me apareció la notificación para actualizar a Ubuntu 11.04 y al parecer la actualización fue correcta. Intenté utilizar la interfaz por default: Unity. La barra para lanzar aplicaciones está muy bien; sin embargo, la falta de personalización de la barra donde está el menú global no me convenció. Por el momento regresé a Gnome (sin Unity), esto lo pueden hacer al momento de autenticarse, después de seleccionar su usuario en la parte inferior hay un menú donde pueden elegir Ubutu Clásico.

Esperamos que los tips y los links a lo largo de esta serie sean de ayuda. Si tienen más tips, aplicaciones o comentarios acerca de Ubuntu 11.04 compártanlos en los comentarios o aún mejor comenten en Facebook.

martes, 3 de mayo de 2011

Presentación: Manejo de imagenes, animaciones y video en Java

En este apartado se encuentra el enlace para obtener la presentación acerca de los subtemas 5.3, 5.4 y 5.5 de la materia de Tópicos Selectos de Programación en el Instituto Tecnológico de Toluca.

El enlace conduce a un repositorio público en la página de bitbucket desde donde podrán descargar los ejemplos vistos durante la exposición así como la presentación, que contiene las referencias del material consultado.

https://bitbucket.org/

INSTRUCCIONES: En la caja de texto de la esquina superior derecha, donde dice "find a project", busquen el repositorio llamado ejmtema5.4, éste fue creado por el usuario LuisBV. A continuación, den clic sobre el nombre del repositorio y en la pestaña "get source" podrán descargar una versión comprimida del contenido del repositorio (es decir, la presentación más los proyectos de ejemplo).

NOTA: Para los ejemplos de video, deberán descargar la API de Java Media Framework (JMF) de la siguiente página (en este sitio también se encuentran las instrucciones para instalar dicha API): http://www.oracle.com/technetwork/java/javase/download-142937.html

Comprueben que su instalación de JMF es correcta ingresando al siguiente sitio: http://ku-prism.org/virtualprism/explorations/JavaTest/javatestpage.html

viernes, 22 de abril de 2011

Personalizando Gnome y la Terminal

Hasta el momento he estado usando Ubuntu durante cuatro meses como mi sistema operativo principal. En esta última parte de la serie, mostraré algunas configuraciones que realicé al escritorio y a la terminal para hacer más cómodo el usar Ubuntu.

Atajos del teclado.

Para hacer la navegación más eficiente y rápida es importante familiarizarse con algunos atajos. Uno de mis favoritos es Ctrl + Alt + Flecha izquierda o derecha para cambiar entre los distintos escritorios o Shift + Ctrl + Alt + Flecha izquierda o derecha para mover la ventana activa a otro escritorio. En la siguiente liga podrán encontrar varios atajos:

https://help.ubuntu.com/community/KeyboardShortcuts

Otra forma de acelerar las tareas es tener atajos a programas o carpetas usadas frecuentemente, para ello usé la utilería de atajos que proporciona Gnome en System > Preferences > Keyboard Shortcuts. Tengo atajos para abrir Chrome, NetBeans, Rhythmbox, la terminal de comandos, entre otros.

El toque final en cuanto atajos es el poder expandir texto. Actualmente estoy realizando varias pruebas con Java, por lo que dos líneas de código que tecleo una y otra vez son:

public static void main(String[] args){}
System.out.println("");

Para ahorrar tiempo, usé AutoKey. Este programa me permite configurar abreviaturas que se expanden por el texto que especifiquemos. Por ejemplo, para las dos líneas anteriores creé dos abreviaturas jmain y jpr. También configuré que AutoKey iniciara al reiniciar Ubuntu.

Responsividad de los paneles

Prefiero que los paneles permanezcan ocultos y que sólo aparezcan cuando posiciono el cursor cerca de la orilla de la pantalla. Sin embargo, algunas veces sólo paso rápidamente el cursor cerca de la orilla y el panel aparece, aún cuando no era mi intención usar el panel (esto se puede volver un poco molesto). Afortunadamente es posible configurar el tiempo que tenemos que posicionar el cursor cerca de una orilla antes de que aparezca el panel:

  1. Abrir el editor de configuraciones ejecutando gconf-editor en la terminal de comandos.
  2. Entra al siguiente fólder apps/panel/toplevels, ahí podrás ver tus paneles.
  3. Poner el valor deseado a la propiedad unhide_delay (lo tengo en 500 milisegundos).

Personalizando la terminal de comandos

Si vas a estar usando la terminal de comandos es mejor que realices algunos ajustes para que se ajuste mejor a tus preferencias. La siguiente imagen muestra cómo tengo configurada la terminal:

El primer punto es modificar el prompt. Al inicio me parecía útil el tener toda la ruta en el cursor, pero al navegar directorios anidados puede resultar hasta confuso ver tantas letras. Lo que prefiero es sólo ver el nombre del directorio actual y que el cursor sea de un color diferente. Para ello, configuré los colores para que fuera fondo negro con letras verdes. Después edité el archivo .bashrc en mi directorio raíz, modifiqué las líneas que configuran el prompt:

  1. Habilitar la línea “force_color_prompt=yes” para que el cursor tenga un color diferente.
  2. Configurar la línea que controla el formato del prompt, por ejemplo:
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;33m\]\W:\[\033[00m\]'
    

Para dar el toque final, añadí una tecla de atajo para abrir rápidamente la terminal en un directorio que uso frecuentemente y que aparezca alineada a la derecha de la pantalla. El comando de la tecla de atajo es:

gnome-terminal –working-directory=/un_dir_muy_usado/ --geometry=80x48+950+0

El siguiente link describe las opciones que se pueden pasar al iniciar la terminal de comandos:

http://multignometerm.sourceforge.net/web/doc/options.html

Con esto cerramos los tips básicos que me ayudaron a cambiar a Ubuntu como mi sistema operativo primario. En el siguiente post presentaré un resumen y ligas a los cinco posts que comprenden esta serie.

domingo, 10 de abril de 2011

Montando y Compartiendo una partición NTFS en Ubuntu

Cuando instalé Ubuntu 10.10, perfectamente reconoció la partición NTFS y la montó. Sin embargo, al reiniciar el sistema la partición no era montada automáticamente. Esto lo pude ver reflejado en distintas aplicaciones que trataban de acceder a archivos en la partición: Rhythmbox no encontraba las canciones que había agregado anteriormente, Dropbox no encontraba los archivos, LibreOffice no podía abrir documentos que tenía en su historial reciente.

Este síntoma se arregla si voy a la barra de herramientas y en “Places” selecciono la partición NTFS, en ese momento la partición es montada. Sin embargo, no es muy cómodo estar realizando manualmente estos pasos cada vez que reiniciemos Ubuntu.

Encontré el siguiente post que describe perfectamente cómo arreglar este detalle usando la utilería ntfs-config:

http://www.psychocats.net/ubuntu/mountwindows

Por último configuré un fólder en la partición NTFS para poder compartirlo, para ello instalé Samba, el siguiente post detalla paso a paso cómo realizarlo muy fácilmente:

http://ubuntuforums.org/showthread.php?t=1685718

Hasta el momento, el salto a Ubuntu ha sido considerablemente sencillo. Nos falta dar los toques finales como es la personalización de nuesto ambiente. En el siguiente post hablaremos de algunos tips para mejorar la interacción con Gnome y el aspecto de la terminal de comandos.

domingo, 27 de marzo de 2011

Mis Aplicaciones en Ubuntu

Como mencioné en el primer post de esta serie, intentos anteriores de migrar a un sistema Linux no fueron exitosos. Y creo que la principal razón fue que no busqué lo suficiente en cuanto a aplicaciones adecuadas para llevar acabo mis tareas. Obviamente por rápido y seguro que sea un sistema operativo si no tiene instaladas las aplicaciones necesarias, no será de mucha utilidad.

Pero esta vez, decidí no darme por vencido tan rápido y buscar un poco más. Además, cada vez hay más software que tiene versiones para las tres principales plataformas (Windows, Linux, Mac) o que es independiente de la plataforma (por ejemplo si fue desarrollado en Java).

A continuación presentamos una tabla con aplicaciones usadas en Windows y sus contrapartes en Ubuntu:

WindowsUbuntuNotas
Notepad++Gedit 
Paint.NETGimp 
ChromeChromeExtensiones recomendadas: ChromeItLater, New Tab Redirect!, TimerSet
LibreOfficeLibreOffice 
NetbeansNetbeans 
Oracle JDKOpenJDK 
WinampRhythmbox 
MikTeXTex-live 
KeepassKeepassUsar versión portable y correrla con mono
.NETMonoAgregar mono forms 2.0 (lo usa Keepass)
AutoHotKeyAutoKey 
PdfMergePdfchain 
VisioDia 
7zip7zip 
VLCVLC 

Esperamos que esta lista sea de ayuda. En el siguiente post veremos detalles de cómo compartir un fólder en una partición NTFS.