The Wiert Corner – irregular stream of stuff

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

  • My badges

  • Twitter Updates

  • 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 ‘Software Development’ Category

Firemonkey/Isometric at master · tothpaul/Firemonkey

Posted by jpluimers on 2019/04/04

This shows you how to do 2.5D isometric projection in Delphi using Firemonkey: [WayBackFiremonkey/Isometric at master · tothpaul/Firemonkey.

[WayBackIsometric projection – Wikipedia.

Via: [WayBack] I wonder what the best approach would be to use FireMonkey to develop an isometric 2.5D game in the “classic” way… – Fl Ko – Google+

–jeroen

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

Delphi: do NOT use duplicate GUIDs on interfaces

Posted by jpluimers on 2019/04/04

One of the things when fixing bugs in an old codebase is wading through technical debt.

A quick win is to get rid of duplicate GUIDs when interface portions have been copy-paste re-used:

  1. interfaces with the same GUID are treated the same with as casts even if they are different.
  2. the compiler does not warn about duplicate GUID values**

These searches help big time: it shows the duplicate GUIDs if they have been indented all the same way. Good enough for most situations.

grep -Sh "\[\'{" *.pas | sort

grep -rh "\[\'{" *.pas | sort

It depends which flavour of grep you use (gnu or regular) to specify recursion.

Note that findstr doesn’t cut it as it always shows the filename: [WayBackList files recursively showing only full path and file size from Windows Command Prompt – Super User

** this compiles without warning:

program NoWarningOnDuplicateInterfaceGUID;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  IInterface1 = interface
    ['{ECF26C39-CBFF-488E-A3AB-2629726F1005}']
  end;

  IInterface2 = interface
    ['{ECF26C39-CBFF-488E-A3AB-2629726F1005}']
  end;

var
  Subject: IInterface;
begin
  try
    (Subject as IInterface1)._Release;
    (Subject as IInterface2)._release;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

–jeroen

Read the rest of this entry »

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

Woes from last year: While checking in to @plasticscm server and having a branch selected in the PlasticSCM GUI: Error — No checkout branch found.

Posted by jpluimers on 2019/04/03

I bumped into a similar situation again, and my conclusion is that getting out of PlasticSCM woes is more cumbersome to me than getting out of similar git woes.

[WayBack] Jeroen Pluimers on Twitter: “While checking in to @plasticscm server and having a branch selected in the PlasticSCM GUI: ————————— Error ————————— No checkout branch found. ————————— OK —————————… https://t.co/k13K06mOFX”

Basically

---------------------------
Error
---------------------------
No checkout branch found.
---------------------------
OK   
---------------------------

is the Plastic GUI way of saying “I think you have checked out branch A, but while checking that one in, I could not find it on the server, could it be that it got renamed or deleted?”.

The way to reliably get out of this situation (even if you are in a merge):

  1. Make a full backup of your directory tree (robocopy /mir is your friend here)
  2. Keep a note of your check-in comment
  3. Undo your changes in the current branch
  4. Checkout a branch that never got renamed
  5. Quit the Plastic GUI
  6. Start the Plastic GUI
  7. Checkout the branch you want to apply your changes on
  8. Use Beyond Compare to compare the backup tree and the current checked out tree
  9. Sync anything changed using Beyond Compare
  10. Checkin the changes in PlasticSCM using the saved check-in comment

–jeroen

PS, the Twitter thread:

Read the rest of this entry »

Posted in Development, PlasticSCM, Software Development, Source Code Management | Leave a Comment »

paulcbetts/refit: The automatic type-safe REST library for Xamarin and .NET

Posted by jpluimers on 2019/04/03

This is so cool: [WayBack] paulcbetts/refit: The automatic type-safe REST library for Xamarin and .NET. It’s  inspired by Square’s [WayBack] Retrofit library which does the same for Java.

They basically allow you to use attributes on interfaces to define a type-safe wrapper around any REST interface, then instantiate a connection to it for making calls.

No more manual HttpClient fiddling!

Since it requires only .NET 1.4, you can basically run it on any platform as it’s supported covered by the implementations .NET Core, Mono and the full .NET Framework.

Quite a lot of projects already use it; I got there via the first link:

–jeroen

Via: [WayBack] Exploring refit, an automatic type-safe REST library for .NET Standard https://www.hanselman.com/blog/ExploringRefit… – Jeroen Wiert Pluimers – Google+

Posted in .NET, C#, Development, Java, Java Platform, Software Development | Leave a Comment »

Delphi, attributes, RTTI and the IDE

Posted by jpluimers on 2019/04/03

Reminder to self: [WayBack] It took me a while to address an awful IDE crash issue. If you install a design time package which uses RTTI to populate custom attributes declared in… – Baoquan Zuo – Google+

TL;DR: be very careful using the built-in RTTI support objects as when they refer to custom defined attributes in packages, and the packages get unloaded, the cache does not get flushed.

Bug: RSP-11620: IDE crashes when rebuilding a project group that contains a component with customattribute

–jeroen

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

Some links on DUnit, JUnit and NUnit XSD specifications of their XML formats (JUnit is actually Ant XML)

Posted by jpluimers on 2019/04/02

For my link archive:

–jeroen

Posted in Agile, Development, Software Development, Unit Testing | Leave a Comment »

architecture – How much is too much Dependency Injection? – Software Engineering Stack Exchange

Posted by jpluimers on 2019/04/02

Mark Seeman posted a great answer with insights into how to architect applications: [WayBack] architecture – How much is too much Dependency Injection? – Software Engineering Stack Exchange

Some topics covered:

  • small code bases
  • pure DI over DI container
  • cases for both coarse and fine-grained DI
  • favour functional programming over OOP
  • both functional and DI ports and adapters

It links to a ton of other good reads for a quiet long weekend as well:

–jeroen

via: [WayBack] Favour Pure DI – Linas Naginionis – Google+

Posted in Design Patterns, Development, Software Development | Leave a Comment »

Interface methods are not assignment compatible with method references or methods of object.

Posted by jpluimers on 2019/04/02

Boy I wish that QC was still up and QualityPortal was publicly indexable as that would have saved me quite a bit of time tracking this down. Luckily I got help from Stefan Glienke (who maintains the awesome Spring4D library based on modern Delphi compiler support) when I mentioned

How good are you with reference to function?
I’ve an odd compiler thing throwing errors when using interfaces but not with classes.

So, for posterity:

Unlike C#, in Delphi interface methods are not compatible with method references or methods of object.

This has many manifestations, which means you can get a variety of compiler errors. I’ve listed the ones I could find below, but presume there are more and if I find more will update this post.

These are the errors you can get:

  • E2010 Incompatible types: ‘T’ and ‘Procedure’
  • E2035 Not enough actual parameters
  • E2250 There is no overloaded version of ‘FirstOrDefault’ that can be called with these arguments

These are the (now defunct, but used to be publicly accessible) QC and QualityPortal (needs sign on) entries (thanks Stefan Glienke and Blaise Thorn for reporting these):

The really frustrating part is that the RSP is marked as “new feature” whereas clearly it isn’t, so it probably never will be fixed.

A workaround for now is to wrap the interface method references with:

  • either anonymous methods (when you have just a few classes to cover, but maybe more than a few methods on the interface)
  • or instance methods on a class (when there are many classes to cover and preferably few methods on the interface)

Examples are in the code below that also shows this works fine and dandy in C#.

–jeroen

Read the rest of this entry »

Posted in Delphi, Delphi 10 Seattle, Delphi 10.1 Berlin (BigBen), Delphi 10.2 Tokyo (Godzilla), Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE8, Development, Software Development, Spring4D | Leave a Comment »

Requirements to write multi threaded code

Posted by jpluimers on 2019/04/01

Steps:

  1. get gist.github.com – Developers must be this tall to write multi threaded code
  2. render to PNG/PDF/HTML
  3. print
  4. attach to wall

Via [WayBack] Kristian Köhntopp – Google+

Related:

Bernd Paysan’s:

The three most 2. common race
1. off-by-one software conditions
errors:
counting
core dumped (Segmentation fault in printf)

–jeroen

Read the rest of this entry »

Posted in Development, Fun, Multi-Threading / Concurrency, Software Development | Leave a Comment »

debugging – Find what javascript changes the DOM? – Stack Overflow

Posted by jpluimers on 2019/04/01

I know I’m going to need this one day: [WayBackdebugging – Find what javascript changes the DOM? – Stack Overflow

Via: [WayBack] Javascript “Why”: Wenn ich eine fertig geladene Webseite sehe und wissen möchte, warum “dieses Element da” (Bild, Script, div) geladen worden ist, wie… – Kristian Köhntopp – Google+

–jeroen

Posted in Chrome, Development, JavaScript/ECMAScript, Power User, Scripting, Software Development, Web Browsers, Web Development | Leave a Comment »