25 de diciembre de 2017

Slices may behave strange

While doing an advent of code exercise I saw an strange bug: 

in a [][]byte when I modified a point [3][10] it also was modified in [0,4].

So the problem was a slices sharing in some way the backup array, but how?

for me was not trivial to know why it was happening because I was using append.

After some coincidences that helped me to find first the bug, and then think in how to resolved.

I found out the problem was my split.

Basically I had this input:
.........
.........
.........
.....#...
...#.....
.........
.........
.........

So I read all and put it in a data[]byte.

then I called byte.Split so I have grid [][]byte

then I add a new column at the end:

for i:=range grid{
   grid[i] = append(grid[i], 46)
}

so when I modified grid[3][10],  grid[0][4] was affected. For me this was a big ? why?

Eventually I realized that if  data was a big array of contiguous memory that contained my input.
so the split what it does was create a two dimensional slice:
grid [][]byte, with data[index:]

So even when I was able to work with grid as a two dimensional slice the backup array was the same. big array from data []byte.

so when I added a new column to the row, in reality I was using a contiguous memory space. which was the same as the beginning of my other row.

So when you use bytes split consider that [][]byte is using the same backup array than the source []byte.

This is an example that shows the issue:
package main

import (
   "bytes"   "fmt")

func main() {
   data := []byte(`hello world`)
   grid := bytes.Split(data, []byte(" "))

   fmt.Printf("%q\n", grid)
   grid[0] = append(grid[0], byte('1')) // Adding 1 to hello   grid[0] = append(grid[0], byte('2')) // adding 2 to hello1
   fmt.Printf("%q\n", grid) // the w was modified}

output:
["hello" "world"]
["hello12" "2orld"]

22 de diciembre de 2017

Slice rotate

There is a good site with golang "slice tricks" and want to add the rotate of a square two dimensional slice. 

for i := 0; i < len(a); i++ {
   for j := i; j < len(a); j++ {
      a[j][i], a[i][j] = a[i][j], a[j][i]
   }
}

6 de agosto de 2017

Mi propio wiki

Bueno ya estoy de vuelta, y quiero mostrar algo que me ha parecido útil en mi vida laboral.
Se remonta a cuando entré a trabajar en Montreal. Estaba haciendo pair-programming con alguien que considero muy bueno. De entre todo lo que aprendí de él hay algo que quiero remarcar para este post y es el uso de un wiki para el trabajo.

De momento me pareció algo exagerado tener un servidor mysql y un servidor web para la wiki de una sola persona. Pero definitivamente era una herramienta útil.

Cuando este senior programmer se fue de la empresa me di a la tarea de buscar una solución que me pudiera servir.

Entonces evalué varios wikis, como por ejemplo media wiki. Pero me tope con uno que se destaca para mi caso de uso.

Y ese es: http://tiddlywiki.com

Ahora que lo pienso, mi wiki tiene que ser algo que me ayude organizar información y que me permita colaborar con mis differentes Yos en el tiempo.

Por lo regular encuentro información por haber leído código o por haber preguntado a otras personas, y como son comandos o procesos complicados que no puedo recordar porque los uso esporádicamente.

Lo que hago es que lo meto en una entrada del wiki y listo ya lo puedo olvidar. Después cuando pasan seis meses y tengo que saber la lista de comandos precisos para hacer una actividad. Busco en mi wiki y listo.

La ventaja es que tiddlywiki esta autocontenido en un solo archivo. Y con la ayuda de un plugin en firefox, ni siquiera tienes que "descargar" el archivo para salvar. Y con dropbox lo puedes sincronizar y tener disponible en todas tus computadoras.

Este no esta hecho para ser multiusario. Pero es suficiente para mis propósitos.

Un día le mostré aun amigo keep.google.com y este me dijo: "entonces para que necesitas tu wiki?"

Y me quede pensando puede que tengas razón creo que la única diferencia es la que yo hago al usar mi wiki para el trabajo y keep para asuntos personales.

Bueno en general se los recomiendo.

Cuales son tus herramientas?

31 de mayo de 2017

Los hábitos que quiero fomentar

Si bueno, probando, el micrófono sigue funcionando?
Este blog se ha caracterizado por muchos re lanzamientos, vengo y digo ahora si voy a continuar este blog. Durante un momento fui muy fanático de escribir, y luego ya no tanto, pero bueno que mas da, vamos a relanzar el blog y ahora va a ser mas técnico, mas geek, mas personal y sobre todo mas, mas -pausa teatral-, mas sobre software.

A pesar de todo me ha gustado releer lo que he escrito aquí. Me permite regresar al pasado y revivir. 

Antes que nada, quiero hablar de que es lo que estoy haciendo.

Trabajo como desarrollador python para una empresa de video juegos en Montreal.
Ya no estoy estudiando francés, y aunque me encanta ahora que lo deje, ya lo estoy empezando a olvidar. Pero al menos intento escuchar radio en francés todos los días.

Un amigo me recomendó un app en ios, sobre como escoger hábitos y hacer tracking de ellos. Yo baje un app para android y lo sigo. El primer día le puse muchas cosas y ahora ya lo limpie y deje cosas mas realistas pero trato de seguirlas.

Los míos son: 
Por la mañana: Tomar un vaso con agua como primer acción del día, tomar mis vitaminas, decirme que hoy va a ser un gran día, tomar un tiempo para dar un gran respiro. ahh y tomar mis vitaminas. (aquí hago trampa porque aprovecho el habito de tomar un vaso de agua para tomarmelas)

A medio día: Comer mas verduras y frutas, tomar una taza de te y aquí tengo caminar unos 20 minutos. En cierta forma hago todo eso cuando camino por mi ensalada al super mas cercano. Y soy afortunado de que en el trabajo podamos tomar dos frutas cada día.

Por la tarde: Estudiar algo una hora, leer, desconectarme de todo a las 10 y dormir temprano.

Como duermo temprano me levanto temprano y llego mas temprano al trabajo. Por lo que puedo salir mas temprano y disfrutar mas el quasi buen clima que empieza a haber en Montreal.




15 de febrero de 2017

Ansina

El dia de hoy mientras estudiaba francés en línea, repasaba los adverbios, cuando note uno en especial, que ya conocía pero que ahora releyendo me cayó el veinte de que el adverbio existe en español.

El adverbio es "ainsi" y cuando lo leí me preguntaba si este adverbio estará relacionado con el que alguna vez escuchamos en los pueblos: "ansina" y al principio pensé que era posible. Y cuando busqué ambas definiciones efectivamente están relacionadas del latín "in sic":


Y ansina es como ahorita mi cabeza está que estalla, lo curioso es que en francés, el adverbio sigue en uso pero en español está en desuso. 


Slices may behave strange

While doing an advent of code exercise I saw an strange bug:  in a [][]byte when I modified a point [3][10] it also was modified in [...