ates.dev

Profile picture

Hi! I'm Ates Göral. I enjoy writing code, tinkering with graphics, experimenting with electronics, and executing ambitious DIY projects. More…

Jump to: Projects · Blog Posts · Talks

I write about code, techniques, stories from the IT realm.

Responsive Canvas Rendering

A filled circle and an empty circle on an HTML canvas, with a zoomed-in view of the anti-aliasing at their edges.

Dec 08, 2024

Techniques for responsive canvas rendering to maintain crisp visuals across varying screen sizes.

Finished (mostly personal) projects in reverse chronological order.

Jump to: 2021 · 2020 · 2018 · 2017 · 2016 · 2015 · 2013 · 2009 · 2005 · 2003 · 2002 · 2000 · 1998 · 1992 · Blog Posts · Talks


event_stream_parser

Noticing a lack of a spec-compliant Ruby gem for parsing event streams (aka Server-Sent Events), I published this gem as part of my AI plumbing job at Shopify.

IKEA OBEGRÄNSAD Hack

github.com/atesgoral/obegraensad-hack · 2023

I hacked an IKEA OBEGRÄNSAD LED wall lamp to replace its graphics chip with an ESP32 and wrote some C++, JavaScript and WebAssembly to run my own graphics on it.


Airgap

https://atesgoral.github.io/airgap/ · https://github.com/atesgoral/airgap · 2015

Can we really get true analog/chaotic glitching with an entirely digital device? Using the screen as a signal source and the camera as a receiver, I experimented with transmitting a digital signal through the air, bouncing off random surfaces.

A source image is scanned pixel-by-pixel and the pixel value is drawn as a large square on the screen, close to where the webcam is. Something reflective (even the palm of a hand works) is cupped around the webcam and where the "signal" square is. After a calibration run, the image is transmitted through the reflector, picking up gnarly analog glitches.


IKEA FREKVENS Hack

hackaday.io/project/171034-frekvens-fjrrkontroll · github.com/atesgoral/node-omega-frekvens · 2020

I hacked an IKEA FREKVENS LED cube lamp to replace its graphics chip with an Onion Omega 2+ and wrote some C++, JavaScript to run my own graphics on it.


Binary Versioning

binver.org · 2020

A humourous spin on Semantic Versioning. I apparently had too much free time on my hands (and disposable income to buy a new domain).


MIDNIGHT TACTIX 3000

github.com/psygnoscapes3000/midnight-tactix-3000 · 2018

A multiplayer turn-based retro racing game we made with my friend Nick Matantsev during Toronto Game Jam (TOJam) 13. Using mobile phones as controllers over time-synched WebSocket connections, with the game rendered in GLSL.


MILENAGE

2017

While working at Myplanet (now Orium), I had the unique and exciting opportunity to implement major components of a cloud-based iMVNO solution for one of Canada's largest mobile carriers, subsequently open-sourcing several JavaScript packages with the client's consent. This endeavor focused on creating critical telecommunication components, bridging both Diameter and SS7/SIGTRAN through a narrow waist of JSON structures.

The project was among the most tangible and satisfying undertakings of my career. The real-time testing involved a physical phone and SIM card, and witnessing a successful registration blip on my real-time React dashboard the moment I inserted the SIM card was consistently thrilling.

The JavaScript libraries I published encapsulate functionality for manipulating Diameter AVPs, encoding/decoding ASN.1 structures, handling 3GPP authentication and key generation, among other tasks.


Starry Night

put.io Starry Night · 2017

This is a canvas-based animation I created to replace a large MP4 movie on the landing page of put.io. The project was a freelance commission by put.io.

I developed a tweakable version for the client to fine-tune the animation to their liking.


Dweet Player

dweetplayer.net · 2017

Dweet Player is an audiovisual sequencer for dweets (visual effects in 140 characters of JavaScript, in the demoscene spirit).

I love looking at and writing my own dweets. I wanted to string together a bunch of dweets and make them dance to some music. I created Dweet Player to sate that appetite.

Using an esoteric language in the query string, you sequence a bunch of dweets and apply timing and effects, and then specify an audio track. Dweet Player performs real-time beat detection of the audio track to make the dweets dance to the beat by morphing space (trig function outputs) and time (the requestAnimationFrame time stamp), as well applying some post-processing effects.

I gave a talk about this project.


BD1K

atesgoral.github.io/bd1k · 2017

A Boulder Dash clone in 1024 bytes of JavaScript (including the sprites from the original game). My contribution to JS1k 2017 - Magic.


Doorbell Ringer

github.com/atesgoral/doorbell-ringer · github.com/atesgoral/doorbell-nudger · 2016

A very roundabout way of ringing a doorbell through a mixture of: electronics hacking, Onion Omega, Python, Node.js, Twitter streaming API, QR codes, TOTP, Travis CI. A story of learning through self-inflicted problems.

I gave a talk about this project.


Human Resource Machine Solutions

http://atesgoral.github.io/hrm-solutions · 2015

Human Resource Machine is a fun, little, dark-humoured puzzle game that can either teach you assembly from the ground up, or allow you to apply your existing assembly knowledge in order to devise speed/size-optimized solutions to increasingly challenging problems.

This project started with me publishing my own solutions and then snowballed into a massive collaborative repository of solutions from some 80+ contributors. I've never had any of my open-source projects forked and PR'd this much.


Autonomous Cockroach

hackaday.io/project/171720-cockroach · github.com/atesgoral/autonomous-cockroach · 2015

This is the very first microcontroller (and IKEA lamp hack) project I did with an Arduino starter kit and (mostly) found parts. A LEGO drivetrain + two motors controlled by an Arduino Uno.


AngularJS Modules

2015

While working at Myplanet (now Orium), I wrote or co-wrote several AngularJS modules that we published as packages. They are all pure CSS & JS and are compatible with IE8+.

I also created their live documentation and demo pages.


#direnturkce

direnturkce.org · 2013

I have many pet peeves. I created a quick reference page for the most common misspellings in Turkish.


jsUnity.com

jsunity.com capture · github.com/atesgoral/jsunity · 2009

jsUnity is a lightweight, environment-agnostic JavaScript testing framework: It doesn’t rely on any browser capabilities and therefore can be used in any client-side or server-side JavaScript environment.

There were already several unit testing frameworks for JavaScript that were browser-centric. jsUnity aimed to just focus on JavaScript as a language that’s used beyond the browser context, at a time when Node.js was still in its infancy.


browsersize.com

browsersize.com · 2005

Browser resizing utility to aid in responsive web development.

It needs to be either updated or archived, as modern browsers have become more restrictive regarding the programmatic resizing of windows.


Photoshop Color Picker

Adobe Color Book File Format Specification · 2003

Adobe Photoshop's Color Picker has a Custom Colors dialog that offers a wide variety of colors from several industry-standard color catalogs such as ANPA, DIC, Focoltone and Pantone. The color catalog data comes from Adobe Color Book files.

Partly out of curiosity and partly because I needed the color data for a job, I went through reverse-engineering the file format since an official file format specification wasn't readily available. I have put together what I've come up with into an unofficial file format specification.


GRAFICA Obscura Experiments

Morphing Depth of Field · Multiple Synthetic Lights · 2003

Two Processing (ported to p5.js) experiments building on GRAFICA Obscura articles by Paul Haeberli.


Burrito

Download Burrito 1.0 beta Installer · 2002

With Burrito you can read and manage your e-mails with any FTP client! It acts as a POP3/FTP protocol translator -- it's actually an FTP server that translates FTP commands to POP3 commands and serves your e-mail messages as individual files. You can view, delete and copy your e-mail messages as if they were files on an FTP server.


Twofifty

twofifty.net · 2000

Constraints stoke creativity. In that spirit, this is a showcase of digital art, strictly 250x250 pixels in dimensions, contributed by many different artists. (My own works are published as "MaGnA".)

Twofifty garnered popularity in the early 2000's and was featured in several websites and print publications.

I used hidden iframes to inject JavaScript into the parent frame to achieve a SPA (Single Page Application) before AJAX was a thing.

This is a static snapshot of the once PHP+MySQL-powered website.


Win-Res-Q

Download Win-Res-Q 1.0 · 1998

Win-Res-Q (pronounced "win rescue") is a simple utility that restores (shows) hidden windows. It can be used for bringing back your "lost" applications after their taskbar icons disappear following Explorer crashes that used to frequently occur on Windows 98. It's also useful for exposing strange, hidden windows lurking around your desktop.


E-Res-Q

Download E-Res-Q 1.3 · 1998

E-Res-Q (pronounced "ee rescue") is a very simple, portable POP3 email reader. It enables you to selectively read and delete messages without having to download them all. It's ideal for getting rid of large messages that clog up your mailbox or getting rid of spam messages without even downloading them.

This small program has proved very useful back in the times when most of us still had dial-up connections. It's still a very useful utility for setting up quick access to your POP3 mailbox when you're temporarily using someone else's computer. The fact that it doesn't require installation is a plus. You just download the zip file, extract the binary and run it, punch in your account settings and you're ready to go!


Bootsector Columns

github.com/atesgoral/bootsector-columns · 1992

A Columns clone in 68000 assembly, for the Atari ST.

My initial intent was to fit it into the bootsector of a floppy disk (without any compression), but I overran the 450 or so free bytes I would have in the bootsector. I therefore ended up adding a bunch of text, graphics, and sound effects; and intentionally overran the limit even further (I went up to a whopping 1832 bytes).

The code could still run from the bootsector with a bit of cheating: I was storing the overrun in the FAT backup and therefore keeping the disk operational until a write operation on the disk would overwrite the FAT backup and screw up the game.


I don't have my own blog, but I occasionally write posts for other blogs.


Sidekick

August 1, 2023 · Shopify Engineering Blog

How to improve LLM chatbot UX by utilizing a stateful markdown stream processor.


Find the missing number

April 6, 2017 · HackerNoon

An intriguing JavaScript interview question about finding a missing number in an array of integers without sorting, and the unexpected elegance of a solution utilizing XOR.


While I'm not a frequent public speaker, I have had the opportunity to present a few talks in the past.


Killing Characters while Making Art

July 25, 2018 · CreateInTO · Slides

A talk about Dwitter, JavaScript golfing, and dweet rendering techniques.


Dweet Player

October 17, 2017 · Toronto Hack && Tell · Slides

A talk about my Dweet Player project. I won a Raspberry Pi as an audience award.


Unit Testing—The Whys, Whens and Hows

October 11, 2016 · Toronto Node.js · Slides

Talking about some best practices for unit testing in Node.js.


Doorbell Ringer

June 7, 2016 · Toronto Hack && Tell · Slides

A talk about my Doorbell Ringer project. I won a Raspberry Pi as an audience award.


Backend-less UI Development using Demock

March 16, 2014 · jQueryTO · Slides

A technique to transform any static web server into a simulated backend, capable of emulating various HTTP methods, generating different HTTP response codes, and mimicking latency.