Multi-tenant Database Demo for Ninja Web Framework

I have just written a short demo on how to support multi-tenant database for Ninja Web Framework.

The full source code can be downloaded from github.

Features of this demo

  • Support multi-tenant databases using Ninja web framework. Majority of the existing Ninja web framework documentation for database access is still applicable; only small amount of changes is required to provide tenant database information, and to bind the EntityManager provider to each tenant at runtime.
  • Existing database migration scripts can be used to migrate database changes to all tenant databases.
  • Use HikariCP connection pool in Ninja web framework.

Getting tklbam to install on Ubuntu 14.04

I use tklbam from TurnKeyLinux to backup a number of Linux nodes on DigtalOcean and Amazon AWS.

However, tklbam support was broken on Ubtuntu 14.04 where you can't install the tklbam software.

Below is my workaround to get tklbam to install on Ubuntu 14.04.

As described on TurnKeyLinux web page, run the following command to setup the repository.

wget -O - -q \ \
| PACKAGE=tklbam /bin/bash

Then go to /etc/apt/sources.list.d and use your favourite text editor to edit the Replace the term jessie with wheezy. Your file should look like this:

deb wheezy main

Now run apt-get update to update the packages and then apt-get install tklbam to install tklbam.

My Experience with Using CLIPS

(A chinese translation of this post is available here)

I had the opportunity to incorporate a CLIPS expert system in one of my recent projects for bill plans logics and monitoring of health of our system modules. Both of them are classical sore-points for OO/procedural programming methodologies. We had made an attempt to implement the bill plan logics in an initial version using python, but it ended up in a meshed-up code with half-dozen levels of nested-if-then-else control structures. The system would have eventually ended up to become an excellent case study for project maintenance failure if we had persisted in using an OO/procedural language for the implementation.

Even though CLIPS has worked well for us, I still feel that it may not be suitable for all projects.

Requires radical change in programming paradigm.

Instead of executing your operations in a procedural manner, you have to "train" yourself to re-think your operations as separate rules; these rules operate in tandem in a series of recognize-act cycles. When a group of rules matches, a series of actions can be performed which may change the conditions of the rules in some manner. This may lead to other rulesets (or even the current ruleset) being triggered.

Another issue you would face is how to get these rulesets to "fire" in the order that you want without imposing too much restrictions on them. The conditions in each ruleset should not depend on previous states of other rulesets, i.e. they should not be coupled to each other.

Requires deep understanding of the knowledge domain.

To model the rules, you will need to arrange your knowledge on how things operate in your problem domain into a series of rules/patterns. Usually, you can attempt to perform this knowledge modeling process yourself, or to engage a knowledge modeling expert to assist you.

Execution should be data-driven or pattern-driven.

If you encounter a need to perform lots of if-conditional statements on many variables, the execution process is most likely data-driven or pattern-driven. Any non-trivial knowledge domain usually involves more than a dozen variables to work with. In OO/procedural, this means your source code will end up in meshed-up manner with multi-levels of nested if-else statements. CLIPS language syntax allows you to specify the conditions (i.e. rules) for a group of tasks to be executed in an organized manner.

However, one must be careful to plan and organize the data structure of the CLIPS facts and classes. Every datum in each CLIPS class and facts should be well-encapsulated using the same data-encapsulation principles in OO development methdology).











Scanning Network for Windows Shared Folders

I have noticed that there are quite a few requests for a network scanning application to search for Windows shared folders.

I thought this will be an interesting implementation for pysmb (a pure Python implementation of the SMB1 and SMB2 protocol that supports the Windows file sharing functionality) as well as for developers who are learning to use pysmb for their applications.

You will need Python 2.4 and above, and have installed pyasn1 and pysmb. Next, download the script. Then, run the script with 1 IP address to scan for a single machine, or a start/end IP address pair to scan a range of IP addresses. If the scanned machine has its Windows sharing port (port 137) active, the script will print out its IP address together with the names associated with this machine.

Sample output

$bash> python
Beginning scanning 255 IP addresses... --> CETUS WORKGROUP --> I7PC WORKGROUP

Query timeout. No replies from 253 IP addresses