2012, Thursday February 9
By A.Bouchez on 2012, Thursday February 9, 10:54 - Pascal Programing
Some Delphi users even do not know the existence of the
SetString function.
As stated by the official
documentation:
procedure SetString(var S: String; Buffer: PChar; Length: Integer);
For a long string variable, SetString sets S to reference a newly allocated
string of the given length. If the Buffer parameter is not nil, SetString then
copies Len characters from Buffer into the string; otherwise, the content of
the new string is left uninitialized. If there is not enough memory available
to create the string, an EOutOfMemory exception is raised. Following a call to
SetString, S is guaranteed to reference a unique string (a string with a
reference count of one).
Some have
noticed that in our libraries, I sometimes use SetString
instead of SetLength.
When the string is already allocated, it could be faster to use
SetString, if you are sure that you will overwrite the string
content.
Continue reading...
2012, Sunday January 29
By A.Bouchez on 2012, Sunday January 29, 14:30 - mORMot Framework
For our native connection to any DB, we developed a set of
classes and several units.
We implemented at first
OleDB, then native Oracle
direct access and SQlite3 static
engine.
Now, Microsoft is officially deprecating OleDB, and urge
all developers to switch to the open and cross-platform ODBC
API for native connection.
Continue reading...
2012, Tuesday January 17
By A.Bouchez on 2012, Tuesday January 17, 23:02 - Open Source libraries
The Open Source SynDBExplorer tool
has been enhanced these days.
Main new features are:
- Execution of the current selected text (if any) instead of the whole memo
content;
- "Exec & Export" new button, for direct export to file.
I really like the selection execution feature - this speed up SQL
process a lot, and allow to switch from one statement to another.
And the new exporting features are opening new possibilities.
Continue reading...
2011, Friday December 30
By A.Bouchez on 2011, Friday December 30, 10:49 - mORMot Framework
A variety of programming languages suffer from a denial-of-service (DoS)
condition against storage functions of key/value pairs in hash data structures,
the condition can be leveraged by exploiting predictable collisions in the
underlying hashing algorithms.
The issue finds particular exposure in web server applications and/or
frameworks. In particular, the lack of sufficient limits for the number of
parameters in POST requests in conjunction with the predictable collision
properties in the hashing functions of the underlying languages can render web
applications vulnerable to the DoS condition. The attacker, using specially
crafted HTTP requests, can lead to a 100% of CPU usage which can last up to
several hours depending on the targeted application and server performance, the
amplification effect is considerable and requires little bandwidth and time on
the attacker side.
Source: #2011-003 multiple
implementations denial-of-service via hash algorithm collision
Continue reading...
2011, Sunday December 11
By A.Bouchez on 2011, Sunday December 11, 09:59 - Pascal Programing
To my understanding, the so-called "strong-typing" feature is one big
benefit of the Delphi object pascal language.
As stated by wikipedia:
Most generally, "strong typing" implies that the programming language places
severe restrictions on the intermixing that is permitted to occur, preventing
the compiling or running of source code which uses data in what is considered
to be an invalid way. For instance, an addition operation may not be used with
an integer and string values; a procedure which operates upon linked lists may
not be used upon numbers. However, the nature and strength of these
restrictions is highly variable.
Some Delphi users may find this is a limitation of the language, in
comparison with other "fashionable" script idioms (like Python, Javascript of
Ruby). For me, runtime strong typing (alla Python or Ruby) is not true strong
typing. Simon Stuart just
proposed a smartstring kind of string, which is in fact a
weakstring type. As far as I understood his point, he wanted to
get rid of all the warnings emitted by Unicode-version of the Delphi compiler,
about explicit string conversion.
In fact, I use to go in the opposite direction. For wide projects,
strong-typing is one of the big benefit of using Delphi (like other main
"serious" languages like Java, C, C++, Ada or C#).
Continue reading...
2011, Thursday December 8
By A.Bouchez on 2011, Thursday December 8, 10:09 - Pascal Programing
Among all trolling subject in forums, you'll find out the
great Garbage Collection theme.
Fashion languages rely on it. At the core of the .Net and Java framework,
and all scripting languages (like JavaScript, Perl, Python or Ruby), you'll
find a Garbage Collector. New developers, just released from schools, do
learn about handling memory only in theory, and just can't understand how is
memory allocated - we all have seen such rookies involved in Delphi code
maintenance, leaking memory as much as they type. In fact, most of them did not
understood how a computer works. I warned you this will be a trolling
subject.
And, in Delphi, there is no such collector. We handle memory in
several ways:
- Creating static variables - e.g. on the stack, inside a
class
or globally;
- Creating objects with
class instances allocated on heap - in
at least three ways: with a try..finally Free block, with a
TComponent ownership model in the VCL, or by using
an interface (which creates an hidden try..finally
Free block);
- Creating reference-counted variables, i.e.
string, array
of, interface or variant kind of
variables.
It is a bit complex, but it is also deadly powerful. You have several memory
allocation models at hand, which can be very handy if you want to tune your
performance and let program scale. Just like manual recycling at home will save
the planet. Some programmers will tell you that it's a waste of cell brain,
typing and time. Linux kernel gurus would not say so, I'm afraid.
Then came the big Apple company, which presented its new ARC model
(introduced in Mac OS X 10.7 Lion) as a huge benefit for
Objective-C in comparison with the Garbage Collection model. And
let's face it: this ARC just sounds like the Delphi memory model.
Continue reading...
2011, Sunday December 4
By A.Bouchez on 2011, Sunday December 4, 09:46 - Pascal Programing
I'm a long-time registered user of Total
Commander.
This tool is my daily file manager. I never use Windows Explorer,
since Total Commander is just faster, more easy to use (especially
with the keyboard), has a lot of plug-ins. I even created my own plug-ins to
access some custom file formats, and navigate into them just like with any
folder. And it includes a lot of well written commands for FTP access or file
comparison, which made other tools (like WinMerge) unnecessary.
There is a new beta version of Total Commander available,
which targets Windows 64 bit. I just thought: 'Whoo, this is a real-world
Delphi XE2 64 application'. I downloaded and tried it. Worked as expected, and
integrates seamlessly with Windows Seven (for the shell extensions).
Then I took a look at the executable... and discovered it was not compiled with
Delphi XE2... but with FPC !
Continue reading...
2011, Sunday November 27
By A.Bouchez on 2011, Sunday November 27, 23:39 - Pascal Programing
Delphi is sometimes assimilated to a RAD product - and this is a marketing
label - but IMHO Delphi is much more than RAD.
With Delphi, you can make very serious and clean programming.
Including SOLID style of coding.
The acronym SOLID is derived from the following OOP principles (quoted from
the corresponding
Wikipedia article):
- Single responsibility principle: the notion that an object should
have only a single responsibility;
- Open/closed principle: the notion that “software entities ...
should be open for extension, but closed for modification”;
- Liskov substitution principle: the notion that “objects in a
program should be replaceable with instances of their subtypes without altering
the correctness of that program” - also named as "design by
contract";
- Interface segregation principle: the notion that “many client
specific interfaces are better than one general purpose interface.”;
- Dependency inversion principle: the notion that one should “Depend
upon Abstractions. Do not depend upon concretions.”. Dependency
injection is one method of following this principle.
If you have some programming skills, those principles are general statements
you may already found out by yourself. If you start doing serious
object-oriented coding, those principles are best-practice guidelines you would
gain following.
They certainly help to fight the three main code weaknesses:
- Rigidity – Hard to change something because every change affects
too many other parts of the system;
- Fragility – When you make a change, unexpected parts of the system
break;
- Immobility – Hard to reuse in another application because it
cannot be disentangled from the current application.
Continue reading...
2011, Wednesday November 23
By A.Bouchez on 2011, Wednesday November 23, 08:37 - Pascal Programing
Luigi Sandon wrote on
Embarcadero's forum:
And then you ask yourself: "why use a native compiler if its code may be
even slower than jitted one?". Hope the new developers will also develop better
and faster code - and not viceversa.
Embarcadero is just following the Wirth's law slower than others:
"Software is getting slower more rapidly than hardware becomes faster"
Speed is only a matter of compiler for mathematical computing intensive
tasks.
Most of the time, in real apps (like business apps), the main speed issue is
more the framework size (and the number of dll invoked), memory consumption,
and general design (e.g. how caching and SQL are written).
Delphi, Java or .Net can do slow apps.
Delphi, Java or .Net can do fast apps.
You can do small and fast stand-alone apps with Delphi, running from Windows
2000 to Windows 8.
It is not possible with Java nor .Net.
This is the main difference IMHO with native code and JIT - about memory
use, ease of distribution and no need of an external runtime framework.
Continue reading...
2011, Tuesday November 8
By A.Bouchez on 2011, Tuesday November 8, 21:51 - Pascal Programing
The currency type is the standard Delphi type to be used when
storing and handling monetary values. It will avoid any rounding problems, with
4 decimals precision. It is able to safely store numbers in the range
-922337203685477.5808 .. 922337203685477.5807. Should be enough for your pocket
change.
As stated by the official Delphi documentation:
Currency is a fixed-point data type that minimizes rounding errors in
monetary calculations. On the Win32 platform, it is stored as a scaled 64-bit
integer with the four least significant digits implicitly representing decimal
places. When mixed with other real types in assignments and expressions,
Currency values are automatically divided or multiplied by 10000.
In fact, this type matches the corresponding OLE and
.Net implementation of currency, and the one used by
most database providers (when it comes to money, a dedicated type is worth the
cost in a "rich man's world"). It is still implemented the same in the
Win64 platform (since XE 2). The Int64 binary
representation of the currency type (i.e. value*10000
as accessible via PInt64(aCurrencyValue)^) is a safe and fast
implementation pattern.
In our framework, we tried to avoid any unnecessary conversion to float
values when dealing with currency values. Some dedicated functions
have been implemented for fast and secure access to currency
published properties via RTTI, especially when converting values to or from
JSON text. Using the Int64 binary representation can be not only
faster, but also safer: you will avoid any rounding problem which may be
introduced by the conversion to a float type. Rounding issues are a nightmare
to track - it sounds safe to have a framework handling natively a
currency type from the ground up.
Continue reading...
2011, Thursday October 27
By A.Bouchez on 2011, Thursday October 27, 05:17 - Pascal Programing
From a StackOverflow
question about a freezing Delphi application, I posted some
experiment-based debugging tricks.
May help any developer in his/her fight against random bugs...
Continue reading...
2011, Sunday September 25
By A.Bouchez on 2011, Sunday September 25, 19:54 - Pascal Programing
You know all that one of the most exciting features of Delphi XE2 is the
MaxOSX Cross-Platform feature.
You've got the UI part,
that is FireMonkey, but underneath, you did have some RTL modifications in
order to let our Windows-centric solutions be OSX ready.
The first main step was to make our code speak with the "Objective-C" way of
coding.
Objective-C is the primary language used for Apple's Cocoa API, and it was
originally the main language on NeXT's NeXTSTEP OS. It's some object-oriented C
variant, but something other than C++ or Java. In fact, Objective-C sounds more
like a SmallTalk variance of C than another C++/Java/C# flavor. For
instance, the Objective-C model of object-oriented programming is based on
message passing to object instances: this is just another way of doing it. It
has some advantages, and disadvantages (I don't want to troll here) - but it is
definitively nice. And the memory model is just something else, more close to
our reference-counting way (as in Delphi interface implementation)
than a garbage collector.
Continue reading...
2011, Monday September 12
By A.Bouchez on 2011, Monday September 12, 23:13 - Pascal Programing
Unfortunately, Delphi's 64-bit compiler (dcc64) and RTL do not support
80-bit extended floating point values on Win64, but silently alias
Extended = Double on Win64.
There are situations, however, where this is clearly undesirable, e.g. if
the additional precision gained from Extended is required.
The Open-source uTExtendedX87 unit provides a
replacement FPU-backed 80-bit Extended floating point type
(TExtendedX87) for Win64.
Continue reading...
2011, Sunday August 28
By A.Bouchez on 2011, Sunday August 28, 08:57 - Pascal Programing
Writing working multi-threaded code is not easy - it's even
hard, as as a Delphi expert just wrote
in his blog.
In fact, the first step into multi-thread application development could
be:
"protect your shared variables with locks (aka critical sections), because
you are not sure that the data you read/write is the same for all threads".
The CPU per-core cache is just one of the possible issues, which will lead
into reading wrong values. Another issue which may lead into race condition is
two threads writing to a resource at the same time: it's impossible to know
which value will be stored afterward.
Continue reading...
2011, Thursday August 11
By A.Bouchez on 2011, Thursday August 11, 11:05 - Pascal Programing
For those how are interested in
FireMonkey, I made some screenshots of some DXScene sample app.
It may give you some good starting point about the features of the upcoming
Delphi XE2 user interface components.
Continue reading...
2011, Friday July 22
By A.Bouchez on 2011, Friday July 22, 17:14 - Open Source libraries
For our ORM framework, we implemented an efficient SQLite3 wrapper,
joining statically (i.e. without any external dll) the SQLite3 engine to the
executable. SQLite3 is in fact used as the DB kernel of the framework. For
instance, thanks to its unique virtual table
mechanism, even tables in other databases (like Oracle or MSSQL) are
available as if
they were SQLite3 tables.
We just made this wrapper independent from our ORM, in a new dedicated unit,
named
SynSQLite3.pas.
It was an easy task to let this unit be called from our SynDB
database abstract classes.
Continue reading...
2011, Saturday July 9
By A.Bouchez on 2011, Saturday July 9, 11:46 - mORMot Framework
For our upcoming mORMot framework, and in completion to our
SynOleDB unit, we just added a new Open Source unit, named
SynDBOracle. It allows direct access to any remote Oracle server,
using the Oracle Call Interface.
Oracle Call Interface (OCI) is the most comprehensive, high
performance, native unmanaged interface to the Oracle Database that exposes the
full power of the Oracle Database. We wrote a direct call of the
oci.dll library, using our DB abstraction classes introduced for
SynOleDB.
We tried to implement all best-practice patterns detailed in the official
Building High Performance Drivers for Oracle document
Resulting speed is quite impressive: for all requests, SynDBOracle
is 3 to 5 times faster than a SynOleDB connection using the native
OleDB Provider supplied by Oracle. We noted also that our
implementation is 10 times faster than the one provided with ZEOS/ZDBC, which
is far from optimized.
You can use the latest version of the Oracle Instant Client
provided by Oracle - see this
link - which allows you to run your applications without installing
the standard (huge) Oracle client or having an ORACLE_HOME. Just
deliver the dll files in the same directory than your application,
and it will work.
Continue reading...
2011, Monday July 4
By A.Bouchez on 2011, Monday July 4, 06:09 - SQLite3 Framework
If you want to implement an HTTP client access in your application, you may
consider several choices:
- Use the provided
Indy components;
- Use third-party components like Synapse, ICS or
your own WinSock-based wrapper;
- Use WinINet;
- Use WinHTTP.
For our ORM, we tried to avoid external dependencies, and did not have the
need of all Indy's features and overhead.
We fist wrote our own WinSock wrapper, then tried out
WinInet.
When used on our testing benchmark, we found out that WinINet was
dead slow.
Then we tried WinHTTP, the new API provided by Microsoft, and we found
out this was blazing fast. As fast as direct WinSock access,
without the need of writing all the wrapper code.
Continue reading...
2011, Sunday July 3
By A.Bouchez on 2011, Sunday July 3, 20:12 - SQLite3 Framework
Here is what wikipedia states at http://en.wikipedia.org/wiki/Shared_nothing_architecture:
A shared nothing architecture (SN) is a distributed computing
architecture in which each node is independent and self-sufficient, and there
is no single point of contention across the system. People typically contrast
SN with systems that keep a large amount of centrally-stored state information,
whether in a database, an application server, or any other similar single point
of contention.
This is just one approach of "sharding". Sharding is indeed related to a
shared nothing architecture - once sharded, each shard can live in a totally
separate logical schema instance.
"I sharded, therefore it scales"...
You can do this in Delphi... and opens a new world of scaling
opportunities... Just as Google, Facebook, or
eBay do...
Continue reading...
2011, Saturday July 2
By A.Bouchez on 2011, Saturday July 2, 11:32 - mORMot Framework
There is a well known syndrome around, against ORM.
Do you remember The
Vietnam of Computer Science article?
It is worth reading... and commenting.
Sounds a bit outdated by now. Tempus fugit!
Continue reading...