Sunday, February 15, 2015

Python 3.5 and Django 1.7's HTMLParseError

I just updated my Python installation to 3.5 Alpha 1 and started with Django today and I hit a road block already. It all went fine, when I created the virtual environment and installed Django 1.7.4 in it. And then when I did startproject, I got AttributeError: module 'html.parser' has no attribute 'HTMLParseError'.
(py3.5venv) ➜  myProject git:(master) ✗ django-admin.py startproject myProject
Traceback (most recent call last):
  File "/py3.5venv/bin/django-admin.py", line 5, in 
    management.execute_from_command_line()
  File "/py3.5venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/py3.5venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/py3.5venv/lib/python3.5/site-packages/django/__init__.py", line 18, in setup
    from django.utils.log import configure_logging
  File "/py3.5venv/lib/python3.5/site-packages/django/utils/log.py", line 13, in 
    from django.views.debug import ExceptionReporter, get_exception_reporter_filter
  File "/py3.5venv/lib/python3.5/site-packages/django/views/debug.py", line 10, in 
    from django.http import (HttpResponse, HttpResponseServerError,
  File "/py3.5venv/lib/python3.5/site-packages/django/http/__init__.py", line 4, in 
    from django.http.response import (
  File "/py3.5venv/lib/python3.5/site-packages/django/http/response.py", line 13, in 
    from django.core.serializers.json import DjangoJSONEncoder
  File "/py3.5venv/lib/python3.5/site-packages/django/core/serializers/__init__.py", line 23, in 
    from django.core.serializers.base import SerializerDoesNotExist
  File "/py3.5venv/lib/python3.5/site-packages/django/core/serializers/base.py", line 6, in 
    from django.db import models
  File "/py3.5venv/lib/python3.5/site-packages/django/db/models/__init__.py", line 6, in 
    from django.db.models.query import Q, QuerySet, Prefetch  # NOQA
  File "/py3.5venv/lib/python3.5/site-packages/django/db/models/query.py", line 13, in 
    from django.db.models.fields import AutoField, Empty
  File "/py3.5venv/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 18, in 
    from django import forms
  File "/py3.5venv/lib/python3.5/site-packages/django/forms/__init__.py", line 6, in 
    from django.forms.fields import *  # NOQA
  File "/py3.5venv/lib/python3.5/site-packages/django/forms/fields.py", line 18, in 
    from django.forms.utils import from_current_timezone, to_current_timezone
  File "/py3.5venv/lib/python3.5/site-packages/django/forms/utils.py", line 15, in 
    from django.utils.html import format_html, format_html_join, escape
  File "/py3.5venv/lib/python3.5/site-packages/django/utils/html.py", line 16, in 
    from .html_parser import HTMLParser, HTMLParseError
  File "/py3.5venv/lib/python3.5/site-packages/django/utils/html_parser.py", line 12, in 
    HTMLParseError = _html_parser.HTMLParseError
AttributeError: module 'html.parser' has no attribute 'HTMLParseError'
Then Antti Haapala (a friend from Stakoverflow's Python Chat room) found out that it is because HTMLParseError is deprecated from Python 3.3 onwards and removed in Python 3.5, as per the official documentation. He continued the investigation and found out that django guys are already aware of this, as they have a bug raised, and the fix has been already delivered to the code repository.
Now, all we can do is, wait for the version of django which officially supports Python 3.5 or manually patch html_parser.py file as per the above shown fix. Even if we patch it manually, there is no guarantee that everything else will work fine.

Sunday, February 1, 2015

Ubuntu overlapping displays while scaling dual monitor setup

Today, again I wanted to change my screen's display size, in my Ubuntu 14.04. This time I have a dual monitor setup and I tried all the commands I mentioned in my blog post Ubuntu scaling the display (Zooming).
➜  ~  xrandr
Screen 0: minimum 8 x 8, current 2560 x 1024, maximum 16384 x 16384
VGA-0 connected 1280x1024+1280+0 (normal left inverted right x axis y axis) 376mm x 301mm
    1280x1024      60.0*+   75.0  
    1152x864       75.0  
    1024x768       75.0     60.0  
    800x600        75.0     60.3  
    640x480        75.0     59.9  
LVDS-0 connected (normal left inverted right x axis y axis)
    1600x900       60.0 +   40.0  
DP-0 connected primary 1280x1024+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
    1280x1024      60.0*+   75.0  
    1152x864       75.0  
    1024x768       75.0     60.0  
    800x600        75.0     60.3  
    640x480        75.0     59.9  
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
➜  ~  xrandr --output DP-0 --scale 1.25x1.25
➜  ~  xrandr --output VGA-0 --scale 1.25x1.25
➜  ~  xrandr
Screen 0: minimum 8 x 8, current 2880 x 1280, maximum 16384 x 16384
VGA-0 connected 1600x1280+1280+0 (normal left inverted right x axis y axis) 376mm x 301mm
    1280x1024      60.0*+   75.0  
    1152x864       75.0  
    1024x768       75.0     60.0  
    800x600        75.0     60.3  
    640x480        75.0     59.9  
LVDS-0 connected (normal left inverted right x axis y axis)
    1600x900       60.0 +   40.0  
DP-0 connected primary 1600x1280+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
    1280x1024      60.0*+   75.0  
    1152x864       75.0  
    1024x768       75.0     60.0  
    800x600        75.0     60.3  
    640x480        75.0     59.9  
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
Though it changes the display size, both the screens had overlapping images. After so much analysis, I found one inconsistency in the output of xrandr, before and after scaling. Note the first two lines.
Screen 0: minimum 8 x 8, current 2560 x 1024, maximum 16384 x 16384
VGA-0 connected 1280x1024+1280+0 (normal left inverted right x axis y axis) 376mm x 301mm
...
Screen 0: minimum 8 x 8, current 2880 x 1280, maximum 16384 x 16384
VGA-0 connected 1600x1280+1280+0 (normal left inverted right x axis y axis) 376mm x 301mm
Individual screen's resolution has scaled to 1600x1280 from 1280x1024, but the total screen size is 2880 x 1280, also the screen's position is 1280x0 instead of 1600x0. So, to get over the overlapping problem, I used the following command, after reboot, and it worked
➜  ~  xrandr --output DP-0 --scale 1.25x1.25 --pos 0x0 --output VGA-0 --scale 1.25x1.25 --pos 1600x0
➜  ~  xrandr
Screen 0: minimum 8 x 8, current 3200 x 1280, maximum 16384 x 16384
VGA-0 connected 1600x1280+1600+0 (normal left inverted right x axis y axis) 376mm x 301mm
    1280x1024      60.0*+   75.0  
    1152x864       75.0  
    1024x768       75.0     60.0  
    800x600        75.0     60.3  
    640x480        75.0     59.9  
LVDS-0 connected (normal left inverted right x axis y axis)
    1600x900       60.0 +   40.0  
DP-0 connected primary 1600x1280+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
    1280x1024      60.0*+   75.0  
    1152x864       75.0  
    1024x768       75.0     60.0  
    800x600        75.0     60.3  
    640x480        75.0     59.9  
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
Now, you see that both the actual size of the screen and the starting position of the second screen is set properly.
Screen 0: minimum 8 x 8, current 3200 x 1280, maximum 16384 x 16384
VGA-0 connected 1600x1280+1600+0 (normal left inverted right x axis y axis) 376mm x 301mm
...