Steps to take to get a virtualenv with Python 3.3 working on Ubuntu 12.04:

I recently decided to do a bit of finals procrastination by working on a problem that’s been a mild nuisance for the past few months. My Google Contacts have had a problem with delineating first and last names, but that’s a story for another post. If you’re interested in the repo as it develops, check out https://github.com/andrewychoi/fix_contacts

What I had been having trouble with was the consistent need to enter a username and password for every time that I wanted to git push to the server. I went into the GitHub user menu and added an SSH key, but access to my accounts was still problematic.

The problem was that my project_directory/.git/config file still told me that origin was to be reached over HTTPS. Changing that to SSH solved the protocol access problem. For exactness, I changed the line

https://github.com/username/project.git

to

ssh://github.com/username/project.git

Now, however, I was greeted with a

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

At this point, I started searching the web for the solution to this problem. It turns out that I needed to SSH in as the git user. The fix was to change

ssh://github.com/username/project.git

to

ssh://git@github.com/username/project.git

Now everything works like a charm!


> git pull
Already up-to-date.
> git push
Everything up-to-date.

I mentioned to a friend today that I’ve been making an effort to TeX the majority of my schoolwork, and I thought I’d share a couple of things that I memorized in the interest of saving time:

\setcounter{secnumdepth}{-1}

I tend to use the \section{} keyword (function? delimiter?) a lot, especially when enumerating problem numbers, like so:

\section{Problem 3}
\subsection{a.}

or

\section{3.4.2}

Using \setcounter{secnumdepth}{-1} helps me keep extraneous numbering to a minimum.

\usepackage{fullpage}

Pretty self-explanatory, I use this to make sure I’m not wasting too much empty space.

\usepackage{amsmath} and \begin{align}, \end{align}

I love the amsmath package and especially the align environment; it lets me get my equations in neat and tidy order. If you don’t want numbered equations, make sure to use \begin{align*} and \end{align*}.

I am, however, looking for a way of making sure that all columns in a three or more column structure are left-aligned. If you know how to do that, please let me know!

\includegraphics[width=\textwidth]{filename.jpg}

The \includegraphics[]{} function comes in the graphicx package (N.B. the function name is \includegraphics but the package name is graphicx). The [width=\textwidth] section is a great little hack to keep your image aspect ratio constant while ensuring that all of the image is visible.

Any other great hacks out there?

I was getting an IntegrityError while working with the User model in django.contrib.auth.models, with a call for a check to see if the User model’s username was unique. I solved this by using a call to User.objects.create_user() instead of instantiating a new User() and manually setting all necessary attributes.

As a side note, if you’re working with the django.contrib.auth.forms UserCreationForm, be aware that there won’t be a password field in the returned form. There are instead password1 and password2 fields.

I was debuggigng this bit of code today, and ran into a silly error:

# child_template.html:
{% extends "base.html" %}

{% block tab_contents %}
{{ block.super }}
{% endblock %}


# base.html
...
{% for i in 123|make_list %}

{% if tab_index == i %}

{% csrf_token %}

{{ form.as_table }}

{% endif %}

{% endfor %}
...

When you pass variables to a template, the type of the variable still does matter. It turns out that the for i in 123|make_list makes i a string variable. Thus, if you want to conditionally print something, you need to pass 'tab_index': '1' instead of 'tab_index': 1. It’s a subtle distinction, but the ‘==’ won’t work if the variables are of disparate types.

On a project that I’m working on currently, I have the following model definiton:

class Embassy(models.Model):
name = models.CharField(max_length = 200)
facebook_id = models.IntegerField(blank=True, null=True)
twitter_id = models.IntegerField(blank=True, null=True)
youtube_id = models.IntegerField(blank=True, null=True)

I had initially run a python manage.py syncdb before changing the IntegerFields to allow null values. I thought that running a python manage.py sqlclear embassy would solve the problem, but it didn’t actually drop the table that it needed to. I had to go to python manage.py dbshell and run DROP TABLE embassy_embassy to get the table manually dropped.

Hopefully the wonderful people at Django will fix this bug soon!

Running across this bug is a bit odd, because I wasn’t aware of any assertions that I was making, but this was the offending code:

{% if display_type == 'ts' %}
<script src="/static/highstock.js" type="text/javascript">
</script>
{% else if display_type == 'avg' %}
<script src="/static/highcharts.js" type="text/javascript">
</script>
{% endif %}

The above code ended up causing an AssertionError: No exception supplied.

The idea was to do a conditional JavaScript import, but the problem actually ended up being in the Django template syntax.  The correction was to replace the “else if” with an “elif”.  Rookie mistake!

Corrected code:

{% if display_type == 'ts' %}
<script src="/static/highstock.js" type="text/javascript">
</script>
{% elif display_type == 'avg' %}
<script src="/static/highcharts.js" type="text/javascript">
</script>
{% endif %}

A few lessons learned today from working with MySQL variables, WHILE loops, and prepared statements:

  • In a continuation statement for the WHILE loop, make sure to use user-defined variables (i.e. “DECLARE foo INT DEFAULT 10” as opposed to “SET @foo = 10”, which defines a session variable called @foo to be 10)
  • When using these user-defined variables, be sure to DECLARE them before any other code gets executed.  I’m embarrassed to say that this is one of the things that confounded me the most, despite having written more lines in C than in probably any other language.

More to come as this project continues!

I just spent an excruciating amount of time trying to figure out what was wrong with my install of Eclipse.  It turns out that if you attempt to install Eclipse using just sudo apt-get install eclipse or sudo apt-get install eclipse-pde, you are unable to get Eclipse to add plugins.  I ended up using the Software Center to install the Eclipse package with a Java development platform, and was then able to add the PyDev and Subclipse plugins to work!

I was just having some problems installing a FileZilla FTP server behind a firewalled NAT, and after considerable trial and error, the solution seems to be to make sure that the server is using a specific set of ports (e.g. 35000 – 35050) and forward those along with the traditional ports (20-21).