sábado, 30 de diciembre de 2017

Parte 1 - Fingerprint ZK4500 con C#

Una prueba implementando las funcionalidades del sensor biometrico o lector de huellas Fingerprint ZK4500 usando el lenguaje de programación C# y explicando conceptos del uso de este dispositivo.




Cualquier duda o consulta me puedes escribir.

https://www.facebook.com/chainizperu/

viernes, 15 de abril de 2016

Descargar archivo adjunto bloqueado por GMAIL

Desde hace un tiempo el GMAIL tiene un antivirus que revisa los archivos que adjuntamos y los bloquea si lo considera peligro. Esto también afecto a correos que antes enviamos o recibimos y que ahora no podemos descargar su contenido por el bloqueo del antivirus que se indico anteriormente.

Para ello, les paso un truco para poder descargar archivos adjuntos bloqueados por GMAIL en solo 8 simples pasos y usando el mismo navegador CHROME. 

1er Paso: Elegimos el archivo adjunto que el GMAIL no nos permite descargar.


2do Paso: Si pasamos el puntero del mouse (ratón) sobre el archivo veremos que no nos sale ninguna opción de descarga.


3er Paso: Damos clic derecho sobre el control previamente seleccionado y nos aparecerá un menú contextual. A continuación seleccionamos la opción "Inspeccionar" y le damos clic izquierdo.


4to Paso: Entraremos al código de control y como se ve resaltado, buscaremos la que dice "Guardar en Drive" y a continuación buscaremos la palabra que diga "display: none".


5to Paso: Damos doble clic sobre la palabra que dice "display: none" y esto nos permitirá modificar el valor.


6to Paso: Eliminar la configuración que dice "display: none;" y quedará como en la siguiente imagen. A continuación solo se sale del modo código y se regresa a la pagina de GMAIL.


7mo Paso: En el GMAIL veremos que ahora el archivo se puede enviar al DRIVE de google, en donde ya se podrá descargar.


8vo Paso: Por último, entramos al DRIVE y procedemos a descargar el archivo.


Con esto se puede recuperar archivos del GMAIL que no se pueden descargar de una manera rápida y sin configuraciones avanzadas o software adicional.


miércoles, 30 de septiembre de 2015

Consulta personalizada para buscar procesos en SQL SERVER 2008


Para poder visualizar los procesos actualmente ejecutados en nuestra base de datos, se puede usar el comando "sp_who2".



El problema con solo usar este comando es que no se puede filtrar o realizar una consulta simple para que nos muestre los datos que deseamos. Para ello, se puede usar la siguiente consulta para poder filtrar los valores que se desee mostrar u otro dato, ya que el resultado del comando "sp_who2" se almacena en una tabla temporal.

CREATE TABLE #sp_who2 (SPID INT,Status VARCHAR(255),
      Login  VARCHAR(255),HostName  VARCHAR(255), 
      BlkBy  VARCHAR(255),DBName  VARCHAR(255), 
      Command VARCHAR(255),CPUTime INT, 
      DiskIO INT,LastBatch VARCHAR(255), 
      ProgramName VARCHAR(255),SPID2 INT, 
      REQUESTID INT) 
INSERT INTO #sp_who2 EXEC sp_who2
SELECT * FROM        #sp_who2
WHERE       DBName = 'master'
ORDER BY    DBName ASC
DROP TABLE #sp_who2


Como se puede apreciar, se aplico un filtro para poder ver los procesos de la base de datos MASTER y se puede aplicar otros criterios que se desee como resultado de la consulta de procesos.



viernes, 9 de enero de 2015

La fortuna sonríe a los audaces

Audentes fortuna iuvat. (La fortuna sonríe a los audaces) 

Verso de la Eneida, de Virgilio (70 a.C. – 19 a.C).- La frase se emplea en la Eneida, concretamente en el verso 284 del libro X. La frase es aplicable a muchas personas que arriesgaron y triunfaron que son numerosas. Gente que lo dejó todo y acabó teniendo éxito en su arriesgada misión. Los empresarios de éxito te gritan “tienes que arriesgar para triunfar”. Si no te atreves a hablar con la chica más guapa de todas nunca sabrás si ella quería estar contigo.

Dejo la frase en Latín con el estilo "capitalis monumentalis" que era la forma de escritura en monumentos romanos.



miércoles, 19 de noviembre de 2014

Los 8 principios básicos de SOA

Según Thomas Erl, existe 8 principios básicos para la implementación de la arquitectura SOA. Estos son los siguientes.

  1. Carácter contractual de los servicios
  2. Bajo acoplamiento, 
  3. Abstracción de la implementación, 
  4. Reusabilidad, 
  5. Autonomía, 
  6. Carencia de estado (statelessness), 
  7. Capacidad de ser descubiertos 
  8. "Orquestabilidad” y susceptibilidad a composición. 
Los principios que influyen directamente en el Retorno de Inversión son: la Reusabilidad, la 
Capacidad de ser descubiertos y la Orquestabilidad.



miércoles, 24 de septiembre de 2014

Búsqueda de palabras dentro de todos los procedimientos almacenados

Les dejo una consulta muy útil para buscar palabras dentro de todos los procedimientos de la base de datos SQL. Esto es útil si requieren buscar todas las consultas que usan el comando DELETE y evitarías abrir una a una cada procedimiento para ver cual de todas usa este comando.

/*
Buscar en todos los procedimientos almacenados y 
listar el nombre del procedimiento y la fila donde se encuentra la palabra de la búsqueda
*/

SET NOCOUNT ON
 
DECLARE @ColumnName AS VARCHAR(255)
SET @ColumnName = 'DELETE'
 
IF OBJECT_ID('tempdb..#tmpOperacion') IS NOT NULL
        DROP TABLE #tmpOperacion
 
DECLARE @idSP AS INT

DECLARE @tmpTABLE AS TABLE(
  NombreSP NVARCHAR(255),
  TextoSP NVARCHAR(MAX))
 
SELECT @idSP = MIN(OBJECT_ID)
FROM sys.procedures
 
WHILE @idSP IS NOT NULL
BEGIN
    DECLARE @nameSP AS VARCHAR(255)
 
    SELECT TOP 1 @nameSP = RTRIM(LTRIM(name))
    FROM sys.procedures
    WHERE OBJECT_ID = @idSP
 
    IF OBJECT_ID('tempdb..#tmpText') IS NOT NULL
        DROP TABLE #tmpText
 
    CREATE TABLE #tmpText (idRow int identity(1,1), textRow NVARCHAR(MAX))
 
    INSERT INTO #tmpText(textRow) EXEC sp_helptext @nameSP
 
    DECLARE @idRow AS INT
    
    SELECT @idRow = MIN(idRow) FROM #tmpText
 
    WHILE @idRow IS NOT NULL
    BEGIN
 
        DECLARE @textRow AS NVARCHAR(MAX)
        
        BEGIN TRY
        
   SELECT TOP 1 @textRow = UPPER(textRow) FROM #tmpText WHERE idRow = @idRow
   
      IF (SELECT CHARINDEX(@ColumnName, @textRow)) > 0
   BEGIN
    INSERT INTO @tmpTABLE (NombreSP, TextoSP)
    VALUES (@nameSP, @textRow)
    BREAK
   END
  END TRY
  BEGIN CATCH
   --NO REGISTRA EL ERROR
  END CATCH

        SELECT @idRow = MIN(idRow)
        FROM #tmpText
        WHERE idRow > @idRow
    END
 
    IF OBJECT_ID('tempdb..#tmpText') IS NOT NULL
        DROP TABLE #tmpText
 
    SELECT @idSP = MIN(OBJECT_ID)
    FROM sys.procedures 
    WHERE OBJECT_ID > @idSP
    
END

SELECT NombreSP, TextoSP FROM @tmpTABLE ORDER BY NombreSP
 
SET NOCOUNT OFF

Espero que les sirva de ayuda y que le facilite la vida.

jueves, 31 de julio de 2014

Tipos Anónimos en .NET

Estuve probando lo útil que puede ser declarar tipos anónimos en .NET, ya que en otros lenguajes con javascript esto ya existe. Esto hace mas fluido el desarrollo y mas divertido, sin tener que preocuparnos en la declaración de la variable o subir y bajar el cursor de tu pantalla para ir a la parte declarativa (normalmente arriba del código) y bajar a la parte que se usará la variable.

A continuación, dejo 2 pequeñas pruebas para crear un objeto y un arreglo, muy útiles si es que se desea almacenar valores, definir alguna entidad o usar de repositorio temporal en el desarrollo.

Lo primero es una prueba donde declararemos y asignaremos valores al objeto anónimo.

var anonObject = new { name = "apple", diam = 4 };

Como se puede ver, se declaro un objeto con 2 atributos y en ese instante se le asigno valores. Con esto se obtuvo un objeto del tipo anónimo.


Ahora se declararemos un arreglo del tipo anónimo que contenga objetos de tipo anónimos.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};

Como se verá, se declaro un arreglo que contendrá 2 objetos anónimos iguales que el ejemplo anterior.


En conclusión, el uso de tipos anónimos mejora la fluidez del desarrollo y es una prueba que el lenguaje C#, como la plataforma .NET, sigue en constante evolución en beneficio de los desarrolladores, ya que desde mi punto de vista, facilita el desarrollo y aprendizaje de este lenguaje.