For my link archive:
- [WayBack] GitHub – ulid/spec: The canonical spec for ulid
- [WayBack] GitHub – rs/xid: xid is a globally unique id generator thought for the web
–jeroen
Posted by jpluimers on 2020/12/15
For my link archive:
–jeroen
Posted in Database Development, Development, PostgreSQL, Software Development | Leave a Comment »
Posted by jpluimers on 2020/12/15
Basically the below thread goes like this: [WayBack] GExperts / Bugs / #92 Grep cannot handle UTF-16 and UTF-32 pas files
AAA, but not when running your tool under BBB; these files fail: xxx.txt and yyy.txtAAA and which version of our tool did you run under BBBAAA , but succeeds under BBBPart of the [WayBack] Short, Self Contained, Correct Example are indeed in it, but without more details it is hard to reproduce.
So without the reporter providing those details, nobody, especially not on open source projects, is going to fix it just on that bug report.
Via: [WayBack] It’s time for a gift to all Delphi developers, a new Release of GExperts. Happy Holidays! (But do spend some time with your family rather than testing G… – Thomas Mueller (dummzeuch) – Google+
Which highlights another conceptual problem from the same bug reporter: expecting a new version to have a regression of all open bugs against the new version.
That’s not how the world works, if it has ever worked that way. If your issue is not mentioned in any release notes, then assume nothing happened. If you want to bump it up, then provide more details.
–jeroen
Posted in Conference Topics, Conferences, Development, Event, How to report bugs, Issue/Bug tracking, Software Development | Leave a Comment »
Posted by jpluimers on 2020/12/15
Every now and then I see code, where a class descending from TComponent implements some interfaces, only interface references are used to the instances, and the expected behaviour is that the instances will free themselves when all the references went out of scope.
Bummer: TComponent by default is not reference counted.
It is when you assign VCLComObject an IVCLComObject which is hell to implement (Delphi provides two of them: TVCLAutoObject and TActiveFormControl. They sound heavey, and are).
Do not go that way. If you need some form of ownership in a class implementing an interface, then descend the class from TInterfacedObject, and add a field of TComponent that is the owner of things that need to be freed later on. In the destructor, free that field.
Something like this:
unit InterfacedObjectWithRootUnit; interface type TInterfacedObjectWithRoot = class(TInterfacedObject) strict private FRoot: TComponent; function GetRoot: TComponent; strict protected property Root: TComponent read GetRoot; public destructor Destroy; override; end; implementation destructor TInterfacedObjectWithRoot.Destroy; begin if Assigned(FRoot) then begin FRoot.Free(); FRoot := nil; end; inherited Destroy(); end; function TInterfacedObjectWithRoot.GetRoot: TComponent; begin if FRoot = nil then FRoot := TComponent.Create(nil); Result := FRoot; end; end.
–jeroen
Posted in Conference Topics, Conferences, Delphi, Development, Event, Software Development | Leave a Comment »
Posted by jpluimers on 2020/12/11
This should be on the reading list of every corporate manager: [WayBack] Why We Should Change The Rhythm Of Business | Corporate Rebels:
The problem arises when people bring their accounting background and mindset with them into business management. Decimals no longer works very well when the focus is on a future with lots of dynamics and uncertainty.
…
The solution is simple: (1) Targets must have natural deadlines; (2) Forecasting must be dynamic or rolling; (3) Resource allocation must be dynamic; and (4) Performance evaluation must take place when work is completed.
Or as Marjan Venema quoted:
“Yes, something is definitely wrong, but maybe more in the finance manager’s head than with the fisherman’s work rhythm!”
–jeroen
via: [WayBack] “Yes, something is definitely wrong, but maybe more in the finance manager’s head than with the fisherman’s work rhythm!” – Marjan Venema – Google+
Posted in Development, LifeHacker, Power User, Software Development | Leave a Comment »
Posted by jpluimers on 2020/12/10
From [WayBack] Completely disable Windows 10 telemetry collection – twm’s blog:
So I don’t forget: According to an article in c’t magazine, disabling the “DiagTrack” service (“Connected User Experience and Telemetry”) will completely disable user tracking in Windows 10. They also say that they did not see any negative effects.
Source: [WayBack] Telefonierverbot in c’t 01/2019 page 172 (in German)
I saw at least one system where the service is not shown when you run Services.msc: it did not list DiagTrack, nor Connected User Experience and Telemetry. How awful is that!
The service can also be installed non older Windows versions: [WayBack] Just found DiagTrack running in Services – Tips and Tricks
Sometimes, it gets re-enabled. I think this happens during major Windows updates.
Run all commands from the console the below bold commands. The non-bold text was the output on my system. If instead of the cmd.exe console, you run a PowerShell console, then remove the bits PowerShell -Command " and " at the start and end of each command.
The first command does not require an Administrative (UAC Elevated) command prompt; the last one does.
However, the first command, needs the | Select-Object * bit as otherwise most of the fields will not be displayed, excluding for instance StartType.
powershell -Command "Get-Service -Name DiagTrack | Select-Object *"
Name : DiagTrack
RequiredServices : {RpcSs}
CanPauseAndContinue : False
CanShutdown : True
CanStop : True
DisplayName : Connected User Experiences and Telemetry
DependentServices : {}
MachineName : .
ServiceName : DiagTrack
ServicesDependedOn : {RpcSs}
ServiceHandle :
Status : Running
ServiceType : Win32OwnProcess
StartType : Automatic
Site :
Container :
On an Administrative command-prompt:
powershell -Command "Set-Service -Name DiagTrack -StartUpType Disabled" powershell -Command "Get-Service -Name DiagTrack | Stop-Service"
Two notes:
Posted in Batch-Files, CommandLine, Development, Power User, PowerShell, PowerShell, Scripting, Software Development, Windows | Leave a Comment »
Posted by jpluimers on 2020/12/10
On my list to play around with:
[WayBack] Stofradar – RevSpace.
It gets data from [WayBack] luftdaten.info – Feinstaub selber messen – Open Data und Citizen Science aus Stuttgart , then visualises it.
Via: [WayBack] Helga van Leur on Twitter: “Deze animatie van de uitstoot fijnstof tijdens jaarwisseling is ook treffend… Opvallend is hotspot Veghel e.o. en op Veluwe. Bron: …”
—jeroen
Posted in Development, Software Development, Web Development | Leave a Comment »
Posted by jpluimers on 2020/12/10
I really dislike using regular expressions, mainly because every time I bump into code using them either:
For more background on when NOT to use regular expressions, remember they describe a regular grammar, and can only me implemented by a finite state machine (a state machine that can be exactly one state out of a set of finite states).
As soon as you need to parse something that needs multiple states at once, or the number of states becomes infinite,
Some background reading:
Posted in Delphi, Development, RegEx, Software Development | Leave a Comment »
Posted by jpluimers on 2020/12/09
A great reference on how not to code still is
How To Write Unmaintainable Code
Ensure a job for life ;-)
Roedy Green Canadian Mind Products
I am still amazed when browsing through code, how many people use one or more of the anti-patterns in it.
One example I came across was this piece of Delphi RTL code:
class function TMarshalUnmarshalBase.ComposeKey(clazz: TClass; Field: string): string;
begin
if clazz <> nil then
Result := clazz.UnitName + SEP_DOT + clazz.ClassName + SEP_DOT + Field
else
Result := '';
end;
So I did a quick search at in the Delphi RTL for clazz, then found these occurences, indicating not only the authors of them have been under a rock, but also the code reviewers:
- 98 in data\dbx\Data.DBXJSONReflect.pas
- 7 in data\dbx\Data.DBXTransport.pas
- 97 in data\rest\REST.JsonReflect.pas
- 3 in DUnit\src\TestFramework.pas
- 22 in indy\abstraction\IPPeerAPI.pas
I have seen similar things in many environments, even run-time libraries of others, though this is one of the worst examples and falls under the anti-pattern:
Thesaurus Surrogatisation
To break the boredom, use a thesaurus to look up as much alternate vocabulary as possible to refer to the same action, e.g. display, show, present. Vaguely hint there is some subtle difference, where none exists. However, if there are two similar functions that have a crucial difference, always use the same word in describing both functions (e.g. print to mean “write to a file”, “put ink on paper” and “display on the screen”). Under no circumstances, succumb to demands to write a glossary with the special purpose project vocabulary unambiguously defined. Doing so would be an unprofessional breach of the structured design principle of information hiding.
There is a great other anti-pattern in the document too:
Delphi/Pascal Only
: Don’t use functions and procedures. Use the label/goto statements then jump around a lot inside your code using this. It’ll drive ’em mad trying to trace through this. Another idea, is just to use this for the hang of it and scramble your code up jumping to and fro in some haphazard fashion.
Enjoy reading the anti-pattern descriptions, which are now maintained at [WayBack] GitHub – Droogans/unmaintainable-code: A more maintainable, easier to share version of the infamous http://mindprod.com/jgloss/unmain.html, as it was originally a multi-page hard to maintain set of small articles:
A lot of comments were posted because of it: [WayBack] Responses to Roedy’s Unmaintainable Code Essay
Via:
It is hard to overestimate the importance of choosing good names for source code elements in software development. Much has been written on this topic, and it is often a source of great debate. […]
–jeroen
Posted in .NET, Delphi, Development, Software Development | 1 Comment »
Posted by jpluimers on 2020/12/09
In my list of things to play with: [WayBack] GitHub – DevExpress/testcafe: A Node.js tool to automate end-to-end web testing.:
A Node.js tool to automate end-to-end web testing.
Write tests in JS or TypeScript, run them and view results.https://devexpress.github.io/testcafe
- Works on all popular environments: TestCafe runs on Windows, MacOS, and Linux. It supports desktop, mobile, remote and cloud browsers (UI or headless).
- 1 minute to set up: You do not need WebDriver or any other testing software. Install TestCafe with one command, and you are ready to test:
npm install -g testcafe- Free and open source: TestCafe is free to use under the MIT license. Plugins provide custom reports, integration with other tools, launching tests from IDE, etc. You can use the plugins made by the GitHub community or make your own.
Related:
Use TestCafe to write tests in JS or TypeScript, run them and view results. TestCafe runs on Windows, MacOS, and Linux and takes 1 minute to set up.
100% web-based functional testing framework with integrated visual test recorder, remote device testing, and natural JavaScript API
Via:
Screen materials below the fold.
–jeroen
Posted in Development, JavaScript/ECMAScript, LifeHacker, Power User, Scripting, Software Development, Testing, Web Development | Leave a Comment »
Posted by jpluimers on 2020/12/09
In the comments of [WayBack] Delphi and JSON Is there an overlay (eg in the form of a helper) for the JSON classes built into Delphi (System.JSON), which offered an interface simil… – Jacek Laskowski – Google+
SuperObject has a very different implementation for JSON support than the Delphi RTL System.JSON unit as explained by Dalija Prasnikar:
If you are thinking about replacing existing code that uses SuperObject with Delphi build in JSON library, you have another problem on desktop – non-ARC compiler. SuperObject classes are interface based (reference counted) and Delphi JSON is class based – non ref-counted.
These methods are not in the Delphi RTL because of the difference:
How to read a property value of an object ?
val := obj.AsObject.S['foo']; // get a string val := obj.AsObject.I['foo']; // get an Int64 val := obj.AsObject.B['foo']; // get a Boolean val := obj.AsObject.D['foo']; // get a Double val := obj.AsObject.O['foo']; // get an Object (default) val := obj.AsObject.M['foo']; // get a Method val := obj.AsObject.N['foo']; // get a null objectHow to read a value from an array ?
// the advanced way val := obj.AsArray.S[0]; // get a string val := obj.AsArray.I[0]; // get an Int64 val := obj.AsArray.B[0]; // get a Boolean val := obj.AsArray.D[0]; // get a Double val := obj.AsArray.O[0]; // get an Object (default) val := obj.AsArray.M[0]; // get a Method val := obj.AsArray.N[0]; // get a null object
–jeroen
Posted in Delphi, Development, Software Development | Leave a Comment »