miércoles, enero 20, 2010

Comandos Source Control Team Foundation

Buenas, hay veces que puede ser util realizar segun que acciones en el control de codigo fuente del team foundation desde la línea de comandos. Os voy a poner un ejemplo, en mi empresa compartimos varias dlls para diferentes proyectos, teniendo el código fuente en uno a parte, teniendo el problema, que en el momento que se desarrolla una nueva funcionalidad se ha de desplegar al resto, hasta ahora haciendo esta acción manualmente (copy & paste).

Cansado de esta tarea, he hecho un pequeño bat, que realiza dicha acción, para ello hemos hecho servir el ejecutable tf.exe que permite hacer todas las acciones sobre visual studio.


###BAT
SET TF="C:\Archivos de programa\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe"
SET FILE=SolrNet.dll
SET SOURCE="C:\xxxxxxxxx\%FILE%"

## INFOJOBS
SET DESTINATION="C:\yyyyyyyyy\ExternalDLL
cd %DESTINATION%
%tf% checkout %DESTINATION%\%FILE%
copy %SOURCE% %DESTINATION% /Y
%tf% checkin %DESTINATION%\%FILE% /comment:"Actualizacion automatica de SOLR" /notes:"Development description"="Actualizacion automatica de SOLR"

lunes, enero 18, 2010

Editar registro de una máquina remota

Editar el registro de una máquina remota es fácil de hacer aunque parece lo contrario por la cantidad de blog que he estado leyendo.

Para ello utilizaremos el regedit de una máquina que este situada en la misma red, y clicaremos sobre la opción "Conectar a registro de red...", una vez aquí introduciremos el nombre o la IP de la máquina deseada y por arte de magia, ya podremos modificar la clave deseada.

El motivo de buscar esta opción, ha sido que uno de los equipos de la red tenía el siguiente problema:

SINTOMA
Inicio sesión en windows y en cuanto carga el escritorio, cierra la sesión

PROBLEMA
El problema se debe a la desconfiguración del userinit.exe, pudiendo desconfigurarse en 2 sitios, perdiendo el archivo que se encuentra en c:\windows\system32\ o que la clave del registro se ha desconfigurado y a perdido dicho directorio.

SOLUCIÓN
Verificar que el archivo se encuentra en el directorio anteriormente descrito
Verificar que la clave HKEY_LOCAL_MACHINE\RamaXP\Microsoft\Windows NT\CurrentVersion\Winlogon y verificar que tiene como valor userinit.exe

jueves, enero 14, 2010

Solr vs Lucene .Net

Actualmente me encuentro trabajando con estas dos tecnologias como sistemas de búsquedas. Que son? Cual es mejor, Solr o Lucene?? Ventajas???

Bueno, podemos indicar que Solr no es más que una capa situada por encima de Lucene que facilita el acceso para realizar consultas y inserciones a un indice de Lucene, optimizando estas acciones.

Las grandes ventajas que he detectado de Solr son:
  • Reducción del tiempo de indexación
  • Mayor rendimiento en consultas, sobretodo en indices grandes (>1 GB), sobretodo en el cálculo de facets
  • Gestion de cache
  • Gestión de inserciones via multithreading
  • Facilidades de creación de entornos master-slave
  • Replicación integrada
  • Bajo nivel de conocimiento de la tecnologia
  • Aislamiento de la plataforma (Podemos ejecutar en Windows y Linux al ser Java)
  • Facilidad para crear la estructura de los indices, permite muchos tipos de tokenizadores y filtros que podemos configurar a nuestro gusto y necesidad


Con todo esto, la pregunta es, ¿Debemos cambiar de tecnologia de búsquedas?
La respuesta es depende, prueba, mide y decide. En nuestro caso, de varios indices que tenemos, la reducción en tiempos a sido expectacular, tanto en reindexación, reduciendo de 13 horas a 1,5 y de tiempo de búsqueda, reduciendo en algunos casos hasta un 90% el tiempo.

domingo, enero 10, 2010

SERIALIZANDO OBJETOS .NET A XML

Una acción muy utilizada hoy en dia a nivel de programación, es la serializacion y deserialización de objetos en cadenas de texto, como no, via XML. De esta manera, conseguimos tener un seguido de caracteres que podemos enviar via red de un lado a otro o guardar objetos fácilmente.

Para ello, que mejor que tener 2 funciones estandards que funcionan para todos los objetos.

Codigo serializacion .net a xml:


public static string Serialize(object pBenefit)
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(pBenefit.GetType());
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter writer = new System.IO.StringWriter(sb);
ser.Serialize(writer, pBenefit);
return sb.ToString();

}


Codigo deserializacion .net de xml:

public static object Deserialize(string lXml, Type lType)
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(lXml);

System.Xml.XmlNodeReader reader = new System.Xml.XmlNodeReader(doc.DocumentElement);
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(lType);

object obj = ser.Deserialize(reader);

return obj;
}

jueves, diciembre 03, 2009

Comparar 2 bases de datos

Comparar dos bases de datos es algo que puede interesar cuando se trabaja en diferentes grandes proyectos a la vez y se quiere preparar el desplegue de una aplicación. Verificar que cambios hemos realizado en las tablas y que contenido ha sido añadido puede resultar una tarea muy monotona si no la tenemos programada.

Trabajando con SQL Server, podemos realizar la comparación de 2 bases de datos con los siguientes scripts:


SELECT x.name, c.name
FROM DATABASE1.sys.columns AS c
JOIN DATABASE1.sys.types AS t ON c.user_type_id=t.user_type_id
join DATABASE1..sysobjects x on x.id =c.object_id and x.xtype in ('U')
LEFT OUTER join DATABASE2.sys.columns AS c1 on c1.name = c.name
LEFT OUTER join DATABASE2.sys.types AS t1 ON c1.user_type_id=t1.user_type_id
LEFT OUTER join DATABASE2..sysobjects x1 on x1.id =c1.object_id and x1.xtype in ('U')
WHERE c1.name is null
ORDER BY x.name;


El resultado del script anterior son un conjunto de select que deberemos volver a lanzar, en caso de obtener resultados, seran columnas que deberemos añadir a la tabla. Este script se debe lanzar en ambos sentidos, para obtener las columnas añadidas tanto en DATABASE1 como en DATABASE2.

El siguiente script, lo que hace es comparar el contenido de las diferentes bases de datos:


SELECT 'SELECT * FROM DATABASE1..' + x.name+ ' where [' + c.name + '] not in ('
+ 'SELECT [' + c.name + '] FROM DATABASE2..' + x.name + ') ;'
FROM sys.columns AS c
JOIN sys.types AS t ON c.user_type_id=t.user_type_id
join DATABASE1..sysobjects x on x.id =c.object_id and x.xtype in ('U')
-- opcional: WHERE x.name like 'XXX%'
-- opcional: ORDER BY c.object_id;

martes, septiembre 01, 2009

Sql Server 2008

Estos días he empezado a trabajar con SQL Server 2008 y con su compañero de batallas SQL Server Management Studio y ha sido una grata experiencia.

INTELLISENSE
Es el gran cambio que presenta por delante de su predecesor de 2005, ahora de manera fácil se nos despliega el listado de tablas, bases de datos, funciones y un largo etcétera de posibilidades. Para desplegarlo tan facil como clicar Cntrl + Space.
Por contra, también tiene alguna pega, en el momento que creas tablas o storeds nuevos te puedes encontrar con la imposibilidad de ejecutarlo, ya que este sistema trabaja con una memoria Cache que no tengo claro cada cuanto se refresca, para forzar el refresco, Cntrl + Shift + R y veras como se soluciona el problema de no localizar las tablas o storeds.

OPCIONES BOTON DERECHO
Otro gran cambio muy util cuando se trabaja con un número elevado de registros por tabla, es que ahora clicando boton derecho la opcion de "Abrir tabla" ha sido reemplazada por 2, "Abrir 1000 primeras filas" y "Editar 200 primeras filas".

CAMBIOS MOTOR
A nivel de cambios en el motor, por lo que concierne a funcionalidad, el gran cambio encontrado es que ahora selects con subselects no respetan el orden de la subselect interior, teniendo que propagar esta al exterior para no tener problemas.

miércoles, mayo 13, 2009

Conversion types between .Net to Sql Server

.Net SQL Server
System.Int64 BIGINT
System.Byte[] BINARY
System.Boolean BIT
System.String CHAR
System.DateTime DATETIME
System.Decimal DECIMAL
System.Double FLOAT
System.Byte[] IMAGE
System.Int32 INT
System.Decimal MONEY
System.String NCHAR
System.String NTEXT
System.Decimal NUMERIC
System.String NVARCHAR
System.Single REAL
System.DateTime SMALLDATETIME
System.Int16 SMALLINT
System.Decimal SMALLMONEY
System.String TEXT
System.Byte[] TIMESTAMP
System.Byte TINYINT
System.Guid UNIQUEDENTIFIER
System.Byte[] VARBINARY
System.String VARCHAR
System.String XML