miércoles, 19 de diciembre de 2018

Lo que aquì se escribe es para siempre

Me gusta escribir aquì. Desde hace muchos años tengo la manìa de observar distintos tipos de contenidos que la web mantiene dispobible y que sobreviven al paso del tiempo, desafiando todo preconcepto de caducidad que se creìa de manera erronea tenìan ciertos contenidos publicados.

La grandes marcas o los titanes de internet, como ser Google, en donde estoy escribiendo este texto, estàn demostrando que su poder de almacenamiento es ademàs de infinitamente inagotable, tambièn parecerìa ser un eterno colage de expresiones de toda la historia de la web pintada en blogs, artìculos, pàginas que Google ofrece como sistemas de publicaciòn o difusiòn.

Desde hace un año, he vuelto a utilizar Blogger.com de Google. Tal como lo venìa corroborando siempre, en mi cuenta estaban otros blogs de 2008 o anteriores. Google y las grandes empresas lìderes en internet, conservan de manera inmutable, impecable e intocable, todo el contenido sin que desaparezca por razones ajenas a la voluntad del propietario de la cuenta. A diferencia de otro contenido publicado en sitios webs o hosting que si no se cuidan, se abonan los costos de servicios o se protegen los datos, los mismos desaparecen quedando solo registrados en el cachè de los motores de bùsqueda, siendo enlaces rotos hacia la nada.

A veces me pongo a buscar informaciòn en la red y me doy cuenta de que la misma la estoy encontrando alojada en sistemas en donde la informaciòn queda publicada de manera eterna. Luego me pongo a mirar en què fecha fuè publicada. Muchas veces me sorprendo con la antiguedad y luego me pongo a pensar si la persona que lo ha publicado aùn estarìa viva.

Tambièn en estos tiempo ya es habitual ver que hay redes sociales que conservan abiertos ciertos perfiles de personas que ya no pertenecen o no se encuentran existiendo en este mundo material. Hay mucho contenido que ha sido escrito por personas que ya han muerto, por empresas que ya desaparecieron. Aùn asì, mucho de ese contenido perdura intacto como si fuese a estàr allì eternamente.

Yo soy una de esas personas que cree que todo lo que se escriba por ejemplo aquì, quedarà escrito eternamente. Confìo en la evoluciòn de la humanidad. Creo que pase lo que pase todo lo que estè escrito en estos sistemas, serà cuidado por todas las empresas, corporaciones o personas que sean responsables de hacer los backups. Llegarà un punto en el cuàl la misma tecnologìa se cuidarà a si misma y la eficiencia de todo aquel sistama creado para almacenar informaciòn, cada vez serà màs y màs eficiente.

Todo lo que aquì escribo creo que serà eterno, por eso me gusta escribir aqui.

Ricardo Martìn Pizarro.
Diciembre de 2018

Preparando GNU/Linux para Unik RPI


Requisitos

Raspberry Pi 3 - Wifi - Bluethoo y una SDCARD de 8Gb o superior. Conecciòn a Internet en principio por cable. Luego de configurar el OS con alguna SSID Wifi se podrà prescindir de la conecciòn cableada.

Paso 1

Introducir SDCARD de 8Gb o superior en el celular.  Ir a Ajustes->Almacenamiento, seleccionar SDCARD o Tarjeta SD y formatear y por ultimo HECHO.


Paso 2

Instalar RASPI Card Imager en el telèfono celular Android.

Enlace a RASPI: https://play.google.com/store/apps/details?id=com.redrobe.raspicardimager&hl=es

Ejecutar RASPI y seleccionar RASPBIAN STRECH 352Mb y presionar WRITE SD.


Paso 3

Intertar la SDCARD en la RPI. Conectar la salida HDMI y alimentar la RPI para iniciar el booteo del sistema.

Nota: En el caso de no disponer de un transformador para alimentar la RPI, la misma se puede alimentar desde cualquier puerto USB de un SmartTV, PC de Escritorio o Notebook.

Paso 4

Cuando el promp del sistema requiera login, ingresar con nombre de usuario "pi" y clave "raspberry".

Conectar el cable de red para tener internet disponible.

Actualizar repositorios con
sudo apt update

Actualizar el sistema con
sudo apt upgrade

Instalar el Entorno de Escritorio OpenBox y LightDM.

Linea de comando de instalaciòn:
sudo apt install git openbox xinit xterm menu python-xdg lightdm

Paso 5

Iniciar manualmente por primera vez openbox con el comando "startx"

Paso 6

Presionar boton derecho del mouse y seleccionar Terminal Emulator.

En el Terminal Emulator ejecutar
sudo raspi-config

Habilitar la aceleraciòn gràfica OpenGL: Ir a Opciones Avanzadas->GL Drivers->KMS
Habilitar el Inicio Automàtico de Usuario y de OpenBox: Ir a Boot Option->Autologin y a Boot Option->Desktop GUI

Finalizar el Asistente de Configuraciòn raspi-config y reinicar RPI.

Paso 7

Preparando para Compilar Unik Qml Engine

Desde el Terminal Emulator crear la carpeta "/home/pi/nsp"

Acceder a la carpeta creada con
cd /home/pi/nsp

Descargar desde GitHub el Proyecto Unik Qml Engine
git clone https://github.com/nextsigner/unik.git

Acceder a "/home/pi/nsp/unik/rpi_resources" y ejecutar
sudo sh install_qt5_rpi3.sh

Paso 8

Compilar el Proyecto Unik Qml Engine con QtCreator

$: qtcreator /home/pi/nsp/unik/unik.pro

Compilar el proyecto en el modo RELEASE. Esto crearà el ejecutable /home/pi/unik/unik

Paso 9

Configurar sistema para iniciar unik automaticamente.

Crear el archivo .unikrc en la carpeta principal del sistema.

#!/bin/bash
/home/pi/unik/unik -folder=/home/pi/nsp/qml-rpi-gpio-1 -git=https://github.com/nextsigner/qml-rpi-gpio-1.git


Desde el Terminal Emulator editar el archivo /etc/xdg/openbox/autostart

sudo nano /etc/xdg/openbox/autostart

Agregar el final del archivo la siguiente lìnea de comando.

echo 'source ~/.unikrc' | tee -a ~/.bashrc
xterm -geometry 80x30+-3000+0


Pasos Extras Opcionales

Capturar Pantalla con Ffmpeg

ffmpeg -f x11grab -s 1184x624 -r 25 -i :0.0 -c:v libx264 -preset fast -pix_fmt yuv420p video.mp4

Iniciar VncServer

Crear el archivo /etc/systemd/system/vncvirtualdesktop.service

[Unit]
Description=Start VNC Server Virtual Desktop

[Service]
Type=oneshot
ExecStart=/bin/su pi -c '/usr/bin/vncserver -randr=1024x600'
ExecStop=/usr/bin/vncserver -kill :1
RemainAfterExit=yes

[Install]

WantedBy=multi-user.target

Ejecutarlo con la siguiente linea de comantos

sudo systemctl enable vncvirtualdesktop.service

Nota: Este metodo de VncServer se ha probado en este contexto. Luego de habilitar VNC desde raspi-config, se ha podido utilizar aplicaciones QML o con cualquier GUI desde Macos con VncViever.

Resumen

Todos estos pasos permitirian que la RPI inicie con Unik Qml Engine corriendo con la aplicaciòn Qml anidada UnikastServer que puede ejecutar còdigo Qml de manera remota. El còdigo Qml se puede enviar desde otro ordenador con la aplicaciòn anidada UnikcastClient dentro de Unik.



jueves, 13 de diciembre de 2018

Unik es una fuente interminable de ideas

En estos ùltimos dìas, entre tantos asuntos por atender, he creado un nuevo mòdulo para Unik. Hacer esto me pone feliz!. Por momentos me doy cuenta que Unik me resuleve muchos inconvenientes y acelera la producciòn de otros proyectos, estoy muy conforme por ello, cada vez que me pongo a crear algun modulo para Unik, es una manera de volcar una idea y unik me ha permitido llevar dichas ideas a cabo en el menor plazo de tiempo posible.

Uno de mis mayores problemas es que se me ocurren ideas permanentemente, esto no significa que cada idea sea buena o merezca ser llevada a cabo. Por lo general mis ideas resultan ser lo contrario a una soluciòn o a un aporte positivo porque me impiden concentrarme en aquellas buenas ideas en las cuales estoy ocupando el tiempo. Tengo entendido que esto se debe a un transtorno de la personalidad llamado Esquizoide Esquizotìpico. Al parecer este transtorno imposibilita que una persona pueda mantenerse concentrado en una idea debido a que permanente mente su cerebro està elaborando nuevas ideas y cada ocurrencia el esquizoide considera que es mejor que las ideas anteriores lo que lo conduce a abortar la idea anterior para enfocarce en la idea màs  reciente, idea que abortarà a la brevedad porque se le ocurriràn ideas nuevas que segùn èl seràn superiores y por ello deben ser atendidas y llevadas a cabo.

Lo bueno de todo esto, es que dedicarme a la programaciòn me ha permitido controlar este y casi todos los transtornos que llevo encima. Desde hace tiempo que vengo poniendo mucha atenciòn a las ideas sobre las que estoy invirtiendo tiempo y dedicaciòn. Son tantas que he visto que le estoy dedicando tiempo a las que realmente son mejores y no las estoy abandonando.

Por ejemplo mi idea principal llamado Unik Qml Engine (el nombre al principio no me convencìa pero siempre que lo reviso llego a la concluciòn de que sus tres palabras son ni màs ni menos las que deben ser). Esta idea se me ocurriò a fines del año 2017. Desde hace 1 año aproximadamente que he comenzado a lanzar versiones beta de unik. Tanto en el repositorio de GitHub como en mis equipos aùn conservo instaladores o còdigos de aquellas primeras versiones. Comencè con las versiones 1.47 aproximadamente porque la idea de unik la tuve que ir programando en su comienzo en los tiempos libres sin poder crear ni siquiera los instaladores, solo probaba su còdigo fuente directamente desde el IDE Qt. Apròximadamente 47 semanas despues de hacer pruebas exporàdicamente, en su primer año  la vesiòn 1 es por el primer año el numero 47 es correspondiente a su semana de creaciòn.

Actualmente unik està en su versiòn 2.49. Sigue en su versiòn beta porque quiero esperar a que se utilice màs a fondo, se depuren màs todas sus funcionalidades en todos los entonrnos y contextos posibles. En pocas semanas ya estarè lanzando la primer versiòn 3 de unik. Aùn no sè si serà una versiòn Release. En 2019 eso se verà. En la medida de lo posible esto lo podrìa hacer si contara con màs apoyo por parte de personas y empresas interesadas en apoyar el proyecto de tal modo que se invierta algo de tiempo y dinero en publicitar la primer versiòn estable de unik.

Volviendo al asunto de las ideas. Unik es una muestra màs de que estoy muy bien enfocado en aquellas ideas que son realmente buenas. Cuando las ideas son buenas, terminas dedicàndole màs tiempo y la idea toma màs fuerza y se convierte en una mejor idea y genera màs y mejores ideas y entras en un nuevo circulo vicioso de nuevas y variadas ideas de las cuales no quieres descartar ninguna!. En esa etapa estoy hoy en dìa. Tapado de ideas y atendiendo 10 frentes en simultaneo. Nada sano para mì.

Como concluciòn, se puede decir que yo no soy un Esquizoide Esquizotìpico. Soy una persona que se ha puesto a pensar buscando buenas ideas y he estado mucho tiempo descartando malas ideas para llegar a una buena idea. El proceso de embarcarme en malas ideas me ha servido para fracasar y equivocarme ganando experiencia para estàr màs preparado para las mejores ideas de hoy dìa que requieren de mayor experiencia.

Asì estoy concluyendo el 2018. Gracias a Unik rodeado de buenas ideas. Como por ejemplo Qmlandia, el Primer y Ùnico Curso Interactivo de Qml en Español. Qmlandia es un mòdulo o aplicaciòn que funciona de manera anidada dentro de Unik. En las pròximas horas debo culminar la secciòn que aborda el tema o enseña sobre el elemento QtQuick Image{}. Ya cuenta con 4 mòdulos y 22 secciones entre las cuales se explican Què es QML, Què es el elemento QtQuick Item{}, Rectangle{}, Text{} y otras secciones màs.



Otra gran idea a la cual pienzo dedicarle mucho tiempo es a los mòdulos de Unik que operan con WebSocket Server y Client para ejecutar cògigo QML a distancia. Dichos mòdulos se llaman UnikastServer y UnikastClient. Actualmente se encuentras sus primeras versiones disponibles, las mismas funcionan correctamente, has sido probadas en LAN, aùn falta que sean probadas de manera ramota en una red externa.



Por ùltimo y tal como contaba al principio, he dedicado unos dìas a crear un Asistente para la creaciòn de Aplicaciones de Escritorio Sqlite. El mòdulo se llama Qdm-Sqlite el cuàl por el momento tiene disponible un submòdulo llamado Qdm-Sqlite-1.



Desde ya mi agradecimiento a todos los que me apoyan. Espero poder continuar avanzando con todos estos proyectos. Los que me conocen ya saben que es muy difìcil para mì, pero tambièn saben que no me rendirè facilmente.















Estoy cansado

Estoy cansadoooooo!!!!

 Cansado, cansado, agotado, cansado, cansado, destruido, agotado, dolorido, arruinado, hecho mierda, fulminado, cansado, cansado, cansado, harto, cabreado, dolorido, descangayado, apabullado, tiroteado, golpeado, noqueado, coscoteado, hundido, aplastado, enculado, cansado, cansado, cansado, inflado los guevos, cagado, muerto, herido, en coma 10, en terapia intensiva, aplastado, cansado, cansadìsimo, podrido, maltratado, enojado, resentido, quisquilloso, mañatado, atascado, aburrido, ahogado, perturbado, exausto, deprimido, dinamitado y estresado. Pero siento un felicidad infinita por sentir la satisfacciòn de haber logrado cada objetivo poniendo todo lo mejor de mì, sin guardarme nada, luchando hasta el final.

lunes, 3 de diciembre de 2018

Ha llegado Diciembre de 2018

El año està llegando a su fin. 2018 ha sido un año màs del cuàl me puedo sentir orgulloso. Es otra etapa en la cuàl se concretan objetivos principales que me he trazado al comienzo.

En cuanto a la parte productiva, teniendo en cuenta las limitaciones tanto de salud, de escaces de recursos humanos y tecnològicos, puedo confirmar que se han realizado todo tipo de avances. Si bien es cierto que los frentes a atender han sido varios, lo que disminuye la productividad, aùn asì la alta intensidad, la voluntad, la entrega, la constancia y todas las virtudes que me caracterizan, me han permitido avanzar de manera contundente.

El nivel de experiencia ha crecido en todos los campos. Por momentos la hyper actividad ha resultado nociva para la salud, a veces llegando a extremos que no deberìan reiterarse, de ello tambièn se aprende. La suma de experiencia es a todo nivel y eso es muy gratificante aùn sintiendo el dolor y los golpes de haber transitado un camino duro, aspero y cruel.

En estos ùltimos dias de noviembre de 2018, he puesto mi energìa en reotmar fuerzas para culminar el año a todo ritmo. Una parte de mì me suplica un descanso reparador, lamentablemente la desiciòn està tomada. En estos primeros dìas de diciembre estarè descansando pero lo mìnimo necesario, la intenciòn no es descansar de manera plena, estarè juntando fuerzas para aportarle a 2018 20 dìas màs de pura intensidad. Luego de ello sì, me tomarè el descanso merecido.

Lamentablemente para mì, las intenciones para 2019 son parecidas a las de este año. Serà un año duro, programando sin parar porque el desafìo asumido asì lo requiere durante estos años. Asì serà hasta que los objetivos finales se concreten de manera contundente.

Este tipo de objetivos relacionados con el programaciòn informàtica, no son unioformes, van mutando y tomando caminos inpensados. Por màs planificaciòn previa, los desafìos asumido en algunos casos tienen una proyecciòn indefinida. A veces podemos saber de donde comenzamos, por donde vamos, hacia donde queremos llegar, pero casi nunca sabemos cuando llegaremos a destino.

Asi estàn las cosas, asì son y poco se puede hacer para modificarlas. Todo tendrà sentido ùnicamente si se toma el camino y las desiciones correctas. En este caso la desiciòn es programar sin parar hasta que la satisfacciòn relacionada con la calidad de los softwares programados.

LLegado el fin de año, reportarè cual es la situaciòn, esperemos terminar a todo motor. Dejarè aquì mi impresiòn.

sábado, 20 de octubre de 2018

La soluciòn es sentirse a gusto

Desde hace dìas, mejor dicho desde hace varias horas continuas de una seguidilla infinita de horas que no sè bien a què parte de què dìa o de cuàntos dìas pentenecìan, inmerso en un pantano de tiempo al cuàl he disfrutado como una piscina en pleno verano, he estado escribiendo còdigo para unik. He visto que tenìa esos tipos de problemas que a uno lo persiguen periòdicamente.

Ya venìa pensando que le darìa una soluciòn definitiva. Haste que el momento llegò, del peor modo pero lo bueno es que ocurriò. Esos pequeños problemas eran que el modo en que unik recibìa los paràmetros eran muy limitados y algo tedioso al momento de preparar ciertas configuraciònes para unik. Fuè asì que me he puesto a hacer lo que tenìa planeado.

 Para ser sincero, no lo tenìa planeado. Sabìa que debìa implementar una metodologìa diferente pero no sabìa cuàl. Como sirmpre sucede, llegado el momento de darle soluciòn a algo, en el momento ya me doy cuenta còmo hacerlo. Tambièn es cierto que mientras comienzo a desarrollar la posible soluciòn, suelo sentir algo de inseguridad o desconfianza en haber encontrado la mejor soluciòn.

Por lo general casi todas las cosas que hago en la vida siento esa inseguridad que me acompaña, no es desconfianza, digo que no tengo la seguridad plena de que las cosas salgan bien, a pesar de ello, creo que eso es algo normal, no existe nadie que tenga la plena seguridad de lo que sucederà en el pròximo segundo, minùto u hora.  Por eso siempre avanzo a paso firme pensando que llegado el momento me enterarè si la posible soluciòn resultarà funcional o no.

A las pocas horas, la soluciòn comenzò a decir presente, a decir -acà estoy-, de manera muy contundente. He sido consciente de que que una sonrisa se dibujaba en mi rostro al momento de ver los primeros resultados. Una vez màs he vuelto a experimentar el èxtasis que me produce sentir que mis pensamientos y mis sentimientos se fusionan en un instante de gloria y satisfacciòn absoluta.

 A veces me preguntan còmo es posible que yo me dedique a este tipo de actividad que a los ojos de los demàs parece tan aburrida, opaca y sin sentido. Yo siempre respondo que la mejor soluciòn a todo problema existencial, de caracter vocacional, laboral, de entretenimiento, de ocio, placer o hobbie, para todo ello la soluciòn es sentirse a gusto. Estar convencido de estar en el lugar que queremos estar y haciendo lo que queremos hacer. Asì intento responder a las dudas de los demàs, tambièn tengo otras razones y explicaciones que en mi caso son màs especìficas.

Me dedico a esto entre muchos otros motivos porque siempre estoy intentando repetir estas experiencias que son fugaces y repentinas, pero son acontecimientos que me motivan a seguir por el camino que he elegido, que me apasiona, el que me hace sentir y me convence que tengo mi lugar en el mundo, un lugar programado caracter a caracter, byte a byte, intentando desafiar al destino para lograr trascender màs allà del momento en que la misma existencia produzca un aplication crash final.

La manera de trascender seràn estas palabras que nunca jamàs desapareceràn. Por eso las escribo y por eso las estàs leyendo.

 @nedtsigner 20/10/2018

lunes, 8 de octubre de 2018

Estamos Desarrollando Qmlandia

qmlandia

Aproximadamente a mediados de 2018, hemos comenzado con Qmlandia. Talves muchos piensen que este nuevo proyecto nos estè distanciando de Unik Qml Engine. Es todo lo contrario. Este nuevo proyecto depende de unik, està siendo desarrollado en unik, funciona dentro de unik y està avanzando de manera contundente gracias a unik.

Qmlandia, en principio es un Curso de Qml. Eso no es todo. Es mucho màs que eso. Es un Curso Interactivo sobre QtQuick, QML y unik. El Primer y Ùnico Curso de QML en Español. Es de Uso Libre, OpenSource. Todo su còdigo fuente està alojado en Github.com y cualquiera lo puede editar a su gusto y necesidad.

Cuando unik llegò a una etapa de desarrollo cercano a la plenitud, era necesario comenzar a crear un proyecto de proporciones que ponga a unik a correr al màximo de su rendimiento. Se pensò en algo màs que un simple tuturial. Se creò Qmlandia, para que sea uno de los primeros proyectos potentes que demuestren que unik es una herramienta ùtil, dinàmica y confiable.

Hay que admitir algo. La creaciòn de Qmlandia en principio era una idea que se ponìa en escena para depurar y mejorar unik, para que se conozcan cuàles eran los puntos dèbiles y fuertes de unik. Recordemos que unik ha tomado desde sus inicios el complejìsimo desafìo de operar plenamente tanto en GNU/Linux, Windows, Macos y Android. Todo resultò segun lo esperado. Qmlandia ha exigido a unik y surgieron solo algunos errores que ya fueron solventados.

Lo màs valioso de todo este camino transitado es que gracias a unik, Qmlandia està convirtiendose en un proyecto de gran potencial y futuro. Asì mismo, Qmlandia ha servido para que unik se fortalezca incorporando nuevos mètodos y funciones que lo llevan a un nivel superior.

El camino ya està trazado. De no surgir inconvenientes se seguirà a fondo con el desarrollo de Qmlandia, se irà manteniendo el proyecto unik por un largo perìodo de tiempo.

Para ver el en què consiste Qmlandia hay que ir a https://github.com/nextsigner/qmlandia

sábado, 21 de julio de 2018

Crear nùmero de Versiòn de Aplicaciòn con QMake

Cuando estamos desarrollando software, ya sea un programa o aplicaciòn, es necesario asignarle a cada reproducciòn o nueva compilaciòn de dicho programa, un nùmero ùnico de versiòn.

Dependiendo en que entorno estemos realizando el desarrollo, debemos generar o crear el nùmero de versiòn. Este nùmero, debe contar con algunas caracterìsticas que no deberiamos omitir. Una caractarìstica es que siempre debe ser superior que el nùmero generado anteriormente para el mismo software. Una caractarìstica no es obligatoria pero es recomendable es que el nùmero de versiòn nos deberìa indicar de algùn modo cierta informaciòn que haga referencia a el momento, año, etapa o serie en la que ha sido creado el programa desarrollado conjuntamente con el nùmero de versiòn.

Veamos còmo hacer esto en el Framework Qt

En el caso de que estemos utilizando el Framework Qt, una manera de generar numeros de control de versiòn desde qmake, es utilizando un còdigo como el siguiente:

VERSION_YEAR=2016
VERSION_MAJ1=$$system(date +%Y)
win32 {
    VERSION_MAJ= $$system("set /a $$VERSION_MAJ1 - $$VERSION_YEAR")
    VERSION_MEN1= $$system("set /a $$system(date +%m) + $$system(date +%d) + $$system(date +%H) + $$system(date +%M)")
} else:unix {
    VERSION_MAJ= $$system("echo $(($$VERSION_MAJ1 - $$VERSION_YEAR))")
    VERSION_MEN1= $$system("echo $(($$system(date +%m) + $$system(date +%d) + $$system(date +%H) + $$system(date +%M)))")
}
greaterThan(VERSION_MEN1, 99){
    VERSION_MEN2=$$VERSION_MEN1
}else{
    VERSION_MEN2=0$$VERSION_MEN1
}
APPVERSION=$$VERSION_MAJ"."$$system(date +%W)$$VERSION_MEN2
message(App Version $$APPVERSION)
write_file($$PWD/version, APPVERSION)

Este còdigo qmake generarà una variable en cada momento de compilaciòn de nuestra aplicaciòn, para ser màs especìfico, digamos que este còdigo se ejecutarà cada vez que se ejecute qmake. No confundirse con la ejecuciòn sin compilaciòn que qmake realiza cada vez que guardamos cambios en el archivo del proyecto (.pro) y se realiza la emisiòn de la salida de mensajes en el panel issue. Solamente con guardar este còdigo qmake en el IDE Qt, esto no basta. Para ejecutar de manera plena este còdigo es necesario compilar el proyecto.

El nùmero generado lo he estructurado con 3 valores del siguiente modo.

Numero 1: Años trasncurridos desde el inicio del proyecto
Numero 2: Nùmero de semana
Numero 3: Nùmero resultante de la suma del mes actual, hora actual y minuto actual.

Ejemplo: versiòn 2.29077

Este nùmero de versiòn representa lo siguiente. La compilaciòn se realizò el tercer año (dependiendo si queremos comenzar desde la versiòn 0 o 1), en la semana 29, el dìa 30 a la hora 20 con 27 minutos (30+20+27=77).

Este mètodo nos posibilita diferenciar un numero de versiòn de otro a cada minuto.

Explicaciòn del còdigo

Creamos la variable VERSION_YEAR y la definimos en el año en que comenzò a desarrollarse el proyecto.

Creamos la variable VERSION_MAJ1 con el valor del año actual.

Creamos la variable VERSION_MAJ que es la diferencia entre la dos primeras variables creadas.

Creamos la variable VERSION_MEN1 con el valor total de la suma del mes, hora y minutos actuales.

Utilizamos el mètodo greaterThan() de qmake para comparar si el valor VERSION_MEN1 es mayor que 100. Esto agregarà un dìgito 0 cero a la derecha de una nueva variable llamada VERSION_MEN2 en el caso de que VERSION_MEN1 sea menor que 100.

Creamos la variable APPVERSION con el string final de la versiòn.

Con el mètodo message(App Version $$APPVERSION) mostramos un mensaje en la salida de qmake.

Por ùltimo, utilizamos el mètodo write_file($$PWD/version, APPVERSION) para crear un archivo llamado "version" en la carpeta del proyecto. La variable $$PWD nos devuelve la ruta absoluta del proyecto.

Actualizacion: Para Windows he modificado algunas cosas.
Aquì dejo el còdigo.


VERSION_YEAR=2016
win32 {
    VERSION_MAJ1=$$system("echo  %date%")
    VERSION_MAJ2 =$$split(VERSION_MAJ1, "/")#07 08 2018
    VERSION_MAJ3 =$$member(VERSION_MAJ2, 2)
    VERSION_MAJ4 =$$split(VERSION_MAJ3, "")
    VERSION_MAJ5 =$$member(VERSION_MAJ4, 2)
    VERSION_MAJ6 =$$member(VERSION_MAJ4, 3)
    VERSION_MAJ7=$$system("set /a  $$VERSION_MAJ3 - $$VERSION_YEAR")

    MDIA1=$$member(VERSION_MAJ2, 0)
    MDIA2=$$split(MDIA1, "")
    MDIA3=$$member(MDIA2, 0)
    greaterThan(MDIA3, 9){
        MDIA4=$$MDIA3
    }else{
        MDIA4=$$member(MDIA2, 1)
    }
    VERSION_MEN1=$$system("echo  %time%")
    VERSION_MEN2 =$$split(VERSION_MEN1, ":")#07 08 2018
    VERSION_MEN3 =$$member(VERSION_MEN2, 1)
    VERSION_MEN4=$$system("resources\\week.bat $$MDIA4 $$member(VERSION_MAJ2, 1) $$member(VERSION_MAJ2, 2)")
    NUMWEEK=$$system("set /a  $$VERSION_MEN4 + 1")

    #message(Date: $$MDIA1)
    #message(Month: $$member(VERSION_MAJ2, 1))
    #message(Week: $$NUMWEEK)

    VERSION_MEN5=$$system("echo  %time%")
    VERSION_MEN6 =$$split(VERSION_MEN5, ":")
    VERSION_MEN7 =$$member(VERSION_MEN6, 0)
    VERSION_MEN8 =$$member(VERSION_MEN6, 1)
    VERSION_MEN9=$$system("set /a  $$MDIA4 + $$MMES4 + $$VERSION_MEN7 + $$VERSION_MEN8")
    greaterThan(VERSION_MEN9, 99){
        VERSION_MEN10=$$VERSION_MEN9
    }else{
        VERSION_MEN10=0$$VERSION_MEN9
    }
    APPVERSION=$$VERSION_MAJ7"."$$NUMWEEK$$VERSION_MEN10
    message(Windows App Version $$APPVERSION)
} else:unix {
    VERSION_MAJ1=$$system(date +%Y)
    VERSION_MAJ= $$system("echo $(($$VERSION_MAJ1 - $$VERSION_YEAR))")
    VERSION_MEN1= $$system("echo $((($$system(date +%-m) * $$system(date +%-d)) + $$system(date +%-H) + $$system(date +%-M)))")

    greaterThan(VERSION_MEN1, 99){
        VERSION_MEN2=$$VERSION_MEN1
    }else{
        VERSION_MEN2=0$$VERSION_MEN1
    }
    APPVERSION=$$VERSION_MAJ"."$$system(date +%W)$$VERSION_MEN2
    message(App Version $$APPVERSION)
}


martes, 22 de mayo de 2018

Estamos Desarrollando Unik para Raspberry PI



Estos últimos días he estado probando unik en Raspberry Pi 3. La experiencia fue dentro de todo positiva. Voy a contar en que consistieron las pruebas y lo más importante a saber, que posibilidades tiene unik de funcionar en RPI de un modo decente, útil y productivo.

Me he documentado para conocer de qué manera instalar el SDK de Qt para compilar una aplicación con todas las características de unik tiene.

Para poder instalar y utilizar unik en Raspberry Pi, dentro del proyecto oficial de unik publicado github.com, allí hemos agregado un script bash llamado install_qt5_rpi3.sh

IMPORTANTE: Mirar el video publicado en este post para comprender al detalle cómo realizar estas operaciones de instalación, ejecución de Qt y unik en Raspberry Pi.

Enlace: https://raw.githubusercontent.com/nextsigner/unik/master/rpi_resources/install_qt5_rpi3.sh

Contenido del Script

#!/bin/bash
sudo apt-get -y install cmake qt5-default qtdeclarative5-* qml-module-qtquick*  qtquickcontrols5-* qml-module

Luego he conectado la RPI por medio de ssh al Ubuntu Mate de mi ordenador principal en donde se aloja todo el proyecto unik. Como dicho proyecto está preparado para ser compilado en GNU/Linux, Windows, Macos y Android, todo el proyecto ha sido configurado desde su archivo .PRO para que qmake como directorios de destino build una ubicación siempre dentro de una única carpeta del proyecto unik qml engine. Es decir, todo el proyecto se aloja dentro de una mismo carpeta incluidos las carpetas build, librerías, instaladores, etc. Por eso desde RPI debía ir requiriendo archivos del proyecto unik según se requiera para compilar unik en RPI, modificarlos y reemplazarlos en el equipo principal.

En este contexto, como se puede ver la tarea tiene sus detalles a tener en cuenta. No son de un alto grado de complejidad pero estas pruebas e implementaciones requieren de cierta paciencia y organizaciòn tal como lo requieren todas las tareas relacionadas con el desarrollo de software.

La buena noticia es que luego de modificar mìnimamente el còdigo fuente de unik, ya se puede compilar unik para RPI sin ningun problema. Hay algunas partes del còdigo fuente que requieren de la utilizaciòn de algoritmos del tipo #ifndef __arm___ y otros para solucionar algunos probelmas de e incompatibilidades.

No son del todo buenas las noticias en cuanto a algunas compatibilidades. Por el momento ha sido imposible solucionar. Casi todas las incompatibilidades estan relacionadas el framework QtQuick. Por ejemplo la versiòn QtQuick.Controls màxima que hemos podido utilizar el la 1.2, en unik para los demàs sistemas operativos venimos utilizando la versiòn 1.4. Por el momento no estamos logrando implementar el modulo QtWebView y otros. No se descarta la posibilidad de que en el corto plazo ya algunos de estos inconvenientes.

Como todos sabemos, la manera màs idonea o posible de distribuir unik para RPI, serà creando una imagen de todo el SO de RPI con unik instalado. Talves esto conlleve una ardua tarea que es su momento iremos informando al detalle.

No està demàs aclarar que el proyecto unik tiene una continuidad en cuanto a su desarrollo, sus mejoras, cambios, lentamente se va haciendo camino, encontrando nuevos horizontes, adoptando nuevas caracteristicas y descartando otras. El desafìo de sacar adelante este proyecto por momentos supera las posibilidades y los recursos humanos disponibles para tal fin. Por estos motivos dejamos en claro que unik necesita apoyo por parte de sponsors, patrocinadores, programadores, aprendices, colaboradores y todas las personas, empresas y entidades interesadas. La manera de apoyar el proyecto unik estàn disponibles en este sistema de publicaciòn, màs precisamente en el dominio https://www.nsdocs.blogspot.com.ar/ en la parte superior izquierda de la pàgina.

Nota: Ya hemos publicado el proyecto unik en github.com
Url: https://github.com/nextsigner/unik

domingo, 18 de marzo de 2018

Continùa firme el desarrollo de unik qml engine


He estado horas, días, semanas y semanas corrigiendo unik qml engine. Durante el proceso de corrección, surgieron unas y otras cuestiones a solucionar. Lo que más me ha sorprendido, es la cantidad de nuevas ideas e implementaciones que eran necesarias y útiles para agregar a unik.

Una de las carcterísticas principales es que el módulo unik-tools, se ha convertido en la aplicación por defecto con la cuál se podrán gestionar, ejecutar y descargar todos los proyectos QML que sean necesarios utilizar. Otra característica a tener en cuenta es la posibilidad de que unik pueda cargar proyectos QML desde GitHub.com.

Hay un sin fin de nuevas funcionalidades que unik qml engine ha incorporado. Muchas de las nuevas funcionalidades han posibilitado que los módulos existentes y los que se desarrollarán en el futuro, podrán actualizarse automáticamente desde GitHub.com, podrán realizar lanzamientos de nuevas instancias en modalidades diferentes, apagar las aplicaciones anidadas de modo definitivo o dejando unik-tools a disposición.

Podemos mencionar las nuevas posibilidades de lanzar una instancia de unik qml engine con una dimensión de ventana o posición de ventana ambos con valores preterminados. Se ha modificado el modo en que se codifican o decodifican los paquetes de extensión .UPK.

La tarea està resultando ardua. Lo que màs me da ànimo es que tambièn resulta entretenida y me siento muy còmodo a cada momento, en cada tramo, segmento o jornada que aboco a ello.

Al dìa de la fecha, està a disposiciòn el instalador para GNU/Linux, Windows, Macos y Android, para todos en la versiòn 2.12.2. En breve espero tener novedades para recibir de manera oficial el apoyo y patrocinio de parte de una empresa interesada en apoyar el proyecto. Una vez que todo ya estè oficializado, de manera clara y precisa se definirà el dominio y pàgina oficial de descarga de unik qml engine.

Por ùltimo voy anticipando que harè una publicaciòn sobre lo que està sucediendo con unik qml engine en el àmbito Universitario. Hay muy buenas novedades con respecto a lo ùtil y funcional que unik qml engine para dar los primeros pasos con QtQuick y QML.

sábado, 3 de marzo de 2018

codificar y decodificar datos con unik

Nota: Para utilizar este tutorial es necesario unik version 2.5 o superior.

Si aún no conoces QML y te preguntas ¿Porqué y cuáles son las ventajas de programar en QML?, aquí tienes algo de información sobre sus características y ventajas. https://nsdocs.blogspot.com.ar/2018/01/programar-en-qml-cuales-son-sus-ventajas.html

Si te preguntas ¿Porqué programar en QML utilizando unik?, aqui tienes información sobre cuáles son sus Pros y sus Contras. https://nsdocs.blogspot.com.ar/2018/02/porque-programar-en-qml-utilizando-unik.html

En este tutorial se enseñará a crear una aplicacion que consistira en lo siguiente:

1) Crear una ventana principal de aplicación de manera sencilla y rapida con QML.
2) Crear y conectar a una base de datos SQLITE de manera rápida y sencilla con unik.
3) Crear tabla SQLITE.
4) Insertar un registro con datos codificados en la tabla SQLITE.
5) Obtener datos codificados desde una tabla SQLITE.

Requisitos para utilizar este tutorial

1) Instalar el unik qml engine. Tamaño 100Mb. desde AQUI
2) Un editor de texto.

Paso 1: Crear carpeta de nuestra aplicación
Por ejemplo qml-sqlite-encode.

Paso 2: Crear el archivo QML principal para la Ventana Principal de nuestra aplicación. El archivo lo crearemos dentro de la nuestra carpeta qml-sqlite-encode y  lo llamaremos "main.qml".

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"
}

Explicación del código

Las primeras 2 lineas importan las librerias que utilizaremos en nuestra aplicación. Por último creamos un elemento QML del tipo ApplicationWindow{} que nos permite abrir o mostrar la ventana principal de nuestra aplicación. Le hemos seteado algunos parametros básicos. Un id de nombre "app", que la ventana sea visible y que se inicie como una ventana maximizada.

Paso 3: Inicializar la base de datos sqlite

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Component.onCompleted: {
          unik.setUkStd("Directorio actual: "+unik.getPath(5))

          unik.sqliteInit('bd.sqlite')
    }
}



Explicación del código

Hemos agregado un disparador onCompleted que se utiliza para ejecutar un bloque de código cuando un componente ha sido cargado de manera completa. Al terminar de cargarse la ventana principal ejecutara una función de unik. La función sqliteInit() de unik sirve para inicializar una base de datos sqlite. Esta función requiere 1 parametro para el nombre o path absoluto de la ubicación del archivo sqlite que deseamos crear.

Paso 4: Crear una tabla sqlite

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Component.onCompleted: {
        unik.setUkStd("Directorio actual: "+unik.getPath(5))

        unik.sqliteInit('bd.sqlite')
        var sql='CREATE TABLE IF NOT EXISTS tabla(
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        data TEXT
                )'
        unik.sqlQuery(sql);
    }
}


Explicación del código

Creamos una variable JavaScript del tipo string llamada "sql". Esta variable contiene la sentencia SQL necesaria para crear nuestra simple tabla de ejemplo llamada "tabla". Luego ejecutamos un método de unik llamado sqlQuery(). Esta función ejecuta la sentencia SQL preparada en el string mencionado.

Paso 5: Insertar un registro codificado

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Component.onCompleted: {
        unik.setUkStd("Directorio actual: "+unik.getPath(5))

        unik.sqliteInit('bd.sqlite')
        var sql='CREATE TABLE IF NOT EXISTS tabla(
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        data TEXT
                )'
        unik.sqlQuery(sql);


        var sqliteUserPass = 'miusuario'

        var sqliteKeyPass = 'miclave'

        var data = 'Nuevo Mundo\n\n'
                +'Un nuevo mundo apareció,\n'
                +'meta mensaje apareció.\n'
                +'Me sorprendió tomando el sol\n'
                +'en la terraza.\n'

                +'Un hongo en el cielo se formó\n'
                +'y explotaron las estrellas,\n'
                +'alguien tiró la bomba,\n'
                +'todo se puso violeta.\n\n'

                +'Naranja, amarillo, negro,\n'
                +'nubes de titanio,\n'
                +'por fin volaron\n'
                +'todas las ciudades al espacio.\n\n'

                +'Espero que sea un sueño,\n'
                +'nadie sabe quién lo hizo,\n'
                +'la lava del volcán\n'
                +'del odio de nuestro delirio.\n\n'

                +'Los pájaros de hidrógeno\n'
                +'implotaron en el aire,\n'
                +'cabezas de elefantes\n'
                +'en los centros comerciales.\n\n'

                +'Y ahora, ¿Cómo mierda\n'
                +'van a criar a sus hijos?\n'
                +'Los códigos binarios\n'
                +'los volvieron estúpidos.\n\n'

                +'Chiquitos encerrados\n'
                +'en sus casas de plata,\n'
                +'mirando por las redes\n'
                +'cómo todos se matan.\n\n'

                +'Las bandas, en Rosario,\n'
                +'se re-cagan a tiros,\n'
                +'yo busco en la música,\n'
                +'la fe y lo maldito.\n\n'

                +'Enciendo, entiendo, elijo\n'
                +'y amo amar este fuego,\n'
                +'enciendo, entiendo, elijo\n'
                +'y amo mis compañeros.\n\n'

                +'Ya se quemaron todos\n'
                +'los bosques del planeta,\n'
                +'artistas, empresarios,\n'
                +'abogados, proxenetas.\n\n'

                +'Los dioses sólo viven\n'
                +'en películas de culto\n'
                +'que ya no se verán\n'
                +'en este nuevo mundo.\n\n'

                +'Es posible que sea cierto,\n'
                +'es posible que mis besos\n'
                +'sean, en el nuevo mundo,\n'
                +'besos de un amor profundo.\n\n'

                +'Nuevo mundo delirante,\n'
                +'nuevo mundo sin escapes,\n'
                +'nuevo mundo sin controles,\n'
                +'nuevo mundo ya sin sol.\n\n'

                +'Al nuevo mundo van mis hijos,\n'
                +'los robots, los niños ewoks\n'
                +'nuevo mundo, nuevas pistas,\n'
                +'nuevas grandes utopías.\n\n'

                +'Autor: Fito Pàez\n'
                +'Album: La Ciudad Liberada\n\n'

        sql='INSERT INTO tabla(data)VALUES(\''+unik.encData(data, sqliteUserPass, sqliteKeyPass)+'\')'                
    }
}


Explicación del código

Cramos 2 variables del tipo JavaScript para nuestros datos de acceso a los datos que codificaremos. Estas 2 variables pueden ser utilizadas por ejemplo por los datos de acceso de usuario y clave de una aplicacion o los datos de acceso que nos parezcan los mas conveniente. Estos 2 datos deben ser del tipo string para ser utilizados en el metodo encData() y decData() de unik.

Creamos o redifinimos el valor de la variable JavaScript llamada "sql". En este caso la sentencia SQL que utilizaremos es la que se utiliza para insertar un registro en una tabla. Volvemos a ejecutar el método de unik sqlQuery().

Hemos ingresado en la base de datos, dentro de la tabla llamada "tabla", los siguientes datos: En la columna nombre el dato "Juan" y en la columna edad el dato "40".

Paso 6: Obtener datos de la tabla

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow{
    id: app
    visible:  true
    visibility: "Maximized"

    Flickable{    
        width: app.width
        height: app.height
        contentWidth: datos.width
        contentHeight: datos.contentHeight
        TextArea{
            id:datos
            width: app.width*0.8
            x:app.width*0.1
            height: contentHeight
            font.pixelSize: 20
            wrapMode: Text.WrapAnywhere
        }
    }    

    Component.onCompleted: {    
        unik.setUkStd("Directorio actual: "+unik.getPath(5))
        unik.sqliteInit('bd.sqlite')
        var sql='CREATE TABLE IF NOT EXISTS tabla(
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        data TEXT
                )'
        unik.sqlQuery(sql);
        
        var sqliteUserPass = 'miusuario'

        var sqliteKeyPass = 'miclave'

        var data = 'Nuevo Mundo\n\n'
                +'Un nuevo mundo apareció,\n'
                +'meta mensaje apareció.\n'
                +'Me sorprendió tomando el sol\n'
                +'en la terraza.\n'

                +'Un hongo en el cielo se formó\n'
                +'y explotaron las estrellas,\n'
                +'alguien tiró la bomba,\n'
                +'todo se puso violeta.\n\n'

                +'Naranja, amarillo, negro,\n'
                +'nubes de titanio,\n'
                +'por fin volaron\n'
                +'todas las ciudades al espacio.\n\n'

                +'Espero que sea un sueño,\n'
                +'nadie sabe quién lo hizo,\n'
                +'la lava del volcán\n'
                +'del odio de nuestro delirio.\n\n'

                +'Los pájaros de hidrógeno\n'
                +'implotaron en el aire,\n'
                +'cabezas de elefantes\n'
                +'en los centros comerciales.\n\n'

                +'Y ahora, ¿Cómo mierda\n'
                +'van a criar a sus hijos?\n'
                +'Los códigos binarios\n'
                +'los volvieron estúpidos.\n\n'

                +'Chiquitos encerrados\n'
                +'en sus casas de plata,\n'
                +'mirando por las redes\n'
                +'cómo todos se matan.\n\n'

                +'Las bandas, en Rosario,\n'
                +'se re-cagan a tiros,\n'
                +'yo busco en la música,\n'
                +'la fe y lo maldito.\n\n'

                +'Enciendo, entiendo, elijo\n'
                +'y amo amar este fuego,\n'
                +'enciendo, entiendo, elijo\n'
                +'y amo mis compañeros.\n\n'

                +'Ya se quemaron todos\n'
                +'los bosques del planeta,\n'
                +'artistas, empresarios,\n'
                +'abogados, proxenetas.\n\n'

                +'Los dioses sólo viven\n'
                +'en películas de culto\n'
                +'que ya no se verán\n'
                +'en este nuevo mundo.\n\n'

                +'Es posible que sea cierto,\n'
                +'es posible que mis besos\n'
                +'sean, en el nuevo mundo,\n'
                +'besos de un amor profundo.\n\n'

                +'Nuevo mundo delirante,\n'
                +'nuevo mundo sin escapes,\n'
                +'nuevo mundo sin controles,\n'
                +'nuevo mundo ya sin sol.\n\n'

                +'Al nuevo mundo van mis hijos,\n'
                +'los robots, los niños ewoks\n'
                +'nuevo mundo, nuevas pistas,\n'
                +'nuevas grandes utopías.\n\n'

                +'Autor: Fito Pàez\n'
                +'Album: La Ciudad Liberada\n\n'

        sql='INSERT INTO tabla(data)VALUES(\''+unik.encData(data, sqliteUserPass, sqliteKeyPass)+'\')'
        unik.sqlQuery(sql);

         

        var rows = unik.getSqlData('tabla', 'SELECT * FROM tabla', 'sqlite')
        for(var i=0;i<rows.length;i++){
            datos.text= unik.decData(rows[i].col[1], sqliteUserPass, sqliteKeyPass)+'\n\n'
        }

    }
}


Explicación del código

Creamos un elemento QML del tipo Text{} con el id "datos". Este aparecerá centrado en la ventana principal y nos mostrará el nombre obtenido desde la base de datos en la tabla de ejemplo.

Creamos una variable JavaScript del tipo array llamada "rows". Atención! Estamos utilizando un método de unik llamado  getSqlData(). Este método nos devuelve un dato del tipo array de objetos bidimensional. Esto significa que el array "rows" contiene cuál si fuese una grilla o tabla, una clase de matriz de datos. Creamos un bucle "for" para recorrer dicha matriz de datos.

Asignamos un valor a la propiedad "text" del elemento Text{} haciendo referencia al id "datos". El valor que le asignamos son la totalidad de datos que se encuentren en la segunda columna del array o matriz de datos. El rows[i] puede ser rows[0], rows[1], rows[2] ... etc dependiendo de la cantidad de filas que tenga la tabla. El rows[i].col[0] corresponde a la columna "id", El rows[i].col[1] corresponde a la columna "nombre" y el rows[i].col[2] corresponde a la columna "edad".

El Text{} de id "datos" irá mostrando repetidas veces el nombre "Juan" por cada vez que se ejecute la aplicación de este ejemplo.

Paso 7: Ejecutar la aplicación del tutorial en unik

Desde el sistema operativo GNU/Linux, Windows o Macos, hay que ejecutar unik con 2 de los siguientes parámetros:

Explicamos lo que ejecutaremos
unik [param 1=-folder] [param 2=folder location]

Modo de ejecución final de Ejemplo en GNU/Linux
/home/nextsigner/Escritorio/unik.AppImage -folder /home/nextsigner/Escritorio/qml-sqlite

Modo de ejecución final de Ejemplo en Windows
"C:\Program Files (x86)\unik\unik.exe" -folder C:/Users/qt/Desktop/qml-sqlite

Modo de ejecución final de Ejemplo en Macos
/Applications/unik.app/Contents/MacOS/unik -folder /Users/qt/Desktop/qml-sqlite

Mas info: nextsigner@gmail.com

Entrada destacada

Algunos Script Ùtiles GNU/Linux

Còmo crear un alias con funcion y paràmetros alias gs='gitSubir "$1"' function gitSubir() {     git add *;     git co...