Printer driver for Canon MG-7100 on Ubuntu

Once again I was solving a computer problem for my parents-in-law ;-). This time, it was yet another new printer they had bought – a Canon MG7100. Usually, I have had a really good experience with modern Ubuntu and popular printers. They Just Work. And this time it seemed things had gone well again. And they almost had. Except the colours were a bit off. On the Ubuntu printer test page Magenta was brown, bright green was instead a darker green, and yellow was very muddy – more like taupe. I wasted a lot of time cleaning ink nozzles etc etc but the actual solution was to choose a slightly different driver manually from the Canon list. There were two v4.0 options and it was the second that worked.

Category Good setting Bad setting
Job ID Canon-MG7100-2-671 Canon-MG7100-665
Driver CNMG7100.PPD STP00541.PPD
Driver Version 1.0 5.2.10-pre2
Description Canon MG7100 Canon MG7100
Driver Version Canon MG7100 Canon MG7100
Make and Model Canon MG7100 series Ver.4.00 Canon MG7100 series – CUPS+Gutenprint v5.2.10
Printer Canon-MG7100-2 Canon-MG7100

Hope this helps someone else.

Listing Python scripts changed most recently

find / -name *.py -type f -mtime -60 -printf '%TY-%Tm-%Td %TT %p\n' 2>/dev/null | sort -r

Command/options Explanation
find Not as fast as locate but has many advantages. See locate vs find: usage, pros and cons of each other
-name *.py Only find python scripts
-mtime -60 -mtime is days
-printf ‘%TY-%Tm-%Td %TT %p\n’ Displays output with easy-to-read dates
2>/dev/null Pumps all the annoying output about lacking permissions into /dev/null i.e. ignores them
| Pipes output through to be sorted
sort -r Sort so most recent are at top

Also see
How to find recently modified files on Linux

Complex good – complicated bad

In the Zen of Python we are taught that complex is better than complicated. Which is fair enough if we understand the terms as follows:

It is ok if something is complex so long as it is not complicated.

complex: composed of many interconnected parts; compound; composite

complicated: difficult to analyze or understand

Complex vs Complicated

Any decent web framework is going to be a bit complex becauise of all the moving parts it has to handle. But it should make sense and be logically structured enough to avoid being overly complicated.

Eclipse and PyDev on Utopic

I upgraded to Utopic (Utopic Unicorn a.k.a 14.10) and eclipse wouldn’t complete loading anymore. Solution:

Download latest plain vanilla Eclipse from the standard downloads page. And feel free to donate something too.

sudo su

chown -R root:root /home/username/eclipse && mv /home/username/Downloads/eclipse /opt

ln -s /opt/eclipse/eclipse /usr/local/bin/eclipse && exit

Start by running:

eclipse

It didn’t even break PyDev so my luck’s finally turning ;-).

https://www.tumblr.com/search/install+eclipse+ubuntu

Testing new Ubuntu versions

Newer Ubuntu versions are less dramatically new these days, which is probably a good thing, but I like to take them for a spin anyway – old habits and all that. One nice change since the days of Dapper Drake is the ability to boot off a usb stick – much easier than having to burn CDs. On my laptop, I get to the boot menu by pressing the Esc key soon after booting and then selecting the USB stick to boot off. But there can still be problems. In particular, I was receiving the error message:

gfxboot.c32: not a COM32R image

Turns out you need to press the tab key and then type in “live”. Obvious really (not) Ubuntu 14.04 LTS live USB boot error (gfxboot.c32:not a valid COM32R imag).

Another good thing about modern Ubuntus is that they generally work out of the box just how I like them. I remove items from the launcher, shrink the icon size and add the Show Desktop icon to the launcher (under System Settings > Appearance), and I’m almost good to go. There is still one thing that takes a bit of fiddling – adding the ability to minimise on click (Ubuntu 14.04 Adds ‘Click to Minimize App’ Option to Unity Launcher).

Step 1: Open Ubuntu Software Centre
Step 2: Install CompizConfig Settings Manager
Step 3: Open Ubuntu Unity plugin
Step 4: Launcher > Minimize Single Window Applications (Unsupported)

On the one hand the version changes aren’t as exciting as they used to be, but on the other, it’s never been easier to check them out.

Deploying simple flask app on heroku

I’m now a fan of Heroku. How cool is it to be able to deploy a Python app to free hosting?!

Blackbox flask app on Heroku

But in spite of great docs at Getting Started with Python on Heroku there were a few issues I had to handle. The main problems were because the instructions assumed you wanted to start with their demo app and not your own – which meant that they only explained things like requirements.txt and Procfile after you needed to have already made them (they were already present in the demo version).

Note – I am already familiar with git so I don’t explain that here – see Starting a simple Flask app with Heroku for more fleshed-out instructions.

Anyway, here is what I needed to do at the start:

1) Change the app.run(host='0.0.0.0') line to
port = int(os.environ.get("PORT", 33507))
app.run(host='0.0.0.0', port=port)

Otherwise the app would fail because of a problem with the port when I ran

heroku ps:scale web=1

Starting process with command `python main.py`
...
Web process failed to bind to $PORT within 60 seconds of launch

2) I really needed to use virtualenvwrapper and create a requirements.txt file e.g.

cd <folder with code in it>
mkvirtualenv blackbox

Otherwise heroku wouldn’t know what dependencies my app needed fulfilled to work successfully.

To update requirements.txt after changes,

cd <folder with code in it>
workon blackbox
pip freeze > requirements.txt
deactivate blackbox

3) I needed to make a Procfile:

web: python main.py

Note, this was a toy flask app so not using gunicorn etc. Probably should look into that later:

4) Setting debug mode off probably isn’t essential for deployment but probably a good idea anyway: app.debug = False before deploying.

Some other points: when developing on a different machine, I needed to supply my public key to heroku from that other machine (Permission denied (publickey) when deploying heroku code. fatal: The remote end hung up unexpectedly).

heroku keys:add ~/.ssh/id_rsa.pub

And the full sequence for upgrading your app after the prerequisites have been fulfilled is:

  1. Make sure you have the port set for heroku
  2. Then git to local repo
  3. Then git push to heroku
  4. Then run heroku ps:scale web=1 again
  5. Revert from the heroku port back to local for local testing and dev.

heroku addons:add redistogo

To add redis support – NB need to register credit card to use any add-ons, even if free ones.

IDLE3 as default for py files on Ubuntu

Yes – I know, there are better alternatives to IDLE out there, but I am used to it for quick and dirty changes to python files (I use eclipse + pydev for more serious work). And I am increasingly making the switch to Python 3. So when I double click on a py file, odds are I want to open it with IDLE for Python 3 not Python 2.

Start by making sure you have a desktop file like the following:

gksudo gedit /usr/share/applications/idle-python3.4.desktop

[Desktop Entry]
Name=IDLE (using Python-3.4)
Comment=Integrated Development Environment for Python (using Python-3.4)
Exec=/usr/bin/idle-python3.4
Icon=/usr/share/pixmaps/python3.4.xpm
Terminal=false
Type=Application
Categories=Application;Development;
StartupNotify=true

Then make the desktop entry the default for python files:

gedit ~/.local/share/application/mimeapps.list

[Default Applications]
text/w-python=idle-python3.4.desktop

Note – no trailing semi-colon.

And in Linux Mint:

Linux Mint:

ls /usr/share/applications/

identify appropriate .desktop file

gedit /usr/share/applications/defaults.list

add the appropriate .desktop file reference at the front of the python line as appropriate.

Saddest Programming Concept Ever

Python has spoiled me for other languages – I accept that – but I still wasn’t fully prepared for some of the horrors I discovered in Javascript. Which made the satiric article by James Mickens, “To Wash It All Away“, all the more enjoyable. Here is a slice I especially liked:

Much like C, JavaScript uses semicolons to terminate many kinds of statements. However, in JavaScript, if you forget a semicolon, the JavaScript parser can automatically insert semicolons where it thinks that semicolons might ought to possibly maybe go. This sounds really helpful until you realize that semicolons have semantic meaning. You can’t just scatter them around like you’re the Johnny Appleseed of punctuation. Automatically inserting semicolons into source code is like mishearing someone over a poor cell-phone connection, and then assuming that each of the dropped words should be replaced with the phrase “your mom.” This is a great way to create excitement in your interpersonal relationships, but it is not a good way to parse code. Some JavaScript libraries intentionally begin with an initial semicolon, to ensure that if the library is appended to another one (e.g., to save HTTP roundtrips during download), the JavaScript parser will not try to merge the last statement of the first library and the first statement of the second library into some kind of semicolon-riven statement party. Such an initial semicolon is called a “defensive semicolon.” That is the saddest programming concept that I’ve ever heard, and I am fluent in C++.

Nice deal on programming books

First a disclosure – I will be getting two free e-books for promoting the Packt Sale ;-). But I wouldn’t bother writing this up unless I thought Packt books would be of some value to me – so that makes it a genuine endorsement. For reference, here are the three I’m weighing up:

  1. Learning IPython for Interactive Computing and Data Visualization
  2. Git: Version Control for Everyone
  3. Responsive Web Design with jQuery

Buy One - Get One Free

Apparently the deal is:

  • Unlimited purchases during the offer period
  • Offer is automatically applied at checkout

I procrastinated a bit so there are only a couple of days left (ends 26th March). So be fast! Here’s the promotion link