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

PostgreSQL Exercises

Posted by jpluimers on 2023/01/11

[Wayback/Archive] PostgreSQL Exercises

This site was born when I noticed that there’s a load of material out there to help people learn about SQL, but not a great deal to make it easy to learn by doing. PGExercises provides a series of questions and explanations built on a single, simple dataset.

It was funny, as I bummped into right after writing the article Enabling GitHub pages to a HTML or markdown GitHub project is dead easy: Delphi deadlockempire is now hosted on github.io (which reached the top of the blog queue yesterday).

After reading the [Wayback/Archive] PostgreSQL Exercises: Getting Started, start the exercises at [Wayback/Archive] PostgreSQL exercises: basic exercises.

There is no login needed, which I really like.

Note that some of the assignments are hard, and can have multiple results, see for instance [Archive] Fahru on Twitter: “this: … I FINALLY completed it, and any win is worth telling🥳 took me like one hour on and off. The “more than 30$” requirement is bizarre 😂 a bit different than the official answer so I’m digging up more about this learned a heck ton, worth the time! ” / Twitter

Via: [Archive] Steve Polito on Twitter: “If you’re like me and want to level up your SQL game, give PostgreSQL Exercises a try. …” / Twitter

–jeroen

Posted in Database Development, Development, PostgreSQL, Software Development, SQL | 2 Comments »

Enabling GitHub pages to a HTML or markdown GitHub project is dead easy: Delphi deadlockempire is now hosted on github.io

Posted by jpluimers on 2023/01/10

A while ago I wrote about Setting up a GitHub project so it is served over https as a github.io and a custom subdomain.

Doing the full “host on your custom domain” route was a big tougher than I hoped for, so I totally forgot how easy it is to convert an existing HTML or markdown documentation repository to use GitHub pages without a custom domain.

I needed it for the Delphi version of the DeadLockEmpire (see links below, originally it was an interactive tutorial game focusing on the C# language and .NET runtime), as I am trying to get as much as my stuff published and hosted in a manner that will outlive me (I still have a pretty high chance of the rectum cancer metastases returning).

Enabling GitHub Pages on your repository is almost as easy as hosting a page through raw.githack.com (where I already hosted raw.githack.com/jpluimers/deadlockempire.github.io/feature/Delphi-language-and-Delphi-RTL/index.html as raw.githack.com/jpluimers/deadlockempire.github.io/feature/Delphi-language-and-Delphi-RTL/index.html and rawcdn.githack.com/jpluimers/deadlockempire.github.io/feature/Delphi-language-and-Delphi-RTL/index.html).

This is how easy it was to get it hosted as [Wayback/Archive] jpluimers.github.io/deadlockempire.github.io:

  1. In my [Wayback/Archive] jpluimers/deadlockempire.github.io: The Deadlock Empire: Slay dragons, learn concurrency! repository, go to the Settings tab, then click on Pages:
    DeadLockEmpire Settings tab, Pages configuration None

    DeadLockEmpire Settings tab, Pages configuration None.

    Here you see “None” as value for the branch to be published as GitHub Pages.

  2. Here I have chosen the Branch “feature/Delphi-language-and-Delphi-RTL” to be published, and am about to press “Save” (full screenshot below):
    DeadLockEmpire Pages selecting the correct branch

    DeadLockEmpire Pages selecting the correct branch

  3. After pressing “Save“, the site gets published (it takes about a minute for that to complete) at [Wayback/Archive] jpluimers.github.io/deadlockempire.github.io:
    DeadLockEmpire Pages the correct branch has been saved

    DeadLockEmpire Pages the correct branch has been saved which will automagically publish it.

That was it. No more steps.

Each new commit in the selected branch will auto-publish as well.

Related DeadLockEmpire posts

  1. 2016 – If you thought you could do multi-threading, then play “The Deadlock Empire” games.
  2. 2017 – ThreadBarrier/ThreadBarrier.pas at master · lordcrc/ThreadBarrier
  3. 2020 – Davidlohr Bueso on Twitter: A programmer had a problem. He thought to himself, “I know, I’ll solve it with threads!”. has Now problems. two he
  4. [WayBack] One second code: Do YOU know how much your computer can do in a second? is a quiz version of the [WayBack] Numbers Every Programmer Should Know By Year. [WayBack] About this game revealed…Source: One second code: Do YOU know how much your computer can do in a second? « The Wiert Corner – irregular stream of stuff

Read the rest of this entry »

Posted in .NET, About, C#, Conference Topics, Conferences, Delphi, Development, Event, Personal, Software Development, Web Development | 1 Comment »

2021 Hackaday Remoticon – links to conference, playbacks and some slide decks

Posted by jpluimers on 2023/01/04

Another remote conference I missed while recovering from rectum cancer treatment, but luckily the playbacks are on YouTube and some slide decks are at Google Drive.

Via: [Archive] Uri Shaked on Twitter: “My talk on @hackaday Remoticon starting now Reverse Engineering the ESP32 WiFi Live stream: … “ / [Archive] Jeroen Wiert Pluimers on Twitter: “Dang. I copied that one out of the description. All the timestamps there are corrupted as YouTube measures them in minutes:seconds but @hackaday posted them as hours:minutes (which are off by minutes anyway) starting at 01:56:30. This is the correct one: … “

Links:

  • Web site at [Wayback/Archive] 2021 Hackaday Remoticon
  • Videos at [Wayback/Archive] HACKADAY – YouTube:
    • Day 1: [Wayback/Archive] 2021 Hackaday Remoticon: Friday – YouTube

      Approximate hour:minute time stamps as published for Friday

      They are usually at least minutes off; substract 11:00 to get the rough hour:minute index into the video, then scroll from there.

      • 11:00 Opening Remarks
      • 11:10 Keynote – Elecia White: Map Files and Other Buried Treasures
      • 12:10 Maurits Fennis: Hack for the Planet: Reverse Engineering Embedded Systems to Reduce E-Waste
      • 13:00 Matt Venn: Open Source ASICs – A Year in Perspective
      • 13:35 Hal Rodriguez and Sahrye Cohen: Conductive Melody: a Tech Couture Instrument
      • 14:10 Jay Bowles: A Dip Into The Plasmaverse
      • 15:00 Voja Antonic: Become a Hardware Expert in 40 Minutes
      • 15:50 Sergiy Nesterenko: Don’t Flip My Bits: Electronics in Spaaaace
      • 16:25 Jeroen Domburg: Rickrolling Buddha: A Deep Dive in Reverse Engineering and Thoroughly Pwning an Unknown Chip
      • 17:15 Lewin Day: Hacker Trivia (Stream will automatically redirect to this one: [Wayback/Archive] youtu.be/uRpUdQi31tg )
      • 18:00 Bring-a-Hack on Gather Town platform (details on joining sent to ticket holders and on the Discord server)
    • Day 2: [Wayback/Archive] 2021 Hackaday Remoticon: Saturday – YouTube

      Approximate hour:minute time stamps as published for Saturday

      They are usually at least minutes off; substract 10:00 to get the rough hour:minute index into the video, then scroll from there.

      • 10:00 Opening Remarks
      • 10:10 Keynote – Keith Thorne: LIGO: The Most Sensitive Instrument Humans Ever Created Will Unfold the Mysteries of Gravitational Waves
      • 11:10 Arsenijs Picugins: Laptop-Be-Done
      • 12:00 Uri Shaked: Reverse Engineering the ESP32 WiFi
      • 12:35 Hash Salehi: Smart Meter Hacking
      • 13:10 Jay Doscher: Getting Started With and Outgrowing Tinkercad
      • 14:00 Joey Castillo: Teaching An Old LCD New Tricks
      • 14:35 Colin O’Flynn: Upskilling your Hardware Security Work
      • 15:10 Rob Weinstein: Patently Obvious – Reverse Engineering a 45 Year Old Patent into a Fully-Functional HP-35 Replica
      • 16:00 Debra Ansell: Form is Function: Modular PCB Building Blocks
      • 16:35 Vaibhav Chhabra: M19 Initiative – A Case of Open Innovation & Distributed Manufacturing at Scale
      • 17:25 Keynote – Jeremy Fielding: Building Hardware that Moves: the Fundamentals that Everyone Should Know
      • 18:25 Hackaday Prize Ceremony
      • 19:25 Closing Remarks
      • 19:35 DJ Jackalope: Live Set (listen/watch on Twitch, chat with everyone on discord)

–jeroen

Posted in Conferences, Development, ESP32, Event, Hardware Development, Remoticon, Software Development | Leave a Comment »

Some QR code generators on github.io

Posted by jpluimers on 2023/01/03

QR codes often are the quickest way to copy/paste some data to a smartphone.

So, via [Wayback/Archive] generate qr code site:github.io – Google Search, I found these two (the first is based on the JavaScript source in second, but has QR codes with larger blocks and is therefore easier to scan):

  1. [Wayback/Archive] QR Code Generator
  2. [Wayback/Archive] QR Code Generator

–jeroen

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

Getting your public IP address from the command-line when http and https are blocked: use DNS

Posted by jpluimers on 2022/12/28

Years ago, I wrote Getting your public IP address from the command-line. All methods were http based, so were very easy to execute using cURL.

But then in autumn 2021, Chris Bensen wrote this cool little blog-post [Wayback/Archive] Chris Bensen: How do I find my router’s public IP Address from the command line?:

dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com

At first sight, I thought it was uncool, as the command was quite long and there was no explanation of the dig command trick.

But then, knowing that dig is a DNS client, it occurred to me: this perfectly works when http and https are disabled by your firewall, but the DNS protocol works and gives the correct result:

# dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com
"80.100.143.119"

This added the below commands and aliases to my tool chest for *nix based environments like Linux and MacOS (not sure yet about Windows yet :), but that still doesn’t explain why it worked. So I did some digging…

IPv4

  • command:
    dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com
  • command removing outer double quotes:
    dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com | xargs
  • alias:
    alias "whatismyipv4_dns=dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com | xargs"

IPv6

  • command:
    dig -6 TXT +short o-o.myaddr.l.google.com @ns1.google.com
  • command removing outer double quotes:
    dig -6 TXT +short o-o.myaddr.l.google.com @ns1.google.com | xargs
  • alias:
    alias "whatismyipv6_dns=dig -6 TXT +short o-o.myaddr.l.google.com @ns1.google.com | xargs"

How it works

Let’s stick to dig and IPv4 as that not having IPv6 (regrettably still) is the most common situation today:

# dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com
"80.100.143.119"

What it does is request the DNS TXT record of o-o.myaddr.l.google.com from the Google DNS server ns1.google.com and returns the WAN IPv4 address used in the DNS request, which is for instance explained in [Wayback/Archive] What is the mechanics behind “dig TXT o-o.myaddr.l.google.com @ns1.google.com” : linuxadmin.

Since these are TXT records, dig will automatically double quote them, which xargs can remove (see below how and why):

# dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com | xargs
80.100.143.119

The DNS query will fail when requesting the Google Public DNS servers 8.8.8.8 or 8.8.4.4:

# dig -4 TXT +short o-o.myaddr.l.google.com @8.8.8.8
"2a00:1450:4013:c1a::103"
"edns0-client-subnet 80.101.239.0/24"

Or, with quotes removed (the -L 1 ensures that xargs performs the quote-pair removal action on each line):

# dig -4 TXT +short o-o.myaddr.l.google.com @8.8.8.8 | xargs -L 1
2a00:1450:4013:c1a::103
edns0-client-subnet 80.101.239.0/24

This request is both slower than requesting the ns1.google.com server and wrong.

The reason is that only ns1.google.com understands the special o-o.myaddr.l.google.com hostname which instructs it to return the IP address of the requesting dig DNS client.

That 8.8.8.8 returns a different IP address and an additional edns0-client-subnet with less accurate information is explained in an answer to [Wayback/Archive] linux – Getting the WAN IP: difference between HTTP and DNS – Stack Overflow by [Wayback/Archive] argaz referring to this cool post: [Wayback/Archive] Which CDNs support edns-client-subnet? – CDN Planet.

Not just ns1.google.com: any DNS server serving the google.com domain

Since o-o.myaddr.l.google.com is part of the google.com domain, the above works for any DNS server serving the google.com domain (more on that domain: [Wayback/Archive] General DNS overview  |  Google Cloud).

Getting the list of DNS servers is similar to getting the list of MX servers which I explained in Getting the IP addresses of gmail MX servers, replacing MX record type (main exchange) with the NS record type (name server) and the gmail.com domain with the google.com domain:

# dig @8.8.8.8 +short NS google.com
ns3.google.com.
ns1.google.com.
ns2.google.com.
ns4.google.com.

The ns1.google.com DNS server is a special one of the NS servers: it is the start of authority server, which you can query using the SOA record type that also gives slightly more details for this server:

# dig @8.8.8.8 +short SOA google.com
ns1.google.com. dns-admin.google.com. 410477869 900 900 1800 60

The difference between using NS and SOA records with dig are explained in the [Wayback] dns – How do I find the authoritative name-server for a domain name? – Stack Overflow answer by [Wayback/Archive] bortzmeyer who also explains how to help figuring out SOA and NS discrepancies (note to self: check out the check_soa tool originally by Michael Fuhr (I could not find recent content of him, so he might have passed away) of which source code is now at [Wayback/Archive] Net-DNS/check_soa at master · NLnetLabs/Net-DNS).

So this works splendid as well using ns4.google.com on my test system:

# dig -4 TXT +short o-o.myaddr.l.google.com @ns4.google.com | xargs
80.100.143.119

The xargs removes outer quotes removal trick

[Wayback/Archive] string – Shell script – remove first and last quote (“) from a variable – Stack Overflow (thanks quite anonymous [Wayback/Archive] user1587520):

> echo '"quoted"' | xargs
quoted

xargs uses echo as the default command if no command is provided and strips quotes from the input.

More on https versus DNS requests

Some notes are in [Wayback/Archive] How to get public IP address from Linux shell, but note the telnet trick now fails as myip.gelma.net is gone (latest live version was archived in the Wayback Machine in august 2019).

Via

–jeroen

Posted in *nix, *nix-tools, Apple, bash, bash, Batch-Files, Communications Development, Development, DNS, Internet protocol suite, Linux, Mac, Mac OS X / OS X / MacOS, Power User, Scripting, Software Development, TCP | Leave a Comment »

Kevlin Henney on Twitter: “#FizzBuzzFriday… ” Python table lookup versus C# functional programming

Posted by jpluimers on 2022/12/27

[Archive.is] Kevlin Henney on Twitter: “#FizzBuzzFriday… “.

Related: [Wayback] Your C# is already functional, but only if you let it | In Absentia:

A few days ago I tweeted a C# code snippet, showing a FizzBuzz implementation using some of the new features in C# 8.0. The tweet “went viral”, as the kids say, with several people admiring the terse

–jeroen

Read the rest of this entry »

Posted in .NET, C#, Development, Functional Programming, Python, Software Development | Leave a Comment »

SimenHolmestad/Privacynator: A utility for removing Personally Identifiable Information (PII) from videos.

Posted by jpluimers on 2022/12/21

[Archive] SimenHolmestad/Privacynator: A utility for removing Personally Identifiable Information (PII) from videos.

Privacynator is an utility for removing Personally Identifiable Information (PII) from videos. It is primarily meant for videos captured from cars.
Privacynator uses the Detectron2 model from facebook research: https://github.com/facebookresearch/detectron2.

It is written in Python 3.

It is unlike this: Need to check if “PrivacyNator” is already out: a local TensorFlowJS app that blurs your screen when you are not behind it

–jeroen

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

Securely Connecting to Autonomous DB Without a Wallet (Using TLS)

Posted by jpluimers on 2022/12/20

[Wayback/Archive] Securely Connecting to Autonomous DB Without a Wallet (Using TLS)

It is about moving from mTLS to TLS on Oracle Autonomous DB and at the same time IP-whitelisting the client IP addresses.

[Archive] Chris Bensen on Twitter: “This is extremely useful so I figured I’d share in the hopes it helps someone else “

–jeroen

Posted in Cloud, Cloud Development, Database Development, Development, Infrastructure, OracleDB, Software Development | Leave a Comment »

xahteiwi.eu – Meaningless Metrics, Treacherous Targets

Posted by jpluimers on 2022/12/15

Food for thought:

[Wayback] xahteiwi.eu – Meaningless Metrics, Treacherous Targets

A common feature of organizations in the software technology industry (but certainly not only in that industry) is their fixation on metrics, measurements, and quantifiers. I understand that this is frequently done and advocated for in the spirit of making management more objective, less arbitrary, more scientific, and perhaps fairer. But since they say that the road to hell is often paved with good intentions, here’s a quick summary of what we know about about the undesirable side effects of such an approach.

Basically, when the metric becomes the goal, it will not reliably measure the underlying figures any more.

By [Archive] Florian Haas on Twitter: “I wrote something long-ish on metrics over the weekend. I’m pretty certain this won’t go unchallenged, as people tend to have strong opinions on this. 🙂 “.

Via [Archive] Kristian Köhntopp on Twitter: “In writing this, @xahteiwi had probably done more for the advancement of SRE as a practice than one hundred conference talks could do. Thanks for that.… “.

–jeroen

Posted in About, Agile, Development, LifeHacker, Personal, Power User, Software Development | Leave a Comment »

Kristian Köhntopp on Twitter: “Basically, show me a Python regex with \d and without ASCII flag, and I can show you a bug, often exploitable.… “

Posted by jpluimers on 2022/12/14

An interesting thought: [Archive] Kristian Köhntopp on Twitter: “Basically, show me a Python regex with \d and without ASCII flag, and I can show you a bug, often exploitable.… “

Basically, input parsing is still very much underrated by most systems and a constant source of peculiarities and therefore bugs, or phrased differently: [Archive] Kristian Köhntopp on Twitter: “In many cases an uncaught exception, and hence a component crash.… “

Kris also states [Archive] Kristian Köhntopp on Twitter: “Again, Python is not alone in this. Perl, when “use utf8;” is active (which it should) also does this, so every single fucking Regex needs a ‘/a‘ at the end. Nobody ever asked \d to match tengwar or klingon numeric symbols.… “.

The point is in the last few words as Arabic numerals are so white spread over the world that the ten digits 0, 1, 2, 3, 4, 5, 6, 7, 8 , 9 they represent should be the de facto \d pattern, but aren’t in Python as per [Wayback/Archive] re — Regular expression operations — Python 3.10.0 documentation: /d (emphasis mine):

Read the rest of this entry »

Posted in Development, Perl, Python, RegEx, Scripting, Software Development | Leave a Comment »