viernes, 27 de mayo de 2011

Importando librerias de .net en Ironpython

IronPython es python corriendo sobre .net, como tambien existe Jython
que es sobre la jvm. La gracia de estas estos es usar toda la
comodidad de un lenguaje extremadamente simple de escribir, leer y
usar las librerias de .net o java por ejemplo.

Para utilizar las librerias de .net primero se debe importar Common
Language Runtime
, y luego importar la libreria de .net que queramos
usar. Por ejemplo para realizar unas consultas la base de datos y
recorrer el resultado seria tan simplo como



import clr
clr.AddReference('System.Data')
from System.Data import
connection = SqlClient.SqlConnection("server=localhost,1433;uid=myuser;pwd=mypass;database=mydatabase;")
query ="select * from person";
command = connection.CreateCommand()
command.Connection = connection
command.CommandText = query
command.CommandType = CommandType.Text
connection.Open()
reader = command.ExecuteReader()
while reader.Read():
print (reader["name"])
reader.Close()
connection.Close()


--
Atte.
Víctor Hugo Saavedra P.
http://vhspiceros.blogspot.com

jueves, 26 de mayo de 2011

Caso practico por que usar una Interfaz

a causa del post anterior Cannot serialize member 'Objects' of type 'System.Collections.Generic.IList`1.... varios me preguntaron por que usar Ilist y no List directamente.


Bueno aquí un pequeño y muy cotidiano ejemplo, que sirve para entender las gracias de las interfaces.


Supongamos que tenemos 2 clases una llamada "auto" y otra "camion" y ambas tienen un numero de patente. y en algún reporte o pantalla solo tenemos que listar solo la Patente seria de la siguiente forma.


public interface IPatentable {
String Patente { set; get; }
}

public class Auto:IPatentable {
public String Patente { set; get; }
public Int32 CantidadDePuertas { set; get; }
}

public class Camion:IPatentable {
public String Patente { set; get; }
public Int64 Peso { set; get; }
}


y después en un objeto Dao, para rescatar los datos desde algún origen, ya sea base de datos, webservice, etc.:


public IList<IPatentable> GetPAtentes() {
var auto1 = new Auto { Patente = "yk99998", CantidadDePuertas = 5 };
var auto2 = new Auto { Patente = "cd1543", CantidadDePuertas = 3 };

var camion1 = new Camion() { Patente = "AD7777", Peso = 5000 };
var lista = new List<IPatentable>();
lista.Add(auto1);
lista.Add(auto2);
lista.Add(camion1);

return lista;
}



y por ultimo simplemente lo llamamos y nos retornara una lista de Ipatentable, el cual puede contener cualquier objeto que implemente esta interfaz.

de la siguiente forma:


var listPatentes = new patenteDAo().GetPAtentes();
foreach (var foo in listPatentes)
Console.Write(foo.Patente);



En resumen una interfaz es un como un contrato, en este ejemplo no nos importa si el objeto es un cambion o auto, solo nos interesa que tenga una patente y para eso los objetos deben implementar esta interfaz.


Para este ejemplo igual se pueden usar herencia , con una clase Abtracta por ejemplo

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 25 de mayo de 2011

Cannot serialize member 'Objects' of type 'System.Collections.Generic.IList`1....

Hoy me he encontrado con este problema, trantado de serializar un objeto a xml, por alguna razón no se pueden serializar objetos que contengan atributos Ilist.

La foma de la que estaba trantando es la siguiente


[Serializable]
public class Person{
public Person (){
Address = new list<Address>();
}
public String Name{set;get;}

public IList<Address> Address {set;get;}

public void ToXml() {
var serializer = new XmlSerializer(typeof(Voucher));
var writer = new XmlTextWriter(Console.Out);
serializer.Serialize(writer, this);
}
}




y obviamente ejecuto esto desde un test unitario como el que sigue:


[Test]
public void TestForPersonToXml() {
var person = new person();
Person.NAme = "victor Hugo Saavedra";
var Add = new Address();
add.street = "Alameda";
add.number = "1234";
Person.Address.add(add)

person.ToXml();
}


Pero al momento de ejecutar el test me da el siguiente error "Cannot serialize member 'Person' of type 'System.Collections.Generic.IList`1....." para lograr que la serializacion no se este error, tuve simplemente ignorar la propiedad que contiene el Ilist y generar otra que retorne una arreglo de direcciones quedando de la siguiente forma:


[Serializable]
public class Person{
public Person (){
Address = new List<Adress>();
}
public String Name{set;get;}

[XmlIgnore]
public IList<Adress> Address {set;get;}


[XmlArray("Address"), XmlArrayItem("address")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
private Address[] AddressXml{
get{
var foo = Address as List<Address>;
return foo != null ? foo.ToArray() : null;
}
set{
Address = null == value ? null : new List<Address>(value);
}
}

public void ToXml() {
var serializer = new XmlSerializer(typeof(Voucher));
var writer = new XmlTextWriter(Console.Out);
serializer.Serialize(writer, this);
}
}



Notar que el resultado de la serializacion es enviada a la salida de la consola y no se realiza ningún trabajo con ella.

Otro aspecto importante es que la clase Address debe contener el atributo [Serializable]

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 24 de mayo de 2011

Usa protector solar HQ

Sin duda este es uno de los mejores vídeos que he visto, este tambien lo pueden encontrar en aqui


video


Otro vídeo que también me gusta mucho, pero no se si para verlo todos los dias, pero si de vez en cuando es "THE MOST"

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 23 de mayo de 2011

Mis nuevos avatar

Mis nuevas imagenes, tanto para twitter google talk. las cuales las genere conhttp://www.pocoyize.com/online/ pero la version para iphone












--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 4 de mayo de 2011

Mi auto

Hace ya mas de un año que me compre un auto, un grand nomade 2007, y no habia tenido la oportunidad de poner fotos de el aqui... sin mas que comentar aqui van las fotos












--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 2 de mayo de 2011

DbAdapter Timeout

Hace un tiempo tuve que implementar un desarrollo en particular, que hoy en dia se esta dejando de funcionar por un maldito timeOut, ya que este se conecta a una base de datos que se encuentra en Europa.

Ademas se debe usar una conexión "SQLOLEDB" si es en produccion ya que el servidor es muy antiguo.


primero implemente una regla no muy bonita pero funciona de maravilla.


public static DbDataAdapter GetDataAdapter(string query, String connectionString) {
if (connectionString.Contains("SQLOLEDB"))
return new OleDbDataAdapter(query, connectionString);
return new SqlDataAdapter(query, connectionString);
}


De esta forma se puede determinar si crear un SqlDataAdapter o un OLEDBadapter.

¿por que adapter y no comandos y conexiones?
principalmente como es un servidor remoto, el adapter solito maneja la conexión y nos permite pasar a un dataset. La implementacion seria :


var adapter = ConnectionStringClass.GetDataAdapter("select * from foo", ConnectionStrinString);
adapter.Fill(ds);
var total = ds.Tables[0].Rows.Count;
Log.Info("cantidad de registros -->" + total);
var reader = ds.CreateDataReader();


pero esto no es muy mágico, ahora cada dia es mas recurrente ver en los logs, de log4net caidas por timeout, Yo ya me estaba resignando a no usar dataset para despues crear un dataReader, peo pero el que busca siempre encuentra :D. la forma es muy simple.


var adapter = ConnectionStringClass.GetDataAdapter("select * from foo", ConnectionStrinString);
adapter.SelectCommand.CommandTimeout = _timeout;
adapter.Fill(ds);
var total = ds.Tables[0].Rows.Count;
Log.Info("cantidad de registros -->" + total);
var reader = ds.CreateDataReader();



La propiedad CommandTimeout de selectcomand es representada en segundos, y defecto son 30.






--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com