Domme fouten checklist

Af en toe loop ik vast en als ik na lang zoeken de fout vind blijkt dat bijna altijd een “domme fout” te zijn. Iets vanzelfsprekend waar ik over keek. Ik zou een kleine checklist moeten hebben om die stomme fouten er snel uit te halen.

Veel voorkomende fouten
Database struktuur is veranderd:

  • extra veld, of veld minder
  • veld mag NULL zijn of niet NULL zijn
  • Default value instelling (bv NULL ipv ”),
  • library niet (helemaal) mee veranderd (bouw test in library: als lib object kan schrijven/lezen, kan het nog moeilijk fout gaan…)
  • Aanroepen uit verkeerde module: bv een functie aanroepen met een verkeerde modulenaam ervoor ipv de interne, of gekopieerde brontekst waar nog een andere modulenaam instaat.
  • Library gecompileerd; juiste versie van de library? (neem op in lib: VERSION en applicatie: libraries.txt, en toon in About)
  • verkeerde veldnaam, vooral met dingen als id en/of employee_id, external key.
  • volgorde initialisatie variabelen (veranderd door nieuwe code?)
  • dubbel uitvoeren van code
  • index (startwaarde vanaf 0 of 1, eindwaarde tot n-1, …)
  • …(aan te vullen)

Gambas 3.14 start niet

openSUSE 15.1 + Education repository
De oorspronkelijke Gambas 3.10 werkt normaal.
Na een upgrade en wijziging van repository naar Education en Gambas 3.14 start gambas niet.

Op de commandolijn:

gambas

gbx3: unable to find startup file

En op een andere manier, met het hele pad:

/usr/bin/gambas3.gambas

~> /usr/bin/gambas3.gambas 
ERROR: #27: Cannot load component 'gb.jit': cannot find component

** 
** OOPS! INTERNAL ERROR. Program aborting, sorry! :-(
** Unable to find JIT._Abort() method
** 
** ERROR: Unable to find method _Abort in class Jit. Symbol not found
** 
** Please send a bug report to the gambas bugtracker [1] or to the gambas mailing-list [2].
** [1] http://gambaswiki.org/bugtracker
** [2] https://lists.gambas-basic.org/listinfo/user
** 

Daar staat alles in wat we nodig hebben:

..
Error: #27: Cannot load component ‘gb.jit’: cannot find component
..
Unable to find JIT._Abort() method

In Yast, software management, zoek “gambas3” zie je dat gb-jit niet aangevinkt staat in de lijst van gambas3 programma-onderdelen.
Dus bij-installeren:

gambas3-gb-jit

Klaar!

ps: er stonden, behalve al de debug packages, nog een paar paketten niet aangevinkt …

– gb-gtk3
– gb-inotify
– gb-media
– gb-option
– gb-scanner

Ik ben nu een bedrijf (B. M.)

[Gambas-user] I am now a company

Op de mailinglist van Gambas verscheen een opmerkelijk bericht, waarin Benoît Minisini, de auteur van Gambas, aankondigt dat hij ontslag genomen heeft op zijn werk.

Sinds 1 mei is hij zelfstandig consulent geworden, en in die hoedanigheid werkt hij wel verder voor zijn voormalige werkgever.

Alle werk dat hij voor die werkgever deed was gemaakt in Gambas.

De afspraak die hij maakte gaat nu in tot december, daarna ligt alles open.

Hijzelf heeft wel de bedoeling om verder te blijven werken aan Gambas.

Temperatuur uitlezen op Raspberry Pi/Raspbian

Installeren van Gambas3 op Raspbian is gemakkelijk (zie vh/elders).

Een temperatuurvoeler aansluiten op een Raspberry Pi is ook gemakkelijk (zie bv hier)

Dan is een beetje code al genoeg, met een nieuw project dat alleen maar CLI hoeft te zijn (geen grafische interface nodig).

In MMain:

' Gambas module file
'
Private Const SENSORID As String = "10-0008032a0f9d"
Private Const DEVICELOCATION As String = "/sys/bus/w1/devices"
Private sFileContent As String
'
Public Sub Main()
'
  Dim hTempFile As File
  Dim sFilename As String = DEVICELOCATION &/ SENSORID &/ "w1_slave"
  Dim iFoundTemp As Integer
  Dim iCounter As Integer = 0
'  
  Debug "Filename is : " & sFilename
'  
  Repeat
    hTempFile = Open sFilename For Read
'  
    sFileContent = hTempFile.Load(sFilename)
    iFoundTemp = InStr(sFileContent, "t=")
 ' 
    hTempFile.Close
 ' 
    Print sFileContent
    Print iFoundTemp
    Print Val(Right(sFileContent, 6)) / 1000
    Inc iCounter
      Wait 10
  Until iCounter > 10
'
End

Dit programma zal 10 keer na elkaar de temperatuur uitlezen en tonen.

Gambas CLI

Veel te weinig aandacht voor de Command Line Interface!

Je kan Gambas ook gebruiken om een terminal/console/konsole/commandolijn programma te maken, dat je zonder grafische interface kan starten (bv op een server zonder X/KDE/Gnome). Je start het als een commando, eventueel over een ssh sessie.

Of je kan een programma maken dat je start vanuit de cron jobs, m.a.w. je stelt je computer in om dat op bepaalde momenten uit te voeren, bv dagelijks om 01:00 u.

Start nieuw project, kies CLI, “testCLI”.

In Main kan je iets zetten als:

' Gambas module file
'
Private bQuit As Boolean = False
'
Public Sub Main()
'
  Dim sCommand As String
  '
  While Not bQuit
    showShortMenu()
    Line Input sCommand
    Print " - - -"
    Debug "terminal got: " & sCommand
    If Len(Trim(sCommand)) = 1
    ' short commands
      Select sCommand
        Case "Q", "q"
          Print "Closing down " & Application.Name & " now"
          bQuit = True
        Case "H", "h"
          showHelp()
      End Select
    Else
      Print Len(Trim(sCommand))
    Endif
  Wend
  '
End
'
Public Sub showShortMenu()
  '
  Print "H = help, Q = quit"
  '  
End
'
Public Sub showHelp()
  '
  Print " HELP!"
  '
End

Je kan het effect uitproberen vanuit de Gambas programmeeromgeving; die heeft onderaan een commandolijn die bij “Run” het programma uitvoert.

Bewaar het project en maak een “uitvoerbaar bestand” (testCLI.gambas) om het te kunnen starten buiten gambas om.

~/Gambas3/Gb3Run> ./testCLI.gambas
H = help , Q = quit
h
- - -
Main.Main.13: terminal got: h
HELP!
H = help , Q = quit
q
- - -
Main.Main.13: terminal got: q
Closing down empttrack now

Een eigen Library (maken)

(zie ook Library of Component)

Het gebruiken, maar ook het maken van een eigen Library is voorzien in de Gambas IDE. En je kan ook manueel een gewoon project als Library gebruiken.

1. Library gebruiken

IDE
Kies in de IDE bij het maken van het project (of ga in een bestaand project naar) menu Project/Eigenschappen/Bibliotheken.
Onderaan dit venster (waar eventueel al gekozen Libraries staan) zie je een knop Toevoegen. Daarmee krijg je een venster met een lijst van beschikbare bibliotheken.

Vendor
Die zijn georganiseerd volgens Vendor/Library, m.a.w. de vendor staat voor wie de Libraries levert. Als je een bestaande Library gebruikt is dat bepaald door wie ze gemaakt heeft. Als je de Library zelf maakt, kan dat in jouw geval gewoon je eigen naam zijn, de naam van de organisatie (bedrijf) waarvoor je werkt, of de naam van een project waar de Library in thuishoort. De vendor naam groepeert de Library bestanden, en dat bestaat zo als directory struktuur op de plaats waar ze geïnstalleerd zijn.

Kiezen
Je kan hier dus de Libraries die je in je project wil gebruiken kiezen, verwijderen, wijzigen (bv andere versie beschikbaar).
Elke library vermeldt ook welke klasse of module ze ter beschikking stelt, niet de details van welke methodes of eigenschappen ze aanbiedt. In de huidige versie van Gambas 3.9.2 vermeldt het ook niet de extra gegevens over de Library (auteur, beschrijving).

2. Libary maken (IDE)

Start de Gambas IDE, menu Bestand, Nieuw project: “1 Project Type”: ….
Dit scherm helpt je niet in je keuze; het project type “library” wordt niet vermeld!
Neem bv het eerste, command line application, kies een directory en een naam (bv “DemoLibraryCLI”). Ok.
Je krijgt een project met alleen een MMain, die ook opstartklasse is (zwart pijtlje ervoor).

Ga naar Project, Eigenschappen, Algemeen; bij “Project Type” kies je Bibliotheek (ipv Normaal).

Vul de “verkoper” (vendor) in; bv TestVendor (je kan hier geen leestekens of spaties gebruiken; deze naam wordt gebruikt als directorynaam – zie boven). Beschrijving en Auteurs is niet verplicht. Ok.

Maak bij Bronnen een nieuwe module “MDate”. In het edit venster tik je onder ‘Gambas module file en de lege lijn:
Export
Bewaar.

' Gambas class file
'
' uitleg van wat de klasse doet

Export
' hieronder de code v/d klasse

In de linkse kolom krijgt de Modulenaam een gele stip; die geeft aan dat ze geëxporteerd wordt.

De andere, onzichtbare klassen kunnen dienen voor testcode enz.

Geef in het editorvenster wat code in; bv een publieke constante waarde waarin je favoriete formatteringscode voor de datum zit:

Public const sDateFormat As String = "dd-mm-yy"

en een procedure die die gebruikt:

Public Sub GetDateFormat(dDate As Date) As String
Return Format(dDate, sDateFormat)
End

Beiden zijn Public en kunnen dus extern gebruikt worden nadien.

Ps: Als je zelf iets moet benaderen in de directorystruktuur: ./ is waar de library zelf staat, ../ zou verwijzen naar het hoofdproject.

In MMain kan je code zetten om je module te testen; die MMain wordt toch niet geëxporteerd; bv:
(wordt ook zo aangegeven in de documentatie in “How to test a library”)
Print MDate.GetDateFormat(Now())

Als je dit project uitvoert, wordt de datum gedrukt als 20-10-18.

Als je een uitvoerbaar bestand maakt (plaats: bv je zelfgemaakt gambas project executables map “gb3Run”) met de naam DemoLibraryCLI.gambas, wordt ook een extra bestand gemaakt in een verborgen subdirectory je home directory.

/home/username/.local/share/gambas3/lib/TestVendor/DemoLibraryCLI:0.0.gambas

Het versienummer zit mee in de bestandsnaam (maar mist het laatste teken).

Ga naar je DemoLibaryApp (of maak die), en selecteer de library. (volg de instructies zoals hierboven).
De library is met Toevoegen zichtbaar onder TestVendor als DemoLibraryCLI met versie 0.0.
Met “ok” kan je ze kiezen, en je krijgt ze zichtbaar (met een versienummer 0.0.1) en “Voorziet in: MDate!”

3. Libary maken van bestaand project

  • Voeg “Export” regel toe bovenaan de nodige modules/classes.
  • Maak uitvoerbaar bestand in de voorheen vermelde library directory, in een “vendor” map; wijzig de naam door een versienummer toe te voegen in de naam.

upd 26022019

4. Library installeren

De meest luie manier om een eigen library te installeren op een andere machine, is een ssh verbinding te maken naar de pc waarop je het programma gemaakt hebt (en werkend hebt met de nodige libraries). Je kopieert de hele subdirectory van je vendor/lib01/ naar de bestemmingsmachine.

Een andere manier is het oorspronkelijke project van de library als tar.gz over te brengen naar de bestemming, en daar uit te pakken en “make executable”/”uitvoeringsbestand maken” (compileren alleen is niet genoeg), zie boven bij 1. Library gebruiken.

Binnen en buiten ASCII text (leestekens, extended)

Om bestandsnamen te maken, namen van mappen, e-mail adressen, tekst voor opslag in een database veld, html, enz is het soms nodig om enkel bepaalde tekens te gebruiken. Enkele “sub-sets”:

Letters en cijfers:

Chr(i) waarbij i is:

  • 48 tot 57 = 1 .. 9
  • 65 tot 90 = A .. Z
  • 97 tot 122 = a .. z

Normale standaard tekens:

Chr(i) waarbij i is:

  • 32 (spatie) tot 126 ~ (tilde)
  • met daartussen leestekens, haakjes, cijfers, letters enz

Extended:

Chr(i) waarbij i is:

  • 128 tot 255 (niet printbaar)

Weergeven:


Public Sub Main()
Dim sStandaard, sExtend, sPureText As String
Dim iCount As Short

For iCount = 48 To 57
sPureText &= Chr(iCount)
Next

For iCount = 65 To 90
sPureText &= Chr(iCount)
Next

For iCount = 97 To 122
sPureText &= Chr(iCount)
Next

For iCount = 32 To 126
sStandaard &= Chr(iCount)
Next

For iCount = 128 To 255
sExtend &= Chr(iCount)
Next

Print "sPureText = " & sPureText
Print "sStandaard = " & sStandaard
Print "sExtend = " & sExtend

Foto’s (of andere beelden) vergroten of verkleinen

Om later eens te gebruiken …

Ik vond in een voorbeeld app in Gambas volgend stukje code:

Public Sub Add(ImagePath As String)
Dim img As Image
Dim newPicture As Result
'Dim pictureData As String
Dim scale As Float
Dim eTime As Float
newPicture = databaseConnection.Create("pictures")
' Save temp image as png file
img = Image.Load(ImagePath)
img.Save(tempFile)
newPicture["image"] = File.Load(tempFile)
' Create image thumb
If img.Width > thumbSize Or img.Height > thumbSize Then
' Calc factor to scale isotropic
scale = Min(ThumbSize / img.Width, ThumbSize / img.Height)
img = img.Stretch(img.Width * scale, img.Height * scale)
img.Save(tempFile)
End If
newPicture["thumb"] = File.Load(tempFile)
' Add description and update
newPicture["description"] = "Image " & File.BaseName(ImagePath) & " added: " & Format(Now, "dddd, dd mmmm yyyy hh:nn:ss")
eTime = Timer
newPicture.Update()
Print "Done in "; Format(Timer - eTime, "#.###"); " s"
If Exist(tempFile) Then Kill tempFile
Catch
Error.Raise("Add database record error


Error:
" & DConv(Error.Text))
End

Gambas (3) op Raspberry Pi

Meldingen van Gambas op Raspberry Pi dateren al van Gambas2, maar de huidige combinatie van hardware en software noopt eerder tot Gambas3. Dat kan, zowel op de eigen Raspbian als op andere Linux besturingssystemen voor Pi…

Raspbian
Neem een terminal venster en doe:
sudo apt-get update
sudo apt-get install gambas3

Daarna zit Gambas3 in het menu onder programmeren!
(Menu/Programming/Gambas3)
Er zijn bovendien een aantal voorbeelden inbegrepen, terwijl in de huidige gambas3 versie eerder verwezen wordt naar een online repository van programma’s. Inderdaad, deze versie is “oud”:
About Gambas: 3.5.4
Terwijl bv op een huidige openSUSE 42.3 Gambas aan 3.9.2 is!

Update 06/2018

In de nieuwe Raspbian 9 is het ondertussen ook 3.9.1

OpenSUSE 42.3
Een ander voorbeeld, stel dat je opensuse 42.3 geïnstalleerd hebt op je raspberry pi; dan krijg je dus inderdaad Gambas 3.9.2!

RaspberryPi GPIO; Using Gambas