It’s fairly straightforward to build your own
router,
and there are a number of tutorials for setting up IPv4 forwarding
and NAT rules on
Linux1. However,
IPv6 is a bit more complicated. There are many BSD and Linux based
operating systems like pfSense and OpenWRT, which have web
management tools to make setting up IPv6 straight forward. However,
if you like to run your own custom Linux distribution on your home
router and control everything from the command line, this tutorial
will take you through configuring dhcpcd, dnsmasq, unbound,
iptables and ip6tables for full IPv6 support on your local
network.
Git has an autocorrect feature. It is not very popular and for good
reason. By default, Git suggests the closest command when you try to
run a command that doesn’t exist. For example, if you run git sttus, git will suggest running git status. However if you
configure the
help.autocorrect
setting, Git can also “autocorrect” (as in run the command for
you). The feature seems useful till you realize that command will be
run without any user action. You can configure how long it waits
before running the command but not for it to wait for user action.
If you’re embarrassed at debugging with print(), please don’t be -
it’s perfectly fine! Many bugs are easily tackled with just a few
checks in the right places. As much as I love using a debugger, I
often reach for a print() statement first.
Git becomes quite popular SCM and everyone knows it a system for
tracking source code changes. It’s a true, but many people doesn’t
know that Git is an abstract storage that store data as binary
pieces named blobs. It allows to store other artifacts useful during
software development process. I’ll describe another scenarios where
Git can be useful and what tools make it possible.
As much as I can recommend vim since I made the switch many years
ago, there’s a bunch of anti-patterns I’ve commited myself (and
later saw others repeat them), which often resulted in frustration
and writing off the idea, perhaps prematurely. It’s a shame to see
this, because to me vim is something else and it continues to bring
a lot of joy to my work even after all this time. What follows are
my thoughts on some mistakes, so hopefully others reading this will
avoid them :)
Git is currently the most widely used version control system in the
world, mostly thanks to GitHub. By that measure, I’d argue that it’s
also the most misunderstood version control system in the world.
This post illustrates a trick that I’ve taught a few times to
minimize the “change surface” of a Haskell program. By “change
surface” I mean the number of places Haskell code needs to be
updated when adding a new feature.
Most engineers are familiar with creating branches and making
commits in git - despite being notoriously unintuitive, git has
become universal in software engineering. But did you know that you
can use git to store more than just snapshots of code?
The other day I realized: I've been programming in Python for about
4 years now. I do get paid to write code, but for some reason still
don't consider myself a pro. I did learn some valuable lessons
though.
For those who just got started with Python, you'll hopefully take
something out of these lessons. For the experienced, see this as a
celebration of our beloved language.
Almost all version control systems (VCS) have some kind of support
for branching. In a nutshell, branching means that you leave the
main development line by creating a new, separate container for your
work and continue to work there. This way you can experiment and try
out new things without messing up the production code base. Git
users know that Git’s branching model is special and incredibly
powerful; it’s one of the coolest features of this VCS. It’s fast
and lightweight, and switching back and forth between the branches
is just as fast as creating or deleting them. You could say that Git
encourages workflows that use a lot of branching and merging.
In this stunning conclusion to the epic New York Times bestselling
Lightbringer series, kingdoms clash as Kip struggles to escape his
family's shadow in order to protect the land and people he
loves. Gavin Guile, once the most powerful man the world had ever
seen, has been laid low. He's lost his magic, and now he is on a
suicide mission. Failure will condemn the woman he loves. Success
will condemn his entire empire. As the White King springs his great
traps and the Chromeria itself is threatened by treason and siege,
Kip Guile must gather his forces, rally his allies, and scramble to
return for one impossible final stand.
In the evening I started in The Burning
White,
the final book in the Lightbringer series by Brent Weeks.
I work daily with Go, and while the lack of generics can
occasionally be a pain point, mostly it can be worked around with
some combination of either abusing interface{} or manually
generating the non-generic code. On the other hand, there are other
pain points I feel much more often, and maybe other gophers do too…
If you’re not familiar with the term Structural Pattern Matching
then you are not alone. It’s a feature that, until about 10-15 years
ago, you would not see outside of functional programming
languages. Its use, however, has spread; today you can find a
feature like it in C#, Swift, and Ruby. What was once the preserve
of niche languages is now available for you to try in Python 3.10.
A few weeks ago, we’ve seen Apple announce their newest iPhone 13
series devices, a set of phones being powered by the newest Apple
A15 SoC. Today, in advance of the full device review which we’ll
cover in the near future, we’re taking a closer look at the new
generation chipset, looking at what exactly Apple has changed in the
new silicon, and whether it lives up to the hype.
How are async/await, coroutines, promises and callbacks
related? Which one is better or worse? We are going to implement the
same code with these 4 different approaches.