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

Archive for the ‘Software Development’ Category

Counting rows for all tables in Firebird

Posted by jpluimers on 2019/08/28

Sometimes you want to count data in all tables on a database to get a feel for the orders of magnitude, but you cannot use the approximated example in How to speed up Count(*) in Interbase/Firebird – Stack Overflow as those require primary keys.

Then the below script can help: it generates the right queries as a union all ordering by the count in the tables.

Example generated code on C:\Program Files (x86)\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB:

SQL
--------------------------------------------------------------------------------------------------
select 128 as id, 'COUNTRY' as name, count(*) from "COUNTRY" union all
select 129 as id, 'JOB' as name, count(*) from "JOB" union all
select 130 as id, 'DEPARTMENT' as name, count(*) from "DEPARTMENT" union all
select 131 as id, 'EMPLOYEE' as name, count(*) from "EMPLOYEE" union all
select 133 as id, 'PROJECT' as name, count(*) from "PROJECT" union all
select 134 as id, 'EMPLOYEE_PROJECT' as name, count(*) from "EMPLOYEE_PROJECT" union all
select 135 as id, 'PROJ_DEPT_BUDGET' as name, count(*) from "PROJ_DEPT_BUDGET" union all
select 136 as id, 'SALARY_HISTORY' as name, count(*) from "SALARY_HISTORY" union all
select 137 as id, 'CUSTOMER' as name, count(*) from "CUSTOMER" union all
select 138 as id, 'SALES' as name, count(*) from "SALES" order by 3

Example output on C:\Program Files (x86)\Firebird\Firebird_2_5\examples\empbuild\EMPLOYEE.FDB:

ID NAME COUNT
133 PROJECT 6
128 COUNTRY 14
137 CUSTOMER 15
130 DEPARTMENT 21
135 PROJ_DEPT_BUDGET 24
134 EMPLOYEE_PROJECT 28
129 JOB 31
138 SALES 33
131 EMPLOYEE 42
136 SALARY_HISTORY 49

The generation code below uses a few tricks:

The rank helps me distinguish the last row (for the order by 3 clause) and other rows (for the union all clauses).

Generation code:

with tables(id, name) as (
    -- http://www.firebirdfaq.org/faq376/
    select r.RDB$RELATION_ID as id, trim(r.RDB$RELATION_NAME) as name
    from RDB$RELATIONS r
    where 1=1
      and (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0)
      and r.RDB$VIEW_BLR is null
    order by 1
  ),
  ranked_tables(id, rank, name) as ( 
    -- http://www.firebirdfaq.org/faq343/
    select tables.ID, count(others.id)+1 as "rank", tables.NAME
    from tables
    left join tables others on others.ID < tables.ID
    group by "ID", "NAME"
    order by "rank"
  ),
  parts(id, rank, name, suffix) as (
    select ranked_tables.id, 
            ranked_tables.rank,
            ranked_tables.name,
      case
        when ranked_tables.rank = 1 then 'union all' -- first 
        when ranked_tables.rank = (select count(*) from tables) then 'order by 3' --last 
        else 'union all' -- middle
      end as suffix      
    from ranked_tables 
  ) 
select -- parts.id, parts.rank, parts.name, parts.suffix,
       'select '||parts.id||' as id, '''||parts.name||''' as name, count(*) from "'||parts.name||'" '||parts.suffix||'' as SQL
from parts
order by parts.id

–jeroen

Read the rest of this entry »

Posted in Database Development, Development, Firebird, Software Development, SQL | Leave a Comment »

« In practice, the uptime of systems that favor availability have not proven …

Posted by jpluimers on 2019/08/27

via [WayBack] « In practice, the uptime of systems that favor availability have not proven greater than what can be achieved with consistent systems. » Aua, der hat gesessen. – Kristian Köhntopp – Google+:

–jeroen

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

…short presentation at the Norway Delphi Club[1] meetup, covering some fun and interesting uses of the “new” language features introduce since Delphi7… – Asbjørn Heid – Google+

Posted by jpluimers on 2019/08/27

From [WayBack…short presentation at the Norway Delphi Club[1] meetup, covering some fun and interesting uses of the “new” language features introduce since Delphi7… – Asbjørn Heid – Google+

Yesterday I did a short presentation at the Norway Delphi Club[1] meetup, covering some fun and interesting uses of the “new” language features introduced after Delphi 7.

The main purpose of the talk was to try to be inspirational, and give a sense of what kind of stuff you can do with the language these days. So it’s not very in-depth, but rather tries to showcase several interesting features and tricks.

Anyway, in case it might be useful to others I thought I’d publish the slides and code here as well.

The examples are a nice introduction for when you want to dig deeper in the language itself, for instance when you are digging deeper into Spring4d.

Slides 35 and 36 – though hard for me to grasp initially – show a very nice concept called [WayBack] Partial Application (thanks Stefan Glienke for pointing me at this) by binding a parameter value plus parameter position to an existing function returning the bound function so it becomes easier to tall.

–jeroen

Read the rest of this entry »

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

How to Update All Your Ruby Gems At Once | Life, the Universe, and Everything

Posted by jpluimers on 2019/08/26

This looks smart

gem update `gem list | cut -d ' ' -f 1`

From: [WayBack] How to Update All Your Ruby Gems At Once | Life, the Universe, and Everything

Though on the bash prompt, it works fine on Mac OS X / OS X / macOS / …, it does not work nice as an alias.

You can get it to work with difficult escaping (or nesting).

But it is easier to escape this:

gem update $(gem list | cut -d ' ' -f 1)

Escaped, it comes down to:

alias "gem-update-all=gem update \$(gem list | cut -d ' ' -f 1)"

Based on:

–jeroen

Posted in Apple, bash, bash, Development, Mac OS X / OS X / MacOS, Power User, Scripting, Software Development | Leave a Comment »

Help:Links – MediaWiki

Posted by jpluimers on 2019/08/23

Since I needed to know how to formulate external hyperlinks on a Wiki page: [WayBack] Help:Links – MediaWiki.

Too many options, not even counting other sections on that page I did not quote, so I went for the first.

To create an external link, usually to a page at a different website, enclose the URL followed by space and the link text in single square brackets (see examples below). When you save or preview the page, you will see a link rendered slightly differently than an internal wikilink. It may be a different color and/or be followed by an arrow icon to show that it may lead to another site.

Description You type You get
External link with specified link text
[https://mediawiki.org MediaWiki]
MediaWiki
Numbered external link
[https://mediawiki.org]

This is what happens if you omit the link text. Multiple links of this type on the same page are numbered sequentially.

[1]
Bare external link
https://mediawiki.org

URLs beginning with “http://” and “https://” are automatically linked, even when no brackets are used.

https://mediawiki.org
Avoiding auto-linked URLs
<nowiki>https://mediawiki.org</nowiki>
https://mediawiki.org
Protocol-relativeexternal link
[//en.wikipedia.org Wikipedia]

[//en.wikipedia.org //en.wikipedia.org]

The link will be HTTP or HTTPS depending on the protocol of the page currently being viewed (which could be different for different users). This is only supported inside of square brackets [ ]. Using “//en.wikipedia.org” by itself does not result in a link.

Wikipedia

//en.wikipedia.org

External link to the current server
https://{{SERVERNAME}}/pagename
https://www.mediawiki.org/pagename
External link to other host passing the pagename
https://google.com/search?q={{PAGENAMEE}}

See also: URL encoded page namesPAGENAMEE encoding

https://google.com/search?q=Links
Mailto link
[mailto:info@example.org email me]
email me
Mailto named with subject line and body
[mailto:info@example.org?Subject=URL%20Encoded%20Subject&body=Body%20Text info]
info
Custom URI
[skype:echo123 call me]

Any URI you wish to add needs to be first declared through $wgUrlProtocols. (This example is not enabled on Mediawiki.org)

[skype:echo123 call me]
External links with file-type icons
[https://en.wikipedia.org/wiki/.avi video]

[https://en.wikipedia.org/wiki/.ogg sound]

[https://en.wikipedia.org/wiki/.pdf document]

See External link icons for currently supported icons and extensions. Note that this wiki is not set up to use such icons.

video

sound

document

–jeroen.

Posted in Development, Lightweight markup language, MediaWiki, Power User | Leave a Comment »

Delphi Ensuring Left/alLeft or Top/alTop controls are positioned in the right order…

Posted by jpluimers on 2019/08/22

The post [WayBack] Why is my buttons not created in logical order? If I run this, my buttons area created ACB rather than ABC as I expected… – Johan Swart – Google+ reminded me the trouble of Delphi VCL and FMX have with alignment.

Basically you have to position your control away from your intended alignment position in order for it to work. So this fails:

procedure TForm1.FormCreate(Sender: TObject);
var
  myToolBar: TToolBar;
  myCornerButton: TCornerButton;
  i: Integer;
begin
  myToolBar := TToolbar.Create(Self);
  myToolBar.Parent := Self;

  for i := 0 to 2 do
  begin
    myCornerButton := TCornerButton.Create(tbarGrid);
    myCornerButton.Parent := myToolBar;
    myCornerButton.Align := TAlignLayout.Left;
    myCornerButton.Text := Chr(65 + I);
  end;
end;

Basically you have to set myCornerButton.Left to 1 before setting the Align property.

Similar for the Top property and TAlignLayout.Top value.

The same holds for VCL Align values alLeft with setting the Left property and alTop with setting the Top property before setting Align.

See these for the actual properties and types:

See also this question: [WayBack] Delphi: How to programmatically adjust visual ordering of components with align = alTop

–jeroen

Posted in Delphi, Development, Software Development | 1 Comment »

Mapping Ecosystems of Software Development – Stack Overflow Blog

Posted by jpluimers on 2019/08/22

On the data team here at Stack Overflow, we spend a lot of time and energy thinking about tech ecosystems and how technologies are related to each other. We use these kinds of relationships all over the place, from making the user experience of everyone coming to Stack Overflow better by suggesting relevant content to helping our clients understand how to hire developers. One way to get at this idea of relationships between technologies is tag correlations. Correlation between tags measures how often tags appear together relative to how often they appear separately. You can check out one of the chapters of my book (written with fellow Stack Overflow data scientist Dave Robinson) for more detailed discussion of this.

Must read: [WayBackMapping Ecosystems of Software Development – Stack Overflow Blog

Via: [WayBack] Mapping Ecosystems of Software Development – Stack Overflow Blog  – ThisIsWhyICode – Google+

–jeroen

Read the rest of this entry »

Posted in Development, Software Development | Leave a Comment »

Delphi built-in data types and their memory sizes

Posted by jpluimers on 2019/08/21

Though 64-bit support was released back in 2011 with Delphi XE2, sometimes I forget which data type are native size and which keep their size no matter the compiler bitness (wiktionary/wikipedia).

This post was motivated by via [WayBack] Having started with Delphi before the Cardinal type was available (Or has it always? I can’t remember.) I routinely declare 32 bit unsigned variables as… – Thomas Mueller (dummzeuch) – Google+

The most simple distinction is between Win32 and Win64, but there are more non-32 bit platforms, so these do not suffice any more:

The easiest for me are the below tables that only got introduced with Delphi 10.2 Tokyo: [WayBack] Delphi Data Types for API Integration – RAD Studio.

I have bolded the ones that change size.

Read the rest of this entry »

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

Delphi generic nested classes

Posted by jpluimers on 2019/08/21

Reminder to Self: do not nest T generic types as you’re in for a surprise.

Source: [WayBackDelphi generic nested classes

Via: [WayBack] An interesting question over on SO relating to nested generic classes… – David Heffernan – Google+

The surprise:


type
TClassC<T> = class
private
type
TClassD<T> = class
private
x: T;
end;
end;
var
obj: TClassC<Integer>.TClassD<string>;

what type would you expect obj.x to be? Integer or string?

The compiler hint:

[dcc32 Hint]: H2509 Identifier 'T' conflicts with type parameters of container type

–jeroen

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

Turbo Pascal 7 compatible compiler for 8051 microcontrollers…

Posted by jpluimers on 2019/08/21

I had seen this before, but was glad about the reminder to put it in my blog: [WayBack] OMG, there is Turbo Pascal 7 compatible compiler for 8051 microcontrollers! http://turbo51.com – Primož Gabrijelčič – Google+:

[WayBack] turbo51.com: Full-featured free Pascal compiler for 8051 microcontrollers, Borland Turbo Pascal 7 syntax, multi-pass optimizer, generates bin, hex, OMF-51 and asm source.

Program Turbo51;
 
Uses FastCompiler, AdvancedOptimizations, SmartLinker, AseemblerFileGenerator;
 
//  Turbo51 is released as freeware. You can download it and use it for FREE.
//  However, if you like Turbo51 you can donate some small amount via PayPal.
//  Donations are a great way to show your appreciation for my software.
 
begin
  InstallAndConfigure;
  Repeat
    CreateProject;
    CompileProject;
    TestProject;
    While ThereIsAProblem do
    begin
      CheckCode;
      CheckDocumentation;
      TryAgain;
      Case ProblemSolved of
        True: Break;
        else  AskForHelp;
      end;
    end;
    If InstalledVersion < '0.1.3.17' then Update;
    If Satisfied then Donate ($20);
  until NoMoreProjects;
end.
a

–jeroen

Posted in Development, History, Pascal, Software Development, Turbo Pascal | Leave a Comment »