Thursday, September 17, 2009

Getting Started

In my effort to explore various frameworks, I now turn to TurboGears2. The project is called Edumacate and the aim is to create a simple, elegant, blackboard killer.

I'm running Ubuntu 9.04 (Jaunty) and I'll step through the following setup:
  • python-virtualenv
  • TurboGears2
  • Apache2
  • mod_wsgi


Why use python-virtualenv?
TurboGears2 is a fan of python2.5, Ubuntu is a fan of python2.6, and I'm a fan of not having to resolve version conflicts.
python --version
sudo apt-get install python2.5
sudo apt-get install python-virtualenv
# Here I set up a shared environment for all wsgi apps that may need python2.5
cd /usr/local/lib # or wherever you stick your shared libraries
sudo virtualenv --python=python2.5 --no-site-packages python2.5-wsgi
source python2.5-wsgi/bin/activate # use the new environment
python --version
deactivate # go back to the regular python environment


Install TG2 using the new environment
sudo apt-get install python2.5-dev
sudo mkdir /var/webapps/
sudo chown `whoami`:`whoami` -R /var/webapps
cd /var/webapps/
# Use and modify the virtual environment we just created
sudo su -
source /usr/local/lib/python2.5-wsgi/bin/activate
easy_install -i \
http://www.turbogears.org/2.0/downloads/current/index \
tg.devtools
deactivate
exit
# verify that it installed correctly by running help
source /usr/local/lib/python2.5-wsgi/bin/activate
paster --help


Creating the project using TG2
(still in the new environment)
paster quickstart
Edumacate
edumacate
yes
cd Edumacate


Create the project-specific virtual environment
(in /var/webapps/Edumacate)
(using python2.5-wsgi)
virtualenv --python=python2.5 py2.5-edumacate
deactivate # now to the generic environment
source py2.5-edumacate/bin/activate
python --version

Test the project in the new environment
easy_install -i \
http://www.turbogears.org/2.0/downloads/current/index \
tg.devtools
python setup.py develop
paster serve development.ini &
# visit http://localhost:8080/ in a browser on the local machine
# (links2 is a great cli browser if your server is headless)

As a test that I did get two unique virtual environments with no extra libraries I'll install a new library in the default environment and see if I get it in either of the other two.
deactivate
python
>> import mutagen
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named mutagen
# CTRL-D
sudo apt-get install python-mutagen
python
>> import mutagen
# CTRL-D
source py2.5-edumacate/bin/activate
python
>> import mutagen
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named mutagen
# CTRL-D

Good, it works (and doesn't work) as expected. (mutagen is an ID3 / audio tagging library that I plan on using in another project)

Configure Edumacate for Apache
You need to have a python egg cache directory that apache can write to
cd /var/webapps/Edumacate
mkdir py2.5-edumacate/wsgi-cache
sudo chown www-data:www-data py2.5-edumacate/wsgi-cache
mkdir wsgi-config
vim wsgi-config/wsgi-development.py
import os, sys, site

os.environ['PYTHON_EGG_CACHE'] = '/var/webapps/Edumacate/py2.5-edumacate/wsgi-cache'

site.addsitedir('/var/webapps/Edumacate/py2.5-edumacate/lib/python2.5/site-packages')

sys.path.insert(0, '/var/webapps/Edumacate')
sys.path.insert(1, '/var/webapps/Edumacate/py2.5-edumacate/lib/python2.5')

from paste.deploy import loadapp

application = loadapp('config:/var/webapps/Edumacate/edumacate/config/development.ini')

Configure Apache for Edumacate
sudo apt-get install libapache2-mod-wsgi
sudo vim /etc/apache2/mods-enabled/wsgi.conf
# add the following line with the path to the environment you share among all of your TG2 webapps
WSGIPythonHome /usr/local/lib/python2.5-wsgi
sudo touch /etc/apache2/sites-available/edumacate-dev
sudo a2ensite edumacate-dev
sudo vim /etc/apache2/sites-enabled/edumacate-dev
<VirtualHost *:80>
  ServerName edumacate.coolaj86.info
  # we'll make the root directory of the domain call the wsgi script
  WSGIScriptAlias / /var/webapps/Edumacate/wsgi-config/wsgi-deployment.py

  # You can tweak this next line to your heart's content
  # based on the mod_wsgi documentation, but this should work for now.
  #WSGIDaemonProcess myuser threads=1 display-name=%{GROUP}
  #WSGIProcessGroup myuser

  # make the wsgi script accessible
  <Directory /var/webapps/Edumacate/wsgi-config>
  Order allow,deny
  Allow from all
  </Directory >

  # We'll need to create exceptions for all static content.
  # Aliases to serve general project media
  Alias /styles /var/webapps/Edumacate/edumacate/public/styles
  Alias /admin /var/webapps/Edumacate/edumacate/public/admin
  Alias /images /var/webapps/Edumacate/edumacate/public/images
  Alias /scripts /var/webapps/Edumacate/edumacate/public/scripts
  # Make all the static directories accessible
  <Directory /var/webapps/Edumacate/edumacate/public>
  Order allow,deny
  Allow from all
  </Directory >
</VirtualHost>

Test and Complete
sudo /etc/init.d/apache2 restart
# Browse to http://edumacate.coolaj86.info

Resources:
http://simplestation.com/locomotion/mod_wsgi-with-apache-2-on-centos-4/
http://simplestation.com/locomotion/turbogears-2-tg2-with-mod_wsgi-and-virtual-environments/

Thursday, September 10, 2009

Workflow Overview

I hate blackboard. It has a lot of features, but they're too buried or otherwise difficult to use.

Since a good Edumacation tool would benefit me greatly, I'll consider my needs first as I consider the design.

I work as a TA/RA. Here are some of the things I do.
Some of these are best accomplished in a computer sysetem.
Some are best accomplished in person.
  • Grade each student's assignments
    Some times it's more convenient to grade by lab and then by student.
    Other times it's more convenient to grade by student and then by lab.
    Occasionally I want to see an overview everything all at once.
    • Retrieve the student's assignment(s)
    • Open the assignment
    • Correct, annotate, and otherwise make comments
    • Calculate the grade
    • Record the grade
    • Communicate with the student
  • Broadcast e-mails to students as directed by the professor
  • Update course materials as directed by the professor
  • Share notes and ideas with the professor

I'm actually grading some papers right now so I'll update the list as I think about things that annoy me about blackboard.