Monday, December 05, 2016

LED es mi nuevo Hello World - Tiempo de Rust

Como actualmente estoy aprendiendo Rust, tenía que publica mi aplicación de números LED otra vez -;)

Por favor tomen en cuenta...que..."Estoy aprendiendo Rust"...así que código puede ser flojo, redundante y nada idiomático...pero...suficiente para mostrar el lenguaje y permitirme aprender más -;)

Aquí está el código...

led_numbers.rs
use std::io;
use std::collections::HashMap;

fn main(){
 let mut leds:HashMap<&str, &str> = HashMap::new();

 leds.insert("0", " _  ,| | ,|_| ");
 leds.insert("1", "  ,| ,| ");
 leds.insert("2", " _  , _| ,|_  ");
 leds.insert("3", "_  ,_| ,_| ");
 leds.insert("4", "    ,|_| ,  | "); 
 leds.insert("5", " _  ,|_  , _| ");
 leds.insert("6", " _  ,|_  ,|_| ");
 leds.insert("7", "_   , |  , |  ");
 leds.insert("8", " _  ,|_| ,|_| ");
 leds.insert("9", " _  ,|_| , _| ");

 println!("Enter a number : ");
 let mut input_text = String::new();
 io::stdin().read_line(&mut input_text)
            .expect("failed to read");

 let split = input_text.split("");
 let vec: Vec<&str> = split.collect();
 let count = &vec.len() - 2;
 
 for i in 0..3{
  for j in 0..count{
   match leds.get(&vec[j]){
    Some(led_line) => { 
     let line = led_line.split(",");
     let vec_line: Vec<&str> = line.collect();
     print!("{}",&vec_line[i]);
     },
    None => println!("")
   }
  }
  print!("");
 }
 println!("");
}

Y aquí está el resultado...


Espero que les guste y si pueden mostrarme una manera más Rusty de hacer las cosas...por favor me avisan -:D

Saludos,

Blag.
Development Culture.

Mi primer post en Rust

Nuevamente...estoy aprendiendo un nuevo lenguaje de programación...y esta vez le tocó el turno a Rust.


Rust es muy bueno y tiene características muy interesántes como ownership y borrowing...y la sintáxis me recuerda bastante a OCaml...lo cual me gusta bastante...

Por ahora estoy leyendo la documentación oficial, que está realmente muy bien hecha...así que por supuesto hice mi aplicación de números fibonacci...

fibonacci.rs
use std::io;

fn fib(num: i64, a: i64, b:i64) -> String{
 let mut result: String = "".to_string();
 let sum: i64 = a + b;
 let sum_str: &str = &sum.to_string();
 let a_str: &str = &a.to_string();
 let b_str: &str = &b.to_string();
 if a > 0 && num > 1 {
  result = result + sum_str + " " + &fib((num - 1), (a + b), a);
 }else if a == 0{
  result = "".to_string() + a_str + " " + b_str + " " + 
           sum_str + " " + &fib((num - 1), (a + b), b); 
 }
 result
}

fn main(){
 println!("Enter a number : ");
 let mut input_num = String::new();
 io::stdin().read_line(&mut input_num)
            .expect("failed to read");

 let trimmed = input_num.trim();
    match trimmed.parse::() {
        Ok(i) => { let result: String = fib(i, 0, 1); print!("{}", result);}
        Err(..) => println!("Please enter an interger, not {}", trimmed)
    };
}

El código es un poco extenso para mi gusto...pero puede ser simplemente porque no he aprendido lo suficiente de Rust...o porque su sistema de ownership/borrowing sacrifica longitud para agregar seguridad...lo cual es algo realmente muy bueno...

Aquí está el resultado



Por supuesto, mi aplicación de Números LED ya está lista...y está viniendo justo después de este post -;)

Saludos,

Blag.
Development Culture.

Friday, December 02, 2016

Unity3D y Alexa trabajándo juntos

Este post fué posteado originalmente en Unity3D and Alexa working together.


Desde hace tiempo ...Tuve la idea de hacer que Unity3D y Alexa trabajen juntos...sin embargo...otros proyectos me mantuvieron ocupado y me quitaron tiempo para poder trabajar en esto...así que...hace unos días...una conversación con un amigo me hizo recordar que tenía muchas ganas de hacer esto...así que lo hice :)

Al inicio...no estaba exactamente seguro...pero lentamente las ideas se comenzaron a formar en mi mente...que pasaría si Unity leyera un webservice que es actualizado por Alexa? Cuando el comando correcto es interpretado, entonces Unity creará el objeto y problema resuelto...parece sencillo, no? Bueno...en realidad lo es...


Primero lo primero...tenemos que crear un pequeñp servidor web en NodeJS con Heroku...luego...necesitamos instalar Heroku Toolbelt...

Ahora...creamos una carpeta llamada node_alexa y dentro creamos los siguientes archivos...

package.json
{
  "dependencies": {
    "express": "4.13.3"
  },
  "engines": {
    "node": "0.12.7"
  }
}

procfile
web: node index.js
index.js
var express = require('express')
    ,app = express()
    ,last_value;

app.set('port', (process.env.PORT || 5000));

app.get('/', function (req, res) {
  if(req.query.command == ""){
 res.send("{ \"command\":\"" + last_value + "\"}");
  }else{
 if(req.query.command == "empty"){
  last_value = "";
  res.send("{}");
 }else{
  res.send("{ \"command\":\"" + req.query.command + "\"}");
  last_value = req.query.command;
 }
  }
})

app.listen(app.get('port'), function () {
  console.log("Node app is running on port', app.get('port')");
})

Una vez que tenemos esto...nos logeamos en Heroku Toolbelt y escribimos lo siguiente...

Heroku Toolbelt
cd node_alexa
git init .
git add .
git commit -m "Init"
heroku apps:create "yourappname"
git push heroku master
heroku ps:scale = web 0
heroku ps:scale = web 1

El WebService está listo para rockear -:) Deberías poder encontrárlo si vas a "http://yourappname.herokuapp.com/"

Ahora...este simple webservice potenciado por NodeJS nos servirá como un pequeño servidor de Eco...lo cual significa...cualquier cosa que escribamos nos devolverá una respuesta json...por supuesto...si escribimos "empty" entonces la respuesta será un json vacío...así que la idea principal es que podamos guardar el último valor ingresado...si pasamos un comando, este va a ser llamado cuando volvamos a llamar el servicio sin pasar ningún tipo de comando...así que si lo llamamos una vez...podemos llamarlo multiples veces sin interferir con su valor...

Lo siguiente en la lista...será crear nuestra aplicación en Unity...

Creamos una nueva aplicación y la llamamos "WebService" o algo parecido...el nombre del proyecto no importa mucho...

En la ventana de Hierarchy seleccionamos "Main Camera" y cambiamos los detalles del "Tranform" de esta forma...


Ahora, creamos un nuevo "3D Object" -> "Cube" y lo llamamos "Platform" con los siguientes detalles en el "Transform"...


Luego de eso, debemos crear cuatro paredes que van a ir alrededor de la plataforma...así que creamos 4 "3D Object" -> "Cube" y los llamamos "Wall 1", "Wall 2", "Wall 3" y "Wall 4"...





Cuando todo está listo, nuestro workspace debería verse así...


Vamos al tab project y creamos una carpeta llamada "plugins" y después creamos un nuevo archivo C# llamado "SimpleJSON"...dentro copiamos el código fuente que esta aquí...esto nos va a pemitir utlizar SimpleJSON para interpretar el JSON...

Ahora...creamos otra carpeta llamada "Script" y dentro creamos un nuevo archivo C# llamado "MetaCoding"...o cualquier otra cosa...



MetaCoding.cs
using UnityEngine;
using System.Collections;
using System.Net;
using System.IO;
using SimpleJSON;

public class MetaCoding : MonoBehaviour {

    int counter = 1;

    IEnumerator DownloadWebService()
    {
        while (true) { 
            WWW w = new WWW("http://yourapp.herokuapp.com/?command");
            yield return w;

            print("Waiting for webservice\n");

            yield return new WaitForSeconds(1f);

            print("Received webservice\n");
        
            ExtractCommand(w.text);

            print("Extracted information");

            WWW y = new WWW("http://yourapp.herokuapp.com/?command=empty");
            yield return y;

            print("Cleaned webservice");

            yield return new WaitForSeconds(5);
        }
    }

    void ExtractCommand(string json)
    {
        var jsonstring = JSON.Parse(json);
        string command = jsonstring["command"];
        print(command);
        if (command == null) { return;  }
        string[] commands_array = command.Split(" "[0]);
        if(commands_array.Length < 3)
        {
            return;
        }
        if (commands_array[0] == "create")
        {
            CreateObject(commands_array[1], commands_array[2]);
        }
    }

    void CreateObject(string color, string shape)
    {

        string name = "NewObject_" + counter;
        counter += 1;
        GameObject NewObject = new GameObject(name);

        switch (shape)
        {
            case "cube":
                NewObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
                break;
            case "sphere":
                NewObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                break;
            case "cylinder":
                NewObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                break;
            case "capsule":
                NewObject = GameObject.CreatePrimitive(PrimitiveType.Capsule);
                break;
        }
        NewObject.transform.position = new Vector3(0, 5, 0);
        NewObject.AddComponent();
        switch (color)
        {
            case "red":
                NewObject.GetComponent().material.color = Color.red;
                break;
            case "yellow":
                NewObject.GetComponent().material.color = Color.yellow;
                break;
            case "green":
                NewObject.GetComponent().material.color = Color.green;
                break;
            case "blue":
                NewObject.GetComponent().material.color = Color.blue;
                break;
            case "black":
                NewObject.GetComponent().material.color = Color.black;
                break;
            case "white":
                NewObject.GetComponent().material.color = Color.white;
                break;
        }
    }

        // Use this for initialization
    void Start () {
        print("Started webservice import...\n");

        StartCoroutine(DownloadWebService());
    }
 
 // Update is called once per frame
 void Update () {
 
 }
}

Una vez que tenemos el código...simplemente debemos adjuntarlo al Main Camera...


El concepto básico para este script es bastante simple...Estamos creándo "DownloadWebService" como un método IEnumerator para poder llamarlo como un Coroutine...y eso nos permite poder poner la función a dormir puesto que necesitamos darle un poco de tiempo entre llamadas a la función...

Este método va a llamar a nuestro WebService en Heroku buscándo un comando "create"...una vez que lo tiene...va a interpretar la respuesta JSON y dividirla en 3...para que podamos tener..."create", "blue" y "sphere"...esto va a llmar a CreateObject que luego va a crear la esfera azul...luego de que ha hecho eso...el coroutine va a continuar y simplemente va a enviar un nuevo comando a nuestro WebService para limpiar el resultado...para hacer que esto funcione de manera correcta...queremos darle un tiempo de 5 segundos después de haber el limpiado el webservice antes de poder llamar a otros comando "create"...

Y esta llamada va a ser hecha por nuestro skill en Alexa...así que basicamente cuando decimos "create blue sphere" en Alexa...ella va a enviar el comando al WebService...va a actualizar el mensaje y nuestra aplicación en Unity va a tomar el mensaje...hacer su trabajo...y luego limpiar el Webservice...luego esperar a que Alexa le provea el siguiente comando...

Así que...para ir finalizándo...necesitamos crear nuestro skill en Alexa...

Primera, vamos a crear una función Lambda...así que nos logeamos aquí...

Por supuesto...yo ya tengo todo configurado...así que vamos a crear una función dummy solamente para mostrárles los pasos...

Debemos hacer click en "Create Lambda Function" y veremos la siguiente pantalla...


Por supuesto hay bastantes...así que escribimos "Color" en el filtro...


Escogemos "alexa-skills-kit-color-expert"


Dejamos todo como está y presionamos "Next"


Escogemos un nombre y descripción...


Escogemos un rol existente si es que tenemos alguno creado anteriormente...de otra forma creamos un nuevo lambda_basic_execution...luego aumentamos el Timeout a 10 segundos y dejamos todo lo demás como está...presionamos "Next"...una ventana de confirmación va a aparecer...así que simplemente presionamos "Create function"...

Vamos a ser presentados con una ventana en donde podemos subir nuestro código fuente (lo cual vamos a hacer un poco más adelánte) y un número ARN...el cual necesitamos para un paso más adelánte...


Esta sección explica como crear el skill en Alexa...así que favor sigan mis pasos...y logeense aquí...


Escogemos "Alexa Skills Kit"...y creamos un nuevo skill...



Escogemos un nombre para nuestro skill y lo más importante...escogemos un "Invocation Name"...que es lo que le vamos a decir a Alexa para que abra nuestra aplicación..algo como..."Alexa, open Sandbox"...presionamos click...

En el tab de Interaction Model tenemos dos ventanas...llenamos esto en "Intent Schema"...

Intent Schema
{
  "intents": [
    {
      "intent": "GetUnityIntent",
      "slots": [
        {
          "name": "color",
          "type": "LITERAL"         
        },
        {
          "name": "shape",
          "type": "LITERAL"
        }
      ]
    },
    {
      "intent": "HelpIntent",
      "slots": []
    }
  ]
}

Estos son basicamente parámetros que podemos usar cuando estamos preguntándole algo a Alexa...

Y debemos llenar esto en "Sample Utterances"...

Sample Utterances
GetUnityIntent create {red|color} {sphere|shape}
GetUnityIntent create {yellow|color} {sphere|shape}
GetUnityIntent create {green|color} {sphere|shape}
GetUnityIntent create {blue|color} {sphere|shape}
GetUnityIntent create {black|color} {sphere|shape}
GetUnityIntent create {white|color} {sphere|shape}

GetUnityIntent create {red|color} {cube|shape}
GetUnityIntent create {yellow|color} {cube|shape}
GetUnityIntent create {green|color} {cube|shape}
GetUnityIntent create {blue|color} {cube|shape}
GetUnityIntent create {black|color} {cube|shape}
GetUnityIntent create {white|color} {cube|shape}

GetUnityIntent create {red|color} {cylinder|shape}
GetUnityIntent create {yellow|color} {cylinder|shape}
GetUnityIntent create {green|color} {cylinder|shape}
GetUnityIntent create {blue|color} {cylinder|shape}
GetUnityIntent create {black|color} {cylinder|shape}
GetUnityIntent create {white|color} {cylinder|shape}

GetUnityIntent create {red|color} {capsule|shape}
GetUnityIntent create {yellow|color} {capsule|shape}
GetUnityIntent create {green|color} {capsule|shape}
GetUnityIntent create {blue|color} {capsule|shape}
GetUnityIntent create {black|color} {capsule|shape}
GetUnityIntent create {white|color} {capsule|shape}

GetUnityIntent {thank you|color}

Estos son todos los comandos que Alexa puede entender...y sí...podriamos haber utilizado "Custom Slot Types" para hacer el código más corto...pero...he tenido problemas donde no funciona muy bien cuando hay mas de un slot...simplemente presionamos next...


Aquí, escogemos AWS Lambda ARN...y escogemos North America o Europe dependiendo de nuestra locación física...luego en la caja de texto...simplemente copiamos y pegamos el número ARN que recibimos de nuestra función Lambda...

Esto nos va a enviar al tab de "Test"...pero en realidad no queremos eso e inclusive no podemos usarlo...así que debemos regresar al tab "Skill Information" y encontraremos que un nuevo campo ha aparecido...

Este campo será "Application Id"...copiamos este número y continuamos hacia la parte final...

Creamos una carpeta llamada "Unity" y dentro una carpeta llamada "src"...dentro de esa carpeta copiamos el archivo "AlexaSkills.js"

Vamos a utilizar el módulo "request" de NodeJS...así que lo instalamos localmente en la carpeta Unity...

sudo npm install --prefix=~/Unity/src request 

Esto va a crear una carpeta llamada node_module conteniendo al módulo request...

Luego, creamos un nuevo archivo llamado "index.js"


index.js
var request = require("request")
  , AlexaSkill = require('./AlexaSkill')
    , APP_ID     = 'yourappid';

var error = function (err, response, body) {
    console.log('ERROR [%s]', err);
};

var getJsonFromUnity = function(color, shape, callback){

var command = "create " + color + " " + shape;

if(color == "thank you"){
 callback("thank you");
}
else{
var options = { method: 'GET',
  url: 'http://yourapp.herokuapp.com/',
  qs: { command: command },
  headers: 
   { 'postman-token': '230914f7-c478-4f13-32fd-e6593d8db4d1',
     'cache-control': 'no-cache' } };

var error_log = "";

request(options, function (error, response, body) {
 if (!error) {
  error_log = color + " " + shape;
 }else{
  error_log = "There was a mistake";
 }
  callback(error_log);
    });
}
}

var handleUnityRequest = function(intent, session, response){
  getJsonFromUnity(intent.slots.color.value,intent.slots.shape.value, function(data){
 if(data != "thank you"){
 var text = 'The ' + data + ' has been created';
 var reprompt = 'Which shape would you like?';
    response.ask(text, reprompt);
 }else{
  response.tell("You're welcome");
 }
  });
};

var Unity = function(){
  AlexaSkill.call(this, APP_ID);
};

Unity.prototype = Object.create(AlexaSkill.prototype);
Unity.prototype.constructor = Unity;

Unity.prototype.eventHandlers.onSessionStarted = function(sessionStartedRequest, session){
  console.log("onSessionStarted requestId: " + sessionStartedRequest.requestId
      + ", sessionId: " + session.sessionId);
};

Unity.prototype.eventHandlers.onLaunch = function(launchRequest, session, response){
  // This is when they launch the skill but don't specify what they want.

  var output = 'Welcome to Unity. Create any color shape by saying create and providing a color and a shape';

  var reprompt = 'Which shape would you like?';

  response.ask(output, reprompt);

  console.log("onLaunch requestId: " + launchRequest.requestId
      + ", sessionId: " + session.sessionId);
};

Unity.prototype.intentHandlers = {
  GetUnityIntent: function(intent, session, response){
    handleUnityRequest(intent, session, response);
  },

  HelpIntent: function(intent, session, response){
    var speechOutput = 'Create a new colored shape. Which shape would you like?';
    response.ask(speechOutput);
  }
};

exports.handler = function(event, context) {
    var skill = new Unity();
    skill.execute(event, context);
};

El código es bastante simple...principalmente porque la mayoría es un template...simplemente lo copia...cambias un par de cosas y estás listo para continuar...

Basicamente cuando decimos "Alexa, open Unity"...ella va a escuchar nuestros pedidos...así que podemos decir "create green cube"...y va a llamar a nuesto WebService en Heroku y luego esperar por otro comando...si no le hablas nuevamente...te va a invitar a decir algo...si le dices "Thank you" ella va a desactivarse a si misma de una manera muy educada...

Y eso es basicamente todo...una vez que Alexa envia el comando al WebServer...nuestra aplicación en Unity va a leerla y actuar como corresponde...creándo cualquier forma y color que le hemos pedido...interesánte, huh?

Pero por supuesto...no me creen, no? No puede ser tan simple...bueno...si y no...es simple...pero saqué todos los puntos complicados para poder proveerles una serie de instruciones claras y consisas...

Así que...así es como se ve cuando ejecutamos la aplicación en Unity...



Y aquí está el video en acción...


Espero que les guste...y mantenganse alertas...porque para mi esto solo fué una prueba de concepto...mi próximo proyecto va a llevar esto al siguiente nivel...

Saludos,

Blag.
Development Culture.

Thursday, December 01, 2016

LED es mi nuevo Hello World - Tiempo de Swift (para Linux)

Me tomó un poco de tiempo escribir este blog...principalmente porque estoy aprendiendo Rust y también porque acabo de teminar mi último demo...cuyo blog publicaré más tarde -;)

Esta versión de mi applicación de Números LED se convierte en la versión de 25 lenguajes de programación...así que...obviamente...es una gran hito para mi -:D Quién sabe? Quizás haga algo interesánte si alcanzo los 50 lenguajes de programación -:D

En fín...como me encanta decir..."Basta de hablar...muestrame el Código Fuente" -;)

LedNumbers.swift
let leds: [Character:String] = [
 "0" : " _  ,| | ,|_| ",
 "1" : "  ,| ,| ",
 "2" : " _  , _| ,|_  ",
 "3" : "_  ,_| ,_| ",
 "4" : "    ,|_| ,  | ",
 "5" : " _  ,|_  , _| ",
 "6" : " _  ,|_  ,|_| ",
 "7" : "_   , |  , |  ",
 "8" : " _  ,|_| ,|_| ",
 "9" : " _  ,|_| , _| "
];

print("Enter a number: ",terminator:"");
let num = readLine(strippingNewline: true);

var line = [String]();
var led = "";

for i in 0...2{
 for character in num!.characters{
  line = String(leds[character]!)!.
                       characters.split(separator: ",").map(String.init);
  print(line[i], terminator:"");
 }
 print("");
}

Y aquí está la imagen del programa haciendo su magia -:)


Saludos,

Blag.
Development Culture.

Monday, November 28, 2016

Mi primer post en Swift (para Linux)


Puesto que Apple liberó de forma muy amable  Swift for Linux...Tenía que aprenderlo-:)

Por supuesto...no está totalmente implementado...así que la mayoría de cosas que hacen a Swift impresionante en IOS no están presenten aún...pero aún así...es impresionante! -:D

Swift es medio functional...así que puedes ver muchas cosas de Haskell y Erlang...pero también imperativo y orientado a objects...así que eso lo convierte en un lenguaje muy interesánte...

Como siempre...aquí está mi pequeña aplicación de números Fibonacci...

fibonacci.swift
func fib(num:Int,a:Int,b:Int) -> String{
 var result: String = "";
 if a > 0 && num > 1{
  result = result + String(a + b) + " " + 
           fib(num: (num - 1), a: (a + b), b: a);
 }else if a == 0{
  result = String(a) + " " + String(b) + " " + 
           String(a + b) + " " + 
           fib(num: (num - 1), a: (a + b), b: b);
 }
 return result;
}

print("Enter a number: ",terminator:"");
let number = Int(readLine(strippingNewline: true)!);

print(fib(num: number!, a: 0, b: 1));

Y aquí está el resultado....


Ya tengo lista mi aplicación de Números LED...así que esperen -;)

Saludos,

Blag.
Development Culture.

Tuesday, November 15, 2016

LED es mi nuevo Hello World - Tiempo de Perl

Como lo prometí...acá está mi LED Numbers a la Perl...y como siempre...por favor tengan en cuenta de que soy un novato en Perl...Yo se que hay maneras más eficientes, cortas y consisas de hacer esta aplicación...pero...que tan bueno es un código introductorio que usa código oscuro y arcano? Yo no quiero que la gente se asuste con Perl...Quiero que la gente diga "Hey...eso no se ve tan dificil...Yo quiero aprender Perl"...

Así que...aquí está...

LedNumbers.pl
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my %leds = (
 0 => ' _  ,| | ,|_| ',
 1 => '  ,| ,| ',
 2 => ' _  , _| ,|_  ',
 3 => '_  ,_| ,_| ',
 4 => '    ,|_| ,  | ',
 5 => ' _  ,|_  , _| ',
 6 => ' _  ,|_  ,|_| ',
 7 => '_   , |  , |  ',
 8 => ' _  ,|_| ,|_| ',
 9 => ' _  ,|_| , _| '
);

print "Enter a number: ";
my $num = <>;
my @numbers = ( $num =~ /\d/g );

for my $i (0 .. 2){
 for my $j (0 .. scalar(@numbers) - 1){
  my @line = split /\,/,$leds{$numbers[$j]};
  print $line[$i];
 }
 print "\n";
}

Y acá está el resultado...


Y para que lo sepan...esta es mi versión numero 23 del código...sip...he escrito mi aplicación de LED Numbers en 24 lenguages hasta el momento -;) Cuál va a ser mi punto de quiebre? Quien sabe...la programación es el límite -;)

Saludos,

Blag.
Development Culture.

Mi primer post en Perl



Así que...he comenzado a aprender Perl...porque? 3 simples razones...
  1. Amo la programación.
  2. Para mí...Perl pertenece a la Santa Trinidad de los Lenguajes de Programación junto con Ruby y Python (Disculpa PHP...pero no llegas a la lista)
  3. Porque...es Perl! Vamos!

Entonces...he estado leyendo Beginning Perl...que dicho sea de paso es un libro impresionante...



Si estás utilizándo algun tipo de Linux o Mac...ya deberías tener Perl instalado por defecto...si estás usando Windows...bueno...siempre puedes descargarlo e instalarlo -:)

Hasta el momento...Amo Perl...es impresionante...y ahora puedo porque las personas dicen que tanto Python como Ruby piden prestado bastante de Perl...y claro...PHP lo hace también...

Por supuesto, no tengo mucha experiencia...pero como siempre...Comienzo haciendo un simple y pequeño programa para posicionarme en el camino correcto...así que aquí está mi applicación de lista de números Fibonacci...

fibonacci.pl
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

sub fib {
 my ($num,$a,$b) = @_;
 my $result = '';
 if ($a>0 && $num>1){
  $result = $result . ($a+$b) . " " . fib($num-1,$a+$b,$a)
 }elsif($a == 0){
  $result = $a . " " . $b . " " . ($a+$b) . " " . fib($num-1,$a+$b,$b)
 }
 return $result
}

print "Enter a number: ";
my $num = <>;

print(fib($num,0,1));

Y aquí esta el resultado...


Claro...ya tengo m clásica aplicación "LED Numbers" lista...pero eso va en otro post -;)

Saludos,

Blag.
Development Culture.

Tuesday, August 09, 2016

Microsoft HoloLens en el SAP’s d-shop

Este post fué posteado originalmente en Microsoft HoloLens on SAP’s d-shop.


Una de las metas principales del SAP’s d-shop es recolectar, aprender y compartir conocimientos en las últimas tecnologías y el Microsoft HoloLens no ha estado fuera de nuestro radar -;)

Pero…que es HoloLens?


HoloLens es un dispositivo de Mixed Reality…que es basicamente una mezcla de Virtual (Oculus Rift) y Augmented (Google Glass) Realities.

Una de las capacidades más importantes del Mixed Reality es que te permite crear Hologramas que pueden ser mezclados con el mundo real e interactuar con el.

HoloLens hace un mapeo de tu cuarto y puede reconocer que tienes una mesa de café, un sofá, una lámpara, y demás…cuando posicionas tus Hologramas en la mesa o en el sofá, el Holograma no va pasar a través de el, más bien va a "sentarse" encima…y esto te permite hacer cosas asombrosas como crear una Holograma de una lampara que va a ser posicionada al costado del sofá para ver como se vería. Y este es solo uno de los múltiples casos de uso que el HoloLens puede proporcionar.

En el d-shop Silicon Valley, creemos que utilizar y programar el HoloLens es una experiencia asombrosa.

Así que…que necesitas para comenzar a programar y crear experiencias asombrosas?

En esta página encontrarás todas las herramientas que necesitas, las cuales incluyen Visual Studio, una versión a la medida de Unity3D y el emulador del HoloLens.

Además, también sería excelente para ti echarle un vistazo a los videos del Holographic Academy…los cuales te guía a través de los conceptos básicos de la programación en HoloLens…

Pero…con este blog queremos mostrarte un video con algunos de los demos/proyectos que hemos creado en el d-shop Silicon Valley.

Word Clock Con esta aplicación, puedes literalmente leer la hora -;) Esto demuestra el de texo en Unity y fué adaptado de una aplicación escrita en Python.

d-shop Robot Esta aplicación utiliza un model del robot del d-shop diseñado utilizándo Blender. Esto demuestra el uso de Spatial Mapping y comandos simples de voz.

SAP Puzzle Game Esta aplicación muestra un juego de rompecabeza deslizable que tiene dos modos…fácil y dificil…demuestra como recortar una imagen y distribuirla en multiples cubos, también demuestra el uso de comandos de voz simples y física.

HoloHouse Esta aplicación es un proyecto diseñado para un banco en Dubai para ser utilizado como aplicación de Bienes Raices. Los modelos fueron diseñados utilizándo 3ds Max por una compañía externa. Esta aplicación demuestra el uso del Scripting en Unity para rotar las casas, decolorar las luces, levantar el techo y los pisos de las casas y mostrar señalizaciones.




Ahora que has visto lo que se puede hacer en un par de semanas…por que no te unes a nosotros en el d-shop y nos muestras que es lo tú puedes hacer! -:D

Saludos,

Blag.
Development Culture.

Sunday, August 07, 2016

El primer Hackaton de Hololens del d-shop

Este post fué posteado originalmente en d-shop's very first Hololens Hackaton.


El Miércoles 3 de Agosto, tuvimos el primer Hackaton de Hololens en el d-shop’s de SAP. Personas que nunca antes habían utilizado Unity3D y que nunca antes habían programado para el Hololens se reunieron para tener una divertiva y emocionante experiencia de aprendizaje.


Gracias al trabajo duro y esfuerzos de organización de mis compañeros de equipo Aaron Williams y Julia Satsuta tuvimos 3 personas asombrozas de Microsoft, Vlad Kolesnikov, Petri Wihelmsen y Jaime Rodriguez.


El primer día hubo explicaciones de que es el Hololens…una rápida introducción a Unity3D y una parte de Design Thinking/Brainstorming donde los equipos pudieron planear sus ideas.

El segundo día arrancó con programación en Hololens y apoyo por nuestro lado. La personas estaban completamente emocionadas y con energía…intentándo cosas en el editor de Unity3D…en el emulador de Hololens y en el mismo dispositivo.

Como una manera de incluir a más personas y dejar que los equipos pudieran trabajar sin distracciones, tuvimos una sesión sobre Hololens en el Edificio 7…abierto para todos lo que querían asistir…




Luego de eso, regresamos para poder continuar ayudándo y apoyándos a los equipos. Ellos necesitaban estar totalmente listos a las 3:30pm puesto que teniamos la presentación de demos a las 4:00pm.

La presentación de demos estuvo localizada en la cafetería del Edificio 8.



Tuvimos a 5 equipos presentándo su impresionante trabajo…

Holoterior

Diseña el cuarto de tus sueños




Mechannotate
Ordena parte de repuesto a medida que las necesitas...no pierdas el tiempo llenándo formularios




Next Talent

Motiva a tus nuevos empleados ofreciéndoles una inmersión en tu historia y cultura




TripIp

Planeando tu próximo viaje? Obtén el asiento que es más comfortable para ti




The Wesley Crushers

Se rompio una de tus cañerías? Revisala...mídela y pide un repuesto




Como pueden ver…todos los equipos pusieron todo su esfuerzo y crearon demos realmente alucinantes…pero…siempre debe haber solo un ganador…así que el último equipo en presentarse fué también el equipo de ganó…así que…felicidades al equipo “The Wesley Crushers”!

Luego de esta emocionante experiencia…estoy seguro de que vamos a regresar por más…Hololens es aún una tecnología muy nueva, así que aún hay mucho por aprender, mucho por hackear y muchisimas posibilidades.

Si estás en Palo Alto…ven y visítianos! Recuerden que el d-shop está localizado en el primer piso del Edificio 9 en Deer Creek Road -;)

Saludos,

Blag.
Development Culture.