Showing posts with label Julia. Show all posts
Showing posts with label Julia. Show all posts

Monday, October 19, 2015

Julia, la hermana pequeña del Análisis de Datos...conoce a SAP HANA

Este post fué posteado originalmente en Julia, data analysis’s little sister...meets SAP HANA.


Julia ya no es tan joven…puesto que apareció por primera vez en el 2012 -:) Es un lenguaje de programación dinámico de alto nivel diseñado para manejar los requerimientos de computación científica y de algo performance númerico siendo al mismo tiempo efectivo para programación de propósito general.


Woaw! Esa fué una descripción bastante larga…así que...por qué debería interesárnos? Bueno…quizás porque Julia fué diseñado para ser el lenguage de programación que domine a todos…un lenguaje que puede ser utilizádo en cualquier situación que se nos presente…y sin tener que parar para decir si esto es verdad o no…debo decir que…Julia es realmente impresionante-:)

Así que…ninguna demostración estaría completa si la enlazaramos con SAP HANA, so? Así que…vamos a hacerlo -;)

Primero, debemos crear un objeto Join y asociar la tabla por MANDT y CARRID. De ahí, seleccionar los siguientes campos como output MANDT, CARRID, CARRNAME, PRICE y CURRENCY.

Luego crear un objeto Aggregation seleccionándo los campos CARRNAME, PRICE (Como columnas agregadas) y CURRENCY. Debemos filtrar el campo CURRENCY por ‘USD’.

Luego, debemos crear un objeto Projection y seleccionar solo PRICE y CARRNAME.

En el objeto Semantics asegúrense de marcar  “CROSS CLIENT” como cliente por defecto.


Ahora, cambiemos a la vista SAP HANA Development y creemos un nuevo repositorio. Lo llamaremos“Flights”.

Creamos un proyecto “XS Engine” y también lo llamamos “Flights”. Lo enlazamos con el repositorio “Flights”.

Creamos un archivo vacio llamado “.xsapp”.

Creamos un archivo llamado “.xsaccess” con el siguente código.

.xsaccess
{
          "exposed" : true,
          "authentication" : [ { "method" : "Basic" } ]
}

Finalmente creamos un archivo llamado “flights.xsodata” con el siguiente código

flights.xsodata
service {
          "Blag/FLIGHTS_BY_CARRIER.calculationview" as "FLIGHTS" keys 
                                                        generate local "Id";
}

Activamos el proyecto y lanzamos nuestro browser...deberíamos ver algo como esto…


La parte de SAP HANA está lista…así que ahora podemos pasar a la parte de Julia…

Tenemos que ir a nuestro entorno de Julia e instalar los siguientes paquetes
  • HTTPClient
  • Codecs
  • LightXML
Solo debemos hacer Pkg.add(“PackageName”) por cada uno de ellos.

Luego, debemos crear un archivo llamado Julia_HANA_XML.jl en nuestro editor favorito y copiar y pegar el siguente código...

Julia_HANA_XML.jl
using HTTPClient.HTTPC
using Codecs
using LightXML

credentials=encode(Base64,"SYSTEM:YourPassword")
Auth = bytestring(credentials)
Auth = "Basic " * Auth

flights=HTTPC.get("http://YourServer:8000/Flights/flights.xsodata/FLIGHTS",RequestOptions(headers=[("Authorization",Auth)]))

raw_text = takebuf_string(flights.body)
xdoc = parse_string(raw_text)
xroot = root(xdoc)

entry = get_elements_by_tagname(xroot,"entry")

for flights in entry
 print(content(find_element(find_element(find_element(flights,"content"),"properties"),"CARRNAME")),": ",
    content(find_element(find_element(find_element(flights,"content"),"properties"),"PRICE")),"\n")
end

Para ejecutar esta aplicación, simplemente debemos ir a Julia y escribir

Include(“Julia_HANA_XML.jl”)


Si se están preguntándo…porque no utilicé JSON en vez de XML? Bueno…Hay una explicacion muy sencilla para eso -:) De algún modo…el paquete HTTPClient tenía un problema al utilizar ?$format=json así que me vi forzado a utilizar XML…

Saludos,

Blag.
Development Culture.

Wednesday, July 16, 2014

Web Scrapping con Julia y PhantomJS

Como he estado leyendo algunos libros sobre PhantomJS y siempre estoy buscando desarrollar algo interesante en Julia...Pensé que integrarlos podría ser una buena idea -;)

Pensé acerca de Twitter y los hashtags...no sería interesánte escribir un script en PhantomJS para hacer un web scrape en Twitter y obtener todos los hashtags que he usado?

Para este script en particular...Estoy tomando los hashtags de las primeras 5 páginas de Twitter que están enlazadas a mi perfil...

Hashtags.js
var system = require('system');

var webpage = require('webpage').create();
webpage.viewportSize = { width: 1280, height: 800 };
webpage.scrollPosition = { top: 0, left: 0 };

var userid = system.args[1];
var profileUrl = "http://www.twitter.com/" + userid;

webpage.open(profileUrl, function(status) {
 if (status === 'fail') {
  console.error('webpage did not open successfully');
  phantom.exit(1);
 }
 var i = 0,
 top,
 queryFn = function() {
  return document.body.scrollHeight;
 };
 setInterval(function() {
  top = webpage.evaluate(queryFn);
  i++;
   
  webpage.scrollPosition = { top: top + 1, left: 0 };

  if (i >= 5) {
   var twitter = webpage.evaluate(function () {
    var twitter = [];
    forEach = Array.prototype.forEach;
    var tweets = document.querySelectorAll('[data-query-source="hashtag_click"]');
    forEach.call(tweets, function(el) {
     twitter.push(el.innerText);
    });
    return twitter;
   });

   twitter.forEach(function(t) {
    console.log(t);
   });

   phantom.exit();
  }
}, 3000);
});

Si lo ejecutamos...vamos a tener el siguiente resultado...



Ahora...que es lo que quiero hacer con esta información...enviarla a Julia...y obtener los hashtags más usados...así que voy a sumarizarlos y luego deshacerme de los que solo aparecen una vez...

Veamos el código en Julia...


Twitter_Hashtags.jl
tweets = readall(`phantomjs --ssl-protocol=any Hashtags.js Blag`)
tweets = split(tweets,"\n")
hashtags = Dict()
for hash in tweets
 try
  hashtags[hash] += 1
 catch e
  hashtags[hash] = 1
 end
end

filter!((k,v)->v>1,hashtags)

for (k,v) in hashtags
 println("$k has been mentioned $v times")
end

Si lo ejecutamos...vamos a tener el siguiente resultado...


Todavía no se como ordenar diccionarios en Julia...así que tenganme paciencia -:)

En fín...viendo el resultado...podemos tener mis top 3 hashtags -;)

#LeapMotion ==> 14 veces
#Flare3D ==> 11 veces
#DevHangout ==> 8 veces

Espero que les haya gustado y nos vemos la próxima vez -:)

Saludos,

Blag.
Development Culture.

Thursday, July 10, 2014

LED - Mi primer paquete en Julia

Así que ayer estaba pensando acerca de Julia y lo fácil que la gente dice que es desarrollar paquetes...por supuesto...tenía que intentarlo yo mismo...

Quería comenzar en pequeño y simple...así que construí algo inútil más que nada por diversión y para aprender...

El paquete LED simplmente escribe la representación LED de cualquier número dado...

julia> Using LED

julia > ShowLED(12345)

   _  _       _  
|  _| _| |_| |_  
| |_  _|   |  _| 

Tan simple como eso...y no me tomó más de 5 minutos tener todo listo...

Así que, puedo confirmar ahora que el desarrollo de paquetes en Julia...es fácil, pero muy fácil -:)

Si todo fué hecho correctamente...deberías ser capaz de hacer esto...

julia > Pkg.add("LED")

de lo contrario...por favor haz...

julia > Pkg.clone("git@github.com:atejada/LED.jl.git")

Por supuesto...esto fué solo un experimento...así que por supuesto estoy pensando poner mi mente a trabajar y desarrollar algunos interesantes y útiles paquetes -;)

Saludos,

Blag.
Development Culture.

Tuesday, May 13, 2014

Mi primer post sobre Julia

Así que...que es Julia? Tan solo otro bonito lenguaje de programación -;)

De acuerdo con sus creadores...

Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical computing environments.

Julia es un lenguage dinámico de alto nivel y alta performance para computación técnica, con sintaxis que es familiar para usuarios de otros entornos de computación técnica.



Recién comencé a aprenderlo hace algunos días...y debo decir que realmente me gusta...tiene una sintaxis parecida a Python así que me sentí comodo desde el principio...

Por supuesto...es prácticamente un nuevo lenguaje, así que hay cosas que se están agregando y corrigiendo mientras hablamos...pero la comunidad está creciendo y me alegra estar entre sus primeros entusiastas -:)

Lo primero que hice después de leer la documentación y ver algunos videos fué simplemente pasar una de mis antiguas aplicaciones hecha en Python a Julia...la aplicación fué "LCD Numbers" la cual simplemente pide un número y lo retorna impreso con formato LCD...

Este es el código en Python...

LCD_Numbers.py
global line1, line2, line3

line1 = ""
line2 = ""
line3 = ""

zero = {1: ' _  ', 2: '| | ', 3: '|_| '}
one = {1: '  ', 2: '| ', 3: '| '}
two = {1: ' _  ', 2: ' _| ', 3: '|_  '}
three = {1: '_  ', 2: '_| ', 3: '_| '}
four = {1: '    ', 2: '|_| ', 3: '  | '}
five = {1: ' _  ', 2: '|_  ', 3: ' _| '}
six = {1: ' _  ', 2: '|_  ', 3: '|_| '}
seven = {1: '_   ', 2: ' |  ', 3: ' |  '}
eight = {1: ' _  ', 2: '|_| ', 3: '|_| '}
nine = {1: ' _  ', 2: '|_| ', 3: ' _| '}

num_lines = {0: zero, 1: one, 2: two, 3: three, 4: four,
             5: five, 6: six, 7: seven, 8: eight, 9: nine}

def Lines(number):
    global line1, line2, line3
    line1 += number.get(1, 0)
    line2 += number.get(2, 0)
    line3 += number.get(3, 0)

number = str(input("\nEnter a number: "))
length = len(number)
for i in range(0, length):
    Lines(num_lines.get(int(number[i:i+1]), 0))

print ("\n")
print line1
print line2
print line3
print ("\n") 
Y este es en cambio...su version en Julia...

LCD_Numbers.jl
zero = [1=> " _  ", 2=> "| | ", 3=> "|_| "]
one = [1=> "  ", 2=> "| ", 3=> "| "]
two = [1=> " _  ", 2=> " _| ", 3=> "|_  "]
three = [1=> "_  ", 2=> "_| ", 3=> "_| "]
four = [1=> "    ", 2=> "|_| ", 3=> "  | "]
five = [1=> " _  ", 2=> "|_  ", 3=> " _| "]
six = [1=> " _  ", 2=> "|_  ", 3=> "|_| "]
seven = [1=> "_   ", 2=> " |  ", 3=> " |  "]
eight = [1=> " _  ", 2=> "|_| ", 3=> "|_| "]
nine = [1=> " _  ", 2=> "|_| ", 3=> " _| "]

num_lines = [0=> zero, 1=> one, 2=> two, 3=> three, 4=> four,
             5=> five, 6=> six, 7=> seven, 8=> eight, 9=> nine]

line = ""; line1 = ""; line2 = ""; line3 = ""

function Lines(number, line1, line2, line3)
    line1 *= number[1]
    line2 *= number[2]
    line3 *= number[3]
    line1, line2, line3
end

println("Enter a number: "); number = chomp(readline(STDIN))
len = length(number)
for i in [1:len]
    line = Lines(num_lines[parseint(string(number[i]))],line1,line2,line3)
    line1 = line[1]; line2 = line[2]; line3 = line[3]
end

println(line1)
println(line2)
println(line3 * "\n")

Como pueden ver...el código se ve bastante familiar...pero por supuesto...me deshice de todas esas horribles variables globales...y utilicé algunas de las impresionantes capacidades de Julia, como retorno múltiple de valores y definición de variables en una sola línea... si quieren ver el output...aquí está...


Por supuesto...este es solo un test...las cosas se van a poner interesantes cuando pase un poco de código en R hacia Julia y haga algunas comparaciones de velocidad -;)

Saludos,

Blag.
Development Culture.