La escalabilidad del computo

Cuando estaba en la escuela, hace algunos años, había gran efervescencia sobre el tema del computo paralelo, de hecho mi tesis doctoral es sobre este tema. Recuerdo que comentado sobre   las posibilidades del paralelismo con mi asesor, me dijo que desde un punto de vista teórico el  computo paralelo no era importante porque no cambiaba los limites de escalabilidad impuestos por los problemas NP.

Ahora nos encontramos en un resurgimiento de los enfoques del computo distribuido debido al abaratamiento del hardware y la cada vez mayor disponibilidad de conexiones de banda ancha. Por lo tanto la cuestión de algoritmos eficientes para problemas NP y la corroboración teórica de NP ǂ P se ha convertido en uno de los problemas primordiales de la teoría y practica del computo.

Referencias

Optimización de sitios de Internet

Para hablar de optimización es necesario primero definir el criterio de optimalidad.  En el caso de sitios de Internet el criterio es trafico y el logro de objetivos específicos.

Un aspecto primordial para la generación de trafico es la colocación del sitio es los buscadores; sin embargo, el logro de objetivos depende de la experiencia del usuario una vez que llega a la pagina: que el usuario encuentre fácilmente lo que esta buscando; que los objetivos del usuario se correlacionen con los objetivos del sitio; que la pagina se cargue dentro de los tiempos  tolerados por el usuario.

Algunos lineamientos generales en los que coinciden los expertos:

  • Mantener el diseño de paginas y del sitio en general lo más simple posible.
  • Evitar el uso de Flash e imágenes para presentar información.
  • Usar paginas estáticas en la medida de lo posible en vez de contenido dinámico.
  • Mantener la navegación del sitio lo más plano posible, con no más de tres niveles.
  • Enfocar el contenido a temas muy concretos y presentar información relevante y única.
  • Conseguir ligas de sitios importantes y relevantes con respecto a la temática del sitio.

En términos técnicos los recomendaciones implican,  por ejemplo, el uso de CSS para lograr efectos, CSS Sprites, datos embebidos.

Referencias

La aritmética de Trachtenberg

Así como Viktor Emil Frankl desarrollo la logoterapia para superar los rigores de los campos de concentración Nazi, Jakow Trachtenberg ocupo su mente en desarrollar un sistema de aritmética mental al verse en la misma situación.

El sistema Trachtenberg de rápido cálculo mental, similar a las matemáticas Védicas, consiste en un conjunto de patrones para realizar operaciones aritméticas. Los algoritmos más importantes son multiplicación,división, y adición. El método también incluye algoritmos especializados para realizar multiplicaciones por números entre 5 y 13.

Multiplicación por 11

Abusando de la notación

(11)a = 11Σai10i =

an10n+1 + [Σj=0n-1(aj+aj+1)10j ]+ a0

Multiplicación por 12

(12)a = 12Σai10i =

an10n+1 + [Σj=0n-1 (aj+2aj+1)10j ]+ 2a0

Multiplicación por 6

Definiendo

bj = aj/2, donde / denota división entera

cj = aj mod 2

tenemos

aj = 2bj + cj

(6)a = (10/2)Σai10i  + Σai10i =

Σbi10i+1 + Σ(ai + 5ci)10i

bn10n+1 + [Σj=1n(aj + 5cj + bj-1)10j ]+ (a0 + 5c0)

Expresando el algoritmo en python:

def x6(number):
previous = 0
result = 0
power_of_10 = 1
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result =
(digit + odd_term + previous ) *
power_of_10 + result
previous = digit//2
power_of_10 *= 10
number = number // 10
result = previous * power_of_10 + result
return result

Multiplicación por 7

De manera similar al caso anterior:

aj = 2bj + cj

(7)a = (10/2)Σai10i  + Σ2ai10i =

Σbi10i+1 + Σ(2ai + 5ci)10i

bn10n+1 + [Σj=1n(2aj + 5cj + bj-1)10j ]+ (a0 + 5c0)

Expresando el algoritmo en python:

def x7(number):
previous = 0
result = 0
power_of_10 = 1
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result =
(2*digit + odd_term + previous ) *
power_of_10 + result
previous = digit//2
power_of_10 *= 10
number = number // 10
result = previous * power_of_10 + result
return result

Multiplicación por 5

De manera similar al caso anterior:

aj = 2bj + cj

(5)a = (10/2)Σai10i   =

Σbi10i+1 + Σ(5ci)10i

bn 10n+1 + [Σj=1n(5cj + bj-1)10j ]+ (5c0)

Expresando el algoritmo en python:

def x5(number):
previous = 0
result = 0
power_of_10 = 1
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result =
(odd_term + previous ) *
power_of_10 + result
previous = digit//2
power_of_10 *= 10
number = number // 10
result = previous * power_of_10 + result
return result

Multiplicación por 9

Definiendo

b = 10n+1 – Σj=0naj , o sea el complemento a 10 de a

tenemos

(9)a = 10a –a =

10a –a + b – b =

10a + b – 10n+1 =

(an – 1)10n+1 + [Σj=1n(bj + aj-1)10j ]+ (b0 )

Expresando el algoritmo en python:

def x9(number):
previous = number%10
result = 10 - previous
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
result =
(9 - digit + previous ) *
power_of_10 + result
previous = digit
power_of_10 *= 10
number = number // 10
result =
(previous-1) * power_of_10 +
result
return result

Multiplicación por 8

Definiendo

b = 10n+1 – Σj=0naj , o sea el complemento a 10 de a

tenemos

(8)a = 10a –2a =

10a –2a +2 b – 2b =

10a + 2b – (2)10n+1 =

(an – 2)10n+1 + [Σj=1n(2bj + aj-1)10j ]+ (2b0 )

Expresando el algoritmo en python:

def x8(number):
previous = number%10
result = 2*(10 - previous)
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
result =
(2*(9 - digit) + previous ) *
power_of_10 + result
previous = digit
power_of_10 *= 10
number = number // 10
result =
(previous-2) *
power_of_10 + result
return result

Multiplicación por 3 y por 4

Los algoritmos para multiplicar por 3 y por 4 combinan las ideas usadas en la multiplicación por 5 y por 9.

Definiendo

b = 10n+1 – Σj=0naj , o sea el complemento a 10 de a

ai = 2ci + di, donde

ci = ai/2

di = ai mod 2

tenemos

(4)a = 5a –a =

10c + 5d + b – 10n+1

(3)a = 5a –2a =

10c + + 5d + 2b – (2)10n+1

Expresando los algoritmos en python:

def x3(number):
digit = number%10
result = 2*(10 - digit)
if digit % 2:
result += 5
previous = digit // 2
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result +=(2*(9 - digit) + odd_term + previous ) * power_of_10
previous = digit//2
power_of_10 *= 10
number = number // 10
result = (previous-2) * power_of_10 + result
return result

def x4(number):
digit = number%10
result = (10 - digit)
if digit % 2:
result += 5
previous = digit // 2
power_of_10 = 10
number = number // 10
while (number):
digit = number%10
odd_term = 5 if digit%2 else 0
result +=((9 - digit) + odd_term + previous ) * power_of_10
previous = digit//2
power_of_10 *= 10
number = number // 10
result = (previous-1) * power_of_10 + result
return result

Referencias

Nubes

El continuo abaratamiento de la infraestructura computacional y la omnisciencia de conexiones de banda ancha están generando un cambio de paradigmas en el industria de tecnología de información y se ven nubes acumulándose en el cielo informático.

Referencias

CSS; la ortogonalidad del contenido y el diseño

Uno de los preceptos fundamentales del diseño es la separación de responsabilidades entre módulos o componentes. Idealmente cada modulo debe tener un sola responsabilidad primaria. En particular, la funcionalidad de un componente debe ser independiente de la interfaz de usuario.

CSS es un medio de aislar el diseño grafico del contenido textual de un documento. Un ejemplo espectacular de la ortogonalidad del contenido y el diseño se puede ver en CSS Zen Garden

Referencias

Trucos aritméticos 1

  • Realizar operaciones de izquierda a derecha.
  • Redondear a potencias de 10
  • Substraer sumando
  • Multiplicar por potencias de 2 doblando sucesivamente
  • Dividendo por potencias de 2 sacando mitades sucesivas
  • Multiplicar por 5: multiplicar por 10 y sacar mitad
  • Dividir por 5: Doblar y dividir entre 10
  • Cuadrado de un numero que termina en 5: a(a+1)+25, a = (n-5)/10
  • Multiplicar por 25: Multiplicar por 100 y sacar mitad dos veces
  • Dividir entre 25: Doblar dos veces y dividir entre 100
  • Multiplicar por un numero que termina en .5: doblar primero para eliminar el .5, multiplicar y sacar mitad al otro factor
  • Dividir entre un numero que termina en .5: doblar dividendo y divisor
  • Cuadrado de un numero que termina en 1 (a1) : 100a2+10 2a + 1
  • Multiplicar dos números con diferencia de dos (a-1,a+1): a2-1

  • Multiplicar por 15: multiplicar por 10 el multiplicando más su mitad
  • Dividir entre 15: Multiplicar por 2/3 y dividir entre 10
  • Multiplicar por 75: multiplicar por 3/4 por 100
  • Dividir por 75: multiplicar por 1 1/3 y dividir entre 100
  • Multiplicar por 9: Multiplicar por 10 y substraer el multiplicando
  • Multiplicar por 125: Dividir entre 8 y multiplicar por 1000
  • Dividir entre 125: Multiplicar por 8 y dividir entre 1000
  • Estimar división entre 9 multiplicando por 11
  • Estimar división entre 11 multiplicando por 9
  • Estimar división entre 14 multiplicando por 7
  • Estimar división entre 17 multiplicando por 6

SQL, ODBC, y Python

Como Python 3 acaba de ser liberado, el soporte de librerías de extensión todavía esta limitado en comparación con Python 2.x.

En el caso de  ODBC y MS SQL Server, mxODBC es una opción comercial. En opciones Open Source, Python 3 viene en el paquete oficial con soporte integrado para Sqlite3, la extensiones pymssql y pyodbc soportan hasta la versión 2.6 de Python.

Referencias

Permisos de SQL Server en Windows Vista

Un problema común al usar SQL Server en Windows Vista es que al usar la base de datos por primera vez nos encontramos que no tenemos ningún privilegio administrativo y aparece el error:

‘CREATE DATABASE Permission denied in database ‘master”

La razón básica en SQL Server 2005  es que los usuarios del grupo administrativo de Windows Vista no reciben por default privilegios administrativos en la base de datos y es necesario realizar un procedimiento para otorgar estos privilegios.

Paso 0:

Login en Vista como adminstrador

Paso 1:

Start > All Programs > Microsoft SQL Server 2005 > Configuration Tools > SQL Server Surface Area Configuration

Paso 2:

‘Add New Administrator’

Paso 3:

En el dialogo

    ‘SQL Server User Provisioning on Vista’

mover

    ‘Member of the SqlServer SysAdmin role ‘

de

    ‘Available Privileges’

a

    ‘Privileges that will be granted to’

El mismo problema me ocurrió con SQL Server Express 2008, pero por lo menos la versión Express no incluye  la utilería

SQL Server Surface Area Configuration

Como además se me había olvidado el password la solución fue reinstalar el SQL Server Express y entrar al administrador de la base de datos con el usuario sa

Referencias

 

Search Engine Optimization (SEO)

Internet es la calle más transitada del mundo, pero el trafico en cada pagina depende principalmente del posicionamiento en los buscadores como Google. Al arte de colocarse en los primeros lugares de los listados se le conoce como Search Engine Optimization (SEO).


Google mantiene como secreto la mecánica de asignación de lugares, que además cambia de manera continúa. Es un proceso bastante errático, y los que logran colocarse en la primera pagina para la lista de búsqueda de un conjunto de palabras, tenderán a mantenerse ahí hagan lo que hagan, tengan el contenido que tengan, siempre y cuando Google no los vete, por razones también erráticas y misteriosas. Es decir, el SEO es un deporte extremo.

Referencias, recursos, y ejemplos

Aritmética y memoria; 513 Sticker

 

Es posible mediante el ejercicio de la memoria acelerar cálculos aritméticos. Este es un patrón general que también se aplica a la implementación algorítmica.

Por ejemplo, al multiplicar números de dos dígitos tenemos

a1a0 x b1b0 = (10a1+a0)(10b1+bo)=

100a1b1+10(a1bo+a0b1)+a0bo

Al multiplicar números de tres dígitos tenemos

a2a1a0 x b2b1b0 = (100a2+10a1+a0)(100b2+10b1+bo)=
10000a2b2 + 1000(a2b1+a1b2) +
100(a2b0+a1b1+a0b2) + 10(a1bo+a0b1)+a0bo

Si recordamos las fórmulas podemos encontrar los dígitos del producto directamente.

Al calcular el cuadrado de un número de 2 dígitos

(a1a0 )2 = (10a1+a0)2=
100a12+10(2a1a0)+a02

Al calcular el cuadrado de un número que termina en 1

(a11 )2 = (10a1+1)2=
100a12+10(2a1)+1

Al calcular el cuadrado de un número que termina en 5

(a15 )2 = (10a1+5)2=
100(a12+a1) + 25=
100a1(a1+1) + 25

Al calcular el cuadrado de un número que empiezan en 5

(5a0 )2 = (50 + a0)2=
100(25 +a0) + a02

Al calcular el productos de números de tres dígitos que empiezan con 1

(1a1 a0)(1b1b0) =
(100 + 10a1 + a0)(100 + 10 b1 + b0) =
10000 + 1000(a1 + b1) + 100(a1b1 +  a0 +  b0) +
10(a1b0 + a0b1) + a0b0

Multiplicar un número menor que 100 por 99

(a)(99) = 100 (a – 1)  + (100 – a)

Referencias