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,854 other subscribers

Archive for 2020

delphi – always pass SEM_FAILCRITICALERRORS to SafeLoadLibrary

Posted by jpluimers on 2020/05/19

The below is based on [WayBackdelphi – Is there any way to catch the error if loading a dll cannot find a dependency? – Stack Overflow which I got via:

The problem is that the [WayBack] SysUtils.SafeLoadLibrary Function (present since at least Delphi 2007, and a wrapper around the [WayBack] LoadLibrary function (Windows)) does many good things – maybe even too many – so you need to take all of them into account:

function SafeLoadLibrary(const FileName: string; ErrorMode: UINT = SEM_NOOPENFILEERRORBOX): HMODULE;
  1. SafeLoadLibrary loads a Windows DLL or Linux shared object file, as specified by Filename.
  2. SafeLoadLibrary preserves the current FPU control word, preventing library initialization code from permanently overwriting precision and exception masks.
  3. Note:
    • On Windows, SafeLoadLibrary temporarily sets the system error mode to ErrorMode. The default, SEM_NOOPENFILEERRORBOX, suppresses error dialogs. The previous error mode is restored before SafeLoadLibrary exits. For a list of error modes, refer to [Wayback1/Wayback2] SetErrorMode in the Microsoft documentation.
    • Note: On Linux, the Dummy argument is ignored.

Most important tips

Do not ever pass 0 (the number zero) as ErrorMode; I’ve seen lots of applications just passing zero for parameters they are not sure about, but in this case it is the worst solution as it will show all errors as a popup.

Do not forget a parameter either: the default value SEM_NOOPENFILEERRORBOX will only suppress a message box when it fails to find a file. But it will fail to enable SEM_FAILCRITICALERRORS which is what you really want.

Loading DLLs from resources

LoadLibrary and SafeLoadLibrary load the DLL from a file. But what if you want to load it from a resource?

Then this post from Thomas Mueller applies: he adopted the SafeLoadLibrary logic to load from a resource:

Other thoughts to keep in mind

The way Delphi sets the FPU control word is not thread safe: QualityCentral Report # 106943: Set8087CW/SetMXCSR are not thread-safe (you could work around in your implementation by using thread safe versions like mentioned in [WayBack] FastMM / Discussion / Open Discussion:Call to GetStackTrace changes 8087CW).

Calling SetErrorMode sets a global application wide setting (by default including all threads) of error code, so it is better to either:

  • decide for your whole application up front which error mode to use, save it and use the same value everywhere:

Because the error mode is set for the entire process, you must ensure that multi-threaded applications do not set different error-mode flags. Doing so can lead to inconsistent error handling.

Second, SEM_FAILCRITICALERRORS prevents an error to pop up when dependencies of the loaded file are not available. You might want to combine (bitwise or) it with other values like SEM_NOGPFAULTERRORBOX.

ErrorMode values

There are many more modes you can pass to the [WayBack] SetErrorMode function (Windows):

  • Value Meaning
    0
    Use the system default, which is to display all error dialog boxes.
     

    SEM_FAILCRITICALERRORS
    0x0001
    The system does not display the critical-error-handler message box. Instead, the system sends the error to the calling process.

    Best practice is that all applications call the process-wide SetErrorMode function with a parameter of SEM_FAILCRITICALERRORS at startup. This is to prevent error mode dialogs from hanging the application.

     

    SEM_NOALIGNMENTFAULTEXCEPT
    0x0004
    The system automatically fixes memory alignment faults and makes them invisible to the application. It does this for the calling process and any descendant processes. This feature is only supported by certain processor architectures. For more information, see the Remarks section.

    After this value is set for a process, subsequent attempts to clear the value are ignored.

     

    SEM_NOGPFAULTERRORBOX
    0x0002
    The system does not display the Windows Error Reporting dialog.
     

    SEM_NOOPENFILEERRORBOX
    0x8000
    The OpenFile function does not display a message box when it fails to find a file. Instead, the error is returned to the caller. This error mode overrides the OF_PROMPT flag.

–jeroen

all via:

Related:

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

hexagonal architecture – Google Search

Posted by jpluimers on 2020/05/18

On my research list: read more about hexagonal architecture – Google Search.

Like:

Related: [WayBack] Learned today: In the praxis most domains are way more than sufficiently complex… – Jeroen Wiert Pluimers – Google+

I think I like a round diagrams better than hexagonal ones, because it gives more clarity to me.

Also on my list:

–jeroen

Posted in Development, Software Development, Systems Architecture | Leave a Comment »

Free Linux cloud shell for Gmail users – shell in the browser that works in all locations I’ve been so far

Posted by jpluimers on 2020/05/18

This is still so cool: [WayBack] Free Linux cloud shell for Gmail users … – Adrian Marius Popa – Google+:

Free Linux cloud shell for Gmail users

https://news.ycombinator.com/item?id=16247577

comments are more interesting

“If you want a free Linux box with a Public IP and SSH, I’d recommend spinning up an f1-micro VM. It’s part of the permanent free tier”

https://news.ycombinator.com/item?id=16248668

Even cooler is that you can use it both from a web browser and from your own console, more on that below.

Cloud Shell from the web

The above links:

Read the rest of this entry »

Posted in Google, GoogleCloudShell, Power User | Leave a Comment »

On my list of things to try: GitHub – arthepsy/ssh-audit; SSH server auditing

Posted by jpluimers on 2020/05/18

This looks like an ssh equivalent to testssl.sh: [WayBack] GitHub – arthepsy/ssh-audit: SSH server auditing (banner, key exchange, encryption, mac, compression, compatibility, security, etc).

It is on my list of things to try, so I’ve put a watch on the repository changes.

–jeroen

Read the rest of this entry »

Posted in Communications Development, Development, Encryption, Internet protocol suite, Power User, Security, SSH, TCP | Leave a Comment »

6502.org • Search: mos6502 G+ posts

Posted by jpluimers on 2020/05/15

With the demise of G+, I am glad that most of the [WayBack] mos6502 posts were archived at [WayBack] 6502.org • Search: mos6502 G+ posts

Via [WayBack] This week, OUP/M, a 6502 CP/M-ish operating system from 1983, in the process of recovery from Jian-Xiong Shao’s Masters Thesis into Github. And a reques… – mos6502 – Google+

[WayBack] mos6502 – Google+

6502 posts – new projects and interesting old projects from the archives

–jeroen

Posted in 6502, History | Leave a Comment »

Show openSUSE:Factory / bootchart – openSUSE Build Service

Posted by jpluimers on 2020/05/15

On my research list: [WayBack] Show openSUSE:Factory / bootchart – openSUSE Build Service.

I bumped here when researching on how to list services: [WayBack] init.d – Command to list services that start on startup? – Ask Ubuntu

It seems few people use it on opensuse, but it is interesting for analysing the boot process nonetheless.

I already found out this is in fact bootchart2: [WayBack] GitHub – xrmx/bootchart: merge of bootchart-collector and pybootchartgui

Some links that should help me further are these:

From the last link, this translation:

A. systemd-analyze

You will see the total computer startup time after:

systemd-analyze

A complete list of how much each individual service has taken is when you complete:

systemd-analyze blame

You will see the most problematic processes after you complete:

systemd-analyze critical-chain

You can create a picture:

systemd-analyze plot> /tmp/systemd-analyze.svg

Suitable for: openSUSE 11.4, 12.x, 13.1, Leap 42.x

Not suitable: openSUSE 13.2

B. bootchart

First, install the bootchart package (bootchart 2 version of the program). If you are using openSUSE Leap 42.x or later, enable bootchart2 (and optional bootchart2-done) service:

systemctl enable bootchart2

systemctl enable bootchart2-done

If you are using openSUSE version 13.1 or earlier, go to YaST → (System) → Startup and enter kernel startup parameters:

initcall_debug printk.time = y quiet init = / sbin / bootchartd rdinitrd = / sbin / bootchartd

The next time you start your computer, the /var/log/bootchart.png image will be created to help you further optimize your system startup. For example, if you do not need an AppArmor who cares about security, you can disable the boot.apparmor service through the YaST Service Configuration Module.

Suitable for: openSUSE 11.4, 12.x, 13.1, 13.2, Leap 42.x

–jeroen

Posted in *nix, *nix-tools, Linux, openSuSE, Power User, SuSE Linux, Tumbleweed | Leave a Comment »

Listing services on OpenSuSE Linux

Posted by jpluimers on 2020/05/15

Nowadays, most OpenSuSE Linux services are systemd based. Listing those is simple with systemctl list-units --all (configured ones) and systemctl list-unit-files (nonconfigured ones as well), though their states can be many as the command-completion for the --state parameter:

# systemctl list-unit-files --state
abandoned deactivating failed masked not-found remounting-sigterm start-pre stop-sigkill waiting
activating deactivating-sigkill final-sigkill merged plugged running stop stop-sigterm
activating-done deactivating-sigterm final-sigterm mounted registered sigkill stop-post stub
activating-sigkill dead inactive mounting reload sigterm stop-pre tentative
activating-sigterm elapsed listening mounting-done reloading start stop-pre-sigkill unmounting
active error loaded mounting-sigkill remounting start-chown stop-pre-sigterm unmounting-sigkill
auto-restart exited making mounting-sigterm remounting-sigkill start-post stop-sigabrt unmounting-sigterm

The odd thing: not all states from the service list are in the completion. These are missing from the list-unit-files:

generated
static
transient

In the past, most services were System V based, where you can use service --status-all. Contrary to the documentation (which indicates “The –status-all option displays the status of all loaded service units.”), it lists all services.

On OpenSuSE though, it now lists both System V based and systemd based services in one go. Since usually there are no more System V services (virtually all have been migrated to systemd a few years ago), the netto result is systemd services.

Based on [WayBack] init.d – Command to list services that start on startup? – Ask Ubuntu

–jeroen

Posted in *nix, *nix-tools, Linux, openSuSE, Power User, SuSE Linux, Tumbleweed | Leave a Comment »

html frames and iframes from other sites that won’t load: some links

Posted by jpluimers on 2020/05/14

Back in the days, framing stuff from other sites would just work. Nowadays, often they don’t because of a variety of reasons, often the site not wanting to be embedded, which is OK with me.

But it pays knowing what they do and how they do it, to ensure it is not an accidental setting of the address bar URL to the wrong value like in

  if(top != window) {
    top.location = window.location
  }

So here are some links for me to dig deeper when I encounter framing issues again:

My basic idea for a workaround is to go through a proxy.

It looks like others had this idea too, so some links future reading via cors proxy – Google Search:

–jeroen

Read the rest of this entry »

Posted in Development, JavaScript/ECMAScript, JSFiddle, Scripting, Software Development, Web Development | Leave a Comment »

Delphi 2007 – move from signature in interface to signature in implementation section

Posted by jpluimers on 2020/05/14

I always thought this was the Ctrl+Shift+Up / Ctrl+Shift+Down in ModelMaker Code Explorer, but it is not: the CnPack navigation is the one that comes most close:

[WayBack] Is there a way in the editor to move from the interface section declaration of a method to its implementation (signature)?… – Bill Meyer – Google+

–jeroen

Posted in Delphi, Development, Software Development | 4 Comments »

appletv – How can I show a read-only version of Google Calendar on Apple TV 4th generation? – Ask Different

Posted by jpluimers on 2020/05/14

Two calendars and three weather frames.Based on [WayBack] appletv – How can I show a read-only version of Google Calendar on Apple TV 4th generation? – Ask Different there is one choice that might work on Apple TV 3rd generation and 4th generation:

This is the only practical solution I dissected from [WayBackHow to surf the web and use Safari on Apple TV – Macworld UK: Here is how to browse the internet and watch web services on your Apple TV.

Installing requires a few steps as described at

Limiting to only Apple TV 4, another solution is also possible:

However the last solution is not a real web browser, so it does not allow a layout I’m using for the calendar, or actually two calendars:

  • weekly calendar on the left so my brother sees his detailed activities for the upcoming days
  • monthly calendar on the top right for an overview of the past and upcoming weeks
  • three weather frames on the bottom right with two weather radars from different sources and a weather overview for the upcoming days

The reason I need this is because my brother is mentally retarded having problems with abstract concepts like relative time and scheduling. Like me he is also easily distracted and not good at repeating tasks. So looking at a schedule at least once a day is tough for him.

He is very good at concrete topics, especially ones he can put to practice right away like “will it rain on my way to work”. That makes him look at this web page in the first place.

Currently this calendar is shown on a monitor by a Raspberry Pi attached to it.

But I might go for the Apple TV 3 route later on.

–jeroen

Posted in Apple, Apple TV, Development, iOS, iOS Development, Mobile Development, Power User | Leave a Comment »