Monday, August 14, 2017

Delphi programs have too many false positive detections

Most of my Delphi programs are flagged as virus by some antivirus programs. Some of these antivirus programs are really cheap/under-the-table products (such as Baidu and Comodo) other are big (TOP) name like Kaspersky.

In theory you should report a false positive to the antivirus producers so they can fix their bug but if the list is too long and you are lazy here is what you can do to decrease the number of false positive reports:
  • Don't turn on "compiler optimizations" when you release your app. It seems that more false alarms are triggered when this is turned on in the project.
  • If you MUST turn one the "compiler optimizations" you can pack your exe with UPX. This should shut up most antiviruses as they don't know to look inside the UPX
  • If you use WinRar, downgrade to v3.11 as this version does not give false positives (only one out of 64).

Tuesday, March 21, 2017

How to configure EurekaLog to send bugs via email

Email sender settings in EurekaLog v7

SMTP Server [1] SMTP client [3] Simple MAPI MAPI Shell (MailTo)

Can attach the ELP file Yes Yes Yes [2] Yes [2] No
See sender's email No [4] No Yes Yes Yes
Email client software* Not required Not required Required Required Required
Chance of success This has the highest chances among all e-mail based methods

Has HIGH chance to succeed IF user has email client installed WinMail and Outlook only

Can tell if the email was successfully sent? Yes? Yes Yes? Yes No

1 - Many antivirus products will flag your EXE as virus

2 - if "Append bug report text in the message text" is UNCHECKED

3 -
Typically, you should use either SMTP server or SMTP client, but not both methods simultaneously.
Bugged in EurekaLog v7.4.8.0 RC 1 - Error code = -2146885613 - The revocation function was unable to check revocation because the revocation server was offline. Maybe because: “Currently EurekaLog supports AUTH LOGIN and AUTH PLAIN authentication methods”?

4 - could be enabled via SetUserEMail function)
* If required: Email client must be installed and properly reconfigured. User must to click on "Send" in their e-mail clients. Automatic send without user actions is not possible. 


Please note that EurekaLog v7 is also plagued with several serious bugs! I contacted the producer but he didn't bother to reply until now.

Wednesday, March 15, 2017

Another bug in EurekaLog 7

I wanted to send an email ("Send via SMTP client") from EurekaLog v7.4.8.0 RC 1 but I was getting this error:

FAILED: Error code = -2146885613
The revocation function was unable to check revocation because the revocation server was offline
EurekaLog RC 1
Testing send with TELMailSMTPClientSender

My email is hosted by BlueHost but knowing how buggy EurekaLog is and considering the fact that all my accounts work flawlessly in Thunderbird I think the bug is not related to the BlueHost server.

I had to give up using "SMTP client" and user "SMTP server" instead.


Tuesday, January 3, 2017

Total Commander - the ultimate file manager for Windows (and recently for Android too)

Total Commander (aka Windows Commander) is the ultimate file manager for Windows (and recently for Android too).

Who can use it?
The regular Windows user that used all his life Windows Explorer will find Total Commander interface AT LEAST awkward. The interface concept and user experience is totally different in Total Commander. This doesn’t mean that Total Commander is bad or poorly design or difficult to learn. It is just different than Windows Explorer.
The regular user will require a day or two to accommodate with the concept ( experienced users will have no problem to gasp the new concept) but the efficiency improvement totally worth it. I am a Total Commander use since 1998 and I never ever (literally) used Windows Explorer again.

The concept
Total Commander solves an old design flaw of Windows Explorer. So old that regular computer user won’t even observe it anymore.
Many operations that you perform on files involve copying or moving files from one place (folder) to another. This is where Windows Explorer design fails: you work on two folders, the folder from where you copy the file (source) and the folder where you copy the file (destination), but Windows Explorer has one single panel. The Microsoft solution is to browse and open both folders and carefully drag and drop the files from source to destination. I say carefully because it is easy to ‘un-carefully’ drop the files in the wrong folder. Obviously there are also other methods but they are even more time consuming than this one. And when you close the Explorer all that work invested into locating your folders is gone. You have to start all over.
For a person that performs 1-2 file operations per day it is not a big deal, but for an intermediate user or a POWER user this is time consuming and error prone.
And, here is the time and place where you install Total Commander. Total Commander brings the concept of two parallel panels: it always shows on screen the source folder AND the destination folder. Now all you have to do is to drag and drop the files from one pane to the other (advanced users can user F5 and F6 keys for copy/paste).
Total Commander will remember the last used folders and ALSO the recent folders you navigated through. So, if you worked on a folder few hours ago and you want to return to that folder, you don’t have to browse the entire folder structure to locate it again. Using the History (Alt+DownArrow) you are back there with just one click.

The magic never stops
Total Commander has literary hundreds of features that are not present in Windows Explorer: FTP, compression support, fully customizable toolbar (that totally replaces the Start menu), CRC control, Mime encoding, advanced multi rename tool, advanced search tool, support for plugins (there are also thousands of plugins for Total Commander), thumbnail view, quick view, color coded file types, etc, etc, etc.
One of the useful functions we will investigate now is the File Queue. With this function you can Queue a long list of file operations for later execution and….

Disclaimer: I have no affiliation with Total Commander, except my affection for it :)

Tuesday, September 20, 2016

The best and most reliable 3GB hard drive

I need a 3GB internal harddrive. Looking through statistic data from BackBlaze, it seems that Seagate is the worst solution because of it HUGE failure rate. Yes the prices are good for this drive but you don't want a cheap drive that will fail after 2 years. Right?
The next brand with high failure rate is Western Digital.
Both Seagate and WesternDigital drive have price in the 100 euros range.
Toshiba has a much better failure rate. But the winner is HGST. It has a significant higher price (126 euro) but totally worth it.

Friday, August 19, 2016

Top Windows, HTML 5, WYSIWYG HTML editors

Do you need a free web editor that supports HML5? I needed one and I really had to waste some time to review some. Here are the conclusions (and the conclusions only). NOTE: See the 2017 update at the end of the post!

Price:  Free or 70 euros:
Comment: Seems robust and mature

Discontinued may 2013, but still online
Price: free
Kit size: 86MB
Conclusion: Difficult to Install. Needs Java 6!

Price: free     2014
It only has a web page editor (not web site builder)

Conclusion: Nice but way too expensive!

Microsoft Expression 2012

openElement  2014
Kits size: 47MB
oXygenXML Editor 2015
Conclusion: not tested yet  

TOWeb  2013
Conclusion: not tested yet  

WebStorm IDE
Conclusion: not tested yet 

Based on:


Stormy Website Builder is the ultimate tool for building a web site (CMS). It has a beautiful WYSIWYG html editor. You can have a site up an running in only 4 minutes.
Stormy Website Builder wants to be a lightweight alternative for Joomla CMS.

Tuesday, August 16, 2016

Saturday, August 6, 2016

Embarcadero finally decided to fix SOME bugs in Delphi

In the new road map, Embarcadero finally decided to fix SOME bugs in Delphi.

It seems good news but hold your horses:
1. They not always keep their promise related to the road map.
2. There are not so many bugs
3. They won't do all the fixes at once, but until 2018
4. Until 2018 another 500 new bugs (AT LEAST) will be introduced
5. We have to pay (not 59 bucks but HARD money) to get that non-buggy version of Delphi.

And in the end, what the fuck are we so happy that Embarcadero is fixing some bugs? Is not a present, a gift from heavens! Those bugs SHOULD NOT BE THERE anyway!

So, thank you Embarcadero for finally thinking to fix some bugs and FUCK YOU.

PS: In the next road map maybe you will introduce an item likes "free updates".

Monday, August 1, 2016

Computer Virus that infects real-world DNA?

A computer code that is supposed to be able to infect DNA was found.
The corresponding article posted ~2.5 years, and some c++ codes.
 The computer code, written in C++, hosts the DNA sequence of M.mycoides
 JCVI-syn1.0. At runtime it acts as follows:

 1) Preparing the DNA sequence of M.mycoides JCVI-syn1.0 in the memory,
    (with slightly modified watermarks).
 2) Encoding own file-content in base32. The base32 code is then encoded in
    JCVI's DNA-encoded alphabet.
 3) This representation of its digital form is then copied to a
    watermark of the bacteria's genome in memory. With this, a fully
    functional bacterial DNA sequence including the digital code is
 4) Next it searches for FASTA-files on the computer, which are text-based
    representations of DNA sequences, commonly used by many DNA sequence
 5) For each FASTA-file, it replaces the original DNA with the bacterial
    DNA containing the digital form of the computer code.

 The code has a classical self-replication mechanism as well, to eventually
 end up on a computer in a microbiology-laboratory with the ability of
 creating DNA out of digital genomes (such as laboratories by the JCVI).
So could there really be a computer virus that infects DNA?
Virus code is here:


It is NOT impossible for a computer virus to infect real DNA because 'artificial' life was already created from synthetic DNA by Craig Institute. Proof. That synthetic DNA coming from files that were generated in a computer. So, if the virus happens to be in the right computer, at the right time... But the chance is small.
However, in the next 10 years, that virus might be a real problem as every year it is more and more easy to create 'artificial' life.


I have found this comment in the C++ code:
// Encode own file into Craig Venter's DNA encoding language
It looks like this virus was designed expressly for Craig Venter! So the chances for this virus to work (affect real-world DNA) are even more realistic!!

Validity of the code

Less experienced people doubt the validity of the code. However, no proof was brought to demonstrate that the code might fail (and why). Though, I haven't spend hours to read the code line by line and thoroughly analyze it, I did pick a look at it and it seem sound and valid. The fact that the author of the code targets a very specific organization (that "happens" to generate DNA from computer files) tells us that he knows what he is doing.


As somebody already brought to our attention, there is no purpose in creating this virus. But this is totally irrelevant to the original question. Even if the DNA virus will destroy the host cell and even if it won't be able to replicate in real world (and it won't) it is irrelevant. If in the right computer, the computer virus will pass from the virtual world to the real world, and this is OP's question (I think).


The question asked was: "can a computer virus could infect DNA"?. The question is ambiguous. If it refers to the DNA of some living cell the answer is no. HOWEVER, if the question refers to a human-created cell, the answer is YES. Craing Venter creates DNA from computer ('fasta') files. If one of those files happens to be modified or 'infected' by the computer virus then the computer virus will have effect in real world (the DNA synthesized by Venter will contain the code injected by the computer virus).

Friday, April 29, 2016

Is (Embarcadero) Delphi's code optimized for speed? No? Here is how to optimize string speed

The short answer is a big NO!

No the long answer:
Today I needed a function that will wrap a string (a contiguous block of characters with no spaces) after 80 characters. Not only that I have found SysUtils.WrapText unsuitable (it can only wrap text IF the text contains spaces) but it is also terrible slow.

So I build my own function:

function WrapString(CONST s: string; RowLength: integer): string;
VAR i, Row: Integer;
 Row:= 0;
 Result:= '';
 for i:= 1 TO Length(s) DO
   Result:= Result+ s[i];
   if Row >= RowLength then
     Result:= Result+ CRLF; 

     Row:= 0;

Works nice but is is also slow. If you look into the code the problem is Result:= Result+ CRLF . It involves too many memory allocations.

Solution. The solution is to pre-allocate space for the result.
For this I created a new class TCStringBuilder:

 TCStringBuilder = class(TObject)
   s: string;
   CurBuffLen, BuffPos: Integer;
   BuffSize: Integer;
   constructor Create(aBuffSize: Integer= 10*Kb);
   procedure AddChar(Ch: Char);
   procedure AddEnter;

   function  AsText: string;
   procedure Clear;


constructor TCStringBuilder.Create(aBuffSize: Integer= 10*Kb);
 BuffSize:= aBuffSize;

procedure TCStringBuilder.Clear;
 BuffPos:= 1;
 CurBuffLen:= 0;
 s:= '';

function TCStringBuilder.AsText: string;
 SetLength(s, BuffPos-1);                    { Cut down the prealocated buffer that we haven't used }
 Result:= s;

procedure TCStringBuilder.AddChar(Ch: Char);
 if BuffPos > CurBuffLen then
   SetLength(s, CurBuffLen+ BuffSize);
   CurBuffLen:= Length(s)

 s[BuffPos]:= Ch;

procedure TCStringBuilder.AddEnter;
 if BuffPos+1 > CurBuffLen then    { +1 because we enter two characters into the string instead of 1 }
   SetLength(s, CurBuffLen+ BuffSize);
   CurBuffLen:= Length(s)

 s[BuffPos  ]:= CR;
 s[BuffPos+1]:= LF;
 Inc(BuffPos, 2);

Speed test:
  • 500x loop
  • test file: TesterForm.pas 2.7K
  • wrap after 20 chars
Speed test results:
  •   484ms  SysUtils.WrapText - unbuffered
  •   5788ms WrapString        - unbuffered (Result:= Result+ s[i])
  •   31ms   WrapString        - buffered (using cStrBuilder)

I used a buffer of 10K. but the ideal buffer size would be the size of the input text plus 3%.

Please let me know if you can further improve this. Enjoy.


Further reading:

Wednesday, April 20, 2016

Animated desktop wallpaper

BioniX Wallpaper Animator v3 is ready for download. That is great about this new version is that it is (should be) able to paint the animation UNDER desktop icons.

However, since we cannot test it on all Windows operating systems we need some help. If you can run it on any of the following systems please let us know the results.

Download link: Desktop Wallpaper

Win 98 Win 2K Win Me Win XP Win Vista Win 7 Aero Win 7 Aero disabled Win 8 Win 10
? ? ? ? ? OI ? (should work) ? UI

   UI = under icons
   OI = over icons
    ?  = unknown (not tested)


Plans for the next version:
  • Support for AVI files
  • Lower memory footprint

Friday, April 8, 2016

Three software programs that [used to] plague our computers: Acrobat, Java, Flash

There used to be three programs that really made our computer miserable. They were slow, bloated, intrusive and a  lot of security holes opened with them when you installed.

Java - Probably Java is the nastiest of all

Until few years ago you could not browse some web sites because some derailed 'web developers' decided to put some 'cool' animations and menus on their web site that required Java, forcing YOU to install Java, this way.
Now, Java is a really intrusive mammoth that starts at computer start up, installs background services, make your browser literary crawl eating A LOT of memory and keep wasting your Internet bandwidth by checking and downloading updates. And boy, Java needs updates because every 3-4 days a MAJOR security hole was discovered! And every security hole in Java is a security hole in YOUR computer.

ACTUALLY, Java is so dangerous for your computer that "The U.S. Department of Homeland Security is advising people to temporarily disable the Java software on their computers to avoid potential attacks"
It is so bad that Firefox won't even let you activate it.

I uninstalled Java maaaaany years ago from my computer and I vehemently refuse to install it. Not a single time! And many others like me have forced the web designer community not to use Java on their web site. Now probably less than 1 in 5000 web sites still have Java. So, you miss it a bit.

Acrobat Reader - Big deal for nothing

Adobe Acrobat Reader is basically a notepad. Its task should be to open a PDF file and show it on screen. It does this in such a bombastic way that 3 minutes later after Acrobat, but it is still crunching data, you forgot why you wanted to open that PDF anyway.

Same bubonic 'features' as Java: eats up lots or memory and disk space, invades you with background services, system tray icons and installs itself to run at computer start up.
Security wholes? Plenty.

Alternatives: Foxit PDF (once a decent and fast PDF viewer, now starting to step on exactly the same sick path as Acrobat Reader), Sumatra PDF. More about these Acrobat Reader alternatives.

And something else: Next time somebody sends you a PDF send him an email back and say "I politely request to send me the document as DOC or RTF. They are as good as PDF" then optionally sign: "Fuck you and best regards retard".

Adobe Flash Player

The Flash Player literary built and shaped the web as we know it. And this is not the web should be.
Firefox will also deactivate the Flash plugin when a MAJOR security whole is discovered. And boy, coming from Adobe, there are lots of those!
Flash is so wrong in every possible way: difficult to program, terribly slow (and I mean it), bulky and unsafe. But Adobe really pushed money into it so they managed to shovel it down to our throats. 

Alternatives: HTML5 - After all those years, the web community is finally coming to its senses trying to replace Flash with HTML 5, a major update of (too) old HTML. This change should have been done 25 years ago (which on Internet time-scale means 2 eons ago).

Most web sites already abandoned Flash and switched to HTML 5. So, it is not the time to turn off the Flash plugin in your browser and finally take a fresh breath of Flash-free Internet.

Also see "Flash is dying a death by 1,000 cuts, and that's a good thing" by TheGuardia.

Saturday, March 12, 2016

List of microcontrollers that can be programmed in Pascal (and Pascal-like) language

By micro-controller


Cortex-M3 and M4 ARM LPC - 39euro on Amazon
Oberon     Astrobe  (Windows)   

Turbo51 (Windows)

PascalLite - unspecified price

Pic 10 to Pic 18 
Pic Micro Pascal

MicroPascal Pro

XMEGA/XTINY from Atmel
MicroPascal Pro

Raspberry Pi projects (ARM v6/ARM11)


By language

Pascal-scm for Atml
Amtel AVR(Arduino)


mikroPascal Pro 
Supported micro-controllers:
Pin Count
Memory (KB)
CPU Speed
AT90PWM161 20 16 16 1
ATMEGA3250A 100 32 20 2
ATMEGA325PA 64 32 20 2
ATMEGA6450P 100 64 20 4
ATMEGA6490P 100 64 20 4
ATTINY441 14 4 16 0.25
ATTINY841 14 4 16 0.25
ATXMEGA16E5 32 16 32 2
ATXMEGA32D3 64 32 32 4
ATXMEGA8E5 32 8 32 1
ATMEGA168PB 32 16 20 1
ATMEGA3250PA 100 32 20 2
ATMEGA3290A 100 32 20 2
ATMEGA645P 64 64 16 4
ATTINY1634 20 16 12 1
ATTINY828 32 8 20 0.5
ATTINY84A 14 8 20 0.5
ATXMEGA32C3 64 32 32 4
ATXMEGA32E5 32 32 32 4
AT90CAN128 64 128 16 4
AT90CAN32 64 32 16 2
AT90CAN64 64 64 16 4
AT90PWM1 24/32 8 16 0.5
AT90PWM2 24 8 16 0.5
AT90PWM2B 24 8 16 0.5
AT90PWM216 24 16 16 1
AT90PWM216 24 16 16 1
AT90PWM3 32 8 16 0.5
AT90PWM3B 32 8 16 0.5
AT90PWM316 32 16 16 1
AT90PWM81 20/32 8 16 0.25
AT90S2313 20 2 20 0.12
AT90S2323 20 2 20 0.12
AT90S2343 20 2 20 0.12
AT90S4414 40 8 16 0.5
AT90S4433 28 4 8 0.12
AT90S4434 40/44 8 16 0.5
AT90S8515 40 8 8 0.5
AT90S8535 40/44 8 16 0.5
AT90USB1286 64 128 16 8
AT90USB1287 64 128 16 8
AT90USB162 32 16 16 0.5
AT90USB646 64 64 16 4
AT90USB647 64 64 16 4
AT90USB82 32 8 16 0.5
ATmega103 64 128 6 4
ATmega128 64 128 16 4
ATmega1280 100 128 16 8
ATmega1281 64 128 16 8
ATmega1284 40/44 128 20 16
ATmega1284P 40/44 128 20 16
ATmega128A 64 128 16 4
ATmega16 40/44 16 16 1
ATmega161 40 16 8 1
ATmega162 40/44 16 16 1
ATmega163 40/44 16 8 1
ATmega164 40/44/49 16 20 1
ATmega164A 40/44/49 16 20 1
ATmega164P 40/44/49 16 20 1
ATmega164PA 40/44/49 16 20 1
ATmega165 64 16 16 1
ATmega165A 64 16 16 1
ATmega165P 64 16 16 1
ATmega165PA 64 16 16 1
ATmega168 28/32 16 20 1
ATmega168A 28/32 16 20 1
ATmega168P 28/32 16 20 1
ATmega168PA 28/32 16 20 1
ATmega169 64 16 16 1
ATmega169A 64 16 16 1
ATmega169P 64 16 16 1
ATmega169PA 64 16 16 1
ATmega16A 40/44 16 16 1
ATmega16HVA 28/36 16 4 0.5
ATmega16HVB 44 16 8 1
ATmega16M1 32 16 16 1
ATmega16U2 32 16 16 0.5
ATmega16U4 44 16 16 2.1
ATmega16U4 44 16 16 2.1
ATmega2560 100 256 16 8
ATmega2561 64 256 16 8
ATmega323 40/44 32 8 2
ATmega324 40/44/49 32 20 2
ATmega324A 40/44/49 32 20 2
ATmega324P 40/44/49 32 20 2
ATmega324PA 40/44/49 32 20 2
ATmega325 64 32 16 2
ATmega3250 100 32 16 2
ATmega3250P 100 32 20 2
ATmega325A 64 32 20 2
ATmega325P 64 32 20 2
ATmega328 28/32 32 20 2
ATmega328P 28/32 32 20 2
ATmega329 64 32 16 2
ATmega3290 100 32 16 2
ATmega3290P 100 32 20 2
ATmega329A 64 32 20 2
ATmega329P 64 32 20 2
ATmega329PA 64 32 20 2
ATmega32A 40/44 32 16 2
ATmega32C1 32 32 16 2
ATmega32HVB 44 32 8 2
ATmega32M1 32 32 16 2
ATmega32U2 32 32 16 1
ATmega32U4 44 32 16 3.3
ATmega32U6 44 32 16 3.3
ATmega406 48 40 1 2
ATmega48 28/32 4 20 0.5
ATmega48A 28/32 4 20 0.5
ATmega48P 28/32 4 20 0.5
ATmega48PA 28/32 4 20 0.5
ATmega64 64 64 16 4
ATmega640 100 64 16 8
ATmega644 40/44 64 20 4
ATmega644A 40/44 64 20 4
ATmega644P 40/44 64 20 4
ATmega644PA 40/44 64 20 4
ATmega645 64 64 16 4
ATmega6450 100 64 16 4
ATmega6450A 100 64 20 4
ATmega645A 64 64 16 4
ATmega649 64 64 16 4
ATmega6490 100 64 16 4
ATmega6490A 100 64 20 4
ATmega649A 64 64 16 4
ATmega649P 64 64 16 4
ATmega64A 64 64 16 4
ATmega64C1 32 64 16 2
ATmega64M1 32 64 16 4
ATmega8 28/32 8 16 1
ATmega8515 40/44 8 16 0.5
ATmega8535 40/44 8 16 0.5
ATmega88 28/32 8 20 1
ATmega88A 28/32 8 20 1
ATmega88P 28/32 8 20 1
ATmega88PA 28/32 8 20 1
ATmega8A 28/32 8 16 1
ATmega8HVA 28/36 8 4 0.5
ATmega8U2 32 8 16 0.5
ATtiny13 8/10/20 1 20 0.064
ATtiny13A 8/10/20 1 20 0.064
ATtiny167 20/32 16 16 0.5
ATtiny22 14/20 8 20 0.5
ATtiny2313 20 2 20 0.128
ATtiny2313A 20 2 20 0.128
ATtiny24 14/20 2 20 0.128
ATtiny24A 14/20 2 20 0.128
ATtiny25 20 2 20 0.128
ATtiny26 20/32 2 16 0.128
ATtiny261 20/32 2 20 0.128
ATtiny261A 20/32 2 20 0.128
ATtiny4313 20 4 20 0.128
ATtiny43U 20 4 8 0.256
ATtiny44 14/20 4 20 0.256
ATtiny44A 14/20 4 20 0.256
ATtiny45 20 4 20 0.256
ATtiny461 20/32 4 20 0.256
ATtiny461A 20/32 4 20 0.256
ATtiny48 32 4 12 0.064
ATtiny84 14/20 8 20 0.5
ATtiny85 20 8 20 0.5
ATtiny861 20/32 8 20 0.5
ATtiny861A 20/32 8 20 0.5
ATtiny87 20/32 8 16 0.5
ATtiny88 32 8 12 0.5
ATxmega128A1 100 128 32 8
ATxmega128A3 64 128 32 8
ATxmega128D3 64 128 32 8
ATxmega16A4 44/49 16 32 2
ATxmega16D4 44/49 16 32 2
ATxmega192A3 64 192 32 16
ATxmega192D3 64 192 32 16
ATxmega256A3 64 256 32 16
ATxmega256A3B 64 256 32 16
ATxmega256D3 64 256 32 16
ATxmega32A4 44/49 32 32 4
ATxmega32D4 44/49 32 32 4
ATxmega64A1 100 64 32 4
ATxmega64A3 64 64 32 4
ATxmega64D3 64 64 32 4
ATxmega128A3U 64 128 32 8
ATxmega16A4U 44 16 32 3.3
ATxmega192A3U 64 192 32 16
ATxmega256A3BU 64 256 32 16
ATxmega256A3U 64 256 32 16
ATxmega32A4U 44 32 32 4
ATxmega64A3U 64 64 32 4

Monday, March 7, 2016

How to definitively turn off the Foxit updater

The updater in Foxit is really annoying. And even if you turn it off via the GUI the updater application will still run in background. This will delay the main Foxit window start up.

So, here is the trick: the the updater to think that it already checked for updates:
Open the registry (RegEdit) to:

\\\Registry\HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader 7.0\plugins\Updater\LastDay

Edit the LastDay key and put a higher number. In my case, instead of 0518357,1447384350 I put 0618357,1457384350.

If you are lazy, here is the REG file script (copy/paste the text below in a text file and change its extension to .REG then run the file):

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Foxit Software\Foxit Reader 7.0\plugins\Updater]

Now Foxit will start almost instantaneously.

Firefox, suck it!

Tuesday, February 23, 2016

Adding Windows 10 to Windows' 7 boot menu

So, I installed Windows 10. I didn't liked it (at all) so I installed after that Windows 7 (on a different partition).
Now after 6 months I would like to see if Window 10 has improoved a bit, but Windows 7 won't show it in its boot menu. So, I cannot boot into Win 10 anymore.

Solution: bcdedit
Run the command prompt as administrator. Type bcdedit and it will show all installed operating systems (that it can recognize).

In my case (Win 7 primary, Win 10 'lost' partition) the output is this:


Windows Boot Manager
identifier              {bootmgr}
device                  partition=K:
description             Windows 10
locale                  en-US
inherit                 {globalsettings}
default                 {current}
resumeobject            {24334bef-7a25-11e5-866b-bca012dbdc37}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 0

Windows Boot Loader
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.exe
description             Windows 7
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {24334bf1-7a25-11e5-866b-bca012dbdc37}
recoveryenabled         Yes
osdevice                partition=C:
systemroot              \Windows
resumeobject            {24334bef-7a25-11e5-866b-bca012dbdc37}
nx                      OptIn

As you can see the current OS is Windows 7 on C: partition.

First of all, make a backup copy of your boot entries, in case you fuck up something:

C:\>bcdedit /export c:\bdc_entry_backup
The operation completed successfully.

Then type the following command. It will add Win 10 (identified as 'bootmgr') at the list of available bootable OS's:

C:\>bcdedit /displayorder {current} {bootmgr} 

Windows Boot Manager
identifier              {bootmgr}
device                  partition=K:
description             Windows 10
locale                  en-US
inherit                 {globalsettings}
default                 {current}
resumeobject            {24334bef-7a25-11e5-866b-bca012dbdc37}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 0

Windows Boot Loader
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.exe
description             Windows 7
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {24334bf1-7a25-11e5-866b-bca012dbdc37}
recoveryenabled         Yes
osdevice                partition=C:
systemroot              \Windows
resumeobject            {24334bef-7a25-11e5-866b-bca012dbdc37}
nx                      OptIn


More details about bcdedit here:

Monday, October 26, 2015

Delphi XE7 IDE crash due to CnPAck MSDN Help Integrated

After spending 2 full hours I managed to find the culprit for an IDE crash (access violation in VCL210). The cause was ...drum roll please... CnPack!

There was a palette in IDE's main tool bar called MSDN Help. However, when I right click to configure the toolbar, the palette was not listed there to show it/hide it. This probably cause the crash when I tried to remove it by dragging it out of the toolbar.

Saturday, October 17, 2015

Let DC++ autoconfigure the Internet connection

If you are behind a router that supports uPNP:

  • Make sure the uPNP feature is active in your router. Usually is disabled by default.
  • First you need to enable UPnP in Windows
  • Make sure of this by checking the "Universal Plug and Play Device Host" and "SSDP Discovery" services. Both of these services should be set to "Automatic" startup and "Started" status.
  • In DC++ activate the "Firewall with UPnP / Use UPnP to let DC++ configure my router" 
Check if your port is open at


Tuesday, September 15, 2015

svchost.exe high memory usage and 100% CPU - SOLVED

Every now and then I see high CPU utilization. So I decided to see which program is taking so much CPU.

First I looked into the task manger. At the first look it didn't show any program to take more than 1% CPU. But after checking the 'Show processes from all users' we got the guilty program: svchost.
But wait! svchost is not a program but a container for other programs (services). So we have to look inside svchost. For this, we click the 'Resource monitor' button (under Performance tab) in TaskManager.

In Resource monitor I looked under the CPU tab and I have seen that netsvcs is the process that takes all the CPU. I checked the checkbox in from of this process to filter out all other irrelevant processes. Now the 'Services' panel (located below Processes panel) shows that wuauserv is the actually guilty party. This is 'Windows updates'

If you have this problem, you could simply turn off this service as explained here:


Related links:

Wednesday, June 17, 2015

More delphi weirdness - No mapping for the Unicode character exists in the target multi-byte code page

Today I tried to open an old project. While loading the main DFM form I got a "No mapping for the Unicode character exists in the target multi-byte code page" error.

After wasting some time I figured out what caused it: the form had a custom control that had a property like this: HeaderCellSpacing = 1.300000000000000000.
Meanwhile the control was updated and this property was renamed. This was the reason of the error. It was enough to open the DFM and manually delete that property. After that the form loaded nicely.

Delphi should have been able to see which properties does not exist anymore and automatically remove them. Another proof that Delphi XE7 is totally unworthy for day by day development.

Keywords: No mapping for the Unicode character exists in the target multi-byte code page

Wednesday, May 27, 2015

How to reduce Firefox (FF) memory usage?

How to reduce memory usage in Mozilla Firefox


Know your browser

Type about:memory in the Firefox address bar. This will show you current memory usage.

Browser history

  1. Type about:config in the Firefox address bar
  2. Do a search for browser.sessionhistory.max_entries
  3. Double click the default value (50), change it to something lower (3, 4, 5).

  1. Type about:addons in the Firefox address bar 
  2. Disable unused/unnecessary/unknown addons and plugins

AdBlock Plus

If you don't have AdBlock Plus, you don't know what you are missing: The Internet without ads!!! I am not kidding! However, it was reported that AdBlock Plus increased memory usage. So, if you have lots of open tabs, you may want to disable this plugin.
I did an experiment in May 2015, and it seems is not true, or at least, they fixed this issue, since then.

Enable hardware acceleration

  1. Type about:preferences#advanced in the Firefox address bar
  2. Check "Use hardware acceleration when available".
Please note that in my case this creates other (font-related) problems.

Restart Firefox often

In my case it helps a lot to restart Firefox every hour.


Press Ctrl+H to show the 'History'. Delete all entries older than 6 months.

Install it fresh

Installing a fresh copy of Firefox will help a lot. Somebody made and experiment about this here:

In my case, the memory consumption decreased from 900MB to 500MB.

Thursday, April 2, 2015

Giving up on Delphi

Some months ago I upgraded from Delphi XE to Delphi XE7. Boy! What a mistake!
As EurekaLog people put it, Delphi XE7 is a "train wreck".
Now I am on the way of contacting Embarcadero and asking for a refund.
I will keep you updated to see how it goes.

You can find the word 'refund' only once in their huge EULA document. Not a good sign.

...Other than with respect to any indemnification hereunder, Licensor’s entire liability and Licensee’s exclusive remedy under this provision will be for Licensor to use commercially reasonable efforts to remedy defects covered by this warranty and condition within a reasonable period of time or, at Licensor’s option, either to replace the defective Product or to refund the amount paid by Licensee to license the use of the Product. Licensor does not warrant or condition that the operation of the Product will be uninterrupted or error free or that all software defects can be corrected. This warranty and condition shall not apply if...

Here is related discussion about the disturbing changes Embarcadero make in their license and marketing approach:

Tuesday, March 17, 2015

How to set paths (library, debug, BPL, DCP, search) in Delphi XE7 (for multiplatform use)

So, Delphi's help doesn't tell us much about how to set up paths for DPK packages. It is ok. We got all used with Delphi's sloppy manual.

So, I will tell you how I do it so they work both on 32 and 64 Win platforms:

My packages

I have these major packages/folders:
  • Graphics32
  • Drag and Drop (Melander)
  • 3rd  Party (many small packages put together in a big package)
  • CommonPackages (these are my own packages)
I always build 'Graphics32', 'Drag and Drop' and '3rd  Party' packages only in Release mode. So, there is no DCUs and BPLs complied in Debug mode, therefore we don't set a path for $(Config).

Package setup 

Double click the DPK file to load it in Delphi. Go to project's settings and set xxxxxxxxxxxx.
This will ensure that the IDE and app that use this package don't have access to the package's PAS files. If the IDE has access to the PAS file it will recompile the files every time you complile the app.Even worst, if the IDE recompiles package's files, it will put the DCUs in app's folder!

Also unckeck 'Build as needed'. xxxxxxxxxxx

IDE setup 

IDE setup - Package output directory
  • For Win32 platform set it to: $(BDSCOMMONDIR)\Bpl
  • For Win64 platform set it to: $(BDSCOMMONDIR)\Bpl\$(Platform)
Do the same for 'DCP output directory'.

IDE setup - Library path settings

In Delphi options -> Library -> Library path, I set these paths for Win32 platform:
  • c:\MyProjects\Packages\DragDrop\$(Platform)
  • c:\MyProjects\Packages\Graphics32\$(Platform)
  • c:\MyProjects\Packages\Third party packages\$(Platform)
  • c:\MyProjects\Packages\CubicCommonControls\$(Platform)_$(Config)
Please note that Graphics32, Drag and Drop and 3rd  Partyonly have the $(Platform) set.

CommonPackages are multi-platform (Win32/64) and multi-config (debug, prerelease, release). Therefore, we use $(Config) in the path.
If the control uses *.res files you need to manually copy them in the $(Platform) folder (the folder where the DCU are written)

This is Delphi's help page for Browsing path: Specifies search paths where the compiler can find the required files for the package, such as .dcp and .bpi files.
This is the Delphi global library path. The compiler can find only those files that exist on the Library path. If you try to build your package with a file that is not on the Library path, you receive a compiler error.
Some resource files (such as controls.res) are only available in the Release folder (not the Debug folder), so you should ensure that your project Release directory either is specified in the Library path or will be resolved by at least one variable in the Library path.

Browse path

In Delphi options -> Library ->:
Enter the path to package's source code so the IDE will able to reach the code (for example to be able to open a file when you control+click a method in IDE):
  • c:\MyProjects\Packages\DragDrop\
  • c:\MyProjects\Packages\Graphics32\
  • c:\MyProjects\Packages\Third party packages\
  • c:\MyProjects\Packages\CubicCommonControls\
This is Delphi's help page for Browsing path: Specifies the directories where the Code Browsing feature of the Code Editor looks for unit files when it cannot find an identifier on the project search path or source path. The Code Editor searches for unit files used for code browsing in the following order:

  1. The project Search path for Delphi ( Project > Options > Delphi Compiler ) or the Include path for C++ ( Project > Options > Directories and Conditionals).
  2. The global browsing path (this option) for Win32 Delphi language projects; the directories specified with this option are appended to the debug source path for the project. Therefore, the debugger search order for unit files is determined by the following path settings:
    • The Browsing path (this option).
    • The project Source path (the directory in which the project was saved).

Search path

I am not sure you really need the thing below (I think you don't):

The project's 'Search Path' is set like this (for all platforms):
  • c:\MyProjects\Packages\DragDrop\$(Platform)
  • c:\MyProjects\Packages\Graphics32\$(Platform)
  • c:\MyProjects\Packages\Third party packages\$(Platform)
  • c:\MyProjects\Packages\CubicCommonControls\$(Platform)_$(Config)

You have to do the same for 32 and 64 bit platforms (in the 'Selected Platform' dropdown menu).

The applications

For applications (DPR) that are using the packages specified above I set the 'Unit output directory' like this (for 'All configurations/All platforms'):
  • .\$(Platform)_$(Config)


Update: I had problems making a project to work when when I used a combination of $(Platform)_$(Config) and $(Platform) in the paths. It worked after I replaced $(Platform)_$(Config) with $(Platform).

Tuesday, March 3, 2015

Trying to do some multi-platform programming

So, I purchased Delphi XE7 for a pile of money (around 1000euros) hoping to do all the wonderful things they advertised.
After struggling with their grandiose (read as 'scarce' or 'almost nonexistent') user manual I managed compiling my 32 bit application for Windows 64.

Since Delphi is 32 bit and my Windows machine is also 32 bit you need to somehow deploy your app on Windows 64 and run/debug it there. This is what PAServer (debugger platform assistant) is supposed to do.
However, PAServer keeps crashing as soon you press the Run button in Delphi. Sometimes this error is shown:

Error setting debug exception hook.

[223ADB5B]{win32debugide210.bpl} Win32Debug.TNativeProcess.SetDelphiTracingLevel (Line 2324, "Win32Debug.pas" + 5) + $11
[223AD5ED]{win32debugide210.bpl} Win32Debug.TNativeProcess.InitExceptRanges (Line 2195, "Win32Debug.pas" + 3) + $4
[223ADFB8]{win32debugide210.bpl} Win32Debug.TNativeProcess.DoSetExceptOption (Line 2436, "Win32Debug.pas" + 2) + $6
[203620D0]{dbkdebugide210.bpl} Debug.TDebugger.SetProcess (Line 11394, "Debug.pas" + 31) + $10
[20363397]{dbkdebugide210.bpl} Debug.TProcess.SetExceptOption (Line 11709, "Debug.pas" + 1) + $4
[203574BF]{dbkdebugide210.bpl} Debug.TThread.ntfyThread (Line 6355, "Debug.pas" + 58) + $6
[1B76C593]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $626BB
[1B79C22A]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $92352
[1B79680A]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $8C932
[1B76B927]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $61A4F
[1B76C593]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $626BB
[1B793703]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $8982B
[1B79C4D7]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $925FF
[1B709D72]{bordbk210.dll} Unknown function at DllUnregisterServer + $17EF6
[1B76B8CC]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $619F4
[505C2850]{vcl210.bpl  } Vcl.Controls.TControl.Perform (Line 7010, "Vcl.Controls.pas" + 10) + $8
[1B76C7FC]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $62924
[1B714263]{bordbk210.dll} Unknown function at @isDbkLoggingOn$qv + $A38B
[505C76E2]{vcl210.bpl  } Vcl.Controls.TWinControl.WndProc (Line 10038, "Vcl.Controls.pas" + 153) + $6
[505C2850]{vcl210.bpl  } Vcl.Controls.TControl.Perform (Line 7010, "Vcl.Controls.pas" + 10) + $8
[505C5E7E]{vcl210.bpl  } Vcl.Controls.TWinControl.GetControl (Line 9130, "Vcl.Controls.pas" + 4) + $A
[505CA48F]{vcl210.bpl  } Vcl.Controls.TWinControl.CMInvalidate (Line 12012, "Vcl.Controls.pas" + 10) + $4
[505C2C15]{vcl210.bpl  } Vcl.Controls.TControl.WndProc (Line 7232, "Vcl.Controls.pas" + 91) + $6
(0003C651){CnWizards_DXE7.dll} [0DCCD651]
(0003C6B8){CnWizards_DXE7.dll} [0DCCD6B8]
(0003C769){CnWizards_DXE7.dll} [0DCCD769]
(00039EF6){CnWizards_DXE7.dll} [0DCCAEF6]
[500636D0]{rtl210.bpl  } System.@FinalizeArray (Line 31435, "System.pas" + 139) + $0
[500636C0]{rtl210.bpl  } System.@FinalizeArray (Line 31423, "System.pas" + 127) + $0
[50716363]{vcl210.bpl  } Vcl.Forms.TApplication.ProcessMessage (Line 10354, "Vcl.Forms.pas" + 25) + $1
[5071639E]{vcl210.bpl  } Vcl.Forms.TApplication.HandleMessage (Line 10382, "Vcl.Forms.pas" + 1) + $4
[507166D1]{vcl210.bpl  } Vcl.Forms.TApplication.Run (Line 10520, "Vcl.Forms.pas" + 26) + $3

Some people suggested that if you set your connection (the network connection between the 32 bit debugging machine and 64 bit debugged machine) without a password it may not work! I have tried that but with no success.


I tried to fix this and I spend too much time. In the end I gave up and installed Delphi in a second computer (yes, and did all the madness about installing all tools, libraries, etc) that has Win64 bits.

I also contacted Embarcadero support about this issue. They said that somebody will call me but I never heard from them. They know they can't fix the problem.

The conclusion is that Delphi is not even by far ready for multi-platform development. It has some multi-platform capabilities but I would say it doesn't go beyond the 'experimental' or 'beta' stage. Multi-platform (FMX included) is not ripe yet. Maybe in a couple of years. But then if it is too wait that long (and pay lots of money for upgrades) we should also consider Lazarus.