0
I Use This!
Activity Not Available

News

Analyzed 3 months ago. based on code collected 4 months ago.
Posted about 15 years ago
The forthcoming Porcupine release includes a whole new bunch of exciting features and improvements. This is a list of the most significant:1. Python 3 compatibility. The new version will require Python 2.6 or later but it will also be Python 3 ... [More] compatible. Since the bsddb module is deprecated, an extra dependency to pybsddb is added. Porcupine will continue to support both modules with pybsddb having priority over its predecessor.2. High availability and horizontal scalability 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.3. New redesigned database. The main Porcupine DB is now a b-tree instead of hash. All children of a container are now stored adjacently. Locality of reference plays an important part in database performance.4. Support for JSON-RPC 2. JSON is more compact and readable than XML. All remote methods handle this transparently based on the content type of the request.5. Enhanced OQL query optimizer.6. Elastic schema 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.7. The upcoming release will also include a template engine (py-normal-template) that enforces MVC.8. Using swfupload 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.9. QuiX now supports right-to-left layouts 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.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.If you want to test-drive these new features check out the Porcupine development version found at http://github.com/tkouts. [Less]
Posted about 15 years ago
The forthcoming Porcupine release includes a whole new bunch of exciting features and improvements. This is a list of the most significant:1. Python 3 compatibility. The new version will require Python 2.6 or later but it will also be Python 3 ... [More] compatible. Since the bsddb module is deprecated, an extra dependency to pybsddb is added. Porcupine will continue to support both modules with pybsddb having priority over its predecessor.2. High availability and horizontal scalability 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.3. New redesigned database. The main Porcupine DB is now a b-tree instead of hash. All children of a container are now stored adjacently. Locality of reference plays an important part in database performance.4. Support for JSON-RPC 2. JSON is more compact and readable than XML. All remote methods handle this transparently based on the content type of the request.5. Enhanced OQL query optimizer.6. Elastic schema 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.7. The upcoming release will also include a template engine (py-normal-template) that enforces MVC.8. Using swfupload 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.9. QuiX now supports right-to-left layouts 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.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.If you want to test-drive these new features check out the Porcupine development version found at http://github.com/tkouts. [Less]
Posted about 15 years ago
The forthcoming Porcupine release includes a whole new bunch of exciting features and improvements. This is a list of the most significant:1. Python 3 compatibility. The new version will require Python 2.6 or later but it will also be Python 3 ... [More] compatible. Since the bsddb module is deprecated, an extra dependency to pybsddb is added. Porcupine will continue to support both modules with pybsddb having priority over its predecessor.2. High availability and horizontal scalability 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.3. New redesigned database. The main Porcupine DB is now a b-tree instead of hash. All children of a container are now stored adjacently. Locality of reference plays an important part in database performance.4. Support for JSON-RPC 2. JSON is more compact and readable than XML. All remote methods handle this transparently based on the content type of the request.5. Enhanced OQL query optimizer.6. Elastic schema 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.7. The upcoming release will also include a template engine (py-normal-template) that enforces MVC.8. Using swfupload 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.9. QuiX now supports right-to-left layouts 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.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.If you want to test-drive these new features check out the Porcupine development version found at http://github.com/tkouts. [Less]
Posted over 15 years ago
Normal Template is a template engine originally developed by my friend George Moschovitis in JavaScript. What I really like about Normal Template is its simplicity, compactness and its clean JSON-ish approach.Therefore, I decided to write a Python ... [More] 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.Sample usage:template.html<html><h1>Hello {=name}</h1>{:select profile}<p> {=age}<br/> {=gender}<br/></p>{/:select}<p>Your age is {=profile/age}</p><ul>{:reduce articles} <li>{=title} - {=count}</li>{:else} <li>No articles found</li> {/:reduce}</ul>{:if admin} You have admin rights{:else} You don't have admin rights{/:if}</html>template.pyfrom normaltemplate import *template_file = open('template.html')src = template_file.read().decode('utf-8')template_file.close()# compile template into a Python functiontemplate = compile(src)data = { // the data dictionary in JSON format 'name' : 'George', 'profile' : { 'age' : 34, 'gender' : 'M' }, 'articles' : [ { 'title' : 'Hello world', 'count' : 34 }, { 'title' : 'Another article', 'count' : 23 }, { 'title' : 'The final', 'count' : 7 } ], 'admin': True}# calling the template with the data dictionary# returns the rendered outputprint(template(data))The code for py-normal-template is available on github at http://github.com/tkouts/py-normal-template. The original JavaScript implementation is available at http://github.com/gmosx/normal-template. [Less]
Posted over 15 years ago
Normal Template is a template engine originally developed by my friend George Moschovitis in JavaScript. What I really like about Normal Template is its simplicity, compactness and its clean JSON-ish approach.Therefore, I decided to write a Python ... [More] 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.Sample usage:template.html Hello {=name} {:select profile} {=age} {=gender}{/:select} Your age is {=profile/age} {:reduce articles} {=title} - {=count}{:else} No articles found {/:reduce} {:if admin} You have admin rights{:else} You don't have admin rights{/:if} template.py from normaltemplate import * template_file = open('template.html')src = template_file.read().decode('utf-8')template_file.close() # compile template into a Python functiontemplate = compile(src) data = { // the data dictionary in JSON format 'name' : 'George', 'profile' : { 'age' : 34, 'gender' : 'M' }, 'articles' : [ { 'title' : 'Hello world', 'count' : 34 }, { 'title' : 'Another article', 'count' : 23 }, { 'title' : 'The final', 'count' : 7 } ], 'admin': True} # calling the template with the data dictionary# returns the rendered outputprint(template(data)) The code for py-normal-template is available on github at http://github.com/tkouts/py-normal-template. The original JavaScript implementation is available at http://github.com/gmosx/normal-template. [Less]
Posted over 15 years ago
Normal Template is a template engine originally developed by my friend George Moschovitis in JavaScript. What I really like about Normal Template is its simplicity, compactness and its clean JSON-ish approach.Therefore, I decided to write a Python ... [More] 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.Sample usage:template.html<html><h1>Hello {=name}</h1>{:select profile}<p> {=age}<br/> {=gender}<br/></p>{/:select}<p>Your age is {=profile/age}</p><ul>{:reduce articles} <li>{=title} - {=count}</li>{:else} <li>No articles found</li> {/:reduce}</ul>{:if admin} You have admin rights{:else} You don't have admin rights{/:if}</html>template.pyfrom normaltemplate import *template_file = open('template.html')src = template_file.read().decode('utf-8')template_file.close()# compile template into a Python functiontemplate = compile(src)data = { // the data dictionary in JSON format 'name' : 'George', 'profile' : { 'age' : 34, 'gender' : 'M' }, 'articles' : [ { 'title' : 'Hello world', 'count' : 34 }, { 'title' : 'Another article', 'count' : 23 }, { 'title' : 'The final', 'count' : 7 } ], 'admin': True}# calling the template with the data dictionary# returns the rendered outputprint(template(data))The code for py-normal-template is available on github at http://github.com/tkouts/py-normal-template. The original JavaScript implementation is available at http://github.com/gmosx/normal-template. [Less]
Posted over 15 years ago
Before releasing Porcupine v0.6 I have conducted a series of stress tests using Pylot. The aim of one of these stress tests was to benchmark Porcupine under extreme race conditions.For this reason I created a test scenario with only two requests. The ... [More] first request authenticates the "admin" 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.The test scenario is the following:<testcases>   <!-- login -->   <case>      <url>http://192.168.233.115/porcupine.py/</url>      <method>POST</method>      <body><![CDATA[<?xml version="1.0"?>         <methodCall>            <methodName>login</methodName>            <params>               <param><value><string>admin</string></value></param>               <param><value><string>admin</string></value></param>            </params>         </methodCall>       ]]></body>      <add_header>User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8</add_header>      <add_header>Content-type: text/xml</add_header>   </case>   <!-- create object -->   <case>      <url>http://192.168.233.115/porcupine.py/</url>      <method>POST</method>      <body><![CDATA[<?xml version="1.0"?>         <methodCall>            <methodName>create_object</methodName>            <params></params>         </methodCall>      ]]></body>      <add_header>User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8</add_header>      <add_header>Content-type: text/xml</add_header>   </case></testcases>The "create_object" web method is as simple as:from porcupine.utils import miscfrom org.innoscript.desktop.schema.common import [email protected](of_type=RootFolder)@db.transactional(auto_commit=True)def create_object(self):   f = Folder()   f.displayName.value = misc.generate_oid()   f.append_to('')   return TrueThe 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:$ python run.py -a 100 -d 1200 -i 80 -r 100 -x porcupine_txn_test.xml -o results -n "Porcupine 0.6 Performance Results"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).The test's highlights are: - Porcupine was able to serve more than 160K database requests in 10mins - Half of the above requests were transactional which means more than 80K full ACID transactions where committed successfully (more than 65 transactions per second). - Only 17 transactional requests could not be completed (exceeded maximum retries) - The response time of 90% of the requests was less than 1sec.The machine used for the test was a virtual ESX server with dual core processor and Ubuntu installed.The detailed results can be found here. [Less]
Posted over 15 years ago
Before releasing Porcupine v0.6 I have conducted a series of stress tests using Pylot. The aim of one of these stress tests was to benchmark Porcupine under extreme race conditions.For this reason I created a test scenario with only two requests. The ... [More] first request authenticates the "admin" 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.The test scenario is the following:<testcases>   <!-- login -->   <case>      <url>http://192.168.233.115/porcupine.py/</url>      <method>POST</method>      <body><![CDATA[<?xml version="1.0"?>         <methodCall>            <methodName>login</methodName>            <params>               <param><value><string>admin</string></value></param>               <param><value><string>admin</string></value></param>            </params>         </methodCall>       ]]></body>      <add_header>User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8</add_header>      <add_header>Content-type: text/xml</add_header>   </case>   <!-- create object -->   <case>      <url>http://192.168.233.115/porcupine.py/</url>      <method>POST</method>      <body><![CDATA[<?xml version="1.0"?>         <methodCall>            <methodName>create_object</methodName>            <params></params>         </methodCall>      ]]></body>      <add_header>User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8</add_header>      <add_header>Content-type: text/xml</add_header>   </case></testcases>The "create_object" web method is as simple as:from porcupine.utils import miscfrom org.innoscript.desktop.schema.common import [email protected](of_type=RootFolder)@db.transactional(auto_commit=True)def create_object(self):   f = Folder()   f.displayName.value = misc.generate_oid()   f.append_to('')   return TrueThe 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:$ python run.py -a 100 -d 1200 -i 80 -r 100 -x porcupine_txn_test.xml -o results -n "Porcupine 0.6 Performance Results"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).The test's highlights are: - Porcupine was able to serve more than 160K database requests in 10mins - Half of the above requests were transactional which means more than 80K full ACID transactions where committed successfully (more than 65 transactions per second). - Only 17 transactional requests could not be completed (exceeded maximum retries) - The response time of 90% of the requests was less than 1sec.The machine used for the test was a virtual ESX server with dual core processor and Ubuntu installed.The detailed results can be found here. [Less]
Posted over 15 years ago
Before releasing Porcupine v0.6 I have conducted a series of stress tests using Pylot. The aim of one of these stress tests was to benchmark Porcupine under extreme race conditions.For this reason I created a test scenario with only two requests. The ... [More] first request authenticates the "admin" 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.The test scenario is the following:            http://192.168.233.115/porcupine.py/      POST                           login                           admin               admin                            ]]>      User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8      Content-type: text/xml               http://192.168.233.115/porcupine.py/      POST                           create_object                           ]]>      User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8      Content-type: text/xml   The "create_object" web method is as simple as: from porcupine.utils import miscfrom org.innoscript.desktop.schema.common import Folder @webmethods.remotemethod(of_type=RootFolder)@db.transactional(auto_commit=True)def create_object(self):   f = Folder()   f.displayName.value = misc.generate_oid()   f.append_to('')   return True 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:$ python run.py -a 100 -d 1200 -i 80 -r 100 -x porcupine_txn_test.xml -o results -n "Porcupine 0.6 Performance Results"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).The test's highlights are: - Porcupine was able to serve more than 160K database requests in 10mins - Half of the above requests were transactional which means more than 80K full ACID transactions where committed successfully (more than 65 transactions per second). - Only 17 transactional requests could not be completed (exceeded maximum retries) - The response time of 90% of the requests was less than 1sec.The machine used for the test was a virtual ESX server with dual core processor and Ubuntu installed.The detailed results can be found here. [Less]
Posted over 15 years ago
The latest release of FileTrack, 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 ... [More] introduced in the latest Porcupine release (v0.6).Download the application's package and then follow the installation instructions to install it.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 FileTrack using the standard installation procedure for ppf files, as described in the previous link.For any problems you may encounter during the installation procedure, add your comment in this post for getting help. [Less]