This week, in one of the most important government palaces in Italy (I cannot say which one), I did a consultancy about mobile development. The internal dev team is currently using Xamarin and they have a blocking problem with it. In the team there is a friend of mine which called me some days ago to know if I know how to solve their problem using Delphi. I told him that the “blocking” problem could be solved with Delphi. The resultant 2 days of consultancy were been quite hard, but the result has been really rewarding. A long standing problem has been elegantely solved using Delphi in a couple of hours.
The problem was about using HTTP client certificates with iOS in a Microsoft architecture, where each user had its own certificate.
I dont know Xamarine so deeply to say if the problem could be elegantly resolved with it as well, but the team is quite smart and skilled, so I think that they have been tried all the documented solutions to face the problem, but without success.
I want to thank the always helpful Jim McKeeth and the great Diego Navarro from Embarcadero, to have help me about this issue. Thank you guys.
The Parallel Programming Library introduced in XE7 is one of the most awaited built-in library for the Delphi and C++Builder RTL, at least for me. I’ve still a nice list waiting for the next versions, but this is another story 🙂
Marco Cantù wrote about dynamic arrays some days ago, another nice feature introduced in Delphi XE7. In the post he talk about an integration between Parallel Programinng Library and dynamic arrays which I shown to the audience in the Milan and Rome XE7 world tour.
I planned to write about Parallel Programming Library in this blog, so why don’t start with that simple example?
Here’s the code.
procedure TFormThreading.Button1Click(Sender: TObject);
tasks: array of ITask;
value := 0;
tasks := [
sleep(1000); // 1 seconds
sleep(3000); // 3 seconds
sleep(5000); // 5 seconds
ShowMessage('All done: ' + value.ToString);
This code configure and start 3 parallel tasks and wait for their completitions. Then show the result using a ShowMessage.
This code takes 5 second to be executed because the 1st second there are 3 tasks running, from 2nd second to the 3rd second there are 2 tasks running while the last 2 seconds only one task is running. All the internal threads are managed by a thread pool. Hey! This means parallelize!
In the last months DMVCFramework has been used in many projects. Some fixes and some new features has been added.
Tomorrow will start the 4th training from the Jan 1st 2014 on DMVCFramework… WOW!
The best selling training is “Developing Web Client applications using AngularJS and DelphiMVCFramework” (a slightly modified version of this classic training http://www.bittime.it/sviluppare_applicazioni_web_usando_angularjs_con_delphi_back_end).
Tomorrow the training will be in italian, however is very popular also the english version.
However, back to the project, there is a first attempt to add some documentations on the project.
So far there are a lot of samples and all the unit tests, however there was a lack on the “classic” documentations. So, I’m happy to say that in the SVN trunk you can find my presentation held at the last ITDevCon2013 in Verona, IT.
If you are using DMVC framework I’ll be glad to have 2 lines of description about your project (numbers not functionalities insights) to put a success case page on the project website.
This time I want to play a video deployed with my APK using an external player.
Some informations are available on the Internet, but to correctly know how to play the video I’ve to inspect my Nexus 5 with the LogCat while using the default file manager to start the default video player.
The app main form is shown below
I’ve added an mp4 video file using the deployment manager.
This is the code under the button click event
procedure TForm1.Button1Click(Sender: TObject);
FileName, DestFileName: string;
VIDEO_FILENAME = 'videoviewdemo.mp4';
FileName := System.IOUtils.TPath.GetDocumentsPath + PathDelim + VIDEO_FILENAME;
DestFileName := TPath.GetSharedDownloadsPath + PathDelim + VIDEO_FILENAME;
// Copy the file into a public path (you can use any public path)
TFile.Copy(FileName, DestFileName, true);
Data := TJnet_Uri.JavaClass.parse(StringToJString('file://' + DestFileName));
Intent := TJIntent.Create;
if CheckBox1.IsChecked then
CompName := TJComponentName.JavaClass.init(StringToJString('android'),
on E: Exception do
Label1.Text := E.Message;
Using the checkbox you can force the OS to show the ResolverActivity.
LuaBinding (integrate Lua script into Delphi native code)
LuaTextFilter (convert eLua into plain Lua executable script just like JSP)
Currently DMVCFramework use Embarcadero WebBroker framework, but is not tied to it. I’m working on a version that use IOCP (that is 10 times faster than plain WebBroker) and other web libraries for Delphi.
Code is enough stable and is already used in big production system.
There are a couple of bugs that affect WebBroker and so, DMVCFramework.
In our system, I’ve applied some patches to solve these problems. If you need those patches, ask me (I cannot publish the full code because it is Embarcadero licensed code).
As you probably know, I work for the italian embarcadero representative (www.bittime.it), so last week, I’ve been in Milan (Italy) with the Delphi Product Manager Marco Cantù, to show the new Delphi XE5 for Android (and iOS…).
Users (old and new) were enthusiastics. The Delphi-WAY combined with the Android openness and flexibility, is really a good way to develop mobile apps for the business customers.
So, after the initial demos some users were interested in sending Android Intents from their Delphi app.
I’ve builded some demos about Intents, so I showed those demos to them (in the next weeks there will be many Delphi for Android training in Italy, so I’ve build those demo in advance)
In Delphi XE5 you can call java classes from the Google SDK. So I started investigating hot to do this.
There are a lot of possibilities, and I’m still doing research, but this is a simple Intent send demos.
This is the code under the first button.
procedure THeaderFooterForm.Button1Click(Sender: TObject);
// JAVA SDK ANDROID HELP SAYS...
// String url = "http://www.example.com";
// Intent i = new Intent(Intent.ACTION_VIEW);
Intent := TJIntent.Create;
Simple, isn’t it?
With this piece of code, you cann open your device browser to a web site (my blog in the snippet).
Click on the first button and you will be redirected to this blog.
Intents are REALLY powerfull
With the next snippet, you can send piece of data (e.g. text) to other apps. You dont have to know the apps in advance, Android will do the match with the Implicit Intent. (It is similat to the TShowShareSheet action).
In 2009 I was looking for a fast, very fast, messaging system for a complex project and I meet ZeroMQ. At that time there was the 1.x version and I wrote a Delphi wrapper for the C dll that some days later has been included in the official ZeroMQ distribution.
Yes, this book is really a crash course in ZeroMQ. In about 100 pages, this “small but full of interesting things” book, explains all the most useful message patterns implemented in ZeroMQ. Congrats to Faruk Akgul (the author).
Traditional message queuing systems use a broker. However, ZeroMQ is brokerless. In a brokerless design, applications can directly communicate with each other without any broker in the middle. All the complexity is hidden, and handled, by ZeroMQ. In this situation there isn’t the “single point of failure”. In some cases this architecture cannot be used, but when it can be, you can gain a lot of flexibility, speed with no added complexity.
Let’s give a more deeper overview for each chapter.
Chapter 1: Getting Started
In this chapter there are some informations about the messaging architectures in general (good for newcomers to the topic) and about ZeroMQ messaging (in particular). Some concepts introduced in this chapter are reused a lot in the rest of the book.
In chapter 1 is introduced the first and the simpler ZeroMQ pattern, the request-replay.
Chapter 2: Introduction to Socket
This chapter starts with a nice introduction to the publish-subscribe pattern and the related filtering (ZeroMQ can filter messages with a very simple “match” pattern). Then, the chapter talks about one of the most interesting patterns when speed is important: the pipeline pattern. While is talking about the pipeline, it explain the ZMQ_PULL and the ZMQ_PUSH socket types. At the end of the chapter, there is an introduction to the Valgrind’s tools suite to detect memory leaks in C/C++ programs. In Delphi can be used FastMM or other similar tools for the same thing.
Chapter 3: Using Socket Topology
In this chapter there is a small introduction to the types of Internet Sockets and TCP. There there is a nice comparison between the “plain” sockets and the ZeroMQ sockets.
At the end, there is an introduction to the CZMQ, a small helper library which lets
C developers to code their ZeroMQ applications easier and shorter. For a Delphi programmer there are a number of ZeroMQ wrapper that makes its use really a snap.
Chapter 4: Advanced Patterns
In this last chapter, are introduced some advanced variation of the previously introduced patterns. Then, there is a nice explanation of some critical situations that could happened in a messaging system. To help the programmer to handle this cases there a number of examples of the ZeroMQ “High Watermark” setting. As very last topic, there is a well known problem, the infamous “slow subscribers in a publish-subscribe pattern”.
As in every single thing, there are good aspects and bad aspects.
This book is good for an introduction but is not so good for advanced users. There are some other ZeroMQ patterns and features that are not explained at all. However, these patterns are not the most used, or are advanced stuff, so this could not be a big issue.
Considering, the price, the contents and the informative density, is a definitely a good book that can be read, and studied, in few hours and could change your way to do things in everyday programming (messaging are very often not used, or used in a bad way, simply because usually is complex to write and maintain a good messaging system).
One of the more nice features about ZeroMQ is that it can use different transportation protocols. The same library and the same code can be used to do messaging between machines, between processes or between threads in the same process (ipc). As last note, ZeroMQ can handle, without much effort, millions of messages per seconds. If you need speed… consider this.
P.S. I’ll translate and publish on this blog, some of the C examples contained in the book, in Delphi. Stay tuned.
If you know DataSnap, probably you know the famous post by Roberto Schneiders about its stability problems (http://robertocschneiders.wordpress.com/2012/11/22/datasnap-analysis-based-on-speed-stability-tests/).
Now, after some (right) dust cloud, in the Update 1 Embarcadero fixed some bugs.
I still haven’t the time to do an heavy test but the first “fast-and-dirty” test give some results, and I’d like to share my little tests.
I created a simple “DataSnap REST Application” as a VCL Application.
Start a little test with ApacheBenchmark (you can find it in the Apache HTTPD installation directory).
Run the test… and, exception at the 32° connections, just as before the update. However this is not a “bug”, it is simply a problem related to the default wizard configuration.
So I changed the MaxConnection to 1024. This number is very high (for a simple PC) but I’m interested in the concurrency problems, so I’ve to push the concurrency far enough to che the Update 1 Fixes.
Also, I’ve disabled the session with a little change in the “EchoString” method (as suggested by Marco Cantù in his blog post about DataSnap problems).
Now the test results are good. As I said, my objective is not to check the performance or other problems arised from the Roberto tests. My test is just about the concurrency problems (IMHO the biggest one) and the related crash.
Here the Apache Benchmark tests with 100000 requests with 100 concurrent connections.
D:wampbinapacheapache2.2.22bin>ab -v 1 -n 100000 -c100 http://127.0.0.1:8080/datasnap/rest/TServerMethods1/EchoString/Daniele
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /datasnap/rest/TServerMethods1/EchoString/Daniele
Document Length: 22 bytes
Concurrency Level: 100
Time taken for tests: 465.320 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 18966732 bytes
HTML transferred: 2200000 bytes
Requests per second: 214.91 [#/sec] (mean)
Time per request: 465.320 [ms] (mean)
Time per request: 4.653 [ms] (mean, across all concurrent requests)
Transfer rate: 39.81 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 11.8 0 529
Processing: 2 464 230.4 500 2041
Waiting: 1 457 216.6 499 1922
Total: 2 465 230.8 501 2041
Percentage of the requests served within a certain time (ms)
100% 2041 (longest request)
I certainly will do other tests, however this fast-and-dirty test gave me a good impression.
More to come.