Hi! My name is Callen Rain, and I am a junior at Swarthmore College in Swarthmore, Pennsylvania. I am majoring in Computer Science, with minors in Mathematics and Engineering.
Last year, I cofounded a consumer technology startup called Lectern with fellow students as well as alumni from Swarthmore. Lectern aims to streamline RSS reading on the web, with intuitive, fast sharing features and in-app article parsing.
This past summer, I worked in the Computer Engineering Lab at Swarthmore under the direction of Tali Moreshet. I built an application support framework in C for the Virtual SoC chip simulator to facilitate parallel benchmarking on clustered, many-core systems.
On campus, I work as Student Academic Mentor, which includes assisting peers with study and testing skills, time management techniques, and course planning. Additionally, I tutor peers for both the Computer Science and Mathematics departments, was appointed to the Information Technology Services Committee, and play Varsity Lacrosse.
Check out more of my projects, work experience, and research topics on my "Experience" page.
Lectern is a new RSS reading platform I cofounded with fellow Swarthmore students.
We have built a product that both makes following feeds, authors, and other users seamless, and facilitates reading and sharing with in-app article parsing and streamlined sharing. Lectern allows users to curate their own pages of sources while viewing and consuming the pages of others.
At Lectern, I work as a full stack developer, implementing features from the backend to the frontend with this Ruby on Rails project. Parts of the project that I've contributed to:
Languages and Tools: Ruby on Rails, JavaScript, HTML, CSS, RSpec, Heroku
During the summer of 2013, I worked with the Swarthmore Department of Engineering in the Computer Architecture Lab. Working under Professor Tali Moreshet, we collaborated from a team from Brown University to develop a transactional memory implementation for simulated many-core systems on the Virtual System-On-Chip platform developed at the Univeristy of Bologna.
I helped to test the memory system in development by porting benchmarks from other prototyping systems (mostly MPARM) to the VSoC System. This often involved rewriting production benchmarks in C so that they would run on the simulated System-On-Chip.
In order to do this, I had to write an application support layer that would interface between the simulator (written in C++) and the benchmarks (written in C). I wrote functions that allocated memory, created and retrieved pointers to global data structures, instituted barriers for certain cores, and other necessary utilities. These allowed my ported benchmarks and entirely new benchmarks to be run on the VSoC system.
After writing a robust benchmarking suite for the requisite tests on the memory system, I got to write my own many-core shared memory allocator (shmalloc). This allocator uses a set of free lists that hold sections of free memory. The novel feature of this system is that the general sizes of the pieces of memory are kept in a set of counters. When memory is requested, these counters are checked to see if we can provide a chunk of the specified size. If there isn't one, shmalloc will travese the free list, looking for a good-sized piece of memory.
Languages and Tools: C, SystemC (C++ Library), OpenMP, VSoC, Makefile
Final Paper for Report
Research Poster from Presentation
Code from Project
My Amazon Sentiment Analysis System was the result of my final project for my Natural Language Processing Computer Science course in Fall 2012.
As part of the project, I downloaded several thousand reviews for popular products from the Amazon retail site, and extracted features from the text of the reviews. I then used Naive Bayesian and a Decision List classifies to detect features which indicate the emotional polarity of particular reviews.
After training on hundreds of reviews, the system could classify newly seen reviews as either positive or negative nearly 77% of the time.
I wrote the system in Python, using a Perl script to download and organize the reviews from the site. The classifiers were implemented in part using the Natural Language Toolkit (NLTK)
Languages and Tools: Python, Perl, NLTK, LaTeX
This project was done for the final portion of my Structure and Interpretation of Computer Programs class. Our task was to write a meta-circular interpreter that could function like any other read-eval-print-loop interpreter.
We wrote the interpreter using Racket (a functional programming language) and the Dr.Racket IDE.
The interpreter can actually interpret itself, although this functionality makes any useful computation very slow. I managed to run a three-layer interpreter running copies of itself. The computation of (+ 1 3) took several minutes!
Languages and Tools: Racket
As part of the final project for my Fundamentals of Digital Systems Engineering course, I wrote a Connect-4 game in C with an adjustable difficulty AI opponent.
The game prints out a menu and allows a user to play against either another human player or a computer player with variable difficulty. The artificial intelligence is built through a Minimax algorithm, which scores pre-terminal game states with a weighting algorithm used to determine the advantage of a given board. The adjustable difficulty simply selects one of several recursion depths to let the computer play out to. For example, if the computer can only look 3 moves ahead, it is quite easy to beat, while at 10 moves ahead, a human will never beat it.
Languages and Tools: C
While at NASA as an intern, I worked in the Optics and Laser Detection Lab at the Goddard site in Greenbelt, MD. While working at the lab, I built a proof-of-concept two-way asynchronous laser transponder to measure distances.
Most laser transponders are one-way, in that they require some sort of reflecting medium to redirect photons as detection is only done on one end. Two-way transponders are theoretically more robust, because they incoporate an active target that can regenerate a laser signal when one is detected. The challenge here is to achieve clock synchronization so that the computer processing time is not factored into the distance measurement.
My system was built in the lab and could successfully measure short distances. I spent much of my time calibrating the diode laser I was using and measuring laser output.
Languages and Tools: LabView, Function Generator, Diode Laser, Laser Detector