on T3

Author's email: dlypka@futurelogic.com


Blockchain Development Notes:

https://www.multichain.com/ Open source private blockchain platform

Multichain is a self-contained Blockchain platform for implementing private (i.e. Corporate) blockchains.

Multichain is very quick to install and get going.

Multichain is implemented in C++.

Multichain can be installed on Windows or Linux.

The following examples are for installing on Linux in the Microsoft Azure Cloud.

I will follow in a future post with a Multichain install on Google Compute Engine example.



Installing Multichain on 2 independent standard Azure Canonical Ubuntu 16.04 VMs:

All Azure VMs have a subnet of internal "10." IP addresses (e.g. and

by default Azure blocks/disables ICMP ping queries on the public IP address.

Be sure to configure the public IP address to be "static".

The Azure Script to Install Multichain unfortunately only detects the internal "10." addresses

and there multiple Multichain nodes fail to inter connect.

There is a workaround for this issue:

In the Multichain configuration, replace all "10." IP addresses

with the public IP address and keep any port specifications

suffixed onto the "10." IPs, intact.

The 2 independent Ubuntu VMs cannot ping each other; however they can connect to each other if a port is specified.

Multichain does connect via ports, and so its connections will work on Azure.


Here are several other things I am researching how to do:

1. Resource Bundling

2. Convert T3 to use the new GAE Search API. I believe it means using a special datastore, not the regular GAE Entity store.

3. How to extract a sitemap from the T3 WIKI in a format suitable for input to the Google Spider Crawler so that Google will return substantial results on a search of the T3 Wiki site.

Two recommended steps to assist the Crawler are:

i) Submit general sitemap specified by sitemap.org, a joint effort by Google, Yahoo, Microsoft.
            ii) Declare sitemap URL in robots.txt

Here are several other things I recently figured out how to do:

1. Treeview using Asynchronous Ajax - I finally got this to work in web2py T3

2. Programming 'In the Cloud' in T3. - I got the first step working - see note on calling Procedures in T3 below.

4. web2py backend for PhoneGap apps. I recently got this to work. It needs web2py to return jsonp, and I have that working.

5. DALnr for web2py

   I got this to work using PolyModel

   my suggested "nativeRef" patch is now part of the DAL




GAE Datastore Full Text Searching

I found some links that explain how to do a simple Full Text Search on the datastore


http://appengineguy.com/2008/06/how-to-full-text-search-in-google-app.html   or





Overriding CRUD to use a custom View form


 There has been a lot of discussion lately about how to point CRUD to a custom .html. None of the proposed solutions appears to work for me.


Here is my own proposal #1 :

It is based on this clue Just In:

HTML helper and widget Component list manipulation example is here:



I found I could use 

The above clue will allow me to apply my "Scrounge for Scraps" software pattern to design the ulimate solution to this problem.  


  I would like to coin the new term 'Scavenger Software Design Pattern' to describe the approach used in this solution: To find the core object instances of an autogenerated context, and then house them in a new customized view.



 In the Database Definition



In the Controller



mycomponents = form.components[0]



myField1INPUT  = mycomponents[0]

mydict= dict(form=form, myField1INPUT = myField1INPUT )

     return mydict



In the View Markup:


 <form action="index" enctype="multipart/form-data" method="post">




    <label for="testtable_testfield1" id="testtable_testfield1__label">My Custom Testfield1: </label>

              { {=myField1INPUT} }




 { {=form.hidden_fields() } } 


Notable Tricks in the above snippet:

1. Do NOT include the { { =form } } at the top of the View .html

   =form is not desired in this case because it would generate the crud markup which we

   are trying to override.

2. Do put the special expression for form.hidden_fields() at the end

   It is used to enable the error messages per field such as 'cannot be empty'


There is an new way to do it now (as of Aug 2009):


{ {=form.custom.begin} }

{ {=form.custom.widget.email} }

{ {=form.custom.widget.password} }

{ {=form.custom.submit} }

{ {=form.custom.end} } 


Using Microsoft SQL Server from web2py


The MSSQL Driver is pymssql from  http://pymssql.sourceforge.net/   which had a major bug fix release on 2009-04-28.

I downloaded it and modified the web2py DAL code in sql.py to use pymssql drivers.

It works well. I was able to have 2 database connections active at the same time - the usual 'db' connection to SQL Lite, and the new  mssql connection which I named 'dbmssql'.  Internally the sql.py code uses a database cursor created by pymssql and then does a fetchall() to return the complete list of query results. It would also be possible to iterate on the cursor to visit the result rows individually, but in practice this should not be necessary as it is not a good idea to query for more rows than can reasonably fit into memory.

Calling a method you have typed into the T3 Procedures Page


For some bizarre reason, when you use @expose in T3 Manage .. Procedures,

you have to add 2 extra arguments with exactly these names:   rndval and callback:


         def mock_markets(parentId, leafId, rndval, callback):










Submit Created by David Lypka - Powered by web2py