sábado, 10 de noviembre de 2012

KeePass para distros Debian

KeePass Password Safe, instalación desde un distro basado en Debian:
  • sudo apt-add-repository ppa:jtaylor/keepass
  • sudo apt-get update
  • sudo apt-get install keepass2

viernes, 27 de julio de 2012

Cómo identificar bloqueos en SQL Server

SQL Server es capaz recibir solicitudes de servicio de un gran número de usuarios concurrentes. Cuando SQL Server atiende las solicitudes de muchos clientes, hay una gran posibilidad de que se produzcan conflictos si diferentes procesos solicitan el acceso a los mismos recursos al mismo tiempo. Un conflicto en el que un proceso está esperando otro para liberar un recurso se llama bloqueo. Si bien en SQL Server un proceso bloqueado se resuelve cuando el primer proceso libera el recurso, pero hay veces en que un proceso mantiene un bloqueo de transacción y no lo libera. Aquí les dejo diferentes técnicas para detectar bloqueos y solucionar los problemas en SQL Server.

Nuevamente les dejo un resumen-traducción de una publicación de MSSQLTips escrita por Basit Farooq.

Ver los procesos bloqueados:

  1. USE [master]
  2. GO
  3. SELECT session_id
  4.     ,blocking_session_id
  5.     ,wait_time
  6.     ,wait_type
  7.     ,last_wait_type
  8.     ,wait_resource
  9.     ,transaction_isolation_level
  10.     ,lock_timeout
  11. FROM sys.dm_exec_requests
  12. WHERE blocking_session_id <> 0
  13. GO
Ver los bloqueos según su estado (GRANT-WAIT-CONVERT):
  1. USE [master]
  2. GO
  3. SELECT * from sys.dm_tran_locks
  4. WHERE request_status = 'CONVERT'
  5. GO
La columna request_session_id contiene el ID del proceso. Para ver el bloqueo en una base de datos particular, ejecutar la siguiente consulta, que une sys.dm_tran_locks con sys.partitions:
  1. USE [master]
  2. GO
  3. SELECT tl.resource_type
  4.     ,tl.resource_associated_entity_id
  5.     ,OBJECT_NAME(p.object_id) AS object_name
  6.     ,tl.request_status
  7.     ,tl.request_mode
  8.     ,tl.request_session_id
  9.     ,tl.resource_description
  10. FROM sys.dm_tran_locks tl
  11.   LEFT JOIN sys.partitions p
  12.   ON p.hobt_id = tl.resource_associated_entity_id
  13. WHERE tl.resource_database_id = DB_ID()
  14. GO
La vista dinámica sys.dm_os_waiting_tasks nos brinda información sobre bloqueos y procesos bloqueados. Los procesos bloqueados están listados en la columna session_id y los bloqueos en blocking_session_id.
  1. USE [master]
  2. GO
  3. SELECT w.session_id
  4.     ,w.wait_duration_ms
  5.     ,w.wait_type
  6.     ,w.blocking_session_id
  7.     ,w.resource_description
  8.     ,s.program_name
  9.     ,t.text
  10.     ,t.dbid
  11.     ,s.cpu_time
  12.     ,s.memory_usage
  13. FROM sys.dm_os_waiting_tasks w
  14.   INNER JOIN sys.dm_exec_sessions s
  15.   ON w.session_id = s.session_id
  16.   INNER JOIN sys.dm_exec_requests r
  17.   ON s.session_id = r.session_id
  18.   OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) t
  19. WHERE s.is_user_process = 1
  20. GO
Los muy conocidos sp_who/sp_who2 nos brindan información sobre todas las sesiones establecidas con la BD y sus respectivos ID (ipid). Ambos procedimientos aceptan parámetros. La columna blk de sp_who y la columna blkby de sp_who2 contienen el spid de procesos bloqueados.
  1. USE master
  2. GO
  3. EXEC sp_who 'active';
  4. -- EXEC sp_who2 'active';
  5. GO
Y para matar un proceso tenemos la instrucción KILL. Se puede utilizar la instrucción KILL para ver el estado de un proceso o matarlo:
  1. USE master
  2. GO
  3. KILL spid | UOW [WITH STATUSONLY]
  4. GO
Para mayor información sobre este tema los invito a visitar la artículo original haciendo click AQUÍ o enviándome un mensaje, saludos.

viernes, 11 de mayo de 2012

esIPv4 en Java

Método en Java que determina si un String corresponde a un IPv4 válida.
Recuerden que el javadoc es un documento html generado, por lo tal debemos utilizar el &_acute; cuando necesitamos puntuación en la documentación del método; y para que los mensajes en pantalla se generen con puntuación debemos utilizar las salidas unicode con el \uXXXX, con esto nos aseguramos que los símbolos y caracteres especiales se muestren correctamente en cualquier SO.

/**
  * M&eacte;todo que verifica si el String ingresado corresponde a una dirección IP v4.
  * @param ip IP a verificar.
  * @return true Si el String ingresado corresponde a una dirección IP v4. 
  * @throws java.lang.Exception En caso de que el String ingresado no respete las reglas de una IP v4. 
  */
public static boolean esIPv4( String ip ) throws Exception{ 
    try{ 
        /* Verificacion de la longitud del texto. */
        if( ip == null || ip.trim().length() < 7 ){
            return false;
        }


        /* Segmentacion de los valores de la IP. */
        String[] temp = ip.split( "\\." ); 
    
        /* Verificacion de la cantidad de octetos ingresados. */ 
        if( temp.length != 4 ){ 
            return false;
        } 
       
        /* Que todos los octetos sean un numero. */
        /* Ver metodo isNumeric( String ) en mi blog. */
        for( String oct : temp ){ 
            if( !isNumeric(oct) ){ return false; } 
        }


        /* Limites de valores permitidos en los octetos. */ 
        int[] dir = new int[]{ 
                Integer.parseInt( temp[0] ), 
                Integer.parseInt( temp[1] ), 
                Integer.parseInt( temp[2] ), 
                Integer.parseInt( temp[3] ) 
        };


        if( dir[0] > 254 || dir[0] <= 0 || 
               dir[1] > 254 || dir[1] < 0 || 
               dir[2] > 254 || dir[2] < 0 || 
               dir[3] > 254 || dir[3] <= 0 ){ 
            return false; 
        } 
     
        return true;
    }catch( Exception ex ){ 
        throw new Exception( 
             "Error en el m\u00c9todo: esIPv4( String )\n - " + ex.getMessage() 
        ); 
    } 
}

lunes, 19 de marzo de 2012

Valor por omisión para una columna de tipo Fecha en MySQL

Bueno en Microsoft SQL Server estamos acostumbrados a asignar un valor por omisión para un campo de una tabla de tipo DateTime utilizando la función getDate(), pero en MySQL el asunto es algo distinto, en pocas palabras, el campo debe ser de tipo: TIMESTAMP y el valor por omisión debe ser: CURRENT_TIMESTAMP.

Ejemplo:

CREATE TABLE tbPrueba(
    campo1 VARCHAR(32),
    campo2 TIMESTAMP default CURRENT_TIMESTAMP
)

Script para FullBackup en SQL Server 2008

DECLARE @dia nvarchar(10)
SET @dia = CONVERT( nvarchar(10), getDate(), 20 )
DECLARE @strSQL nVarchar(MAX) = 'BACKUP DATABASE [miBaseDatos] TO  DISK = N''C:\miBaseDatos\BackUps\miBaseDatos bkFull ' + @dia + '.bak'' WITH NOFORMAT, NOINIT,  NAME = N''miBaseDatos-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10, CHECKSUM'
exec( @strSQL )

declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'miBaseDatos' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'miBaseDatos' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''miBaseDatos'' not found.', 16, 1) end

-- Verificar el BK! Importante!
SET @strSQL = 'RESTORE VERIFYONLY FROM  DISK = N''C:\miBaseDatos\BackUps\miBaseDatos bkFull ' + @dia + '.bak'' WITH  FILE = '+ CAST( @backupSetId as nVarchar(MAX) ) +',  NOUNLOAD,  NOREWIND'
exec( @strSQL )

miércoles, 1 de febrero de 2012

Fragmentación de Índices en SQL Server

Nuevamente le muestro un resumen traducido del artículo "Stairway to SQL Server Indexes: Level 11, Index Fragmentation" de David Durant, 2012/02/01 SQL Server Central y por supuesto información que agrego de mis experiencias con la herramienta ^_^

 ¿Qué es la fragmentación?

La fragmentación del índice se presenta en dos variedades: la fragmentación interna y fragmentación externa. La mejor herramienta para la determinación de la fragmentación, ya sea interna o externa de un índice es la función de administración dinámica sys.dm_db_index_physical_stats. Debido a que esta función muestra el identificador de índice pero no el nombre del índice, las consultas a menudo se unen a la vista sys.indexes, a fin de incluir el nombre del índice en la salida.

Fragmentación Interna

Cada página puede contener un número determinado de entradas. Eso no significa que una página siempre tiene el número máximo de entradas. Por lo general, una página de índice no está completamente lleno. Cuando decimos índice de fragmentación interna, nos referimos a que las páginas no están completamente llenas. La cantidad promedio de espacio ocupado por página en un índice es una medida de la fragmentación interna del índice. Tenga en cuenta que cuanto mayor sea la medición, menor será la fragmentación interna, una página que es de 100% de su capacidad no tiene fragmentación interna.

La fragmentación interna es normalmente expresada como un porcentaje, e indica la plenitud de bytes, no en las entradas. Por lo tanto, una página de índice que tiene una fragmentación interna de 96% podría estar completamente lleno. Es decir, un 4% de la página podría no ser suficiente espacio para una nueva entrada que se añade. Cuando el espacio ocupado por la información de encabezado de página y la página de consejos de compensación se explica, una página cuyo índice de entradas individuales son relativamente grandes puede ser "completo" en un 90%, 80% o incluso menos ..

La función sys.dm_db_index_physical_stats muestra la fragmentación interna en su columna de salida avg_page_space_used_in_percent. Ejemplo:
 
SELECT IX.name AS 'Name'
     , PS.index_level AS 'Level'
     , PS.page_count AS 'Pages'
     , PS.avg_page_space_used_in_percent AS 'Page Fullness (%)'
  FROM sys.dm_db_index_physical_stats(
           DB_ID(),
           OBJECT_ID('Sales.SalesOrderDetail'),
           DEFAULT, DEFAULT, 'DETAILED') PS
  JOIN sys.indexes IX
    ON IX.OBJECT_ID = PS.OBJECT_ID AND IX.index_id = PS.index_id
  WHERE IX.name = 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID';
GO
 
La primera fila de la salida anterior, nos dice que las filas de la tabla se reparten en 1.234 páginas que son, en promedio, el 99% de su capacidad. En otras palabras, esta tabla tiene un mínimo de fragmentación interna.
 
Fragmentación Externa

En contraste con la fragmentación interna, la fragmentación externa se refiere a la falta de correlación entre la secuencia lógica de un índice y su secuencia física. También se expresa en porcentajes. Para citar a Microsoft Technet, es "el porcentaje de páginas fuera de orden (out-of-order pages) en las páginas de la hoja de un índice. Una página fuera de orden es una página donde la siguiente página física asignada al índice no es la página a la que apunta el puntero de página-siguiente (next-page) en la página de la hoja actual". Aunque la definición se limita solo a nivel de hoja, se dará cuenta de que sys.dm_db_index_physical_stats puede devolver información de todos los niveles de fragmentación de un índice.

Tenga en cuenta que, a diferencia de la fragmentación interna, un número más alto significa una mayor cantidad de fragmentación externa, por lo que un índice con una fragmentación externa de 100% esta completamente fragmentada externamente. Es decir, no hay correlación alguna entre su secuencia lógica y física de las páginas.
 
SELECT IX.name AS 'Name',
    PS.index_level AS 'Level'
    PS.page_count AS 'Pages',
    PS.avg_fragmentation_in_percent AS 'External Fragmentation (%)',
    PS.fragment_count AS 'Fragments',
    PS.avg_fragment_size_in_pages AS 'Avg Fragment Size'
FROM sys.dm_db_index_physical_stats(
    DB_ID(),
    OBJECT_ID('Sales.SalesOrderDetail'),
    DEFAULT, DEFAULT, 'LIMITED') PS
JOIN sys.indexes IX
    ON IX.OBJECT_ID = PS.OBJECT_ID AND IX.index_id = PS.index_id
WHERE IX.name = 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID';
GO
 
Como se especificó 'LIMITED' para el último parámetro, tendremos sólo una fila de salida:
 
Prevención y Cura para la fragmentación y la división de página

Hay dos opciones para el mantenimiento de índices, la reconstrucción del índice, lo que elimina la fragmentación externa y le da el control sobre el llenado de la página del índice en reconstrucción, y la reorganización del índice, lo que reduce la fragmentación externa y puede aumentar la plenitud de la página.

ALTER INDEX AK_SalesOrderHeader_rowguid
ON Sales.SalesOrderHeader
REBUILD
WITH ( FILLFACTOR = 7 );
GO
 
FILLFACTOR (Factor de Relleno): se utiliza para afinar almacenamiento de datos para los índices y el rendimiento de éste. Cuando se crea un índice o este es reconstruido, el valor del FILLFACTOR determina el porcentaje de espacio en cada página a nivel de hoja para ser llenada con los datos, reservando el resto en cada página como espacio libre para un futuro crecimiento. Por ejemplo, especificando un FILLFACTOR de 80 significa que el 20 por ciento de todas las páginas se deja vacío, proporcionando un espacio para la expansión del índice cuando se agregan datos a la tabla subyacente. El espacio vacío se reserva entre las filas del índice en lugar de al final del índice.

El valor del FILLFACTOR es un porcentaje de 1 a 100, y el valor por defecto a nivel de servidor es 0, lo que significa que las páginas se llenan a capacidad.

Este valor lo debemos utilizar cuando tenemos mucho conocimientos del comportamiento de muestra tabla, por ejemplo, la cantidad de inserciones, actualizaciones, etc. Si tenemos una tabla a la cual solo realizaremos operaciones de INSERT y/o SELECT, el FILLFACTOR podría ser de 100% para llenar completamente las páginas y evitar la fragmentación.

Para información más detallada ingresa al link original, espero les sea de ayuda.

 

viernes, 13 de enero de 2012

¿Cómo excluir la máscara del texto de un control MaskedTextBox de .NET 2008?

Un tip pequeño pero que tal vez algun@s no han encontrado, es el cómo excluir del texto que retorna un control MaskedTextBox en VB.NET 2008, pues es muy sencillo, puedes jugar con las distintas opciones de la propiedad de este control llamada: TextMaskFormat, en este caso sería el valor: ExcludePromptAndLiterals.


En código VB sería algo así:
mskMiTextBox.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals