* * *
Many of us have had those nightmares where we discover we’ve been enrolled in a class but forgot to attend. The final exam is in an hour. Thankfully, our panic wakes us. Those of us who are information technology educators suffer a similar nightmare: we’re scheduled to put on a hands-on workshop in a few minutes, and none of the computers are working properly. Panic kicks in and we hope to wake up soon. But we never do, because this nightmare is reality. Conducting any educational activity that involves technology more advanced than pen and paper is fraught with difficulties: software is missing, firewalls block programs from running, machines are inconsistently imaged. These are all problems that are supposed to have been solved! There’s only one way for it all to go smoothly, but so many ways for it to fail.
We face this nightmare recurringly even at the professional level. In the early 2000s, when this project got its start, 50% of the workshops we attended at conferences for technology educators suffered some degree of technology configuration problem that sidetracked the presentation. When the time came for the first author of our paper, Paul Wagner, to put on his own hands-on computer security workshop, he refused to let configuration problems derail him. Instead of working with machines beyond his administrative control, he acquired a bunch of laptops, imaged them with the software he needed, and shipped them to the conference. That was a pretty expensive move, but an NSF CCLI grant helped. The workshop went smoothly, for three years in a row. Then in 2008, he and his team tried a bold move—they didn’t bring the laptops. How’d they do it? Participants brought their own notebook computers and he had them boot from external USB drives that he had previously configured. The workshop ran fine. Afterward a question arose: “can we generalize this setup?” And the MOBILE project was born.
MOBILE stands for the MOBile Interactive Learning Environment. Its premise is simple: let’s eliminate the risk of setting up ad hoc computer labs for workshops. Let’s use others’ machines, but let’s avoid the dangers of doing so. Others’ machines typically require accounts and are protected by cautious system administrators and have all sorts of different operating systems and software on them. Instead, let’s run our own customized and homogeneous teaching environment on top others’ hardware. I wish there was more magic to it, but we can achieve this through very cheap technology and readily available software. Here’s how you’d make your own MOBILE project:
That’s the process of using MOBILE.
In training others to use MOBILE, we’ve become acquainted with several initial questions that arise. Let me address a few of those.
The next big question is how are we using this? The prototype system was first deployed in a series of four SIGCSE computer security workshops. The evaluations were very positive and the workshops did not get derailed by computer issues. The positive feedback we received from these workshops led us to generalize our tools in the first place. We’ve built modules to test workshops on computer graphics, introductory programming, and Android development. We’re currently creating an environment to support an ACM programming contest site. This past summer, we assembled a focus group of educators to evaluate it. I’ll share a bit of the feedback we’ve received from this group…
That said, our purpose in sharing this tool is to serve our colleagues and make hands-on technology workshops run more smoothly. If you are putting on a workshop in some environment outside of your control, we suggest you give MOBILE a try. Instructions for setting up your initial environment and using the administrative tools are available at http://www.cs.uwec.edu/mobile.
]]>Installation needs:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
/* ------------------------------------------------------------------------- */
int width = 512;
int height = 512;
float theta = 0.0f;
/* ------------------------------------------------------------------------- */
void display(void) {
glViewport(0, 0, width, height);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 0.0f, 0.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(theta, 1.0f, 0.0f, 0.0f);
glutWireTorus(0.3f, 0.7f, 10, 10);
glutSwapBuffers();
}
/* ------------------------------------------------------------------------- */
void resize_window(int new_width, int new_height) {
width = new_width;
height = new_height;
}
/* ------------------------------------------------------------------------- */
void special_keys_handler(int key, int x, int y) {
switch (key) {
case GLUT_KEY_UP:
theta += 5.0f;
break;
case GLUT_KEY_DOWN:
theta -= 5.0f;
break;
default:
break;
}
glutPostRedisplay();
}
/* ------------------------------------------------------------------------- */
int main(int argc, char **argv) {
glutInitDisplayString("alpha rgba double");
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(width, height);
glutInit(&argc, argv);
glutCreateWindow("3-D Application");
glutDisplayFunc(display);
glutReshapeFunc(resize_window);
glutSpecialFunc(special_keys_handler);
glutMainLoop();
return 0;
}
/* ------------------------------------------------------------------------- */
Installation needs:
Code:
public class Randaurant extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
TextView label = (TextView) findViewById(R.id.destination);
label.setText(getRandomRestaurant());
return true;
}
private static String getRandomRestaurant() {
int random = new Random().nextInt(100) + 1;
if (random < 10) {
return "Hooligan's";
} else if (random < 50) {
return "Acoustic Cafe";
} else {
return "Fuji Steakhouse";
}
}
}
]]>