SELECT * FROM information_schema.processlist WHERE User LIKE 'username';
Points regarding computing that I always forget - so I write them here to find them easily and maybe other could benefit too.
Mysql show processlist of a specific user - filtering processlist
The way I use go (golang) sql/mysql driver to create connection
I use go for web development and I have noticed I have a few problems with database connections to mysql using go-sql-driver/mysql.
Database connections created and then never closed. I reached a point of 4,096 simultaneous connections and my mysql server have reached max-connections which reached a denial of service.
I had to play a bit with some tweaking of the code and this is what I have reached:
db.SetMaxOpenConns(200) // this works occasionally
db.SetMaxIdleConns(30) // this does not work but I keep it anyway
db.SetConnMaxLifetime(time.Second * 30) // this also does not work but I keep it
db.Exec("SET SESSION wait_timeout = 30") // this works
db.Exec("SET SESSION interactive_timeout = 30") // and also this one
Using the above directive I was able to have the number of connections under control. Please note that sometimes I still get more than 200 connections even though I set the maximum to 200, and sometimes it keeps the max 200.
SetMaxIdleConns and SetConnMaxLifetime - did not have any affect what so ever.
Again, it might be that I am not fully aware of the configuration or the right usage.
Here below is my full function to get a connection to the database with go mysql driver:
package main
import (
"database/sql"
"log"
"time"
_ "github.com/go-sql-driver/mysql" // Register the driver
)
var db *sql.DB = nil // global connection
func GetConnection(whereFrom string) (*sql.DB, error) {
slog.Info(" * UC:", "connectIndex", connectIndex, "from", whereFrom)
var err error
if !isConnectionAlive(db) {
slog.Error("20250225.01152 connection GetConnection error: connection is not alive")
db, err = createSimpleConnection()
if err != nil {
slog.Error("20250225.01144b connection GetConnection error receiving database", "err", err)
return nil, err
}
}
return db, nil
}
// create a real connection to the database
func createSimpleConnection() (*sql.DB, error) {
var err error
db, err := sql.Open("mysql", "user:password@tcp(IP:3306)/databasename?charset=utf8mb3")
if err != nil {
log.Fatal("error 20241212.01314 createConnection error: " + err.Error())
return nil, err
}
db.SetMaxOpenConns(200) // Set max open connections
db.SetMaxIdleConns(30) // Set max idle connections
db.SetConnMaxLifetime(time.Second * 30) // Set the max lifetime of a connection
// Setting session-specific parameters
_, err = db.Exec("SET SESSION max_execution_time = 30000") // seconds = milliseconds * 1000
if err != nil {
slog.Error("20241212.01641 set wait_timeout", "err", err)
return nil, err
}
_, err = db.Exec("SET SESSION wait_timeout = 30") // seconds
if err != nil {
log.Fatal("error 20241212.01641 set wait_timeout error: " + err.Error())
return nil, err
}
_, err = db.Exec("SET SESSION interactive_timeout = 30") // seconds
if err != nil {
log.Fatal("error 20241212.01642 set interactive_timeout error: " + err.Error())
return nil, err
}
return db, nil
}
func isConnectionAlive(db *sql.DB) bool {
if db == nil {
return false
}
err := db.Ping()
return err == nil
}
Poor man's DVR - a linux bash script to capture images from the camera and upload them to a remote server
I wanted to create a very easy "DVR" script for my raspberry PI machine that will take a shot from the camera and upload the photos to a remote server so I can see what is happening in my living room.
I created this simple bash Linux command line script to activate the camera, save the photo, add a timestamp and upload it to a remote server.
It is running every minute - capturing 5 photos from the webcam every 9 seconds and uploads them to the server using scp.
Here is the shell script for a poor man's DVR:
#!/bin/bash
# repeat 5 times
for i in {1..5}; do
# the file name with a datetime stamp
filename=webcam_$(date +%Y%m%d-%H%M%S).jpg
# capture the image from the camera
ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 -vframes 1 -frames:v 1 /mnt/ramdisk/$filename
# wait
sleep 9
done
# create a latest.jpg image
cp /mnt/ramdisk/$filename /mnt/ramdisk/latest.jpg
# add the time stamp
convert /mnt/ramdisk/latest.jpg -gravity SouthEast -pointsize 22 -fill white -annotate +30+30 $filename /mnt/ramdisk/latest.jpg
# upload the images
scp /mnt/ramdisk/*.jpg remote@remote.server://directory
# delete the images
rm /mnt/ramdisk/*.jpg
Caddy webserver to prevent access from external machines on the network
How to protect your local caddy installation by preventing other machines outside of your localhost and local computer from accessing your device.
Create rule:
(block_outcoming) {
@denied not client_ip 127.0.0.1 ::1
handle @denied {
respond "No access"
}
}
Then inside your website configuration just add
import block_outcoming
E.g.:
:80 {
import block_outcoming
root * /web/html
}
Accessing Windows Share (Samba) From Linux (XFCE) using Thunar
In order to access samba (windows share) from Linux XFCE using Thunar file browser you need to:
1.
Install samba client
sudo apt install smbclient
2.
Run:
sudo modprobe cifs
3.
Open thunar and access the share:
smb://IPADDRESS/sharename
e.g.:
smb://192.168.1.1/photos
4.
Type in the username / password in the prompt window
Some helpful information:
https://forum.manjaro.org/t/thunar-how-do-i-access-folders-shared-on-windows-computers/116649/9
Caddy web server configuration for rewrite with multiple variables parameters
http://localwebsite {
# Set this path to your site's directory.
#root * /usr/share/caddy
root * /var/www/website
#makes /course/id/name.html to /course.php?id=id&name=name
@zxp {
#path_regexp myregex ^/course/(\d+)/([%A-Za-z0-9_-]+)\.html$
path_regexp myregex ^/course/([^/]+)/([^/]+)\.html$
}
rewrite @zxp /course.php?id={re.myregex.1}&name={re.myregex.2}
# rewrite /course/([^/]+)/([^/]+)\.html /course.php?id={1}&name={2}
# rewrite /course/(\d+)/([A-Za-z0-9_-]+)\.html /course.php?id=$1&name=$2
# rewrite /course/(\w+)/(\w+)\.html /course.php?id={1}&name={2}
#rewrite /course {
# r ^/(\w+)/(\w+)\.html$
# to /course.php?id={1}&name={2}
#}
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
php_fastcgi unix//run/php/php8.1-fpm.sock
}
Setting program_name in mysql session_connect_attrs allows you to see the name of the program connected
I am using mysql for quite some time now. I have noticed that looking at client connections using mysql workbench so an interesting column ...
-
In order to access samba (windows share) from Linux XFCE using Thunar file browser you need to: 1. Install samba client sudo apt install smb...
-
How to combine or embed and insert another .docx file (Microsoft office docx word document) into another one using PHPWord Joining two .doc...
-
When I was trying to download dependencies for my go project in an old Ubuntu machine I was getting this error all the time: "go: gopkg...