Through this course I had the opportunity to meet a great many highly talented people, many of which taught me a great deal, particularly in regards to clear, professional communication and reporting. I learned how to demonstrate complex concepts effectively to non-technical persons and how to budget, write tender documents and read academic papers to a high level of competency.
In regards to programming, my studies covered a number of different languages including Python, C++, SQL and particularly C#, focusing heavily on object oriented languages and agile development practices. Meanwhile my independant studies dived into functional programming, particularly Haskell and Idris, as well as dabbling in Actor-based Languages such as Elixir and Erlang, and polymorphic languages such as Scheme/LISP.
Specific examples of the projects I undertook at university can be found below.
A thorough introduction to electronics and electrical principles, this course taught me a great deal not just about the fundamentals of circuit design and AC/DC systems, but also Integrated Circuit part selection, trace optimisation, motor design and wiring, microcontroller programming, and serial communication standards.
This course spurred my interest in electronics and in spite of focusing on programming and computer science, I still have a burning passion for circuit design and custom PCB manufacturing, which hopefully I can pursue in the near future. I also developed an interest in FPGA programming after following this course, addressing some of the limitations of traditional microcontrollers.
LBRY-C Logo - All Rights Reserved - Joshua Lewis Hayes 2020
An organisation I helped found to participate in the furthering development of the LBRY decentralised content distribution protocol, as well as its promotion to other sectors. As the company overseeing development of the project focused on the primary use case of video content sharing, LBRY-C was a community led group of developers and designers that prioritised utilising the full capabilities of a decentralised content management and distribution system that contains its own cryptocurrency, content validation and url bidding system, such as the distribution of paid content including web games, 3D models, and artwork.
One such use case were projects using the protocol as a decentralised source for music streaming applications, namely two projects, a web based varient directly created by LBRY-C called Soundbytez.io, and a desktop oriented version created by another developer called JellyBeatz. Additionally, there were opportunities to develop access to untapped demographics, particularly those in South American and African nations where internet access can be more limited and the low sum transactions available in a cryptocurrency model can be particularly beneficial in supporting those communities.
This organisation operated as both a news source and a focal point for the community to discover and promote new projects on the LBRY platform. This allowed for community oriented initiatives to thrive in the public eye and even with reduced operation amid the pandemic, the website, recently redesigned by myself, still receives thousands of unique visitors each month while it documents ongoing developments in the community. (Website: LBRY.Community)
The LBRY Foundation is a charitable organisation that was founded to seperate governence of the LBRY Protocol from the LBRY Inc controlled LBRY.tv and LBRY Desktop Application. Decision making is determined first by the Board of Directors and then by Councils composed of community members that are expected to be self managing.
I put forward a proposal for a completely external voting system that could provide not only a robust solution for vote tracking, but would also provide a public interface by which all votes could be viewed and searched through, allowing the general public interested in the Foundation's activities to completely transparently see the votes of every member and council that participated.
After being given the go ahead to develop a prototype, I did substantial requirement analysis and determined that rather than exactly replicating the present system, I could instead generalise sufficiently that any group registered could vote on topics relevant to them, allowing votes to have officiating bodies as well as relevant parties who might benefit or be substantially biased, particularly those receiving funding for a project through the Foundation, which it is worth noting at this stage that this project was not.
Following the analysis and given the complex, multi-directional relationships being represented, I determined that SQL was not best suited to the application and instead went ahead with deploying DGraph, which uses a Graph Database better suited to representing the system.
Unfortunately the project was then halted due to organisational changes that changed the requirements for voting and membership substantially.
This project involved repurposing and refactoring the react based web frontend for LBRY called Spee.ch from its initial limitations of fetching and displaying images from the LBRY peer to peer network to being a fully fledged music streaming platform, allowing those not on the LBRY Network to access and share their LBRY exclusive content on the web.
This required substantial refactoring of the site's React Components as well as the backend resource aggregation from the LBRY network, to allow for packetised media streaming. Stream caching was also in the works to allow for multi-connection 'room' style streaming for communal music listening, and a queuing system to allow playlists.
This was a great learning experience not only for studying React but also deploying, configuring and interfacing with MySQL on Ubuntu and CentOS virtual hosts, which was used for storing information about content uploaded directly via the application to the LBRY Network.
This upload/fetching system also required that the service include RPC protocols for accessing the local LBRY Daemon instance that would download and manage content, as well as maintain a wallet containing the LBC cryptocurrency required to upload content to the LBRY Network.
Unfortunately, however, development was halted permanently due to the original application being depreciated and a lack of documentation on migrating projects based on it to the new API. The code for the original application was also unfortunately lost due to server issues.
This assignment focused on futurology and using existing research to assertain the possible technological developments in the next 50 years. For this project, we decided on Neural interface technologies and demonstrated one satirical future use case. Meanwhile my report focused on analysing the real world research and ongoing developments to assertain how possible the technology is and how rapidly it is progressing to a point where such a satirical future could be a possibility.
This required an extensive dive into neuroscience literature and research papers, with the majority of the technological features described in the presentation being demonstrated as at least feasable in the near future. This includes direct stimulation of neurons and targetted dispensing of medications to treat mental illness, as well as artificially induced sensations and emotions.
As an exercise in writing an IEEE report, it was a rather enlightening experience, particularly where reading through the research excited me still further about the concept whilst tempering and directing my assumptions on the subject. Though this research, I not only had a much more substantial understanding of the topic but had a much clearer picture of where the technology would progress over the next decade, opening the way to exploring new opportunities in my own sector as a result.
The presentation, due to COVID19 induced Lockdown, was recorded seperately and then fully animated by myself to add character and properly satirise the concepts being considered. This video presentation can be found here and my full report on the topic here.
In this project, my group and I successfully designed, implemented and simulated a network transparent, security oriented, and modular Smart Home Hub solution designed to be integrated into the homes of vulnerable persons in need of long term living assistance, so as to bolster their ability to freely live in their own home.
The central hub implemented actor-style device firmware modules that could implement custom protocols over a network transparent RJ45/GG45 connection using direct MAC Address registration and full end to end encryption.
These modules could also implement fully scriptable control and feedback functions that a technician or family member could implement for security and convenience purposes, for example connected fire alarm systems being configured to automatically trigger an emergency services call from a connected telephone, or an under-carpet pressure sensor could trigger hall lights or intruder detection systems.
This also included a two layer access control system for protecting installer liability in the event of tampering, using secure cryptographic hardware keys via USB to authenticate users with script modification access. This prevents casual tampering and also allows for parental control over user level scripts, such as baby gate alarms and door locks.
The full design presentation slides can be found here, along with the project files of which I contributed the Core, Device Firmware Module and Script Engine modules, as well as designing the top layer communication protocol on top of my team's serialisation and MAC address communication code.
One of the most enterprising projects I've started, this set out to repurpose and expand on the media sharing capabilities of the LBRY platform by utilising it to create a more decentralised solution to modern web forums and image boards. Not only do many of these platforms still use php based backends from a decade ago, they face censorship and user verification issues regularly.
Liberum thus was aimed at addressing this situation and was built collabouratively between myself and a former classmate, who taught me a fair portion of what I know as far as programming is concerned. The entire project acted as a live web application not dissimilar to react, but instead written entirely in Idris, a functional programming language similar to Haskell that can compile down to a variety of languages including Javascript.
Though a more complex implementation, it did afford us substantial flexibility as well as type safety, something Javascript is notorious for lacking. I worked primarily on the frontend that remains to this day as a demonstration of the technology and my classmate mostly worked on the interface solution for the LBRY Daemon, which due partially to the lack of websocket interface, proved a challenge to interact with.
The project progressed, with myself getting as far as defining and fully implementing the thread parsing system as well as the tag filtering and user data management. Before I could fully implement the user public key signature system however, the project was halted by my classmate having to leave for military service and myself having to prioritise other projects for university.
However, the project can still be picked up once again should I have the time and inclination, and the live demo, which is generated dynamically, is still up and running on the website here, with the code available here
This was a pair of Discord-based bots which would process any and all messages from the official LBRY discord server, parsing for commands using a straightforward command indicator character, in this case '!'. Whilst the 'Wunderbot' had quite a bit of functionality, from moderation to role setting, I was able to contribute a fair bit to making the code a lot cleaner and more legible in general.
It was after getting familiar with Wunderbot that I realised the other bot 'Tipbot' was extremely limited for what it was and LBRY Inc staff were requesting assistance in making it more functional. Tipbot itself was essentially an interface to the LBRY Daemon, specifically to allow Discord users to all have their own accessible cryptocurrency wallet while in the server. This allowed for substantial benefits in welcoming new users to the platform and rewarding contributors by being able to directly and visibly tip users from within the discord.
As this was a service provided by a bot, any cryptocurrency provided was still in LBRY Inc's hands until it was withdrawn by the user. This meant being particularly hesitant to integrate any new code that could jepardise people's funds, particularly those they brought onto the bot themselves for the sake of tipping the community in shows of support. For that reason, much of my development was on a fork of the LBRY Tipbot for the purpose of using on LBRY-C's discord server, however as the featureset grew, I started cleaning up the code and upstreaming the changes.
Compared to the original functionality of tipping a single user, I greatly expanded the options available to a user, including tipping multiple users at once and even tipping everyone with a particular Discord role, which required a substantial dive into the inner workings of the Discord.js API. The staff were particularly grateful for the private tip option, whereby a user could send a tip and the recipient would be notified by direct message instead of filling the server with multiple user mentions.
Most if not all of my contributions can be found on my Github forks of Wunderbot and Tipbot, here and here respectively.Having a choice between doing the Computer Science and Games course programming tracks for university, I went ahead with the Games version, principly because the alternative was rote memorisation of Java and the games course allowed for much greater creative and programming flexibility. Though amusingly I did have to go back and redo the Blackjack game's menu system for demonstrating too advanced a concept for the first assignment, namely a function pointer lookup table as the main game menu.
Up until that point in time, I had only done C and Java style programming, so getting into C++ properly was an interesting learning experience and taught me a lot in particular about more abstract types and object oriented programming in general.
Blackjack was a fairly staightforward programming challenge with the greatest difficulty being reading up on the windows terminal interface in order to render colour and special characters. I was able to start work on a tiny rendering engine for the platform that could do sequential line and rectangle fills then overlay text. Whilst rudamentary, this engine would be further developed in the Phantasmagoria text adventure game to solid effect, with a completely abstracted and platform agnostic rendering interface.
One of the limitations of Phantasmagoria was that the interactions were hardcoded, including conversations, and since then in my spare time I've been redesigning the whole thing as a small scriptable game engine on which the story of Phantasmagoria is just one possibility. This means developing a full scripting language suited to embedding in human readable text files, with each room essentially a multi-linked graph of 'Interactions', which represent any single interaction tree and through the scripting system and passed flags, can monitor world state and define the program's control flow, including the options available to the player.
Whilst the above is a work in progress, the original code is available here.
One of my earliest major endevours in discrete circuit design, involving manually implementing full control logic in hardware for an RFID Card based monster building game, including location based mutation Logic and a full hardware design for the control hub, including pcb schematics and trace layouts. Learned a lot about display multiplexing for Complex RGB LED arrays, serial and USB control protocols, RFID/NFC technologies, and the limitations of discrete logic compared to software implementation.
A valuable experience in sensible part selection as well as cost effective circuit design, as well as clarifying the need for precise requirement analysis before beginning a project, given that it was likely unnessicary to use so many discrete components in the design. This was the result of attempting to use the Propeller microcontroller, a cheap multi-core microprocessor that, while highly versitile, lacked the quantity of IO pins required for the project and thus nessecitating more discrete components to allow for serialisation of the custom display modules.
However, this only spurred my interest in designing electronics and has lead on to many side projects during my higher education, particularly regarding high throughput USB devices. Sadly budgetary constraints for the department at the time prevented physical implementation of the original design, and I no longer have the design files, only the original powerpoint presentation for the project concept, which is lacking the presentation notes to go alongside it.
DIY Tripod Motorisation with Fusion 360
I've had a recent surge in passion for astronomy, particularly invoked by my recent 3D printer purchase finally giving me the chance to potentially replace the terrible mounting system for the telescope I own.
The chance to design your own perfect GOTO motorised telescope solution is a great opportunity for anyone with a passion for electronics and CAD, but the cruel reality of physics requires that any such mechanism actually be built to fit the hardware it attaches to.
Thus I've been busy modelling the base of my telescope's hefty tripod in Fusion 360 so I can properly design the bearing and gear arrangements that'll keep my precious optics aloft and at the angle I need.
As it turns out, replicating the peculiar shape of my baseplate was a bit beyond what Fusion 360's Loft function was happy to achieve, but I managed to put together a reasonable dimensionally accurate model to work off of when designing the motorised components.
FPGA Test Board Circuit Analysis
Today I got the particularly rare opportunity to explore a high end FPGA development board, though I can't exactly share specifics. Certainly the device was orders of magnitude out of my price range, so helping someone else ensure theirs doesn't blow up due to connecting the wrong pin to the wrong voltage was an interesting experience.
It was a nice change of pace to dive back into circuit design, even if it was just to help a friend identify connectors and read understand the power constraints of the circuit. The sheer throughput and potential energy consumption of these little chips is facinating, with this the quad module power board built to readily be able to supply 4 Xilinx Virtex+HBM boards with 450 watts at 12 volts, yet only 9 watts for 3.3 volts, pulled exclusively from the host computer's PCIe slot.
Despite this peculiarity, it was an extremely robust board and I for one would have loved to take a crack at the sort of experimentation you can get up to with such a device, which is unsurprisingly sold with a focus on cryptography and designing more efficient and performant cryptocurrency mining ASICS.
3D Printing with the ENDER 3 and Fusion 360
Since I purchased the Creality Ender 3 recently, I've been eagerly at play like any kid with a new toy, printing out a variety of designs that caught my interest. I've also dived head first into proper CAD workflows, particularly spending a lot of time examining the available options for CAD solutions and ending up at using Fusion 360, which is free for me as a user who isn't producing anything valued at $10k or more.
While their licencing scheme isn't perfect, they certainly have the general user experience set up a lot better than most other softwares of the same type. Coming from a Blender based 3D Modelling background, it is fair to say that the learning curve of a parametric modelling system is a bit steep, but certainly not without its benefits.
Constraint based modelling can be incredibly powerful if used correctly, though I feel it's fair to say that it comes with limitations, such as the honestly quite poor performance even on a solidly mid-tier computer, and the sometimes particularly limited methods of describing curves, champhers and embossed features. Heaven forbid you intend to engrave text with a V-cut champhered edge. It turns out that serif fonts are anathema to Fusion's otherwise useful toolkit.