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

mention-bot (Mention Bot) – automagically mentions potential review users for a pull request depending on context

Posted by jpluimers on 2017/09/28

mention-bot (Mention Bot) is cool!

It mentions potential review users on a pull-request depending on the context (currently: if the users have lines deleted by the pull request or have enough blame presence around the modified lines in the pull request).

First saw it used here: https://github.com/libssh2/libssh2/pull/144#issuecomment-257244996

It has source code at facebook/mention-bot: Automatically mention potential reviewers on pull requests.

And there is mention-bot/how-to-unsubscribe

–jeroen

Posted in Continuous Integration, Development, DVCS - Distributed Version Control, git, GitHub, Power User, Software Development, Source Code Management | Leave a Comment »

How I use Linux to write software for multiple target platforms using Wine, Delphi 7, Lazarus and Delphi Berlin

Posted by jpluimers on 2017/09/27

How I use Linux to write software for multiple target platforms – Kris Kamil Jacewicz – Google+

WINE has come a long way. Many things do not have a native look and feel, but so do many Delphi FMX or Lazarus LCL applications.

In fact I use quite a few tools (including Mikrotik WinBox) through Wine on Mac OS and it runs a lot more stable than quite a few of the FMX applications I’ve tried and ditched.

So for business applications not requiring a platform specific look and feel this indeed is quite acceptable direction to follow.

More at [Wayback/Archive] How I use Linux to write software for multiple target platforms.

--jeroen

Posted in Apple, Apple Silicon, ARM Mac, Delphi, Development, Hardware, Mac, Mac OS X / OS X / MacOS, MacBook, MikroTik, Network-and-equipment, Power User, routers, Software Development, WinBox | 2 Comments »

Mikrotik – viewing when users logged in/out (on/off) when logging is high-volume

Posted by jpluimers on 2017/09/27

When logging on a Mikrotik is high-volume, then you need to have either:

  • separate logging actions (they end up in logging buffers each having the same name as the action) and logging rules for specific information that you want to retain
  • log to file in stead of memory

Since my devices have plenty memory, I made a separate accountAction with a rule sending the topic account to accountAction which I then can query like either of these:

/log print detail where message~"logged"

/log print detail where message~"logged" && buffer=accountAction

Here is the /system logging export condensed result:

/system logging action add name=accountAction target=memory
/system logging add action=accountAction topics=account

–jeroen

Posted in Development, Internet, MikroTik, Power User, RouterOS, routers, Scripting, Software Development | Leave a Comment »

Use deep learning to 4x your photo’s resolution As seen on TV! After a bit of neural network training…

Posted by jpluimers on 2017/09/26

Via Use deep learning to 4x your photo’s resolutionAs seen on TV! What if you could increase the resolution of your photos using technology from CSI labs… – Joe C. Hecht – – Google + [WayBack]

Use deep learning to 4x your photo’s resolution

As seen on TV! What if you could increase the resolution of your photos using technology from CSI laboratories? Thanks to deep learning and #NeuralEnhance, it’s now possible to train a neural network to zoom in to your images at 2x or even 4x. You’ll get even better results by increasing the number of neurons or training with a dataset similar to your low resolution image. The catch? The neural network is hallucinating details based on its training from example images. It’s not reconstructing your photo exactly as it would have been if it was HD. That’s only possible in Hollywood — but using deep learning as “Creative AI” works and its just as cool! Here’s how you can get started..

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

Looking for more examples of Unicode/Ansi oddities in Delphi 2009+

Posted by jpluimers on 2017/09/25

At the end of April 2014, Roman Yankovsky started a nice [Wayback] discussion on Google+ trying to get upvotes for [Wayback] QualityCentral Report #:  124402: Compiler bug when comparing chars.

His report basically comes down to that when using Ansi character literals like #255, the compiler treats them as single-byte encoded characters in the current code page of your Windows context, translates them to Unicode, then processes them.

The QC report has been dismissed as “Test Case Error” (within 15 minutes of stating “need more info”) by one of the compiler engineers, directing to the [Wayback] UsingCharacterLiterals section of Delphi in a Unicode World Part III: Unicodifying Your Code where – heaven forbid – they suggest to replace #128 with the Euro-Sign literal.

I disagree, as the issue happens without any hint or warning whatsoever, and causes code that compiles fine in Delphi <= 2007 to fail in subtle ways on Delphi >= 2009.

The compiler should issue a hint or warning when you potentially can screw up. It doesn’t. Not here.

Quite a few knowledgeable Delphi people got involved in the discussion:

Read the rest of this entry »

Posted in Ansi, ASCII, Conference Topics, Conferences, CP437/OEM 437/PC-8, Delphi, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 7, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Development, Encoding, Event, ISO-8859, Missed Schedule, QC, SocialMedia, Software Development, Unicode, UTF-8, Windows-1252, WordPress | Leave a Comment »

Don’t Use Regular Expressions To Parse IP Addresses!

Posted by jpluimers on 2017/09/21

Interesting piece: Don’t Use Regular Expressions To Parse IP Addresses! [WayBack]

TL;DR:

When have neither then for quad-dotted decimal IPv4 addresses (ignoring for instance octals and grouped quads), this is suitable: regex – Regular expression to match DNS hostname or IP Address? – Stack Overflow [WayBack]

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

Which explained looks like this:

https://regex101.com/r/Wyr2Zd/1

Regular expression:

/ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ / g

Explanation:

  • ^ asserts position at start of the string
    • 1st Capturing Group (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}
      • {3} Quantifier — Matches exactly 3 times
        A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you’re not interested in the data

        • 2nd Capturing Group ([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
          • 1st Alternative [0-9]
            • Match a single character present in the list below [0-9]
              0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
          • 2nd Alternative [1-9][0-9]
            • Match a single character present in the list below [1-9]
              1-9 a single character in the range between 1 (ASCII 49) and 9 (ASCII 57) (case sensitive)
            • Match a single character present in the list below [0-9]
              0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
          • 3rd Alternative 1[0-9]{2}
            • 1 matches the character 1 literally (case sensitive)
            • Match a single character present in the list below [0-9]{2}
              {2} Quantifier — Matches exactly 2 times
              0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
          • 4th Alternative 2[0-4][0-9]
            • 2 matches the character 2 literally (case sensitive)
            • Match a single character present in the list below [0-4]
              0-4 a single character in the range between 0 (ASCII 48) and 4 (ASCII 52) (case sensitive)
            • Match a single character present in the list below [0-9]
              0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
          • 5th Alternative 25[0-5]
            • 25 matches the characters 25 literally (case sensitive)
            • Match a single character present in the list below [0-5]
              0-5 a single character in the range between 0 (ASCII 48) and 5 (ASCII 53) (case sensitive)
        • \. matches the character . literally (case sensitive)
    • 3rd Capturing Group ([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
      • 1st Alternative [0-9]
        • Match a single character present in the list below [0-9]
          0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
      • 2nd Alternative [1-9][0-9]
        • Match a single character present in the list below [1-9]
          1-9 a single character in the range between 1 (ASCII 49) and 9 (ASCII 57) (case sensitive)
        • Match a single character present in the list below [0-9]
          0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
      • 3rd Alternative 1[0-9]{2}
        • 1 matches the character 1 literally (case sensitive)
        • Match a single character present in the list below [0-9]{2}
          {2} Quantifier — Matches exactly 2 times
          0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
      • 4th Alternative 2[0-4][0-9]
        • 2 matches the character 2 literally (case sensitive)
        • Match a single character present in the list below [0-4]
          0-4 a single character in the range between 0 (ASCII 48) and 4 (ASCII 52) (case sensitive)
        • Match a single character present in the list below [0-9]
          0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) (case sensitive)
      • 5th Alternative 25[0-5]
        • 25 matches the characters 25 literally (case sensitive)
        • Match a single character present in the list below [0-5]
          0-5 a single character in the range between 0 (ASCII 48) and 5 (ASCII 53) (case sensitive)
  • $ asserts position at the end of the string, or before the line terminator right at the end of the string (if any)
  • Global pattern flags
    g modifier: global. All matches (don’t return after first match)

–jeroen

Posted in *nix, Communications Development, Development, Internet protocol suite, Network-and-equipment, Power User, Software Development, TCP | Leave a Comment »

What Does Ruby’s Array#shift do? – Stack Overflow

Posted by jpluimers on 2017/09/20

Once you learn that shift/unshift are like push/pop on the other end of the array, you can mentally drop the ‘f’ from the name of the methods to remember which one ‘dumps’ elements and which one ‘inserts’ them. :)

Source: What Does Ruby’s Array#shift do? – Stack Overflow [WayBack]

Via: Originally shared by This is why I Code

 

Posted in Development, Fun, Ruby, Software Development | Leave a Comment »

Dependency Analysis – Pascal Today

Posted by jpluimers on 2017/09/20

Tools and steps for analysing Delphi or FreePascal code: Dependency Analysis – Pascal Today [WayBack]

Used tools:

–jeroen

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

delphi – Is AtomicCmpExchange reliable on all platforms? – Stack Overflow

Posted by jpluimers on 2017/09/19

TL;DR: yes it is.

Answer by Allen Bauer at delphi – Is AtomicCmpExchange reliable on all platforms? – Stack Overflow [WayBack]

On Windows, it directly translates into lock cmpxchg which is way faster than the Windows API call [WayBackInterlockedCompareExchange, as that is a jump to the actual code:

InterlockedCompareExchange:
00417CA8 FF2528E12901     jmp dword ptr [$0129e128]
KERNEL32.InterlockedCompareExchange:
75855E40 8BFF             mov edi,edi
75855E42 55               push ebp
75855E43 8BEC             mov ebp,esp
75855E45 8B550C           mov edx,[ebp+$0c]
75855E48 8B4D08           mov ecx,[ebp+$08]
75855E4B 8B4510           mov eax,[ebp+$10]
75855E4E F00FB111         lock cmpxchg [ecx],edx
75855E52 5D               pop ebp
75855E53 C20C00           ret $000c

whereas AtomicCmdExchange looks like this:

Test.pas.20: RestoreValue := AtomicCmpExchange(FieldToBeModfied, 1 {new value}, 0 {expected value}, Success {true if the expected value was found, and new value set});
0111A838 8B45FC           mov eax,[ebp-$04]
0111A83B 8D500C           lea edx,[eax+$0c]
0111A83E 33C0             xor eax,eax
0111A840 B901000000       mov ecx,$00000001
0111A845 F00FB10A         lock cmpxchg [edx],ecx
0111A849 0F9445F2         setz byte ptr [ebp-$0e]
0111A84D 8945D8           mov [ebp-$28],eax

–jeroen

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

Checking KeyPress is not the place to do your input validation

Posted by jpluimers on 2017/09/19

I have seen too many projects over the years trying to do input validation by checking KeyPress. This is not limited to Delphi projects (C#, VB and other projects suffer from this just as much). Most of these projects suffer from these::

  • Much of the KeyPress logic logic in the UI byusing half-baked copy-pasted code fragments.
  • They all fail missing important functionality (like paste, clear, Ctrl-key handling and such) either supporting or suppressing that functionality where needed

If doing Delphi, then that code should be rewritten in a generic way based on examples like like these:

–jeroen

Read the rest of this entry »

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