21 oct 2008

ArrayList y ToArray()

Algunas veces necesitamos hacer algunas cosas un poco, digamos, extrañas. Por ejemplo supongamos que estamos usando una "caja negra" con un método que utilice un arreglo de Objetos ya definidos, utilicemos de ejemplo el objeto Autmovil. La firma sería algo mas o menos asi:

public void Ensamblar(Automovil[] automoviles)

Pero nosotros por alguna extraña razón, de esas que se dan en la informática, no podemos determinar de antemano cuantos instancias de Automovil vamos a enviarle al método. Por ejemplo asumamos que tenemos que hacer un recorrido de los seleccionados por el usuario, y no queremos realizar el recorrido dos veces (una para determinar el número y la segunda para cargar los objetos en el arreglo). Por lo tanto no podemos definir el tamaño del arreglo de antemano.

Una de las soluciones es utilizar ArrayList.

ArrayList ListaAutomoviles = new ArrayList ();

Así durante un solo recorrido de lo elegido por el cliente llenamos las propiedades de cada objeto Automovil (instanciado, digamos, Auto) y utilizamos la instrucción ListaAutmoviles.Add(Auto) para llenarlo. Finalmente podemos utilizar algo similar :

Autmovil[] Autos = (Autmovil [])ListaAutomoviles.ToArray(typeof(Autmovil));

Con esto creamos el arreglo tal y como nos lo pide la firma del método en cuestión. Probablemente no sea el mejor ejemplo, pero al menos muestra como funciona el método ToArray() del ArrayList.

10 oct 2008

Una de MP3 Player

Resulta que hace como un año que tengo un SANSA e280 v2 de 8Gb, el aparatito tiene varias características agradables como la grabadora de voz y el radio FM, en fin... se había comportado muy bien el reproductor hasta hace poco.

Entonces me sucedieron un par de inconvenientes: primero, sin razón aparente, se apagó y no quiso volver a encender, ni conectando el cable para cargar ni nada y segundo mi pc dejó de reconocerlo.

"A la madre que lo parió" pensé yo, pero oh bendita santa Internet! patrona de todos aquellos que no leemos manuales de dispositivos electrónicos que nos sacas de nuestra ignominiosa ignorancia. He aquí las soluciones para ambos Casos:

- El Sansa e280 no enciende:
. Presionar el boton de encendido por 10 segs. (ma o meno) mientras al mismo tiempo también deja presionada una de las direccionales (yo presione la de la izquierda) y ... chan chan! santo remedio encendió el aparatejo, de hecho si tienes los audífonos puestos oirás un leve clic que indica que el animalito reaccionó.

- La PC no reconoce el Sansa e280:
. Apagar el aparato.
. Bloquear el reproductor(mover el switch de manera que quede expuesta la parte naranja)
. Tener lista en la PC la ventana con "Mi PC" seleccionada de manera que puedas ver las unidades disponibles.
. Dejar presionado el botón de grabación y conectar a la computadora.
. Mantener el botón de grabación presionado hasta que aparezca disponible la unidad de Sansa.

Como lo he dicho los dos métodos me funcionaron satisfactoriamente.

Así que puede volver a oír Power Metal!!!

8 oct 2008

SQL SERVER y usuarios huérfanos

Algunas veces, especialmente cuando hacemos respaldos de una base de datos y nos la llevamos para otra máquina para hacer el restore, nos damos cuenta que el usuario que utilizábamos no existe, ha quedado huérfano.

He aquí como recomponer el asunto, desde como crear el Login USRBD1 linkearlo con el usuario USRBD1, todo en una base de datos llamado BD1

1-Se crea el login USRBD1 con su password correspondiente
USE [BD1]
GO
   CREATE LOGIN [USRBD1] WITH PASSWORD=N'PASSW@RD1', DEFAULT_DATABASE=[BD1],
       CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO


2- Se crea el usuario y se asocial al login creado anteriormente
USE [BD1]
GO
   CREATE USER [USRBD1] FOR LOGIN [USRBD1]
GO
   USE [BD1]
GO
   ALTER USER [USRBD1] WITH DEFAULT_SCHEMA=[USRBD1]
GO

USE [BD1]
GO
   CREATE SCHEMA [USRBD1] AUTHORIZATION [USRBD1]
GO

3-Se le asigna el rol de owner
USE [BD1]
GO
EXEC sp_addrolemember N'db_owner', N' USRBD1'
GO


4- ESTA ES LA LINEA MAGICA – con esta se reparan los usuarios huérfanos
EXEC sp_change_users_login 'Auto_Fix', ' USRBD1'

Gracias a Pigosky, Tito kun y Allan Senpai

ThreadAbortException Response.Redirect

Gracias a Pigosky, un geniecillo de la informática, que me pasó este artículo donde se trata el error producido por el Response.Redirect o el Server.Transfer.

Resumiendo se produce porque el Response.Redirect() internamente llama a Response.End() que a su vez llama a Thread.Abort() lo que produce el error.

Para resolver esto usamos el método con el segundo parámetro en false, o sea:
Response.Redirect(mipagina.aspx, false) ;
Con esto evitamos que se llame a Response.End(). Si bien esto resuelve en la mayoría de lo casos el error, es más seguro y eficiente añadir inmediatamente después la linea:
HttpContext.Current.ApplicationInstance.CompleteRequest();
para dar por finalizado el request de la pagina y que ésta no se siga dibujando ni ejecutando.

Ademas como indica el articulo es recomendable hacer override de los métodos RaisePostBackEvent y Render aunque esto último no es tan necesario.

16 may 2008

Excluir paginas del Form Authentication

Cuando usamos forms authentication la mayoría de las veces necesitamos excluir paginas de la autenticación para que las puedan acceder usuarios sin autenticar. Para esto supongamos que tenemos un web site simple con tres paginas, a saber:

Default.aspx -> donde se realiza la autenticación
Default2.aspx -> pagina que deseamos excluir de la autenticación (que todos puedan verla)
Default3.aspx -> pagina que pueden solo usuarios autenticados.

Para alcanzar esto debemos modificar nuestro web.config para que quede de la siguiente manera:
<configuration>
<location path="Default2.aspx">
        <system.web>
            <authorization>
                <allow users="?"/>
            </authorization>
        </system.web>
    </location>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <compilation debug="true"/>
        <authentication mode="Forms">
            <forms name="myform" loginUrl="Default.aspx"></forms>
        </authentication>
        <authorization>
            <deny users ="?"/>
            <allow users="*"/>
        </authorization>
    </system.web>
</configuration>
Recordemos que si deseamos hacer esto para paginas dentro de carpetas, lo podemos hacer en el web.config en la raiz del sitio, o colocando un nuevo web.config en cada carpeta y en éste colocar la seccion de "location" con los "path" que deseamos excluir de la autenticación.

15 may 2008

Deshabilitar el cache en el Browser

Para obligar a los browsers a no usar el cache para almacenar paginas usar:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
en evento Load de la página.

15 ene 2008

evitar doble clic

Se puede usar un javascript, en asp.net 2.0, para evitar el doble clic en un boton, previendo que la pagina haya sido validada del lado del cliente antes de ocultar el boton.
function HiddenBeforeClick()
{
    if (typeof(Page_ClientValidate)=='function')
    {
        if (Page_ClientValidate()== true)
        {
            event.srcElement.className = "Oculto";
        }
    }
    else
    {
        event.srcElement.className = "Oculto";
    }
}
La clase en el .css unicamente oculta el boton.
.Oculto
{
    visibility:hidden;
}

3 ene 2008

Expresion regular para contraseña

Se me encargó la tarea de usar un RegularExpresionValidator para validar un campo contraseña con unas curiosas características:
  • No se pueden usar vocales.
  • No se pueden usar caracteres especiales.
  • Debe tener al menos un numero.
  • Debe contener al menos una letra.
La expresión que construí para esto es la siguiente:

^([^aeiouAEIOU\W]+)?\d+[^aeiouAEIOU\d\W]+
([^aeiouAEIOU\W]+)?|[^aeiouAEIOU\d\W]+\d+
([^aeiouAEIOU\W]+)?$


funciona tanto con el RegularExpresionValidator como con el Regex de System.Text.RegularExpressions.

2 ene 2008

Feliz Año

Feliz 2008

Habra que ver que nuevas cosas nos traerá este año que recién comienza.