How I won the First HSBC Coding Challenge

How I won the First HSBC Coding Challenge

This story begins on Tuesday, February 12, 2019 – at the time, I was taking six courses, going for driving classes, writing a math book (that project’s dead now), and hanging out with friends (Hi Maryam!). So of course when I received an email about a competition, I decided to participate.

This wasn’t the only contest I was preparing for: Dr. Qadah was telling me they needed to send a team to Oman for 4 days, and that since I was the only one who had been attending the training last semester, I was one of their best shots. I was flattered, so I brushed up on my data structures & algorithms skills and registered for the local round.

Since I’m a member of every club at AUS, my inbox gets cluttered with announcements for every event that happens on campus. I like to know everything that’s going on and this is one way of keeping an information network alive. I joke that I’m only interested in the catering – it’s actually possible to set up a mail filter that detects “free food” using supervised machine learning methods like Naive Bayes classification, but I’ve been too lazy to implement one so far. So if it had just been an email, I may have missed it.

Thankfully, there was a person-sized poster that had been put up in the engineering building.

poster.jpg

I scanned the QR Code, which lead me to a website that hosted a presentation.

auscoding-0.jpg

auscoding-1

Reading about the problem made me sure that this was the sort of thing I was interested in, so I sent an email with my name, ID, and major. Two days later, they sent me the material:

email.png

I’ve blocked out the emails of the other participants to give them their privacy, but I could easily click “show details” to check the list and find out how many competitors there were (about 30). There were alumni and graduate students in the list, so I thought I’d be happy to make it to top 10.

I was a little surprised that they were able to send the file over email, because if you can do that then your dataset is trivially small. It was a tiny 5.2 Mb excel file – for comparison, the dataset for the OMG data science challenge was 7.5 Gb. 10,000 observations sounds like a big number, but in deep learning dealing with billions of records is not unusual. Usually we use a distributed file system like Apache Hadoop to deal with data on that scale, which is overkill for anything that you can fit in memory.

I’m not trying to say that small problems aren’t interesting. But they’re definitely much less resource intensive. If you want to do “grown up” machine learning, at some point you’re going to need some beefy hardware. For short bursts, it’s most cost-effective to rent compute on someone else’s server using cloud services like PaperSpace, AWS, or FloydHub. For more sustained use, investing in a GPU makes senses if money isn’t a big deal. Of course, if you’re a big company, then it’s economical to buy whole farms of GPUs, but no one makes decisions like that based on advice they read on some teenager’s blog.

I didn’t have to worry about any of that. I looked up “Probability of Default estimation” on wikipedia, and the page had links to eight or so different methods. I also checked out research papers to look for previous work and recent breakthroughs. Yeh, IC & Lien, C (2009) compared six methods and found that artificial neural networks had the best performance (with respect to a metric called the “area curve”). However, my dataset was smaller (9968 vs 25,000 observations), more unbalanced (3% vs 22.1% default), and higher dimensional (33 vs 23 variables). In fact, where my features (columns) represented different financial ratios for certain companies, their features represented categorical data (gender, education, history of past payments) and non categorical data (bill amounts) for different credit card holders. Therefore, I had to be careful as these differences meant that our results could differ significantly.

I continued to do research. I looked at book chapters, comment threads, software documentation, lecture notes, blog posts, and even quora (the horror!). This was a ton of fun. Actually, I could have gotten away with skimming through the more mathematical content, but this is what I enjoy, so I tried to understand it. It is important to have a good grasp of the uses and limitations of our tools.

I never ran into problems that some of my peers were struggling with simply because of how careful I was at the earlier stages. I did some basic analysis of the dataset using tools built into Excel, which revealed characteristics that I had to take into account. For instance, there were some records with missing entries, so I knew my solution had to be able to deal with those. Of course, this is the bare minimum when it comes to inspecting data, but you’d be surprised at how often people forget to pay attention to these things. Little mistakes make big problems.

Before sitting down to write the program, I sketched out what I was going to do. This was different from what I ended up doing, because whenever I ran into trouble and got stuck I pivoted to trying something else. However, the planning was still necessary as it helped me get an idea of the structure of the solution. First I needed to get the data into the program, then I needed to run some computations on it, then I needed to write that data back out in the format they wanted. This is super general – it doesn’t constrain the specific approach you take, but any successful procedure has to satisfy these criteria.

For getting the data into the program, I wanted to save the excel file as a .csv (comma separated variable) file and then work with the .csv file. Making the .csv file was no problem – I literally pressed “Save As” and changed the file type in the drop down menu – but I was having trouble doing computations with it. I don’t remember what the problem was, exactly: I’d imported the csv module, opened the file, made sure to explicitly cast the numbers to floats, and read it into an object (don’t do this if you have a huge file lol, but on my system a python list can theoretically hold up to 9,223,372,036,854,775,807 elements [practically speaking it would induce thrashing and make operations too slow to be useful, better to use something more efficient like numpy, and do binning/clustering, and run-length encoding, and split it into subsets, and do out-of-core execution, or use one of ANY NUMBER OF TECHNIQUES ]).

Anyway, using .csv files was not working for illegible reasons. Guess I’ll die ¯\_()_/¯.

I had to find another way to get the data in. I half-remembered some tutorials I’d done ages ago on Automate the Boring Stuff with Python which involved working with Excel spreadsheets, so I loaded those up and messed about with the example code till it did what I wanted it to. This was fairly straightforward. I ran into a snag with the OpenPyXL module when it turned out one of the functions had been deprecated (removed in the current version, with a helpful error message), but digging into the docs helped me find a replacement easily.

Keep in mind that at this point I’d written about 13 lines of code.

Programming is hard, okay?

I’ve noticed that I never explicitly mentioned that I was using python. I took it as a given, because what else would I use? R? If I was using R, I would definitely mention it, if only to show off that I knew R (I don’t), but python is straight up mundane. I opened Anaconda Navigator, launched Spyder, and just wrote small scripts and tested them in the console. Nothing special. Not even SQL.

Next I had to process the data. The easiest and simplest way to do this was to use scikit-learn. If I was cool I would have used tensorflow. Sadly, I am not cool. I used scikit-learn and enjoyed it.

I made it a mini competition, throwing different models at the data and looking at how they performed. Scikit-learn has a function called roc_auc_score. Being given the privilege to be this lazy gave me a feeling that was comparable to drinking half a glass of cold orange juice. Sublime.

The winner was a technique called logistic regression. Reading more about it, I could see how it was perfectly suited to the problem at hand. I wrote the rest of the code to use the model to generate credit scores and write them back to the Excel file, and so I was ready to submit ahead of schedule.

All the programming was done on February 19th.

A week later, on February 26th, I got an email saying I’d made it to the top ten.

I was ecstatic. I started singing and dancing when I came home, “I got shortlisted, I got shortlisted!”. This was pure joy. I got less happiness from winning than I did from knowing that I was good enough to make something that worked without bursting into flames. That I wasn’t a complete incompetent failure who could never utilize his “knowledge” to solve problems. That there was a piece of evidence against the claims made by the belittling, vicious, cruel voices in my head. That for one moment, all my insecurities were wrong and I had actually done well.

Now I had a model and some predictions. Was I done? No. Now I went to Zain.

Zain is my best friend. He’s a double major in finance and accounting, and he’s a genius at both of them. I want to go into a long tangent about his accomplishments, but then he would end up stealing the show, so take it at face value when I say he’s ridiculously skilled.

I arranged to have dinner with Zain. I brought my laptop with me. I explained what I’d done, and showed him what my model “thought” were the important financial ratios (and whether they were “good” ratios or “bad” ratios). Of course, models don’t have thoughts, they have coefficients you can understand using the likelihood ratio test, and “good and bad” is a shorthand way of referring to ratios that are positively and negatively correlated with the probability of default. He looked over it, scrolling, asked me a few questions, stared at it, and then nodded his head.

Zain is fast.

I had to protest. Come on. That wasn’t nearly enough time to decide either way! Did you check all the ratios? There are 33 of them! And they have formulas! How can you know?

And then he started talking.

When Zain talks finance and accounting stuff to me, I try my best to listen and understand, because that’s what I would want someone to do when I talk CS and Math to them. As hard as I try, I inevitably zone out, and his speech becomes an incomprehensible string of “liability quick ratio loan asset amortization cost equity profit net working capital turnover debt”. He was explaining why he thought everything was right, but for all I know he could have been making it up. Sometimes I check online after one of our conversations to see if this is a long term prank he’s pulling, but if it is, then he’s been dastardly enough to change the webpages so they say what he’s saying too.

Another thing we discussed during dinner was how to write the report. I’d sent an email earlier asking for clarification immediately after getting the message, and gotten a reply really quickly.

reply.png

After dinner, Zain forced me to drink a can of coffee, which meant I couldn’t sleep that night and I ended up finishing the writeup as well (available here). I spent hours agonizing over word choice, formatting, organization, phrasing: I would go to bed only to get up again because I had something I needed to write. I had a draft, so I wasn’t working from nothing, but it was still a hyperfocus frenzy.

I didn’t come to university the next day. I slept. That was Wednesday.

Saturday was the gulf programming competition (remember the second paragraph in this essay? The reason I was doing these things so fast was because I had a dozen other things going on at the same time). When I woke up, I was just too exhausted and overwhelmed to go, so I decided not to. The hardest thing I do every day is waking up and getting out of bed. Some days I’m too weak to do that. I felt terrible, like I was letting Dr. Qadah down, that I was wasting all the time I’d invested into training, that I was failing to live up to my potential. That I wasn’t doing everything I could. But pretty soon I’d be forgetting all of that.

The next day I got an email saying I’d won first place, and that I was invited to HSBC Tower to meet with some officials and go through a certification ceremony. It took some time for us to finalize the date, but it was worth the wait: HSBC Tower is a cool building, and the view from the floor we went to was as breathtaking as Keanu Reeves. I really enjoyed talking to the people there, and proving my skills to the other two winners (master’s students Mohammed and Motamen, who also worked as my TAs for the computer systems lab) meant I had the connections to form a team for the OMG MENA Inter-University Data Science Competition, where we ended up placing first in the national round and third in the international round. Which was in turn a stepping stone to even greater things.

zain.png

Final reflections:

If you would ask me to rank my machine learning engineering skills on a scale where 0 is complete novice, then I would put myself at around a 3.

10 is a Goodfellow or Karpathy or Schmidhuber, 9 is a FAANG tier researcher, 8 would be an experienced professional who can deploy and maintain high performance internet scale models in production, 7 would be someone who has a PhD or equivalent experience, 6 would be someone who has won a Kaggle competition, 5 would be someone who can compete with a Master’s graduate from a reputable university, 4 would be someone who can do some of the many, many things I haven’t gotten around to. 3 is someone who can use a bunch of libraries and do some feature engineering and analysis with only a superficial understanding of what’s going on under the hood. 2 has some introductory math/programming experience, if not necessarily with machine learning. 1 has read about the subject, but doesn’t have a clue about what the technical stuff involves. I fully expect these ratings to change as I learn more, but this is a quick and dirty approximation.

I have a long road ahead of me. I’m just getting started on my journey and I don’t know where I’ll end up, but at least I know I like walking. Hopefully I can get to a 4 by this time next year, 5 in two years, 6 in five, and 7-11 at some point in my lifetime.

When the official announcement went out, I had a few people message me congratulations, which felt great. Dr. Hicham also got everyone to give me a round of applause at the end of systems, which made my brain break for a moment. It felt great to know that everyone was happy for me and wanted me to succeed. I hope I am able to help them achieve their success as well!

The First Hangout of 2019

The First Hangout of 2019

Wednesday, January 2, 2019

After our partial game on the last day of the semester, Aisha and I resolved to meet later so we could actually finish a playthrough. We hashed out the details over text, and had a fun outing to Dubai Festival City that didn’t end in total disaster.

THE NIGHT BEFORE

I slept at 9:00, but woke up an hour after midnight. I ate, spent some time with my family (most of them were still up) and tried to go back to bed. Tried being the operative word here.

3:30 – HOME

Everyone was asleep, except for me. I went to the kitchen, checking the time on someone’s charging phone. I opened the fridge door, poured myself a cold glass of water, and took a swig. Mummy would disapprove, I knew, but if sickness is the cost of that heavenly ice water feeling, then that’s a price I’m willing to pay every time.

I stared at the fridge, glaring at it, silently reproaching it for beckoning me here with temptation. I poured myself another glass, because no one was here to see me partake in sin. As I sipped, squinting, I could make out bold branding embossed in rubber at a corner. HITACHI.

HITACHI, the letters danced. Hit… A… Cat. No, extra A\T, ATTACH has the same problem. AH…I…CHIT. That fits! What is chit, though? Cheat? Chit-chat?

HI…I…CHAT.

The letters mean something. This can’t be a coincidence. They’re speaking to me. But who is they? My subconscious? Yes, I chat. But do I? ITACHI – my sister’s watching Naruto. Is this all connected? But the H is missing. Deliberate? H is for HIC-cup, something you cure by drinking water. Cup, something you drink water in. But right here we have an ACH-OO, sneezing, so there’s that duality, that yin and yang.

So we take the two Os that we add to the sneeze, and the missing H after removing ITACHI, combine them, we get H2O. Obvious, Obvious. It’s a warning! And I must spread this message!

HI…I…CHAT.

I stagger out of the kitchen, looking for my phone, convinced that the CHIT (a small message) from earlier was also TICH (for teach). Or maybe… AH…I…ITCH! The entity itches! What does it itch for? Or will I itch tomorrow?

My mind is an interesting place to be. Thankfully, I couldn’t find my phone, so I went to bed. After all, I still needed to be up on time for tomorrow. Maybe some rest would make me a little less crazy.


3:05 – METRO

I was seated, and I had my phone, so I began reading the Wikipedia article on Muller’s method. It’s a recursive root finding algorithm [f(x) = 0, find x] that fits a quadratic to three initial points and uses the intersection of the curve with the x axis to generate the next approximation.

It’s closely related to the secant method, which fits a straight line through two initial points, and Newton’s method, which takes only one initial point plus a change based on the derivative at that point.

The interesting thing about Muller’s method is that it can find complex roots. That’s something the numerical methods we’ve learned in the last… six? Math courses can’t do. I don’t know why the American system avoids complex numbers so much, they simplify so much stuff!

The biggest offender is Linear Algebra, where some things are begging for Cn, but we’re criminally limited to Rn in the course, even though a lot of the theorems apply to Fn (where F is a Field).

I’m hopeful for Numerical Analysis and Methods of Applied Mathematics, though. They seem really interesting! I was reading an article on how Shazam works earlier, and of course creating audio signatures requires using discrete Fourier transforms, but some of the techniques shown were ingenious! Apparently, it’s something that anyone can implement, so I might select it as a project!

3:15

The hangout officially begins. Aisha told me to look out for a white Land Cruiser. I know a Land Cruiser is a big car, but not much other than that. Thankfully, she’d leaned her head outside the “shotgun” window and was waving at me, so I knew where to go. Also, I noticed the car had “Land Cruiser” written on the back, which was helpful.

I don’t have a lot of experience with mixed gender hangouts. I think this is my third or fourth one so far: the previous two were just going to Matajer/Sahara from uni and back (I’m not counting family outings as hangouts). I wasn’t worried about how to behave at all, though: typically, I can navigate social situations just fine by being myself.

That, and I’ve obsessively read hundreds of thousands of words of (somewhat shoddy) advice on the internet, which probably averages to a positive buff. Plus, I’ve spent dozens of hours interacting with people to learn the parts that can’t be taught from a book I didn’t select an alternate personality, so this would be a good test of my primary one: do whatever comes naturally, but think for a second beforehand.

s3vwprxh65821
Fig 1: How to be good at talking

Looking back, each action served a purpose, but I wasn’t explicitly calculating it in the moment. I was running off “automatic”, but automatic itself had been carefully calibrated so it wouldn’t take too much attention to maintain. I strode over and pulled the door open to show confidence, but held off on entering with a “Hi, may I come in?” to demonstrate polite respect. After I was invited in, I said thank you, put my seatbelt on, and Aisha introduced me to Shirin – all this took a few seconds, but it all contributed to an image.

It probably wouldn’t make much of a difference if you adjusted a few of those variables: if I introduced myself instead of letting Aisha do it, if I left my seatbelt off, if I didn’t ask before coming in. But I care about the little things; First impressions matter.

My first impression of Shirin was that our driver was far prettier than she had any right to be: Wavy hair, a yellow top, tasteful makeup, bright skin, and a smile that shone like summer forged into jewelry.

If Shirin was a radiant sun, then Aisha was a gentle moon shrouded in night. She was dressed in all black, with a hint of silver lining, her pale face framed by curtains of dark hair.

I realized the girls had almost certainly spent more time (and money!) on their outfit than I had on mine: A simple purple button-down, dark grey jeans, polished black dress shoes, and a nice watch. Just the first thing I pulled out of my closet, really. Nothing fancy.

In retrospect, their clothes fit their personalities as well as they fit their bodies – not perfectly, since they weren’t constructs, but well suited enough that you’d notice if you overthink everything like I do. Shirin was sunny, cheerful, bold, boisterous; Aisha was calm, reserved, thoughtful, and laid-back.

From that point on, it was a lot like those dating sims that I will never admit to secretly playing (except Chess, I’ll admit to playing Chess. [I know what you’re thinking: Chess isn’t a dating sim – WELL IT IS WHEN I PLAY IT OKAY??])

Anyway, I had a set of options I cycled through {Listen, Ask Question, Joke}, each with a probability of success, and with enough successes I unlocked more options {Compliment, Tell Story, Flirt}, but many options were locked behind not-so-micro-transactions.

[Note: As funny as it would be, this is not how I think Romance actually works.]

Our hangout was initially going to have twice as many people, but Darjeel and Anuja couldn’t come. While I’m sure I’d have enjoyed their company, I didn’t mind having a smaller gathering. The more people you add, the more group dynamics begin to form; I’m not yet skilled enough to consistently manage interactions when playing the role of a group member. The emergent behavior I’ve observed deserves to be analyzed, but perhaps I’ll do so at a later date.


The drive was unremarkable, and we soon ended up at DFC, chatting as we made our way to the food court. Shirin’s Iranian, but she was born and raised here, and she studies Psychology in the States. We weren’t hungry, so after finding a table that was large enough to support our activities, we decided to play right away. During character select, I picked the guy with the highest sanity – I didn’t want to receive any more cosmic revelations from fridge doors, thank you very much.

I had terrible luck with the card draws and dice rolls, but it was nice to be able to fail without worrying about negative consequences or thinking it was because I wasn’t good enough. Shirin ended up winning, and we moved on to a “party card game” that I also lost thoroughly.

Aisha’s mom and older brother joined us partway through, and we took a break to talk to them. I laid it on a little thick, but parents usually seem to like that effort, and I hope I secured another positive first impression. My goal was to have a good time and to ensure that everyone else enjoyed themselves as well, and “everyone” wasn’t limited to the three of us.

I got up to pray Asr and order food as things were winding down, and the others got up to order too. I bought a Dave’s Double from Wendy’s, and made sure to get iced tea as my drink since Shirin had mentioned it was her favorite. I got an extra chicken sandwich for free that I would later take home, and I also paid for a small chocolate frosty to indulge my sweet tooth.

I ran into Karim Dogorj right after ordering. He’s a friend from uni, we took digital systems together, he’s nice and fit and cool and smart. There were many hugs, but he was leaving in ten minutes, so I had to say goodbye to that gang after catching up for a bit.

Aisha’s mom and brother (Salim, I’d learned) had to go before the food arrived, so I bid them farewell. They were cool, and it was nice meeting them.

We continued to play as we ate. The others had gotten something from Sugoi – Japanese fast food – which looked nice but wasn’t my type. I shared a couple of my fries – they were salty, soft and crunchy, hot, some skin on but not much oil.

The burger was everything I was craving. Big enough that I needed two hands to grip it properly, my thumbs pressing into the warm, soft, firm buns. I chewed off a bite, and flavors surged onto my tongue. That crumbly, tasty, greasy meat; fresh, juicy, gorgeous pickles; smooth, creamy, melty cheese. I washed it down with my drink, and it was divine.

After eating, I went down again to pray Maghrib and then we walked around (stopping to buy some pastries). I felt content, with a drop of wistful sadness, because I knew Shirin had to fly back and it’d be a while before I’d see her again. It felt like the ending of a book.

We had some trouble finding the car, but it was simple enough to track it down by retracing our steps. We took a picture in the parking lot, which is the header picture above. We put music on during the drive back, mostly stuff I was hearing for the first time but could still jam to, which got me out of that mopey mood.

As I was dropped off at the metro station, I made sure to thank them for a fantastic day out. It was an opportunity to let my shoulders down and relax, and I felt like I’d developed meaningful connections, made good memories, and gotten my mind off of serious things. The goals I’d set were met, and I had enough sanity restored that it’d be a while before I had another HITACHI event.

2019 is off to a good start! Let’s keep this energy up for the rest of the year!

Resources for learning Java Programming

(Adapted from a message I sent to my CMP 256 whatsapp group).
Derek Banas has a video where he covers the core java language in 30 minutes, and that’s where I started preparing for this course. It quickly covers basic java syntax for assignment, arithmetic, strings, arrays, loops, conditionals, objects, classes, inheritance, polymorphism, and more. This all stuff we’ve done in programming I and II, so it’s fairly quick and easy to follow along with.
The playlist above goes into more depth on all sorts of topics, including Java Swing.
When I wanted to learn file I/O in Java, I went to the library and opened the textbook like any diligent student. I was quickly overwhelmed by a lot of technical details, and knew there had to be a simpler way of doing things. I searched online, and that was how I found this course. I’d seen it recommended before, so I jumped into it.
I’m honestly amazed that this course is free. There’s a custom Netbeans IDE that automatically tests your programs, and you progress by solving problems, so it forces you to be actively involved. The exercises are combined with excellent articles that strike the perfect balance between comprehensibility and comprehensiveness. The Netbeans tips page alone makes it worth including.
The Cambridge Computer Laboratory is an excellent site that I’ll keep coming back to for most of my major courses. The past questions come from the Computer Science Tripos, which is in my opinion the gold standard for engaging exams.
The course notes contain some comparisons to C++ and Python, which can be especially enlightening about certain subtle differences between the languages. The course places an emphasis on concepts and theory first, and syntax second.
What makes this course stand out from the others is that in addition to covering the same Programming I and II content, there’s also a brief section on design patterns, and another on Java 8 features (Lambda functions, functions as values, method references, streams) towards the end. Look at the recommended reading too!
My cousin Farhan wanted to learn programming, and so he asked me about learning android app development. I initially wanted to introduce him to Kotlin, but since it’s not as mainstream as Java, there’s still a shortage of premium caliber resources.
One of my friends recommended Lynda.com to me, so I checked it out. It’s paced fairly gently, and broken down into small chunks: the first 20 videos are all about setting up Java and IntelliJ IDEA on your machine. Then it goes into the basics, then exception handling, debugging, collections, class relations, abstract classes and methods, interfaces, sending a text file over the internet, etc. Exercise files are good.
While I’m fond of this course, and I’ve encouraged one of my friends who was interested in game development to take it, I recommend skipping the first part of it. They use non standard syntax from a custom library, and the transition to Standard Java can be confusing for beginners if you don’t decide to follow along the whole way.
What’s really good about this course is its emphasis on Graphical User Interfaces. It covers the same Programming I and II material as well, as well as some stuff from Data Structures and Algorithms, and the assignments ARE A TON OF FUN.
There’s nothing all that special about this, except for the fact that you can start writing code right away without having to set things up, which can be good. I’ve used the same site for other things (Bash/Shell), and it covers what you’d except. Supplementary.
No list of resources would be complete without the official documentation, so including this is more obligation than inspiration. I use the docs mostly as reference.
Conclusion:
This is, of course, nowhere near an exhaustive list. Many more resources exist. You’ll still need to go to google and stackoverflow, and no tutorial can cover everything. This is just a bunch of stuff I’ve personally used, so I can vouch for the quality, though mostly the resources vouch for themselves. If you’ve got any resources you’d recommend, please drop them in the comments below!

Trip to SPS Automation Middle East

(An experiment with shorter posts)

Yesterday I got an email from the IEEE-CS mailing list inviting me to an exhibition and conference for building industrial automation.

I registered because the event was in Dubai Festival City and transportation would be provided for free, so I’d save 10 DHS that would normally be spent on a bus ticket.

It was impulsive, but I managed to get permission to be excused from today’s Calculus 3 recitation, so there were no conflicts with my schedule.

At 1:45, I gathered at the pick up point. At 2:00, the bus departed. I talked to everyone on the bus during the trip – there were only like six of us in total.

We arrived at about 2:45. The event was hosted inside a roomy warehouse, and all the booths looked professionally set up. We registered and were given a tour.

Highlights included a short talk on Cybersecurity and IoT, getting some free goodies (stress ball, screwdriver pen, badge, regular pen), posing for pictures, and talking a little bit about real time industrial networks, challenges for modern embedded computing, and new technologies that are advancing programmable logic controllers.

I really enjoyed the free food (pizza slices + orange juice + cake + laban), and the bathrooms were super fancy. There was a round table discussion thing that I participated in. We talked about how to continuously monitor a process, record and transmit information about it, and take actions automatically based on that information to maximize safety and productivity. For example, if a part of the chain fails, then the problem should be kept isolated to that section, and any task that would go through that part should be diverted to another resource so that the system keeps functioning. In other words, fault tolerant systems must include some redundancy.

This is pretty obvious, but these guys were talking about some specific ways they have implemented this principle in the projects they’ve undertaken for different governments and organizations. Applied engineering, not pure theory in a vacuum.

I had to leave at 4:00, because my sister was calling me, but that was alright as well. I walked to a bus stop and used public transportation to get home.

Industrial automation is all about programming control systems that drive power plants, waste incineration plants, industrial furnaces, shiplocks, oil fields, factories, etc. It’s not the flashiest thing, because in this vertical you have to be very careful: a tiny mistake could cost millions of dollars and cause an environmental catastrophe, so you stick to stuff that does the job instead of chasing the latest trend.

It’s not what I want to go into when I graduate, but I value the lessons and perspectives I was exposed to today, and it was an enriching experience. The benefit of such conferences tends to be marginal, and most of my focus should be on my academics, but I think my trip today contributed to the balance students should keep between everything.

Doing everything the same way day after day is, after all, boring.

Let’s continue to have non-boring days.

Spontaneously yours,

Abdul Raheem

First day of the Fall 2018 semester, or, September 2.

Today was an excellent excellent excellent day. I’m writing about the first day of the Fall 2018 semester from the inside of the Dubai Shuttle bus, which’ll take me to the metro station, from which I’ll go home. There’s five beautiful girls in this bus – other than the driver, I’m the only guy. I’m not going to hit on any of them, because haram, but being in a confined place with only girls for company for an hour is its own pleasure. Well, except if those girls are taking you clothes shopping: Then it’s a special kind of torture.

It’s 7:24 PM now. I’m going to go through today chronologically.

I woke up for Fajr at around 5:00 AM. I’d gotten to sleep at 8:00 yesterday, because I was exhausted. Why was I exhausted? Well, I hadn’t slept at all day before yesterday – I’d spent the whole night reading. So, as you can expect, that rest was divine. I brushed, washed my face, prayed, and checked my messages. Paris, a computer science student at Carnegie Mellon who I’d met through ESPR, had replied to my message. So I talked to her until breakfast, then took a nap.

I got up from my nap at 7:00 AM, feeling like my pillow was enchanted. I took a shower, got dressed, and put on my bag – everything I needed for the day was already inside, thanks to past Abdul Raheem. I double checked. I had my laptop, charger, pencil box, lunch box, water bottle, sunscreen, and I was missing my notebook. I searched for it until my brother found it for me. I slid my wallet and my phone into my pockets, put some sunscreen on, and then I was ready to go.

However, my destination was not my university. Not yet. Instead, I was going with my brothers and my mom to a visa office to complete an application – this step was the medical test, which involves a blood test and an x-ray. I napped through the car ride, because I could. When we got there, there was a line. A new counter opened just as we walked in, and the line split into two. There was a white guy right behind me, Dan, who seemed to be here with his fiance/wife; who was ahead of him in the third lane (reserved for women & the elderly). I offered to let him go ahead, but he declined my offer. I chatted with my brother, trading some sibling banter. It was nice. The first counter stamped the paper and told us to go to another counter, at which they told us to go upstairs to another counter, where they put a sticker on the paper and told us to go to another counter, where we discussed the design of the ticketing software until our blood was to be drawn, after which they sent us to another counter which told us to wait until we were called in for the x-ray, after which we discussed a certain section of the book we’d brought with us – Harvard Business Review’s top 10 articles on “Managing People”.

You have to take your shirt off to take your x-ray, and in the changing room, there’s a little mirror where you can look at yourself. I realized, in that moment, that I was comfortable. Comfortable with my body, with my face, with my hair, and with myself. I took a moment to be thankful for that.

After the x-ray, the medical screening process is completed, so we were free to go. At around 9:20, we started heading for Rashidiya metro station, where, at 10:10, the shuttle bus to uni would arrive. I used my brother’s wifi hotspot to load a chapter to read. I was wiling time away until 10:00, which was when add/drop began. At 10:00, I dropped Chemistry in exchange for Calculus 3. I got off. I was on the bus station side, when I needed to be on the metro station side, so I started fast walking. Security yelled at me, and I ignored it – not because I don’t respect them, but because I was in a hurry. So they began pursuit. You know what’s the only thing that looks worse than being chased by security? Being chased by security while running away. So I stayed put and turned myself in to the authorities. Before editing, that previous sentence read – “I turned myself into the authorities”, which would have certainly been entertaining to watch.

I was escorted to an office, into a room where two Arab gentlemen were discussing something – the one behind the counter was explaining something to the one in front of it. I waited, patiently, tapping my foot – until their information transaction was concluded. I then apologized, and was let off with a warning. “Don’t do it again,” they said. I’m glad they didn’t escalate the situation.

I fast-walked the rest of the way, and reached there on time. It didn’t matter, of course, because the bus was late. Something tells me that if I’d reached late, the bus would magically have been on time. That must be how the universe works.

I caught up with one of my friends – Nick, who studies biology. Then I asked everyone waiting if they had an extra bus ticket. No one did. I prayed to Allah. Another guy walked up, I asked him, and he had an extra bus ticket. All Praise be to Allah. He didn’t have change, but he let me have the ticket anyway. I got his contact info – his name was Mohammad – (Glory be to Allah), and he said don’t sweat it, you can pay me back Tuesday. I went to the back of the bus, and talked to the guy there – a mechanical engineering senior, who was watching Archer.

I wrapped up our convo once it started getting stale, so I could take a nap. It was a good nap. I reached uni at 10:45ish, which is 10:45 ± 5 minutes. I’m leaning towards plus: remember, the bus was late.

I’d like to say “I walked to my class” and have that be the end of it, but I need to describe it. I got out of the bus, and started walking towards the room that was indicated on the screenshot of my schedule: ART 218. My old physics lab instructor was in the car park, having a smoke – I called out to him: “Hey, Sir!”, I waved, “Had a good summer?”. He waved back, “Yes, great, and you?”

I laughed, and said, “Fantastic, the best”. And then I was out of speaking distance. This is how I walked to class: every person I knew on the way (and I know a LOT of people), I said hi to – waved at, shook their hand, grasped their shoulder, or hugged them – and asked them how they were doing, and how their summer went, and how I’d see them later, take care. I was happy to see them!

In my mind, I want everybody to be my friend. I think of people as my friend the moment after they’ve been introduced to me, and treat them like it. If somebody doesn’t want to be my friend, I feel a little sad, but I tell myself that they might become a really good friend later.

I got to my class, put my bag in there, and checked my messages. There was one from Fareha, which was asking me to come to the student center ASAP. I went there, (remember: I “walked”, but this time I added, “I’m looking for someone, so I can’t talk right now” as my ‘excuse’ for not staying longer), did a sweep – hugged Ali, holla’d Yousuf, saw Maher, assaulted Fawzi with love at the Used book fair – but she was nowhere to be found. So I went back to ART 218.

The class in ART 218 was Academic Writing II. The class started with introductions. At this point, you can guess what happened: I went first, gave an extempore speech, circulated the sign up sheet for the whatsapp group (I make one for every class at the beginning of the semester, so the group can share resources, help with doubts, and update others on deadlines and upcoming quizzes), shilled my blog, and sat back down. People failed to match my performance, but it was interesting to hear the backgrounds of some of my class members. We were let out of class 20 minutes early since half the people registered had failed to show up. Our writing professor is new, but she seems nice. I stayed behind to talk to her for a bit, along with another student.

Now I had half an hour until my next class. I decided to go to the financial aid department. I hesitated at the token issuing machine, before selecting ‘general information’ as my purpose, since that seemed safe enough. The machine printed out a ticket – I tried to do a calculation in my head about how much paper was wasted every year thanks to automatically dispensed disposable receipts like this, and failed. It was a lot of paper – there should be an option to put it on your phone instead.

No one was waiting ahead of me, so my token – G00017, was called quickly. I walked to the room with some trepidation, not looking forward to what I was going to say, trying to arrange how I would say it in my head. I explained our financial situation to the lady, who listened, asked some questions, listened to my answers, then went to her manager. I looked at the room while I waited. Rug, bookshelf, desk, papers, whiteboard, computer – it looked like a comfy office. There was a “Map of Mathematics” poster from Domain of Science (Dominic Williams) stuck on a wall. I spent my time waiting by staring at the map and trying to remember everything I knew about the areas of math I was looking at – it was a way to get my mind off of what I’d just said, so that I wouldn’t dwell on every truth I’d said to that woman, so I wouldn’t twist myself into knots waiting for her return. She came back with a purple paper in hand that had a yellow sticky note attached to it, and clearly underlined some sections, explaining what documents I would need to bring. She said that while she couldn’t promise anything, our exceptionally bad situation – combined with the fact that I was an exceptionally good student (4.0 last semester, Alhamdulillah), meant that they would try their best to make a special exemption for me. I thanked her, tried not to cry, and went to my next class – Discrete Mathematics, in NAB 006.

Our professor, Dr. Ayman Badawi, has a great reputation – and after my first class with him, I can honestly say that he’s earned it. “So, can anyone tell my why this course is called Discrete Mathematics?”, he asked. “Because it’s not continuous!”, I replied. He has a website with stuff on it – it looks terrible, I’m going to offer to help with that – but his explanations are clear, and he knew how to handle me. He saw the whatsapp group sign up sheet being distributed, asked what it was, and said, “That’s good, that’s good! – I thought you were signing a protest against me!”. I half listened to the lecture as I added the number-id pairs to my contacts – it wasn’t anything I didn’t know already, but I absently answered any questions he posed to the class – and when class was over, I asked everyone if they’d received the message I’d sent them. Everyone nodded, and Dr. Badawi asked me if I’m a leader. “Oh yes, sir – I’m a natural leader”, I replied. He smiled, and said that maybe he should let me teach sometime – I smiled back, nodded, and said, “I’d love to give a presentation sometime, professor – just let me know in advance what it’ll be on, and I’ll try to prepare some slides”.

Discrete was a thumbs up, I told Abdullah and Labid, two of my really close friends. We chatted a bit, and I loved every second of it. Next up was GUI Design and Programming, in EB2-215. I stopped on the way to pray Zuhr, after dropping Labid off at the Library.

I’d misread the number on my phone, and was looking for EB2-213. I asked one of the faculty passing by for help locating it, and they said that such a room did not exist. There was 212, then 214. Apparently they don’t like the number 13, he joked. I don’t know if he was taking the piss, but I didn’t find any EB2-213 either (MAYBE IT’S A SECRET ROOM!!!!!!!), so I checked my phone again and went to the correct class.

Dr. Hicham Hallal is a new faculty member of the college of engineering. There was an email sent out with a short description of his background sent out earlier in the day, which I’d already read. He did everything right – the slides were good, his drawings were good, he provided information to us and gathered information from us in an efficient, effective, and interesting way. He didn’t know how to handle me. There were only two people who knew Java from before – me, and a guy with a groomed beard. He didn’t like interruptions, he told me to put away my phone, and he didn’t pick me sometimes even when I was the only one with my hand raised. All are rational decisions that benefit the learning environment of the classroom instead of putting all the focus on one attention seeking show-off, and I get where he’s coming from and respect him totally, but from now on I’ll probably sit at the back of the class and put headphones in so that I don’t get bored out of my mind.

GUI left a bad taste in my mouth, but one I expected. I’ll brag a little, say that I’m too advanced for it, but the truth is that I’m not, and that if I’m issued a challenge (make a game, for example), then I’ll behave because I won’t be bored. I hate being bored. I’m aware I hate being bored, and sometimes I do nothing until I’m bored so that I’m so bored I’ll do the thing I wanted to do. I can channel every emotion towards being productive – there’s a trick to it.

GUI ended at 1:50. I went to the library at 2:00, because I’d stayed back to talk to the professor a bit – maybe fix up the terrible first impression I must have made. I’m going to start covering events in less detail now, because it’s past 10:00 PM, and I’d like to sleep soon.

In the second floor of the library, there was a boy browsing through books – anyone in the library on their first day is probably a good student [P(Good student| In Library on first day) > 0.75], so I introduced myself. Ufayd was a freshman studying management, and so I had a conversation with him. We were having a good conversation, but the point at which it became special was when I asked him what his plans were after uni, and then asked him what his backup plan was. He said he didn’t have one. So I told him to pull out his notebook. I asked him to write down every thing that could possibly go wrong – medical emergency, financial apocalypse, miscellaneous disasters – I helped with the list. I told him to come up with a strategy for his game plan to respond to each one happening, and then a strategy to deal with the event that two things go utterly wrong at the same time, independently. I then brainstormed goals and steps to take – preventative and proactive ones, like mental and physical health, a bank account, a driver’s license, getting enough sleep, getting good grades, going to the gym – I helped with the list. Then I made him draw up a schedule with all his classes on it. I went to get color pencils so I could make the schedule look PRETTY, but checked my phone on the way and Fareha was calling me to the student center again. I’d found out it was Ufayd’s birthday at some point during our conversation (he’d just turned 19), hugged him happy birthday, so I invited him to Hammad’s birthday party. He couldn’t come, though since he was being picked up at 3:00. I hugged him goodbye, and left.

I took a brief detour to sit at Kava & Chai with Mouza, the gorgeous genius who lives and dreams Physics. Looking at her smile made my day more than it was already made.

You see, what Fareha was calling me to was the celebration of Hammad’s birthday, which couldn’t start until everyone was there. From 3 to 5, we had the set up and the party. There were so many high points that talking about them here wouldn’t be highlights – they’d just be lights. Getting permission to borrow a knife from the nearest kitchen, accidentally blowing out the candles just before he came and frantically relighting them, pulling out supplies we’d forgotten to use out of the gift bag we gave to Hammad, the great jokes and banter traded – heck, even the tablecloth was good material. I laughed so much. I was the one who distributed the paper plates and food, the one who got plastic knives and forks, and the one who made sure everyone was topped up on CocaCola. I bought some plastic cups, then Ameera nudged me, pulled out a whole stack of plastic cups from below the table, and pssted that they’d already brought them. I made an ‘erp’ face, then whispered fiercely – “put those back where they came from, before everyone realizes how stupid I just was”.

I took pictures with everyone, laughed so hard, had so much fun, and it was awesome. I smiled just because I loved everyone. Arsalan and Fatima’s dynamic is enough material to make a show last several years, and that’s without adding Raza. Aisha wasn’t feeling so good – she had a stomach bug – but she had a good time too. Precious (not his real name) disappeared somewhere after Hammad fed him cake, and Mohammad (not the same Mohammad as earlier) was our token Arab guy. Uzair was there too, one of the organizers of the party, great guy.

I left a little before 5:00, because I had to pray Asr. I packed some leftovers for my fam. I learned that Iraqis say “Shloonak”, not “Keifak” from Mohammad (same Mohammad as party) during ablution, and then I lead the congregation. At 5:00, I went to the library again, to print syllabi and what lecture notes were already online (I had a semester’s worth in my hard drive thanks to friends who’d already taken the course, but updated work is updated).

I ran into Wissam Orabi, legit one of the most impressive guys I know, who is also caring, handsome, awesome, gives great advice, and has a brother doing a PhD in Hong Kong right now. His praise lifts me up, Subhanallah. His laptop was having connection issues, so we talked about how I spent my summer – which should really be its own blog post (especially because of my internship) – and parted ways. He has a Nexus phone.

I did my stuff at the computer. I noticed there was a sticker saying “Ubuntu” on it, which is the same distro of Linux I have on my laptop. That’s pretty cool. Calculus 3 looked interesting, and I already knew at least the first few chapters. The girl in front of me asked me to look after her stuff while she took a quick break to the washroom, and so I protected her belongings from all evildoers, death to all born of ill and wickedness. We got talking, and by 5:40, when I went across to show her some of my drawings, I was completely engrossed.

Marjon’s a first-year who went to GEMS for high school (American system, 3.8 GPA) – she’s bilingual, since her parents are from China, but she was born in Pakistan. She’s cute, and she has a light accent. She’s currently studying Architecture, but she did AP courses in Calculus, Biology, and English. We talked about a lot of things – I went through the entire FORD list (Family, Occupation, Recreation, Dreams) and we still had more things to talk about. We talked a lot, until like, Maghrib time – which is about 6:40ish, which is 6:40 ± 5. I’m leaning towards plus: remember, we exchanged numbers before I left to pray.

My conversation with her was… the word that comes to mind is freedom. For perhaps the first time since I’d calculated how much it cost per day to attend university – and this was not a short time ago, keep in mind I’m a sophomore (second-year, graduate at the end of my third thanks to taking extra classes, but usually the degree lasts minimum four years) – it felt like it was right, and that this – coming to uni, paying so much – was worth it. I’m looking forward to seeing her again.

I went to the student center after Maghrib prayer. I hugged Arsalan and Raza, and I don’t touch girls so I just said bye to Fatima. Raza has a car, and he lives near me – but he wanted to stay a little longer, and he’s not my driver so I’m not going to ask him to leave early on my behalf, so I took the bus, where I started writing this post. After Etisalat metro station, I took a break from the laptop, and talked to our driver uncle about Pakistani politics (I’m Indian, but was born and raised in the UAE). Oh, and of course, my meeting with the driver uncle was enthusiastic – I’d missed him, it’d been some time away, and he told me stories about careless students sleeping through the entire trip and having to take the next bus, and other lighthearted stuff before we moved on to the serious political stuff. He told me about his experience from his stay over there – about the real struggles his people are facing, about how corrupt the previous government was, about hope, about problems, about frustration, about international relations and trade and all the madness of modern Pakistan.

Bus and taxi drivers are some of my favorite people, and I’m not just saying that to virtue signal.

Then it was the metro – a guy was actually reading from off my shoulder, so I smiled at him, and he asked me what I was writing. A diary? No, I said, it’s for my blog – would you like to follow me? He said, yeah, what’s it called? I said, sheikheddy.wordpress.com, then spelled it out – he wrote it down on his iPhone.

Then I went to Aster pharmacy, the local clinic. I study there sometimes because it’s quieter than home, there’s free wi-fi, a coffee machine, and because I’m surrounded by doctors and nurses – people who have worked really hard, overachievers who persevered, and that inspires me. The only thing that bothers me is all the paper waste – I keep getting these crazy ideas for how it could be reduced, many of which involve starting companies.

At 9:10, my mom called, so I walked back home. It’s just past 11:00 now, and I’ve come to the end of my first day – I’m going to go to bed now, but not before I publish this piece. Today was an excellent excellent excellent day, I’m glad I exist, and I’m going to change the world.

Thank you for reading, and if you’d like to see more, please follow. Updates maybe Sundays.

CMP 120 Chapter 3 notes dump

I have a midterm tomorrow.

Chapter Summary

  • Boolean expressions are evaluated similarly to the way arithmetic expressions are evaluated.

Here’s how I think of it: we’ve all been through elementary math: 1 + 1 = 2, 2*2 = 4, and so forth. This is arithmetic with numbers. The reason some students have difficulty is due to unfamiliar names such as “operator” for the + or * sign and “operand” for the numbers on either side of the mathematical sign. On top of that, they must remember some arbitrary seeming rules, such as the quirks of certain data types and tables of operator precedence. Practice helps.

These rules make a lot more sense once you have a basic understanding of the underlying structure and organization of the history behind the structure and organization of computer hardware, but unfortunately simple logical circuits and alternative number bases are not covered in the scope of this course.

What it means for boolean expressions to be evaluated ‘similarly’ to arithmetic expressions is to say that we are still combining values, but now instead of conventional algebra (which we are familiar with), we are using boolean algebra. This is a systematic way of determining truth and falsehood using logic. We shall not be exploring some of the more interesting properties of classes (groups of things), but it is recommended that you apply concepts you learned in set theory to AND (Intersection), OR (Union), and NOT (Complement). Once you do, it is not so surprising that 1 + 1 = 1, because TRUE + TRUE = TRUE.

  • Most modern compilers have a bool type having the values true and false
    • You probably used the bool type in Microsoft Excel for ICT class.
    • One possible point of confusion is that in this course, we have not seen many boolean expressions outside of their “homes” in if statements and loop conditions. But it is important to remember that you can program with bools even without putting them inside those things.
  • You can write a function so that it returns a value of true or false. A call to such a function can be used as a Boolean expression in an if-else statement or anywhere else that a Boolean expression is permitted.
    • This may seem like a complex statement, but it isn’t saying all that much. It’s just saying that when a simple comparison doesn’t suffice for our purposes, we can make a suitable substitution in the form of a function, because all we really need is a Yes or a No.
    • Pay attention here, because this marks the shift of a paradigm from imperative to declarative programming. You’re describing what you want your program to do, not how you want to do it.
  • One approach to solving a task or subtask is to write down conditions and corresponding actions that need to be taken under each condition. This can be implemented in C++ as a multiway if-else statement.
    • Once you master this, many fun things become possible. I honestly must recommend going wild with your creativity and working on a project or two to make something that does useful work for you. It is one of the best ways to get better at programming.
  • A switch statement is a good way to implement a menu for the user of your program.
    • What exactly is meant by menu over here? Well, what’s the first thing that comes to mind when you think about menu? Perhaps it is ordering at a restaurant. Then imagine we had a very simple program where we could order either burgers or pasta. Press 0 for a burger and 1 for pasta. You can imagine how this could evolve into a more sophisticated system. Countless applications!
    • Maybe some of you are gamers and think of settings and options when I say menu. This is even clearer! Press this button for that action, these keys correspond to those commands. Very intuitive!
  • A block is a compound statement that contains variable declarations. The variables declared in a block are local to the block. Among other uses, blocks can be used for the action in one branch of a multiway branch statement, such as a multiway if-else statement.
    • Technically correct, but a little too formal for my taste. Blocks are boxes. You have a big box, and inside it there are smaller boxes.
    • Variables inside the big box can come inside the small box, but variables that were born inside the small boxes are imprisoned there.
    • The most small box variables can hope to do is influence their “country” from the inside.
    • This analogy is pretty bad, and I’ll stop before it turns into a full fledged novel.
  • A for loop can be used to obtain the equivalent of the instruction “repeat the loop body n times”.
    • The “wise saying” when it comes to loops is to use for loops when you have a known number of iterations, and while loops when you have an unknown number of iterations.
    • For example, let us imagine that you have gravely injured your friend, and wish to apologize. There are two ways to approach this problem:
      • 1: You will apologize one thousand times. You write a for loop to print out “Sorry” again and again until it’s been said 1000 times.
      • 2: You will apologize until you receive a reply. You write a while loop to print out “Sorry” until a reply is detected.
    • These may seem like inelegant solutions, but you can already see that they can be improved. Add in a little delay, randomization, Markov chain implementation, natural language processing, artificial intelligence, and you may end up with a chatbot.
  • There are four commonly used methods for terminating an input loop: list headed by size, ask before iterating, list ended with a sentinel value, and running out of input.
    • List headed by size: The list begins with a number indicating how long it is, so you know how many values to read beforehand.
    • Ask before iterating: After every input the user is asked if they want to continue inputting stuff. Used for menus and repeated processing.
    • List ended with a sentinel value: Some impossible value is put at the end of the list. It’s a special value that has no meaning to the program and is entered by the user to terminate the loop. For example, if it’s a list of colors, you could enter “Ahmed” as a sentinel value, and since Ahmed is not a valid color, the program would know there was no more input.
    • Running out of input: There simply is no more input you can read of the file, because it has ended.
  • It is usually best to design loops in pseudocode that does not specify a choice of C++ looping mechanism. Once the algorithm has been designed, the choice of which C++ loop statement to use is usually clear.
    • Also, if you do this, you can pick up syntax from other languages fairly quickly too, and your general computer science intuition is not restricted to a particular method of implementation or thinking.
  • One way to simplify your reasoning about nested loops is to make the loop body a function call.
    • Remember: Code is the enemy. Make it as short as possible. The more code you write, the more bugs you have. People don’t pay you to write code – they pay you to solve problems.
  • Always check loops to be sure that the variables used by the loop are properly initialized before the loop begins.
    • I haven’t really run into this problem, but maybe that’s because I’ve never written any substantial program without a lot of preparation.
  • Always check loops to be certain they are not iterated one too many or one too few times.
    • Off by one errors are really, really, really annoying.
  • When debugging loops, it helps to trace key variables in the loop body.
    • One of the many things I love about computer science and engineering is that we’re spoiled for choice when it comes to ways to understand a component of a particular system.
    • Bottom up: Computers run on a clock. Debuggers can stop the clock and “step through” each step so you know exactly when the problem occurs.
    • Top-down: Debuggers are a way to keep track of the state of your program and zoom in on what causes things to go wrong. Software engineers use them extensively to sniff out errors in large programs.
  • If a program or algorithm is very difficult to understand or performs very poorly, do not try to fix it. Instead, throw it away and start over.
    • This is good advice in general. If a person is toxic, cut them out as soon as you can. If a paper is dead, stop trying to write the last few lines you have no inspiration for and just start a new one from scratch. If you’re tired of studying and can’t take it anymore, take a break – sleep, eat, exercise, shift your focus. Hard work pays off, but always evaluate whether or not that same hard work would be more effective if it was applied elsewhere.

CMP 120 Chapter 2 notes dump

Labid gave me some feedback on the last post: he said that I should include snippets of code here and there to illustrate what I’m talking about.

But before I do that, let me show you what a program looks like in C++.

#include<iostream>
using namespace std;

int main(){

return 0;
}

Disclaimer: I’m just a beginner. I don’t claim to understand this well, but I can explain what I see when I’m looking at it, which may not be what it actually is. If you find any mistakes please please please let me know so I can fix them.

If the above seems intimidating, I promise you’ll walk away with that block looking friendlier.

Computers only understand 1s and 0s. Writing code in 1s and 0s is really hard so nobody does it. If the code isn’t written in 1s and 0s, how does the computer understand it? That’s a good question. There is a program that translates human written code into machine readable 1s and 0s. We call this program a ‘compiler’. Compilers look at your code and make a new file with all the ‘human code’ replaced with its meaning in 1s and 0s. How do they do that? I have no idea, maybe there’s a book where they look it up and just find and replace. But who made this book and how did they learn the particular sequences of 1s and 0s that make computers do things?

Well, let’s clear one thing up. We don’t have tiny people running around searching for books inside a computer (trust me, I’ve looked) so the analogy over here is for files. Now these are different files from the documents and images that you’re used to, but they’re still files. When you install C++, it comes with all sorts of files that are there to help you write software. Some of these files are called header files, because you put them in the header!

What is a header file, though? Fun fact, another name for these header files is copybooks! Aha, this is interesting! This is the book we were talking about that tells you how to copy stuff! So when you write #include<iostream>, you’re telling the compiler to include the header file called iostream, whatever that is. Now you don’t know what a header file is yet, but I can tell you that io is a common abbreviation for “input/output” and stream is just a creative name for an abstract concept of the ‘road’ (or more accurately, conveyor belt) on which data travels to transfer/ride to where it needs to go.

Again, what is a header file? It is the interface to a library. This is why learning computers is hard! Everything you try to learn leads to one more thing that you don’t! (If you’re lucky) and we haven’t even gotten past the first line yet!

So let’s take a step back and analyze this thought, because it’s actually the perfect way to segue into an important concept that will come up again and again going forward. Imagine if in order to write “Hello world”, you first had to understand everything that made that possible. You’d never get anything else done! So because we’re lazy, we trust that someone else has probably figured the hard stuff out and so all we need to do is focus on, like, our job. Once we’ve solved a problem we can share it with the world so someone can build off of what we did without having to do all the work that we did to get to that stage. Reinventing the wheel is inefficient. Other programmers who have come before us have lightened the burden, so we carry the torch forward and spread the light.

(Note: With time, we will come to see that simplicity was never a huge goal in C++.)

How #include<iostream> works isn’t that important, but it is absolutely crucial that you understand what it means if you want to get anywhere in this field. It is a line, right at the top, that says: “I haven’t figured all of this out! That’s okay! This is a bunch of code someone else wrote that I can use to make my life easier, and it’s the whole reason my code works at all!”

(But don’t get too comfortable: you will need to understand more of it later on.)

#include<iostream> is a key that unlocks access to all the abilities that <iostream> can give you. There are many, many, many, other libraries. You can write your own or download them off the internet! But in this course, we’ll just use the standard ones, like <iomanip> or <string> or <cmath> or <limits>.

“But wait,” you ask, “if there’s all of these libraries, wouldn’t some of them conflict with each other?”

‘Conflict’ over here is not referring to a war (that’s armed conflict [or git merge conflict]), it simply means ‘incompatibility’. We see this incompatibility mostly when we have the same name for two different things (maybe two people had different ideas for how to calculate the square root, but both named their function sqrt. If you tell the computer to call the function <divert execution to>/[pass an argument to and return a value from]/{input the number into the sqrt machine and bring back its output} it won’t know which one to use!. A person can understand the difference between “Abdullah” and “Abdullah”, but how is someone who has never met either of them going to be able to tell them apart?

Fun historical stories about how last names were made up by nation states to make taxing people easier over here, linking instead of quoting so I don’t have a lengthy digression

The solution is namespaces. Namespaces are prefixes that act like last names for keywords or identifiers. Once we get to object-oriented programming principles there’s going to be a lot of satisfaction that comes from extending this kinda general concept of grouping things into families with names, but let’s not get too ahead of ourselves. So everyone knows std::sort means “sort as defined by the std (standard) library” and they know bro::sort means “sort as defined by the bro library”. Now the computer knows where to look, there is uniqueness instead of repetition! The double colons is just syntax AKA notation. It gets tiring to say (I mean write) std::whatever all the time so we put using namespace std at the top to just say “Hey, just so you know, the default is std so if you’re not given a more specific xyz::whatever as a prefix you can assume I meant std::whatever.”

Hooray, we now kind of understand two lines of code! Keep learning, there’s a lot more I haven’t said about these!

Finally, we come to int main(). This is there as a holdover from C++’s predecessor, C. Why was it in C? To explain that, I’d have to go into how operating systems at the time worked, which isn’t necessary right now. Think of int main() as the statement that tells the computer, “Okay buddy, this is where my program begins, start executing here” and think of return 0 as the statement that tells your computer “Okay, this is the end, you can exit now”.

That was a lot of info, so let’s take a step back and repeat what we’ve just learned:

  • The #include directive lets us use code from pre-written libraries
  • using namespace std cuts down on unnecessary repetition of unique names
  • int main(){} and return 0; are the beginning and ending respectively

C++ Basics Summary: (From textbook):

  • Use meaningful names for variables
    • This is something that mathematicians and physicists could stand to learn from programmers. I mean, sure, it’s vexing to use verbose notation (which was the whole reason people invented the = sign) and when it’s already set in it facilitates conversation and communication, but it can serve as a barrier to intuition for new learners and it can lead to undesirable confusion. I know that I’d trade a little efficiency for comprehension any day of the week. It isn’t a big enough deal to fight against the inertia, but I don’t think that a little bit of effort to make the presentation more approachable would enable us to focus on abstract semantics rather than obtuse syntax.
  • Be sure to check that variables are declared to be of the right data type
    • C++ is statically typed, which means that you have to tell the program what kind of type you want instead of python where the interpreter figures it out or javascript where you can just use a var. This is kind of mitigated with the introduction of ‘auto’ in C++ 11 which deduces the type from the initializer, but since it’s still done during compile-time and it might be unpredictable.
  • Be sure that variables are initialized before the program attempts to use their value. This can be done when the variable is declared or with an assignment statement before the variable is first used.
    • If you don’t initialize your variables, then the garbage value stored in them could lead to bugs in your program.
  • Use enough parenthesis in an arithmetic expression to make the order of operations clear
    • I hated  having to memorize the operator precedence rules, but I guess that’s useful information in case you ever need to debug badly written code.
  • Always include a prompt line in a program where the user is expected to enter the data from the keyboard, and always echo the user’s input.
    • Well, this isn’t always true. For example: passwords.
  • An if-else statement allows your program to choose one of two alternative actions. An if statement allows your program to decide whether to perform some one particular action.
  • A do-while loop always executes its loop body at least once. In some situations, a while loop might not execute the body of the loop at all.
    • A do-while loop is useful for when you’re getting input from the user.
  • Almost all the number constants in a program should be given meaningful names that can be used in place of the numbers. This can be done by using the modifier const in a variable declaration.
    • Sometimes this goes against common sense. Only do this if it increases readability. For example, if you’re calculating percentages, HUNDRED is not as easy to understand as 100. But G may be easier to understand than 6.67 * 10^-11.
  • Use an indenting, spacing, and line-break pattern similar to the sample programs.
    • This is spot on. According to style guides, you should try to understand the conventions that are used in the codebase that you’re given, and integrate your changes so that it feels coherent, like one person wrote the whole thing. Consistency is key.
  • Insert comments to explain major subsections or any unclear part of a program.
    • But remember not to overuse them. The purpose of a comment is to make sure others don’t have to read every line of code to understand what our program is doing, so be sensible and minimal. Often we can use descriptive variable names and clear structure to do more than a comment ever could. Before you reach for a comment, ask yourself: “Do I need a comment here, or can this be reorganized to be more obvious?”. Of course, most of the time the problem is that there were not enough comments rather than too many, so even if you’re not a literate programming guru it’s safer to stick to just a little more than necessary.

There’s a lot more I wanted to include about the basics like variables, assignment statements, loops, control flow and functions – but I’ll cover those another time.

CMP 120 Chapter 1 notes dump

My notes are terrible. I read online that making them public forces you to make them better just because you know other people will see them. Let me try this thing out. Any mistake is my own, please point them out so that I can correct it. This is not everything, I’m just too lazy to migrate everything from paper to digital.

Goals:

  • Be prepared for tomorrow’s quiz on Computer Organization and C++ program development 
    • This is basically just Chapter 1 of the textbook
  • Complete Lab 3

Notes:

I’m going to rewrite the “Chapter Summary” part of the textbook and add comments below each point with my own understanding or ideas.

  • The collection of programs used by a computer is referred to as the software for that computer.
    • Systems software is what runs the computer while application software is what the user utilizes for their purpose.
    • There used to be two different types of computers: fixed program computers and stored program computers.
      • The difference was that the former could only do pre-defined operations so you had to make a new product to add functionality. Changes were made at hardware level.
      • Stored program computers could perform calculations and remember results, but they could do more than what was built in: a user could define new kinds of calculations.
  • The five main components of a computer are the input device(s), the output device(s), the processor (CPU), the main memory, and the secondary memory.
    • This is all pretty standard, you should remember this and the passage about workstations and mainframes from ICT
    • These “five main components” are also called “The functional units”.
    • The easiest way to understand this is to draw a diagram with arrows.
    • “Secondary memory” is also called “Auxiliary storage”.
      • In class we had an in depth discussion on magnetic storage, but while the physics is interesting it’s mostly a historic side note.
    • The CPU can actually be divided into many parts
      • Off the top of my head, a few examples are:
        • Registers
        • Control Unit
        • Arithmetic and Logic Unit
      • All of these are fascinating unto themselves, but tomorrow’s quiz won’t require in depth knowledge of computer architecture so I’ll refrain from sharing details about the bus or how binary adders are made by putting together lots of XOR gates and stuff about power rails and read enable/write enable, etc etc.
    • Main memory can be thought of as the “RAM”, it’ll get a lot of attention when we get to data structures like arrays and linked lists.
    • You may not respect input/output devices because you already know mouse and keyboard and monitor, but don’t be so quick to judge.
      • Example: Virtual / Augmented reality
      • All kinds of sensors (like the ones on your phone)
      • “User” can be another computer instead of a human being.
      • It’s a powerful mindset to analyze any system.
  • A computer’s main memory is divided into a series of numbered locations called bytes. The number associated with one of these bytes is called the address of the byte. Often, several of these bytes are grouped together to form a larger memory location. In that case, the address of the first byte is used as the address of this larger memory location.
    • In class, Dr. Ghassan asked “How do we view the main memory?” and I think that was a little ambiguous: he meant, “How do we visualize the main memory?”, but I thought he was asking how we access it.
      • We draw a big table and number each location as its address
      • We typically use hexadecimal (base-16) numbers to count them
      • This is going to be covered in depth when we get to pointers
    • A bunch of bytes is apparently called a word.
    • Memory management is one of C++’s perks as a language
      • \0 is known as the null string terminator. It’s placed at the end of any sequence of bytes so that the computer knows that it can stop scanning. If you don’t put it in, the computer will go past the end of your data and keep reading until it encounters one. These are mostly harmless in C++, because typically it’ll only cause a off by one error if you forget it when declaring the size of an array, but they needed to be put in explicitly in C.
      • A common meme about C++’s predecessor C is, “Oh no, I forgot the null terminator” and watching the computer vomit out everything that was in memory like an avalanche.
  • byte consists of eight binary digits, each either zero or one. A digit that can only be zero or one is called a bit.
    • A byte is typically the smallest addressable unit of memory. It can store the numbers 0 through 255.
    • ASCII, abbreviated from American Standard Code for Information Interchange, is a character encoding standard for electronic communication.
      • Computers only speak in binary, so we need codes like ASCII so that sequences of 1s and 0s can be translated into letters and basic commands and stuff.
      • ASCII is pretty old. People now use Unicode (usually UTF-8) as a standard because it includes emojis and foreign language support and tons of other neat stuff.
  • compiler is a program that translates a program written in a high-level language like C++ into a program written in the machine language that the computer can directly understand and execute.
    • Compilers are a massive topic. You could teach master’s level courses on Compilers. Lexical analyzers, parsers, grammar, syntax, semantics, code generation and optimization. Very rich field.
    • In this course preprocessing, compiling and linking are kinda glossed over, but there is still some discussion of source files and object files.
    • Machine language is 1s and 0s.
  • A sequence of precise instructions that leads to a solution is called an algorithm. Algorithms can be written in English or in a programming language, like C++. However, the word algorithm is usually used to mean a sequence of instructions written in English (or some other human language, such as Spanish or Arabic).
    • Interesting tidbit: the word “algorithm” has roots in the latin “algorismus”, which is actually just a corruption of the name of the Arabic scholar “Al-Khwarizmi” AKA the inventor of algebra.
    • Remember inputs and outputs earlier? Well, the step between them is processing and much of computer science is centered around the development of efficient algorithms to do that “processing”.
  • Before writing a C++ program, you should design the algorithm (method of solution) that the program will use.
    • This is a major point. People look at me weirdly because I plan out everything I’m going to do on paper before I even touch the computer, but I do it that way for a reason.
      • I never have to deal with syntax errors
      • I have the freedom to sketch and scratch to my heart’s content
      • I force myself to slow down and really think about the problem
      • It’s what professionals and contest champions do
      • It is applicable no matter what language I am using
    • I’m trying to teach myself more about algorithms, but it’s slow going because you can’t really grasp it unless you practice yourself and think about it deeply. I can implement some basic searching and sorting and traversal and retrieval, but nothing more advanced than that. In my spare time I’m looking into Discrete mathematics, multivariate calculus, linear algebra, and introductory graph theory, but it’s hard when my courses take so much time as it is. A strong background in mathematics is necessary for any success in algorithmic thinking.
      • Don’t let that discourage you if you suck at math though. You can get really far on just middle/high-school level knowledge if you know how to translate it into something usable.
  • Programming errors can be classified into three groups: syntax errors, run-time errors, and logic errors. The computer will usually tell you about errors in the first two categories. You must discover logic errors yourself.
    • No matter how careful you are, there will be bugs in your program. The only way to get rid of them is testing, testing, testing. Sound familiar?
  • The individual instructions in a C++ program are called statements.
    • I like making analogies to English whenever I’m learning a new concept in programming. Operands and Operators are nouns and verbs, statements are commands, expressions are definitions, semicolons and stuff are punctuation. There’s a reason they call it a “language”.
  • A variable in a C++ program can be used to name a number. (Variables are explained more fully in the next chapter.)
    • Assignment binds names to a value
    • You can later retrieve the value associated with the name or variable by invoking its name
    • You can re-bind names to different values
    • Some names are haram for our use
  • A statement in C++ that begins with cout << is an output statement, which tells the computer to output to the screen whatever follows the <<.
    • cerr and clog are also things but we don’t talk about them because if we talked about all the things it would be the same as talking about nothing. Teaching is not about what you can cover: it’s about what you can uncover.
  • A statement in a C++ program that begins with cin >> is an input statement.
    • cin >> is also known as the stream extraction operator.
    • It’s bad practice to use cin by itself because of the possibility of bad/malicious user input causing your program to crash. Typically we use libraries like <limits> and <string> to validate user input instead of blindly trusting them.
      • However, since we are all learning, this standard is relaxed for now.
    •  >> and << by themselves are something called “bitwise operators”. Basically, they can shift all the bits in a number to the left or the right. Useful, but only in a narrow field. Not that important to know about, once we study overloading it’ll come up.

I think that’s enough thinking for Quiz 1. I did the lab while procrastinating, and my concepts are solid in my other courses so all I need to do is practice now. I’m going to need to study whatever happens, so I might as well share whatever I write (though I’d seriously recommend anywhere else if you want to learn). I fill up entire books with my studying already anyway. Hopefully my presentation will improve with experience.

 

Fall 2017 at AUS — Course reviews

WRI 101

I took WRI 101 with Huda Bakhour this semester. She was my favorite professor because she was lenient, caring, and competent. I’ll admit that I may be biased because I got some special treatment. She permitted me to skip class to attend one or two events, she extended deadlines when my assignments were late, and I could always rely on her to provide me with feedback on my writing, even if it wasn’t strictly class related. I don’t know how I was lucky enough to be blessed with a Saint like Professor Bakhour, but I’m sure that without our good relationship I wouldn’t’ve done nearly as well as I did.

I didn’t think I needed WRI 101, since the quality of my work is pretty decent. I’ve won awards for creative writing and debate, I scored a 9.0/9.0 in the IELTS and a 36/36 on the ACT, I took English Language at A level, I topped internationally on the ACER IBT, I’ve maintained writing as a habit of mine, and of course I established this blog so I could make a small literary contribution to my community.’

I was wrong, because for all my skill I still needed a lot of work when it came to essential bits like delivering on time — a problem I still struggle with, unfortunately, but I’m taking steps to rectify that issue.

The quizzes were easy, just true/false and short answer questions with no final exams or midterms. We were free to choose whatever topic we liked for our essays, provided that we notified the professor beforehand and got her approval. The class atmosphere was relaxed and we were all part of the discussion. There were several group activities. She was a bit strict with marking, so if your only goal is to get the grade then you’re probably better off with someone else. Also, I only ‘clicked’ with one or two tutors at the writing center, and overestimated how useful they’d be. Meeting with your professor during their office hours should be a lot closer to the first thing on your list than the last — especially if you need help.

Here’s my reflective letter:

I did not know my deficiencies so intimately before I took WRI 101. Once, during a volunteering event, I had a short conversation with a Doctor. He told me that I must cherish every loss because failure is worth its weight in gold. If failure is worth its weight in gold, then introduction to academic writing is more valuable than a king’s treasury.

By many standards, I am an excellent writer. I cannot attribute this to natural talent, and that is not merely a statement of humility. I have always loved stories, those grand tales of fantasy that reach beyond us into the stars and deep into us to strike at our hearts. With time, prolonged exposure to the work of this elegant craft’s masters has given me one or two tools to help me express my thoughts and emotions. Escaping into different worlds has become a regular indulgence of mine, and sometimes I am unable to resist the desire to pull someone else into a universe of my creation. Writing is a journey, a pilgrimage, an exploration – and a voyage is lonely without a companion.

The concept of an audience is not foreign to me. I have performed on stage for the entertainment of a crowd countless times, and I seldom disappoint. I bring energy to the podium for the benefit of my spectators, and they appreciate my authentic passion and unlimited confidence. My contributions to my school magazine were prolific, and the overwhelmingly positive response inspired me to start my own blog so that I wouldn’t have to repeat old stories via text messaging.

My sister hesitates before printing documents. She prefers reading on paper to reading on a screen, but is afraid that wasteful use of the printer is expensive and bad for the environment. I’ve told her that this quirk is pretty silly. What is more valuable? What costs more resources to produce? A stack of ink and paper, or a book? If you read it, it is not a waste. A printer is a wonderful machine – it creates value. It creates a product far more priceless than the pittance it consumes. She has relaxed her standards slightly, and now is able to print without being paralyzed by indecision.

What is an audience, and what is the purpose of ink and paper? How do we relate them? For far too long, I thought of an audience as a receptacle. My brain was a fountain of ideas, and writing was the act of collecting bottles from an overflowing spout. This approach works until the spring runs dry and no amount of trying can squeeze out another drop.

So my relationship with writing was much like that of a farmer who depends upon the rain for his crops. Days are good when water is generous, and the heavens are damned when a drought strikes the land. If writing is agriculture, then this course taught me irrigation. It taught me to bore holes into myself until I found a well.

I don’t think there is a single assignment that I completed on time. I worked hard and wrote a lot, but then didn’t constrain that output to the requirements of the submission. I accept responsibility for these faults. I would like to embrace those parts of me that cause me trouble, and listen to their whispers so that I may become a better man.

Discipline is the word that keeps finding its way to my thoughts. Develop your ideas, keep it relevant to the topic, keep the tone formal, remember that a good essay should aim to be a discussion instead of a dissertation. I find it so strange, you know? Deadlines and thesis statements. It seems almost artificial. It is artificial, and I recognize that sanitized writing is the best solution to some problems, but it seems premature in a course that’s supposed to teach you the basics. It is an unusual sensation, but not an unwelcome one.

Before this course, an essay felt wild – a force of nature, a ferocious beast. There was a muse inside of me that was silent until silence was too loud. I would pour my memories into a vessel that would greedily devour content indiscriminately. All my reading and all my learning was only service to the master that gorged on knowledge with an appetite that did not know satiation. When hungry it would punish me with pangs of boredom for not feeding its maw. So I paid tribute to the dragon. Oh, how its pleasure was sweet.

I could sense this presence within me. I was so familiar with its temperament that I began to merge with it, until I did not know where I ended and it began. There was always one state, however, that made the separation distinct. Every time I drew upon the dragon, there was that creeping sensation, a dawning certainty that I was approaching a tipping point. It fostered within me anticipation unlike anything I have ever known. It was a momentous event. The yawning chasm would groan, and the rivers of the world would reverse their direction. Tension, pressing, building, unbearable, expanding, overwhelming, encompassing, until pop!

The cascading release. The dragon gripped me, the muse woke, control was ripped from my stumbling fingers and I succumbed to the wishes of the being that commanded my soul. This was the dragon that visited me at night and tore the fabric of my mind so that I could see. I bore witness with unburdened limitless vision to the web of existence and the truth of the world.

The sheer clarity of this state in itself would qualify for a spiritual experience. I was awake. The lights were on. Doubt and deliberation were stripped away. I knew this gift was temporary. Infinite choices and paths all converged into one way forward. A bomb had gone off and I was being carried by the explosion’s shockwave. Mirrors had surrounded the sun, and all its mighty fire was concentrated into one coherent beam that detonated inside my skull. Urgent. Emergency. Desperation. I was possessed. I needed to write. I ran like a vampire escaping the edge of an eclipse.

Alas, such powerful compulsion cannot last. It is snatched back jealously no matter how much you claw and tug and beg. If you were to trap it in a box it would dissipate like the shadow of morning’s mist swept away by rising daylight. The dragon was but a figment of my imagination, a mythical creature from legends and fables I used to personify something more reckless and abstract. So strong it was, and yet so frail. Look at what it left behind, sparkling jewels embedded in a sprawling jungle. I am not an author. I am a gate. I was open, and so it left me.

Over the course of this semester, writing 101 has taught me how to train my dragon. It is still wild, still untamed, and still unpredictable. However, I am not so dependent on it anymore. It was difficult to unlearn the bad habit of haphazard commitment, and truth be told I’m still trying to get used to it. The dragon is an amazing multiplier, but I’ve been functioning and performing without it doing all the work for me. I hope that eventually my relationship with the dragon will develop into a mutually beneficial alliance where I am an equal rather than a conduit for its dictation.

I don’t think my writing will ever stop meandering from one place to another, because that freedom is a part of my nature. However, constant demands are shaping me into someone who can churn out work when it is necessary at a steady pace rather than filling up like a balloon and bursting with word confetti. Writing is a muscle. I had strength before I came to AUS, and I have been taught endurance. The latter often tends to be more useful.

The emphasis on learning rhetoric seems to be a curious historic holdover from the era when scholarship meant translating and interpreting the texts of the Greeks and the Romans. I recognize the merits of rational thought, but would have appreciated a more modern insight into the art. I understand that we are developing a foundation, but I question the presumption that the early insights are the elementary ones.

I did not deserve the kindness and grace that has been offered to me by Professor Huda Bakhour. Every extension, every minute of counsel, every character of feedback – her dedication and consideration were as clear as a machined optical lens. I am grateful for her assistance. Her virtues inspire me. I am proud to say that she is my teacher and I am her pupil. Without her patience, without her guidance, without her unbounded trust, I would have been lost on an unpaved road that twists and coils around itself. Woe be to me, there is no praise that will suffice to divulge my respect and admiration for her. Farewell, dear educator. Our contact in the context of this course was time spent forging a more meaningful character with a greater propensity for success. With this letter, I honor you. With this letter, I salute you. And with this letter, I thank you.

[End of Writing review. Other reviews lie beyond “Read more”]

Continue reading “Fall 2017 at AUS — Course reviews”