Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



domingo, 3 de noviembre de 2019

Programa de Contabilidad Softwarelibre: homebank


Programa de Contabilidad Softwarelibre: homebank


HomeBank es un software libre (como en "free speech" y también como en "free beer") que le ayudará a administrar su contabilidad personal.
Está diseñado para ser fácil de usar y ser capaz de analizar sus finanzas personales Y el presupuesto detalladamente usando poderosas herramientas de filtrado y gráficos hermosos.
Si está buscando una aplicación completamente gratuita y fácil de administrar Contabilidad, presupuesto, finanzas y luego HomeBank debe ser el software de elección.


Descarga: Versiones para windows, linux,

http://homebank.free.fr/es/index.php



Algunos videotutoriales que explican su uso:









sábado, 19 de octubre de 2019

Como optimizar un SSD

Como optimizar un SSD


Os dejos varios videos de NASeros sobre los SSD:

¿Sabes qué debes hacer para cuidar y alargar la vida de tu SSD?
¿Qué hacer para sacarle el máximo partido a un SSD?
¿Cómo funciona internamente un SSD?
¿Qué es el TRIM? ¿Activo el TRIM?
¿Debemos formatear un SSD? ¿ Es mejor borrar o formatear ? 
¿Debo defragmentar un SSD? ¿Borrado rápido o seguro?
Para responder a todo esto debemos conocer como funciona internamente un SSD y saber como escribe los datos internamente porque funciona muy distinto a un disco mecánico.
Si quieres aprender a acelerar el rendimiento de tus SSD y prolongar su vida útil, no te pierdas este podcast.
Vídeos sobre SSD:


1º: https://youtu.be/-nL29CRz1t8
2º: https://youtu.be/V9VJeoX8QA4
3ª: https://youtu.be/lno91wWRuE8
4°: https://youtu.be/AQ_b7qcMpUI




Fuente:
https://www.ivoox.com/80-como-optimizar-ssd-mejora-rendimiento-audios-mp3_rf_43210549_1.html

domingo, 6 de octubre de 2019

Generador Informe Fotográfico: ejemplo de creación de informes usando .fodt


Generador Informe Fotográfico: ejemplo de creación de informes usando .fodt


Este programa nos sirve para generar un documento con todas las fotografías que tenga un directorio que seleccionamos, creando un fichero que nos lo abre con LibreOffice Write.

Nota: Aprovecha el nombre de los ficheros para ordenar las fotografias en el informe y los pone a pie de la fotografia. También crea un indice de fotografias que debemos actualizar cuando abramos el fichero en el libreoffice.

En el siguiente video la explicación de como usarlo:




Codigo fuente de la aplicación alogado en github: https://github.com/jsbsan/geninfoto

Descarga versión inicial: alojado en drive google


Fuente:
https://www.gambas-es.org/viewtopic.php?f=1&t=6666&highlight=fods&start=20

sábado, 5 de octubre de 2019

Captura una pagina web completa sin extensiones

Captura una pagina web completa sin usar extensiones



Interesante y útil entrada que he encontrado en el blog de andalinux  sobre la forma de captura una pagina web completa:

En chrome:
  • Abre la consola de desarrollador (basta con pulsar F12)
  • Pulsa CTRL+Shift+P
  • Y empieza a escribir (en “perfecto inglés”) el término “screenshot




Fuente:
https://andalinux.wordpress.com/2019/10/01/capturas-de-pantalla-web-completas-sin-extensiones/

domingo, 28 de julio de 2019

Qgis: enlazar con Ficheros PDF, rutas relativas y acciones...

Qgis: enlazar con  Ficheros PDF, rutas relativas y acciones...


Os dejo 3 videos, donde os comento como poner un campo de ruta relativa que apunta a un fichero pdf (para poderlo abrir como hiperenlace), y que pasa cuando cambiamos de ruta el proyecto como configurar los campos para que no haya problemas con los enlaces y acciones definidas.








Saludos

sábado, 22 de junio de 2019

Ver Radiografias médicas en tu ordenador: El formato dicom-pacs y el visor RadiAnt.

Ver Radiografias médicas en tu ordenador: El formato dicom-pacs y el visor RadiAnt.


"DICOM (Digital Imaging and Communication On Medicine) es el estándar reconocido mundialmente para el intercambio de imágenes médicas, pensado para su manejo, visualización, almacenamiento, impresión y transmisión. Incluye la definición de un formato de fichero y de un protocolo de comunicación de red. El protocolo de comunicación es un protocolo de aplicación que usa TCP/IP para la comunicación entre sistemas. Los ficheros DICOM pueden intercambiarse entre dos entidades que tengan capacidad de recibir imágenes y datos de pacientes en formato DICOM.
DICOM permite la integración de escáneres, servidores, estaciones de trabajo, impresoras y hardware de red de múltiples proveedores dentro de un sistema de almacenamiento y comunicación de imágenes. Las diferentes máquinas, servidores y estaciones de trabajo tienen una declaración de conformidad DICOM (conformance statements) que establece claramente las clases DICOM que soportan. DICOM ha sido adoptado ampliamente por hospitales y está haciendo incursión en pequeñas aplicación de oficinas de dentistas y de médicos."




He encontrado un visor que tiene versión de pruebas con el cual podeis ver este tipo de ficheros. Se llama RadiAnt y lo podes descargar en el siguiente enlace:

https://www.radiantviewer.com/download/










Y para linux podemos ejecutarlo con wine, como podeis ver en explicado en este videotutorial:




Aqui os dejo un ejemplo del programa ejecutándose en mi ordenador:
Vista del programa RadianAnt corrriendo bajo en linux (mediante wine)





Nota:
También existe una página web para verlos online: https://www.dicomlibrary.com/



Para mas información:
https://www.radiantviewer.com/
https://www.ecured.cu/Ficheros_DICOM
https://www.dicomlibrary.com/ [visor online de ficheros DICOM]
Radiología Digital: Almacenamiento y transmisión de imágenes. PACS

jueves, 20 de junio de 2019

Qgis: Acciones: Mi aporte.


Qgis: Acciones: Mi aporte.


Mi aporte, sobre el tema de definir "acciones" en qgis:



texto de la acción: "mostrar imagen con firefox"
[%concat('firefox "','/home/mint/estadios de futbol', "Imagen",'"')
%]

texto de la accion: "mostrar imagen con feh"
[%concat('feh "','/home/mint/estadios de futbol', "Imagen",'"')
%]




Enlaces de interes:
Videos:
https://vimeo.com/112685711

https://www.youtube.com/watch?v=IShZ7D1HScE


Sobre el visor ligero de imagenes feh:
https://maslinux.es/feh-visor-de-imagenes/

Saludos!!


Qgis: Programacion con Python


He encontrado una serie de videos de la UPM (Universidad politécnica de Madrid) de unas clases dadas por  Victor Olaya, en el año 2018, sobre programación de Qgis 3.xx con python, os dejo el enlace de la lista de reproducción de los 5 videos que componen este curso:


domingo, 9 de junio de 2019

SoloLinux: Blog, Revista y mucho más sobre linux

SoloLinux: Blog,  Revista y mucho más sobre linux 

En un canal de telegran encontré esta web, que no conocía, os dejo varios enlaces interesantes:


Revista Digital: https://www.sololinux.es/revista-digital-magazine/





Saludos !!



viernes, 7 de junio de 2019

Instalar WINE en Linux Mint 19 XFCE4 Correctamente


Instalar WINE en Linux Mint 19 XFCE4 Correctamente


Actualice hace tiempo  linux mint 19, y hoy me ha hecho falta usar wine. Me dio problemas instalarlo normalmente, y entonces encontré este video de Cesar donde explica como hacerlo:



Estos son los comandos:

sudo dpkg --add-architecture i386
wget -nc https://dl.winehq.org/wine-builds/Release.key 
sudo apt-key add Release.key 
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main' 
sudo apt-get update 
sudo apt-get install --install-recommends winehq-stable


Gracias Cesar !!!

domingo, 2 de junio de 2019

Qgis: Añadiendo limites provinciales.



Qgis: Añadiendo limites provinciales.


Partiendo del ejemplo anterior de informes de estadios de fútbol, le voy a añadir al plano de localización, los límites de las provincias y el nombre de la provincia.
La información de las provincias la podemos sacar del siguiente enlace
Vamos a incorporar el archivo Provincias_ETRS89_30N.shp a nuestro proyecto, con "coger y soltar" desde el navegador de archivos a la leyenda.
Nos encontramos dos problemas:
1) El color de la nueva capa, al ser sólido, tapa las capas que estén debajo de ella.
2) Los caracteres acentuados no salen.

El el siguiente video os explico como se resuelven estos problemas:





Fuentes:
https://www.arcgis.com/home/item.html?id=83d81d9336c745fd839465beab885ab7
https://www.blogsig.com/2018/03/qgis-no-me-reconoce-acentos.html

Donde guardo enlaces de interes sobre Qgis:
https://start.me/p/1kwjXL/qgis-tutos

domingo, 26 de mayo de 2019

Qgis 3.xx: Tutoriales sobre como crear informes: Ejemplo Estadios de Futbol

Qgis: Tutoriales sobre como crear informes: Ejemplo Estadios de Futbol

He creado una serie de tutoriales para explicaros como crear informes en Qgis a partir de la versión 3.xx.


Nota:
Enlace a los datos y archivos de qgis del ejemplo completo:

Lista de Reproducción: (7 videos)

https://www.youtube.com/playlist?list=PLY1AHIjJwXVEwwTbKIrk83A_0JyTqTIyz

Uno a Uno...

QGIS: Tutorial Como Hacer Informes 1 Presentación
Os enseño el resultado final que vamos a obtener.




QGIS: Tutorial Como Hacer Informes 2 Datos de Ejemplo Estadios de Futbol
Los datos que vamos a usar.




QGIS: Tutorial Como Hacer Informes 3 Empezamos



QGIS: Tutorial Como Hacer Informes 4: Agregamos un MAPA LOCALIZACION
Creamos un pequeño mapa para indicar la localización del mapa principal.




QGIS: Tutorial Como Hacer Informes 5 Mostramos datos en el informe
Vamos a ver como se insertar  los datos (por ejemplo nombre del estacio, nº de espectadores), en los mapas generados.
 


QGIS: Tutorial Como Hacer Informes 6 ImagenesComo añadir imágenes relacionadas con el mapa. La base de datos tiene un campo en cada registro, donde se indica la ruta donde esta la imagen.



QGIS: Tutorial Como Hacer Informes 7 Detalles finales: Escalas, Marcadores, Marcos...
Vamos a añadir una escala enlazada con cada mapa representado, definir bordes,  añadir una imagen tipo "logo" y poner una figura (una elipse) en el centro del mapa.





Espero que os sea útil. Saludos !!!


domingo, 12 de mayo de 2019

ebay: un ticket regalo de 5 euros y Raton Game por 0.69 €


5500DPI 7 botones LED USB con cable Ratón para juegos Gamer / PC/Mac OS

Ebay: un ticket regalo de 5 euros...  y Ratón Game por 0.69 €

Todo el mundo habla de amazon... pero también existe..... ebay.



De vez en cuando, ebay  regala descuentos y ticket de regalos a sus clientes (que hayan hecho compras hace tiempo o que sean muy habituales, no importa), y hace un mes me regalaron un ticket de 5 euros.

Estuve buscando un ratón para jubilar el que tenia que estaba "echo polvo", y encontré una oferta de un ratón game por 5.69 euros. (sin marca y genérico, ¡¡¡ ojo !!!), pero la tienda aceptaba paypal cosa buena.

Me tardaba un mes (me lo traían de  Hong Kong) y los portes estaban incluidos en el precio... con la oferta que me daban, se me quedaba en 0.69 euros, aunque me tardaba casi un mes me merecía esperar...(los ratones "normales" están sobre 6 euros  en tienda).


Me llegó, y ya lo tengo conectado y funciona perfectamente, y por supuesto, también  con GNU/LINUX !!! (en mi caso Linux Mint)

Os dejo un vídeo para que lo podáis ver:







Extra GNU/LINUX con ratones game!!: Configurar  ratones con varios botones en linux:
https://robustiana.com/297-configurar-todos-los-botones-adicionales-de-mi-mouse-en-ubuntu


Enlace ebay:
https://www.ebay.es/itm/5500DPI-7-botones-LED-USB-con-cable-Rat%C3%B3n-para-juegos-Gamer-PC-Mac-OS/264200631170?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2060353.m2749.l2649




Características:
Botones: 7 botones con rueda de desplazamiento.
Sistemas de seguimiento: ópticos.
El DPI máximo: 5500DPI.
Interruptor de DPI ajustable: 1000DPI / 1600DPI / 2400DPI / 3200DPI / 5500DPI;
Rueda de desplazamiento ultra-precisa.
La tecnología óptica funciona en la mayoría de las superficies.
Diseño ergonómico, uso a largo plazo sin fatiga.
Conectividad inteligente, sin necesidad de codificar, plug & play.
Hierro de peso incorporado, se siente cómodo, móvil y estabilidad.
Cambio de vida: 5 millones de ciclos.
Tamaño: 127 (L) x 85 (W) x 37 (H) mm.
Peso: alrededor de 140g.
Compatible con Windows XP, Vista, Windows 7, ME, 2000 y Mac OS ... o más reciente. 
                        'y gnu/linux'
Contenido del paquete:
1 X Gaming Mouse (sin paquete al por menor)

sábado, 4 de mayo de 2019

Gambas3.13: nueva versión

Gambas3.13: nueva versión


Hoy he actualizado en mi linux mint, la nueva versión de gambas3 (la 3.13), os dejo las cambios y mejoras que trae (traducido desde google translate):

¿Qué hay de nuevo?
Esta versión corrige algunos errores molestos en Gambas 3.12, y agrega las siguientes características:

Soporte para la traducción automática en el IDE.


  • La compilación JIT ahora se realiza en segundo plano, acelerando el inicio del programa.

  • File.RealPath () para canonizar una ruta, eliminando todos sus enlaces simbólicos.

  • Array.SortUsing () para ordenar una matriz usando un orden definido por otra matriz.

  • Array.Shuffle () para mezclar aleatoriamente el contenido de una matriz.

  • TimeBox, un nuevo control para introducir duraciones.

  • Mejoras en el componente gb.map.

  • Mejoras en el componente gb.media


Recopilación e instalación
Lea las instrucciones  aqui

Si todo estaba bien, escriba "gambas3" para ejecutar el entorno de desarrollo.

Disfrútala !

Registro de cambios
CONFIGURACIÓN

  • No reinicie CFLAGS o CXXFLAGS para que uno pueda sobrescribirlos.

  • Ahora que el compilador genera automáticamente los archivos * .mo, no los coloque en el repositorio git.

  • Ponga gbh3 de nuevo en el repositorio git.

  • Añadir atribución de algoritmo borroso.

  • Deshazte de muchas advertencias gcc.


ENTORNO DE DESARROLLO
Editor de código

  • El color de fondo del error o la información sobre herramientas del reloj ahora se fusiona explícitamente con el color de fondo predeterminado del tema.


  • La fuente del método emergente (popup) se dimensiona de acuerdo con el número de métodos a mostrar.


Formato de código

  • La opción de formato al cargar y guardar ahora marca los archivos como modificados, de modo que la búsqueda no se vuelva tonta.

  • El editor de texto ahora tiene en cuenta la opción de formato al cargar y guardar, no solo el editor de código.

  • Ignora los archivos nulos ahora.


Editor de base de datos

  • Mostrar la duración de las solicitudes personalizadas es el editor de solicitudes.
  • El editor de solicitudes ahora envuelve su contenido.


Editor de formularios

  • El diálogo para editar la propiedad de texto ahora muestra el nombre de la propiedad del editor en su título.


Navegador de ayuda

  • Al abrir el navegador de ayuda desde el cuadro de diálogo de bienvenida, no se bloqueará más si el panel izquierdo está visible.



  • Fijar los contenidos del panel izquierdo.


Editor de imagen

  • No se bloquee cuando utilice la herramienta de borrado mientras presiona la tecla MAYÚS.


Diálogo de opciones
Soporte para la traducción automática basada en la herramienta translate-shell


  • Añadir nuevos fragmentos.



  • Mostrar fragmentos personalizados en negrita.



  • Corregir el espaciado de algunas opciones en la pestaña Proyecto.


Empacador

  • Ya no crea un componente con un nombre que tenga un punto inicial.



  • Arreglar la generación de paquetes slackware.


Diálogo de propiedades del proyecto

  • Use iconos personalizados para las casillas de verificación de la pestaña de componentes, ya que algunos estilos no pueden dibujarlos correctamente.



  • Agregue GB_NO_JIT como variable de entorno predefinida.



  1. La tabla de variables de entorno ahora cambia automáticamente el tamaño de sus columnas.


Diálogo de búsqueda

  • El resaltado de texto ahora funciona correctamente, sea cual sea la fuente del editor.

  • Hazlo más grande para las etiquetas largas de la casilla de verificación.


Editor de texto

  • Algunas correcciones en la compresión javascript.


Diálogo de traducción

  • Mueva los botones relacionados con la traducción actual a sus propias barras de herramientas juste sobre el campo de traducción.
  • Agrega dos botones para moverte entre las cadenas traducidas.
  • Soporte para la traducción automática basada en la herramienta translate-shell.
  • Eliminar una traducción correctamente lo elimina del cuadro combinado de traducción.


Diálogo de bienvenida

  • Utilice el nuevo icono en lugar del antiguo.


Diverso

  • Actualizar la traducción al italiano.
  • Actualizar la traducción al francés.
  • Actualizar la traducción al español.
  • Actualizar la traducción al holandés.
  • Actualización de soporte financiero.
  • No vuelva a llamar a msgfmt, esto lo hace automáticamente el compilador ahora.
  • Marque algunas cadenas en las formas para no ser traducidas.


EJEMPLOS
Corregir imagen dañada en el ejemplo BeastScroll.

WIKI

  • Actualizar la traducción al francés.
  • Soporte para archivos de video webm.
  • Soporte para juegos integrados.
  • El título de la página ahora comienza con la ruta de la página.
  • Actualizar la traducción al holandés.


FABRICANTE DE SITIO WEB

  • Actualizar la traducción al holandés.



INTERPRETE

  • InStr () y RInstr () vuelven a funcionar correctamente cuando se ignora el caso y la longitud del patrón es de al menos dos caracteres.


Agregue una API para saber si existe un componente nativo en el disco.

Arreglar la optimización del bucle que no funcionó en los bucles llamándose a sí mismos de forma recursiva.


  • Cuidar los componentes que modifican la variable ambiental. Usar gb.httpd ya no falla.



  • Crea el camino "./" equivalente a "." como antes, y no un prefijo para un componente con un nombre nulo.



  • Permitir un dígito decimal más en constantes numéricas de punto flotante.



  • Ignore los ceros finales en la parte decimal de las constantes numéricas de punto flotante. Puede introducir diferencias de redondeo.



  • No se bloquee si un componente usa NULL como argumento de mensaje de error. Reemplácelo por una cadena vacía.



  • Corregir cadena a rutina de conversión de punto flotante.



  • Asigne las variables de entorno de idioma personalizadas de forma estática, ya que las rutinas de salida de la biblioteca acceden al entorno una vez que se han liberado las asignaciones de memoria del intérprete.


Defina una nueva constante de límite, que es la longitud máxima de la variable System.Language. Es de 16 bytes.


  • File.RealPath () es un nuevo método estático que devuelve el nombre de ruta absoluta canonicalizado de la ruta especificada, sin enlaces simbólicos dentro.



  • String.Code () ahora devuelve -1 en una cadena UTF-8 incorrecta.



  • Array.SortUsing () es un nuevo método que ordena una matriz de acuerdo con el orden de clasificación definido por otra matriz.



  • String.Right () ya no falla en cadenas UTF-8 no válidas.



  • Agregue el método Sort () a las matrices de variantes.



  • La compilación JIT ahora se ejecuta en dos pasos.



  • Los monitores de descriptor de archivos activos y los temporizadores activos ahora se transfieren automáticamente al componente que declara un bucle de eventos personalizado. En consecuencia, un proceso iniciado antes de la declaración del bucle de evento tendrá su señal de terminación correctamente capturada.



  • Utilice waitpid () en lugar de wait4 ().



  • Array.Shuffle () es un nuevo método que baraja aleatoriamente una matriz utilizando el algoritmo de Fisher-Yates.



  • El compilador JIT ya no ejecuta inicializadores estáticos al cargar una clase. De lo contrario, el código de bytes puede modificarse antes de compilarse, lo que lleva a un bloqueo del compilador JIT.



  • Arreglar Url $ () caracteres de escape.


COMPILADOR

  • Si se especifica la opción -t, el compilador ahora llama automáticamente a msgfmt para compilar los archivos de traducción si es necesario.



  • Las advertencias de funciones no utilizadas ahora apuntan al comienzo de la función.



  • Genere un error si no hay suficientes ranuras locales para las estructuras de control.



  • ASSERT ... PRINT o ERROR permite utilizar PRINT o ERROR para imprimir un mensaje cuando falla la afirmación.



  • Arreglar la meta-información de la subrutina LOCK.


ESCRITOR

  • Scripter ahora compila el contenido de los argumentos en modo en línea (-e).


GB.ARGS

  • Actualizar la traducción al italiano.



  • Actualizar la traducción al holandés.


GB.COMPLEX

  • Optimizar la división, gracias a Cedron Dawg.


GB.DB

  • Connection.GetTemplate () y Connection.ApplyTemplate () ahora tienen en cuenta correctamente las tablas sin clave principal.


GB.DB.FORM

  • Actualizar la traducción al italiano.



  • Actualizar la traducción al holandés.


GB.EVAL

  • Formato de código: el operador unario menos ahora está pegado a su argumento.


GB.EVAL.HIGHLIGHT

  • TextHighlighter: Paint () es un nuevo método que pinta el texto resaltado.


GB.FORM

  • Actualizar la traducción al italiano.
  • Actualizar la traducción al holandés.
  • Panel de herramientas: ya no se bloquea.
  • Spinner: active el temporizador del spinner solo si es necesario, y no de forma permanente.
  • TimeBox es un nuevo control que permite ingresar una duración. Tal vez el nombre del control no sea muy bueno.
  • URLLabel: Reescribe el control como un hijo de Label.
  • FileView: A veces el contenido no se actualizó correctamente.


GB.FORM.DIALOG

  • Actualizar la traducción al italiano.
  • Actualizar la traducción al holandés.


GB.FORM.EDITOR

  • TextEditor: ingresando un delimitador de cadena mientras el texto está seleccionado correctamente, lo encierra nuevamente.



  • TextEditor: La sombra interior ahora cubre el margen.


GB.FORM.MDI

  • Actualizar la traducción al italiano.



  • Área de trabajo: a veces, el cierre de una pestaña con el botón central se activa dos veces, lo que provoca un bloqueo. Hizo una solución.



  • Área de trabajo: agregue la propiedad CloseButton que permite eliminar el botón de cierre global.


GB.FORM.STOCK

  • Arregla algunos íconos.


GB.FORM.TERMINAL

  • TerminalView: Implementar secuencia ESC <N> b.



  • TerminalView: la altura mínima de la pantalla ahora es de 2 líneas.


GB.GTK

  • No propague eventos de la rueda del mouse de ComboBox, TextArea, Slider y ScrollBar, como en los componentes Qt.



  • Ventana: Windows sin ningún control secundario activo atrapa correctamente los eventos del teclado ahora.


Declare el último gancho del bucle de eventos para que los observadores de descriptores de archivos activos y la transferencia activa se transfieran automáticamente.

GB.GTK3
No propague eventos de la rueda del mouse de ComboBox, TextArea, Slider y ScrollBar, como en los componentes Qt.

TabStrip: las etiquetas de la pestaña ahora se muestran correctamente cuando la pestaña no tiene un icono.

Hacer compilar componente con versión GTK + <3.20.

Ventana: Windows sin ningún control secundario activo atrapa correctamente los eventos del teclado ahora.


  • Declare el último gancho del bucle de eventos para que los observadores de descriptores de archivos activos y la transferencia activa se transfieran automáticamente.


GB.GUI
Tenga en cuenta los otros componentes de la GUI solicitados para elegir el kit de herramientas.

GB.GUI.BASE

  • Paint: agregue un método oculto no documentado que calcula el ancho de caracteres de una fuente fija.


  • SpinBox: Alignment es una nueva propiedad que permite definir la alineación del texto interno del control.
  • SpinBox: ShowZero es una nueva propiedad que le dice a rellenar el número mostrado con ceros.
  • SpinBox: Limit es un nuevo evento que se genera cuando el usuario intenta pasar el valor máximo o antes del valor mínimo.
  • SpinBox: el siguiente uso del mouse siempre tiene en cuenta el valor ingresado con el teclado.
  • ScrollArea: La sombra es más suave ahora.
  • GridView: hacer que el color seleccionado sea menos transparente.


GB.GUI.QT

  • Tenga en cuenta los otros componentes de la GUI solicitados para elegir el kit de herramientas.


GB.INOTIFY

  • Ver: Eventos [] restablece incorrectamente eventos fuera del conjunto de eventos dado e ignoró el valor asignado.


GB.JIT

  • No utilice la declaración inicial de bucle en el código C generado para las versiones anteriores de gcc.
  • Corrija el valor predeterminado de los argumentos opcionales de la función Object.
  • Soporte para compilador tcc.
  • Arreglar la instrucción de depuración.
  • Soporte para la nueva instrucción Assert.
  • Ejecutar la compilación JIT en el fondo.


  • JIT.Debug es una nueva propiedad que permite habilitar mensajes de depuración JIT en tiempo de ejecución.
  • No muestre el mensaje de depuración del aborto si no hay una compilación para anular.
  • Las variables de objeto se gestionan correctamente ahora.
  • DO ... LOOP y REPEAT ... UNTIL al principio de la función ahora se compila correctamente en todos los casos.


GB.MAP

  • MapView: el mapa ahora se encuentra correctamente debajo del cursor del mouse cuando se aleja.
  • Los elementos del círculo ahora tienen el buen radio.
  • MapPoint.Distance () ahora es una función pública estática.
  • Map.Proxy es una nueva propiedad que permite definir el proxy utilizado por todas las solicitudes HTTP realizadas para recuperar los mosaicos del mapa.
  • GetShape (), GetTile (), Remove () y Exists () son nuevos métodos para manipular capas de mapa.
  • DefaultCache es una nueva propiedad para establecer la ruta de la memoria caché predeterminada en otro lugar desde la Página principal del usuario.
  • GetItem es un nuevo método para manipular elementos de forma dentro de una capa de forma.
  • GetCenter hecho estático en MapPoint.
  • LineStyle es una nueva propiedad para los elementos de Shape Layer.
  • Se agregaron algunos comentarios de ayuda en línea sobre varios métodos y propiedades.
  • Ahora se pueden mover los círculos cambiando su propiedad del Centro.
  • Los círculos ahora pueden tener colores de relleno que no sean los predeterminados de Shape.
  • El icono del elemento ahora está centrado, si no es el predeterminado.
  • El icono del elemento ahora puede ser coloreado, si no es el predeterminado.
  • Mejor manejo de la opacidad de la capa.
  • Mejor manejo de ZoomOut.
  • Uso de FAST en clase MapPoint y módulo Geo.


GB.MEDIA

  • MediaPipeline: Pos es un nuevo sinónimo para la propiedad Posición.
  • MediaPipeline: Position es un nuevo evento que se genera cuando la posición de los medios ha cambiado.
  • MediaPipeline: Seek () es un nuevo método que permite mover los medios a una posición específica mientras especifica las banderas de búsqueda de GStreamer.
  • MediaPipeline: Speed ​​es una nueva propiedad que permite definir la velocidad de reproducción de los medios. Una velocidad negativa se jugará hacia atrás.
  • MediaPipeline: Forward () es un nuevo método que permite avanzar una cantidad específica de cuadros. Mover hacia atrás no funciona en este momento.
  • Medios: Agregar las constantes de búsqueda MediaPipeline.Seek ().


GB.MEDIA.FORM

  • MediaView: Combina el botón de reproducción y pausa.
  • MediaView: Eliminar el símbolo de pausa grande blanco.
  • MediaView: Speed ​​es una nueva propiedad que permite definir la velocidad de reproducción de los medios.
  • MediaView: Cambiar el tamaño del control mientras el medio está en pausa, redimensiona correctamente el marco mostrado.


GB.NET

  • UdpSocket: declaración de la clase Fix.
  • UdpSocket: Host es una nueva propiedad que permite definir la dirección IP a la que se enlazará el socket UDP.
  • El método SerialPort: Open () ahora genera errores más detallados.
  • SerialPort: Soporte para cualquier velocidad de puerto en Linux.


GB.NET.CURL

  • Curl.DefaultProxy es una nueva propiedad que permite definir el proxy predeterminado de todos los objetos HttpClient recién creados.


GB.NET.PO3

  • Actualizar la traducción al holandés.


GB.PDF

  • Reemplace Guint por uint, de lo contrario, el componente parece que ya no se compila en algunos sistemas.


  • Hacer gb.pdf compilar con poppler 0.72.


GB.REPORT

  • Actualizar la traducción al holandés.


GB.REPORT2

  • Actualizar la traducción al holandés.


GB.QT4

  • Declare el último gancho del bucle de eventos para que los observadores de descriptores de archivos activos y la transferencia activa se transfieran automáticamente.


GB.QT5

  • Declare el último gancho del bucle de eventos para que los observadores de descriptores de archivos activos y la transferencia activa se transfieran automáticamente.


GB.REPORT2

  • Actualizar la traducción al italiano.
  • Agregue el requisito para gb.eval en la información del componente y cárguelo explícitamente.


GB.SDL2

  • El argumento de opacidad Draw.Image () funciona como se espera ahora.
  • Fuente [] ahora asume un tamaño predeterminado de 10 puntos, por lo que no tiene que especificar el tamaño de fuente al crear el objeto Fuente.
  • No se bloquee al dibujar cadenas estáticas de un carácter.


GB.TERM.FORM

  • Actualizar la traducción al holandés.


GB.UTIL

  • Permitir recuperar la zona horaria de Date.FromRFC822 ().
  • Propague los errores internos de Date.FromRFC822 () en lugar de seguirlos con un bloque Catch.
  • Mejore el mensaje de error de Date.GetRFC822Zone () al mostrar lo que no se pudo reconocer como una zona horaria.
  • Agregue Date.FromUTC () como inverso a Date.ToUTC ().
  • Solucione el error de la zona horaria en Date.FromRFC822 () y pase todas las pruebas.


GB.UTIL.WEB

  • URL es ahora una clase dinámica que puede usarse para analizar y modificar el contenido de una URL.



  • URLQuery es una nueva clase que representa la parte de consulta de una URL.


GB.WEB

  • Normalice correctamente los nombres de los archivos de sesión de SQLite.


GB.WEB.FEED

  • Actualizar la traducción al holandés.
  • Introduzca la clase RssDate para el manejo de la fecha y la zona horaria y la documentación de actualización.
  • RssGuid: no establezca IsPermaLink de forma predeterminada al analizar.
  • Marque el componente como "estable".
  • Dependa de gb.util para conversiones de fecha RFC822.


GB.WEB.FORM

  • Actualizar la traducción al italiano.
  • Actualizar la traducción al holandés.
  • WebTextArea: La propiedad de texto funciona correctamente de nuevo.


GB.XML

  • La declaración de <! DOCTYPE> ahora no distingue entre mayúsculas y minúsculas.



Fuente original:
http://gambas.sourceforge.net/en/main.html

jueves, 18 de abril de 2019

Organizacion automatica ventanas con wmctrl y gambas3


Organización automatica ventanas con wmctrl y gambas3

Usualmente uso varias ventanas de chrome abiertas, y necesito muchas veces tener abierta 2 ventanas organizadas horizontalmente en la pantalla. He usado mucho tiempo el programa X-tile, pero se me hacia un poco tedioso usarlo, para hacer lo que necesitaba. Buscando por la web, encontre el comando wmctrl, y un ejemplo de uso, y lo he modificado para  hacer más sencillo y directo lo que quiero. Os dejo un video de su funcionamiento y su codigo fuente e instalador por si lo quereis usar o modificar para vuestros usos.




'CODIGO FUENTE (VER ARCHIVO EN ENLACE DE DESCARGA: alojado en google drive)

Cógido principal, donde se puede ver como se usa el comando wmctrl:
' Gambas module file
Public Sub Main()
    Dim listaVentanas As String[]
    Dim codigo As String
    'detecto ventanas con Coogle chrome
    Shell "wmctrl -l | grep \"Google Chrome\" | awk '{print  $1}'" To codigo
    Print codigo
    listaVentanas = Split(codigo, "\n")
    If listaVentanas.count > 2 Then
        listaVentanas.Pop() 'quito ultima linea
    Else
        Return
    Endif
    Shell "wmctrl -v -i -r " & listaVentanas[0] & " -e '0,0,0,1280,500'"
    Shell "wmctrl -i -a " & listaVentanas[0]
    Shell "wmctrl -v -i -r " & listaVentanas[1] & " -e '0,0,520,1280,500'"
    Shell "wmctrl -i -a " & listaVentanas[1]
End


Enlaces Interesantes:
https://www.enmimaquinafunciona.com/pregunta/51638/como-utilizo-wmctrl-y-linea-de-comandos-para-hacer-una-ventana-mas-grande-que-la-pantalla-para-obtener-una-captura-de-pantalla-enorme




sábado, 13 de abril de 2019

maratón linuxero: próximo 20 de abril


maratón linuxero: próximo 20 de abril

WEB: https://maratonlinuxero.org





No te olvides que dentro de una semana tenemos una nueva emisión de #MaratonLinuxero conmemorativa del #FLISOL2019. El sábado 20 a partir de las 21:00 (UTC) anímate y participa: preguntas a los Organizadores Nacionales, sorteos y mucho más. @maratonlinuxero

#CompartiendoLibertad


Mastodon:
https://mastodon.social/@maratonlinuxero/101915078055804290

Twitter:
https://twitter.com/maratonlinuxero/status/1116799091076415492

Facebook:
https://www.facebook.com/maraton.linuxero.7





Fuente: 
Canal de telegram: https://t.me/maratonlinuxero










PintaScreen 0.76: Nueva Versión para gambas3.12


PintaScreen 0.76: Nueva Versión para gambas3.12

Tras ejecutar hoy pintascreen en mi ordenador y al intentar añadir una chincheta a una captura del escritorio, me salia el siguiente error:


Revisando el código, me he dado cuenta que con la nueva versión de gambas3.12, había un problema en el código al definir una variable del mismo nombre en dos sitios distintos (en la clase padre y en la hija-heredera)... total que lo he resuelto y ya tenéis disponible la nueva versión corregida en el siguiente enlace:


Para saber más sobre este proyecto de softwarelibre:

Página del proyecto: http://pintascreen.blogspot.com/

Nota:
En la página de descarga del proyecto, os lleva a un directorio de google drive, donde tengo varias versiones, la última versión esta en la carpeta "versión PLUS gambas3.10" y dentro de ellas podeis ver tanto el codigo fuente como el instalador .deb






LibreOffice Calc: Activar / Desactivar el recalculo automático

Tips: Libre Office - Calc


Para Activar o desactivar (sobre todo en hojas grandes y que haya que meter muchos datos antes de calcularlos), podéis ver esta opción en el menú:
Datos / Calcular / Cálculo Automático

También con la tecla F9 podeis recalcular en cualquier momento.




Saludos !!

sábado, 30 de marzo de 2019

Tablas dinámicas en Python con Pandas

Tablas dinámicas en Python

con Pandas




Una de las cosa más útiles que he encontrado en las hojas de cálculo (llámese EXCEL o LIBREOFFICE CALC), son las tablas dinámicas para el tratamiento masivo de datos. Podemos resúmenes y analizar los datos que tenemos, para llegar a conclusiones y extraer la información que nos sea necesaria.

¿pero se puede prescindir de hojas de cálculo, y hacerlo mismo mediante un lenguaje de programación? La respuesta es SI, y en Python tenemos la libreria PANDAS, que nos permite hacer lo mismo.

A continuación os dejo un ejemplo con varios comentarios y "trucos" que yo he encontrado sobre el ejemplo original (os dejo al final de este articulo la referencia a la fuente original).

Ejemplo:
Tenemos un conjunto de datos sobre paises, continentes, población esperanza de vida, continente, etc... y necesitamos obtener varios datos:
1) esperanza de vida media por continente
2) esperanza de vida media por pais
3) esperanza de vida media por año y continente
4) esperanza de vida por año, continente, y agregando funcion  minima y maxima.

Solución:
0) Lo primero que tenemos que hacer es cargar la libreria pandas desde nuestro programa (o consola de python):

import pandas as pd

Una vez hecho esto, vamos a crear una variable que contenga la ruta de los datos.  En el ejemplo original, lo datos están alojados en en una dirección de internet:

data_url='https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv'
 Nota:
 El archivo esta en internet (en https://github.com/resbaz/r-novice-gapminder-files/blob/master/data/gapminder-FiveYearData.csv) , pero podemos descargarlo a nuestro ordenador en modo "raw", por ejemplo usando el comando wget
wget https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv 
 y cambiar la ruta apuntando al lugar donde lo hemos descargado
data_url='/home/nombre_usuario/Descargas/gapminder-FiveYearData.csv'
Y ahora lo leemos:

datos=pd.read_csv(data_url) 

Podemos ver los datos leidos,  usando el comando print:
print(datos.head(5))
Salida generada (las 5 primeras filas del archivo):



Ahora vamos a los puntos a resolver:
1)  esperanza de vida media por continente
Para ello  hacemos un subconjunto de datos, con las columnas cotinent y lifeExp
subdatos=datos[['continent','lifeExp']]

y creamos una variable con el resultado de la tabla dinamica:

tabla=pd.pivot_table(subdatos , values = 'lifeExp' , columns='continent')

y mostramos el resultado de esa tabla dinamica:

print(tabla)


El resultado seria:


2) esperanza de vida media por pais

Para ello  hacemos un subconjunto de datos, con las columnas country y lifeExp
subdatos=datos[['country','lifeExp']]

y creamos una variable con el resultado de la tabla dinamica:

tabla=pd.pivot_table(subdatos , values = 'lifeExp' , columns='country')

y mostramos el resultado de esa tabla dinamica:

print(tabla)

El resultado seria:
 country
Afghanistan                 37.478833
Albania                     68.432917
Algeria                     59.030167
Angola                      37.883500
Argentina                   69.060417
Australia                   74.662917
Austria                     73.103250
Bahrain                     65.605667
Bangladesh                  49.834083
Belgium                     73.641750
Benin                       48.779917
Bolivia                     52.504583
Bosnia and Herzegovina      67.707833
Botswana                    54.597500
Brazil                      62.239500
Bulgaria                    69.743750
Burkina Faso                44.694000
........ 
3) esperanza de vida media por año y continente
subdatos=datos[['continent','year','lifeExp']]
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , index=['year'], columns='continent')
print(tabla)
El resultado:


4) esperanza de vida por año, continente, y agregando funcion  minima y maxima


subdatos=datos[['continent','year','lifeExp']]
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , index=['year'], columns='continent', aggfunc = [min,max])
print(tabla)

El resultado por pantalla seria:
              min                                      max                   \
continent  Africa Americas    Asia  Europe Oceania  Africa Americas    Asia   
year                                                                          
1952       30.000   37.579  28.801  43.585  69.120  52.724   68.750  65.390   
1957       31.570   40.696  30.332  48.079  70.260  58.089   69.960  67.840   
1962       32.767   43.428  31.997  52.098  70.930  60.246   71.300  69.390   
1967       34.113   45.032  34.020  54.336  71.100  61.557   72.130  71.430   
1972       35.400   46.714  36.088  57.005  71.890  64.274   72.880  73.420   
1977       36.788   49.923  31.220  59.507  72.220  67.064   74.210  75.380   
1982       38.445   51.461  39.854  61.036  73.840  69.885   75.760  77.110   
1987       39.906   53.636  40.822  63.108  74.320  71.913   76.860  78.670   
1992       23.599   55.089  41.674  66.146  76.330  73.615   77.950  79.360   
1997       36.087   56.671  41.763  68.835  77.550  74.772   78.610  80.690   
2002       39.193   58.137  42.129  70.845  79.110  75.744   79.770  82.000   
2007       39.613   60.916  43.828  71.777  80.204  76.442   80.653  82.603   

                           
continent  Europe Oceania  
year                       
1952       72.670  69.390  
1957       73.470  70.330  
1962       73.680  71.240  
1967       74.160  71.520  
1972       74.720  71.930  
1977       76.110  73.490  
1982       76.990  74.740  
1987       77.410  76.320  
1992       78.770  77.560  
1997       79.390  78.830  
2002       80.620  80.370  
2007       81.757  81.235  

'Nota:
Los datos al ser muchas columnas, y sobrepasar el ancho de pantalla los divide al mostrarlo.


Código completo del  ejemplo: alojado en google drive


Fuente Original:
http://cmdlinetips.com/2018/12/pivot-table-in-python-pandas/

Otra pagina interesante:
https://www.analyticslane.com/2018/11/23/tablas-dinamicas-en-python-con-pandas/

jueves, 28 de febrero de 2019

Pasando ejemplo Cochesito de OpenScad a Freecad


Pasando ejemplo Cochesito de OpenScad a Freecad

En el siguiente video explico como usar el codigo de un cochesito hecho en openScad a Freecad usando el banco de trabajo que tiene freecad para ello:







OpenSCAD: ejemplos...


OpenSCAD: ejemplos...



Siguiendo los micro tutoriales de openScad [lista de youtube] y otra lista de la 2º temparada [ lista ]de Juan Gonzalez Gomez, os dejo mis primeras pruebas y códigos:

Mi primer ejemplo de OpenSCAD:
//-- girando    objeto siguiente
rotate([0,0,30])
//-- tralado objeto siguiente
translate([50,0,0])
cube([10,10,10],center=true);

rotate([0,0,45])
cube([20,20,5],center=true);
//-- cubo hola mundo
translate([0,0,35])
cylinder(r=20,h=30,$fn=5);
translate([100,0,0])
cylinder(r=20,h=30,$fn=3);

//--taladro... Diferencia entre dos cilindros:
difference() {
translate([00,100,0])
cylinder(r=20,h=20,$fn=50);
translate([00,100,0])
cylinder(r=4,h=165,$fn=20,center=true);}

//-- union + difference -> rueda porta ejes
difference() {
    union(){
    translate([100,50,0])
    cylinder(r=25,h=5,$fn=10);
 
    translate([100,50,0])
    cylinder(r=15,h=25,$fn=10);
     
    }
translate([100,50,-5])
cylinder(r=10,h=35,$fn=30);
}
//-- parametros !!!
//-- Construccion de la rueda a partir de los parametros
grosor=5;
diametro=25;
diameje=8;
//-- Rueda Simple:
translate([100,100,100])
difference(){
    cylinder(r=diametro/2,h=grosor,$fn=50);
    //taladro de 8 mm:
 
    cylinder(r=diameje/2,h=3*grosor,$fn=20,center=true);
}

Mi segundo ejemplo: usando modulo (o funciones), con valores por defecto...
module RuedaSimple(grosor,diametro,diamEje)
{
    difference(){
        //-- Base de la rueda
        cylinder(r=diametro/2,h=grosor,$fn=100);
        //-Taladro del eje
        cylinder(r=diamEje/2,h=3*grosor,$fn=100,center=true);
         
    }
}
RuedaSimple(10,50,10);

translate([100,0,0])
RuedaSimple(diametro=40,grosor=20,diamEje=10);

translate([-100,0,0])
RuedaSimple(40,20,10);

Fijaos que dependiendo si defino los valores de las variables o los pongo sin definir varia la asignación... (me refiero a poner dentro dde la llamada de la funcion "grosor=")



Mi 3 ejemplo: cochesito
Aqui me encontré con la incidencia de tener que poner la ruta completa del archivo, donde esta el modulo de RuedaSimple definido. También añadí el tema de poner colores de las piezas.

use </home/mint/ModuloRuedaSimple.scad>

//-- Chasis del coche
color("green",0.2)
translate([30,0,10])
cube([100,60,5],center=true);

//rueda delantera
color("blue")
translate([0,-30,0])
rotate([90,0,0])
RuedaSimple(10,50,12);

//rueta trasera (un poco mas ancha)
color("red")
translate([60,-30,0])
rotate([90,0,0])
RuedaSimple(20,50,12);

//- ruedas del otro lado (que son simetricas)
mirror([0,1,0]) {
    color("blue")
    translate([0,-30,0])
    rotate([90,0,0])
    RuedaSimple(10,50,12);
 
    color("red")
    translate([60,-30,0])
    rotate([90,0,0])
    RuedaSimple(20,50,12);
}