Saturday, October 24, 2015

Running multiple python apps with nginx and uwsgi in emperor mode

Quote from site

(...)This is a recipe on how to easily run multiple Python web applications using uwsgi server (in emperor mode) and behind nginx. Most existing docs and blogs would show how to manually start uwsgi to run a single app. In this post, I'll show how to configure uwsgi as a system service (with upstart) capable of serving multiple python WSGI compliant web applications by simply placing them in a standard location and adding an standard xml file.(...)

Wednesday, October 14, 2015

Turn a function in asynchrounous mode
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep

class async(Thread):

    def __init__(self, callback, errback):
        super(async, self).__init__()
        self.callback = callback
        self.errback = errback

    def __call__(self, func):
        # à l'appel de la fonction, on récupère juste la fonction
        # et ses arguments, et on lance notre thread
        def wrapper(*args, **kwargs):
            self.func = func
            self.args = args
            self.kwargs = kwargs
        return wrapper

    def run(self):
            retval = self.func(*self.args, **self.kwargs)
        except Exception as err:

def my_callback(retval):
    print "CALLBACK:", retval
    # ici on peut faire des opérations supplémentaires
    # sur la valeur renvoyée par la fonction.
    # ce code est appelé par le thread, il ne peut donc
    # pas bloquer notre thread principal

def my_errback(err):
    print "ERRBACK", err
    # ici on peut re-lancer l'exception, ou simplement
    # l'ignorer. Ce code est également appelé dans le thread

@async(my_callback, my_errback)
def ma_fonction_reussie(n):
    return n

@async(my_callback, my_errback)
def ma_fonction_foireuse(n):
    raise AttributeError("Got %s, expected 'foo'" % n)


# histoire de passer le temps pendant ce temps là...
for i in range(10):
    print "MAIN:", i

Remote command with Paramiko-Expect
#!/usr/bin/env python
# PyNet Class Exercises by Nick Ellson
__author__ = "Nick Ellson"
import paramiko
from paramikoe import SSHClientInteraction
import getpass

# Collect an target, user, and password. This example assumes that privilege level 15 is on your Cisco VTY.
ip = input("Enter Host: ")
username = input("Enter Username: ")
password = getpass.getpass()

#Initialize teh Paramiko connection
remote_conn_pre = paramiko.SSHClient()
remote_conn_pre.connect(ip, username=username, password=password, allow_agent=False, look_for_keys=False)
print ("SSH connection established to %s" % ip)

# Here we make a simple Paramiko only shell because we do not yet have a prompt example to work with for Expect.
# So this will basically log us in, and grab that prompt that we land with, and disconnect.
remote_conn = remote_conn_pre.invoke_shell()   
output = remote_conn.recv(1000).decode("utf-8")
prompt = output.strip()

# Now we reconnect with the paramiko expect module and we have a nice interactive conversation.
remote_conn_pre.connect(ip, username=username, password=password, allow_agent=False, look_for_keys=False)
interact = SSHClientInteraction(remote_conn_pre, timeout=20, display=False)

#Logged in, wait for the prompt to display.
#Shut off the --more-- prompting
interact.send('terminal length 0')
#We don't care about the output for that last command, so just clear the buffer.
cmd_output = interact.current_output_clean
#Let's grab something BIG that use dto be a real timing issue the old way, not knowing how long it might take to get a full 
# running config over a WAN link. Now we do not care, we will simply wait to the prompt shows up. 
interact.send('show running-config')
cmd_output = interact.current_output_clean
print (cmd_output)

#Close our session

Monday, October 12, 2015

Spnner - AsyncIO example-

Nice example using asyncio in Python3.5

# credits: Example by Luciano Ramalho inspired by
# Michele Simionato's multiprocessing example in the python-list:

import asyncio
import itertools
import sys

async def spin(msg):  # <1>
    write, flush = sys.stdout.write, sys.stdout.flush
    for char in itertools.cycle('|/-\\'):
        status = char + ' ' + msg
        write('\x08' * len(status))
            await asyncio.sleep(.1)  # <3>
        except asyncio.CancelledError:  # <4>
    write(' ' * len(status) + '\x08' * len(status))

async def slow_function():  # <5>
    # pretend waiting a long time for I/O
    #await asyncio.sleep(3)  # <6>
    for i in range(100000000):
        i += 1
        await asyncio.sleep(.0000001)
    return 42

async def supervisor():  # <7>
    spinner = asyncio.ensure_future(spin('thinking!'))  # <8>
    print('spinner object:', spinner)  # <9>
    result = await slow_function()  # <10>
    spinner.cancel()  # <11>
    return result

def main():
    loop = asyncio.get_event_loop()  # <12>
    result = loop.run_until_complete(supervisor())  # <13>
    print('Answer:', result)

if __name__ == '__main__':

Friday, September 25, 2015

Reading large GZIP files with Python

Thanks to
Spencer Rathbun

Here Sepencer's way to read, large files with Python, amazingly I have adopted nearly, the same strategy for one of my scripts at work...thanks to Dave Beazley for its fantastic  job on genrators in Python

#!/usr/bin/env python
import gzip, bz2
import os
import fnmatch

def gen_find(filepat,top):
    for path, dirlist, filelist in os.walk(top):
        for name in fnmatch.filter(filelist,filepat):
            yield os.path.join(path,name)

def gen_open(filenames):
    for name in filenames:
        if name.endswith(".gz"):
        elif name.endswith(".bz2"):
            yield bz2.BZ2File(name)
            yield open(name)

def gen_cat(sources):
    for s in sources:
        for item in s:
            yield item

def main(regex, searchDir):
    fileNames = gen_find(regex,searchDir)
    fileHandles = gen_open(fileNames)
    fileLines = gen_cat(fileHandles)
    for line in fileLines:
        print line

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Search globbed files line by line', version='%(prog)s 1.0')
    parser.add_argument('regex', type=str, default='*', help='Regular expression')
    parser.add_argument('searchDir', , type=str, default='.', help='list of input files')
    args = parser.parse_args()
    main(args.regex, args.searchDir)

Thursday, June 11, 2015

Spark web framework and Tomcat

Spark web framework  allows to develop web apps and web site, very easily.
It's similar in spirit to Bottle or Flask
Official site :

Friday, May 22, 2015

Web Typo for non designers

Suffice to say :
Web design is 95% typography
- Oliver Reichenstein, 2006

Hacker's guide to Neural Networks

Very nice introduction to neural networks

GLSL Shader Development Environment

Synthclipse is a GLSL shader prototyping tool. It makes possible to fast develop all kinds of shaders: Fragment (FS), Vertex (VS), Geometry (GS), Tessellation (TS) and Compute (CS). Shader development can be done using compatible with Fragmentarium and Shadertoy (but limited to FS and VS) Fragx shaders or by using fully featured JavaScript JSX scripts. The JSX API is consistent with WebGL but in fact exposes complete OpenGL 4+ API.

Annoted Code

Short annotated Javascript programs

Wednesday, April 1, 2015

Thursday, March 12, 2015

Jython compiler

Quote from site :
Playing around with it since yesterday, from what i have noticed, the jythonc compiler is missing in 2.5.x version of jython. But on doing a quick search i found a java based jython compiler scripts ( here and here ). Also there don't seem to be any jython compiler scripts in jython, perhaps i maybe looking at wrong place. So i wrote up a quick script which tries to do that.

Roll your own server in 50 lines of code

This article explains how to dispatch requests to python modules.
Where nice way to organize code.

Catch “before/after function call” events for all functions in class

Very nice tip :

Monday, January 26, 2015

Discovering Monads

There is  plethora of tutorials on Monads.
What if for the initiation, simply expose the code without naming anything, neither
Let us, just read the code and try to understand.

function init(v) {
  return function() {
      return v;

function bind(wv, fn) {
    return fn(wv())

function addOne(x) {
    return x + 1

function mul2(x) {
    return x * 2

function sqrt(x) {
    return Math.sqrt(x)

function lift(f) {
    return function (val) {
        return init(f(val))

function execute(lstf, value) {
    var nlstf =
    return (nlstf.reduce(bind,init(value)))()  

var result = execute([addOne,sqrt,mul2],5)