TeraBIThia

23/03/09

Visual Studio Custom Tool

Archivado en: Uncategorized — crisfervil @ 11:38 pm

Pasos para crear una custom tool para visual studio (2005 ó 2008)

1 – Crear proyecto Class Library, agregar referencia a Microsoft.VisualStudio.Shell.Interop

2 – Crear la clase:

using System;
using System.Runtime.InteropServices; 

namespace MyCustomTool
{
    [System.Runtime.InteropServices.Guid("81EC1D79-AF71-448b-BD46-A97E096D58C6")]
    public class MyCustomTool: Microsoft.VisualStudio.Shell.Interop.IVsSingleFileGenerator
    {
        /// Devuelve la extensión que tendrá el código generado
        public int DefaultExtension(out string pbstrDefaultExtension)
        {
            pbstrDefaultExtension = ".myExtension";
            return 0;
        } 

        /// Punto de generación de código
        public int Generate(string wszInputFilePath, string bstrInputFileContents,
                            string wszDefaultNamespace, IntPtr[] rgbOutputFileContents,
                            out uint pcbOutput,
                            Microsoft.VisualStudio.Shell.Interop.IVsGeneratorProgress pGenerateProgress)
        {
            byte[] generatedCode = System.Text.UTF7Encoding.Default.GetBytes("Código generado"); 

            rgbOutputFileContents[0] = Marshal.AllocCoTaskMem(generatedCode.Length);
            Marshal.Copy(generatedCode, 0, rgbOutputFileContents[0], generatedCode.Length);
            pcbOutput = (uint)generatedCode.Length;
            return 0;
        }
    }
}

3- Firmar y compilar

4 – Registrar en la GAC : En el command prompt de visual studio: gacutil /i “MyCustomTool.dll”

5 – Crear estas entradas en el registro (para visual studio 2005 cambiar el 9.0 por 8.0)

Para conocer la Public Key Token de un ensamblado que se encuentra en la GAC, usar gacutil -l MyCustomTool

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\CLSID\{81EC1D79-AF71-448b-BD46-A97E096D58C6}]
@="MyCustomTool.MyCustomTool"
"InprocServer32"="C:\\WINDOWS\\system32\\mscoree.dll"
"Class"="MyCustomTool.MyCustomTool"
"Assembly"="MyCustomTool, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b8e943e54c5f6a29"
"ThreadingModel"="Both" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators\{164B10B9-B200-11D0-8C61-00A0C91E29D5}\MyCustomTool]
@="MyCustomTool"
"CLSID"="{81EC1D79-AF71-448b-BD46-A97E096D58C6}"
"GeneratesDesignTimeSource"=dword:00000001 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators\{E6FDF8B0-F3D1-11D4-8576-0002A516ECE8}\MyCustomTool]
@="MyCustomTool"
"CLSID"="{81EC1D79-AF71-448b-BD46-A97E096D58C6}"
"GeneratesDesignTimeSource"=dword:00000001 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators\{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}\MyCustomTool]
@="MyCustomTool"
"CLSID"="{81EC1D79-AF71-448b-BD46-A97E096D58C6}"
"GeneratesDesignTimeSource"=dword:00000001 

6 – Crear un proyecto cualquiera, y en cualquier archivo, establecer la propiedad (F4) Custom Tool a MyCustomTool

 

Referencias:

http://blogs.conchango.com/pauloreichert/archive/2005/05/21/1459.aspx

http://msdn.microsoft.com/es-es/magazine/cc301796(en-us).aspx

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivssinglefilegenerator(VS.80).aspx

http://www.codeproject.com/KB/dotnet/ResourceClassGenerator.aspx?display=Print

Crossposted from crisfervil.com

17/03/09

Evolución de la interfaz visual

Archivado en: Uncategorized — crisfervil @ 1:39 pm

Me apunto enlace a este artículo que me ha parecido muy bueno.

Es una muestra de lo que han evolucionado las interfaces gráficas en los últimos 30 años.

http://muycomputer.com/FrontOffice/ZonaPractica/Especiales/especialDet/_wE9ERk2XxDD4oIdxxXVoZxGKDcFmmJlVwLE-_joYA-moyySZ3o5lyeYRP3YNuQYX

El tema de la interfaz visual ha sido una de las áreas de la programación que me ha parecido más entretenida.  Es increíble ver todo lo que se ha evolucionado. Qué nos deparará el futuro?

Crossposted from crisfervil.com

13/03/09

Speed Tests

Archivado en: General — crisfervil @ 4:04 pm

Comento esta noticia por parecerme interesante:

http://arstechnica.com/microsoft/news/2009/03/micr…

Internet Explorer 8 dá una paliza en los test de velocidad a los demás navegadores.

Y un vídeo promocional que por cierto está muy chulo.

http://www.microsoft.com/windows/internet-explorer…

Crossposted from crisfervil.com

10/03/09

Macro Excel que Ejecuta Procedimiento Almacenado y Consulta Datos

Archivado en: General — crisfervil @ 5:16 pm

¿Cómo narices hacíamos antes para programar sin intellisense?

Qué infierno. Ni ayudas, ni mensajes de error, ni seguridad de tipos…

En fin.. .para que luego digan que las nuevas herramientas no aumentan la productividad.

Me he tirado más de 4 horas para codificar esta tontería. Espero que a alguno le sirva.

 

Option Explicit

Private Sub cmdRun_Click()

    Dim DataConn, cmdSp, cmdSp2
    Dim cmdRs, pPartNumber, pMaxLevel

    ' Connection
    Set DataConn = CreateObject("ADODB.Connection")
    DataConn.Open Me.Range("B1").Value ' Valor de una celda

    ' Iniciamos transaccion aunque sea consulta porque
    ' usamos tablas temporales de oracle
    DataConn.BeginTrans

    ' Command 1
    Set cmdSp = CreateObject("ADODB.Command")
    cmdSp.ActiveConnection = DataConn
    cmdSp.CommandText = Me.Range("B2").Value ' Valor de una celda
    cmdSp.CommandType = 4 'adCmdStoredProc

    ' Parámetros
    Set p1 = cmdSp.CreateParameter("p1", 200, 1, 40)
    p1.Value = Me.Range("B4").Value ' Valor de una celda
    cmdSp.Parameters.Append p1

    Set p2 = cmdSp.CreateParameter("p2", 139, 1, 1)
    p2.Value = VBA.CInt(Me.Range("B5").Value) ' Valor de una celda
    cmdSp.Parameters.Append p2

    cmdSp.Execute

    ' Command 2
    Set cmdSp2 = CreateObject("ADODB.Command")
    cmdSp2.ActiveConnection = DataConn
    cmdSp2.CommandText = Me.Range("B3").Value ' Valor de una celda
    cmdSp2.CommandType = 1

    ' Recordset
    Set cmdRs = cmdSp2.Execute

    ' Borrar datos existentes
    Hoja2.Activate
    Hoja2.Cells.Value = ""

    ' Ejecutamos transacción porque trabajamos con tablas temporales de Oracle
    DataConn.RollbackTrans

    Application.ScreenUpdating = False
    RecordsetToWorkSheet cmdRs, Hoja2, 1, 1, True
    Application.ScreenUpdating = True

    ' Liberar recursos
    DataConn.Close
    Set cmdSp = Nothing
    Set cmdRs = Nothing

End Sub

' Copia Recordset a una Hoja del Libro
Sub RecordsetToWorkSheet(recordset, _
                            sheet As Worksheet, row As Long, column As Long, headers As Boolean)
    Dim lcounter As Long
    Dim c As Long
    If headers Then 'Start of the extract - put field names in Row1
        For c = column To column + recordset.Fields.Count - 1
            sheet.Cells(row, c) = recordset.Fields(c - column).Name
        Next c
    End If
    lcounter = 1
    row = row + 1
    Do Until recordset.EOF
        For c = column To column + recordset.Fields.Count - 1
            sheet.Cells(row, c) = ParseColumnValue(recordset.Fields(c - column))
        Next c
        row = row + 1
        recordset.MoveNext
        lcounter = lcounter + 1
    Loop
End Sub

' Parsea el valor de una columna.
' Necesario porque en algún caso recordColumn.Value lanza un error
Function ParseColumnValue(recordColumn) As String
    On Error Resume Next
    ParseColumnValue = recordColumn.Value
    GoTo The_End
    ParseColumnValue = "????"
The_End:
End Function

Crossposted from crisfervil.com

06/03/09

Métrica y Personas

Archivado en: General — crisfervil @ 12:24 am

No es la primera vez que me ocurre. Un post de otro inspira uno mío.

Tras leer http://blog.ivangadea.com/2009/02/27/management-del-siglo-xx/ , copio el comentario que me inspiró.

—————————————————————————————————————————————————————–

Comprendo muy bien la necesidad de medir para mejorar la productividad. Me parece muy lógico que se pretenda medir para poder predecir resultados futuros.

Lo que no acabo de ver es que las medidas que se vayan tomando en un proyecto puedan servir para otro proyecto futuro.

Me parece que generalmente las empresas de software lo mismo hacen un programa de gestión para un vídeoclub que para una farmacia.

Y los programas, aunque conceptualmente son lo mismo, en realidad no se parecen en absoluto.

Creo que lo que complica la medición no es que existan distintos tipos de programador, que también, sino que los problemas a resolver son distintos.

No veo cómo las métricas de un programa para una farmacia pueden valer para un vídeoclub, y viceversa.

Por mi experiencia, entiendo que las métricas que tomé mientras desarrollaba el programa para la farmacia, me servirán en tanto mi siguiente desarrollo sea para otra farmacia que funcione más o menos igual.

Usando un símil, no sé si un arquitecto que haya diseñado un polideportivo pueda predecir con poco margen cuánto le costará diseñar un edificio de apartamentos. Y digo diseñar, que no construir.
De hecho, no creo que pueda predecir cuanto tardará en diseñar el siguiente polideportivo, a menos que sea bastante parecido.
Y fijaos que la gran diferencia entre lo diseñado por un arquitecto y por un diseñador de software (o arquitecto, si lo preferís) es que lo que diseñe el arquitecto de edificios, será prácticamente lo que finalmente se construya. De hecho, en muchas ocasiones, el arquitecto podrá hasta realizar pruebas de su producto antes de construirlo.

No sé, no he tenido ocasión de preguntárselo a un arquitecto. Pero en la fase de diseño, no hay métrica que valga.
El arquitecto no sabe de antemano cómo será el edificio antes de tener entre sus manos los planos.
Con diseño en mano, la historia es otra.
Sabremos con bastante exactitud cuánto costará levantar una pared. Y sabremos cuántas paredes va haber que levantar.

Y creo que con el software pasa lo mismo. Lo complicado del software es diseñarlo.
Y lo malo del software es que no siempre sabemos de antemano lo que hay que construir. Muchas veces no lo sabe ni el cliente.
Lo malo, o lo bueno del software, es que cuesta prácticamente lo mismo diseñarlo que construirlo. Por eso, no solemos diseñarlo con todo el detalle que lo haría un arquitecto.
Lo malo del software es que no podemos probarlo antes de codificarlo.

Yo creo que las aplicaciones habría que codificarlas dos veces. Una vez para desglosar todas las características que va a tener. Y otra para aplicar unas buenas prácticas. Os aseguro que la segunda vez sabríamos con bastante exactitud cuánto vamos a tardar. Y podremos mejorar la productividad. Y la calidad.

Y la calidad? qué es la calidad? entiendo que la calidad es la medida de los requisitos satisfechos.

En cuántos proyectos habéis trabajado en los que los requisitos estaban completamente descritos? Los requisitos funcionales, los de seguridad, los de rendimiento, los de interfaz, complejidad, mantenibilidad, etc.

Cuando el arquitecto firma un proyecto, el cliente obtiene un contrato en el que se detalla casi de todo. Y allí donde tenga cabida la interpretación habrá una normativa legal que aplicar.

Y otro tema importante: El arquitecto tiene responsabilidad legal sobre el producto que va a construir. Si no se ajusta a los requisitos, si el edificio no se ajusta a la normativa legal, a la memoria de calidades, etc., tiene que responder por ello.
Eso es algo que no he oído que haya pasado en la historia de la informática. Ni tan siquiera cuando han habido accidentes causados por fallos que hayan derivado en pérdidas humanas.

Creo que la mejora en las métricas y en el aumento de la productividad vendrán determinadas por lo que progresemos en estandarizar, desarrollar metodologías,  en crear componentes reutilizables, etc.

De hecho, creo que es algo que deberíamos aprender de las otras ingenierías. Creo que su éxito se basa en que rara vez se construye algo de cero. La mayoría de las veces, el trabajo de un ingeniero se trata de combinar adecuadamente elementos ya desarrollados.

(No lo sé con seguridad. ¿qué grado de fiabilidad hay las estimaciones de proyectos de IT? Un proyecto de IT consiste en combinar eficazmente componentes ya desarrollados)

Respecto al tema de la gestión de recursos, y a  la manera en la que se distinguen a los programadores buenos de los malos, por mi corta experiencia en la gestión de equipos, diré que las personas que funcionan mejor en un proyecto no son las que más saben, ni las que tienen más experiencia. Para mí, las personas determinantes en un proyecto son las que se implican más, las más motivadas, las que tienen una gran conciencia de equipo y programan sabiendo que el producto es el resultado del trabajo de todos, y no de uno solo, por muy bueno que sea. Yo creo que todos tienen mucho que aportar. El que tiene más experiencia, el que tiene mucha capacidad de análisis, el creativo, cada uno puede encontrar su espacio.
Por supuesto hace falta gente preparada, con conocimientos, experiencia y cierta aptitud. Pero para mí, lo determinante es que la gente esté a gusto, y sienta que su trabajo merece la pena.

Me parece que los proyectos que carezcan de personas que motivadas, tiene todas las papeletas de fracasar.

Creo que este aspecto de la profesión es igual para todos los trabajos en los que se dependa de la gente.

Y un buen manager, uno del siglo XXI,  debe saber gestionar estos recursos, y aportar motivación. Dar su espacio a cada uno, y hacer que se sienta valorado, para que pueda aportar lo mejor de sí mismo. Me parece que da igual las carencias que pueda tener una persona suficientemente motivada. Seguro que se esforzará por corregirlas.

Crossposted from crisfervil.com

Entradas más antiguas »

Blog de WordPress.com.