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

HashLib4Pascal is a Delphi/FPC compatible library that provides an easy to use interface for computing hashes and checksums of strings (with a specified encoding), files, streams, byte arrays and untyped data to mention but a few.

Posted by jpluimers on 2017/02/15

One day I will need lots of hashing in Delphi: Xor-el/HashLib4Pascal: HashLib4Pascal is a Delphi/FPC compatible library that provides an easy to use interface for computing hashes and checksums of strings (with a specified encoding), files, streams, byte arrays and untyped data to mention but a few. [WayBack]

via: Hello all,I made a port of “HashLib” (http://hashlib.codeplex.com/) “with some fixes, additions and modifications” for Delphi (2010 ( I hope ) and above)… – Ugochukwu Mmaduekwe – Google+ [WayBack]

It’s a port of the C# HashLib – Home [WayBack]

Another fork is at https://github.com/bonesoul/HashLib

–jeroen

Posted in .NET, C#, Delphi, Delphi 10 Seattle, Delphi 10.1 Berlin (BigBen), Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE8, Development, Encoding, FreePascal, Pascal, Software Development | Leave a Comment »

Firebird – adjusting Delphi stored TDateTime (or OLE Automation date) fields that contain Dates, Times or DateTimes

Posted by jpluimers on 2017/02/15

Delphi programmers often store TDateTime (be it date, time or date+time values) as floating points in the database. They take the easy way out basically because TDateTime is nothing but a typed alias for the Delphi Double type (which is equivalent to the IEEE 754 double-precision binary floating-point format: binary64 type) .

Actually, TDateTime is equivalent to the OLE Automation date (which is described in the remarks of  DateTime.ToOADate Method (System)) which has an epoch of  midnight at 1899-12-30 (to be compatible with Lotus-123 including its leap-year-bug, background on that is at Why are the Microsoft Office file formats so complicated? (And some workarounds) – Joel on Software).

Anyway: the definition is this:

An OLE Automation date is implemented as a floating-point number whose integral component is the number of days before or after midnight, 30 December 1899, and whose fractional component represents the time on that day divided by 24. For example, midnight, 31 December 1899 is represented by 1.0; 6 A.M., 1 January 1900 is represented by 2.25; midnight, 29 December 1899 is represented by -1.0; and 6 A.M., 29 December 1899 is represented by -1.25.

The base OLE Automation Date is midnight, 30 December 1899. The minimum OLE Automation date is midnight, 1 January 0100. The maximum OLE Automation Date is the same as DateTime.MaxValue, the last moment of 31 December 9999.

The sample values are remarkably the same as the ones for TDateTime:

Value Description
0 December 30, 1899; 12:00 A.M.
2.75 January 1, 1900; 6:00 P.M.
-1.25 December 29, 1899; 6:00 A.M.
35065 January 1, 1996; 12:00 A.M.

The below SQL example uses the Firebird date/time/timestamp casting shortcuts:

select date      '1899-12-30'              + 42452.670590278 as Date20160323,
       timestamp '1899-12-30 00:00:00.000' + 42452.670590278 as DateTime20160323160539,
       time       '00:00:00'                + 60*60*24 * 0.5 as Noon,
       timestamp '1899-12-30 00:00:00.000' + 0          as DateTime18991230Midnight,
       timestamp '1899-12-30 00:00:00.000' + 2.75           as DateTime190001011800,
       timestamp '1899-12-30 00:00:00.000' + -1.25          as DateTime189912290600,
       timestamp '1899-12-30 00:00:00.000' + 35065          as DateTime19960101Midnight
from   rdb$database

Which – using DMY date format and 24 hour clock format settings – results in:

DATE20160323 DATETIME20160323160539 NOON       DATETIME18991230MIDNIGHT DATETIME190001011800 DATETIME189912290600 DATETIME19960101MIDNIGHT CONSTANT
---------------------------------------------------------------------------------------------------------------------------------------------------
24-3-2016    23-3-2016 16:05:39     12:00:00   30-12-1899               1-1-1900 18:00:00    28-12-1899 18:00:00  1-1-1996

Which basically taught me a new thing about firebird: Times are calculated in seconds, so date fractions need to be multiplied by 60 * 60 * 24.

You can see this in the following query and results:

select (cast('Now' as time) - cast('00:00:00.000' as time)) / (24 * 60 * 60) as DelphiTime,
        cast('Now' as time) - cast('00:00:00.000' as time) as SecondsSinceMidnight,
        cast('Now' as date) - cast('1899-12-30' as date) as DelphiDate,
        cast('Now' as timestamp) - cast('1899-12-30 00:00:00.000' as timestamp) as DelphiDateTime,
        24 * 60 * 60 as SecondsPerDay,
        cast('Now' as date) as "Date",
        cast('Now' as time) as "Time",
        cast('Now' as timestamp) as "TimeStamp"
from rdb$database
DELPHITIME           SECONDSSINCEMIDNIGHT DELPHIDATE  DELPHIDATETIME       SECONDSPERDAY        Date       Time         TimeStamp          
------------------------------------------------------------------------------------------------------------------------------------------------
0,4366               37722,284            42835       42835,436600509      86400                10-4-2017  10:28:42     10-4-2017 10:28:42      

Note this post is complementary to Date format converter from Text or Unix/Mac/Filetime/Microsoft to virtually any readable form (which mentions the wrong Microsoft epoch as it should be 1899-12-30 midnight): the above shows how to do the conversion to readable dates in Firebird (might work in InterBase as well, but I’ve not used that for a long time).

–jeroen

PS: for Microsoft SQL Server: passing dates to the sql server: pass it as float – 2. -2 is the difference between delphi tdatetime start date and mssql start date.

 

Posted in Algorithms, Database Development, Development, Firebird, Floating point handling, Software Development | 2 Comments »

MahdiSafsafi/delphi-detours-library: Delphi Detours Library

Posted by jpluimers on 2017/02/14

I didn’t know about the MahdiSafsafi/delphi-detours-library: Delphi Detours Library [WayBack] until this question turned up:

Does anybody have a version of Delphi Detours (https://github.com/MahdiSafsafi/delphi-detours-library) that works with Delphi 2007?  – Primož Gabrijelčič – Google+ [WayBack]

No need for it yet, but it will be useful one day.

–jeroen

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

How to speed up Count(*) in InterBase/Firebird – Stack Overflow

Posted by jpluimers on 2017/02/14

The drawback of how the multigenerational architecture is implemented:

Even when an index is available on the column or columns included in the COUNT, all records must be visited in order to see if they are visible under the current transaction isolation.

The benefits of the MGA (multi-generational architecture) having far less locking than other architectures means you need to be careful using the COUNT operator on large result-sets.

In many systems the exact result of a COUNT isn’t very important, so you can use the workaround referred from How to speed up Count(*) in Interbase/Firebird – Stack Overflow

See also:

–jeroen

via: Select count(*) is slow

Posted in Database Development, Development, Firebird, InterBase | Leave a Comment »

Want for birthday or X-mas: “The Lamp” and “BBS: The documentary”

Posted by jpluimers on 2017/02/13

Via KansasFest 2009 Keynote with Jason Scott | KansasFest [WayBack] I bumped into these documentaries by Jason Scott Sadofsky:

The BBS Documentary DVDs are No Longer for Sale [WayBack] though “There will be digital copies sold in the future!” and there is “BBS The.Documentary Part 1 – Baud – YouTube”

There are upcoming documentaries as well, including one on the 6502.

–jeroen

Posted in 6502, History | Leave a Comment »

GSM/3G/4G/LTE/… enable or disable caller ID when calling

Posted by jpluimers on 2017/02/13

When testing the setup of a Fritz!Box 7490 with fiber connection, routing anonymous/withheld ISDN calls to a new answering machine I needed to test if only Caller ID calls were getting through.

The easiest was to do this from my mobile phone.

Izzy explained how to in callerid – How can I make anonymous calls for everyone but contact list? – Android Enthusiasts Stack Exchange.

Basically all cellular networks based on GSM or derived technologies allow you to prefix any phone numbers with:

–jeroen

Posted in Cellular telephony, ISDN, LifeHacker, Power User, PSTN, Telephony | Leave a Comment »

Gitkraken – free and commercial edition to raise funds for diabetes

Posted by jpluimers on 2017/02/10

This is a good idea. This software company has a free and commercial edition of their product. The paid version helps to raise funds for Diabetes… – Warren Postma – Google+

I didn’t know about this. When SourceTree doesn’t improve, I might try it one day.

–jeroen

Posted in Development, DVCS - Distributed Version Control, git, GitKraven, Mercurial/Hg, Source Code Management, SourceTree | 1 Comment »

Managing WIFI connections using the Mac OSX…

Posted by jpluimers on 2017/02/10

These links:

Made me add this to my ~/.bash_profile:

Read the rest of this entry »

Posted in Apple, Mac, Mac OS X / OS X / MacOS, Mac OS X 10.6 Snow Leopard, MacBook, MacBook Retina, MacBook-Air, MacBook-Pro, MacMini, OS X 10.10 Yosemite, OS X 10.9 Mavericks, Power User | Leave a Comment »

The 2017 web is bloated and slow, and I am guilty, too. – The Isoblog – website speed tests

Posted by jpluimers on 2017/02/10

[WayBackThe 2017 web is bloated and slow, and I am guilty, too. – The Isoblog.

My site on 2G: load time 60 seconds: [Archive.isWebPagetest Test Result – Dulles : wiert.me – 02/09/17 21:45:23

–jeroen

For Player-FM:

https://plus.google.com/+JeroenPluimers/posts/ASnejgv5M9r

 

 

Posted in Blogging, Power User, SocialMedia | Leave a Comment »

RDP Clipboard Fix – via Remko Weijnen’s Blog (Remko’s Blog)

Posted by jpluimers on 2017/02/09

RDP Clipboard Fix is the client-side fix for loosing your RDP clipboard (server side fix is killing the RDPClip process). Since his site is not archived but some of the links have 404’s, here is the full article with fixed WayBack links:

Did you ever loose Clipboard functionality (copy/paste) while working with several Terminal Server sessions? I think everyone that works a lot with Terminal Server has experienced this from time to time.

It’s caused by badly behaving applications. Dimitry Vostokov wrote a tool to fix this issue for Citrix (RepairCBDChain.exe), he explains the issue very well on his blog:

Windows has a mechanism to notify applications about clipboard changes. An application interested in such notifications has to register itself in the so called clipboard chain. Windows inserts it on top of that chain and that application is responsible to propagate changes down the chain:

rc1.JPG

If 3rd-party application forgets to forward notifications down then we have a broken clipboard chain and clipboard changes are not sent via ICA protocol:

Read more at Dimitry’s Blog: http://web.archive.org/web/20071019060125/http://citrite.org/blogs/dmitryv/2006/12/09/clipboard-issues-explained/

So how can we fix this for Terminal Server then?

MSTSC creates a hidden window with Window Class RdpClipRdrWindowClass, you can observe this with a Window Spy tool such as X-Spy

Clipboard Redirector Window

If we look at the Window Style we can see the Window is hidden (doesn’t contain WS_VISIBLE):

Window Style

So we just need to find all windows with this Windows Class and subscribe them to Clipboard Notifications.

The code is simple:

function EnumWindowsProc(hHwnd: HWND; Param:Integer): boolean; stdcall; 
var ClassName: String; 
begin 
  SetLength(ClassName, 255); 
  SetLength(ClassName, GetClassName(hHWnd, PChar(ClassName), 255));        
 
  if ClassName = 'RdpClipRdrWindowClass' then 
  begin 
    // This is uses to restore the clipboard functionality 
    SetClipboardViewer(hHWND); 
  end; 
  Result := True; 
end;

Using EnumWindows instead of FindWindow (as RepairCBDChain seems to do) has the advantage that it finds multiple windows (when you have multiple sessions) and not just the first.

You can download the compiled version below. If you like it why not leave a comment?

Screenshot RDPFixClip

RDP Clipboard Fix (12076) – RDPFixClip.zip

See here for more Terminal Server related articles:http://remkoweijnen.nl/blog/topics/terminalserver/

There’s an explanation of this issue at the Microsoft Terminal Services team blog too:
http://blogs.msdn.com/ts/archive/2006/11/16/why-does-my-shared-clipboard-not-work-part-1.aspx
http://blogs.msdn.com/ts/archive/2006/11/20/why-does-my-shared-clipboard-not-work-part-2.aspx

–jeroen

Source: RDP Clipboard Fix | Remko Weijnen’s Blog (Remko’s Blog)

Posted in Clipboard, Development, Power User, Software Development | 1 Comment »