Ngrok is a fantastic tool for creating a secure tunnel from the
public web to a machine behind NAT or a firewall. Sadly, it costs
money and it’s proprietary. If you’re a developer, odds are that
you’re already renting a server in the public cloud, so why not roll
your own ngrok?
It turns out that you can do it using free, off-the-shelf tools,
with no sophisticated scripting required! In this article, I’ll show
you how.
Making a commit “verified”, or to be more precise, signed, is not as
hard as you might think. Just as it sounds, signed commits are
…well, signed, cryptographically using a GPG key.
Ever since its introduction in the 2017 paper, Attention is All You
Need, the Transformer model
architecture has taken the deep-learning world by storm. Initially
introduced for machine translation, it has become the tool of choice
for a wide range of domains, including text, audio, video, and
others. Transformers have also driven most of the massive increases
in model scale and capability in the last few years. OpenAI’s
GPT-3 and
Codex models are
Transformers, as are DeepMind’s
Gopher
models and many others.
In this post, I'll dive deep into why these generic functions are
faster than the existing ones in the sort package, even though
they use precisely the same algorithm and loop structure. This
should hopefully be an interesting peek into how Go generics are
implemented, in comparison to the existing dynamic dispatch
mechanism (interfaces).
Optical media, and BluRay M-Discs in particular, are the most
reliable way to do long term, offline data storage. CDs and DVDs
have lasted for 10-20 years and can still be read
successfully. BluRay media offers disk capacity of 25-128GB, and
should have similar longevity. The claims of special M-Disc media
lasting 100+ years seems plausible - unfortunately, it will take
another 99 years before we can confirm it!
Anyone who wants an offline, ransomware proof, 20+ year backup
should consider BluRay optical media.
Now and then I use vim at $work. Because I wanted whitespace to be
visible I added the following to my ~/.vimrc:
set list
set listchars=eol:⏎,tab:⍿·,trail:×
Note that this also makes trailing whitespace visible, which I prefer.
In the above screenshot, showing an example listing from Java The
Complete Reference Twelfth Edition by Herbert Schildt; page 188-189,
you can clearly see the whitespace. I use tabs to indent 4
characters. Also, there is some trailing whitespace, marked by the ×
characters at the line with the cursor at the end.
Note, however, that if you copy paste using the mouse the characters
representing whitespace are included. To prevent this, list has to
be toggled off. I bound F12 to toggling list by adding the following
to my ~/.vimrc:
The good news is that Podman is an excellent choice for running
containers, and especially so for running them in systemd
services. Let’s take a look at how this works.
Code comes in lots of different forms, such as text, bytecode, and
other data structures common in compilers—like control-flow graphs
(CFGs). CFGs are commonly used in compiler internals for analysis
and optimization, and in reverse engineering for lifting structure
out of linear assembly code.
In this post, we will learn how to construct a CFG from a subset of
CPython (3.6+) bytecode. We will also coincidentally be using Python
(3.6+) as a programming language, but the concepts should be
applicable to other bytecode and using other programming languages.
This year (2022) I bought the new MacBook Pro after having used
the MacBook Pro 2015 for the last years. This first month has been
super exciting and I am up running working efficiently on my
personal and professional web development projects as a freelance
JavaScript developer. Here I want to share with you my Mac setup
for web development that I have used.
I’ve been using perlimports
a lot at $work. I’m generally quite happy with perlimports, but it
can get confused by modules which are being dynamically used.
In my afternoon break I finished Foundryside
The Founders Trilogy Book 1 by Robert Jackson Bennett. I liked the
book. It gave me the same vibes as the first Mistborn book by Brandon
Sanderson. So if you've read that one, give Foundryside a try. And vice versa.
It has been about a year since the DeisLabs team starting using Rust
in a “serious” project. About this time last year, we started work
on what became the Krustlet
project. Since then, we have been using Rust extensively across our
projects and have learned a ton more about the language’s strengths
and weaknesses. As “Rust After the Honeymoon” posts currently seem
to be all the rage, we thought we could contribute a little to the
discussion with our experiences writing applications for the cloud
world.
A few years ago, Sancia Grado would’ve happily watched Tevanne
burn. Now, she’s hoping to transform her city into something
new. Something better. Together with allies Orso, Gregor, and
Berenice, she’s about to strike a deadly blow against Tevanne’s
cruel robber-baron rulers and wrest power from their hands for the
first time in decades.
But then comes a terrifying warning: Crasedes Magnus himself, the
first of the legendary hierophants, is about to be reborn. And if he
returns, Tevanne will be just the first place to feel his wrath.
Thousands of years ago, Crasedes was an ordinary man who did the
impossible: Using the magic of scriving—the art of imbuing objects
with sentience—he convinced reality that he was something more than
human. Wielding powers beyond comprehension, he strode the world
like a god for centuries, meting out justice and razing empires
single-handedly, cleansing the world through fire and
destruction—and even defeating death itself.
Like it or not, it’s up to Sancia to stop him. But to have a chance
in the battle to come, she’ll have to call upon a god of her own—and
unlock the door to a scriving technology that could change what it
means to be human. And no matter who wins, nothing will ever be the
same.
In the evening I started in
Shorefall,
The Founders Trilogy Book 2 by Robert Jackson Bennett.
For developers working in impure languages, print debugging is often
the first stop for figuring out where and why something is going
wrong. In Haskell, where printing something to the screen is a side
effect to avoid, it might seem like you need to give up print
debugging for the sake of purity. Thankfully, you can have your cake
and eat it too… if you're okay with eating buggy cake.
The
Debug.Trace
module, which is part of base, provides tools for print-style
debugging for our pure functional programs. In this article, we’ll
walk through a hands-on example using print-style debugging to
narrow down the problem with a small example program. You’ll learn
how to apply tracing to finding bugs in a Haskell program, and
you’ll learn a little bit about Unicode along the way.
Bitemporal Data is data that has two time components associated with
it. Data in the real world is immutable, bitemporal data is how we
can capture this nature of data in our databases.
Unfortunately, pickle’s incredibly simple interface comes at a
cost. Pickle’s deserializer, which is called into whenever we invoke
“pickle.load” (or “torch.load”!), is a full-fledged virtual machine,
able to run arbitrary code within the process that loads the
object. It is expressly built to allow serialized objects to come
with arbitrary instructions on how to deserialize them. In other
words, Pickle deserialization readily supports running arbitrary
code specified by the serializer (the original author of the
file).
This article explains a straightforward approach for generating
Perfect Hash Functions, and using them in tandem with a Map<K,V>
implementation called ReadOnlyMap<K,V>. It assumes the reader is
already familiar with the concepts like hash functions and hash
tables.
Elliptic curve cryptography (ECC) is a type of public-key
cryptographic systems. This class of systems relies on really
difficult "one-way" math problems – problems that easy to compute
one way and intractable to solve the "other" way. Sometimes these
are called "trap-door" functions – easy to fall into, extremely
difficult to get out of.
When I started digging into the layout algorithms, everything
started to make more sense. Mysteries that had bothered me for years
were solved. I realized that CSS is actually a pretty darn robust
language, and I started to really enjoy writing it!