adam.png

Hi, I'm

Adam Richard Limb

I use these languages:

You can contact me on:

And I like these frameworks:

Since July 2021, I've been working on:

Clinical Trials

Frontier Science Scotland

Currently, I'm employed at Frontier Science Scotland as a Statistical Programmer!

My responsibilities are:

  • Implementing and contributing to SDTM specifications.
  • Generating outputs and making deliveries to partners.
  • Working as Mainline and QC across multiple projects.
  • Automating our processes, such as Risk Assessment and Test Matrix output.
  • Assisting more junior members of the team in learning the codebase.

From February 2020 to July 2021 I worked on a:

Graduate Programmer Course

Katalyze Data

Before I worked at Frontier, I undertook a Graduate course, achieving a SAS Base Programmer qualification and learning Python and R. I then took on a six month placement at Frontier Science Scotland, which grew into full-time employment.

I learned how to:

  • Use SAS to clean, display, and derive crucial insights from data.
  • Use Python to stream information from APIs, manipulate that information and display it with frameworks like Pandas, Matplotlib, and Scipy.
  • Use R to create complex derivations, such as Kaplan-Meier estimates - which I used at Frontier for our analyses.

Presently, I'm working on

Decision Network

Decision Network is a modern media opportunities platform. I began writing it in 2022, and it's grown to be my largest project yet, utilising all the skills I've garnered over the years. It utilises a Spring Boot backend with Vaadin for server-side rendering. It is connected to a network via Docker to a Grafana instance for Observability of logs collected by the Loki service, a Keycloak instance for OAuth2 Single Sign-On, and a Postgres database with three separate schema for each of these services, with the Spring Boot application using Spring Data JPA and Hibernate to handle data objects.

  • Used Docker to network over 4 different services
  • Wrote a number of Spring Data JPA Entities
  • Used Spring Boot and a variety of its addons, such as Spring Security
  • Implemented OAuth2 to allow Single Sign On through Keycloak and identity providers such as Google
  • Used Hibernate to create, read, update and delete data objects
  • Wrote a variety of Data Access Objects to abstract out implementation and enforce encapsulation
  • Wrote custom SQL to overcome edge cases Hibernate could not handle
  • Embraced Test-Driven Development, writing a suite of tests to ensure functionality across versions

In September 2023, I worked on:

Portfolio Website

I wrote this website in SvelteKit in order to hone my Typescript and Web Development skills. After using React for Pomodoroiser, I wanted something more intuitive for a quick project like this. I was delighted to find SvelteKit to be so simple.

  • Wrote a Python script to automate writing typing CSS animation you see above
  • Created a number of re-usable components, such as this Project component you're reading right now
  • Wrote CSS to animate text, organise elements, and create a responsive display

In June to July of 2023, I worked on:

Graphics Automation

Turning my hand to Python software development, I wrote an application to automate the creation of graphics for a media outlet I was working with on the side. I was working on a per-graphic basis and found the work to be repetitive, so I automated it using Tkinter, Javascript, and a community package called Python Photoshop API!

  • Derived an algorithm for ensuring text was sized correctly
  • Turned my Photoshop inputs into Javascript, then altered that Javascript for re-use with any graphic
  • Used Python to parse JSON into objects, and vice-versa
  • Used Tkinter to create a GUI to navigate the file system and create a tree hierarchy of graphics

In May 2023, I worked on:

PlAIbook

Inspired by the Politico Playbook, the PlAIbook is an attempt to make political news concise using AI, as well as for me to learn a thing or two about Django and AI. With a Vue frontend and a Django backend, this project scrapes the RSS feeds of news websites, sends the result off to a large language model, and condenses it down into less than ten sentences, with the exact quotes from the article included so you can know exactly what was said.

  • Created a Vue frontend to display articles
  • Wrote Python code to scrape RSS feeds
  • Used ChatGPT endpoints asynchronously to summaries articles
  • Used Docker with RabbitMQ and Celery to schedule CRON jobs for the scraping of articles and insertion into the database
  • Wrote an API to request the articles from the backend database
  • Created a Vue frontend, lazy-loading the article summaries from the backend and displaying to the end user

From April to May of 2023, I worked on:

Pomodoroiser

The Pomodoroiser is a tool to take a YouTube playlist and convert it into a 'pomodoro' - a 25 minute work time broken up by a 5 minute break. The project also allows you to define how long you want your work sessions, and how long you want your breaks! This was my first foray into modern frontend development, and using React alongside node.js showed me just how powerful functional programming could be. Coming from the world of verbose and strongly-typed Java to succinct and untyped Javascript on the backend made me question a lot of my understanding and thoughts on what programming could be. While Python remains my go-to language for quick scripts, I always find myself drawn back to Javascript every so often for the speed at which I can progress a task.

  • Deployed a React Frontend with Node.js backend via Docker
  • Implemented an API to communicate between them
  • Utilised REST endpoints to retrieve and process lists of videos
  • Implemented a bin-covering algorithm to sort videos into lists of equal length
  • Implemented playlist and video shuffling for unique experience on the same playlist
  • Wrote frontend code to handle internal state of playlist, updating as video played, switching between playing mode and break mode
  • Used three.js to create an animated background
  • Made a pomodoro 3D model for animation

From February 2020 to June of 2021, I worked on getting:

SAS Certified Specialist: Base Programming and Python/R Datacamp Courses

At this time, I began my Graduate scheme which was an intensive one year course to learn SAS, Python, and R. Following that, I undertook a placement with FSS. Doing 8 exams in 12 months meant I had to quickly develop problem-solving skills to ensure I could get through the course content at a speed which ensured I would pass, and being exposed to three languages at once broadened my horizons on just how many different ways there were to solve difficult data analytical tasks. A lot of these skills proved to be highly useful once I undertook my 6 month placement after achieving my SAS certification.

  • Earned SAS Certified Specialist qualification after passing 8 exams in 12 months
  • Mastered basic SAS concepts like data and proc steps, LPDV, and macros
  • Grasped fundamental SAS programming constructs such as loops
  • Understood core functions like scan, cats, and catx
  • Dove into advanced SAS macros and varargs usage
  • Explored unique data types including arrays and hashmaps
  • Managed file I/O, libraries, and utilized proc import/export
  • Practiced data manipulation and visualization techniques
  • Studied statistical analysis methods in SAS
  • Integrated SAS with languages like Python and R

From January to March of 2023, I worked on:

Discord Bots

To practice my Python, I decided to write Discord bots for some friends, these projects introduced me to data structures such as N-ary trees, which were perfect solutions for assigning hierarchical roles. I also learned more about Application Programming Interfaces, as well as asynchronous processing via the web.

  • Used Google App Script to automate posting of Google Form results
  • Wrote a Python bot to process users - assigning them in a hierarchical fashion
  • Parsed and wrote these roles to a JSON for ease of redeploying the bot

From February to July of 2021, I worked on:

Void Engine

A Java game engine written with the Lightweight Java Game Library with graphics from OpenGL. I decided to throw myself in the deep end and try and write a game engine with Java. I learned a great deal about object-orientation, but the project ended up dying as after 2000 lines of code I only had a very rudimentary project, and I began my full-time employment.

  • Wrote a renderer and shaders from scratch using OpenGL
  • Wrote code to map co-ordinates from textures to objects
  • Created an entity system for handling entity properties
  • Wrote code for the writing and reading map data to display user-created maps

From September 2020 to May of 2021, I worked on getting:

Oracle Certified Professional: Java SE 11

For Java's 20th anniversary, the Oracle foundation offered Java qualifications for just £20. I applied, having already written some Java in my free time. For the next few months, I spent my evenings solving Java problems in order to ensure I was ready for the exam. Alongside this, I also worked on VoidEngine to give myself something I was passionate about to motivate me to write Java outside of rote problem solving. In those months, I learned a great deal about Object-Oriented Design, SOLID principles, as well as design patterns.

  • Basics of Java: operators, type system, JVM, garbage collection
  • Java operation flow: loops, scopes, local variables
  • Object-oriented concepts: classes, interfaces, enums, methods, lambdas, inheritance, and generics
  • Advanced Java features: annotations, Generics, Collections, Assertions, I/O, JDBC
  • String handling: String pool, StringBuilder
  • Functional programming: functional interfaces, lambdas, streams
  • Exceptions handling: both checked and unchecked
  • Modules: compiling and usage
  • Advanced annotations: custom annotations creation
  • Date and Time handling with localization
  • Concurrency: multi-threaded applications, synchronized keyword, thread utilities
  • I/O: file and internet streaming
  • NIO2: path resolutions, file and directory operations
  • Database connectivity: JDBC, PreparedStatements, SQL security