<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>porcupine blog</title>
		<link>http://www.innoscript.org/weblog/</link>
		

		
		<item>
			<title>Features of the forthcoming Porcupine release</title>
			<link>http://www.innoscript.org/features-of-the-forthcoming-porcupine-release/</link>
			<description>&lt;p&gt;The forthcoming Porcupine release includes a whole new bunch of exciting features and improvements. This is a list of the most significant:&lt;/p&gt;&lt;p&gt;1. &lt;strong&gt;Python 3 compatibility&lt;/strong&gt;. The new version will require Python 2.6 or later but it will also be Python 3 compatible. Since the &lt;strong&gt;bsddb&lt;/strong&gt; module is deprecated, an extra dependency to &lt;a href=&quot;http://www.jcea.es/programacion/pybsddb.htm&quot;&gt;pybsddb&lt;/a&gt; is added. Porcupine will continue to support both modules with &lt;strong&gt;pybsddb&lt;/strong&gt; having priority over its predecessor.&lt;/p&gt;&lt;p&gt;2. &lt;strong&gt;High availability and horizontal scalability&lt;/strong&gt; by using single master-multiple slave database replication to n Porcupine nodes. The web connector acts as a software load balancer for the back-end nodes using round-robin.&lt;/p&gt;&lt;p&gt;3. New &lt;strong&gt;redesigned database&lt;/strong&gt;. The main Porcupine DB is now a b-tree instead of hash. All children of a container are now stored adjacently. &lt;strong&gt;Locality of reference&lt;/strong&gt; plays an important part in database performance.&lt;/p&gt;&lt;p&gt;4. Support for &lt;a href=&quot;http://groups.google.com/group/json-rpc/web/json-rpc-2-0&quot;&gt;JSON-RPC 2&lt;/a&gt;. &lt;strong&gt;JSON&lt;/strong&gt; is more compact and readable than XML. All remote methods handle this transparently based on the content type of the request.&lt;/p&gt;&lt;p&gt;5. Enhanced &lt;strong&gt;OQL query optimizer&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;6. &lt;strong&gt;Elastic schema&lt;/strong&gt; that allows easy schema updates without requiring database updates. The database is physically inconsistent but the API enforces consistency. Each object becomes consistent the next time it is updated. This requires code updates since the __props__ class attribute of the content classes has significantly changed.&lt;/p&gt;&lt;p&gt;7. The upcoming release will also include a &lt;strong&gt;template engine&lt;/strong&gt; (&lt;a href=&quot;http://github.com/tkouts/py-normal-template&quot;&gt;py-normal-template&lt;/a&gt;) that enforces MVC.&lt;/p&gt;&lt;p&gt;8. Using &lt;a href=&quot;http://www.swfupload.org/&quot;&gt;swfupload&lt;/a&gt; instead of the applet for uploading files. The applet blocks JavaScript execution while the user selects files. This was potentially interpreted as an unresponsive script by most browsers.&lt;/p&gt;&lt;p&gt;9. QuiX now supports &lt;strong&gt;right-to-left layouts&lt;/strong&gt; for the Arabic speaking countries. The whole UI mirroring is handled transparently and this is done just by adding an extra attribute to the desktop widget.&lt;/p&gt;&lt;p&gt;10. Although all dates are stored in UTC, they were transferred using the server's time zone. Now this is no longer true. Dates are transferred in UTC format and converted to local dates on the client based on its time zone.&lt;/p&gt;&lt;p&gt;If you want to test-drive these new features check out the Porcupine development version found at &lt;a href=&quot;http://github.com/tkouts&quot;&gt;http://github.com/tkouts&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Sun, 18 Apr 2010 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/features-of-the-forthcoming-porcupine-release/</guid>
		</item>
		
		<item>
			<title>Introducing Normal Template for Python</title>
			<link>http://www.innoscript.org/introducing-normal-template-for-python/</link>
			<description>&lt;p&gt;Normal Template is a template engine originally  developed by my friend &lt;a href=&quot;http://www.gmosx.com/&quot;&gt;George Moschovitis&lt;/a&gt; in JavaScript. What I really like about Normal Template is its simplicity, compactness and its clean JSON-ish approach.&lt;/p&gt;&lt;p&gt;Therefore, I decided to write a Python port and use it as an alternative out-of-the-box template engine for the upcoming release of Porcupine. Normal templates are safe, applicable to any non XML/HTML contexts and portable to any programming language.&lt;/p&gt;&lt;p&gt;Sample usage:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;template.html&lt;/strong&gt;&lt;br /&gt;&lt;div class=&quot;codesnippet&quot;&gt;&lt;p&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Hello {=name}&amp;lt;/h1&amp;gt;&lt;/p&gt;&lt;p&gt;{:select profile}&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    {=age}&amp;lt;br/&amp;gt;&lt;br /&gt;    {=gender}&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;{/:select}&lt;/p&gt;&lt;p&gt;&amp;lt;p&amp;gt;Your age is {=profile/age}&amp;lt;/p&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;{:reduce articles}&lt;br /&gt;    &amp;lt;li&amp;gt;{=title} - {=count}&amp;lt;/li&amp;gt;&lt;br /&gt;{:else}&lt;br /&gt;    &amp;lt;li&amp;gt;No articles found&amp;lt;/li&amp;gt;    &lt;br /&gt;{/:reduce}&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/p&gt;&lt;p&gt;{:if admin}&lt;br /&gt;    You have admin rights&lt;br /&gt;{:else}&lt;br /&gt;    You don't have admin rights&lt;br /&gt;{/:if}&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;template.py&lt;/strong&gt;&lt;br /&gt;&lt;div class=&quot;codesnippet&quot;&gt;&lt;p&gt;from normaltemplate import *&lt;/p&gt;&lt;p&gt;template_file = open('template.html')&lt;br /&gt;src = template_file.read().decode('utf-8')&lt;br /&gt;template_file.close()&lt;/p&gt;&lt;p&gt;# compile template into a Python function&lt;br /&gt;template = compile(src)&lt;/p&gt;&lt;p&gt;data = { // the data dictionary in JSON format&lt;br /&gt;    'name' : 'George',&lt;br /&gt;    'profile' : {&lt;br /&gt;        'age' : 34,&lt;br /&gt;        'gender' : 'M'&lt;br /&gt;    },&lt;br /&gt;    'articles' : [&lt;br /&gt;        { 'title' : 'Hello world', 'count' : 34 },&lt;br /&gt;        { 'title' : 'Another article', 'count' : 23 },&lt;br /&gt;        { 'title' : 'The final', 'count' : 7 }&lt;br /&gt;    ],&lt;br /&gt;    'admin': True&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;# calling the template with the data dictionary&lt;br /&gt;# returns the rendered output&lt;br /&gt;print(template(data))&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;The code for &lt;strong&gt;py-normal-template&lt;/strong&gt; is available on github at &lt;a href=&quot;http://github.com/tkouts/py-normal-template&quot;&gt;http://github.com/tkouts/py-normal-template&lt;/a&gt;. The original JavaScript implementation is available at &lt;a href=&quot;http://github.com/gmosx/normal-template&quot;&gt;http://github.com/gmosx/normal-template&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Sun, 14 Feb 2010 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.innoscript.org/introducing-normal-template-for-python/</guid>
		</item>
		
		<item>
			<title>Stress testing Porcupine v0.6</title>
			<link>http://www.innoscript.org/stress-testing-porcupine-v06/</link>
			<description>&lt;p&gt;Before releasing Porcupine v0.6 I have conducted a series of stress tests using &lt;a href=&quot;http://www.pylot.org/&quot;&gt;Pylot&lt;/a&gt;. The aim of one of these stress tests was to benchmark Porcupine &lt;strong&gt;under extreme race conditions&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;For this reason I created a test scenario with only two requests. The first request authenticates the &quot;admin&quot; user against the Porcupine database whereas the second request calls a remote web method that creates a common container object (folder) inside the root container object.&lt;br /&gt;The test scenario is the following:&lt;/p&gt;&lt;p&gt;&lt;div class=&quot;codesnippet&quot;&gt;&lt;p&gt;&amp;lt;testcases&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- login --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;case&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://192.168.233.115/porcupine.py/&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;method&amp;gt;POST&amp;lt;/method&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&amp;lt;![CDATA[&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;methodCall&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;methodName&amp;gt;login&amp;lt;/methodName&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;params&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param&amp;gt;&amp;lt;value&amp;gt;&amp;lt;string&amp;gt;admin&amp;lt;/string&amp;gt;&amp;lt;/value&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param&amp;gt;&amp;lt;value&amp;gt;&amp;lt;string&amp;gt;admin&amp;lt;/string&amp;gt;&amp;lt;/value&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/params&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/methodCall&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add_header&amp;gt;User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8&amp;lt;/add_header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add_header&amp;gt;Content-type: text/xml&amp;lt;/add_header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/case&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- create object --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;case&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://192.168.233.115/porcupine.py/&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;method&amp;gt;POST&amp;lt;/method&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&amp;lt;![CDATA[&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;methodCall&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;methodName&amp;gt;create_object&amp;lt;/methodName&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;params&amp;gt;&amp;lt;/params&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/methodCall&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]]&amp;gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add_header&amp;gt;User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8&amp;lt;/add_header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add_header&amp;gt;Content-type: text/xml&amp;lt;/add_header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/case&amp;gt;&lt;br /&gt;&amp;lt;/testcases&amp;gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;The &quot;create_object&quot; web method is as simple as:&lt;br /&gt;&lt;div class=&quot;codesnippet&quot;&gt;&lt;p&gt;from porcupine.utils import misc&lt;br /&gt;from org.innoscript.desktop.schema.common import Folder&lt;/p&gt;&lt;p&gt;@webmethods.remotemethod(of_type=RootFolder)&lt;br /&gt;@db.transactional(auto_commit=True)&lt;br /&gt;def create_object(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = Folder()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.displayName.value = misc.generate_oid()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.append_to('')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return True&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;The stress test's duration was 10mins. It initiates 100 agents applying requests every 80ms with a warm-up time of 100secs. The command line is:&lt;br /&gt;&lt;div class=&quot;codesnippet&quot;&gt;&lt;p&gt;$ python run.py -a 100 -d 1200 -i 80 -r 100 -x porcupine_txn_test.xml -o results -n &quot;Porcupine 0.6 Performance Results&quot;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;Due to the fact that that the root folder in this scenario is considered a highly demanded resource since all objects created are created inside this container the maximum number of concurrent transaction is lowered to 8 (max_tx setting).&lt;br /&gt;The test's highlights are:&lt;br /&gt; - Porcupine was able to serve more than 160K database requests in 10mins&lt;br /&gt; - Half of the above requests were transactional which means more than 80K full ACID transactions where committed successfully (more than 65 transactions per second).&lt;br /&gt; - Only 17 transactional requests could not be completed (exceeded maximum retries)&lt;br /&gt; - The response time of 90% of the requests was less than 1sec.&lt;/p&gt;&lt;p&gt;The machine used for the test was a virtual ESX server with dual core processor and Ubuntu installed.&lt;/p&gt;&lt;p&gt;The detailed results can be found &lt;a href=&quot;http://www.innoscript.org/assets/benchmarks/0.6/results.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Sun, 15 Nov 2009 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.innoscript.org/stress-testing-porcupine-v06/</guid>
		</item>
		
		<item>
			<title>FileTrack v0.1 is released!</title>
			<link>http://www.innoscript.org/filetrack-v0-1-is-released/</link>
			<description>&lt;p&gt;The latest release of &lt;strong&gt;FileTrack&lt;/strong&gt;, a Web enabled communication log that helps you to monitor all of your inbound and outbound documents, is now available for download. This is mainly a compatibility release being fully compliant with the API changes introduced in the latest Porcupine release (v0.6).&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.innoscript.org/porcupine-applications/&quot;&gt;Download&lt;/a&gt; the application's package and then follow the &lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/HowToInstallPPFiles&quot;&gt;installation instructions&lt;/a&gt; to install it.&lt;/p&gt;&lt;p&gt;For those still using an older Porcupine release, you can now upgrade to the Porcupine 0.6 and then also upgrade to the latest version of &lt;strong&gt;FileTrack&lt;/strong&gt; using the standard installation procedure for ppf files, as described in the previous link.&lt;/p&gt;&lt;p&gt;For any problems you may encounter during the installation procedure, add your comment in this post for getting help.&lt;/p&gt;</description>
			<pubDate>Tue, 08 Sep 2009 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/filetrack-v0-1-is-released/</guid>
		</item>
		
		<item>
			<title>Porcupine v0.6 is released</title>
			<link>http://www.innoscript.org/porcupine-v0-6-is-released/</link>
			<description>&lt;p&gt;At last the new version of Porcupine is released. During the past months, I have put a lot of effort for making this release finally available. It includes a new whole bunch of new features and improvements, mainly aimed towards scalability.&lt;/p&gt;&lt;p&gt;The server now supports multiple processes by using the &quot;multiprocessing&quot; module introduced in Python 2.6. Unfortunately, due to a &lt;a href=&quot;http://bugs.python.org/issue6461&quot;&gt;multiprocessing issue&lt;/a&gt; - which I hope will be resolved in later Python releases - the win32 executable doesn't support this new feature yet. Moreover, the new win32 setup executable comes with Microsoft's C++ 2008 redistributable libraries in order for the server to install correctly.&lt;br /&gt;The Porcupine database now supports indexes declared at a server-wide scope inside the Porcupine configuration file (porcupine.conf). Currently, the indexes are used for common database usage patterns such as getting the children of a container, but not yet fully leveraged by OQL. For the time being, simple queries like&lt;/p&gt;&lt;p&gt;&lt;em&gt;select something from 'container_id' where indexed_attribute=value&lt;/em&gt;&lt;/p&gt;&lt;p&gt;will leverage the index structure.&lt;br /&gt;The Etag HTTP header is now fully supported for static files. For dynamic requests a new pre-processing filter is included that allows conditional Etags, meaning that an Etag header will be generated only if a predefined condition is true.&lt;br /&gt;The Porcupine API is partially aligned with Python's PEP 8. The majority of the API calls are no longer camel case and such calls are considered deprecated (i.e. the Container's getChildren method is now get_children). Check the server's log thoroughly for deprecation warnings and make the appropriate changes.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;QuiX&lt;/strong&gt; has reached the major milestone of supporting all the popular browsers including Opera, Safari 4 and IE8. The structure of the QuiX API has been re-factored by introducing JavaScript namespaces (i.e. XButton has become QuiX.ui.Button, XMLRPCRequest has become QuiX.rpc.XMLRPCRequest). Of course backwards compatibility is still preserved in order not to break the existing code.&lt;br /&gt;The redraws have been accelerated by using some sort of internal cache mechanism that prevents the core from calculating the same widget parameter twice.&lt;br /&gt;Another great feature combined with the server side Etag support is the ability to persist data sets on the browser side. For accomplishing this kind of functionality QuiX includes &lt;a href=&quot;http://pablotron.org/?cid=1557&quot;&gt;PersistJS&lt;/a&gt;, a lightweight persistence library, that uses the appropriate persistence mechanism for different browsers including Google Gears, globalStorage, localStorage, openDatabase etc.&lt;br /&gt;Auto-sized widgets are now finally supported. Their size is automatically adjusted based on their contents. Widgets supporting this kind of feature include labels, icons, buttons and boxes. Auto sized boxes require all their children to have fixed sizes or being auto-sized themselves.&lt;br /&gt;Another important improvement is a universal base Widget implementation that now allows integration with non-Porcupine web applications more easily.&lt;/p&gt;&lt;p&gt;Other notable new features and improvements include themes support for QuiX, new optimized transactions, a lightweight rich text editor, new cookie based and database session managers (required for multi-processing setups) and a new Shortcut content class.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-decoration:underline;&quot;&gt;This version requires Python 2.5 or later but not supporting Python 3.0 yet. Finally, in order to upgrade your installation to the newest version you will also need to upgrade your web connector to the latest version.&lt;/span&gt;&lt;br /&gt;The new connectors are available in the &lt;a href=&quot;http://www.innoscript.org/porcupine-web-connectors/&quot;&gt;Web Connectors downloads&lt;/a&gt; page.&lt;br /&gt;The following wiki pages contain useful information for upgrading to the latest version:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.innoscript.org/upgrading-porcupine/&quot;&gt;Porcupine upgrade instructions&lt;/a&gt;,&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.innoscript.org/code-migration-from-0-5-2-to-0-6/&quot;&gt;How to migrate your applications to the latest version&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Sat, 18 Jul 2009 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/porcupine-v0-6-is-released/</guid>
		</item>
		
		<item>
			<title>Tuning Berkeley DB for high performance web applications</title>
			<link>http://www.innoscript.org/tuning-berkeley-db-for-high-performance-web-applications/</link>
			<description>&lt;p&gt;Extensive stress tests of the new Porcupine version using different configurations for Berkeley DB have shown some interesting results. Here are some tips for configuring Berkeley DB in order to get the most out of it when used for web applications.&lt;/p&gt;&lt;p&gt;1. Use the DB_TXN_NOWAIT flag for transactional operations. This option minimizes the number of the write locks at a given time since transactions do not block waiting for the next lock to become available, but instead they are aborted releasing all the locks that they currently possess. This option also eliminates the need for a deadlock detector because no transaction will ever block waiting for a lock acquired by another, resulting in a deadlock-free database. Once a lock is not available the transaction is immediately aborted and then retried.&lt;br /&gt;Of course this approach requires that you wrap all of your transactional operations in a special wrapper (a Python decorator) that is responsible for retrying each transaction whenever a lock is not granted for a given number of times using some kind of exponential/linear layoff between retries.&lt;/p&gt;&lt;p&gt;2. Drop the D out of ACID for transactions that need not to be durable by using the DB_TXN_NOSYNC flag. Such type of transactions include the session state or even better all transactions if you have some kind of synchrounous replication to multiple nodes for fail over capabilities.&lt;/p&gt;&lt;p&gt;3. For transactional cursors use an isolation level of 2 whenever possible by using the DB_READ_COMMITTED flag. This increases the overall write throughput because data items read by this type of cursors can be modified or deleted prior to the commit of the transaction for this cursor.&lt;/p&gt;&lt;p&gt;4. If you have many requests competing for updates on the same resource consider using a semaphore for limiting the maximum number of concurrent transactions per process to a specific number. Tests have shown that under these conditions and without a semaphore, single process server instances achieve a better throughput than the multi process instances. This is happening because on a single process server instance the maximum number of transactions is kept low enough for transactions not to compete hard one against another, resulting in less retries.&lt;/p&gt;&lt;p&gt;5. I guess that last one is well known. Keep that data and log files on separate disks.&lt;/p&gt;</description>
			<pubDate>Mon, 01 Jun 2009 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/tuning-berkeley-db-for-high-performance-web-applications/</guid>
		</item>
		
		<item>
			<title>The Porcupine source code repository has now moved to github</title>
			<link>http://www.innoscript.org/porcupine-source-code-repository-has-now-moved-to-github/</link>
			<description>&lt;p&gt;The Porcupine Subversion repository will no longer be maintained. I have recently moved the repository to &lt;a href=&quot;http://www.github.com/&quot;&gt;github&lt;/a&gt;. There you can find all the new exciting features for the upcoming release (hopefully to be released this month) including:&lt;br /&gt;- Multiprocessing support for Python 2.6&lt;br /&gt;- Database indexes&lt;br /&gt;- QuiX namespaces with backwards compatibility i.e. &quot;Label&quot; is now &quot;QuiX.ui.Label&quot;&lt;br /&gt;- Support for QuiX themes&lt;br /&gt;- A lightweight rich text editor&lt;br /&gt;- Support for Opera 9, Safari 4 and IE 8&lt;br /&gt;- Conditional Etag support&lt;br /&gt;- Persistent data sets on the client side using PersistJS combined with the 304 (Not Modified) response code for POST requests (remote method calls).&lt;br /&gt;- Redesigned transactions&lt;br /&gt;- Database and cookie based session managers&lt;br /&gt;- New optimized web connectors (including out of the box support for mod_wsgi)&lt;br /&gt;- and many more...&lt;br /&gt;The new repositories can be found at &lt;a href=&quot;http://www.github.com/tkouts&quot;&gt;http://www.github.com/tkouts&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Thu, 16 Apr 2009 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/porcupine-source-code-repository-has-now-moved-to-github/</guid>
		</item>
		
		<item>
			<title>Key-value databases for scalability?</title>
			<link>http://www.innoscript.org/Key-value-databases-for-scalability-/</link>
			<description>&lt;p&gt;Recently, RWW posted a very interesting article about the new breed of emerging databases for massively scalable internet applications (&lt;a href=&quot;http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php&quot;&gt;http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php&lt;/a&gt;). Examples of these kind of databases include &lt;a href=&quot;http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf&quot;&gt;Amazon's Dynamo&lt;/a&gt; and their newest release called &lt;a href=&quot;http://aws.amazon.com/simpledb/&quot;&gt;SimpleDB&lt;/a&gt;, &lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt;, &lt;a href=&quot;http://www.hypertable.org&quot;&gt;HyperTable&lt;/a&gt;, and of course &lt;a href=&quot;http://code.google.com/appengine/docs/python/datastore/&quot;&gt;Google's AppEngine Datastore&lt;/a&gt;  which is based on Big Table.&lt;/p&gt;&lt;p&gt;I think this article is quite predictive about the future of databases and cloud computing. I believe that the two biggest problems that relational databases are facing are their inability to handle efficiently semi-structured data and the lack of multi-node scalability (scaling out to hundreds or even thousands of nodes). The need for scaling as you grow is an essential requirement for cloud computing.&lt;/p&gt;&lt;p&gt;On the other hand, I too don't believe that relational databases are doomed in anyway. They will be dominating the market for a long time yet.&lt;/p&gt;</description>
			<pubDate>Mon, 23 Feb 2009 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.innoscript.org/Key-value-databases-for-scalability-/</guid>
		</item>
		
		<item>
			<title>To __slots__ or not to __slots__?</title>
			<link>http://www.innoscript.org/To-slots-or-not-to-slots-/</link>
			<description>&lt;p&gt;In one of the previous Porcupine releases I decided to add the Python's __slots__ class attribute to every class which is schema related. This was done in favor of smaller memory consumption since these classes don't have a dictionary (the __dict__ attribute) for keeping instance variables.&lt;/p&gt;&lt;p&gt;But practice has shown that this addition was a move against flexibility. Whenever a schema update is required, this also requires database updates in order to add new or remove old attributes. Apart from this, the __slots__ attribute is known for breaking multiple inheritance.&lt;/p&gt;&lt;p&gt;Therefore, I'm thinking of removing the __slots__ attribute from all schema related classes in the upcoming version. Whenever a schema update is required, this will only be done at the Python class level, without requiring database updates. But then, in case of an attribute removal the persisted objects will continue to have the specific attribute. So when will this attribute be actually removed? The answer is the next time the object is updated. &lt;/p&gt;&lt;p&gt;I'm much more in favor of a flexible database that is self adjusting to schema updates than having a rigid schema that requires database updates every time it is changed (see relational databases). The natural fit for dynamic language is a dynamic self adjusting storage.&lt;/p&gt;</description>
			<pubDate>Wed, 18 Feb 2009 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.innoscript.org/To-slots-or-not-to-slots-/</guid>
		</item>
		
		<item>
			<title>NetBeans 6.5 Python IDE</title>
			<link>http://www.innoscript.org/NetBeans-6-5-Python-IDE/</link>
			<description>&lt;p&gt;The last month I have been using the &lt;a href=&quot;http://www.netbeans.org/features/python/index.html&quot;&gt;NetBeans IDE&lt;/a&gt; for doing Python and JavaScript development and I must say that I'm pretty satisfied. This is the first time I use an IDE other than &lt;a href=&quot;http://www.eclipse.org&quot;&gt;Eclipse&lt;/a&gt;, for more than two weeks.&lt;/p&gt;&lt;p&gt;Just like with every new release there are some minor issues but overall I think this is a very promising Python IDE and eventually will improve with each new release. After one month of use here are the pros and cons:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt; - Very good code analysis tools&lt;br /&gt; - Effective auto-completion&lt;br /&gt; - Good Python debugger&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt; - Editing performance is inferior compared to this of Eclipse&lt;br /&gt; - The SVN plugin automatically adds any new files added in the project folder (you have to add them to svn:ignore manually in order to avoid adding them to the repository)&lt;br /&gt; - The file statuses are not updated when using the command line version of SVN (a &quot;Refresh&quot; option would be handy)&lt;br /&gt; - The first time launched it failed to index my &quot;site-packages&quot;. I had to move this folder temporarily in order to successfully index the libraries of the standard CPython installation&lt;/p&gt;</description>
			<pubDate>Mon, 19 Jan 2009 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.innoscript.org/NetBeans-6-5-Python-IDE/</guid>
		</item>
		
		<item>
			<title>FileTrack v0.1-RC3 is released</title>
			<link>http://www.innoscript.org/FileTrack-v0-1-RC3-is-released/</link>
			<description>&lt;p&gt;The latest release of &lt;strong&gt;FileTrack&lt;/strong&gt;, a Web enabled communication logger, is now available for download. This release is mainly a compatibility release. I have included all the required changes in order to comply with the latest &lt;strong&gt;Porcupine&lt;/strong&gt; release (0.5.2).&lt;/p&gt;&lt;p&gt;This release also includes a fix for not being able to remove persons from the CC list of a single log entry, but also a &lt;em&gt;critical patch&lt;/em&gt; for the &quot;porcupine.administration.codegen&quot; package.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.innoscript.org/porcupine-applications&quot;&gt;Download&lt;/a&gt; the application's package and then follow the &lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/HowToInstallPPFiles&quot;&gt;installation instructions&lt;/a&gt; to install it.&lt;/p&gt;&lt;p&gt;For those still using &lt;strong&gt;Porcupine&lt;/strong&gt; v0.5 you can now safely upgrade to the latest version and then also upgrade to the latest version of &lt;strong&gt;FileTrack&lt;/strong&gt; using the standard installation procedure for ppf files.&lt;/p&gt;</description>
			<pubDate>Mon, 22 Dec 2008 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.innoscript.org/FileTrack-v0-1-RC3-is-released/</guid>
		</item>
		
		<item>
			<title>Porcupine v0.5.2 is released! Now with wider browser support</title>
			<link>http://www.innoscript.org/porcupine-v0-5-2-is-released-now-with-wider-browser-support/</link>
			<description>&lt;p&gt;Porcupine v0.5.2 is finally here. This release includes the brand new version of &lt;strong&gt;&lt;a href=&quot;http://www.innoscript.org/quix-javascript-toolkit/&quot;&gt;QuiX&lt;/a&gt;&lt;/strong&gt; supporting the latest releases of Firefox, &lt;em&gt;Safari and Chrome&lt;/em&gt; browsers but also introduces a couple of new exciting enhancements. A popular request for &lt;strong&gt;QuiX&lt;/strong&gt; has always been an &lt;em&gt;effects module&lt;/em&gt;. This release has a new small effects module that initially supports fade, wipe and slide effects. Furthermore, the newest version includes an enhanced list view widget implementation with no more wobbling headers and great support for large datasets by using asynchronous rendering. Finally, the base widget class has a new &quot;&lt;em&gt;query&lt;/em&gt;&quot; method for performing advanced queries on the widgets hierarchy and a new auto complete widget contribution.&lt;/p&gt;&lt;p&gt;On the server side the &quot;&lt;em&gt;db_backup.py&lt;/em&gt;&quot; utility is renamed to &quot;&lt;em&gt;porcupineadmin.py&lt;/em&gt;&quot; and the database recovery is no longer attempted during the server start up process. Database recovery is now done by using the &quot;&lt;em&gt;porcupineadmin.py&lt;/em&gt;&quot; utility with the &quot;&lt;em&gt;-c&lt;/em&gt;&quot; switch. This allows multiple processes to access the database at the same time. Consequently, prior to installing or uninstalling an application with the &quot;&lt;em&gt;pakager.py&lt;/em&gt;&quot; utility no longer requires the server to be stopped and then later re-started.&lt;/p&gt;&lt;p&gt;This release also includes a new redesigned transaction sub-system. All transactional web methods must be marked as such by using the special &quot;&lt;em&gt;@db.transactional()&lt;/em&gt;&quot; decorator. This decorator must always be declared right after the main web method decorator (i.e. webmethods.remotemethod). If you need transactions inside Python Server Pages create a function in the page and make it transactional by using the the &quot;&lt;em&gt;@db.transactional&lt;/em&gt;&quot; decorator.&lt;/p&gt;&lt;p&gt;Before reaching the milestone of release 1.0, for each new release the Porcupine API is not guaranteed to be backwards compatible but I'm doing my best to make these changes as harmless as possible. Gradually, the Porcupine API will become fully aligned with &lt;strong&gt;&lt;a href=&quot;http://www.python.org/dev/peps/pep-0008/&quot;&gt;PEP 8&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The following wiki pages contain useful information for upgrading to the latest version:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/PorcupineUpgradeInstructions&quot;&gt;Porcupine upgrade instructions&lt;/a&gt;,&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/UpgradingFrom05to052&quot;&gt;How to migrate your applications to the latest version&lt;/a&gt; and the&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wiki.innoscript.org/index.php/Main/ChangeLog&quot;&gt;Change Log&lt;/a&gt; for a detailed list of the new features, bug fixes and enhancements.&lt;/p&gt;</description>
			<pubDate>Thu, 04 Dec 2008 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.innoscript.org/porcupine-v0-5-2-is-released-now-with-wider-browser-support/</guid>
		</item>
		
		<item>
			<title>Browsers roadmap</title>
			<link>http://www.innoscript.org/Browsers-roadmap/</link>
			<description>&lt;p&gt;The last month &lt;a href=&quot;http://www.mabber.com/&quot;&gt;mabber&lt;/a&gt;&lt;br /&gt;seemed to be facing some major problems. Therefore, I wasn't able to chat with you online. This week it seems to be back online. When I accessed my account I saw all the initiated chat sessions that I had missed. Two of them were about universal browser support for QuiX and the roadmap behind this.&lt;br /&gt;I don't know when QuiX is going to be ported to Konqueror but I know that Opera support has to be put in place ASAP after implementing the first set of the &lt;a href=&quot;http://www.innoscript.org/running-porcupine-on-smp-systems/&quot;&gt;scalability improvements&lt;/a&gt;.&lt;br /&gt;Thus, the Opera fanatics (including my friend amusic) can stay assured that soon they won't have to switch to another browser in order to use Porcupine and QuiX based applications.&lt;/p&gt;</description>
			<pubDate>Tue, 07 Oct 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/Browsers-roadmap/</guid>
		</item>
		
		<item>
			<title>Why Safari support has become important</title>
			<link>http://www.innoscript.org/Why-Safari-support-has-become-important/</link>
			<description>&lt;p&gt;The next version of Porcupine - hopefully to be released in October - will include the new version of QuiX that supports the Safari browser. When I started developing this new feature, I never realized how beneficial it would turn out in the mean time.&lt;/p&gt;&lt;p&gt;After having done some tests on iPhone, it turns out that &lt;em&gt;you can run full featured QuiX based applications on mobile Safari&lt;/em&gt;. Ideally, you will need to write a separate QuiX based front end for your iPhone application, using Apple's guidelines. Having a desktop on a small screen is not usable and there are a lot of unsupported actions like double clicks and drag and drop.&lt;br /&gt;The RPC interface of your application can be shared between both the dekstop and the mobile versions of your application.&lt;/p&gt;&lt;p&gt;Then Google releases &lt;a href=&quot;http://www.google.com/chrome&quot;&gt;Chrome&lt;/a&gt;, a new browser that is based on Webkit, the same rendering engine that Safari uses. With some minor tweaking I managed to run the Porcupine desktop in Chrome within a couple of hours. Therefore, &lt;em&gt;the next version of Porcupine is going to support Google Chrome too&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;For those who can't wait to test these new features, you can &lt;a href=&quot;http://www.innoscript.org/porcupine-downloads/&quot;&gt;check out the latest development version&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Wed, 24 Sep 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/Why-Safari-support-has-become-important/</guid>
		</item>
		
		<item>
			<title>Running Porcupine on SMP systems</title>
			<link>http://www.innoscript.org/running-porcupine-on-smp-systems/</link>
			<description>&lt;p&gt;The last days I have been wondering what it takes to have multiple Porcupine processes running on SMP systems, as the first step towards scalability. Since almost all of the modern CPUs are multi-core and due to the Python's Global Interpreter Lock, in order to take full advantage of a CPU's horsepower is to have multiple Porcupine processes (sub-processes to be precise) all accessing the same database.&lt;/p&gt;&lt;p&gt;The good news is that Berkeley DB allows different processes accessing the same database. But the current implementation has a minor fault; the database environment is opened using the db.DB_RECOVER flag. Each time Porcupine starts a database recovery is attempted. The problem with this procedure is that it can only be initiated from a single threaded environment (see what happens if you try to start Porcupine twice without having stopped the first instance). Therefore, database recovery should only be performed using an external script after having stopped all Porcupine services (processes).&lt;/p&gt;&lt;p&gt;The next thing I had to consider is what gets shared between these processes. The ideal scenario says &quot;nothing&quot;. The first issue that I need to deal with is the session manager. Since the Porcupine session manager is extensible by sub-classing the GenericSessionManager class, then one can write a new session manager that persists the sessions in the database. Another alternative is to design a new session manager that keeps the session state inside cookies. The latter has two main drawbacks; it requires cookies to be enabled on the browser side and the length of each request is growing proportionally along with amount of data written. But on the other hand, no disk access.&lt;/p&gt;&lt;p&gt;Last but not least, the object cache. The current object cache is useless when we are talking about multiple processes. The &lt;a href=&quot;http://www.danga.com/memcached/&quot;&gt;memcached&lt;/a&gt; project seems to be the right fit although not as portable as writing a native Python alternative.&lt;/p&gt;</description>
			<pubDate>Wed, 03 Sep 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/running-porcupine-on-smp-systems/</guid>
		</item>
		
		<item>
			<title>The updated recipe manager tutorial is online</title>
			<link>http://www.innoscript.org/the-updated-recipe-manager-tutorial-is-online/</link>
			<description>&lt;p&gt;The &lt;a href=&quot;http://wiki.innoscript.org/index.php/Developers/RecipeManagerTutorial&quot;&gt;recipe manager tutorial&lt;/a&gt; is updated in order to reflect the latest Porcupine API changes. This tutorial goes through all the steps required for building and&lt;br /&gt;deploying a simple Porcupine application from scratch. The sample application is a recipe manager used for storing and retrieving cooking recipes.&lt;/p&gt;&lt;p&gt;Most of the changes introduced are focused on the replacement of the old deprecated servlet classes with the new Web method decorators. Due to the fact that the the latest Porcupine release requires no heavy XML file editing, the tutorial has been greatly simplified resulting in a much more understandable form.&lt;/p&gt;</description>
			<pubDate>Mon, 11 Aug 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/the-updated-recipe-manager-tutorial-is-online/</guid>
		</item>
		
		<item>
			<title>QuiX custom widgets</title>
			<link>http://www.innoscript.org/quix-custom-widgets/</link>
			<description>&lt;p&gt;I have just created a &lt;a href=&quot;http://www.innoscript.org/quix-widgets/&quot;&gt;new downloads section&lt;/a&gt; dedicated to QuiX custom widgets. I have initially included two QuiX custom widgets; a ruler and a flash video player.&lt;/p&gt;&lt;p&gt;If you have already created one or more QuiX custom widgets and you want them published, I would be very excited to include them in the existing list. Just email me including a link to your site and/or if you send me the source code users can download your widgets directly from the inno:script web site.&lt;/p&gt;</description>
			<pubDate>Tue, 05 Aug 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/quix-custom-widgets/</guid>
		</item>
		
		<item>
			<title>Porcupine and Firefox 3</title>
			<link>http://www.innoscript.org/porcupine-and-firefox-3/</link>
			<description>&lt;p&gt;The latest official release is not compatible with Firefox 3. This is because Firefox 3 has added the &quot;charset&quot; directive in the Content-Type HTTP header. As a result Porcupine cannot detect an XML-RPC request initiated by Firefox 3. Here is a quick fix.&lt;/p&gt;&lt;p&gt;Open with an editor the &quot;porcupine/core/http/request.py&quot; file and replcace line 74 with the following code:&lt;br /&gt;&lt;div class=&quot;codesnippet&quot;&gt;&lt;p&gt;if self.serverVariables['CONTENT_TYPE'][:8] == 'text/xml':&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;That's it. Save the file and re-start Porcupine.&lt;/p&gt;</description>
			<pubDate>Wed, 16 Jul 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/porcupine-and-firefox-3/</guid>
		</item>
		
		<item>
			<title>inno:script is now having a new web site</title>
			<link>http://www.innoscript.org/inno-script-is-now-having-a-new-web-site/</link>
			<description>&lt;p&gt;The new web site is far more friendly for search engines and more consistent than the old one in terms of putting things where it should be and not having pieces of relevant information scattered in different sections. I hope you like the new design.&lt;/p&gt;&lt;p&gt;The forum has been replaced by a &lt;a href=&quot;http://groups.google.com/group/porcupine-users&quot;&gt;Google discussion list&lt;/a&gt;, being the new preferred channel for getting support. The inno:wiki - although being partly outdated - is renamed to &lt;a href=&quot;http://wiki.innoscript.org&quot;&gt;porcupine:wiki&lt;/a&gt;. Given the fact that I'm actually running three demanding commercial projects based on &lt;a href=&quot;http://www.innoscript.org/porcupine-web-application-server&quot;&gt;Porcupine&lt;/a&gt;, me and my small team are doing our best to keep it up to date.&lt;/p&gt;&lt;p&gt;Last, don't forget to update your bookmarks!&lt;/p&gt;</description>
			<pubDate>Mon, 14 Jul 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/inno-script-is-now-having-a-new-web-site/</guid>
		</item>
		
		<item>
			<title>FileTrack v0.1-RC2 is released</title>
			<link>http://www.innoscript.org/filetrack-v0-1-rc2-is-released/</link>
			<description>&lt;p&gt;The new &lt;strong&gt;FileTrack&lt;/strong&gt; release is available for download.  &lt;strong&gt;FileTrack&lt;/strong&gt; is a Web-enabled communication log, keeping track of all your inbound and outbound documents. It supports multiple logs, auto-archiving of older entries, and generates simple reports based on multiple criteria. One or more log entries, contacts, or documents can be grouped together into an issue for easier monitoring.&lt;br /&gt;Apart from a couple of minor bugs being fixed this release also includes all the changes required for making it compatible with the latest &lt;strong&gt;Porcupine&lt;/strong&gt; version.&lt;br /&gt;&lt;a href=&quot;http://dl.getdropbox.com/u/476637/FileTrack-0.1-RC2.ppf&quot;&gt;Download&lt;/a&gt; it and then follow the &lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/HowToInstallPPFiles&quot;&gt;installation instructions&lt;/a&gt; to install it. Due to the latest desktop schema updates, the upgrade procedure is not so easy as doing a clean install.&lt;/p&gt;&lt;p&gt;If you need to upgrade to the latest version of FileTrack, you also need to upgrade Porcupine to the latest version. The steps required for upgrading are:&lt;/p&gt;&lt;p&gt;&lt;ol&gt;&lt;li&gt; First upgrade Porcupine to the latest version by using the standard procedure (do not forget to stop the service before attempting the upgrade) as described here. If you are running Windows it is recommended that you use an external uncompress utility such as WinRar. Using the built-in Windows zip handler will result in an non working server. After upgrading, the server won't start because of the current FileTrack version. The upgrade package installation will exit with errors. Ignore them.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Download the new FileTrack ppf file and install it using &quot;&lt;em&gt;pakager -i -p FileTrack-0.1-RC2.ppf&lt;/em&gt;&quot;. During the installation process you will be asked if you want to keep a backup of the previous FileTrack source code. You are advised to do so only in case you have modified the code. The package installation will not be completed. Just ignore any errors for the moment.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Download the &quot;&lt;a href=&quot;http://dl.getdropbox.com/u/476637/upgrade-0.5.ppf&quot;&gt;upgrade-0.5.ppf&lt;/a&gt;&quot; package and install it using &quot;&lt;em&gt;pakager -i -p upgrade-0.5.ppf&lt;/em&gt;&quot;. If you are using the Porcupine source this download is not necessary. This file will normally reside on the installation's root folder after unzipping the source upgrade. On the other hand, this download is required for those who have installed the win32 executable. This time the package installation should exit normally.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; If you reached to this step then you have succesfully upgraded Porcupine and FileTrack to their latest versions. Just to make sure, you can now install again the latest FileTrack package.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</description>
			<pubDate>Mon, 19 May 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/filetrack-v0-1-rc2-is-released/</guid>
		</item>
		
		<item>
			<title>QuiXSampler v0.5 is released</title>
			<link>http://www.innoscript.org/quixsampler-v0-5-is-released/</link>
			<description>&lt;p&gt;The new release of &lt;strong&gt;QuiXSampler&lt;/strong&gt; is available for download. Most of the changes introduced can be found in the splitters' section, since the splitter widgets now derive from boxes.&lt;br /&gt;QuiXSampler can be downloaded from the &lt;a href=&quot;http://www.innoscript.org/porcupine-applications&quot;&gt;Porcupine applications' downloads&lt;/a&gt; or viewed online using the newly upgraded &lt;a href=&quot;http://www.innoscript.org/porcupine-online-demo&quot;&gt;Porcupine demo&lt;/a&gt;.&lt;br /&gt;In order to install it, consult the &lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/HowToInstallPPFiles&quot;&gt;inno:wiki&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Fri, 09 May 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/quixsampler-v0-5-is-released/</guid>
		</item>
		
		<item>
			<title>Small patch for Porcupine v0.5</title>
			<link>http://www.innoscript.org/small-patch-for-porcupine-v0-5/</link>
			<description>&lt;p&gt;This small patch fixes the size of list views contained in windows opened while exploring containers on the Porcupine desktop. This is mostly noticeable while the list views have their scroll bars displayed. Download the following file and copy it inside the &quot;&lt;em&gt;org/innoscript/desktop&lt;/em&gt;&quot; folder.&lt;br /&gt;&lt;a href=&quot;http://dl.getdropbox.com/u/476637/ui.ContainerList.quix&quot;&gt;Download patch&lt;/a&gt;&lt;/p&gt;</description>
			<pubDate>Thu, 08 May 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/small-patch-for-porcupine-v0-5/</guid>
		</item>
		
		<item>
			<title>Porcupine v0.5 is released. More Pythonic, more productive.</title>
			<link>http://www.innoscript.org/porcupine-v0-5-is-released-more-pythonic-more-productive/</link>
			<description>&lt;p&gt;This release is a major breakthrough for &lt;strong&gt;Porcupine&lt;/strong&gt;. The two main new concepts introduced on the server side are the &lt;strong&gt;services&lt;/strong&gt; and the &lt;strong&gt;web methods&lt;/strong&gt;. Porcupine's architecture is now based on configurable services running over a common object database. Currently, the supported service types include an &lt;em&gt;asynchronous network server&lt;/em&gt; and a &lt;em&gt;scheduler&lt;/em&gt; used for executing Python code at predefined fixed intervals. In the upcoming releases there are plans for new service types to be added including persistent queues, loggers etc.&lt;br /&gt;&lt;strong&gt;Web methods&lt;/strong&gt; have replaced servlets completely and they are actually smart Python decorators which allow you to add methods to content classes dynamically (a technique also known as '&lt;em&gt;monkey-patching&lt;/em&gt;'). These methods become directly accessible over HTTP and they are mainly used for serving all kinds of UIs and RPC requests. Consequently, this release does dot include servlets of any type meaning that you have to migrate your applications manually.&lt;/p&gt;&lt;p&gt;Another major productivity enhancement is that &lt;span style=&quot;text-decoration:underline;&quot;&gt;this release no longer requires heavy XML file editing&lt;/span&gt;. Thanks to &lt;strong&gt;web methods&lt;/strong&gt;, &lt;em&gt;the &quot;store.xml&quot; is no longer used and the &quot;config.xml&quot; files for each published directory can now contain smart registrations with regular expressions matching becoming a powerful rewriting engine&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Other improvements include &lt;em&gt;support for pre-processing filters, more memory efficient object sets and type safe data types&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;On the browser side &lt;a href=&quot;http://www.innoscript.org/quix-javascript-toolkit&quot;&gt;QuiX&lt;/a&gt; has become less resource intensive by using a pooled set of XMLHTTP objects and improved garbage collection. Last but not least, the scroll bars bleed through issue on MacOS Firefox browsers is now resolved.&lt;/p&gt;&lt;p&gt;The upgrade process is the usual and is quite straight forward. The following wiki pages contain useful information:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/PorcupineUpgradeInstructions&quot;&gt;Porcupine upgrade instructions&lt;/a&gt;,&lt;br /&gt;&lt;a href=&quot;http://wiki.innoscript.org/index.php/Administrators/UpgradingFrom011to05&quot;&gt;How to migrate your applications to the latest version&lt;/a&gt; and the&lt;br /&gt;&lt;a href=&quot;http://wiki.innoscript.org/index.php/Main/ChangeLog&quot;&gt;Change Log&lt;/a&gt;&lt;/p&gt;</description>
			<pubDate>Sat, 03 May 2008 00:00:00 +0300</pubDate>
			
			
			<guid>http://www.innoscript.org/porcupine-v0-5-is-released-more-pythonic-more-productive/</guid>
		</item>
		

	</channel>
</rss>

