<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>CppCMS Blog :: Progress</title>
	<link>http://art-blog.no-ip.info/cppcms/blog</link>
	<description>A blog on CppCMS - C++ Web Development Framework</description>
	<atom:link 
		href="http://art-blog.no-ip.info/cppcms/blog/rss" 
		rel="self" type="application/rss+xml" />
	
		
		<item>
			<title>MSVC9 is now supported by CppCMS</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/52</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/52</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;MSVC 2008 had successfully compiled CppCMS 1.x.x branch and run several examples. So it looks like that Windows with MSVC would definitely be one of the officially supported platforms. (Note: 0.0.x stable branch would not support Windows besides Cygwin)&lt;/p&gt;

&lt;p&gt;The biggest problems I had with MSVC were lack of support of C99 and some POSIX 
functionality like: &lt;code&gt;snprintf&lt;/code&gt;, &lt;code&gt;cstdint&lt;/code&gt; or &lt;code&gt;gmtime_r&lt;/code&gt;&amp;hellip; but with couple of &lt;code&gt;ifdef&lt;/code&gt;s it mostly solved.&lt;/p&gt;

&lt;p&gt;To be honest, Windows development can be quite unpleasant, especially with lack of basic widely available libraries like &lt;code&gt;zlib&lt;/code&gt;. But finally I must admit that it is possible to work with Mircosoft compiler, I could even admit, it could be very fine compiler if it was supporting C99.&lt;/p&gt;

&lt;p&gt;Also, more time I try supporting Windows platform, more I understand: &lt;code&gt;gcc&lt;/code&gt; is not as polished under Windows as it is under Unix platforms. That makes development of cross platform software even harder.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/52"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>CppCMS 1.x.x moves  to CMake</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/51</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/51</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;No, I don&amp;rsquo;t think that CMake is better then autotools. In fact I still think that
CMake is total &quot;crap&quot;. It has terrible cache policy, it has broken &lt;code&gt;configuration_file&lt;/code&gt; support. It is crappy documentation and many broken configuration tools like CheckTypeSizeOf&amp;hellip; and much more.&lt;/p&gt;

&lt;p&gt;But it supports MSVC (that I may think supporting in future) and has a better Windows support&amp;hellip; So I announce that next version of CppCMS would use CMake (and it already uses in re-factoring branch).&lt;/p&gt;

&lt;p&gt;Autotools build system is no longer supported and will be removed from the CppCMS 1.x.x branch, because I do not really like supporting two build systems.&lt;/p&gt;

&lt;p&gt;I hope CppCMS users would understand this terrible move.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/51"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>Introducing Boost.Locale</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/50</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/50</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;After a long period of hesitating I had understood &amp;ndash; standard C++ locale facets are no-go and started developing localization tools based on ICU that work in C++ friendly way. Thus, Boost.Locale was born. It had just been announced to the Boost community for preliminary review.&lt;/p&gt;

&lt;p&gt;Boost.Locale provides case conversion and folding, Unicode normalization, collation, numeric, currency, and date-time formatting, messages formatting, boundary analysis and code-page conversions in C++ aware way.&lt;/p&gt;

&lt;p&gt;For example in order to display a currency value it is enough to write this:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;cout &amp;lt;&amp;lt; as::currency  &amp;lt;&amp;lt; 123.34 &amp;lt;&amp;lt; endl;
&lt;/pre&gt;

&lt;p&gt;And currency like &quot;$124.34&quot; would be formatted. Spelling a number?&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;cout &amp;lt;&amp;lt; as::spellout &amp;lt;&amp;lt; 1024 &amp;lt;&amp;lt; endl;
&lt;/pre&gt;

&lt;p&gt;Very simple. And much more. This library would be the base for CppCMS localization support
and I hope it would be also accepted in Boost at some point in future.&lt;/p&gt;

&lt;p&gt;I've tested this library with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux GCC 4.1, 4.3. with ICU 3.6 and 3.8&lt;/li&gt;
&lt;li&gt;Windows MSVC-9 (VC 2008), with ICU 4.2&lt;/li&gt;
&lt;li&gt;Windows MingW with ICU 4.2&lt;/li&gt;
&lt;li&gt;Windows Cygwin with ICU 3.8&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt; Documentation&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Full tutorials: &lt;a href=&quot;http://cppcms.sourceforge.net/boost_locale/docs/&quot;&gt;http://cppcms.sourceforge.net/boost_locale/docs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Doxygen reference: &lt;a href=&quot;http://cppcms.sourceforge.net/boost_locale/docs/doxy/html/&quot;&gt;http://cppcms.sourceforge.net/boost_locale/docs/doxy/html/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt; Source Code&lt;/h3&gt;

&lt;p&gt;Is available from SVN repository.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;svn co https://cppcms.svn.sourceforge.net/svnroot/cppcms/boost_locale/trunk
&lt;/pre&gt;

&lt;h3&gt; Building&lt;/h3&gt;

&lt;p&gt;You need CMake 2.4 and above, ICU 3.6 and above, 4.2 recommended
So checkout the code, and run&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;cmake /path/to/boost_locale/libs/locale
make
&lt;/pre&gt;

&lt;p&gt;Inputs and comments are welcome.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/50"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>CppCMS meets Comet</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/47</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/47</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;One of the major requirements for framework refactoring was support of &lt;a href=&quot;http://en.wikipedia.org/wiki/Comet_(programming)&quot;&gt;Comet&lt;/a&gt;. Now, with introduction of asynchronous request handling and persistent application servers it becomes reality.&lt;/p&gt;

&lt;h3&gt; Client Side&lt;/h3&gt;

&lt;p&gt;There is a HTML &lt;a href=&quot;http://cppcms.svn.sourceforge.net/viewvc/cppcms/framework/branches/refactoring/the_chat.html?revision=796&amp;amp;view=markup&quot;&gt;source&lt;/a&gt; of simple chat client, that uses &lt;a href=&quot;http://www.dojotoolkit.org/&quot;&gt;Dojo&lt;/a&gt; toolkit. It does following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Submits new messages to the server application by posting form using XHR:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;function send_data() {
        var kw = {
                url : &quot;/chat/post&quot;,
                form : &quot;theform&quot;
        };
        dojo.xhrPost(kw);
        dojo.byId(&quot;message&quot;).value=&quot;&quot;;
        return false;
}
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Receives new messages from the server using long poll via XHR:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;var message_count = 0;
function read_data() {
        dojo.xhrGet( {
                url: &quot;/chat/get/&quot; + message_count,
                timeout: 120000,
                handleAs: &quot;text&quot;,
                load: function(response, ioArgs) {
                        dojo.byId(&quot;messages&quot;).innerHTML =
                                response
                                + '&amp;lt;br/&amp;gt;'
                                + dojo.byId(&quot;messages&quot;).innerHTML;
                        message_count++;
                        read_data();
                        return response;
                },
                error: function(response,ioArgs) {
                        read_data();
                        return response;
                }

        });
}
dojo.addOnLoad(read_data);
&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;So, the client side is quite simple (however error handling should be quite better).&lt;/p&gt;

&lt;h3&gt; Server Side&lt;/h3&gt;

&lt;p&gt;First we create our long running asynchronous application, that receives two kinds
for requests: &quot;/post&quot; &amp;ndash; with new data, and &quot;/get/NN&quot; &amp;ndash; receive message nuber NN, we assign these calls to two member functions &lt;code&gt;post&lt;/code&gt; and &lt;code&gt;get&lt;/code&gt;.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;class chat : public cppcms::application {
public:
    chat(cppcms::service &amp;amp;srv) : cppcms::application(srv)
    {
        dispatcher().assign(&quot;^/post$&quot;,&amp;amp;chat::post,this);
        dispatcher().assign(&quot;^/get/(\\d+)$&quot;,&amp;amp;chat::get,this,1);
    }
&lt;/pre&gt;

&lt;p&gt;Now, this class includes two data members:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;private:
    std::vector&amp;lt;std::string&amp;gt; messages_;
    std::vector&amp;lt;cppcms::intrusive_ptr&amp;lt;cppcms::http::context&amp;gt; &amp;gt; waiters_;
&lt;/pre&gt;

&lt;p&gt;The history of all chat messages &amp;ndash; &lt;code&gt;messages_&lt;/code&gt; and all pending &lt;code&gt;get&lt;/code&gt; requests
that can&amp;rsquo;t be satisfied, because the message still not exists &amp;ndash; &lt;code&gt;waiters_&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each, &quot;waiter&quot; is actually pointer to request/response context that can be
used for message transport.&lt;/p&gt;

&lt;p&gt;Now, when new message arrives, &lt;code&gt;post&lt;/code&gt; member function is called:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;void post()
{
    if(request().request_method()==&quot;POST&quot;) {
        if(request().post().find(&quot;message&quot;)!=request().post().end()) {
            messages_.push_back(request().post().find(&quot;message&quot;)-&amp;gt;second);
            broadcast();
        }
    }
    release_context()-&amp;gt;async_complete_response();
}
&lt;/pre&gt;

&lt;p&gt;If the requested message was found, it is added to &lt;code&gt;messages_&lt;/code&gt; list and all waiters are notified using &lt;code&gt;broadcast()&lt;/code&gt; member function.&lt;/p&gt;

&lt;p&gt;At the end, the current request context is released and completed.&lt;/p&gt;

&lt;p&gt;The broadcasting is done as following:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;void broadcast()
{
    for(unsigned i=0;i&amp;lt;waiters_.size();i++) {
        waiters_[i]-&amp;gt;response().set_plain_text_header();
        waiters_[i]-&amp;gt;response().out() &amp;lt;&amp;lt; messages_.back();
        waiters_[i]-&amp;gt;async_complete_response();
        waiters_[i]=0;
    }
    waiters_.clear();
}
&lt;/pre&gt;

&lt;p&gt;For each pending request the last message is written and the request closed.
After that, all pending request are cleaned.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;get&lt;/code&gt; request arrives, it is handled by &lt;code&gt;get(std::string no)&lt;/code&gt; member function, first of all
we check if requested message exists, if so we just return it to user.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;unsigned pos=atoi(no.c_str());
if(pos &amp;lt; messages_.size()) {
    response().set_plain_text_header();
    response().out()&amp;lt;&amp;lt;messages_[pos];
    release_context()-&amp;gt;async_complete_response();
}
&lt;/pre&gt;

&lt;p&gt;Otherwise, if the requested message is the last one, that does not exists, we
add the request context to pending list &lt;code&gt;waiters&lt;/code&gt;&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;else if(pos == messages_.size()) {
    waiters_.push_back(release_context());
}
&lt;/pre&gt;

&lt;p&gt;If requested message it too late &amp;ndash; probably client error, we just set status
to &quot;404 Not Found&quot; and return the response.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;else {
    response().status(404);
    release_context()-&amp;gt;async_complete_response();
}
&lt;/pre&gt;

&lt;p&gt;No, all we need to do is to add application to the main running loop under
script name &quot;/char&quot; and start the service.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;cppcms::service service(argc,argv);
cppcms::intrusive_ptr&amp;lt;chat&amp;gt; app=new chat(service);
service.applications_pool().mount(app,&quot;/chat&quot;);
service.run();
&lt;/pre&gt;

&lt;h3&gt; Summary&lt;/h3&gt;

&lt;p&gt;So, the simple chat service was written with about 50 lines of C++ code and 
about same amount of JavaScript code.&lt;/p&gt;

&lt;p&gt;I must admit, that it is too simplistic and not efficient, for example: if new client connects it receives all messages one by one and not as bulk (can be easily fixed), I do not handle timeouts and disconnects. But the general idea is quite clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asynchronous long running application that handles &lt;strong&gt;all&lt;/strong&gt; request is created.&lt;/li&gt;
&lt;li&gt;It manages all outstanding request and uses them for server side push.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This is actually a base for future development of tools like XML-RPC and JSON-RPC that allow client to call asynchronously server side objects, it can be used for implementation of any other Comet protocols.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/47"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>Progress Report on CppCMS v1</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/46</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/46</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;Its quite long time that most of the work is done in new refactoring branch&amp;hellip; Meanwhile trunk stays silent. So, I decided to open a window and show some new changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Dependencies:&lt;/p&gt;

&lt;p&gt;I had removed almost all dependencies with a big exception of Boost libraries.&lt;/p&gt;

&lt;p&gt;Because of internal structure changed &amp;mdash; mostly introduction of asynchronous event 
handling I could not use existing implementations of FastCGI because of its synchronous
API. Also I decided to remove CgiCC that was very problematic in terms of installation,
portability and most important the quality of implementation and ability to communicate
with its primary developer.&lt;/p&gt;

&lt;p&gt;So, at this point you only need latest boost library&amp;hellip; Thats all. When the job would
be complete it would be very easy to create deb/rpm packages for most popular
distributions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server APIs:&lt;/p&gt;

&lt;p&gt;In addition to supported FastCGI and SCGI protocols, direct HTTP protocol is supported,
so you do not need to use external web server for debug purposes any more.
It is also useful for embedding web applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Localization is now fully integrated with C++ &lt;code&gt;std::locale&lt;/code&gt; and allows using correct 
facets for each supported language and translation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows is now would be one of the officially supported platforms.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There is still lot of work to make new version as useful as current CppCMS stable version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrate all template system back.&lt;/li&gt;
&lt;li&gt;Integrate cache and sessions management back.&lt;/li&gt;
&lt;li&gt;Rewrite forms classes that currently work with CgiCC.&lt;/li&gt;
&lt;li&gt;Rewrite support of CGI API for embedded systems.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;But there are many good points that are already visible. &lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/46"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>What's Next?</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/44</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/44</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;The road map of the project includes two important milestones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CppCMS core components refactoring including following:

&lt;ul&gt;
&lt;li&gt; Removal of dependency on CgiCC &amp;ndash; today there is about 5% of CgiCC library
 is used, many features are not supported by it or are not supported well.
 For example: file upload handling in CgiCC is very primitive, limited
 and error prone, support of cookies buggy and so on.&lt;/li&gt;
&lt;li&gt;Using of Boost.Asio as internal event handler, because:

&lt;ol&gt;
&lt;li&gt;It provides transparent synchronous and asynchronous event handling
allowing future implementation of server push technologies.&lt;/li&gt;
&lt;li&gt;It provides efficient timer based event handling.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt; Removal dependency of libfcgi and writing Boost.Asio friendly
 implementation of FastCGI/SCGI connectors. Implementation of HTTP
 connectors as well.&lt;/li&gt;
&lt;li&gt; Support of plug-in applications in CppCMS framework.&lt;/li&gt;
&lt;li&gt; Improving compilation speed by representing more &lt;code&gt;pimpl&lt;/code&gt; idioms and
 removal of unnecessary classes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Better support of i18n and and l10n:

&lt;ul&gt;
&lt;li&gt; Transparent support of &lt;code&gt;std::wstring&lt;/code&gt; with forms including automatic
 encoding testing and conversion.&lt;/li&gt;
&lt;li&gt; Support of &lt;code&gt;std::locale&lt;/code&gt; for localization for outputs like numbers,
 dates, monetary, translation and so on.&lt;/li&gt;
&lt;li&gt; Optional support of ICU and icu::UnicodeString and icu::Locale that
 would add unsupported features by &lt;code&gt;std::locale&lt;/code&gt; and allow replacement
 &lt;code&gt;std::locale&lt;/code&gt; features with more correct implementations provided
 by ICU.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;These changes will significantly break API backward compatibility, but it would
be possible to adopt the code almost &quot;mechanically&quot; to the new API.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/44"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>CppCMS 0.0.4 Released</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/41</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/41</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;Version 0.0.4 of CppCMS had released.&lt;/p&gt;

&lt;p&gt;It includes optimizations required for using it in embedded systems.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Normal Embedded Build:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching is completely removed. Small memory footprint
is very important for embedded system thus, caching
stuff in memory is quite useless.&lt;/li&gt;
&lt;li&gt;Zlib compression are removed &amp;ndash; it removes dependency on
boost::iostreams, zlib and bzip2 libraries.&lt;/li&gt;
&lt;li&gt;Removed mod-prefork.&lt;/li&gt;
&lt;li&gt;Removed dynamic templates loading &amp;mdash; this feature requires export of
symbols to binary and increases its size in order to make RTTI work.
 Thus, all templates should be statically compiled into the binary.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;em&gt;Embedded CGI Mode:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastCGI and SCGI APIs are removed&lt;/li&gt;
&lt;li&gt;Mod-thread and mod process are removed including
all thread pool facilities&lt;/li&gt;
&lt;li&gt;Changes in files based session backend to work
properly with CGI mode including garbage collection
(sessions that had time-out).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Downloads are avialable from Sf Project Page.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/41"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>CppCMS Going Embedded... or I need your help!</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/40</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/40</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;Recently I start understanding that &lt;a href=&quot;http://stackoverflow.com/questions/480233&quot;&gt;embedded market&lt;/a&gt; may be very important market for CppCMS. So I did several tweaks to the code in order to support embedded systems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When the library is compiled for embedded system, caching system is totally removed, removed dependency on boost::iostreams and compression library.&lt;/li&gt;
&lt;li&gt;Mod-prefork is removed as much more memory consuming.&lt;/li&gt;
&lt;li&gt;Removed dynamic loading of templates.&lt;/li&gt;
&lt;li&gt;Option for cgi-only library given &amp;mdash; no scgi and and fastcgi APIs are compiled in, all remaining worker &quot;mods&quot; are removed.&lt;/li&gt;
&lt;li&gt;Session storage backend is simplified and optimized for cgi when it is compiled in embedded mode.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Everything was cross compiled for arm and tested with &lt;code&gt;qemu-arm&lt;/code&gt;, but unfortunately I do not have an access to real ARM hardware with installed Linux system, so&amp;hellip;&lt;/p&gt;

&lt;h3&gt; I need your help:&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download following &lt;a href=&quot;http://art-blog.no-ip.info/files/test_arm_embed.tar.gz&quot;&gt;test_arm_embed.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Copy it to your ARM system and extract files.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try to run cgi script from command line:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;./hello.dynamic -c config.txt
&lt;/pre&gt;

&lt;p&gt;This is &quot;Hello World&quot; that is dynamically linked with libstdc++. If it does not work try&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;./hello.static -c config.txt
&lt;/pre&gt;

&lt;p&gt;This is full statically compiled version of &quot;Hello World&quot; cgi script.&lt;/p&gt;

&lt;p&gt;You should get as output CGI headers and HTML output.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Please, try to run it several times with:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;time ./hello.dynamic -c config.txt
&lt;/pre&gt;

And tell the average run time.&lt;/li&gt;
&lt;li&gt;If you have a web server in your system I'd be very glad if you could test
cgi script &amp;ndash; please edit it &amp;mdash; &lt;code&gt;test.cgi&lt;/code&gt; to reflect correct executable and path.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I all works fine I'd be glad (if it is possible) to prepare a set of scripts that would
test various aspects of cppcms as templates, various session backends and so on.&lt;/p&gt;

&lt;p&gt;Thanks&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/40"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>Release Announcement  - CppCMS 0.0.3</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/39</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/39</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;h2&gt; CppCMS 0.0.3 Released&lt;/h2&gt;

&lt;p&gt;Changelog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forms API cleanup.&lt;/li&gt;
&lt;li&gt;Fixed configuration with latest autoconf/automake&lt;/li&gt;
&lt;li&gt;gcc 4.3 compilation fixes&lt;/li&gt;
&lt;li&gt;Added an option to disable gzip compression&lt;/li&gt;
&lt;li&gt;Added an option for manual output stream control&lt;/li&gt;
&lt;li&gt;Fixed incorrect use of readdir_r with dirent on Solaris
that caused crash&lt;/li&gt;
&lt;li&gt;Changed cppcms_make_key now written in C instead of unportable bash/od&lt;/li&gt;
&lt;li&gt;Fixed &amp;ndash; widgets are default constructable&lt;/li&gt;
&lt;li&gt;Added help to templates compiler, BSD bugfix&lt;/li&gt;
&lt;li&gt;Now non-default session timeout type/limit is preserved withing session.&lt;/li&gt;
&lt;li&gt;Added &quot;notriggers&quot; to store cache functions as well&lt;/li&gt;
&lt;li&gt;Fixed incorrect triggers behavior in cache_iface.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt; DbiXX 0.0.3 Released&lt;/h2&gt;

&lt;p&gt;Changelog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed compilation issues with gcc-4,3&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt; WikiPP 0.0.2 Released&lt;/h2&gt;

&lt;p&gt;Changelog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updates according to API changes in CppCMS 0.0.3&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt; Examples 0.0.3 Released&lt;/h2&gt;

&lt;p&gt;No changes, but package location on sourceforge release system 
had changed&lt;/p&gt;

&lt;h2&gt; Documentation&lt;/h2&gt;

&lt;p&gt;User Documentation is complete. It covers most of aspects required
for developing with CppCMS.&lt;/p&gt;

&lt;p&gt;Still, documentation of internals is missing.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/39"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>CppCMS 0.0.2 Released!</title>
			<link>http://art-blog.no-ip.info/cppcms/blog/post/35</link>
			<guid>http://art-blog.no-ip.info/cppcms/blog/post/35</guid>
			<description>
			&lt;div style=&quot;direction:ltr&quot;&gt;
			&lt;p&gt;After long period of development CppCMS 0.0.2 was released!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=209965&quot;&gt;Downloads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cppcms.sourceforge.net/&quot;&gt;Documentation&lt;/a&gt; &amp;mdash; (not 100% complete yet).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cppcms.sourceforge.net/wikipp/en/page/main#inst&quot;&gt;Installation Instructions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It includes following components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CppCMS Web Development Framework.&lt;/li&gt;
&lt;li&gt;DbiXX Database independent SQL library.&lt;/li&gt;
&lt;li&gt;WikiPP &amp;ndash; CppCMS powered wiki engine.&lt;/li&gt;
&lt;li&gt;Examples &amp;ndash; a set of various examples of using CppCMS.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt; Policy Changes&lt;/h2&gt;

&lt;p&gt;There are important release policy changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beta versions are available to public via svn on trunk branch.&lt;/li&gt;
&lt;li&gt;The frequency of releases is expected to grow, instead of long development periods inside trunk.&lt;/li&gt;
&lt;li&gt;Most of CppCMS architecture is stabilized, however API is still subject to change.&lt;/li&gt;
&lt;li&gt;No full backward compatibility for future releases is granted, however, preserving backward compatibility and stabilizing API are important goals of future development.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt; Major Changes&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;New, &lt;strong&gt;statically typed template system&lt;/strong&gt; was introduced. It is based on compilation of templates to native, dynamically loadable shared objects.&lt;/li&gt;
&lt;li&gt;Old, dynamic typed template system had deprecated and not supported any more&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Various enhancements to template system where introduced like: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Powerful &quot;Django style&quot; templates inheritance&lt;/li&gt;
&lt;li&gt;Extending templates using direct injection of C++ code to templates.&lt;/li&gt;
&lt;li&gt;Templates are integral part of CppCMS project and not additional library.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduced &lt;strong&gt;form processing and validation&lt;/strong&gt; sub-framework deeply integrated with templates system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Introduced powerful, scalable &lt;strong&gt;session management&lt;/strong&gt; system.&lt;/li&gt;
&lt;li&gt;Improved cache API for better supporting non-trigger based caching.&lt;/li&gt;
&lt;li&gt;Documentation had moved to CppCMS powered &lt;strong&gt;Wiki&lt;/strong&gt; &amp;ndash; &lt;a href=&quot;/wikipp/en/page/main&quot;&gt;WikiPP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FreeBSD&lt;/strong&gt; and &lt;strong&gt;OpenSolaris&lt;/strong&gt; are supported in addition to Linux and Cygwin.&lt;/li&gt;
&lt;li&gt;CppCMS powered Wiki software &amp;ndash; &lt;strong&gt;WikiPP&lt;/strong&gt; was released under GPLv3.&lt;/li&gt;
&lt;/ul&gt;


			&lt;p&gt;
			&lt;a href="/cppcms/blog/post/35"&gt;more...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
	
</channel>
</rss>
