De seguro has escuchado sobre las crypto monedas, hicieron un gran boom el año pasado alcanzando el valor de $17000 por cada bitcoin en noviembre del 2017, su máximo valor histórico, hubieron nuevos millonarios en el mundo gracias a estas monedas virtuales. Pero este dinero nunca tuvo una representación física, nunca hubo un billete, una moneda, un cheque, un paguere, un vale, un recibo o cualquier otro medio de intercambio de dinero físico existente, es puramente digital, son unos y ceros almacenados en algún lugar.
Sin embargo justo después de noviembre del 2017 el precio se vino abajo, al día de hoy (octubre del 2018) el precio esta por los $6000. Mucha gente como Steve Wozniak vendió en el mejor momento y aprovecho el hype por el bitcoin, todos los demás que sostuvieron sus bitcoin y no vendieron, estarán arrepentidos de no haber aprovechado la oportunidad. Varias personas que se dedican al trade de bitcoins, creen que este es un bache (depresión), que como cualquier ciclo tiene sus temporadas altas y bajas (Ciclo económico).
Pero muchos creen que es una estafa, realmente cual es la situación, y como es que funciona.
Primero se necesita aclarar que el bitcoin es una de las crypto monedas que existen, no la única, sino la mas popular, actualmente hay mas de 1600 crypto monedas en lista (https://en.wikipedia.org/wiki/List_of_cryptocurrencies).
Segundo, las cripto monedas se basan en un algoritmo llamado blockchain, que en esencia es una estructura de datos en la que se almacena información. Este algoritmo, al igual que cualquier otro algoritmo puede ser implementado en una variedad de aplicaciones, no necesariamente en temas monetarios. En el caso de las crypto monedas se utiliza el blockchain para representar transacciones.
El blockchain, que en español es cadena de bloques, cada bloque representa una transacción, y contiene una dirección que apunta al bloque anterior, el siguiente sigue así y el siguiente y el siguiente, convirtiéndose en una cadena de transacciones.
El otro punto clave del blockchain es que es descentralizado, quiere decir que no hay una entidad que regule y que centralice todas las operaciones, no hay un gobierno, no hay banco, no hay una entidad que lo regule, pero, ¿que significa eso? El lado bueno, no hay quien controle tu dinero, no hay gobierno que lo utilice a su antojo, no hay quien vigile tus movimientos, y no esta apegado a ningún tipo de reglamento. Lo malo, no hay quien te proteja de engaños, no hay quien regule o asegure tus transacciones. Se trata de confianza en un sistema, que funciona y que esta diseñado para eso, asegurar la legitimidad y la integridad de cada transacción (bloque).
Entonces ya se entiende una parte, es realmente popular por ser una moneda independiente de gobiernos, países y cualquier entidad. Se puede ampliar mucho en el funcionamiento del blockchain pero no este post.
Tercero, ¿como es que tiene valor?, igual que cualquier otra moneda. A modo de ejemplo digamos que creamos nuestro nueva moneda, la llamaremos la batimoneda, y crearemos 1000 monedas únicamente. Supongamos que voy a ir a comprar leche a la tienda, pero no tengo dinero convencional, entonces le ofrezco una batimoneda a cambio de un galón de leche, el dueño de la tienda le agrada la idea con la promesa que esa batimoneda ganara valor en el futuro y que saldrá ganando, y así continuo predicando la plusvalía de la batimoneda y usándola para obtener víveres y hasta bienes, en algún momento se empezaran a usar batimonedas mas normalmente, y dependiendo de la oferta y demanda así crecerá su valor, y como hay una cantidad limitada, empezara a subir la demanda, crecerá su valor y se volverá algo muy solicitado. Suena algo loco verdad, pero recuerda que antes los mayas usaban cacao como moneda. Fue alrededor del siglo IX que se documenta el uso de papel moneda como forma de intercambio.
Entonces si el bitcoin es algo digital, ¿como es que tiene valor?, todo se basa en oferta y demanda como cualquier otra moneda. ¿Porque el oro, plata, bronce y otros metales son valiosos? El oro no es el material mas raro, aunque es difícil de obtener, y tiene características de ser altamente anticorrosivos, aparte de su atractivo visual. Todo se basa en el precio que le den los iguales de la sociedad. Si alguien esta dispuesto a dar un galón de leche por una batimoneda, esa batimoneda valdrá lo equivalente en papel moneda que cuesta un galón de leche.
Apache thrift utiliza un archivo con extensión thrift para definir los métodos que utilizaran los lenguajes para comunicarse, en el que su definición es muy parecida a C. En la pagina oficial hay un archivo con todo lo que necesitamos saber, como definir los tipos de datos por ejemplo.
Vamos a definir un archivo thrift para nuestro ejemplo:
/**
32 * The first thing to know about are types. The available types in Thrift are:
33 *
34 * bool Boolean, one byte
35 * i8 (byte) Signed 8-bit integer
36 * i16 Signed 16-bit integer
37 * i32 Signed 32-bit integer
38 * i64 Signed 64-bit integer
39 * double 64-bit floating point value
40 * string String
41 * binary Blob (byte array)
42 * map Map from one type to another
43 * list Ordered list of one type
44 * set Set of unique elements of one type
45 *
46 * Did you also notice that Thrift supports C style comments?
47 */
//nombre del paquete en el que va ir nuestro código
namespace java ejemplothrift
//nombre de la clase que creara thrift
service EjemploT{
//vamos a definir los metodos que usaran los dos lenguajes
void ping(),
string obtener_posicion(1:i32 pos),
i32 sumar(1:i32 uno, 2:i32 dos)
}
Lo guardamos como ejemplo.thirft. Como se puede observar, solo definimos el nombre de los métodos, el tipo de retorno, y el tipo de parámetros. Los parámetros van numerados, acompañados del tipo de datos que sera y el nombre del mismo. Hay muchas cosas que podemos hacer con thrift, pero para un ejemplo básico solo iniciaremos con esto.
Ya definidos nuestro archivo thrift, ahora lo compilaremos. En consola introducimos lo siguiente thrift -r –gen cpp ejemplo.thift donde:
thrift es el comando indicando que utilizaremos el programa
-r para que sea recursivo
–gen indicando la generación del código
cpp el lenguaje que queremos que cree
ejemplo.thrift el archivo thrift con nuestras configuraciones.
con esto, podremos ver que nos ha creado una carpeta con como 5 archivos, todos generados por apache thrift.
Creamos un proyecto con QTcreator y copiamos los archivos creados por apache a nuestro proyecto y los agregamos, dando click derecho sobre nuestro proyecto dentro de QT, agregar archivos existentes, y seleccionar los que acabamos de copiar.
Veremos que entre los archivos hay uno que termina con el nombre skeleton. Este archivo es toda la base que necesitamos para crear nuestro servidor con c++.
// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.
#include "EjemploT.h"
#include
#include
#include
#include
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using boost::shared_ptr;
class EjemploTHandler : virtual public EjemploTIf {
public:
EjemploTHandler() {
// Your initialization goes here
}
void ping() {
// Your implementation goes here
printf("ping\n");
}
void obtener_posicion(std::string& _return, const int32_t pos) {
// Your implementation goes here
printf("obtener_posicion\n");
}
int32_t sumar(const int32_t uno, const int32_t dos) {
// Your implementation goes here
printf("sumar\n");
}
};
int main(int argc, char **argv) {
int port = 9090;
shared_ptr handler(new EjemploTHandler());
shared_ptr processor(new EjemploTProcessor(handler));
shared_ptr serverTransport(new TServerSocket(port));
shared_ptr transportFactory(new TBufferedTransportFactory());
shared_ptr protocolFactory(new TBinaryProtocolFactory());
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
return 0;
}
Podemos ver que nos creo los métodos que le indicamos, aquí es donde definiremos que hacer cuando un cliente nos convoque, para este tutorial vamos a utilizar el método obtener posición. Primero definimos un arreglo de String, con diferentes nombres en cada posición, en el constructor del ejemplo.
Y luego en el método obtener posición, retornaremos lo que contenga el arreglo en la posición que solicitan. Así nos quedaría
#include
// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.
#include "EjemploT.h"
#include
#include
#include
#include
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using boost::shared_ptr;
class EjemploTHandler : virtual public EjemploTIf {
public:
std::string arreglo[10];
EjemploTHandler() {
// Your initialization goes here
printf("se inicio\n");
arreglo[0]="ALan";
arreglo[1]="Beatriz";
arreglo[2]="Carlos";
arreglo[3]="Daniel";
arreglo[4]="Elvis";
arreglo[5]="Fer";
arreglo[6]="Gustavo";
arreglo[7]="Hillary";
arreglo[8]="Isabel";
arreglo[9]="Jose";
}
void ping() {
// Your implementation goes here
printf("ping\n");
}
void obtener_posicion(std::string& _return, const int32_t pos) {
// Your implementation goes here
printf("obtener_posicion %i\n",pos);
// const char *cstr = str.c_str();
if(pos<10 1="" _return="cstr;" a="" argc="" argv="" arreglo="" c="" c_str="" char="" const="" cstr="" delete="" dos="" else="" goes="" here="" implementation="" inicio="" int32_t="" int="" jemplothandler="" length="" main="" n="" port="7911;" pos="" printf="" qcoreapplication="" return="" shared_ptr="" strcpy="" sumar="" uno="" your=""> handler(new EjemploTHandler());
shared_ptr processor(new EjemploTProcessor(handler));
shared_ptr serverTransport(new TServerSocket(port));
shared_ptr transportFactory(new TBufferedTransportFactory());
shared_ptr protocolFactory(new TBinaryProtocolFactory());
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
return 0;
}
</10>
Pero si intentamos compilar, nos tirara un error, porque el compilador de g++ no encuentra las librerías de thrift.
Se necesitan agregar estas lineas al archivo .pro que utiliza QT para compilar thrift en c++. QMAKE_CXXFLAGS += -std=c++0x -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall INCLUDEPATH += -l/usr/local/include/thrift LIBS += -L/usr/local/lib -lthrift
Y listo, ya tenemos nuestro servidor en c++.
Ahora con java Así como creamos la carpeta con los archivos de c++, también creamos el archivo de java, en la carpeta gen-java, estará su clase en Java que genero thrift, posiblemente este entre varias carpetas dependiendo de namespace que definieron en el archivo thrift.
Vamos a crear un proyecto en NetBeans, y copiaremos la clase generada por thrift a la fuente de nuestro proyecto (Nombre_proyecto/src/nombre_paquetes/), para este ejemplo el proyecto se llamara EjemploThrift.
Ahora tenemos que implementar un cliente en este lado. Siguiendo los tutoriales en la pagina oficial de Apache Thrift, lo crearemos en el método main de la siguiente manera
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ejemplothrift;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
/**
*
* @author alan
*/
public class EjemploThrift {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
try {
TSocket transport = new TSocket("localhost", 7911);
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);
EjemploT.Client client = new EjemploT.Client(protocol);
//Llamada a un frame, donde estara la interacción con el usuario
Frame1 f1=new Frame1();
//Llamo al metodo setear, que solo sera para poder pasar al objeto cliente, y socket
f1.setear(client,transport);
f1.setVisible(true);
} catch (TException e) {
e.printStackTrace();
}
}
}
El código no tiene nada de extraordinario si se esta familiarizado con Java. El programa en java consistirá en una serie de JLabel que al pasar al mouse encima mandara a pedir en C++, su posición equivalente en el arreglo que definimos y se desplegara en un JTextField. Por ejemplo, si pasa el mouse sobre el primer JLabel mandara a pedir la primer posición en el arreglo definido en C, y así sucesivamente.
Incrusto los métodos solo para que tengan una idea mas clara de los métodos mencionados.
//metodo setear
//el cliente que se recibe aqui fue el creado en el main cuando se creo el socket
public void setear(EjemploT.Client client,TSocket transport){
cliente=client;
this.transport=transport;
}
//un metodo de la accion sobre un JLabel, todos los demas son iguales, solo cambia la posición que se manda a pedir
private void jLabel1MouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel1MouseEntered
try {
//aqui se utiliza el objeto cliente, y el método que definimos en el archivo thrift
String result=cliente.obtener_posicion(0);
jTextField1.setText(result);
} catch (TException ex) {
Logger.getLogger(Frame1.class.getName()).log(Level.SEVERE, null, ex);
}
}//GEN-LAST:event_jLabel1MouseEntered
Pero si compilamos este código en java tirara error, necesitamos agregar unas librerías al proyecto para que Netbeans pueda compilarlo.
¿Donde las conseguí? a prueba y error, pero el intento ganador fue crear un proyecto con maven, y editando el xml que genera el proyecto, siguiendo este tutorial thrift. Para agregarlas basta con dar click derecho en librerías, agregar Jar, y seleccionarlas.
Las librerías están junto con el código fuente en link del final.
dejo un vídeo con la demostración de todo ya funcionando
En este tutorial vamos a realizar un ejemplo entre java y c++, por lo tanto necesitamos instalar primero las herramientas para que cuando instalemos thrift nos reconozca los lenguajes.
Instalar el jdk de java
sudo apt-get install openjdk-7-jdk
También vamos a necesitar instalar apache ant sudo apt-get install ant
Ahora vamos a instalar las herrmientas para utilizar c++ sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
Instalación
Descargar apache thrift desde la pagina oficial Thrift 0.9.3 los descomprimimos, y nos movemos en la terminal hacia la carpeta donde lo descomprimimos, por ejemplo cd /home/user/Escritorio/thrift.
Y estando en la consola corremos el comando ./configure Al terminar nos debería mostrar un resumen en donde se ven que herramientas logro detectar, debería aparecernos java y c++ con un yes al lado.
Luego corremos el comando sudo make
Al terminar correctamente corremos el comando sudo make install