Z Probe CNC

ATENCION!! funciona con la version 2.0 PLATFORM
https://winder.github.io/ugs_website/download/

Link directo de descarga: http://bit.ly/2XANF7B



1. Conectar el pin SCL del CNC Shield a la mecha del dremel.

2. Conectar el pin GND del CNC Shield a la placa PCB

3. En el Universal Gcode Sender, enviar estos comandos:

G38.2 Z-1 F1
G92 Z 0
G00 Z0.0787

G38. Z-1 : Baja hasta encontrar el z probe
G92 Z 0 : Le indica que la posicion a la que llego (cuando hizo contacto con el Z Probe) es el cero
Z.05 : Sube el eje z (esto es para evitar que este en contacto cuando se enciende el motor del dremel)




Fuente: https://www.youtube.com/watch?v=7l1nubetkro



AWS

Guia completa para desarrollar aplicacion web sin servidor
con AWS Lambda, Amazon API Gateway, Amazon S3, Amazon DynamoDB y Amazon Cognito

https://aws.amazon.com/es/getting-started/projects/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/

DynamoDB - Version descargable (para utilizarla sin conectarse!!)

https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html

Ejecutarla con:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb --port 8082

Para probarlo, con nodejs:
npm init
npm install aws-sdk

EJEMPLO COMPLETO CON NODEJS Y DYNAMO:
https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.html
*** A LOS EJEMPLOS CAMBIARLE EL PUERTO A 8082 ***
---------------------------------------------------------------------------------------------------------


Consola AWS
https://us-east-2.console.aws.amazon.com/cognito/home?region=us-east-2

LUEGO DE ENTRAR A LA CONSOLA, PARA VER LO QUE TIENE HAY QUE HACER CLICK EN LAS TRES RAYITAS A LA IZQUIERDA!!

Consola LAMBDA
https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions

Actividad y costos:
https://console.aws.amazon.com/billing/home?#/

Capas disponibles con filtro
https://aws.amazon.com/es/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc

Calculadora AWS:
https://calculator.aws

https://calculator.s3.amazonaws.com/index.html#key=calc-MarketingWebSite-140324 
Tutoriales

Cómo crear aplicaciones web sin servidor con React y AWS Amplify
https://code.tutsplus.com/es/tutorials/how-to-build-serverless-web-applications-with-react-aws-amplify--cms-31732

Adding AWS Amplify to an Ionic 4 App
https://ionicframework.com/blog/adding-aws-amplify-to-an-ionic-4-app/

Setup amplify
https://aws-amplify.github.io/docs/js/start?platform=ionic

Building Ionic 4 apps with AWS Amplify [<==== este es el mejor!!]
OJO! en este instructivo falta instalar el cli de amplify:
npm install -g @aws-amplify/cli
https://aws-amplify.github.io/docs/js/tutorials/building-ionic-4-apps/

Script para generar archivo sql a partir de datos de padrones urbanos dnc catastro e importarlo en PostgreSql

1. Bajar el archivo csv de padrones urbanos de:

https://catalogodatos.gub.uy/dataset/padrones-urbanos-y-rurales

2. Crear un .NET:


using System;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //PadronesUrbanos();


        }

        static void PadronesUrbanos()
        {
            var arch = @"C:\_MAPAS\_PADRONES DNC\datos-abiertos-dnc-2019-06\Padrones Urbanos.CSV";

            var fila = 0;
            var numero_archivo = 0;
            var archOut = @"C:\temp\out\Padrones Urbanos_" + numero_archivo + ".sql";


            var f = new StreamReader(arch);
            var fOut = new StreamWriter(archOut);

            fOut.WriteLine("DROP TABLE padrones_urbanos;");

            fOut.WriteLine("CREATE TABLE padrones_urbanos (" +
                "codigo_regimen VARCHAR(2), " +
                "codigo_departamento VARCHAR(1), " +
                "codigo_localidad VARCHAR(2), " +
                "numero_padron integer, " +
                "block_manzana VARCHAR(20), " +
                "entrepiso_subsuelo VARCHAR(2), " +
                "unidad integer, " +
                "area_predio integer, " +
                "area_edificada integer, " +
                "valor_real_terreno integer, " +
                "valor_real_mejoras integer, " +
                "valor_real_total integer, " +
                "valor_real_para_impuestos integer, " +
                "fecha_ultima_djcu VARCHAR(10), " +
                "vigencia_ultima_djcu VARCHAR(10)" +
                ");");

            fOut.WriteLine();

            while (!f.EndOfStream)
            {
                var linea = f.ReadLine();
                fila++;

                var v = linea.Split(',');

                var v1 = v[0].Replace("\"", "'");
                var v2 = v[1].Replace("\"", "'");
                var v3 = v[2].Replace("\"", "'");
                var v4 = v[3].Replace("\"", "'");
                var v5 = "'" + v[4].Replace("\"", "").Replace("'", "") + "'"; ;
                var v6 = v[5].Replace("\"", "'");
                var v7 = v[6].Replace("\"", "'");
                var v8 = v[7].Replace("\"", "'");
                var v9 = v[8].Replace("\"", "'");
                var v10 = v[9].Replace("\"", "'");
                var v11 = v[10].Replace("\"", "'");
                var v12 = v[11].Replace("\"", "'");
                var v13 = v[12].Replace("\"", "'");
                var v14 = "\'" + v[13] + "\'";
                var v15 = "\'" + v[14] + "\'";

                fOut.WriteLine("INSERT INTO padrones_urbanos (codigo_regimen, codigo_departamento, codigo_localidad, numero_padron, block_manzana, entrepiso_subsuelo, unidad, area_predio, area_edificada, valor_real_terreno, valor_real_mejoras, valor_real_total, valor_real_para_impuestos, fecha_ultima_djcu, vigencia_ultima_djcu) " +
                    "VALUES (" + v1 + ", " + v2 + ", " + v3 + ", " + v4 + ", " + v5 + ", " + v6 + ", " +
                                 v7 + ", " + v8 + ", " + v9 + ", " + v10 + ", " + v11 + ", " + v12 + ", " + v13 + ", " + v14 + ", " + v15 + ");");

                if (fila > 300000)
                {
                    fila = 0;

                    numero_archivo++;
                    fOut.Close();
                    archOut = @"C:\temp\out\Padrones Urbanos_" + numero_archivo + ".sql";

                    fOut = new StreamWriter(archOut);
                }
            }

            fOut.Close();

            Console.WriteLine("fin");
            Console.ReadLine();
        }
    }
}


3. Para importarlo en postgreSql:

C:\Program Files\PostgreSQL\11\bin>psql -h localhost -d catastro -U admin -v ON_ERROR_STOP=1 -f "c:\temp\Padrones Urbanos_0.sql"

(hacerlo para el 1, 2, 3, etc)





Importar SHP en PostgreSQL

1. Instalar extensiones POSTGIS (con el application stack builder de postgis):

2. Ejecutar en la base:

CREATE EXTENSION postgis;

3. Ejecutar:

C:\Program Files\PostgreSQL\11\bin>shp2pgsql -I -s 2263 "C:\_MAPAS\_CCZ\sig_comunales.shp" ccz | psql -U admin -d catastro

Usando el GUI:

C:\Program Files\PostgreSQL\11\bin\postgisgui

ejecutar shp2pgsql-gui.exe


Si da error que falta libintl-9.dll

Hacer una copia de libintl-8.dll y renombrarlo a libintl-9.dll


Si da error de encoding:

Luego al abrir el GUI, click en el boton Options... y poner LATIN1

Importar SQL en posgresql desde linea de comando

C:\Program Files\PostgreSQL\11\bin>psql -h localhost -d catastro -U admin -v ON_ERROR_STOP=1 -f "c:\temp\Padrones Urbanos.sql"

Ver mapa de edificios exportados de OSM en QGIS (OpenStreetMap) y query SQL

Referencia: https://github.com/tudelft3d/3dfier/wiki/Extracting-building-footprints-from-OpenStreetMap

1. Abrir browser en openstreetmap

2. Click en exportar

3. Seleccionar el area a exportar

4. Click en Overpass API (esto permite exportar archivos grandes)

5. El archivo exportado (map) renombrarlo a map.osm

6. Instalar QGIS (o instalar OSGeo4W, en el cual viene incluido)

7. En QGIS: Layer / Add Layer / Add Vector Layer

8. Elegir el archivo map.osm

9. Elegir multipolygons solamente

10. Luego de importar el mapa, en la ventana Layers (a la izquierda) click derecho en map_multipolygons, y en Filter definir:

"building" is not null

(esto permite que se muestren todos los edificios/casas)

Para hacer Query SQL:

Database / DB Manager
Virtual Layers / Project Layers
Database / SQL Window


select * from "map multipolygons"
where building is not null

^^^ ojo que tiene que ir con comillas y tiene un espacio luego de map!!





Cargar mapa en PosgreSql

1. Bajar el dataset de
https://data.humdata.org/dataset/604b5629-756d-4979-8b6f-59d6598ccd61

Por ejemplo:

hotosm_ury_buildings_gpkg.zipzipped geopackage

Geopackage, SQLite compatible

2. Instalar OSGeo4W (esto instala el ogr2ogr.exe, que es lo que permite subir el dataset a PosgreSQL)

3. Instalar PosgreSQL

4. Crear una base de datos (ej prueba2)

5. Crear un usuario y darle permisos sobre la base:
create user carlos with encrypted password 'Carlos1';grant all privileges on database prueba2 to carlos;
6. Instalar extensiones de GIS en PosgreSQL
-Abrir el PostgreSQL stack builder
-Ir a Spatial Extensions
-Marcar PostGIS

7. Crear extensiones postgis para la base de datos prueba2:
Ejecutar este query:
CREATE EXTENSION postgis;

8. Abrir la consola de OSGeo4W (OSGeo4W Shell)
ogr2ogr -f PostgreSQL "PG:dbname=prueba2 host='localhost' port='5432' user='carlos' password=Carlos" C:\_MAPAS\hotosm_ury_buildings_gpkg\hotosm_ury_buildings.gpkg -nlt PROMOTE_TO_MULTI

ATENCION: Si da un problema y pide password:
editar:
C:\Program Files\PostgreSQL\11\data\pg_hba.conf
cambiar todo lo que dice md5 por trust
(despues de ejecutar el script dejarlo con md5 de nuevo) 


Crear juego con Phaser y ejecutarlo en Android

https://gamedevacademy.org/creating-mobile-games-with-phaser-3-and-cordova/

PARA QUE FUNCIONE EN ANDROID, LA RUTA A PHASER TIENE QUE SER LOCAL!!


Ej de codigo:

<!DOCTYPE html>
<html>
<head>
<script src="./node_modules/phaser/dist/phaser.js"></script>
</head>
<body>

<script>

var config = {
    type: Phaser.AUTO,
    width: 400,
    height: 600,
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};

var game = new Phaser.Game(config);

var bmd;
var tooltip;
var sprite;
var pelota;
var rojo_strong;
var rojo_soft;
var verde_strong;
var verde_soft;
var amarillo_strong;
var amarillo_soft;
var boton_comenzar;


//------------------
var ensecuencia = false;
var finsecuencia = false;
var ind = 0;
var vecX = new Array();
var fin = false;
var interv;
var intervInicial;
var enjuego = false;

var indclick = 0;
const TIEMPO_ON = 300;

ensecuencia = false;

habilitar(false);
//------------------


function preload ()
{
this.load.image('pelota', 'assets/pelota.png');
    this.load.image('rojo_strong', 'assets/rojo_strong.png');
this.load.image('rojo_soft', 'assets/rojo_soft.png');

    this.load.image('verde_strong', 'assets/verde_strong.png');
this.load.image('verde_soft', 'assets/verde_soft.png');

    this.load.image('amarillo_strong', 'assets/amarillo_strong.png');
this.load.image('amarillo_soft', 'assets/amarillo_soft.png');

    this.load.image('azul_strong', 'assets/azul_strong.png');
this.load.image('azul_soft', 'assets/azul_soft.png');

    this.load.image('naranja_strong', 'assets/naranja_strong.png');
this.load.image('naranja_soft', 'assets/naranja_soft.png');

    this.load.image('magenta_strong', 'assets/magenta_strong.png');
this.load.image('magenta_soft', 'assets/magenta_soft.png');

this.load.image('boton_comenzar', 'assets/bitmap.png');
}

function create ()
{
var xSprite = 200;
pelota = this.add.sprite(xSprite, 300, 'pelota');

rojo_soft = this.add.sprite(xSprite, 300, 'rojo_soft').setInteractive({ pixelPerfect: true });
rojo_strong = this.add.sprite(xSprite, 300, 'rojo_strong');

verde_soft = this.add.sprite(xSprite, 300, 'verde_soft').setInteractive({ pixelPerfect: true });
verde_strong = this.add.sprite(xSprite, 300, 'verde_strong');

amarillo_soft = this.add.sprite(xSprite, 300, 'amarillo_soft').setInteractive({ pixelPerfect: true });
amarillo_strong = this.add.sprite(xSprite, 300, 'amarillo_strong');

azul_soft = this.add.sprite(xSprite, 300, 'azul_soft').setInteractive({ pixelPerfect: true });
azul_strong = this.add.sprite(xSprite, 300, 'azul_strong');

naranja_soft = this.add.sprite(xSprite, 300, 'naranja_soft').setInteractive({ pixelPerfect: true });
naranja_strong = this.add.sprite(xSprite, 300, 'naranja_strong');

magenta_soft = this.add.sprite(xSprite, 300, 'magenta_soft').setInteractive({ pixelPerfect: true });
magenta_strong = this.add.sprite(xSprite, 300, 'magenta_strong');

boton_comenzar = this.add.sprite(xSprite, 378, 'boton_comenzar').setInteractive({ pixelPerfect: true });

rojo_strong.visible = false;
verde_strong.visible = false;
amarillo_strong.visible = false;
azul_strong.visible = false;
naranja_strong.visible = false;
magenta_strong.visible = false;


rojo_soft.on('pointerdown', function(pointer){
if (enjuego) {
selecciono('6');

rojo_strong.visible = true;
setTimeout(function() {
rojo_strong.visible = false;
}, TIEMPO_ON);
}
});

verde_soft.on('pointerdown', function(pointer){
if (enjuego) {
selecciono('1');

verde_strong.visible = true;
setTimeout(function() {
verde_strong.visible = false;
}, TIEMPO_ON);
}
});

amarillo_soft.on('pointerdown', function(pointer){
if (enjuego) {
selecciono('2');

amarillo_strong.visible = true;
setTimeout(function() {
amarillo_strong.visible = false;
}, TIEMPO_ON);
}
});

azul_soft.on('pointerdown', function(pointer){
if (enjuego) {
selecciono('3');

azul_strong.visible = true;
setTimeout(function() {
azul_strong.visible = false;
}, TIEMPO_ON);
}
});

naranja_soft.on('pointerdown', function(pointer){
if (enjuego) {
selecciono('4');

naranja_strong.visible = true;
setTimeout(function() {
naranja_strong.visible = false;
}, TIEMPO_ON);
}
});

magenta_soft.on('pointerdown', function(pointer){
if (enjuego) {
selecciono('5');

magenta_strong.visible = true;
setTimeout(function() {
magenta_strong.visible = false;
}, TIEMPO_ON);
}
});

boton_comenzar.on('pointerdown', function(pointer){
if (!enjuego) {
start();
}
});

}


function update ()
{
}

function comenzar() {
Math.random();

habilitar(true);

agregar();

secuenciar();
}

function start() {
Math.random();

habilitar(true);

agregar();


secuenciar();
}

function habilitar(habil) {

boton_comenzar.visible = !habil;

enjuego = habil;
}

function iluminar(color, mantener=false) {
if (mantener)
t = TIEMPO_ON * 4;
else
t = TIEMPO_ON;

if (color == 1) {
verde_strong.visible = true;

setTimeout(function() {
verde_strong.visible = false;
}, t);
}

if (color == 2) {
amarillo_strong.visible = true;

setTimeout(function() {
amarillo_strong.visible = false;
}, t);
}

if (color == 3) {
azul_strong.visible = true;

setTimeout(function() {
azul_strong.visible = false;
}, t);
}

if (color == 4) {
naranja_strong.visible = true;

setTimeout(function() {
naranja_strong.visible = false;
}, t);
}

if (color == 5) {
magenta_strong.visible = true;

setTimeout(function() {
magenta_strong.visible = false;
}, t);
}

if (color == 6) {
rojo_strong.visible = true;

setTimeout(function() {
rojo_strong.visible = false;
}, t);
}

}

function agregar() {
vecX.push(Math.floor(Math.random() * 6) + 1);
}

function secuenciar() {
iluminar(vecX[ind]);

ind++;
if (ind > vecX.length-1)
{
ensecuencia = false;
ind = 0;
return;
}

interv = setInterval(function() {
iluminar(vecX[ind]);



ind++;
if (ind > vecX.length-1)
{
clearInterval(interv);
ensecuencia = false;
ind = 0;
}
}, 1000);
}

function selecciono(numero)
{
if (!enjuego)
return;

if (vecX[indclick] == numero)
{
indclick++

if (indclick > vecX.length-1)
{
indclick = 0;

setTimeout(function() {
agregar();


secuenciar();
}, 1000);
}
}
else {

iluminar(vecX[indclick], true);
detener();
}
}

function detener() {
clearInterval(interv);
clearInterval(intervInicial);
vecX.length = 0;
ind = 0;
indclick = 0;
habilitar(false);
}

</script>


</body>
</html>

Como hacer funcionar el emulador de Android

1. Instalar Android Studio

2. En la pantalla inicial de Android Studio, ir a Configure / AVD Manager

3. Create virtual device / Nexus 5X API 24

4. Ir al SETUP de la BIOS y activar la virtualizacion (en Hp envy, F10 cuando reinicio, luego System config / enable virtualization)

5. Para ver los emuladores instalados:

cd c:\Users\Carlos\AppData\Local\Android\Sdk\tools
emulator -list-avds

Nexus_5X_API_24

6. Ir a la carpeta de la aplicacion

cordova emulate android



*** Si el emulador no arranca o dice waiting for emulator to start, ir al AVD en Android Studio, click derecho sobre el emulador y Cold Reset y Wipe Data ***

Render de videos para Whatsapp en Sony Vegas


En la pantalla del preview, en la rueda de propiedades (arriba a la izquierda) elegir:

HDV 720-25p (1280x720, 25.000fps)

o

HD 1080-50i (1920X1080, 25.000fps)


Frame rate (velocidad de fotogramas): 25.000 (PAL)
Full resolution rendering (Calidad de renderizacion...): Best

Apply / OK

File / Render

Sony AVC/MVC (*.mp4,*.m2ts,*.avc)
   Internet 1280x720-30p   (Si arriba elegi HDV 720)

Customize template...
   Profile: Main
   Frame rate: 25.000 (PAL)
   Bit rate (bps): 1,000,000              <=== para achicar mas el video, bajar este número

En ficha Project: Video rendering quality: Best

Ponerle un nombre al template y guardarlo

No se instalo la aplicacion - Android

Instalar ApkEditor (version 1-9-0, la mas nueva no sirve)

https://drive.google.com/open?id=14nH68spiZNMAfadNBb7SN1xEhB9hPMvX

-Seleccionar un Archivo APK
-Edicion Rapida

Modificar el nombre de la aplicacion (ej, si es MyApp, ponerle MyAppX)

-Guardar

-DESINSTALAR LA APLICACION SI YA FUE PREVIAMENTE INSTALADA

-Instalar