Mostrando las entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando las entradas con la etiqueta programación. Mostrar todas las entradas

sábado, 21 de febrero de 2015

Algoritmos y Programación - Python [0]

Problemas no computables [1]
Son aquellos problemas que nunca podrán ser resueltos por una computadora por más poderosa que sea.

Problemas intratables [2]
Son aquellos problemas que pueden ser resueltos pero que requieren de un enorme poder de computo y memoria.

Algoritmo
es cualquier metodo para obtener un resultado. [3]

Construcción de Programas

1. Analizar el problema
    Entender profundamente cual es el problema y dejarlo por escrito.

2. Especificar la solución
    Describir qué debe hacer el programa, especificar datos de entrada, de salida y la relación entre ellos.

3. Diseñar la solución
    Cómo vamos a resolver el problema, cuales son los algortimos y las estructuras de datos que usaremos.

4. Implementar el diseño
    Traducir en un lenguaje de programación el diseño.

5. Probar el programa.
    Diseñar un conjunto de pruebas para probar cada una de sus partes.

6. Mantener el programa
    Realizar los cambios en respuesta a nuevas demandas.

Todos estos pasos deben ser documentados.

[4] Guia para diseño

  • ¿Han visto este problema antes, aunque sea de manera ligeramente diferente?
  • ¿Conocen un problema relacionado? ¿Conocen un programa que puede ser útil?
  • Fijense en la especificación. Traten de encontrar un problema que les resulte familiar y que tenga la misma especificación o una parecido.
  • Acá hay un problema relacionado con el que ustedes tienen y que ya fue resuelto. ¿Lo pueden usar? ¿Puede usar sus resultados? ¿Pueden usar sus métodos? ¿Pueden agregarle alguna parte auxiliar a ese programa del que ya disponen?
  • Si no pueden resolver el propuesto, traten de resolver uno relacionado. ¿Pueden imaginarse uno relacionado que sea más fácil de resolver? ¿Uno más general? ¿Uno más especifico? ¿Un problema analogo?
  • ¿Pueden resolver una parte del problema? ¿Pueden sacar algo útil de los datos de entrada? ¿Pueden pensar que információn es útil para calcular las salidas? ¿De qué manera se pueden manipular las entradas y las salidas de modo tal que estén "más cerca" unas de las otras?
  • ¿Usaron todos los datos de entrada? ¿Usaron las condiciones especiales sobre los datos de entrada que aparecen en el enunciado? ¿Han tenido en cuenta todos los requisitos que se enuncian en la especificación?
Las funciones

Una función es un conjunto de instrucciones que llevan a cabo la solución de una parte particular del problema. Las funciones llevan ninguno, uno o más argumentos que son la parte variable que se debe definir en cada ejecución de la función. Es recomentable documentar las funciones ya que con el crecimiento del programa crece su complejidad y tener las funciones documentadas ayudar a la mantenibilidad.

Las variables y parametros que se declaran dentro de una función no existen fuera de ella. Por consiguiente en lenguajes como python de utiliza "return" para decirle a una función que el valor debe ser retornado al hilo principal para que el programa pueda utilzar esa salida para hacer otras tareas.

[0] Algoritmos y Programación - Python
[1][2][3] Algoritmos y Programación - Python  Pagina 9
[4] Algoritmos y Programación - Python  Pagina 28
[5] http://www.cs.kent.ac.uk/people/staff/sjt/Haskell_craft/HowToProgIt.html
[6] Algoritmos y Programación - Python  Pagina 30

domingo, 14 de septiembre de 2014

Aprendiendo Erlang parte 6 Modulos III

Más acerca de módulos

Antes de movernos a profundizar nuestro conocimiento en relación a como escribir funciones y algunos fragmentos de código, pero antes tenemos un poco más de información que te será útil en el futuro.

Una de las primeras son los metadatos de los módulos. Los atributos de los módulos son metadatos que describen el módulo en si mismo. Donde podemos encontrar estos metadatos cuando no tenemos acceso al código fuente? Bueno, el compilador nos ayuda con esto: cuando compilamos un módulo, este toma la mayoría de los atributos y los almacena en una función llamada module_info/0 . Así pueden ver los metadatos de un módulo.

9> useless:module_info().
[{exports,[{add,2},
           {hello,0},
           {greet_and_add_two,1},
           {module_info,0},
           {module_info,1}]},
 {imports,[]},
 {attributes,[{vsn,[174839656007867314473085021121413256129]}]},
 {compile,[{options,[]},
           {version,"4.6.2"},
           {time,{2009,9,9,22,15,50}},
           {source,"/home/ferd/learn-you-some-erlang/useless.erl"}]}]
10> useless:module_info(attributes).
[{vsn,[174839656007867314473085021121413256129]}]

El snippet anterior además muestra la función module_info/1 que permite solicitar una pieza especifica de información.

Sintaxis en funciones

Coincidencia de patrones

Ahora tenemos la habilidad de almacenar y compilar código, podemos empezar a escribir funciones más avanzadas. La primera función que vamos a escribir necesita saludar de manera diferente según el genero.  En la mayoría de los lenguajes podrías escribir algo así.

function saludar(Genero, Nombre)
    if Genero == masculino then
        printf("Hola, Sr. %s!", Nombre)
    else if Genero == femenino then
        printf("Hola Sra. %s!", Nombre)
    else
        printf("Hola, %s!", Nombre)

Con coincidencia de patrones (pattern matching), erlang te ayuda a no escribir tanto código similar. La misma función en erlang se vería como esto.

saludar(masculino, Nombre) ->
    io:format("Hola, Sr. ~s!", [Nombre]);
saludar(femenino, Nombre) ->
    io:format("Hola, Sra. ~s!", [Nombre]);
saludar(_, Nombre) ->
    io:format("Hola, ~s!", [Nombre]).

Hay que adminit que la función de impresión por pantalla es un poco más fea en erlang que entro lenguaje pero ese no es el punto. La diferencia principal aquí es que nosotros usamos la coincidencia de patrones para definir las dos partes de una función se debe utilizar y ligas los valores al mismo tiempo. Aquí no se necesita primero ligar los valores y entonces compararlos.
En lugar de:

function(Args)
    if X then
        Expression
    else if Y then
        Expression
    else
        Expression

Nosotros escribimos:

function(X) ->
    Expression;
function(Y) ->
    Expression;
function(_) ->
    Expression.

De esta manera se obtiene los mismo resultados pero con un estilo más declarativo. Cada una de estas declaraciones de funciones es llamada clausula de función. Las clausulas de función deben ser separadas con punto y coma ";"

La coincidencia de patrones en las funciones puede ser más complejo y poderoso que eso. Tal vez recuerdas de capitulos anteriores donde usabamos coincidencia de patrones patrones para encontrar la cabeza y cola de una lista. Vamos a hacer esto.  Creamos un modulo llamado funciones.

-module(functions).
-compile(export_all).

La primera función que vamos a escribir es head/1, que actua exactamente como erlang:hd/1 que toma una lista como argumento y retorna su primer elemento. Los haremos con la ayuda del signo "|".

head([H|_])  -> H.

Si vos escribis functions:head([1,2,3,4]) en la terminal (una vez que el modulo sea compilado), puedes esperar que te retorne el valor 1. Consecuentemente para obtener el segundo elemento de la lista, puedes crear la siguiente función.

second([_,X|_]) -> X.

La lista será deconstruida por erlang en orden a hacer coincidir los patrones. Intentalo en la terminal.

1> c(functions).
{ok, functions}
2> functions.head([1,2,3,4]).
1
3> functions.second([1,2,3,4]).
2

esto podría ser repetido en la lista tanto como quitas, pero es impráctico para cientos de valores. Esto se puede resolver escribiendo funciones recursivas, aunque veremos como más adelante. Por ahora concentremonos más en la coincidencia de patrones. El concepto de variables libres y llenas nosotros los discutimos anteriormente, esto es así también para las funciones, podemos entonces comparar y conocer si dos parametros pasados a una función son lo mismo o no. Para esto, crearemos una función llamada same/2 que toma dos argumentos y dice si son identicos.

same(X,X) ->
    true;
save(_,_) ->
    false.

Y es así de simple.

Guardas, guardas.

Las guardas son clausulas adicionales que pueden ir en la cabecera de una función para hacer la coincidencia de patrones más expresiva. Como mencionamos antes la coincidencia de patrones está de alguna manera limitada ya que no puede expresar cosas como rangos de valores o cierto tipo de datos. Unos conceptos que no podemos representar serían los siguientes. Es este jugador de 12 años demasiado petizo para jugar con los profesionales? Es esta distincia demasiado larga para caminar sobre tus manos? Eres demasiado viejo o demasiado joven para manejar un auto?. No puedes responder esto simplemente con coincidencia de patrones. Se puede representar la pregunta sobre el manejo de un auto de la siguiente manera.

old_enough(0) -> false;
old_enough(1) -> false;
old_enough(2) -> false;
...
old_enough(14) -> false;
old_enough(15) -> false;
old_enough(_) -> true.

Pero esto es increiblemente impráctico. Puedes hacerlo si lo quieres, pero trabajarás solo en tu código por siempre. Si quieres eventualmente hacer amigos, entonces debes usar el modulo de guardas  así podremos escribir la pregunta sobre el manejo de la siguiente manera.

old_enough(X) when X >= 16 -> true;
old_enough(_) -> false.

y listo. Como puedes ver es mucho más limpio y corto. Notarás que la regla básica de una guarda es que debe retornar true cuando es correcta, la guarda puede fallar si retorna false o si lanza una excepción. Supongamos ahora que no queremos tener en cuenta a las personas que son mayores de 104 años. Entonces deberiamos cuidarnos de eso, pero como?, simplemente agregando una segunda guarda.

right_age(X) when X >= 16, X <= 104 ->
    true;
right_age(_) ->
    false.

La "," funciona como un "y tambien", y el punto y coma ";"  funciona como un "o sino"


http://learnyousomeerlang.com/modules#mode-about-modules

viernes, 15 de agosto de 2014

Poderosa Edición Nro8 de #TheOriginalHacker

Esta edición [0] es poderosa, con el estilo simple y profundo que la caracteriza, Eugenia nos redobla la apuesta con distintos análisis de alto nivel en lo profesional y de bajo nivel en lo computacional.










PHP y el manejo de datos en memoria
Los lenguajes de programación de alto nivel generalmente administran la memoria por nosotros y los más desinteresados crean y usan variables sin preocuparse demasiado pero si vos sos de aquellos a los que SI les importa ese tipo de manejos. Bueno este artiulo es para vos.

PHP: Hacking, debugging, o simplemente diversión
La diversión, como la belleza en la programación pueden parecer (para algunos) conceptos mal usados cuando se trata de un proceso que en gran proporción es racional, pero, la creatividad y la humanidad que cada uno le imprime a su manera de escribir código, nos hace retomar esos conceptos en su forma más pura. Divertirse debuggeando o hackeando eso es lo que Eugenia nos propone en este articulo.
«Belleza es la API de la librería requests de Kenneth Reitz para Python[1]»

Software Libre y la diferencia con el software privativo desde la óptica intrínsecamente profesional y no política
Huff, un articulo profundo, simplemente tremendo.

La orientación a objetos y sus enfoques como estilo y paradigma.
Amo este articulo (no es por que los ejemplos estén escritos en Python bueno un poco sí) por que nuevamente se puede ver como con palabras sencillas se puede llegar profundo en cosas que normalmente se explican en libros enormes. (que igualmente no habría que dejar de leer).

En síntesis:

Una edición tremenda donde encontrarás como dije al principio un alto nivel profesional y un bajo nivel computacional.

Y nuevamente me gustaría decirle a Eugenia como le dije por Twitter [2].
Gracias por decidir ser Libre.

[0] http://originalhacker.org/
[1] http://docs.python-requests.org/en/latest/
[2] https://twitter.com/GonzaMartinez/status/500384932536262656

jueves, 24 de abril de 2014

Pascal debe morir!

Pascal [0] ha sido un lenguaje muy interesante y posiblemente lo siga siendo para aprender algoritmos pero tengo la sensación que para aprender a Programar o como parte de una materia como Programación I, hace rato que es demasiado pobre, sobre todo por que hoy en día no sirve para nada más que aprender. Entonces los alumnos o quienes están aprendiendo pierden tiempo (no mucho en verdad pero todos sabemos que el tiempo es "dinero") aprendiendo su sintaxis aprendiendo algunas características particulares que no sirve para nada más que aprender no a programar :S en mi punto de vista sino para aprender algoritmos que debería ser utilizado capaz dentro de esa misma materia. Si bien quien lee este post sabe que soy Fan de Python también saben que Python es categorizado por muchos como un buen lenguaje para aprender, además de ser un lenguaje de propósito general, por lo cual aquel pibe que sabe la sintaxis de Python aprende (además del pensamiento algorítmico) un lenguaje que le puede servir para programar Web, para Programar aplicaciones de Escritorio y para hacer pequeños Scripts para automatizar cosas.
Sin ir más lejos el año pasado participé del PyDay Junin y allí en la UNNOBA[1] presentaron la muy buena iniciativa de cambiar su primer lenguaje de programación que era justamente Pascal por Python [2] [3]  y hay, desde hace unos años, cada vez más lugares donde se enseña Python como lenguaje de programación de entrada [4]. Igualmente aunque no parezca mi idea no es decir que Python DEBE ser el lenguaje de programación en verdad creo que cualquier otro lenguaje de los masomenos modernos (Python, Ruby, etc) puede ser útil para entusiasmar a los que aprenden programación en sus primeros pasos.

Esto se basa en algo que leí hace poco pero que siempre creí sin conocer esta frase.

"Si quieres construir un barco, no empieces por buscar madera, cortar tablas o distribuir el trabajo. Evoca primero en los hombres y mujeres el anhelo del mar libre y ancho."
Antoine de Saint-Exupéry

El proceso de conocer algo no siempre es hermoso, fluido y tangible generalmente es abstracto, a veces engorroso y pareciera poco útil por eso creo fervientemente que para hacer algunas cosas en programación o en cualquier trabajo en verdad. uno debe creer en lo que hace, debe amar lo que hace, por que sino no se entiende como alguien hace cosas tan complicadas. Por eso mi justificación es que Pascal no ayuda en ese proceso HOY de amar la programación, capaz si lo hacia hace años pero creo que el Rol de quienes enseñan hoy en día es actualizarse y no tenerle miedo al cambio y además ser autocríticos y analizar año a año el cambio de los paradigmas sino pasa que te quedás atrás inevitablemente y con eso atrasas a todos a los que les enseñás.
[0] http://es.wikipedia.org/wiki/Pascal_(lenguaje_de_programaci%C3%B3n)
[1] http://www.unnoba.edu.ar/
[2] http://prezi.com/haoscmd_yuca/cambio-de-lenguajes-para-programacion-imperativa/
[3] http://journal.info.unlp.edu.ar/journal/journal35/papers/JCST-Apr13-6.pdf
[4] http://python.org.ar/Proyectos/UsoDePythonEnLaUniversidad

sábado, 1 de marzo de 2014

Patrones de Diseño - GoF - Introducción


"Programa una interfaz, no una implementación"

No declares variables para ser instancias especiales de una clase concreta. En su lugar, genera solo una interfaz definida por una clase abstracta.

Herencia Vs Composición

La herencia indica que una clase hereda muchas o todas sus características de una (o más) clase padre.

Cuando en Python hacemos

class Padre(object):
    def saltar(self):
        print 'Estoy saltando'

class Hijo(Padre):
    pass

Estamos diciendo que la clase Hijo hereda de Padre y le escribimos un "pass" para decir que no vamos a definir nada nuevo en esa clase. Entonces lo que sucederá es que el hijo va a heredar todo el comportamiento de su padre en este caso la clase hijo tiene de manera implícita el método "saltar" que hereda de su "Padre"

Hay otros detalles sobre el uso de herencias múltiples en Python que van a poder ver con más detalle en los links de referencia al final del Post [0]

La composición es definida en tiempo de ejecución a través de un objeto que adquiere referencias a otro objeto.Es un objeto que usa la interfaz de otro objeto lo que genera que se tenga que tener especial cuidado en el diseño. Y el objeto referenciado puede ser cambiado siempre que mantenga las mismas interfaces.

Un ejemplo de composición podría ser el siguiente:

Class HabilidadSalto(objetc):
    def ejecutar(self):
        print 'Estoy saltando'

Class Persona(object):
    def __init__(self):
        self.habilidadSaltar = HabilidadSalto()

    def saltar(self):
        self.habilidadSaltar.ejecutar()

No estoy seguro de que sea un ejemplo muy adecuado pero es aproximadamente a lo que se refiere básicamente un objeto tiene dentro suyo una referencia a otro objeto y usa la interfaz de este último para llamar a acciones concretas.

"Favorece la composición de objetos por sobre la herencia de clases"

Delegación

La delegación es una manera de hacer composición tan potente para su reutilización como la herencia.
Dos objetos son los involucrados donde uno recibe el pedido y delega la operación a su delegado. Un ejemplo podría ser el siguiente que yo escribí en Python basándome en la explicación del libro [1] Design Patterns de GoF.

class Rectangulo(object):
    def __init__(self, ancho, alto):
        self.ancho = ancho
        self.alto = alto

    def Area(self):
        return self.ancho * self.alto

class Ventana(object)
    def __init__(self, ancho, alto):
        self.rectangulo = Rectangulo(ancho, alto)

    def Area(self):
        self.rectangulo.Area()

Esto tiene ventajas como que la ventana podría cambiar su comportamiento en tiempo de ejecución tan solo reemplazando la referencia a la clase Rectángulo por una referencia a otra clase Circular. Esto suponiendo que Circular y Rectángulo son del mismo tipo.

Las siguientes son causas comunes para el rediseño y como los patrones de diseño ayudan en ellas.

1. La creación de un objeto especificando una clase explicitamente. Especificar una nombre de clase cuando creas un objeto te compromete con una implementación particular, en vez de una particular interfaz.
Patrones de Diseño: Abstract Factory, Factory Method, Prototype.

2. Dependencia de operaciones especificas. Cuando especificas una operación particular, te comprometes a una manera de satisfacer un pedido. Para evitar solicitudes codificadas específicamente, deberías hacer más fácil cambiar la manera en que un pedido es satisfecho ambos en tiempo de compilación y en tiempo de ejecución.
Patrones de Diseño: Chain of Responsibility, Command.

3. Dependencia de la plataforma de Software y Hardware. Las Interfaces externas del sistema operativo y de la interfaces de programación de la aplicación (APIs) son diferentes en diferentes plataformas de  hardware  y software. Es importante por lo tanto que el diseño de tu sistema limite las dependencias de la plataforma.
Patrones de Diseño: Abstract Factory, Bridge

4. Dependencia de representaciones de objetos o implementaciones. Los clientes que conocen como un objeto es representado, almacenado, asignado o implementado. puede ser que necesiten ser cambiados cuando el objeto cambie.  Esconder esta infroma de los clientes mantiene los cambios en cascada.
Patrones de Diseño,: Abstract Factory, Bridge, Memento, Proxy.

5. Dependencias Algorítmicas. Los algoritmos son a menudo extendidos, optimizados, y reemplazados durante el desarrollo y reuso. Los objetos que dependan de un algoritmo tendrán que cambiar cuando el algoritmo cambie.
Patrones de diseño: Builder, Iterator, Strategy, Template, Method, Visitor.

6. Estrecho acoplamiento. Las clases que están estrechamente acopladas son dificiles de reusar en aislación, ya que dependen una de otra. El estrecho acoplamiento lleva a sistema moniliticos, donde no puedes cambiar o eliminar una clase sin entender o cambiar muchas otras clases.
El Acoplamiento débil incrementa la probabilidad de que una clase puede ser reusada por si misma y que un sistema pueda ser aprendido, portado, modificado, y extendido más fácilmente.
Patrones de Diseño: Abstract Factory, Bridge, Chain of responsibility, Command, Facade, Mediator, Observer.

7. Extender funcionalidad subclasificando. La personalización de un objeto por subclaseo a menudo no es fácil. Cada nueva clase tiene un implementación fijada desde el vamos (inicialización, finalización, etc). Definir una subclase requiere un profundo entendimiento de la clase padre.
La composición en general y la delegación en paticular proveen alternativas flexibles a la herencia por combinación de comportamientos. Nuevas funcionalidades pueden ser agregadas a nuevas subclases por la composición de objetos en nuevas maneras antes que definir nuevas subclases de clases existentes.
Patrons de Diseño: Bridge, Chain of Reponsibility, Composite, Decorator, Observer, Strategy

8 Inhabilidad de alterar clases convenientemente. A veces tiene que modificar una clase que no puede ser modificada convenientemente. Quizás necesitas el código fuente y no lo tienes (como sería el caso de una librería comercial). O tal vez cualquier cambio requerirá la modificación de muchas de las subclases existentes. Los patrones de diseño ofrecen varias maneras de modificar clases en estas circunstancias.
Patrones de Diseño: Adapter, Decorator, Visitor.

En subsiguientes Posts estaré resumiendo o explicando según mi entendimiento otras partes de este libro que comencé a leer y que me interesa bastante.

[0] http://learnpythonthehardway.org/book/ex44.html
[1] http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612

miércoles, 4 de septiembre de 2013

Por que la arquitectura de software es importante Capitulo 2

La arquitectura de software es importante por una amplia variedad de razones técnicas y no técnicas.
Nuestra lista incluye las siguientes:


  1. Una arquitectura inhibirá o habilitará en un sistema el manejo de los atributos de calidad.
  2. Las decisiones tomadas en una arquitectura te permitirá pensar y administrar los cambios mientras el sistema evolucione.
  3. El análisis de una arquitectura permite predecir tempranamente las cualidades de un sistema.
  4. Una arquitectura documentada mejora la comunicación entre las partes interesadas.
  5. La arquitectura es el portador de las más tempranas y por lo tanto más fundamentales decisiones de diseño más-difíciles-de-cambiar.
  6. Una arquitectura define un conjunto de restricciones y su posterior implementación.
  7. La arquitectura dicta la estructura de una organización, o vice versa.
  8. Una arquitectura puede proveer la base del prototipado evolutivo. [0]
  9. Una arquitectura es el artefacto clave que permite al arquitecto y al administrador del proyecto razonar acerca del costo y de las estimaciones de tiempo.
  10. Una arquitectura puede ser creada como un modelo transferible, reusable que forma el corazón de una linea de producto.
  11. El desarrollo basado-en-arquitectura enfoca la atención en el ensamblado de componentes, más que en la simple creación.
  12. Una arquitectura canaliza la creatividad de los desarrolladores, reduciendo la complejidad  y diseño del sistema.
  13. Una arquitectura puede ser la base para el entrenamiento de los nuevos miembros del equipo.
[0] Cabe aclarar que en este sentido se dice que la arquitectura puede ser analizada y prototipada como un sistema esquelético. Que como tal puede ser la base para la creación de otros sistemas similares. 


Parte 1 Capitulo 2
Software Architecture in Practice.
La proxima en Capitulo 3 es Los contextos de la arquitectura de software.
Capitulo que me resulto pesado de leer o que no lei con mucha atención así que me ayudará a repasar.

lunes, 2 de septiembre de 2013

Arquitectura de Software en Práctica Cápitulo 1

No estoy estudiando no estoy yendo a la facultad entonces me animé despues de leer "Dive Into Python" completo, que fue el primer libro completo que leé en inglés. Me animé y me traje del laburo un libro recién traído de USA que se llama "Software Architecture in Practice". Tratare de hacer un resumen pobre dado que no soy un experto ni en arquitectura de software ni en inglés pero con el fin de afianzar mis conocimientos y brindarles una pequeña traducción.

Introducción.

Que es la arquitectura de software?
La arquitectura de un sistema es un conjunto de estructuras necesarias a razonar acerca de un sistema, que comprende elementos de software, las relaciones ellos y las propiedades de ambos.

Que es una estructura y una vista.
Una estructura es un conjunto de elementos y las relaciones entre ellos.
La vista es una representación de la estructura.

Los neurólogos, ortopedistas,  hematólogos y los dermatologos tienen diferentes vistas de la estructura del cuerpo humano. Los oftalmológos, cardiologos y podologos tienen que ver con diferentes aspectos de todo un comportamiento. Aunque estas vistas son fotos y tienen propiedades diferentes todas están intrinsecamente relacionadas, juntas describen la arquitectura del cuerpo humano.

Hay tres categorias de estructuras:
Estructuras Modulo muestra como un sistema es estructurado como un conjunto de código o unidades de datos que tienen que ser construidos o adquiridos.

Estructuras componente-y-conector muestra como un sistema es estructurado como un conjunto de elementos que tienen un comportamiento en tiempo de ejecución (componentes) e interacciones (conectores).

Estructuras de asignación muestra como el sistema se relacionará a las estructuras que no son de software en su entorno (tal como CPUs, sistema de archivos, redes, equipos de desarrollo.)

Ejemplo:
Es un pequeño sistema cliente-servidor
Un sistema donde la vista de módulos es una vista de descomposición (submodulos o subsistemas de un sistema mayor). Y como en tiempo de ejecución van a ser 10 las máquinas clientes accediendo al servidor entonces podemos ver que van a ser 2 módulos (cliente y servidor) y 11 componentes (10 clientes, 1 servidor ) y 10 conectores que son las relaciones entre los componentes que se observan en la vista Cliente-Servidor.


Esto es todo por esta vez. Me sirvió para repasar un poco lo que había leído y para practicar mi traducción :S del inglés espero que les haya servido aunque sea poco.

El próximo capitulo será Por que es importante la arquitectura de software.

Resumen y ejemplos basados en
Software Architecture in Practice Third Edition. Len Bass, Paul Clements, Rick KazMan
http://amzn.to/15RIscN

sábado, 8 de diciembre de 2012

Lo único que se construye desde arriba son los pozos

Esta frase da el pie a comenzar a escribir sobre un idea, un proyecto y como realizarlo (obviamente desde abajo). Hace rato vengo haciendo pequeños Scripts y cosillas en Python, últimamente y debido a mi cambio de trabajo a Quicuo migré de un ambiente muy estructurado y poco creativo como era mi antiguo trabajo a un ambiente de creación pura rodeado de gente que quiere avanzar y quiere hacer cosas nuevas. 

Como llegue a donde estoy hoy?


Me recibí en la secundaria de Técnico en Informática Personal y Profesional en la EEET N5 "Galileo Galilei" para entrar ahí tuve mucha influencia de mi hermano que egreso en esa misma escuela antes que yo. Luego y con ganas de entrar en el mercado laboral rápidamente hice el curso de CCNA que nunca certifique pero que me dio el pie para meterme de lleno en el ambiente de IT. Ingresé a Siemens despues de años de vagajes entre diferentes Call Centers. Ahí, estuve unos años, donde aprendí bastante de la forma de trabajo y manera de encarar los problemas. Aún así volví a cambiar estaba decidido a ir a una empresa más chica donde la creación de cosas nuevas, tal vez, sea más importante y el "Continuous Improvement" (Mejora Continua) más valorado. Bueno cambié a una empresa más chica pero más estructurada aún fue un error me di cuenta rápidamente pero la constante búsqueda laboral posterior y sin respuestas dió pie a que le dé una oportunidad y ahí salieron pequeñas implementaciones de Sistema de Monitoreo de Redes (Nagios), Sistema de Tickets (Request Tracker) que no solo me hicieron enamorarme definitivamente del software libre sino que me acercaron a lenguajes como PHP, Perl, y Python
Definitivamente conocí Python y en ese momento me di cuenta de su ligereza de su facilidad y comencé a hacer pequeños scripts para automatizar algunos procesos que se hacían a mano aprendí bastante de Mariano Guerra parte de la comunidad de python.org.ar con el que igualmente me contacte por  chat pocas veces. Gracias a todas estas cuestiones Python, Software Libre, manejo de Servidores con CentOs y WebServers conseguí una entrevista en una empresa de IT que estaba comenzando llamada Quicuo. Y esta es mi llegada al mundo de las tecnologias Web, Python me llevó indefectiblemente a Django aunque esta empresa trabaja con PHP, el director de la empresa le gustó la idea de innovar y aún estoy en proceso de terminar la Intranet en Django.

Bueno finalmente Django me abrió todo un Panorama de la Web que no vi hasta ese momento (Maestros del Web, Mejorando.la, BootStrap, Jquery, CSS3, HTML5) hoy comienzo un proyecto propio que tiene que ver con la Web y espero que avance como lo tengo pensado.

martes, 19 de junio de 2012

Ejercitando Python!!! Parte 1

Hay que mantenerse activo!


En algunos enunciados dice hacer un programa pero como me dá fiaca hacer todo un .py y ejecutarlo hice una función para cada ejercicio.


1. Intro 
1.01. Hacer un programa que muestre "Hola mundo", y ejecutarlo para ver el mensaje en la pantalla. ¿Cómo lo ejecutó? ¿Qué otras maneras había de ejecutarlo? 

def holamundo():
print "hola mundo"

holamundo()

1.05. Hacer un programa que muestre "Esto es un caño". Ejecútelo. ¿Qué sucede? ¿Cómo lo solucionó?

def canio():
print "Esto es un caño"

canio()

2. Tipos de Datos 
2.01. Escriba un programa que muestre la siguiente figura:
  \  |  /
  @ @
     *
   \"""/

def figura():
print '''  \  |  /
    @ @
     *
   \"""/'''

figura()

2.02. Siendo a="Hola", b="mundo", c=87 y d=2.33145, armar y mostrar las siguientes cadenas:
  "Hola mundo"  (usando a y b)
  "-Hola-mundo-"  (usando a y b)
  "El resultado es: 87"  (usando c)
  "El resultado es: 87min (5220seg)"  (usando c ambas veces)
  "La temperatura es: 2.3"

a="Hola
b="mundo"
c=87
d=2.33145
def vars():
print a+' '+b
print '-'+a+'-'+b+'-'
print "El resultado es: %s" % c
print "El resultado es: %s min (%s seg)" % (c, c*60)
print "La temperatura es: %.1f" %d

vars()

2.03. Hacer un programa que le pida una cadena al usuario (usando la función "raw_input") y la imprima a pantalla al revés. Por ejemplo, para el texto "Esto es asi", debería mostrar:
    "isa se otsE"

def alrevez():
a = raw_input("Escribite algo: ")
print a[::-1]

alrevez()

2.04. Hacer un programa que le pida un número al usuario (usando la función "raw_input") y muestre ese número menos dos, más dos, multiplicado por dos, dividido por dos de forma entera, dividido por dos de forma decimal, y elevado a la potencia de dos. Por ejemplo, para el número 7, debería mostrar:
  5
  9
  14
  3
  3.5
  49

def operaciones():
a = int(raw_input("Escribite un nro: "))
print a - 2
print a + 2
print a * 2
print int(a/2)
print a/2.0
print a**2

operaciones()


Seguiré pronto con otros ejemplos!!!

Gracias a Taniquetil de PyAr
http://www.taniquetil.com.ar/py/ejercicios/enunciados.html


domingo, 26 de octubre de 2008

Programación en Java

Como seguramente todos los que estamos inmersos por gusto o por trabajo en el mundo IT sabemos que el Mercado IT actual en la República Argentina y seguramente en otras partes del mundo está ansioso de Desarrolladores. Y de los tantos lenguajes que hay para elegir, el mas valorado actualmente es Java.
Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems, es, como dije anteriormente, el lenguaje más valorado o pedido en el mundo IT, las estadísticas de una página como UniversoBit.com (Bolsa de trabajo de Profesionales IT) no mienten (Ver Gráfico a la derecha). Vemos como los analistas programadores se llevan una buena porción del mercado laboral, y dentro de esto, la herramienta más utilizada o pedida por las empresas es el el Lenguaje de Programación Java. Una de las ventajas de este lenguaje es ser multiplataforma, aunque en la actualidad hay varios lenguajes que profesan bajo esta misma premisa, este fue uno de los precursores.
Obviamente, esta gran cantidad de demanda de las empresas viene acompañada de una suma considerable de sueldo para los desarrolladores que manejen este lenguaje a Nivel Júnior, Semi senior, o Senior.

Min $Bruto Max $Bruto
AP Junior          $3620             $4250
AP SemiSenior $4910              $5450
AP Senior      $5820              $6280
*Revista NexIt edición Nro. 49 "Auge de los Programadores"

Si bien los nros. no definen los ambientes de trabajo, las posibilidades de crecimiento o la

camaradería. Uno puede tener en cuenta que siempre va a poder cambiar, ya que la demanda es la suficiente como para poder darse el lujo, en algunos casos, de renunciar sin miedo a quedar parado por mucho tiempo. Además, siempre se puede trabajar FreeLance sin tener que depender de horarios de entrada, viajes etc. Aunque estos profesionales nunca se van a poder escapar de los tiempos de entrega o fechas limites puestas por el cliente a la hora del desarrollo de alguna aplicación.
Por último, vamos a dedicar un par de enlaces a 3 organizaciones o empresas que comercializan la Certificación en Java en Buenos Aires - Argentina, como lo son:
Y para los incansables les acercamos un enlace de Taringa! donde podrán encontrar muchísima información sobre los cursos de certificación para este lenguaje. Click Aquí
Saludos seguidores y hasta la próxima.