sábado, 30 de septiembre de 2023

IReport query con where IN o creando un sql dinamico

Hola , de tiempo q escribo, pero me había olvidado estos super tips o funcionalidades en los parametros del query de ireport/jasperreeports, aqui vamos:

1) En SQL es muy util el operador de comparación IN en un where, por ejemplo:

select * from mitabla where campo1 IN ('a','x','z')

en ireport el SQL query con el parametro seria de la siguiente forma:

select * from mitabla where $X{IN,campo1,parLetras}

donde parLetras debe ser de tipo java.util.Collection, pongo el código jrxml `para un mejor ejemplo:

<parameter name="parLetras" class="java.util.Collection">
<defaultValueExpression><![CDATA[java.util.Arrays.asList("a")]]></defaultValueExpression>

2) Que sucedería si por algun motivo no puedes construir el IN de la forma anterior y lo unico que quieres/puedes es pasarle un String que contenga los valores del IN, por ejemplo:

String parLetras ="'a','x','z'";

entonces, jasperreports nos da el parametro $P!
en ireport el SQL query con el parametro seria de la siguiente forma:

select * from mitabla where campo1 IN ($P!{parLetras})

el $P! pone el texto tal cual en el query, no solo en where sino donde uds quieran,
tal es asi que se podria hacer lo siguiente:

String parMiQuery = "select * from mitabla where campo1 IN ('a','x','z')";

y en ireport el SQL query con el parametro seria:

$P!{parMiQuery}

sí!! solo eso, nada mas, porque usará el exto tal cual en el query de jasperreports.


Espero hayan entendido y les ayude

Mas info en: https://community.jaspersoft.com/questions/516502/x-and-p

Bytes

miércoles, 23 de noviembre de 2022

Crear una tabla "On-the fly" en un Query MySQL/MariaDB

 Holaa... antes lo hice en PostgreSQL (https://inkahack.blogspot.com/2012/12/crar-una-tabla-on-fly-en-un-query.html), pero ahora tambien vi que se puede en MySQL > 8.0.19 y MariaDB > 10.3

SELECT 1 AS x ,2 AS y
UNION 
VALUES (3,4),(5,6);


Bytes




martes, 20 de septiembre de 2022

Jbutton Icono centrado y texto debajo

 Se agrega el icono deseado,

Se cambia las siguientes propiedades del Jbutton:

  1. HorizontalTextposition: CENTER
  2. VerticalTextposition: BOTTOM
Es todo. 

Bytes

sábado, 5 de octubre de 2019

Matar todas las conexiones con un SELECT

Hola, a veces queremos matar todas las conexiones a una base de datos en un SGBD PostgreSQL sin tener que reiniciar el servicio; pues es muy sencillo, solo debes ejecutar la siguiente instrucción:


SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TuBasedeDatos'  AND pid <> pg_backend_pid();

Y listo!!
Bytes

sábado, 19 de enero de 2019

Formatear y usar fechas en Java sin usar la clase "Deprecada" Date

La nueva clase que se debe usar para fechas es GregorianCalendar, hay toda una explicación técnica de porque ya no se debe usar la vieja y fiel Date en: https://docs.oracle.com/javase/8/docs/api/java/util/Date.html

Bueno a lo nuestro con el ejemplo


public static void main(String[] args) {
       
        SimpleDateFormat fechaformat2 = new SimpleDateFormat("EEEE',' dd 'de' MMMM 'del' yyyy", new Locale("es", "PE"));
        GregorianCalendar fecha = new GregorianCalendar();
       
        System.out.println(fechaformat2.format(fecha.getTime()) );
       
        fechaformat2.applyPattern("dd/MM/yyyy");
        System.out.println(fechaformat2.format(fecha.getTime()) );
           
    }

Listo.. bytes

domingo, 16 de diciembre de 2018

Instalar SSL en Tomcat 7 facil con .pfx o .p12

Holas, una manera fácil de activar https o SSL en tomcat con un certificado digital ya emitido. Pasos para Centos 6 y Tomcat 7.

1. Generamos el archivo pfx o p12 si no lo tuviéramos. Se debe tener el .cer el .key y el .cer de la Autoridad Certificadora:

openssl pkcs12 -export -in micertificado.crt -inkey miclaveprivada.key -out mipkcs12.p12 -name tomcat -CAfile certificadodeca.crt -caname root -chain

Te va a pedir la clave privada, la colocas dos veces y ya.
Esto genera un archivo mipkcs12.p12

*Actualizacion: Si al usar el comando anterior te da el error "Error unable to get issuer certificate getting chain.", entonces debes hacer lo siguiente (al menos en Centos 6 fue asi):

cat certificadodeca.crt /etc/ssl/certs/ca-bundle.crt > allcacerts.crt

eso te genera un nuevo archivo allcacerts.crt, usas este archivo como el certificado de la  Autoridad Certificadora, asi que el comando a ejecutar ahora seria como sigue:

openssl pkcs12 -export -in micertificado.crt -inkey miclaveprivada.key -out mipkcs12.p12 -name tomcat -CAfile allcacerts.crt -caname root -chain

listo!! ahora si.. a poner clave y te genera el .p12


2. Modificamos el archivo server.xml de Tomcat 7 y agregamos el siguiente conector:

          port="8443" minProcessors="5" maxProcessors="75"
          enableLookups="true" disableUploadTimeout="true"
          acceptCount="100"  maxThreads="200"
          scheme="https" secure="true" SSLEnabled="true"
          keystoreFile="mipkcs12.p12"
          keystorePass="tuclaveprivada"
          keystoreType="PKCS12" />

En el parámetro keystoreFile="mipkcs12.p12" deben poner la ruta completa donde esta ubicado su archivo.
No estoy muy seguro de estos dos parámetros minProcessors="5" maxProcessors="75", pero funciona. Guardas, reinicias Tomcat y listo.. ya tienes tomcat en puerto 8443 con tu certificado.
Bytes


Referencias:
https://www.tbs-certificates.co.uk/FAQ/en/118.html
https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Prepare_the_Certificate_Keystore

https://superuser.com/questions/1142555/openssl-p12-generation-failing-with-ca-bundle-chain-option

sábado, 20 de octubre de 2018

Dividir un archivo y volverlo a unir

Holas.. algo muy super practico es la utilidad split para dividir un archivo en partes mas pequeñas y luego volver a unirlos con cat.

Los comandos implicados entonces son split y cat.
Haré el ejemplo comprimiendo primero un archivo de backup plano muy grande de una pase de datos con gzip.

Comprimir el archivo dump

gzip midb.dump.out

Dividir el archivo comprimido gz en partes de 50 Megas:

split -b 50M midb.dump.out.gz midb.dump.out.gz_part_

Unir el archivo

cat midb.dump.out.gz_part_* > midb.dump.out.gz

Y si quieren volver a descomprimir:

gzip -d midb.dump.out.gz

Listo, ya es decisión suya que hacer con los archivos pequeños.. backups.. transmisiones.. etc etc.

Bytes

domingo, 13 de agosto de 2017

Instalar cliente dyndns en Centos6

Este manual instala un cliente basado en perl llamado ddclient
*Basado en:
https://techjourney.net/install-ddclient-dynamic-dns-ddns-update-client-in-centos/
https://help.dyn.com/ddclient/

1. Instalar los paquetes necesarios en el SO
yum install perl perl-Net-IP perl-Net-DNS perl-IO-Socket-INET6 perl-IO-Socket-SSL perl-File-Temp patch

2. Descargar ddclient de sourceforge
wget http://downloads.sourceforge.net/project/ddclient/ddclient/ddclient-3.8.3/ddclient-3.8.3.tar.bz2

3. Instalar manualmente ddclient: se descomprime, se copia el ejecutable en sbin, se crean las carpetas para el servicio y para el cache, se copian los archivos de configuracion de ejemplo.

tar -xvf ddclient-3.8.3.tar.bz2
cd ddclient-3.8.3
cp ddclient /usr/sbin/
mkdir /etc/ddclient
mkdir /var/cache/ddclient
cp sample-etc_ddclient.conf /etc/ddclient/ddclient.conf
cp sample-etc_rc.d_init.d_ddclient /etc/init.d/ddclient

4. Editamos el archivo de configuracion

cd /etc/ddclient/
nano ddclient.conf

5. Agregamos al final del archivo lo siguiente:

use=web, web=checkip.dyndns.com/, web-skip='IP Address'
login=su-username
password=su-password
protocol=dyndns2
server=members.dyndns.org
wildcard=YES
su-dominio.dyndns.org

6. Reemplazamos usuario, password y dominio según corresponda, guardamos los cambios

7. Agregamos el servicio al SO

chkconfig --add ddclient

8. probamos que funcione

ddclient -daemon=0 -debug -verbose -noquiet

9. Si todo OK, iniciamos el servicio

service ddclient start

Listo!! bye

lunes, 23 de enero de 2017

Tomcat escucha en un puerto adicional

Holas, si queremos hacer que nuestro tomcat escuche no solo por el puerto 8080 sino por otro puerto mas (y esto lo tuve que hacer porque Claro no apertura el puerto 8080 ni 80) solo debemos entrara a la carpeta conf y al archivo server.xml, encontraras la siguiente sentencia:

               connectionTimeout="20000"
               redirectPort="8443" />

debemos copiarla y pegarla cambiando el puerto adicional que queremos escuche Tomcat

                   connectionTimeout="20000"
               redirectPort="8443" />


Grabamos, reiniciamos Tomcat y ya.. es todo.

Suerte!!

miércoles, 2 de noviembre de 2016

Activar/Instalar sys_exec en MariaDB 10 Centos 6 64bits

0. Asegurate de tener instalado los paquetes MariaDB-devel.x86_64, MariaDB-shared.x86_64 y gcc.x86_64.

1. Descargar lib_mysqludf_sys-master.zip de https://github.com/mysqludf/lib_mysqludf_sys#readme, puedes llegar ahí también por la pagina de UDFs http://www.mysqludf.org/.

2. Descomprimir en algún directorio, para el ejemplo sera /root y cambiar los permisos: chmod -R 777 lib_mysqludf_sys-master

3. En la carpeta descomprimida editar el archivo Makefile (yo uso nano, así que seria nano Makefile), archivo debe quedar como sigue:

LIBDIR=/usr/lib64

install:
        gcc -Wall -m64 -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so -fPIC

4. Ejecutar ./install.sh , les dará un error al final ignorenlo.

5. Copiar el nuevo archivo a la carpeta de plugins:

cp  /usr/lib64/lib_mysqludf_sys.so /usr/lib64/mysql/plugin/

6. Volver a correr ./install.sh, y ahora si no mostrara ningun error.

7. Entra a la consola de mysql y prueba que funciona con:

SELECT sys_exec ('touch /tmp/test.txt ')

Vas al directorio /tmp y debe estar allí el archivo test.txt

That's all a jugar cn el sys_exec en mariadb. :)



miércoles, 31 de agosto de 2016

Software Visual para aprender programación

VisualAlgo 
Es un software basado en web que permite visualizar la ejecución de algoritmos de forma bastante didáctica, tanto en código (como una especie de seguimiento o debug) y con ejemplos concretos (como el ordenamiento de piezas de diferentes valores representados en tamaños equivalentes, etc).

Esta herramienta presenta diferentes estructuras de datos y algoritmos para trabajar con éstas; como los diferentes tipos de ordenamiento, árboles, gráfos, MST, etc. Es interesante mencionar que esta herramienta fue diseñada y desarrollada por Steve Halim, conocido coach de las competencias ICPC ACM con equipos de Singapur, junto con sus alumnos.

http://www.comp.nus.edu.sg/~stevenha/visualization/index.html


AlgoViz
http://algoviz.com/ que permite ver de forma visual el comportamiento de muchos algoritmos ...

JGrasp
http://www.jgrasp.org/ basicamente sirve para ver de forma visual la estructura interna e una variable cualquiera
es especialmente util para visualizar cosas un poquito mas complejas como listas, arboles, etc ...
cualquier compilador solo muestra el contenido de una variable ... este las grafica y ayuda mucho a ver como esta armandose una estructura ...

Ambas herramientas las vi en el SIGCSE ya desde hace un par de años ... es fuertemente recomendado que vayan a ese evento todos los años especialmente los profesores y directores ... es bueno observar como se esta enseñando computacion en otras partes del mundo ...

(Aportes de Rudy Godoy y Ernesto Cuadros)

lunes, 11 de enero de 2016

Cerrar todas las conexiones de un usuario en MySQL/MariaDB

Basado en http://www.itmovil.com/2012/04/25/cerrar-todas-las-conexiones-de-un-usuario-en-mysql/

Abrir conexión por el cliente de consola de MySQL/MariaDB:

mysql -u root -p

luego creamos dinamicamente todas las sentencias para todos los procesos activos de un determinado usuario y lo guardamos en un archivo del disco duro, para ello ejecutamos :

select concat('KILL ',id,';') from information_schema.processlist where user='usuariodb' into outfile '/tmp/a.txt';

Ahora lo único que se debe hacer es ejecutar el archivo de texto que contiene las instrucciones, para ello ejecutamos

source /tmp/a.txt;

That's all..


martes, 19 de agosto de 2014

Imprimir un comprobante desde web con un applet


Holas!!, como siempre un gran problema al hacer un sistema web de venta retail oal menudeo es la impresion de comprobantes, porque debemos hacerlo al estilo "desktop", es decir sin pasar por un pdf previo.. o un "diseño" html con impresion javascript, porque debemos usar muchas veces la "potencia" de impresoras matriciales. Entonces si lo hacemos con tecnologia MS la solucion es a traves de un COM/DLL o como quieran llamarlo. Si es con nuestro querido java entonces debemos incrustar en un jsp un lindo Applet que llame a un bonito diseño en jasperreport que se conecta a nuestra base de datos en forma remota desde el cliente.

Como hacemos eso???? Pues aqui viene la explicacion (vale decir que tambien sirve para cualquier applet que quieran se conecte a una base de datos remota)
 
1. Crear su applet en netbeans, sino saben como se crea un applet pueden seguir el tutorial de aqui:
https://netbeans.org/kb/docs/web/applets.html

2. Firmar sus .jar ; tanto el applet .jar como las librerias adicionales que esten usando en su Applet. Para este caso especifico del comprobante:
 postgres jdbc
     postgresql-8.1-414.jdbc2ee.jar
 jasperreports libs
     commons-collections-3.2.1.jar
     commons-digester-2.1.jar
     commons-logging-1.1.jar
     jasperreports-5.1.0.jar
     groovy-all-2.0.1.jar (este lo pueden obviar si cambian el lenguaje groovy por java en el mismo jasper            diseñado)

Ahora para firmar los .jar seguimos estos 3 pasos desde consola linux o DOS (el keytool y jarsigner estan en la carpeta de ejecutables donde instalaste tu JDK):

                              1. keytool -genkey -keystore myKeyStore -alias me
                              2. keytool -selfcert -keystore myKeyStore -alias me
                              3. jarsigner -keystore myKeyStore jarfile.jar me

Cuando te pregunte por la clave coloca la de tu gusto, lo demas dejalo como "default" o si deseas pon la informacion de tu empresa u organizacion, eso lo decides tu,

3. Recuerda que la etiqueta HTML debe ser algo como esto:

codebase="classes" 
code="comet/ClsPrint.class" 
archive="printApplet.jar,
postgresql-8.1-414.jdbc2ee.jar,
commons-collections-3.2.1.jar,
commons-digester-2.1.jar,
commons-logging-1.1.jar,
groovy-all-2.0.1.jar,
jasperreports-5.1.0.jar" 

El codebase indica la carpeta donde estaran los .jar , el code es la clase que se ejecutara cuando el Applet cargue.
Si desean ver los errores de su applet no olviden activar la consola de Java.

Eso es todo.. hasta otra

jueves, 5 de junio de 2014

Icono personalizado en Java Swing

Esto solo funciona en JFrame;
Agregar lo siguiente en su Form

@Override
    public Image getIconImage() {
        Image retValue = Toolkit.getDefaultToolkit().
                getImage(ClassLoader.getSystemResource("imagenes/icono.png"));
        return retValue;
    }

donde icono.png es tomado de un paquete de recursos que usas en tu proyecto

Luego ir a la ventana de propiedades, escoger la propiedad "IconImage", click en el boton.

Cambiar la propiedad de "Set Form's iconImage property using" a "Value from existing component"

Luego cambiar "Get value from" a "Property", presionar el boton, seleccionar IconImage en la ventana que se abrio.

Luego acepta acepta y listo.. icono cambiado de su proyecto.

Bye

Eliminar registros duplicados en una tabla mysql

La forma mas facil es crear un indice unico usando el indicador IGNORE:

ALTER IGNORE TABLE `mitabla`
ADD UNIQUE `mitabla_idx1` (`campo1`, `campo2`);

Lo probe en tablas tipo myisam e innodb en MySQL 5.1

Me ayudo mucho este link :
http://blog.openalfa.com/como-eliminar-registros-duplicados-en-una-tabla-mysql

Bye


miércoles, 26 de junio de 2013

Agregar JComboBox a JTable en Netbeans visualmente

Holas.. otro tip.. para escribir menos codigo y usar mas el IDE Netbeans.. ahora agregaremos un JComboBox a una columna del JTable, en realidad tambien funciona con cualquier componente (creo) :P

1. Agregar el JCombobox al JFrame/JDialog, esto se hace en la ventana "Navigator" (normalmente ubicada en la parte inferior izquierda) en el nodo "Other components" click derecho "Add from palette" ->  "Swing Controls" -> "Combo Box"

2. Personalizar su combobox como quieran, yo le cambiare el nombre a "micombobox" haciendo click derecho sobre jComboBox1 y "Change variable Name"

3. Ahora vamos al Jtable que ya deben haber agregado en su JFrame/JDialog y le hacemos click derecho y escogemos "Table contents", y en la ficha "Columns" seleccionamos la columna que queremos tenga el JComboBox.

4. Una vez seleccionada la columna vamos a la propiedad "Editor:" ubicada en la parte inferior y hacemos click en el boton "...".

5. En la nueva ventana "editor" cambiamos "Set editor property using:" escogiendo "Custom Code", en la parte inferior tenemos ahora una caja de texto que indica "Property Code: ", alli ponemos:

new javax.swing.DefaultCellEditor(micombobox)

le damos click a "OK" y listo!!.. ya tenemos nuestro combobox en la columna.. con minimo esfuerzo

See yaaa




miércoles, 3 de abril de 2013

Agregar titulo a JTable/Tabla en Netbeans visualmente

Bueno espero le sirva a alguien mas:

1. Agregar el JTable a tu form (obvio).
2. Click derecho sobre el JTable y seleccionar "Enclose in" -> Panel.
3. En el navegador de objetos seleccione el JPanel que contiene ahora a su jScrollPane/JTable.
4. En la ventana de propiedades editar la propiedad "border" .
5. En la ventana que parecio escoger "Titled Border", en  la misma ventana llenar la propiedad "Tittle" con el titulo que deseen que parezca.
7. Click en el boton OK y listo!!! su Tabla ya tiene titulo.

Vean que al seleccionar "Titled Border" tienen otras propiedades mas para personalizar su titulo como fuente, tamaño de fuente, color, etc

Suerte!!

martes, 2 de abril de 2013

Quince frases geniales de Albert Einstein


1. "La mente es como un paracaídas… Solo funciona si la tenemos abierta".
2. "Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas".
3. "La imaginación es más importante que el conocimiento".
4. "El mayor misterio del mundo es que resulta comprensible".
5. "Todo debe simplificarse lo máximo posible, pero no más".
6. "El secreto de la creatividad es saber cómo esconder tus fuentes".
7. "Toda la ciencia no es más que un refinamiento del pensamiento cotidiano".
8. "La educación es lo que queda una vez que olvidamos todo lo que aprendió en la escuela".
9. "Lo importante es no dejar de hacerse preguntas".
10. "Nunca pienso en el futuro. Llega demasiado pronto".
11. "Dos cosas son infinitas: la estupidez humana y el universo; y no estoy seguro de lo segundo".
12. "No todo lo que cuenta puede ser cuantificado, y no todo lo que puede ser cuantificado cuenta".
13. "Locura es hacer la misma cosa una y otra vez esperando obtener diferentes resultados".
14. "Primero tienes que aprender las reglas del juego, y después jugar mejor que nadie".
15. "Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad"

lunes, 17 de diciembre de 2012

Crear una tabla "On-the fly" en un Query PostgreSQL

Holas, no sabia que se podia hacer esto en PGSQL, pero es muy util cuando uno esta haciendo pruebas de funciones o de querys y quiere data de prueba sin necesidad de tener que crear una tabla fisicamente, la solucion es construir tuplas asignarles una cabecera y darles un alias.. y listo.. asi como en el ejemplo :

select
* from
(values(100,'JUAN'),(200,'LUCHO'),(300,'ARMANDO'),(400,'JOSE'),(500,'adrian')) as a(codigo, nombre)
order by a.nombre

espero que a algiuen mas le sirva. Bye

lunes, 18 de junio de 2012

Enviar LogWatch sin servidor de correo localhost

Holas, eso de administrar varios servidores es algo complejo, una buena herramienta es usar LogWatch que envia un resumen de tus archivos de Log diariamente, pero este programa funciona bien siempre y cuando tengas un smtp server en el mismo equipo, pero que sucede si no tienes este "smtp server en tu localhost", pues aqui esta la solucion.. generar un archivo texto con el resumen y luego enviarlo usando el programita sendEmail.

1. Instalar Logwatch si no lo tienes instalado
yum install logwatch

2. Descargar sendEmail en algun directorio (para este ejemplo /root)
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz

3. Descomprimir
tar -zxvf sendEmail-v1.56.tar.gz

4. Mover o Copiar la carpeta descomprimida a /usr/lib, en mi caso mover
 mv sendEmail-v1.56 /usr/lib

5. Crear un enlace simbolico para la ejecucion de sendEmail desde cualquier directorio
ln -s /usr/lib/sendEmail-v1.56/sendEmail /usr/bin/

6. Editar Logwatch.conf para que genere un archivo de texto
nano /usr/share/logwatch/default.conf/logwatch.conf

- Descomentamos la linea
Save = /tmp/logwatch

- y comentamos la linea
#mailer = "sendmail -t"

Guardamos y salimos, o salimos guardando :o)

7. Probamos que logwatch funcione bien, ejecutamos desde la linea de comandos:
logwatch

y luego vemos que haya generado correctamente el archivo:
more /tmp/logwatch

*En algunos sistemas CentOS al ejecutar logwatch pueden tener un error de formato de fecha, eso se corrige con el comando:
echo '-0500' > /etc/timezone

8. Creamos un archivo bash para que haga el envio del archivo /tmp/logwatch:
nano /usr/share/logwatch/logToMail.sh

- Ponemos el sig. contenido:

#!/bin/bash

sendEmail -s mail.miservidor.com:25 -u "Logwatch de Mi Servidor" -t usuariodestino@miservidor.com -f "usuariodestino@miservidor.com" -xu usuariosmtp -xp passwordsmtp -a /tmp/logwatch -m "Logwath de Mi Servidor"

exit


Guardamos y salimos, o salimos guardando :o), para referencia de los parametros de sendEmail pueden poner en al linea de comandos: sendEmail --help


9. Cambiamos los permisos de nuestro archivo logToMail.sh para que sea de ejecucion:
chmod 775 /usr/share/logwatch/logToMail.sh







10. Creamos la regla en crontab para que haga el envio automatico:
crontab -e



- Alli añadimos la linea siguiente para que envie todos los dias a las 6am:
0 6 * * * /usr/share/logwatch/logToMail.sh > /usr/share/logwatch/logToMail.log



Listo!!!, es todo.. bye