Mostrando entradas con la etiqueta Web. Mostrar todas las entradas
Mostrando entradas con la etiqueta Web. Mostrar todas las entradas

miércoles, 27 de agosto de 2014

Crea tu propio benchmarking de páginas web

El siguiente código en Python te permitirá realizar tus propios benchmarkings de páginas Web, simulando un escenario concurrente de muchos usuarios al mismo tiempo accediendo al mismo sitio Web. El resultado se almacena en un archivo de log que después podrá llevarse a una hoja de cálculo para calcular estadísticas de tiempos, o para identificar errores.

import time
import datetime
import urllib2
import logging
import threading
 
# Coleccion de urls a solicitar
urls = [
   'http://192.168.0.3/oiddigity_actual/index.html',
   'http://192.168.0.3/oiddigity_actual/registrado.asp',
   'http://192.168.0.3/oiddigity_actual/inicio.html',
   'http://192.168.0.3/oiddigity_actual/botones2.html',
   'http://192.168.0.3/oiddigity_actual/horafecha.asp'

 
# Nombre del fichero de log para guardar resultados
fich_log = 'testeo.log'
 
# Numero de hilos
num_hilos = 200
 
# Numero de procesos por hilo
num_procesos = 100
 
# Conteo de errores
num_errores = 0
 
# Metodo: proceso_urls()
# Procesa las urls, retornando el
# tiempo que consume
def proceso_urls():
   inicio = datetime.datetime.now()
   resultado = ""
 
   # Solicita y lee todas las urls
   for i in urls:
      try:
         peticion = urllib2.Request(i)
         respuesta = urllib2.urlopen(peticion)
         contenido = respuesta.read()
         resultado = "|OK"
         break
      except Exception as e:
         resultado = "|NOK[" + i + "]" + format(str(e))
 
   fin = datetime.datetime.now()
   tiempo = inicio.strftime("%T.%f")+'|'+fin.strftime("%T.%f")+"|"
   tiempo += get_tiempo(fin-inicio)
   tiempo += resultado
 
   return tiempo
 
# Metodo: get_tiempo()
# Retorna, a partir de un time, el tiempo en formato %H|%M|%S|%f
def get_tiempo(tiempo):
   resultado = ""
   segundos = tiempo.seconds
 
   if (segundos>=3600):
      horas = int(segundos/3600)
      resultado += str(horas) + "|"
   else:
      resultado += "0|"
 
   if (segundos>=60):
      minutos = int(segundos/60)
      resultado += str(minutos) + "|"
   else:
      resultado += "0|"
 
   resultado += str(segundos) + "|" + str(tiempo.microseconds)
 
   return resultado
 
# Metodo: proceso_hilo()
# Metodo principal del hilo
def proceso_hilo(count):
   global num_errores # Referencia a variable global compartida
 
   print 'Iniciando hilo ', count
 
   for i in range(num_procesos):
      resultado = proceso_urls()
 
      if (resultado.find("NOK") > 0):
         num_errores += 1
         print "#", num_errores, " > ", str(count), "[", str(i), "] > ", resultado
 
      logging.info(''+str(count)+"|"+str(i)+"|"+resultado)
 
   print 'Hilo', count, 'finalizado'
 
 
# Configuracion del fichero de log
logging.basicConfig(filename=fich_log, filemode='w', level=logging.DEBUG)
# Cabecera del log
logging.info('Hilo|Proceso|Inicio|Fin|Horas|Minutos|Segundos|Milisegundos|Resultado')
 
print '----------------------------------'
print 'Testeo. 2014 by Rafael Hernamperez'
print '----------------------------------'
print 'URLs a testear:'
 
for i in urls:
   print ' - ', i
 
print '> Ejecutando ', num_hilos, ' hilos'
print '> Total procesos: ', num_hilos * num_procesos
 
# Genera los hilos y los ejecuta
threads = list()
 
for i in range(num_hilos):
   t = threading.Thread(target=proceso_hilo, args=(i,))
   threads.append(t)
   t.start()

La variable urls permite definir las urls que van a solicitarse. Una página web puede tener varios iframes incluyendo otras partes de código web (otras páginas o servicios), las cuales han de invocarse para tener tiempos reales.

La variable fich_log define el nombre del fichero de log, en el cual se volcarán todos los resultados.

La variable num_hilos define el número de conexiones concurrentes. Esto simulará el escenario de n usuarios accediendo al mismo tiempo a las urls definidas.

La variable num_procesos define el número de veces que cada hilo llamará a las urls definidas.

La variable num_errores recoge el número de errores que se pueda producir durante el testeo.

El método proceso_urls() solicita las urls definidas y leyendo las respuestas por parte del servidor web. Tras el proceso guarda en el log el resultado con los tiempos y los posibles errores.

El método get_tiempo() retorna un literal con la descomposición del tiempo que se pasa por parámetro. Este literal se utiliza para el log, y es invocado por proceso_urls() para obtener el desglose del tiempo que ha tardado el proceso en ejecutarse.

El método proceso_hilo() es utilizado por cada uno de los hilos para lanzar todos los procesos definidos en la variable num_procesos. Es decir, repite num_procesos veces el acceso a las urls definidas.

Por último, para hacer funcionar esta aplicación, crea un fichero llamado (por ejemplo) testeo.py, copia y pega el código, guárdalo y ejecútalo desde la consola o terminal mediante el comando:

$ python testeo.py

martes, 4 de diciembre de 2012

La Web ha de ser Libre y Abierta

En el mes de Diciembre, algunos gobiernos se reunirán a puerta cerrada para decidir y determinar el control y la censura en la Web. Entre estos gobiernos se encuentran algunos que son represivos que y están en contra de la libertad en Internet.

Hoy, más que nunca, se hace necesario elevar la voz, manifestar y defender la libertad. La libertad permitó construir una Web grande y universal, y una sociedad más unida y democrática. No dejemos que sea una anécdota.

Por un futuro libre, firma y exprésate:

Plataforma Free and Open: http://www.freeandopenweb.com
Google Take an Action: https://www.google.com/takeaction

Divulga este comunicado en tus emails y en tus redes sociales. Exprésate con el tag #freeandopen

Entre todos lograremos que Internet siga siendo libre y abierta.

miércoles, 17 de noviembre de 2010

lunes, 25 de octubre de 2010

Aplicaciones Web sencillas con Python

Este artículo está dedicado a aquellas personas que quieran dar sus primeros pasos en el desarrollo de aplicaciones web, y para aquellos que desarrollan aplicaciones sencillas, sin demasiadas complicaciones. Antes de redactar este artículo he estado probando y evaluando diversos frameworks para crear sitios web, tales como Bobo, Web2Py, CherryPy, Django, etc., pero al final me he decantado por WebPy, por su extrema sencillez para empezar, y por la similitud que tiene con otros frameworks de otros lenguajes, con lo que la curva de aprendizaje es óptima.

Más adelante, si los proyectos web se vuelven muy complejos y se requiere de elementos prefabricados y avanzados (como objetos persistentes a bases de datos, encriptación, modelo vista controlador, etc.), recomiendo utilizar los otros frameworks citados anteriormente (hay muchos más, pero éstos son más populares y potentes).

Se asume que el lector tiene conocimientos básicos de Python y que previamente tiene instalado el intérprete de Python en su máquina:


Configuración del servidor Web

WebPy, a diferencia de otros frameworks, no posee un servidor de aplicaciones potente propio, y por ello, es mejor apoyarse en uno que ya esté funcionando. Entre los posibles candidatos se encuentran Apache, Lighttpd y nginx. Para este artículo he optado por Apache, dada su gran popularidad.

Una vez instalado Apache en nuestra máquina, es necesario agregar el módulo mod_wsgi, que permite hacer uso de Apache como servidor para aplicaciones escritas en Python. Este proyecto está alojado en: http://code.google.com/p/modwsgi

Una vez descargado, si estamos usando Windows, renombrar el archivo a mod_wsgi.so y copiarlo al directorio modules de Apache. En el caso de Linux, compilar el módulo mod_wsgi (consultar: http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide)

Una vez instalado el módulo, hay que configurar Apache para que reconozca dicho módulo. Para ello, editar el archivo httpd.conf (en el directorio conf de Apache), y agregar la siguiente línea en la misma parte en que Apache utiliza otras cargas LoadModule:

LoadModule wsgi_module modules/mod_wsgi.so

Al arrancar Apache desde la terminal debería dar un mensaje similar a éste:

Apache/2.2.2 (Unix) mod_wsgi/1.0 Python/2.3 configured

Si se lanzó desde Windows, el Apache Service Monitor, debería dar el mensaje en la parte inferior:


Instalación de WebPy

Hay varias maneras de instalar WebPy (consultar http://webpy.org/download).

Se puede descargar directamente la última versión desde la siguiente URL (consultar http://webpy.org/download para conocer cuál es la última versión):

http://webpy.org/static/web.py-0.34.tar.gz

También se puede descargar desde el repositorio en github:

http://github.com/webpy/webpy

Una vez descargado, descomprimir el archivo tar.gz, y ejecutar la siguiente sentencia para instalarlo como librería en Python:

python setup.py install


Primera aplicación Web

Para ilustrar la sencillez de desarrollo de una página Web con WebPy, vamos a crear la típica aplicación “Hola, Mundo”.

import web

urls = (
  '/', 'index'
)

app = web.application(urls, globals())

class index:
  def GET(self):
    return "Hola, Mundo"

if __name__ == "__main__":
  app.run()


La variable urls es una tupla que contiene pares de direccionamientos URL y nombres de clase. En este ejemplo, el direccionamiento “/” (root), estará asociado a la clase index. Se pueden definir tantos pares como sean necesarios para la aplicación Web.

El objeto app contendrá la definición de la aplicación Web. En este ejemplo se asocian las URL’s de la aplicación a namespace global.

La clase index contiene un método GET, el cual se lanzará cuando se invoque a la página, pudiendo recibir parámetros. En su interior, retornará el literal “Hola, Mundo”, el cual se imprimirá en el navegador. Existe también un método POST, que funciona como GET, pero ofuscando los parámetros. Estos dos métodos son los medios habituales de invocar a una página Web pasando (o no) parámetros.

Por último, las dos últimas líneas indican a WebPy que comience a servir páginas web con la configuración indicada.

Una vez se ejecuta este programa, el intérprete de Python se queda en modo de espera. El servicio Web está en marcha, esperando peticiones. Para probarlo, abrimos un navegador web e introducimos la URL:

http://localhost:8080

Debería aparecer nuestro bien conocido mensaje “Hola, Mundo”.


Parámetros y HTML

En una aplicación Web introduciremos elementos HTML para formatear el aspecto de las páginas. Además, añadiremos dinamismo permitiendo que las páginas muestren datos parametrizados (por ejemplo, recogidos de un formulario, o capturados de una base de datos).

Vamos a añadir más funcionalidad a nuestra aplicación anterior:

import web

urls = (
  '/hola', 'Saludo'
)

app = web.application(urls, globals())

class Saludo:
  def GET(self):
    data = web.input()
    return """
    <html>
    <head></head>
    <body background='#AAAAFF'>
    <h1>Hola, %s %s %s</h1>
    </body>
    </html>""" % (data.nombre, data.apellido1, data.apellido2)

if __name__ == "__main__":
  app.run()


El primer cambio lo hemos realizado en la sección de urls, donde ahora, el mapeo a la página Web será el siguiente:

http://localhost:8080/hola

Cuando se apunta a /hola, se invocará a la clase Saludo, concretamente a su método GET, en donde hemos agregado varios cambios. El primero de ellos ha sido definir una variable data, la cual recogerá los parámetros que se pasen por URL, lo que se consigue mediante la función input() del módulo web. Estos parámetros se recogerán en formato de diccionario, y son pares de parámetro y valor.

A la hora de retornar la salida, se retornará HTML, en donde hemos añadido un mensaje con formato de título (<h1>), un saludo con nombre y apellidos (extraídos de los parámetros pasados), los cuales se formatean mediante %s, e indicando después qué parámetros extraer.

Para invocar a la nueva página se pasan los parámetros en la misma URL, tal y como haría una llamada desde un formulario:

http://localhost:8080/hola?nombre=Carmen&apellido1=Martinez&apellido2=Salguero

El resultado es el siguiente:


Plantillas

En el último ejemplo comenzamos a utilizar HTML, que, al fin y al cabo, es el medio por el cual presentaremos la información en el navegador. El problema que tenemos es que se mezcla el código de Python y de HTML, y a la hora de depurar o realizar modificaciones, se vuelve enfarragoso y complejo. La forma ideal de trabajar sería separando la presentación (HTML) del código de negocio (el que procesa la información (Python)). Por un lado estarían las etiquetas HTML que ponen la información, y por otro el código Python que accede a la base de datos y la prepara en estructuras de datos (por ejemplo).

WebPy posee la característica de utilizar plantillas, que son directivas especiales embebidas en un código HTML, y que permiten conmutar valores que se pasan desde la capa de negocio o interactuar directamente con código Python.

Para estructurar nuestro código, vamos a crear un directorio donde se van a guardar las plantillas que vamos a necesitar. En nuestro caso la llamaremos plantillas. Dentro de este directorio crearemos un fichero llamado (por ejemplo) plantilla.html, y cuyo contenido será el siguiente:

$def with (nombre, apellido)
<HTML>
  <HEAD></HEAD>
  <BODY>
  $if (nombre!='' and apellido!=''):
    <H1>Hola, $nombre $apellido</H1>
  $else:
    <b>ERROR:</b> No ha facilitado el nombre y el apellido
  </BODY>
</HTML>

La primera línea

$def with (nombre, apellido)

debe ser la primera de la plantilla, y se encarga de recoger los parámetros enviados desde el código de negocio, los cuales serán presentados en la página HTML.

A continuación se crea el código HTML. Cuando es necesario presentar la información, hemos creado una estructura de control if para comprobar los datos pasados. En nuestro caso comprobamos si nombre y apellido contienen datos, en cuyo caso imprimirá en un título el mensaje “Hola, “ seguido del nombre y del apellido. Si uno de los dos datos no se ha facilitado, entonces (else) se mostrará un mensaje de error.

Ha de notarse que anteponiendo el símbolo $ (dólar) a una línea en Python, esta se procesará como código Python. Asimismo, este símbolo también se utiliza dentro del HTML para sustituir una variable por su valor.

Esta plantilla, por sí misma no hace nada. Debe ser asociada a la capa de negocio. Para ello crearemos el código en un fichero situado fuera del directorio plantillas, justo en el nivel anterior. El código será el siguiente:


import web

urls = (
  '/hola', 'Saludo'
)

render = web.template.render('plantillas')

app = web.application(urls, globals())

class Saludo:
  def GET(self):
    data = web.input()
    nombre = data.nombre if 'nombre' in data else ''
    apellido = data.apellido if 'apellido' in data else ''
    return render.plantilla(nombre, apellido)

if __name__ == "__main__":
  app.run()


El objeto render apuntará al directorio donde se encuentran nuestras plantillas, creando internamente un objeto por cada plantilla encontrada.

En el método GET de la clase Saludo, hemos reforzado el código (a prueba de errores) en cuanto a los parámetros. Si se pasa el parámetro especificado, recogerá su valor. Si no se pasa, le asignará una cadena vacía. Los parámetros pasados están en formato diccionario, por lo que es posible averiguar si el parámetro (clave) está dentro del mismo (‘clave’ in diccionario).

Por último, se retorna lo generado por la plantilla. Para ello se invoca a la plantilla:

render.plantilla(nombre, apellido)

Como se comentó anteriormente, internamente, WebPy toma las plantillas dentro del directorio al que apuntaba, y generará un objeto accesible por cada una de ellas. A la plantilla le facilitará los parámetros nombre y apellido, que serán recogidos por la primera línea de éste ($def with).


Un ejemplo más complejo

Los ejemplos anteriores han sido muy básicos. Vamos a ver un poco más a fondo cómo podemos aprovechar todo lo anterior. Imaginemos que queremos hacer una consulta a un catálogo de productos. Esta consulta puede ser general (muestra todos los productos), o bien específica (muestra un producto determinado). La solución pasaría por implementar un acceso a base de datos. Pero para no extender demasiado este artículo, vamos a tenerlo completamente en memoria (para más información sobre cómo acceder a bases de datos desde Python, recomiendo ver mi anterior artículo: http://rafinguer.blogspot.com/2010/10/conceptos-basicos-de-python-y-sqlite.html.

El código de negocio quedaría como sigue:

import web

urls = (
  '/ejemplo', 'Consulta'
)

render = web.template.render('plantillas')

app = web.application(urls, globals())

class Consulta:
  def GET(self):
    criterio = web.input()

    # Tuplas de diccionaris con datos de consulta.
    # Puede ser una carga de datos de una bbdd
    datos = (
      {'producto':'Tornillo', 'precio':0.45, 'marca':'Acme'},
      {'producto':'Tuerca', 'precio':0.55, 'marca':'Solme'},
      {'producto':'Clavo', 'precio':0.30, 'marca':'Calme'},
      {'producto':'Remache', 'precio':0.60, 'marca':'Acme'},
      {'producto':'Clavija', 'precio':0.95, 'marca':'Acme'},
      {'producto':'Grapa', 'precio':0.25, 'marca':'Tecme'}
      )

    registro=''

    if criterio:
      for i in range(0,len(datos)):
        if datos[i]['producto'] == criterio.producto:
          registro = datos[i]
          break

    if registro =='':
      registro = datos

    return render.productos(registro)

if __name__ == "__main__":
  app.run()


La llamada a la página puede hacerse sin parámetros (mostraría todos los productos), o bien pasando el parámetro producto, especificando cuál queremos consultar.

En ambos casos, a la hora de invocar a la plantilla, se pasaría la lista de productos o un único producto, que se almacena en la variable registro.

El código de la plantilla (productos.html) sería el siguiente:

$def with (registro)
<HTML>
  <HEAD></HEAD>
  <BODY>
  <TABLE BORDER='1'><TR BGCOLOR='#AAAAFF'>
  <TD><B>PRODUCTO<B></TD>
  <TD><B>PRECIO<B></TD>
  <TD><B>MARCA<B></TD></TR>

  $if 'producto' in registro:
    <TR>
    $for i in range(0,len(registro)):  
      <TD> $registro.values()[i] </TD>

    </TR>
     
  $else:
    $for i in registro:
      <TR>
      <TD> $i['producto'] </TD>
      <TD> $i['precio'] </TD>
      <TD> $i['marca'] </TD>
      </TR>

  </TABLE>
  </BODY>
</HTML>


En el caso de que se pase un único registro (la consulta se hizo por un único producto), éste será en sí un diccionario, por lo que al consultar si tiene una clave llamada producto, retornará el valor True. En tal caso, la función len() retorna el número de pares clave/valor del diccionario. Conociendo este valor, se recorre cada campo del diccionario en el bucle for y se extrae su valor, visualizándolo en una columna.

En el caso de pasar el catálogo completo, la función len() retornaría el número de filas (diccionarios) que contiene la lista. El acceso a la lista debe realizarse mediante un iterador (i), el cual recoge, una a una, cada fila (diccionario). El valor se extrae invocando el nombre de su clave.

El resultado final sería el siguiente:

Conclusiones

Este breve tutorial cubre los aspectos más básicos, pero, a la vez, más potentes y flexibles, para comenzar a desarrollar aplicaciones Web mediante Python. A partir de las nociones vistas anteriormente, podremos empezar a desarrollar complejas web dinámicas de una forma sencilla y eficaz.


Referencias

Lenguaje Python: http://www.python.org
mod_wsgi: http://code.google.com/p/modwsgi
WebPy: http://webpy.org
Apache: http://httpd.apache.org


Safe Creative #1010257670146

jueves, 12 de febrero de 2009

Internet útil (1): DropBox

Voy a iniciar una serie de artículos dedicados a explorar lo que Internet nos puede ofrecer. En estos artículos se van a analizar distintos servicios que habitan en nuestro infinito cibermundo, donde pululan infinitas posibilidades. De entre ellas, nos centraremos a las más populares y, sobre, todo en las gratuitas.

En este primer artículo, voy a detenerme en un servicio que he descubierto hoy mismo y que, gratamente me ha sorprendido. Llevaba ya un tiempo buscando un servicio de disco duro o repositorio online. ¿Qué significa ésto? Tener un disco duro en un servidor remoto, que es ofrecido a través de Internet. Bueno, aunque el concepto sea muy simple, las posibilidades son enormes.

Yo trabajo con varios ordenadores y en distintos lugares: en el trabajo, en mi casa, en la de amigos, en la de clientes... Suelo trabajar con muchos archivos, y éstos se suelen actualizar en un equipo o en otro, y algunos compañeros pueden trabajar en los mismos archivos.

Algunos me diréis: "bueno, para eso utiliza un pendrive o un disco duro portable". La solución no es descabellada, y funciona muy bien si los equipos que se utilizan son muy similares y usan sistemas muy similares. Pero, ¿qué ocurriría si un equipo tiene Linux o es un Mac? ¿Y si el equipo no tiene el driver? ¿Y si por error machaco una versión de archivo por una anterior o por otra errónea? ¿Y si pierdo el pendrive?. ¿Cómo sincronizamos la última versión de un archivo entre los compañeros de trabajo? Existen más problemas además de los citados, y la solución a ellos es poder disponer de un repositorio de almacenamiento en cualquier lugar, a cualquier hora y sin incompatibilidades hardware/software.



Existen lugares en Internet donde puedes almacenar archivos, pero adolecen, por las características del servicio, de muchas limitaciones. Por ejemplo, el SkyDrive de Windows Live, aunque es un buen inicio, es muy lento y ofrece pocas posibilidades. Otros lugares, como MegaUpload, RapidShare o similares, suelen ser básicos en cuanto al concepto, y su fin es compartir dichos archivos, bajo unas condiciones un poco estrictas, como la de tener que esperar entre descarga y descarga durante algunos minutos si no te suscribes a la modalidad premium, que es de pago, o que el compartir sólo es de lectura (no de escritura).

En DropBox encontrarás a la herramienta perfecta para mantener siempre a salvo y actualizados todos tus datos.


Para usar DropBox, accede a su dirección Web:

http://www.getdropbox.com

Una vez en su página, crearemos una cuenta particular (como cuando la creamos en un webmail o en otros servicios de internet). A partir de ahí, podremos hacer uso del servicio de forma inmediata.



Lo primero que encontraremos será nuestra página principal (Home), con las últimas operaciones que se han realizado, y el sistema de carpetas por defecto, que contendrá las carpetas Public (pública o visible para todo el mundo) y Photos (fotografías visibles para todo el mundo). A partir de aquí podremos tratarlo como si de un disco se tratara. Cualquier carpeta que creemos será privada, pero podremos compartirlo con aquellos usuarios a los que invitemos (a través de su cuenta de email).



DropBox ofrece un servicio muy versátil, ágil, rápido y configurable. Podemos configurar carpetas públicas y privadas, y compartir con quien invitemos los contenidos. Esta última opción nos permite trabajar en equipo, y cada uno de los participantes podrá acceder a cada archivo compartido y trabajar con él. Los cambios que realice, los recogerá el resto de participantes actualizados, sincronizándose online. Si alguno de los usuario está offline, cuando se conecte se actualizará automáticamente a la última versión. Además, para evitar machacar versiones, DropBox permite guardar versiones o revisiones, y volver a las mismas, como si fuera un SourceSafe o un Subversion, aplicaciones de gestión de versiones de archivos ampliamente aceptadas y utilizadas por programadores.



El concepto de DropBox es bien simple, pues en una carpeta de nuestro disco duro en nuestra máquina, se crea la misma estructura que estará en nuestro repositorio virtual. Cualquier cambio realizado en nuestro disco duro físico, se sincroniza automáticamente y se sube al respositorio virtual. Lo mismo ocurre a la inversa: cuando un archivo es subido, eliminado, movido o copiado en el repositorio virtual, automáticamente se actualizan en el disco local de los equipos compartidos.

Cada cambio que se realice en los archivos, es registrado y notificado desde la página de DropBox, de modo similar a las notificaciones de las redes sociales, como Facebook. Es posible, asimismo, conectar estas notificaciones a un feed, lo que nos permitirá conocer en todo momento cuándo un archivo se modifica y quién lo ha modificado, o si alguno a creado una carpeta, si ha copiado un archivo, si lo ha borrado, etc.



Así pues, con DropBox podrás tener tus archivos siempre disponibles, poder compartirlos con quien quieras a través de una invitación, y cuando alguno se modifique, automáticamente obtener siempre la última versión, con la posibilidad de poder acceder a las distintas revisiones de cada archivo. Cualquier modificación en un archivo, actualizará automáticamente el mismo archivo en el disco duro local de todos los equipos que utilicen los participantes.



Otro uso puede ser el de backup. En lugar de estar siempre a vueltas con un CD o con un pendrive o con un disco duro portátil, haz la copia de seguridad y envíalo a DropBox. Podrás acceder luego desde tu casa o desde cualquier otro lugar.

Imaginemos otro caso muy común: un archivo muy grande que queremos enviar a un amigo. Obviamente, el correo no es el medio adecuado. Copia el archivo en el directorio Public (público), y envíale por correo a tu amigo la dirección pública de este directorio. Para él será como una visita a una página web normal, donde podrá descargarse el archivo a través de un enlace.

El acceso se realiza con un ordenador conectado a internet, sin importar el hardware del equipo, el sistema operativo o el navegador utilizado. Incluso es posible utilizarlo desde un iPhone (y es posible que en el futuro veamos más medios). Puedes usarlo completamente desde el navegador sin instalarte nada en el ordenador, usando para ello Ajax. Otra posibilidad es la de instalarte un programa que te facilitará mucho el uso de DropBox (opción que te recomiendo), a través de un icono en la barra de herramientas y completamente integrado en el explorador de archivos de tu sistema, donde podrás obtener las opciones de DropBox a través del botón derecho del ratón.

La capacidad básica de este servicio es de 2GB (más o menos la mitad de un DVD), una cantidad muy aceptable para el día a día. Si se requiere de más capacidad, es posible contratar 50GB por un importe económico por el servicio y la capacidad ofrecidas: 100 dólares al año (8,33 dólares al mes). Otra manera de suplir esto de forma gratuita, es crear otras cuentas DropBox (cada una de 2GB).

Es muy sencillo de usar. Todo está accesible, la interfaz es sencilla y usable. Al principio, si el concepto es nuevo, puedes estar algo perdido, pero enseguida lo entiendes y no dejarás de usarlo. La única pega que se le puede achacar es que está completamente en inglés. Pero esto no nos debe asustar, pues no es un inglés complejo ni enreversado, si no muy sencillo para los que tengan alguna noción de inglés.

Además, DropBox cuenta con ayudas, un tour, un foro y una Wiki, donde podrás encontrar todo tipo de información sobre esta herramienta, así plantear preguntas que podrán responderte.



Para finalizar comentar que esta es una de las mejores herramientas con las que he trabajado durante años (y ya son más de 20 años). Para mi día a día, para mi trabajo, para mi ocio, para organizar, para compartir, para trabajar en equipo, para mis copias de seguridad, etc. Esta herramienta es indispensable. Le doy un 10.