Build our own Linux Web Server with XAMPP

If we want to set up our own web server on the Linux platform,  installing an XAMPP (Apache+MariaDB+PHP+Perl on the different platforms) will be the easiest way.  Here I show the basic installation procedures as follows:

1. Download a copy of an  XAMPP Linux version from the site Download XAMPP   . For example,  we can download the file

2. Run cd command to go to your directory and execute the installation file:
sudo chmod +x xampp-linux-x64-5.5.35-0-installer.run
sudo ./xampp-linux-x64-5.5.35-0-installer.run

We will see a newly generated pop-up window. Just click the Next button and uncheck the  “Learn more about BitNami for XAMPP” checkbox. We'll install the XAMPP and run it.

To stop the XAMPP, we can:
sudo /opt/lampp/lampp stop
To strat  the XAMPP, we can:
sudo /opt/lampp/lampp start

We can try the url http://localhost from our browser to see the page on our server.

And then one important thing to do- set the Security settings:
sudo /opt/lampp/lampp security
Always say yes by pressing Enter key and key in our password.

1. How to Install XAMPP 1.8.3 for Linux in Ubuntu Desktop 
2. Setting Security for XAMPP


the Muscular Robot-SkinSuitBotM shows the 180 degree Roundhouse Kick

Let's take a look at the Muscular Robot-SkinSuitBotM. It is capable to do lots of the physical fitness movements. He it shows 180 degree Roundhouse Kick:

We can swing the right leg only.

Or we can lift the left knee first,

and swing the right leg.

 Also, we can swing the left leg
 and followed by a right leg swing.


SkinsuitBotQ on the Stage @HsiaMark

SkinsuitBotQ is  now on the Stage with several postures. @HsiaMark

Check out the video!

And look at some screen captures:


Install a Camera and a Realtime Stream Server on the Raspberry Pi

A Raspberry Pi with a camera can become a real time stream sever. We can select either
UV4L or mjpg-streamer to transmit its streaming data.

UV4L(User space Video4Linux collection) includes a full-featured Streaming Server component providing a set of solutions for live audio & video streaming, casting/mirroring and conferencing over the web. 

On the other hand, the MJPG-streamer takes JPGs from Linux-UVC compatible webcams, file system or other input plugins and streams them as M-JPEG via HTTP to web browsers, VLC and other software.

We can install both on the Raspberry Pi.

First, we connect the Camera bus to the Raspberry Pi board, and the start the raspi-config:

sudo raspi-config

Select item 6 to enable the camera:
6 Enable Camera .......                

Reboot and run tests:

raspistill -o cam.jpg
raspivid -o vid.h264

The image/video window will be shown on the console.

Install MJPEG Stream components:

sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev

Get mjpg-streamer from svn:

svn co https://svn.code.sf.net/p/mjpg-streamer/code/
cd code/mjpg-streamer
sudo make install

wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc
sudo nano /etc/apt/sources.list

Add this line to the file and exit:

deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

For autostart service:

sudo apt-get install uv4l-raspicam-extras

sudo reboot

Install uv4l:
sudo pkill uv4l
sudo apt-get update
sudo apt-get install uv4l-uvc
sudo apt-get install uv4l-xscreen
sudo apt-get install uv4l-mjpegstream
sudo apt-get install uv4l-server
sudo reboot

The WebRTC extension for the Streaming Server is also available:
sudo apt-get install uv4l-webrtc
uv4l --auto-video_nr --driver raspicam --encoding mjpeg --server-option '--port=9000' or
uv4l --auto-video_nr --driver raspicam --encoding mjpeg --server-option '--port=9000' --driver raspicam --rotation 180 --width 352 --height 288
Use Browser to link to the uv4l server:    

sudo modprobe bcm2835-v4l2
cd code/mjpg-streamer
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

Use Browser to link to the mjpg-streamer:    



SkinsuitBotQ-The animation robot actress Q with a leopard print skin suit

May I present you the SkinsuitBotQ ! @HsiaMark
The animation  robot actress Q with Skin Suit.
Robot actress Q wears a leopard print skin suit.

Let's get closer.

She smiles to the audience.

And says thank you.

Also up there,

Looks around the other side.

Let's watch the video of  the SkinsuitBotQ 1:



Basic Tutorial Samples of Odoo Object Relational Mapping(ORM)

The traditional Odoo Object Relational Mapping(ORM) API passes the database cursor, user id, context dictionary and record ids(usually denoted as cr, uid, context, ids) to all methods. For example:
    self.browse(cr, uid, sids, context=context)

These parameters have been removed from the new Record style API since Odoo 8. But the programs of Odoo are written in traditional style. So it is still very important to understand how it works.

The basic ORM method is search(). We can provide some searching criteria (domain) to the method like [('uuid', '=', uuid)] to screen out the records we want. And the browse() returns the records we need according the input ids parameter.

Here is the sample of search() and browse():

// Sample of reading own records: search(),browse() directly
    def is_in_session(self, cr, uid, uuid, user_id, context=None):
        """ return if the given user_id is in the session """
        sids = self.search(cr, uid, [('uuid', '=', uuid)], context=context, limit=1)
        for session in self.browse(cr, uid, sids, context=context):
                return user_id and user_id in [u.id for u in session.user_ids]
        return False

If we need to access the data of another class, we should use the pool[] to access that class first.

// Sample of Reading records of other class: use pool[] first
    def users_infos(self, cr, uid, ids, context=None):
        """ get the user infos for all the user in the session """
        for session in self.pool["im_chat.session"].browse(cr, uid, ids, context=context):
            users_infos = self.pool["res.users"].read(cr, uid, [u.id for u in session.user_ids], ['id','name', 'im_status'], context=context)
            return users_infos

Another useful method is  search_read(). It is a combination of a search() and a read(). We need to prepare the domain for search() and the fields list for read(). Look at this example:
// Sample of Odoo ORM search_read(): Performs a search() followed by a read()

    def session_info(self, cr, uid, ids, context=None):
        """ get the session info/header of a given session """
        for session in self.browse(cr, uid, ids, context=context):
            info = {
                'uuid': session.uuid,
                'users': session.users_infos(),
                'state': 'open',
            # add uid_state if available
            if uid:
                domain = [('user_id','=',uid), ('session_id','=',session.id)]
                uid_state = self.pool['im_chat.conversation_state'].search_read(cr, uid, domain, ['state'], context=context)
                if uid_state:
                    info['state'] = uid_state[0]['state']
            return info

The last sample of this tutorial is write().  Just use it to write data back to the records.

// Sample of Odoo ORM write:

    def update_state(self, cr, uid, uuid, state=None, context=None):
        """ modify the fold_state of the given session, and broadcast to himself (e.i. : to sync multiple tabs) """
        domain = [('user_id','=',uid), ('session_id.uuid','=',uuid)]
        ids = self.pool['im_chat.conversation_state'].search(cr, uid, domain, context=context)
        for sr in self.pool['im_chat.conversation_state'].browse(cr, uid, ids, context=context):
            if not state:
                state = sr.state
                if sr.state == 'open':
                    state = 'folded'
                    state = 'open'
            self.pool['im_chat.conversation_state'].write(cr, uid, ids, {'state': state}, context=context)
            self.pool['bus.bus'].sendone(cr, uid, (cr.dbname, 'im_chat.session', uid), sr.session_id.session_info())


Experience of Installing Odoo 8.0 on the Ubuntu Platform

    I've tested he installation procedures many times by following Odoo document and google search referral, but there is no successful experience.

    The first problem I met was Ubuntu version. I've installed Ubuntu 16.04. But its default Python is version 3. Odoo needs version 2.7. Many blogs have their own scripts to cope with this issue. But I decided to go back to Ubuntu 14.04 to make my life easier.

    Then I downloaded the .Deb files from Odoo and install by double clicking the Deb file and clicking the Install button. But still,it was not working.

    Finally, go back to "apt-get install" follow some steps in the Odoo installation document with some changes. It works eventually!
The steps are:
Install postgresql:

sudo apt-get install postgresql-9.3

Install pgadmin3:

sudo apt-get install pgadmin3

Install Odoo on Ububtu 14.04.4

sudo wget -O - https://nightly.odoo.com/odoo.key | sudo  apt-key add -

cd /etc/apt
sudo vi sources.list

Insert "deb http://nightly.odoo.com/8.0/nightly/deb/ ./" into the file

sudo apt-get update 
sudo apt-get install odoo

In this document, there is a section teaching  us how to install in the Deb style Linux:


To install Odoo 8.0 on Debian-based distribution, execute the following commands as root:
# wget -O - https://nightly.odoo.com/odoo.key | apt-key add -
# echo "deb http://nightly.odoo.com/8.0/nightly/deb/ ./" >> /etc/apt/sources.list
# apt-get update && apt-get install odoo
This will automatically install all dependencies, install Odoo itself as a daemon and automatically start it.
to print PDF reports, you must install wkhtmltopdf yourself: the version of wkhtmltopdf available in debian repositories does not support headers and footers so it can not be installed automatically. The recommended version is 0.12.1 and is available on the wkhtmltopdf download page, in the archive section. As there is no official release for Debian Jessie, you can find ours on http://nightly.odoo.com/extra/.


The configuration file can be found at /etc/odoo/openerp-server.conf
When the configuration file is edited, Odoo must be restarted using service:
$ sudo service odoo restart
Restarting odoo: ok