This course is now fully booked and has a long waiting list. If you would like to be informed of similar events in the future, please e-mail us on swc2012@ucl.ac.uk.
What: Our goal is to help scientists and engineers become more productive by teaching them basic computing skills like program design, version control, testing, and task automation. In this two-day bootcamp, short tutorials will alternate with hands-on practical exercises. Participants will be encouraged both to help one another, and to apply what they have learned to their own research problems during and between sessions. Attendants are offered online office hours: regular events to get one-on-one help from Software Carpentry instructors, online.
Who: The course is aimed at postgraduate students and other scientists who are familiar with basic programming concepts (like loops, conditionals, arrays, and functions) but need help to translate this knowledge into practical tools to help them work more productively.
Requirements: Participants must bring a laptop with a few specific software packages installed. (The list will be sent to participants a week before the bootcamp.)
Content: The syllabus for this bootcamp will include:
counter.py
# Count data records in file.
# Reads from standard input if no filename given.
# Reads from a single file if filename given.
# Title and comments don't count.
import sys
def count_records(reader):
number = 0
expected = None
for line in reader:
if line.startswith('#-'):
junk, expected = line.split()
expected = int(expected)
elif line.startswith('#'):
pass
elif line.startswith('D'): # FIXME
pass
else:
number = number + 1
return number, expected
if len(sys.argv) == 2:
filename = sys.argv[1]
source = file(filename, 'r')
else:
source = sys.stdin
number, expected = count_records(source)
source.close()
if expected == None:
print 'number of records:', number
elif expected == number:
print 'pass'
else:
print 'fail'
fun.py
def double(x):
return 2 * x
def add_three(x):
return x + 3
def sub_one(x):
return x - 1
def do_for_each(func, values):
result = []
for v in values:
temp = func(v)
result.append(temp)
return result
start = [3, 7, 42, 96]
doubled = do_for_each(double, start)
added = do_for_each(add_three, start)
subtracted = do_for_each(sub_one, start)
print 'started with', start
print 'doubled', doubled
print 'incremented', added
print 'subtracted', subtracted
Databases
Person
| Login | LastName | FirstName |
| skol | Kovalevskaya | Sofia |
| mlom | Lomonosov | Mikhail |
| dmitri | Mendeleev | Dmitri |
| ivan | Pavlov | Ivan |
Project
| ProjectId | ProjectName |
| 1214 | Antigravity |
| 1709 | Teleportation |
| 1737 | Time Travel |
Experiment
| ProjectId | ExperimentId | NumInvolved | ExperimentDate | Hours |
| 1214 | 1 | 1 | 1.5 | |
| 1214 | 2 | 1 | 1889-11-01 | 14.3 |
| 1709 | 1 | 3 | 1891-01-22 | 7.0 |
| 1709 | 2 | 1 | 1891-02-23 | 7.2 |
| 1737 | 1 | 1 | 1900-07-05 | -1.0 |
| 1737 | 2 | 2 | 1900-07-05 | -1.5 |
Involved
| ProjectId | ExperimentId | InvolvedId | Login |
| 1214 | 1 | 1 | mlom |
| 1214 | 2 | 1 | mlom |
| 1709 | 1 | 1 | dmitri |
| 1709 | 1 | 2 | skol |
| 1709 | 1 | 3 | ivan |
| 1709 | 2 | 1 | mlom |
| 1737 | 1 | 1 | skol |
| 1737 | 2 | 1 | skol |
| 1737 | 2 | 2 | ivan |
Sample Query
-- Get the people who worked on each project. select distinct Project.ProjectName, Involved.Login from Project join Involved where Project.ProjectId = Involved.ProjectId order by Involved.Login;
Homework
Homework
Get project name, person's last name, experiment ID, and hours worked in one table.
select '# $Revision:$';
select '# db version' || VersionId from DatabaseVersion;
select Project.ProjectName,
Person.LastName,
Experiment.ExperimentId,
Experiment.Hours
from Person join Project join Experiment join Involved
where (Project.ProjectId = Experiment.ProjectId)
and (Involved.ProjectId = Project.ProjectId)
and (Involved.Login = Person.Login)
and (Experiment.ExperimentId = Involved.ExperimentId);
Access from Python
import sqlite3
connection = sqlite3.connect("experiments.db")
cursor = connection.cursor()
cursor.execute("SELECT FirstName, LastName FROM Person;")
results = cursor.fetchall();
for r in results:
print r[0], r[1]
cursor.close();
connection.close();
Nose tests for rectangle overlap
from overlap import overlap
def test_overlap_on_one_corner():
assert overlap([0, 2, 0, 2],
[1, 3, 1, 3]) == [1, 2, 1, 2]
def test_no_overlap_at_all():
assert overlap([0, 1, 0, 1],
[3, 4, 3, 4]) == None
def test_one_inside_another():
assert overlap([0, 10, 0, 10],
[2, 3, 2, 3]) == [2, 3, 2, 3]
def test_overlap_along_one_edge():
assert overlap([0, 3, 0, 3],
[3, 5, 0, 3]) == None
def test_inside_on_one_axis():
assert overlap([0, 3, 0, 3],
[1, 2, 1, 4]) == [1, 2, 1, 3]