Article: From Zero to One (Part 3) - The Way of the Ninja
by NUS Product Club Admin • 29 February 2024
by NUS Product Club Admin • 29 February 2024
Born out of Contest 2.2 from CS1010S on Coursemology, NUS Product Club Admin explains the origins of the Python-generated “Ninja” - and how it was eventually adopted as one of our club’s branding assets.
As a continuation of both Part 1 and Part 2 in the article series "From Zero to One", this article is meant to clarify two things: (1) how the "NUS Product Club Admin" came about and (2) why and how the "Ninja" was eventually adopted as a branding asset, as asked before by some of our Publicity Team members.
For the benefit of our non-NUS readers, I will briefly explain the context of how CS1010S as an academic course works, before moving on to elaborate the thought process behind generating the "Ninja" asset.
CS1010S - Programming Methodology is an introductory course (taught in Python) for students taking on programming for their various computing or quantitative majors - including math, physics, data science, business analytics etc. With many variants of "CS1010" courses available for different demographics of students, perhaps CS1010S is the most famous among them all: given the dedicated community of student tutors, as well as its "addictive" gamification aspect as adopted in the form of the Coursemology platform.
Course description of CS1010S on NUSMods - although I'm not really sure how accurate the measure of the workload is... still
More onto the Coursemology platform - students would have to maximise the usage of the different features on this website as part of their graded class participation for this course. There are many activities available to help maximise students' learning such as lectures, tutorials, "missions", "side quests" and "contests". For each of these pages, an in-built code editor is implemented to allow interactivity between both the student and the teaching assistant - albeit in a "fun" manner.
Fun fact: A leaderboard is also implemented for each iteration of this course - to promote a friendly competition amongst students! For each activity completed, experience points will be rewarded to the student for them to "level up". To attain the full grade for this component, students would have to attain Level 50 by the end of the course.
In no particular order: introducing the key features of CS1010S on Coursemology - including an online forum, an in-built code editor and an online leaderboard
A fundamental concept that was taught in this course was to learn how to define recursive functions in Python, preferably in the most efficient way possible. For this segment of the course, a custom "runes" package/Python script was defined using Pillow - also known as Python Image Library, in order to generate the assets that could be used to create the different shapes throughout this "runes" segment.
##submission 1: pixel ninja
from runes import *
def beside_frac(frac, pic1, pic2):
return quarter_turn_left(stack_frac(frac,quarter_turn_right(pic1),quarter_turn_right(pic2)))
#10 segments of picture
row1 = stack_frac(10/27,stack_frac(9/10,blank_bb,black_bb),blank_bb)
row2 = stack_frac(20/27,stack_frac(15/20,stack_frac(11/15,stack_frac(10/11,blank_bb,black_bb),blank_bb),black_bb),blank_bb)
row3 = stack_frac(15/27,stack_frac(11/15,blank_bb,black_bb),blank_bb)
row4 = stack_frac(10/27,stack_frac(8/10,stack_frac(4/8,blank_bb,black_bb),blank_bb),black_bb)
row5 = stack_frac(20/27,stack_frac(3/20,blank_bb,black_bb),blank_bb)
row6 = stack_frac(20/27,stack_frac(8/20,stack_frac(5/8,stack_frac(3/5,blank_bb,black_bb),blank_bb),black_bb),blank_bb)
row7 = stack_frac(8/27,stack_frac(7/8,stack_frac(6/7,stack_frac(5/6,stack_frac(3/5,blank_bb,black_bb),blank_bb),black_bb),blank_bb),black_bb)
row8 = stack_frac(15/27,stack_frac(12/15,stack_frac(10/12,stack_frac(8/10,stack_frac(5/8,stack_frac(3/5,blank_bb,black_bb),blank_bb),black_bb),blank_bb),black_bb),blank_bb)
row9 = stack_frac(19/27,stack_frac(15/19,stack_frac(10/15,stack_frac(8/10,stack_frac(7/8,stack_frac(6/7,stack_frac(5/6,stack_frac(4/5,blank_bb,black_bb),blank_bb),black_bb),blank_bb),black_bb),blank_bb),black_bb),blank_bb)
row10 = stack_frac(9/27,stack_frac(7/9,stack_frac(5/7,stack_frac(4/5,blank_bb,black_bb),blank_bb),black_bb),blank_bb)
ninja = beside_frac(9/10,beside_frac(8/9,beside_frac(7/8,beside_frac(6/7,beside_frac(5/6,beside_frac(4/5,beside_frac(3/4,beside_frac(2/3,beside_frac(1/2,row1,row2),row3),row4),row5),row6),row7),row8),row9),row10)
#show pixel ninja
#stack frac with black_bb for black flooring
show(stack_frac(25/26,scale_independent(0.55,1.3,ninja),black_bb))
Raw code used to generate "Ninja" asset - source also available here
With a multitude of ideas to contemplate from, it just so happened that many of the submissions that semester revolved around pixel art. Given that I wanted to draft out an image that was unique yet not too complicated, a simple search on Google - "pixel art" - was what I did and it just happened that a ninja was one of the first few results to pop up out of coincidence. As I was intrigued by the decent amount of effort required to generate the image, I thus took the time and effort to do so and below was the end result! It was truly satisfying to produce something like that, especially with my limited coding experieence - as evident in the raw code available displayed on this page.
Raw "Ninja" asset generated from "runes" package in CS1010S
When NUS Product Club was originally founded last year, our team had to set up our various social media and communication platforms to prepare our outreach to our target audience(s). Initially intending to preserve a level of anonymity which also establishing a presence on Telegram, an administrative account was also set up to facilitate fast communications with students as an alternative to the conventional emails for administrative queries. This was also used for marketing purposes - particularly in terms of promoting our sign-up forms to boost the attendance of our various events.
After looking through the brands of other similar interest groups such as NUS Hackers, however, I felt that it was important to have an accompanying figure or mascot to simultaneously represent our club's brand besides our logo. Given the lull time we had over the recent winter break, multiple variants of the original "Ninja" asset were spontaneously generated - and alas the "meme" behind the "NUS Product Club Admin" was born.
While utilising the "Ninja" asset for our club's branding was a spontaneous decision made, perhaps having a proper discussion to create a mascot or figure can be a potential discussion point in the near future - either by our existing Publicity Team, or its future batch of designers. As I may have shared previously, branding is of high importance to our club, and it is important especially when starting out to build something memorable for our students and wider audience to remember us!
"Modern slave, magical worker" - or so NUS Product Club Admin himself claims to be. As his name suggests, NUS Product Club Admin assists our Operations and Publicity Teams in handling administrative enquiries from our students regarding our various programmes - including PM1101E and IA. In addition, he assists in running our social media channels - including Telegram, Instagram and LinkedIn. Together with Evangeline, he now oversees the 3 sub-teams within Publicity: Social Media, Blog and Podcast - ensuring that our club's branding strategies are effective in securing long-term traction among our students and potential partners.