Encontrar próximo día de la semana (jueves en este ejemplo) a partir de una fecha en SQL

Crear una función en la DB

CREATE FUNCTION getNextFriday(@@Fecha DateTime)
RETURNS VARCHAR(10)
AS
BEGIN
  DECLARE @nextFriday DATETIME
  DECLARE @veryOldFriday DATETIME = '19000105'
  IF (DATEDIFF(DAY, @veryOldFriday,@@Fecha) %7) = 0
BEGIN
    SELECT @nextFriday = @@Fecha
  END
ELSE
BEGIN
    SELECT @nextFriday = DATEADD(DAY,- (DATEDIFF(DAY, @veryOldFriday,@@Fecha) %7 ) + 7, @@Fecha)
  END
  RETURN CONVERT(VARCHAR(10), @nextFriday, 112)
END

Llamar la función creada en el punto anterior.

SELECT dbo.getNextThursday('2018-06-07');

 

 

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