Rob Miles' book, The C# Yellow Book is a beginner-friendly book to introduce students to C# and programming in general. It is short and makes a for a fun read. The book is not only free, but it also comes with code samples, that a student can use to learn and test their concepts.
I picked this book for a Coding Bootcamp that I am running in my local community. I want my students to read the code samples, run them in their Visual Studio, and explain the code line by line. It is a simple task. Unfortunately, many students take the copy-paste path to cheat through the assignment.
I have observed that learners who make it a habit of typing the examples from the books and coding samples perform better than those who just read the examples. Learning programming is like learning to swim. You cannot learn to swim by merely reading about it. Perhaps, when you are familiar with a language and have a few years of experience under your belt, you can skip over the trouble of typing the examples. But when you are new, typing and trying the example code will only help you understand it better.
So to force some of my challenging students to type, I decided to provide them with the code samples in image formats.
Carbon is easy to use, and performant website that converts your source code to beautiful photos. You can customize the programming language parser, fonts, themes, and even window type. It is a fantastic service.
There is a third-party command-line tool carbon-now-cli that lets you use the Carbon service from the comforts of your terminal.
Download the code samples and archive and views its content. Notice,
- It has 57 folders
- Each folder contains a complete Visual Studio project
- All projects are named
- Project folders have a
bindirectory that contains the debug build of the project
- Project folders also have an
objdirectory which holds intermediate files
I do not need to distribute the
obj folder. I also do not need Visual Studio projects. I expect students to create the projects themselves.
Only files that I want to loot from this sample archive is the
Program.cs file present in every folder.
Write a fish shell script that will pick
Program.cs file from each folder, rename it to the folder name, convert it to an image, and then place it in a new destination folder.
So if a
Program.cs file is in "Code Sample 37 Simple Interface" folder. I want a
Code Sample 37 Simple Interface.cs.png file.
Let's get this task done.
yarn global add carbon-now-cli
Unzip the archive and
cd into the folder.
Run the following fish shell script.
for f in * echo $f end
It shows the name of each folder.
We know each
Program.cs file is present inside a folder named
YellowBookSamples in each of these folders. Let's check this assumption.
for f in * test -f $f/YellowBookSamples/Program.cs; or echo "not found in '$f'" end
This script tests if the file is present in the folder or not. If the file does not exist, then it prints the message "not found in <folder name>".
On running, I got
not found in 'Code Sample 57 WPF Adding Machine'
So only Project "Code Sample 57 WPF Adding Machine" is different. All other folders have file in
YellowBookSamples/Program.cs. "WPF Adding Machine" is different. We will skip this WPF sample code.
We have all the information we need. Let's create a destination folder.
Now we write a script to pick the
Program.cs file and convert it to an image.
for f in * set code $f/YellowBookSamples/Program.cs test -f $code and begin mkdir ../dest/$f carbon-now -h -l ../dest/$f -t $f $code end end
set code $f/YellowBookSamples/Program.cscreate the path of the file, like "Code Sample 46 Storing accounts in an array/YellowBookSamples/Program.cs", and assign it to the variable
test -f $codetests if the file exists
and beginis a block of that will only run if
testin the previous line returns true. You can read more about
and beginin this article
mkdir ../dest/$fcreates a sub-folder in the destination directory
carbon-nowcommand to convert the file to an image
When I used
carbon-now, it did not work unless I used it with the
-h, i.e. the headless option.
-l ../dest/$f is the location to save the image and
-t $f is the image name.
The result is that each code sample is converted to an image and placed in its folder.
carbon-now command did not work for eight projects. I had to convert them manually.
carbon-now sends the file to the Carbon via URL parameters, because as of writing this article, Carbon does not have an API. The files are probably
too long to be handled via URL.
Finally, I optimized the images using ImageOptim. I ran the following script from the
for f in **.png echo $f open -a ImageOptim $f sleep 60 end
I had to add a one-minute because ImageOptim sometimes crashes if too many images are passed to it at once.
I have uploaded the images in this Github repository.