Demo Disponible: Cuadro de Coste Amortizado

junio 8, 2010 14:14 by eugenioestrada

Acabamos de hacer pública la demo de nuestro producto Cuadro de Coste Amortizado. Consiste en unas funciones que permiten hacer uso de este nuevo método publicado en el Plan General de Contabilidad de 2007. La demo consiste en unas funciones de Excel:

  1. CuadroCosteAmortizado()

    En esta función los periodos son genéricos: 0, 1, 2,..., . Partiendo de los mismos, de los flujos de caja a ellos asociados y del número de periodos que delimitan el corto del largo plazo (1 para años, 2 para semestres, 4 para trimestres y 12 para meses) suministra las magnitudes del cuadro.

  2. CuadroCosteAmortizadoNoPer()

    En esta función los flujos de caja están referidos a fechas reales concretas y, en función de ellas, se suministran las magnitudes del cuadro. Para ello calcula el tipo de interés efectivo diario, teniendo presente el calendario real, es decir, meses de 28, 29, 30 o 31 días, según corresponda.

Para poder descargarla ir al siguiente enlace: http://www.lusco.eu/costeamortizado


Actualmente calificado con 3.5 por 4 personas

  • Currently 3,5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Como hacer un WCF Service con Streaming

junio 8, 2010 13:11 by eugenioestrada

Haciendo pruebas esta mañana he mirado como hacer un servicio en WCF por Streaming y es bastante sencillo.

Lo que debemos hacer es configurar nuestro servicio modificando su binding en el Web.Config

<bindings>
  <basicHttpBinding>
    <binding name="HttpStreaming" maxReceivedMessageSize="67108864"
              transferMode="Streamed"/>
  </basicHttpBinding>
</bindings>

Una vez que lo tengamos ya podemos hacer que nuestras operaciones devuelvan o reciban un objeto de tipo Stream. Por un lado modificamos el contrato de nuestro servicio:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Stream GetData();
}

Y por otro lado el método.

public class Service1 : IService1
{
    public Stream GetData()
    {
        StringBuilder sb = new StringBuilder();

        for (long i = 0; i < 10; i++)
        {
            sb.AppendLine("Prueba" + i.ToString());
        }
 
        var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(sb.ToString()));

        return stream;
    }
}

Con esto en el cliente también recibiremos un Stream y con un StreamReader podríamos leer su contenido.

Espero sea útil.


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Estamos en Twitter y en Facebook

junio 2, 2010 12:19 by LuscoTekhne

Lusco_Tekhne3_Transparente_600

Las redes sociales hoy en día son uno de los medios de difusión más importantes, nosotros no lo obviamos y desde hoy estamos tanto en Twitter como en Facebook. Ahí iremos publicando los nuevos elementos de vayamos escribiendo en el blog.

Podéis seguirnos, comentar y participar de la forma que veáis más conveniente.

Estos son los enlaces:

http://twitter.com/LuscoTekhne

http://www.facebook.com/pages/Lusco-Tekhne/343188763287


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Paralelizando tareas

junio 2, 2010 09:45 by eugenioestrada

Cada vez son más los equipos que al menos tienen dos núcleos, ahora mismo ya tenemos algunos con cuatro que emulan ocho. Pero no estamos, como desarrolladores, explotando ese potencial.

Imaginaros que tenemos en memoria una lista con cientos de miles de objetos y debemos realizar alguna operación sobre ellos, como cambiar un valor. Nosotros haríamos algo similar a:

foreach (var objeto in lista)
{
    objeto.dato = nuevoValor;
}

Esta instrucción sería equivalente a hacer:

for (int i = 0; i < lista.count; i++)
{
    var objeto = lista[i];
    objeto.dato = nuevoValor;
}

Estas instrucciones tendrían una complejidad O(n), pero solo harían uso de un solo núcleo.

Si estamos usando .NET 4.0, éste nos trae de serie una serie de funciones para paralelizar trabajos y de tal forma que va a repartir las tareas en diferentes núcleos.  No solo eso, sino que si un núcleo tiene capacidad para n tareas también se le pondrán n tareas a él.

Para hacer eso tan solo hay que cambiar un poco la llamada anterior:

lista.AsParallel().ForEach (objeto =>
{
    objeto.dato = nuevoValor;
});

El resultado final es que durante el proceso de ese bucle el procesador se pondrá al 100%, pero la tarea será ejecutada en menos tiempo.

Algunas consideraciones sobre paralelismo:

Debemos tener en cuenta que al realizar un trabajo en paralelo tenemos principalmente tres problemas:

  • Dividir el problema
  • Sincronizar las tareas
  • Unir el problema de nuevo

Todo esto tiene el problema de que supone una carga computacional extra que solamente será “rentable” si el bucle es muy grande. De todas formas en caso de que fuese pequeño debería ser imperceptible estas operaciones, ya que la carga computacional será pequeña de todas formas.


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Mostrar un texto en un DataGrid sin elementos en WPF

marzo 26, 2010 10:54 by MarcosSanchez

En muchas ocasiones utilizamos un DataGrid para realizar búsquedas. En estos casos, nos puede interesar informar al usuario de que no se han encontrado registros tras una búsqueda, de una forma más explícita que por el mero hecho de que no contenga elementos. Para ello, el DataGrid puede mostrar un texto con el mensaje que se considere apropiado. Para conseguir esto con el DataGrid de WPF (WPF Toolkit), podemos modificar el estilo del control añadiendo un objeto TextBlock, cuya visibilidad dependerá de que el DataGrid contenta o no elementos. En el código XAML que se muestra a continuación, vemos resaltado en negrita las modificaciones necesarias para hacer esto:

XAML:

<ControlTemplate TargetType="{x:Type Controls:DataGrid}">
  <Border >

      <Grid>
          <TextBlock Name="PART_EmptyText" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"/>
              <ScrollViewer Focusable="false" >
                    <ScrollViewer.Template> 
               …

                   </ScrollViewer.Template> 
                   <ItemsPresenter Name="itemsPresenter" /> 
             </ScrollViewer>        

        </Grid>
  </Border>
  <ControlTemplate.Triggers>
    <Trigger Property="HasItems" Value="False">
      <Setter TargetName="PART_EmptyText" Property="Visibility" Value="Visible"/>
      <Setter TargetName="itemsPresenter" Property="Visibility" Value="Collapsed"/>
    </Trigger>

  </ControlTemplate.Triggers>
</ControlTemplate>

Una vez que tenemos el TextBlock, nos faltaría poder asignarle un texto a mostrar cuando no haya elementos. Podemos hacerlo con una AttachedProperty, que en este caso hemos llamado EmptyText:

C#:

public static readonly DependencyProperty EmptyTextProperty = DependencyProperty.RegisterAttached("EmptyText", typeof(string), typeof(DataGridBehavior), new PropertyMetadata(OnEmptyTextChanged));

private static void OnEmptyTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    DataGrid dataGrid = (d as DataGrid);
    if (dataGrid != null)   dataGrid.Loaded += dataGrid_Loaded;
}

private static void dataGrid_Loaded(object sender, RoutedEventArgs e)
{
    DataGrid dataGrid = (sender as DataGrid);
    if (dataGrid != null)
    {
        dataGrid.ApplyTemplate();

        if (!string.IsNullOrEmpty(GetEmptyText(dataGrid)))
        {
             //Accedemos al elemento PART_EmptyText de la plantilla aplicada al DataGrid, y asignamos su propiedad Text
          TextBlock texto = dataGrid.GetChild("PART_EmptyText", true) as TextBlock;
          if (texto != null) texto.Text = GetEmptyText(dataGrid);

        }
    }
}

La forma de utilizarlo en un DataGrid sería la siguiente:

XAML:

<Controls:DataGrid Behaviors:DataGridBehavior.EmptyText="No se han encontrado elementos"         />

DataGridSinDatos


Actualmente calificado con 5.0 por 1 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Deshabilitar el analizador de Resharper en un fichero o parte de él.

marzo 18, 2010 12:09 by marcossanchez

Resharper es una herramienta imprescindible en el desarrollo de aplicaciones con Visual Studio. Sin embargo, hay situaciones en las que tenemos archivos demasiado grandes y el analizador de Resharper puede tardar una eternidad en procesar el fichero, o dar incluso una OutOfMemoryException. Para solucionarlo, podemos:

  • Crear una Region con un nombre especial para que Resharper no analice su contenido
    • En el menú de opciones de Resharper, en la opción Settings, podemos usar como nombre de la Region uno de los que aparecen en la lista, o añadir un elemento nuevo.
  • Deshabilitar el analizador para ficheros concretos:
    • Podemos hacerlo pulsando [Ctrl+8] o en el menú de opciones de Resharper, en la opción Settings, boton Advanced…

Actualmente calificado con 3.0 por 1 personas

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Utilizar la clase DateTime en XAML

enero 15, 2010 13:21 by marcossanchez

Para utilizar DateTime.Today o DateTime.Now en XAML se puede utilizar:

{x:Static sys:DateTime.Today}

{x:Static sys:DateTime.Now}

Hay que referenciar sys de la siguiente forma:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

En el siguiente ejemplo se llama a un converter al que se le pasa la fecha de hoy y devuelve la de mañana en formato dd/MM

Header="{Binding Source={x:Static sys:DateTime.Today}, Converter={App:FechaMasDiasToDDMMConverter}, ConverterParameter=1}"


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Mejoras en los Converters: MarkupExtension y Propiedades

enero 15, 2010 13:04 by marcossanchez

En un control XAML complejo, solemos encontrarnos con el problema de tener que crear gran cantidad de Converters para enlazar correctamente propiedades de controles gráficos con propiedades del ViewModel asociado. Para ello debemos crear, además de la clase Converter correspondiente(código C#), un Recurso en el control XAML y referenciarnos a él en el Binding donde queramos usarlo. Ejemplo:

XAML:

<UserControl.Resources >

    <Resources:NombreConverter x:Key="NombreConverter"/>

</UserControl.Resources >

                        …

{Binding Path=Propiedad, Converter={StaticResource NombreConverter}}

Esta forma de asignar el Converter puede resultar tediosa cuando tenemos gran cantidad de ellos. Para solucionarlo, podemos hacer que la clase Converter que creamos, extienda de MarkupExtension. De esta forma, podremos referenciarnos a él directamente, de la forma:  

XAML:

{Binding Path=Propiedad, Converter={Converters:NombreConverter}}

Otra mejora para determinados Converters es la posibilidad de pasarle parámetros. Aunque al Converter se le puede asignar un ConverterParameter, a veces es necesario pasar varios parámetros, y/o nos interesa que estos parámetros tengan nombre y tipo. Para ello, podemos crear en la clase Converter las propiedades que necesitemos y, si queremos, asignarles valores por defecto en un constructor. Ejemplo:

Código:

public class NombreConverter : MarkupExtension, IValueConverter
{
    public NombreConverter()
    {
        Propiedad= valor;
    }

    public valor Propiedad { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //Lógica de conversión (Puede accederse a Propiedad)
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

XAML:

    Converter={Converters:NombreConverter Propiedad=valor}


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Despliegue distribuido de clientes en .NET problemas y futuro

octubre 28, 2009 00:22 by eugenioestrada

Desde la beta 1 de Visual Studio 2010 llevo testeándolo, pero aun no me había atrevido a escribir nada. Pero esta mañana leí una cosa que me pareció bastante interesante.

Para aquellos que tenemos aplicaciones distribuidas usando .NET 3.5 SP1 tenemos bastantes problemas a la hora de la distribución o inclusión de nuevos clientes.

Estos problemas derivan de que .NET 3.5 SP1 es una recopilación de bastantes actualizaciones partiendo de .NET 2.0 como base:

image

Lo que supone instalar 6 actualizaciones acumulativas, esto sobre una instalación base de XP sin .NET. Sobre todo la última actualización .NET 3.5 SP1 se hizo más pesada de lo habitual. Ya que incluía parches para el .NET 2.0, para el .NET 3.0 y para .NET 3.5. Ya que aun que en el gráfico yo lo puse en ese orden, no fue ese el orden real de publicación, ya que el .NET 2.0 SP2 y el .NET 3.0 SP2 fueron publicados junto al .NET 3.5 SP1 y durante un tiempo solo se podían instalar con el .NET 3.5 SP1 (el gráfico de publicación lo podéis ver a continuación).

image

Esto supuso un gran problema. Si nosotros nuestro proyecto de .NET 2.0 (con Visual Studio 2005) lo migrábamos a Visual Studio 2008 SP1 (liberado junto a .NET 3.5 SP1) y compilábamos con .NET 2.0, realmente estaría compilando con .NET 2.0 SP2 y en nuestros clientes no funcionaría. El problema se vio agravado ya que el paquete de .NET 2.0 SP2 no estuvo disponible hasta 6 meses después de la liberación de .NET 3.5 SP1. Cosa que obligaba instalar en todos los clientes el monumental .NET 3.5 SP1 (que ocupaba 3 veces más que su original 2.0). No solo eso, la instalación de dicho paquete se hacía eterna (aproximadamente entre 45 min y 1 hora dependiendo de la máquina). Esto en una máquina, ni en diez, es problema. Pero si hablamos de un sistema distribuido con un número considerable de clientes, si que podría ser un problema, sobre todo garantizando el funcionamiento del sistema durante la implantación y su mantenimiento.

Otra solución posible sería el planteamiento del uso del Client Profile de .NET Framework, que es una versión reducida para clientes distribuidos. Pero, solo era posible la opción si partíamos de una instalación limpia (sin .NET) y solo disponible en XP (ya que Windows Vista trae consigo .NET 3.0 y Windows 7 tiene .NET 3.5 SP1).

Pero .NET 4.0 tiene grandes novedades en su .NET Framework 4 Client Profile. Como gran novedad, al contrario que su antecesor, se puede instalar en cualquier SO y plataforma donde .NET 4 Framework esté soportado. Siendo Client Profile un subset de .NET 4 completo y el .NET 4 completo es un superset del primero. No solo eso, además han conseguido reducir el Client Profile a un distribuible de apenas 30 MB, incluyendo las tecnologías más comunes de los clientes como Windows Forms o WPF. Por otra parte, Visual Studio 2010 Beta 2 en sus proyectos de escritorio tiene por defecto el Client Profile activado.

Siendo esta la tabla comparativa (extraída de un post de Scott Guthier):

 

 

.NET Framework 4 Client Profile (NEW)

.NET Framework 3.5 SP1 Client Profile

Supported OS

Supported on all platforms and  OSs that are supported by the .NET Framework (excluding IA64 and the Server Core role in W2K8)

Supported only on Windows XP 32-bit machines that did not have any .NET Framework version installed.

(Client Profile setup silently installs the full 3.5 SP1 Framework otherwise)

Redistributable

Supports redistributable as well as web download

Supports web download only

Add Remove Programs entries

The full Framework comprises the Client Profile and another part called “Extended”. Thus it has two entries in the Add/Remove Programs dialog (or Programs and Features window).

If you installed the Full Framework, you can switch to the Client Profile by simply removing “Extended” from Add/Remove Programs.

Single entry in Add Remove Programs

Visual Studio

Improved support for Client Profile targeting in Visual Studio 2010.

By default many Visual Studio 2010 Beta2 Client project target the NET4 Client Profile.

Single checkbox in Visual Studio 2008 Service Pack 1 “Application” Project properties for .NET Framework 3.5 projects. Client Profile support unavailable in out-of-the-box VS 2008.

Features

Includes new .NET 4  features (such as Managed Extensibility Framework (MEF), C# 4 Dynamic Keyword,etc) as well as features previously included in NET 3.5 SP1 Full (Speech, WPF Spell Check, etc)

Subset of features in .NET 3.5 SP1 Full

Espero que os sea útil e interesante :-)

Follow me: http://twitter.com/eugenioestrada


Actualmente calificado con 3.0 por 2 personas

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Microsoft e Intel anuncian Silverlight para Moblin

septiembre 26, 2009 11:34 by EugenioEstrada

Microsoft e Intel acaban de anunciar el desarrollo de una implementación especifica de Silverlight para el S.O. basado en Linux de Intel, Moblin. Dicho sistema operativo tiene un repositorio de aplicaciones similar al del iPhone, donde sería distribuída dicho paquete.

Ha llamado especialmente la atención este anuncio ya que ya existe una implementación de Silverlight para Linux, Moonlight, tras el amparo de Novell. Pero Microsoft e Intel han justificado una nueva implementación en que mientras que Novell, con Moonlight, su target son S.O. de escritorio. Microsoft seguirá desarrollando implementaciones especificas, como puede ser la de Moblin, la de Nokia, etc. Ya que está sería con la ayuda de Intel para conseguir una mejor experiencia en equipos basados en Atom.

Para más información:

Programa de desarrollo de Intel Atom: http://appdeveloper.intel.com/en-us/
Moblin: http://moblin.org/
Moonlight: http://www.mono-project.com/Moonlight
Noticia: http://www.theregister.co.uk/2009/09/24/silverlight_to_linux/


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5