Archive for 2011

Cuestion de amores

Bob Marley dijo: '' Puedes no ser su primero, su ultimo o su único. Ella amo antes y puede amar de nuevo. Pero si ella te ama ahora, Que otra cosa importa? Ella no es perfecta, tú tampoco lo eres, y ustedes dos nunca serán perfectos. Pero si ella puede hacerte reír al menos una vez, te hace pensar dos veces, si admite ser humana y cometer errores, no la dejes ir y dale lo mejor de ti. Ella no va a ... recitarte poesía, no está pensando en ti en todo momento, pero te dará una parte de ella que sabe que podrías romper, su corazón.. No la lastimes, no la cambies, y no esperes de ella más de lo que puede darte. No analices. Sonríe cuando te haga feliz, grita cuando te haga enojar y extráñala cuando no esté. Ama con todo tu ser cuando recibas su amor. Porque no existen las chicas perfectas, pero siempre habrá una chica que es perfecta para ti.. ''
martes, diciembre 06, 2011
Posted by Carlos
Tag :

Siempre es preciso saber

Siempre es preciso saber cuándo se acaba una etapa de la vida. Si insistes en permanecer en ella más allá del tiempo necesario, pierdes la alegría y el sentido del resto. Siempre es necesario cerrar ciertas puertas con una llave, que luego debes olvidar...
martes, noviembre 29, 2011
Posted by Carlos
Tag :

Ordering Interger values stored in Varchar column

I have seen many newbies asking "How do I sort the numbers stored in varchar columns?"
Here are some methods
declare @t table(data varchar(15))
insert into @tselect '6134' union allselect '144' union allselect '7345' union allselect '109812' union allselect '100074'union allselect '1290' union allselect '45764'
--Method 1
select data from @torder by cast(data as int)
--Method 2
select data from @torder by data+0
--Method 3
select data from @torder by len(data),data
--Method 4
select data from @torder by replace(str(data),' ','0')
--Method 5
select data from @tgroup by dataorder by replicate('0',len(data)),data
--Method 6

select data from @torder by replicate('0',(select max(len(data+0)) from @t)-len(data))+data
--Method 7 select data from @tcross join
(
        select len(max(data+0)) as ln from @t) as torder by replicate('0',ln-len(data))+data
jueves, octubre 13, 2011
Posted by Carlos

Validar cero SQL

IsNull( Nullif(valor,0), 1)
miércoles, octubre 05, 2011
Posted by Carlos

DDAY.UPDATE error creating bootstrap

************** Exception Text ************** System.TypeLoadException: Could not load type 'System.Runtime.Versioning.TargetFrameworkAttribute' from assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

Bueno en mi caso funciono, cambiando la clase Compiler.cs
de: foreach (object obj in assembly.GetCustomAttributes(true)){}
a: foreach (object obj in assembly.GetCustomAttributesData()){}

Aún mas fácil , solo se debe cambiar el proyecto para que utilice a Taget Framework 4
miércoles, agosto 31, 2011
Posted by Carlos

Solución – Error al Instalar SQL Server 2008 R2



Error: “SQL server setup media does not support the language of the OS or does not have ENU localized files. Use the matching language-specific SQL Server media or change the OS locale through Control Panel.”
Solución:
  1. Ir al Panel de Control
  2. Configuración regional y de idioma
  3. Formatos: Seleccionar Español( España)
  4. Aplicar Cambios
  5. clip_image002
  6. Ejecutamos la Instalación de SQL SERVER 2008 R2
  7. Una vez instalado SQL Server podemos regresar a nuestra configuración anterior
  8. Listo! , Todo solucionado
jueves, julio 28, 2011
Posted by Carlos

Obtener diccionario de datos SQL Server

SELECT SchemaName = left(S.name, 45),
       TableName = cast(T.name AS VARCHAR(140)),
       ColOrder = C.column_id, --cast(C.column_id as varchar(6)),
       PK = isnull(key_ordinal, ''),
       ColumnName = left(C.name, 100),
       TYPE = left(Y.Name, 10), TipoUsu = left(Y2.Name, 10),
       LENGTH = CASE WHEN max_length = -1 THEN 'Max' ELSE cast(max_length AS VARCHAR(10)) END,
       C.PRECISION, C.Scale, Identi = is_identity, Nulos = C.is_nullable,
       Defaulf = cast(D.DEFINITION AS VARCHAR(10)),
       Collation = cast(C.Collation_name AS VARCHAR(20)), --C.* --, Y.*
       ColumnDescription = cast(P.value AS VARCHAR(500)),
       TableDescription = cast(P2.value AS VARCHAR(500))
FROM (
   SELECT object_id, schema_id, name FROM sys.VIEWS
   UNION ALL
   SELECT object_id, schema_id, name FROM sys.TABLES) T
inner join sys.schemas S ON T.schema_id = S.schema_id
inner join sys.COLUMNS C ON T.object_id = C.object_id
left join sys.systypes Y ON Y.xtype = C.system_type_id AND Y.status = 0
left join sys.systypes Y2 ON Y2.xtype = C.system_type_id AND Y2.status = 1
left join sys.default_constraints D ON D.object_id = C.default_object_id
left join sys.extended_properties P ON P.major_id = T.object_id AND P.minor_id = C.column_Id
left join sys.extended_properties P2 ON P2.major_id = T.object_id AND P2.minor_id = 0
left join (
 SELECT I.object_id, column_id, key_ordinal
 FROM sys.INDEXES I
 inner join sys.index_columns L ON I.object_id = L.object_id AND I.index_id = L.index_id
 inner join sys.key_constraints C ON I.object_id = C.parent_object_id AND I.name = C.name
   WHERE C.TYPE = 'PK'
) I ON I.object_id = T.Object_id AND I.column_id = C.column_id
WHERE T.name <> 'sysdiagrams'
lunes, julio 25, 2011
Posted by Carlos

Obtener el nombre de método en Run time

/// /// Devuelve el nombre del metodo desde el que se invoca este metodo 
/// public static string MethodContext()
{
   System.Diagnostics.StackFrame stack = 
      new System.Diagnostics.StackFrame(1);
   return stack.GetMethod().Name;
}

jueves, julio 21, 2011
Posted by Carlos
Tag :

Invocando un Servicio WCF Asincrónicamente


En WCF existen varias formas para consumir un servicio de forma asincrónica. La más simple quizás es poner el asincronismo del lado del cliente, que es lo que vamos a hacer en este post.
Para iniciar vamos a crear un proyecto del tipo WCF ServiceLibrary y vamos a crear un servicio muy simple que tiene solamente un método que retorna el número de frutas – strings – que se lo soliciten vía parámetro a la operación. La interface – contrato – del servicio se ve a continuación:
[ServiceContract(Namespace="http://drojasm.net")]
public interface IServicioProductos{
    [OperationContract]
    List<string> ObtenerProductos(int pCantidad);
}

Seguidamente procedemos con el código para implementar la operación. Como podemos ver en el siguiente código, este simplemente lo que hace es hacer un for y agregar un string a la lista por cada iteración. Nótese además la línea en donde ponemos a dormir el thread del servicio, esto con el fin de que nos de tiempo de hacer algo diferente en el UI mientras el servicio se ejecuta.
public class ServicioProductos : IServicioProductos
    {
        public List<string> ObtenerProductos(int pCantidad)
        {
            List<string> _productos = new List<string>();

            for (int i = 0; i < pCantidad; i++)
            {
                _productos.Add("Fruta Número " + i.ToString());
            }

            System.Threading.Thread.Sleep(5000);
            return _productos;

        }
    }
}

Ahora vamos a proceder a crear el cliente que va a consumir el servicio. En este caso vamos a utilizar una aplicación WPF. Lo primero que vamos a hacer después de crear la aplicación es agregar una referencia al servicio como se hace tradicionalmente; es decir, botón derecho sobre el proyecto, seleccionar agregar referencia, y en la pantalla de configuración de la referencia del servicio, poner la dirección del servicio – en este caso hosteado en el wcfsvchost – y por último obtener el wsdl del mismo.

image

Sin embargo, esta vez vamos a seleccionar además el botón de “Advanced” para configurar la generación del proxy. Luego en esta pantalla vamos a configurar la generación del proxy, seleccionando en esta la opción para generar clientes asincrónicos. Esta opción nos va a generar además de los métodos tradicionales sincrónicos, los métodos necesarios para invocar el servicio utilizando asincronismo.

image

Luego seleccionamos Ok en las siguientes dos pantallas y se procede con la generación del proxy. Como podemos ver en la siguiente figura, el proxy genera los métodos para consumir asincrónicamente el servicio.

image

Ahora procedemos a crear la pantalla en WPF para invocar el servicio. Para esto, vamos a agregar un listbox en donde pintamos el resultado de cada servicio. Además vamos a poner un textbox para que el usuario – yo Sonrisa - digite cuantos elementos quiere en la lista. También vamos a poner dos botones, uno para invocar el servicio sincrónicamente y otro asincrónicamente. Por último, vamos a poner un botón que va a lanzar un MessageBox cuando se le da click; el objetivo de este es demostrar que cuando invocamos el servicio de forma asincrónica, podemos llevar a cabo otras tareas mientras que cuando lo hacemos de forma sincrónica la pantalla se bloquea. El XAML de la pantala es el siguiente:
<Window x:Class="ClienteAsincronicoWCF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="447">
    <Grid>
        <ListBox Height="197" HorizontalAlignment="Left" Margin="47,74,0,0" Name="lstFrutas" VerticalAlignment="Top" Width="120" />
        <Label Content="Frutas" Height="28" HorizontalAlignment="Left" Margin="47,40,0,0" Name="label1" VerticalAlignment="Top" />
        <Button Content="Cargar Sincronicamente" Height="23" HorizontalAlignment="Left" Margin="213,220,0,0" Name="btnSincronico" VerticalAlignment="Top" Width="140" Click="btnSincronico_Click" />
        <Button Content="Cargar Asincronicamente" Height="23" HorizontalAlignment="Left" Margin="213,249,0,0" Name="btnAsincronico" VerticalAlignment="Top" Width="140" Click="btnAsincronico_Click" />
        <Label Content="Cantidad de Productos" Height="28" HorizontalAlignment="Left" Margin="213,146,0,0" Name="label2" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="213,180,0,0" Name="txtCantidad" VerticalAlignment="Top" Width="140" />
        <Button Height="75" HorizontalAlignment="Left" Margin="269,40,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click">
            <Button.Content>
                <StackPanel>
                    <Image Height="48" Name="image1" Stretch="Fill" Width="48" Source="/ClienteAsincronicoWCF;component/pens.png" />
                    <Label Content="Otra Tarea" Height="28" Name="label3" />
                StackPanel>
            Button.Content>
        Button>
    Grid>
Window>

Y la pantalla en modo de diseño es la siguiente:

image

El código del botón para la invocación sincrónica del servicio es el siguiente:
private void btnSincronico_Click(object sender, RoutedEventArgs e)
{
    lstFrutas.ItemsSource = null;
    ServicioProductosClient _proxy = new ServicioProductosClient();
    lstFrutas.ItemsSource =  _proxy.ObtenerProductos(int.Parse(txtCantidad.Text));
}

No olvidar agregar el namespace del servicio – el que digitamos en la pantalla para agregar la referencia al mismo.
using ClienteAsincronicoWCF.ReferenciaServicioProductos;

Como podemos ver en el código del botón, la forma de invocar este servicio es la tradicional; este procedimiento bloquea la pantalla y no permite realizar ninguna otra tarea mientras la invocación al servicio se esta ejecutando.

image

Ahora procedemos a agregar el código de la llamada asincrónica.
private void btnAsincronico_Click(object sender, RoutedEventArgs e)
{
    lstFrutas.ItemsSource = null;
    ServicioProductosClient _proxy = new ServicioProductosClient();
    AsyncCallback _callBack =
        delegate(IAsyncResult pResult)
        {
            this.Dispatcher.BeginInvoke((Action)delegate { lstFrutas.ItemsSource = _proxy.EndObtenerProductos(pResult); });                    
        };

    _proxy.BeginObtenerProductos(int.Parse(txtCantidad.Text), _callBack, _proxy);           
}

En este código nos vamos a detener un momento para analizarlo un poco mas detalladamente. En primera instancia procedemos a crear un delegate en donde vamos a obtener la respuesta del servicio. En este delegate además, debemos hacer un llamado a la operación BeginInvoke porque el thread en donde se invoca el proceso es diferente al thread del UI, por lo tanto no se puede asignar el resultado directamente a la lista. Por último, invocamos el servicio de forma asincrónica utilizando el método BeginObtenerProductos.

En el botón del MessageBox tenemos el siguiente código:
private void button1_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Iniciando otra operación");
}

Ahora procedemos a ejecutar el servicio con el botón btnAsincronico. Como podemos ver en la siguiente imagen, se pudo invocar al messageBox mientras el servicio estaba procesándose.

image


miércoles, junio 29, 2011
Posted by Carlos
Tag :

Saving changes is not permitted. The changes that you have made require the following tables to be dropped and re-created

ERROR:

“Saving changes is not permitted. The changes that you have made require the following tables to be dropped and re-created. You have either made changes to a table that can’t be re-created or enabled the option Prevent saving changes that require the table to be re-created.”
This error happens because “Saving Changes is not permitted” when using SQL Server 2008 Management Studio to modify the structure of a table especially when SQL Server needs to drop and recreate a table to save the structural changes. It is always advised to make a structural change for a table using TSQL. However, it is a convenient option for database developers to use SQL Server Management Studio make such changes  as the Prevent Saving Changes That Require Table Re-creation  option is enabled by default in SQL Server 2008 Management Studio.
Disable “Prevent saving changes that require the table re-creation” 
1.    Open SQL Server 2008 Management Studio (SSMS). Click Tools menu and then click on Options… as shown in the snippet below.

2.    In the navigation pane of the Options window, expand Designers node and select Table and Database Designers option as shown in the below snippet. Under Table Options you need to uncheck “Prevent saving changes that require the table re-creation” option and click OK to save changes.
This option when enabled prevents users from making structural changes to table using SQL Server Management Studio especially when SQL Server needs to recreate the table to save changes. By default, this option is checked and you need to uncheck this option to allow users to make any structural change through SSMS that   require table recreation.
A table needs to be recreated whenever any of the below   changes are made to the table structure.
·         Insert a new column in the middle of the table.
·         Add a new column in the table.
·         Change the Allow Nulls setting of a column.
·         Modify the identity property of a column.
·         Reorder the columns within a table.
·        Modify the datatype of a column.
Once you have disabled “Prevent saving changes that require the table re-creation” option you can go ahead and save the changes to the Employee Table. This will create a Validation Warning dialog box as shown in the below snippet. The warning message will be “One or more existing columns have ANSI_PADDING ‘off’ and will be re-created with ANSI_PADDING ‘on’”. Click “Yes” to save the changes.
Risks of Turing Off “Prevent Saving Changes that Require Table Re-creation” in SSMS
If you turn off this feature then you can avoid table recreation. However, if you have the Change Tracking feature of SQL Server 2008 enabled to track the table changes then the change tracking information will be lost completely whenever table is recreated. So, it is always advised to use this feature very carefully especially in a production environment.
Posted by Carlos

Cambiar el lenguaje de un sitio de Windows Sharepoint Services 3.0

Si estás leyendo esta página es muy probable que tu sitio de SharePoint WSS 3.0 se encuentre en un lenguaje distinto al que tu quieres por ejemplo tengo mi sitio de SharePoint en Ingles pero deseo cambiarlo a español y lo peor es que el sitio está lleno de información está en producción y está altamente personalizado, Instalaste el language pack en español pero no paso nada. Pues estas en el lugar apropiado para solucionar el incidente.

1. Instalar el Language Pack en español

En el sitio de la descarga, asegúrate deseleccionar el lenguaje Spansih



2. Instalar En el servidor el SQL Server Management Studio Express


3. Instalar el SQL Server Native Client

Clic aqui para ir al sitio de descarga

Una vez instalado, Abrir el Sql Server Management Studio Express y Conectarse a la instancia de SharePoint v3 con el canal named pipe, para esto, mirar en el registro (Inicio/Ejecutar Regedit) y navegar en la siguiente direccion:

HKEY_LOCAL_MACHINE
SOFTWARE
MicrosoftMicrosoft SQL Server
MICROSOFT##SSEE
MSSQLServer
SuperSocketNetLib
Np

Abrir la key llamada NamedPipe y copiar el contenido de esa key
Cierre el Editor de Registro de Windows.

4. Abra el sql server management studio express



Conectarse con los siguientes parametros:
Server Name: el named pipe que copiaste en la key NamedPipe del regedit
Autenticación: windows
Clic en Conectar


5. Cambiar el lenguaje


Navegar hasta la base de datos wss_content

Buscar la tabla dbo.webs y darle clic derecho abrir




Buscar el campo LANGUAGE y LOCALE y cambiarlos por el id del lenguaje en español tradicional es decir el 3082 el ingles Eu es el 1033

Esta tarea se puede hacer con un QUERY
UPDATE DBO.WEBS SET LANGUAGE = 3082, LOCALE = 3082
Cierre el SQL Server Management Studio Express.

6. Abra el sitio de SharePoint que estaba en Ingles

Hasta el momento hemos hecho la mayor parte del trabajo lo que sigue a continuación es revisar el sitio y mirar que algunos formularios tienen contenido en ingles, esto es por que cuando sitio del lenguaje anterior fue creado, el SharePoint generó unos formularios bajo los cuales incluyo el lenguaje Ingles por lo tanto, es necesario abrirlos con el SharePoint Designer y cambiar a mano el contenido de español a Ingles.


Eider Mauricio Aristizabal


martes, junio 14, 2011
Posted by Carlos

Paginar una colección List

public List ListaPaginada(int pPagina, int pItemsPorPagina)
{          
   return ColFiltrada.Skip((pPagina - 1) * pItemsPorPagina).Take(pItemsPorPagina).ToList();
}
viernes, junio 10, 2011
Posted by Carlos
Tag :

Como amo a mi mamá

 7 años: ¡¡¡Mami Te Amo!!! 
10 años: ¡¡¡Mamá Te Quiero!!! 
15 años: ¿Ma ...má? 
17 años:¡¡¡Cómo jodes vieja!!!
20 años: ¡¡¡Quiero irme de esta casa!!! 
35 años: ¡¡¡Quiero volver con mamá!!! 
50 años: No te vayas viejita... 
70 años: ¡¡¡Cuanto daría por cinco minutos con mi mamá!!! 
viernes, junio 03, 2011
Posted by Carlos
Tag :

Utilizando generics para hacer un DeepCopy

Para hacer una copia de un objeto y tengamos dos objetos independientes, se requiere un DeepCopy:
public static class DeepCopier
    {
        /// Se usa un tipo generic para poder copiar cualquier objeto
        public static T Copy(T pItem)        {
            BinaryFormatter vFormatter = new BinaryFormatter();
            MemoryStream vStream = new MemoryStream();
            vFormatter.Serialize(vStream, pItem);
            vStream.Seek(0, SeekOrigin.Begin);
            T vResult = (T)vFormatter.Deserialize(vStream);
            vStream.Close();
            return vResult;
        }
    }

Para utilizarlo:

 /// Copiamos el objeto por si se va a cancelar
cGrid vObjCancel = DeepCopier.Copy(ConfigReporto);
miércoles, junio 01, 2011
Posted by Carlos

Seleccionar un archivo, con un item de un PropertyGrid

Se debe crear una clase que derive de UITypeEditor

public class MyControl : Control
{
    string filePath;
    [Editor(typeof(FileLocationEditor), typeof(UITypeEditor))]
    public string FilePath
   {
        get { return filePath; }
        set { filePath = value; }
    }
}

public class FileLocationEditor : UITypeEditor
{
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) {
        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
   {
        using (OpenFileDialog ofd = new OpenFileDialog())
          {
            // set file filter info here
            if (ofd.ShowDialog() == DialogResult.OK) {
                return ofd.FileName;
            }
        }
      return value;
  }
lunes, mayo 30, 2011
Posted by Carlos

Que es postear



Remitir un mensaje al público mediante un foro, bitácora, grupo de noticias u otro medio informático similar

Un post se traduce en español como ‘artículo’, aunque se suele utilizar con la terminología inglesa o el nombre de ‘entradas’ en la publicaciones hechas en blogs.
Los posts son los artículos que vamos publicando en la parte central del blog y que se ordenan de manera cronológica. Por lo general, los posts tienen un titular, un cuerpo del artículo donde se puede introducir texto, fotografía, código html e incluso audio.
Los posts están archivados por categorías y también se acompañan de palabras clave relacionadas con el contenido del artículo.
Además, por lo general, los posts permiten que los lectores realicen comentarios, aunque es una función que se puede habilitar o deshabilitar en función de interés del autor del blog.
Este pequeño artículo que estás leyendo es un post!!!


viernes, mayo 27, 2011
Posted by Carlos

How big should text be? What's the ideal font size?

How can you be certain that everyone in the audience can read the text on your slides?
While the fonts and colors you choose have a definite impact on legibility, the single biggest factor is text size. The 8H rule is the time-honored way to make sure that even the folks in the back row can read the text on your slides.
The 8H rule says that the maximum viewing distance shouldn't be more than 8 times the height (H) of the screen; if that condition is met then as long as your text is at least 1/50th the height of the screen, then it'll be legible at the maximum viewing distance. That assumes that the person in the back row has good eyes, that the projected image is perfectly crisp, and that no other factors interfere. And it's an absolute minimum, not a recommended size.
A normal screen show slide in PowerPoint is 7.5 inches or 540 points tall, so the absolute, don't go below it minimum text size would be 540 / 50 or roughly 11 point text. For 35mm slides or good quality overheads, that's not unreasonable. For screenshow projection, it's wildly optimistic. You simply can't form legible text at this height ... roughly 12 pixels ... in most fonts. For projected 800x600 screens, I'd at least double that, or use 1/25th the screen height to determine minimum text size. That translates to roughly 22 points. Use 24 points to give yourself some extra leeway in case projection conditions or your audience's vision aren't perfect (they won't be).
Keep in mind that your screen may not be big enough to meet the 8H rule. If not, you'll have to compensate. For example, if the screen is 5 feet high in an 80 foot deep room, it's only half the recommended size, so you'll need to double the minimum text height to compensate.
miércoles, mayo 25, 2011
Posted by Carlos

Script para mostrar tablas segun su tamaño físico y numero de registros

Select Tabla,
       cast(Reservado    * d.low as int) ReservadoKB,
       cast(Data         * d.low as int) DatosKB,
       cast((Usado-Data) * d.low as int) IndicesKB,
       cast((Reservado-Data) * d.low as int) NoUsadoKB,
       registros
from (
select left(o.name,35) Tabla, o.id, ii.reserved Reservado,
      isnull(ip1.pages, 0) + isnull(ip2.pages, 0) data,
      ip3.usado,   --indexp= usado - data    no usado = reserved - usado
      r.Registros
from sysobjects o
inner join sysindexes ii on o.id = ii.id
inner join (select id, sum(dpages) pages from sysindexes where indid < 2 group by id) ip1
     on o.id = ip1.id
left  join (select id, isnull(sum(used), 0) pages from sysindexes where indid = 255 group by id) ip2
     on o.id = ip2.id
inner join (select id, sum(used) Usado from sysindexes where indid in (0, 1, 255) group by id) ip3
     on o.id = ip3.id
inner join (select id, rows Registros from sysindexes where indid < 2) r
     on o.id = r.id
where o.xtype = 'U'
and   ii.indid in (0, 1, 255)
) A, master.dbo.spt_values D
where D.number = 1
and   D.type = 'E'
lunes, mayo 23, 2011
Posted by Carlos

Me caí del mundo y no sé por dónde se entra...



Lo que me pasa es que no consigo andar por el mundo tirando cosas y cambiándolas por el modelo siguiente sólo porque a alguien se le ocurre agregarle una función o achicarlo un poco.
    No hace tanto, con mi mujer, lavábamos los pañales de los críos, los colgábamos en la cuerda junto a otra ropita, los planchábamos, los doblábamos y los preparábamos para que los volvieran a ensuciar.
    Y ellos, nuestros nenes, apenas crecieron y tuvieron sus propios hijos se encargaron de tirar todo por la borda, incluyendo los pañales.
    ¡Se entregaron inescrupulosamente a los desechables! Si, ya lo sé. A nuestra generación siempre le costó botar. ¡Ni los desechos nos resultaron muy desechables! Y así anduvimos por las calles guardando los mocos en el pañuelo de tela del bolsillo.
    ¡¡¡Nooo!!! Yo no digo que eso era mejor. Lo que digo es que en algún momento me distraje, me caí del mundo y ahora no sé por dónde se entra. Lo más probable es que lo de ahora esté bien, eso no lo discuto.     Lo que pasa es que no consigo cambiar el equipo de música una vez por año, el celular cada tres meses o el monitor de la computadora todas las navidades.
    ¡Guardo los vasos desechables!
    ¡Lavo los guantes de látex que eran para usar una sola vez!
    ¡Los cubiertos de plástico conviven con los de acero inoxidable en el cajón de los cubiertos!
  Es que vengo de un tiempo en el que las cosas se compraban para toda la vida!
    ¡Es más!
    ¡Se compraban para la vida de los que venían después!
   La gente heredaba relojes de pared, juegos de copas, vajillas y hasta palanganas de loza.
   Y resulta que en nuestro no tan largo matrimonio, hemos tenido más cocinas que las que había en todo el barrio en mi infancia y hemos cambiado de refrigerador tres veces.
    ¡¡Nos están fastidiando! ! ¡¡Yo los descubrí!! ¡¡Lo hacen adrede!! Todo se rompe, se gasta, se oxida, se quiebra o se consume al poco tiempo para que tengamos que cambiarlo. Nada se repara. Lo obsoleto es de fábrica.
    ¿Dónde están los zapateros arreglando las media-suelas de los tenis Nike?
     ¿Alguien ha visto a algún colchonero escardando colchones casa por casa?
    ¿Quién arregla los cuchillos eléctricos? ¿El afilador o el electricista?
    ¿Habrá teflón para los hojalateros o asientos de aviones para los talabarteros?
    Todo se tira, todo se desecha y, mientras tanto, producimos más y más y más basura.
    El otro día leí que se produjo más basura en los últimos 40 años que en toda la historia de la humanidad.
    El que tenga menos de 30 años no va a creer esto: ¡¡Cuando yo era niño por mi casa no pasaba el que recogía la basura!!
    ¡¡Lo juro!! ¡Y tengo menos de.... años!
    Todos los desechos eran orgánicos e iban a parar al gallinero, a los patos o a los conejos (y no estoy hablando del siglo XVII)
    No existía el plástico ni el nylon. La goma sólo la veíamos en las ruedas de los autos y las que no estaban rodando las quemábamos en la Fiesta de San Juan.
    Los pocos desechos que no se comían los animales, servían de abono o se quemaban. De 'por ahí' vengo yo. Y no es que haya sido mejor.. Es que no es fácil para un pobre tipo al que lo educaron con el 'guarde y guarde que alguna vez puede servir para algo', pasarse al 'compre y bote que ya se viene el modelo nuevo'.Hay que cambiar el auto cada 3 años como máximo, porque si no,  eres un arruinado. Así el coche que tenés esté en buen estado . Y hay que vivir endeudado eternamente para pagar el nuevo!!!!  Pero por Dios.
    Mi cabeza no resiste tanto.
    Ahora mis parientes y los hijos de mis amigos no sólo cambian de celular una vez por semana, sino que, además, cambian el número, la dirección electrónica y hasta la dirección real.
    Y a mí me prepararon para vivir con el mismo número, la misma mujer, la misma casa y el mismo nombre (y vaya si era un nombre como para cambiarlo) Me educaron para guardar todo. ¡¡¡Toooodo!!! Lo que servía y lo que no. Porque algún día las cosas podían volver a servir. Le dábamos crédito a todo.
    Si, ya lo sé, tuvimos un gran problema: nunca nos explicaron qué cosas nos podían servir y qué cosas no. Y en el afán de guardar (porque éramos de hacer caso) guardamos hasta el ombligo de nuestro primer hijo, el diente del segundo, las carpetas del jardín de infantes y no sé cómo no guardamos la primera caquita. ¿Cómo quieren que entienda a esa gente que se desprende de su celular a los pocos meses de comprarlo?
    ¿Será que cuando las cosas se consiguen fácilmente, no se valoran y se vuelven desechables con la misma facilidad con la que se consiguieron?
    En casa teníamos un mueble con cuatro cajones. El primer cajón era para los manteles y los repasadores, el segundo para los cubiertos y el tercero y el cuarto para todo lo que no fuera mantel ni cubierto. Y guardábamos.. . ¡¡Cómo guardábamos!! ¡¡Tooooodo lo guardábamos!! ¡¡Guardábamos las tapas de los refrescos!! ¡¿Cómo para qué?! Hacíamos limpia-calzados para poner delante de la puerta para quitarnos el barro. Dobladas y enganchadas a una piola se convertían en cortinas para los bares. Al terminar las clases le sacábamos el corcho, las martillábamos y las clavábamos en una tablita para hacer los instrumentos para la fiesta de fin de año de la escuela. ¡Tooodo guardábamos!
    Cuando el mundo se exprimía el cerebro para inventar encendedores que se tiraban al terminar su ciclo, inventábamos la recarga de los encendedores descartables. Y las Gillette -hasta partidas a la mitad- se convertían en sacapuntas por todo el ciclo escolar. Y nuestros cajones guardaban las llavecitas de las latas de sardinas o del corned-beef, por las dudas que alguna lata viniera sin su llave. ¡Y las pilas! Las pilas de las primeras Spica pasaban del congelador al techo de la casa. Porque no sabíamos bien si había que darles calor o frío para que vivieran un poco más. No nos resignábamos a que se terminara su vida útil, no podíamos creer que algo viviera menos que un jazmín.
    Las cosas no eran desechables.. Eran guardables. ¡¡¡Los diarios!!! Servían para todo: para hacer plantillas para las botas de goma, para pone r en el piso los días de lluvia y por sobre todas las cosas para envolver. ¡¡¡Las veces que nos enterábamos de algún resultado leyendo el diario pegado al trozo de carne!!!
    Y guardábamos el papel plateado de los chocolates y de los cigarros para hacer guías de pinitos de navidad y las páginas del almanaque para hacer cuadros y los goteros de las medicinas por si algún medicamento no traía el cuentagotas y los fósforos usados porque podíamos prender una hornalla de la Volcán desde la otra que estaba prendida y las cajas de zapatos que se convirtieron en los primeros álbumes de fotos y los mazos de naipes se reutilizaban aunque faltara alguna, con la inscripción a mano en una sota de espada que decía 'éste es un 4 de bastos'.
    Los cajones guardaban pedazos izquierdos de pinzas de ropa y el ganchito de metal. Al tiempo albergaban sólo pedazos derechos que esperaban a su otra mitad para convertirse otra vez en una pinza completa.
    Yo sé lo que nos pasaba: nos costaba mucho declarar la muerte de nuestros objetos. Así como hoy las nuevas generaciones deciden 'matarlos' apenas aparentan dejar de servir, aquellos tiempos eran de no declarar muerto a nada: ¡¡¡ni a Walt Disney!!!
    Y cuando nos vendieron helados en copitas cuya tapa se convertía en base y nos dijeron: 'Cómase el helado y después tire la copita', nosotros dijimos que sí, pero, ¡¡¡minga que la íbamos a tirar!!! Las pusimos a vivir en el estante de los vasos y de las copas. Las latas de arvejas y de duraznos se volvieron macetas y hasta teléfonos. Las primeras botellas de plástico se transformaron en adornos de dudosa belleza. Las hueveras se convirtieron en depósitos de acuarelas, las tapas de botellones en ceniceros, las primeras latas de cerveza en portalápices y los corchos esperaron encontrarse con una botella.
    Y me muerdo para no hacer un paralelo entre los valores que se desechan y los que preservábamos. ¡¡¡Ah!!! ¡¡¡No lo voy a hacer!!! Me muero por decir que hoy no sólo los electrodomésticos son desechables; que también el matrimonio y hasta la amistad son descartables.
    Pero no cometeré la imprudencia de comparar objetos con personas. Me muerdo para no hablar de la identidad que se va perdiendo, de la memoria colectiva que se va tirando, del pasado efímero.. No lo voy a hacer. No voy a mezclar los temas, no voy a decir que a lo perenne lo han vuelto caduco y a lo caduco lo hicieron perenne. No voy a decir que a los ancianos se les declara la muerte apenas empiezan a fallar en sus funciones, que los cónyuges se cambian por modelos más nuevos, que a las personas que les falta alguna función se les discrimina o que valoran más a los lindos, con brillo,pegatina en el cabello y glamour.
    Esto sólo es una crónica que habla de pañales y de celulares. De lo contrario, si mezcláramos las cosas, tendría que plantearme seriamente entregar a la 'bruja' como parte de pago de una señora con menos kilómetros y alguna función nueva. Pero yo soy lento para transitar este mundo de la reposición y corro el riesgo de que la 'bruja' me gane de mano y sea yo el entregado.

                                                    Eduardo Galeano, periodista y escritor Uruguayo
viernes, abril 29, 2011
Posted by Carlos
Tag :

Personalizar el FCKEditor

Este componente ofrece un control de entrada de texto HTML, requiero que no se muestren las opciones de formato de fuente.
En la carpeta donde esta alojado el sitio web, buscar y editar:
..\FCKeditor\fckconfig.js

Por defecto esta de esta manera:

FCKConfig.ToolbarSets["Default"] = [
['Source','DocProps','-','Templates'],
['Cut','Copy','Paste','PasteText','PasteWord','-','SpellCheck'],
['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
['Bold','Italic','Underline','StrikeThrough'],['Subscript','Superscript'],
['OrderedList','UnorderedList','-','Outdent','Indent'],
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['Link','Unlink','Anchor'],
['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
['Style'],['FontFormat'],['FontName'],['FontSize'],
['TextColor','BGColor'],
['FitWindow']
] ;

Y para este caso debe quedar así:

FCKConfig.ToolbarSets["Default"] = [
['Source','DocProps','-','Templates'],
['Cut','Copy','Paste','PasteText','PasteWord','-','SpellCheck'],
['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
['Bold','Italic','Underline','StrikeThrough'],['Subscript','Superscript'],
['OrderedList','UnorderedList','-','Outdent','Indent'],
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['Link','Unlink','Anchor'],
['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
['TextColor','BGColor'],
['FitWindow']
] ;

Se graba y los cambios se reflejan al momento, si esto no sucede es porque el javascript se ha cacheado, simplemente CTRL-F5 en IE o su equivalente en otros navegadores.
jueves, abril 14, 2011
Posted by Carlos

Ideas básicas de desarrollo con WWF

A modo de resumen, ideas básicas que tenemos que tener presente cuando desarrollamos WWF.
Existen tres tipos de flujos de trabajo:

Workflow Secuencial, útil para operaciones repetitivas y predecibles que siempre son iguales (ParallelActivity, EventHandlingScopeActivity, ConditionedActivityGroup, ListenActivity, IfElseActivity, WhileActivity, ReplicatorActivity).

Workflow State Machine, compuesto por un conjunto de estados controlados por eventos (EventDrivenActivity, SetStateActivity, StateActivity, StateInitializationActivity, StateFinalizationActivity)

Workflow controlado por datos, depende de los datos para determinar si se ejecutan o no ciertas actividades basadas en un estado de datos local.

Existe tres modalidades de contemplar WF y la lógica de negocio:

Sólo código. Éste es el modo de creación predeterminado para Windows Workflow Foundation
Separación de código
Sin código

Un RuleSet está compuesto de una o más condiciones de regla y sus acciones resultantes. Son como reglas de instrucción IF-THEN-ELSE, con la condición que corresponde a IF, y las acciones que definen el comportamiento de las cláusulas THEN y ELSE. El mecanismo de evaluación puede describirse conceptualmente como:

Comience con la lista de reglas activas.

Busque la regla de prioridad máxima.

Evalúe la regla y ejecute sus acciones Then/Else, según corresponda.

Si las acciones de una regla actualizan un campo o propiedad utilizada por la condición de una o más reglas anteriores de la lista (las que tienen mayor prioridad), vuelva a evaluar esas reglas anteriores.

Windows Workflow Foundation proporciona compatibilidad para la recuperación de errores de transacción mediante la actividad TransactionScopeActivity para encapsular transacciones System.Transactions.NET Framework, que automáticamente deshacen sus acciones si se produce un error.

Su flujo de trabajo guarda periódicamente su estado en un almacenamiento persistente durante determinados puntos de control llamados puntos de persistencia. Si algo va mal en su flujo de trabajo, podría ser necesario que el motor de tiempo de ejecución recupere la información conservada para volver a un estado estable. Si dos o más componentes se están comunicando, es a menudo útil coordinar la persistencia para que los estados de los componentes sean coherentes. Los lotes de trabajo los usan los servicios externos al flujo de trabajo para conservar información de estado. Estos servicios procesan por lotes sus elementos de trabajo y comparten la misma transacción que la del flujo de trabajo. Si el flujo de trabajo no está llevando a cabo una transacción, algunos elementos de trabajo aún pueden ser procesados por lotes por los servicios durante los puntos de persistencia.
Windows Workflow Foundation proporciona IWorkBatch y IPendingWork para ayudar a los servicios y las instancias de flujo de trabajo a conservar información de estado.

El control de errores en Windows Workflow Foundation hace referencia al control de excepciones de una manera asincrónica. Esto significa que el motor de tiempo de ejecución de flujo de trabajo detecta las excepciones producidas en una actividad (explícita o implícitamente) y, a continuación, se programan en una cola para ser administradas más tarde. Esto difiere del control de excepciones normal en que si se produce una excepción en un bloque try, el bloque catch exception adecuado lo detecta o se devuelve inmediatamente al usuario.

El modelo de compensación de Windows Workflow Foundation para transacciones completadas es el proceso de administrar cualquier excepción de negocio que se produce en un flujo de trabajo y deshacer lógicamente las transacciones completadas. La compensación de Windows Workflow Foundation puede ser:

Implícita de forma predeterminada, cuando no se especifica el controlador de excepciones o no se administra una excepción concreta.

Explícita, cuando se utiliza la actividad CompensateActivity. Para obtener más información, consulte Uso de la actividad CompensateActivity.

Los servicios de comunicación de Windows Workflow Foundation admiten el intercambio de datos entre un flujo de trabajo y su entorno host. Los servicios de comunicación de Windows Workflow Foundation le permiten a un flujo de trabajo intercambiar datos con un host local mediante las clases HandleExternalEventActivity y CallExternalMethodActivity junto con las interfaces que admiten el atributo ExternalDataExchangeAttribute.

Windows Workflow Foundation proporciona a los diseñadores y programadores una manera declarativa de crear flujos de trabajo mediante el lenguaje de marcado de aplicaciones eXtensible (XAML) para crear archivos de origen de marcado. Estos archivos de marcado se pueden compilar en un tipo de flujo de trabajo, cargarse directamente en el motor de tiempo de ejecución en el flujo de trabajo en tiempo de ejecución, o se pueden compilar en un tipo de flujo de trabajo con archivos de código subyacente implementados en C# o Visual Basic. Esto significa que los archivos de marcado de flujo de trabajo pueden compilarse o no, según las razones comerciales y si se requiere lógica de implementación adicional. El uso de marcado del flujo de trabajo con archivos lógicos de código subyacente es similar a cómo ASP.NET separa los archivos de presentación de los archivos lógicos.

Windows Workflow Foundation contiene un conjunto predeterminado de actividades que proporcionan la funcionalidad para el flujo de control, las condiciones, el control de eventos, la administración de estados, y la comunicación con aplicaciones y servicios. Al diseñar flujos de trabajo, puede utilizar las actividades proporcionadas por Windows Workflow Foundation y crear sus propias actividades personalizadas.

Las actividades son las unidades de creación fundamentales de los flujos de trabajo. Un flujo de trabajo es un conjunto de actividades organizadas jerárquicamente en una estructura de árbol. Una actividad representa una acción en un flujo de trabajo. Puede ser una acción simple, como un retraso, o una actividad compuesta que se compone de varias actividades secundarias. Una actividad, como un flujo de trabajo, puede ser secuencial, lo que significa el orden de sus acciones se especifica en el tiempo de diseño. O, la actividad puede estar orientada a eventos, lo que significa que el orden de sus acciones se determina en el tiempo de ejecución en respuesta a eventos externos. Cada actividad tiene un contexto de ejecución que representa el entorno de ejecución de la actividad. Puede utilizar las API de Windows Workflow Foundation para crear actividades personalizadas. Desarrolle una actividad personalizada mediante la definición de una clase de actividad personalizada que derive directamente de Activity, o de una actividad predeterminada que deriva de Activity. Tiene la opción de personalizar varios aspectos de su actividad personalizada, por ejemplo, la serialización, la validación, el diseño y la lógica predeterminada, utilizando un conjunto de clases relacionadas que encapsulan esas partes de funcionalidad concretas. Los atributos de actividad se utilizan para hacer referencia a estas clases personalizadas de modo que se utilice la lógica personalizada en lugar de la lógica predeterminada que usan los atributos.

Windows Workflow Foundation proporciona numerosos servicios que su aplicación puede utilizar para procesar por lotes el trabajo mediante transacciones, administrar el subprocesamiento de instancias de flujo de trabajo, conservar instancias de flujo de trabajo en medios de almacenamiento para posterior recuperación y realizar el seguimiento de la ejecución de instancias de flujo de trabajo.

El motor de tiempo de ejecución de Windows Workflow Foundation es responsable de crear y mantener en ejecución las instancias de flujo de trabajo. Para conseguirlo, el motor de tiempo de ejecución necesita un proceso host que incluya aplicaciones de consola, aplicaciones basadas en Windows Forms, sitios web de ASP.NET y servicios web. Además, las aplicaciones habilitadas por flujos de trabajo que hospedan el motor de tiempo de ejecución de Windows Workflow Foundation pueden refinar más el comportamiento del motor de tiempo de ejecución del flujo de trabajo utilizando los servicios. Los servicios base en Windows Workflow Foundation se pueden configurar para que admitan transacciones, persistencia, seguimiento, subprocesamiento y programación. Para la funcionalidad específica de aplicación, su aplicación puede definir también servicios personalizados que se pueden agregar al motor de tiempo de ejecución.

Windows Workflow Foundation admite servicios de comunicación local en el entorno host del flujo de trabajo y las comunicaciones de servicio web.

Los servicios de comunicación de Windows Workflow Foundation permiten a un flujo de trabajo interactuar con un sistema externo a través de mensajería con métodos y eventos. Los eventos se usan para enviar datos a un flujo de trabajo, mientras que los flujos de trabajo utilizan métodos para enviar datos a la aplicación host. La capacidad de comunicarse con los flujos de trabajo a través de eventos proporciona una manera asincrónica de enviar datos a un flujo de trabajo.
martes, abril 12, 2011
Posted by Carlos
Tag :

Populares!

- Copyright © - Oubliette - -Metrominimalist- Powered by Blogger - Designed by Johanes Djogan -