Archive for 2021
Posted by jpluimers on 2021/08/05
There is a known saying phrased using cardinal, adverbial or ordinal numbers, and several naming for the first:
- One is change, two is coincidence, three is a pattern
- Once Is Chance, Twice is Coincidence, Third Time Is A Pattern
- One is an anomaly, two is a coincidence, three is a pattern
- First time is an incident, second a coincidence, third a pattern
Sometimes the second can lead to a pattern.
Read the rest of this entry »
Posted in Algorithms, Development, LifeHacker, Power User, Software Development | Leave a Comment »
Posted by jpluimers on 2021/08/05
Steps:
- Add the conditional define
FASTMM to your project
- Ensure you have
$(BDS)\source\DUnit\src in your search path in your project (as otherwise Delphi will pick the pre-built TestFramework.dcu file which was compiled without the FASTMM conditional define)
- Inside a test method, or the
SetUp method of a class, set FailsOnMemoryLeak to True
- If the
SetUp method of the class allocates memory, ensure the TearDown de-allocates it. Otherwise you will have leaks:
- DUnit will check memory differences from the start of the
SetUp until the end of the TearDown
- DUnit will not take into account what is freed in the
destructor or by automatic finalization after the destructor!
- Re-build your application (otherwise the DUnit
TestFramework unit will not take into account the FASTMM conditional define)
Depending in your test framework, FailsOnMemoryLeak might be by default be False or True:
- TestInsight by default has
FailsIfMemoryLeaked set to True for the root test suite (which is then applied to FailsOnMemoryLeak of any test method).
procedure RunRegisteredTests(const baseUrl: string);
var
suite: ITestSuite;
result: TTestResult;
listener: ITestListener;
begin
suite := RegisteredTests;
if not Assigned(suite) then Exit;
result := TTestResult.Create;
result.FailsIfNoChecksExecuted := True;
result.FailsIfMemoryLeaked := True;
listener := TTestInsightListener.Create(baseUrl, suite.CountEnabledTestCases);
result.AddListener(listener);
try
suite.Run(result);
finally
result.Free;
end;
end;
- Console DUnit runners (Text, or XML) by default have
FailsIfMemoryLeaked set to False.
- GUI DUnit runner has
FailsIfMemoryLeaked depending on the options:

DUnit source differences
Note that recent Delphi versions (I think XE and up) ship with almost the same sources as https://sourceforge.net/code-snapshots/svn/d/du/dunit/svn/dunit-svn-r44-trunk.zip, with these Embarcadero changes:
- all SVN timestamps are based on time zone -0400 instead of +0000:
$Date: 2008-04-24 07:59:47 -0400 (Thu, 24 Apr 2008) $
$Date: 2008-04-24 11:59:47 +0000 (Thu, 24 Apr 2008) $
- Embarcadero removed:
- all comment lines having
TODO in them
- all files of types
.dof, .cfg, and.wmz
- the files
NGUITestRunner.nfm and NGUITestRunner.pas
- the file
/etc/usermap
- the directory trees
/private and /projects
- Embarcadero changed
- file
/src/versioninfo.res from 9.3.0 to 9.2.1 (which is odd, as all files are from 9.3.0)
- unit
TextTestRunner to support:
- CLR (used last in Delphi 2007)
FailureCount
ErrorCount
IndentLevel
PrefixChars
- conditional defines
ADDITIONAL_INFO, BASIC_INFO
- output of
UnitName
- unit
TestExtensions to support:
- CLR (used last in Delphi 2007)
- conditional defines
ANDROID_FIXME and LINUX
- compiler directive
LEGACYIFEND
GUITestRunner.dfm to have ResultsView: TListView property Height value 45 instead of 39
- the below methods to use
ReturnAddress in stead of CallerAddr:
TGUITestCase.FindControl
TGUITestCase.Click
TGUITestCase.EnterKeyInto
TGUITestCase.EnterTextInto
TGUITestCase.Show
TGUITestCase.CheckTabTo overloads
TGUITestCase.CheckFocused overloads
TGUITestCase.CheckEnabled overloads
TGUITestCase.SetFocus overloads
TGUITestCase.CheckVisible overloads
- method
TGUITestRunner.RunTest
- from
class procedure TGUITestRunner.RunTest(test: ITest);
begin
with TGUITestRunner.Create(nil) do
begin
try
suite := test;
ShowModal;
finally
Free;
end;
end;
end;
- to
class procedure TGUITestRunner.RunTest(test: ITest);
var
GUI :TGUITestRunner;
begin
Application.CreateForm(TGUITestRunner, GUI);
with GUI do
begin
try
suite := test;
ShowModal;
finally
Free;
end;
end;
end;
- unit
GUITestRunner:
- from
procedure RunTest(test: ITest);
begin
with TGUITestRunner.Create(nil) do
begin
try
Suite := test;
ShowModal;
finally
Free;
end;
end;
end;
- to
procedure RunTest(test: ITest);
var
GUI :TGUITestRunner;
begin
Application.CreateForm(TGUITestRunner, GUI);
with GUI do
begin
try
Suite := test;
if Suite <> nil then
ShowModal;
finally
Free;
end;
end;
end;
- method
TGUITestRunner.SetUp not to set SubItems[0] := ''; when there is no test suite.
- method
TGUITestRunner.FormCreate to use FormatSettings.TimeSeparator instead of TimeSeparator.
- unit TestFramework to support:
HPPEMIT
LEGACYIFEND
CLR and _USE_SYSDEBUG_
AUTOREFCOUNT
NEXTGEN
ANDROID
- the
RunCountAttribute and RunCount support
- a
CheckEquals overload for uint64
- a
CheckNotEquals overload for TCharArray
CheckCircularRef
CompareFloatRelative
NotSameErrorMessage with WideString arguments instead of string
- a
TestDataDir function
ReturnAddress for older compilers
- a new unit
DUnitTestRunner
- a new
Makefile file
- a new UnitTests.log file
–jeroen
Posted in Conference Topics, Conferences, Delphi, Development, DUnit, Event, FastMM, Software Development, TestInsight | 1 Comment »
Posted by jpluimers on 2021/08/04
Not all letters have superscript or subscript counterparts. The counterparts are from different ranges, so might not look nice when next to each other.
I think 20th using Unicode lowercase superscript looks ugly 20ᵗʰ. With uppercase superscript it is somewhat OK: 20ᵀᴴ.
The list is from [WayBack] javascript – How to find the unicode of the subscript alphabet? – Stack Overflow:
Take a look at the wikipedia article Unicode subscripts and superscripts. It looks like these are spread out across different ranges, and not all characters are available.
Consolidated for cut-and-pasting purposes, the Unicode standard defines complete sub- and super-scripts for numbers and common mathematical symbols ( ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎ ), a full superscript Latin lowercase alphabet except q ( ᵃ ᵇ ᶜ ᵈ ᵉ ᶠ ᵍ ʰ ⁱ ʲ ᵏ ˡ ᵐ ⁿ ᵒ ᵖ ʳ ˢ ᵗ ᵘ ᵛ ʷ ˣ ʸ ᶻ ), a limited uppercase Latin alphabet ( ᴬ ᴮ ᴰ ᴱ ᴳ ᴴ ᴵ ᴶ ᴷ ᴸ ᴹ ᴺ ᴼ ᴾ ᴿ ᵀ ᵁ ⱽ ᵂ ), a few subscripted lowercase letters ( ₐ ₑ ₕ ᵢ ⱼ ₖ ₗ ₘ ₙ ₒ ₚ ᵣ ₛ ₜ ᵤ ᵥ ₓ ), and some Greek letters ( ᵅ ᵝ ᵞ ᵟ ᵋ ᶿ ᶥ ᶲ ᵠ ᵡ ᵦ ᵧ ᵨ ᵩ ᵪ ). Note that since these glyphs come from different ranges, they may not be of the same size and position, depending on the typeface.
After a nice chat with my nephew EWD, I did some research and found the above via
–jeroen
Posted in Development, Encoding, internatiolanization (i18n) and localization (l10), Power User, Software Development, Unicode | Leave a Comment »
Posted by jpluimers on 2021/08/04
If this is still open, please vote for it: [WayBack] Naming of naming styles should reflect their casing · Issue #35243 · dotnet/roslyn · GitHub
Having the drop down of naming styles reflect the actual output in one way or the other will make it way easier to select the correct one.
Besides that, a few new naming styles are suggested in this issue, like snake_case which is great for translating APIs that are already in that form.
Via:
–jeroen
Posted in .NET, C#, C# 6 (Roslyn), C# 7, C# 8, Development, Software Development | Leave a Comment »
Posted by jpluimers on 2021/08/04
You’d think the math does not add up:

But it does: both “Success” and “Warnings” are counted as “passed”.

TL;DR: ensure the yellow “Warning” triangle is enabled
–jeroen
Posted in Delphi, Development, Software Development, TestInsight | Leave a Comment »
Posted by jpluimers on 2021/08/03
When configuring a web-based kiosk for someone with Alzheimer’s disease, I wanted to start Chrome in full-screen kiosk mode.
Chrome full-screen kiosk mode
The secret for full-screen kiosk mode is to pass the -start-fullscreen command-line option. Thanks [WayBack] User ginomay89 – Super User for answering that in [WayBack] tablet – How to set Google Chrome to automatically open up and in full screen – Super User.
Finding chrome
At first I thought about differentiating on the chrome.exe location that you can find in the registry. This turned out to be depending on how you install Chrome:
- locally for the current user by a non-local-administrator user (by default the location is under
%LocalAppData%)
- globally for all users by a local-administratator user (by default is under
%ProgramFiles(x86)%)
Oddly, there is no way (not even by denying UAC elevation!) for a local administrator to install Chrome for only the current user.
This is odd, as when non-local-administrator denies UAC, the installation is locally to the user.
Then I remembered there are two ways for Windows to find an application
- On the
PATH
- Via the start menu (which includes anything on the
PATH)
The cool thing is that the start command does the latter, so I came up with this batch file that starts chrome with the -start-fullscreen parameter that will initiate kiosk mode with the default chrome settings:
start "Chrome Kiosk Mode" chrome --start-fullscreen
In case I want to compare the registry settings
Basically sorting out the registry settings would mean parsing the references to chrome.exe (often with extra parameters) in the below registry key/value-name pairs.
One day I might need to do this for different reasons, but currently the start trick suffices.
Read the rest of this entry »
Posted in Batch-Files, Development, Power User, Scripting, Software Development, Windows | Leave a Comment »
Posted by jpluimers on 2021/08/03
There are many reasons to disable DNS over HTTPS (DoH), of which enough are discussed in the links below.
Disabling DoH always talks about setting TTR (the abbreviation Mozilla uses for it) to 5 (like [WayBack] Thread by @isotopp: “Firefox is about to break DNS by enabling DNS-over-HTTP by default […]”), but hardly ever explains the meaning of 5, or any other potential values.
After some searching, I found [WayBack] Firefox disable trr | Knowledge Base:
0: Off by default
1: Firefox chooses faster
2: TRR default w/DNS fallback
3: TRR only mode
5: Disabled
I imagine the setting we’re all looking for is: user_pref(“network.trr.mode”, 5); (emphasis mine)
It pointed me to [WayBack] Trusted Recursive Resolver – MozillaWiki:
Read the rest of this entry »
Posted in Cloud, Cloudflare, Communications Development, Development, DNS, Firefox, Infrastructure, Internet protocol suite, Power User, TCP, Web Browsers | Leave a Comment »
Posted by jpluimers on 2021/08/03
The most current Lex and Yacc for Delphi is [WayBack] GitHub – RomanYankovsky/ndyacclex: Parser generator toolset for Delphi (Yacc & Lex).
It came up during a funny Twitter thread, where one of the Delphi team members asked for it, despite – after decades of asking – there still being no official Delphi grammar available from the Delphi team, nor Google Search skills [WayBack].
Basically a parser generator is only as useful as the grammar you have for it.
There is no open source grammar for Delphi yet, so the best you can start with is from the same author: [WayBack] GitHub – RomanYankovsky/DelphiAST: Abstract syntax tree builder for Delphi
With DelphiAST you can take real Delphi code and get an abstract syntax tree. One unit at time and without a symbol table though.
Relevant tweets:
–jeroen
Posted in Delphi, Development, Software Development, Undocumented Delphi | 1 Comment »
Posted by jpluimers on 2021/08/02
[WayBack] Manual:Reset – MikroTik Wiki:
unplug the device from power
2) press and hold the button right after applying power
Note: hold the button for 5 seconds (USER LED will start flashing)
3) release the button to clear configuration.
Note: If you wait until LED stops flashing, and only then release the button – this will instead launch Netinstall mode, to reinstall RouterOS.
Initial configuration
(see also [WayBack] Manual:First time startup – MikroTik Wiki)
- Connect your machine to port 1 on the Mikrotik hEX PoE RB960PGS (after the reset, this port will have IPv4 address
192.168.88.2 with netmask 255.255.255.0)
- Ensure your local machine to IPv4 address
192.168.88.2 with netmask 255.255.255.0 (otherwise WinBox might not see the router, not even in discovery mode):

- Have WinBox auto discover it:

- Connect with user
admin and no password:

- Configure your Mikrotik hEX PoE RB960PGS as router or switch
For switch, I prefer a setting like this (the bold portions are different from the default configuration):
/interface bridge
add admin-mac=64:D1:54:13:98:E6 auto-mac=no comment=defconf name=bridgeLocal
/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
/ip hotspot profile
set [ find default=yes ] html-directory=flash/hotspot
/interface bridge port
add bridge=bridgeLocal comment=defconf interface=ether1
add bridge=bridgeLocal comment=defconf interface=ether2
add bridge=bridgeLocal comment=defconf interface=ether3
add bridge=bridgeLocal comment=defconf interface=ether4
add bridge=bridgeLocal comment=defconf interface=ether5
add bridge=bridgeLocal comment=defconf interface=sfp1
/ip dhcp-client
add comment=defconf dhcp-options=hostname,clientid disabled=no interface=bridgeLocal
/ip dns static
add address=192.168.88.1 name=router.lan
/system clock
set time-zone-name=Europe/Amsterdam
/system identity
set name="RB960PGS <<location-name>>"
/system ntp client
set enabled=yes server-dns-names=0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org,3.pool.ntp.org
–jeroen
Posted in Internet, MikroTik, Power User, routers | Leave a Comment »
Posted by jpluimers on 2021/08/02
[WayBack] Geurthee nr. 5 theebuiltjes – De Pelikaan Zutphen – Koffie/theespecialist sinds 1816
Een huisgemelangeerde zwarte thee met een gerookt tintje. Perfecte keuze als u van Earl Grey houdt en opzoek bent naar een extra smaaksensatie
Onze Geurthee nr. 5 is een gemelangeerde zwarte thee. Naast dat wij onze Geurthee nr. 2 hiervoor gebruiken, zitten er nog meer theesoorten in verwerkt zoals Lapsang Souchong. Lapsang Souchong is een zwarte theesoort uit China en is erg sterk van smaak. Deze thee wordt in bamboemanden gedroogd boven brandend naald- of cypressenhout. Dit zorgt ervoor dat er zich een sterke rooksmaak ontwikkeld. Ook is de Geurthee nr. 5 sterk gearomatiseerd met Bergamot-olie. Bergamot is een citrusvrucht die wordt gebruikt als smaakmaker in Earl Grey. Door al deze ingrediënten met elkaar te melangeren, ontstaat er een heerlijke Earl Grey met een gerookt tintje
____
ZETADVIES (1 kop): 1 zakje, water opschenken (95°C -100°C), 2-3 minuten laten trekken. Één zakje kan zelfs voor een hele pot gebruikt worden!
____
15 piramide theebuiltjes
Via [WayBack] Frederike op Twitter: “Dan vind jij Geurthee 5 van @pelikaankoffie vast ook lekker.… “
–jeroen
Read the rest of this entry »
Posted in LifeHacker, Power User | Leave a Comment »