domingo, 17 de julio de 2011

Renombrar tabla en SQL

Quienes no han tenido la necesidad de renombrar una determinada tabla en SQL, porque lo creó con un nombre temporal, o por la simple razón que el nombre que le colocó no era el esperado por los desarrolladores o el encargado de desarrollo de su empresa. Tanto en Oracle como SQL existen unos scripts que le permiten de forma sencilla realizar esta tarea.


Veamos en PL-SQL:
alter table table_name rename to new_table_name;


En SQL server se hace por medio de un store procedure del sistema. Veamos el siguiente ejemplo de SQL Server:
sp_rename 'old_table_name', 'new_table_name'


El sp_rename en SQL sirve para renombrar otro objeto en la base de datos, como por ejemplo una columna. Para esto necesitaría agregar el nombre de la columna con el nombre de la tabla.


EXEC sp_rename 'TableName.[Old_ColumnName]', 'TableName.[New_ColumnName]', 'COLUMN'

Nota: las pruebas han sido realizadas en SQL 2005 en adelante y Oracle 10G, no se han realizado pruebas en plataformas anteriores.

Comparaciones fonéticas utilizando el Metaphone

En SQL Server existen dos funciones que sirven para realizar comparaciones fonéticas de nombres o palabras de acuerdo al sonido que emiten. Estas funciones llamadas SOUNDEX y DIFFERENCES provienen del algoritmo fonético Soundex, desarrollado por Robert Russell y Margaret Odell, que indexa los nombres de acuerdo a su sonido en inglés.

En SQL la función Soundex genera el sonido que arrojar una palabra, mientras que Differences realiza una comparación entre los sonidos de dos palabras a la que se le aplica el Soundex internamente.

El Soundex tiene ciertas deficiencias, que no lo hace tan efectivo, por ejemplo, las consonantes que suenan parecido devuelven el mismo valor (B, F y P devuelven 1) y las vocales pueden afectar la codificación, sin embargo es poco utilizable.

Por esta razón, Lawrence Phillips desarrolla el algoritmo Metaphone en respuesta a las deficiencias que presentaba el primero. Este fue publicado en 1990 y se encuentra publicado en distintos lenguajes, C, PHP, SQL, etc para indexar palabras por su sonido en el idioma inglés.

Este ya viene integrado en PHP, esperamos que pronto sea integrado al SQL Server como se hizo con el Soundex, para así ayudar un poco a los desarrolladores. El autor más tarde desarrolló una nueva versión del algoritmo, al que llamó "Double Metaphone", que produce resultados más exactos que el original

Debajo el ejemplo del código MetaPhone, para su uso recomiendo crearlo en la base de datos master, para que el mismo pueda ser implementado en llamado desde cualquier base de datos:

USE [master]
GO
/****** Object:  UserDefinedFunction [dbo].[Metaphone]    Script Date: 06/30/2011 11:57:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Metaphone](@str as varchar(70))
RETURNS VARCHAR (25)
      /*
      Metaphone Algorithm
     
      Created by Lawrence Philips.
      Metaphone presented in article in "Computer Language" December 1990 issue.
      Translated into t-SQL by Keith Henry (keithh_AT_lbm-solutions.com)
     
                   *********** BEGIN METAPHONE RULES ***********
       Lawrence Philips' RULES follow:
       The 16 consonant sounds:
                                                   |--- ZERO represents "th"
                                                   |
            B  X  S  K  J  T  F  H  L  M  N  P  R  0  W  Y
       Drop vowels
     
       Exceptions:
         Beginning of word: "ae-", "gn", "kn-", "pn-", "wr-"   ----> drop first letter
         Beginning of word: "x"                                ----> change to "s"
         Beginning of word: "wh-"                              ----> change to "w"
         Beginning of word: vowel                              ----> Keep it
     
     
      Transformations:
         B ----> B      unless at the end of word after "m", as in "dumb", "McComb"
     
         C ----> X      (sh) if "-cia-" or "-ch-"
                 S      if "-ci-", "-ce-", or "-cy-"
                        SILENT if "-sci-", "-sce-", or "-scy-"
                 K      otherwise, including in "-sch-"
     
         D ----> J      if in "-dge-", "-dgy-", or "-dgi-"
                 T      otherwise
     
         F ----> F
     
         G ---->        SILENT if in "-gh-" and not at end or before a vowel
                                  in "-gn" or "-gned"
                                  in "-dge-" etc., as in above rule
                 J      if before "i", or "e", or "y" if not double "gg"
                 K      otherwise
     
         H ---->        SILENT if after vowel and no vowel follows
                               or after "-ch-", "-sh-", "-ph-", "-th-", "-gh-"
                 H      otherwise
     
         J ----> J
     
         K ---->        SILENT if after "c"
                 K      otherwise
     
         L ----> L
     
         M ----> M
     
         N ----> N
     
         P ----> F      if before "h"
                 P      otherwise
     
         Q ----> K
     
         R ----> R
     
         S ----> X      (sh) if before "h" or in "-sio-" or "-sia-"
                 S      otherwise
     
         T ----> X      (sh) if "-tia-" or "-tio-"
                 0      (th) if before "h"
                        silent if in "-tch-"
                 T      otherwise
     
         V ----> F
     
         W ---->        SILENT if not followed by a vowel
                 W      if followed by a vowel
     
         X ----> KS
     
         Y ---->        SILENT if not followed by a vowel
                 Y      if followed by a vowel
     
         Z ----> S
      */


AS
BEGIN
DECLARE     @Result VARCHAR(25),
  @str3 CHAR(3),
  @str2 CHAR(2),
  @str1 CHAR(1),
  @strp CHAR(1),
  @strLen TINYINT,
  @cnt TINYINT

SET @strLen = LEN(@str)
SET @cnt = 1
SET @Result = ''

--Process beginning exceptions
set   @str2       =     left(@str,2)
if    @str2       in    ('ae', 'gn', 'kn', 'pn', 'wr')
      begin
            set   @str =     right(@str , @strLen - 1)
            set   @strLen =   @strLen - 1
      end
if    @str2       =     'wh' 
      begin
            set   @str =     'w' + right(@str , @strLen - 2)
            set   @strLen =   @strLen - 1
      end
set   @str1       =     left(@str,1)
if    @str1 =     'x'  
      begin
            set   @str =     's' + right(@str , @strLen - 1)
      end
if    @str1 in    ('a','e','i','o','u')
      begin
            set   @str =     right(@str , @strLen - 1)
            set   @strLen =   @strLen - 1
            set   @Result     =     @str1
      end

while @cnt <= @strLen
      begin
            set   @str1       =     substring(@str,@cnt,1)
            if    @cnt <>    1    
                  set   @strp =     substring(@str,(@cnt-1),1)
            else  set   @strp =     ' '
     
      if @strp    <>    @str1
            begin
                  set   @str2       =     substring(@str,@cnt,2)
                       
                  if    @str1 in    ('f','j','l','m','n','r')    
                        set   @Result     =     @Result + @str1
     
                  if    @str1 =     'q'   set @Result =     @Result + 'k'
                  if    @str1 =     'v'   set @Result =     @Result + 'f'
                  if    @str1 =     'x'   set @Result =     @Result + 'ks'
                  if    @str1 =     'z'   set @Result =     @Result + 's'
     
                  if    @str1 =     'b'
                        if @cnt = @strLen
                              if    substring(@str,(@cnt - 1),1) <> 'm'
                                    set   @Result     =     @Result + 'b'
                        else
                              set   @Result     =     @Result + 'b'
     
                  if    @str1 =     'c'

                        if    @str2       =     'ch' or    substring(@str,@cnt,3) =       'cia'
                              set   @Result     =     @Result + 'x'
                        else
                              if    @str2 in    ('ci','ce','cy')  and   @strp <>    's'
                                    set   @Result     =     @Result + 's'
                              else  set   @Result     =     @Result + 'k'
     
                  if    @str1 =     'd'
                        if    substring(@str,@cnt,3) in    ('dge','dgy','dgi')
                              set   @Result     =     @Result + 'j'
                        else  set   @Result     =     @Result + 't'
     
                  if    @str1 =     'g'
                        if    substring(@str,(@cnt - 1),3) not in ('dge','dgy','dgi','dha','dhe','dhi','dho','dhu')
                              if  @str2 in ('gi', 'ge','gy')
                                    set   @Result     =     @Result + 'j'
                              else
                                    if    (@str2      <>    'gn') or ((@str2  <> 'gh') and ((@cnt + 1) <> @strLen))
                                          set   @Result     =     @Result + 'k'
     
                  if    @str1 =     'h'
                        if    (@strp not in ('a','e','i','o','u')) and (@str2 not in ('ha','he','hi','ho','hu'))
                              if    @strp not in ('c','s','p','t','g')
                                    set   @Result     =     @Result + 'h'
     
                  if    @str1 =     'k'  
                        if @strp <> 'c'
                              set   @Result     =     @Result + 'K'
     
                  if    @str1 =     'p'  
                        if @str2 = 'ph'
                              set   @Result     =     @Result + 'f'
                        else
                              set   @Result     =     @Result + 'p'
     
                  if    @str1 =     's'
                        if    substring(@str,@cnt,3) in    ('sia','sio') or @str2 = 'sh'
                              set   @Result     =     @Result + 'x'
                        else  set   @Result     =     @Result + 's'
     
                  if    @str1 =     't'
                        if    substring(@str,@cnt,3) in    ('tia','tio')
                              set   @Result     =     @Result + 'x'
                        else 
                              if    @str2 =     'th'
                                    set   @Result     =     @Result + '0'
                              else
                                    if substring(@str,@cnt,3) <> 'tch'
                                          set   @Result     =     @Result + 't'
     
                  if    @str1 =     'w'
                        if @str2 not in('wa','we','wi','wo','wu')
                              set   @Result     =     @Result + 'w'
     
                  if    @str1 =     'y'
                        if @str2 not in('ya','ye','yi','yo','yu')
                              set   @Result     =     @Result + 'y'
            end
            set   @cnt  =     @cnt + 1
      end
      RETURN UPPER(@Result)
END

Enlaces:

martes, 5 de julio de 2011

¿Windows en decadencia?

En República Dominicana había un programa que tenía un bloque muy peculiar denominado “estrellas en decadencia”, en donde el presentador iniciaba la entrevista a un personaje muy conocido preguntándole sobre sus itinerarios ya que no se escuchaba nada de él porque se encontraba en decadencia.

Eso mismo pensé hace unos días, cuando vi un artículo de un blog de un colega en el que decía que Windows había perdido un 5% del mercado en solo 12 meses. Lo primero que pensé fue, ¿y en qué momento Linux y Apple crecieron tanto y no me había enterado?

Cuando entro al cuerpo del enlace, explica que ha perdido ese porciento a causa del crecimiento de los equipos móviles y que la información venía de google.analytics. Yo estoy completamente de acuerdo con esta persona, los equipos móviles han aumentado en acceso a Internet, y todos conocemos que es parte del futuro, ahora eso no debe asustar ni sorprender a nadie.

El que el acceso a Internet se encuentre en aumento desde los dispositivos móviles, es normal, yo mismo accedo más a menudo desde mi dispositivo móvil que desde mi computadora personal, ahora eso no indica que las ventas de PC disminuyan, ya que mientras este equipo sea útil para trabajo, será difícil conseguir un reemplazo, y mientras Apple, Linux y el mismo personal de Android complique la jugada para que las mayorías de los desarrolladores se unan a ellos, el ecosistema seguirá siendo dominado por Microsoft.

Eso le da a Microsoft tiempo para poder desarrollar una plataforma móvil estable que puedan competir de cerca con Android, Blackberry y Iphone. Windows Phone 7 ha logrado entrar al mercado despacio y con muchas mejoras con respecto a sus antecesores. Mientras tantas personas se encuentren las herramientas de Microsoft sencillas de utilizar, seguirá teniendo adeptos. Sin embargo, deben cuidarse, ya que los sistemas operativos móviles son amigables, y un buen ejemplo es RIM, un sistema sencillo y funcional que ha atrapado a todo un grupo de personas de negocios.

Los números reales de la actualidad muestran que los que dominan el mercado móvil solo tiene un 7.7% entre todos, claro, estoy seguro que en 1 0 2 años esos números van a cambiar y estos van estar posiblemente por encima de un 45%.
Device Type
U.S. Browsing Share
iPhone
2.9%
Android
2.6%
iPad
2.1%
Blackberry
0.57%
Symbian
0.03%
Java ME
0.02%
Windows Mobile
0.02%

No me gusta dudar ante Microsoft, ya que a pesar de todas sus metidas de patas, han sabido resurgir de sus cenizas (véase informaciones sobre Windows Milenium y Windows Vista, que después de ser grandes fracasos, han sido superados por otras versiones del mismo Microsoft) y que decir de Internet Explorer, que a partir de la versión 9 ha ganado mercado nuevamente.

Internet Explorer on Windows: +.86 (62.40% to 63.26%)
Internet Explorer 8.0 on Windows: +.1.03% (38.77% to 39.80%)
Internet Explorer 9.0 on Windows: +.10% (.56% to .66%)
And the Internet Explorer 9.0 beta on Windows 7 is now at 2.09%.

Todavía sigo creyendo que el futuro más prometedor de sistemas operativos lo tiene Android, que es una plataforma estable y que ha mostrado buenas credenciales y los hardware de móviles son más estables que los desarrollados para PC. Sin embargo, como dijo Rudy Tomjanovic, ex – dirigente de Houston Rockets de la NBA, no subestimes el corazón de un campeón.

Estadísticas extraídas del siguiente enlace.

domingo, 3 de julio de 2011

Relaciones públicas o publicidad, que ofrece mayores beneficios a las corporaciones

Las personas más allegadas a mi saben que he tenido la oportunidad de laborar para distintos tipos de empresas, ya sea directa o indirectamente, lo que me ha ayudado a visualizar el contorno económico desde una perspectiva más global y abierta. He pasado de laborar como auxiliar de contabilidad a analista de estadística de sector turístico, luego en una empresa que procesaba reportes crediticios, más tarde a trabajar con el sector inmobiliario, después al monitoreo de relaciones públicas y publicidad y por último a la transferencia electrónicas de informaciones médicas .

Sin embargo, solo uno de todos estos trabajos, después de mi carrera (informática), me ha llamado sustancialmente la atención, las relaciones públicas y la publicidad. El trabajar en esta clase de negocio me enseño lo importante que son estas dos categorías para fortalecer una determinada organización.

Las organizaciones se apoyan bastante en la publicidad en su búsqueda de ser más competitivas dentro del sector donde se manejan. Este medio les sirve para mantener a la población informada sobre los productos y servicios que ofrecen y es uno de los principales vías de captación de clientes (no importa al mercado que se dirige la misma). Esto se puede aplicar a nivel personal si se desea, hay que saberse vender sin importar que tan buen profesional usted sea.

Con los años la publicidad se ha integrado a nuestra forma de vida, y eso nos hace quizás muy vulnerables a ella ya que se encuentra asumida por la mayoría de nosotros. Sin embargo, muchas personas se sienten incómodas con la publicidad ya que se sienten saturados por la misma lo que está provocando que esta no tenga el mismo impacto en quienes la reciben.

Se ha trabajado arduamente en intentar que la publicidad llegue a su blanco de público de una forma indirecta, trabajando más con el subconsciente, para así lograr una mayor aceptación. Sin embargo, de forma inconsciente el público ha comenzado a ignorarla haciendo que las empresas busquen nuevas alternativas de captación de clientes.

Y aquí es donde entran las relaciones públicas, el nuevo método utilizado por las empresas para atraer nuevos clientes, pero siendo un poco más directo, vendiendo la empresa a un nivel superior que el propio producto, es decir, tratando de que los clientes se identifiquen con la empresa más que con lo que esta comercia. Laborando en la empresa de monitoreo de publicidad, pudimos denotar como las empresas requerían algo más que monitoreo de publicidad, ya no solo querían saber cuántas veces pasaban su comercial en la radio, televisión o medios escritos, deseaban saber cuántas menciones se realizaban a sus empresas y sus figuras principales.

A partir de esa experiencia, y luego de muchas investigaciones personales, vi como las empresas estaban creando estructuras para manejar las relaciones públicas, pasando a conformar departamentos que no eran dependencias de otros.

En nuestro país he visto como grandes empresas han destinado parte de su presupuesto a las relaciones públicas, aquí se celebran actos de todos tipos que van desde un coctel en un importante restaurante local a alguna caminata multitudinaria, así como aportes a alguna que otra institución benéfica. Esto sumado a que por medios de los departamentos de relaciones públicas, las empresas le dan seguimiento a sus inversiones realizadas por medio de responsabilidad social, que todos sabemos que estas se aprovechan de sus donaciones y ayudas a distintas causas para promocionarse a sí mismas.

Eso es lo que hoy me ha mantenido atado a darle seguimiento a este tipo de negocios, la forma atractiva en que se presenta un producto, como se vende una empresa simplemente haciendo un bien social que puede ayudar a miles de personas y que pueden dejar impregnado su sello en un determinado público.

Agradecimientos a la mi esposa, Miledys Taveras por la ayuda brindada en la revisión de este artículo.