Techela is a framework for teaching courses. It provides a way to distribute, collect, grade, and return digital assignments.
The initial setup of a techela course on the techela server is described here. For this example, we create a course with a label of su16-org. You should create a course “recipe” and put it in the courses folder of techela. Here is an example of the recipe. This registers the course with techela.
(su16-org
:title "Short course in org-mode"
:course-number "N/A"
:year 2016
:semester "Summer"
:instructor "John Kitchin"
:instructor-email "jkitchin@andrew.cmu.edu"
:course-repo "https://github.com/KitchinHUB/kitchingroup"
:techela-server "su16-org@techela.cheme.cmu.edu")
The server is run on an ordinary Linux server under a dedicated user. The username should match the username in the :techela-server property of the course recipe. Here are two commands to create a new user and password for the user. If you run your own server you will do this, otherwise you will need the techela server administrator to make your account.
ssh root@techela.cheme.cmu.edu useradd su16-org
In this next command, you should change passwd to whatever password you want to use.
ssh root@techela.cheme.cmu.edu passwd su16-org
First, we make sure we have a .ssh directory and authorized_keys file with the right permissions on the remote server.
ssh su16-org@techela.cheme.cmu.edu "mkdir -p .ssh && chmod 700 .ssh && touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys"
Next, you should setup a local ssh-key so you can connect to this account without a password.
If you don’t have a ~/.ssh/id_rsa key setup run this to setup an ssh key with no password:
[ ! -e ~/.ssh/id_rsa ] ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ""
Now copy it to the techela account like this.
cat ~/.ssh/id_rsa.pub | ssh su16-org@techela.cheme.cmu.edu "cat >> .ssh/authorized_keys"
Now you should be able to run commands like this and not be prompted for a password.
ssh su16-org@techela.cheme.cmu.edu ls
Run this command one time to setup the remote and local directories for the course elisp:tq-setup-course
This section describes the “private” course setup, i.e. the part students do not need to see.
gitolite requirement. Contains userid.pub files.
gitolite requirement. Contains gitolite.conf, which sets up repos.
We can actually create repo.conf files in this directory, and they are included in the gitolite.conf automatically. We only make one repo.conf per repository.
This file defines the @students group. It is usually generated automatically from the roster. Initially this file should have these contents:
@students =
This directory contains a grading file for each assignment. The files contain links to each file, and a summary of the grades.
This is the student facing part of the course. The syllabus should go in here, and any course notes/materials. This is a separate git repository that is usually publicly visible.
Student repos will be cloned into this directory. This is where their work will be pulled after it is collected.
Class repos will be cloned here. This is where you pull class repos for analysis.
Assignments are referred to by label. There should be a directory with the name “label” for each assignment. The contents of this directory will be copied to student repos, so do not put solutions here!
Each assignment should also contain #+POINTS, #+CATEGORY and #+DUEDATE information, which is added to the syllabus when you use elisp:tq-assign-assignment
You create a new assignment repo simply by:
git clone su16-org@techela.cheme.cmu.edu:assignments/label
This automatically creates the remote repo and local directory. Then, you add your content to it and push it back. You have to separately assign it.
Assignments exist in a file called assignments.org in the gitolite-admin directory. Problems are in headlines with a CUSTOM_ID, and solutions should be in a subheading tagges with :solution:.
Assignment is a multistep process. First, you create the assignment, commit and push it to the server. This is done in one of two ways:
- In the assignments directory, run
git clone su16-org@techela.cheme.cmu.edu:assignments/label
Create the content in the label directory, commit it and push it.
- Run a command to create the repo from the assignments.org file.
Then, you need to create repos for each student. This is done with elisp:tq-create-assignment-repos. That will create repos for each student that are empty, and with no access for the students. Next, you assign an assignment with elisp:tq-assign-assignment. This will give students access to the assignment, and give them RW access to their repo to turn it in. Finally, an entry in the syllabus is added so the students will know when it is due.
There are a few steps in collecting an assignment too. The fastest step is to run elisp:tq-collect, which simply changes the student repos to read-only. To view the work, you must run elisp:tq-pull-repos, which will pull all the student work to your local repo.
You run elisp:tq-grade, which will collect the assignment, pull them, and generate a grading document with links to each assignment. You will click on each link to grade each assignment. In each assignment, provide feedback and finally elisp:gb-grade. You will be prompted for a letter grade for each category of the rubric. This function will compute the weighted average grade.
Run elisp:tq-return to commit all changes to each student repo and push them back to the server.
Yes. You can define teams in gitolite-admin/gitolite.conf like this:
@team-1 = userid1 userid2 userid3
Then, you can create repos with team access like this:
repo team-project-1 RW = @team-1
Any kind of file can be turned in. Simply put a copy of the file into the assignment directory and run the tq-turn-it-in command. All files in the directory will be turned in.
Not really, but sort of. Techela is a git based framework for distributing and collecting course materials. You can use git any way you want. However, you will have to roll your own solutions to use another method, e.g. Python or shell script. You will also not be able to get the integrated syllabus/grading tools that only exist in org-mode + Emacs.
As an instructor you create an assignment repo like this:
git clone org-course@techela.cheme.cmu.edu:a/label
cd label
# Add files
git add files
git commit files -m "some message"
git push -u origin master
When it is time to assign the assignment to students, you need to create private repos for each student. While these can be any path you want, I you make them like this. For each student, create a file in the gitolite-admin/conf/student-work/label/userid-label.conf with the following contents.
repo student-work/label/userid-label RW = userid
When you have created all of them, do this in the gitolite-admin directory:
git add conf/student-work
git commit -m "add new assignment repos"
git push
This creates bare repos on the server that students can access.
Then, you run this command to give students read access to the assignment repo.
ssh org-course@techela.cheme.cmu.edu perms + READERS @students
Students will run this command to clone the repo to their local machine. They only have read permission on this repo so they need to change the remote they will push to.
git clone org-course@techela.cheme.cmu.edu:a/label
cd label
git remote rename origin src
git remote add origin org-course@techela.cheme.cmu.edu:student-work/label/userid-label
They will do their work in the label directory, and when they are done perform the following commands.
git add *
git commit -am "Turning work in"
git push -u origin master
You need to change the conf file for each assignment repo to have the correct permissions, in this case, read-only for the students like this.
repo student-work/label/userid-label R = userid
When you have modified all of them, do this in the gitolite-admin directory:
git add conf/student-work
git commit -m "add new assignment repos"
git push
Now, you need to clone/pull each repo to your local machine. The first time you do this, you will have to clone them, e.g.
cd student-work/label/userid-label
git clone org-course@techela.cheme.cmu.edu:student-work/label/userid-label
cd user-label
git tag -a turned-in -m "Work turned in by student"
You will do your grading, and then run this command to “return” the work.
git tag -a graded -m "graded"
git add *
git commit -am "Finished grading"
git push --tags -u origin master
Finally, students need to pull their repo to see the grade and feedback.