Git: “already up to date” pero no…

Aprender rompiendo puede resultar en que pasas mucho tiempo reparando las partes rotas.

El problema: mi compañero y yo creamos ramas diferentes de un repositorio, (jugamos a hacer commits, push y a cambiarnos de ramas y seguimos desarrollando cada quién por su cuenta) y cuando necesitamos integrar de nuevo nuestras ramas al repo principal nos encontramos con este mensajito: “already up to date”.

Pero no, los archivos de los tres repositorios son diferentes y de alguna manera los repositorios están al día.

Una búsqueda en google arroja muchos resultados, y en particular este de stackoverflow parece prometedor la cuestión es que después de leerlo, todavía no entiendo ni el problema, ni la solución.

Luego de dos día de flagelarme acudí a los hechiceros de FccCaracas, donde me recomendaron el siguiente procedimiento:

git checkout master && git reset HEAD --hard && git clean -dfx && git pull origin master

Esta primera línea te ubica en la rama máster, y hace ese reset. De todo lo que leí, aprendí que reset –hard y rebase no son comandos tan comunes, así que hay que estar bastante seguros de si es necesario utilizarlos.

Git Clean -dfx limpia los archivos que no son necesarios del repositorio (acá me volé las DLL y la base de datos de la aplicación que luego tuve que buscar otra vez). Y el último git pull origin master es para sincronizar el master local con los cambios del master en origin.

Acá me queda la duda de sí luego de ese último pull debí sincronizar mi master con el de origin 😦

git checkout Feature1 && git pull origin master

git checkout feature1 hace que se active mi repositorio, y al hacer el pull de master me traigo los posibles cambios que estén allá. Acá hay que ir a la herramienta de merge (en mi caso es Visual Studio) y solucionar los conflictos a mano. Luego los cambios se fijan con un commit

git add . && git commit -m "arreglar diferencias entre Feature1 y master" && git push -u origin Feature1

El último push lleva la rama Feature1 al origen. Hasta acá todo bien. Luego con la herramienta de VSTS realicé un pull request de Feature1 y master et voila.

Tuve que repetir el mismo proceso con la rama Feature2 de mi amigo.

Post-mortem

Me hubiera gustado pedir ayuda a un amigo que me explicara lo básico para no estar inventando. Aprendí más dañando, pero también invertí muchísimo tiempo.

También me hubiera gustado comenzar con un proyecto de una persona: mi repo y el de mi amigo estaban configurados diferente (el mío no hacía tracking del repo origin/feature) por lo que solucionar los dos problemas tomó dos soluciones diferentes.

Y bueno, ya vi que si tengo un par de horas trancado, mejor llamar a un amigo.

Anuncios

¿Cómo salir adelante?

O debería decir “Cómo salir” y ya.

En general, la decisión de emprender es complicada para muchos y ese camino está sembrado de sueños y desesperanzas. En lo particular, creo que el principal obstaculo es la inseguridad que tiene cada quién.

Para mi, esta inseguridad es un mostro de 3 cabezas:

gigante

La limitante personal que uno se repite es que no tiene las habilidades suficientes para continuar. A veces esto se esconde detrás de la mentira blanca de “voy a hacer un curso que me permita agarrar un mejor trabajo” pero la verdad es que muchas veces se aprende más metido en la candela que sentadito en la biblioteca.

La limitante temporal es que a veces el tiempo no alcanza para hacer lo que quieres. La verdad es que al día dedico mucho tiempo a cosas como preparar la comida, jugar con el cel, o simplemente no sé en qué se va el día.

La limitante de la experiencia va de que teniendo el tiempo y las habilidades, nos congelamos cuando vemos a la competencia, e imaginamos el tamaño de sus problemas, y el tamaño de sus soluciones, y nos achicamos al tamaño de no hacer nada.

Matando mostros.

starshiptroopers.jpg

Las limitantes personales son tan dificiles de superar como las limitantes externas. Y acá voy a dejar mi granito de arena:

Dedicar una hora al día a un proyecto luego de un año, equivale a 15 días trabajando sin parar, sin dormir. O siendo más realistas, a dos meses de trabajo de 8 horas, de lunes a viernes.

La constancia en el tiempo da frutos pero no está garantizado. No todo el mundo que trabaja arduamente es exitoso. Pero la suerte sí le sonrie al que la enamora.

Prueba una idea a la vez, y dale tiempo para madurar. Si le dedicas a cada idea 2 años, en los próximos 40 años vas a poder desarrollar 20 ideas completamente. Y habrás crecido con ellas. Que cada oportunidad te permita aprender y te deje dinero para ayudar a la idea siguiente.

Aprende en el camino y come las verdes. Una hora al día los próximos 2 años, o hasta que termines. Lo que pase primero.

t vs z.jpg

Aprendiendo Sass: Mixins

Sigo peleando. No he terminado el primer set de vídeos y eso me trae un poco cabezon. El curso de sass dice que es de tres horas, y ya llevo tres días y todavía no termino.

Mixins

Problema que resuelven: reutilización de código de CSS. Paul Graham en su libro Hackers Vs. Painters defiende que si tienes que copiar y pegar código dentro de tu aplicación, entonces estás programando mal. Kevlin Henney también respalda esta idea.

Al comienzo los mixins recuerdan un poco a las macros de C; pedazos de código que se agrupan con un identificador. Luego, cada vez que vas a usar ese segmento de código, en vez llamas a la macro.

La principal diferencia entre las macros y las funciones es que las primeras son preprocesadas, y las segundas son compiladas. Entonces un mixin es más parecido a una macro que a una función.

Uso de un mixin

En la página oficial de Sass hacen un comentario interesante de los mixins, y es que en CSS3 hay que definir propiedades con prefijos de cada navegador (vendor prefixes)

@mixin border-radius($radius : 15px) {
  -webkit-border-radius: $radius;
     -moz-border-radius: $radius;
      -ms-border-radius: $radius;
          border-radius: $radius;
}

Y para estos casos es útil la herramienta. El llamado se realiza mediante la directiva @include:

.box { @include border-radius(10px); }

Nota que la definición original tiene un argumento $radius, y que en el llamado al mixin se pasa un valor de 10px. Si no se pasa ningun argumento en el llamado de border-radius, entonces el valor por defecto de radius es de 15px.

Y básicamente esto es todo amigos.

Aprendiendo Sass: @, $, ; o nada?

Comencé un curso de SMACSS en teamtreehouse.com con @guilh y hasta ahora la cosa pinta muy bien.

El primer ejercicio con el que me encuentro (y sin saber nada de Sass) es este:

$font-url :"https://fonts.googleapis.com/css?family=Roboto";
@if variable-exists(font-url){
 @import url($font-url)
}

y veo que para $ hay una estructura, pero no entiendo muy bien de qué va

  • $ se usa para decir acá hay una variable
  • Pero en la línea 3 también se usa para llamar a la variable
  • Aunque en la línea 2 no se usa,  porque se quiere saber si el nombre existe.

Ok, acá entiendo. Valor ($) Vs. Referencia (sin el $)

Peeero… el @:

  • hay funciones como el if, y el import que lo requieren,
  • Pero otras funciones como el url y el variable-exists no lo requieren

Bono: ¿Porqué si se supone que es sass, tuve que poner el punto y coma luego de la definición de la línea 1? Será algo del teamtreehouse?

Despues preguntan que porqué prefiero CSS y JS vanilla… #devrant

Swift del BCP para transferencias internacionales

Sigo en la línea de “Problemas al trabajar remoto”.

Para recibir transferencias desde el extranjero en el BCP del Perú es necesario proveer al depositante de:

  • Nombre del banco (BCP)
  • Tu nombre (Tu nombre)
  • Dirección del banco (Av. Aviación 2431, San Borja 15037, Lima, Perú)
  • Teléfono del banco ( (01) 6258080)
  • Número de cuenta de quién recibe (Hace falta abrir una cuenta en $ en el BCP, y es el número que comienza por 193, no el CCI)
  • Y lo más importante acá fue el swift, que tecnicamente es BCPLPEPL, pero hubo un problema con esto, y al llamar al número del banco le dijeron a la persona que me deposita que el swift correcto es BCPLPEPLXXX con esas XXX de película de adultos al final.

Espero que esta info te sea útil.

Trabajar remoto: ¿Cómo cobrar?

Así que conseguí una oportunidad de trabajo remoto para una empresa de distribución de equipos de impresión y bueno, tras un mes de trabajo ellos amablemente me solicitan que les facture mis servicios…

Que les facture… mis… servicios(?)

Nunca había facturado servicios profesionales, lo más que había hecho era dar mi número de cuenta bancaria a un amigo para cobrar alguna “segunda”, pero siempre había sido algo informal.

Esto debería ser un blog acerca de Google Docs y Google Spreadsheets, porque siempre termino usando esas herramientas 🙂 Bueno, resulta que en la sección de plantillas hay dos que son muy útiles a la hora de cobrar:

templates

Y esas dos plantillas que están ahí, la de Invoice, y la de Weekly time sheet (Imagino que se traducen “Factura” y “carga horaria semanal”, respectivamente) son formas de encaminarse rápido porque es sólo rellenar los campos vacíos… ¿o no?

No tanto. En inglés hay algunos términos con los que no estoy familiarizado a la hora de cobrar.

templates

Lo primero es que la factura tiene dos fechas, la de emisión (Submitted on) y en la fecha que esperas que te paguen (Due date). No sé si es “etiqueta” de las facturas en USA o en todas partes del mundo que a veces tienen un campo llamado “Payment Terms” que significa la ventana de tiempo que tiene el cliente desde que recibe la factura para pagarte. En esta página hay un diccionario de términos comunes de Due Dates

La otra herramienta útil para facturar es la justificación detallada de las tareas, a mi parecer es algo importante y de buena educación ya que el cliente entiende que no está lanzando su dinero al vacío contigo. Por eso llevo un registro a mano de las tareas que voy ejecutando. Qué correos mando, qué clientes atiendo, las visitas que realizo y todo intento detallarlo con fecha

hojas

Y a la hora de comunicársela al cliente, redacto en una versión modificada de esa tabla de Google. La modificación viene porque no llevo cuenta (todavía) de cuánto tiempo dedico a cada tarea aunque sí estoy incorporando el hábito de contar en pomodoros cuánto tiempo me toma hacer una actividad.

Y el formato de las celdas es muy parecido, sólo que en vez de poner tarea, y tiempo organizado por día, digo que mi tabla es un resumen de todo el mes, y en la columna izquierda pongo el nombre del cliente o proyecto que atendí, y en la columna derecha los detalles de las actividades realizadas.

templates

Hacer un resumen de un mes es un trabajo que toma bastante tiempo, pensé que era cosa de una hora, y la verdad es que estuve cerca de 4 horas, entre hacer eso, y ayudar a un cliente con un caso.

Así que no era imposible trabajar remoto. Y bueno, espero que esto le ayude a alguien a poder organizar su flujo de trabajo.

Librerías ESC/POS de C++ en WPF .NET 4.5

Estoy desarrollando un demo de ESC/POS utilizando una librería vieja que conseguí. La ventaja de la librería es que ya tiene muchos métodos como el de corte de papel, efectos de texto, y que permite utilizar diferentes medios de comunicación (USB, Com y Ethernet) y que proveen de un demo en Visual Studio para .Net 2.0.

Mi problema particular es que estoy desarrollando en WPF, para lo que necesito un framework más actualizado. Intenté con .Net 3.5, pero dependía de System.Windows.Controls.Grid, y me daba un error de que grids no estaba implementado en esa versión del framework (?) aunque la documentación dice que sí.

pinvoque.png

Y la verdad es que el problema original era algo relacionado con las signature de las funciones de las funciones, y de la manera cómo pinvoque las estaba utilizando. Una búsqueda en google del error (pinvoque imbalance) arrojó apenas 2500 resultados.

Como siempre, StackOverflow salió al rescate, y ofreció una sugerencia. Al parecer el método de llamado (Pinvoque?) de las funciones cambió la manera que operaba a partir de VS2010, por lo que es necesario incluir CallingConvention = CallingConvention.Cdeclcomo uno de los argumentos de DllImport().

En total llegar a esta solución del Pinvoque me tomó un sábado, y por eso estoy escribiendo esta entrada. Espero que al menos sirva para empujar más arriba la entrada de stackoverflow en los motores de búsqueda xD

Mi problema fue que había tocado mucho el código y cuando por fin di con la solución, igual me estaba arrojando otros problemas. Tuve que iniciar con otro proyecto desde cero, e ir probando ideas de una a la vez.

Espero que esto le sirva a alguien.