Blog de Abelardo Jara Berrocal: Ubuntu, electronica y software libre

Noviembre 30, 2007

Pasando objetos por referencia: el namespace y el registro de activación

Ante todo quiero resaltar que las consideraciones que comentare se aplican a lenguajes de programación fuertemente tipados como C++ y Java donde las variables una vez declaradas sólo pueden almacenar datos de su mismo tipo. Otro es el caso para lenguajes dinámicamente tipados como Python. Finalmente concluiremos porqué es mejor pasar objetos como parámetros por referencia.

La ilusión del procedimiento: el entorno de ejecución protegido:

En todos los lenguajes del tipo del Algol, y en esto incluimos a C, cada procedimiento crea un entorno de ejecuciòn limpio, controlado y protegido. Cada procedimiento tiene su propio y privado almacen de variables. Todas las instrucciones dentro del procedimiento puede acceder estas variables privadas o mejor llamadas locales. Cada procedimiento debe creer que esta ejecutándose sobre este entorno protegido como si fuera un programa que corre en una máquina sin ningún programa más. Pero además y en general el procedimiento recibe datos y retorna datos al procedimiento que lo llamó.

El concepto de procedimiento es la unidad base para los compiladores. En general un programa no es presentado en un solo archivo para ser compilado. Cuando hacemos un programa en C++ por ejemplo, creamos archivos de cabecera .h y archivos de implementación .cpp y cada par es compilado en instantes diferentes. El código compilado de cada par puede ser por ejemplo enlazado en una etapa posterior (linking). El concepto de procedimiento es lo que nos permite a los programadores construir programas no triviales.

Que es un namespace o espacio de nombres?

Aquí escribo una introducción a los “namespaces” (espacios de nombres) y “activation records” (registros de activación) que se ven en C++.

La mayoría de los lenguajes de programación basados en procedimientos como C++ le brindan al programador control sobre que variables puede leer y escribir.

Fortran, uno de los lenguajes más antiguos, definía solo 2 namespaces, un namespace global conformado por las variables globales y un namespace local dentro de cada procedimiento.

En general el manejo de namespaces es mas complejo en lenguajes de programación más recientes, dado que un procedimiento puede llamar a otro procedimiento o incluso a sí mismo (recursividad).

De esta manera un programa puede contener múltiples namespaces. El lenguaje define reglas que determinarán a que variables cada procedimiento puede acceder. Estas reglas se llaman “reglas de ámbito (scoping rules)”.

El lenguaje C tiene reglas de ámbito bastante complejas. Primero, el crea un espacio global de nombres que contiene todos los nombres de los procedimientos así como todos los nombres de las variables globales. Este nivel se llama ámbito a nivel de archivo. Todos los nombre en este nivel están declarados con el atributo “static”, por tanto ellos son visibles a cualquier procedimiento en el archivo.

A su vez cada procedimiento puede crear su propio namespace para definir sus variables y parámetros.

Y que es un “activation record” o registro de activación?

Cada procedimiento al ser ejecutado crea su propio nuevo espacio de nombres (namespace). Dentro de cada procedimiento, el programador puede declarar variables que no son accesibles desde fuera de este. Las variables declaradas tienen un tiempo de vida igual al tiempo de vida del procedimiento.

Para manejar este comportamiento, el compilador separa una región de memoria llamada “registro de activación” o “activation record” (AR), para cada llamada individual a un procedimiento. El AR es creado cuando el procedimiento es llamado, y es liberado (destruido) cuando el control regresa al procedimiento que lo llamo.

Pero el AR necesita también guardar el estado de las variables del procedimiento que lo llamo con la intención de crear la ilusión que el procedimiento se esta ejecutando en una máquina sola. Con este fin, se guardan en el AR el estado de los registros del sistema (para los que les gusta Assembler, eax, bax, los también llamados “archivo de registros” o “register file”) para poder reconstruir luego el estado del  procedimiento llamante.

En general un AR tiene las siguientes partes:

1. Parámetros: son los parámetros que el procedimiento que llama le entrega al procedimiento que se va a ejecutar (el AR actual pertenece al procedimiento que se va a ejecutar). En general pueden ser valores que el procedimiento llamante le da al procedimiento llamado para que opere con ellos, pero también pueden ser punteros si el procedimiento llamado recibe parámetros por referencia (caso más común en programación orientada a objetos)

2. Register Save Area (o área de salvado de registros): aquí se guardan los registros del sistema (eax, bax, etc)

3. Return value (o valor de retorno): El procedimiento debe poner aquí el valor que retorna al procedimiento que lo llamó

4. Return address (o dirección de retorno): para poder restablecer al program counter (PC) en la posición donde el procedimiento que llamaba llamó a nuestro procedimiento.

5. Access link (enlace para acceso): es una campo del AR, el cual el compilador usa para referenciar donde estan ubicados los otros campos del AR.

6. Parent access record pointer (puntero al AR del padre): este es un puntero y apunto al registro “access link” del procedimiento llamante o “padre”. Esto permite el anidamiento de procedimientos (esto es lo que ocurre en general en nuestros programas, desde un procedimiento A llamamos a otro procedimiento B y desde ese procedimiento B llamamos a otro procedimiento C, y así sucesivamente)

7. Locales: Aquí se almacen las variables locales del procedimiento y los punteros a las variables dinámicamente creadas. Las variables dinámicamente creadas son aquellas que no conocemos en tiempo de compilación (no sabemos si las usaremos o que tamaño en bytes tendrán al momento de compilar nuestro programa). Las variables dinámicamente creadas son las que creamos con la instrucción malloc en C o con las palabra reservada new en C++.

Las variables dinámicamente creadas tienen sus punteros en el AR pero su estructura de datos con sus valores son dispuestas en la pila (también llamada “heap”) y su contenido es liberado automáticamente cuando el puntero que la apuntaba es liberado explícitamente (por ejemplo con una instrucción “delete” en C++, siempre y cuando no hayan más punteros apuntando a la misma data) o automáticamente mediante un “colector de basura” o “garbage collector” en Java.

Ahora, donde almacenamos todos los “activation records” que vamos creando en nuestro programa? Generalmente los activation records de nuestro programa en un momento determinado de su ejecución se almacenan en el “stack” o “pila” . El procedimiento actualmente en ejecución tiene su AR en el tope de esta pila o “stack”. Cada vez que llamamos un procedimiento ponemos su AR en el tope del “stack”. Este paso de poner su AR puede ser hecho por el procedimiento que lo llamó o por el procedimiento llamado por sí mismo. Con este esquema es fácil deducir que el procedimiento padre de todos tendrá su AR en el fondo del stack.

El stack no debe ser confundido con el “heap”, la cual es utilizada principalmente para almacenar estructuras de datos creadas dinámicamente.

Si observamos ahora de nuevo la estructura del activation record (AR) veremos que se reserva espacio de memoria para cada parámetro que el procedimiento recibe. Si el procedimiento recibe un objeto cuya estructura de datos es compleja como parámetro pasado “por valor” y no “por referencia”, entonces el AR tendrá que crear dentro de él una copia del objecto con todos los datos internos que el objeto tenga. Por eso es que actualmente en programación orientada a objetos los parámetros se pasan por referencia, de modo que ahorramos en tiempo de ejecución (no es necesario copiar los datos del objeto o estructura) y en memoria (solo almacenamos un puntero en el AR). Este es el esquema por defecto en Java, donde los parámetros son pasados por referencia.

Bueno, espero que esta introducción sea de utilidad para todos. Muchos saludos.

Introducción al profiling en Linux y Cygwin

Archivado en: Programacion C++ en Linux, Programacion C++ en Windows — Abelardo Jara @ 3:58 pm

Hacer profiling de nuestras aplicaciones en C++ en Linux o en Windows (usando las GNU classpath del Cygwin) es sumamente importante si deseamos reducir el tiempo de ejecución de nuestro programa.

Mediante su uso podemos saber en qué función estamos perdiendo el tiempo. Muchas veces lo hacemos en una función tonta. Nuestra estructura de datos podría ser la mejor pero la forma en que la manipulamos podría no ser eficiente.

Por ejemplo una simple función para filtrar valores de una matriz para pasarlos a otra matriz, puede hacernos perder tiempo considerablemente. Por ejemplo una función tan tonta como:

void damePixels (char *bit, int *pixel, int nPuntos)
{
int i;
for (i=0; i<nPuntos; i++)
{
if (bit[i] == 1)
pixel[i] = negro;
else
pixel[i] = blanco;
}
}

Podría ser la causa de nuestra pérdida de tiempo.

El profiling de nuestra aplicación no sólo es de utilidad para aplicaciones de alta performance sino también en aplicaciones que corren en sistemas embebidos como el procesador Microblaze de Xilinx que esta disponible en los Virtex 4. Estos procesadores tienen una frecuencia de reloj muy limitada comparada a un Pentium 4, así que ahorrar valiosos ciclos de reloj viene muy bien a la aplicación. Y una ventaja es que las herramientas de desarrollo para estos procesadores embebidos también son las GNU Classpath (GCC, G++)

Hacer profiling también es válido para aplicaciones que se ejecutan sin terminar (por ejemplo un servicio), en estos casos nuestro programa debe poder capturar la señal de CTRL+C  (o enviada con un “kill -s … PID”) para hacer un exit( ) en condiciones.

Aquí les adjunto un tutorial de introducción que tomo de: http://www.chuidiang.com/clinux/herramientas/profiler.php

A veces usamos algoritmos más o menos complejos y nuestro programa va demasiado lento, tenemos que depurarlo y acelerarlo como sea.

No es una buena técnica ir a lo loco a mejorar el código. Podemos pasarnos dos días intentando mejorar el código de la función que creemos que pierde el tiempo, probar, y ver que todo sigue igual de lento. El tiempo a lo mejor se está perdiendo en otra función que ni siquiera se nos pasa por la cabeza, quizás sea una función muy simple, pero se la llama muchísimas veces.

Linux proporciona varias herramientas que nos permiten analizar nuestro programa en ejecución y ver en qué gasta el tiempo( prof, gprof, monitor, etc). Aquí vamos a echarle un ojo a gprof.

En primer lugar, vamos a hacer un programita que llamaremos pprofiler.c y que únicamente se dedique a perder tiempo. Puede ser algo así como:

void funcion1(); /* prototipo de una de las funciones */
void funcion2(); /* protoripo de la otra función */

/* Programa principal.
* Llama 1000 veces a cada una de las funciones funcion1() y funcion2() */
main()
{
int i;
for (i=0; i<1000; i++)
{
funcion1();
funcion2();
}
}

/* funcion1(). Pierde el tiempo */
void funcion1()
{
int i,j;
for (i=0;i<10;i++)
for(j=0;j<1000;j++);
}

/* funcion2(). Pierde más tiempo */
void funcion2()
{
int i,j;
for (i=0;i<1000;i++)
for (j=0;j<1000;j++);
}

Como puedes ver, simplemente hay dos funciones con unos bucles para perder el tiempo. En la realidad, estas y otras como estas serían tus funciones con tu código y tus algoritmos.

Para usar gprof, lo única que hay que hacer es compilar con la opción -pg y ejecutar el programa

$ cc -pg pprofiler.c -o pprofiler
$ ./pprofiler

Cuando termine de ejecutarse el programa, se generará automáticamente un fichero gmon.out, que es el fichero en el que se guardan las estadísticas de tiempo de nuestro programa y de nuestras funciones. Es importante dejar que el programa termine de forma natural (sin abortarlo), ya que si no este fichero gmon.out puede quedar incompleto y no ser de utilidad. Si nuestro programa es de los que debe estar permanentemente arrancado y no salir nunca, debemos ponerle una opción para salir. Podemos, por ejemplo, capturar la señal de ctrl-c para hacer un exit() en condiciones.

Una vez que tenemos el fichero, con el comando gprof miprograma, obtendremos en pantalla las estadísticas de tiempo. Para el ejemplo concreto, yo he obtenido lo siguiente:

$ gprof pprofiler
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
99.41 10.09 10.09 1000 10090.00 10090.00 funcion2
0.59 10.15 0.06 1000 60.00 60.00 funcion1
…. aqui va una explicación de lo que es cada columna … br/> granularity: each sample hit covers 4 byte(s) for 0.10% of 10.15 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.00 10.15 main [1]
10.09 0.00 1000/1000 funcion2 [2]
0.06 0.00 1000/1000 funcion1 [3]
———————————————–
10.09 0.00 1000/1000 main [1]
[2] 99.4 10.09 0.00 1000 funcion2 [2]
———————————————–
0.06 0.00 1000/1000 main [1]
[3] 0.6 0.06 0.00 1000 funcion1 [3]
———————————————–
… otra explicación de lo que es cada campo …

Si tienes un ordenador más moderno que el mio (cosa bastante probable) y te salen todos los tiempos de 0.0, quizás debas hacer los bucles más largos.

En primer lugar nos aparece una tabla con las funciones de nuestro programa ordenadas de más consumidora de tiempo a menos. Las funciones que gastan tiempo 0.0 (o despreciable, como el main() en nuestro caso), no aparecen por defecto. Vemos que la funcion2() ha gastado el 99.41% del tiempo de ejecución de nuestro programa, funcion1() el 0.59% y main(), que ni siguiera aparece, un 0% (por eso no aparece).

Ha habido 1000 llamadas a cada función y mientras que funcion2() tarda 10090 microsegundos por llamada, funcion1() sólo tarda 60 microsegundos.

En la segunda tabla que sale, tenemos además una especie de árbol de llamadas. Indica que el 100% del tiempo (10.15 segundos) se ha estado ejecutando la funcion main(). Esta función ha llamado 1000 veces a funcion1() y otras 1000 veces a funcion2(). También están los tiempos empleados en estas llamadas.

Luego aparece funcion2(), en la que se ha estado el 99.4% del tiempo y que ha sido llamada por main() 1000 veces.

etc, etc.

Todo esto nos facilita el saber exactamente que función debemos depurar. Debemos ir en primer lugar a la primer función que aparece en la primera tabla. Ver si se la ha llamado muchas veces o si gasta mucho tiempo en cada llamada. En función de eso, debemos tratar de llamarla menos veces o bien hacer que tarde menos.

Noviembre 28, 2007

Programación en linux: GTK+ y gtkmm

Archivado en: Programacion C++ en Linux — Abelardo Jara @ 10:59 pm

He hecho este post como una correccion que me hizo mi amigo Igor, despues de ello, ahora les paso estas instrucciones, tomado de:

http://jubuntu.blogsome.com/category/programacion/linux/gtkmm/

Despues de trabajar varios meses sobre Windows con las librerias wtl, me he decidido a comenzar con programación gráfica bajo linux. Trás ver varias alternativas al final he optado por usar las librerias gtkmm, para realizar entornos visuales. Estás librerias, se basan en las GTK+. Según la wikipedia las gtkmm son utilizadas para desarrollar aplicaciones basadas en GTK+ con C++.

Antes de empezar a trabajar con estas librerias, debemos instalarlas, y tambien sería conveniente disponer de algún entorno de desarrollo. Como normalmente trabajo con ubuntu, opté por usar Anjuta.

Desde el synaptic, instalé los siguientes programas o librerias:
- anjuta
- g++
- libgtkmm-2.4-1c2a
- libgtkmm-2.4-dev
- libgtkmm-2.4-doc
- autoconf
- libtool
- libglademm-2.4-dev

Despues de instalarlo todo, ya podemos crear un proyecto gtkmm, y compilar nuestro primer programa de ejemplo:

#include <gtkmm.h>
#include <glibmm .h>

int main (int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
Gtk::Window window;
kit.run(window);
return 0;
}

Dicho así suena muy sencillo, pero la verdad es que me costó unas cuantas horas dejarlo todo preparado.

Problemas programando en Linux

Archivado en: Temas Ingenieria de Computadoras y Electronica — Abelardo Jara @ 3:43 pm

Lo que enseña este  corto mas alla de las bromas es que debemos saber elegir que  plataformas usar para programar , por eso sugiero usar herramientas de programacion libres como el GNU Classpath (GCC, GCJ, etc) o Java Tongue

Mono trae por ahora algunas consecuencias, mas alla que luce muy prometedor.

Creando nuestro primer documento en LaTeX

Archivado en: EMACS y edicion de documentos con Latex — Abelardo Jara @ 2:37 pm

Hola a todos, aqui les pongo unas instrucciones basicas para crear un documento en LaTeX.

Lo pueden hacer desde Ubuntu Gutsy (marquen todos los paquetes que empiezan en su nombre con “tetex” en el Synaptic y los instalan) o en Cygwin (tambien aqui, se debe instalar todos los paquetes que empiezen con “tetex”).

Bueno, lo primero es crear nuestro primer documento, lo podemos hacer con un editor de textos (lo llamaremos documento.tex)

\documentclass[a4paper,12pt]{article}
\usepackage{url}
\usepackage[left=1in,top=1.25in,right=1.0in,bottom=1.25in]{geometry}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{lscape}

%opening
\title{Curriculum vitae}
\author{Abelardo Jara Berrocal}

\begin{document}
\tableofcontents
\newpage

\begin{centering}
\begin{Large}\textbf{Ejemplo de Latex 1}\end{Large}\\
Curso de Latex\\Email:\textit{Semestre 1}\\
\end{centering}

\section{Introduccion}
LaTeX es un lenguaje de marcado para documentos, y un sistema de preparación de documentos, formado por un gran conjunto de macros de TeX, escritas inicialmente por Leslie Lamport (LamportTeX) en 1984, con la intención de facilitar el uso del lenguaje de composición tipográfica creado por Donald Knuth.\\
Es muy utilizado para la composición de artículos académicos, tesis y libros técnicos, dado que la calidad tipográfica de los documentos realizados con LaTeX es comparable a la de una editorial científica de primera línea.\\
LaTeX es software libre bajo licencia LPPL.

\section{Descripcion técnica}

\end{document}

Luego lo grabamos y vamos a compilarlo:

latex documento.tex

Este paso genera un archivo llamado documento.dvi

Para convertirlo en PDF, damos el siguiente comando:

dvipdfm documento.tex

Este paso genera un archivo documento.pdf Asi finalmente tendremos un documento PDF que podemos distribuir e imprimir.

En Internet hay varios manuales de LaTeX, los cuales no son muy dificiles de seguir, se parece bastante al HTML.

Noviembre 27, 2007

Como realizar copias de seguridad con rsync

Archivado en: Linux Ubuntu Administracion — Abelardo Jara @ 9:26 pm

Acontinuación veremos como hacer copias de seguridad con la utilidad rsync con nuestro Ubuntu Gutsy o con Windows con un servidor SSH instalado bajo Cygwin.

Rsync permite la copia de archivos local o remotamente respetando los permisos, propietario, grupo, enlace o dispositivo.

Además permite comprimir los datos para que se puedan enviar o copiar de forma más rápida. Con el uso de rsync solamente se copiarán los datos que se diferencian del origen con la copia de destino, con lo cual se evita tener que copiar de nuevo datos duplicados.

Con rsync también es posible hacer copias a un servidor remoto utilizando el protocolo ssh o rsh. Para realizar esto será necesario que rsync esté instalado en ambas máquina, la local y la remota.

La sintaxis es:
rsync [opciones] origen destino

Veremos algunos ejemplos que nos pueden servir para entender el funcionamiento de rsync:

rsync -t *.doc servidor1:copias

Con esta orden copiaremos todos los archivos .doc al directorio copias en la máquina servidor1. Si ya existieran los archivos en copias, solamente se enviarían las diferencias existentes entre las dos copias.

rsync -avz servidor1:/copias/documentos desktop/documentacion

Con esta orden se copiarán los archivos de la carpeta documentos del servidor servidor1, en la carpeta desktop/documentacion de la máquina local.

Nota que se usa el parámetro archive (-a) lo cual indica que se respeten los nombres de usuario, permisos que pudiera tener documentos.

Los parámetros [opciones] que podemos usar con rsync son:

-n: Probar, no realiza nada solo muestra el resultado.
-a: Modo archivo. Respeta todos los permisos y propiedad del archivo. Igual que si se usaran los parámetros -rlptDg

-r: Recursivo
-l: Respeta enlaces blandos
-p: Respetar permisos
-t: Respetar fecha/hora
-g: Respetar grupo
-D: Respetar dispositivos (solamente con usuario root)
-v: Modo verboso, para mayor verbosidad usar -vv
-z: Comprimir en caso de que lo acepte el servidor
-C: Ignora archivos como hace CVS.
-u: Modo update, mantiene archivo en el destino si es posterior.
-b: backup renombrar archivos existentes a extensión.

Este proceso de copia lo podemos automatizar utilizando cron, para que se ejecute cada cierto tiempo.

Espero que os haya sido de utilidad.

Como usar SCP, el complemento de SSH para transmitir archivos y carpetas

Archivado en: Linux Ubuntu Administracion — Abelardo Jara @ 9:22 pm

Ahora les comentare como podemos usar una herramienta llamada SCP que viene junto con el SSH para transmitir archivos y directorios:SCP significa Secure CoPy es una pata más de SSH, que permite transferir archivos o carpetas entre computadores. La sintaxis es bien simple:

$ scp archivo usuario@servidor.com:ruta

Y para copiar a la inversa, desde el computador remoto al tuyo, simplemente tienes que invertir el orden de los elementos:

$ scp usuario@servidor.com:ruta/archivo ruta_local

O sea por ejemplo, si quisiéramos mandar algo al servidor:

$ scp hola.txt tomas@bootlog.cl:/www/sitio

Mandaría el archivo hola.txt y lo dejaría en la carpeta /www/sitio en el servidor bootlog.cl. También puedes mandar carpetas completas (con -r):

$ scp -r viajealsur/ tomas@bootlog.cl:/www/sitio/fotos

Así mandaría la carpeta /viajealsur completa a /www/sitio/fotos.

Ahora, el mismo proceso a la inversa sería:

$ scp -r tomas@bootlog.cl:/www/sitio/fotos/viajealsur ~

Esto copiaría la carpeta viajealsur/ del servidor a mi carpeta /home.

Ah, y a propósito de carpetas home, como en SCP (y en SSH) la ruta por defecto es tu carpeta de usuario, si quieres copiar algo hacia o desde ahí, puedes omitir la ruta:

$ scp cancion.mp3 bootlog.cl:

En este caso la sintaxis está bien, ya que mi usuario se llama ‘tomas’ en ambos lados, así que no tengo que escribirlo de nuevo, y como estoy copiando el archivo cancion.mp3 a mi carpeta de usuario, también puedo omitir la ruta.

Ahora llegó la hora de que tú hagas la prueba. Recuerda que tienes que instalar el paquete openssh-server en el PC remoto para poder conectarte.

Enviar puertos de un host remoto a traves de un tunel SSH

Archivado en: Linux Ubuntu Administracion — Abelardo Jara @ 9:20 pm

En algunas ocasiones debemos usar protocolos no seguros (que envían sus contraseñas y/o datos en texto plano) cuando no estamos en un entorno fiable. Esto es comun en servidor de correo POP que no permiten conexiones o seguras o administracion remota con VNC (que no encripta las contraseñas, se envian sobre la red como texto plano).

Para estas situaciones, los túneles SSH nos permiten establecer una comunicación segura, que además es independiente de firewalls y otros filtros.El esquema de utilización vendría a ser el siguiente: un usuario inicia una sesión desde el ordenador local al remoto. Al establecer esa conexión le indica que puertos serán tunelizados, de tal forma que cuando el usuario se conecte al puerto X de la máquina local, será como si se conectara al puerto Y de la máquina remota.

El comando para conectarnos es:

ssh -L puerto_local:maquina_remota:puerto_remoto usuario@maquina_remota

Imaginemos que deseamos conectarnos a un servicio Web (puerto 80) de la máquina remota que no estaría accesible en condiciones normales debido a un firewall. Lo que haremos es reflejar ese puerto 80 de la maquina remota en el puerto 11000 de nuestra computadora. Asi a partir de ese momento el puerto 11000 de nuestra computadora sera el puerto 80 del ordenador remoto (y ese tunel transmitira sus paquetes encriptados en el tunel SSH).

Deseamos usar el puerto 11000 en nuestro ordenador local asi que usaremos este comando:

  • ssh -L 11000:localhost:80

localhost es el nombre del ordenador remoto al que el servidor ssh debe conectarse. Lógicamente, localhost indica que es el mismo ordenador que corre el servicio. Con esto podríamos conectarnos a cualquier otro servicio que el servidor remoto tenga accesible (en el ejemplo, un servidor pop3):

  • ssh -L 11000:servidor-remoto-de-correo:110

Por otra parte, es posible también que en la red remota usen servicios solo accesibles desde nuestra red local, para ello bastaría con usar un ssh -R 11000:ordenadorlocal:6667.

Usando el truco con VNC

Este truco se usa mucho para conectarnos a una máquina con Linux que tiene un servidor VNC corriendo:

Para eso levantaremos el servidor de VNC en la estación con Linux tipeando en consola:

$vncserver —-> Iniciamos el servidor VNC

$vncpasswd ——> Para establecer el password del servidor VNC

Alli te dira que ha empezada el servidor con un número de DISPLAY. En general este DISPLAY no sera 0, ya que el DISPLAY 0 esta ocupado ya por nuestro escritorio Gnome que corre en Gutsy, asi que muy probable te de otro número como 1, 2,…

Esto provoca que el servidor escuche conexiones por los puertos 5901, 5902, 590x (x es el número de DISPLAY que se te asigno al ejecutar VNCSERVER).

Luego desde un cliente cualquiera (Linux, Windows, …) podemos llamar la conexion de tunel con:

ssh -L 5900:HOST_REMOTO:5901 tusuario@HOSTREMOTO

Ahora el puerto 5901 de la maquina remota esta transmitiendo sobre el puerto 5900 de la maquina local. Solo queda conectarse con el vncviewer al localhost:0

NOTA: este truco debe ser solo usado para conexiones puntuales… para comunicar dos redes de forma segura y transparente a través de Internet hay soluciones mejores, como las VPN (redes privadas virtuales)

Otra gran importancia de este truco es que nuestro firewall puede tener solo abierto el puerto 22 del SSH, y todo servicio es enviado mediante un tunel a traves de SSH. Sin embargo esto hace las conexiones mas lentas.

Adicionando alias a mi Bash de Cygwin

Archivado en: Programacion C++ en Windows, Programacion del Bash — Abelardo Jara @ 6:54 pm

Acabo de instalar Cygwin en mi Windows XP, las instrucciones las doy en otro post, pero para hacer mas comoda mi consola de comandos Bash, he puesto algunas lineas al final del archivo .bashrc que se encuentra en /home/pintuco (bueno pintuco es mi nombre de usuario)

Aqui van: pueden editar .bashrc con el notepad de Windows o con nano o vi si lo instalaron como parte del Cygwin

set -o notify
export HISTCONTROL=ignoredups
alias less=’less -r’
alias rm=’rm -i’
alias whence=’type -a’
alias ls=’ls -F –color=tty’
alias dir=’ls –color=auto –format=vertical’
alias vdir=’ls –color=auto –format=long’
alias ll=’ls -l’
alias la=’ls -A’
alias l=’ls -CF’

#and here are a several more to add:

alias cp=’cp -i’
alias mv=’mv -i’
alias c:=’cd /cygdrive/c’
alias x:=’cd /cygdrive/x’
alias z:=’cd /cygdrive/z’
alias grep=’grep –color’
alias vi=’vim’
alias cls=’clear’

#A function to pipe any command to less:
function so {
eval “$@” |less -I~
}

Preguntas en entrevistas de trabajo para VLSI Analogico en EEUU

Archivado en: Temas Ingenieria de Computadoras y Electronica — Abelardo Jara @ 3:38 pm

1) How does a Mosfet works.
2) what are different types of BJT configurations and when do we use them.
3) what is the difference between TTL and CMOS ( even others also like ECL etc).
4) What is noise margin.
5) Which is the most important pin the microcontroller.
6) Explain about Ground Bounce and Vcc Sag.
7) what is EMI and what are different types of it.
8) one question on any kind of sensors you are aware of Ex: hall sensor etc.
9) what is LVDT.
10) how do we select the correct value of decoupling capacitor (or) what is the purpose of using a decoupling capacitor.
11) what is parasitic capacitance & what are the effects of it.
12) what is the difference between microprocessor and micro controller.
13) what are different types of micro processor architectures
14) difference between by pass capacitor and decoupling capacitor
15) how do you select an op amp ( this can apply to other components also)
16) Single ended and Differential signals.
17) How do you decide the layer stack up on PCB.
18) Filter Design : Analog and Digital Filters, different types of filters.
19) what is signal integrity.
20) what is meta stability.
21) Difference between CPLD and FPGA
22) Difference between DDR and DDR2 RAM.
23) what is termination. what are the different types of terminations.
24) When do you need to use an heat sink and how do you decide on that.
25) what is the difference between clock buffer and clock driver.
26) What is Jitter.
27) what is gain bandwidth product
28) Define settling time of op amp.
29) what is slew rate of op amp, define common mode rejection ratio and input offset voltage.
30) what is the difference between static response and dynamic response.
31) what is an integrator and differentiator.
32) define the parameters of an ADC or types of ADC etc.
33) what is sample and hold circuit.
34) what is a comparator.( some questions related to schmitt trigger or positive feed back of op amp)
35) what is Fan Out.
36) Different types of Voltage regulators. ( Linear, Switching etc..)
37) How do you create a basic delay circuit.
38) what is characteristic impedance.
39) what is ringing, undershoot and overshoot of a signal why do they occur and how to reduce them.
40) what is latch up.
41) what are the parameters to be taken into consideration while selecting a mosfet.
42) what are the different modes of operation of mosfet and BJT ( Linear & Switching and Cut off)
43) how do you implement a current source using BJT or MOSFET.
44) what is hysteresis. and what are the advantages and disadvantages of it.
45) what are the effects of vias on PCB.
46) how do you design a voltage to frequency converter.
47) 8051 architecture.
48) Ethernet communication
49) Different types of serial communications ex. I2C
50) Different types of memory devices ( ROM, RAM,SRAM and EEPROM etc)
51) How to select an Opto coupler.
52) what is the main advantage of using a bridge rectifier rather than using a full wave rectifier.
53) what are the applications of zener diode.
54) what are the applications of schottky diode.
55) why do we need a Gate Driver for Mosfet in Switching operations.
56) what is pulse width modulation. give any examples.
57) how does SMPS ( Switch mode power supply works)
58) what does it mean by PID control.
59) what are different types of Flip flops.
60) what is meant by quiescent current and what is the significance of it.
61) How does an instrumentation amplifier differs from normal operational amplifier
62) What are snubbers and how does they protect switching circuits.
63) What is sampling time and how to fix it.
64) What is Rogowski coil and what are its advantages over normal current transformer.
65) What is Ringing, Overshoot and Undershoot how to reduce them.
66) what is a relaxation oscillator.
67) what is hysteresis.
68) what are the different applications of comparators.
69) how does a Unijunction Transistor works.
70) how does programable unijunction transistor works.
71) what are the differences between ASIC, FPGA and CPLD.
72) how to select a network processor.
73) what is the difference between radiated emissions and conducted emissions how to detect and reduce them.
74) what are the different types of negative resistance devices and what are their applications.
75) What is the major application of Zener Diode.
76) When do we use Schottky diode.
77) what are the different types of flip flops.
78) what is the difference between flip flop and latch.
79) what are the types of errors in ADC and DAC’s.
80) what is Setup and Hold time of flip flop.
81) what is Race condition in flip flops.
82) What is the difference between RISC and CISC processors.
83) What is tri-state logic.
84) What is the difference between Hardware reset and Software reset.
85) How do you determine the response time of any circuit.[loop response]
86) What is an integrator how do design it.
87) What is a Differentiator design it.
88) What factors will impact the characteristic impedance of the PCB (Dielectric property of insulating material, Seperation between the planes, thickness of the trace.)
89) What are the advantages of using differential signal routing in PCB.
90) How do we make sure that the impedance matching between driver and reciever are maintained.
91) Different types of terminations and their advantages and disadvantages.
92) What is meant by microstip and stripline.
93) How do you decide the placement of components on PCB. i.e. where to route power signals, where to route clock signals, how to route digital signals and analog signals.
94) Why do we need a tie.
95) If suppose you have designed a PCB in which you have selected BGA components what is the care you take when routing. (hint:- Connect all ground pins of BGA IC through thermal Pad).
96) If you have decided to go for only two layer board how do you route power, signal and ground layers.
97) why do we need to route gnd in planes rather than a trace.
98) If we have both analog and digital circuitary on PCB what care we will take while grounding.(How doe we connect those grounds.i.e.through Ferrite bead or Jumper)
99) what does it mean by positive layer and negative layer.
100) What is meant by Solder Mask and Solder Paste.
101) How to decide on what components should be present in top layer and what compnents should be place in bottom layer.
102) what is meant by Reflow Soldering and when do we perform it.
103) what is meant by Wave Soldering what are the advantages and disadvantages of it.
104) what are different types of connectors.(i mean through hole and SMD and what care you need to take while placing them. usually place near to the end of PCB and never route any power signals below it.)
105) what are different types of gerbers.( Hint:-Basic gerber and Extended gerber the difference is in basic gerber all apertures are linked in different files where in in extended gerber all apertures are linked in a single file.)
106) On which side of the board soldering should be done first.
107) what are the different types of dielectric material used in PCB.( Hint:- FR4,HFR4).
108) different kinds of Vias in PCB ( normal via,blind via and burried via).
109) what is pulse width modulation and give some examples where we can use that concept.
110) what are different types of filters(single ended and differential filters you can also think in the way like low pass,high pass, band pass and band reject filters).
111) how does impedance mismatch in signal path effect.
114) why we should not route right angled traces.(right angled traces will act as antenna)
115) why do we call BJT as current controlled device and MOSFET as voltage controlled device.
116) what are active and passive devices.117) what are the differences between positive and negative feed back in amplifiers.
118) what are the advantages of using darlington pair of transistors.
119) what does it mean by light pipes give some examples where they can be used.
120) what are the different types of semiconductors (Hint:-direct band gap and indirect band gap)
121) what is thyrister and what are the applications of it.
122) Can you explain the applications of Zener diode, Tunnel diode, Schottky diodes.
123) what is the advantge of bridge rectifer when compared to full wave rectifier.(Hint:- The ouput polarity of bridge rectifier is always same irrespective of input polarity, hence when ever we change the supply polarity by mistake the output circuitary will not get effected)
124) what is Clipping and Clamping design a circuit which does the same.
125) why do we need to use heat sinks on certain components. what is the criterion to select a heat sink. (Hint:- Power dissipation is the main culprit)
126) why do we operate a MOSFET or BJT in saturation when we use them for switching purpose.
127) what is quiscent current.
128) what are the different types of oscillators.
129) what is thermal run away.
130) can you exaplain briefly on different types of packages of ICs. ( Ex: TO-92 etc..)
131) what is IGBT and what are the advantages of it.
132) what are different types of MOSFETs ( Hint:- Depletion type and Enhancement type)
133) How do we overcome common mode noise.( explain any preventive measures to be taken to avoid it)
134) what are the different types of noise.
135) What are buffers. what is the importance of using bufferes in any circuit. ( Hint:- Buffers usually will have high input impedance and low output impedance hence it will support to connect more loads at the output and it maintains the input voltage)
136) what are the different types of Analog to Ditial Converters.
137) what are the different types of Digital to Analog Converters.
138) what are the applications of unijunction transistor.
139) Can you give some examples of Voltage to Current converters.
140) What is offset voltage and why do we need to care about it while selecting an Op Amp.
141) What is meant by Thermocouple and how do what are the cares we need to take while carpturing the output of thermocouple and processing it.
142) what are different types of power supplies. (Hint:- Unregulated, regulated,linear, ripple regulated and switching).
143) What is Power Budgeting and How do we perform it. What are the things we will take into consideration while performing power budgeting.
144) what is PLL. Did you any time worked on Voltage controlled oscillators.
145) What is the most important Pin in any microcontroller. (Hint:- reset)
146) what is the difference between serial and parallel communication.
147) what is the difference between RS-232,RS-485 etc…
148) what care you should take while interfacing any microprocessor to memory.
149) what are different types of memory. ( Hint:-Static, dynamic etc.)
150) How do you select a SDRAM.
151) what is EEPROM.
153) Can you explain in brief about the difference between Switches and Bridges. and what are the advantages of each and when to use them.
154) What is JTAG. Did use any time used JTAG to debug any circuit and how it is useful.
155) Did you use any kind of Isolation Amplifiers.
156) How do you generate square wave from sine wave.
157) do you know what is mono stable multi vibrator and astable multi vibrator.
158) How do you provide transient voltage suppression.
159) Did you any time used digital or analog multiplexer.
160) how do you convert serial data to parallel data and vice versa.
161) What do you mean by Charge Pump.
162) what are the considerations to be taken while selecting a micro controller for a specific application.
163) How unity power factor circuit works.
164) what are the different grounding methods available in PCBs.
165) what is space vector control method. how is it different from pulse width modulation.
166) How is schmitt trigger comparator circuit is better than normal comparator circuit.
167) What is the difference between Hardware, Software and Firmware for particular application.
168) What is thermostat and its applications.
169) How to select magnetic shielding for particular components and why do you need shielding.
170) What is feed forward method and how is it helpful in predictive control circuits.
171) What are the different types of switched mode power supplies and what are their power ratings.
172) Why we should sepearte digital and analog grounds in a PCB.
173) How a MOV (metal oxide varistor) or TVS helps in protecting circuits.
174) How do you design sample EMI Filters.
175) What are the major causes for Radiated Emission. (Hint:- clock harmonics, improper terminations etc..)
176) What is wetting voltage.
177) What is dry contact.
178) what happens when a solder is dry solder.
179) what is a chattering contact.
180) What is the difference between hardware reset and software reset.
181) how to you implement line monitoring in any circuit.
182) what are the advantages/dis advantages of using NAND/NOR Flash.
183) What is the difference between SDRAM and DDR RAM.
184) What is memory banking.
185) How to set gain of an amplifier what are the parameters you need to consider while deciding gain.
186) How do you determine the stability of any system.(Hint:- Pole,zero etc..)
187) what is lead/ lag compensation.
188)How to improve/decrease the slew rate of OpAmp.
189) what are the different types of processor architectures (Hint:-Von neumann,Harvard )
190) what is the difference between 8085 and 8086. what are the major changes done to 8086.
191) what is miller effect.

Unir varios PDFs en Ubuntu

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 1:06 pm

Muchas veces queremos unir varios PDFs en un solo documento, en Linux Ubuntu tenemos un comando que nos permitira hacer esto muy facilmente. Este post lo he tomado de:

http://linuxesmas.blogspot.com/2007/10/leccin-manipular-pdfs.html

En primer lugar necesitaremos el programa pdftk y para ello pondremos:

$ sudo apt-get install pdftk

Esto no es un manual completo. Son los ejemplos más prácticos. Para ver el manual del comando pdftk pondremos:

$ man pdftk

Una vez instalado, y dependiendo lo que queramos hacer procederemos:
Las opciones más importantes son: cat (unir), burst (hace un archivo para cada página), background (le pone un fondo a partir de otro pdf pero el documento de entrada debe tener transparencia, es decir, no ser una imagen sino texto), stamp (pone marca de agua sobre el documento). Otras opciones a utilizar son allow (para dar permisos), input_pw, owner_pw, user_pw (para especificar contraseñas).

Quitar contraseña: pdftk secured.pdf input_pw contraseña output unsecured.pdf

Unir in1.pdf y in2.pdf en un nuevo PDF llamado out.pdf :

pdftk in1.pdf in2.pdf cat output out1.pdf
o (usando abreviaturas):
pdftk A=in1.pdf B=in2.pdf cat A B output out1.pdf
o (usando asteriscos):
pdftk *.pdf cat output combined.pdf

Quitar página 13 de in1.pdf al crear out1.pdf:
pdftk in.pdf cat 1-12 14-end output out1.pdf
o
pdftk A=in1.pdf cat A1-12 A14-end output out1.pdf

Unir dos archivos, uno de los cuales tiene contraseña:
pdftk A=secured.pdf 2.pdf input_pw A=contraseña cat output 3.pdf

Se ha de tener en cuenta que el archivo de salida no tendrá contraseña si no se especifica una. Que poner cualquier cifrado al documento quita todos los permisos del archivo de salida (serán ‘none’) a no ser que se especifiquen. Se pueden dar (o quitar) permisos si el documento está encriptado, o tiene contraseña del autor o del usuario. Si no está cifrado tendrá libertad de copiar e imprimir.

Noviembre 26, 2007

Crear un servidor SSH para administrar remotamente Windows

Archivado en: Linux Ubuntu Administracion — Abelardo Jara @ 8:55 pm

Una de las mejores caracteristicas para administracion remota de Linux es su servidor SSH que permite acceder a la computadora en forma remota y segura. Asimismo podemos ejecutar aplicaciones graficas X usando el programa SSH Secure Shell desde Windows.

Otros servicios de red pueden ser encapsulados dentro de un tunel SSH de modo que seran seguros (por ejemplo podemos encapsular VNC dentro del tunel SSH).

He hecho una  guia que les pongo abajo, pero con una correccion:

“sshd + cygwin : Sometime, I had to run sshd on a windows machine using cygwin. After following the install instructions (cache), when I do /usr/sbin/sshd, I get the error : /var/empty must be owned by root and not group or world-writable. To make sshd run, I had to edit the config file /etc/sshd_config so that “UsePrivilegeSeparation” is set to no. BTW, I also needed to do chmod og+r /etc/ssh_host_key, /etc/ssh_host_rsa_key and /etc/ssh_dsa_key. This is bad for security, but then, I got the job done. “

Aqui empieza el tutorial:

(1a) Logueate como administrador
(1b) Asegura que tu cuenta tiene un password
(2a) Create una carpeta llamada c:\cygwin

(2b) g Bajate cygwin’s setup.exe from http://www.cygwin.com/ y guardalo como setup.exe en c:\cygwin

Ejecutalo. Cuando te pregunte: “Just Me” o “All Users”, elige “All Users” (para todos los usuarios)Cuando te pregunte “Local Package Directory“, tipea c:\cygwin

Te saldra una lista de servidores de donde descargar. Elige uno que este cerca a tu pais.

A continuacion te saldra una lista grandota para elegir que paquetes de Cygwin quieres instalar. Es poco comoda de ver, asi que recomiendo elegir el boton arriba a la derecha que dice “View” presionalo hasta que diga al costado de ese boton “Full”. Asi te saldra la lista de todos los paquetes y es mas facil elegir.

Yo generalmente al instalar Cygwin instalo varias cosas como:

  • openssh
  • gcc y gdb (para compilar en C++)
  • tar
  • Todos los paquetes que digan en su inicio de nombre tetex (para tener el editor de documentos LaTeX, super bueno)
  • bash-completion (para que nuestros comandos se autocompleten cuando los tipeamos)
  • sqlite3 (para tener un entorno de bases de datos unipersonales, mejor que Microsoft Access – es compatible con Java)
  • X-startup-scripts (esto es lo mejor, tenemos un servidor X para ejecutar aplicaciones X bajo Cygwin)
  • xemacs (el editor emacs del Linux pero bajo Windows)
  • nano (un editor de consola muy facil de usar)

Tomate una taza de cafe :) g

(3) Despues de finalizar, hacemos click en “Mi PC”, Propiedades , Avanzado, Variables de entorno.
Click el boton “Nuevo” new para añadir a las variables del sistema:
nombre de la variable: CYGWIN
valor de la variable es ntsec tty
(4) Ahora alli mismo busca la variable que dice “Path”. Editala y añade en su final ;c:\cygwin\bin

(5) Ejecuta Cygwin con doble click sobre el icono del Cygwin sobre tu escritorio

Ahora ejecuta el siguiente comando: ssh-host-config


Cuando te pregunte: “privilege separation“, responde yes
Cuando te pregunte: “create local user sshd“, responde yes
Cuando te pregunte: “install sshd as a service“, responde yes

Cuando te pregunte: “CYGWIN=” responde ntsec tty

(6) Despues de este paso iniciamos el servicio ssh tipeando:

net start sshd
o

cygrunsrv –start sshd

(7) Debes asegurarte que todo usuario de Windows tenga un password, y que se haya logueado al menos una vez.

(8) important Despues de ese paso debes volver a ejecutar Cywgin para armonizar los datos de los passwords con cygwin, si no lo haces estos usuarios no se podran loguear remotamente:
mkpasswd -cl > /etc/passwd
mkgroup –local > /etc/group

mkpasswd creara un password tomando de la lista de usuarios de Windows’

(9) Prueba que todo funciona haciendo en una ventana del Cygwin:

ssh localhost

o

ssh tuusuario@127.0.0.1

Y deberia funcionar :)

(10) Si quieres conectarte desde otra computadora, deberas abrir un puerto en el Firewall de Windows, el 22, que corresponde al servidor de SSH.

Listo, tenemos un servidor/cliente SSH instalado en Windows.

Java vs C#: La licencia GPL vs los riesgos de ECMA en Mono y .NET

Archivado en: Reflexiones — Abelardo Jara @ 2:15 pm

Esta bien que tal vez sea un error el que Java sea GPL. Muy probablemente lo sea. A muchas empresas grandes como Apache no les ha caido bien. Pero Mono es un caballito de troya, o no? Por eso mi opcion va por Java (tambien por el lenguaje y sus APIs)

No soy un fanatico del software libre, aunque si me parece que es la opcion mas decente con respecto al sistema operativo. El sistema operativo y herramientas basicas de programacion DEBEN SER LIBRES. Otra cosa son los programas en si (alli en mi opinion si podriamos hacer negocio por propiedad intelectual). En ese sentido no estoy a favor de lo que dice Richard Stallman, el creador de las herramientas de programacion GNU GCC.

Miguel de Icaza ha declarado reiteradamente que las patentes necesarias para la aplicación de las normas ECMA – 334 (C #) y ECMA – 335 (CLI) están disponibles en Microsoft “RAND + Royalty Free”. Esto pareceria un permiso efectivo de uso de la patente abierta de C#, y motivaria mas usar Mono. Pero perdonen, yo aun he visto una declaración oficial de Microsoft que este aceptando este royalty free.

Incluso si aceptamos este RAND+Royalty Free para usar C#/CLI hay que tener un acuerdo de licencia con Microsoft. La razon por la cual Novell firmo el acuerdo de no demandas por violacion de patentes con Microsoft fue con el fin de no ganarse una demanda de Microsoft con respecto al C#/CLI. El mismo Miguel de Icaza (el creador y lider del proyecto Mono) dice que este acuerdo se extiende pero solo a los desarrolladores en plataformas Novell y clientes de Novell. Vease articulo (en ingles):

http://en.wikipedia.org/wiki/Mono_(software)

Siendo estrictos en terminos legales (por favor vean mi siguiente post) las empresas pueden usar C# y Mono solo si lo obtiene de Novell mediante Suse, pero no si lo obtiene o usa en Redhat, Ubuntu, (y distros que no hayan firmado este acuerdo con Microsoft) tiene la obligacion de tener un acuerdo de licencia con Microsoft. Y esto debido a que no existe ningun acuerdo de este tipo entre Microsoft y Ubuntu o Redhat. RAND + Royalty Free aun implica que las empresas que desarrollan distribuyen codigo en C# todavía tienen que obtener una licencia. Y una licencia puede estipular varias cosas (si queremos ser pesimistas, includo el escritorio Gnome si lo programaran en C#).

Aqui hay un texto que copio de Wikipedia y que lo dice Richard Stallman (el creador del GCC)

http://en.wikipedia.org/wiki/Mono_(software):

“Mono is a free implementation of Microsoft’s language C#. Microsoft has declared itself our enemy and we know that Microsoft is getting patents on some features of C#. So I think it’s dangerous to use C#, and it may be dangerous to use Mono. There’s nothing wrong with Mono. Mono is a free implementation of a language that users use. It’s good to provide free implementations. We should have free implementations of every language. But, depending on it is dangerous, and we better not do that. “

Pero me ire mas al lado tecnico. C# es muy bueno y no hay duda, pero solo es una opcion para Windows. El .NET Framework de Microsoft es mejor diseñado que la maquina virtual de Java y corre mas rapido en Windows, tambien. Pero eso es a respecto de la maquina virtual.Pero de alli a hablar que .NET con Mono es multiplataforma es muy diferente. .NET no es multiplataforma, Mono trata de brindar esta capacidad, pero Mono es una implementacion de maquina virtual nueva compatible con .NET, pero no es .NET.

La JVM es mas rapida en Linux y Windows que el Mono (lo afirmo por pruebas de performance y profiling en mis trabajos).

A nivel aplicaciones empresariales de nivel profesional esta por este momento solo Java (el mas utilizado a nivel empresas para multiplataforma, su documentacion y comunidad de desarrolladores es enorme). Que institucion o empresa de prestigio dicta o usa C# con Gtk, lo mas usado es Java o .NET pero no Gtk#. Ni siquiera puedes poner eso en tu CV.

Hablemos ahora del lenguaje y de los entornos de desarrollo: Java tiene una gran ventaja, los IDEs los tiene tanto en Windows y Linux y la calidad de ambos: Netbeans o Eclipse es muy alta. A la altura del Visual Studio. Monodevelop para desarrollar con Mono en Linux es por ahora y lo digo por experiencia (mis aplicaciones compiladas con Mono tienen cierres imprevistos, no corren como esperado en Windows, etc) es por ahora muy verde.

Java tiene ahora una gran madurez de programar donde sea y ejecutar en donde sea. Por ejemplo, yo programo Java sobre Linux con Eclipse y Netbeans y la aplicacion funciona sobre Windows igual de bien. Adicionalmente mis herramientas de desarrollo trabajan como es exigido en un entorno profesional (sin cuelgues ni fallos inesperados). Y ademas dado que Java ahora integra una infinidad de tecnologias que ahorita son las mas fuertes de Internet(XML, RMI, Beans, SOA, etc) y todo desde el mismo lenguaje, pues es bastante comodo al momento de desarrollar.

Mono es ademas aun una implementacion incompleta de la API .NET. Su grupo de desarrollo esta trabajando recien en la implementacion de la API .NET 2.0 (aun inconclusa), mientras en Visual Studio ya van por la API 3.0. Las principales funciones no implementadas completamente son las API de Windows Forms, ASP. NET y ADO. NET. Estos tres frameworks y es importante decirlo no estan dados a ECMA, por tanto Microsoft puede perfectamente demandar al proyecto Mono por violacion de patentes. Microsoft solo ha dado a ECMA C# y el CLI.

Una alternativa a no usar la API de Windows Forms es usar una API libre desarrollada por el proyecto Mono llamada GTK# para hacer formularios. No existe un IDE visual aun comodo para programar diseñar formularios excepto el Glade (que no es comodo para muchos). Si nuestra decision nos impulsa a programar con Mono y GTK# (para no usar Windows Forms en la esperanza de libranos de los problemas de licencia con Microsoft) tenemos a disposicion dos IDEs: Sharpdevelop en Windows o Monodevelop en Linux. Sin embargo, ambos (sobre todo el Monodevelop) no estan a la altura ni cerca del Netbeans o Eclipse (ambos libres) o del Visual Studio, asi que si por madurez y si uno opta por una aplicacion profesional y no para experimentos, recomiendo Java. He probado Monodevelop en Ubuntu Gutsy (anda por la version 0.16) y es muyyy lento. Y su creador de interfaces GUI, Stetic tambien (recien anda por la version 0.1). El debugger tambien es muy malo aun. Asi que estamos hablando de herramientas muy inmaduras, no recomendables si estamos programando en entornos que requieren herramientas realmente profesionales.

Ventajas de Java
1. Para personas que se inician Java+Netbeans es directo para aprender (en universidades, institutos, etc). A ver si Mono+Gtk# lo es. O habra que ver si instituciones de entrenamiento con prestigio o empresas grandes se deciden a programar en Mono+Gtk# (algo experimental) en lugar de .NET+Windows Forms o Java+Swing? (lo harian?)

2. Hay montones (literalmente) de librerias de clases disponibles en Java. Muchas de ellas son open-source (parece que los fanaticos de Microsoft, decir open-source es como una vulgaridad).

3. Java tiene un conjunto de APIs totalmente multiplataforma, incluso para GUIs, multimedia, graficos, 3D, voz, telefonia mobil, y todas las futuras APIs (muy faciles de usar) seguiran siendo multiplataforma (Windows, Linux, …) Mono no tiene estas APIs, asi que hablar de multiplataforma con Mono es inmaduro. Microsoft usara seguro Direct Sound en C# y eso no es ni a balas multiplataforma.

4. Swing esta muy bien diseñada y usa los patrones de diseño MVC, en lo que se cae completamente Windows Forms.

5. Java es mucho mas utilizado a nivel de estudiantes de postgrado con base solida en programacion orientada a objetos (OOP).

6. Aunque no esta reconocida por un estandar internacional, Java es open-source controlado por por Sun y los miembros del JCP (los cuales son muchos, entre ellos Intel, Google, Samsung, Redhat, sino mira
http://jcp.org/en/home/index
). C# es un estandar tipo ECMA pero aparte de Microsoft pocas otras empresas han decidido implementarlo. Sun ademas segrega mucho menos que Microsoft con respecto a sus productos.

7. Otra cosa: el estandar C#/CLI ECMA solo es un subconjunto del framework .NET. Habra que ver si Microsoft decidira si enviara para estandarizacion las futuras APIs de .NET. (LO HARA?Huh?)

Como nota final: miren nomas lo que dice Chris Williams, director de desarrollo de productos de Microsoft, que ellos aceptan la pirateria para motivar que la gente se familiarize con Microsoft y de alli al ocurrir eso pueden presionar con las leyes y obtener ganancias solo si ven que sera rentable (que tactica tan noble no?):

http://64.233.179.104/translate_c?hl=es&langpair=en%7Ces&u=http://www.corporatewatch.org.uk/newsletter/issue13/issue13_part1.htm&prev=/language_tools

Noviembre 25, 2007

Desarrollando con Mono y SharpDevelop en Windows

Archivado en: Programacion en C Sharp con Mono — Abelardo Jara @ 8:07 pm

Antes de seguir esta guia, recomendaria leer:

http://pintucoperu.wordpress.com/2007/11/26/la-licencia-gpl-de-java-vs-mono-y-net/ Si definitivamente necesitamos programar en Mono y C#, tenemos dos opciones: Usar el IDE para Linux llamado MonoDevelop o su version para Windows llamado SharpDevelop.

No aconsejo MonoDevelop ya que es lentisimo, y esta bastante inmaduro. Su editor de formularios esta en la version 0.1.

Personalmente recomendaria usar la version de Windows llamada SharpDevelop (tambien open-source). Si desarrollan sus programas en SharpDevelop con el compilador de Mono para Windows, muy seguro el programa correra sin problemas usando Mono Runtime en Linux.

Sharpdevelop permite además usar la API Windows Forms de .NET 2.0 para crear nuestros formularios. Sin embargo el compilador multiplataforma Mono aún no tiene implementada la API de Windows Forms completamente, por lo que se aconseja desarrollar nuestros GUIs usando un framework libre llamado Gtk# que está basado en Gtk+. Gtk# viene como parte del compilador Mono para Windows, ademas de un editor visual de formularios llamado Glade (version 3).

Aquí adjunto las instrucciones para instalar Mono y Sharpdevelop las cuales las he tomado del siguiente blog:

http://johansoft.blogspot.com/2007/04/mono-y-sharpdevelop-en-windows.html

Para desarrollar aplicaciones con Mono en Windows utiliza SharpDevelop y Mono, aqui explicare como hacerlo y que problemas resultan asi como tambien la solucion.

INSTALACION

1) Instalar el Mono y SharpDevelop:

Instalar .NET Framework 2.0, 22.4 MB: SharpDevelop 2 utiliza .NET 2.0.

Instalar SharpDevelop 2, 8.63 MB: Al instalar SharpDevelop no se instala automaticamente Mono, la instalacion de Mono sigue siendo obligatoria.

Instalar Mono, 48.9 MB: El link lleva a la pagina de todas las descargas de mono, deben elejir en la seccion “Windows Installer Windows 2000 and above” y el instalador para la version Stable, para el momento que se escribio este blog era la version Mono 1.2.3.1_0 Setup (Stable). El instalador de mono les preguntara el puerto donde se instalar XSP, el hecho de que tenga un puerto predeterminado no quiere decir que se iniciara automaticamente, el uso de XSP en Windows es Manual.

PROBLEMAS DESPUES DE LA INSTALACION Y COMO RESOLVERLOS

Al crear un proyecto de GTK# o libreria mono se encontraran con un problema, el error es el siguiente de acuerdo al tipo de proyecto que crearon:

Proyectos en Mono 1.1:

“Mcs.exe” exited with code -1.

Proyectos en Mono 1.2:

“Gmcs.exe” exited with code -1.

La solución es agregar una variable de entorno (de sistema) a Windows llamada “MONO_EXTERNAL_ENCODINGS” y con el valor “default_locale” (sin comillas).

Para establecer la variable de entorno no utilice el comando SET, en vez de eso, realice la operacion usando la interfaz grafica haciendo click derecho en el icono de Mi PC->Propiedades.

Ejemplo:

Lo siguiente es anexar a la variable PATH la ruta de instalacion de los binarios de Mono Runtime. Recuerden colocarle un punto -y- coma(;) al final del valor actual de la variable si antes no lo tenia y anexen la ruta a la carpeta “bin” de la instalacion de mono, para mi caso es “C:\Archivos de programa\Mono-1.2.3.1\bin”.

Ejemplo:

Le damos click al boton Aceptar para establecer los nuevos valores.

Reinicien SharpDevelop e intenten compilar el proyecto y veran como todo funciona :)

Establecer claves foraneas e integridad referencial en SQLite

Archivado en: Bases de datos — Abelardo Jara @ 3:37 pm

SQLite es un excelente motor de bases de datos unipersonales, parecido a Access. Tiene versiones para Windows y Linux y tiene interfaces para muchos lenguajes de programacion como Java, C++, Perl, PHP, ADO .NET

La gran ventaja es que nuestra aplicacion se puede distribuir con el motor SQLite instalado dentro de ella (embebido) asi que el cliente no tiene que configurar nada en su maquina (ODBC, instalar y configurar Postgres, MySQL, SQL Server etc), solo correr nuestra aplicacion.

SQLite parsea claves foraneas e integridad referencial en la definicion del esquema, pero no hace nada con ellas ni las incluye en la metadata.

La solucion mas usada es usar triggers. En este post de otro blog encontre la solucion al problema:

Tomado de: http://www.justatheory.com/computers/databases/sqlite/

Aqui empieza:

After some some Googling and experimentation, I’ve figured out how to enforce foreign key constraints in SQLite. I got most of the code from Cody Pisto’s sqlite_fk utility. I couldn’t get it to work, but the essential code for the triggers was in its fk.c file, so I just borrowed from that (public domain) code to figure it out.

Since I couldn’t find documentation for this elsewhere on the Net (though I’m sure it exists somewhere), I decided to just put an example here. Interested? Read on!

Say you have these two table declarations:

create table foo (

  id INTEGER NOT NULL PRIMARY KEY

);CREATE TABLE bar (

  id INTEGER NOT NULL PRIMARY KEY,

  foo_id INTEGER NOT NULL

         CONSTRAINT fk_foo_id REFERENCES a(id) ON DELETE CASCADE

);

Table bar has a foreign key reference to the primary key column in the foo table. Although SQLite supports this syntax (as well as named foreign key constraints), it ignores them. So if you want the references enforced, you need to create triggers to do the job. Triggers were added to SQLite version 2.5, so most users can take advantage of this feature. Each constraint must have three triggers: one for INSERTs, one for UPDATESs, and one for DELETESs. The INSERT trigger looks like this:

CREATE TRIGGER fki_bar_foo_id

BEFORE INSERT ON bar

FOR EACH ROW BEGIN

  SELECT CASE

     WHEN ((SELECT id FROM foo WHERE id = NEW.foo_id) IS NULL)

     THEN RAISE(ABORT, ‘insert on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

(You can put the RAISE error string all on one line; I’ve concatenated two lines to keep line lengths reasonable here.) If your foreign key column is not NOT NULL, the trigger’s SELECT CASE clause needs to an extra case:

CREATE TRIGGER fki_bar_foo_id

BEFORE INSERT ON bar

FOR EACH ROW BEGIN

   SELECT CASE

     WHEN ((new.foo_id IS NOT NULL)

           AND ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL))

     THEN RAISE(ABORT, ‘insert on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

The UPDATE statements are almost identical; if your foreign key column is NOT NULL, then do this:

CREATE TRIGGER fku_bar_foo_id

BEFORE UPDATE ON bar

FOR EACH ROW BEGIN

   SELECT CASE

     WHEN ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL))

     THEN RAISE(ABORT, ‘update on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

And if NULLs are allowed, do this:

CREATE TRIGGER fku_bar_foo_id

BEFORE UPDATE ON bar

FOR EACH ROW BEGIN

   SELECT CASE

     WHEN ((new.foo_id IS NOT NULL)

           AND ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL))

     THEN RAISE(ABORT, ‘update on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

The DELETE trigger is, of course, the reverse of the INSERT and UPDATE triggers, in that it applies to the primary key table, rather than the foreign key table. To whit, in our example, it watches for DELETEs on the foo table:

CREATE TRIGGER fkd_bar_foo_id

BEFORE DELETE ON foo

FOR EACH ROW BEGIN

  SELECT CASE

    WHEN ((SELECT foo_id FROM bar WHERE foo_id = OLD.id) IS NOT NULL)

    THEN RAISE(ABORT, ‘delete on table "foo" violates foreign key ‘

               || ‘ constraint "fk_foo_id"’)

  END;

END;

This trigger will prevent DELETEs on the foo table when there are existing foreign key references in the bar table. This is generally the default behavior in databases with referential integrity enforcement, sometimes specified explicitly as ON DELETE RESTRICT. But sometimes you want the deletes in the primary key table to cascade to the foreign key tables. Such is what our example declaration above specifies, and this is the trigger to to the job:

CREATE TRIGGER fkd_bar_foo_id

BEFORE DELETE ON foo

FOR EACH ROW BEGIN

    DELETE from bar WHERE foo_id = OLD.id;

END;

Pretty simple, eh? The trigger support in SQLite is great for building your own referential integrity checks. Hopefully, these examples will get you started down the path of creating your own.

Cual usar? Java o C# Mono .NET o C++ con wxWidgets para desarrollo multiplataforma.

Archivado en: Reflexiones — Abelardo Jara @ 2:24 pm

Java y .NET tienen aspectos similares y cosas diferentes. Java es un lenguaje que se compila para correr en una maquina virtual JVM. Esta maquina virtual corre en casi cualquier sistema operativo: Windows, Linux, UNIX, Solaris, hasta en dispositivos mobiles. Es realmente fantastico ya que el mismo proyecto ya compilado como archivo .class o mejor .jar correra en cualquier otro sistema operativo sin ningun tipo de recompilacion. Basta con que des el archivo .jar y ya tienes una aplicacion completamente distribuitble. Incluso ademas si la combinas con las librerias SQLite puedes tienes en un tiro una aplicacion con base de datos totalmente portable y que se ejecutara en cualquier sistema operativo.

.NET no es multiplataforma y eso es algo que es importante resaltar. Hay un proyecto llamado Mono que hace los programas compilados con .NET corran sobre Linux y UNIX pero te sere sincero, todavia hay muchos cuelgues (te lo digo por experiencia propia). Este proyecto Mono incluye un compilador (2 versiones: mcs para net 1.1 y gmcs para net 2.0) y una maquina virtual (llamada mono) y es organizado por Miguel de Icaza. Mono es una maquina virtual que emula al .NET y trata de emular a Java en ser multiplataforma. Pero el estado de Mono es a verdad incompleto sobre todo en el paquete Windows Forms que no esta completamente portado y es inestable. Recuerda que aqui hay mucho trabajo de ingenieria inversa y eso siempre sera muy lento.

.NET aporta funcionalidad en que es posible ejecutar e interoperar diversos fragmentos de código escritos en distintos lenguajes, esto es, si codigas en C# o VisualBasic o J# todos estos lenguajes serán convertidos al lenguaje intermediario MSIL(“Microsoft Intermediate Language”) a través de un compilador determinado, este lenguaje intermediario es el que ejecuta el .Net Framework, de esta manera su código escrito en más de 20 lenguajes podrá interoperar. El codigo compilado desde cualquier lenguaje es compilado para correr sobre una maquina virtual que es el .NET Framework.
Mono trata de implementar este .NET framework.

Entonces aunque ambas son maquinas virtuales, la JVM y la .NET Framework son diferentes tambien, una es multiplataforma y la otra es solo para Windows. Una diferencia mas es que JVM es desde hace poco open-source desde que Sun la libero, asi que ahora es controlada ahora en su desarrollo por la comunidad y .NET si es controlada completamente por Microsoft.

Personalmente te aconsejaria ir por Java, dado que .NET es una plataforma privativa y siempre en el fondo estaras amarrado a Microsoft. Para Java tienes entornos de desarrollo muy bueno como Netbeans y Eclipse (ambos corren en Windows, Linux, etc). Ademas paquetes con clases en Java hay a montones, que te permiten hacer casi cualquier cosa, incluso un compilador para tu propio lenguaje (clases JLex y Java CUP). Conexion para base de datos las tienes con JDBC que te permite conectarte a casi cualquier gestor de base de datos: Postgres (la mejor base de datos libre), MySQL (tiene defectos en respecto a relaciones por sus tablas de tipo ISAM), SQLite (la mejor opcion si quieres hacer una base de datos de un solo usuario igualito que Microsoft Access y gratis), Oracle (que tiene una edicion libre personal para Linux y Windows)

Yo he comparado la performance actual en Linux Ubuntu de una aplicacion de ordenamiento de burbuja midiendo tiempo promedio y usando en cada medida un vector de 100 elementos con datos al azar, usando para compilarla el compilador C++ libre GNU, el compilador Intel C++ para Linux (libre tambien y se puede descargar de Internet), el compilador Java 1.6 y finalmente el compilador de Mono gmcs (para .NET 2.0) y los resultados son con respecto a performance:
de mejor a mas lento
1. Intel C++ Compiler y GNU g++ (empate, promedio de 0.24s para el algoritmo, ambos compilan a codigo maquina, puse nivel de optimizacion -O2)
2. Java 1.6 (promedio 0.34s)
3. Mono (usando gmcs para compilar y mono para correr: promedio 0.43s)

Algo interesante, he probado los tiempos tambien en Windows y los tiempos en Linux y son practicamente iguales, lo que indica que la JVM es superior a Mono en ambos sistemas. No he podido probar con Visual C++ 2005 asi que no podria decir si en codigo nativo en Windows es superior o igual o inferior a Linux. (bueno estoy añadiendo esto, la performance del compilador de Visual C++ usando tambien optimizacion -O2 me dio resultados superiores al compilador GNU GCC en Windows, pero la version en Windows del GCC es la 3.4 mientras que en Linux estan por la 4.2).

Algo interesante es que los archivos ejecutables en Linux en todos los casos fueron bastante más pequeños que en Windows. Asimismo el compilador de Intel me produjo un ejecutable bastante mas grande que el generado por el GCC, pero esto se debe sobre todo a técnicas de optimización agresivas del compilador de Intel como “loop unrolling” (recuerden que estas técnicas parecen sensacionales pero algunas como “speculation” hacen que el programa consuma mas wattios).

Si quieres aplicaciones que compilen a codigo nativo tanto en windows como en Linux hay ademas un framework para C++ que se llama wxWidgets. Se programan con un IDE para C++ que trabaja tanto en Windows como Linux que se llama Code::Blocks. Es muy bueno y puedes construir aplicaciones graficas en minutos. Personalmente lo uso cuando quiero que mis aplicaciones sean muy rapidas ya que no compila a ninguna maquina virtual. Las clases provistas por la wxWidgets se parecen muchisimo a las MFC (Microsoft Foundation Classes) del Visual C++ asi que aprenderlas es muy directo. Las librerias wxWidgets tambien son libres y el Code::Blocks tambien. Para aplicaciones multiplataforma que quieres que sean de alta velocidad te las recomendaria sobre las librerias GTK y sobre las Qt (Qt no son gratuitas en Windows)

Finalmente mi recomendacion para aplicaciones con rapido tiempo de desarrollo, multiplataforma pero de verdad (no como con Mono), y que no estaras dominado a la larga por las decisiones de Microsoft, entonces usa Java + Netbeans + Swing + (Postgres o SQLite). No tendras que pagar a nadie por las herramientas de desarrollo y correra en cualquier plataforma: Windows, Linux (Ubuntu) o UNIX (PC-BSD). No aconsejo MySQL al menos por ahora (ya que la tabla por defecto ISAM no hacepta llaves foraneas e integridad referencial, el nuevo tipo de tabla InnoDB si).

Ahora si quieren hacer una aplicacion con alta performance compilado a codigo nativo, recomendaria usar Code::Blocks Nightly Build + GNU Compiler + WxWidgets 2.8

Visiten mi blog www.pintucoperu.wordpress.com
Muchos saludos,
Abelardo

Compilar Latex directamente desde editor VI

Archivado en: EMACS y edicion de documentos con Latex — Abelardo Jara @ 4:53 am

Este es un truco que no sabia para compilar directamente desde el editor de consola Vi de Linux:

Para compilar dentro del vi mandamos el comando

:!latex archivo

Incluso podemos visualizar dentro del vi
:!xdvi archivo &

Realmente muy buen truco para programadores.

Noviembre 24, 2007

Programacion con C#: Windows Forms con Mono en Ubuntu

Archivado en: Programacion en C Sharp con Mono — Abelardo Jara @ 11:17 pm

Para ver como compilar un codigo con Windows Forms en C# en Ubuntu, primero debemos instalar las librerias de Windows Forms. No estan completamente implementadas pero son usables.

apt-get install libmono-winforms1.0-cil libmono-winforms2.0-cil

Ahora si podemos crear un primer programa:

gedit ejemplo1.cs

Tipeamos lo que sigue:

using System;
using System.Windows.Forms;

public class ejemplo1
{
public static void Main(string[] args)
{
MessageBox.Show(“Hello World!”);
}
}

Despues de grabar compilamos el programa:

gmcs Main.cs -r:System.Windows.Forms -out:programa.exe

Finalmente lo ejecutamos con:

mono programa.exe

Listo, deberia aparecernos una ventanita de bienvenida :)

Si quieren algo mas sofisticado, puedenprobar con este codigo mas complejo que les pongo abajo:

using System;
using System.Windows.Forms;

namespace HelloClickWorld {
public class Hello : Form {
public static void Main (string[] args) {
Application.Run (new Hello ());
}

public Hello ()
{
Button button = new Button ();
button.Text = “Click…”;
button.Click += new EventHandler (Button_Click);
Controls.Add (button);
}

private void Button_Click (object sender, EventArgs e)
{
MessageBox.Show (“Hello Click World!”);
}
}
}

Usar Stopwatch para medir performance de Mono y C# en Ubuntu

Archivado en: Programacion en C Sharp con Mono — Abelardo Jara @ 11:13 pm

En .NET 2.0 y disponible tambien en Mono tenemos la clase System.Diagnostics.Stopwatch que nos permite medir con milisegundos el tiempo transcurrido en un periodo.

Ejemplo:
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
System.Threading.Thread.Sleep(100);
watch.Stop();
System.Console.WriteLine(“Transcurrido: {0}”, watch.ElapsedMilliseconds);

Realmente util no? Hace tiempo habia implementado uno para medir los tiempos de ejecucion pero este esta sencillo y practico.

Si queremos compilar este codigo en Ubuntu debemos instalar mono-gmcs

Con ello tendremos el compilador gmcs que soporta Mono 1.1 y 2.0

Si instalamos mono-mcs solo podremos compilar Mono 1.1

Creando un programa “Hola Mundo” con C# en Linux con Mono

Archivado en: Programacion en C Sharp con Mono — Abelardo Jara @ 10:51 pm

Vamos a ver como instalar Mono (compilador y maquina virtual) para correr un programa en C# en Ubuntu Linux.

Primero instalamos mono:

apt-get install mono mono-mcs mono-gmcs

mono-mcs es el compilador para .NET 1.1 y mono-gmcs es el compilador para .NET 2.0. Recomiendo usar gmcs.

Luego creamos nuestro programa:

gedit helloWorld.cs

Y ponemos como codigo:

using System;
namespace helloWorld
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(”Hello World!”);
}
}
}

Guardamos el codigo, luego compilamos y corremos nuestra aplicación.

$gmcs helloWorld.cs
$mono helloWorld.exe
Hello World!

Si no nos gusta ver archivos con terminación “*.exe” en nuestro linuxito Gutsy, renombramos el archivo recién generado.

$mv helloWorld.exe helloWorld
$mono helloWorld
Hello World!

Un pequeño consejo final acerca de IDE’S para programar aplicaciones mono: SharpDevelop en Windows. Me parece muy bueno. No recomendaria Monodevelop en Linux (esta en desarrollo y es muyyy lento).

Entradas más antiguas »

Blog de WordPress.com.