Git: Como poner en HEAD un estado (commit) anterior

No es muy habitual, pero en determinadas ocasiones uno quiere separar en varias ramas un gran cambio que venía trabajando en una sola rama. Esto sirve para poder tener un mejor control, al revisar pequeñas modificaciones.

Supongamos que tenemos un branch con los commits del 1 al 5, que incluyen una nueva funcionalidad A-Lógica y A-View (mezcladas en el branch), y quiero separar A-View a otro branch para poder hacer distintos pull requests.

En A elimino la parte relacionada a la View. A tendrá un commit 6  con la eliminación del código. Luego creo una nueva rama AA desde A.  Esa rama debe volver al estado del commit 5, sin perder el commit 6. Esto para poder luego hacer un diff A -> AA y ver en el mismo los cambios agregados para View.

A) 1-2-3-4-5-6

B) 1-2-3-4-5-6-5

La respuesta para lograr estos cambios, la encontré en un post nada menos que de Linus Torvalds (creador de Linux y Git). Donde el genio explica que no es una acción muy habitual pero que es muy simple y se soluciona con dos comandos.

git read-tree -u -m 5

git commit

 

Cito la respuesta de Linus:

This is actually an uncommonly easy operation for core git, but it’s a very unusual thing to want to do in general, so I don’t think there is any high-level command to do it directly. But it’s really easy to do with a single so-called “plumbing” command, namely “git read-tree”.

So the “core git” way to do it is to literally just do

git read-tree -u -m 3 git commit

(or use “–reset” instead of “-m” if you want to do it even in the presense unmerged entries).

What the above does is to literally just read the tree state at “3”, and make it the new index: the “-u” means that we also want to update the working tree to that state, and the “-m” means that we will merge in the old index stat information.

The commit then will then create the actual new commit: it will have the exact same tree as your commit ‘3’, but it will be a new commit (so call it 3′).

Of course, people have already pointed out that another easy way to do it is to just revert 5 and 4. That may be the more high-level way to do it, but the git-read-tree approach actually has the advantage that it will work even across merges etc, and it will be very unambiguous: we want *exactly* the state at commit 3 back, nothing else.

Linus

Desplegar phoenix en producción (Ubuntu 16.04 o > )

Instalar nginx

sudo apt install nginx

Instalar erlang + elixir

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb

sudo apt update

sudo apt install esl-erlang

sudo apt install elixir

Instalar postgresql

sudo apt install postgresql postgresql-contrib

Configurar postgres password

sudo -u postgres psql postgres

postgres=#  \password postgres

El sistema le pedirá el nuevo password

Instalar phoenix

mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez

instalar inotify-tools (linux)

sudo apt install inotify-tools

Instalar node (si es necesario)

Bajar la versión necesaria desde  https://nodejs.org/es/

Y actualizar el ~/.bashrc para agregar el bin

nano ~/.bashrc

...en la última linea agregar

export PATH="$PATH:/ruta_a_donde_descromprimieron_node/bin"
para que se apliquen los cambios sin necesidad de reiniciar... 

source ~/.bashrc

Preparar para producción

Seguir esta guía

Crear un servicio que maneje la app

cd /etc/systemd/system
también se puede usar cd /lib/systemd/system

nano nombre_de_la_app.service

[Unit]
Description=Nombre de la App
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/myApps/app (ruta a la app)
Environment="MIX_ENV=prod" "PORT=4001" "MYPASS=****" (variables de entorno)
ExecStart=/usr/local/bin/mix phx.server
Restart=on-failure (si se cae o se reinicia el server levantar la app)

[Install]
WantedBy=multi-user.target

Nginx

se puede utilizar nginx para dirigir un subdominio a la app mediante el uso de proxy

cd /etc/nginx/sites-available

nano default 
copiar esto.. redirige el dominio prinical al puerto 4001 donde se encuntra nuestra app
server {
        listen 80 default_server;
        listen [::]:80 default_server;


        server_name _;
        location / {

                proxy_pass http://localhost:4001;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_updgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;

        }

}

Por último debmos linear sites-available a sites-enabled
usando este comando

ln -s /etc/nginx/sites-available/clover.ceibo.co /etc/nginx/sites-enabled/clover.ceibo.co

Configurar VPN (PPTP) en Ubuntu con network manager

Para conectarse a una VPN desde Ubuntu utilizando el protocolo PPTP deberá seguir los siguiente pasos.

  1. Desde configuración de redes, crear una nueva VPN
    Elegir PPTP

  2. Indicar el IP en pasarela,  luego usuario y contraseña. Es importante guardar la contraseña para todos los usuarios, porque quien se conecta es root.

  3. Ingresar en avanzado…. y dejar la configuración como esta en la siguiente imagen.

  4. Listo ✔ ya puede conectarse a la VPN desde el menú lateral

Para poder usar los DNS del servidor VPN debe configurarlos en la solpa ipv4

 

Por último si quiere agregar una search-domain, que permite usar test en lugar de test.example.com. Hay que editar el archivo
de la conexión VPN y agregarlo a mano.  El mismo normalmente se encuentra en /etc/NetworkManager/system-connections y agregar
el dominio del VPN

[ipv4]
dns=10.0.0.151;10.0.0.152;
dns-search=example.com
ignore-auto-dns=true
method=auto

Usar Hashtag para organizar Gmail/Inbox

Una forma muy simple para organizar nuestro correo, podría ser utilizando el popular #hashtag. Luego de firmar el mail uno debería incluir al pie los hashtags que hagan referencia al contendido del mail.

Por ejemplo, podríamos firmar el mail y luego

#proyectoAppGanadera #clienteAlfa

El problema es que el motor de búsqueda de gmail/inbox elimina los caracteres especiales, para el algoritmo #clienteAlfa es lo mismo que clienteAlfa.

En lugar del hash que no nos estaría aportando diferenciación podemos utilizar el guión bajo o underscore que es considerado por el motor de búsqueda.

_proyectoAppGanadera _clienteAlfa.

Podemos entonces usar el buscador indicando “_clienteAlfa” o +_clienteAlfa.

 

 

Tab only in current workspace – Tips for Ubuntu Desktop

Using lots of windows can be messy,  ubuntu desktop (unity and now gnome) gives us the possibility to have multiple virtual desktops to have a better organization of the working space. This excelent feature can be easily enhance by limitin the alt-tab switching command to current space. If not it can be counterproductive.

To make that configuration you can follow this guide

  1. Install dconf-editor
  2. Open  and go to  org -> gnome -> shell -> app-switcher
  3. Set current-workspace-only propertie to true

That’s all!

Installing jade template engine on jsreport

To install Jade / Pug (or any other template engine) with jsreport you con follow these steps:

  1. First off all, create a local folder that will hold the server, i.e.  (~/myTools/jsreport)
  2. Go to that directory. (cd ~/myTools/jsreport)
  3. yarn global add jsreport-cli (you can also use npm install -g jsreport-cli)
  4. Execute the command:  jsreport init (this will create folder structure)
  5. Add jade or ejs or the template engine package to folder with these command: yarn add  jsreport-jade
  6. start the server running jsreport start

That’s  all folks. You should hace jsreport + jade running on port 5488

How to remove a property from a JavaScript Object with ES6 ( ECMAScript 2015 ) – Functional Programming Functional Programming approach

To remove a property from a JS Object, we can take advantage of the destructuring capabilities released in ES6.

Destructuring: It’s a JavaScript expression that allows us to extract data as variables or constants directly from arrays, objects, maps and sets

const removeXProperty = ({x, ...rest}) => rest

Before we have to use the delete operator

const removeXProperty = function(obj) {
 delete obj.x
 return x
}

This way seems better for javascript functional programming.

const employees = [
  {name: 'Pedro', age: 35, address: AddrObj },
  {name: 'Charlie', age: 55, address: AddrObj },
  ... 
]

const removeAddress = ({address, ...rest}) => rest

// If we wan't to remove address from the array we would do


console.log( employees.map(removeAddress) )

    CONSOLE LOG
--------------------------
[
   {name: 'Pedro',age: 35},
   {name: 'Charlie', age: 55}
]

Another very useful thing we can do with destructuring is to modify the value of a property using very little code. For example if we wan’t to uppercase only the name we could do:

const employees = [
  {name: 'Pedro', alias: 'toto', age: 35 },
  {name: 'Charlie', alias: 'titan', age: 55 },
  ... 
]

const nameToUpCase = ({name, ...rest}) => ({...rest, name: name.toUpperCase()})

// If we wan't to upperCase the name we would do

console.log( employees.map(nameToUpCase) )

 CONSOLE LOG
--------------------------
[
 {name: 'PEDRO', alias: 'toto', age: 35},
 {name: 'CHARLIE', alias: 'titan', age: 55}
]

Hope it works for you,

Cheers,

Tus propios iconos al Social Links Menú de WordPress (Tema: Twenty Seventeen)

El social link menú built-in de twenty seventeen

El menú para redes que viene built-in en este tema (muy popular) trae por defecto los iconos de las redes sociales más importantes. Para utilizarlos uno simplemente debe  agregar los links y voilà!

El tema se encarga de agregar los iconos que en cada coso considere correctos. Esto lo hace por la url base (ej: www.linkedin.com) sabe que debe usar el icono de linkedin.

¿ Como podemos agregar redes o páginas que no están soportadas por defecto ? 

Seguí leyendo “Tus propios iconos al Social Links Menú de WordPress (Tema: Twenty Seventeen)”

Un CRM ideal para startUps con todoist, creatividad y un poco de magia

Cuando un emprendimiento empieza a crecer, puede ocurrir que a uno se le dificulte hacer un correcto seguimiento de clientes. Es natural que uno empiece a buscar herramientas que lo puedan ayudar con esta difícil tarea y aquí es donde aparecen los CRM (Customer Relationship Management o Gestor de Relaciones con Clientes).  Hay una oferta muy amplia en el mercado y herramientas realmente productivas. En mi caso todas excedían lo que yo demandaba y por eso me arme una herramienta a medida combinando apps que ya venía utilizando.

Ingredientes:

* Todoist (premium, para poder manejar labels personalizadas)

* IFTTT (if this then that)

* Google Inbox

* Google Contacts

Preparación:

1)  Definir tu proceso de ventas y acciones

Antes de pensar en utilizar cualquier herramienta uno tiene que tener claro cual es su proceso de ventas.

En mi caso utilizo el AIDA enunciado por E. St. Elmo Lewis, pero cada empresa utilizará el enfoque que mas le sirva.

AIDA viene de Atención, Interés, Decisión y Acción.  En resumidas cuentas uno debe llamar la atención de sus potenciales clientes, luego despertar su interés ofreciendo un servicio/producto adecuado a sus necesidades, acompañar al prospect en la toma de decisión y finalmente llevarlo a la acción.

Cada acción entre estas etapas esta representada en todoist (un gestor de tareas ) por una etiqueta.  Deberán crear las etiquetas que resulten mas apropiadas para su caso.

Yo en particular agregue, Seguir, Negociar, Cerrar que son las que se ajustan a mi proceso.

Puestas dentro del proceso quedarían así:

2) Integración con Google Inbox utilizando IFTTT

 En mi caso, este punto era fundamental y no negociable.  Hay muchas herramientas en el mercado que se integran con gmail, pero con google inbox solo encontré una (pero como les comentaba antes tenía demasiadas funciones  para esta etapa de mi emprendimiento) .

Lograr la integración con Inbox es muy simple, para ello crearemos una nueva agrupación a la que llamaremos “Oportunidades”. Cada mail que represente una oportunidad de negocio debe ser etiquetado.

a) Creamos la etiqueta. Hay un botón “Crear” en el fondo de la lista de etiquetas

b) Creamos la etiqueta oportunidades

c) Seleccionamos el mail que represente una oportunidad y lo movemos a oportunidades

d) El mail queda asignado a Oportunidades

En IFTTT creamos un nuevo applet

Con la siguiente configuración

Cada vez que agrupemos un mail se creara una nueva tarea para que podamos darle seguimiento a la oportunidad.

A esa tarea le iremos agregando como comentarios toda la info relevante relacionada a dicha oportunidad. También iremos actualizando el estado de acuerdo a la etapa en que nos encontremos. Si ya avanzamos a la etapa de decisión la tarea se verá así:

Por último lo pasamos @cerrar si estamos puliendo los detalles del contrato

Una vez cerrado el trato se marca la tarea como completa.

3) Google Contacts nos sirve para guardar toda la info relevante del cliente

Conclusión

La intención de esta  publicación es compartir una integración que a mi me sirve para hacer seguimiento de oportunidades. No soy un especialista en ventas y cualquier comentario que quieran hacer para mejorar este instructivo será bienvenido.