tag:blogger.com,1999:blog-47521269619478668862024-03-13T19:51:48.916+02:00Bohemian developer 1.0Reinventing software developmentEduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.comBlogger107125tag:blogger.com,1999:blog-4752126961947866886.post-241832852727420722015-10-13T16:18:00.001+03:002016-07-13T16:37:21.969+03:00Concept 5Concept is now 11 years old. I manage to find less and less time to write here.<br />
<br />
A lot of new features were added, like video API (H.264 and HEVC), more async APIs, a the main feature for Concept 5.0 is TinDB, a distributed No-SQL database system, written in Concept. Also, Concept 5 will use about 30% less memory.<br />
<br />
The main new feature of Concept 5.0 is the fact that will drop the native desktop client. HTML5 is now mature, and there is no need for Concept Client for desktop. It will continue to have Concept Client iOS and Android native versions.<br />
<br />
I've been working to my first big-data application, a communications application, written entirely in Concept. You can even video call me from the browser, by clicking <a href="http://rring.me/video.con?40722542969@Blog" target="_blank">here [call Eduard]</a>. Every line of code is written in Concept.<br />
<br />
I've redesigned parts of the Concept Framework for better asynchronous support.<br />
<br />
As I've said before, the new feature in Concept 5 is TinDB.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Jlmy0izuVZc/Vh0C7cSEUnI/AAAAAAAAA2U/5UGAwIgiEx4/s1600/tindb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="608" src="https://1.bp.blogspot.com/-Jlmy0izuVZc/Vh0C7cSEUnI/AAAAAAAAA2U/5UGAwIgiEx4/s640/tindb.png" width="640" /></a></div>
<br />
The APIs are not final (may be modified, if needed), so this is a pre-preview. The code above inserts a Student object into test_collection, and the database server performs a Wolfram Alpha query upon insert. TinDB has stored Concept procedures.<br />
<br />
As usual I've fixed a lot of bugs (a few of them critical). In the next few weeks I will post the entire source code on github.<br />
<br />
A redesign for GyroGears apps is in progress, in about two weeks everything should be ready. Gyro apps are incredibly stable, so it will be mostly a face lift, in order to be more HTML5-friendly.<br />
<br />
Now I'm working almost exclusively on TinDB and Concept Client 5.0 JS. Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-71243391876954597382015-04-07T13:45:00.001+03:002015-04-07T13:45:57.071+03:00Workers, speech recognition and Concept 4.1Concept 4.1 brings new optimizations, starting with recursive calls (around 50% more efficient), less memory usage for class objects ( - 50%), memory pools for objects, and workers - efficient threads that can be used by the standard Concept Core (no need to use the inefficient multi-threaded core).<br />
<br />
<span style="font-size: large;">Speed and memory optimizations</span><br />
<br />
When testing using the binary tree benchmark (found here: http://benchmarksgame.alioth.debian.org/u64/program.php?test=binarytrees&lang=yarv, and here: http://benchmarksgame.alioth.debian.org/u64/program.php?test=binarytrees&lang=php)<br />
<br />
PHP 5.6: Memory used - 369M to 1200M - 345 seconds<br />
Concept 4.1: 79M to 269M - 170 seconds<br />
Ruby 2.2.1: 176M constant - 87 seconds<br />
<br />
Ruby is faster on this benchmark only, because it excludes the Concept JIT, how ever, when the JIT is active (ex: mathematical functions and/or loops, based on the Sieve benchmark, concept is about 20 times faster than PHP).<br />
<br />
For the fannkuch redux benchmark (foudn here: http://benchmarksgame.alioth.debian.org/u64/program.php?test=fannkuchredux&lang=yarv)<br />
<br />
Ruby:<br />
<br />
Pfannkuchen(11) = 51<br />Time: 87435 ms <br />
<br />
Concept:<br />
Pfannkuchen(11) = 51<br />Time: 40401 ms<br />
<br />
Ruby seems faster than Concept only on recursive calls, but I'm working on that. On the fannkuchen benchmark, Concept is more than 2x faster.<br />
<br />
On Sieve benchmark, Concept scores 8040 iterations/second, while V8 scores on the same machine about 20000, but it uses far more memory. For now, I think that Concept has the optimal balance between speed and memory usage.<br />
<br />
<span style="font-size: large;">Concept Workers</span><br />
<br />
When dealing with multit-hreaded applications, Concept MT core is significantly slower compared to the standard core. This is because it uses a global semaphore for synchronizing threads. The best alternative were the green threads, which are cheap, fast and don't need synchronization. The main drawback is that a blocking call, will block all the green threads. The alternative is the use of a worker.<br />
<br />
A worker is a thread that runs in a different context, and exchange data via various APIs with the main thread.<br />
<br />
Consider the following example:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-j_GNJ5hO3E4/VSOzAH0WihI/AAAAAAAAA04/FejCSeEl3Yo/s1600/worker.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-j_GNJ5hO3E4/VSOzAH0WihI/AAAAAAAAA04/FejCSeEl3Yo/s1600/worker.png" height="640" width="524" /></a></div>
<br />
Notice that the ChildWorker constructor simply waits for data (via Worker::Pending) and notifies the result via Worker::Result. I was inspired by the javascript web workers, with one exception: the worker runs in the same application (no need for external files).<br />
<br />
<span style="font-size: large;">Speech recognition</span><br />
<br />
Concept 4.1 brings a wrapper for the pocketsphinx library. To see it in action, check the <a href="http://devronium.com/playground.html" target="_blank">speech recognition example here</a>.<br />
<br />
As usual, lots of bugs are now fixed, new APIs for SIP protocol and DTMF, and a more advanced profiler, capable of showing the memory usage,<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-i3-yVthv1Ak/VSO0kuNskKI/AAAAAAAAA1E/bd91AhX99fU/s1600/p2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-i3-yVthv1Ak/VSO0kuNskKI/AAAAAAAAA1E/bd91AhX99fU/s1600/p2.png" height="320" width="302" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://devronium.com/~eduard/p2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-49531150455250338642015-02-11T22:07:00.005+02:002015-02-11T22:07:52.798+02:00Concept 4.0Concept 4.0 stable is finally released. A lot has changed, I think it has the biggest code rewrite since I've started. Is the fastest Concept core, the most memory efficient until now. On Windows it uses <i>dlmalloc</i> as an efficient memory allocator (replacing the standard malloc). It also uses memory pools for variables. It uses shared workers for handling multiple users in the same process, reducing the memory used, and scaling almost linearly. It has an advanced memory compensation engine, for better application feel on high-error connections. It introduces lots of new APIs, from TLS sockets, SSH and wkhtmltopdf/image to loopers (functions called when the main loop is idle). <br />
<br />
Concept Application Server 4.0 is entirely written in Concept, using only green threads (non-blocking I/O). When compared with previous C/C++ version (3.0), it uses far less CPU cycles and memory.<br />
<br />
Besides the core optimization, the most powerful new feature is the new JS client - Concept Client 4.0 JS (in early beta for now). Now every Concept application ever written may be run directly in a HTML 5 browser. It is tested with Chrome, Firefox, Opera and Internet Explorer 11.<br />
<br />
Even Concept IDE and Gyro may be run in browser:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-2Fbk6qpRQOE/VNu0J2bIEsI/AAAAAAAAAys/O1AksvIGypQ/s1600/c1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-2Fbk6qpRQOE/VNu0J2bIEsI/AAAAAAAAAys/O1AksvIGypQ/s1600/c1.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-kL6MKSYBybA/VNu0Jxf4dGI/AAAAAAAAAyw/kLAq4SjaWzE/s1600/c2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-kL6MKSYBybA/VNu0Jxf4dGI/AAAAAAAAAyw/kLAq4SjaWzE/s1600/c2.png" height="215" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-780zza4q7as/VNu0J61hgtI/AAAAAAAAAy0/Ybvl8nqHxFY/s1600/c3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-780zza4q7as/VNu0J61hgtI/AAAAAAAAAy0/Ybvl8nqHxFY/s1600/c3.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-7s04DYZ5bv0/VNu0KgfavzI/AAAAAAAAAz8/jdGInKzjnu0/s1600/g0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-7s04DYZ5bv0/VNu0KgfavzI/AAAAAAAAAz8/jdGInKzjnu0/s1600/g0.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ltKz7Y5lEi4/VNu0K9_0wjI/AAAAAAAAAy8/m1j5Iyv0FTE/s1600/g1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ltKz7Y5lEi4/VNu0K9_0wjI/AAAAAAAAAy8/m1j5Iyv0FTE/s1600/g1.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-LPDxNp1O1BU/VNu0LJpLRkI/AAAAAAAAAzA/LqaOJaIaQ98/s1600/g2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-LPDxNp1O1BU/VNu0LJpLRkI/AAAAAAAAAzA/LqaOJaIaQ98/s1600/g2.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-REYfPaJpBOw/VNu0LvrNJkI/AAAAAAAAAzI/Qm5ytKtwFZs/s1600/g3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-REYfPaJpBOw/VNu0LvrNJkI/AAAAAAAAAzI/Qm5ytKtwFZs/s1600/g3.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ShgU12XJDAA/VNu0L1VINDI/AAAAAAAAAzQ/l1GhCJc7XD0/s1600/g4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ShgU12XJDAA/VNu0L1VINDI/AAAAAAAAAzQ/l1GhCJc7XD0/s1600/g4.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-tM6j6OYBPgg/VNu0MVeT5mI/AAAAAAAAAzU/9o9Jw35nwes/s1600/g5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-tM6j6OYBPgg/VNu0MVeT5mI/AAAAAAAAAzU/9o9Jw35nwes/s1600/g5.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-bV0CHnSFHoQ/VNu0M1uKAwI/AAAAAAAAAzc/KhVOcV7xt-0/s1600/g6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-bV0CHnSFHoQ/VNu0M1uKAwI/AAAAAAAAAzc/KhVOcV7xt-0/s1600/g6.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Ysnncm-vvDI/VNu0M6vbdWI/AAAAAAAAAzk/f0y4hvEWOwQ/s1600/g7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Ysnncm-vvDI/VNu0M6vbdWI/AAAAAAAAAzk/f0y4hvEWOwQ/s1600/g7.png" height="216" width="400" /></a></div>
<br />
<br />
You can even try some applications. For example, a simple application for converting websites to images (png) can be found <a href="http://devronium.com/~eduard/do.html" target="_blank">here</a> (about 100 lines of code).<br />
<br />
Even audio codecs are supported in browser (Speex and Opus). A simple VoIP + Video application can be found <a href="http://devronium.com/~eduard/call.html" target="_blank">here</a>. It has about 350 lines of code.<br />
<br />
GyroGears will be optimized next, to generate web-friendly applications (for now the applications look like classic desktop applications).Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-75467546906491482702014-10-27T15:39:00.001+02:002014-10-27T15:49:40.545+02:00Concept 4.0Two months ago I've decided to start planning for Concept 4.0, just after CAS 3.0 was updated to most of my users. I skipped any intermediated version because is an entire new server and client. The main feature of the CAS 4 is the scalability. For this, the new server is written entirely in Concept (dropping the C/C++ server), and is a single-thread, polling server. It relays on green threads and non-blocking IO for performance.<br />
<br />
Here you can see a memory usage comparison between Concept 3.0 (see the green line) and 4.0 (the blue line) for a small (mobile) application.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-tIqfQ2i1AHM/VE5HfoCcgzI/AAAAAAAAAxU/THADT-hSKSY/s1600/smallapp34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-tIqfQ2i1AHM/VE5HfoCcgzI/AAAAAAAAAxU/THADT-hSKSY/s1600/smallapp34.png" height="166" width="400" /></a></div>
<br />
For an enterprise application (test was done for a real-world ERP application): <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-uXMCvbDVqak/VE5H8bgDfkI/AAAAAAAAAxc/RY9K63xZlJk/s1600/bigapp34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-uXMCvbDVqak/VE5H8bgDfkI/AAAAAAAAAxc/RY9K63xZlJk/s1600/bigapp34.png" height="172" width="400" /></a></div>
<br />
<br />
This means that a concept:// application has a very small footprint for each additional user. This is because now, you can choose to put all the users in the same process, sharing the same resources.<br />
<br />
You could easily keep tens of thousands (possibly hundreds of thousands) of users on the same server.<br />
<br />
This is only half of what CAS 4.0 brings. Concept 4.0 doesn't need a dedicated thin client anymore (you can still use it, but is optional). The new concept:// client is written in JavaScript and is based on web sockets and HTML5.<br />
<br />
You can even do real-time communication applications:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-_0LSKpMJ10o/VE5JLUeF_AI/AAAAAAAAAxo/UZaFxC_1Scc/s1600/realtime.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-_0LSKpMJ10o/VE5JLUeF_AI/AAAAAAAAAxo/UZaFxC_1Scc/s1600/realtime.png" height="211" width="400" /></a></div>
Audio and video is supported directly in your browser (as long as it is Firefox, Chrome or Opera). All major browsers are running concept:// client, but Safari and Internet Explorer 11 still don't support microphone and webcam capture.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-a06qlMrDjsU/VE5KI-Dyg3I/AAAAAAAAAx0/rS2TzE1ic2w/s1600/is6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-a06qlMrDjsU/VE5KI-Dyg3I/AAAAAAAAAx0/rS2TzE1ic2w/s1600/is6.png" height="215" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-jySQzLeR8wA/VE5Kf5-VlZI/AAAAAAAAAyA/FE8X4OkC8Z0/s1600/is9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-jySQzLeR8wA/VE5Kf5-VlZI/AAAAAAAAAyA/FE8X4OkC8Z0/s1600/is9.png" height="225" width="400" /></a></div>
<br />
Now every GyroGears applications runs directly in browser with a very small footprint, being able to handle large amounts of simultaneous users.<br />
<br />
I hope to have the first BETA version early January 2015.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-39333101848948884582014-07-30T08:16:00.003+03:002014-07-30T08:16:43.148+03:0010 years of ConceptAlready 10 years since the first Concept 1.0 release... Countless white nights all for a passion. Is now the most complex project I've been working on. It was fun, sometimes frustrating, and fueled only by my passion. The Concept Book is now almost ready (I hope to find an editor in august).<br />
<br />
Concept Client 3.0 is now finally released but available only on Windows. I hope that next week it will be available on Linux and Mac (64bit only).<br />
<br />
Between tens of bug-fixes, I managed to add a nice feature to GyroGears: a form designer. Gyro automatically generates all the forms, but in some cases, a manual design may be needed.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-h-DWy8pHMJo/U9h_B677J4I/AAAAAAAAAwk/l_1JebfvviU/s1600/gs1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-h-DWy8pHMJo/U9h_B677J4I/AAAAAAAAAwk/l_1JebfvviU/s1600/gs1.png" height="216" width="400" /></a></div>
Activating the marked link will open the form designer:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-wN22okqbzLU/U9h_CHSo5uI/AAAAAAAAAwo/aNBCP2HUh-M/s1600/gs2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-wN22okqbzLU/U9h_CHSo5uI/AAAAAAAAAwo/aNBCP2HUh-M/s1600/gs2.png" height="216" width="400" /></a></div>
<br />
This is very useful for specific layout requests. However, I don't recommend using this feature, because it could provide an inconsistent layout through the application. GyroGears forms all identical in layout for a given application. When adding a custom form, it may interfere with the application usability.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com1tag:blogger.com,1999:blog-4752126961947866886.post-35117503413325736392014-07-15T15:52:00.001+03:002014-07-15T15:52:04.079+03:00Concept 3.0 developing toolsConcept 3.0 is now finally available. The server itself is stable (the engine is available since version 2.6), but now the also Concept Client 3.0 is available.<br />
<br />
It comes with a brand new IDE, Concept IDE 2.0.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ru5_bDUClNQ/U8UfC8XgRLI/AAAAAAAAAvs/iZGoYDPOKk0/s1600/ide0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ru5_bDUClNQ/U8UfC8XgRLI/AAAAAAAAAvs/iZGoYDPOKk0/s1600/ide0.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-jPAdUNUGLME/U8UfC6_zNUI/AAAAAAAAAvk/TPHQBZnDiTo/s1600/ide1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-jPAdUNUGLME/U8UfC6_zNUI/AAAAAAAAAvk/TPHQBZnDiTo/s1600/ide1.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-6wGghkK-W5o/U8UfC1bk6mI/AAAAAAAAAvo/X99Q8d9WBWw/s1600/ide2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6wGghkK-W5o/U8UfC1bk6mI/AAAAAAAAAvo/X99Q8d9WBWw/s1600/ide2.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-uX1T7BufjBI/U8UfDrSgXLI/AAAAAAAAAvw/VdN9suWF43k/s1600/ide3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-uX1T7BufjBI/U8UfDrSgXLI/AAAAAAAAAvw/VdN9suWF43k/s1600/ide3.png" height="216" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-1nwTj6kWOno/U8UfD8biO4I/AAAAAAAAAv0/Xm1Gu5GtLKM/s1600/ide4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-1nwTj6kWOno/U8UfD8biO4I/AAAAAAAAAv0/Xm1Gu5GtLKM/s1600/ide4.png" height="216" width="400" /></a></div>
<br />
Glade was dropped in favor of RDesigner, a Concept-native UI designer that can handle both glade and the new Concept UI XML format.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-9I4rVc51fLg/U8Uj3W2TqLI/AAAAAAAAAwQ/MeCP6P7ZFSI/s1600/GyroQt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-9I4rVc51fLg/U8Uj3W2TqLI/AAAAAAAAAwQ/MeCP6P7ZFSI/s1600/GyroQt.png" height="216" width="400" /></a></div>
<br />
<br />
I've started a face-lift for GyroGears. It will also include a "Custom form designer" based on RDesigner that will allow the developer to define specific forms when needed, replacing the gyro auto-generated forms.<br />
<br />
The final release is planned on the 10th birthday of Concept, in about two weeks. It will include the Concept Client 3.0 deb package and OS X image.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-27953707845299615112014-06-14T20:28:00.003+03:002014-06-14T20:29:43.425+03:00Concept 3.0A lot has happened since the last time I've posted. To start with, I finally written the Concept manual, a 600 pages book describing the Concept programming language and framework. Now I'm looking for an editor that I could afford. I hope that the book will be available in October 2014. <br />
<br />
Let's start with the new stuff in Concept 3.0<br />
<ul>
<li>it comes with in .deb packages for i386 and amd64</li>
<li>added support for GPU programming</li>
<li>added support for libvirt</li>
<li>added code profiler</li>
<li>added SSH APIs</li>
<li>added Modbus protocol support</li>
<li>added tls/ssl support via OpenSSL</li>
<li>added support for the netflow protocol</li>
<li>added new compiler and run-time optimizations that makes Concept run up to two times faster</li>
<li>added support for green threads (beside native threads). Note that I prefer calling green threads "cheap" threads.</li>
<li>has a brand new client, Concept Client 3.0 that dropped GTK in favor of QT (see bellow)</li>
</ul>
<br />
Lets start with the GPU programming. It uses OpenCL and it automatically converts Concept bytecode to GPU bytecode, for example:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-xWbSLAk38aE/U5x9-EQgrtI/AAAAAAAAAuE/dNfRXDivtOU/s1600/parallel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-xWbSLAk38aE/U5x9-EQgrtI/AAAAAAAAAuE/dNfRXDivtOU/s1600/parallel.png" height="243" width="400" /></a></div>
<br />
As you see, all the code is written in Concept (no OpenCL code). The Parallel framework may use both concept code and/or OpenCL code. As a note, for Concept functions, all parameters must be declared by type (see foo4 definition).<br />
<br />
<br />
Now, the Profiler worked miracles for me, making Gyro faster than ever.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-OutyqZ-Dfng/U5x-oc21AWI/AAAAAAAAAuM/MlAC3sYgcKQ/s1600/profiler.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-OutyqZ-Dfng/U5x-oc21AWI/AAAAAAAAAuM/MlAC3sYgcKQ/s1600/profiler.png" height="400" width="396" /></a></div>
<br />
It will give you real-time information directly in the application (via <b>ProfilerForm</b>), or you could use the low-level APIs for background analytic:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-1rMsoGx1urk/U5x_WjKaRII/AAAAAAAAAuY/YoXuEVtueVc/s1600/profilercode.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-1rMsoGx1urk/U5x_WjKaRII/AAAAAAAAAuY/YoXuEVtueVc/s1600/profilercode.png" height="400" width="311" /></a></div>
<br />
Or even simpler, you could just choose "<b>Profiler project</b>" from the Concept IDE.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-GN8J6JBg9uQ/U5x_u_BX6HI/AAAAAAAAAug/0P93-9RQg-0/s1600/cide.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-GN8J6JBg9uQ/U5x_u_BX6HI/AAAAAAAAAug/0P93-9RQg-0/s1600/cide.png" height="310" width="400" /></a></div>
<br />
The <b>green threads</b> are a really cool toy:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-NV39FXeNqjk/U5yAqEmX9gI/AAAAAAAAAus/I86rvKPrw08/s1600/greenthread.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-NV39FXeNqjk/U5yAqEmX9gI/AAAAAAAAAus/I86rvKPrw08/s1600/greenthread.png" height="343" width="400" /></a></div>
<br />
These threads are scheduled directly by the Concept Core, not needing semaphores or any kind of synchronization. These threads are really fast, but are limited to one CPU core. You could combine native threads with green threads for maximum performance. Also, green threads run with the regular Concept Core (not needing the multi-threaded core).<br />
<br />
The Concept Client was completely rewritten. I have hesitated in forcing the Gtk3 version due to stability problems on MS Windows. I've watched the Qt community, forums and list, and I was impressed by the passion of the developers, unlike the Gtk groups where there were mixed posts, both by professionals and "political" individuals involved in ego wars. So, I've rewritten Concept Client on Qt, I even made a converter from .glade files to Qt code. I like that Qt looks and performs better, supports a lot more platforms, and seems stabler. The only advantages of Gtk are the significantly lower memory usage (for the same test application, Concept Client Qt uses 102 MB of memory while Gtk 63 MB). Since I'm talking of a "Client" 40 MB difference is relatively low comparing to the advantages. Qt is faster, more responsive and behaves consistently on every platform. I find Gtk slightly more flexible on "exotic" operations, for example, adding custom controls in a tab header.<br />
<br />
Perhaps the greatest advantage of Qt is the completeness of the framework. It includes webkit, audio, network and event webcam APIs, elements missing in Gtk (I've compiled webkit for gtk, and added OpenCV for webcam support). It also has a sheet control, that Gtk supported only with the additional GtkExtra package. However the GtkExtra developers don't seem to hurry the port to Gtk3.<br />
<br />
It actually looks better:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-TxbwN6277Js/U5yFflztJnI/AAAAAAAAAu8/e6w0N_JXkPc/s1600/ss.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-TxbwN6277Js/U5yFflztJnI/AAAAAAAAAu8/e6w0N_JXkPc/s1600/ss.png" height="195" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-TxbwN6277Js/U5yFflztJnI/AAAAAAAAAu8/e6w0N_JXkPc/s1600/ss.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><a href="http://2.bp.blogspot.com/-8gqwfaGM-uY/U5yFfjjnsWI/AAAAAAAAAvA/maOcEO3Y73s/s1600/ss2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-8gqwfaGM-uY/U5yFfjjnsWI/AAAAAAAAAvA/maOcEO3Y73s/s1600/ss2.png" height="312" width="400" /></a></div>
<br />
I hope I will manage to post more often in the next month. In August this year, Concept will be 10 years old!<br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-46293148933051156542013-09-22T10:32:00.003+03:002013-09-30T11:57:45.917+03:009 years and one month of Concept Application ServerIt's been 9 years since I've started this project. Now is mature, tested in high load environments, over a hundred end-user solutions implemented by myself. There's a lot of new stuff, both in Concept Application Server and GyroGears.<br />
<br />
For start, Concept 3.0 is almost here, with lots of new features. The main star is the new Concept Client for iOS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-j3rMZefwWsc/Uj6aPY3W9MI/AAAAAAAAAp0/dqy2k6tLRDE/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-j3rMZefwWsc/Uj6aPY3W9MI/AAAAAAAAAp0/dqy2k6tLRDE/s400/1.png" width="225" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-5ZIgNOZDrsQ/Uj6aPeHUIoI/AAAAAAAAAqI/4Vr0w5NeWgs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/-5ZIgNOZDrsQ/Uj6aPeHUIoI/AAAAAAAAAqI/4Vr0w5NeWgs/s400/2.png" width="225" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-5DMvDA6ipb4/Uj6aPRzhnwI/AAAAAAAAApw/mZIMtHdL6go/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-5DMvDA6ipb4/Uj6aPRzhnwI/AAAAAAAAApw/mZIMtHdL6go/s400/3.png" width="225" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-FXdpZEPAAOM/Uj6aP_WYtLI/AAAAAAAAAp8/AUEruWpIMaE/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-FXdpZEPAAOM/Uj6aP_WYtLI/AAAAAAAAAp8/AUEruWpIMaE/s400/4.png" width="225" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-lINP43M8rOw/Uj6aQb-XtuI/AAAAAAAAAqE/CLu62NJmuFA/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-lINP43M8rOw/Uj6aQb-XtuI/AAAAAAAAAqE/CLu62NJmuFA/s400/5.png" width="225" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-yV5gBXYOtEM/Uj6aQ4wvJVI/AAAAAAAAAqc/RU1k-EBCCqA/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-yV5gBXYOtEM/Uj6aQ4wvJVI/AAAAAAAAAqc/RU1k-EBCCqA/s400/6.png" width="225" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-PmniVpGqxTQ/Uj6aQyFBnrI/AAAAAAAAAqY/GBV1QkQjw2c/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://2.bp.blogspot.com/-PmniVpGqxTQ/Uj6aQyFBnrI/AAAAAAAAAqY/GBV1QkQjw2c/s400/7.png" width="225" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-dyAfofXmF7k/Uj6aRIhPd4I/AAAAAAAAAqU/bZbgJa3OHGM/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-dyAfofXmF7k/Uj6aRIhPd4I/AAAAAAAAAqU/bZbgJa3OHGM/s400/8.png" width="300" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-RZsbSTfLDUM/Ukk88sxWmnI/AAAAAAAAArA/hw5VFyrbE-M/s1600/iOS%2520Simulator%2520Screen%2520shot%2520Sep%252029,%25202013%25208_25_33%2520PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-RZsbSTfLDUM/Ukk88sxWmnI/AAAAAAAAArA/hw5VFyrbE-M/s400/iOS%2520Simulator%2520Screen%2520shot%2520Sep%252029,%25202013%25208_25_33%2520PM.png" width="225" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
For Gyro, lots of bug fixes and a new UI model for child entities was added. Now, you can show all the info using the same window (without opening new child windows). It's a tab-bar style view.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Also, drag-and-drop of files/images is now cleaner.</div>
<div class="separator" style="clear: both; text-align: left;">
Mobile applications generated by GyroGears are now read/write, and use the same source code and binary for both Android and iOS.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
DRM API's are available in beta, as a new feature in Concept 3.0.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Concept Client for OS X 10.8 is now up-to-date, and soon a binary packet for Concept Application Server will be available for OS X.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-62762615666601237582013-03-17T18:16:00.001+02:002013-03-17T18:17:56.706+02:00Concept 2.4Concept 2.4 now available for <a href="http://www.devronium.com/">download</a>. As the main feature is the new JIT (sljit), and some basic code optimization (like dead-code elimination).<br />
<br />
It almost tripled its speed since the first version with JIT. Here is an example for a basic benchmark for arrays + basic operations (lower the better):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-MUe3VVanPFw/UUXp89yRAvI/AAAAAAAAAoE/97d7vvVo1KE/s1600/g1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-MUe3VVanPFw/UUXp89yRAvI/AAAAAAAAAoE/97d7vvVo1KE/s1600/g1.png" /></a></div>
<br />
About 6 times faster than PHP 5.4 and about the same speed with C (gcc, no optimizations).<br />
<br />
I've also ran a Sieve benchmark (higher, the better):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-xcibv0tusrE/UUXqNM5oxKI/AAAAAAAAAoM/01srx_3UyaE/s1600/g2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-xcibv0tusrE/UUXqNM5oxKI/AAAAAAAAAoM/01srx_3UyaE/s1600/g2.png" /></a></div>
<br />
The slight advantage for gcc comes from the fact that Concept core must call a function for accessing array elements, instead of a direct access (like in C/C++). <br />
<br />
For now is fast enough for Concept to be a reasonable choice for CPU-intensive computations.<br />
<br />
Average speed optimization for Concept/JIT is about 800%, but in some particular cases it is more than 2000%.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-72843725355773123132013-02-27T15:45:00.001+02:002013-04-06T11:21:43.147+03:00Concept Application Server 2.4 with 3.0 core<a href="http://2.bp.blogspot.com/-xG7I2EOSLws/US4MAdMLUNI/AAAAAAAAAnY/VgFVz0YFk7A/s1600/benchmark.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a>I've made a few tests with various programming and scripting languages (C/C++, IonMonkey, Chrome V8, Java, PHP 5.4). I've used an implementation for the sieve of Eratosthenes algorithm for the benchmark. As an unexpected result, IonMonkey (Firefox 18 javascript engine) was insanely fast (around C speed).<br />
<br />
As a result, Concept now has a JIT compiler, that fully compiles a function upon the second run. For the standard benchmark (strings + arrays + arithmetic operations + objects) some impressive improvements were noticed. For example, arithmetic operations are about 2000% faster. Function call (context create and free) about 50% faster. Array operations are slightly faster for numbers, the same for strings. String operations already optimized remain the same. Object method call (including constructor call) about 25% faster by reusing memory (instead of freeing the memory, is conserved for the next call, same with objects). So, for the Sieve of Erathostenes repeated 900 times, these are the results (lower, the better):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-uNygEuLyFi0/US4Mz-u1t-I/AAAAAAAAAns/HSMND1zThY8/s1600/benchmark.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-uNygEuLyFi0/US4Mz-u1t-I/AAAAAAAAAns/HSMND1zThY8/s1600/benchmark.png" /></a></div>
<br />
As you can see, the benefits for using JIT are massive. I've chosen to use an existing JIT (<a href="http://sljit.sourceforge.net/">Stack-less JIT compiler</a>). It's incredibly simple and clean, and it took me about 2 days to link it to the Concept Core.<br />
As a note, for PHP, if the Sieve interval is extended from 8193 to 1,000,000 primes, the execution time raises exponentially (v5.4 about 580 seconds, Concept with JIT about 30 seconds). A low interval was chosen as representative for real-life situations.<br />
<br />
For GyroGears, bug fixes and a new feature: import from CSV for related members and export to Excel.<br />
<br />
For now, Concept 2.4 with JIT compiler is available for download.<br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-66392006313110916492013-01-29T00:58:00.002+02:002013-01-29T00:58:49.001+02:00GyroGears and new driverA new "old" database server is supported (without ODBC) both by Concept Application Server and GyroGears: Firebird. It's been a while since I've tested Firebird (and then, it was 1.5 I think) and there were some problems, especially with the "hard-to-use" driver. Now, 2.5 it works great. It still has some limitations, for example maximum column and table name length is only 31. That's now fine with Gyro (it automatically removes characters from the table names).<br />
<br />
Now, Gyro has lots of goodies for the end-user:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-unwu1hs9ewU/UQb_6jMQpoI/AAAAAAAAAmw/J2JntQBSQLk/s1600/bdev1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-unwu1hs9ewU/UQb_6jMQpoI/AAAAAAAAAmw/J2JntQBSQLk/s400/bdev1.png" width="400" /></a></div>
<br />
<br />
For example, the nagging "You forgot to enter Name, Email, etc." window, has been replaced with a red ribbon and highlighting the field. A "switch to fullscreen" button was added that enables you to hide the toolbar. You can also see the new "Single pane" layout, that enables you to use the same space for views and actual forms avoiding opening a new window.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-5kteKrIL2k0/UQcBHwuDOfI/AAAAAAAAAm8/fQe2A8exQzo/s1600/InterSat_CRM_1359413302.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://4.bp.blogspot.com/-5kteKrIL2k0/UQcBHwuDOfI/AAAAAAAAAm8/fQe2A8exQzo/s640/InterSat_CRM_1359413302.png" width="299" /></a></div>
<br />
A feature search panel eases the menu access. The use can just search all the features in an application.<br />
<br />
In Gyro, in all numeric members (integer and decimal) you can now enter formulas, for example, if you enter: <b>2+2*2</b> it will be automatically evaluated to <b>6</b>.<br />
<br />
The server now compiles on Windows 64-bit. Due to some differences, it didn't compile on 64bit Windows. However, on FreeBSD 64 and Linux 64 worked just fine.<br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-29743620897063829392012-12-10T13:46:00.003+02:002012-12-10T13:47:19.116+02:00Usability++I've added hunspell wrappers in Concept Framework (<a href="http://www.radgs.com/docs/help/standard.lib.hunspell.html">http://www.radgs.com/docs/help/standard.lib.hunspell.html</a>).<br />
<br />
Also, I've added into standard.lib.str Soundes, Metaphone and DoubleMetaphone functions.<br />
<br />
I've added a few new gadgets in GyroGears applications.<br />
<br />
1. Autocorrect in search fields (works for almost every language - defaults comes with English (US+GB) and Romanian.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-NAszNhNpixs/UMXK6z9fj8I/AAAAAAAAAmQ/frW92KFeb3k/s1600/s1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="http://4.bp.blogspot.com/-NAszNhNpixs/UMXK6z9fj8I/AAAAAAAAAmQ/frW92KFeb3k/s400/s1.png" width="400" /></a></div>
<br />
2. Spell checker in text views.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-aD4l_sywHkE/UMXLDhRQdFI/AAAAAAAAAmY/g-ucc7k4DoQ/s1600/s2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="147" src="http://4.bp.blogspot.com/-aD4l_sywHkE/UMXLDhRQdFI/AAAAAAAAAmY/g-ucc7k4DoQ/s400/s2.png" width="400" /></a></div>
3. Shortcuts for adding in relation members (see the above screenshots).<br />
<br />
4. Beautify solution for GyroGears. This beautifies your app (aligns labels, chose which columns to be visible by default in views and so on).<br />
<br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-39579640708026465352012-12-02T23:24:00.001+02:002012-12-03T01:05:40.500+02:00GyroGears and usabilityI've had some crazy requests in the last few months. The users (end-users) complained about the usability of Gyro applications, and in some aspects they were right.<br />
<br />
<b>1. Latest complaint: interfaces are ugly, so I'm working at new ones. </b><br />
<br />
This is the new main applications screen:<br />
<br />
<a href="http://1.bp.blogspot.com/-89TQu5F8dcg/ULu5y4eYG1I/AAAAAAAAAk0/YOUdTXU84lA/s1600/ui.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-89TQu5F8dcg/ULu5y4eYG1I/AAAAAAAAAk0/YOUdTXU84lA/s400/ui.png" width="400" /></a> <br />
<br />
If you think it looks like something, rest assured it is not.<br />
<br />
<b>2. The calendar is useless.</b><br />
<br />
I redesigned the calendar. Now it looks like a classic calendar widget, with drag and drop (you can now reschedule an event by moving it to another day/hour).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-nNRetQLpQ38/ULu7R0G9_LI/AAAAAAAAAk8/rKDJJcEZRTA/s1600/ui2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="http://3.bp.blogspot.com/-nNRetQLpQ38/ULu7R0G9_LI/AAAAAAAAAk8/rKDJJcEZRTA/s400/ui2.png" width="400" /></a></div>
<br />
<br />
<br />
<b>3. Database search - redesigned</b><br />
<br />
Pattern search now applies to spaces. So, if somebody looks for "Mikey Mouse", "Mickey The Mouse" will be also returned.<br />
<br />
Three new options for entities in GyroGears:<br />
- search by parent<br />
- show parent as a chain <br />
- child search level<br />
<br />
Let's consider a client who has contracts. In the contracts master view, I can now type the client's name, and it will return all of its contracts. Same logic for child search level. For example, in the client list, I can enter a contract number and see the client with that contract number.<br />
<br />
A few version ago I added "Show parent" options. This way, in a master view, on the first column the parent entity representative member will be shown. But, if parent level was 2 or more, only the final parent shall be shown. When the "show parent as chain", all the parents will be shown. For example, a client, has contracts and on every contract has a service. This way, on the service view, in the parent column, both the contract number and client name will be shown.<br />
<br />
<b>4. Horrible Glade for UI design (developers).</b><br />
<br />
Until now I used glade-window as a method for embedding Glade into CIDE (Concept IDE). This meant that on every new Glade version I had to modify the sources.<br />
<br />
So, I've wrote my own "glade-window.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-MSteu-k7mac/ULu-XIFWRNI/AAAAAAAAAlQ/5XxOTAr9pQ0/s1600/ui3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="http://4.bp.blogspot.com/-MSteu-k7mac/ULu-XIFWRNI/AAAAAAAAAlQ/5XxOTAr9pQ0/s400/ui3.png" width="400" /></a></div>
<br />
Also GTK3 is now used on Windows too.<br />
<br />
<br />
<b>5. Editable ComboBoxes for many to one relations</b><br />
<br />
For many to one relations you could set in GyroGears "use a combo". Now, you can also set "editable combo box". This way the user can perform a quick look-up for the given member.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-VNdn0XimmFw/ULvAy_aMM8I/AAAAAAAAAlY/Fm7TKjdA8as/s1600/ui4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="http://3.bp.blogspot.com/-VNdn0XimmFw/ULvAy_aMM8I/AAAAAAAAAlY/Fm7TKjdA8as/s400/ui4.png" width="400" /></a></div>
<br />
<b>6. Too many "Save" buttons for modifying a child object</b><br />
<br />
When you check "enable send to" for a relation, now you get this cool context menu.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-GLCzyDqHG5M/ULvB73NFxGI/AAAAAAAAAlg/NflSnp6VlQE/s1600/ui6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="113" src="http://1.bp.blogspot.com/-GLCzyDqHG5M/ULvB73NFxGI/AAAAAAAAAlg/NflSnp6VlQE/s400/ui6.png" width="400" /></a></div>
<br />
This enables the used to add a child object, without editing the parent (and so, avoiding a lock).<br />
<br />
<b>7. Localization and international support.</b><br />
<br />
A company in Jordan has Arab employees and Romanian management. So, for the same application, two different languages were needed. This was already fine with Gyro. Now is perfect.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-dF1zjwQGM38/ULvC_1LfL6I/AAAAAAAAAlo/o7mBg3Zxt6Y/s1600/ui7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="http://4.bp.blogspot.com/-dF1zjwQGM38/ULvC_1LfL6I/AAAAAAAAAlo/o7mBg3Zxt6Y/s400/ui7.png" width="400" /></a></div>
<br />
Also, date and time can now be formatted. (Eg: %d/%m/%Y %H:%M).<br />
<br />
<b>8. Telephony integration</b><br />
<br />
I've added a SIPPhone class in the Concept Framework. This allows you to initiate a call, answer one and talk using a high level interface.<br />
<br />
This is somehow cool if we talk about a CRM, and the client calls in. Then, the application automatically detects the client and opens his or her records.<br />
<br />
<b>9. Button press feedback for image buttons on mobile client</b><br />
<br />
A friend of mine tried Concept Client Mobile. He complained about the lack of feedback when he pressed an image button. So, I've added a gray tint when the button was pressed.<br />
<br />
<b>10. Flash in WKB (Concept Webkit Browser) on Windows (thanks to Midori)</b><br />
<br />
WebKitGtk finally works as it should on Windows. Also, the left key doesn't hang up the WYSIWYG editors.<b> </b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-MB9P0qGoBSw/ULvJS-6IUtI/AAAAAAAAAl8/AJglTMuyn5U/s1600/ui8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="207" src="http://4.bp.blogspot.com/-MB9P0qGoBSw/ULvJS-6IUtI/AAAAAAAAAl8/AJglTMuyn5U/s400/ui8.png" width="400" /></a></div>
<br />
<br />
<br />
This week I will modify the data input interface and add keyboard shortcuts for various operations.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-75401775454468719062012-10-28T21:01:00.003+02:002012-10-28T21:18:33.248+02:00New features for GyroGearsI've spent nearly 80 hours talking with GyroGears users (both programmers and non-programmers). A year ago the support for smarty-like templates was dropped in favor of XSLT. Then I used Sablotron but switched later to libxslt2 (easier to install). Now, the developers asked me about the possibility of calling Concept functions from XSLT, and I've said no. Not because is not possible, but because I consider it bad practice. However I've been asked about this so many times that I've decided to implement it. I've made a very simple interface - just one function that registers all members of a class:<br />
<br />
XSLTRegister(object[, alias, namespace]).<br />
<br />
So, you can just call XSLTRegister(this) and you will be able to call from the XSLT every function.<br />
<br />
Also, Gyro now generates interfaces functions for XSLT. You could call something like:<br />
<br />
<b><xsl:variable name="invoices" select="csp:WU_Client.GetInvoices(__DBID)"/></b>
<br />
<br />
Or even:<br />
<b><xsl:variable name="clients" select="csp:WU_Client.Search('some client name')"/></b>
<br />
<br />
And then:<br />
<br />
<b>
<xsl:for-each select="invoices/array/element"><br />
Amount: <xsl:value-of select="invoices/array/element/Amount"/><br/>
</xsl:for-each>
</b>
<br />
<br />
<br />
<br />
<br />
Also, 3 features were implemented:<br />
<br />
Reorderable flag for entities (you can reorder objects by drag and drop - lots of fun playing with this one) and reorderable flag for relations (just for non-exclusive ones). This allows the user to reorder objects in related views without affecting the master view order.<br />
<br />
The third one - a flag for linking an object list to every HTTP script (for example an entity called "Menu" with this flag set to true will cause the menu items to be linked to every script.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Gv4vnqp4pjA/UI2A4ehsIjI/AAAAAAAAAkc/oEgdHmK-Pn0/s1600/s1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="http://4.bp.blogspot.com/-Gv4vnqp4pjA/UI2A4ehsIjI/AAAAAAAAAkc/oEgdHmK-Pn0/s400/s1.png" width="400" /></a></div>
<br />
As usual lots of bugs fixed. One was linked with the usage of filters on relation fields.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-16449746272037054972012-10-08T17:14:00.002+03:002012-10-24T13:06:22.753+03:00Android Client and GyroGears MobileIt's ready and it's cool. Concept Client Android version is available for download (just use your Android device and visit <a href="http://www.devronium.com/">www.devronium.com</a> and download Concept Client. I've managed to make it fully compatible with the existing Concept Framework.<br />
<br />
This means that GyroGears can automatically generate Android Applications.<br />
<br />
Take a look at how it looks:<br />
<span id="goog_1334448505"></span><span id="goog_1334448506"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-3xP3pe_X098/UHLffUxyPKI/AAAAAAAAAh8/LogkLhQkzqg/s1600/screenshot_2012-10-08_1154.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-3xP3pe_X098/UHLffUxyPKI/AAAAAAAAAh8/LogkLhQkzqg/s320/screenshot_2012-10-08_1154.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-zfs5Dpd3sDQ/UHLfhvC9JmI/AAAAAAAAAiQ/CvYQxP8i7f0/s1600/screenshot_2012-10-08_1252.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-zfs5Dpd3sDQ/UHLfhvC9JmI/AAAAAAAAAiQ/CvYQxP8i7f0/s320/screenshot_2012-10-08_1252.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-9WU0yvM-BWw/UHLfix4eyOI/AAAAAAAAAik/Y6IVNkeZbkA/s1600/screenshot_2012-10-08_1255.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-9WU0yvM-BWw/UHLfix4eyOI/AAAAAAAAAik/Y6IVNkeZbkA/s320/screenshot_2012-10-08_1255.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-j2U9TYv4R20/UHLfjoF3ryI/AAAAAAAAAio/wa7Rbg40sCI/s1600/screenshot_2012-10-08_1527.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-j2U9TYv4R20/UHLfjoF3ryI/AAAAAAAAAio/wa7Rbg40sCI/s320/screenshot_2012-10-08_1527.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_m-V_6xcXbU/UHLfkbrCJkI/AAAAAAAAAis/EwXakfpzB5c/s1600/screenshot_2012-10-08_1529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-_m-V_6xcXbU/UHLfkbrCJkI/AAAAAAAAAis/EwXakfpzB5c/s320/screenshot_2012-10-08_1529.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-E1pqzX2Dko4/UHLfk0DneWI/AAAAAAAAAi4/zNUiXdn4r44/s1600/screenshot_2012-10-08_1529_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-E1pqzX2Dko4/UHLfk0DneWI/AAAAAAAAAi4/zNUiXdn4r44/s320/screenshot_2012-10-08_1529_1.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-WOvB_a_i6rA/UHLflo2VLII/AAAAAAAAAjE/RR70JBh24tU/s1600/screenshot_2012-10-08_1530_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-WOvB_a_i6rA/UHLflo2VLII/AAAAAAAAAjE/RR70JBh24tU/s320/screenshot_2012-10-08_1530_2.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Ms7AWE09vjk/UHLfmiuQaYI/AAAAAAAAAjM/zBQ4b9lHslA/s1600/screenshot_2012-10-08_1542.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-Ms7AWE09vjk/UHLfmiuQaYI/AAAAAAAAAjM/zBQ4b9lHslA/s320/screenshot_2012-10-08_1542.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-qajua1uIDOA/UHLfnRX3IlI/AAAAAAAAAjQ/Pfn9pYjgZzE/s1600/screenshot_2012-10-08_1710.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-qajua1uIDOA/UHLfnRX3IlI/AAAAAAAAAjQ/Pfn9pYjgZzE/s320/screenshot_2012-10-08_1710.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-FEgKEMmwcXM/UHLfoIZITmI/AAAAAAAAAjY/AwZnZGs99lE/s1600/screenshot_2012-10-08_1710_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-FEgKEMmwcXM/UHLfoIZITmI/AAAAAAAAAjY/AwZnZGs99lE/s320/screenshot_2012-10-08_1710_1.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-VcOYBGz88fI/UHLfo86RObI/AAAAAAAAAjg/9iulBW8S7UA/s1600/screenshot_2012-10-08_1711.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-VcOYBGz88fI/UHLfo86RObI/AAAAAAAAAjg/9iulBW8S7UA/s320/screenshot_2012-10-08_1711.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-JdI0-VDfZdg/UHLfpdLc2eI/AAAAAAAAAjo/4mH2jx0vMeo/s1600/screenshot_2012-10-08_1711_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-JdI0-VDfZdg/UHLfpdLc2eI/AAAAAAAAAjo/4mH2jx0vMeo/s320/screenshot_2012-10-08_1711_1.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-6pTZHkH196Y/UHLfqDyXGUI/AAAAAAAAAjw/UPWsyk3V8qU/s1600/screenshot_2012-10-08_1711_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-6pTZHkH196Y/UHLfqDyXGUI/AAAAAAAAAjw/UPWsyk3V8qU/s320/screenshot_2012-10-08_1711_2.png" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-uWFqDl2Q8j4/UHLfq1JuvDI/AAAAAAAAAj4/wtXyM3sumD4/s1600/screenshot_2012-10-08_1251.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="http://4.bp.blogspot.com/-uWFqDl2Q8j4/UHLfq1JuvDI/AAAAAAAAAj4/wtXyM3sumD4/s320/screenshot_2012-10-08_1251.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Zju1eUH_rRA/UHLgcn5D-TI/AAAAAAAAAkE/yiXFCzhqGCE/s1600/screenshot_2012-10-08_1716.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-Zju1eUH_rRA/UHLgcn5D-TI/AAAAAAAAAkE/yiXFCzhqGCE/s320/screenshot_2012-10-08_1716.png" width="179" /> </a> </div>
<span id="goog_1334448505"></span><span id="goog_1334448506"></span><br />
Just remember that everything (except the last one) is automatically generated by GyroGears in only a few seconds.<br />
<br />
The last screenshot is my telephony application based entirely on Concept Application Server (even the Telephony server is Concept-based)..Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-24652327605641291312012-09-10T13:59:00.002+03:002012-09-10T14:01:03.500+03:00Concept Client 2.0 Android Beta1After implementing 2 mobile clients, one based on MoSync and another one based on Marmalade, I've decided to implement using "the native way". I've made the Concept Client 2.0 for Android devices using only Android SDK and NDK (the socket layer).<br />
<br />
After looking into MoSync, I can say that is a nice platform but with a big drawback: the sockets. They implement AsyncSocket and it is a good idea, however, this cannot be a solution for every situation. Just think at a VoIP application.<br />
<br />
On the other hand, Marmalade has better sockets and low level APIs, and is significantly faster. However the support is almost zero (Maybe for enterprise licenses is different). Also, the native user interface (IwNUI) it lacks lots of functionality. Audio API's are almost impossible to use, at least if we're talking about streaming (you cannot use locks in audio callbacks).<br />
<br />
Now, Android SDK and NDK is straight forward. I've ported the client in about 7 days, which is fine. Next to come is iOS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-UZ0X_0_ZSBE/UE3H1bBsQPI/AAAAAAAAAhg/RLaZGgm860s/s1600/screenshot_2012-09-10_1339_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-UZ0X_0_ZSBE/UE3H1bBsQPI/AAAAAAAAAhg/RLaZGgm860s/s320/screenshot_2012-09-10_1339_1.png" width="179" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-vS7fGNDOiFM/UE3HWE3BBVI/AAAAAAAAAhU/lO5QHzyb6FY/s1600/screenshot_2012-09-10_1340.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-vS7fGNDOiFM/UE3HWE3BBVI/AAAAAAAAAhU/lO5QHzyb6FY/s320/screenshot_2012-09-10_1340.png" width="179" /></a></div>
<br />
This is from a VoIP application that I'm working on - entirely Concept Application Server - based.<br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-89308617097490215762012-08-04T08:59:00.000+03:002012-08-04T09:57:47.852+03:008 years of ConceptIt's been 8 years from the first working version of Concept. Now, it's mature, stable, feature rich and used in production in over 200 applications.<br />
<br />
As usual lots of bug-fixes, and new features:<br />
<ul>
<li>a bug in MySQL interface library that caused a crash when reading blobs of considerable size</li>
<li>UDP socket support</li>
<li>New multi-threading core library (uses the same code base - it must be compiled with -DSIMPLE_MULTI_THREADING). With this option you can create applications that are writing to the same variables without any need of semaphores. The speed penalty for non-threaded scripts is under 5% and but when running a multi-threaded script, the penalty can range from 5% to 100% depending on number of memory writes. For usual applications is about 6% to 10%. Also, there is no memory overhead.</li>
<li>Faster Garbage Collector (hundreds of time faster) by replacing the pointer list with std::set.
- About 7% less memory used. The optimization is made on variables, 32 bits less memory used by each string variables and 64 bits less for each non-string variable.</li>
<li>SIP stack library ported to Concept (work in progress)
Now, the really cool new feature is in GyroGears. For every generated application it automatically generates the migration script for SQL-based database. NoSQL is to come, and automatic migration from SQL to NoSQL. The problem with NoSQL (MongoDB) is that it uses a different id-system, and the migration cannot be done one to one. Now, you can move from one server to another and back in a few minutes. It supports MySQL, PostgreSQL, SQLite, NuoDB, ODBC amd Firebird (via ODBC).
For migration, you just run the required script in migrate.prev folder (ServerRoot/MyProjects/YourAppName/migrate.prev). </li>
</ul>
<br />
Here's a multi-threading example using the concept MT core - as you will see, no semaphore are used for threads accessing the same variables.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-BZaGmmhNg_8/UBy5ahijhgI/AAAAAAAAAg0/lJ7RCxaRhLQ/s1600/threading.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-BZaGmmhNg_8/UBy5ahijhgI/AAAAAAAAAg0/lJ7RCxaRhLQ/s1600/threading.png" /></a></div>
<br />
<code></code>Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-45256968791847519882012-06-28T12:00:00.001+03:002012-06-28T12:38:30.743+03:00SVG SurfaceA few months ago I've made an experiment: I've created a canvas-independent class that rendered on a <a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics">SVG</a>. Then, I've added a simple interface that allowed me to render the SVG on an operating-system dependent surface. This was a base for an UI based on SVG and completely independent of the OS. After a few more testing, I've decided to integrate this surface in Concept Client 2.0.190. So here it is:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-dfacAsOR3Aw/T-wb7slrgoI/AAAAAAAAAgo/D9TciuBIVUo/s1600/svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="http://3.bp.blogspot.com/-dfacAsOR3Aw/T-wb7slrgoI/AAAAAAAAAgo/D9TciuBIVUo/s400/svg.png" width="400" /></a></div>
<br />
All the buttons are defined in XML:<br />
<br />
<b>_Common.svg</b><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code><svg width="500" height="300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient1">
<stop stop-color="#ffb100" offset="0"/>
<stop stop-color="#ffb100" stop-opacity="0.498039" offset="0.5"/>
<stop stop-color="#ffffff" offset="1"/>
</linearGradient>
<linearGradient y2="-0.000052" x2="0.519006" y1="2.485417" x1="0.527431" id="linearGradient11" xlink:href="#linearGradient1"/>
<linearGradient id="linearGradient2">
<stop stop-color="#ffff00" offset="0"/>
<stop stop-color="#ffff00" stop-opacity="0.498039" offset="0.5"/>
<stop stop-color="#ffffff" offset="1"/>
</linearGradient>
<linearGradient y2="-0.000052" x2="0.519006" y1="2.485417" x1="0.527431" id="linearGradient12" xlink:href="#linearGradient2"/>
<linearGradient id="linearGradient3">
<stop stop-color="#ffb1ff" offset="0"/>
<stop stop-color="#ffb1ff" stop-opacity="0.498039" offset="0.5"/>
<stop stop-color="#ffffff" offset="1"/>
</linearGradient>
<linearGradient y2="-0.000052" x2="0.519006" y1="2.485417" x1="0.527431" id="linearGradient13" xlink:href="#linearGradient3"/>
</defs>
<metadata>image/svg+xml</metadata>
</svg>
</code></pre>
<br />
<b>Button.svg</b><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code><control class="Button">
<svg for="normal" width="70" height="30">
<rect fill="url(#linearGradient11)" stroke-width="0.799956" stroke-opacity="0.805" ry="5.809992" y="0" x="0" height="100%" width="100%"/>
</svg>
<svg for="prelight" width="70" height="30">
<rect fill="url(#linearGradient12)" stroke-width="0.799956" stroke-opacity="0.805" ry="5.809992" y="0" x="0" height="100%" width="100%"/>
</svg>
<svg for="clicked" width="70" height="30">
<rect fill="url(#linearGradient13)" stroke-width="0.799956" stroke-opacity="0.805" ry="5.809992" y="0" x="0" height="100%" width="100%"/>
</svg>
</control>
</code></pre>
<b><br /></b><br />
<b>Label.svg</b><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code><control class="Label" passive="1">
<svg for="normal" width="70" height="30">
<text style="font-size: 12; fill:#A0A0A0; font-style:bold; stroke-width:2px; font-family: verdana, arial, sans-serif;" id="text3208" y="100%" x="0" xml:space="preserve">Hello !</text>
</svg>
<svg for="prelight" width="70" height="30">
<text style="font-size: 12; fill:#ffffff; font-style:bold; stroke-width:2px; font-family: verdana, arial, sans-serif;" id="text3208" y="100%" x="0" xml:space="preserve">Hello !</text>
</svg>
<svg for="clicked" width="70" height="30">
<text style="font-size: 12; fill:#FF8080; font-style:bold; stroke-width:2px; font-family: verdana, arial, sans-serif;" id="text3208" y="100%" x="2" xml:space="preserve">Hello !</text>
</svg>
</control>
</code></pre>
<br />
<br />
This surface enables you do easily define your own custom controls.<br />
<br />
I think that this will be the base for Concept Client 4.0 IF and only IF I decide do get rid of GTK+. Gtk is a fabulous UI framework, but moving to my own, backwards-compatible framework, it will give Concept Applications a nicer look and feel. This is just an idea. Most probably I will use both GTK+ and SVG surfaces.<br />
<br />
Now, this is Gyro! <br />
<br />
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='580' height='480' src='https://www.blogger.com/video.g?token=AD6v5dxS-Azo_NKvAZAiNL-ghEosyilMfcJOJLfYFDX-L-tjWm79OFNnng7l1AGC5Ud9hxidtdaTDk-OPJYwZ7bvVA' class='b-hbp-video b-uploaded' frameborder='0'></iframe><br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-30522103255626334862012-06-26T14:16:00.001+03:002012-06-26T14:16:35.773+03:00TreeviewliciousI've implemented lots of CRM's and search engines using GyroGears. Once in a while I get some unusual request, that GyroGears cannot fulfill<br />
<br />
This happened yesterday, two times. A CRM client asked for a solution to group similar client requests in view. Something like the e-mails. You get an e-mail, then a reply, and so on.<br />
<br />
So I've decided to add this feature (it was done at about 2 AM in the morning).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Zu5hfCheb20/T-mShpHMayI/AAAAAAAAAgU/4wxepPDN2aw/s1600/d1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="http://3.bp.blogspot.com/-Zu5hfCheb20/T-mShpHMayI/AAAAAAAAAgU/4wxepPDN2aw/s400/d1.png" width="400" /></a></div>
<br />
As you can see, the "Cereri" (it means "Requests") objects are grouped together (Notice the expander).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-foG9LTicE0E/T-mSic4wxbI/AAAAAAAAAgY/5vQTGyWulws/s1600/d2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="http://2.bp.blogspot.com/-foG9LTicE0E/T-mSic4wxbI/AAAAAAAAAgY/5vQTGyWulws/s400/d2.png" width="400" /></a></div>
<br />
And all this is done by using a flag "Show in tree view when possible". No other configuration required.<br />
<br />
Now, about the second feature. This it will take me a few days. A client of mine asked to use simultaneous AND and OR filters. Now the filters are combined with AND by default and can be combined with OR by default. But never both AND and OR. This is now on my todo list, I hope to have it ready in about a week or so.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-38271312993537469322012-06-21T20:22:00.000+03:002012-06-21T20:22:11.920+03:00GyroliciousI've had some unusual requests in the last two weeks, so I've decided to implement them in Gyro core.<br />
<br />
The users asked for navigation buttons (next/previous) for objects. This derives from the fact that all day are using web browsers. And a web browser has next and previous buttons, so here there are:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-XUIvXw65T94/T-NVuCVVCJI/AAAAAAAAAgA/aD5faROrqjI/s1600/s2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="http://3.bp.blogspot.com/-XUIvXw65T94/T-NVuCVVCJI/AAAAAAAAAgA/aD5faROrqjI/s400/s2.png" width="400" /></a></div>
<br />
Even the cursor now follows the displayed object. This is a really simple feature asked by the users.<br />
<br />
In several projects I've needed a way to filter some records by some "assigned users". For example in a project management solution, it is possible to add a member called "Responsible" defined as a relation with the user entity. Then, you can set the member as a filter member, and when a user that is listed in the responsible field logs in, it will see only his tasks. Here is a simple example - a meeting and some invited users:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ZhV7aFN2iwg/T-NWpVyEWBI/AAAAAAAAAgI/sZTeEM2nFlY/s1600/s1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="http://2.bp.blogspot.com/-ZhV7aFN2iwg/T-NWpVyEWBI/AAAAAAAAAgI/sZTeEM2nFlY/s400/s1.png" width="400" /></a></div>
<br />
Now, only the invited users will see the meeting. Do notice the Filter level - a user of a greater level will see all the meetings.<br />
<br />
Another request was regarding Xapian. When using indexed search, there were some limitation: you couldn't use filters, and the search felled back to the database engine (which is not a good idea when performing complex searches). Now, you can filter Xapian data. Also, sort was added for the results. The results are sorted only for equal relevance (sort first by relevance and then by the selected field).<br />
<br />
As usual, lots of bug fixes. The main fix is in Concept Client - there was some inconvenient stuff happening when using multiple displays. The main form opened in a window and, in some cases, the child window in another window. Of course, you can specify programatically what screen to use. Now, the child windows always inherit the parent display.<br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-26169167995076639792012-06-10T02:36:00.000+03:002012-06-10T02:36:13.775+03:00NuoDB driver<a href="http://4.bp.blogspot.com/-Ig52n1Amxl4/T9PdS-duPJI/AAAAAAAAAf0/kRluriufN4c/s1600/nuo_home_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Ig52n1Amxl4/T9PdS-duPJI/AAAAAAAAAf0/kRluriufN4c/s1600/nuo_home_logo.png" /></a>I've tested these days <a href="http://www.nuodb.com/">NuoDB</a>. It's a promising database server, for now in Beta, but there are some problems, that make NuoDB somehow more like a pre-alpha release. It's cool, it's cloud, it's nice and is something that we all want and need: SQL on the NoSQL market - the cloud.<br />
<br />
GyroGears already generates code for NuoDB, but since is so unstable, I don't recommend deploying Gyro applications on NuoDB.<br />
<br />
The driver low level API's are "pre-documented" here:<br />
<a href="http://www.radgs.com/docs/help/standard.db.nuo.html">http://www.radgs.com/docs/help/standard.db.nuo.html</a><br />
<br />
And the high level version:<br />
<a href="http://www.radgs.com/docs/help/NuoConnection.html">http://www.radgs.com/docs/help/NuoConnection.html</a><br />
<a href="http://www.radgs.com/docs/help/NuoDataSet.html">http://www.radgs.com/docs/help/NuoDataSet.html</a><br />
<br />
Also, I've optimized the strings and the arrays in Concept core. I've reduced the number of memory reallocations, resulting in faster indexing times. I've added a compile-time flag for using std::map instead of my key-value implementation.<br />
<br />
std::map is faster than my implementation <b>when</b> adding more than 200,000 key-value pairs, but I'm faster on access. Also, std::map uses at least 1/3 more memory than my implementation, due to its list-style implementation. I use static vectors, that reallocate when needed. This reallocation is somehow slow, but overall, it performs better.<br />
<br />
The string operator += was optimized, being up to 20 times faster now, due to a new memory allocation strategy.<br />
<br />
In Gyro, besides NuoDB driver, I've fixed a bug with pagination, discovered in the new version of Concept Client.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-69868978447864986492012-04-27T16:12:00.002+03:002012-04-27T16:12:56.507+03:00UI 3.0... and is done. Gyro applications have a new look and increased usability.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-jaFWcDO5nvU/T5qaiwU096I/AAAAAAAAAfo/2EHrj3dkDrw/s1600/sn.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="http://3.bp.blogspot.com/-jaFWcDO5nvU/T5qaiwU096I/AAAAAAAAAfo/2EHrj3dkDrw/s320/sn.png" width="320" /></a></div>
<br />
The search bar is now on top of the category tabs, more user preferences, the forms are faster now, and they restore before showing on the screen (avoiding the annoying resize after the form is shown). There are tons of new things, most of them regarding usability(see previous post).<br />
<br />Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-16219866274209206992012-04-18T02:30:00.006+03:002012-04-18T02:39:18.415+03:00UI modelsI've seen some screenshots of enterprise applications, and I've decided that the Gyro application search/results-based UI is not enough for some situations.<br /><br />I've added a new property for every entity (you can actually combine models for different entities):<br /><br /><a href="http://4.bp.blogspot.com/-Fkh3EOUf_8A/T43-ISpDG6I/AAAAAAAAAe8/XSinXZ_Z474/s1600/n2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 308px;" src="http://4.bp.blogspot.com/-Fkh3EOUf_8A/T43-ISpDG6I/AAAAAAAAAe8/XSinXZ_Z474/s400/n2.png" alt="" id="BLOGGER_PHOTO_ID_5732517319108926370" border="0" /></a><br />You can choose from search/results (standard model) or master view/detail, minimizing the number of open forms for the user (and actually increasing the productivity for the end-user).<br /><br /><a href="http://2.bp.blogspot.com/-Fz3Sk7sZ_bU/T43-d033MBI/AAAAAAAAAfI/_EUSbwAGres/s1600/InterSat_CRM_1334705001.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="http://2.bp.blogspot.com/-Fz3Sk7sZ_bU/T43-d033MBI/AAAAAAAAAfI/_EUSbwAGres/s400/InterSat_CRM_1334705001.png" alt="" id="BLOGGER_PHOTO_ID_5732517689075118098" border="0" /></a><br /><br /><a href="http://4.bp.blogspot.com/-IH4_Sx7SMv0/T43-eKLUBXI/AAAAAAAAAfU/UT08ZbgKEto/s1600/InterSat_CRM_1334705035.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="http://4.bp.blogspot.com/-IH4_Sx7SMv0/T43-eKLUBXI/AAAAAAAAAfU/UT08ZbgKEto/s400/InterSat_CRM_1334705035.png" alt="" id="BLOGGER_PHOTO_ID_5732517694793844082" border="0" /></a><br />The screenshots are from an actual application, so I've blurred some of the data.<br /><br />I've modified the home screen (yes, again):<br /><br /><a href="http://3.bp.blogspot.com/-xSjiY0MBa0M/T43-1iD1fgI/AAAAAAAAAfg/iJ_-iRLXG2I/s1600/n1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 308px;" src="http://3.bp.blogspot.com/-xSjiY0MBa0M/T43-1iD1fgI/AAAAAAAAAfg/iJ_-iRLXG2I/s400/n1.png" alt="" id="BLOGGER_PHOTO_ID_5732518096341925378" border="0" /></a><br />And as usual, bug-fixes, most of them regarding the MongoDB applications.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-26897743192120314362012-04-16T09:08:00.007+03:002012-04-17T23:34:38.590+03:00Repli-Gears and bugfixesI had a few days off, just enough to make some new test units for GyroGears. I've noticed that Gtk+ 3.4 is windows-ready, and I'm waiting for the official release. Concept Client already works on Gtk3, but I'm using unofficial windows builds, that have some problems. The biggest problem is with GtkSheet (from gtk+extra), a widget that is not available on Gtk 3. To avoid this, I've modified the RTreeView control, to act in some situations more like a grid.<br /><br /><a href="http://3.bp.blogspot.com/-YzWqz5zoqbg/T4vHUIANV8I/AAAAAAAAAeM/WYYWNP73LGY/s1600/s1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 77px;" src="http://3.bp.blogspot.com/-YzWqz5zoqbg/T4vHUIANV8I/AAAAAAAAAeM/WYYWNP73LGY/s400/s1.png" alt="" id="BLOGGER_PHOTO_ID_5731894099318757314" border="0" /></a>This function was already available, but it wasn't very user friendly. The standard behavior is this: the user presses enter or clicks on the column he wishes to edit, types all the text and presses enter. The cursor doesn't move automatically on the next column. To avoid that, I've modified this behavior, and now, beside the enter key, the user can press the tab key, and the cursor moves automatically and remains in edit mode (Avoiding two key events: press the right arrow key and the enter key). It doesn't seem much, but when dealing with large amounts of data, it can make a difference for the user.<br /><br />The new feature is record duplication.<br /><br /><a href="http://3.bp.blogspot.com/-7gSx9Q0jIHs/T4vIWvtf3jI/AAAAAAAAAeY/P_o-SR2uj4c/s1600/s2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 272px; height: 400px;" src="http://3.bp.blogspot.com/-7gSx9Q0jIHs/T4vIWvtf3jI/AAAAAAAAAeY/P_o-SR2uj4c/s400/s2.png" alt="" id="BLOGGER_PHOTO_ID_5731895243849063986" border="0" /></a><br />This allows the end-user to duplicate a record. This will duplicate all the non-exclusive relations (many-to-*), for the new created object.<br /><br />For the exclusive relations (one-to-*) you can decide in GyroGears if is "duplicable" or not.<br /><br /><a href="http://1.bp.blogspot.com/-YZejpK68lxM/T4vJFAen7-I/AAAAAAAAAek/jVN3dpk145Y/s1600/s3.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 149px;" src="http://1.bp.blogspot.com/-YZejpK68lxM/T4vJFAen7-I/AAAAAAAAAek/jVN3dpk145Y/s400/s3.png" alt="" id="BLOGGER_PHOTO_ID_5731896038624063458" border="0" /></a>If this is checked, the exclusive relation will be duplicated. If the related entity has unique fields, this will bypass the standard validation (this feature is not stupid-proof), and GyroGears will issue a warning.<br /><br />I've switched the default GyroGears web control to RWebKit (dropping RHTML). This is a preparation for Gtk3 (I'm not sure if they will suport GtkHtml anymore). However, I've emulate the old RHTML control using RWebKit, not to affect the existing software (just Concept Client will use the new control).<br /><br /><a href="http://2.bp.blogspot.com/-qVgIm1u-w4M/T4vKJu12HvI/AAAAAAAAAew/7pyOyUlQ7Gg/s1600/s4.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 256px;" src="http://2.bp.blogspot.com/-qVgIm1u-w4M/T4vKJu12HvI/AAAAAAAAAew/7pyOyUlQ7Gg/s400/s4.png" alt="" id="BLOGGER_PHOTO_ID_5731897219300597490" border="0" /></a><br />I've used some nice CSS3 effects like shadow.<br /><br />I've modified the multiple delete and archive engine. Now, if an error is encountered when deleting/archiving, the entire operation is undone (rolled back). I've also speed up these operations that take significantly less time when dealing with large amounts of data.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0tag:blogger.com,1999:blog-4752126961947866886.post-49787021477754236742012-04-09T13:01:00.005+03:002012-04-09T13:11:21.419+03:00Cranberry tea with end-usersAbout a week ago I sat with 4 of my end-users. The youngest has about 27 years and the oldest about 55, 2 men and 2 women. I watched how they use a Gyro-generated application, and notice they reflexes. And then, I've noticed how their eyes were looking for information on the screen. They had never used a Gyro application before. After watching them, I came out with a few and simple features that increase the overall usability.<br /><br />First of all, the notebook tabs. The users sometimes find it hard to look for the tabs on top of the screen. He or she is maybe used with paper notebooks, that are indexed on the left or right side. So, I've added some new options there.<br /><br /><a href="http://3.bp.blogspot.com/-WSYcJFBRdg0/T4K0njyomaI/AAAAAAAAAdo/KIkOc49OQcU/s1600/s3.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 308px;" src="http://3.bp.blogspot.com/-WSYcJFBRdg0/T4K0njyomaI/AAAAAAAAAdo/KIkOc49OQcU/s400/s3.png" alt="" id="BLOGGER_PHOTO_ID_5729340267684207010" border="0" /></a><br />Now you can organize the categories into left- or right- aligned tabs, depending on your users.<br /><br /><a href="http://1.bp.blogspot.com/-lstjL6RI5hk/T4K1Egl2ekI/AAAAAAAAAd0/G7VF4hWh5Jo/s1600/s1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 305px;" src="http://1.bp.blogspot.com/-lstjL6RI5hk/T4K1Egl2ekI/AAAAAAAAAd0/G7VF4hWh5Jo/s400/s1.png" alt="" id="BLOGGER_PHOTO_ID_5729340765041490498" border="0" /></a><br />I've noticed that some times the users are overwhelmed by the amount of information required for them to fill it in, so, I've added the expanders (by default, an expander containing a mandatory field is opened).<br /><br /><a href="http://4.bp.blogspot.com/-qW0kv3coZvk/T4K1Nt2t8yI/AAAAAAAAAeA/DIfratOJIGo/s1600/s2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://4.bp.blogspot.com/-qW0kv3coZvk/T4K1Nt2t8yI/AAAAAAAAAeA/DIfratOJIGo/s400/s2.png" alt="" id="BLOGGER_PHOTO_ID_5729340923220718370" border="0" /></a><br />As you can see, every subcategory can now be expanded/collapsed. Simple, but very useful for the end-user.<br /><br />Usability, usability, usability !<br /><br /><br />Some bug-fixes, as usual, mostly regarding the UI and one with some unoptimized queries.<br /><br />For old folks, that use dBase, I've added support for dbf files. Not really needed these days, but useful when interacting with old applications.Eduard Suicahttp://www.blogger.com/profile/17112651253621062928noreply@blogger.com0