Joaquin Tita: InstantClick - JS library to speed up your website

Latency is inevitable with today’s internet architecture so InstantClick cheats by preloading links you are likely to click on.
Before visitors click on a link, they hover over that link. Between these two events, 200 ms to 300 ms usually pass by. InstantClick makes use of that time to preload the page, so that the page is already there when you click.
If you want your website to not be flooded by requests, you can set a delay before preloading starts when users hover a link. It will still feel instant.
If you don’t want any wasted request, you may preload on mousedown.

Gonzalo Martinez: Patrones y Tácticas Arquitecturales

Un patrón arquitectural


  • Es un paquete de decisiones de diseño que es encontrado repetidamente en la práctica.
  • tiene propiedades conocidas que permiten reusarlo, y
  • describe una clase de arquitecturas
Por que los patrones son (por definición) encontrados repetidamente en la práctica, uno no los inventa; uno los descubre.
Las tácticas son más simples que los patrones. Las tácticas tipicamente usan solo una simple estructura o mecanismo computacional, y están destinados a significar una simple fuerza arquitectónica. Por esta razón se les da un control más preciso a un arquitecto cuando hace decisiones de diseño de patrones, que tipicamente combina múltiples decisiones de diseño en un paquete. Las tácticas son los "bloques de construcción" de diseño a partir del cual los patrones arquitecturales son creados. Las tácticas son átomos y los patrones son moléculas. 

Un patrón arquitectural establece una relación entre ellos:
  • Un contexto. Una recurrente, situación común en el mundo que da a plantear un problema.
  • Un problema. El problema, apropiadamente generalizado, que surge en el contexto dado.
  • Una solución. Una resolución arquitectural exitosa a el problema.
Sistemas complejos exhiben múltiples patrones de una sola vez.

Los patrones pueden ser categorizados por el tipo de elementos dominante que muestran. patrones de módulos, muestran módulos. patrones de conectores-componentes muestran componentes y conectores. y los patrones de asignación muestran una combinación de elementos de software (módulos, componentes, conectores ) y elementos que no son de software. Los patrones más publicados son los patrones C&C, pero hay patrones de módulos y de asignación también. 

Un patrón es descrito como una solución a una clase de problemas en un contexto general. Cuando un patrón es elegido y aplicado, el contexto de esta aplicación se vuelve muy especifico. Un patrón documentado por lo tanto es poco especifico con respecto a la aplicación de una situación especifica. Podemos hacer un patrón más especifico a nuestro problema añadiéndole tácticas. Aplicando tácticas sucesivas es como pasar a través de un espacio de juego, y es un poco como el ajedrez: las consecuencias de el siguiente movimiento son importantes y observas varios movimientos por adelantado es útil.

Gonzalo Martinez: Aprendiendo Erlang parte 5 Listas por comprensión

Las listas por comprensión son maneras para construir y modificar listas. Ellos hacen que los programas sean cortos y fáciles de entender comparada a otras maneras de manipular listas. Que está basado en la idea de notación de conjuntos; Si alguna vez has tomado clases de matemáticas con la teoría de conjuntos o si alguna vez has mirado la notación matemática, tal vez conozcas como funciona esto. La notación de conjuntos básicamente te dice cómo construir un conjunto especificando las propiedades que sus miembros deben satisfacer. Las listas por comprensión son difíciles de entender en principio, pero vale la pena el esfuerzo. Ellas hacen el código limpio y corto, así que no dudes en intentarlo y escribir ejemplos hasta lo que entiendas.

Un ejemplo de notacion de conjuntos sería . Esa notación de conjuntos te dice que el resultado que buscas debería ser todos los números reales los cuales son igual a su propio cuadrado.El resultado de aquel conjunto debería ser {0,1}. Otra ejemplo de notación de conjuntos, más simple y abreviado sería {x : x > 0}. Aquí, buscaremos todos los números donde x > 0.

1> [2*N || N <- [1,2,3,4]]
[2,4,6,8]

Comparando con la notación mátematica a la de Erlang no hay tantos cambios. las llaves ({}) se convierten en corchetes ([]), los dos puntos (:) se convierten en dos pipes (||) y la palabra "en" se convierte en una flecha (<-) solamente cambiamos signos  y mantenemos la misma lógica. En el ejemplo anterior, cada valor de [1,2,3,4] secuencialmente coincide con el patrón N. La flecha actua exactamente como operador el "=", con la excepción que no lo hace lanzar excepciones.

También puede agregarle restricciones a la lista de comprensión usando operaciones que retornen valores booleanos. Si nosotros buscamos que todos los numeros seán pares sobre 10 de ellos, podríamos escribir algo como esto.

2> || X <- [1,2,3,4,5,6,7,8,9,10], X rem 2 =:= 0].
[2,4,6,8,10]

Donde X rem 2 =:= 0 chequea si un número es par. Las aplicaciones prácticas vienen cuando decidimos aplicar una función a cada elemento de una lista, forzando a respetar restricciones, etc. Como un ejemplo, digamos que tenemos un restaurante. Un cliente entra, ve nuestro menú y pregunta si el podría obtener los precios de todos los items que cuestan entre $3 a $10 con impuestos (digamos 7%).

3> RestaurantMenu = [{steak, 5.99}, {beer, 3.99}, {poutine, 3.50}, {kitten, 20.99}, {water, 0.00}].
[{steak,5.99},
 {beer,3.99},
 {poutine,3.5},
 {kitten,20.99},
 {water,0.0}]
4> [{Item, Price*1.07} || {Item, Price} <- RestaurantMenu, Price >= 3, Price =< 10].
[{steak,6.409300000000001},{beer,4.2693},{poutine,3.745}]

Por supuesto, los decimales no están redondeados en una manera legible, pero creo que lo entiendes. La receta para las listas de comprensión en Erlang es por lo tanto NuevaLista = [Expresion || Patron <- Lista, Condicion1, Condicion2, ... CondicionN]. La parte Patron <- Lista es llamada expresión Generador. Puedes tener más de uno.

5> [X+Y || X <- [1,2], Y <- [2,3]].
[3,4,4,5]

Esto corre las operaciones 1+2, 1+3, 2+2, 2+3. Asi que si quieres hacer la receta de las listas por comprensión más generica podrías obtener: NuevaLista = [Expresion || GeneradorExp1, GeneradorExp2, ..., GeneradorExpN, Condicion1, Condicion2, ..., CondicionM] . Nota que las expresiones generador son emparejadas con la coincidencia de patrones que funciona como filtro.

6> Clima = [{la_pampa, lluvioso}, {buenos_aires, tormenta}, {cordoba, niebla}, {tucuman, soleado}, {entre_rios, niebla}, {santa_cruz, nevado}].                                                                                           
[{la_pampa,lluvioso},
 {buenos_aires,tormenta},
 {cordoba,niebla},
 {tucuman,soleado},
 {entre_rios,niebla},
 {santa_cruz,nevado}]
7> LugaresConNiebla = [X || {X, niebla} <- Clima].
[cordoba,entre_rios]

Si un elemento en la lista Clima no coincide con el patrón {X, niebla}, este es simplemente ignorado en la lista de comprensión donde en una igualdad lanzaría una excepción.

Hay otro tipos de datos básicos que nos queda por ver, por ahora. Esta es una carácteristica sorprendente que hace fácil interpretar datos binarios.

Marcos Dione: Elevation

Another long time without mentioning any advancements on my map making efforts. While not much has changed, what has changed is a big step to easier customization.

In the last post in this series I gave a quick list on how I make my own maps:

  • Use SRTM elevation to generate a hypsometric base map, hill and slope shading, and finally hypsometric curves. For the latter I'm using gdal-contour and shp2pgsql.
  • Use any extract you want and import them with osm2pgsql. Small extracts import quite quick, but so far, I have never succeeded to import a big part of Europe (from Portugal to south Finland, so it covers UK/Ireland and Istambul) in a machine with 8GiB of RAM and hard disks. The recommendation is to use a machine with lots of RAM (16+, I heard up to 256 for the whole planet) and SSDs.
  • Use TileMill for the initial design.
  • Do a lot of xml manipulation to try to customize OSM's mapnik style based on your design.
  • Use [generate_tiles.py](https://github.com/openstreetmap/mapnik-stylesheets/ generate_tiles.py) to, well, generate the tiles.

But since August 2013 things have changed in the 3rd and 4th items in that list. Andy Allan had finished a first big iteration of redoing OSM's mapnik style in CartoCSS. The latter is a CSS-like language that is the native way to style things in TileMill. Since then, customizing is way much easier, not only because of the Cascading part of CSS, but also because Andy took the time to make a lot of things (widths, colors) to things similar to C/C++'s #defines, which you can override and impact anywhere where the definition is used.

So now, steps 3 and 4 are more like:

  • Use TileMill to change OSM's initial design[1].
  • Export the design to a mapnik XML file.

In fact, that last step could be avoided, given that TileMill can also render everything by himself.

The last step in having your own tiles to be able to use them. I use Marble in my phone, but I also setup a slippy map so I can brag about it. Unluckily I can't embed the map here (I should fix this).

The tiles served actually come from different rendering passes using different, incremental designs. The previous-to-last one can be seen in Deutschland's region; I will be rendering some parts of London with a newer design before the end of the month.


[1] You can use any text editor to change the CartoCSS files; TileMill will pick them up via inotify and rerender accordingly. The only problem is when you're editing multiple files to impact a zoom level that takes a lot to render (for me is between 6 and 8).


openstreetmap elevation gdal gis srtm

Ramiro Algozino: QtQR 1.4 Released

About QtQR 1.4

I’m glad to announce that since this morning, python-qrtools and QtQR are both available in their 1.4 version for download in the daily PPA (https://launchpad.net/~qr-tools-developers/+archive/daily)

The 1.4 version includes several bug fixes, support for saving the generated codes in several image formats besides PNG (with the collaboration of Joanthan Greig), no crashes when trying to decode from webcam and there is no webcam attached, support for “WiFi Networks” QR codes and a lot more!

What is coming next?

There won’t be anymore updates to the 1.4 version, don’t expect a QtQR 1.5. The next step is a complete rewrite of both the qrtools backend and, in consequence, of QtQR also. This will be the 2.0 version.-

Enjoy!


Gabriel Patiño: Mi primer cajita de madera

Oli recibió un mazo de cartas para navidad, así que le hice una cajita de madera para que las guarde, o para que guarde lo que quiera.


 Use los restos de una tabla de lenga de 1 pulgada, la corte a 1/2 pulgada de espesor con mi nueva sierra japonesa. Es un lujo usar una herramienta tan buena, y eso que es de las más baratas, no me imagino lo que son las caras.


Como Oli quería tanto un unicornio, encontré una forma muy simple de hacer el estampado: se imprime el dibujo en laser (con fotocopias no funcionó), se pone el papel en la superficie donde se quiere hacer el estampado con el dibujo para abajo, y se frota el papel con quita esmalte de uñas. Nos divertimos mucho haciendo esto y también funciona como tatuajes y en la ropa (incluso aguanta unos lavados).

Quería ponerle unos imanes para que la tapa quede cerrada, pero parece que se perdieron en el correo, tengo que ir a averiguar.

Marcos Dione: ayrton-0.4.1

Last night I released ayrton v0.4 and v0.4.1. Here's the combined changelog:

  • Fixed the release.ay script that prematurely released v0.4.
  • >= can redirect stderr to stdout.
  • o(option=argument) can be used to declare keyword params among/before positional ones.
  • bash() now returns a single string if there is only one result.
  • Slightly better error reporting: don't print a part of the stacktrace that belongs to ayrton itself. There is still more to do.
  • No longer depends on sh.

It's not too long, but that last item and a 2 week vacation made this a quite long release time: about 3 months. Getting rid of sh means that the capture of a command's output is no longer buffered, and that we can launch all kinds of TUI programs, notably editors and such.

Still, it's quite far from being stable enough; I still have to think about how the remote() API should be; really implement pipes between two and three commands; think if ayrton should, and how to, autodetect what the user wants to do with the executable (does he want the output? foreground, background? what if there's a python function in between?); and implement several things I noted in the project's issue page.

All in all, the project goes forward, not at the pace I wanted, but now I have better control on what's going on and this simplifies its development. From now on, releases should be shorter (knock on wood).


python ayrton

Diego Sarmentero: NINJA-IDE 3.0-alpha is Here!!




NINJA-IDE 3.0-alpha is finally here!!!

After lots of months rewriting NINJA-IDE to implement the new architecture (which I must say, is going to bring new amazing things about: performance, extensibility, stability, and easy a lot of things for developers of plugins and the core of ninja), we are finally here with the 3.0-alpha version.
There are a lot of things that still needs to be implemented, several features to add, a bunch of issues to fix, etc, etc...

BUT if you are one of the brave ones, you can start playing around with NINJA-IDE, and let us know your ideas of what needs to be improved, problems you experienced, and everything you think would help us to make NINJA-IDE 3.0 the most awesome version so far!
As usual, we are developing NINJA-IDE 3.0 using NINJA-IDE 3.0, but it's always nice to hear from people using the IDE in different ways.

For the alpha version, we are not going to distribute installers for the different platforms, but if you want to start testing NINJA-IDE 3.0-alpha, you can grab the source code from Github and run it from sources (We've always tried to make it really easy to execute it this way for developers), also, if you are in Ubuntu, you can use the Daily PPA and install the last version from there.

Take a look at some of the visual changes that we have done in NINJA-IDE 3.0:



Now that we have the new architecture implemented in NINJA-IDE (something that we knew was going to take a lot of time, but the payoff was going to be huge!), we can start working on fixing the remaining issues, add some of the missing features, AND INCLUDE THE NEW FEATURES THAT WE PLANNED FOR THIS VERSION!! I can tell you that an incredible effort is being done from everyone in NINJA-IDE to build some really awesome things:
  • A whole new plugin environment, with virtualenv detection, pypi handling, etc
  • Lots of improves in Code Completion
  • Graphical Debugger
  • A new IntelliSensei module to bring to you the magic of metadata analysis
  • Several improves in the UI and UX
  • And lots of more things!!!! But... LOTS!!


And that it's not ALL!! The Web Team of NINJA-IDE is also working in a new website, to improve some internal functionalities, and to provide new sections, as a new blog, where we want to publish all the news about the new features being developed, updates in the documentation, videos about how to use and interact with ninja, and lots of more stuff!


Links: