jueves, 26 de noviembre de 2020

Validar respuesta Mysql/MariaDB Query en Free Pascal

    

 

Al hacer una consulta de MySQL/MariaDB, la forma que se me ocurrió para validar si la consulta regresa resultados fue:

Se hace la consulta

mysql_query(sock, query);

Se almacenan los resultados

recbuf := mysql_store_result(sock); 

Se leen los resultados

n := mysql_num_row(recbuf);

Si mysql_num_row es igual a 0 es que no hay resultados, porque puede ser que la consulta se realice de manera correcta pero que no devuelva resultados.

Citas citables

 "La cultura es lo que la gente hace cuando tú no estás mirando"




Freddy Vega (@freddier)

Citas citables

 "Es mejor trabajar más inteligente que trabajar más duro"



Freddy Vega (@fredddier)

martes, 20 de octubre de 2020

Tutorial de programación de Free Pascal + MySQL/MariaDB Tercera parte

Bienvenidos a una nueva entrega del tutorial de Free Pascal y MySQL/MariaDB!

  

Antes de continuar considero pertinente hacer el comentario de que no soy un experto en la materia, ni en Free Pascal mucho menos en MySQL/MariaDB. Simplemente soy un aficionado a Pascal que ha ido encontrando la manera de seguir usando ese lenguaje de manera práctica para su trabajo personal. Hay muchos temas que quedan fuera de este tutorial porque en verdad no las sé! Claves foreing, Primary Keys y cosas así de MySQL/MariaDB, espero en un futuro poder entender y explicar esos conceptos.

En fin, a lo que vinimos.

En la primera parte del tutorial preparamos la conexión en el esqueleto de Free Pascal; en la segunda parte hicimos nuestra primer consulta obteniendo un resultado. Para este tutorial vamos a aprender a insertar un dato.

En el tutorial anterior creamos nuestra base de datos, nuestra tabla y nuestros campos, a los cuales insertamos sus primeros datos manualmente. Al no usar especificaciones a la hora de crear la tabla, necesitamos definir manualmente todos y cada uno de los campos, pero cuidado, pues podemos duplicar sin que MySQL/MariaDB nos avise, cubriremos esta situación posteriormente, por ahora lo importante es que tengan la estructura funcional.

Continuaremos con el esqueleto del tutorial anterior y seguiremos una línea antes del End final.

Añadiremos las líneas necesarias para imprimir y leer la información que vamos a insertar, previamente necesitamos declarar las variables donde almacenaremos la información que nos proporcione el usuario:
id, nombre, edad y correo de tipo String
total_registros, contador de tipo Integer

Una vez definidas, recibimos los datos del usuario:

Write('id: ');Readln(id);
Write('Nombre: ');Readln(nombre);
Write('Edad: ');Readln(edad);
Write('Correo: ');Readln(correo);


Con los datos en las variables, preparamos la consulta de MySQL/MariaDB:
texto_consulta := 'INSERT INTO datos(id, nombre, edad, correo) VALUES ('+ #39 + id + #39 + #44 + #39 + nombre + #39 + #44 + #39 + edad + #39 + #44 + #39 + correo + #39')' + #0;


(Nota del editor: fue la primer forma que encontré para darle formato a la consulta, ya que MySQL/MariaDB usa las comillas simples ' y Free Pascal las interpreta como cierre de cadena; #39 corresponde a la comilla simple ', #44 corresponde a la coma .)

Ejecutamos la consulta:
consulta := @texto_consulta[1];
mysql_query(socket, consulta);


Y listo! Los datos han sido insertados en la base de datos!

Ahora bien, para corroborar preparamos la cadena para consultar todos los datos:
texto_consulta := 'SELECT * from datos' +#0;


Ejecutamos la consulta:
consulta := @texto_consulta[1];
mysql_query(socket,consulta);


Almacenamos los resultados
bufer_respuesta := mysql_store_result(socket);


Leemos el total de registros
total_registros := mysql_num_rows(bufer_respuesta);


Creamos un ciclo for para leer cada uno de los resultados e imprimirlos:
For contador := 1 to total_registros do
Begin
fila_bufer := mysql_fetch_row(bufer_respuesta);
Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' - Correo: ',fila_bufer[3]);
mysql_free_result(bufer_respuesta);
End;

 

Cerramos la conexión (por cierto, olvidé cerrar las conexiones en los tutoriales pasados).

mysql_close(socket);



Y terminamos, de esta manera nos debe listar todos los elementos que tenemos en la tabla.

Enlaces para mis tutoriales anteriores 1ra parte 2da parte


Como es costumbre, dejo el código completo para su análisis:

Program tutorial03;
{$codepage UTF8}
{$mode objfpc}{$H+}

Uses
    Crt, MySQL4;

Var
    servidor, usuario, contrasena, basededatos : String;
    alloc,socket : PMYSQL;
     qmysql : TMYSQL;
     texto_consulta : String;
     consulta : PChar;
     bufer_respuesta : PMYSQL_RES;
     fila_bufer : MYSQL_ROW;
     id, nombre, edad, correo : String;
     contador, total_registros : Integer;

Begin
     ClrScr;
     Write('Servidor: ');
     Readln(servidor);
     Write('Usuario: ');
     Readln(usuario);
     Write('Contraseña: ');
     Readln(contrasena);
     Write('Base de Datos: ');
     Readln(basededatos);
     alloc := mysql_init(PMYSQL(@qmysql));
     socket := mysql_real_connect(alloc, PChar(servidor), PChar(usuario),     PChar(contrasena), PChar(basededatos), 0, nil, 0);
    If socket=Nil then
    begin
        Writeln (stderr,'Couldn''t connect to MySQL.');
        Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
         halt(1);
    end;
     Writeln;
     texto_consulta := 'SELECT * from datos' +#0;
     consulta := @texto_consulta[1];
     mysql_query(socket,consulta);
     bufer_respuesta := mysql_store_result(socket);
     fila_bufer := mysql_fetch_row(bufer_respuesta);
     Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' - Correo: ',fila_bufer[3]);
     mysql_free_result(bufer_respuesta);
     Writeln;
     Write('id: ');Readln(id);
     Write('Nombre: ');Readln(nombre);
     Write('Edad: ');Readln(edad);
     Write('Correo: ');Readln(correo);
     texto_consulta := 'INSERT INTO datos(id, nombre, edad, correo) VALUES ('+ #39 + id + #39 + #44 + #39 + nombre + #39 + #44 + #39 + edad + #39 + #44 + #39 + correo + #39')' + #0;
    consulta := @texto_consulta[1];
     mysql_query(socket, consulta);
     Writeln;
     texto_consulta := 'SELECT * from datos' +#0;
     consulta := @texto_consulta[1];
     mysql_query(socket,consulta);
     bufer_respuesta := mysql_store_result(socket);
     total_registros := mysql_num_rows(bufer_respuesta);
     For contador := 1 to total_registros do
     Begin
         fila_bufer := mysql_fetch_row(bufer_respuesta);
         Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' -     Correo: ',fila_bufer[3]);
        mysql_free_result(bufer_respuesta);
     End;
     mysql_close(socket);
End.

martes, 25 de agosto de 2020

Instalación y configuración básica del servidor MariaDB en Debian 10


Para instalar el servidor de base de datos MariaDB en Debian 10 en modo consola, hay que ejecutar:

sudo apt-get install mariadb-server

Con este comando queda instalado el servidor, sin embargo, hay que hacer algunas pequeñas modificaciones:

Primeramente nos conectamos al servidor de manera local como administrador para hacer los cambios necesarios:

sudo mysql

Una vez conectados, usaremos la base de datos mysql, que es donde vamos a configurar:

use mysql;

Vamos a deshabilitar el plugin de inicio de sesión de MariaDB para que nos permita iniciar por medio de contraseña:

update user set plugin='"' where user='root';

A continuación, asignaremos una contraseña para root(hay que remplazar las X por la contraseña):

alter user root@localhost identified by 'XXXXXXXX';

Opcional, si quieres que el acceso a la base de datos, por medio de root, se pueda realizar de manera remota:

update user set host='%' where user='root';

Actualizamos los privilegios:

flush privileges;

Y salimos:

exit;

En el caso de que hayas optado por el acceso remoto, hay que modificar el fichero de configuración de MariaDB para que permita "escuchar" el remoto:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Ubicamos la línea que dice "bind-address" y la modificamos para que quede así:

bind-address = 0.0.0.0

Y es todo, podemos conectarnos de manera remota para realizar las funciones de administración que necesitemos.

Un saludo!

jueves, 20 de agosto de 2020

Tutorial de programación Free Pascal + MySQL/MariaDB segunda parte

Bienvenidos de vuelta!


Para esta segunda parte vamos a jugar un poco con las consultas básicas de MySQL/MariaDB


Preeliminares

En nuestra base de datos del primer ejemplo (a la cual nombramos "tutorial"), requerimos una tabla llamada "datos" que contenga los campos:

id del tipo smallint

nombre del tipo varchar

edad del tipo smallint

correo del tipo varchar

Para este ejemplo he insertado valores a los campos:

1, xbitcarry, 42, xbitcarry@gmail.com

Comencemos...

En la parte anterior de este tutorial dejamos lista la conexión a la base de datos, ahora, vamos a hacer una consulta, si requieres información detallada de las consultas a MySQL/MariaDB, te recomiendo revises los recursos de W3Schools.

Vamos a colocar el texto de la consulta en una variable de tipo string a la que llamaremos "texto_consulta":

texto_consulta := 'select * from datos'+ #0;

Para enviar la consulta a MySQL/MariaDB necesitamos una variable especial para ello:

consulta del tipo PChar

Esta variable debe apuntar al texto de la variable texto_consulta y lo hacemos con la instrucción:

consulta := @texto_consulta[1];

Ahora viene lo interesante... Ejecutar la consulta...

mysql_query(socket,consulta);

Listo! 

Pero espera... Aún falta revisar la respuesta de la consulta... 

Necesitamos una variable usada por MySQL/MariaDB para almacenar los resultados obtenidos de la consulta:

bufer_respuesta del tipo PMYSQL_RES

Para lograr esto escribimos:

bufer_respuesta:= mysql_store_result(socket);

Para acceder a los resultados de la consulta usamos una variable de MySQL/MariaDB:

fila_bufer del tipo MYSQL_ROW

Para lo cual usamos:

fila_bufer := mysql_fetch_row(bufer_respuesta);

De esta manera fila_bufer es contiene los resultados de consulta a los cuales podemos acceder con el índice de cada campo, en nuestro ejemplo:

+-------------------------------------------------+

|  ID  | 0 |    1      |  2 |          3          |

+-------------------------------------------------+

| Dato | 1 | xbitcarry | 42 | xbitcarry@gmail.com |

+-------------------------------------------------+

Y podemos imprimirlos en pantalla con:

Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' - Correo: ',fila_bufer[3]);

Es importante recalcar que al usar la función, debemos liberar, al terminar de usarla, la memoria con el comando:

mysql_free_result(bufer_respuesta);

Y terminamos! Si continúas hasta aquí sin errores, te felicito, eres muy cuidadoso y te dejo en suspenso para la siguiente parte del tutorial...

Te dejo el código completo de este segundo tutorial:

Program tutorial;

{$codepage UTF8}

{$mode objfpc}{$H+}


Uses

Crt, MySQL4;


Var

servidor, usuario, contrasena, basededatos : String;

alloc,socket : PMYSQL;

qmysql : TMYSQL;

texto_consulta : String;

consulta : PChar;

bufer_respuesta : PMYSQL_RES;

fila_bufer : MYSQL_ROW;

Begin

ClrScr;

Write('Servidor: ');

Readln(servidor);

Write('Usuario: ');

Readln(usuario);

Write('Contraseña: ');

Readln(contrasena);

Write('Base de Datos: ');

Readln(basededatos);

alloc := mysql_init(PMYSQL(@qmysql));

socket := mysql_real_connect(alloc, PChar(servidor), PChar(usuario), PChar(contrasena), PChar(basededatos), 0, nil, 0);

If socket=Nil then

begin

Writeln (stderr,'Couldn''t connect to MySQL.');

Writeln (stderr, 'Error was: ', mysql_error(@qmysql));

halt(1);

end;

Writeln;

texto_consulta := 'SELECT * from datos' +#0;

consulta := @texto_consulta[1];

mysql_query(socket,consulta);

bufer_respuesta := mysql_store_result(socket);

fila_bufer := mysql_fetch_row(bufer_respuesta);

Writeln('ID: ', fila_bufer[0],' - Nombre: ', fila_bufer[1], ' - Edad: ', fila_bufer[2],' - Correo: ',fila_bufer[3]);

mysql_free_result(bufer_respuesta);

End.

lunes, 10 de agosto de 2020

Tutorial de programación Free Pascal y MariaDB - Primera parte

                             

Tutoriales de programación de Free Pascal hay muchos, las funcionalidades básicas está muy explicadas, sin embargo, a la hora de especializarse es cuando se encuentran los detalles, así fue como me dediqué a realizar este tutorial.

Si quieres lo básico de Free Pascal, te recomiendo la siguiente página.

Preliminares

Antes de comenzar, necesitas tener instalado Free Pascal y MariaDB

En MariaDB necesitamos crear la base de datos "tutorial".

Comenzamos!

Por lo general, comienzo con el esqueleto de la programación de Pascal:

Program tutorial;  
Uses
   Crt;
Begin
End.


A partir de este esqueleto le voy agregando lo que vaya requiriendo. Lo hago así porque, si compilo este esqueleto, funciona, no marca error.

Solo he usado la librería de MySQL4 que viene por defecto en Free Pascal, me ha servido, y es el que quiero mostrar, se añade en la parte Uses:

Program tutorial;
{$codepage UTF8}
{$mode objfpc}{$H+}
Uses
   Crt, MySQL4;
Begin
End.

Añado las directivas al compilador:

{$codepage UTF8}
{$mode objfpc}{$H+}

La primera la uso para poder imprimir letras con acentos y la segunda para las funcionalidades de MariaDB.

Hasta aquí, el programa realmente no hace nada, excepto mostrar error si algo te hace falta.

Para mejor entendimiento, usaré programación estructurada de la manera más simple posible.

En el cuerpo principal del programa limpiaré la pantalla para tener mayor área de trabajo.

En seguida, solicitaré los datos de conexión para la base de datos de MariaDB, para esto usaré las variables:

servidor, usuario, contrasena, basededatos

Todas de tipo string

Para esto imprimo la cadena informativa de la información que solicito e inmediatamente después leo la respuesta del usuario y la almaceno en la variable correspondiente:

Program tutorial;
Uses
   Crt, MySQL4;
Var
   servidor, usuario, contrasena, basededatos : String;
Begin
   ClrScr;
   Write('Servidor: ');
   Readln(servidor);
   Write('Usuario: ');
   Readln(usuario);
   Write('Contraseña: ');
   Readln(contrasena);
   Write('Base de Datos: ');
   Readln(basededatos); 
End.

Aquí viene la parte más práctica: la conexión a MariaDB.
Para la conexión se requieren las variables:
alloc (de allocate, asignación) y socket del tipo PMYSQL
qmysql del tipo TMYSQL

Primeramente realizamos la asignación para inicializar la conexión a MariaDB, para esto usamos:

alloc := mysql_init(PMYSQL(@qmysql));

Después de esto formateamos los datos de conexión para poder usarlos con el conector MySQL para conectar a MariaDB así:

socket := mysql_real_connect(alloc, PChar(servidor), PChar(usuario), PChar(contrasena), PChar(basededatos), 0, Nil, 0);

Solo nos resta verificar la conexión y en caso de error, mostrar la información correspondiente con:

If socket=Nil then
Begin
   Writeln(stderr,'No se pudo conectar a MariaDB');
   Writeln(stderr, 'El error fue: ', mysql_error(@qmysql));
   halt(1);
End;

Por lo que nuestro código quedaría así:

Program tutorial;
{$codepage UTF8}
{$mode objfpc}{$H+}

Uses
   Crt, MySQL4;

Var
   servidor, usuario, contrasena, basededatos : String;
   alloc,socket : PMYSQL;
   qmysql : TMYSQL;
Begin
   ClrScr;
   Write('Servidor: ');
   Readln(servidor);
   Write('Usuario: ');
   Readln(usuario);
   Write('Contraseña: ');
   Readln(contrasena);
   Write('Base de Datos: ');
   Readln(basededatos);
   alloc := mysql_init(PMYSQL(@qmysql));
   socket := mysql_real_connect(alloc, PChar(servidor), PChar(usuario), PChar(contrasena), PChar(basededatos), 0, nil, 0);
   If socket=Nil Then
   Begin
      Writeln (stderr,'Couldn''t connect to MySQL.');
      Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
      halt(1);
   end;
End.

Si al llegar aquí puedes compilar sin error, estás listo para la segunda parte de este tutorial; en caso contrario, habrá que revisar tu código para encontrar el error, porque, de que funciona, funciona...

Saludos y hasta la próxima!
Segunda parte del tutorial aquí

miércoles, 24 de junio de 2020

Detectar teclas Av Pág y Re Pág en Free Pascal



Dentro de las mejoras que tengo planeadas para mis juguetes laborales estaba la visualización de resultados en múltiples páginas, por lo cual, para navegar entre las páginas disponibles quise usar las teclas Av Pág y Re Pág, obviamente al usar var := ReadKey detectaba la pulsación, pero no la tecla por ser tecla especial, investigando un poco descubrí que es porque, al ser especial, detecta dos códigos, el primero es 0 (cero) y en el segundo viene el identificador, gracias al programa de ejemplo pude detectar esa y otras teclas más:

program detectachar;
uses
crt;
var a : char;
begin
repeat
a := readkey;
if a=#0 then
begin
a := readkey;
writeln('Tecla especial= ', ord(a));
end
else
writeln('Tecla normal= ', ord(a));
until a=#27;
end.

Básicamente, para saber qué tecla especial es hay que suar dos veces readkey, el primero para validar si es tecla normal (diferente de 0 (cero)) y si es tecla especial (devuelve 0 (cero)) con el segundo readkey obtener la tecla especial pulsada.

Así podré detectar si se pulsa Av Pág, Re Pág o las flechas de dirección del teclado (arriba, abajo, izquierda, derecha).

viernes, 19 de junio de 2020

Error drm:drm_atomic_helper_wait_for_flip_done Debian 10



En mi laptop Dell Latitude D630, al instalar Debian 10, me aparecen estos mensajes al iniciar:
drm_atomic_helper_wait_for_flip_done

Googleando un poco, la solución está en editar el grub con:
sudo nano /etc/default/grub

Y en la línea que dice:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
Modificar para que quede así:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=SVIDEO-1:d"

Guardar, cerrar y generar de nuevo el menú de grub con:
sudo update-grub

Reiniciar, y listo.

WiFi bcm4311 Debian 10

Configurar conector MySQL/MariaDB en c para cygwin en Windows

Hace días, en mis pocos tiempos libres, se me ocurrió tener un entorno de programación en c... No sé el porqué, siendo que principalmente uso Windows, en mi trabajo he codificado mis aplicaciones en Free Pascal, mi sistema administrativo lo hice en PHP, he jugueteado un poco con Visual Basic para mis aplicaciones gráficas de Windows, así que no hay muchas razones para cambiar a c, no c++ ni c#, el simple, clásico, odiado y amado c a secas...



En fin, comencé a usar mi Laptop de personal, en ella uso Windows 10, cmder, cygwin y MariaDB. El primer problema que me encontré fue que, como usualmente uso Free Pascal, al instalar el entorno instala su propia versión de gcc, la cual se carga antes que el gcc de cygwin, me causó muchos dolores de cabeza darme cuenta de ese detalle, de momento lo solucioné simplemente renombrando el gcc.exe a gccR.exe de la carpeta de instalación de Free Pascal, hasta el momento no he tenido problemas por hacer eso, quién sabe más adelante.



Como uso solo modo texto, he querido usar la librería ncurses, ya la usé en Python, así que quise usarla también usarla en c, para ello instalé libncurses-devel desde el instalador de cygwin, simple y a la hora de compilar uso la opción -lncurses



Tuve bastantes problemas para encontrar la solución a la hora de compilar con mysql en c, pero tan simple que era instalar desde el instalador de cygwin el paquete libmariadb-devel y ya! Bueno, además,hay que cambiar el #include <mysql.h> por #include <mysql/mysql.h>





martes, 16 de junio de 2020

Conectar a MariaDB/MySQL desde c en Debian 10

Aclaro, antes de seguir leyendo este post, no esperes una gran y detallada explicación, es un post tipo "Lo hice y me funcionó... no me preguntes porqué"
sudo apt-get install default-libmysqlclient-dev libncurses-dev


lunes, 15 de junio de 2020

Customizando mi Debian en mi Mini Laptop



Lo primero fue deshabilitar la suspención
su
systemctl mask sleep.target suspend.target hibernate.target

Para mi computadora, activo el inicio de sesión automático, para evitar
equivocaciones con el ingreso del teclado:
nano /etc/systemd/logind.conf

Descomentar:
#NAutoVTs=6 

Modificar para que quede:
NAutoVTs=1

Guardar y cerrar

Ejecutar:
systemctl edit getty@tty1

Y escribir en el fichero que se crea:
[Service]
ExecStart=-/sbin/agetty --autologin user_name --noclear %I 38400 linux
ExecStart=

Guardar y cerrar

Ejecutar:
systemctl enable getty@tty1.service

Y reinciar con:
systemctl reboot

En seguida configurar el teclado
su
apt-get install console-data

Para poder usar el kbdrate tuve que hacer los siguientes cambios:
chgrp adm /usr/sbin/kbdrate /usr/sbin/reboot /usr/sbin/poweroff (Nota: adm ya estaba creado y mi usuario ya era parte de ese grupo)
ln -s /usr/sbin/kbdrate /usr/bin/kbdrate
ln -s /usr/sbin/reboot /usr/bin/reboot
ln -s /usr/sbin/poweroff /usr/bin/poweroff
chmod u+s,o-rwx /sbin/kbdrate /usr/bin/reboot /usr/bin/poweroff

Editar el .bashrc
nano .bashrc

Añadir al final:
kbdrate -r 20 -d 500 -s
setleds -num
setleds +num

Instalar sudo
apt-get install sudo

Editar el listado de los usuarios de sudo
nano /etc/sudoers

Y añadir mi usuario al listado
user    ALL=(ALL:ALL) ALL

Ampliar fuentes
nano /etc/apt/sources.list

Agregar contrib non-free:
deb http://deb.debian.org/debian buster main contrib non-free
deb-src http://deb.debian.org/debian buster main contrib non-free

Guardar y actualizar con 
apt-get update
apt-get upgrade

Instalar drivers wifi
apt-get install firmware-ralink
modprobe rt2800pci
ifconfig wls33 up

Instalar WiCd
apt-get install wicd-curses

Instalar la base del entorno gráfico:

sudo apt-get install openbox xinit xterm menu python-xdg gmrun

Crear la configuración del entorno gráfico:
nano ~/.xinitrc
/usr/bin/X11/xterm &
exec openbox-session 

Gusto personal de ejecutar inmediatamente el emulador de terminal al iniciar el modo gráfico

Para copiar los ficheros de configuración de openbox y dejarlo funcional inmediatamente:

mkdir ~/.config/openbox/
cp /etc/xdg/openbox/menu.xml ~/.config/openbox/menu.xml
cp /etc/xdg/openbox/rc.xml ~/.config/openbox/rc.xml
cp /etc/xdg/openbox/autostart ~/.config/openbox/autostart

Por último, la configuración para gmrun en openbox:
nano ~/.config/openbox/rc.xml 

Añadir:
<keybind key="Alt-F2">
<action name="Excecute"><command>gmrun</command></action>
</keybind>
En modo gráfico descubrí links2, me gustó, es muy rápido, sin embargo, limitado porque no tiene javascript, pero bastante bueno, se instala y ejecuta con los comandos:
sudo apt-get install links2
links2 -g

Y al parecer es todo. Post para no olvidar.

lunes, 11 de mayo de 2020

Modo gráfico básico Debian 10


En mi minilap tengo Debian 10, solo la base, sin entorno gráfico, sin embargo, en mis experimentos, he querido probar gtk en c, así que tuve que configurar un entorno gráfico estándar, después de un poco de investigación en la web lo conseguí con:

sudo apt-get install openbox xinit xterm menu python-xdg gmrun

openbox por ser un gestor de ventanas super ligero, en mi opinión.
xterm para tener un emulador de terminal en mi entorno gráfico.
gmrun para poder ejecutar comandos en el entorno gráfico de manera rápida

Después de instalar, toca la configuración:

nano ~/.xinitrc
/usr/bin/X11/xterm &
exec openbox-session

Gusto personal de ejecutar inmediatamente el emulador de terminal al iniciar el modo gráfico

Para copiar los ficheros de configuración de openbox y dejarlo funcional inmediatamente:

mkdir ~/.config/openbox/
cp /etc/xdg/openbox/menu.xml ~/.config/openbox/menu.xml
cp /etc/xdg/openbox/rc.xml ~/.config/openbox/rc.xml
cp /etc/xdg/openbox/autostart ~/.config/openbox/autostart

Por último, la configuración para gmrun en openbox:

nano ~/.config/openbox/rc.xml
 Añadir:
<keybind key="Alt-F2">
 <action name="Excecute"><command>gmrun</command></action>
</keybind>

Y fue todo, con estos pasos puedo ejecutar mis proyectos en c con gtk en Debian

viernes, 1 de mayo de 2020

Resolución consola debian 10

En mi mini laptop, tengo una pequeña pantalla de 11", y al trabajar en modo texto, me desespera tener tan poca información limitado por la cantidad de caracteres que se pueden mostrar en pantalla.
Me di a la tarea de investigar para solucionar mi pequeño problema y encontré que la solución fue:
Al ingresar al grub presionar la letra "c" para entrar en la consola de comandos, ahí ejecutar:

vbeinfo

Con dicho comando me muestra las resoluciones posibles que soporta el equipo, obviamente tomé la mayor resolución, la cual fue: 1152x864x32, esta configuración hay que ingresarla en el fichero de configuración de grub:

nano /etc/default/grub

Localizar las siguientes líneas y modificarlas para que queden así:

GRUB_GFXMODE=1152x864x32
GRUB_GFXPAYLOAD=keep
GRUB_GFXPAYLOAD_Linux=keep
Guardar, cerrar y actualizar el grub con el comando:

update-grub

Al terminar, tenía mi pequeña mini laptop con una resolución que me mostró más caracteres.

Actualizar version ubuntu

En mi trabajo, he usado un servidor para mis pruebas de sistema de información. Es un equipo reciclado, así que instalé Ubuntu 18.04 LTS, solo por mi experiencia previa con Ubuntu, así que solo fue personalizar para servidor. Tengo Apache2, MariaDB 10, Samba. Pero bueno, al tema de este post:

Salió la versión 20.04 LTS, quisé actualizar, como trabajo con ssh, quise hacer la actualización por terminal, con un poco de búsqueda en San Google, encontré que los comandos requeridos son:

sudo apt-get update
sudo apt-get upgrade
sudo apt-dist-upgrade
sudo do-release-upgrade
sudo do-release-upgrade -d

Al terminar el proceso la actualización se completó con éxito, me siento cómodo por no requerir intervención, con esos simples comandos mi querido servidor quedó correctamente actualizado.

viernes, 27 de marzo de 2020

Desactivar suspensión e hibernación en Debian

Por comentarios con mi eterno mentor de toda mi vida desde que lo conozco, hace ya varios años, instalé Debian 10 Buster mínimo en mi minilap Coby, como es un equipo sumamente limitado, no quiero ponerle entorno gráfico, sin embargo me enfrenté a que se pone en modo suspensión apenas a los 10 segundos de haberse encendido. Y lo solucioné con el siguiente comando en modo root:

systemctl mask sleep.target suspend.target hibernate.target hibryd-sleep.target

Recordatorio para que no se me olvide

lunes, 9 de marzo de 2020

Convertir bytes a string en python + curses

De nuevo toqueteando al python, en verdad brinco de un lado a otro...

En fin, esta entrada es para no olvidar este pequeño "detalle":

Al leer desde curses con stdscr.getstr, aunque en mi pensar almacena un string, resulta que no, que lo que lee es un byte, por lo que al usarlo para salir de un ciclo, no me servía:

clave = ""
while clave != "exit":
   clave = stdscr.getstr(0,0)

Después de preguntar, leer, investigar y unas cuantas pruebas me di cuenta de eso, clave recibe una variable byte, que en este caso era b'exit'. Después de unas pequeñas pruebas, la mejor solución, puesto que requiero de string, fue con:

clave = stdscr.getstr(0,0).decode('utf8')

Y listo! Funcionó!

Pequeño recordatorio para no olvidarlo....

Seguimos caminando...

viernes, 28 de febrero de 2020

Configurar IP fija en Ubuntu Server 18.04


Hoy se me ocurrió ponerle una ipfija al servidor Ubuntu 18.04, buscando un poco dí con la respuesta:

La configuración se hace con netplan

El archivo de configuración por defecto es /etc/netplan/01-netcfg.yaml.

Y contiene lo siguiente:

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s25:
      dhcp4: yes

De está manera usa dhcp para la asignación automática de ip, y como es
justamente lo que quiero cambiar, modifiqué el archivo para que me quede así:

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s25:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.1.34/24, ]
      gateway4: 192.168.0.255
      nameservers:
        addresses: [192.168.1.1,8.8.8.8]

No hay mucho que explicar, creo es bastante claro:
No usar dhcp4
No usar dhcp6
Usar la dirección de "addresses:[ipfija/longitud, ]
Asignar el gateway de "gateway4: ipgateway
Usar el DNS de "nameservers: addresses:[dns1, dns2]

Ojo, después de la línea de namervers lleva indentado, porque me
lo marcó como error al ponerlos sin indentación.

Guardar archivo y después aplicar cambios con :

sudo netplan apply

Y eso es todo

jueves, 27 de febrero de 2020

Trucos nano

Trucos para el editor de texto "nano",
las líneas se deben agregar al fichero .nanorc
en la carpeta local:

Para habilitar el resaltador de sintaxis:

include /usr/share/nano/php.nanorc
include /usr/share/nano/html.nanorc
include /usr/share/nano/python.nanorc

Para el número de línea:

set linenumbers

Para el ajuste de línea:
set softwrap


sábado, 1 de febrero de 2020

Conectar a mysql/mariadb desde php

No sé cómo, no entendí, pero funciona!


Frase recurrente en mí a la hora de compartir mis avances, y es que eso de copiar y pegar es útil para la funcionalidad, o sea, que funcione, ya después se entiende el cómo.

Básicamente, lo que hice fue:

Preparar los datos para la conexión, para no tener la información "tan" evidente, y por práctico y veloz, simplemente la puse en hexadecimal para después convertirla de nuevo a texto para hacer la conexión, sé que no es lo ideal, pero para mis fines prácticos, funcionó...

<?php
define('HOST_DB', 'host_en_hexadecimal');
define('USER_DB', 'usuario_en_hexadecimal');
define('PASS_DB', 'password_en_hexadecimal');
define('NAME_DB', 'bd_en_hexadecimal');
Como mi interés es hacerlo lo más ágil y veloz posible, use el método POST para trabajar en una sola ventana gracias a $isset($_POST['submit']), una función para conectar y otra para desconectar, las condicionantes "or die" se usan, creo, por si hay algún error, y termina la carga de PHP:

if(isset($_POST['submit']))
{
  $code = $_POST['code'];

function conectar()
{
global $conexion; 
$conexion = mysql_connect(hex2bin(HOST_DB), hex2bin(USER_DB), hex2bin(PASS_DB))
or die ('NO SE HA PODIDO CONECTAR AL MOTOR DE LA BASE DE DATOS');
mysql_select_db(hex2bin(NAME_DB))
or die ('NO SE ENCUENTRA LA BASE DE DATOS ' . NAME_DB);
}
function desconectar()
{
global $conexion;
mysql_close($conexion);
}
conectar();
            mysql_set_charset('utf8');

Y por lo pronto es todo. Como es proyecto personal, para que funcione requiere ciertas condiciones (base de datos con información), me gustaría hacerlo un poco más genérico, pero creo que esta información les puede ayudar en principio.

Saludos!

Resumen de Enero 2020


3/Ene/20 - Descompuse el servidor mysql por olvidar la contraseña de root... de pena ajena...

6/Ene/20 - Visita al rancho... adoro ir, me llena de paz... Además, cabalgata de reyes y los regalos... Mis nenas felices... Adoro esos momentos....

7/Ene/20 - Rosca de reyes familiar! Nos acompañaron muchos familiares! Momentos muy apreciados... Familiar víctima de la delincuencia... terrible situación en mi ciudad...

8/Ene/20 - Intento poner orden en mi oficina... pendientes no me dejan...

13/Ene/20 - Situaciones incómodas en la oficina... malos ratos...

18/Ene/20 - Visita al gotcha!!! Muuuuuy divertido! Aunque doloroso....

22/Ene/20 - Proyecto laboral completado en primera fase, ya funcional, mínimo, pero funcional, busca producto por descripción, muestra código, decripción, precio y existencias...

Resumen del mes: productivo en el trabajo, mi proyecto se ha mudado a php + bootstrap y tuvo su primer fase funcional



lunes, 20 de enero de 2020

Cambios "On the fly"... (Al vuelo en México)

Las necesidades de mi trabajo me han hecho dejar abandonado mi proyecto, demasiadas ocupaciones me mantienen alejado de seguir creando mis programas personales, y entre tanto movimiento, veo necesidad de buscar información en la base de datos para mostrar informes específicos, por las diferencias entre los dispositivos, considero pertinente usar la misma lógica de mis programas personales en un sitio web, sitios simples que soliciten información básica, interpreten e informen, había empezado a leer sobre Bootstrap4 y W3CSS, sin embargo, son más extensos tanto para comprender como para aplicar, por lo cual he decidido el uso simple de html y php para hacer la estructura básica, conforme avance iré mejorando el sitio, pero quiero hacer lo mismo que con mis programas personales, simple pero efectivo.


Deséenme suerte...

jueves, 9 de enero de 2020

Centrar texto en consola con python y curses

Es bien sabido mi gusto por el uso de la terminal, a tal grado que mis aplicaciones personales las realizo en este entorno, sin embargo, el "proyecto mayor" me estresa el pensar la cantidad de trabajo pendiente para verlo funcionando, así que opté por hacer pequeñas aplicaciones para tomar experiencia.


En esta ocasión, hice un pequeño avance que me gustó y quise compartirlo: centrar el título, independientemente del dispositivo en el cual se ejecuta la aplicación, puesto que en mi trabajo tengo una AllInOne de 24", en casa uso una lap de 14", para codear uso una mini de 11" y ocasionalmente pruebo en mi smart de 6". Anteriormente estaba usando un código diferente para cada dispositivo, pero hoy se me ocurrió copiar esa idea de un programa ejemplo y aquí está:

#!/usr/bin/env python
# -*- coding: Windows-1252 -*-
import curses
def menu(stdscr):
# Se limpia la ventana
stdscr.clear()
stdscr.refresh()
stdscr.erase()
# Se obtiene el máximo de filas y columnas
alto, ancho = stdscr.getmaxyx()
# Se calcula el título para centrarlo
titulo = 'Módulo de cambio de precios'[:ancho-1]
posicion_titulo = int((ancho//2) - (len(titulo)//2) - len(titulo) % 2)
stdscr.addstr(0,posicion_titulo, titulo)
k = stdscr.getch()
def main():
curses.wrapper(menu)
if __name__ == "__main__":
main()

Requiere más explicación? Yo creo que no...

jueves, 2 de enero de 2020

Resumen del 2019

Terminó el año, ya con tiempo en el 2020 he aquí mi resumen del 2019:


Enero: problemas, desabasto de gasolina en mi ciudad.

Febrero: Fuimos de visita al rancho, escape veloz a la cueva de San Ignacio en Guanajuato capital, registramos a las nenas con mi apellido, celebramos el cumpleaños de Camila en compañía de mi madre y mi hermana en el departamento y continúan los problemas, problemas con todos por alcahuetear a mi hijo con sus locuras de amor con la novia.

Marzo: celebramos el cumpleaños de Bere en el depa, mi madre, mi hermana con su esposo y sus hijos, mi hijo Adrián, fuimos a la Expo Manía a León con mis hijos, problemas fuertes, visitamos San Miguel de Allende, Bere, las nenas, los niños, y mi madre, de regreso a comer hamburguesas en Celaya, Gto, también visitamos el Zoológico de León, mi hijo mayor se desaparece por tres días y regresa sin dar explicación.

Mayo: fuimos a ver Avengers End Game, celebramos el cumpleaños de Melissa y su presentación, así como el cumpleaños de Camila, última gran fiesta, más problemas.

Junio: Visitamos la plaza Altacia de León, y comimos hamburguesas en Burguer King, llevamos a las nenas a Kangoo Kids, disfrutan mucho ir a ese local, me cambian de teléfono.

Julio: otra vez problemas fuertes, día del padre triste, sin mi hijo menor y sin abrazo de felicitación más que el de mi hijo mayor.

Agosto: felicitaciones virtuales por mi cumpleaños, problemas fuertes, termina relación justo en mi cumpleaños, mi hijo mayor juega una final de fútbol suspendida por invasión a la cancha, muy injusta la resolución de las autoridades deportivas.

Septiembre: otra vez problemas fuertes, viaje veloz a San Miguel de Allende con Diana e Iván y nos trajimos una gran experiencia gracias a los fuegos artificiales, nos cambiamos a departamento nuevo.

Octubre: viaje a Parque Bicentenario en Querétaro organizado por Bere y en compañía de compañeros de su trabajo, celebración de día de muertos del kínder de Camilita, fuimos a festivales locales, celebramos el cumpleaños de mi madre en la casa, me cristalean la camioneta del trabajo.

Noviembre: otra vez problemas.

Diciembre: otra vez problemas fuertes, festival de fin de año con Camilita, y cerramos con el año con tremendos problemas otra vez...

Qué año... En verdad...