Git Merging con Ubuntu (Linux)

Como muchos programadores de Linux ya os habréis dado cuenta, no hay una aplicación nativa de GitHub para Linux (a diferencia de Windows y Mac). Sinceramente me parece algo ilógico ya que los programadores tenemos una tendencia a gravitar hacia Linux. Pero a grandes males grandes remedios, no? Cuando en un repositorio tenemos conflictos (merge conflict) y hay que solventarlos, una herramienta de merge nos va a ser bastante útil más que resolver el conflicto a mano o usando la consola. Una GUI, aunque no lo parezca, es bastante útil en algunos casos.

He probado kdiff3 y meld. A mi parecer no tienen punto de comparación, claramente la mejor herramienta es meld por algunas simples razones.

Kdiff3:

Captura de pantalla de la GUI de kdiff3

  • Me parece que usa una GUI obsoleta y poco intuitiva.
  • No encontré la opción para cambiar el idioma (la instalé des de Alemania y estaba en alemán).

Meld

Captura de pantalla de la GUI de meld

  • Por el contrario su GUI es más intuitiva y algo más moderna.
  • Estaba en inglés des del principio.
  • No me gustó que creara dos ficheros, para el archivo remoto y otro para el local (además del que se sube a la rama).

Para usar estos merge tools usaremos esta linea en la consola (cambiando meld por kdiff3 si te gusta más este):

 git mergetool -t meld

Puede ser que no los tengas instalados, usando el siguiente comando lo instalaremos (o kdiff3 en vez de meld):

sudo apt-get install meld

Finalmente una vez convencido de la herramienta podremos usar la siguiente linea para guardar la herramienta deseada e iniciar el programa que más nos haya gustado cada vez que surja un merge conflict.

git config --global merge.tool meld

Si conoces una herramienta mejor no puedes en dejarlo en los comentarios. Me encantará conocerla! :)

Fuente e imágenes

Git avanzado: Etiquetas, logs y el botón del pánico

Una vez inicializado git, conocidos los primeros comandos y aprendido a hacer ramas con git ahora toca aprender un poco sobre etiquetas (tags), logs y que hacer cuando la lías parda.

Las etiquetas sirven básicamente para etiquetar commits. ¿Y para que quiere uno etiquetar commits? Bien, pues para indicar en que momento se definió una versión de la aplicación. Para crear una etiqueta usaremos:

 git tag NumeroVersion idCommit

El id del Commit son los primeros 10 caracteres del commit al que queremos etiquetar. Te preguntarás, ¿y como se esos 10 caracteres? Pues fácil te vas al log, y para ver el log usarás el comando:

 git log

Si quieres algo más sofisticado y con menos ruido puedes filtrar por autor:

 git log --author=NombreUsuario

Sólo que archivos fueron cambiados:

 git log –name-status

O si aun así quieres ver todo el árbol con todas las ramas y etiquetas puedes usar el comando:

 git log --graph --oneline --decorate --all

En cualquier caso si quieres indagar más profundamente échale una ojeada a:

 git log --help

En el hipotético caso de que la hayas liado parda y no sepas como solucionar el problema eliminando todos los cambios locales y commits hechos trayendo la versión de la rama master más reciente. Ten en cuenta que sobre-escribirás todos tus ficheros, pero si aun así lo deseas deberás usar los siguientes comandos:

 git fetch origin
 git reset --hard origin/master

Para los que hayáis llegado tan lejos decir que git tiene incorporado algo parecido a una interfaz gráfica. Recordar que no hay para linux una GUI que permita hacer push y toda la mandanga, solo está en Mac y WIndows. Pero para acceder a su sucedáneo se puede acceder escribiendo en la consola:

gitk

Pero si aun así preferís seguir usando la linea de comandos quizás os interese colorear un poco el output con el comando

git config color.ui true

o en los logs simplemente mostrar sólo una linea por commit con:

 git config format.pretty oneline

Como crear ramas (branches) con git

Ahora que ya tenemos git inicializado  y hemos aprendido unos primeros pasos tocará empezar con unos conceptos un poco más avanzados. En este post aprenderemos a crear ramas. Normalmente los proyectos usan ramas para mantener la rama master “más limpia”, evitar commits a medias y evitar conflictos.

Para que nos entendamos la rama master es la rama principal y en las otras ramas es dónde hacemos los cambios. Para crear una rama empezaremos con:

 git checkout -b NombreRama

Como ya vimos después de aplicar los cambios en nuestra rama tocará subir los cambios al directorio remoto haciendo un:

 git push

Una vez terminados todos los cambios y dar la rama por acabada realizaremos el merge. Que básicamente es mezclar nuestros cambios con la rama master. Para esto usaremos el comando:

git merge nombreRama

Algunas veces esto ocasionará conflictos que deberemos solventar. Para ver los conflictos podemos usar:

 git diff <source_branch> <target_branch>

Y si hemos intentado hacer un “merge” que ha sido fallido debido a los conflictos deberemos volver a hacer un:

git add nombreArchivo

Una vez terminado del todo lo que podemos hacer es volver a la rama master con:

git checkout master

Y finalmente borrar la rama con el comando:

git branch -d feature_x

Cabe mencionar que la rama “no está disponible para terceros” a menos que se haga un push al repositorio remoto. Esto se puede hacer con el comando:

git push origin

Para los que les haya interesado este post sobre como crear ramas (branches) en git quizás les interese indagar un poco más en este [EN] modelo de creación de ramas con git. Haciendo un resumen rápido, tienen la rama principal, luego la rama developer y a partir de aquí crean ramas de features.

La retribución para empleados en startups

Por mucho que uno quiera montar una empresa siendo solamente una persona es muy complicado. A pesar de ser más de un fundador, tarde o temprano siempre tocará fichar a empleados (a menos que la empresa se vaya a pique). Cuando uno va a fichar empleados ya sabe que no va a poder pagar salarios de rockstar developer, pero esto no es excusa para que la oferta de trabajo sea menos competitiva.

Por trabajar en una startup no necesariamente tienes que tener un salario más bajo. Aunque ante el hipotético caso de que la startup esté en fase semilla (seed founding) probablemente si que vayas a tener un salario inferior al nivel de mercado. En caso de ser así, en teoría, esto se tiene que compensar con más acciones. Además como bien se indica en este artículo es recomendable pactar que salario vas a tener cuando se consiga la financiación de series A.

Para los que somos de números un ejemplo para explicar la compensación en acciones vale más que mil palabras (o eso dicen). Suponiendo que en cualquier otra empresa te iban a pagar 50.000€/año pero por el hecho de ser una startup te pagarán 40.000€/año. La diferencia entre ambos valores es lo que pierdes (o dejas de ganar) son 10.000€ al año. El periodo de consolidación es estimado por el CEO de la startup es de 4 años. Por lo que “perderás” 10.000€ cada año durante 4 años, en total 40.000€. Por lo que te tienen que pagar 40.000€ en opciones. El precio real de estas opciones es lo que valen menos lo que tengas que pagar por ellas. A la cantidad de acciones que quieras tienes que añadirle el riesgo, el coste de oportunidad y otros factores que consideres importantes. Si quieres una idea sobre que multiplicadores para tener una mejor estimación de cuantas debes pedir puedes consultar [EN].

Si consideráis que hay muchas variables al aire y queréis algo más tangible en Quora han hecho un rango de que cantidad de shares que recibe normalmente un nuevo empleado en una empresa [EN].

  • Empresas de 1 a 10 personas, 0.5% – 2.0%
  • Empresas de 11 a 50 personas, 0.1% – 1.0%
  • Empresas de 51 a 200 personas, 0.01% – 0.2%
  • Empresas de 201 a 500 personas, hasta un máximo de 0.05% (en la respuesta se comenta que solo había una empresa que lo hacía).

Teniendo en cuenta que como menos personas haya más cercana al número más grande deberá ser la retribución, viéndose el rango como lineal y no escalado. El primer empleado tenderá a obtener un 2% – 3%, el segundo entre 1% – 2% y siguiendo así. A medida que se va creciendo la proporción va disminuyendo de forma continua hasta llegar a no dar opciones de compra de acciones. Como muy bien es indicado en este post [EN] la función debe de ser más o menos continua. El enlace anterior también ofrece otras estimaciones y datos sobre el porcentaje de acciones relacionado con el tipo de trabajo que es desempeñado por cada persona.

Pero no te dejes engañar por las acciones. Deberás considerar que la mayoría de startups no llegan a durar más que unos años. Además, en la mayoría de exits, los que se ganan la mayor parte del dinero son los fundadores y los inversores, que son al mismo tiempo los que tomaron un mayor riesgo y mayor porcentaje de accionariado ostentan. Pero esto no es todo, si haces números verás que hacerse rico con este método es bastante complicado.

Por ejemplo, asumamos que te van a dar el 1% de la empresa a cambio de permanecer con ellos 4 años (asumiendo también que no se va a diluir tu parte). Cuando llega el esperado día, la empresa se va a comprar por 50 millones. Pues bien, a ti te tocarán 500.000. No está mal eh! Pero tienes que pensar que son a repartir en 4 años que has estado. Deberás asumir que la empresa se puede comprar por bastante menos o que durante esos cuatro años la startup se fuera al garete o que realmente no lograra despegar del todo. Por lo que has tardado 4 años en tener éxito de la noche al día. No nos engañemos tampoco, este dinero te va a ayudar a tapar agujeros (pagar muchos impuestos) y comprarte una casita mona pero no te va a solucionar la vida. Si quieres indagar un poquito más en la trampa de las acciones [EN].

Primeros pasos con git

Como dije ya en su momento, git es un sistema de control de versiones. Ahora que ya tenemos git inicializado tenemos que aprender las posibilidades más básicas que nos ofrece.

Para empezar tendremos que crear un repositorio. Para esto usaremos:

Git init

En caso de que algún colega ya tenga un repositorio lo que haremos será:

git clone username@host:/path/to/repository

 En el caso que esté alojado en github, este link lo encontraremos en el lado derecho debajo de “SSH clone URL”.

Ahora que tenemos los ficheros en nuestro ordenador, tocará trabajar con ellos. Una vez hayamos hecho el cambio que queríamos tenemos que proponer un cambio. Para esto usaremos:

git add nombreArchivo

o si simplemente queremos subirlo todo haremos

git add *

Pero para realmente remitir los cambios tendremos que usar:

git commit -m “mensaje que queramos”

 Cabe indicar que cuanto más descriptivos los mensajes mejor, ya que cuando haya conflictos nos servirá para entender mejor como debemos proceder.

Ahora después del commit, tenemos los cambios “guardados” en el fichero HEAD de nuestro ordenador. Ahora tocará enviar nuestros cambios al directorio remoto. Para esto usaremos el siguiente comando:

git push origin master

Espero que os haya servido ya que va a haber algunos más! :)

Inclusión de publicaciones científicas en Google Scholar

Google Scholar es el motor de búsqueda que tiene como fin de devolver todos los artículos relacionados con unas determinadas palabras clave. Prestigiosas organizaciones como IEEE o ACM ya son incluidas por defecto en el índice de Google Scholar pero si eres un autor individual la cosa se complica un poco más.

Principalmente tienes dos grandes requisitos. El primero es que subas el fichero con la publicación en formato pdf a tu sitio web. El segundo requisito es que tengas una página que actualices indicando todas las publicaciones que has escrito y colaborado a escribir con el link directo hacia el fichero pdf. El fichero pdf además debe cumplir una serie de requisitos:

  1. La publicación que está en formato PDF debe terminar con la extensión .pdf

  2. El título de la publicación aparece en la primera página con un tamaño de fuente mayor al resto del texto.

  3. Justo debajo del título, en una linea nueva, aparecen los autores.

  4. La publicación contiene un apartado con uno de los siguientes nombres “References” o “Bibliography”.

Con esto debería bastar, sino recomiendo echarle una ojeada a las directrices de Google Scholar.

Fuente: http://scholar.google.de/intl/en/scholar/inclusion.html

Gracias por la oportunidad pero no trabajo gratis

Cada vez que oigo que alguien tiene una idea multi-millonaria, miedo me da. Como desarrollador cuando oigo:

  • No tenemos empresa ni prototipo, sólo la idea.

  • Aunque el mercado está competido, la idea nos hará ricos pero aun no la hemos validado.

  • Ya tenemos otros co-fundadores, que aun no han trabajado mucho en la validación ni pretenden hacerlo.

  • Que contigo ya seremos cuatro fundadores, pero sin querer diluir mucho la distribución de shares.

  • Aunque seas el único que trabajas tampoco nos vamos a abrochar el cinturón para pagarte algo.

  • Buscamos alguien joven, proactivo, con entusiasmo y sobretodo con muchas ganas de aprender.

Salgo corriendo.

La idea más desarrollada por distintas personas.

Trabajar des de casa, pros y contras del teletrabajo

El teletrabajo es un tema que me interesa bastante. Porque a parte de evitarte horas de transporte de casa al trabajo a final de mes (con su ahorro en tiempo y dinero) beneficia a la empresa al no tener que localizarse en algún sitio en concreto ni adquiriendo unas oficinas enormes.

Pero esto, al igual que todo en la vida, tiene sus ventajas e inconvenientes muy bien descritos en este post y que voy a intentar hacer mi adaptación.

La disciplina no fue pensada para el ser humano, a todos nos cuesta trabajar cuando no tenemos alguien mirándonos por encima del hombro. En las oficinas hay el jefe rondando por la planta, pero en casa estas solo pudiendo hacer lo que quieras. Tu eres tu propio jefe, conseguir tus objetivos o no depende exclusivamente de ti.

Hay muchos estudios que han demostrado que tenemos una cantidad de disciplina diaria que se nos puede agotar. Para evitar el desgaste de esta lo que podemos hacer es crearnos unas rutinas diarias que no nos fuercen, simplemente sabremos que nos tenemos que poner a trabajar y punto.

Vestirte, ir a comprar el pan puede ser un buen principio. Evita sentarte a ver la televisión o tomarte demasiado tiempo en las comidas. Aunque no te olvides de reservar espacios para los descansos!

Las distracciones son una de las principales causas de improductividad en el trabajo pero también lo pueden ser en casa. Determina un tiempo para los emails y otras tareas que usemos para procrastinar. Mejor evita redes sociales, rss y compras online. Si aun así lo quieres hacer puedes usar la técnica del pommodoro para tener un poquito de tiempo para descansar y leer los mails, rss o twitter.

profesional, trabajar en casa no quiere decir ir en ropa interior todo el día. Del mismo modo que tienes que cuidar algo más tu seguridad usando back ups, wifi encriptado y este tipo de cosas para evitar filtraciones o que el perro se coma tus deberes. Cuando asistas a meetings vístete para la ocasión, lo de ir en ropa de deporte no cumple las expectativas con lo que los otros esperan de ti.

Cuando teletrabajas, una de los factores más difíciles de superar es la separación de trabajo y ocio. Al final se tiende a estar todo el día trabajando ya que tu casa es tu oficina. De aquí la importancia de fijar horarios y sitios para el trabajo para acostumbrarnos a ellos.

Evita el aislamiento total producido por la carencia de relaciones humanas. En el trabajo estás obligado a relacionarte con tus compañeros pero en casa no tendrás nadie que venga a visitarte a la mesa. Por esta razón es bueno que organices quedadas y eventos entre amistades y/o atiendas a actividades de forma regular.

Disfruta de la flexibilidad adecuando tus horas de trabajo a tus bio-ritmos naturales. Si eres más productivo por las noches trabaja entonces aunque sin pasarse llegando a ir en contra del mundo. Aprovecha tus ratos de menos productividad para hacer deporte, ya que estando todo el día en casa no ayuda demasiado a la movilidad.

El autor recomienda tener un espacio especialmente habilitado para el trabajo. Personalmente creo que aquí en Europa no hay tanto espacio libre y las casas son más pequeñas, por lo que cuando hagas una videoconferencia cuida lo que se vea detrás tuyo (a parte de tu aspecto, evidentemente).

Finalmente como último punto cabe recordar que trabajar en casa solo no está hecho para todos. Hay quienes van a necesitar estar con personas y interactuar frecuentemente y otros simplemente les gusta pasar más rato a solas. Esto depende del carácter cada uno, siempre lo puedes probar y decidir.

GitHub vs Bitbucket: Que control de versiones Git usar?

El otro día hablando sobre proyectos con mis compañeros descubrí, que a diferencia de lo que pensaba algunos de ellos no alojan sus proyectos en GitHub. Por lo que con toda mi curiosidad quise saber cual es la diferencia entre los dos.

Ambos pueden usar Git como sistema de control de versiones. Como “punto a favor” Bitbucket soporta Mercurial aunque ninguno de los dos Subversion. Por lo que Bitbucket ganaría este punto, aunque no es muy significativo.

Repositorios públicos vs privados. En GitHub no te permite tener repositorios privados a menos que pagues una mensualidad (o seas estudiante). Por el contrario Bitbucket si que ofrece la posibilidad de tener repositorios privados sin ningún coste añadido. Por lo que ambos tienen ventajas e inconvenientes.

El punto anterior está sub-editado a la forma que tienen de monetizar ambos servicios. GitHub factura en función de la cantidad de repositorios privados que quieras tener (max. 50 por 50$/mes), por el contrario Bitbucket monetiza el servicio basándose en el número de colaboradores (ilimitados por 200$/mes).

La comunidad de Github es 4 veces la de Bitbucket por lo que en este caso no hay discusión alguna, 4M usuarios a 1M. Además curiosamente encontré algunos proyectos alojados en ambos sitios, por ejemplo GitHub hospeda el Kernel de Linux, MongoDB y Neo4j y Bitbucket Aldrin y TortoiseHg entre otros. Por lo que va a ser bastante más fácil encontrar información sobre GitHub.

Para autenticarnos Githb solo ofrece GitHub mientras que Bitbucket a parte de ofrecer la autenticación de GitHub ofrece la de Facebook, Twitter, OpenID y Google. En este caso no hay discusión alguna.

En conclusión, creo que la decisión depende mucho del tipo de proyecto. Yo personalmente uso GitHub porque es el primero que me enseñaron. Uso repositorios privados usando el email de la facultad, pero si no los tuviera probablemente usaría Bitbucket por sus similitudes y la probabilidad de “ocultar” los proyectos de clase.

La información la he recopilado básicamente de las dos fuentes siguientes:

Cuando la velocidad lo es todo, no puedes esperar a tener toda la información

“Si todo parece bajo control, no estás yendo suficientemente rápido”

― Mario Andretti

En el mundo actual, dónde la tecnología avanza a un ritmo de vértigo no siempre podemos esperar a recopilar todos los datos. La velocidad determina los que viven y los que mueren, de aquí el modelo Lean Startup y las metodologías de desarrollo ágiles.

John Boyd desarrolló el concepto de bucle OODA, el cual argumenta que las decisiones son tomadas en cuatro pasos:

  1. Observar: Es la etapa dónde se recogen los datos.
  2. Orientación: Se modela la información basándose en heurísticas, cultura y experiencias pasadas.
  3. Decidir: Basándonos en la información y la orientación decidimos que acto es el más adecuado llevar a cabo para alcanzar nuestro objetivo.
  4. Actuar: Finalmente llevamos la decisión acabo.

Lo que hace al ganador vences no es la velocidad máxima total, sino la capacidad para iterar con más rapidez. La capacidad de iterar con mas frecuencia es lo que nos permite adaptarnos con mayor velocidad al entorno.

La información tiene que ser actual, como más tiempo pase menos veraz será. Por lo que si recopilamos mucha información tardaremos bastante más porqué el hecho de recopilar la información nos requerirá más tiempo y tardaremos más en procesarla. Para reducir la información necesaria tendremos que reducir la incertidumbre reduciendo el número de variables de las que tengamos que estar seguros, aquí ya es dónde entra vuestro trabajo ;)

Si queréis ampliar la información aquí podéis encontrar el post de inspiración.