2014/06/29

Cómo respaldar los datos de tus redes sociales

¿Te has preguntado qué pasaría si alguien obtuviera acceso a una cuenta de tus redes sociales y te dejara afuera? ¿o si un día a Instagram se le ocurriera cerrar tu cuenta? Si te aterra pensar todo lo que perderías, quizás sea hora de que, además de respaldar tu disco duro, empieces a respaldar también los datos de tus redes sociales.

Todos los días generamos enormes cantidades de información en las redes sociales y es posible que ni siquiera estemos plenamente conscientes: tweets, estados de Facebook, fotografías, check-ins, un registro detallado de nuestras vidas que se encuentra a disposición de todos en Internet y sobre el cual, sin embargo, no tenemos completo control. No es frecuente que nos tomemos la molestia de respaldar los datos de nuestras redes sociales, y es posible que ni siquiera nos hayamos dado cuenta de que existe la opción de hacerlo.

Facebook
Facebook permite respaldar tu cuenta de manera nativa. Estando dentro de tu cuenta de Facebook, haz clic en el icono de flecha (el triángulo invertido) situado en la esquina superior derecha, y luego en Configuración. En esa sección, abajo, te aparecerá un enlace denominado “Descarga una copia de tu información”. Esta opción te llevará a una página donde deberás solicitar tu archivo (toda la información que has compartido en tu muro, incluyendo publicaciones privadas, fotos e información del perfil). Luego de hacer clic, iniciará la descarga de un archivo .zip, que puede ser bastante pesado dependiendo de qué tanta información contenga tu cuenta de Facebook (el mío pesaba sobre 30 Mb y yo prácticamente no uso Facebook).

Twitter
Twitter también contiene una opción nativa que permite descargar todo tu historial de tweets. Para encontrarla, deberás ir a la opción “Configuración”, de allí a “Cuenta”, y en esa página al final encontrarás el enlace llamado “Solicita tu archivo”. Una vez que hagas clic ahí, deberás esperar a que Twitter te envíe un correo electrónico indicándote que tu archivo se encuentra disponible para descargar. Este archivo puede tardarse un poco en llegar, y contendrá todos tus tweets en formato HTML. Precaución al revisarlo: leer tus primeros tweets y las cosas que has dicho a lo largo de los años puede ser sumamente vergonzoso.

Google Plus
Desde tu cuenta de Google, debes ir a Configuración de cuenta, y de allí a Herramientas de datos. Donde dice “Seleccionar los datos para descargar”, ese enlace te llevará a Google Takeout. Takeout es un servicio compatible con 21 productos de Google, desde Drive hasta YouTube y Blogger, que sirve para exportar todos tus datos desde cualquiera de esas cuentas, así que ahí puedes seleccionar qué datos quieres descargar y Takeout creará el archivo personalizado. Ojo con las cuentas que seleccionas, pues por ejemplo, descargar toda tu cuenta de Gmail puede ser un compromiso bastante extenso, y si seleccionas todas tus cuentas vinculadas con Google, es posible que la mera creación del archivo se tome días enteros.

Instagram
A diferencia de los anteriores, Instagram no ofrece un mecanismo propio para descargar tus fotos, de modo que existen servicios de terceros, como Instaport, que sirven para lo mismo. Instaport requiere tener acceso a tu cuenta para generar un archivo descargable, es gratuito y funciona bastante bien.

Respaldar redes sociales con IFTTT
Personalmente no soy demasiado fan de darle acceso a mis cuentas a aplicaciones externas fantasmas, y también creo que es útil tener en marcha herramientas que hagan respaldo sobre la marcha, así que recomiendo usar IFTTT para hacer -por ejemplo- respaldo automático de tus fotos de Instagram a medida que las vas subiendo. Con IFTTT puedes respaldar tus fotos en Dropbox, en Google Drive, en Evernote, en OneDrive, en Flickr, Picasa o en tu correo electrónico. Igualmente, en IFTTT puedes preparar recetas para generar respaldos sobre la marcha de un montón de otros servicios, sólo tienes que explorar lo suficiente.

Sea cual sea la elección que tomes, mi recomendación es que no esperes al World Backup Day para tomar acciones con respecto a la información de tus redes sociales: podría ser demasiado tarde.

2014/06/12

Tablas y su numero de filas en SQL Server

El siguiente script permite ver el nombre de las tablas y su numero de filas en una base de datos.
 
SELECT sysobjects.Name  AS NombreTabla,
       sysindexes.Rows  AS TotalFilas
FROM   sysobjects
       INNER JOIN sysindexes
            ON  sysobjects.id = sysindexes.id
WHERE  TYPE = 'U'
       AND sysindexes.IndId < 2
ORDER BY
       sysobjects.Name
Una vez ejecutada la consulta.

2014/06/09

Eliminar todas las conexiones activas en una base de datos

Permite cerrar las conexiones abiertas de una base de datos en SQL Server, cuando quieres  alterar y/o eliminar una tabla o base de datos y no se puedes porque existen conexiones activas que lo impiden, solo debes de ejecutar el siguiente script.
 
CREATE PROCEDURE dbo.KillConexiones 
    @dbName SYSNAME
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @spid     INT,
            @cnt      INT,
            @sql      VARCHAR(255)
    
    SELECT @spid = MIN(spid),
           @cnt     = COUNT(*)
    FROM   MASTER..sysprocesses
    WHERE  dbid     = DB_ID(@dbname)
           AND spid != @@SPID
    
    PRINT 'Eliminando ' + RTRIM(@cnt) + ' procesos.'
    WHILE @spid IS NOT NULL
    BEGIN
        PRINT 'Eliminando Proceso ' + RTRIM(@spid)
        SET @sql = 'KILL ' + RTRIM(@spid)
        EXEC (@sql)
        SELECT @spid = MIN(spid),
               @cnt     = COUNT(*)
        FROM   MASTER..sysprocesses
        WHERE  dbid     = DB_ID(@dbname)
               AND spid != @@SPID
        
        PRINT RTRIM(@cnt) + ' Procesos por eliminar.'
    END
END
GO

Encontrar los queries que consumen mas recursos

Los DMVs (Dynamic Management Views) son una magnifica forma de encontrar información de performance a partir de SQL Server 2005 en adelante (2008/2008R2/2012).

En este query de Pinal Dave se utilizan DMVs para encontrar los queries que mas consumen en un server SQL Server 2005/2008 (recordar que este script funciona solo en bases compatibles 2005/2008).
 
SELECT TOP 10 SUBSTRING(
           qt.TEXT,
           (qs.statement_start_offset / 2) + 1,
           (
               (
                   CASE qs.statement_end_offset
                        WHEN -1 THEN DATALENGTH(qt.TEXT)
                        ELSE qs.statement_end_offset
                   END - qs.statement_start_offset
               ) / 2
           ) + 1
       ),
       qs.execution_count,
       qs.total_logical_reads,
       qs.last_logical_reads,
       qs.total_logical_writes,
       qs.last_logical_writes,
       qs.total_worker_time,
       qs.last_worker_time,
       qs.total_elapsed_time / 1000000     total_elapsed_time_in_S,
       qs.last_elapsed_time / 1000000      last_elapsed_time_in_S,
       qs.last_execution_time,
       qp.query_plan
FROM   sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY
       qs.total_logical_reads DESC -- logical reads
       -- ORDER BY qs.total_logical_writes DESC -- logical writes
       -- ORDER BY qs.total_worker_time DESC -- CPU time
Obviamente se puede cambiar el ordenamiento del script para destacar otro criterio de busqueda.

No está de más destacar un conjunto de queries, los DMVs AllStars, que se puede descargar aquí y que es una interesante herramienta para todo DBA en busca de detectar problemas de performance.

2014/06/02

Convertir números a letras en SQL Server

Función para poder convertir un monto numérico en un monto en letras, muy útil si se quiere hacer una descripción de un monto para alguna factura o boleta. Primero crearemos la función llamada "fn_ConvertirNumeroLetras" que recibe 2 parámetros, uno es el numero que deseamos convertir a letras y el otro el nombre de la moneda que deseamos concatenarlo al monto.
 
/*********************************************************************************
  NOMBRE:        fn_ConvertirNumeroLetra
  PROPOSITO: CONVERTIR NUMEROS A LETRAS.
  VERSIONES:
      Ver      Fecha        Autor               Descripción (inc. Req/inc)
     ------  ----------  ---------------    ------------------------------------
      1.0    01/06/2014  EDGAR CALZADA      CREACION
 *********************************************************************************/
 CREATE FUNCTION fn_ConvertirNumeroLetra
 (
        @Numero     NUMERIC(18, 2),
        @Moneda     VARCHAR(100)
 )
 RETURNS VARCHAR(512)
 AS
 BEGIN
        DECLARE @lnEntero       INT,
                @lcRetorno      VARCHAR(512),
                @lnTerna        INT,
                @lcMiles        VARCHAR(512),
                @lcCadena       VARCHAR(512),
                @lnUnidades     INT,
                @lnDecenas      INT,
                @lnCentenas     INT,
                @lnFraccion     INT,
                @resultado      AS VARCHAR(512)
       
        SELECT @lnEntero = CAST(@Numero AS INT),
               @lnFraccion     = (@Numero - @lnEntero) * 100,
               @lcRetorno      = '',
               @lnTerna        = 1
       
        WHILE @lnEntero > 0
        BEGIN
            /* WHILE */
            -- Recorro terna por terna      
            SELECT @lcCadena = ''          
            SELECT @lnUnidades = @lnEntero % 10            
            SELECT @lnEntero = CAST(@lnEntero / 10 AS INT)          
            SELECT @lnDecenas = @lnEntero % 10      
            SELECT @lnEntero = CAST(@lnEntero / 10 AS INT)          
            SELECT @lnCentenas = @lnEntero % 10            
            SELECT @lnEntero = CAST(@lnEntero / 10 AS INT)
            -- Analizo las unidades        
            SELECT @lcCadena = CASE /* UNIDADES */
                                    WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN
                                         'UNO ' + @lcCadena
                                    WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN
                                         'UN ' + @lcCadena
                                    WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
                                    WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
                                    WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
                                    WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
                                    WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
                                    WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
                                    WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
                                    WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
                                    ELSE @lcCadena
                               END /* UNIDADES */
            -- Analizo las decenas
            SELECT @lcCadena = CASE /* DECENAS */
                                    WHEN @lnDecenas = 1 THEN CASE @lnUnidades
                                                                  WHEN 0 THEN
                                                                       'DIEZ '
                                                                  WHEN 1 THEN
                                                                       'ONCE '
                                                                  WHEN 2 THEN
                                                                       'DOCE '
                                                                  WHEN 3 THEN
                                                                       'TRECE '
                                                                  WHEN 4 THEN
                                                                       'CATORCE '
                                                                  WHEN 5 THEN
                                                                       'QUINCE '
                                                                  ELSE 'DIECI' + @lcCadena
                                                             END
                                    WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN
                                         'VEINTE ' + @lcCadena
                                    WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN
                                         'VEINTI' + @lcCadena
                                    WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN
                                         'TREINTA ' + @lcCadena
                                    WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN
                                         'TREINTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN
                                         'CUARENTA ' + @lcCadena
                                    WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN
                                         'CUARENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN
                                         'CINCUENTA ' + @lcCadena
                                    WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN
                                         'CINCUENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN
                                         'SESENTA ' + @lcCadena
                                    WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN
                                         'SESENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN
                                         'SETENTA ' + @lcCadena
                                    WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN
                                         'SETENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN
                                         'OCHENTA ' + @lcCadena
                                    WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN
                                         'OCHENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN
                                         'NOVENTA ' + @lcCadena
                                    WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN
                                         'NOVENTA Y ' + @lcCadena
                                    ELSE @lcCadena
                               END /* DECENAS */
            -- Analizo las centenas        
            SELECT @lcCadena = CASE /* CENTENAS */
                                    WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas
                                         = 0 THEN 'CIEN ' +
                                         
                                         @lcCadena
                                    WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN
                                         'CIENTO ' + @lcCadena
                                    WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
                                    ELSE @lcCadena
                               END /* CENTENAS */
            -- Analizo la terna
           
            SELECT @lcCadena = CASE /* TERNA */
                                    WHEN @lnTerna = 1 THEN @lcCadena
                                    WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN
                                         @lcCadena + ' MIL '
                                    WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0)
                                         AND
                                         
                                         @lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas
                                         = 0 THEN @lcCadena + 'MILLON '
                                    WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0)
                                         AND
                                         NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN
                                         @lcCadena
                                         + ' MILLONES '
                                    WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN
                                         @lcCadena + ' MIL MILLONES '
                                    ELSE ''
                               END /* TERNA */
            -- Armo el retorno terna a terna        
            SELECT @lcRetorno = @lcCadena + @lcRetorno      
            SELECT @lnTerna = @lnTerna + 1
        END /* WHILE */        
        IF @lnTerna = 1
            SELECT @lcRetorno = 'CERO'
       
        SELECT @resultado = RTRIM(@lcRetorno) + ' CON ' + LTRIM(STR(@lnFraccion, 2))
               + '/100 ' + @Moneda
       
        RETURN @resultado
 END
 GO
 
 -- Para ejecutarlo solo nos bastara con llamar a la función y pasarle los 2 parámetros mencionados.
 SELECT [dbo].fn_ConvertirNumeroLetra(125.50, 'Nuevos Soles')
 -- Esto nos dará como resultado lo siguiente.
 -- CIENTO VEINTICINCO CON 50/100 Nuevos Soles