Jun'11
22

Como último artículo de la serie, vamos a adentrarnos un poco más en la declaración de elementos similares a las funciones con macros , para ser más exactos, con sus argumentos y posibilidades:

Convertir a String

En ocasiones no es de un gran interés tratar de la misma manera todos los argumentos que le pasamos a este tipo de funciones de preprocesador.

En el caso concreto de que deseemos tratar el argumento como un String constante, habremos de precederlo con el símbolo ‘#‘, demnaera que estamos convirtiendo en constantes dichos parámetros, pero veamos un ejemplo que he sacado de gnu.org, ya que me parece bastante ilustrativo.

#define WARN_IF(EXP) 
     do { if (EXP) 
             fprintf (stderr, "Warning: " #EXP "n"); } 
     while (0)
     WARN_IF (x == 0);

Este pedazo de código nos dará una salida como la siguiente:

do { if (x == 0) fprintf (stderr, “Warning: ” “x == 0″ “n”); } while (0);

Es decir, el argumento EXP se sustituye como argumento en el primer caso y como un string en el segundo.

Una de las grandes ventajas de la conversión a String de este tipo de macros, es que no sólo añade dobles comillas, sino que escapa los caracteres necesarios para que la cadena se muestre tal y como es, a no ser que esta se encuentre dentro de una cadena de texto ya o sea un carácter como ‘n‘.

Finalmente puede resultarnos de utilidad concatenar un par de tokens dados dentro de una macro; para ello podremos hacer uso de ‘##

Parámetros indefinidos

Algo que puede resultarnos muy interesante e incluso increíble cuando empezamos a utilizar C, es que, si bien nos han enseñado a que las funciones tienen un número definido de parámetros, ¿cómo es posible la existencia de funciones como printf?

Al igual que para las funciones, existe una forma de hacer que una macro acepte un número no definido de parámetros, y este método aparece en forma de __VA_ARGS__. Este token nos permitirá sustotuir en nuestro macro los ‘‘ por los valores que se le han pasado a la función.

#define log(...) printf(__VA_ARGS__)

Si queremos ser más descriptivos con los parámetros podemos sustituir ‘‘ por ‘<nombre>…‘, por ejemplo:

#define log(args...) printf(args)

Si queremos especificar un número mínimo de argumentos, podemos hacerlo de la siguiente manera:

#define log(formato, args...) printf(formato, args)

pero esto hace que sea obligatorio, en todo momento, si no pasar un segundo argumento, sí escribir la coma después del primero. Para solucionar este problema, de nuevo acudimos al manual de gnu.org que nos dice que echemos mano de ‘##‘, de manera que podamos omitir, si lo deseamos el segundo parámetro y la coma de después del primero al llamar a la macro:

#define log(formato, args...) printf(formato, ##args)
Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): C/C++, Manuales
Jun'11
15

En el pasado y primer artículo de esta serie, describimos a grosso modo el funcionamiento de la directiva de preprocesador #define; siendo una de las características más importantes a tener en cuenta el hecho de que a la hora de compilar el programa no estamos trabajando con variables con un valor, sino con los valores directamente. De este modo estaremos ahorrando memoria y dotando de legibilidad a nuestro código en determinadas ocasiones.

Hoy vamos a ver cómo simular funciones con el sistema de Macros. Antes de nada, hay que aclarar que: si bien para constantes, por convenio, se utilizan letras mayúsculas en todo momento, para esta especie de funciones no es necesario hacer esto, de manera que podemos continuar con el sistema de nomenclaturas que hemos estado llevando hasta el momento (como recomendación, yo usaría todo en minúsculas menos la primera letra de cada palabra exceptuando la de la primera, Ex: hallarMaximo(…)).

Supongamos que contamos con dos funciones en nuestras librerías:

int rand(void);
int fastRand(void);

Ambas funciones llevan a cabo la misma tarea, sólo que utilizan diferentes métodos para realizarla, de hecho, la segunda que es mucho más eficiente que la primera (como puede entenderse por el nombre), la acabamos de implementar y, a pesar de que la entrada y la salida es la misma, la primera ha sido utilizada cientos de veces en nuestro código, y cambiarla implicaría un repaso exhaustivo del código fuente y, en caso de tener una API pública, implicaría cambiarla y notificárselo a todos nuestros usuarios.

En lugar de esto, podemos crear una macro que se encargue de realizar dicha sustitución durante el proceso de precompilado:

#define rand() fastRand()

de manera que, cada vez que llamemos a la función rand() en nuestro código, a la hora de compilarlo, es como si estuviésemos llamando a la función fastRand().

Pero el poder de esta herramienta no se para con estas características, sino que nos permite definir algo parecido a funciones de forma completa. Con esto quiero decir que podemos definir macros que a la hora de editar el código y utilizarlos, podemos asumir que son funciones. Pongamos un ejemplo:

#define max(x, y) ((x > y) ? x : y)

una vez hehcha esta definición, nosotros, desde nuestro código podremos llamar a esta “función” evitando que se gasten, entre otras cosas niveles de pila, ya que el código es sustituido durante el proceso de preprocesado, de manera que si escribimos en nuestro código:

int a = 2;
int b = 4;
int z = max(a, b);

el código que realmente se estará ejecutando una vez compilado será:

int a = 2;
int b = 4;
int z = ((a > b) ? a : b);

Uno de los grandes problemas de utilizar esta técnica para sustituir a las funciones es que, como podemos observar es que, a la hora de llamar a la macro, no tenemos comprobación del tipado de los datos que le pasamos, pudiendo obtener así, resultados inesperados o incluso errores de estabilidad del programa. Hay que ser conscientes en todo momento de que los argumentos, a la hora de llamar a una macro que se comporta por una función, estarán separados por comas.

Finalmente, a la hora de llamar a una macro, si no le pasamos el número de argumentos necesarios, obtendremos un error de preprocesador, pero en caso de que le pasemos argumentos vacíos, estos se sustiuirán por argumentos vacíos sin dar error durante el proceso de preprocesado.

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): C/C++, Manuales
Jun'11
8

iPad2 blanco

Recientemente adquirí un iPad 2 porque deseaba meterme en el mundillo de la programación para este tipo de dispositivos, y dado que no es lo mismo probarlos sobre una pantalla de ordenador que sobre el cacharro en si (esto es algo que he aprendido de haberme introducido en el mundo de programación de aplicaciones móviles para el sistema operativo Android), decidí lanzarme a la piscina con ello.

El caso es que llevo dos días dándole un uso mas que aceptable al iPad, y tras ello me gustaría comentarles una serie de aplicaciones gratuitas que, a mi modo de ver, le convendría tenerla instalada si posee uno de estos cacharrilos.

Ante la gran cantidad de artículos de este tipo, me gustaría darle un nuevo enfoque a este post. No solo vamos a comentar las aplicaciones sino que vamos a comentarlas desde un punto mas técnico y no contando solo sus bondades, sino también sus debilidades; además, vamos a comentar las que a mi, como informático y teleco que soy ademas de bloguero, webmaster,… Me parecen interesantes desde este punto de vista…

  • Dropbox: en poco menos de un año, Dopbox se ha convertido en una de las aplicaciones imprescindibles en todos mis dispositivos, tanto móviles como no. Gracias a esta aplicación, y contando in una conexión a internet seremos capaces de acceder a nuestros ficheros en cualquier parte del mundo y equipo, llegando incluso a ofrecernos un sistema de versionado de los ficheros durante el ultimo mes. Si aun no tienes cuenta y deseas creaste una, puedes hacer click en el siguiente enlace:http://www.dropbox.com/referrals/NTkyNTM4MTk5. Ya que si en lugar de utilizar el de la pagina principal del servicio, utiliza este, obtendrá un bonos de 250MB extra totalmente gratis.
  • iCromy: es un navegador recién salido del horno que nos permitirá navegar desde nuestro tablet sin tener que recurrir a pulsar varios botones para poder navegar entre las diferentes pestañas que nos interesen. Además seremos capaces de marcar paginas como favoritas y como pendientes de lectura, esta ultima funcionalidad me ha parecido de gran interés. Finalmente y como contra he de mencionar que, entre otras mejoras, deberían habilitar el teclado especial para introducir direcciones web en la barra de navegación.
  • Twitter: como no, no podíamos ser menos, y es que si para android e iPhone utilizo tweetDeck, he de reconocer que, el hecho de que no este adaptada la resolución para el iPad, lo hace incomodo de utilizar, de manera que lo mas sensato es hacer uso de la aplicación oficial, ya que nos permitirá navegar sin problemas por todas las opciones que nos proporciona la red social.
  • MyPad: Facebook es una red social que no ha desarrollado una aplicación oficial para navegar porque su red social, lo cual dificulta enormemente el uso de la red social, o bien nos obliga a utilizar la de iPhone, lo que nos obliga a conformarnos con una mala resolución. Pues bien, ante la tardanza de la aparición de aplicaciones oficiales, ha nacido MyPad, una aplicación que nos hará poder navegar por nuestro perfil sin ningún tipo de problema?
  • WordPress: si eres dueño, editor,… De un blog WordPress, esta aplicación no puede faltar en tu iPad, mediante esta aplicación podremos desde moderar comentarios hasta crear paginas pasando por la escritura de nuevos artículos sin tener que encender nuestro ordenador.
  • Skype: a pesar de ser una aplicación diseñada para el iPhone e iPod touch, y por consiguiente la resolución de la aplicación es paupérrima, no nos queda más remedio que usarla si deseamos poder utilizar esta magnífica herramienta de comunicación. Como contras nos encontramos con que con el iPad viene instalada una aplicación muy similar llamada FaceTime y que, además no cuenta con compatibilidad para videollamadas.
  • uPad lite: esta es para mi gusto la mejor aplicación para la toma de notas sobre el iPad con la que contamos en el Apple store de forma gratuita, ya que nos permite hacer zoom de zonas, establecer un área de apoyo para la mano,… Sinceramente, he de decir que es una auténtica maravilla, ya os comentaré como va la versión PRO si al final decido compraría, algo muy probable, sinceramente.
  • TeamViewer: como ya he dicho me dedico profesional y educacionalmente al mundo de las nuevas tecnologías, y no es raro que un amigo, familiar, o simplemente yo mismo, requiera que modifique algo en su ordenador remotamente, pues bien, si utilizamos esta aplicación, seremos capaces de controlar dichos ordenadores sin pagar un céntimo siempre y cuando su uso sea de carácter personal y no comercial.
  • Google earth: una gran aplicación que deja pequeña a la aplicación maps y que que, en parte nos muestra las capacidades de renderizado de nuestro iPad, ademas es un interesante programa con el cual viajar sin gastarnos un céntimo, descubrir nuevos lugares o, simplemente planificar nuestras próximas vacaciones familiares o con los amigos.
  • Tap to Chat: la verdad es que no tenía intención de poner este tipo de aplicaciones aquí, pero la forma de presentar las conversaciones del chat de gmail por este programa me ha dejado gratamente sorprendido, definitivamente muy recomendable si utilizamos con asiduidad el chat que nos ofrece Google desde su plataforma de correo electrónico.

Como habrán podido observar, la lista se asemeja a otras en parte, pero no en su totalidad, y aunque estoy seguro de que me dejo grandes programas en el tintero, como por ejemplo Evernote, he decidido no meternos en mi top 10, ya que para suplir esa necesidad ya utilizo otras aplicaciones web desde hace tiempo, como por ejemplo, la ya comentada en este blog Diary.

Si tienen alguna recomendación o queréis que pruebe y luego comente alguna aplicación, sienta se libres de dejar un comentario en esta entrada.

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Etiqueta(s): , ,
Categoría(s): Programas
Jun'11
1

Todo programador de C y C++ que se precie debe estar más o menos familiarizado con las directivas de preprocesador en general y mas concretamente, debería estarlo con las llamadas Macros. Una macro es un trozo de código, usualmente en la zona de cabecera o en los propios ficheros de cabecera (*.h).

Las macros se definen mediante la directiva #define; veamos un ejemplo:

#define PI 3.14159

Esta macro se encarga de asociar el valor 3.14159 con el valor PI mediante la directiva #define, es decir, la estructura sería algo así como lo siguiente:

#define <alias> <valor>

dónde <alias> es el nombre que queremos utilizar para referirnos al término que ocuparía el lugar de <valor>. Ésta característica de C se utiliza sobre todo para facilitar el uso de variables que durante todo el programa van a tener el mismo valor, ya sea por el hecho de que son constantes, como por ejemplo el valor del número pi (3.14159), el valor de la gravedad terrestre g (9.81) o cualquier otra constante o porque simplmente son eso, constantes que no variarán, como por ejemplo el tamaño máximo de un array.

Un aspecto relativamente importante de las macros es que, por convenio, y para facilitar la lectura de las mismas en programas, se suelen utilizar letras mayúsclas, de manera que si nos encontramos con:

int main(int argc, char** argv){

printf("%f, %f", r, PI);

return 0;

}

podríamos concluir que la letra r se corresponde con una variable, ya que está está (o empieza) con minúsculas, mientras que PI es un valor constante. Ambos valores han de estar definidos con anterioridad.

Veamos un ejemplo práctico de uso:


#include <stdio.h>

#define PI 3.14159

int main(int argc, char** argv){

double radio = 25.684;

double area = PI * radio * radio;

return 0;

}

La directiva #define no sólo nos servirá para definir valores de variables, sino que también podremos utilizarlo para declarar valores de arrays:

#define CONTENIDO 0, 
                     1, 
                     2
int main(int argc, char** argv){
int valores[] = { CONTENIDO };
return 0;
}

Como habréis podido comprobar detrás de las dos primeras líneas de código aparece una barra inclinada (), esto quiere decir que la declaración de la macro va a continuar en la línea siguiente, lo cual nos facilitará enormemente la legibilidad de nuestro código.

¿Por qué nos convendría usar macros?

El uso de macros puede parecer un poco absurdo de buenas a primeras, ya que podemos utilizar funciones (ya veremos más adelante el porqué de esta afirmación) o variables para conseguir los mismos resultados. La diferencia entre usar unas u otras es que al usar macros, el código del <alias> se sustituye por el del <valor> durante el proceso de pre-compilación, de manera que a la hora de compilarlo, el código queda sustituido y al ejecutarlo no tendremos que malgastar ciclos de CPU realizando cálculos como este.

¿Podemos invalidar algo declarado con un #define?

Efectivamente podemos hacerlo mediante el uso de la directiva de preprocesador:

#undef <alias>
Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): C/C++
May'11
30

http://diary.dipler.org

Seguimos con el desarrollo de la modesta aplicación que nos permite llevar un diario mientras nos facilita la vida para llevar un listado de tareas e ideas de forma completamente privada, y es que después de un tiempo sin actualizaciones oficiales, me complace presentar Diary 2.3, esta versión viene con las siguientes novedades que, espero les parezcan interesantes:

  • Corrección de errores puntuales en la edición de entradas categorizadas con un flag distinto al de Diario.
  • Corregido el error al pulsar el botón more después de haber realizado una búsqueda.
  • Corregido el error al codificar los signos +.
  • Mejora de los estilos para mejorar su compatibilidad con Firefox 4 e Internet Explorer 9.
  • Añadida la función de crecimiento automático del area de texto en función del contenido para mensajes nuevos.
  • Añadida la función de crecimiento automático del area de texto en función del contenido para el modo de edición de mensajes.
  • Añadidos hastags al estilo de los tags de Twitter, en los que al pulsar en ellos se realiza automáticamente una búsqueda con dchos tags.
  • Por defecto cuando llegamos a la parte final de la lista de elementos cargados, s

http://diary.dipler.org

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Etiqueta(s):
Categoría(s): PHP, Producción propia
May'11
25

Logo Microsoft .NET

.NET es un lenguaje de programación para equipos Windows que también nos es de gran utilidad a la hora de hacer completas aplicaciones web que necesitan un plano de controlador potente. Por el contrario nos dificulta algunas tareas como las de maquetar el HTML. Me explico: en PHP, cuando ejecutamos un script este siempre genera el código HTML que ha de mostrarse desde 0 a cambio de tener que trabajarnos un poco más el sistema de control de los datos de las páginas usando, por ejemplo, sistemas como el de las sesiones, es decir, tenemos que hacerlo todo “a mano”.

Por el contrario .NET nos ofrece trabajar con los llamados “PostBack”, este sistema de “refresco” de las páginas convierten un sistema sin estado, como son las conexiones HTTP, es una especie de sistema con estado mediante el uso de estructuras como el ViewState.

Esta especie de sistema de conexión con estado hace que, en caso de querer generar HTML de forma dinámica sin plantillas previas, nuestro trabajo pueda convertirse en una ardua tarea.

Para ello podemos hacer uso de una función llamada Page_init ( en lugar o además de Page_load). En esta función, si bien no tiene acceso a estructuras de datos como por ejemplo el ViewState, podemos pintar en el documento un layout HTML a mano antes de que el flujo de la página siga su transcurso, incluso antes de que se cargue el ViewState. Hasta aquí todo normal, y probablemente no le suponga ninguna novedad, peqro ¿Qué pasa cuando hay un PostBack en la pagina que hemos generado de forma dinámica?

Respuesta: si dentro de Page_init no hacemos uso de el condicional !Page.isPostBack, es decir, no ponemos nuestro códig de generación de HTML dentro de un if con esa condición, el código HTML, además de generarse de nuevo, en caso de ser un formulario o algo parecido, este mantendrá los datos introducidos en el mismo antes de hacer dicho PostBack.

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): .NET, Manuales, Programación
Apr'11
13

El zip bomba o zip de la muerte es un fichero *.zip de pequeño tamaño que al descomprimirse genera ficheros que, almacenados en disco, pueden llegar a ocupar una salvajada de espacio en disco. La finalidad de este tipo de ficheros es dejar inutilizado, bloquear un equipo durante un periodo de tiempo o mantener entretenido a programas antivirus.

Un ejemplo de este tipo de ficheros es el llamado 42.zip, el cual es un fichero de 42.374 bytes que almacena en suinterior otros 16 ficheros zip que contienen el mismo número de ficheros. Si repetimos este proceso 6 veces, obtendremos como resultado esta maravillosa arma de destrucción de ordenadores (entiendase la ironía). Finalmente, cada fichero final contiene un fichero de 4,3 GB, es decir, que si hacemos unos pequeños cálculos…

  • 16 x 4294967295 = 68.719.476.720 (68GB)
  • 16 x 68719476720 = 1.099.511.627.520 (1TB)
  • 16 x 1099511627520 = 17.592.186.040.320 (17TB)
  • 16 x 17592186040320 = 281.474.976.645.120 (281TB)
  • 16 x 281474976645120 = 4.503.599.626.321.920 (4,5PB)
  • Para crear uno de estos ficheros no tenemos que crear complejos algoritmos ni nada por el estilo, sino que nos bastará con crear un fichero de texto y llenarlo con valores null hasta que lleguemos al tamaño de fichero deseado, una vez comprimido el fichero se comprimirá con un ratio muy grande, de manera que somos capaces de meter tanta información en un espacio tan pequeño como 42kB.

    Pero, ¿cómo funciona?, los servidores que se encargan de controlar que a una determinada red no entran ficheros malintencionados se ven obligados a descomprimir determinados ficheros comprimidos no cifrados de forma automática, de tal manera que si tiene que descomprimir un fichero que, una vez descomprimido llega a ocupar 4,5 PB deja el servidor completamente inutilizado, no sólo por el espacio en disco que ocupa el fichero descomprimido, sino que también puede quedar colapsado por el número de ciclos de CPU utilizados.

    Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
    Categoría(s): Curiosidades, Informática, Seguridad
    Mar'11
    9

    Dipler no es una página que nació tal y como la conocéis hoy, de hecho la que es hoy Dipler nació bajo el nombre de Bit’n’Byte y poco a poco fui adquiriendo los dominios de dipler.org y dipler.com y esto, ¿por qué?, se preguntarán. Hace ya cuatro años fundé con unos amigos una página web en formato de blog de contenidos generales llamada Dipler, esta página, si bien no consiguió llegar a tener un gran número de visitas diarias (los mejores días no llegaba a 100 usuarios), en relativamente poco tiempo consiguió un hito nada fácil de conseguir llegar a la portada de Menéame con un artículo escrito por Jaime Ochoa:


    Esto nos propició en menos de un día, concretamente en unas pocas horas, la friolera de más de 3.000 visitantes únicos, lo cual para mi y para mis compañeros editores nos pareció una auténtica barbaridad. Esperábamos que de todas esas visitas al menos un porcentaje se viese atraído por el contenido de la página y que siguiesen visitándonos, desafortunadamente eso no pasó, al menos en la medida que nos esperábamos, cayendo las visitas de nuevo de forma abrupta a un punto similar al anterior, es decir, en un día aumentó en un 3.000% el número de visitas y al día siguiente cayó de nuevo a la normalidad.

    Relativamente poco después de este suceso, desafortunadamente y por motivos de falta de tiempo de los componentes del equipo, la página original de Dipler murió y naciendo así, el 21 de julio de 2008, la página que hoy conocéis y cuyo principal editor soy yo. Esta página volvió a alcanzar los últimos puestos de la portada de menéame y de bitácoras alguna que otra vez, pero en ningún momento se volvió a repetir dicho efecto de una forma tan pronunciada hasta el pasado viernes 11 de febrero de 2011.

    El día 11 de febrero a las 10 de la mañana, entré en el sistema de estadísticas de Google Analytics y me llevé una sorpresa al ver que el número de visitas del día ascendía a algo más de 2.000, sobre todo si tenemos en cuenta que el número medio de visitas de esta página web es de unos 300 usuarios al día.

    Rápidamente se me vino a la cabeza el ya conocido por nosotros “Efecto Menéame“, pero para que eso sucediese tendría que estar, no solo en portada, sino en una de las primeras lineas de la página. Esto se me antojaba extraño, porque el último post que había publicado hasta esa fecha era Diary 0.2.1 (10/02/2011), el cual, ni mucho menos era propio de una portada de Menéame, ya que no era una noticia relevante, ni mucho menos  por muy útil que les parezca a algunos dicha utilidad. Así que decidí seguir investigando en Google Analytics para ver de dónde procedían las visitas (quizá debería haber hecho eso desde un principio, pero nadie es perfecto).

    Tras ir al apartado de fuentes de tráfico vi que la inmensa mayoría de las visitas provenían referenciadas desde Google, lo cual se me antojaba aun más extraño que el hecho de que el artículo que contaba las últimas novedades en Diary 0.2.1 hubiese sido portada en Menéame. Tras indagar un poco más vi que las palabras claves de acceso a la página que estaban redireccionando a esta página esa ingente cantidad de tráfico  eran “Thomas Edison“.

    O todo el mundo tiene que hacer un trabajo sobre Edison al mismo momento o, sinceramente, no se me ocurría qué podía estar sucediendo. A todo esto las visitas la casi llegaban a las 3.000. Minutos más tarde entro en Google y me encuentro con el siguiente Doodle:

    ¡Ya está! Esta era la respuesta que estaba buscando, se celebraba un evento relacionado con Edison y uno de los artículos de este blog aparecía bien posicionado bajo esas palabras clave, de hecho la imágen que encabezaba el artículo aparecía la primera de todas en Google Images.

    Dado que los Doodles suelen estar online por un periodo de 24h o más (dado que México, venezuela,… son países en los que se habla también el español y hay una gran diferencia horaria), me planteé muy seriamente si mi humilde servidor compartido, que no es capaz de cumplir los requisitos de velocidad de algunos buscadores, sería capaz de atender todo el tráfico que se avecinaba sin caerse, sobre todo teniendo en cuenta que hay varias páginas alojadas en mi cuenta y supongo que lo mismo en las de los otros usuarios. Para minimizar el consumo y los tiempos de despachado de páginas, habilité rápidamente todos los sistemas de cacheado que tenía a mi disposición, ya que mil visitas por hora es una cifra bastante elevada para un hosting compartido. Tras esto me acordé del post “cómo aguantar una portada de Menéame” y me dispuse a cachear la página el sitios externos por si tenía que redirigir el tráfico desde la página principal.

    Sorprendentemente el servidor aguantó estoicamente durante 36 horas aproximadamente y soportando de media unas 1.000 visitas por hora, llegando a alcanzar las 26.394 visitas el día 11 de febrero y 9.868 visitas el día 24 de febrero. Mi más sincera enhorabuena al personal de Dreamhost y de los desarrolladores del plugin super caché para WordPress.

    De nuevo, ingénuo de mí, pensé que alguna de esas visitas se convertiría en asiduos a la página, pero de nuevo, esto sucedió de una forma muy leve. No obstante, es impresionante el poder de algunas páginas web véase, en este caso,  Google a la hora de redireccionar visitas de un lado para otro.

    Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
    Etiqueta(s): ,
    Categoría(s): Internet, Reflexiones
    Mar'11
    4

    http://diary.dipler.org

    Llevabamos ya un tiempo sin añadirle mejoras a la aplicación Diary, así que he creido oportuno lanzar una actualización en estas fechas. Si bien la actualización no tiene grandes mejoras abre paso a un nuevo ámbito de desarrollo. Para futuras versiones se pretende añadir notificaciones por email, planificar tareas para fechas seleccionadas y la integración de la aplicación con redes sociales como Facebook y/o Twitter.

    En resúmen, las mejoras añadidas y los errores corregidos en esta versión son los siguientes:

    • Mejorado el rendimiento interno de alguna de las funciones del núcleo de la aplicación.
    • Se permite el borrado de entradas.
    • Se permite la edición de entradas (en caso de ser una tarea, esta estará marcada como no terminada por defecto.
    • Cambios leves en las estrucutras de datos que almacenan la información relativa a las entradas.
    • Añadidos efectos de transiciones en la barra de notificaciones.
    • Movida a la parte inferior la barra de notifiaciones.
    • Corregido el error al introducir en una entrada la barra inclinada “”.
    • Si una tarea está finalizada se mostrará el borde de color verde.
    • Mejorada la notificación de cargando.
    • Leve cambio en la hoja de estilos en lo relevante a enlaces,…
    Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
    Etiqueta(s):
    Categoría(s): PHP, Programas
    Mar'11
    2

    ubuntu logo

    Tal y como algunos de vosotros ya sabréis, la nueva versión de Ubuntu 11.04 Natty Narwhal realiza un cambio radical en lo que a interfaz de usuario se refiere, y es que pasaremos de utilizar el ya conocido por muchos entorno de escritorio llamado Gnome al no tan conocido Unity. Este sistema de gestión de escritorios ya está implementado en la versión actual 10.10 para netbooks.

    Hasta este momento, las versiones alpha de este sistema operativo estaban bastante verdes, ya que, entre otras cosas, no funcionaba correctamente la combinación de teclas Alt+Tab,… pero recientemente se han realizado una serie de mejoras muy importantes, entre las que nos encontramos un buen funcionamiento de dicha combinación de teclas y otras mejoras en la experiencia del usuario a la hora de interactuar con el equipo.

    Algunas de las grandes mejoras introducidas en esta versión de Ubuntu son:

    Aumento del espacio de trabajo

    Ubuntu Unity

    Se elimina la barra de tareas inferior para integrarlo todo en el dock lateral, además de en la barra superior, lugar en el que aparecerá tanto el menú de la aplicación como la cabecera de la ventana que tiene el foco (esto último solo en caso de que la aplicación esté maximizada).

    Selección de ventana

    Además de poder cambiar presionando Alt+Tab, si tenemos la misma aplicación abierta varias veces, esta estará agrupada en el dock, y al hacer click sobre su correspondiente icono se nos mostrarán todas las ventanas en ejecución al más puro estilo OS X, de manera que podremos saber con facilidad cual de estas pantallas es la que deseamos traer al frente.

    Posiciones predefinidas de ventana

    Ubuntu Unity windows 7 resize

    Una de las novedades que más me gustaron de las que vinieron de la mano de Windows 7, si no la que más, es que en función de la posición del escritorio a la que arrastremos la ventana, esta se maximizará o tomará una forma determinada, de modo que nos evita tener que redimensionar manualmente las ventanas si, por ejemplo, deseamos tener dos medias ventanas activas.

    Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
    Etiqueta(s): ,
    Categoría(s): Linux