sábado, 17 de diciembre de 2011

Utilizando Reflection para el Acceso a Datos

Hola a todos, pues hace tiempo programe una clase utilitaria para automatizar la transformación de objetos ADO.Net que contenian información recuperada de una fuente de datos a POCO (Plain Old CLR Objects) utilizando reflection. Pues sin nada que hacer este sábado por la noche, decidí escribir este post sobre este DataTransformer

Primero comentar que reflection es el proceso en el cual un programa puede modificar su propia estructura en tiempo de ejecución (gracias wikipedia). Bueno esto se lo puede entender de muchas formas, pero un ejemplo simple sería el de crear la instancia de una clase cualquiera en tiempo de ejecución, por ejemplo pasandole como parámetro el nombre de esta, tal vez es un poco abstracto comprender esto pero en wikipedia hay un ejemplo muy bueno, que prácticamente hace la creación de un objeto de la forma clásica y utilizando reflection:


//Without reflection
Foo foo = new Foo();
foo.Hello();

//With reflection
object foo = Activator.CreateInstance(null, "Foo");
foo.GetType().GetMethod("Hello").Invoke(foo, null);

Ahora, como podríamos aplicar esto para automatizar el acceso a datos?, primeramente, esto se aplica en caso que nuestra capa de acceso a datos no cuente con un ORM. Siempre se dará el caso que una empresa requiera que la capa de acceso a datos se realice utilizando Ado.net puro y no un ORM, de todos modos, si nuestra aplicación tiene una arquitectura por lo menos de tres capas, se realizará un mapeo manual de los objetos ado.net a nuestro POCO, por ejemplo:


 public List<Persona> GetPersonas() {
  SqlConnection conn = new SqlConnection(Config.GetDbString("mibase"));
  string sql = "SP_GetPersonas";
  SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
  
  DataTable personas = new DataTable();
  
  try {
   adapter.Fill(personas);
   List<Persona> result = new List<Persona>();
   foreach(DataRow row in personas.Rows) {
    Persona temp = new Persona();
    temp.Codigo = row["Codigo"].ToString();
    temp.Nombre = row["Nombre"].ToString();
    
    result.Add(temp);
   }
   
   return result;
  }
  catch(Exception ex) {
   throw ex;
  }
 }

Como se ve en el ejemplo, basicamente se esta haciendo un mapeo manual de una estructura DataTable a un objeto de tipo Persona, hasta aca todo simple, yo no me haria problema si tengo que hacer esto para 10 tablas, pero las estructuras empresariales pueden ser de decenas de decenas de tablas, sin incluir vistas. Entonces aca es donde entra reflection, para crear objetos dinámicamente.

Al siguiente clase como lo mencione arriba, realiza la transformación de una objeto Ado.net en un POCO, básicamente crea la instancia de un objeto que yo especifico, recorre sus propiedades y las compara con el nombre de las columnas de nuestro objeto Ado.net, si coinciden asigna el valor del objeto Ado.net a nuestro POCO.

Este es el código de DataTransformer:


public static class DataTransformer {
        /// <summary>
        /// Realiza la conversión de un DataTable a 
        /// una lista genérica de tipo TargetType
        /// </summary>
        /// <typeparam name="TargetType">Tipo destino de la lista</typeparam>
        /// <param name="table">Origen de datos</param>
        /// <returns>Lista genérica</returns>
        /// <exception cref="Exception: En caso que los tipos del origen de datos no coincidan 
        /// con los de TargetType"></exception>
        public static List<TargetType> DataTableToGenericList<TargetType>(DataTable table) {
            List<TargetType> resultList = new List<TargetType>();
            DataColumn temp;
            TargetType item;

            item = Activator.CreateInstance<TargetType>();
            PropertyInfo[] properties = item.GetType().GetProperties();

            foreach (DataRow row in table.Rows) {
                item = Activator.CreateInstance<TargetType>();
                foreach (PropertyInfo property in properties) {
                    temp = table.Columns[property.Name];
                    if (temp != null) {
                        if (temp.DataType.Name.Equals(property.PropertyType.Name)) {
                            property.SetValue(item, row[temp], null);
                        }
                        else {
                            throw new Exception("El tipo de la propiedad y columna son diferentes.");
                        }
                    }
                }
                resultList.Add(item);
            }
            return resultList;
        }
        /// <summary>
        /// Realiza la conversión de un IDataReader a 
        /// una lista genérica de tipo TargetType
        /// </summary>
        /// <typeparam name="TargetType">Tipo destino de la lista</typeparam>
        /// <param name="reader">Origen de datos</param>
        /// <returns>Lista genérica</returns>
        /// <exception cref="Exception: En caso que los tipos del origen de datos no coincidan 
        /// con los de TargetType"></exception>
        public static List<TargetType> DataReaderToGenericList<TargetType>(IDataReader reader) {
            List<TargetType> resultList = new List<TargetType>();
            object propertyValue;
            int columnNumber = reader.FieldCount;
            TargetType item;

            item = Activator.CreateInstance<TargetType>();
            PropertyInfo[] properties = item.GetType().GetProperties();

            while (reader.Read()) {
                item = Activator.CreateInstance<TargetType>();
                foreach (PropertyInfo property in properties) {
                    for (int i = 0; i < columnNumber; i++) {
                        if (reader.GetName(i).ToLower().Equals(property.Name.ToLower())) {
                            if (reader.GetFieldType(i).Name.Equals(property.PropertyType.Name)) {
                                propertyValue = reader.GetValue(i);
                                property.SetValue(item, propertyValue, null);
                                break;
                            }
                            else {
                                throw new Exception("El tipo de la propiedad y columna son diferentes.");
                            }
                        }
                    }
                }
                resultList.Add(item);
            }
            return resultList;
        }

        public static TargetType DataTableToObject<TargetType>(DataTable table) {
            List<TargetType> lista = DataTableToGenericList<TargetType>(table);
            if (lista.Count > 0)
                return lista[0];
            else
                return default(TargetType);
        }
    }

Analicemos un poco el método DataTableToGenericList. Primero notar que recibe como parámetro el objeto Ado.net del cual queremos transformar los datos, luego tenemos el tipo al cual queremos transformar, obviamente este tipo tiene que ser POCO. Luego se crea una lista de objetos del tipo que se nos da como parametro, luego obtiene en un arreglo de tipo PropertyInfo las propiedades de este objeto.

Finalmente recorre las filas del DataTable, y por cada fila, recorre el arreglo que contiene las propiedades y las compara con las columnas del DataTable y voila!!

Una vez que tenemos este transformador de datos, nuestro código para obtener una lista de personas, tendríamos lo siguiente:


 public List<Persona> GetPersonas() {
  SqlConnection conn = new SqlConnection(Config.GetDbString("mibase"));
  string sql = "SP_GetPersonas";
  SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
  
  DataTable personas = new DataTable();
  
  try {
   adapter.Fill(personas);
   return DataTransformer.DataTableToGenericList<Persona>(personas);
   
   return result;
  }
  catch(Exception ex) {
   throw ex;
  }
 }

Y como pueden observar, ya no es necesario mapear los objetos manualmente.

Bueno, eso es todo para esta entrada, ya me cayo el sueño, espero les sea de utilidad.

Saludos

jueves, 1 de diciembre de 2011

Mis primeros pasos con Web Matrix

Hola a todos, pues bien, una de las tareas que mi amigo asigno fue la de ver y mostrar lo que respecta uso la siguientes tecnologías:
  • Web Matrix
  • Azure
  • Windows Phone 7
Pues bien, Azure nunca lo toque además que tampoco tengo SDK, lo se error mío. WP7 lo estoy viendo de a poco y Web Matrix es algo nuevo para mí, por lo que leí en me parece una buena herramienta, por el hecho que el desarrollo y deployment de sitios web y que opera (no se si es el mejor término), con plataformas como GNU/Linux.

En este momento lo estoy descargando y en el wizard de instalación se da la opción de instalar aplicaciones tales como CMS, Wikis, Blog engines, etc, etc. Una herramienta muy completa. Otra de las cosas que me llama la atención y que pude observar en el video de 3 minutos que se muestra en
el sitio de Web Matrix es el hecho de utilizar Razor para los sitios, pues bien, esto me impulsa mas a aprender el uso de esta herramienta, ya que en un futuro quiero aprender a utilizar ASP.NET MVC y hasta donde se, el View Engine de este framework es Razor.

En los siguientes días ire aumentando nuevas entradas para mostrar algunas de las cosas que logré hacer con Web Matrix.

Saludos!

sábado, 26 de noviembre de 2011

Nuevos Horizontes

Hola a todos, varias cosas raras ocurrieron en mi vida estos ultimos días,
tuve que decidir varias cosas, analizar las consecuencias de cada una de
mis decisiones, pero al final, en lo personal creo que tome la mejor decision.

Ahora, tengo que dedicarme a full a la actividad que decidí continuar, es decir
los Student Tech Clubs :)

Ahora las actividades que se vayan realizando con los Student Tech Clubs de la
Universidad Mayor de San Andrés, y los de Bolivia los iré publicando aca. En estas
semanas se me encargó la creación del sitio (nuevo reto para mí), el cual tendrá
la información sobre los STCs en Bolivia.

Saludos

miércoles, 5 de octubre de 2011

PasteBin4DotNet

Bueno, para las personas que conocen PasteBin.com, se habrán dado cuenta que tiene disponible una API y una serie de herramientas, pues bien aprovechando que mi docente de investigacion y operaciones no pasaría clases no fui a la universidad y comence con esto. El por que de esta librería si ya hay herramienta hechas?, pues por que soy geek y por que programo por pasión al teclado.

Actualmente esta libreria solo realiza el login correspondiente, y la publicación de nuevos pastes. Lo que todavía no hace es borrar pastes, listar pastes, etc. etc.

Asi que mis TODOS serán:
- Completar las otras funcionalidad de acuerdo con la documentación de la API en pastebin.com
- Viendo que en la página existen herramientas para varios sistemas operativos móviles, me gustaría hacer un cliente para WP7
- Y otro cliente con Metro Style para hacer algo un poco mas útil que el clásico "Hola mundo"

Por el momento este el código que hice, se que a muchos les podrá parecer feo y un poco inseguro ya que me olvide del control de excepciones.

###########Update: 16/09/2011 02:08am############

Vaya que fue una noche productiva, me lanze de loco y empece a programar las otras funciones que Pastebin provee en su api, con un poco de pruebas de unidad vi que todo estaba funcionando correctamente, solo falta realizar las pruebas de unidad para borrar un paste y obtener la información de usuario, creo que este proyecto es un pasatiempo para un sabado en la noche aburridisimo. Espero publicar el código fuente hasta el medio día.


Convirtiendo objetos a un arreglo de bytes y viceversa

Hola a todos, en esta entrada se mostrará el proceso para
convertir un objeto a un array de bytes y viceversa, pues esta fue
una necesidad que se me presento mientras trabajaba con sockets,
tenia que enviar cierta información, y decidi enviarla a traves de
objetos CLR, uno de los problemas de este metodo es que si existen
errores en la transmisión de datos, se lanzaría un excepcion en
el receptor ya que no podría convertir el array al objeto deseado.

En fin para realizar esto, hice uso de dos objetos:

- System.IO.MemoryStream
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

y el código es el siguiente:

miércoles, 28 de septiembre de 2011

Donkey Rat - Mi Pet Project

Hasta que me decidí hacerlo, ahora con una nueva mascota, Donkey Rat, hace tiempo que queria hacer algo similar, algo con trabajo de sockets, etc, etc.

Aprovechando que hoy la universidad esta cerrada, comence creandolo, fue una mañana productiva, ya tengo la parte de shell remota, hice la prueba con telnet y netcat y funciono!!! me sentía tan feliz, ahora solo falta crear la herramienta para el administrador, y subirlo a codeplex o github ...

Seguire escribiendo sobre el pequeño Donkey Rat...
Saludos

lunes, 12 de septiembre de 2011

Feliz día del programador!!!! 1111 1111


Bueno, jejejjeje solo desear un feliz del programador, pues si, día del programador. ... como lo escucharon ... día 256 del año: http://www.programmerday.info/

Saludos!

martes, 6 de septiembre de 2011

Script Python para realizar combinaciones

Hola a todos, en esta entrada publicaré un script python, pues bien, este script toma como entrada los símbolos de un alfabeto, y realiza la operación de potencia sobre este (Ver lenguajes formales), básicamente esta operación consta en generar todas las combinaciones posibles de cierto tamaño, por ejemplo, si se tiene el alfabeto S={0,1} y se desea elvar este alfabeto a la potencia 3, entonces:

       - S^3 = {000,001,010,011,100,101,110,111}

Bueno, ahora vayamos al código, el script es el siguiente:

martes, 30 de agosto de 2011

Primeros pasos con PotgreSQL en Linux

Hola a todos, ya hace meses queria probar PostgreSQL desde Linux, en mi caso un Debian Squeeze, pero mi problema era el de no saber como configurar o acceder a este, pero gracias a mi amigo Darvein lo logre.

En mi caso, yo instale PostgreSQL, desde los DVDs de la distribución Debian Squeeze, una vez hecho eso, instale el cliente GUI (pgAdminIII) para poder experimentar con este motor de base de datos visualmente, pero cuando trate de conectarme, resulta que no sabia el usuario y password, y bueno agradezco a Darvein quien me ayudo. Solo habia que seguir los siguientes pasos:

0. Se debe reconfigurar Postgresql, con dpkg-reconfigure:
    ej: $ dpkg-reconfigure postgresql-v8.4

1. Una vez hecho esto, tenemos que entrar a la consola de postgresql, hacer esto dentro de una shell root:
    ej: # sudo -u postgres psql
en esta linea, se esta especificando el usuario, que por defecto, el usuario creado es "postgres", y luego explicamos el proceso que es psql, que es la consola de PostgreSQL.

2. Ya estando dentro de la consola de PostgreSQL, tendremos lo siguiente:
    ej: postgres=# _
lo que significa que ya podemos utilizar PostgreSQL, lo que nos falta cambiar la constraseña, para eso, simplemente debemos escribir el siguiente comando dentro de la consola de PostgreSQL:
    ej: postgres=# \password
eso nos dara la opción de introducir la nueva contraseña.

lunes, 18 de julio de 2011

Algoritmo Luhn para validación de tarjetas de crédito



Hola a todos, bueno hace tiempo que tenia curiosidad en saber la forma en la que las tarjetas de crédito son validadas, pues bien, navegando un poco por internet me encontré que el algoritmo utilizado para la validación de tarjetas de crédito es el algoritmo de Luhn.


Este algoritmo es simple, que nos dice que dada un número que contenga solamente dígitos [0-9], es una tarjeta de crédito válida si y solo si, obteniendo la reversa de este número, y la suma sus dígitos de una forma que les explicaré en un momente debe ser un múltiplo de 10, es decir que la suma módulo 10 debe ser igual a cero.


Pues bien, la forma en sumar es la siguiente, una vez hayamos invertido el número, si es posición impar, sumamos el dígito, si es posición impar, multiplicamos ese dígito por dos y sumamos los dígitos de ese número, para hacerlo más práctico, si el doble de ese dígito es mayor o igual a 10, le restamos 9 a ese doble, bueno y finalemente se debe verificar que la suma que se realizó sea un múltiplo de 10.


Bueno, un código que realicé puede ser una forma de plasmar este algoritmo en código, por cuestiones de memoria preferí utilizar cadenas en vez de divisiones y módulos entre diez, y operaciones a nivel de bits para la multiplicación por dos.

domingo, 17 de julio de 2011

Personalizando Visual Studio 2010

Hola a todos, esta tarde de domingo, decidi personalizar el aspecto grafico de Visual Studio 2010, pues bien, para comenzar le adicione esta extensión Visual Studio Color Theme Editor, gracias a esta extensión de Visual Studio 2010, podemos cambiar el color de nuestro entorno de desarrollo, por defecto cuenta con diferentes temas que le brindan a Visual Studio 2010, distintos colores y sensaciones visuales, pues bien, navegando por internet me encontre con este tema de Visual Studio similar al de Expression Blend http://www.nerdpad.com/visual-studio/visual-studio-2010-dark-expression-blend-color-theme.

viernes, 17 de junio de 2011

Encuentro Tecnológico STC Bolivia todo un éxito

Bueno, el día de hoy, bueno ya son las 00:06, el día de ayer 17 de junio de 2011 se llevó a cabo el Encuentro Tecnológico STC Bolivia en el Cine 6 de Agosto de la ciudad de La Paz, pues bien, fue todo un éxito, se tocaron los siguientes temas:


  • Windows Phone 7
  • Hyper-V
  • Proyecto Mono (Webcaste desde Perú)
  • Office 365 y Sharepoint 2010
  • ALM con Team Foundation Server
En mi opinión fue un evento genial, desde la parte de logística hasta la parte operativa que fue hecha por los diferentes miembros de las Células Académicas Microsoft Bolivia, eso si, el evento fue agotador, pero creo que salio genial. Espero ir editando esta entrada para ir publicando los links de descarga de las diapositivas de los expositores y subir algunas fotos del evento.

domingo, 22 de mayo de 2011

Tutorial básico de Linq

Hola a todos, en esta oportunidad les daré una introducción extremadamente básica de como utilizar Linq. Bueno primero comencemos con una breve introducción a lo que es Linq, pues bien, Linq (Language Integrated Query) es un lenguaje similar en sintaxis a SQL con la diferencia que podemos utilizar Linq dentro de nuestras aplicaciones .NET, tal vez para muchos les parezca algo feo, incomodo, etc. que hasta hace un año lo era para mí, pues en fin, con un compañero hicimos una aplicación en la que teniamos que utilizar Linq to Sql, en fin, tenñia que aprender Linq y me pareció genial, digo esto porque no me había dado cuenta del poder de consulta de Linq, se pueden hacer consultas a colecciones, arreglos, datasets, documentos xml, etc. me parece increible la forma en cómo se maneja esto, por ejemplo antes de utilizar Linq para filtrar ciertos elementos de un arreglo tenía que recorrerlos, pero con Linq las cosas se hacen con más facilidad. Bueno, Linq aparece en el Dotnet Framework desde su versión tres como una forma de hacer cálculo lambda, el mismo que podemos utilizar en lenguajes como Python por ejemplo.


Para comenzar y se darán cuenta que a lo largo de los ejemplos se utilizará la palabra clave "var" la cual indica que la variable que es seguida por "var" es un tipo de dato anónimo, por esto entendemos que no tenemos que especificar el tipo, al definir "var" el compilador analizará el tipo de dato, y podremos utilizarlo como lo que es en lo que resta de la aplicación.


var x = "hola a mundo";
// Desde este punto podemos usar x como string
var y = new Persona();
// Desde este punto podemos usar y 
// como objeto de tipo persona
y.Morir();


viernes, 20 de mayo de 2011

Controlar PC desde Twitter

Hola todos, en este post les mostraré como controlar una computadora desde Twitter. Primeramente agradecer a www.twitterizer.com, en la que se encuantra la mejor librería para el manejo de Twitter desde aplicaciones .Net(escritorio, web, etc.).


Bueno, básicamente lo que hace la aplicación es determinar cierto intervalo de actualización, es decir, cada cuanto tiempo obtendrá el último estado del usuario que seleccionemos, obviamente si queremos controlar nuestra computadora deberiamos utilizar nuestro propio usuario, en fin, se obtrendrá el último estado de este usuario y verificaremos que el estado comience con la subcadena "zombie:" y seguida de un comando. Luego ejecutamos el comando y lo demas es historia.


Bueno, actualmente este código fuente solo acepta dos tipos de comandos ("zombie:calc", "zombie:cmd"), los cuales abren una la calculadora de Windows y una terminal respectivamente. La aplicación final es como se muestra en la imagen:





lunes, 9 de mayo de 2011

Concurso para creación de portal

Hola a todos, como muchos de ustedes lo deben saber los Microsoft Student Tech Clubs antes Celulas Académicas Microsoft se estan volviendo a lanzar, ahora para insentivar a la comunidad se lanzó un concurso abierto para la creación del portal web para los Student Tech Clubs Bolivia.

Bueno, este proyecto tiene las siguientes bases:

El portal debe tener como mínimo:
  1. Blog
  2. Foro
  3. Seccion de noticias
  4. Enlaces
  5. Gestion de usuarios
  6. Integracion de redes sociales
  7. Encuestas
  8. Zona de descargas

Reglas del concurso
  1. Uso estricto de tecnología .Net con bases de datos sql server
  2. Se puede presentar grupo hasta 6 personas o individual
  3. Se debe entregar manual de desarrollo y manual de usuario

Puntaje
  • 10 justificación
  • 40 cumplimientos de requerimientos
  • 30 creatividad y usabilidad
  • 10 codeplex y documentación
  • 10 Innovación
  • 10 sin uso de cms(* extra por esfuerzos)

Fechas
  • 3 de mayo al 3 de junio presentacion de portal en dominio stcbolivia.net en los ambientes de prueba
  • 5 al 12 de junio calificación
  • 14 de junio publicación del ganador o ganadores.
  • 17 de junio premiacion

Premios
  • Material Microsoft

Espero que todos puedan participar.

Saludos

miércoles, 27 de abril de 2011

Creando un compilador de batchs

Hola, pues esta entrada la hago pensando en mi pasado, jejejeje, pues bien en mis comienzos me gustaba crear archivos batch, los cuales me salian interesantes, de todo tipo, pues bien, en esas épocas daba todo por un compilador de batchs a exe, encontre uno que era de paga, se llamaba Quick Batch File Compiler de la empresa abyssmedia, y bueno no conocía Taringa y pasaba horas buscando un serial o un crack(recuerden eso es malo XD). Bueno, pasaron los años, aprendí .NET, y hace poco publique una entrada la cual nos muestra el uso de los servicios de compilación de .NET (VISITAR), y aplicando eso, mas un poco de creatividad me salió una dll la cual tiene lo necesario para compilar .bat a .exe, lo que hubiera dado por algo asi.

Pues bien, lo que hace esta aplicación es generar un código CSharp el cual crea un .bat temporal con el código que le asignemos y que luego lo inicializa, luego que termine su ejecución lo elimina, pues bien averiguando, es la misma forma en como trabaja Quick Batch File Compiler, bueno, el código que se genera es el siguiente:


using System;
using System.IO;

class Tmp {
public static void Main(string[] args) {
string tmpPath = Environment.GetEnvironmentVariable("temp");
// Crea un nombre aleatorio
tmpPath += Path.GetRandomFileName() + ".bat";

// Creamos un batch temporal
Stream arch = File.Open(tmpPath, FileMode.OpenOrCreate);

using (StreamWriter writer = new StreamWriter(arch)) {
writer.Write(@"[BatSource]");
}
arch.Close();

// Iniciar el batch
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = tmpPath;
// Para que no habra otra ventana
p.StartInfo.UseShellExecute = false;
p.Start();

// La aplicacion no continuara mientras la ejecucion
// del bat haya terminado
p.WaitForExit(); 

// Verificar si existe la ruta del archivo batch
if (File.Exists(tmpPath))
File.Delete(tmpPath);
}
}


Usando servicios de compilación de .NET

Hola en esta ocasión les mostraré lo fácil que es utilizar los servicios de compilación que nos ofrece .NET, para utilizar dichos servicios debemos utilizar la clase CSharpCodeProvider que se encuentran en el namespace Microsoft.CSharp en el caso que quisiéramos utilizar el compilador de CSharp, y Microsoft.VisualBasic para el caso de Visual Basic tenemos la clase VBCodeProvider. Bueno, también debemos utilizar algunas clases del namespace System.CodeDom.Compiler para poder adicionar parámetros como el tipo de ensamblado que se generará (exe o dll), a que ensamblados hará referencia (System.dll, etc.), recursos, etc. y también para la clase CompilerResults la cual nos indica el resultado de la compilación, si existieron errores durante la compilación, advertencias, etc.
El primer paso que debemos hacer es crear una instancia de la clase CSharpCodeProvider, la cual nos permitirá realizar la compilación.


 using Microsoft.CSharp;
 using System.CodeDom.Compiler;
 ..
 ..
 ..
 CSharpCodeProvider provider = new CSharpCodeProvider();

jueves, 7 de abril de 2011

Mi primer post usando ScribeFire

Bueno, perdón por la falta de respeto, pero este post lo hice usando ScribeFire, que es un add-on para Mozilla Firefox el cual te permite crear entradas para tu blog desde tu navegador sin necesidad de estar en la página que blogger te pone por defecto, es una herramienta muy útil. Lo pueden adicionar a su Firefox desde ScribeFire Add-on, si lo desean para otros browsers como Google Chrome, Safari, etc. Pueden entrar a: http://www.scribefire.com/

Bueno, espero que esta herramienta les sea de utilidad.

Saludos

domingo, 3 de abril de 2011

Alternativa Open Source a Microsoft Project

Alternativa Open Source a Microsoft Project

Hola a todos, pues en este momento tengo que hacer una tarea para
la universidad tengo que usar diagramas de Gantt, lo primero que
se me viene a la cabeza es Microsoft Project ya que lo use previamente mientras trabajaba, en fin,
no tengo los instaladores y la velocidad de internet bastante lenta y es domingo, asi que
todo esta cerrado, dificil de conseguir, pero encontre una interesante
alternativa OpenSource llama Open Project, y me parece buena alternativa,
y funciona de la misma forma que Microsoft Project, y solo tiene un
tamaño de 6.8 MB!!!! extremadamente util para casos como el mio,
esta disponible el instalador para Windows como para GNU/Linux.

Pues bien esta es la web de Open Project:

y la pagina del proyecto en SourceForge es:

En el último link se encuentran los binarios para los diferentes sistemas
operativos incluyendo el código fuente.

Asi que ahora es hora de la tarea :(

Saludos

jueves, 31 de marzo de 2011

Obtener directorios con C-Sharp

Hola a todos, este script nos muestra como obtener una lista de directorios que se encuentra en una dirección dada por el usuario, para hacer el trabajo más simple usare LinQ:

Código C#:

using System;
using System.IO;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Escribe el directorio: ");
            string Ruta = Console.ReadLine();
            Console.Clear();
            Console.WriteLine("Los Directorios que contiene son: ");
            var query = from dir in Directory.GetDirectories select dir;

Script Python que obtiene la suma hash de un archivo.

Hola a todos, en este post les mostrare como obtener la sumahash de un archivo usando distintos algoritmos. Para esto usare el lenguaje de programación Python, ya que tiene una librería que se llama hashlib, esta librería cuenta con todos los elementos que necesitamos para crear nuestra aplicación para obtener las sumahash, bueno, esto solo será un script loco, lo que si me gustaría intentar sería hacer es implementar el algoritmo, en fin este es el script, en un inicio lo publique en Portal Hacker y ahora esta aca:

Código Python:
#!/usr/bin/python
# Name: sum.py
# Desc: Realiza la suma hash de cualquier archivo segun el algoritmo que se especifique
# Coded by SerG
 
import hashlib
import sys
 
def usage():
   print "Hacklab Bolivia - Sumador v1.1"
   print "Algoritmo: md5, sha1, sha224, sha256, sha384, sha512"
   print "sum.py [Algoritmo] [filename]"
 

Generación de primos con Python y LinQ

Bueno, estos son scripts que hice, y se muestra la simplicidad de usar expresiones lambda, son muy simples, sobre todo el de python, bueno esto son los scripts

Codigo Python:
#!/usr/bin/python
# primos.py
# Genera primos usando programacion funcional
# Coded by SerG
from math import sqrt
n = int("n> ")
nums = range(2,n+1)
root = int(sqrt(n))#Nro. de divisores
for i in range(2,root+1):
    nums = filter(lambda num: num==i or num%i!=0, nums)
# desde aca se puede hacer cualquier cosa con el
# vector nums, ya que contiene los primos


viernes, 25 de marzo de 2011

Llaves como en NetBeans, Eclipse, etc.

Hola a todos, tengo muchos amigos que programan en Java y tambien bajo .Net, y muchos de ellos me preguntaron la forma de hacer que Visual Studio formatee el codigo fuente como lo hacen los IDEs mas utilizados para Java (Netbeans, Eclipse, etc):

public class Foo {
 public Foo() {
  // Class constructor
 }
 public void doStuff() {
  // Do something
 }
}  
y no como lo pone Visual Studio por defecto:

martes, 22 de marzo de 2011

Introduccion a GUIs con C#

Hola a todos, a lo largo del semestre preparare material escrito sobre lo que es programacion de GUIs en C#, los ire subiendo por partes, cada parte sera la continuacion de la anterior. Recuerden que los otros auxiliares estan organizando seminarios en el Lasin, no se preocupen, lo estamos haciendo conjuntamente, asi que sientanse libres de asistir, saldran nuevos avisos proximamente.

Si tienen dudas pueden enviarme un email a: serguimant@hotmail.com.

  • Introducción a GUIs con C# (parte 1).- Esta parte da una pequeña introduccion a lo que es una GUI, como hacer una, tambien la revision de algunos controles, esta parte es básica para los que ya tengan conocimiento, en la parte 2 el nivel subira un poco mas, y asi.
  • Introducción a GUIs con C# (parte 2).- En esta parte ya se ve un poco mas a fondo el desarrollo de GUIs con C#, se ve el manejo de eventos, ejemplos con otros controles, etc.



Codigo fuente parte1



Código fuente parte 2

Notas Aux Lab-121

Holas, aca les dejo el link para que descarguen el pdf donde estan las notas de la primera practica, estas son las notas que les mostro la licenciada en el laboratorio