Geek de la tecnología, en busca de la mejora y aprendizaje continuo.
Ingeniero en ciencias de la computación, Postgrado en Análisis y predicción de datos
La idea de tener un espiritualidad fuerte es algo que creo más cada día. Hay personas que encuentra esta espiritualidad en la religión, y en mi caso crecer en una familia que practica una religión cristiana como la católica.
Pero es un problema que te fuercen a practicar y creer enseñanzas dirigidas, escritas y promulgadas por hombres para hombres y que cuando preguntas el porqué de las cosas no te pueden explicar. La religión cristiana esta desactualizada y cada vez mas las nuevas generaciones tienen más problemas para identificarse con la problemática expuesta, más todavía con ese lenguaje arcaico que es la traducción de la interpretación del cuento oral escrito facil 100 años después de que paso.
La fe cristiana te enseña que tienes un propósito, que hay alguien que te ama y te diseño para algo, que si te portas bien tendrás una vida eterna con todo lo bueno, pero para eso tienes que sufrir ahorita.
Cuando eliges no creer en la religión, escoges renunciar a la idea del propósito y amor incondicional, también renuncias al castigo eterno. Cuando escoges entender que somos intransigentes, que no tenemos propósito real, que en realidad la vida no se trata de nosotros sino somos meros espectadores de lo que pasa. Que la vida se acaba en un parpadea y ahí queda, no hay mas. Entendemos que no tienes deuda con nada ni nadie.
La gente dice que cree en dios pero no en la religión, pero creen en un dios descrito por la biblia, un texto creado por hombres, escrito años después que pasaran los sucesos y basado en cuentos orales. Todos hemos jugado teléfono descompuesto y sabemos cómo termina, no?
La religión cristiana debería reinventarse, actualizar sus textos y tradiciones. Adaptarse a nuevas generaciones. La ley de la vida es eso, adaptarse o morir. Probablemente yo no alcanse a ver morir el cristianismo, pero estoy seguro que un dia lo hara sino deciden actualizarlo. La cuestión ahí se vuelve interesante y estoy seguro quebrantaria la fe de muchos, porque quien estaría a la altura de modificar tradiciones y escrituras antiguas? Eso partiria la fe de muchos y fragmentaria muchos mas a sus creyentes, así que no veo un futuro prometedor a la religión convencional.
De seguro surgirá algo nuevo, con otro nombre pero más de lo mismo. Porque es una industria trillonaria, quien dejaría ir ese dinero y el control sobre los pobres y desamparados.
Todos necesitamos un refuerzo de que no estamos solos y nos aman. Asi sea mintiendonos a nosotros mismos, incapaces de explicar las bases de lo que creemos, pero eso nos da paz mental y es suficiente. Yo no me considero superior por ni un poco al no creer en la religión o el dios cristiano, solo no encontré paz ni confort en esas creencias, solo encontre promesas de tormento e incongruencias contra la naturaleza humana. Si tu espiritualidad esta ahí, en el cristianismo, te felicito, se fuerte y construye más sobre ella. Lo que te haga bien, esta bien.
Habrás escuchado la palabra responsive muchas veces. Es pocas palabras te lo explico, es la habilidad de tu sitio web se adapte a cualquier tamaño de pantalla sin romperse (tanto visual como funcionalmente).
¿No te ha pasado que entras a un sitio web desde el celular y parece que rompiste algo en el sitio web, o algo no funciona, o algún botón o element se sobre pone? Ese sitio la falla algo a su responsiveness.
¿Porque es algo deseado? Cubres dos necesidades de un solo producto. Desarrollas un sitio para computadores, laptops o pantallas grandes en general y un sitio que se adapte a pantallas pequeñas, celulares, ipads, kioskos, etc. Esto es algo necesario hoy en día, tomando en cuenta que el mayor trafico de tus clientes potenciales viene de un móvil.
Entonces te preguntaras, ¿Cómo hago el mío responsive? Manera fácil: contrata a un experto como yo 🙂
Manera difícil: aprende css, diseño, ux ,etc. Si ya sabes todo eso, se te hará mas fácil, tu fiel amigo sera un componente del lenguaje css llamada **media querys**. Esto te permite delimitar o especificar un tamaño de pantalla especifico y aplicar reglas de diseño (Css) especificas para ese tamaño de pantalla. Claro los medias querys te pueden servir para muchas cosas más complejas.
Así que ya lo sabes, cuando te pregunten que es responsive, ahora ya lo sabes.
Próximamente hare un tutorial mas técnico con ejemplos de cómo se puede llevar a cabo esto. Suscribete al news letter
Soy un ingeniero de software con mas de 4 años de experiencia laboral, me gradué en el tiempo previsto de la carrera lo cual habla de insistencia, compromiso y oportunidad, más que de mi capacidad. Me considero una persona promedio.
Inicie un master en Data Science en la universidad Galileo de Guatemala. Porque? Tengo la idea de seguir superándome, así encontrar mejores oportunidades laborales, ganar más dinero, e ir progresando junto a los míos. Se que existen mas postgrados aplicable a mi carrera pero este fue análisis
Cualquier cosa relacionada a redes un rotundo no, no fue lo mío durante mi carrera universitaria
Cosas relacionadas al management. Claro atrae por ser puestos de gerencia o jefes, pero de pensar llevar clases cómo contabilidad me desinflan enormemente.
Seguridad informática, se me hace un mundo lleno de burocracia y edificios grises y tristes llenos de gente en traje frustrada.
Entonces quería algo técnico que supusiera una mejora salarial al final. Mi experiencia fue emocionante pero debo decir que no sabía al 100% que me esperaba, me tope con un programa mas dirigido a personas no técnicas con background estadísticos que a personas técnicas con no background estadísticos.
Las clases de programación o técnicas eran a pasos de bebe, desde cero, pero las clases estadísticas ya eran avanzadas. Esto llevo a frustración en estadística, y aburrimiento en programación.
Termine exitosamente el postgrado inicial, pero me quede con un sabor amargo, puedo hacer todo en teoría, obtendré los resultados esperados, pero no entiendo el porque, resulta que necesitaba una fuerte base de algebra lineal. Hubiera sido un buen requisito llevar un curso previo al master.
Aunque este primer acercamiento no fue el deseado, creo que hay mucho potencial en el area y sera algo interesante de volver estudiar en un futuro cercano
Has querido iniciar esa idea de tener un blog, o quieres probar una idea de negocio inicial o solo quiere conocer el proceso, aquí te lo explico.
Todo sitio web tiene al menos 3 partes principales:
Nombre de dominio
Necesitamos una dirección fácil de recordar que describa bien nuestro concepto. Estos nombres de dominios son las direcciones web que conocemos, por ejemplo Mark Zuckerberg o alguien en facebook, en algún momento de su negocio compro facebook.com, en algún momento Steve Jobs o alguien en Apple compro el dominio apple.com.
Como funciona
Los nombres de dominio son la manera fácil de encontrar una página web. ¿Te has preguntado alguna vez como es que el navegador siempre encuentra la dirección correcta? Porque recuerda, las computadoras son identificadas por una dirección, pero no es una dirección con letras, es una colección de números y es conocida como dirección IP. La intención de este post no explicar todo con detalles demasiados técnicos.
Entonces el nombre de dominio lo relacionamos a una dirección IP, en donde estará nuestro servidor, y asi poder mostrar al mundo nuestra idea del billon de dólares.
Estos nombres de dominio lo compras de sitios como godaddy, namecheap, entre otros. Los precios varian desde $1 hasta miles o cientos de dólares. Todo dependen del nombre que busques y si alguien ya lo adquirió y te lo quieren revender.
Servidor
Antes de era «cloud» o de la «nube» si alguien quería una pagina o aplicación web tenía que montar su propio servidor, esto implicaba comprar una computadora bastante poderosa en cuanto a sus especificaciones técnicas, pero no era solo eso, cuando tienen mucho poder, eso significa mucho calor, necesitabas un cuarto especial para el servidor con su propio aire acondicionado, y no basta ahi, esto necesita mantenimiento, necesita rutinas de seguridad y redundancia de datos, y con esto ya suena bastan complicado no?
Por fortuna ya no estamos en esos tiempos. Ahora hay varios servicios «cloud» o en «la nube» donde nosotros alquilamos un espacio es un servidor por una cuota mensual (si, así como netflix) y ellos nos dan una dirección IP donde estarán nuestras cosas. Usando estos servicios no necesitamos preocuparnos de nada técnico, solo pagamos y tenemos acceso. Si te preocupan aspectos mas específicos como seguridad de datos o redundancia de datos ya puedes comprar que ofrecen los diferentes distribuidores de estos servicios. Por mencionar algunos tenemos:
AWS
Digital Ocean
Vultr
Linode
Como en cualquier otro mercado o servicio, cada uno tiene sus ventajas y desventajas, sus precios y sus features. El mas barato es vultr con un servicio de $2.5 al mes, que para una fase inicial o pruebas esta bastante bien, no recomendado para uso oficial o en producción.
En este punto ya tendríamos un nombre de dominio y una dirección ip (servidor en la nube), pero se necesitan conectar, para esto vamos a la pagina del distribuidor del nombre de dominio y buscamos alguna opción que diga dns manager, o simplemente dns, agregaremos una nueva entrada en los tipos AAA, donde nos pedirá el nombre de dominio a asignar y una dirección IP a asociar. Guardamos los cambios y esperamos. Estos cambios tardan en propagarse, puede ser entre 1 hora a 24 horas.
Ya tendríamos nuestra dirección web funcionando, pero y el contenido?
Pagina web
Dentro de nuestro servidor en la nube, tendremos que instalar nuestro servidor web preferido. Esto es un programa que se encarga de traducir dirección en contenido HTML que tu navegador ya puede presentar con estilo y funciones especificas. Entre estos los mas conocidos y usados son:
Nginx
Apache
Al combinar estas tres cosas ya tendrás una pagina web funcional. Claro hay muchas mas cosas por ver. Si es una aplicación web, se necesita una base de datos a usar. Si se espera mucho trafico se podría implementar un balanceador de carga. Si se quiere utilizar alguna función en tiempo real se puede implementar una base de datos no relacional como redis. Debería implentarse algun certificado SSL para responder al protocolo HTTPS por seguridad de los datos, hay opciones gratis como lets encrypt. También tomar alguna opción para redundancia y backups de datos. Y muchas cosas más.
Cada caso es único y tiene sus propias particularidades. Si tienes experiencia en estos temas lo recomendado es haz tus pruebas, solo así aprenderás.
Si no tiene experiencia técnica o el tiempo para hacer todo esto te recomiendo buscar asesoría o un experto en el tema, como yo :), puedes revisar mis proyectos en mi cuenta de github o linkedin.
Si llegaste hasta aquí gracias por tomarte el tiempo de leer, y déjame tu opinión al respecto, que otro aspecto importante debería tomarse en cuenta.
Si eres un desarrollador habrás escuchado esta frase varias veces, debemos hacer código limpio. Pero no les parece que un adjetivo como limpio, es subjetivo?
Es obvio (y si no es obvio para ti probablemente no te ha tocado leer código malo, feo, espaguethi o como le quieran llamar) que se necesita crear, editar actualizar código que sea legible y que sea fácil de entender.
Todos estamos en contra de las variables llamadas a, b, cdpTraxddo peor. De métodos o funciones que tienen a cientos de lineas, entrelazadas, mal nombradas, con código duplicado.
Un proyecto grande llegara al punto de: mejor gastar recursos y tiempo en iniciar desde cero que arreglar lo malo. Es un problema tan real como que los cerdos no vuelan. Y las repercusiones de estos problemas son enormes, imagina decirle al cliente todo tu dinero y tiempo invertido en este proyecto inservible fue desperdiciado, no podemos salvar tu inversión o tu negocio. Imagina ese momento en el que le das la noticia a alguien a quien le has cobrado miles de dólares, al que le prometiste ese software que resolvería todos sus problemas, que sería escalable, que le daría retorno de inversión, que resolvería la paz mundial, y pues, … ya no sirve, mejor deséchelo.
La importancia de esto no es cuestionable, es algo necesario y que todos los desarrolladores deberíamos saberlo como base. Si bien es cierto que no hay una regla absoluta de que es el código limpio, todos sabemos lo que es mal código. Los siguientes consejos los doy de mi lectura del libro Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin).
Ley de LeBlacn: Despues es igual a nunca. Cualquier cosa que pienses «luego lo hago» se traduce a que nunca lo haras. Surgiran nuevos bugs, te asignaran nuevas cosas, y tu deuda tecnica ira aumentando. Haz algo al respecto.
La lógica debe ser directa.
El código debe ser especifico y no especulativo.
Preocuparse por la legibilidad, prestar atención a los detalles.
No tener duplicados, cuando algo se repite es una señal que tenemos una idea que no terminamos de representar correctamente.
Que el método o objecto no haga mas de una cosa. Similar la S de los principios SOLID. Cada elemento tiene una y solo responsibilidad.
El código debe ser evidente, sencillo y atractivo, que cuente una historia, de principio a fin.
Ley del boy scout: dejar el campamento mas limpio de lo que se ha encontrado.
Cuando se ve código malo, no es necesario refactorar todo, empieza por cambios pequeños, cambiar de nombre a una variable, separar un método en otros métodos mas especificos.
Con esto terminaría la parte 1 de una serie de post hablando sobre este tema.
¿Cuál crees que es la importancia del código limpio? Déjame tu opinión abajo.
Tienes una laptop de hace algunos años atrás que quisieras revivir? La idea es sencilla, reemplaza tu viejo disco duro mecánico (HDD) por uno de estado solido (SDD).
HDD y SDD. Fuente: http://www.laptops4college.com/hdd-vs-ssd-whats-better/
Las diferencias principales son que el disco mecánico funciona con magnetismo, por lo tanto puede generar ruido y vibración pues tiene partes móviles que giran, imaginalo como un toca discos, tiene una aguja que va leyendo la información. Ventajas de este tipo de datos que es mas económico que un SSD. Sin embargo, la velocidad de escritura para un SSD es mas de 4 veces mas rápida que un HDD, este funciona con una combinación de microchips, que podría considerarse como la evolución de las memorias USB.
Lo ideal es llegar a combinar los dos tipos de discos. Esto en una computadora desktop no sería problema, solo se compraría el componente se conecta y ya, pero que pasa si lo que tenemos es una laptop?
Recientemente descubrí este caddy para agregar otro disco a nuestra laptop. La idea es que si nuestra laptop tiene una unidad lectora de discos, puede ser reemplazada con este dispositivo que tiene toda la forma y dimensiones de un lector común pero que en su contenido tendría nuestro disco HDD. ¿Porque usar el HDD en esta ranura y no el SDD? Porque el conector que tiene el lector de discos es tipo SATA 2, que solo puede llegar a 250mb/s, con lo cual limitaríamos la velocidad de nuestro disco SSD que puede llegar a mas de 500mb/s.
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