Mostrando entradas con la etiqueta Programacion. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programacion. Mostrar todas las entradas

sábado, 20 de enero de 2024

Actualizar PHP y su referencia en Apache2

Tras actualizar PHP y tener la nueva versión 8.3 varias cosas dejaron de funcionar y como siempre olvido los pasos a seguir para corregir, mejor lo dejo de referencia para el futuro :P

Si hay una nueva versión de PHP instalada y se estaba usando mysql como motor de base de datos, se debe validar que está instalado el módulo correspondiente a la nueva versión o instalar si hace falta:

sudo apt install php8.3-mysql

Ajustar las versiones de PHP en uso validando que corresponde a la última:

sudo update-alternatives --config php

sudo update-alternatives --config phar

sudo update-alternatives --config phar.phar

NOTA: en caso de tener otros módulos, se debe ejecutar comando sobre ellos igual, ej: phpize, php-config.

Si se quiere hacer el ajuste manualmente se pueden utilizar los comandos a2dismod y a2enmod:

sudo a2dismod php8.2

sudo a2enmod php8.3

En caso de estar usando carpetas de usuario para contenido web, se debe eliminar la restricción en apache:

sudo vi /etc/apache2/mods-enabled/php8.3.conf

Comentando la parte del mod_userdir con #

#<IfModule mod_userdir.c>
#    <Directory /home/*/public_html>
#        php_admin_flag engine Off
#    </Directory>
#</IfModule>

Revisar la configuración de php para la versión actual en caso de ajustes realizados en la versión previa:

sudo vi /etc/php/8.3/apache2/php.ini

Para finalizar se debe reiniciar apache:

sudo service apache2 restart
Y listo, ya todo debiera funcionar nuevamente sin problemas :)

Referencia:

https://httpd.apache.org/docs/2.4/howto/public_html.html

https://slaford.com/laravel/how-to-switch-php-versions-on-command-line-ubuntu/ 

domingo, 1 de mayo de 2022

Sesiones en PHP

Luego de crear una sesión con session_start(), lo recomendado es administrar dichas sesiones usando la variable global $_SESSION, agregando ahí un parámetro de tiempo referencial y luego validar si ese tiempo se cumplió o no, por ejemplo:

$_SESSION['fin'] = time() + 30 * 60 // tiempo en segundos plazo 30 minutos * 60 segundos

A pesar de haber configurado el valor y que el tiempo aún no expire, en algunos casos el usuario puede que reciba un término anticipado de la sesión teniendo que volver a ingresar, pero ¿por qué pasa eso? :/

Aparte de las variables de manejo de las sesiones, hay que recordar validar el tiempo del recolector de basura de PHP que va eliminando archivos temporales en el servidor, eso incluye los archivos asociados a sesiones. El tiempo por defecto es de 1440 segundos (24 minutos). Si se manejan sesiones de mayor tiempo se debe ajustar también ese parámetro de lo contrario si no hay actualizaciones el archivo de sesión será eliminado. Para ajustar se debe ir al archivo de configuración de apache "php.ini" y cambiar el valor del parámetro "session.gc_maxlifetime".

Dependiendo de la versioń de PHP es el archivo a configurar, por ejemplo para versión 7.3:

/etc/php/7.3/apache2/php.ini

Luego de ajustar el valor, se debe reiniciar el servicio:

service apache2 restart

o

systemctl restart apache2

No olvidar dejar un tiempo mayor al que se utiliza en el código y ahora sí todo está listo para administrar correctamente esas sesiones :D

Referencias:

https://www.php.net/manual/en/session.configuration.php

https://www.codeleaks.io/increase-session-timeout-in-php/

jueves, 7 de marzo de 2019

Nintex workflow: Cómo redondear un número / how to round a number

Desde hace un tiempo estoy trabajando con Nintex workflow para automatizar tareas en Sharepoint.
Hoy me topé con una tarea que inicialmente parecía fácil: calcular un valor y redondear el resultado. Contrario a lo que pensé, no había una opción directa para redondear :O
En varias partes leí algunas formas de hacerlo, sin embargo, mencionaban que se hacía de una forma para valores menores a 1000 y otra para mayores a 1000, por qué? Porque el número quedaba formateado como "1,000" lo que da error en uno de los pasos. Eso es válido hasta cierto punto, en realidad el error depende del idioma en el que esté el sitio donde esté alojado el worfklow. En este caso, el subsitio del Sharepoint en el que estaba trabajando está en español (es-CL) lo que da que el separador de miles es "." (punto) y para los decimales es "," (coma). Bajo ese formato, el problema de la conversión aplica para valores con decimales, peeero en realidad es fácil de resolver y no es necesario utilizar la opción de expresión regular que vi por ahí. Ahora voy a ello :)
Como mencioné antes, no existe una acción del tipo "redondear" para configurar en el nintex workflow, así que se debe usar una de las funciones inline, que en este caso es fn-Round(numero).
Al usar la función es donde se debe tener cuidado, para evitar error de conversión se debe agregar un tag de inicio y fin para indicar dónde está nuestra variable númerica: {TextStart}variable{TextEnd}

Los pasos:
- Supongamos que tenemos las variables: numeroDecimal (tipo número) y resultadoTxt (tipo texto).
- Crear una cadena de texto con la fórmula y el número a redondear, almacenar en la variable de tipo texto.
fn-Round({TextStart}{Workflow variable:numeroDecimal}{TextEnd})
- Convertir el string a número.

Y listo, con eso se tiene el valor redondeado.
En el caso de omitir los tag de inicio y fin en la fórmula, el workflow dará un error como éste:

Error parsing value. Value 'fn-Round(95,24)' is not compatible with the selected output variable type Number (double).

Esto sucede porque el procesador de la fórmula asume que la coma corresponde al paso de una segunda variable, es decir, en vez de tomar "95,24" como un único número, asume que son dos: "95" y "24", lo que excede la cantidad de parámetros de la fórmula en sí.

Creo que no es necesario realmente crear la variable de texto y almacenar la fórmula ahí, quizás es posible poner la fórmula directo en la opción de convertir valor, pero no alcancé a probar eso. De ser posible podría quedar todo en una única acción... ideal o no?


NOTA:
La función fn-Round como función inline a diferencia de su uso en los formularios (nintex form), no  permite indicar la cantidad de decimales, sino que simplemente aproxima al entero que corresponda.

Referencia:
Funciones inline: https://help.nintex.com/en-US/nintex2016/current/sp2016/Workflow/Reference/WFInlineFunctions.htm
Redondear número: https://www.codesigned.com/blog/round-a-number-with-nintex-workflow

domingo, 23 de diciembre de 2018

Bot para Telegram con certificado digital autofirmado (self-signed certificate)

Esta entrada es para aquellos que están empezando a trabajar con bots para telegram y que estén teniendo problemas para que su bot reciba los mensajes después de configurar los parámetros de webhook.

La información se encuentra disponible en la documentación de Telegram, sin embargo, entre tanto paso uno se pierde, porque vi más de una pregunta sobre lo mismo: configurar webhook con certificado local, probar procesar mensajes y que no pase nada. El resumen del problema es que el certificado está mal publicado y no nos enteramos :P

Acá un resumen de lo que se debe hacer y cómo dejar el bot funcionando :)

1) Eliminar la asociación anterior del webhook para configurar de nuevo

curl -F "url="  https://api.telegram.org/bot[TOKEN_ID]/setWebhook

Donde "[TOKEN_ID]" obviamente corresponde al token asociado a al bot que se está configurando.


2) Crear el certificado digital con formato PEM para el servidor que se está utilizando y utilizar ese archivo para la navegación https.
En mi caso lo dejé a 3 años ya que es seguro que un año pasa volando, pero eso depende del gusto de cada uno.

openssl req -newkey rsa:2048 -sha256 -nodes -keyout server.key -x509 -days 1095 -out server.pem -subj "/CN=tu.dominio.cl/C=CL/ST=Santiago/L=Santiago"

Acá lo importante es el campo CN dado que debe coincidir con el nombre del servidor para el cual se está creando el certificado. Si ese parámetro está incorrecto, no se validará la navegación entre servidores y el bot no recibirá nada (punto a validar).

3) Asociar el certificado al bot.

curl -F "url=https://tu.dominio.cl/ruta/bot.php" -F "certificate=@/ruta_local/del/archivo/server.pem" https://api.telegram.org/bot[TOKEN_ID]/setWebhook

url = la ruta pública al código del bot.
certificate = ruta del archivo server.pem en el servidor (ruta local).


Si la ruta local del archivo .pem está incorrecta, y a pesar de que el registro del webhook diga que fue exitoso, no se validará la navegación entre servidores y el bot por lo que tampoco se recibirán los mensajes.



4) Revisar el estado del bot en Telegram para confirmar que el certificado está correctamente publicado y funcionando.

https://api.telegram.org/bot[TOKEN_ID]/getwebhookinfo

Si todo va bien, ahí aparecerá que se está utilizando un certificado de forma correcta.

has_custom_certificate: true

En caso de ir algo mal con el certificado, aparecerá un mensaje en ese parámetro. De ser así revisar los puntos marcados con rojo en los pasos anteriores y que coincidan con los valores reales de nombre, token y servidor.

Ahí lo tienen, luego de corregir el detalle del certificado y la ruta, quedará funcionando sin problemas :)
Algo a comentar es que si estuvieron haciendo pruebas enviando mensajes durante un rato y luego de que la configuración queda correcta, empezarán a recibir respuesta por todos esos mensajes de prueba que enviaron ya que quedan en cola en el servidor de Telegram por 24hrs :P.


NOTA:
Asociado al punto 3, aparte de asociar el certificado al bot, debe utilizarse ese certificado en la navegación https del servidor. Para activar la navegación https, si se está usando apache lo práctico es usar la ruta oficial, en ese caso sería dejar los archivos server.key y server.pem en /etc/apache2/ssl, además de cargar esa ruta en el archivo de configuración /etc/apache2/sites-available/default-ssl.conf con los siguientes parámetros:SSLCertificateFile      /etc/apache2/ssl/server.pem
SSLCertificateKeyFile /etc/apache2/ssl/server.key


Referencias:
https://core.telegram.org/bots/webhooks#a-self-signed-certificate
http://snakelab.cc/2016/10/28/telegram_gem_and_self_signed_cert.html

domingo, 30 de marzo de 2014

Java: Creando archivos .CSV para Excel

Muchas veces es necesario exportar datos a un archivo para que sea manipulado en Excel por los usuarios. En esos casos, lo más rápido es exportar a archivos delimitados por coma (.CSV) ya que en realidad son simples archivos de texto con un delimitador (coma "," o punto-y-coma ";").
Cuando se trabaja con Java, una forma rápida de crear archivos cuando ya se tiene el texto en un String, es simplemente crear una variable FileWriter y escribir con el método "write" nuestro String, eureka! ya tenemos nuestro archivo.
Hasta ahí todo bien, pero el problema comienza cuando agregamos caracteres especiales, como por ejemplo letras con tildes (á, é, etc). Por defecto al escribir usando FileWriter la codificación utilizada es UTF-8, lo que está bien para agregar caracteres especiales, sin embargo, cuando el programa Excel abre uno de estos archivos no es capaz de reconocer la codificación correcta mostrando de forma errónea los caracteres especiales.
Para corregir esto, una forma fácil es agregar el caracter BOM al momento de comenzar escribir el archivo.
La forma de hacerlo:

FileWriter fwriter = new FileWriter(nombreArch); 
fwriter.write('\ufeff'); 
fwriter.write("El resto del texto"); 

Y taraaannn! ahora Excel reconoce de forma correcta la codificación del archivo y por ende muestra todos los caracteres como corresponde :D
En el caso de usar OutputFileStream, se recomienda utilizar el constructor donde se especifica la codificación a utilizar.

OutputStreamWriter(OutputStream out, Charset cs) 
InputStreamReader(InputStream in, Charset cs)

Eso es todo por ahora, más abajo dejo un ejemplo y algunas referencias.
No olviden comentar si tienen otras formas de corregir lo de la codificación ;)

domingo, 19 de septiembre de 2010

Aplicación en Java utilizando una base de datos embebida

Desde hace un buen rato he estado tratando de decidir qué base de datos utilizar en una aplicación en Java que estoy haciendo y luego de darle varias vueltas las opciones que quedaban eran:

- HSQLDB (http://hsqldb.org/)
- H2 (http://www.h2database.com/)

De las dos opciones la que más ubicaba era HSQLDB por ser utilizada por programas como el OpenOffice, JDownloader, Sockso, etc. Sin embargo, luego de leer un buen resto, le daré una oportunidad a la H2 :P... esto principalmente porque el desarrollador de ella corresponde al creador original de la HSQLDB.

La gracia de este tipo de bases de datos es que son embebidas, es decir, no es necesario instalarlas en el computador donde se ejecutará la aplicación (programa base), sino que sólo se carga una librería dentro de él y listo :)


Hablando un poco de las bases de dato que dejé cómo opción (H2 y HSQLDB): Como todo en esta vida, hay que ver lo malo y lo bueno...

Lo que siempre habrá de tenerse en mente es que ambas trabajan con archivos de texto para guardar y cargar en el inicio, dejando la información en memoria, por lo que hay que tener en cuenta la capacidad del computador donde se trabajará. De por sí la máquina virtual de java (JVM) tiende a consumir grandes cantidades de memoria con programas que se ejecutan por largo tiempo y con mucho manejo de información. Un ejemplo, la JVM se dispara cuando se descargan cosas con el jdownloader y se deja muchas horas o algunos días encendido (especialmente cuando se bajan pelis :P).

Lo bueno de este tipo de BD es que pueden ser configuradas para ser accedidas sólo por la aplicación que la carga o bien como servidor, evitamos instalar algo adicional para que nuestra aplicación funcione -a estas alturas un gran porcentaje de usuarios tiene instalada por defecto la JVM-, permite trabajar con Hibernate y lo importante es que podemos trabajar con código SQL de forma directa... además del hecho que ambas son opensource :)

Otro punto a favor de este tipo de bases de datos, es que al ser de fácil y rápido uso, nos sirven para hacer pruebas en aplicaciones que serán utilizadas para conectarse a otras bases de datos más robustas.

Ya en un próximo post hablaré un poco de cómo usar la H2 ;)

Referencias:
Wiki - Embedded database
Wiki - Comparison of relational DB
H2 Database Engine
HSQLDB - HyperSQL

domingo, 28 de marzo de 2010

Visual Editor y Eclipse

Retomando la sana costumbre de programar por gusto (xD), me dio por querer programar algo en java, pero para hacer algo completo tenía que incluir una parte gráfica... obvio :P
Para hacer eso, se me ocurrió probar una herramienta que no había utilizado anteriormente, el "Visual Editor" que viene como plugin del Eclipse.
Para aquellos que no lo conocen, el programa Eclipse es un "entorno de desarrollo integrado" más conocido por su sigla en inglés "IDE" (integrated development environment) que brinda todo un escenario para programar tranquilamente. Originalmente lo conocí sólo para java, pero con los plugins se puede configurar para programar hasta PHP. La descripción de este programa en sus colores y sabores lo dejáre para alguna otra publicación, por ahora me centraré en la instalación del plugin "Visual Editor" -que harto dolor de cabeza me dio :P-
La versión resumida de instalación es:

Para evitar conflictos y tener el Visual Editor funcionando hay que usar:
- Eclipse 3.5 SDK (no JEE, no Java)
- Visual Editor 1.4 usando el asistente de instalación del Eclipse

Si quieres revisar la instalación completa sigue leyendo, de lo contrario puedes quedarte hasta acá y a programar se ha dicho :D

La instalación misma no es lo complicado, lo que hace perder tiempo son los problemas de compatibilidades.
Actualmente la versión 3.5 del Eclipse (conocida como "Galileo") presenta algunos problemas al instalar el plugin en algunas de sus versiones. Por ahora sólo he probado las versiones JEE y Java, donde aparece un mensaje de error y la instalación se detiene. El mensaje de error comienza con:

Cannot complete the install because of a conflicting dependency.

Y luego detalla una lista de supuestas incompatibilidades que impiden la instalación.
Para evistar eso hay que utilizar la versión SDK del Eclipse 3.5 y listo. Para instalar el plugin hay que seguir el camino habitual:

- Ejecutar Eclipse
- Menú "Help" -> Install new software...
- En "work with" poner: http://download.eclipse.org/tools/ve/updates/1.4/
- Se puede agregar la dirección de forma permanente, presionando el botón "Add" y escribiendo:
Name: VE 14 (o cualquier nombre que les guste)
Location: http://download.eclipse.org/tools/ve/updates/1.4/
- Marcar todas las casillas que aparecen en la parte baja de la ventana (la que dice "hide items that are already installed" es opcional).

Como comentario final, la versión SDK del Eclipse no presenta ningún problema de instalación, pero para evitar inconvenientes mejor instalar el VE apenas se instala el Eclipse y luego el resto de los plugins deseados.

Espero que esto ayude a alguien más a no tardar para probar el visual editor ;)

Referencias:
Proyecto Visual Editor - http://www.eclipse.org/vep/
Guía instalación VE 1.4 - http://wiki.eclipse.org/VE/Update
Bug 301766 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=301766
-