Outils pour utilisateurs

Outils du site


blog

Notes Gambas

Voir :

Voir aussi :

Différences avec Visual Basic : http://gambaswiki.org/wiki/doc/diffvb?l=fr

Tutos

Demo rapide :

Visual Programming using Gambas in Linux

CURSO GAMBAS LINUX :

Gambas report short demo / tutorial

Notions

  • Classes
  • Objects
  • Properties
  • Methods
  • Controls
  • Containers
  • Code
  • Events
  • Procedural

Configuration

Tools - Preferences - Highlighting theme :

  • ~~Amber~~
  • Blue
  • Obsidienne
  • Pastel
  • Zen

Pour forcer une lib graphique particulière

#GB_GUI=gb.gtk3 gambas3
GB_GUI=gb.qt5 gambas3

Compilation et autres

Execution

Pour pouvoir exécuter le code Gambas, seul le Runtime (et quelques autres composants) sont nécessaires. Le Runtime est ici :
/usr/bin/gbx3 (paquet gambas3-runtime)

Pour lancer un programme Gambas il suffit de lancer gbx3 en étant à la racine du projet

Compilation et création d'un fichier exécutable

Pour compiler en ligne de commande un projet Gambas vous pouvez utiliser gbc3

Exemple

gbc3 -a

Une archive correspond à un exe presque autonome (le Runtine est tout de même nécessaire)
Pour créer une archive Gambas il suffit de lancer la commande gba3 en étant à la racine du projet. Un fichier .gambas est crée. C'est du bytecode avec le shebang /usr/bin/gbr3 (lien symbolique vers gbx3)

Scripting

Voir :

Il est possible de scripter en langage Gambas

Exemple

hello.gbs

#!/usr/bin/env gbs3
Public Sub Main()
  Print "Hello Wolrd"
End
chmod +x hello.gbs
gbs3 -c -S -w hello_world.gbs

Le langage Gambas

Les commentaires et autres

Pour commenter il suffit de procéder le commentaire du caractère apostrophe “'”

Le multiligne s'effectue grâce au caractère “_” (blanc souligné)

Les class

Startup class Each project must have a startup class. This startup class must define a static public method named Main with no arguments.

Creating a class

From the Integrated Development Environment file, create a class file rhubarbstructure.class as follows:

PUBLIC foo AS STRING PUBLIC bar AS INTEGER 

It is now possible to define a variable utilizing that class, by creating an appropriate definition in the code module as follows:

DIM rhubarb AS rhubarbstructure
Les variables

Voir :

In Gambas it is necessary to declare every variable. To dimension a variable, the code is:

Dim variablename as type

You can just skip the word Dim , so the following is also correct:

variablename as type

Remplacer Dim par Static pour que la variable ne soit pas détruite à la sortie de la procédure / fonction mais seulement à la fermeture de l'application.

Gambas also supports the += and -= shorthand

Pour le type Variant voir l'instruction VarType

Les tableaux

Les tableaux peuvent avoir plusieurs dimension (60 !?)

Dim Tab(15,5)
Tab(1,2) = 10
Création de structure (Struct)
PUBLIC STRUCT Article
  Ref AS STRING
  Designation AS STRING
  Prix AS INTEGER
  Poids AS INTEGER
END STRUCT

Utilisation

Dim ArticleAchete As Article
Dim ArticleVendu As Article
 
Articlechete.Poids = 10
ArticleVendu = ArticleAchete

? Existe t-il un ORM pour faire le mapping entre l'objet créé et la base de données ?

Variables glocales

Il n'y a pas de variables globales en Gambas

Un contournement et de les mettre dans le module Main et de les déclarer comme Public

Si vous n'avez pas de module Main dans votre projet mais un Main form, vous pouvez les déclarer as Static Public.

Pour accèder à ces variables vous devez utiliser le nom du module ou du formulaire Main.

MyMainModule.MyGlobalVariable or MyMainForm.MyGlobalVariable
Les boucles

Exemple

Sub Option1_Click ()
  Dim i
  For i = 1 To 10
    Beep
  Next
End Sub
Les chaînes de caractères

String concatenation operator : “&

Path concatenation with “&/” operator
This operator deals with trailing slashes

Examples

Print "/home/gambas" &/ ".bashrc"
Print "/home/gambas" &/ "/tmp" &/ "foo.bar"
Les fichiers

Voir :

Ouvrir un fichier

Dim handle As File
handle = Open "myfile" For Read
Traduction

Translate

Print ("Tranlate me")
Print "But do not translate me!"
Substitution

Substitution avec Subst

Print Subst(("Substitution of &1, &2 and &3"), "first", "second", "third")
Les procédures / fonctions

Voir :

Exemple de syntaxe d'une fonction qui additionne deux nombres

Fonction

Function Fonc1(Param1 As Float, Param2 As Float) As Float
  Dim Ret As Float
  Ret = Param1 + Param2
  Return Ret
End Function

Appel de la fonction

Print (Fonc1(2, 3))

Autres

Dépendances du projet

$ dpkg -S $(strace --trace=%file -f ./testg.gambas 2>&1 |egrep -v "ENOENT|exited|^strace:" |sed -e 's/^.*"\//\//g' |sed -e 's/",.*$//g' |sort -u |grep gambas3)
gambas3-runtime: /usr/lib/gambas3/gb.draw.so
gambas3-gb-form: /usr/lib/gambas3/gb.form.gambas
gambas3-runtime: /usr/lib/gambas3/gb.geom.so
gambas3-gb-gtk3: /usr/lib/gambas3/gb.gtk3.so
gambas3-gb-gtk3-x11: /usr/lib/gambas3/gb.gtk3.x11.so
gambas3-runtime: /usr/lib/gambas3/gb.gui.base.gambas
gambas3-gb-gui: /usr/lib/gambas3/gb.gui.so
gambas3-gb-image: /usr/lib/gambas3/gb.image.so

Questions / Réflexions

Comment faire pour :

  • Accéder simplement à une API Rest
  • Gérer le Multithreading
  • Génerer une appli Gambas autonome avec toutes les dépendances inclus (DLL, runtime, comme avec VB msvbvm60.dll)
  • Chiffrer simplement un mot de passe (Vault) ?
  • Créer dynamiquement des “Controles” ?
    • You can create controls and menu dynamically, just by instantiating them with the NEW instruction.
  • “caster” ou forcer le type d'une varaible ?
  • Faire appel à du code écrit dans un autre langage (mais dans un autre langage compiler tel que Go) peut-être via les IPC, les sockets, via API Rest Microservices ?
  • Forcer un backend graphique (Si GTK et QT sont tous les deux installés) ?
  • Porter un code Python simple en Gambas
  • Créer des tableaux nommés / dictionnaires

Questions :

  • Il n'y a pas de Current Directory dans Gambas. Comment faire ?
  • Existe-il une technique similaire à ResHack ?
  • Quel est le langage le plus ressemblant syntaxiquement à Gambas pour avoir la coloration syntaxique avec d'autres outils (Git, wiki etc…)
  • Existe-il des linter et formateur (tel que black ou flake8 sous Python ou encore à go fmt sous Go)
  • Pourquoi n'y a t-il pas de Package Manager avec des dépôts de libs et frameworks en ligne?
  • Ne serait-il pas souhaitable d'inclure un didacticiel intégré comme sur Visual Basic ?
  • Que manque t-il pour le portage des applis gérées sur ARM Android ?
  • Pourquoi VB a disparu ? (ou a t-il été remplacé par VB .NET ?)
  • Existe t-il un ORM pour faire le mapping entre l'objet créé et la base de données ? (voir plus haut)

Limitation :

  • La commande Shell n'est pas capable de récupérer la STDERR !?
    • Voir les instructions SHELL, EXEC et la class Process
  • Ils n'y a pas d'équivalents à Map, Reduce, Filter

Notes marketing :

  • Mettre en avant la simplicité d'utilisation de Gambas
  • Mettre en avant les améliorations par rapport à VB
  • Support commercial ?
  • Renommer ou insister sur programmation événementiel / objet. Car le mot “Basic” fait peur ou du moins fait vieux
  • Crossfounding ?
  • Mettre en avant la capacité à générer facilement des paquets Debian, RedHat, Archinux, Slackware, Autotools, Opensuze…
  • Mettre à jours car beaucoup de liens morts concernant des vieux projets
2025/03/24 15:06

Notes fuseau horaire - timezone TZ - localtime - heure locale

Voir :

Choisir le fuseau horaire, pour la France :

ln -snf /usr/share/zoneinfo/Europe/Paris /etc/localtime
echo "Europe/Paris" > /etc/timezone

Ou

timedatectl set-timezone Europe/Paris

Changer de fuseau horaire

La procédure pour changer de fuseau horaire est assez simple. Il s'agit en fait de changer le fichier /etc/localtime à partir du bon fuseau dans /usr/share/zoneinfo.

Par exemple, pour choisir le fuseau horaire de l'heure de EST (Montreal/Canada) on peut faire:

ln -s /usr/share/zoneinfo/EST /etc/localtime
# ou encore
ln -s /usr/share/zoneinfo/America/Montreal /etc/localtime

Quelle heure est-il à ?

$ find /usr/share/zoneinfo/ -iname "*israel*"
/usr/share/zoneinfo/right/Israel
/usr/share/zoneinfo/posix/Israel
/usr/share/zoneinfo/Israel

$ date
vendredi 14 décembre 2018, 09:07:50 (UTC+0100)

$ TZ=Israel date
vendredi 14 décembre 2018, 10:08:16 (UTC+0200)
2025/03/24 15:06

Notes FTP Pure-FTPd

Voir aussi :

Installation

apt-get install pure-ftpd

N'autoriser que les utilisateurs présents dans /etc/ftpallow

/etc/pam.d/pure-ftpd
# Uncomment next line to allow non-anonymous ftp access ONLY for users,
# listed in /etc/ftpallow
auth    required        pam_listfile.so item=user sense=allow file=/etc/ftpallow onerr=fail
/etc/ftpallow
# list of users ALLOWED non-anonymous FTP access.
# You must edit the pam config in /etc/pam.d/pure-ftpd for this to take effect.
ftpuser

On chroot tous les utilisateurs

echo yes > /etc/pure-ftpd/conf/ChrootEveryone
service pure-ftpd restart
2025/03/24 15:06

Notes FTP ProFTPd

Voir aussi :

Debian

apt-get install proftpd-basic

RedHat

yum install proftpd proftpd-utils 

RedHat

/etc/sysconfig/proftpd

#PROFTPD_OPTIONS=""
PROFTPD_OPTIONS="-DTLS -DDYNAMIC_BAN_LISTS"

/etc/proftpd/proftpd.conf

UseIPv6                         off
UseReverseDNS                   off
ServerType                      standalone
DefaultRoot                     ~

AuthPAM                         off
#AuthOrder                      mod_auth_pam.c* mod_auth_unix.c
AuthOrder                       mod_auth_file.c

Passif

/etc/proftpd.d/55-passive-ports.conf

<Global>
PassivePorts 49152 65535
</Global>

FTPS

/etc/proftpd.conf

MasqueradeAddress     55.128.131.215

# ServerName                    "ProFTPD server"
ServerName                    "ftp.acme.fr"

SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/xferlog

TLSRSACertificateFile               /etc/pki/tls/certs/wildcard.acme.fr.cer
TLSRSACertificateKeyFile            /etc/pki/tls/certs/wildcard.acme.fr.key

#   TLSOptions                  NoCertRequest                                                      
    TLSOptions                  NoCertRequest NoSessionReuseRequired

    PassivePorts 40000 40200

#   BanOnEvent                  MaxLoginAttempts 2/00:10:00 01:00:00                          
    BanOnEvent                  MaxLoginAttempts 5/00:10:00 01:00:00

/etc/shells

/bin/false
ftpasswd --passwd --name=ftpuser --uid=$(id -u linuxuser) --gid=$(id -g linuxuser) --home=/home/ftp --shell=/bin/false --file=/etc/proftpd/ftpd.passwd
ftpasswd --group  --name=ftpuser --gid=$(id -g linuxuser) --file=/etc/proftpd/ftpd.group --member=ftpuser

/etc/proftpd/conf.d/plop.conf

AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
UseFtpUsers on
 
<Directory />
  HideFiles (lost\+found|welcome\.msg|\.message|^\..*)
  <Limit ALL>
        IgnoreHidden            on
  </Limit>
</Directory>

Validate - check syntax

#proftpd -td10
proftpd -td10 -c /etc/proftpd.conf

Lancer & activer le service

systemctl start proftpd.service
systemctl enable proftpd.service

Autres Liste des modules

proftpd -l
proftpd -V
proftpd -vv
proftpd -nd6

Test TLS/SSL

openssl s_client -connect 192.0.2.10:21 -starttls ftp

Pb

Pb error: no valid servers configured
journalctl -xe
Aug 10 14:36:11 acme proftpd[1331]: Starting ftp server: proftpd2017-08-10 14:36:11,019 acme proftpd[1338]: warning: unable to determine IP address of 'acme'
Aug 10 14:36:11 acme proftpd[1331]: 2017-08-10 14:36:11,019 acme proftpd[1338]: error: no valid servers configured
Aug 10 14:36:11 acme proftpd[1331]: 2017-08-10 14:36:11,020 acme proftpd[1338]: fatal: error processing configuration file '/etc/proftpd/proftpd.conf'

Cela peut arriver à la suite d'un changement de hostname

hostname -i
hostname: Temporary failure in name resolution
Solution

Le hostname doit être résolvable

echo "127.0.1.1       $(hostname -s).localdomain     $(hostname -f)" >> /etc/hosts

/etc/hosts

127.0.0.1       localhost
127.0.1.1       acme.localdomain      acme

Autre solution /etc/proftpd/proftpd.conf

DefaultAddress 127.0.0.1
sed -i -e 's/^LoadModule mod_unique_id.c/#&/' /etc/proftpd/modules.conf
2025/03/24 15:06

Notes formatage mkfs mount file system

XFS

# ls -l /dev/mapper/|grep part|awk '{print $9}'
3624a937043be47c12334399b00016d73-part1
3624a937043be47c12334399b00016d74-part1
3624a937043be47c12334399b00016d75-part1
# parts=`ls -l /dev/mapper/|grep part|awk '{print $9}'`
# for i in $parts
> do
> mkfs.xfs -d su=131072,sw=8 -i size=1024 $i
> done

You can verify that the underlying filesystem has the correct values for stripe unit and stripe width by using the xfs_info command:

mount -t xfs -o nobarrier,noatime,nodiratime,inode64 /dev/mapper/3624a937043be47c12334399b00016d73-part1 /disk1
# xfs_info /disk1
meta-data=/dev/mapper/3624a937043be47c12334399b00016d73-part1 isize=1024   agcount=4, agsize=83623808 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=334495232, imaxpct=5
         =                       sunit=32     swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=163328, version=2
         =                       sectsz=512   sunit=32 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

sunit and swidth are shown in bsize (block size) units in the xfs_info command output.

stripe unit= 32 sunits * 4096 bsize (block size)= 131072 bytes = 128K
stripe width= 256 blocks * 4096 bsize = 1M = 128K * 8 drives

The sysctl fs.xfs.rotorstep can be used to change how many files are put into an XFS allocation group. Increasing the default number from 1 to 255 reduces seeks to multiple allocation groups. Improved performance has been observed in some cases by increasing this number. You can put the following line in /etc/sysctl.conf to ensure this change is affected on each boot of the system:

fs.xfs.rotorstep = 255

When mounting the XFS filesystem that resides on the LUNs offered from the FlashArray, be sure to use the following mount options:

mount –t xfs –o “discard,nobarrier,noatime,nodiratime,inode64” \
/dev/mapper/nodeX /srv/node/sdb1

Source : https://pure-storage-openstack-docs.readthedocs.io/en/wallaby/swift/section_swift-partitioning.html

The overlay2 driver is supported on xfs backing filesystems, but only with d_type=true enabled.

Autres /mkfs.xfs -m reflink=1 /dev/sdc

mkfs.xfs -n ftype=1 -m reflink=1 /dev/mapper/vg_data-data

Lazy pulling of container images can run more efficiently when the file system has reflink support. The file systems XFS and BTRFS have reflink support. Source : podman

2025/03/24 15:06
blog.txt · Dernière modification : de 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki