Como configurar OpenDNS en Ubuntu con actualización de IP automática

Instalar ddclient y editar su configuración /etc/ddclient.conf
# usar ddclient
# /etc/ddclient.conf
protocol=dyndns2
use=web, if=myip.dnsomatic.com
ssl=yes
server=updates.opendns.com
login= <your login mail>
password= <secret_password>
FiberHome # Nombre de la red en OpenDns 
Reiniciar el servicio y listo! $> sudo systemctl restart ddclient Para más opciones https://help.ubuntu.com/community/DynamicDNS

Docker – change default installation folder on Ubuntu

Images and containers can be hard drive space killers. So it’s a good idea to use a separated HD for docker. So, to change docker folder you must edit the file that starts docker service. On Ubuntu this file is located on /lib/systemd/system/docker.service You have to edit the line starting with ExecStart, adding -g flag with path of the target folder.
ExecStart=/usr/bin/dockerd -g /docker -H unix://
In this case docker will use /docker folder, that is a separated ext4 partition from a secondary HD.
UUID=162fa297-c10f-4b23-b839-a7d915ea4979 /docker ext4 defaults 0 2

Consola / Terminal :)

Instalar zsh y establecer como predeterminado 

sudo apt install zsh
chsh -s $(which zsh)

Instalar Oh My Zsh

sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

Configurar Oh My Zsh

nano ~/.zshrc
...................
ZSH_THEME="agnoster"

plugins=(
  git
  bundler
  rake
  rbenv
  ruby
)

Para usar theme agnoster debe instalar poweline fonts 

sudo apt install fonts-powerline

Para que se vea bien en la terminal de vscode debe instalar Menlo For PowerLine

https://github.com/abertsch/Menlo-for-Powerline

En VsCode debe configurar sus preferencias de usuario

 {"terminal.integrated.fontFamily": "Menlo for PowerLine"}

Notebook como segunda pantalla virtual ( x11vnc en ubuntu 16.04

 Instalar x11vnc

sudo apt-get install x11vnc
Agregar la siguiente configuración a xorg /usr/share/X11/xorg.conf.d/20-intel.conf  (En mi caso es intel porque mi placa usa ese controller, pero puedo variar para cada placa de video)
Section "Device"
    Identifier "intelgpu0"
    Driver "intel"
    Option "VirtualHeads" "2"
EndSection
Copiar el script para activar la segunda pantalla en su carpeta principal local de ejecutables. Normalmente /home/{{user}}/bin
#!/bin/bash

WIDTH=1366
HEIGHT=768
x11_cmd=x11vnc

echo "Segunda Pantalla activada..."
if [[ ! -z $(pgrep ${x11_cmd}) ]]; then
    pkill ${x11_cmd}
fi

MODE=$(gtf ${WIDTH} ${HEIGHT} 60| egrep -v '#' |  awk '{first = $1; $1 = ""; print $0, first; }')
MODE_NAME=$(echo ${MODE} | awk '{ print $1}')

OFFSET=$(xrandr | grep primary | awk '{ print $4}' | sed 's/\([0-9]*\)\(.*\)/\1/')
PRIMARY=$(xrandr | grep primary | awk '{print $1}')

VIRTUAL=VIRTUAL1

xrandr --newmode ${MODE} 2> /dev/null
xrandr --addmode ${VIRTUAL} ${MODE_NAME} 2> /dev/null
xrandr --output ${VIRTUAL} --right-of ${PRIMARY}

LOG=/var/log/x11vnc.log

if [[ ! -f "${LOG}" ]]; then
    sudo touch ${LOG}
    sudo chown ${USER}. ${LOG}
fi
echo "OFFSET: ${OFFSET}"
echo "DISPLAY: ${OFFSET}"

x11vnc -bg -forever -display $DISPLAY -clip "${WIDTH}x${HEIGHT}+${OFFSET}+0" -o ${LOG}
xset r
Asignar permiso de ejecución al script
sudo chmod +x ~/bin/activarMonitor.sh
Luego para activar el servidor deberá ejecutar el script, normalmente lo hago usando Alt + F2 y escribiendo el comando. 

En la notebook…

Instalar un cliente vnc, funciona muy bien remmina
sudo apt install remmina
Desde el remina nos conectamos al ip de la máquina host. En mi caso las tengo conectadas por un cable de red y tengo una conexión directa para que sea más rápido. Pero se puede hacer en cualquier LAN

Crear una Operación en Teamplace con la API

{
  "WorkflowCodigo": "CPRA-SERCON",
  "TransaccionTipoCodigo": "OPER",
  "TransaccionSubtipoCodigo": "FC",
  "Proveedor": "AZUL",
  "Productos": [
    {
      "ProductoCodigo": "",
      "Precio": "30.0",
      "DimensionDistribucion": [
        {
          "distribucionCodigo": "ADMIN",
          "dimensionCodigo": "DIMCTC"
        }
      ],
      "Cantidad": "100.0"
    }
  ],
  "NumeroComprobante": "A-5555-11223344",
  "MonedaCodigo": "PES",
  "ImporteTotalControl": "3680.0",
  "ImporteTotal": "3680.0",
  "IdentificacionExterna": "685600501",
  "FechaComprobante": "2018-08-23",
  "Fecha": "2018-08-23",
  "EmpresaCodigo": "INT",
  "CondicionPagoCodigo": "15",
  "Conceptos": [
    {
      "ImporteEditable": "1",
      "ConceptoImporteGravado": "0.0",
      "ConceptoImporte": "50.0",
      "ConceptoCodigo": "IMPINT"
    },
    {
      "ImporteEditable": "1",
      "ConceptoImporteGravado": "3000.0",
      "ConceptoImporte": "630.0",
      "ConceptoCodigo": "COMPRA_IVA_21"
    }
  ],
  "ComprobanteTipoImpositivoCodigo": "81"
}

 

En el diccionario de APIS teamplace

Con la siguiente definición xml

<?xml version="1.0" encoding="UTF-8"?><root>
    <entidad id="main">
        <atributo nombre="IdentificacionExterna" alias="IdentificacionExterna" descripcion="Tipo: String, Obligatorio: No, Descripción: Identificación externa"/>
        <atributo nombre="EmpresaID" alias="EmpresaCodigo" descripcion="Tipo: String, Obligatorio: Si, Consulte la API /Empresa/list"/>
        <atributo nombre="Fecha" alias="Fecha" descripcion="Tipo: Date, Obligatorio: Si, Descripción: aaaa-mm-dd"/>
        <atributo nombre="FechaComprobante" alias="FechaComprobante" descripcion="Tipo: Date, Obligatorio: Si, Descripción: aaaa-mm-dd"/>
        <atributo nombre="OrganizacionID" alias="Proveedor" descripcion="Tipo: String, Obligatorio: Si, Consulte la API /Proveedor/list"/>
        <atributo nombre="CondicionPagoID" alias="CondicionPagoCodigo" descripcion="Tipo: String, Obligatorio: Si, Consulte la API /CondicionPago/list"/>
        <atributo nombre="TransaccionTipoID" alias="TransaccionTipoCodigo" descripcion="(String) Obligatorio. Valor a completar: OPER "/>
    	<atributo nombre="TransaccionSubtipoID" alias="TransaccionSubtipoCodigo" descripcion="(String) Obligatorio. Consulte la API /TransaccionSubtipo/list"/>
        <atributo nombre="WorkflowID" alias="WorkflowCodigo" descripcion="Tipo: String, Obligatorio: Si, Descripción:CPRA-PROD "/>
        <atributo nombre="Nombre" alias="Nombre" descripcion="Tipo: String. Sólo para GET"/>
        <atributo nombre="Descripcion" alias="Descripcion" descripcion="Tipo: String, Obligatorio: No"/>
        <atributo nombre="NumeroDocumento" alias="NumeroComprobante" descripcion="Tipo: String, Obligatorio: No, Descripción: Numero de documento"/>
        <atributo nombre="MonedaID" alias="MonedaCodigo" descripcion="Tipo: String, Obligatorio: Si, Consulte la API /Moneda/list"/>
        <atributo nombre="ComprobanteTipoImpositivoID" alias="ComprobanteTipoImpositivoCodigo" descripcion="Tipo: String, Obligatorio: Si, Consulte la API /ComprobanteTipoImpositivo/list"/>
        <atributo nombre="CAINumero" alias="CAE" descripcion="Tipo: Int, Obligatorio: Si, Descripción: ##############"/>
        <atributo nombre="CAIFechaVto" alias="CAEFechaVto" descripcion="Tipo: Date, Obligatorio: Si, Descripción: aaaa-mm-dd"/>        
        <atributo nombre="OperacionItems" alias="Productos" descripcion=""/>
        <atributo nombre="OperacionConceptos" alias="Conceptos" descripcion=""/>
        <atributo nombre="ItemsRetencion" alias="Retenciones" descripcion=""/>
    </entidad>
    <entidad id="OperacionItems">
        <atributo nombre="ProductoID" alias="ProductoCodigo" descripcion="Tipo: String, Obligatorio: Si, Consulte la API /Producto/list"/>
        <atributo nombre="CantidadWorkflow" alias="Cantidad" descripcion="Tipo: Int, Obligatorio: Si, Descripción: ####"/>
        <atributo nombre="Precio" alias="Precio" descripcion="Tipo: Decimal, Obligatorio: Si, Descripción: ##.###"/>
        <atributo nombre="DimensionDistribucion" alias="DimensionDistribucion" descripcion=""/>
        <atributo nombre="vinculacionOrigen" alias="vinculacionOrigen" descripcion="(String), No Obligatorio. Identificacion Externa de la transaccion origen a vincular"/>
    </entidad>
    <entidad id="OperacionConceptos">
        <atributo nombre="ConceptoID" alias="ConceptoCodigo" descripcion="(String) Obligatorio. Consulte la API /Concepto/list"/>
        <atributo nombre="Control1" alias="ImporteEditable" descripcion="(Boolean) Indique 1 para que tome en cuenta el ConceptoImporte y el ConceptoImporteGravado. Indique 0 para que se calcule automáticamente según la tasa"/>
    	<atributo nombre="Importe" alias="ConceptoImporte" descripcion="(Decimal) Obligatorio si indicó 1 en ImporteEditable. Con formato ##.###"/>
        <atributo nombre="ImporteGravado" alias="ConceptoImporteGravado" descripcion="(Decimal) Obligatorio si indicó 1 en ImporteEditable. Con formato ##.###"/>
    </entidad>
    <entidad id="ItemsRetencion">
        <atributo nombre="TipoRetencion" alias="TipoRetencionCodigo" descripcion=" PADRE Tipo: String, Obligatorio: Si"/>
        <atributo nombre="Retencion" alias="RetencionCodigo" descripcion="Tipo: String, Obligatorio: Si, Consulte la API /Retencion/list"/>        
        <atributo nombre="Importe" alias="RetencionImporte" descripcion="Tipo: Decimal, Obligatorio: Si, Descripción: ##.###"/>
        <atributo nombre="Comprobante" alias="Comprobante" descripcion="Tipo: String, Obligatorio: Si"/>
        <atributo nombre="ISAR" alias="ISAR" descripcion="Tipo: Decimal, Obligatorio: No, Descripción: ##.###"/>
    </entidad>
</root>

 

Teamplace – SQL útiles

Listado de productos, con sus respectivos conceptos de valorización y tags para control

Select z.tagid, a.nombre as producto, b.nombre as ctacompras, d.nombre as conceptos from bsproducto as a
join FAFTablaTag as z on a.productoid = z.registroID
join bscuenta as b on
a.cuentaidcompra = b.cuentaid left 
join bsproductoconceptovalorizacion as c
on a.productoid = c.productoid join bsconceptovalorizacion as d 
on c.conceptovalorizacionid = d.conceptovalorizacionid order by producto

 

Iniciar un Caso Directo desde la API de Teamplace

1- Si no existe, se debe crear el diccionario de datos CasoDirectoVO, con la siguiente configuración.

2- Crear un nuevo end-point en diccionario de API

 

3 – Tener un par de llaves cliente_id, client_secret para acceder a la API, con esas credenciales se obtiene un access token

4 – El enpoint será

“https://3.teamplace.finneg.com/BSA/api/${nombre_del_diccionario_api}?ACCESS_TOKEN=”

5- Post con la siguiente estructura

%{
Prioridad:1,
Descripcion: build_description(order.desc, order.user, order.machine.name),
Titulo: order.title,
FechaComprobante: order.date,
Fecha: order.date,
PersonaIDPropietario:"413",
TransaccionTipoID: "CASOTEAMPLACE",  #IMPORTANTE
TransaccionSubtipoID:"CB - MAQ",  # CODIGO DEL BPM
MaquinaCodigo: order.machine_id
}
|>Poison.encode!()

Para mas info ver https://github.com/ponyesteves/teamplace

¿ Como abrir mi editor de texto preferido desde el explorador ?

Buenas,

Para poder abrir mi editor de texto predilecto, desde el chrome utilizando xdg-open y el protocolo txmt:// deberán seguir los siguientes pasos.

  1. Crear un script para adaptar el link al tipo de comando soportado por su editor de texto. Este ejemplo sirve para vscode y sublime code 2.
#!/usr/bin/env bash
request=${1:23} # Borra los primeros 23 caracteres
request=${request//%2F//} # Reemplazo %2F con /
request=${request/&line=/:} # Reemplazo &line= con :
request=${request/&column=/:} # Reemplazo &column= con :
code -g $request # Abro vscode


Ubicamos el script en $HOME/bin/vscode_handler

2) Crear una app desktop, linkeando el mime type txmt a el handler creado en el punto 1

sudo nano /usr/share/applications/vscode-handler.desktop

[Desktop Entry]
Name=VSCODE URL Handler
GenericName=Editor de texto
Comment=Gestiona las URL Scheme txmt://
Exec=/home/<nombre de usuario>/bin/vscode_handler %u
Terminal=false
Type=Application
MimeType=x-scheme-handler/txmt;
Icon=vscode
Categories=TextEditor;Development;Utility;
Name[en_US]=VSCODE URL Handler

3) Actualizar la base de datos de apps

sudo update-desktop-database

MercadoPago: como generar un link de pago dinámico

1) Obtener de su cuenta de mercado pago, client_id y client_secret
2) Obtener Access Token
endpoint: https://api.mercadopago.com/oauth/token

¡Atención! El post es enviado urlencoded

 

Para saber cuales son sus credenciales de mercadoPago puede loggearse e ingresar e este link https://www.mercadopago.com.ar/developers/es/

En el menú de la derecha hay una opción para que pueda ver sus credenciales,  en este caso usamos las credenciales de checkout básico

3) Crear preferencia de pago y obtener link a cambio

endpoint: https://api.mercadopago.com/checkout/preferences?access_token=${my_access_token}

En la respuesta encontrara un atributo llamado init_point que contiene el link de pago

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');