g3rv4

A blog sporadically written by a very lucky passionate nerd

After setting up my Mastodon instance on Hetzner, with only an IPv6, I wanted to move a couple droplets there. But they all use Docker, and… having Docker work in a host with only IPv6 connectivity wasn’t as straightforward as I expected.

It’s incredibly hard to find a library to build PDFs on C#, so what if we cheat? Puppetter Sharp is awesome, and we can (ab)use it to just generate PDFs.

I use 1password for all my secrets. What would happen if I forgot my master key? or if both my computer and phone got stolen? Up until a couple weeks, that would have been terrible.

I started playing with Azure Pipelines, and while it looked great, the lack of caches and inspectability on Microsoft’s agents made it clear that I wanted self-hosted agents. BUT I didn’t want to pay for a machine that I will only house a couple of hours a month. In this post, I touch on my motivations, the challenges I found, and how I made it work.

Slack revamped their app… and lots of those changes make it harder for extensions to interact with it.Since the main goal of Refined is to make my life easier, I’m stopping its public distribution to avoid playing a cat and mouse game that I can only loose.

macOS has Gatekeeper… a mechanism to prevent users from installing software they’ve downloaded UNLESS it’s signed by a developer enrolled in they program AND they’ve shomehow verified it’s not extremely malicious. I’ve read it’s not that complicated to do it when building Cocoa apps, but the story is different for a Go application.

I’ve been wanting to migrate from Chrome to Firefox for a while now… but I use hangouts and meet and they… don’t work great with Firefox. So I built OnChrome: a Firefox extension where I can specify the sites I want to open in Chrome. The extension just launches Chrome when I visit one of those sites.

This is a conference like no other. Are you looking for interesting talks? check. Are you looking for a memorable experience? check. This conference will 🤯 you (and I don’t use emoji lightly).

While working on Refined (my browser extension to personalize Slack) I realized just how easy it is for an extension to go rogue. In this article I explain how a malicious extension dev could really steal your data.

Less than 2 days after announcing BetterSlack, I got an email from somebody on Slack’s Legal team informing me that the extension was in violation of their Acceptable Use Policy.Injecting javascript into their website is a no-no according to them. So I unshipped it (spoiler alert: we worked it out and it’s back under a new name).

I built a Chrome extension that makes Slack even better :) It was called BetterSlack and it got unpublished following Slack’s Legal Team’s request. On this blog post I announced it.

I love Jekyll. It’s not only straightforward to use for web developers and it’s extremely extensible. But, once you have a bunch of posts, it can get slow.This site was taking 16s to build on my local environment, so I wrote a plugin to only generate the posts I’m working on, and now the whole thing takes less than 2s.

So far, I’ve enabled htmlwidgets on 3 Jekyll based blogs, authored with RStudio. It’s been harder than I anticipated, and I learned a couple things that I think could be useful for other people.

If you have a shiny app, you don’t pay for the pro version, and you want to detect mobile browsers (to tweak your logic) then this post is for you.

Did you ever want git to do things a bit different? In my case, on one repo, I want git push to push to 2 remotes when not in master. Here’s how I did it.

I’m going to be writing about different things on my blog, here’s why :)

For some reason, I enjoy seeing, clicking and typing nice URLs (being able to say that my blog is at gmc.uy/blog, my twitter is gmc.uy/twitter and my Stack Overflow account is gmc.uy/so makes me happy)… so I’ve always had a way to maintain it, but it was pretty… involved. I wrote a 67 LOC script that lets me define the URLs on github and supports multiple domains.

Have you ever had your local IIS run a site local.something.com and eventually needed to test it on your phone (to optimize it beyond the emulator) or to share it with a coworker? you may end up doing lots of releases to your development environment just to see minor layout changes.If you have, and you’d like to expose your environment either on your network, then this article is for you. Otherwise, just go on with your life ;)

My experience interviewing for a job at Stack Overflow (and actually getting it!). The most interesting thing is probably the quality of the blog posts I link to. On the long weeks that the whole interviewing process took place, I scraped the internet looking for other people’s experiences… so here I try to “pay it forward” to my future Stackers!

I’ve been elgerva, Gervasio, gmc-dev, gmc_dev… and now, I’m g3rv4. A playful nickname that I feel it identifies me better than all the other nicknames (and that was availabe everywhere!). Also, this blog is built with Jekyll, its code is available on github and it’s deployed automatically on my server with a simple bash script. I had a blast setting it up, I even wrote my first Ruby lines while doing so!

A quick tail of how I started running and built a Chrome Extension that modifies the XHR requests/responses to trick the Garmin Connect web application to show me what I want to see… extensions have so much power over what we see.

I started playing with Docker and I dockerized all the apps that are running on my server. It was all super straightforward except for… Asterisk! here I talk about how I made it happen (it amazes me how you set up Asterisk boxes and just forget about them… they just work)

TL;DR: As part of a system to report the time I’ve worked on an issue from TimeDoctor to JIRA, I’m doing the OAuth2 dance using selenium and PhantomJS (effectively doing what OAuth2 without a password grant tries to avoid… having the application know the user password).

Doing authentication and authorization of an AngularJS application with a C# backend, using signed tokens… I thought a lot about security, is it enough? I’m not sure, but I surely like this article :)

When I wrote this I was super excited to be attending Twilio’s conference, and I planned to build a system to show my skills in there. I didn’t finish it in time, and I honestly didn’t have an awesome time at that conference either :P but it felt wrong to just delete this… if nothing else, you can see some of my positive thinking.

I’m pretty proud of this little project… It’s just a small python app that polls via telnet to a Portech MV-372 and checks if any new text messages arrived. If they did, it posts them to a RESTful API. It also exposes a RESTful API for other applications to send messages. The beauty? it works! despite the awful AT Commands.

I installed Asterisk 12 on a Raspberry… but I didn’t document all my steps because I followed another blog’s instructions. Guess what? that blog is now offline :P

I “discovered” (in the same sense that Columbus discovered America) Flowroute as a VoIP trunk provider. This post isn’t particularly insightful… but when I wrote it (in 2013) I was really excited about these things just existing.

This is how I used to update my Route 53 DNSs record. Right now I’m using a python script, but as soon as I’m bored enough to update it, I want to switch to DigitalOcean’s DNS… they’re free included and update super fast.

I was working with twilio, I started playing with Asterisk and obviously wanted them to interact. I was so proud of what I did that I wanted to share it, so this is why I started this blog… This is the first post of 4 about it. There’re way better ways of doing it today, but these posts were an extremely important part in how my professional life changed for the better. So I love them unapologetically.