Raspbian 11: $EDITOR gezocht

Editor of $EDITOR?
Een van de eerste dingen die opvallen na installatie van Gambas3 op de Raspberry Pi met OS Raspbian GNU/Linux 11 is dat Gambas naar de “Editor” vraagt bij het openen van een bestaand (git-)project:

Please set the $EDITOR environment variable with your favorite graphical text editor. Some version control commands need it

Dit heb ik opgelost door de volgende lijn toe te voegen aan /etc/profile.
export EDITOR=/usr/bin/mcedit

Select-editor
De .bashrc oplossing zoals andere Linux distributies (bv OpenSUSE Gambas opstart set $Editor) werkt hier niet op Raspbian.
De Raspberry Pi heeft zijn eigen tool voor het instellen van de editor (waarvan het resultaat niet herkend werd door Gambas), het commando

select-editor.

Daarna krijg je een keuzemenu met genummerde mogelijkheden, en kan je met een cijfer je keuze maken, bv 1. Nano.
Als je zelf bv al midnight commander geïnstalleerd had, komt mcedit ook voor in de keuzelijst.
Select-editor toont helaas niet wat de huidige keuze is.
Na de keuze zet select-editor een verborgen bestand .selected_editor in je home direoctory, met daarin
SELECTED_EDITOR="/usr/bin/mcedit"
Ik vermoed dat het bij de volgende start/login gelezen wordt.

Of toch niet?
Maar Gambas blijft de $EDITOR variabele vragen, zelfs na de volgende login. 
Ik weet dat de keuze aktief is door een test met crontab -e.

Het bestand ~/.bashrc bestaat ook hier, en ik voeg toe: 
EXPORT EDITOR=/usr/bin/mcedit
maar op geen enkele manier (met aanhalingstekens, zonder, met $, zonder..) werkt dat.
(m.a.w. Gambas3 blijft de vraag stellen).

Ik probeer de volgende lijn  toe te voegen aan /etc/profile:
export EDITOR=/usr/bin/mcedit
(sudo nodig).

Na herstarten op de commandline 
echo $EDITOR
/usr/bin/mcedit

Deze keer ok!

Fout in Library

Door een fout in een library kreeg ik in mijn applicatie (het programma dat die library gebruikte) fouten die ik niet begreep.

Library:

ExampleObject
– id
– SomeExternalId
– otherdata

In de library zat ook een module om de gegevens te bewaren in- en op te vragen uit de database.

Testprocedures in mijn library konden perfect een ExampleObject maken in de de database bewaren.

Mijn eindprogramma niet.

Als in in mijn eindprogramma directe sql code schreef, ging het daar wel.

De fout zat in het ExampleObject in de loadFromDb code.

If resDb.Available
$lId = resDb!id
- $lExternalId = resDb!Xternal_id

–> ipv resDb!External_id

In mijn applicatie deed ik eerst een controle op het bestaan van het order, waarbij die loadFromDb code gebruikt werd.

Verder had ik die load code nog nooit gebruikt (applicatie is nog in ontwikkeling), dus ik was die fout nooit tegengekomen.

Deze fout kan normaal niet voorkomen want ik maak altijd eerst de velden in de databank aan, en genereer daarna de persistence code met de dbInfoCode tool.

Dit veld was nadien toegevoegd, en deze lijn manueel toegevoegd. In het vervolg ga ik langs die tool en knip/plak de gegenereerde code …

Bereik van variabelen als record id

Wanneer kies je in Gambas voor int, wanneer voor long?
Wanneer kies je in de databank voor een int(11), wanneer voor bigint(20)?

https://gambaswiki.org/wiki/lang/type

Kleinere:
Datatype Description Default value Size in memory
Boolean True or false. FALSE 1 byte
Byte 0...255 0 1 byte

Integer meer of minder:
Datatype Description Default value Size in memory
Short -32.768...+32.767 0 2 bytes
Integer -2.147.483.648...+2.147.483.647 0 4 bytes
Long -9.223.372.036.854.775.808...+9.223.372.036.854.775.807 0 8 bytes

Ik merk dat ik uit luiheid meestal “int” gebruik. Dikwijls is dat overkill, en is Short zeker genoeg. En als er geen negatieve getallen kunnen voorkomen (soms wordt een fout aangeduid door een negatief getal), en het maar over een klein getal gaat, dan is Byte zelfs genoeg.
Bij int is het vooral opletten met de grenzen als het bv record nummers woden; 2 miljoen records is niet zo veel.

MariaDB datatypes
MySQL datatypes, bv de integer data types :

Vereiste opslag en bereik van integer data types in MySQL

Type Opslag (Bytes) Minimum waarde Signed Minimum waarde Unsigned Maximum waarde Signed Maximum waarde Unsigned
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

Zie ook de tabel voor het doen overeenkomen van een type in de programmeertaal naar de databank, db-type mapping:

https://gambaswiki.org/wiki/doc/db-type-mapping

Testen in Gambas met unittesting

Testen

Ik gebruikte al verschillende manieren om mijn programma’s te testen:
– ik dump allerlei waarden naar de output met print (die blijven ook werken in uitvoerbare programma’s)
– ik dump allerlei waarden naar de output met debug (die worden er uit gehaald bij compileren als je dat kiest)
– ik neem testcode op in mijn applicatie en stuur de uitvoer naar een optioneel zichtbaar te maken “log” (bestand of tekst op scherm).
– bij libraries schreef ik de testen in de main module, omdat die toch niet geëxporteerd wordt, dus niet zichtbaar wordt voor gebruikers. Wordt snel te veel.
– ik maak een aparte module “MTest” waar ik alle tests in steek. Ik moet die dan nog wel aanroepen uit bv de Main (library) of kan ze zelfs vanuit mijn draaiende applicatie aanroepen (bv via een testmenu in “hidden developer mode”).
– ik schreef een library MijnLib en maakte een testprogramma MijnLibTest en riep de testen aan vanuit Main, en zet ze aan of af door een commentaarteken voor de lijn te wissen/zetten. Wordt ook snel onoverzichtelijkt.
Maar dat is nog geen unittesten

Formeel geÏntegreerd
Zoals altijd bij Gambas (althans mijn ervaring): als je iets nodig hebt, blijkt het ofwel al te bestaan, ofwel wordt het bijgemaakt, en kan je je eigen methodes vervangen door de geïntegreerde methodes in Gambas zelf.

Bij gebruik van de Gambas3 IDE viel me op dat er bij creatie van een nieuw bestand onder “bronnen”, behalve de opties “map”, “klasse”, en “module”, ook een optie “Test module” bestaat. Die maakt standaarde de testmodule “Test1” aan (die als bestandsnaam “Test1.test” heeft).
Waarschijnlijk is het overzichtelijker om een map te maken voor je tests (zoals ze in het voorbeeld doen); dus maak je eerst submap “Test”, en daarin de “Test1.test”. De testbestanden worden gebruikt in volgorde van hun bestandsnaam, en binnenin op volgorde van de methodenamen.
Een testmodule is in de linkse kolom herkenbaar aan een iets ander icoontje: een optionbox (aanvinkbaar hokje), en bij conventie laat je de naam voorafgaan door een T: TNaam (vgl module MNaam, form FNaam, class CNaam)

In de programmeeromgeving van Gambas3 druk je op F4 om de testen te starten.
Onderaan krijg je een vensterdeel met de resultaten van de tests. Bij het uitvoeren van de tests wordt een teller bijgehouden en onderaan krijg je een resultaat, bv als alles goed ging “PASSED”, anders “FAILED”.

Om de testen op te stellen heb je “Assert” te hulp:

Assert.Equals(uitdrukking1, uitdrukking2, commentaar)
Assert.Ok(uitdrukkingIsTrueOrNot, commentaar)
Assert.Error(commentaarBijErrorInTry_Something)
enz, Assert heeft een heleboel nuttige tests.

Gebruik
Als je helemaal nog geen code hebt, en gewooen een nieuwe test maakt “Test1”, en je probeert F4 krijg je:

1..0

# Ran ‘Test1’
#
# FAILED

En de voorbeeldcode (zie link onderaan) draait een succesvolle test en geeft:

1..5

Test THello.AHelloWorld
# I am the first test, because my name starts with A.
ok 1 – THello.AHelloWorld.7: HW strings should be equal
1..1
ok 1 – THello.AHelloWorld
(…enz 2, 3, 4 ..)
Test THello.Right
ok 1 – THello.Right.19: Hello.Right says Right
1..1
ok 5 – THello.Right

# Ran ‘Testsuite: A: Run all tests’
#
# PASSED

Verfijnen
Als je wil kunnen kiezen welke tests je wel of niet draait, kan je “test suites” maken. In het test scherm (F4) krijg je rechts onderaan de knop om “Test suites” te maken, -draaien, -beheren, enz.

Plannen
Het is lonend om bij het programmeren voor bepaalde methodes/procedures/functies eerst de test te programmeren, en dan pas de methode zelf: je kan dan tijdens het programmeren van de methode onmiddellijk testen met je test.
Als je later aanpassingen aan je programma maakt, bedenk je eerst of de test moet veranderen, en daarna kan je de wijzigingen dan ook testen met je oorspronkelijke of aangepaste test.
Vooral bij libraries zijn testmodules interressant, ook voor algemene code in modules in je project.

Links
https://gambaswiki.org/wiki/doc/unittesting
https://nl.wikipedia.org/wiki/Unittesten
https://gitlab.com/gambas/gambas/-/blob/master/main/lib/test/gb.test/unittesthelloworld-1.0.0.tar.gz

Gambas3 updates (OpenSUSE e.a.)

-ps voorheen zie ook Gambas2 updatesvanaf 2024 zie ..

Updates van Gambas3, meestal openSuse (v.a. 12-2018):
(datum opgemerkt, uitgavedatum kan je checken op gambas.sourceforge.net/en/main.html)

2023-12-10
openSUSE 15.4: gambas3 v. 3.18.4-lp154.9.1

2023-12-06 Sint-update
openSUSE 15.4: gambas3 v. 3.18.4-lp154.8.1

2023-11-21
openSUSE 15.4: gambas3 v. 3.18.4-lp154.7.1

2023-10-24
openSUSE 15.4: gambas3 v. 3.18.4-lp154.6.2

2023-10-15
openSUSE 15.4: gambas3 v. 3.18.4-lp154.6.1

2023-10-04
openSUSE 15.5: gambas3 v. 3.18.4-lp155.5.2

2023-09-28
openSUSE 15.4: gambas3 v. 3.18.4-lp154.5.2

2023-09-25
openSUSE 15.4: gambas3 v. 3.18.4-lp154.5.1

..(heb ik er gemist? Op sommige systemen spring ik van 1.1 naar 5.1, ergens zoals hieronder heb ik 2.1)

2023-09-22
openSUSE 15.4: gambas3 v. 3.18.4-lp154.2.1

2023-09-18
openSUSE 15.4: gambas3 v. 3.18.4-lp154.1.1

2023-07-27
openSUSE 15.4: gambas3 v. 3.18.3-lp154.3.1

2023-07-07
openSUSE 15.4: gambas3 v. 3.18.3-lp154.2.1

2023-06-25
openSUSE 15.4: gambas3 v. 3.18.3-lp154.1.1

2023-05-25
openSUSE 15.4: gambas3 v. 3.18.2-lp154.12.1

2023-05-22
openSUSE 15.4: gambas3 v. 3.18.2-lp154.11.1

2023-05-15
openSUSE 15.4: gambas3 v. 3.18.2-lp154.10.1

2023-05-12
openSUSE 15.4: gambas3 v. 3.18.2-lp154.9.1

(…)

2023-02-27
openSUSE 15.4: gambas3 v. 3.18.1-lp154.3.1

2023-02-13
openSUSE 15.4: gambas3 v. 3.18.0-lp154.11.1

2023-02-12
openSUSE 15.4: gambas3 v. 3.18.0-lp154.10.1

2023-02-07
openSUSE 15.4: gambas3 v. 3.18.0-lp154.9.1

2023-01-25
openSUSE 15.4: gambas3 v. 3.18.0-lp154.8.1

2023-01-15
openSUSE 15.4: gambas3 v. 3.18.0-lp154.6.1

2023-01-03
openSUSE 15.4: gambas3 v. 3.17.3-lp154.24.2

2022-12-28
openSUSE 15.4: gambas3 v. 3.17.3-lp154.24.1

2022-12-05
openSUSE 15.4: gambas3 v. 3.17.3-lp154.23.1

2022-12-03
openSUSE 15.4: gambas3 v. 3.17.3-lp154.22.1

2022-11-28
openSUSE 15.4: gambas3 v. 3.17.3-lp154.21.1

2022-11-21
openSUSE 15.4: gambas3 v. 3.17.3-lp154.16.3

2022-11-05
openSUSE 15.4: gambas3 v. 3.17.3-lp154.16.2

2022-10-27
openSUSE 15.4: gambas3 v. 3.17.3-lp154.16.1

2022-10-21
openSUSE 15.4: gambas3 v. 3.17.3-lp154.15.1

2022-10-04
openSUSE 15.4: gambas3 v. 3.17.3-lp154.13.1

2022-09-28
openSUSE 15.4: gambas3 v. 3.17.3-lp154.10.1

2022-09-23
openSUSE 15.4: gambas3 v. 3.17.3-lp154.9.1

2022-09-20
openSUSE 15.4: gambas3 v. 3.17.3-lp154.8.2

2022-09-05
openSUSE 15.4: gambas3 v. 3.17.3-lp154.8.1

2022-08-26
openSUSE 15.4: gambas3 v. 3.17.3-lp154.6.1

2022-07-25
openSUSE 15.4: gambas3 v. 3.17.3-lp154.1.1
van:
openSUSE 15.4: gambas3 v. 3.17.2-lp154.4.1

vr 08 apr 2022 14:00:00
munix9@googlemail.com
- update to version 3.17.2 (ed8b8b69)

(2021…)
Continue reading

Kan project bestand niet openen

Bij het openen van een project krijg ik deze foutmelding:

Kan project bestand niet openen:
/home/cyb/Git/DbInfoCodePrj/dbinfocode

Void key
Project.ReadProject.3436 Project.Open.794 FWelcome.ProjectItem_Click.400 CProjectList.ProjectItem_Click.523 ProjectBox.DrawingArea_MouseUp.487 ?

Ik kan het bericht alleen wegklikken en blijf daarmee in het Gambas openingscherm om een project te kiezen.

Het project zit in een git repository.

Ik schakel over naar een andere branch (die kort daarvoor gemerged is met deze branch).

Nu gaat het project wel open. Ik schakel terug naar de “defecte” branch, en bekijk de foutmelding.
Die verwijst naar het project-bestand, dus ik open in een externe editor de .project file.

Daar vind ik stukken van een mislukte merge terug:

mcedit .project

# Gambas Project File 3.0
Title=DbInfoCode
Startup=MMain
Icon=img/DbInfoCode.png
<<<<<<< HEAD Version=3.2.11 ======= Version=3.2.12 >>>>>>> main
Component=gb.image
Component=gb.gui.qt
Component=gb.form

Ik verwijder de git lijnen en laat de juiste versie staan..

# Gambas Project File 3.0
Title=DbInfoCode
Startup=MMain
Icon=img/DbInfoCode.png
Version=3.2.12
Component=gb.image
Component=gb.gui.qt
Component=gb.form

Ok! Het project opent weer normaal.

Dataconnection vanuit lib of app?

Ik vraag me af of ik de verbinding met de databank vanuit de applicatie moet doen of vanuit de lib die de data-classes bevat.

Nodig:

1 project als lib (zie properties bij maken nieuw gambas project)
1 project als gewone gambas3 applicatie.

Ik gebruik ook:
gb.db (Database toegang) en “Settings” in project properties, componenten (voorzien in Gambas).
– bibliotheek “DataContext” in project properties, libraries (deze moet je zelf afhalen)

In de lib zitten
– de classes bv CEmployee beschrijft de employee (properties voor velden enz).
– de Module MEmplData: bevat procedures voor het aanmaken van records, opvragen vanuit de classe voor het laden van de variabelen in de properties, bewaren vanuit de classe van het “object/record”.
– de Module MEmpData bezit ook hConData AS Connection

– de applicatie gaat de lib.hCondata initialiseren met de toegangsgegevens van de databank met behulp van DataContext.makeConnection.
(gegevens die gelezen worden uit een settings file – dat gebeurt in de DataContext class CDataContext; je kan er context naar settings mee maken, aktieve context zetten wat ook bewaard wordt in settings, nieuwe settings file maken, lijst alle contexten in settings opvragen, enz)

– in de applicatie ga je gewoon de “current” datacontext gebruiken, en je kan “switchen” van context door de “current” aan te passen via DataContext, en te “herladen”, maw de connectie terug te maken.

Git vanuit gambas

Voor een eigen programma waar de inhoud wordt bijgehouden in een git repository, zou ik die willen kunnen updaten vanuit mijn Gambas app. Sinds een tijdje is in de IDE een voorziening ingebouwd om de git branch om te schakelen enz vanuit de IDE, dus daar zit mogelijk een aanknooppunt.

Algemeen: een commando kan je vanuit Gambas lanceren met shell of exec.

In de broncode van gambas 3.18.0 vind je een map VersionControl met een Class CVersionControl, met een subclass CVersionControlGit.

Daarin:
Private Sub RunShell(sCmd As String, Optional bSilent As Boolean) As String
'
Return VersionControl.Shell("cd " & Shell(Project.Dir) & " && " & sCmd, bSilent)
'
End

In de Module (naam zonder M) “VersionControl” vind je:

Public Sub Shell(sCmd As String, Optional bSilent As Boolean, Optional aEnv As String[]) As String
'
Dim sResult As String
'
If Not bSilent Then Insert(sCmd & "\n")
Shell sCmd With aEnv To sResult
If Process.LastValue Then
$sLastResult = sResult
Insert(sResult)
Endif
Return sResult
'
End

Demonstratie van Gambas app

RApp
Deze app die je kan vinden op GitLab (login nodig), demonstreert een paar Gambas3 technieken, zoals het maken van een About menu (met informatie over de app), het doorgeven van parameters tussen Forms, het laden van een .txt in een scherm, het organiseren van een project (bestanden, mappen), en het gebruiken van (eigen) libraries.

Als je de libraries niet geïnstalleerd hebt, kan je het programma wel bekijken om er andere dingen uit te halen.

Ook als .tar.gz op sourceforge (meestal ouder dan de git repo’s).

Form leeg, schijnbaar; niets meer weergegeven, alle objecten verdwenen

FMain plots leeg
Ik weet niet exact wat er voordien gebeurd is, wel dat ik twee keer Gambas3 had openstaan naast elkaar (wat ik dikwijls doe) en dat ik objecten geknipt en geplakt had van de ene naar de andere (waarbij ctrl-v niet werkte en ik rechtsklik-plak heb gedaan. Misschien heb ik het programma laten draaien en liep het vast, of heb ik het onderbroken, geen idee.

Op een bepaald moment “run” ik het programma, en er komt niets op het scherm. Ik zie wel in de konsole (F11) dat het programma draait door de uitvoer van “print” en “debug” commando’s. Er staat een zeer klein venstertje op mijn scherm dat ik probeer groter te maken, maar dat lukt niet, het klapt terug klein, of verwijnt helemaal.

In de IDE is de Form FMain ook leeg. In de Hierarchy zie ik gelukkig de objecten nog wel allemaal staan. Als ik een (onzichtbaar) object selecteer, en naar de eigenschappen kijk, zie ik dat zowel de breedte, als de x-positie en de y-positie op 0 staan.

Deze eigenschappen terug invullen met een willekeurig getal, brengt het object terug in beeld (weliswaar met verkeerde afmetingen).

MoveScaled -2,-2 of onzichtbaar?
Ik kijk in de backup (van de ondertussen veranderde FMain.form: daar zie ik verschillende negatieve waarden in “MoveScaled”.

HBoxTrypoTables HBox
MoveScaled(-2, -2)

en andere die onzichtbaar staan:

HBoxCombi HBox
Visible = False

Ik denk dat vooral die negatieve waarden het probleem zijn…