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 2019

The Initialization-Block of a unit that is part of a package. Is it run as part of DLLMain?

Posted by jpluimers on 2019/05/16

The interesting question a while back [WayBack] The Initialization-Block of a unit that is part of a package. Is it run as part of DLLMain? – Alexander Benikowski – Google+ has a simple TL;DR answer: “it depends” on the actual usage of those units.

Way more elaborate, as I dislike language stuff that you need to track down by trial and error what is actually used:

Well, seems so(in our case). Rootcall which triggers the initialization is:
ntdll.ldrLoadDLL
I did not mention, that the BPL is used by a DLL(DLL links against package) which means the package is loaded/initialized by the Os when the DLLMain runs. Odd combination but that seems to be the culprit here.

David Heffernan
Yes, it is triggered from DllMain. And yes, this has massive consequences for what can and cannot be done in initialization sections.

Alexander Benikowski
+David Heffernan in my case. When a packages unit is already initialized by being used from an Exe(which links to the Package), it is not from within a DLLMain.
In my case, both the Application and the dll it loads, both link to the same package. But the unit in question is unused until the DLL is loaded.

Uwe Raabe
The docs for InitializePackage say it calls the initialization parts of all contained units in the package – not only the used ones.

David Heffernan
+Alexander Benikowski​ In that scenario we have load time linking and I guess the package framework handles it differently.

David Millington
Related: don’t forget that class constructors and destructors effectively run in the initialization and finalization sections too. Restrictions or side effects apply there too. docwiki.embarcadero.com – Methods (Delphi) – RAD Studio

Stefan Glienke
+Uwe Raabe Which is not being done when you use it as runtime package. Only initialization sections from unit being used are being run. This caused us several problems in the past where 2 modules (A being the host application exe and B being some DLL that gets loaded at a later point via LoadLibrary) were using a runtime package but only B used a particular unit from the package which caused the initialization code for that unit being executed when B was loaded and hence being executed in the context of the dllmain of B.

The usual solution is then to put those units into some dummy unit forcing the initialization of that unit to be run in A.

Another solution according to your statement could be to call InitializePackage on all the used runtime packages – and there the question is: couldn’t the RTL do that somehow?

+Stefan Glienke I am not sure if that is desirable when done unconditionally. Even when compiled with packages I wouldn’t expect units to be initialized which aren’t actually used. That would perhaps change the behavior of the application depending on whether it is compile with runtime packages or without.
The case is different with dynamic loaded packages. The units in there are obviously not directly used in the first place. As no one can know which units of such a package are used or not, initializing all of them seems like a viable decision.
Of course there will be situations where your proposed behavior might come in handy, but I doubt that this will be a fit for all.

Source: The Initialization-Block of a unit that is part of a package. Is it run as pa…

Related:

–jeroen

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

Reset Linux Desktop To Default Settings With A Single Command – OSTechNix

Posted by jpluimers on 2019/05/16

To reset Ubuntu Unity or any other Linux desktop with GNOME/MATE DEs to its default settings, run:

dconf reset -f /

Source: [WayBack] Reset Linux Desktop To Default Settings With A Single Command – OSTechNix

I need to check if it works on OpenSuSE with XFCE as there the dconf command is installed, but I still have a default desktop (mainly because most of the work I do is using a terminal over ssh).

–jeroen

via: [Archive.is] Never thought about dconf reset… Joe C. Hecht – Google+

Posted in *nix, *nix-tools, Linux, Power User, X11 | Leave a Comment »

How to Design Early Returns in C++ (Based on Procedural Programming) – Fluent C++

Posted by jpluimers on 2019/05/15

One more thing to take away from Procedural Programming: It’s Back? It Never Went Away – Kevlin Henney [ACCU 2018] – YouTube was explained in [WayBack] How to Design Early Returns in C++ (Based on Procedural Programming) – Fluent C++.

Though in C++, it applies to all programming languages that stem from a procedural background (Pascal, C#, Java, golang, to name just a few).

The article is about keeping an if/else-if/else tree, even when they can be removed becomes some of their bodies perform an early return, as

In C++, as well as in other languages, the return keyword has two responsibilities:

  • interrupting control flow,
  • yielding a value.

It basically comes down to this argument:

Essentially, the argument for Code #1 is that you need to know less to understand the structure of the code.

Indeed, if we fold away the contents of the if statements, Code #1 becomes this:

The structure of the code is very clear. There are 4 different paths based on the year, they’re independent from each other, and each path will determine the boolean result of the function (if it doesn’t throw an exception).

Now let’s see how Code #2 looks like when we fold away the if statements:

And now we know much less. Do the if statements contain a return? Maybe.

Do they depend on each other? Potentially.

Do some of them rely on the last return false of the function? Can’t tell.

With Code #2, you need to look inside of the if statement to understand the structure of the function. For that reason, Code #1 requires a reader to know less to understand the structure. It gives away information more easily than Code #2.

–jeroen

via [WayBack] Kevlin Henney – Google+: How to Design Early Returns in C++ (Based on Procedural Programming) – Fluent C++

Posted in .NET, C, C#, C++, Conference Topics, Conferences, Delphi, Development, Event, Software Development | Leave a Comment »

Google old content posted before a specific date

Posted by jpluimers on 2019/05/15

Steps:

  1. Start with something like https://www.google.com/search?q=”did+you+hear+about+the+man”+”he%27s+0K+now”
  2. Clicking Tools followed by Any Time, then Custom range often does not show a dialog.
  3. Appending &tbs=qdr:y to the URL magically enables that popup:
    https://www.google.com/search?q=”did+you+hear+about+the+man”+”he%27s+0K+now”&tbs=qdr:y
  4. After filling it in, you get a very different URL like https://www.google.com/search?q=”did+you+hear+about+the+man”+”he%27s+0K+now”&tbs=cdr:1,cd_min:,cd_max:01-01-2007

This is how I found the post in Did you hear about the man who got cooled to absolute zero? He’s 0K now.

I think cdr stands for custom date range and qdr for a built in date range as after searching for the abbreviations, I found [WayBack] Google Search URL Request Parameters | DETECTED that discusses tbm and tbo in addition to tbs.

The trick above is the successor of [WayBack] Filter Google Results by Date with a URL Trick which appended &as_qdr=d.

–jeroen

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

Need to try this: overloaded default properties

Posted by jpluimers on 2019/05/15

[Archive.is] Need to try this: … multiple default index properties having the same name …getters can be overloads … resolve …by type signature … – Thomas Mueller (dummzeuch) – Google+, thanks to marck for this brilliantly simple example:

private
  function GetColumnValue(const ColumnName: string): string; overload;
  function GetColumnValue(Index: Integer): string; overload;
  procedure SetColumnValue(Index: Integer; const Value: string);
public
  property Values[const ColumnName: string]: string read GetColumnValue; default;
  property Values[ColumnIndex: Integer]: string read GetColumnValue write SetColumnValue; default;
end;

This means:

  • you can have multiple default indexor properties
  • the multiple indexor properties can have the same name e.g., Values
  • the properties getters can be overloads (i.e. have the same name) e.g., GetColumnValue
  • Delphi will resolve the overloads by type signature

–jeroen

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

Time capsule opening ceremony today at MIT’s Stata Center after programmers solve MIT’s 20-year-old cryptographic puzzle | MIT CSAIL

Posted by jpluimers on 2019/05/15

[WayBack] Programmers solve MIT’s 20-year-old cryptographic puzzle | MIT CSAIL:

The capsule ceremony will happen Wednesday, May 15 at 4 p.m. at MIT’s Stata Center.

Cool work, with a very cool challenge.

Via/related:

  • a

–jeroen

Posted in Development, Power User, Security, Software Development | Leave a Comment »

Some links on ShellNew: a user local place (registry and file system) to have Visual Studio templates for Blank Solution files

Posted by jpluimers on 2019/05/14

Some systems to not have a %windir%\ShellNew directory, so here are some links and observations on ShellNew entries in the registry.

Originally, I needed this for Creating a blank Visual Studio solution without a directory, and sln Format Version numbers but found a default installation did not have a %windir%\ShellNew directory.

A similar Windows 8.1 system had these files there:

  • EXCEL12.XLSX
  • MSPUB.PUB

On the Windows 10 system, these files were in C:\Program Files (x86)\Microsoft Office\root\vfs\Windows\SHELLNEW, so apparently, Windows 10 has moved more into a Virtual File System structure.

Machine wide registered extensions

The key HKEY_CLASSES_ROOT\.zip\CompressedFolder\ShellNew on both systems has the below values, indicating you do not need a file template: a binary template in the registry suffices:

  • Data having REG_BINARY content of a 22-byte empty .zip file
  • ItemName having a REG_EXPAND_SZ content pointing to @%SystemRoot%\system32\zipfldr.dll,-10194

The key HKEY_CLASSES_ROOT\.rtf\ShellNew on both systems has the below values, indicating you do not need a file template: a text template in the registry suffices:

  • Data having REG_SZ content of a 7 character file content {\rtf1}
  • ItemName having a REG_EXPAND_SZ content pointing to @%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE,-213

The key HKEY_CLASSES_ROOT\.bmp\ShellNew on both systems has the below values, indicating you do not need a file template: a zero byte template in the registry suffices:

  • NullFile having an empty REG_SZ
  • ItemName having a REG_EXPAND_SZ content pointing to @%systemroot%\system32\mspaint.exe,-59414

User wide registered extensions

At HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, is a value named Templates having an absolute path which can be expanded from %AppData%\Microsoft\Windows\Templates.

That directory was empty, but it is connected to the HKEY_CURRENT_USER\Software\Classes counterpart of HKEY_CLASSES_ROOT (the latter is an alias for HKEY_LOCAL_MACHINE\SOFTWARE\Classes).

So in stead of putting template files in %WinDir%\ShellNew plus registering them underHKEY_CLASSES_ROOT, you can put them in %AppData%\Microsoft\Windows\Templates and register them under HKEY_CURRENT_USER\Software\Classes.

Empty Visual Studio solution files for the current user

Since people have requested empty solution files to be created without creating a directory for a long time ([WayBack] create solution without folder – Visual Studio) and Visual Studio still does not allow you to do that, I have amended the %WinDir%\ShellNew based solution I created some 7 years ago at  Creating a blank Visual Studio solution without a directory, and sln Format Version numbers, to a current user based one:

[WayBack] jeroenp / wiert.me / commit / 01e4430712a6 — Bitbucket:

Amend empty Visual Studio templates to support%AppData%\Microsoft\Windows\Templates referenced from HKEY_CURRENT_USER\Software\Classes

Future

I might be able to morph this into a registry-only solution by using REG_MULTI_SZtyped values containing the actual .sln template content as multi-line strings separated by zero bytes. Some starting links on this for future reading:

Related

–jeroen

Posted in Power User, Windows, Windows Explorer / Windows Shell | Leave a Comment »

On the Effectiveness of Static Typing in Detecting Public Bugs

Posted by jpluimers on 2019/05/14

Cool research paper from a while back but still soo relevant:

The project page for an ICSE’17 paper, To Type or Not to Type: Quantifying Detectable Bugs for JavaScript

JavaScript is also a dynamically typed language for which static type systems, notably Facebook’s Flow and Microsoft’s TypeScript, have been written. What benefits do these static type systems provide?

Source: [Archive.isOn the Effectiveness of Static Typing in Detecting Public Bugs

 

Other saved links:

–jeroen

via: [WayBack/Archive.is] Slashdot drew my attention to this ressearch … http://ttendency.cs.ucl.ac.uk/projects/type_study/ An argument for languages like Delphi. – Roland Kossow – Google+

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

if statement – How to ask for batch file user input with a timeout – Stack Overflow

Posted by jpluimers on 2019/05/14

The trick is to use the choice command; see [WayBackif statement – How to ask for batch file user input with a timeout – Stack Overflow

–jeroen

Posted in Batch-Files, Development, Microsoft Surface on Windows 7, Power User, Scripting, Software Development, Windows, Windows 10, Windows 7, Windows 8, Windows 8.1, Windows 9, Windows Server 2000, Windows Server 2003, Windows Server 2003 R2, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2, Windows Server 2016, Windows Vista, Windows XP | Leave a Comment »

Where is the Chrome settings file? – Super User

Posted by jpluimers on 2019/05/13

[WayBack] Where is the Chrome settings file? – Super User, on various platforms as a folder named Default under:

In Windows%LocalAppData%\Google\Chrome\User Data\
In OS X~/Library/Application Support/Google/Chrome/
In Linux~/.config/google-chrome/

The easiest way to find out the actual location is by browsing to chrome://version/ as per [WayBack] google chrome – Disabling “Sign In ” tab on startup – Super User. There the entry Profile Path will show the actual profile location.

Inside that path is a JSON file called preferences which you can edit if Chrome is closed (since Chrome will overwrite it regularly when active).

A few entries I saw are interesting:

  • Restoring the session on startup:
        "session": {
          "restore_on_startup": 1
        },
  • While running
        "exit_type": "Crashed",
        "exited_cleanly": true,
  • After closing
        "exit_type": "Normal",
        "exited_cleanly": true,
    

A trick to restore the session after you quite Chrome is to replace "exited_cleanly":true with "exited_cleanly":false in the Preferences file.

–jeroen

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