The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,839 other subscribers

Archive for the ‘Development’ Category

My toolkit – Roald’s blog

Posted by jpluimers on 2020/10/22

Always interesting to see what others put on their Windows development systems, for instance: [WayBack] My toolkit – Roald’s blog

Everytime I (re)install my development computer I need to think about all the tools I need and use on a regular basis. For that reason, and maybe to inspire others, here’s my list of essentia…

–jeroen

Posted in .NET, Delphi, Development, Software Development, Windows Development | Leave a Comment »

delphi – How to convert a null terminated string to string? – Stack Overflow

Posted by jpluimers on 2020/10/22

An old trick that I tend to forget: [WayBack] delphi – How to convert a null terminated string to string? – Stack Overflow:

You can assign a null-terminated PChar directly to a String:

function GetFileName(DiskName: TFileNameIO): string;
begin
 Result := PChar(@DiskName);
end;

It can work even on string literals and constants, where you can leave out the @, like in:

var
  S: string;
begin
  S := PChar(FastMM4Messages.LogFileExtension;

Probably time to update the unit I mention in ISO 8601 Date, Time and DateTime in Delphi (was: Simple example to show DateTime.Now in ISO 8601 format on ideone.com | Online C# Compiler & Debugging Tool).

–jeroen

Posted in Delphi, Development, Software Development | Leave a Comment »

LED Chaser with only 4017 – YouTube

Posted by jpluimers on 2020/10/21

Cool:

The triggering in this case is the result of a main power drop and recover. The battery is unable to keep the votage at 9V level at the very moment any led is turned on, the voltage is droped down. That is what makes pin 14 to get the clock pulse so the 4017 shifts to the next led. The moment the led is off and right before the next led is turned on the main power gets recovered. When the next led is on again, the main power drops down, and so on.

Schema but less explanation on: [WayBack] LED Chaser with only 4017 – RevealNew

–jeroen

Read the rest of this entry »

Posted in Development, Electronics Development, Hardware Development | 1 Comment »

Automated testing Windows applications using Katalon and WinAppDriver

Posted by jpluimers on 2020/10/21

[WayBack] Top 45 Best Automation Testing Tools Ultimate List • Test Automation Made Easy: Tools, Tips & Training Awesomeness A few notes, partially related to Enable your device for development – UWP app developer | Microsoft Docs.

One research project I had a while ago, was to see how it was possible to use a generic testing tool like Katalon Studio (that can test many platforms), for testing Windows applications.

Katalon uses a Selenium interface that normally is used for web applications through the [WayBack] WebDriver protocol (formerly [WayBack] JsonWireProtocol) that continues to be updated: [WayBack] draft upcoming WebDriver protocol, which is more generic than just web applications:

Read the rest of this entry »

Posted in .NET, Conference Topics, Conferences, Delphi, Development, Event, Software Development, Windows Development, WinForms, WPF | Leave a Comment »

RDP logon while other user is logged on: no way to automate automatic disconnect/logoff

Posted by jpluimers on 2020/10/21

One of the dreaded things when logging on using RDP is that if another user is logged on, you have to first indicate you want to indeed logon (if you don’t, the RDP connection will close after some 15-30 seconds), then wait for their approval time-out before you can logon.

As of writing there is no way around this.

Some links that helped me conclude this:

–jeroen

Posted in Development, Power User, Software Development, Windows, Windows 10, Windows 7, Windows 8, Windows 8.1, Windows Development | Leave a Comment »

Delphi: get timestamp as ISO8601 string for use in filenames

Posted by jpluimers on 2020/10/21

On Windows, filenames do not like some characters (including : and +), so this is a quick way to get a timestamp into ISO8601 format that is compatible with filenames.

TimeStamp := Now();
StartIso8601String := DateToISO8601(TimeStamp, False).Replace('-', '').Replace(':', '') // https://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators

It Depends on the [WayBackSystem.DateUtils unit which had the [WayBackDateToISO8601 function [Archive.isadded in Delphi XE6.

A poor man’s solution (that skips timezones altogether) is this one:

FormatDateTime('yyyymmdd''T''hhnnss''.''zzz', TimeStamp); // note quoted T and ., as otherwise they will be expanded.

–jeroen

Posted in Delphi, Development, Software Development | Leave a Comment »

Enable your device for development – UWP app developer | Microsoft Docs

Posted by jpluimers on 2020/10/20

From [WayBack] Enable your device for development – UWP app developer | Microsoft Docs:

Run these as administrator on the command prompt to:

Enable Sideloading

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowAllTrustedApps" /d "1"

Enable Developer Mode

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"

Needed for WinAppDriver to test applications from Selenium or Katalon

When you run WinAppDriver without it, you get this:

C:\Users>"C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe"
Failed to initialize: 0x80004005
Despite WinAppDriver running fine as non-administrative user, the reason was given that it requires administrative privileges: [WayBack] Why does WinAppDriver.exe require developer mode? · Issue #165 · Microsoft/WinAppDriver · GitHub.

SetCapabilities name parameters and values

Various searches for what to pass as parameters to SetCapabilities failed, but the list is right at the README, but without any mention SetCapabilities, so search engines miss it with for instance “SetCapabilities” “WinAppDriver” – Google Search that only returned these links:

Supported Capabilities

Below are the capabilities that can be used to create Windows Application Driver session.

Capabilities Descriptions Example
app Application identifier or executable full path Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge
appArguments Application launch arguments https://github.com/Microsoft/WinAppDriver
appTopLevelWindow Existing application top level window to attach to 0xB822E2
appWorkingDir Application working directory (Classic apps only) C:\Temp
platformName Target platform name Windows
platformVersion Target platform version 1.0

–jeroen

Posted in Conference Topics, Conferences, Development, Event, Katalon, Software Development, Testing | Leave a Comment »

Class methods in Record vs Class in Delphi 2010 – Stack Overflow

Posted by jpluimers on 2020/10/20

A still relevant part for [WayBack] Class methods in Record vs Class in Delphi 2010+ – Stack Overflow is the distinction between class methods on both:

  • on classes they can be either regular (no extra keyword), static or virtual.
  • on records they can only be static, as there is no inheritance on records
    • this also holds for any helpers that are not class helpers (and presumably if they are ever created: interface helpers)

While class methods inside classes can be used in the same way, they can in addition have another goal: they can be virtual. Called from a class variable this can lead to different implementations depending on the current content of that variable. This is not possible for records. As a consequence class methods in records are always static.

Thanks Uwe Raabe for this insight!

One odd thing on class methods in classes, is that when they need to be static when they are the read or write backing of a class property.

When a class method is static, any calls from it to virtual (or dynamic) methods will not be handled as such: there is no class VMT for it (as because they are static, they do not have a self parameter).

–jeroen

PS: I realised later that part of the above was already in E2398 Class methods in record types must be static (Delphi) – RAD Studio

Posted in Delphi, Development, Software Development | Leave a Comment »

Non-rectangle select in Windows command line – Super User

Posted by jpluimers on 2020/10/16

Just discovered this has been possible since Windows 10 by holding the shift key while dragging with the mouse. After like 20 years of waiting, why did nobody warn me (:

Is there any way I can disable the stupid rectangle selection mode thing in the Windows command line? I want to select line by line like normal. Currently it’s a giant pain when I need to copy things

So this is a thing from the past: [WayBack] Non-rectangle select in Windows command line – Super User

And this was already possible (but then you had to drag the full width): [WayBack] windows – Select text across lines in cmd.exe? – Super User

–jeroen

Posted in Development, Power User, Windows, Windows 10 | Leave a Comment »

Some postfix notes

Posted by jpluimers on 2020/10/15

Postfix has documentation on primary MX and secondary MX, but not on tertiary MX.

If the primary MX is down, you have a series of secondary MX and tertiary MX that configured the same way, MX DNS priority for primary, the series of secondary MX and tertiary MX have increasing numbers, and the primary MX goes down, then senders can get “too many hops” as secondary and tertiary MX are looping.

I had a hard time finding a good and easy solution as these queries do not return many meaningful results:

Here are some links that helped getting this solved:

  • [WayBack] Postfix Frequently Asked Questions: What does “Error: too many hops” mean?

    Short answer: this message means that mail is probably looping. If you see this after you turned on Postfix content filtering, then you have made a mistake that causes mail to be filtered repeatedly. This is cured by appropriate use of content_filter=header_checks=, and body_checks=.

    Long answer: the message has too many Received: message headers. A received header is added whenever Postfix (or any MTA) receives a message. A large number of Received: message headers is an indication that mail is looping around.

    Side comment: email uses the opposite of the technique that is used to avoid IP forwarding loops. With IP, the sender sets a TTL (time to live) field in the IP header. The field is decremented by each router. When the TTL reaches zero the packet is discarded and an ICMP error message is returned to the sender.

  • [WayBack] Error: too many hops (in reply to end of DATA command) · Issue #713 · mail-in-a-box/mailinabox · GitHub

    In case you or anyone else was/is wondering about the mydestination = localhost thing, the reason it has to be set to just localhost is because MIAB uses Postfix’s “virtual domain hosting” (http://www.postfix.org/VIRTUAL_README.html) support. Per the documentation for mydestination at http://www.postfix.org/postconf.5.html#mydestination:

    Do not specify the names of virtual domains – those domains are specified elsewhere. See VIRTUAL_README for more information.

    (in the context of MIAB every domain is a virtual domain).

In my case a series of these:

Received: from mwgp.xs4all.nl (mwgp.xs4all.nl [80.101.239.92])
    by fiber24315337242.heldenvannu.net (Postfix) with ESMTP id 26395200FE
    for <jeroen@pluimers.com>; Fri, 29 Jun 2018 11:01:02 +0200 (CEST)
Received: from fiber24315337242.heldenvannu.net (unknown [37.153.243.246])
    by mwgp.xs4all.nl (Postfix) with ESMTP id 077A5E937
    for <jeroen@pluimers.com>; Fri, 29 Jun 2018 11:01:02 +0200 (CEST)

Specifying the transport will likely help me solve this problem:

This all came down to editing /etc/postfix/transport adding lines for each relayed domain like this one:

example.org    smtp:[mx-a-record.example.org]

Lines like it direct to use the smtp transport and use a specific host (normally, the relay transport is being used).

After this:

# postmap /etc/postfix/transport
# rcpostfix reload

I choose not to configure [WayBack] Postfix Configuration Parameters: relay_recipient_maps, but might if I had an automated way of replicating lists of valid (and invalid) users.

Another option was confirmed at [WayBack] Software-update: Postfix 3.4.0 / 3.3.3 / 3.2.8 / 3.1.11 / 3.0.15 – Computer – Downloads – Tweakers by [WayBack] menocchio. Thanks!

Dat is volgens mij eenvoudig op te lossen met relay_transport of transport_maps. Zie ook: Postfix transport table format.

Daarmee dwing je de secondary servers de mail altijd af te willen leveren bij de primary server (en dus niet bij een andere secondary). En als de primary niet online is, dan wacht ie netjes tot dat wel het geval is :-)

Bijvoorbeeld:
relay_transport = smtp:[primarymx.domain.tld]

Likely relevant: [WayBack] The Book of Postfix

Maybe relevant in the future:

Found on my hunt for the above:

Try not to make typo’s: [WayBack] postfix appears not finding MX records or host names from DNS

Interesting thought, but not sure how smart SPAM bots are now: [Archive.is] Spam relaying through secondary MX… – Google Groups

To archive this:

  1. Rename from
  2. To
  3. Then save in Archive.is

–jeroen

Posted in *nix, Communications Development, Development, DevOps, DNS, etckeeper, Infrastructure, Internet, Internet protocol suite, Linux, Power User, SMTP | Leave a Comment »