JorgeOrtiz’s Weblog

Algunos temas de Investigación en Social Network Analysis.

Posted by: jorgeortiz1 on: December 2, 2008

    Leyendo acerca de SNA, he encontrado este listado de temas de investigación en ésta interesante área.
    Todos son temas muy interesantes a mi parecer, y estaré profundizando mas en algunos de ellos, algo conozco acerca de minería web para clickstreams buscando reconocer tendencias de los usuarios de los sitios web referentes a la preferencia de imágenes o texto en las paginas web. He aquí el listado de temas de investigación.
  • Descubrimiento de comunidades y análisis a gran escala de redes sociales online y offline.
  • Personalización para búsquedas y para interacción social.
  • Recomendaciones para adquisición de productos, información de adquisición y establecimiento de relaciones sociales.
  • Protección de datos dentro de las comunidades
  • Detección de mal comportamiento en comunidades.
  • Algoritmos de minería web para clickstreams, documentos y corrientes de búsqueda
  • Preparación de datos para la minería web
  • Patrones de presentación para usuarios finales y expertos
  • evolución de patrones en la web
  • dinámica y evolución de patrones de redes sociales, predicción de tendencias.
  • análisis de redes sociales contextuales
  • análisis temporal sobre topologías de redes sociales.
  • algoritmos de búsqueda sobre redes sociales
  • modelado y análisis de redes sociales basados en multiagentes.,
  • Aplicación de análisis de redes sociales
  • detección de anomalías en la evolución de  redes sociales.

Lista de Papers del evento de ACM:

http://workshops.socialnetworkanalysis.info/SNAKDD2008/

SNA-KDD Workshop

Workshop on Social Network Mining and Analysis

Lista de Papers del evento:

Regular Papers

1. Rongjing Xiang and Jennifer Neville. Pseudolikelihood EM for Within-Network Relational Learning

2. Debora Donato, Stefano Leonardi and Mario Paniccia. Combining Transitive Trust and Negative Opinions for better Reputation Management in Social Networks

3. Arindam Banerjee and Sugato Basu. A Social Query Model for Decentralized Search

4. Mark Goldberg, Malik Magdon-Ismail, Stephen Kelley, Konstantin Mertsalov and William
Wallace. Communication Dynamics of Blog Networks

5. Vikas Bahirwani, Doina Caragea, Waleed Aljandal and William Hsu. Ontology Engineering and Feature Construction for Predicting Friendship Links in the Live Journal Social Network

6. Nishith Pathak, Colin DeLong, Arindam Banerjee and Kendrick Erickson. Social Topic Models for Community Extraction

7. Santi Phithakkitnukoon and Ram Dantu. Adequacy of Data for Characterizing Caller Behavior

8. karl branting. Overcoming Resolution Limits in MDL Community Detection

9. Ralf Klamma and Christian Haasler. Wikis as Social Networks: Evolution and Dynamics

10. Zhao Xu, Volker Tresp, Shipeng Yu and Kai Yu. Nonparametric Relational Learning for Social Network Analysis

11. Barna Saha and Lise Getoor. Group Proximity Measure for Recommending Groups in Online Social Networks

Poster Papers

1. Hoda Eldardiry and Jennifer Neville. A Resampling Technique for Relational Data Graphs

2. Habiba, Yintao Yu, Tanya Berger-Wolf and Jared Saia. Finding Spread Blockers in Dynamic Networks

3. Rumi Ghosh and Kristina Lerman. Community Detection using a Measure of Global Influence

4. Elena Zheleva, Lise Getoor, Jennifer Golbeck and Ugur Kuter. Using Friendship Ties and Family Circles for Link Prediction

5. Brian Gallagher and Tina Eliassi-Rad. Leveraging Label-Independent Features for Classification in Sparsely Labeled Networks: An Empirical Study

6. Miklos Kurucz, Andras A. Benczur and Attila Pereszlenyi. Large-Scale Principal Component Analysis on LiveJournal Friends Network

7. Steffen Oldenburg (@web.de), Martin Garbe, Clemens Cap and Lukas Zielinski. Comparative analysis of tag suggestion algorithms

8. Pelin Angin and Jennifer Neville. A Shrinkage Approach for Modeling Non-Stationary Relational Autocorrelation

Tags:

Esta es una propuesta general inicial para la organización de Células académicas de Microsoft.

Inicialmente quiero dar a conocer los 3 principios por los cuales se rigen las iniciativas orientadas a la comunidad de Microsoft.

Resumen tomado del Post de Roberto Erazo:

http://robertoerazo.wordpress.com/2008/08/15/oportunidades-microsoft-para-la-academia/

1. Proyección:

Este principio pretende dar una visión aproximada de la realidad de la industria, por medio del planteamiento de las diferencias entre las instituciones educativas y el sector empresarial.

Como estrategias para la aplicación de éste principio se plantea la generación de charlas con expertos en la industria,  orientadas a las comunidades académicas, además de posibles visitas empresariales a las instalaciones de Microsoft en Colombia, y otros.

2. Formación:

Microsoft tiene unos programas orientados a la formación académica de los interesados en sus productos. Para obtener información de punta nos podemos dirigir a:

http://msdn.microsoft.com

http://technet.microsoft.com

Microsoft también cuenta con otros programas orientados a la capacitación introductoria, estos programas son:

Desarrollador Cinco Estrellas

Profesional Cinco Estrellas

Microsoft Virtual Academy

3. Reconocimiento:

Microsoft tiene una serie de reconocimientos a las personas de la academia que por el interés personal o grupal en tecnologías se destacan, el reconocimiento puede ser por medio de premios o títulos de reconocimiento como MSP o MVP o certificaciones.

Teniendo en mente los principios mencionados, he querido plantear unos objetivos y estrategias orientados a grupos o Células Académicas .Net…

Objetivo 1: Fomentar la formación tecnológica de los integrantes, construyendo una comunidad colaborativa que gire en torno a temas relacionados con tecnologías Microsoft.

Estrategias:

- Conformación de líneas de Interés (ej: Juegos, Aplicaciones Móviles, Aplicaciones Web, Bases de Datos, etc)

Estas líneas de interés deberían ser el motor principal de la Célula y estarían enfocados en generar recursos como:

+ Cursos Básicos orientados a la comunidad

+ Tutoriales

+ Webcasts

+ Posts en Blogs

+ Charlas, etc.

- Gestionar y facilitar recursos obtenidos a los integrantes como:

+ Libros

+ Sw

+ Vouchers

Objetivo 2: Buscar estímulos (premios) de reconocimiento ofrecidos a los integrantes de la Célula, como producto del esfuerzo de estos en su propia formación tecnológica.

Estrategias:

- Divulgación del trabajo o producción de los integrantes del grupo en organizaciones como INETA, Microsoft Academic, buscando que estos sean reconocidos en estas comunidades.

- Estimular la participación en eventos como Imagine Cup.

- Ofrecer la posibilidad de obtener reconocimientos como MSP o MVP a los integrantes que hagan mérito para ello.

Objetivo 3: Promover una proyección real de los integrantes de la Célula de lo que es la realidad del sector empresarial en contraste con la academia.

Estrategias:

- Posibilitar eventos de divulgación de aspectos relacionados con la realidad empresarial como:

+ Institucionalización de Evento Generations.

+ Búsqueda de eventos con participación de oradores expertos de Microsoft

+ Búsqueda de oradores con temas de tecnologías de punta en la industria del software.

Planteamiento de Estructura Organizacional

Core Group…

Conformación de un Core Group (5 personas), encargado de la toma de decisiones importantes del grupo y el responsable de dar el impulso que mantenga vivo al grupo.

Cualquiera que haga méritos puede ser miembro de este grupo puede serlo, y quien por alguna razón no tenga tiempo para las actividades puede ser relevado en cualquier momento por un miembro activo.

Miembros Activos…

Personas que quieren pertenecer al grupo y que manifiestan su interés participando en las actividades de las líneas, reuniones, etc.

Definición de roles y actividades fijas

- Difusión Web

- Reportes a Ineta y Score Card.

- Lideres de Lineas de Interes e Integrantes.

Políticas de dinámicas Grupales

- Acerca de las reuniones:

+ Definidas por el Core Group

+ Cortas y solo las necesarias

+ Siempre con agenda y con el menor numero de gente posible.

- Acerca de los Eventos:

+ Definición de Maximo 3 eventos grandes por año.

* solicitud de training kits y premios con por lo menos 1 mes de anticipación.

- Acerca de los Recursos.

+ Inventario de libros y sw propiedad de la célula.

+ Recolección y organización de formatos para eventos, solicitud de recursos, score cards, encuestas, etc.

- Acerca de la difusión de la producción interna.

+ por medio de posts en el sitio de la Célula

+ Reportes a Ineta y Microsoft Academics

…Algunos puntos deben ser profundizados pero es un buen comienzo para plantear unas políticas de grupo y la razón de ser de este tipo de comunidades.

Windows Azure.

Posted by: jorgeortiz1 on: November 21, 2008

El objetivo de Windows Azure es proveer una plataforma y un set de herramientas a los desarrolladores que quieren escribir aplicaciones que corren parcialmente y/o completamente en un datacenter remoto.

Así es como se ve Windows Azure desde el punto de vista arquitectural:

azure

La capa cero: la cual no está en la figura, es como la capa de abstracción de hardware de Windows, en este caso el nivel mas bajo que interactúa directamente con los servidores.

La capa uno: es la base del sistema operativo Azure, su nombre código solía ser “Red Dog”, y a alto nivel Red Dog está formado por cuatro pilares:

  • Almacenamiento. (como un sistema de archivos)
  • Fabric Controller. (este es como un sistema de gestión para modelado, despliegue y abastecimiento.)
  • Virtualized Computation.
  • Ambiente de desarrollo. (El cual permite a los desarrolladores emular Red Dog en sus equipos y escribir Cloud Apps desde Visual Studio, Eclipse o otras herramientas.)

La manera como Red Dog está construido es que Microsoft solamente tiene que desplegarlo en un solo servidor y múltiples instancias de este pueden ser duplicadas sobre el resto de servidores en la nube usando tecnología de virtualización.

La capa dos: es un conjunto de bloques de servicios que corren encima de Azure.

La capa tres: son las aplicaciones Azure albergadas. Algunas de estas son aplicaciones creadas por microsoft como Sharepoint Online, Exchange Online, Dynamics CRM Online y otras serán desarrolladas por terceras partes.

Microsoft está prometiendo versiones de sus aplicaciones empresariales ofrecidas desde la nube. Se escucha que los servicios Live de Microsoft están siendo migrados para correr sobre Azure, hasta ahora la única aplicación Live de Microsoft en Azure es Live Mesh, y la próxima será Live Meeting.

Reality Mining and Psychohistory

Posted by: jorgeortiz1 on: November 18, 2008

I´ve always been interested in science fiction, I grew up reading Isaac Asimov and Ray Bradbury books, with the time everything seems to be more possible and things that used to be fiction are right now just real; reality mining appears to my eyes as a way to do real social networking stimulation (SNS), I can still remember the concept of psychohistory:

While one cannot foresee the actions of a particular individual, the law of statistics as applied to large groups of people could predict the general flow of future events. It´s amazing imagining to predict the future, reality mining give us a way to do human interactions a measurable thing in order to analyze the outcomes.

Waber has developed a new concept “network tightening” that looks forward to improve the density of informal networks by spotting weak areas and engineering connections between individuals and this is an approach to social network stimulation

Reality mining makes human interactions a measurable business and SNA a less subjective research area. Topics like mapping the social connections to software models, patterns of interaction analysis, and possible applications are a really interesting research area that can make the fiction a real business.

Ideología 37Signals – Acerca de las Reuniones

Posted by: jorgeortiz1 on: November 17, 2008

Comparto aquí un pequeño resumen y traducción acerca de las reuniones consignado en el libro getting real de 37Signals

No hay nada mas tóxico para la productividad en un proyecto que una reunión. He aquí unas pocas razones:

  • interrumpen tu día de trabajo en pequeñas e incoherentes piezas que interrumpen tu flujo de trabajo natural.
  • Son usualmente acerca de palabras y conceptos abstractos, no cosas reales( como una pieza de código o alguna interfaz de diseño)
  • Usualmente transmiten un abismalmente pequeño monto de información por minuto.
  • A menudo contienen al menos un imbecil que inevitablemente toma su turno para gastar el tiempo  de los demás sin ningún sentido.
  • Se salen del tema principal muy fácilmente.
  • Frecuentemente tienen agendas tan imprecisas que nadie está realmente seguro de que realmente son.
  • Requieren excesiva preparación que la gente raramente hace, de cualquier forma.

Para aquellas veces cuando tu ABSOLUTAMENTE DEBES tener una reunión(esto debería ser un evento raro)ciñete a estas simples reglas:

  • fija un temporizador de 30 minutos, cuando suene, la reunión finaliza.
  • invita la menor cantidad de gente como sea posible.
  • nunca haz una reunión sin una agenda clara.
Tags:

Freymam Alexis Vallejo Cuero – fvallejocuero@unicauca.edu.co

Jorge Eliécer Ortiz Romo – jorgeortiz@unicauca.edu.co

Resumen

El siguiente artículo intenta proveer información acerca de las características más relevantes de lenguajes de programación como C++, Python, Java y Ruby, haciendo un paralelo entre ellos, respecto a las características soportadas por cada uno.

También, se pretende mostrar con pequeños trozos de código para cada concepto o característica en cada uno de los lenguajes de programación considerados, tratando de mostrar mejor el comportamiento, o la aplicación de cada uno.

Orientación a Objetos

Muchos lenguajes se declaran Orientados a Objetos. Pero la definición exacta del término depende de muchos rasgos y conceptos que se deben cumplir en su totalidad [1]; estos rasgos y características son:

1. Ocultamiento y encapsulamiento de la información

2. Herencia

3. Polimorfismo

4. Todos los tipos de datos predefinidos son objetos

5. Todas las operaciones realizan envío de mensajes a objetos

6. Todos los tipos de datos definidos por los usuarios son objetos

Para propósito de esta discusión, un lenguaje será considerado Orientado a Objetos Puro si satisface todos los seis ítems nombrados. Será híbrido si sólo cumple con algunos de esos 6 lineamientos (por lo generar son híbridos cumpliendo los tres primeros). Tanto C++, Python y Java serán considerados Orientados a Objetos Híbridos, porque, C++ cumple solamente con los tres primeros; por su parte, Python no cumple con el encapsulamiento y ocultamiento de la información y tampoco con que todas las funciones usen mensajes a objetos.

C++ es un lenguaje multi-paradigma, y uno de los paradigmas que soporta es orientación a objetos. Ruby es un genuino lenguaje orientado a objetos que desde las fases iniciales de su diseño se tuvo en cuenta que debía soportar completamente este modelo; incluso los tipos estándar como los números son objetos de la clase Fixnum o Bignum.

Tipos de Datos Estáticos y Dinámicos

Python implementa tipos dinámicos. Esto quiere decir que el tipo de un objeto (en Python todo son objetos) se comprueba dinámicamente cada vez que es necesario dicho objeto. A un objeto se le asigna un tipo en el momento en que es asignado. Pero podemos realizar asignaciones de diferentes tipos. Esto significa que un mismo identificador puede referenciar objetos de tipo diferente en distintos puntos del programa. De esta forma es legal:

(1) >>> a = 7 #a es un entero

(2) >>> a = ‘pepe’ #a es una cadena

(3) >>> a = [1,7,'pepe'] #a es una lista

En lenguajes compilados, suele implementarse tipos de datos estáticos. Esto significa que durante la vida de un programa, una variable no puede cambiar de tipo, Java y C++ son un ejemplo para este concepto:

(1) int numero;

(2) numero=”hola”; //error

En el anterior ejemplo la variable numero se ha definido de tipo entero y no se le puede asignar un tipo de dato string, lo cual genera un error (línea (2)).

En Ruby no se declara los tipos de variables o métodos, todo esto es solamente un tipo de objeto, también se hace una aclaración respecto a que las clases no siempre representan los tipos de los objetos y se plantea que el tipo de un objeto está determinado por lo que el objeto puede hacer y no por su clase.

(1) def append_song(result, song)

(2) result << song.title << ” (” << song.artist << “)”

(3) end

(4) result = “”

(5) append_song(result, song) ! “I Got Rhythm (Gene Kelly)”

En el ejemplo anterior no se necesita chequear el tipo de los argumentos. Si ellos soportan << (en el caso de result, línea (2)) o title o artist(en el caso de song), todo simplemente funcionará, si no, el método lanzara una excepción que de cualquier forma se lanzaría si se chequean tipos), pero sin el chequeo, el método es de repente mas flexible ya que se podría pasar un array, string, un archivo u otro objeto que pueda usar <<

Clases Genéricas

La idea de Clases Genéricas es parametrizar las clases con tipos de datos distintos, inclusive tipos de datos definidos por el mismo usuario. Un ejemplo común es la Clase Pila que es un contenedor de objetos similares definidos por el usuario.

El principal beneficio de la parametrización de las clases radica en los lenguajes compilados, porque el tipo de dato a utilizar se define en tiempo de compilación de una forma segura.

C++ utiliza una muy buena forma de clases genéricas llamadas plantillas (templates) que aunque dan más funcionalidades aumenta la complejidad en el uso de esta:

El siguiente ejemplo en C++, se define una clase de tipo template llamada MiClase que tiene un atributo TMP (de cualquier tipo), al momento de instanciar de MiClase, se debe definir el tipo del objeto TMP que para el ejemplo es el tipo int (línea (5)):

(1) template <class TMP>

(2) class MiClase{

(3) TMP P;

(4)

};

(5) MiClase <int> miObjeto;

Herencia

La herencia es la habilidad de una clase u objeto para se definido como una extensión o especialización de otra clase u objeto. La mayoría de los lenguajes orientados a objetos soportan la herencia basada en clases, mientras otros, tales como JavaScript soporta la herencia basada en objetos, en la cual una clase puede heredar de otras clases y objetos individuales pueden se extendidos en tiempo de ejecución con las capacidades de los otros objetos.

La herencia múltiple consiste en que una clase hereda de muchas otras clases al mismo tiempo. Esta forma de herencia trae, por su puesto, complicaciones: puede presentarse la muy común ambigüedad en los nombre de variables y funciones. La herencia de subtipo es la herencia más común, en la cual una subclase es considerada como un subtipo de su superclase, comúnmente denominada relación IS-A.

C++ define la herencia múltiple como se puede ver en este ejemplo: Vestido hereda de forma pública de Chaqueta y de Pantalón (línea (3))

(1) Class Chaqueta { … };

(2) Class Pantalón { … };

(3) class Vestido: public Chaqueta, public Pantalon{

(4) //definición de variables y funciones

};

Para este ejemplo, en Python, la clase C hereda de forma múltiple de A y B; donde la clase B heredad de forma simple de A:

(1) class A:

(2) class B(A):

(3) class C(A,B):

Por otro lado Java nos plantea una herencia simple y una herencia múltiple de subtipo (línea (2)), ejemplo:

(1) public MiClase { …

}

(2) public class MiNuevaClase extends MiClase

{ …

}

Ruby, por su parte, ofrece la simplicidad de la herencia simple y el poder de la herencia múltiple. Una clase en Ruby puede tener solo un padre directo por lo tanto Ruby es un lenguaje de herencia simple. Sin embargo, las clases en Ruby pueden incluir la funcionalidad de varios mixin (un mixin es como una definición parcial de una clase) y de esta manera provee la capacidad controlada de la herencia múltiple.

El siguiente es un ejemplo que ilustra el uso de los módulos mixin para simular la herencia multiple; la clase ScaleDemo “hereda” la funcionalidad de los modulos MajorScales y PentatonicScales(lineas (15) y (16)).

(1) module MajorScales

(2) def majorNum

(3) @ms_numNotes = 7 if

(4) @ms_numNotes.nil?

(5) @ms_numNotes # Return 7

(6) end

(7) end

(8) module PentatonicScales

(9) def pentaNum

(10) @ps_numNotes = 5 if

(11) @ps_numNotes.nil?

(12) @ps_numNotes # Return 5?

(13) end

(14) end

(1) class ScaleDemo

(15) include MajorScales

(16) include PentatonicScales

(17) def initialize

(18) puts majorNum #be 7

(19) puts pentaNum # be 5

(20) end

(21) end

ScaleDemo.new

Característica de Renombrado

La característica de renombrado es la habilidad que tiene una clase u objeto para renombrar uno de sus rasgos que normalmente es heredado de la superclase. Hay dos importantes causales que nos permiten el uso de esta técnica:

§ Proporcionar un rasgo con un nombre más natural para su nuevo contexto.

§ Resolver la ambigüedad de los nombres cuando se realiza herencia múltiple.

Aunque es válido decir que Python no soporta renombrado, si soporta el uso de alias. En el siguiente ejemplo a la función imprimirA de A se le asigna un alias llamado ‘a’:

(1) class A:

(2) def imprimirA(self):

(3) print ‘a’

(4) >>> a = A.imprimirA

(5) >>> a

(6) ‘a’

Ruby brinda la capacidad de renombrado donde una clase hija puede sobrescribir o redefinir atributos o métodos de sus clases ancestro, el siguiente ejemplo ilustra esta situación.

(1)class Person
(2)  attr_accessor :name, :age, :sex
(3)  def initialize(name, age, sex)
(4)    @name, @age, @sex = name, age, (5)sex
(6)  end
(7)  # ...
(8)end
(9)class Student < Person
(10)  attr_accessor :idnum, :hours
(11)  def initialize(name, age, sex, (12)idnum, hours)
(13)   super(name, age, sex)
(14)    @idnum = idnum
(15)    @hours = hours
(16)  end
(17)  # ...
(18)end

(19)a = Person.new("Dave Bowman", 37, (20)"m")
(21)b = Student.new("Franklin Poole",     36, "m", "000-13-5031", 24)


En la línea (11) se renombra el constructor inicialize, definido en la superclase Person.

Sobrecarga de Métodos

Sustenta el polimorfismo. Es la capacidad para que una clase, módulo u otro enlace tenga dos o más métodos con el mismo nombre. Las llamadas a estos métodos no presentan ambigüedad porque se diferencian por el número y/o tipo de los argumentos pasados en la invocación de la función.

C++ plantea la siguiente forma de realizar una sobrecarga de métodos. En el siguiente código hay 3 métodos con el mismo nombre setDatos, pero tienen distinto número y tipo de parámetros, lo que los hace a todos distintos (línea (2), (3) y (4)):

(1) class Persona{

(2) void setDatos(char*, char*);

(3) void setDatos(char*);

(4) void setDatos();

};

En Java se presenta una sobrecarga similar a la presente en C++: se sobrecarga, en este ejemplo la el constructor :

(1) class MiClase{

(2) MiClase ( ){ …

}

(3) MiClase (String s, int i){ …

}

(4) MiClase (MiClase obj){ …

}

}

Python no soporta la sobrecarga de funciones por tipo, sólo por número de parámetros como se puede observar en el siguiente ejemplo (en las líneas (2), (3) y (4)):

(1) class linea:

(2) def __init__ (self): …

(3) def __init__ (self, xi, xf, yi, yf): …

(4) def __init__ (self, ini, fin): …

Sobrecarga de Operadores

La sobrecarga de operadores es la capacidad que se le da al programador para que defina operaciones entre los tipos de datos del usuario (objetos). Esto permite el uso de notación infijo, prefijo y postfijo, como la notación estándar. Por ejemplo, un tipo de dato de usuario, Matriz, puede definir un operador infijo ‘*’ para la multiplicación de dos Matriz (matriz1 * matriz2).

Para evitar algunos problemas de legibilidad del código, se recomienda:

1. Todas las operaciones deben ser mensajes a objetos (función miembro) y así todos los operadores son siempre llamadas a métodos.

2. Los operadores deben tener una forma funcional equivalente, entonces el uso del operador como una llamada a método se comportará precisamente de la misma forma que en la notación infija, prefija y postfija.

La sobrecarga de operadores en C++ se plantea de la siguiente forma general:

<tipo retorno> <Nobre de la Clase> :: operator <operador> (<parámetros>)

{

//implementación de la función

}

La sobrecarga de operadores en Java y Ruby no existe.

Funciones de Alto Orden

Las funciones de alto Orden, básicamente son funciones que pueden ser tratadas como si fueran objetos de datos. En el orden de ideas, estas pueden ser tomadas como variables (incluyendo la habilidad de ser almacenadas en colecciones), ser pasadas a otras funciones como parámetro y ser retornadas como resultado de otra función. Debido a esta habilidad, las funciones de alto nivel peden ser vistas como una forma de ejecución diferida, donde una función puede ser definida en un contexto, pasado a un segundo contexto y entonces ser invocada desde allí. A esto se le llama funciones lambdas anónimas, donde el contexto de invocación no necesita saber el nombre de la función a invocar.

Python proporciona funciones de alto orden como map, filter, reduce y lambda, que se pueden usar de forma similar como se verá:

(1) def par( x ): return not x%2

(2) print filter( par, range( 20 ) )

Cerraduras Léxicas

Las Cerraduras Léxicas (o Cerradura Estática o simplemente Cerradura) se basan en las funciones de alto nivel dándole una utilización mas eficiente. La idea es que cada vez que una función cambie de contexto lleve consigo, de alguna forma, el ambiente en que fue creado. Esto facilita también el acceso a variables y parámetros locales al contexto real de la función.

Python plantea el uso de las cerraduras cuando se presenta una situación parecida:

class Foo {

def doOperationA():

def stage2():

def doOperationB():

def stage2():

def stage3():

Recolector de Basura

El recolector de basura consiste en liberar la memoria de los objetos del usuario que ya dejó de usar. Existen varias estrategias de implementación de esto:

o El conteo de referencias (que se hace en Python) es el esquema simple. El sistema guarda la cantidad deferencias hacia un objeto, cuando este conteo da cero se libera el objeto.

o Java por su parte maneja “Mark and Sweep”, marcar y barrer. La recolección de basura se decide en dos pasos: 1) Marcar: se recorren los objetos desde la raíz marcándolos como ‘vivo’, si están en uso. 2) Barrido: se recolecta los objetos no marcados como ‘vivos’.

También hay que dejar constancia que C++ no tiene oficialmente uso de Recolector de Basura…

Ruby actualmente usa “mark and sweep” como recolector de basura automatico.

Métodos y Variables de Clase

Los métodos pertenecen a la clase y no al objeto, es decir, para una clase se dispone de un espacio en memoria para sus métodos, y este espacio lo comparten todos los objetos instanciados de la clase.

Clase C++:

class IntList {

public:

void func1( int );

int func2();

private:

int i;

char a;

};

Clase Java, indicando casi siempre la visibilidad por cada elemento:

(1) public class MiClase {

(2) private int i;

(3) int k;

(4) public MiClase(){

}

(5) private setI( int valor ) {

}

}

En Python se puede usar la palabra reservada global asi (línea 3):

(1) X = 88 #variable global X

(2) def func( ):

(3) global X

(4) X = 99 #variable global X: definida afuera de la función

(5) func( )

(6) print X #Imprime 99

Reflexión

Es la habilidad que tiene un objeto para auto describirse en tiempo de ejecución (indicar tipo del objeto, estructura de herencia, métodos que contiene, numero y tipos de parámetros y tipos de retorno).

C++ no maneja la reflexión, mientras Python permite una forma de reflexión muy fuerte.

El siguiente es código ejemplo de reflexión en Java:

(1) TextField t = new TextField();

(2) Class c = t.getClass();

(3) Class sup = c.getSuperclass();

(4) String str = c.getName();

(5) int m = c.getModifiers();

En el anterior código se define un objeto TextField al cual se le pide su objeto Class (línea 1), luego se le pide su objeto Super Clase (línea 2), el nombre de la clase (línea 4) y su modificador –public, private– (línea 5).

En Python se pueden utilizar distintas rasgos para acceder a la información descriptiva de un objeto:

(1) type(a)

(2) a.__dict__

(3) a.__dict__.values()[i]

Para el anterior código, type(a) indica el tipo de dato de la variable a (línea 1), a.__dict__ es un diccionario que maneja el compilador para relacionar el nombre de la variables y su valor (línea 2) a través de la función values definida para los diccionarios (línea 3).

Contrario a los lenguajes estáticos, donde el tipo de la variable determina su clase, y de ahí los métodos que soporta, Ruby soporta objetos liberados. No se puede decir con exactitud que puede hacer un objeto, hasta haber mirado dentro de su cubierta [8].

Se puede conocer los métodos a los que un objeto responde…

(1) r = 1..10

(2) list = r.methods

(3) list.length

(4) list[0..3]

en la linea (1) se crea un objeto rango, luego, en la linea (2), a “list” se le asignan los métodos que responde “r”. las lineas (3) y (4) nos darian las siguientes salidas respectivamente:

» 60

» ["size", "exclude_end?", "to_s", "length"]

se puede determinar la clase del objeto, su identificador único y verificar si se relaciona con otras clases [8]

num = 1

num.id » 3

num.class » Fixnum

num.kind_of? Fixnum » true

num.kind_of? Numeric » true

num.instance_of? Fixnum » true

num.instance_of? Numeric » false

Control de Acceso

El Control de Acceso tiene una relación estrecha con el encapsulamiento de la información que es uno de los principios de la Orientación a Objetos.

Normalmente los lenguajes definen dos tipos de visibilidad en sus clases: público y protegido. Se recomienda que todos los atributos sean protegidos y los métodos públicos, para garantizar el ocultamiento de la información; aunque hay lenguajes que involucran una tercera visibilidad: privado, que hace que los elementos sean inaccesibles por otros módulos fuera de la clase que lo implementa.

C++ nos muestra el control de acceso así:

(1) class MiClass {

(2) public: void func1();

(3) private: int i;

};

Python, no proporciona un fuerte control de acceso. Más sin embargo Python define un mecanismo llamado Name Mangling . Aunque esto no impide que el código del programador acceda de forma libre a los nombres Mangled ya que este funciona solo como un simple indicador de privacidad (como una sugerencia).

Existe una forma de declarar métodos privados en una clase y es la siguiente:

(1) class Persona(object):

(2) def __init__(self, name, edad):

(3) self.name = name # atributo público

(4) self.__edad = edad # atributo privado

los dos caracteres underscore (__) que comienzan el nombre del segundo atributo (línea 4) indican que es un atributo privado y solo otros métodos de la misma clase pueden acceder o invocarlo.

Java proporciona un cuarto “nivel de seguridad”, conocido como ‘Package Private’ que permite el acceso entre clases del mismo paquete.

(1) public void CualquieraPuedeAcceder(){}

(2) protected void SoloSubClases(){}

(3) private String NumeroIdentidad;

Ruby soporta tres niveles de protección o control de acceso a sus métodos.

  • Métodos Públicos: Pueden ser llamados por cualquiera, no es un control de acceso. Los métodos son públicos por defecto (excepto para inicialize que es siempre privado). (Siguiente ejemplo línea 3).
  • Métodos Protegidos: Pueden ser invocados solamente por objetos instanciados de la clase que los define o subclases de esta. (Siguiente ejemplo línea 4).
  • Métodos Privados: Pueden ser llamados solo en la definición de la clase y por descendientes directos, dentro del mismo objeto. (Siguiente ejemplo línea 5).

(1) class MyClass

(2) def method1

end

# … y los otros metodos.

(3) public :method1, :method4

(4) protected :method2

(5) private :method3

end

El anterior código en Ruby ilustra el uso de modificadores de acceso para los métodos.

Multihilos

Es la capacidad para que un programa procese dos o mas tareas concurrentemente (no se ejecutan simultáneamente a causa de la arquitectura del computador). Los multihilos se implementan principalmente en Sistemas Operativos, servidores Web, etc. La dificultad muy presente en la sincronización de los hilos hace de esta práctica poco llamativa para aplicaciones simples.

El siguiente ejemplo, en C++, crea un hilo (línea 4) para cada una de las funciones definidas (funcA, funcB) llamados h1 y h2, y luego los vincula a cada una (líneas 5 y 6). Posteriormente impide que el programa principal termine sin que antes hallan termindos sus hilos (líneas 7 y 8).

(1) #include <pthread.h>

(2) void funcA(){ … }

(3) void funcB(){ … }

int main(){

(4) pthread_t h1, h2;

(5) pthread_create( &h1, NULL, funcA, NULL );

(6) pthread_create( &h2, NULL, funcB, NULL );

(7) pthread_join( h1, NULL );

(8) pthread_join( h2, NULL );

}

Por su parte Java plantea el uso de hilos usando tipo de datos Thread (linea 2) y la función run (línea 4); también implementa muchas funciones que facilitan la sincronización de los hilos:

(1) public class reloj implements Runnable {

(2) private Thread hilo;

(3) int periodo_refresco = 1000;

(4) public void run() {

(5) while ( hilo != null ) {

(6) Thread.sleep( periodo_refresco );

}

}

}

Por su parte Python define también sus funciones para el manejo de hilo que se pueden acceder a través de la librería threading (import threading), por la cual podemos crear instancias de hilos (threadin.Thread). Y usando la función run para definir la secuencia de ejecucción; el atributo background para que se ejecute de forma paralela (utilizando las funciones background.start(),background.join()).

Los hilos en Ruby son hilos a nivel de usuario que son independientes del sistema operativo, y hay disponibles métodos de sincronización para controlar el acceso a variables y recursos, proteger secciones criticas de código, entre otras tareas [9].

El siguiente ejemplo ilustra la declaración del hilos en Ruby…

thread = Thread.new do
  # Statements comprising
  #   the thread...
end

Expresiones Regulares

Son un modelo que permite reconocer los idiomas regulares. Para esto se utilizan las bibliotecas que sustentan las estructuras de los lenguajes Regulares. El lenguaje regular se basa en el reconocimiento de estructuras en una comunicación o mensaje.

Java plantea la utilización de Expresiones Regulares usando las definiciones de la librería java.util.regex (línea 1), con el tipo de objetos Patter para definir el patrón a seguir con su función compile (líneas 5 y 8), matcher para verificar la estructura usando su función find() (líneas 7 y 10):

(1) import java.util.regex.*;

(2) public class ValidacionEmail {

(3) public static void main(String[] args) throws Exception {

(4) String input = “www.?regular.com”;

(5) Pattern p = Pattern.compile(“^\\.|^\\@”);

(6) Matcher m = p.matcher(input);

(7) if (m.find())

System.err.println(“Las direcciones email no empiezan por punto o @”);

(8) p = Pattern.compile(“^www\\.”);

(9) m = p.matcher(input);

(10) if (m.find())

System.out.println(“Los emails no empiezan por www”);

input = sb.toString();

}

}

Por su parte Python también permite el manejo de expresiones regulares, así:

# se busca un patrón

>>> if (re.search(“\Aa[0-9].*(end|fin)$”, “a2 lo que quiera fin”)):

… print “se ha encontrado el patrón”

se ha encontrado el patrón

Ruby, considera las expresiones regulares como parte de sus tipos estándar, y son objetos de tipo Regexp.

El siguiente ejemplo ilustra el uso de expresiones regulares para encontrar pares clave, valor.

(1) pat = /(\w+)\s*=\s*(.*?)$/

(2) str = “color = blue”

(3) matches = pat.match(str)

(4) puts matches[1] # “color”

(5) puts matches[2] # “blue”

En la linea (1) se define la expresión regular. El supuesto es que la clave o atributo es una plabra simple; el valor se encuentra al final de la linea y el signo igual puede estar rodeado por espacios en blanco, las salidas se muestran en comentarios en las lineas (4) y (5).

Aritmética de Apuntadores

La aritmética de apuntadores es la habilidad que tiene un lenguaje de programación para manipular de forma directa el espacio de memoria asignada. A menudo esta habilidad conlleva a errores semánticos (violación de segmento,…) lo cual hace que esta técnica no sea muy deseada en sistemas de alto nivel si no sí en sistemas de bajo nivel.

De los tres lenguajes en cuestión, sólo C++ permite el manejo de apuntadores que se hace de la siguiente forma:

void * p = 200F;

*p = CONSTANTE;

p++;

Integración de Lenguajes

La integración con sistemas existentes, en especial, módulos de bajo nivel, se hace necesaria para mejorar la velocidad de ejecución de nuestras funciones (particularmente en lenguajes interpretados). Desde la aparición y aceptación de C, la mayoría de los lenguajes (incluyendo Java y Python) implementan integración con este (C).

C++, implementa integración con C y Assembler. En el siguiente código de ejemplo se muestra la interacción con Assembler:

/* Código de manejo de arreglos y llamada a la función printf*/

#include <stdio.h>

void main(void) {

asm{

mov AX, 23

inc AX

jnz printf

}

}

Java define integración con C y algo de C++. Código ejemplo de integración con C:

extern “C”

jdouble Java_Timer_sinceLast (JNIEnv *env, jobject obj, jstring comment) {

jclass cls = env->FindClass(“timing.Timer”);

jfieldId last_time_id = env->GetFieldID(cls, “last_time”, “J”);

jfieldId last_comment_id = env->GetFieldID(cls, “last_comment”, “Ljava_lang_String;”);

}

Python define integración con C++. Código ejemplo de integración con C++:

%module example

%{

/* Put headers and other declarations here */

%}

extern double My_variable;

extern int fact(int);

extern int my_mod(int n, int m);

Variables

Los lenguajes que estamos analizando (C++, Java y Python) son lenguajes imperativos, es decir que se basan en una abstracción a la arquitectura de computadores de Von Newman (procesador y memoria). Estos lenguajes, como correspondencia, usan variables que normalmente se caracterizan por:

· Nombre de la variable

· Tipo de dato de la variable

· Ligadura de la variable

· Inicialización de la variable

· Alcance de la variable

· Tiempo de vida de la variable

· Forma de tipado

· Chequeo de tipos

· Compatibilidad de tipos entre variables

· Ambiente de referencia de la variable

· Variables constantes

Las tres principales características de las variables son: tipo, valor y celda de memoria.

Nombre de la variable

Es la palabra con la cual se conoce y se referencia a la variable. Se debe tener cuidado al darle un nombre a la variable, este no puede ser igual a las palabras reservadas del compilador y tampoco debe ser igual al nombre de las funciones declaradas de forma local o importadas de los módulos. Tampoco se puede tener varias variables con el mismo nombre.

image

image

image

El nombre de las variables debe tener la siguiente estructura:

nombre ::= (letra|”_”)(letra|digito|”_”)*

letra ::= l_mayuscula | l_minuscula

l_mayuscula ::= “A” … “Z”

l_minuscula ::= “a” … “z”

digito ::= “0” … “9”

Es decir iniciar con una letra o guion_bajo; no iniciar con un digito.

image

Tipo de dato de la variable

Un tipo de dato define todo el posible rango de valores que una variable puede tomar al momento de ejecución del programa y a lo largo de toda la vida útil del propio programa. Aunque este rango por lo general depende de la implementación del compilador y la arquitectura de la máquina.

C, en particular, es muy estricto en el manejo y almacenamiento de variables; por esta razón se requiere declarar cada variable que se valla a usar indicando su tipo de dato o clase a la que pertenece antes de usarla.

Los tipos de datos en C++ definido en algunos compiladores son.

image

image

image

Python por su parte define una jerarquía de tipos de datos un poco especial:

Tipo de datos numéricos: plain integers, long integers, floating point numbers y complex number. Hay que notar que el Boolean es un tipo de dato plain integers.

image

Tipo de datos secuencia: son aquello tipos de datos compuestos: vector, string y tupla. Pueden contener otros elementos como números y ellos mismos (ej. Un vector de vectores de cadenas).

Tipo de dato de mapeo: los únicos existente en esta jerarquía son los diccionarios; estos tienen una llave, y a través de esta localizan un valor.

Ligadura de la variable

Una variable es la abstracción de un espacio de memoria que puede ser accedida con una referencia o nombre que lo identifica. Dependiendo el tipo de dato el sistema operativo asignará un espacio limitado para el almacenamiento del valor que quiera llevar la variable.

La ligadura se presenta normalmente en el momento de definir la variable. Una vez se define la variable se le asigna un espacio de memoria.

Ejemplo en C++ de ligadura:

int mi_entero = 4;

float mi_flotante;

char mi_caracter;

El anterior ejemplo define tres variables escalares de las cuales solo mi_entero se inicializa con un valor de su tipo. Normalmente se puede inicializar cualquier variable.

Hay que tener en cuenta que si le asignamos un dato distinto al tipo de dato de la variable, esto generará un error (posiblemente) en C++ -esto no ocurrirá en Python-

int mi_entero; //variable entera

mi_entero = ‘g’; //dato carácter ‘g’

En Python, que es un lenguaje de tipado dinámico (cambiar de tipo de dato en tiempo de ejecución –se explicará en siguientes items-) el espacio de memoria y el nombre se mantienes igual, más sí, el tipo dato que almacena cambia. Usa declaración implicita.

Ejemplo en Python, ligadura y tipado dinámico:

a = 3

a += 2

a = “Hola mundo”

En este ejemplo se define una variable a. Note que no es necesario definir el tipo de dato que almacenará. La variable a se inicializa con el valor de 3; se incrementa en 2 unidades; finalmente se cambia el tipo de dato numérico entero por el tipo de dato secuencia String –almacenando “Hola mundo”-.

Inicialización de la variable

Como se vio en el item anterior, las variables en C++ pueden ser o no ser inicializadas asignándole un dato, un función o cualquier otro elemento que represente un dato del mismo tipo de dato definido en la variable. Ejemplo:

//define una función que retorna un int

int fun_inc( int i ){

return i+1;

}

void main(){

/*Definimos un entero que se

*inicializa inclusive con el valor

*que retorna la funcion fun_inc*/

int mi_entero = fun_inc(0);

/*O también inicializarlo con un

*dato en específico*/

char mi_caracter = ‘m’;

}

En Python la inicialización de las variables se presenta siempre, porque para poder definirlas debemos darle un valor inicial, de esta forma

#definimos la función incremento

#que retorna un entero

def fun_inc (i):

return i+1

#iniciamos la variable entera sin

#definir el tipo de dato, porque este

#se define dinámicamente una vez le

#un valor que este caso en un dato

#entero

mi_entero = fun_inc( 0 )

mi_cadena = “Hola mundo”

Alcance de la variable

El alcance hace referencia a que en qué bloque la variable puede ser accedida o referenciada (un bloque es una secuencia de código agrupado). Es decir, desde qué módulos, funciones o en general bloques, se puede acceder a una variable dada.

Los lenguajes de programación por lo general implementan una visibilidad de variable por bloque de código, o sea, la variable solo es conocida en el bloque en que se define; contando algunas excepciones:

Variables No Locales al Bloque: son variables que no se declararon dentro del bloque; por lo general se definen antes de iniciar el bloque en cuestión.

Ejemplo de variable no local a (global) en C++:

//variable global

int MAX_N;

void imprimirN(){

//acceder a la variable global al

//método

for( int i=0; i<MAX_N; i++ )

cout<< i<< “\n”

}

void main(){

//acceso a la variable global al

//método

MAX_N = 10;

imprimirN();

}

Variables Escondidas: son aquellas a la cual el compilador proporciona una forma de acceso especial. A estas variables no se tiene visibilidad aparente pero se pueden referenciar de la siguiente forma:

Estructura de C++ para acceder a variables escondidas:

//cuando se ha definido una clase

//nom_clase a la cual no puedo ver

//normalmente

nom_clase::nom_variable

Estructura en Python para referenciar variables escondidas:

#cuando se tiene un módulo al cual no

#puedo ver de forma normal

nom_archivo.nom_variable

Ejemplo en C++ de bloque:

//bloque main

int main(){

//bloque for

for( int i=0; i<10; ++i )

//primer bloque if

if( i==3 ){

cout<< i;

}

//Segundo bloque if

if( i==2 ){

cout<< “Esto no es valido”;

}

}

En el anterior ejemplo vemos un bloque main, un bloque for y dos bloques if. El bloque se compone por la cabecera (definición) y un conjunto de sentencias. Es notable que el código producirá un error a causa de que la variable i en el segundo bloque no puede ser vista, no existe, murió al terminar el bloque for que la definió.

Ejemplo en Python de bloque:

#bloque Analizar

def Analizar():

#bloque for

for ObjIns in vecObjIns:

#primer bloque if

if ObjIns.getTipo() == ‘para’:

SenFor( objIns )

#segundo bloque if

if objIns.getTipo() == ‘mientras’:

SenWhile( objIns )

En este ejemplo vemos que el inicio de un bloque en Python está definido por el carácter ‘:’, el conjunto de sentencia de distinguen por la identación y el fin lo limita igualmente la identación.

En Ruby las variables globales están disponibles en todo el programa, cada referencia a un nombre global particular retorna el mismo objeto, referenciar una variable global no inicializada retorna “nil”.

Las variables de clase están disponibles dentro de una clase o en el cuerpo de un modulo y deben ser inicializadas antes de usarlas, una variable de clase es compartida entre todas las instancias de una clase y está disponible dentro de la clase misma.

Ambiente de referencia de la variable

Este ambiente está conformado por todos los nombres de variables y funciones a los cuales la variable tiene visibilidad.

Si se utiliza el concepto de alcance estático, las variables visibles no locales se buscan en tiempo de compilación.

Ejemplo en C++:

//variables globales

char *a, *b, *c = “c_global”;

//function g

void g(){ print (a, b, c); }

//function f

void f(){

char* a;

a= “a_en_f”;

g();

}

//Function h

void h(){

char* b;

b= “b_en_h”;

g();

}

//principal

int main(){

char* c;

a = “a_global”;

b = “b_global”;

c = “c_en_main”;

f();

g();

h();

}

En este ejemplo, las variables a, b y c que son definidas en la funcion main, pierden al alcance cuando el hilo de ejecución se encuentra listo para imprimir, en la funcion g, estas variables y siempre tomará la referencia a las variables globales. Ignorando, tanto la variable a definida en f() como la misma variable b definida en h().

No importa desde que función se invoca g() el resultado del print es siempre el mismo.

Si se utiliza el concepto de alcance dinámico, se tendrán en cuenta a las variables no locales; esto se resuelven en tiempo de ejecución, dependiendo de la función desde la que se produce la invocación. Se determinan examinando el árbol de activación.

image

Figura 1: Árbol de activación, alcance dinámico

En esta figura (el seguimiento se hace desde el main) la función main invoca a la función f() que se encarga de crear la variable a (a en f), y llama a la función g(); esta función g(), imprime las variables a, b y c, de las cuales a será referenciada de la función f() que la definió y aún es un subprograma activo (función que se está ejecutando). Las otras dos variables b y c son tomadas de las referencias globales.

Tiempo de vida de la variable

El tiempo de vida de una variable está dada a partir de cuando se crea hasta el momento de dejar de existir físicamente (en memoria).

Hay dos formas de definir el inicio y el fin de una variable: por el compilador y por el usuario.

Tiempo de vida definido por el compilador:

- Variable global a todos los bloques del programa: esta variable tiene un espacio en memoria desde el momento de compilación y es eliminada junto con el sistema

- Variable definida sin algún modificador dentro de un bloque: La variable empieza a vivir en el momento de compilación (en el caso de C++), o en el momento en que se le asigna un valor a un nombre desconocido (en el caso de Python). Al final la variable deja de existir cuando termina la ejecución del bloque que la creó.

- Variable definida con el modificador static en C++: a este tipo de variables se le asigna un espacio de memoria en el momento de compilación; se elimina cuando se termina la ejecución del programa.

Tiempo de vida definido por el usuario en C++: tomando como herencia de C, C++ implementa la asignación y rechazo de memoria dinámicamente (en tiempo de ejecución). Usando las palabras reservadas new –para asignación de memoria- y delete –para la eliminación de memoria pedida a través del new-

Ejemplo C++, new y delete:

Nodo::~Nodo(){

cout<< “Se elimino nodo”;

delete sig;

}

Nodo* Nodo::creaNodo(Nodo* Nuevo){

Nuevo= new Nodo;

return Nuevo;

}

El anterior ejemplo es tomado de la implantación de una lista de caracteres. Mostrándose aquí las funciones Destructutor (~Nodo) y la función que retorna un Nodo nuevo

Compatibilidad de tipos entre variables

Un lenguaje de programación realiza un comprobación de los tipos de datos cuando el usuario define una asignación o simplemente en una operación aritmética o lógica.

Los lenguajes dinámicamente tipados (como Python) no necesariamente necesitan hacer validación de los tipos de datos en las asignaciones (auque hay que notar que al invocar las funciones Python utiliza un algoritmo de validación de tipos de datos), pero si en las operaciones.

Validación de tipos por nombre: C++ utiliza este tipo de comparación. Se basa en comparar los nombres de los tipos de datos involucrados en la comparación. Por lo general C++ utiliza el Casting (conversión a otro tipo de dato) para definir operaciones de asignación o expresiones lógicas o aritméticas, permitiendo hacer lo siguiente, sólo mostrando un warning:

int a;

//solo se toma la parte entera

a = 3.4;

Python, por su parte, hace uso de este tipo de validación para la invocación de funciones empotradas (built-ins) comprobando su tipo. Ejemplo que genera un error de tipo de dato:

>>> b = 0

>>> len(b)

Traceback (most recent call last):

File “<interactive input>”, line 1, in ?

TypeError: len() of unsized object

>>>

La validación de tipos por estructura consiste en verificar que se posea:

- Idéntica estructura pero con nombres distintos.

En este caso de validación se toman dos elementos compuestos y se compara cada sub-elemento y se garantiza que halla otro sub-elemento del mismo tipo (o con la misma estructura) en el otro elemento compuesto.

Referencias:

[1] Programming Language Comparison (Paper

of Jason Voegele)

[2] Learning Python, Second Edition. Published by

O’Reilly & Associates, Inc.,

[3] DAWSON, Michael. Python Programming for

the Absolute Beginner. Premier Press © 2003

Copyright © 2003 by Premier Press, a division

of Course Technology.

[4] KEOGH, Jim y GIANNINI, Mario. OOP

Demystified: A Self-Teaching Guide. McGraw-

Hill/Osborne © 2004

ISBN:0072253630.

[5] MITCHELL, John C. Concepts in Programming

Languages. Cambridge University Press ©

2003 (529 pages)

[6] OBASANJO, Dare. A Comparison Of

Microsoft’s C# Programming Language To Sun

Microsystems’ Java Programming Language.

2001.

[7] IGLESIAS CURTO, José Ignacio. VAQUERO

HERRERO, Juan. Comparación De

Características De Los Lenguajes De

Programación Java Y C#. Departamento de

Informática y Automática Universidad de

Salamanca. 2003.

[8] “Programming Ruby – The Pragmatic Programmer’s Guide”
Copyright © 2000 Addison Wesley Longman, Inc.

[9] “The Ruby Way”-Hal Fulton

Publisher : Sams Publishing

Abstract.

Awareness has become a cornerstone in computer systems design to reduce the meta-communicative efforts needed to collaborate across physical distances and in computer-mediated environments [1], that´s why is becoming important to identify problems associated with the use of awareness in order to design better Awareness displays, considering those aspects that goes against the reason and purpose of the awareness systems. This abstract attempt to show some of the identified awareness problems, the incidence in the asker and helper, and trying to find out some situations where using awareness makes a significant difference.

Introducción.

Algunos autores sostienen que la comunicación espontánea informal en espacios de trabajo, es bastante importante y útil para generar procesos de aprendizaje y trabajo colaborativo; sin embargo existen estudios orientados a demostrar que hay ciertas consecuencias que hay que pagar por el uso de Awareness. Las investigaciones apuntan a tratar de identificar tales consecuencias o problemas y generar estrategias para atacarlos, con el objetivo de diseñar mecanismos de Awareness lo mas eficientes posibles o que cumplan mejor con su propósito de potenciar el aprendizaje y trabajo colaborativo.

Problemas y Consideraciones de Diseño de Pantallas de Awareness.

Uno de los problemas identificados en el uso de pantallas de Awareness en espacios de trabajo computacionales, es el asunto de las interrupciones; Estas pueden generar reducción de la productividad del sujeto que es cuestionado, más, que al sujeto que pregunta, y por lo tanto es una consideración de mucho peso a tener en cuenta al momento de diseñar sistemas con Awareness.

Las investigaciones apuntan a atacar e identificar aspectos que generan interrupciones y la búsqueda de mecanismos o estrategias para dar soluciones, además de identificar situaciones en las cuales el uso de Awareness es mas conveniente o genera mejores resultados, a continuación se mencionan algunos aspectos a tener en cuenta para el diseño de pantallas Awareness buscando reducir las interrupciones:

La sincronización, entendiéndose por ésta, los mecanismos para proveer información referente al nivel de disposición que el sujeto cuestionado tiene en un momento específico de responder a preguntas. Se deben considerar mensajes en la pantalla Awareness que provean información al sujeto que pregunta del nivel de disposición a responder del sujeto objetivo y de esta manera contribuir con la sincronización.

La motivación: ya que el sujeto que necesita respuestas y el que es cuestionado, no son movidos por los mismos intereses a no ser que ambos personajes sean miembros de un mismo equipo trabajando en objetivos compartidos.

La cantidad de información presentada: ya que puede generar reducción en las interrupciones si le da al sujeto que pregunta la suficiente información para decidir si es el momento apropiado para preguntar o si por el contrario debería esperar.

Novedosos aportes…

Actualmente existen novedosas investigaciones como la llevada a cabo por Benjamin Waber en MIT, la cual presenta un sistema Awareness el cual captura información por medio de censores localizados en dispositivos móviles, los cuales son recolectados y estudiados, haciendo uso de una nueva área de investigación llamada “Reality Mining” que pretende obtener datos cuantificables por medio de dispositivos electrónicos generalmente inalámbricos, y en tiempo real, de las interacciones sociales reales como la comunicación cara a cara, entre miembros de un determinado grupo o equipo, que luego son analizados haciendo uso de Social Network Analysis (SNA) y finalmente se pretende a partir de los resultados obtenidos del análisis, aplicar técnicas de Social Network Stimulation (SNS) para finalmente enrutar o estimular comportamientos deseados en una red.

A continuación se describe la solución Awareness de Waber y cómo ésta intenta solucionar los problemas de las Interrupciones de los sistemas Awarenes:

Uno de los dispositivos construidos es llamado el “Presence Book” el cual brinda información en tiempo real acerca de la disponibilidad, accesibilidad y la red social egocéntrica.

A continuación se presenta pantalla Awareness en la figura:

dibujo- Pantalla de Presence Book.

Como se mencionó anteriormente, este sistema recolecta información mediante censores bluetooth y otros, y ataca los siguientes problemas:

La disponibilidad: intentando responder la pregunta ¿estaría interrumpiendo una conversación si llamo ahora?, o ¿están ellos demasiado ocupados para recibirme ahora? [3]. Para el prototipo, las conversaciones y datos de movimiento son usados para inferir la información presentada en la pantalla del dispositivo respecto a la disponibilidad.

La accesibilidad: intentando responder a la pregunta de que tan difícil es para un usuario acceder a determinado sujeto, buscando determinar de que manera es accesible tal sujeto, por ejemplo, si el sujeto está en su oficina entonces estará disponible para una comunicación cara a cara, pero si el sujeto está caminando fuera del área de trabajo, entonces es accesible solo vía e-mail o llamada telefónica. El prototipo usa datos de localización para cumplir con el propósito de la accesibilidad.

Finalmente el prototipo muestra también una red social egocéntrica que muestra los enlaces que conectan a un usuario con el sujeto de su interés, esto con el objetivo de responder a la pregunta ¿Quién que yo conozca conoce al sujeto de mi interés?, o ¿Quién en el departamento de desarrollo, pasa mucho tiempo con el departamento de ventas? Lo cual puede ser bastante útil para iniciar relaciones sociales.

Como se puede observar Reality Mining proporciona información bastante importante que puede contribuir a la construcción de mejores sistemas Awareness, gracias los datos cuantificables que pueden ser recolectados para posterior análisis.

Algunas Conclusiones.

Algunos estudios experimentales han demostrado que el uso de Awareness para la coordinación de comunicaciones interruptoras, potencia el aprendizaje colaborativo y reduce las perturbaciones asociadas con las interrupciones, pero tales comunicaciones deben darse en un ambiente de beneficios compartidos o de identidad común como es el caso de equipos de trabajo de proyectos específicos[2].

Los resultados mencionados en las investigaciones sugieren que el uso de pantallas de Awareness, es un factor que potencia el trabajo o aprendizaje colaborativo en ambientes que requieren un apretado acoplamiento entre los integrantes del grupo, ya que comparten intereses y motivaciones comunes, lo cual hace que cada miembro sea respetuoso con el tiempo y la concentración de sus compañeros y por lo tanto haga preguntas solo en las situaciones mas necesarias, siempre teniendo en cuenta la disposición del sujeto cuestionado a responder.

Es importante tener en cuenta la aplicación de Reality Mining para la implementación de sistemas Awareness ya que el análisis de datos provenientes de la interacción real de los sujetos de una red son bastante valiosos si se quiere atacar el problema de las interrupciones.

Referencias:

[1] Palfreyman K. A. and Rodden T., A protocol for user awareness on the World Wide Web, Procs. of CSCW’96, Boston, MA, USA, 1996, 130 – 139.

[2] Dabbish Laura, Kraut Robert E., Controlling Interruptions: Awareness Displays and Social Motivation for Coordination, Human-Computer Interaction Institute, Carnegie Mellon University. Pag 190.

[3] Kim Taemie, Chang Agnes, Pentland Alex. Enhancing Organizational Communication using Sociometric Badges, MIT Media Laboratory, Wellesley College, Pag 3

Procesos de Iniciación:

1.  Desarrollar el Project Charter.

Es el documento que formalmente autoriza un proyecto. Involucra la siguiente información:

- Necesidades, deseos, expectativas del cliente, stakeholders, sponsors.

- Descripción de alto nivel del negocio y justificación del proyecto.

- Calendario de hitos, stakeholders involucrados, supuestos, restricciones, business case y presupuesto.

Entradas:

- Contrato

- Statement Of Work: Estructura narrativa de productos y servicios a ser provistos por el proyecto; involucra: necesidad del negocio, descripción del alcance del producto, plan estratégico.

- Factores Ambientales de la empresa.

„ Cultura y estructura organizacional
„ Estándares gubernamentales o de la industria
„ Infraestructura
„ Recursos humanos

„ Administración del personal
„ Sistema de autorización de trabajo
„ Condiciones del mercado
„ Tolerancia al riesgo
„ Bases de datos
„ Project management information system

- Recursos de Procesos Organizacionales.

Herramientas Y Técnicas:

- Métodos de selección de proyectos.

- Metodología de gestión de proyectos.

- Sistema de Información de Gestión de Proyectos.

- Juicio de expertos.

Salidas:

- Project Charter

2.  Desarrollo del Documento preliminar del Alcance

Es la definición del proyecto, lo que es necesario cumplir, los limites además que define las características, criterios de aceptación y control del alcance. Incluye la siguiente información.

objetivos, requerimientos, características, criterios de aceptación, limites, entregables, supuestos y restricciones del producto o proyecto, organización inicial, riesgos iniciales, calendario de hitos, WBS, Estimación de costos, requerimientos aprobados.

Entradas:

- Project Charter

- Statement of Work

- Factores ambientales empresariales

Herramientas y tecnicas:

- Metodología de gestión de proyectos.

- Sistema de Información de Gestión de Proyectos.

- Juicio de expertos.

Salidas:

- Documento del alcance preliminar del proyecto.

Resumen conceptual – Conceptos sobre gestión de proyectos de TI.

Posted by: jorgeortiz1 on: November 12, 2008

Proyecto.

- Son temporales: los proyectos son ejecutados en un periodo limitado de tiempo.

- Son de elaboración progresiva.

- Siempre existe incertidumbre de éxito.

- Tienen un propósito único.

los proyectos son autorizados por las empresas con el objetivo de cumplir con su planeación estratégica.

La triple Restricción

Los siguientes factores deben ser balanceados para lograr la calidad del proyecto.

  1. tiempo
  2. alcance
  3. costos

Gestión de Proyectos:

Aplicación de técnicas, habilidades y herramientas a las actividades de un proyecto.

Aplicación e integración de los grupos de procesos de gestión de proyectos

Grupos de procesos de Gestión de Proyectos:

  • iniciación
  • planeación
  • ejecución
  • control
  • cierre

Áreas de conocimiento de la Gestión de Proyectos:

Áreas guía para especificar objetivos:

  • alcance
  • tiempo
  • costo
  • calidad

Áreas Facilitadoras:

  • Recursos Humanos
  • Comunicación
  • Riesgo
  • Gestión

Administración del la integración del proyecto.

Técnicas y Herramientas de la Gestión de Proyectos.

  • Para el Alcance: WBS, project charter, documento de Alcance.
  • Para el Tiempo: Diagramas Gantt y red, análisis de ruta y calendario critico.
  • Para el Costo: Estimación de costos, administración del valor ganado.

Algunos Términos…

Programa: grupo de proyectos relacionados, que se administran de forma coordinada.

Portafolio: colección de proyectos o programas agrupados para facilitar la gerencia especifica en orden a cumplir con un objetivo mas general.

Ciclo de vida del Proyecto.

- define las fases a ejecutarse en el proyecto y la conexión entre ellas desde el inicio al final del proyecto.

El ciclo de vida especifica:

- técnica de trabajo en cada fase

- entregables por fase y cronograma de entrega, además de criterios de verificación y validación de los mismos

- responsables y roles por fase

- Control y criterios de aprobación de cada fase.

Sobre los grupos de Procesos de la Gestión de Proyectos…

  1. Grupo de Procesos de Iniciación.

- Facilita la autorización formal de inicio de un proyecto o fase

- Generalmente están por fuera del proyecto.

- Documentan los objetivos del proyecto, el porqué las especificaciones escogidas son las mejores para cumplir con los requerimientos

- Descripción de alcance inicial y recursos necesarios

- Documentan las restricciones iniciales

2.   Grupo de Procesos de Planeación.

- la planeación es iterativa y cada iteración provoca modificaciones en el producto final (Project Management Plan).

Procesos:

  • Desarrollar el Project Management Plan
  • Planear el alcance
  • Definición del alcance
  • Creación del WBS
  • Definición de Actividades
  • Entradas:

    - Factores Ambientales
    - Procesos Organizacionales
    - Definición del alcance del Proyecto
    - WBS
    - Diccionario del WBS
    - Plan de Gestión del Proyecto.
    Salidas:
    - Lista de Actividades
    - Atributos de calidad
    - Lista de Milestones
    - Cambios Solicitados
  • Secuencia de Actividades
  • Estimación de recursos de actividades
  • Estimación de tiempo de actividades
  • Desarrollo de la programación
  • Estimación de costos.
  • Presupuestando costos.
  • Planeación de la calidad
  • Planeación del recurso humano
  • Planeación de la comunicación
  • Planeación de la gestión de riesgos
  • Identificación de riesgos
  • Análisis cualitativo de riesgos
  • Análisis cuantitativo de riesgos
  • Planeación de reacción a riesgos
  • Plan de compras y adquisiciones.

3.  Grupo de Procesos de Ejecución.

coordinación de personas y recursos, además de la integración y ejecución de las actividades del proyecto de acuerdo con el Project Management Plan.

Procesos:

  • Dirigir y gestionar la ejecución del proyecto
  • Ejecutar el aseguramiento de la calidad
  • Selección y definición del equipo del proyecto
  • Administración del equipo del proyecto.
  • Distribución de la información
  • Respuestas de solicitud de vendedores
  • Selección de vendedores.

4.  Grupo de Procesos de Control.

Procesos para observación de la ejecución de las actividades del proyecto. se monitorea el avance de las actividades y se determina áreas que requieren mayor atención.

Procesos:

  • Monitoreo y control del trabajo.
  • Control de integración de cambios
  • Verificación del alcance
  • Control del alcance
  • Control de programación.
  • Control de costos
  • Control de ejecución de calidad
  • Gestión del equipo del proyecto
  • Gestión de stakeholders
  • Monitoreo y control de riesgos
  • Gestión del contrato.

5.  Grupo de Procesos de Cierre.

Project Integration Management.

Incluye los procesos y actividades necesarias para identificar, definir, combinar, unificar y coordinar los diversos procesos y actividades de la gerencia de proyectos dentro de los grupos de procesos de gerencia de proyectos.

Entendiendo a las Organizaciones.

La conforman los siguientes aspectos:

* Marco estructural.

definición de roles y responsabilidades para la coordinación y control de la organización.

* Marco de recursos humanos.

Mediador entre las necesidades empresariales y las necesidades de los empleados.

* Marco político.

Componente que tiene en cuenta las diferencias individuales y grupos de interés y los conflictos que se puedan presentar por tales diferencias y los asuntos de poder dentro de la empresa.

* Marco simbólico.

Se ocupa de Símbolos  y cultura organizacional

Existen tres estructuras organizacionales básicas.

  1. Funcional
  2. Por Proyectos
  3. Matricial

- ¿Quieres estar un paso adelante de tus compañeros?

Aprende a desarrollar juegos, aplicaciones web, bases de datos, con tecnologias Microsoft .Net TOTALMENTE GRATIS!

Participa activamente en las lineas de interés de nuestro grupo, compartiendo y socializando tu conocimiento en tecnologías Microsoft.

Fecha:
Wednesday, November 12, 2008
Hora:
6:00pm – 8:00pm
Lugar:
Salón 228 – Facultad de Ing. Electronica y Telecomunicaciones
Universidad del Cauca – Sector Tulcán
Popayán, Colombia
Email
:

TE ESPERAMOS!!