Friday 14 December 2012

ITU and their lost battle to charge YouTube

ITU's Final acts of the World Conference on International Telecommunications, Dubai 2012, is out. 

Besides begging for money and trying to stay relevant, the ITU ratified 'Deep Packet Inspection' (DPI). They also managed to insert this gem: "optionally requires DPI systems to support inspection of encrypted traffic “in case of a local availability of the used encryption key(s).” [1]

What that means is that should your ISP magically come into possession of say your private keys, they are allowed to decrypt your email, communications etc. that you used to encrypt it, forever without telling you.

Their shameless money grab was left for last, on page 23 of the Final Acts titled 'International telecommunication service traffic termination and exchange'. It recognises that dedicated phone and data has moved to IP based networks and many Member States are asking for their authorised operating agencies to invoice service providers. In other words, many Governments are asking, on behalf of their state-run-money-losing telecos, to invoice YouTube for sending traffic to their users. 

The sooner these governments accept the fact that state run telcos are worse than state run airlines, the sooner they can stop begging YouTube for money and implement an open platform for all telecommunication firms to flourish.

Source:
[1] https://www.cdt.org/blogs/cdt/2811adoption-traffic-sniffing-standard-fans-wcit-flames

Monday 1 October 2012

Flask, MySQL, WTForms & SQLAlchemy that works

Quick 'n dirty Flask, WTForms & SQLAlchemy that works.

database.py
#!/usr/bin/env python
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy.interfaces

# Without this, MySQL will silently insert invalid values in the
# database, causing very long debugging sessions in the long run
# source: http://www.enricozini.org/2012/tips/sa-sqlmode-traditional/
class DontBeSilly(sqlalchemy.interfaces.PoolListener):
    def connect(self, dbapi_con, connection_record):
        cur = dbapi_con.cursor()
        cur.execute("SET SESSION sql_mode='TRADITIONAL'")
        cur = None

engine = create_engine('mysql+mysqldb://root:banana@127.0.0.1/testdb?charset=utf8&use_unicode=0', convert_unicode=True, listeners=[DontBeSilly()], echo=True)
db_session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
Base.metadata.create_all(bind=engine)
models.py
#!/usr/bin/env python
from sqlalchemy import Column, Integer, String
from flask_application.database import Base
  
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String)
    password = Column(String)
    email = Column(String, unique=True)
    country_id = Column(Integer)

    def __init__(self, username=None, password=None, email=None, country_id):
        self.username = username
        self.password = password
        self.email = email
        self.country_id = country_id

    def __repr__(self):
        return '' % (self.username, self.password, self.email, self.country_id)
forms.py
#!/usr/bin/env python
from flask.ext.wtf import Form, TextField, PasswordField, BooleanField, SelectField
from flask.ext.wtf import Required, Email, EqualTo
    
class user_add_form(Form):
    username = TextField('Username', [Required()])
    password = PasswordField('Password', [Required()])
    confirm = PasswordField('Repeat Password', [Required(), EqualTo('password', message='Passwords must match')])
    email = TextField('Email')
    country_id = SelectField(u'Country', choices=[('1', 'UK - United Kingdom')])
template_add_user.html
{% block content %}

{{ form.username }} {{ form.username.label }}

{{ form.password }} {{ form.password.label }}

{{ form.confirm }} {{ form.confirm.label }}

{{ form.country_id }} {{ form.country_id.label }}

{% endblock content %}
view.py
from flask import Blueprint, request, render_template, flash, g, session, redirect, url_for
from flask_application import app
from flask_application.database import db_session
from flask_application.models import User
from flask_application.forms import user_add_form
from werkzeug.security import generate_password_hash, check_password_hash   

@frontend.route('/users/add', methods=['GET','POST'])
def users_add():
    form = manage_user_add_form(request.form, csrf_enabled=False)
    if form.validate_on_submit():
        new_user = User(
                    form.username.data,
                    generate_password_hash(form.password.data),
                    form.email.data,
                    form.country_id.data
                    )
        db_session.add(new_user)
        db_session.commit()
        
    return render_template('template_add_user.html', form=form)

Monday 24 September 2012

iPhone Test Field Mode, Serving PLMN Info and Cell ID.

I'm working on a project and needed to validate the Location Area Code and Cell ID in my tests with actual info from my mobile phone. Using an iPhone and going into Test Field Mode did the trick.

Go into Test Field Mode:

  • Dial *3001#12345#*
  • MM Info -> Serving PLMN - Gives you MCC, MNC, RAC and LAC
  • UMTS Cell Environment -> UMTS RR Info - Gives you Cell ID
There's much more information there and it's very handy since you don't need to muck about in an app.

Thursday 29 March 2012

Android land at Mobile World Congress 2012

A little late but here are some shots from Android land at Mobile World Congress 2012.




An android making little Android statues.



Club Android.



Wednesday 29 February 2012

MWC: Huawei pretty booth

Huawei has got a very impressive boot here at MWC and some very neat products, but I didn't have much time as I was just passing by on my way to see Android's booth!











Saturday 25 February 2012

Mobile World Congress



It's here once again, Mobile World Congress or MWC, is upon us and mad scramble for free badges is in full swing. You'd think a pretty large company would have this all sorted out by now, but what's the fun in that, besides as my crazy aunt always says, procrastination is the art of keeping up with yesterday.

So there you have it, I've just got my badge sorted out and I'll be there everyday till it's over. It's being held in beautiful Barcelona, Spain. Engadget have a beautiful picture of the venue worth checking out.

I'll be out and about looking at cool things to come and will try to live blog as fast as I can. So stay tuned folks because there's more to come.

Tuesday 14 February 2012

Why use liburl when you can have 'requests'!

If you're is using liburl/liburl2, you might want to take a look at 'requests'. Very neat, clean and soft on the eyes :)

Sunday 29 January 2012

Python simpleapi flask

I was looking for a quick and simple way to implement APIs with Flask and came across one aptly called Simpleapi.

After going through the examples, there seems to be a problem with getting POST data to the server, so after a small edit, GET works fine.

By default simpleapi client sends POST data, we will need to make a small change to make it send GET data. In /lib/python2.7/site-packages/simpleapi/client/client.py, line 62, change

client.py
try:
                response = urllib.urlopen(self.ns,
                                        urllib.urlencode(data))
Change to:
try:
                response = urllib.urlopen(self.ns %
                                        urllib.urlencode(data))
Flask server
from flask import Flask

from simpleapi import Route
from handler import calculator

app = Flask(__name__)
app.route('/api/', methods=['GET'])(Route(calculator, framework='flask', debug=True))

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8888, debug=True)
Client
#!/usr/bin/env python

from simpleapi import Client, RemoteException

calculator = Client(ns='http://127.0.0.1:8888/api/?%s')
print "the answer is", calculator.add(a=23, b=3)

Monday 16 January 2012

Flask, virtualenv and Aptana/PyDev

I've just started playing with Flask and it's good, really really good. Today I want to tell you how I got Flask + virtualenv + Aptana studio 3, which includes PyDev, to work together.

  1. Create project directory and setup virtualenv environment in it
    mkdir projectfolder
    cd projectfolder
    virtualenv env
    . env/bin/activate
    
  2. In Aptana, import project then setup a new Python Interpreter which points to the 'Python executable' in the 'env' folder created by virtualenv command earlier.
    Go under 'Preferences -> PyDev -> Interpreter - Python',  click 'New...'.
    Now browse to your [PROJECT_FOLDER] -> env -> bin and select 'python2.7'.
    Change the 'Interpreter Name' to something descriptive like '[PROJECT_FOLDER]-Python' and click 'Ok'.
    A 'Selection needed' window will pop-up. Do not touch anything, click 'Ok'.
    An 'Error: Python stdlib source files not found' window will pop-up. Click 'Proceed anyways'. Click 'Ok' on preference window.
  3. In PyDev Package Explorer window, right-click on your project folder and select 'PyDev -> Set as PyDev Project'
  4. Right-click on project folder again and select 'Properties'.
    Go under 'PyDev - Interpreter/Grammer'
    Then under 'Interpreter' select the one we setup in step 2, [PROJECT_NAME]-Python.
  5. Click on 'Ok' and you're all set.
So it all runs pretty good so far, brought to you by the good folks of the 'internets' :)