Category Archives: workshop notes

R Open Lab Summary Report – Spring 2018

This was the first semester I worked as a teaching intern at the Digital Center, and I was in charge of running the R workshops. As a great semester reaches its end, I would like to summarize this journey and reflect on it.

A Quick Summary

I conducted 5 workshops besides the starter kit. 4 of them are new topics, and the other one is an intermediate version of the starter kit which provides a deeper exploration on the fundamentals in R. For all the labs, I prepared all the scripts ahead without all the input parameters  because I wanted to fill them in as examples during the labs. I always believe that the first step of learning is imitation. You don’t have to understand the content to be able to imitate, and by imitating again and again, you will be able to observe the pattern and comprehend the nature of it. The usual flow of my labs is:

  1. Introduce the function briefly.
  2. Show the help function output of this function so that students can see what the inputs look like and what the results are.
  3. Enter the input arguments and run it.

I believe this way of demonstrating codes is better than having it written in the script file and running it in a blink of an eye; students are actually seeing me coding, and it becomes easier for them to imitate.

I also started a new teaching practice in the middle of this semester: I started to add practice questions at the end of every lab. The purpose of it is to help fix the codes in memory. No matter how well you understand the new contents, they won’t become part of you skills unless you use it again and again; that’s how we learn: imitate and repeat. I figured that by implementing the functions to a real-world problem, it leaves a mark in student’s memory, and they will be more likely to recall it in the future. I even used the same dataset for several workshops. In that way, they are working with something they are already familiar with, and hopefully, it will help them connect everything we learned.

Challenges and Possible Solutions

Of course, there were quite a few challenges. I will list them below and provide possible solutions to them from my perspective.

  • The outcome of the attendee’ amount could be better. Due to lower application popularity and high difficulty at entry level, fewer people choose to learn R. However, I still see a big potential group to which R will be helpful from the positive feedbacks from the attendee. The Digital Center could market the open labs(both R and Python) to specific communities which would be interested such as Economics programs and SIPA. If you are reading this post and you want to learn coding in R and Python, remember to check out the open labs this fall!
  • Attendee don’t attend labs regularly. This has been troublesome. I didn’t build the labs consecutively because I didn’t want to review earlier material every time; I think that’s inefficient. But I think that didn’t encourage students to come back, and it forms a negative loop. A solution to that is to post the topics ahead of time. I’m still undecided whether I should have a syllabus for the whole semester due to the nature of high dependence on attendee, but I think for Fall 2018, we should post topics at least 2 weeks ahead, and make sure students know there will be continuous contents.
  • Through all the labs of this semester, I found that students who were new to R needed longer time than what I expected to fully understand the syntax and logic. As mentioned above, R has a steep learning curve for beginners. The starter kit is not enough. I should conduct richer materials on the fundamentals, and I will bring more examples to demonstrate. I may also conduct one lab focusing on the swirlpackage since some students thought it was a good tutorial.

All in a nutshell, this experience was exciting and informative. Now I have more understanding of how to teach. To be honest, I don’t really consider myself as an instructor or a teacher. I am just a student who tries to help others with what I know. This internship enlightened me of new ways to pass on the useful knowledge and to exchange information with others. I am looking forward to continuing my internship at Digital Center and serve the Columbia community and fellow students.

End-of-Semester Reflection (Python Open Labs – Spring 2018)

It’s hard to believe that the end of the semester has arrived and that Python Open Lab sessions for Spring 2018 have come to an end. Instead of writing a sappy post about “the end,” I’d like to share five things I learned while teaching my students Python this semester.

# 1 – Teach with Examples – Different programming languages vary in syntax, but they all share similar concepts such as variable usage, conditionals, and loops. Explaining such concepts to students unfamiliar with programming is certainly helpful, but can probably only get them so far. To show how to use a language to creatively solve problems, examples – especially multiple examples showcasing the same concept – are a must. I would also encourage instructors to create examples that reflect the demographics of their students when given the opportunity (i.e. initialize a list of more diverse names versus solely American names).

# 2 – Teach with the Right Tools – The agile method in software development encourages reiteration, and I like to encourage my students to think in a similar manner when writing code. The easiest way to test whether or not your code has worked is to run it and see the output. As an instructor, I live-coded each lesson. I wanted to my students to see me run my code block, examine my output, and fix my errors if need be. Using Jupyter Notebooks really allowed me to do this in a clear manner. I was able to isolate each example within a code block, which was especially helpful. Another IDE would work in regards to teaching a programming language as well, but I would not recommend teaching via a Google doc or a Powerpoint presentation for a non-lecture style session.

# 3 – Incorporate Wait Time – In addition to studying computer science, I also studied (English) education as an undergraduate. I learned a lot about teaching methodologies and one concept that has stuck with me is the idea of wait time. Wait time is the time an instructor waits after asking a question before calling on a student. Sometimes, it can be easy to answer your own question right away if no one has raised their hands, but waiting gives students time to think about their answer. If no hands are raised after some amount of waiting, then you can possibly provide a hint or make the judgement call whether or not to answer your own question.

# 4 – Have a Positive Attitude – If you are not excited about the material you’re teaching or the lessons you’re crafting, it may be a little harder to get your students excited about the subject as well. I like to use varying examples to keep things fresh as well as think back to my earlier days when I started learning about Python for the first time – and how incredibly fulfilling it is now to be able to code on my own with no instruction. When I imagine and see my students feeling the same way, I feel all the more positive. As Jim Henson says, “[students] don’t remember what you try to teach them. They remember what you are,” and I’d like to be remembered as someone who was wildly passionate about computer science education.

# 5 – Ask Students for Feedback – Not every lesson you create is something your students are satisfied with. Ask them what they’d specifically like to see more of or less of. From student feedback, I learned to spend more time coming up with examples for loops and functions and less time reviewing classes. Students also wanted to see more of a workshop-style lesson towards the end and with feedback, I created a data visualization lesson that ended up being quite well-received. Always be sure to ask for your students’ inputs – you are not the only one in control of the class and its structure.

I hope you found these takeaways valuable and can apply them to your own lessons if you are an instructor. I’ve greatly enjoyed serving as one this semester and hope to take on more teaching-related opportunities in my spare time after I graduate this May. Working as a teaching intern at the Digital Social Science Center for Columbia University Libraries has been an incredibly fulfilling experience – I would do it again in a heartbeat. If you are encouraged by my post and love teaching as well, I hope that you apply to be an intern for the upcoming semester!

Navie Narula

Mid-Semester Reflection (Python Open Labs – Spring 2018)

Stuart Walesh, an author and consultant, once said: “The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination.”

Many of us use computers. Sometimes, the time we spend on them consume the majority of our day. Whether or not this is a good or bad thing can be debated in another blog post, but the fact is…technology is an overwhelming part of our diet.

Taking my first computer science class as an undergraduate made it apparent to me that learning about how code and algorithms work was a really important thing, especially if I wanted to solve problems on my own. I declared my major in computer science and focused on  learning more about how code could be used to analyze large amounts of text more efficiently. I have not regretted it since, and am beyond happy to see a good number of students show up to the Python Open Labs to learn more about how to write code to perhaps automate their own tasks.

The people who show up to our class are diverse in terms of major – coming from backgrounds ranging from education to international affairs to pure math/analytics. It’s been really nice to see people actively show up to our labs with a desire to learn how to code and truly curious about how to solve problems. It’s proven to me again and again that anyone can learn how to code, and it’s been wildly encouraging to see people who think they cannot do it actually do it!

This is my first semester helping to lead the Python Open Labs. I find that lessons introducing a new programming language or new programming concepts are best taught in a step-by-step manner. Jupyter Notebooks have allowed me to accomplish this very well, allowing for space to write comments in markdown and running code in cell blocks. The students in class love this medium as well, and at the end of the lesson, they can easily look back over the notebook and remember what we learned about.

I’ve really enjoyed helping out with the labs so far and answering so many questions from the students who show up. Anyone is welcome to stop by the Python Open Labs – even if you have never written a line of code before in your life. I look forward to learning more from my students as the semester goes on.

Navie Narula

Building a website with WordPress and its plugins

As you may know, we are now constructing a website to vote for the hottest 3D models in Columbia University. As a newcomer in the field, I found the task nothing easy. Therefore, I feel obliged to introduce WordPress, or more specifically, its plugins, to you, for all the time they have saved me.

WordPress ( is a typical CMS, Content Management System. It’s amazingly convenient in the first place: just click the “download” button on its homepage and install it on your server, basically a well-behaving website that is ready to use. A lot of functionalities are already there: writing new blogs, posting them out, adding various media types, etc. If you are not looking for a really customized one, you’ve done most of the work you need.

In some cases you may not be satisfied with that basic installation. So here comes the most fascinating part of the WordPress system: the themes and the plugins.

The functionality of themes is straightforward: they allow the constructor to alter the appearance of the website. As you can imagine, one whose main objects are images must look very different from one who is serving articles. Choosing a theme is the first step I’ve done for my site.

What the plugins can do is much more diversified. The most important lesson I’ve learned in my using of WordPress is that whenever you need to add a new function, search for the corresponding plugins first. The plugins are contributed by users all over the world as they share their solved problems. Thus chances are that your problem is already solved by someone else. Here are the plugins I have used, maybe this can give you some intuition about how powerful the plugins can be:

1. Advanced Access Manager

When you are building your own website, it is very likely that you would like to assign different authorities to different users. WordPress itself has provided five roles, but sometimes they are not enough.

For example, we want to check each post before it is officially published, i.e. we would like to allow users to upload their models only after they have been checked by the administrator. Instead of going through all these source codes to customize my own role, Advanced Access Manager offers an administrating panel to assign the capability:

The solution to our goal is now as simple as unclicking the “Publish Posts” on the leftmost column.

2. Custom Content Type Manager

WordPress allows users to upload various media types to their posts, but in some cases we need more than that. Usually when one would like to create a new input type, a series of tasks are involved, including adding a new widget in the new post page, storing the new file type in the database, and display it correctly. The core of the website we are constructing now is the uploading and demonstration of 3D models(especially .stl file, which is not included in the original WordPress system, or any other current plugins.


As you can see, the plugin offers a panel of creating some other field types. In most cases you can get what you want by clicking the “create” button. In my situation, though it does not provide me with 3D model content type, it offers an easy-to-use interface of creating new widgets in the new post page, and more importantly, what comes with the content types it provides are several examples of how to create a customized one. And its documentation is really informative because the problem they are solving is now similar to yours. Thus, by reading its source codes, I get a much more intuitive insight about how to go through the whole process.

3. Featured Posts with Multiple Custom Groups – FPMCG

After you have got a certain amount of posts, it is necessary that they are classified into several categories for management purpose. This is exactly what this plugin does. What we want in our website is a little different: since the voting for the best 3D model is periodical, some models would still appear in the website as winners, but not available for voting any more. Therefore a banner on the corner of its thumbnail on the homepage denoting that they are already printed is needed.

In order to do that, FPMCG is helpful in that it provides a panel of managing the labels I would like to put on my banners, and has set a specific location to store them. What’s left for me to do is to find this location, extract the desired information, and design a banner style. As always, looking for the existing information is always much easier than creating some. So if your model gets this banner one day, don’t forget the plugin that makes it happen.

I hope that describing these plugins as powerful or even omnipotent does not make me seem useless. Nevertheless, they definitely saved me time and effort throughout the whole website-building process. Next time when you are enjoying the fun of WordPress, don’t forget these little helpers!

Introducing HTML: Top-down or bottom-up?

I have recently switched the way that I approach intros to mark-up languages, HTML and XML in particular. In the past I have usually started by writing sample code, moving from simple to more complex structures. I have seen other approaches focusing on editing environments and others focusing on schemas. More recently I have begun my workshops at the unlikeliest of places: the end product.

If we had focused on the end product during the history of TEI, I feel we would have followed another pattern. Many today, for example, still see TEI mainly as a descriptive language. At some point though, sometimes after years of mark-up somebody starts worrying about the interface. When I was introduced to TEI, I remember being taught how I should mark-up, but never why. TEI is a standard that allows humanities scholars to have one form of their thinking become intertwined with machine thinking. The goal though is to have a product for readers or users. That product can be a reference database, an online critical edition, an ebook, whatever. I wish somebody had taught me that on day one.

My approach now is to lead with something like:

  •     HTML is a standard way of marking texts meant for use on the internet.
  •     The marked-up text is saved as a file.
  •     That file is put in a folder in a machine called a server.
  •     The server allows anyone with access to the internet to see a rendition of the file using a browser.

We could call this the 'abstract' approach, but I'd rather think of it as the end-first approach.

Here's how I would approach XML/TEI:

  • TEI is a standard way of marking texts in the humanities.
  • The marked-up text is saved as a file.
  • That file can be manipulated in several ways, but the main goal of the file is to serve as the data source for a digital edition of the text. 
  • The features the scholar marks up can become manipulated in several ways in the final product.

The advantage of starting with the ultimate goal, rather than on implementation, is giving students a sense of purpose before embarking on the laborious process of learning the vocabulary and the grammar of mark-up. 

Did you find these lists helped you? How do you teach intro to HTML or XML?