YASP: Hello (Again!)

Hi! Welcome to this first episode of YASP. Yes, itā€™s a podcast. I could only really keep talking for 18-ish minutes before I thought I got too boring. I hope you enjoy!

Upgrading Ghost 0.x to 3.x

Hello!

As some of you know, I freelance. I was recently tasked with upgrading a self-hosted Ghost instance from 0.11.2 to the latest version (at the time of writing, 3.40.8). As the instance was run on AWS using Bitnami, it was a lot simpler and I didnā€™t have to fiddle a lot to get the server up and running.

Although I initially thought itā€™d be a simple job, it turned out to be a lot more complex than exporting a backup, copying over images and then configuring a mail server.

First off, thereā€™s no direct upgrade path between Ghost version 0.x and =< 1.x. Youā€™re unable to upgrade in place, or even export a config file from a pre-1.0 Ghost instance and import it into a fresh one running the latest version. Instead, you need to convert a 0.x config file by importing it into Ghost v1.x, and then export it and import it into Ghost v3.x.

In my case, I imported the config file to a local v1.22.2 instance of Ghost installed using ghost-cli@1.11.0 running on npm 8.17.0 through nvm. This is incredibly important to note, because it seems like v1.x of Ghost is extremely fiddly to deal with and was never upgraded to handle Node 10. Thank you to the answer here for helping me figure all this out.

nvm install 8.17.0
nvm use 8.17.0
npm i ghost-cli@1.11.0
ghost install 1.22.2 --local

Quick side note: Although a patch was promised, diving into the commit history it seems the next release of ghost-cli (1.12.0-beta.0) actually phased out support for v0.x of Ghost.

After setting up, importing and exporting the data from my v1 instance in the Labs tab, I had a file compatible with a newer version of Ghost. After setting up a new Bitnami instance with Ghost, I imported the new config file and set everything up. I also moved the images through scp into the opt/bitnami/apps/ghost/htdocs/content/images folder.

Another quick side-note. If you ever get locked out of a Ghost instance, and you have access to the backend, then log into the database. When Ghost uses mysql, the brute table holds login attempts. Select all the rows in the database, try to log in again, and see which attempt counter increments. Drop that row, and your timeout resets!

I had to import Subscribers (now called Members) separately, after activating and customising the feature under the Labs tab. All that was left was to configure SMTP credentials and Mailgun credentials for Ghost, and set up an SSL certificate, and I was done!

Setting up an SSL certificate was extremely simple, and I had absolutely no problems using the automated tools Bitnami provided. I certainly didnā€™t have to consult a forum answer from 2017 to help me get around an infinite redirect issue.

At the end of the day, I learnt quite a bit about SQL, Apache and Ghost. It was all an extremely frustrating (yet fun!) experience and I get paid for it!

I know a couple of people who are looking to start their own businesses, and I have a few pieces of advice

Value Yourself.

Some clients are nice, and others are horrid. I started out working for people who paid me an extremely low wage for work that needed years of experience. Donā€™t do that to yourself. If someone doesnā€™t value your time, then please donā€™t do business with them. Youā€™ll thank me later

Dive in Head First.

Itā€™s the best way to learn something! On this project, I dealt with an SQL server on an AWS instance.

Although I had a bit of experience with EC2, as Iā€™d hosted a Discord bot on it, I had never dealt with Apache and SQL. Iā€™d heard of Ghost, but I never really used it. I dove in head first, and picked up quite a bit from working in the real world on a real project.

Bounce Ideas Off Others.

Run ideas past your friends. Seriously, though. Bouncing ideas off other people helps you realise how absurd (or genius) your suggestions are. Explaining the problem youā€™re trying to solve, as well as your approach to it, also helps other people suggest solutions.

Measure Twice, Cut Once.

Well, in this case, plan twice and code once. Nothing sucks more than abandoning an approach youā€™re taking to a problem halfway through. I couldā€™ve saved myself a whole lot of time and headache if I read some documentation and figured out that thereā€™s no way to upgrade from Ghost 0.x to 3.x in place. Justā€¦ read the docs.

Tinker.

Never be scared to follow your gut, and have a bit of a poke at things. Try to figure out how things work. If you think something might work in some way, take a look and try it out. (Obviously, donā€™t tinker with anything mission critical, though!)

Look at the results of databases after carrying out certain operations on the front end to see whether your hunches are correct. Try to guess. Although it seems silly, design decisions (also known as ā€œbest practicesā€, some of which are just convention) are replicated all over the place, across different pieces of software. Being able to look at something from the outside and take a good guess as to how it works on the inside is an important skill, and this is one way to train it.

Communicate With Your Clients. Clearly.

Most of them arenā€™t that scary. Once you get the hang of speaking to one or two, youā€™ll be able to handle anything thatā€™s thrown at you! Itā€™s important to remember that if your clients canā€™t take the time to speak to you, then theyā€™re not worth your skills and expertise.

Never be afraid to ask for clarification and always communicate with them. Itā€™s your job. Even if your client doesnā€™t seem that technical, theyā€™ll most likely appreciate being kept in the loop.

Also, avoid jargon. Even though youā€™re a software developer and your tradeā€™s in communicating with computers, the art of business is in communicating with people. Most clients notice I use an informal tone of voice. I even sign off (almost all) emails with ā€œCheers!ā€ instead of a stuffy ā€œYours sincerely,ā€ because Iā€™m human. The Monzo (yes, the digital bank) style guide is very interesting, and I suggest you give it a read if youā€™re interested in communicating more clearly with clients.

Letā€™s be honest, communicating clearly also makes it seem like you know what youā€™re doing (even though you might not).

For projects with formal requirements, youā€™ll obviously need to check in with your clients at large milestones. However, on smaller projects where there are no milestones, itā€™ll be up to you to figure out when to communicate with your client. I recommend you split the project up into steps, and speak to them after youā€™ve completed each. Explain what youā€™ve done so far, what youā€™ve just accomplished, what it means, and what youā€™ll do next and what you need. It really helps.

For this particular project, my client and I exchanged about seventy-two emails in the space of three days. Obviously, nobodyā€™s going to do that normally, but he enjoyed speaking with me and I enjoyed speaking to him.

Keep in touch, and check in on your project and previous clients. Often, when it rains, it pours.

Be Nice.

Being nice to people opens so many doors, and provides so many opportunities. Never forget that at the other end of that phone line or email, thereā€™s someone who has to make a decision about whether to continue engaging your services. Having a little courtesy goes a long, long way.

The Handbook: Failure

Heya!

I donā€™t celebrate, but I wish everyone a safe, sound and Merry Christmas. Please do take care of yourselves!

I know youā€™re expecting updates about my life (even though nobody really cares) and I should have a three week mega-update about Weeks 9, 10 and Holiday Week 1 up soon! Yes, I know I have been a but slow Iā€™ve been hacking away at coursework that Iā€™m behind on. I havenā€™t forgotten about you guys, though. Thank you to everyone Iā€™ve met, especially Flat E, for being the best company while I navigate this new experience of University.

I thought Iā€™d do something a little special for this week, involving a little bit of reflection. Being at Warwick has allowed me to meet many new people, to learn and to grow. Therefore, the least I can do is write about the things that others may find obvious but that Iā€™m completely oblivious to because Iā€™m special brand of complete idiot. Iā€™ve wrapped it all up in a neat little guide for my reference (and your enjoyment), The Handbook.

(Quick side note: Adam, Iā€™ll start as many series as I damn well please. You canā€™t stop me!)

Failure Isnā€™t Bad (I Promise!)

Failure is an inevitable part of life. Youā€™re human. You wonā€™t succeed at everything. Coping with failure, though, is often difficult.

Even though it seems obvious, I wish someone had told me that failing at something is only a reflection of your ability at a particular time. Failing at a particular task means you didnā€™t do well in the restrictive window you were assessed in, but it doesnā€™t necessarily mean youā€™re bad. It simply means you didnā€™t do well at that specific thing, under those specific conditions, at that specific time.

We all must prove, and use, our skills at some point. However, failing to prove your skills through a piece of course coursework, or an exam, isnā€™t necessarily the end of the world. Failing doesnā€™t mean youā€™re a failure, but it simply means you need to improve. Be less hard on yourself. That being said, feelings of failure can get especially difficult to handle when compounded with difficult personal circumstances, or impostor syndrome, or bad mental health. Please try to take care of yourself.

Coping with Failure

I think everyone struggles with this at some point. Hopefully recounting the ways I cope and overcome might be useful for someone.

Speaking to someone, be it a trusted friend, family, a tutor, helps more than you might think. Someone taking their time to listen to me makes me feel valued, and reassured that someone cares, even if itā€™s just in that moment.

Thinking about what Iā€™ve achieved, and even the smallest things that have led up to me being here, is also useful. Reflecting on starting a company, writing software thatā€™s used every single day, getting into University, becoming more sociable, and so much more reminds me that Iā€™m a good person whoā€™s done good things. It also reminds me Iā€™ve overcome failure and navigated fuck-ups in the past.

Obviously, this sort of thing varies from person to person and from situation to situation, and is difficult if you suffer with impostor syndrome. While I sometimes do think I am good at stuff, sometimes I doubt myself heavily. Your results will vary.

Find some sort of baseline to return to. This may be difficult for people who donā€™t even know what their baseline is, but still. Trying to establish some sort of base point which I put real effort into coming back to is really useful for handling all sorts of emotions.

Do something else for a bit. If the deadlineā€™s passed, then take some time and do something else. Code, cook, do some washing up, clean up, laundry, go out to the park, go shopping. Your life will go on, even though you havenā€™t done well at this one thing. It really isnā€™t the end of the world.

Cry. Enough said.

Singing obnoxiously loudly is also incredibly useful for coping with failure and stress. Do it while on the phone, and have someone else suffer with you.

On an end note, please do take care of yourselves mentally, physically and emotionally. Make sure everyone around you is too, because, now more than ever, itā€™s important for us to take care of one another.

Week 7 (& 8) Are Over

Iā€™ve decided to roll these two weeks up into one post, as I havenā€™t had that great a time and theyā€™re both quite a blur. I didnā€™t do too much, I feel like Iā€™m struggling with my mental and physical health, getting accustomed to Coventry and such, and it has been rather difficult. For these past two weeks, I mostly tried to focus on work, although it didnā€™t turn out so well and I havenā€™t achieved much.

I tried to hit the ground running on the CS132 lab sheets, but I eventually ended up stalling. I also completely forgot to eat during Week 7 (fun!), and I didnā€™t attend many lectures or labs during either week. I have been falling behind, although I have a plan to catch up over the Christmas break. Hopefully I can execute it!

Iā€™d like to thank the rest of Flat E, namely Jenny (I love you, Amy! Please, come back.) and Adam (Iā€™ll be getting you those pens soon, mate), for helping me stay sane. Iā€™d also like to thank Codethulu and Jibsack for being some of the best library buddies there are.

If youā€™re looking for riveting content, I suggest you check out the other blogs from other members of Flat E, including Felix, Katie and Adam.

Iā€™ve got to catch up on some CS132 lectures, complete some coursework, and get myself feeling a little better! Iā€™ll definitely be back next week with the actual content youā€™ve subscribed for.

Also, hereā€™s a photo of Porridge, courtesy of Krystal.

Photo of Porridge!

Week 6: Productivity? Nah.

Hiya! Another week, another check-in.

This week wasnā€™t particularly exciting, but what can I do? I donā€™t even know why people are interested in this! Iā€™m the most boring person ever! (Well, second most boring. If you want content that really puts you to sleep, check out my friend Adamā€™s blog. Honestly, though, heā€™s brilliant, and you should really check him out.)

Monday

This week started off productively, and I hit the ground running after completing and submitting some CS118 problem sheets. Iā€™m trying to get myself together by tackling a module a day, although I can admittedly carried away with commercial work.

I also viewed and engaged with the ASV meeting on Monday evening. The watch party on our Discord server was really enjoyable, and I want to thank everyone for making that an absolute success!

Tuesday

The first order of business on Tuesday was to vote on the five motions put before the student body by the Studentsā€™ Union. As much as I dislike the motions put forward this term, as well as the way the SU functions, I took a moment to vote and I hope you all did too!

As teased last week, Iā€™ll discuss my views on student democracy and a possible platform for student leadership in Sundayā€™s post. Put simply, I believe it is extremely important for students to engage in the student democracy. However, I also believe that the studentsā€™ union should work for students, which is why I chose to abstain from all motions which didnā€™t directly affect student life at Warwick.

I also tried to hack away at some Professional Skills reading, without much success. My productivity and attention tend to taper off as I make my way further into the week, and I feel I really need to address that. However, Iā€™ve always been an eleventh hour sort of guy (famously completing a two months data science course in the final week, and passing with honours), so I feel like if I work on it constantly, Iā€™ll eventually find an approach that works for me that I can stick to. Iā€™m still nervous about failure, though, as I always am.

Wednesday

I spent Wednesday reviewing my material for my computer organisation and architecture module and getting a start on the coursework, as well as attending maths lectures. Iā€™m honestly terrifyingly behind on the discrete maths, and I donā€™t know what to do. I also spent today perfecting a script to join lectures from Echo360 into MP4s which can be downloaded onto a device to watch anywhere. Makes my life much, much easier, especially when I donā€™t have an Internet connection.

Thursday

On Thursday, I visited Krystalā€™s house to see her (and Porridge, whoā€™s buried themselves in their enclosure!).

She pre-ordered an Xbox Series X delivered, and I thought I might join her to break it in! Plus, everyone needs a little company every now and then. It was nothing but a pleasure to visit her for two days, and Iā€™m sorry I had to head back before the weekend even begun.

Krystal, your sofa is also the comfiest Iā€™ve been on. Thank you for the blanket and the pillow, too!

Friday

Friday was pretty eventful. I got a call from my brief favourite tutor (praise be), got to play the next-gen Xbox, got a grade for my coursework and got a (tentative!) job offer.

I played two last generation games on the Xbox, and they are absolutely stunning on an 1080p 240Hz screen. The Talos Principle and Quantum Break are gorgeous and visually rich games, even though theyā€™re last generation. Theyā€™ve both got amazing storylines and I recommend you check them both out if youā€™re into narrative games.

Although I really like the Xbox Series X, I donā€™t think Iā€™m gonna go for a console this generation. I think a Ryzen build (which might be coming soon!) would be much, much better than anything either console has to offer.

I think Microsoft shot themselves in the foot by purchasing so many brilliant studios which produce so many amazing games, as none of them are truly exclusive to Xbox. Theyā€™re on Windows too, which means I think Iā€™m better off dropping Ā£900 or Ā£1000 to build a PC to play next-gen games, and using it for other things (like video production, ahem) too. I also donā€™t see the point of Xbox Game Pass, but thatā€™s a story for another time.

I also received a grade of my coursework, which was 78%, and Iā€™m rather happy about that. I expected to get a bit lower, as I havenā€™t really been keeping up with lectures and Iā€™ve mostly been working off the books and my programming knowledge. The grade was also accompanied by detailed feedback, so I know exactly what I need to improve for the second coursework submission.

I got a tentative job offer working full-time for a start-up in California, which Iā€™m really excited about! Once investment goes through, I should have a position, but weā€™ll see. Nothingā€™s set in stone, but Iā€™ve got my fingers crossed.

I remember I almost walked out on my first interview with them as I was so nervous that I was crashing, bombing and making a fool of myself. Now, Iā€™m on a pitch deck being passed around to investors in the United States. Iā€™m really happy that I can trust my gut, but Iā€™m also scared that things will eventually fall apart because I feel Iā€™m just faking it ā€˜til I make it.

Impostor syndrome, boys. Itā€™s ugly.

Saturday

Today I mostly spent working, speaking to clients, writing code, issuing invoices, bookkeeping and putting together a plan to tackle my modules over the next week. Absolutely riveting stuff, honestly.

Reactā€™s being a fucking pain, but Iā€™ll figure it out!

I also got the delightful news that Porridge has finally popped out of their hole, so the next time I go to see Krystal, I can also say hello to (and know the sex of) my furry, eight-legged friend!

Iā€™m also considering building a poll bot for Discord which is ad-free and allows custom emoji, and just throwing it up on a GCP instance! If you have any ideas about additional features, please let me know. Iā€™m also considering starting a series where I walk through building an open-source project and detail the how, what and why. I donā€™t know whether thatā€™d interest anyone.

Iā€™ve also been thinking about whether to take a year in industry, and what I should do. Although I have a few ideas, Iā€™ll have to see what happens! Maybe starting a company was the right thing to do!

Next Weekā€™s Goals

For next week, I plan to

  1. Mark the maths sheets before Monday
  2. Complete at least one question for the COA coursework
  3. Speed run mathematics lectures, and complete at least 3 of them
  4. Watch the COA lecture before Thursday
  5. Write some code for one clientā€™s MVP and hit the next milestone, and build a blog posting bot for another
  6. Plan a Ryzen gaming build with PC Parts Picker
  7. Write a Discord bot and open-source it
  8. Start writing a plan for the MyMind charity
  9. Organise this blog a bit, by adding date and tag fields in the headers