<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Field Reports from Erik's Laboratory</title><link href="https://erik.nygren.org/" rel="alternate"></link><link href="https://erik.nygren.org/feeds/all.atom.xml" rel="self"></link><id>https://erik.nygren.org/</id><updated>2026-04-10T00:00:00-04:00</updated><entry><title>We should talk about how the AI revolution is impacting our mental health</title><link href="https://erik.nygren.org/2026-ai-and-mental-health.html" rel="alternate"></link><published>2026-04-10T00:00:00-04:00</published><updated>2026-04-10T00:00:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2026-04-10:/2026-ai-and-mental-health.html</id><summary type="html">&lt;p&gt;How AI is impacting the mental health of &lt;em&gt;everyone&lt;/em&gt; is not getting enough discussion, and I also don't know what we do about it.  While AIs may be able to help us get more done faster, that increased productivity may not be sustainable and does not come as a reduction …&lt;/p&gt;</summary><content type="html">&lt;p&gt;How AI is impacting the mental health of &lt;em&gt;everyone&lt;/em&gt; is not getting enough discussion, and I also don't know what we do about it.  While AIs may be able to help us get more done faster, that increased productivity may not be sustainable and does not come as a reduction in either stress or anxiety.  As I suspect this is impacting many of us, whether we acknowledge them or keep them buried, it is important for leaders to acknowledge this and talk about it so that people don’t feel alone with their fears.&lt;/p&gt;
&lt;p&gt;I'm coming from a position of thinking that emerging AI technologies are highly disruptive and transformative in the same way that the internet was in the late 90's.  This doesn't mean that it will solve every problem or that it is actually a good idea for everything, but it is here to stay.  I think the overall comparisons to Blockchain/NFTs/VR are misleading (as those were technologies in search of problems in a way that LLMs are not).  As someone who has often been a selective early adopter of technologies (I had a Linux web server in my dorm room in 1994, had voice controlled home automation in the 2004, and I was pushing the &lt;a href="https://docs.google.com/document/d/1KbYEB_5510F3gq74vJReGbAoBFeQWL0q7G8Nk4G9T6g/edit?tab=t.0"&gt;boundaries of ChatGPT within a week of its release&lt;/a&gt;), this is a technology I’m willing to experiment with and am finding increasingly useful for certain tasks.  In particular, I’ve been finding LLMs like Claude especially useful for domains where I’m an expert and where it is easier to fully review output than to do everything from scratch.  For example, using Claude as an augmented search tool to help me find primary sources is transformative in the same way that Altavista was transformative over Yahoo.  &lt;/p&gt;
&lt;p&gt;Within the work environment there are certainly compelling and transformative uses of AI and LLMs, and there are also many places where introducing it is counter-productive at this point and/or where the risks outweigh the benefits.  A colleague of mine put it well on how to approach new uses of AI:  “ok, fine, let's try AI for all of this, but at the end of the day I'm a scientist so how do we measure and how do we learn from this."&lt;/p&gt;
&lt;p&gt;But back to my initial premise, all over the place I see AI technologies as really, really triggering the fight-or-flight threat instincts in most everyone.  Regardless of how experienced and senior people are, there seems to be uniform reactions of  "Can I keep up?  Will this replace me career-wise?  How do I manage the technical risks?  What are the existential risks to our civilization?  What are the ethical implications and the environmental costs?  How will this impact my children’s future path?” and many more.  Since &lt;a href="https://pluralistic.net/2026/01/06/1000x-liability/#graceful-failure-modes"&gt;“Code is a liability. Code’s &lt;em&gt;capabilities&lt;/em&gt; are assets.” (- Cory Doctorow)&lt;/a&gt;, those of us working at tech companies are also seeing a &lt;a href="https://www.linkedin.com/pulse/whats-true-cost-code-written-ai-coding-agents-robert-blumofe-pln2e/"&gt;rapidly and unsustainably ballooning amount of code that we will need to maintain&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of the things that our “Growth Mindset” training classes taught us about are all directly applicable here, where the perceived threats and the high rate of change are almost certainly having psychological, sociological, and physiological impacts on almost all of us.  Secondary discussions around this are one of the top topics of conversation everywhere it seems, whether in social media, work chats, or at social gatherings.&lt;/p&gt;
&lt;p&gt;Some people are responding with extreme skepticism as a natural reaction, and in the creative fields this may be highly warranted – while AI &lt;em&gt;can&lt;/em&gt; write novels, is this something people actually want to read?  But in other areas this is hazardous and may just result in increasing cognitive dissonance. If we take the comparison to the Internet bubble in the early 2000, there was certainly hype and over-investment, but that rapid rate of investment did give many companies the momentum they needed to build great things we rely on heavily today.  Even things that there was huge skepticism around (who wants to do banking online?) have now turned out to be part of our daily lives.&lt;/p&gt;
&lt;p&gt;Other people seem to be taking the Growth Mindset to the extreme, embracing AI evangelism and going after it all without skepticism.  Yes, it is possible to do a huge amount if you have no family (or prioritize work/innovation above all else) and work a huge number of hours of the day, but it is neither equitable nor healthy to force everyone to make this choice.  Given the rate of change here, I fear that even this is unsustainable, and many of the people on this path are also going to get burned badly by all of the security and other pitfalls present in even the best of these systems.&lt;/p&gt;
&lt;p&gt;For those of us who think of ourselves as pragmatic innovators, we can try and take a middle ground but even that middle ground is extremely stressful.  There is no way anyone can keep up with the rate of change, and new threats are showing up constantly.  While many people might have the option of trying to ignore it, it is still important for everyone to be aware of all of the new threats from bad actors that are leaking into the real world.  For those of us in technical roles, ignoring the transformative nature of AI isn’t an option — while there are lots of bad uses, there are also lots of compelling uses, and we need to have enough familiarity to be able to differentiate and to use the tools well.&lt;/p&gt;
&lt;p&gt;Trying to keep up here while also dealing with the emerging threats and also trying to do our jobs is exhausting, and is feeling increasingly unsustainable.  While offloading things to AI might seem like an attractive solution, it doesn’t really help and makes things worse as the only way to safely use AIs today is to put up enough guardrails to be able to be personally responsible for their outputs and actions.  This means that while they can help us be more productive, that increased productivity does NOT come as a reduction in either stress or anxiety.&lt;/p&gt;
&lt;p&gt;I’m not sure what we can do about this?  The only thing that I can think of is empathy and acknowledging the levels of stress that our present-day future is forcing onto ourselves and everyone around us, along with appreciating that different people are processing it in different ways.  Human connections may also help some people but make things worse for others.  While this seems like an important topic for those of us in tech leadership roles to talk about and try and address, the solution is NOT to try and use AI to solve it.  (My dystopian fear is bringing this to HR departments or management who then suggest that employees talk to chatbots for psychological support — if anyone seriously suggests this there is plenty of research saying that doing so would be criminally negligent.)  But no matter what, try and be good to the humans around you.&lt;/p&gt;</content><category term="Technology"></category><category term="AI LLM"></category></entry><entry><title>Using DHCPv6-PD on Ubuntu 22.04 Jaunty with systemd-networkd to route multiple prefixes</title><link href="https://erik.nygren.org/dhcpv6-pd-on-ubuntu-2204.html" rel="alternate"></link><published>2023-08-12T14:00:00-04:00</published><updated>2023-08-12T14:00:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2023-08-12:/dhcpv6-pd-on-ubuntu-2204.html</id><summary type="html">&lt;p&gt;This provides an overview of how you can use the systemd-networkd
service in Ubuntu 22.04 to obtain an IPv6 DHCPv6-PD prefix (eg, a /56)
from an upstream ISP and subdivide it across local subnets, providing
a /64 per subnet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note that this post assumes you already have extensive experience …&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;This provides an overview of how you can use the systemd-networkd
service in Ubuntu 22.04 to obtain an IPv6 DHCPv6-PD prefix (eg, a /56)
from an upstream ISP and subdivide it across local subnets, providing
a /64 per subnet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note that this post assumes you already have extensive experience with Linux and IPv6.
Most people are much better off using a distribution such as &lt;a href="https://openwrt.org/"&gt;OpenWRT&lt;/a&gt; that handles
all of this complexity for you.  If you want to know why IPv6 matters, check out &lt;a href="https://www.akamai.com/blog/trends/10-years-since-world-ipv6-launch"&gt;Akamai's blog post on
"10 Years Since World IPv6 Launch"&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;The systemd-networkd service in Ubuntu 22.04 has enough support for DHCPv6-PD to obtain
a prefix from an upstream ISP and subdivide it across local subnets, providing a /64 per subnet.
For example, Comcast provides a /60 which has enough space for 16 subnets.&lt;/p&gt;
&lt;p&gt;This includes substantial improvements since Ubuntu 20.04 (which I
wrote about &lt;a href="dhcpv6-pd-on-ubuntu.html"&gt;previously&lt;/a&gt; although the syntax
for some of the configuration has changed.  This is an updated version
and assumes Ubuntu 22.04 Jaunty (or equivalent).&lt;/p&gt;
&lt;p&gt;Because netplan doesn't have enough features to configure DHCPv6-PD
yet (see
&lt;a href="https://bugs.launchpad.net/netplan/+bug/1771886"&gt;https://bugs.launchpad.net/netplan/+bug/1771886&lt;/a&gt;),
some of the configuration needs to live in systemd-networkd overrides.&lt;/p&gt;
&lt;h2&gt;Configuring the Interfaces&lt;/h2&gt;
&lt;p&gt;I am assuming starting with a netplan configuration like the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eno1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# ISP1&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;accept-ra&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;ipv6-privacy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;nameservers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;example.org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4-overrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-dns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-ntp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp6-overrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-dns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-ntp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eno2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# LAN&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;vlans&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;en-main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;6&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;eno2&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;no&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10.1.0.0/24&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;en-guest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;7&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;eno2&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;no&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10.2.0.0/24&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This has interfaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eno1 = WAN&lt;/li&gt;
&lt;li&gt;eno2 = Primary LAN&lt;/li&gt;
&lt;li&gt;en-main = Main VLAN&lt;/li&gt;
&lt;li&gt;en-guest = Guest VLAN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While netplan and systemd-networkd somehow collaborate to put this
netplan config into files such as
&lt;code&gt;/run/systemd/network/10-netplan-eno1.network&lt;/code&gt;, there is no way to get
the rules needed for enabling DHCPv6-PD into those dynamically
generated files in /run.&lt;/p&gt;
&lt;p&gt;Thankfully, you can put overrides in that systemd-networkd will read.
See the &lt;code&gt;systemd.network(5)&lt;/code&gt; man page for more details on all of the options available
for these files.&lt;/p&gt;
&lt;p&gt;To configure a DHCPv6-PD client on the WAN interface (eno1 in my case),
create &lt;code&gt;/etc/systemd/network/10-netplan-eno1.network.d/override.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;eno1&lt;/span&gt;

&lt;span class="k"&gt;[DHCPv6]&lt;/span&gt;
&lt;span class="na"&gt;PrefixDelegationHint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;::/56&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can specify a smaller or larger value for PrefixDelegationHint if needed (eg, /60 for Comcast Xfinity Residential).&lt;/p&gt;
&lt;p&gt;For each of the LAN interfaces, create files such as &lt;code&gt;/etc/systemd/network/10-netplan-en-guest.network.d/override.conf&lt;/code&gt;
and &lt;code&gt;/etc/systemd/network/10-netplan-en-main.network.d/override.conf&lt;/code&gt; with the following.  Note that the filename
prefixes must match those in &lt;code&gt;/run/systemd/network/&lt;/code&gt; (ie, don't change the "10-").&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;en-main&lt;/span&gt;

&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;IPv6PrefixDelegation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dhcpv6&lt;/span&gt;
&lt;span class="na"&gt;IPv6DuplicateAddressDetection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;LinkLocalAddressing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ipv6&lt;/span&gt;

&lt;span class="k"&gt;[DHCPv6PrefixDelegation]&lt;/span&gt;
&lt;span class="c1"&gt;## Must be unique per subnet&lt;/span&gt;
&lt;span class="na"&gt;SubnetId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The "SubnetId" here must be unique per subnet and is used to construct
the address.  The allowed values depend on what size prefix was delegated
by DHCPv6-PD. If you have a /60, this can be a unique hex value in the range 0-f.
If you have a /56, this can be a unique hex vale in the range of 0-ff.&lt;/p&gt;
&lt;p&gt;For example, if you have 2001:db8:abcd:3400::/56 and have SubnetId of "7"
then the subnet will be assigned the prefix 2001:db8:abcd:3407::/56.&lt;/p&gt;
&lt;p&gt;It is critical to have this here as otherwise these will be assigned
in different orders each time systemd-networkd restarts.  It doesn't
keep track of what prefixes it has advertised to links, so hosts on various
links/subnets could end up with stale prefix advertisements for
the wrong subnets and broken connectivity.&lt;/p&gt;
&lt;p&gt;As a variation on the above, the following also:
* Assigns a ULA prefix on the subnet which remains up even if you lack external network connectivity.
  Make sure to replace the "XX:XXXX:XXXX" part of "fdXX:XXXX:XXXX:YYYY::/64" with a sufficiently random value,
  and then the "YYYY" may wish to be the same as the SubnetId as above (but does not need to be).
* Has the router also assign itself an address on the subnet with a token of "::7777", so it would
  assign itself 2001:db8:abcd:3407::7777.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Match]&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;en-main&lt;/span&gt;

&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="c1"&gt;## use both DHCPv6 and static ULA prefixes (&amp;quot;yes&amp;quot;)&lt;/span&gt;
&lt;span class="na"&gt;IPv6PrefixDelegation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;IPv6DuplicateAddressDetection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;LinkLocalAddressing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ipv6&lt;/span&gt;

&lt;span class="k"&gt;[DHCPv6PrefixDelegation]&lt;/span&gt;
&lt;span class="c1"&gt;## Must be unique per subnet&lt;/span&gt;
&lt;span class="na"&gt;SubnetId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;
&lt;span class="na"&gt;Token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;::7777&lt;/span&gt;
&lt;span class="na"&gt;Assign&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="k"&gt;[IPv6Prefix]&lt;/span&gt;
&lt;span class="na"&gt;Prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;fdXX:XXXX:XXXX:YYYY::/64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note the filename prefixes in &lt;code&gt;/etc/systemd/network/&lt;/code&gt; need to match those in &lt;code&gt;/run/systemd/network/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more details on the options and their meanings, see the man page &lt;code&gt;systemd.network(5)&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Loading Changes&lt;/h2&gt;
&lt;p&gt;You can either reboot, or you can reapply netplan and reload systemd-networkd configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;netplan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt;
&lt;span class="n"&gt;networkctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sometimes it can help to also restart restart systemd-networkd with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;service systemd-networkd restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Caveats and notes&lt;/h2&gt;
&lt;p&gt;Some additional notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The IPv6 address on the WAN link (eg, eno1) comes from an individual RA ND or DHCPv6 assignment, not a DHCPv6-PD prefix. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Testing and Debugging&lt;/h2&gt;
&lt;p&gt;There's plenty more information than existed in older versions,
especially by running &lt;code&gt;networkctl status&lt;/code&gt;.  This will show the various
assigned addresses as well as some recent log entries.  For example,
you can see which prefix was obtained via DHCPv6-PD and what was assigned
to various links:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;eno1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DHCPv6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;501&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1111&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2222&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3333&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4444&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eno1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DHCP6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;950&lt;/span&gt;&lt;span class="o"&gt;::/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DHCPv6&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;956&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;7777&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DHCPv6&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;957&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;7777&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here the DHCPv6-PD prefix of 2001:db8:1234:950::/60 was assigned, and then 2001:db8:1234:956::/64 was assigned
out to the link with SubnetId "6".&lt;/p&gt;
&lt;p&gt;Some things that may be helpful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip -6 route list&lt;/code&gt; will list the prefixes assigned to the interfaces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdisc6 en-guest&lt;/code&gt; will do router discovery on that interface (eg, en-guest in this case) and will show the assigned prefix&lt;/li&gt;
&lt;li&gt;Doing a &lt;code&gt;tcpdump -s 1500 -vvv -i eno1 port 546 or port 547&lt;/code&gt; and then a &lt;code&gt;systemctl restart systemd-networkd&lt;/code&gt; will show the DHCPv6-PD lease including prefix length received from the WAN ISP&lt;/li&gt;
&lt;li&gt;Doing &lt;code&gt;journalctl -xeu systemd-networkd&lt;/code&gt; will give some logging information from systemd-networkd but I have yet to figure out how to get the most relevant parts logged.&lt;/li&gt;
&lt;li&gt;Doing &lt;code&gt;radvdump&lt;/code&gt; will show the RAs showing up on an interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;More network logging&lt;/h3&gt;
&lt;p&gt;Doing &lt;code&gt;systemctl edit systemd-networkd&lt;/code&gt; to add in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;SYSTEMD_LOG_LEVEL=debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And restart systemd-networkd service and looking at logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl restart systemd-networkd
journalctl -b -u systemd-networkd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Multi-Homing and clearing bad prefixes&lt;/h2&gt;
&lt;p&gt;I've also started to play more with Primary/Backup failover between
two links.  Using the approach from &lt;a href="https://datatracker.ietf.org/doc/html/rfc8475"&gt;RFC8475 - Using Conditional
Router Advertisements for Enterprise
Multihoming&lt;/a&gt;
seems to work, although I additionally configure NAT66
for cases where traffic tries to use the wrong source address for the wrong link.&lt;/p&gt;
&lt;p&gt;One thing that is useful is to use the &lt;code&gt;ra6&lt;/code&gt; tool from &lt;code&gt;ipv6tools&lt;/code&gt; to
set the preferred lifetime down to "0" to deprecate a prefix on a
link.  For example, this sets the preferred lifetime to "0" for an old
prefix "2001:db8:5050:553::/64" which had been on a link with
interface "en-guest", sending it to the all-hosts multicast (ff02::1):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ra6 -v -i en-guest -e -P 2001:db8:5050:553::/64#AL#7200#0 --lifetime 300 -r 0 -x 0 -c 0 -p -1 -d ff02::1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It is possible not all of these arguments are strictly needed.&lt;/p&gt;
&lt;p&gt;You may need to send this periodically (for the valid lifetime
that had been set previously) as hosts may be offline or may be
rate-limiting RAs.&lt;/p&gt;
&lt;p&gt;This can be useful for misconfigurations (eg, if changing SubnetId),
cleaning up from botched ISP renumberings, and for primary/backup failovers.&lt;/p&gt;
&lt;h2&gt;Future Work&lt;/h2&gt;
&lt;p&gt;It would be nice if systemd-networkd kept track of IPv6 prefixes it had
assigned to links so that it could deprecate those if they were no longer
in-use (eg, when an ISP does a renumbering), and to also support
Conditional RAs for primary/backup failovers between multiple uplinks.&lt;/p&gt;
&lt;p&gt;It would also be nice if all of this could be configured
via netplan rather than with overrides.&lt;/p&gt;
&lt;p&gt;I also plan to setup an IPv6-only subnet using NAT64+DNS64 and will
have a follow-on blog post on the details there.&lt;/p&gt;
&lt;h2&gt;Updates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2023-08-26: removed "ForceDHCPv6PDOtherInformation" which has been deprecated&lt;/li&gt;
&lt;/ul&gt;</content><category term="IPv6"></category><category term="Linux"></category><category term="IPv6"></category></entry><entry><title>Creating Mastodon account identity aliases with Apache</title><link href="https://erik.nygren.org/mastodon-aliases.html" rel="alternate"></link><published>2022-11-26T14:00:00-05:00</published><updated>2022-11-26T14:00:00-05:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2022-11-26:/mastodon-aliases.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Update 2022-11-30: added a RewriteMap to unescape URI-encoding, per &lt;a href="https://hachyderm.io/@jered@metasocial.com/109431464219955351"&gt;@jered@convivian.com's comment&lt;/a&gt; and added a pointer to &lt;a href="https://webfinger.net"&gt;webfinger.net&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update 2022-12-16: fixed a syntax error for host-meta XML and added in the proper content-type&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I've long operated email forwarding (eg, of the form
"username@personaldomain.example") which forwards on …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Update 2022-11-30: added a RewriteMap to unescape URI-encoding, per &lt;a href="https://hachyderm.io/@jered@metasocial.com/109431464219955351"&gt;@jered@convivian.com's comment&lt;/a&gt; and added a pointer to &lt;a href="https://webfinger.net"&gt;webfinger.net&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update 2022-12-16: fixed a syntax error for host-meta XML and added in the proper content-type&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I've long operated email forwarding (eg, of the form
"username@personaldomain.example") which forwards on to my actual
email service.  This means I can switch backend email service
providers without needing to tell everyone my new address.  While
Mastodon is federated and allows migrating accounts and followers
between servers (as long as the server you are migrating from is still
available), it wasn't immediately obvious how to setup a stable
"identity" on my own domain without running my own server.  (While I
considered running one, I really don't want to have to be the SRE for
yet another personal service, and hence joined the well-operated
&lt;a href="https://hachyderm.io/"&gt;Hachyderm&lt;/a&gt; server.)&lt;/p&gt;
&lt;p&gt;It is possible, as described below to, easily setup forwarding
of a fediverse account name from a personal domain/server to
a third-party operated fediverse (eg, Mastodon) server.&lt;/p&gt;
&lt;p&gt;While this allows for discovery (eg, you can put
"@username@personaldomain.example" into a Mastodon search field to
find your account), this is still just a redirection.  Followers and
posts are still associated with the underlying Mastodon server.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://erik.nygren.org/images/2022/2022/dalle-webfinger-mastodon.png"&gt;&lt;img alt="Finger pointing at a mastodon and the world in space" src="https://erik.nygren.org/images/2022/dalle-webfinger-mastodon.small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.joinmastodon.org/"&gt;Mastodon&lt;/a&gt; and other "fediverse"
services provide federated social networking and microblogging built on top of the
&lt;a href="https://www.w3.org/TR/activitypub/"&gt;ActivityPub&lt;/a&gt; and
&lt;a href="https://docs.joinmastodon.org/spec/webfinger/"&gt;WebFinger&lt;/a&gt; and HTTP protocols.
While many people have been used to centralized social network services
such as Twitter and Facebook, the fediverse is much closer to email and websites
which have always been federated (even if there are popular big operators).&lt;/p&gt;
&lt;p&gt;Naming in the fediverse leverages the DNS (Domain Name System), again
the same as email and websites.  The security model also relies on
PKIX (the Public Key infrastructure underlying HTTPS where Certificate
Authorities validate ownership over DNS names and sign keyparts used
to authenticate TLS connections).&lt;/p&gt;
&lt;p&gt;Mastodon/fediverse/ActivityPub/WebFinger use "acct:" scheme URIs to
name accounts.  The WebFinger protocol (&lt;a href="https://www.rfc-editor.org/rfc/rfc7033.html"&gt;RFC
7033&lt;/a&gt;) is used to map
from an acct: URI to the various ActivityPub service endpoints by
making an HTTPS request to a well-known URI.&lt;/p&gt;
&lt;h2&gt;Warnings/Caveats&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;One warning before we start: this breaks the abstraction barrier
of the target server you are forwarding to.  They usually return
the WebFinger configuration listing their endpoints, and by
copying and modifying them it means things could break if the
target server adds new endpoints or needs to change its URIs.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The forwarding also only works initially and subsequent
interactions are with the target server.  This could be confusing
for users, especially if the username changes substantially.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;At the same time, you can add additional WebFinger information in
if you wanted to, such as phone numbers or similar.  I'm
curious what real use-cases for this might be.&lt;/p&gt;
&lt;h2&gt;WebFinger forwarding with Apache&lt;/h2&gt;
&lt;p&gt;The easiest way to setup WebFinger forwarding
is to use &lt;a href="https://httpd.apache.org/docs/trunk/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt;.  If it's not enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;a2enmod&lt;span class="w"&gt; &lt;/span&gt;rewrite
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then in the VirtualHost stanza for the Apache2 configuration for your domain include:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;RewriteEngine&lt;span class="w"&gt; &lt;/span&gt;on
&lt;span class="w"&gt;   &lt;/span&gt;RewriteMap&lt;span class="w"&gt; &lt;/span&gt;unescape&lt;span class="w"&gt; &lt;/span&gt;int:unescape
&lt;span class="w"&gt;   &lt;/span&gt;RewriteCond&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;unescape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;QUERY_STRING&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;}&lt;span class="w"&gt; &lt;/span&gt;^(rel=[^&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;]*&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;)*resource=acct:([a-z0-9-]+)@example.org(&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;rel=[^&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;]*)*$
&lt;span class="w"&gt;   &lt;/span&gt;RewriteRule&lt;span class="w"&gt; &lt;/span&gt;^/.well-known/webfinger$&lt;span class="w"&gt; &lt;/span&gt;/.well-known/_webfinger/%2.json&lt;span class="w"&gt; &lt;/span&gt;[L,QSD]

&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Location&lt;/span&gt; &lt;span class="err"&gt;&amp;quot;/.well-known/host-meta&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;ForceType&lt;span class="w"&gt; &lt;/span&gt;application/xrd+xml
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Replace "example.org" with your personal domain name (eg,
"personaldomain.example").  This says to rewrite URLs of the form
"https://example.org/.well-known/webfinger?resource=acct:username@example.org"
to instead serve files from "/.well-known/_webfinger/username".  (It
also ignores any rel= query string attributes, per the RFC.)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: the RewriteMap to unescape URI-encoding is needed for some clients.  Thanks to &lt;a href="https://hachyderm.io/@jered@metasocial.com/109431464219955351"&gt;@jered@convivian.com for pointing this out&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Next, create a file in /.well-known/_webfinger/username.json (replacing "username"
with yours) containing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;aliases&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mastodon-server.example/@username&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mastodon-server.example/users/username&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;acct:username@mastodon-server.example&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;links&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mastodon-server.example/@username&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;rel&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://webfinger.net/rel/profile-page&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mastodon-server.example/users/username&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;rel&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;application/activity+json&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;rel&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://ostatus.org/schema/1.0/subscribe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;template&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mastodon-server.example/authorize_interaction?uri={uri}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;subject&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;acct:username@personaldomain.example&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In that, replace "mastodon-server.example" with the URL of your mastodon server,
"username" with your username, and "username@personaldomain.example"
with your full vanity domain account thatyou want to redirect over.&lt;/p&gt;
&lt;p&gt;Note that the above corresponds to at least one Mastodon 4.0 server.
You may need to periodically update this to match the configuration
for your mastodon server.  For example, fetch with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;https://mastodon-server.example/.well-known/webfinger?resource&lt;span class="o"&gt;=&lt;/span&gt;acct:username@mastodon-server.example&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;json_pp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and start with that instead.  &lt;/p&gt;
&lt;p&gt;Purely optional: If you want, you can add additional link relations
with additional metadata under "links".  See
&lt;a href="http://microformats.org/wiki/existing-rel-values"&gt;here&lt;/a&gt; for a
registry with other link relations.&lt;/p&gt;
&lt;p&gt;You may also need to add a file /.well-known/host-meta with a URI template 
for some webfinger clients to use, also replacing "personaldomain.example"
with your domain name:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;XRD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://docs.oasis-open.org/ns/xri/xrd-1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;lrdd&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;template=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://personaldomain.example/.well-known/webfinger?resource={uri}&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;application/xrd+xml&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/XRD&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once these are in-place, reload your apache configuration (eg, "apache2ctl graceful")
and then test:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://personaldomain.example/.well-known/webfinger?resource=acct:username@personaldomain.example&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;which should return the json document.&lt;/p&gt;
&lt;p&gt;You can also test by entering in your account name at &lt;a href="https://webfinger.net"&gt;webfinger.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You should be able to then follow "@username@personaldomain.example" into a search box
in a Mastodon client would then bring up "@username@mastodon-server.example".&lt;/p&gt;
&lt;p&gt;As an example, "&lt;a href="https://nygren.org/.well-known/webfinger?resource=acct:erik@nygren.org"&gt;@erik@nygren.org&lt;/a&gt;" is setup this way and points to "&lt;a href="https://hachyderm.io/@nygren"&gt;@nygren@hachyderm.io&lt;/a&gt;".&lt;/p&gt;
&lt;h2&gt;Other Implementations&lt;/h2&gt;
&lt;p&gt;Some other implementations that may be helpful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/junosuarez/012755df0243ad17d942ddf26eb707a7#file-setup-md"&gt;Github gist for github pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/haykinson/e3b7004d8e7436bf4486964b89af4ca1"&gt;Setting up nginx for webfinger&lt;/a&gt; by &lt;a href="https://hachyderm.io/@ilya"&gt;@ilya@hachyderm.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Some useful posts which pointed me in the right direction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://s3lph.me/activitypub-static-site.html"&gt;Setting up an ActivityPub feed as a static site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lesswrong.com/posts/at8QigBZnxirgHraT/better-mastodon-aliases"&gt;Better Mastodon aliases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Image generated with &lt;a href="https://openai.com/api/policies/sharing-publication/"&gt;OpenAI DALL-E 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Internet"></category><category term="WebFinger"></category><category term="ActivityPub"></category><category term="Mastodon"></category><category term="Fediverse"></category></entry><entry><title>(Obselete) Using DHCPv6-PD on Ubuntu 20.04 with systemd-networkd to route multiple prefixes</title><link href="https://erik.nygren.org/dhcpv6-pd-on-ubuntu.html" rel="alternate"></link><published>2022-06-18T14:00:00-04:00</published><updated>2022-06-18T14:00:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2022-06-18:/dhcpv6-pd-on-ubuntu.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Update: Ubuntu 22.04 has significant improvements in the systemd-networkd service that
fix a number of issues from this blog post.  The syntax has changed.  See &lt;a href="dhcpv6-pd-on-ubuntu-2204.html"&gt;Using DHCPv6-PD on Ubuntu 22.04 Jaunty with systemd-networkd to route multiple prefixes&lt;/a&gt; for an updated version of this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note that this post assumes …&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Update: Ubuntu 22.04 has significant improvements in the systemd-networkd service that
fix a number of issues from this blog post.  The syntax has changed.  See &lt;a href="dhcpv6-pd-on-ubuntu-2204.html"&gt;Using DHCPv6-PD on Ubuntu 22.04 Jaunty with systemd-networkd to route multiple prefixes&lt;/a&gt; for an updated version of this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note that this post assumes you already have extensive experience with Linux and IPv6.
Most people are much better off using a distribution such as &lt;a href="https://openwrt.org/"&gt;OpenWRT&lt;/a&gt; that handles
all of this complexity for you.  If you want to know why IPv6 matters, check out &lt;a href="https://www.akamai.com/blog/trends/10-years-since-world-ipv6-launch"&gt;Akamai's blog post on
"10 Years Since World IPv6 Launch"&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;The systemd-networkd service in Ubuntu 20.04 has enough support for DHCPv6-PD to obtain
a prefix from an upstream ISP and subdivide it across local subnets, providing a /64 per subnet.
For example, Comcast provides a /60 which has enough space for 16 subnets.&lt;/p&gt;
&lt;p&gt;As far as I can tell, the ability to debug what is going on here or obtain state is almost
entirely lacking.  This makes it very hard to use troubleshoot issues or even tell what is going on.&lt;/p&gt;
&lt;p&gt;Because netplan doesn't have enough features to configure DHCPv6-PD yet (see &lt;a href="https://bugs.launchpad.net/netplan/+bug/1771886"&gt;https://bugs.launchpad.net/netplan/+bug/1771886&lt;/a&gt;), some
of the configuration needs to live in systemd-networkd overrides.&lt;/p&gt;
&lt;h2&gt;Configuring the Interfaces&lt;/h2&gt;
&lt;p&gt;I am assuming starting with a netplan configuration like the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eno1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# ISP1&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;accept-ra&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;ipv6-privacy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;nameservers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;example.org&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4-overrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-dns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-ntp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp6-overrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-dns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;use-ntp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eno2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# LAN&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;vlans&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;en-main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;6&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;eno2&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;no&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10.1.0.0/24&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;en-guest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;7&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;eno2&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;no&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10.2.0.0/24&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This has interfaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eno1 = WAN&lt;/li&gt;
&lt;li&gt;eno2 = Primary LAN&lt;/li&gt;
&lt;li&gt;en-main = Main VLAN&lt;/li&gt;
&lt;li&gt;en-guest = Guest VLAN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While netplan and systemd-networkd somehow collaborate to put this
netplan config into files such as
&lt;code&gt;/run/systemd/network/10-netplan-eno1.network&lt;/code&gt;, there is no way to get
the rules needed for enabling DHCPv6-PD into those dynamically
generated files in /run.&lt;/p&gt;
&lt;p&gt;Thankfully, you can put overrides in that systemd-networkd will read.
See the &lt;code&gt;systemd.network(5)&lt;/code&gt; man page for more details on all of the options available
for these files.&lt;/p&gt;
&lt;p&gt;To configure a DHCPv6-PD client on the WAN interface (eno1 in my case),
create &lt;code&gt;/etc/systemd/network/10-netplan-eno1.network.d/override.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;IPv6PrivacyExtensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;

&lt;span class="k"&gt;[DHCPv6]&lt;/span&gt;
&lt;span class="na"&gt;ForceDHCPv6PDOtherInformation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;PrefixDelegationHint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;::/56&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can specify a smaller value for PrefixDelegationHint if needed (eg, /60 for Comcast Residential).&lt;/p&gt;
&lt;p&gt;For each of the LAN interfaces, create files such as &lt;code&gt;/etc/systemd/network/10-netplan-en-guest.network.d/override.conf&lt;/code&gt;
and &lt;code&gt;/etc/systemd/network/10-netplan-en-main.network.d/override.conf&lt;/code&gt; with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Network]&lt;/span&gt;
&lt;span class="na"&gt;IPv6PrefixDelegation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dhcpv6&lt;/span&gt;
&lt;span class="na"&gt;IPv6DuplicateAddressDetection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;IPv6PrivacyExtensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;
&lt;span class="na"&gt;LinkLocalAddressing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ipv6&lt;/span&gt;

&lt;span class="k"&gt;[IPv6PrefixDelegation]&lt;/span&gt;
&lt;span class="na"&gt;RouterLifetimeSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1800&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that if you want to use both DHCPv6 provided addresses and your own (eg,
to mix in ULA) this may be possible by setting IPv6PrefixDelegation=true, but
I have not tried this.  (This did not appear to work in Ubuntu 20.04.)&lt;/p&gt;
&lt;p&gt;Note the filename prefixes in &lt;code&gt;/etc/systemd/network/&lt;/code&gt; need to match those in &lt;code&gt;/run/systemd/network/&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Loading Changes&lt;/h2&gt;
&lt;p&gt;You can either reboot, or you can restart systemd-networkd with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl restart systemd-networkd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Caveats&lt;/h2&gt;
&lt;p&gt;Some big caveats I've noticed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The IPv6 address on the WAN link (eg, eno1) comes from an RA ND assignment, not a DHCPv6 prefix. &lt;/li&gt;
&lt;li&gt;The individual LANs/VLANs don't appear to get IPv6 addresses assigned.  I haven't yet figured out how to get on-link addresses.  As such, &lt;code&gt;ip addr&lt;/code&gt; won't show addresses on those links.   (At least un Ubuntu 20.04)&lt;ul&gt;
&lt;li&gt;This seems fixed (or at least fixable) on Ubuntu 22.04.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A maximum of two interfaces is supported for delegating to on Ubuntu 20.04, but this is fixed in the version in 22.04.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Testing and Debugging&lt;/h2&gt;
&lt;p&gt;As of the systemd-networkd in Ubuntu 20.04 there aren't good ways to tell what is going on.
In particular, &lt;code&gt;networkctl status&lt;/code&gt; provides either no information or misleading information.
(In Ubuntu 22.04 there is more debugging information.)&lt;/p&gt;
&lt;p&gt;Some things that may be helpful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip -6 route list&lt;/code&gt; will list the prefixes assigned to the interfaces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdisc6 en-guest&lt;/code&gt; will do router discovery on that interface (eg, en-guest in this case) and will show the assigned prefix&lt;/li&gt;
&lt;li&gt;Doing a &lt;code&gt;tcpdump -s 1500 -vvv -i eno1 port 546 or port 547&lt;/code&gt; and then a &lt;code&gt;systemctl restart systemd-networkd&lt;/code&gt; will show the DHCPv6-PD lease including prefix length received from the WAN ISP&lt;/li&gt;
&lt;li&gt;Doing &lt;code&gt;journalctl -xeu systemd-networkd&lt;/code&gt; will give some logging information from systemd-networkd but I have yet to figure out how to get the most relevant parts logged.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;More network logging&lt;/h3&gt;
&lt;p&gt;Doing &lt;code&gt;systemctl edit systemd-networkd&lt;/code&gt; to add in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;SYSTEMD_LOG_LEVEL=debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And restart systemd-networkd service and looking at logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl restart systemd-networkd
journalctl -b -u systemd-networkd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Shows a little more info, but still not some of the things that I'd hope to see from looking
at the systemd-networkd code.&lt;/p&gt;
&lt;h2&gt;Future&lt;/h2&gt;
&lt;p&gt;I'll update this when I upgrade to Ubuntu 22.04 as hopefully it has some more features.
If you have any suggestions for better ways of doing things above, they are welcome.
I'm unfortunately unable to provide tech support for anything in the above, however...&lt;/p&gt;</content><category term="IPv6"></category><category term="Linux"></category><category term="IPv6"></category></entry><entry><title>10 Years Since World IPv6 Launch</title><link href="https://erik.nygren.org/2022-ten-years-since-w6l.html" rel="alternate"></link><published>2022-06-06T12:04:00-04:00</published><updated>2022-06-06T12:04:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2022-06-06:/2022-ten-years-since-w6l.html</id><summary type="html">&lt;p&gt;See my work blog post:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.akamai.com/blog/trends/10-years-since-world-ipv6-launch"&gt;10 Years Since World IPv6 Launch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Excerpt:&lt;/p&gt;
&lt;p&gt;The World IPv6 Launch event on June 6, 2012, was where Akamai, major web content providers, and internet service providers (ISPs) collaborated to overcome the inertia that had been holding back the widespread deployment of IPv6. IPv6 is …&lt;/p&gt;</summary><content type="html">&lt;p&gt;See my work blog post:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.akamai.com/blog/trends/10-years-since-world-ipv6-launch"&gt;10 Years Since World IPv6 Launch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Excerpt:&lt;/p&gt;
&lt;p&gt;The World IPv6 Launch event on June 6, 2012, was where Akamai, major web content providers, and internet service providers (ISPs) collaborated to overcome the inertia that had been holding back the widespread deployment of IPv6. IPv6 is the current generation of the Internet Protocol (IP) and it addresses the scalability issues inherent in legacy IPv4. Over the past decade, Akamai has witnessed massive growth in IPv6 adoption, bringing it from a narrowly used protocol to a default one that carries a majority of traffic for some customers and for some significant end-user populations.&lt;/p&gt;
&lt;p&gt;In the spirit of the 10th anniversary, this blog post will highlight 10 things that have improved with IPv6 deployment over these 10 years, as well as list another 10 areas where work still remains.&lt;/p&gt;
&lt;p&gt;As a general trend, the past decade has been about enabling IPv6 to live alongside IPv4 by dual-stacking networks and services, with some use of IPv6-centric networks that still have IPv4 access. Increasingly, we are seeing trends appear around enabling new capabilities and decreasing complexity through the use of IPv6-only networking.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.akamai.com/blog/trends/10-years-since-world-ipv6-launch"&gt;[... more ...]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Percentage of requests over IPv6 to a subset of dual-stack sites on Akamai from July 2013 to May 2022 for top 10 global economies (by GDP in 2022, per IMF)." src="https://erik.nygren.org/images/2022/ipv6-country.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.akamai.com/blog/trends/10-years-since-world-ipv6-launch"&gt;[... more ...]&lt;/a&gt;&lt;/p&gt;</content><category term="Internet"></category><category term="IPv6"></category><category term="Akamai"></category></entry><entry><title>Designing for multi-color 3D printing with OpenSCAD</title><link href="https://erik.nygren.org/2018-3dprint-multicolor-openscad.html" rel="alternate"></link><published>2019-01-02T22:30:00-05:00</published><updated>2019-01-02T22:30:00-05:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2019-01-02:/2018-3dprint-multicolor-openscad.html</id><summary type="html">&lt;p&gt;This post describes a way to make multi-color (multi-material / multi-extruder) objects in &lt;a href="https://www.openscad.org/"&gt;OpenSCAD&lt;/a&gt; suitable for 3D printing with a &lt;a href="https://shop.prusa3d.com/en/printer-upgrades/183-original-prusa-i3-mk3-multi-material-upgrade-kit.html"&gt;Prusa i3 MK3 MMU2&lt;/a&gt;.  It assumes basic familiarity with OpenSCAD, Slic3r, and using the Prusa MK3.  The snowman ornament shown here (&lt;a href="https://www.thingiverse.com/thing:3319509"&gt;thingiverse:3319509&lt;/a&gt;) was designed alongside with my five-year-old son and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This post describes a way to make multi-color (multi-material / multi-extruder) objects in &lt;a href="https://www.openscad.org/"&gt;OpenSCAD&lt;/a&gt; suitable for 3D printing with a &lt;a href="https://shop.prusa3d.com/en/printer-upgrades/183-original-prusa-i3-mk3-multi-material-upgrade-kit.html"&gt;Prusa i3 MK3 MMU2&lt;/a&gt;.  It assumes basic familiarity with OpenSCAD, Slic3r, and using the Prusa MK3.  The snowman ornament shown here (&lt;a href="https://www.thingiverse.com/thing:3319509"&gt;thingiverse:3319509&lt;/a&gt;) was designed alongside with my five-year-old son and then I used it to experiment with this approach to generate a multi-color ornament.&lt;/p&gt;
&lt;h3&gt;Background&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.openscad.org/"&gt;OpenSCAD&lt;/a&gt; allows you design and specify 3D models in a programming
language, and allows you to output one part at a time (such as into
an STL or AMF file).  &lt;a href="https://www.prusa3d.com/slic3r-prusa-edition/"&gt;Slic3r Prusa Edition&lt;/a&gt; is a slicer used to do
multi-color printing for the Prusa i3 MK3 MMU2.  It can import either
a multi-part AMF file or can load in a set of STL files, one for each
color/extruder.&lt;/p&gt;
&lt;p&gt;While &lt;a href="https://www.openscad.org/"&gt;OpenSCAD&lt;/a&gt; has support for applying colors to elements within
an object, it wasn't immediately clear how to leverage this to print a
multi-color object.  &lt;a href="https://github.com/openscad/openscad/issues/1608"&gt;OpenSCAD issue
1608&lt;/a&gt; aims to add
some more direct support, but it isn't resolved.&lt;/p&gt;
&lt;p&gt;The approach that I've taken here is define and embed a "multicolor()"
operator in the OpenSCAD object design which changes its behavior based
on a global variable.  I then export three separate STL files, one per color,
and then import these together into Slic3r.&lt;/p&gt;
&lt;p&gt;The full OpenSCAD file for the snowman are available &lt;a href="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/snowman-multicolor.scad"&gt;here&lt;/a&gt;, and I scaled this down by 60% before printing.&lt;/p&gt;
&lt;p&gt;For example, here is a rendering of the multi-color object in OpenSCAD:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snowman rendered in OpenSCAD" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/snowman-openscad.png"&gt;&lt;/p&gt;
&lt;h3&gt;Designing multi-color in OpenSCAD&lt;/h3&gt;
&lt;p&gt;I use this function to define a "multicolor" module:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Pick&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;below&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ALL&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;
&lt;span class="n"&gt;current_color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ALL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;current_color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;black&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;current_color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;white&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;current_color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;red&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Similar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;generating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;printing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;current_color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;indicates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;
&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;multicolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ALL&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;current_color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ignore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;our&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;originally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;scale([0,0,0])&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;also&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;works&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;isn&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;t needed.) &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This can then be used to allow different additive solids to be rendered
in different colors.  As a very basic use-case: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;multicolor(&amp;quot;red&amp;quot;) cube(20, center=true);
multicolor(&amp;quot;green&amp;quot;) translate([0,0,10]) sphere(10);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which when rendered with &lt;code&gt;current_color = "ALL";&lt;/code&gt; results in a multi-color object:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Simple sphere on cube" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/simple-sphere-on-cube.png"&gt;&lt;/p&gt;
&lt;p&gt;In this above case, you could switch to each of &lt;code&gt;current_color = "red";&lt;/code&gt; and &lt;code&gt;current_color = "green";&lt;/code&gt; one at a time, and then for each do a &lt;code&gt;Design-&amp;gt;Render (F6)&lt;/code&gt; followed by an export (&lt;code&gt;File-&amp;gt;Export-&amp;gt;Export as STL&lt;/code&gt;) as two separate files.&lt;/p&gt;
&lt;p&gt;This module works by only applying a color and rendering the children
when current_color is "ALL" or when it equals the color passed to
multicolor().  Otherwise it ignores the tree of elements underneath.&lt;/p&gt;
&lt;p&gt;Note that this only works well when additive primitives (such as
union) are used to combine multicolor objects.  You can have
subtractive primitives (difference/intersection) as children of
multicolor(), but with this approach you can't directly use subtractive
primitives on multicolor() objects.  (The color() function will make things
appear like they might work, but the resulting rendered parts won't be proper.)
I found that for many use-cases this limitation wasn't a problem.&lt;/p&gt;
&lt;p&gt;Note that this approach relies on Slic3r being OK with overlapping
parts within an object.  It has an ordering such that parts higher in
the list take precedence over parts lower in the list for an object.&lt;/p&gt;
&lt;p&gt;Once the object is designed, for each color:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment out all other colors&lt;/li&gt;
&lt;li&gt;Do a a &lt;code&gt;Design-&amp;gt;Render (F6)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Export the STL file (&lt;code&gt;File-&amp;gt;Export-&amp;gt;Export as STL&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, with the snowman example above here is what just red
looks like when rendered:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snowman rendered in OpenSCAD" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/snowman-openscad-red.png"&gt;&lt;/p&gt;
&lt;p&gt;I found it helpful to export the parts with filenames that can be
sorted in the order of the desired extruders.  For example with the
snowman I might export out three separate STLs with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/snowman-multicolor-1black.stl"&gt;snowman-multicolor-1black.stl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/snowman-multicolor-2red.stl"&gt;snowman-multicolor-2red.stl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/snowman-multicolor-3white.stl"&gt;snowman-multicolor-3white.stl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is because I wanted black and red to have precedence over white when
I load the parts into Slic3r.&lt;/p&gt;
&lt;h3&gt;Importing into Slic3r&lt;/h3&gt;
&lt;p&gt;Once you have STL exports, you'll want to import them into Slic3r
to get them ready to print.  Some initial steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you have the MMU2 Printer selected (such that multiple Filaments are available).&lt;/li&gt;
&lt;li&gt;Go to the &lt;code&gt;Printer Settings&lt;/code&gt; tab and for each Extruder on the side set the Extruder &lt;code&gt;Preview Color&lt;/code&gt; (eg, to black, red, and white).&lt;/li&gt;
&lt;li&gt;Update the &lt;code&gt;Purging Volumes&lt;/code&gt; on the main page.  This will open up a table.  Especially for a color such as white, you'll need to greatly increase the volume to purge while loading.  (Even upping from the default 70 to 150 still results in a pinkish or greyish hue to white on layers that also included red or black.)&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Add...&lt;/code&gt; and select all of the STL files, and say Yes when it asks to load them as multiple parts of a single object.&lt;/li&gt;
&lt;li&gt;Scale and rotate the object as desired.  I scaled this snowman ornament down by 60%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the object is loaded and positioned and scaled, double click on the loaded
object.  This should open a panel like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Parts of the object in Slic3r" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/Screenshot-slic3r-parts.png"&gt;&lt;/p&gt;
&lt;p&gt;For each part confirm you have the correct extruder selected.
Also make sure the parts are listed in the correct order,
using the up and down arrow buttons if you need to move the parts.
Again, higher parts in the list take precedence when there is overlap.&lt;/p&gt;
&lt;p&gt;Next double-check you've selected the right type of filament (eg, PLA
or PET) and then slice.  When you go and preview, you should be able
to see the object in the various colors (and if you scroll through
object layers you can confirm what interior parts will be which
colors.  For example, this is what the full sliced object looks like:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Multicolor object preview in Slic3r" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/Screenshot-slic3r.png"&gt;&lt;/p&gt;
&lt;p&gt;And this is what the an area with multiple colors in a single layer
looks like when adjusting to show the cross-section.  &lt;/p&gt;
&lt;p&gt;&lt;img alt="Multicolor object preview in Slic3r" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/Screenshot-slic3r-cut.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Side-note: I love using the &lt;a href="https://laplacean.wordpress.com/2018/05/17/gyroid-infill-tests/"&gt;gyroid
infill&lt;/a&gt;
for many reasons, but it really does look a little like brains in the
cross-section of heads --- and I learned the hard way that it thus
looks way to creepy when used in translucent colors for figurine
toys.)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Printing&lt;/h3&gt;
&lt;p&gt;Finally, make sure you load the filaments into the correct extruder
order for the printer.  I've sometimes found it helps to even include
the color order in the gcode filename so I don't forget.&lt;/p&gt;
&lt;p&gt;Then run your print.  I've unfortunately had bad luck getting the MMU2
to successfully complete prints.&lt;/p&gt;
&lt;p&gt;The more tool changes (ie, switching between colors on a layer), the
more chances of failure.  For example, my first attempt to print this
ornament had the red fail to load for the top layers in a way that
wasn't detected by the filament sensors.  I've also found poorly wound
filament to also be more likely to jam and result in failures with the
MMU2 than without it.  I've also had adhesion failures with the purge
tower cause failed prints, to make sure its first layer is laid down well
and restart the print if it doesn't look like this happened.&lt;/p&gt;
&lt;p&gt;But here is a successful print (60% scale in PLA, Fillamentum Extrafill Vertigo Grey, Fillamentum Pearl Ruby Red, and Hatchbox White):&lt;/p&gt;
&lt;p&gt;&lt;img alt="Successful print" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/snowman-on-printer-1.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Other notes&lt;/h3&gt;
&lt;p&gt;Some other design hints from my experimenting with designing
for multi-color printing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tool changes (ie, switching colors within a layer) takes &lt;em&gt;LOTS&lt;/em&gt; of time with the MMU2.  Because of this, printing a bunch of objects takes not much more time than printing one.  If printing an ornament, print a few and give the others away!&lt;/li&gt;
&lt;li&gt;Optimize for layer changes (ie, design to minimize the number of colors within a layer).  Think about object internals as well, and review in Preview to look for ways to reduce the number of colors in an object, such as by shrinking how much of an part is inside another part, or by reordering the parts.&lt;/li&gt;
&lt;li&gt;I've anecdotally seen poorer adhesion between different colors/parts within a layer.  It looks like Slic3r puts perimeters around each of the parts so with some design approaches you are relying purely on how well the perimeter layers adhere.  As such, having parts recessed some into other parts (such as by having the red and black details in the snowman take precedent over the white) can result in stronger structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Final Result&lt;/h3&gt;
&lt;p&gt;Here is the end-result of the snowman ornament hanging in our tree!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snowman ornament hanging in our tree" src="https://erik.nygren.org/images/2018-3dprint-multicolor-openscad/ornament-on-tree-1.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Coming next...&lt;/h3&gt;
&lt;p&gt;Soon to come: a blog post on how to use this technique to design and print a multi-color puzzle.&lt;/p&gt;</content><category term="Crafts"></category><category term="3D printing"></category><category term="OpenSCAD"></category></entry><entry><title>Cherry wood bookcase</title><link href="https://erik.nygren.org/2018-cherry-bookcase.html" rel="alternate"></link><published>2018-12-31T20:41:00-05:00</published><updated>2018-12-31T20:41:00-05:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2018-12-31:/2018-cherry-bookcase.html</id><summary type="html">&lt;p&gt;Project finished a few weeks ago: scratch-made cherry wood bookcase for our bedroom. We were getting tired of the piles of books accumulating on the floor from while to the older child after the earlier one had gone to sleep, plus this also gives us a place for the too-read-next …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Project finished a few weeks ago: scratch-made cherry wood bookcase for our bedroom. We were getting tired of the piles of books accumulating on the floor from while to the older child after the earlier one had gone to sleep, plus this also gives us a place for the too-read-next and partially finished books that otherwise accumulate on our nightstands. Plus you can never have too many bookcases. I've now made four bookcases in the house from scratch, but the previous three were painted.  This is now one of the nicer pieces of furniture we own.  :-)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=%2F2018%2F12-bookcase&amp;amp;image=IMG_1230_v1.JPG&amp;amp;maxDimension=800"&gt;&lt;img alt="Completed bookcase" src="https://nygren.org/gallery/image-cache/2018/12-bookcase/IMG_1230_v1_disp800.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If I'd planned further in advance I could have better hidden the nails used to hold on the top-molding, but a little brown sharpie causes them to disappear.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2018/12-bookcase&amp;amp;image=IMG_1233.JPG"&gt;&lt;img alt="Detail of top molding" src="https://nygren.org/gallery/image-cache/2018/12-bookcase/IMG_1233_disp800.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Detail of top molding&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2018/12-bookcase&amp;amp;image=IMG_1225.JPG"&gt;&lt;img alt="Completed bookcase" src="https://nygren.org/gallery/image-cache/2018/12-bookcase/IMG_1225_disp800.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I got most of the wood from [Anderson &amp;amp; McQuaid])http://www.andersonmcquaid.com/) in Cambridge, and the backings are 1/4" birch plywood from Rockler.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2018/12-bookcase&amp;amp;image=20181019_110749.jpg"&gt;&lt;img alt="Prior to staining" src="https://nygren.org/gallery/image-cache/2018/12-bookcase/20181019_110749_disp800.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Prior to staining and finishing&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I've been using &lt;a href="https://www.kregtool.com/store/c13/kreg-jigsreg/"&gt;Kreg
Jigs&lt;/a&gt; to do most of
the construction.  &lt;a href="http://www.ana-white.com/"&gt;Ana White's blog&lt;/a&gt; got
me started with using the Kreg Jig to make bookcases and other
furniture, which makes assembly of sturdy structures a breeze.  (This
&lt;a href="https://erik.nygren.org/building-a-little-helper-tower.html"&gt;helping
tower&lt;/a&gt; I
built previously used a similar construction technique).&lt;/p&gt;
&lt;p&gt;I stained the bookcase in OCS-116 Harvest Cherry from &lt;a href="https://woodwrightfinish.com/ohio-stain-collection-browser/"&gt;Woodwright
Finish&lt;/a&gt;
and ordered it directly from them.  The theory here is that if I order
some Amish furniture down the road, I should be able to get it in this
same finish.  I might have gone a little lighter in color in
retrospect to show the grain better, but I'm happy with how it turned
out.  I put on three top-coat layers of &lt;a href="https://generalfinishes.com/wood-finishes-retail/oil-based-topcoats/oil-based-gel-topcoat"&gt;General Finishes Oil-baed Gel
Topcoat&lt;/a&gt;
which I rubbed on with a cloth, working outside of course.  &lt;/p&gt;
&lt;p&gt;It took over a month for everything to outgas enough for us to be
willing to move the bookcase up to our bedroom, but now it is happily
full of books.&lt;/p&gt;</content><category term="Wood Working"></category><category term="bookcase"></category></entry><entry><title>Six years since World IPv6 Launch: entering the majority phases</title><link href="https://erik.nygren.org/2018-six-years-since-w6l.html" rel="alternate"></link><published>2018-06-06T12:04:00-04:00</published><updated>2018-06-06T12:04:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2018-06-06:/2018-six-years-since-w6l.html</id><summary type="html">&lt;p&gt;See my work blog post:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2018/06/six-years-since-world-ipv6-launch-entering-the-majority-phases.html"&gt;Six years since World IPv6 Launch: entering the majority phases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Excerpt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As reported in an ISOC report last year, IPv6 adoption is now
solidly in the "early majority phase" of the technology adoption
life cycle by many metrics (well past "innovators" and "early
adopters"), with …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;See my work blog post:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2018/06/six-years-since-world-ipv6-launch-entering-the-majority-phases.html"&gt;Six years since World IPv6 Launch: entering the majority phases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Excerpt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As reported in an ISOC report last year, IPv6 adoption is now
solidly in the "early majority phase" of the technology adoption
life cycle by many metrics (well past "innovators" and "early
adopters"), with progress beyond that in some areas. Akamai
continues to see solid growth in IPv6, including significant traffic
peaks during large events, and we continue to find cases where IPv6
outperforms IPv4.
&lt;/p&gt;
&lt;p&gt;Driven by the growth of Internet end-users outpacing the supply of
IPv4 addresses needed to number their devices, and a desire to plan
for a future IPv6-based Internet, many networks around the globe are
shifting to provisioning their end-users with IPv6
connectivity. Currently, IPv6 deployment in 7 of the top ten global
economies has reached a point where Akamai typically sees over 18%
of requests to IPv6-enabled sites using IPv6, with India (56%),
U.S. (46%), Germany (35%), Japan (28%), and Brazil (27%) being well
beyond this. We have come a long ways since World IPv6 Launch when
we reported seeing only around 1% of U.S. end-users using IPv6. With
around 80% of U.S. mobile end-users accessing IPv6-enabled Akamai
sites over IPv6 (and 90% from some carriers including Reliance Jio
in India), the adoption of IPv6 in the mobile space is well through
the "late majority" phase.&lt;/p&gt;
&lt;p&gt;Over the past year IPv6 has been enabled on many of the largest
online streaming events on the Internet, as delivered by Akamai,
such as numerous major sporting events including the VIVO IPL and
some major broadcasters of the Olympics. During these we've often
seen between roughly a quarter (¼) and two-thirds (⅔) of the global
event traffic delivered over IPv6, depending on the audience
distribution. We often see a considerably higher average throughput
to IPv6 end-users than to IPv4 end-users during dual-stacked events
(although some of this may be due to sample bias). We've even seen
multiple recent cases where massive IPv4-only events caused problems
for CGNAT middle-boxes but IPv6 traffic continued to flow unimpeded.&lt;/p&gt;
&lt;p&gt;For dual-stacked hostnames we typically see higher average estimated
throughput over IPv6 than over IPv4. Some of this may be due to
IPv6-connected users being correlated with better connectivity, but
over half of dual-stacked hostnames (weighted by daily bytes
delivered) have IPv6 estimated throughput at least 50% faster than
IPv4, and 90% of these hostnames have the IPv6 estimated throughput
at least 10% faster than IPv4. Individual sites and network
providers will vary (with IPv6 performing worse than IPv4 in some
cases). However the overall trend aligns with past results from
LinkedIn, Facebook, Akamai, and others that show IPv6 as delivering
significantly better performance than IPv4, especially in some
mobile networks.  As reported in an ISOC report last year, IPv6
adoption is now solidly in the "early majority phase" of the
technology adoption life cycle by many metrics (well past
"innovators" and "early adopters"), with progress beyond that in
some areas. Akamai continues to see solid growth in IPv6, including
significant traffic peaks during large events, and we continue to
find cases where IPv6 outperforms IPv4.&lt;/p&gt;
&lt;p&gt;Driven by the growth of Internet end-users outpacing the supply of
IPv4 addresses needed to number their devices, and a desire to plan
for a future IPv6-based Internet, many networks around the globe are
shifting to provisioning their end-users with IPv6
connectivity. Currently, IPv6 deployment in 7 of the top ten global
economies has reached a point where Akamai typically sees over 18%
of requests to IPv6-enabled sites using IPv6, with India (56%),
U.S. (46%), Germany (35%), Japan (28%), and Brazil (27%) being well
beyond this. We have come a long ways since World IPv6 Launch when
we reported seeing only around 1% of U.S. end-users using IPv6. With
around 80% of U.S. mobile end-users accessing IPv6-enabled Akamai
sites over IPv6 (and 90% from some carriers including Reliance Jio
in India), the adoption of IPv6 in the mobile space is well through
the "late majority" phase.&lt;/p&gt;
&lt;p&gt;Over the past year IPv6 has been enabled on many of the largest
online streaming events on the Internet, as delivered by Akamai,
such as numerous major sporting events including the VIVO IPL and
some major broadcasters of the Olympics. During these we've often
seen between roughly a quarter (¼) and two-thirds (⅔) of the global
event traffic delivered over IPv6, depending on the audience
distribution. We often see a considerably higher average throughput
to IPv6 end-users than to IPv4 end-users during dual-stacked events
(although some of this may be due to sample bias). We've even seen
multiple recent cases where massive IPv4-only events caused problems
for CGNAT middle-boxes but IPv6 traffic continued to flow unimpeded.&lt;/p&gt;
&lt;p&gt;For dual-stacked hostnames we typically see higher average estimated
throughput over IPv6 than over IPv4. Some of this may be due to
IPv6-connected users being correlated with better connectivity, but
over half of dual-stacked hostnames (weighted by daily bytes
delivered) have IPv6 estimated throughput at least 50% faster than
IPv4, and 90% of these hostnames have the IPv6 estimated throughput
at least 10% faster than IPv4. Individual sites and network
providers will vary (with IPv6 performing worse than IPv4 in some
cases). However the overall trend aligns with past results from
LinkedIn, Facebook, Akamai, and others that show IPv6 as delivering
significantly better performance than IPv4, especially in some
mobile networks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2018/06/six-years-since-world-ipv6-launch-entering-the-majority-phases.html"&gt;[...more...]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="IPv6 Country Adoption" src="https://erik.nygren.org/images/2018/ipv6-country.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2018/06/six-years-since-world-ipv6-launch-entering-the-majority-phases.html"&gt;[...more...]&lt;/a&gt;&lt;/p&gt;</content><category term="Internet"></category><category term="IPv6"></category><category term="Akamai"></category></entry><entry><title>Using a Logitech Touchpad as a light switch for Philips Hue light bulbs</title><link href="https://erik.nygren.org/using-a-logitech-touchpad-as-a-light-switch-for-philips-hue-light-bulbs.html" rel="alternate"></link><published>2016-03-25T22:52:00-04:00</published><updated>2016-03-25T22:52:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2016-03-25:/using-a-logitech-touchpad-as-a-light-switch-for-philips-hue-light-bulbs.html</id><summary type="html">&lt;p&gt;Our nursery lacked any light switches but did have some wall sconces. 
As part of redecorating the room prior to making it a nursery back in
2013, I replaced the old sconces with some newer ones from
&lt;a href="http://www.rejuvenation.com"&gt;Rejuvenation&lt;/a&gt; and installed a set of three &lt;a href="http://amzn.to/1RWrEWk"&gt;Philips Hue light
bulbs&lt;/a&gt;.  As Philips …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our nursery lacked any light switches but did have some wall sconces. 
As part of redecorating the room prior to making it a nursery back in
2013, I replaced the old sconces with some newer ones from
&lt;a href="http://www.rejuvenation.com"&gt;Rejuvenation&lt;/a&gt; and installed a set of three &lt;a href="http://amzn.to/1RWrEWk"&gt;Philips Hue light
bulbs&lt;/a&gt;.  As Philips did not yet have a &lt;a href="http://amzn.to/22pRwVy"&gt;good remote lightswitch&lt;/a&gt;
(which they've recently released), I had to hack together something to
allow the bulbs to be controlled by a switch near the door.&lt;/p&gt;
&lt;p&gt;My first attempt was to use an X10 wireless RF wall switch through an
Insteon PowerLinc USB gateway to some custom python software, but this
was quite flakey as I've had bad luck getting the PowerLinc to reliably
send me signals for extended periods of time, plus this relies on X10
which is fairly unreliable.  (This used the crazy control path of a
button push resulting in X10-over-RF to  X10-over-powerline to USB to an
HTTP-over-ethernet request to the Hue hub to ZigBee RF to the bulbs.)&lt;/p&gt;
&lt;p&gt;Even from the beginning, I also setup an experiment (which has worked
quite well) of having a cron job run every few minutes and update the
color temperature of the lights based on the time of day --- warm
lighting in the evenings and cool "daylight" in the mornings.  This has
worked quite well both for the Hue bulbs I have in my office as well as
those in the nursery (and in the &lt;a href="http://amzn.to/1PjoQAT"&gt;Lightstrip&lt;/a&gt; I've recently added
above some windows in our living room).&lt;/p&gt;
&lt;iframe src="https://www.youtube.com/embed/HWzJMHpNs9Y" height="315" width="560" allowfullscreen frameborder="0"&gt;&lt;/iframe&gt;

&lt;p&gt;Looking around for better ways to control the light bulbs, I had trouble
finding any sorts of reasonably priced RF switches with long battery
life and a robust way to get control information to a Linux machine (my
preferred gateway to my home automation).&lt;/p&gt;
&lt;p&gt;What I did find was the "&lt;a href="http://amzn.to/1PjoFW1"&gt;Logitech Wireless Touchpad with Multi-Touch
Navigation&lt;/a&gt;" which was $25 at the time:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://amzn.to/1PjoFW1"&gt;&lt;img alt="Logitech Wireless Touchpad with Multi-Touch Navigation" src="https://erik.nygren.org/images/2016/logitech-multitouch.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have software running on my Linux machine that reads this as a USB
Input device and then sends out commands to the bulbs via the Hue hub. 
This gave me two mouse buttons (left and right) which I repurposed for
"on" and "off".  I was able to use the gestures as additional input
control.  A single finger up/down gesture can be used to dim the
lights.  Two fingers left/right adjust the color temperature of the
lights (or the hue in color mode).  Finally, a "three finger up" gesture
puts the lights into "dim red mode" which is particularly good when
getting munchkins ready for bed or when stumbling into the nursery in
the middle of the night.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/enygren/hue-touchpad"&gt;Source code is available here on github&lt;/a&gt;, although it is meant as a
starting point for someone wanting to play with this, and is NOT an
easy-to-use off the shelf solution for someone not used to home
automation hacking in python.  It relies  on &lt;a href="https://github.com/issackelly/python-hue"&gt;isaackelly's python-hue&lt;/a&gt;
library.&lt;/p&gt;</content><category term="Home Automation"></category><category term="Baby"></category><category term="Software"></category><category term="Hue"></category><category term="Home Automation"></category></entry><entry><title>The Rebel Alliance S-Wing "Mamaroo" Training Pod</title><link href="https://erik.nygren.org/the-rebel-alliance-s-wing-mamaroo-training-pod.html" rel="alternate"></link><published>2016-03-19T18:09:00-04:00</published><updated>2016-03-19T18:09:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2016-03-19:/the-rebel-alliance-s-wing-mamaroo-training-pod.html</id><summary type="html">&lt;p&gt;Shortly after our son was born back in 2013, we got a used &lt;a href="https://www.amazon.com/gp/product/B00PK3EO1S/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B00PK3EO1S&amp;amp;linkCode=as2&amp;amp;tag=nygrenorg-20&amp;amp;linkId=VLHAE26T2F7PFNFD"&gt;Mamaroo&lt;/a&gt;
swing for him.  The Mamaroo's design looked enough like something out of
a sci-fi movie that it inspired me to decorate it like a Star Wars
X-Wing, cutting out the decorations using our Cricut.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://erik.nygren.org/images/2013-s-wing/s-wing-decorated.jpg"&gt;&lt;img alt="S-Wing Training Pod" src="https://erik.nygren.org/images/2013-s-wing/s-wing-decorated.medium.jpg" title="S-Wing Training Pod"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I designed …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Shortly after our son was born back in 2013, we got a used &lt;a href="https://www.amazon.com/gp/product/B00PK3EO1S/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B00PK3EO1S&amp;amp;linkCode=as2&amp;amp;tag=nygrenorg-20&amp;amp;linkId=VLHAE26T2F7PFNFD"&gt;Mamaroo&lt;/a&gt;
swing for him.  The Mamaroo's design looked enough like something out of
a sci-fi movie that it inspired me to decorate it like a Star Wars
X-Wing, cutting out the decorations using our Cricut.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://erik.nygren.org/images/2013-s-wing/s-wing-decorated.jpg"&gt;&lt;img alt="S-Wing Training Pod" src="https://erik.nygren.org/images/2013-s-wing/s-wing-decorated.medium.jpg" title="S-Wing Training Pod"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I designed the decals in &lt;a href="https://inkscape.org/en/"&gt;Inkscape&lt;/a&gt; and then used &lt;a href="http://www.craftedge.com/index.html"&gt;Sure-Cuts-A-Lot&lt;/a&gt;
to cut them out of &lt;a href="https://amzn.to/1RrRwix"&gt;repositionable adhesive-backed vinyl&lt;/a&gt;.  For the
Rebel Alliance logo, I used an &lt;a href="https://en.wikipedia.org/wiki/File:Rebel_Alliance_logo.svg"&gt;SVG off of the wikipedia page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2013-s-wing/s-wing-2.png"&gt;&lt;img src="/images/2013-s-wing/s-wing-2.png" style="width: 300px; height: 600px;"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I cut some additional copies of the artwork and used it to decorate my
laptop.&lt;/p&gt;
&lt;p&gt;The &lt;a href="/photos/2013-s-wing/"&gt;svg and scut2 files are available here&lt;/a&gt; for anyone who is
interested in using them.&lt;/p&gt;</content><category term="Crafts"></category><category term="Baby"></category><category term="cricut"></category><category term="Sure-Cuts-A-Lot"></category></entry><entry><title>Building a Little Helper Tower</title><link href="https://erik.nygren.org/building-a-little-helper-tower.html" rel="alternate"></link><published>2014-09-27T23:17:00-04:00</published><updated>2014-09-27T23:17:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2014-09-27:/building-a-little-helper-tower.html</id><summary type="html">&lt;p&gt;With our little munchkin now being very curious whenever we're working
in the kitchen, I decided to build him a &lt;a href="http://ana-white.com/2010/12/helping-tower.html"&gt;Helping Tower based on plans
from Ana White&lt;/a&gt;.  I haven't done many woodworking projects in awhile,
and certainly none of a larger size where finish quality mattered.  The
end result …&lt;/p&gt;</summary><content type="html">&lt;p&gt;With our little munchkin now being very curious whenever we're working
in the kitchen, I decided to build him a &lt;a href="http://ana-white.com/2010/12/helping-tower.html"&gt;Helping Tower based on plans
from Ana White&lt;/a&gt;.  I haven't done many woodworking projects in awhile,
and certainly none of a larger size where finish quality mattered.  The
end result came out quite nicely and is being enjoyed so far:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2014/09-helping-tower&amp;amp;image=IMG_2621.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2014/09-helping-tower/IMG_2621_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Given the amount of time that would be involved in making it, I decided
to use maple which also better matches the other furniture we have in
our kitchen.  I ended up making a bunch of modifications to the plans:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Due to the stock available, the corner posts ended up being 2x2's
  and other dimensions were adjusted accordingly.  I had to make
  adjustments to a few other pieces as well based on the stock that
  was available at &lt;a href="http://www.andersonmcquaid.com/"&gt;Anderson McQuaid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Based on someone else's idea, I also put in slats to allow the
  adjustable platform to be moved up to be a counter-height high
  chair.  I will need to put in safety straps before using it this
  way, however.&lt;/li&gt;
&lt;li&gt;I routed the top to give it a more finished look.  I also made more
  decorative feet to match the feet I added to our &lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2008/03-furniture&amp;amp;image=IMG_1198.JPG"&gt;kitchen nook table&lt;/a&gt; a few years back.&lt;/li&gt;
&lt;li&gt;The anti-tip feed on the side facing the counter can fold inwards to
  allow it to get closet in to the island.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;I used a &lt;a href="https://www.amazon.com/gp/product/B0044BBOQK/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B0044BBOQK&amp;amp;linkCode=as2&amp;amp;tag=nygrenorg-20&amp;amp;linkId=D4XERGXKON5EOV6M"&gt;Kreg Jig&lt;/a&gt; for the first time to create the pocket holes and
it worked very nicely and made assembly fairly straight-forward. 
Clamping in-place prior to screwing in turned out to be critical.  The
end result is quite sturdy.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2014/09-helping-tower&amp;amp;image=IMG_2665.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2014/09-helping-tower/IMG_2665_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=2014/09-helping-tower"&gt;More photos are here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The tower is finished with Zar's Honey Maple and then three coats of
General Finishing's &lt;a href="https://www.rockler.com/toymakers-finish"&gt;Toy Maker's Finish&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Close up of the folding feet on one side:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2014/09-helping-tower&amp;amp;image=IMG_2668.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2014/09-helping-tower/IMG_2668_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I put plugs into the upper pocket holes to make them look better:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2014/09-helping-tower&amp;amp;image=IMG_2656.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2014/09-helping-tower/IMG_2656_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="Wood Working"></category><category term="Baby"></category><category term="learning tower"></category></entry><entry><title>Making a board book inspired by the Hobbit</title><link href="https://erik.nygren.org/making-a-board-book-inspired-by-the-hobbit.html" rel="alternate"></link><published>2014-06-08T16:51:00-04:00</published><updated>2014-06-08T16:51:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2014-06-08:/making-a-board-book-inspired-by-the-hobbit.html</id><summary type="html">&lt;p&gt;&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/book.html"&gt;(For pictures of all of the pages, click here.)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Shortly after my son was born I found that I was spending large amounts
of time singing tunes and reading poems out of "board books" for
children.  For the uninitiated, a board book is a book for babies
printed on thick …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/book.html"&gt;(For pictures of all of the pages, click here.)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Shortly after my son was born I found that I was spending large amounts
of time singing tunes and reading poems out of "board books" for
children.  For the uninitiated, a board book is a book for babies
printed on thick paperboard.  This makes it easy for little fingers to
turn, but also hard for them to tear.  In addition to reading many old
classics (such as &lt;a href="https://www.amazon.com/gp/product/0694003611/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0694003611&amp;amp;linkCode=as2&amp;amp;tag=nygrenorg-20&amp;amp;linkId=6OE3HPE6FFKPVP4F"&gt;Goodnight Moon&lt;/a&gt; and Sandra Boynton's &lt;a href="https://www.amazon.com/gp/product/0671449028/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0671449028&amp;amp;linkCode=as2&amp;amp;tag=nygrenorg-20&amp;amp;linkId=SGQR6CXBDPIQOX2X"&gt;The
Going-To-Bed Book&lt;/a&gt;), I also looked for other types of "classics"
to introduce.  I ordered a copy of &lt;a href="https://www.amazon.com/gp/product/0618009345/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0618009345&amp;amp;linkCode=as2&amp;amp;tag=nygrenorg-20&amp;amp;linkId=FOVZREDSPUFEW5BO"&gt;Poems from The Hobbit&lt;/a&gt;, a
wonderful collection of Tolkein's poems from The Hobbit.  However, its
3" square form factor with thin pages made it not the best book for a
small baby.  While local stores such as &lt;a href="https://www.facebook.com/MagpieKidsStore"&gt;Magpie Kids&lt;/a&gt; had board books
like the &lt;a href="https://www.amazon.com/gp/product/1927018129/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1927018129&amp;amp;linkCode=as2&amp;amp;tag=nygrenorg-20&amp;amp;linkId=FEFPMAOO6CY3UUQ3"&gt;Cozy Classics version of Pride and Prejudice&lt;/a&gt;, they
had little to no sci-fi or fantasy for babies.  This inspired me to make
a board book of Bilbo's &lt;a href="https://en.wikipedia.org/wiki/The_Road_Goes_Ever_On_%28song%29"&gt;Old Walking Song ("Roads Go Ever On")&lt;/a&gt; out of
the Hobbit.&lt;/p&gt;
&lt;p&gt;After working on it off-and-on for a few months, the finished copy
finally arrived in the mail:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/projects/hobbit-board-book/finished-book.jpg"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/finished-book.medium.jpg" alt="The finished book: Roads Go Ever On"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/book.html"&gt;Each page&lt;/a&gt; has a few
lines from the poem over an (often heavily touched-up) photo, generally
of a road going somewhere.  All of the photos are from my various
travels and are of places including from Maine, Portugal, Croatia,
Washington State, Hawaii, Russia, New Hampshire, and finally near my own
childhood home in California.  I'd considered doing some other form of
artwork such as watercolor, but this seemed like a good use of photos
that I've taken over the years and also means that I can tell a story
with each one as my son gets older.  I edited some of the photos to look
a little more like illustrations, but I also didn't want to go
over-the-top here.  The cover is actually a composite of three separate
photos.  &lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/book.html"&gt;The full set of images on each of the pages is here if you'd
like to see the full book.&lt;/a&gt; Here is a sample page spread:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p5.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p5.png" style="width: 663px;"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I used Inkscape to do composition of the pages, gimp to do photo
editing, the &lt;a href="http://www.thehutt.de/tolkien/fonts/ringbearer/readme.html"&gt;Ringerbearer font&lt;/a&gt;, and then exported them to pdf files
for printing.  I did change one word in the poem ("horror" to
"darkness") as this seemed a little more appropriate for a young child's
book. &lt;a href="https://customboardbooks.pintsizeproductions.com/category/blank-board-books"&gt;Pint Size Productions&lt;/a&gt; did the printing and did a great job. 
If you would like to print your own copy for &lt;strong&gt;private and
non-commercial use&lt;/strong&gt;, you can &lt;a href="https://nygren.org/projects/hobbit-board-book/roads-go-ever-on-boardbook-v2.zip"&gt;download this zip file of the PDFs&lt;/a&gt; and
upload it to &lt;a href="https://customboardbooks.pintsizeproductions.com/category/blank-board-books"&gt;Pint Size Productions&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Other Pages&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/cover.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/cover.png" style="width: 663px;"&gt;&lt;/a&gt;
&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p1.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p1.png" style="width: 663px;"&gt;&lt;/a&gt;
&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p2.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p2.png" style="width: 663px;"&gt;&lt;/a&gt;
&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p3.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p3.png" style="width: 663px;"&gt;&lt;/a&gt;
&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p4.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p4.png" style="width: 663px;"&gt;&lt;/a&gt;
&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p5.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p5.png" style="width: 663px;"&gt;&lt;/a&gt;
&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p6.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p6.png" style="width: 663px;"&gt;&lt;/a&gt;
&lt;a href="https://nygren.org/projects/hobbit-board-book/export2-150/p7.png"&gt;&lt;img src="https://nygren.org/projects/hobbit-board-book/export2-150/p7.png" style="width: 663px;"&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="Crafts"></category><category term="baby"></category><category term="crafts"></category><category term="photography"></category></entry><entry><title>IPv6 by the numbers: strong growth in second half of 2013</title><link href="https://erik.nygren.org/ipv6-by-the-numbers-strong-growth-in-second-half-of-2013.html" rel="alternate"></link><published>2014-03-04T08:13:00-05:00</published><updated>2014-03-04T08:13:00-05:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2014-03-04:/ipv6-by-the-numbers-strong-growth-in-second-half-of-2013.html</id><summary type="html">&lt;p&gt;&lt;a href="https://blogs.akamai.com/2014/03/ipv6-by-the-numbers-strong-growth-in-second-half-of-2013.html"&gt;See my new work blog post.&lt;/a&gt; Excerpt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No longer is IPv6 "just around the corner". It's here. In the
half-year following when I last wrote about &lt;a href="https://blogs.akamai.com/2013/06/world-ipv6-launch-anniversary-measuring-adoption-one-year-later.html"&gt;our measurements of IPv6
adoption&lt;/a&gt;, many of the metrics we were tracking have doubled. This
is in large part due to increased adoption of …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://blogs.akamai.com/2014/03/ipv6-by-the-numbers-strong-growth-in-second-half-of-2013.html"&gt;See my new work blog post.&lt;/a&gt; Excerpt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No longer is IPv6 "just around the corner". It's here. In the
half-year following when I last wrote about &lt;a href="https://blogs.akamai.com/2013/06/world-ipv6-launch-anniversary-measuring-adoption-one-year-later.html"&gt;our measurements of IPv6
adoption&lt;/a&gt;, many of the metrics we were tracking have doubled. This
is in large part due to increased adoption of IPv6 by residential
broadband networks in the U.S.A. and Germany. As of December 2013, we
were serving over 20 billion IPv6 requests per day, double the 10
billion per day delivered just six months prior.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2014/03/ipv6-by-the-numbers-strong-growth-in-second-half-of-2013.html#more"&gt;[...more...]&lt;/a&gt;&lt;/p&gt;</content><category term="Internet"></category><category term="IPv6"></category><category term="Akamai"></category></entry><entry><title>Launching Forward with IPv6</title><link href="https://erik.nygren.org/launching-forward-with-ipv6.html" rel="alternate"></link><published>2012-05-31T12:04:00-04:00</published><updated>2012-05-31T12:04:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2012-05-31:/launching-forward-with-ipv6.html</id><summary type="html">&lt;p&gt;See my work blog post:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2012/05/launching-forward-with-ipv6.html"&gt;Launching Forward with IPv6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Excerpt...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With the &lt;a href="http://en.wikipedia.org/wiki/IPv4_address_exhaustion"&gt;era of freely available IPv4 addresses nearing its end&lt;/a&gt;,
I'm pleased to see that 2012 appears to be the year when the &lt;a href="http://en.wikipedia.org/wiki/IPv6"&gt;IPv6&lt;/a&gt;
Internet will finally reach maturity and launch into wide-scale
commercial use.  For over a decade …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;See my work blog post:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2012/05/launching-forward-with-ipv6.html"&gt;Launching Forward with IPv6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Excerpt...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With the &lt;a href="http://en.wikipedia.org/wiki/IPv4_address_exhaustion"&gt;era of freely available IPv4 addresses nearing its end&lt;/a&gt;,
I'm pleased to see that 2012 appears to be the year when the &lt;a href="http://en.wikipedia.org/wiki/IPv6"&gt;IPv6&lt;/a&gt;
Internet will finally reach maturity and launch into wide-scale
commercial use.  For over a decade, the groundwork for the migration
to version 6 of the Internet Protocol (IPv6) has been built, with
changes to operating systems, client and server software, routers, and
Internet backbone networks.  To-date, however, the availability of
IPv6 content and end-users has remained slim with &lt;a href="http://www.vyncke.org/ipv6status/detailed.php?country=us"&gt;few Web sites being
available over IPv6&lt;/a&gt; and &lt;a href="http://www.google.com/intl/en/ipv6/statistics/"&gt;with just over 0.5% of global Internet
users having IPv6 connectivity that their machines will elect to
use&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://blogs.akamai.com/2012/05/launching-forward-with-ipv6.html"&gt;[...more...]&lt;/a&gt;&lt;/p&gt;</content><category term="Internet"></category><category term="IPv6"></category><category term="Akamai"></category></entry><entry><title>Norse plaque inspired by an old fireback</title><link href="https://erik.nygren.org/norse-plaque-inspired-by-an-old-fireback.html" rel="alternate"></link><published>2012-05-14T00:25:00-04:00</published><updated>2012-05-14T00:25:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2012-05-14:/norse-plaque-inspired-by-an-old-fireback.html</id><summary type="html">&lt;p&gt;Ever since my early childhood I have fond memories of going to Camp
Happy, my great aunt and uncles summer home up in Door County,
Wisconsin.  The home was supposedly built as a replica of a hunting
lodge from the Old World.  Installed above the fireplace was a wonderful
bronze …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ever since my early childhood I have fond memories of going to Camp
Happy, my great aunt and uncles summer home up in Door County,
Wisconsin.  The home was supposedly built as a replica of a hunting
lodge from the Old World.  Installed above the fireplace was a wonderful
bronze relief with a Norse design.  A viking ship tosses on a stormy sea
below shields likely representing Thor and Odin, and two serpents form
the border.  I have many wonderful memories of family up at Camp Happy;
watching the sunset over the great lakes, eating out on the screened-in
porch, walking through the woods out to High Bluff, but especially
relaxing and talking into the night in the fire-lit living room.&lt;/p&gt;
&lt;p&gt;For years I've had a desire to make a replica of the bronze plaque above
the fireplace mantle, so last year I started on the project.  While I
wanted to get an end result that was very close in style, I wasn't
aiming to end up with an exact copy.  After about six months of working
on-and-off on the project in some spare time over the weekends, I was
successful.  Here's the final version installed next to my parents'
fireplace in California:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120429_IMG_4941.jpg"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120429_IMG_4941_disp640.jpg" alt="The completed plaque installed on my parents' fireplace."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The completed plaque installed on my parents' fireplace.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To give some context, below is the original plaque installed in Camp
Happy's fireplace mantle.  While I'm not sure of its origin story, one
possibility is that it is a bronze casting of cast iron &lt;a href="https://https://en.wikipedia.org/wiki/Fireplace_fireback"&gt;fireplace
fireback&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/albums/2012/05-viking-plaque/20020711_IMG_2245.jpg"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20020711_IMG_2245_disp512.jpg" alt="The fireplace at Camp Happy"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20020712_img_2243%20%28Modified%29.jpg"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20020712_img_2243%20%28Modified%29_disp512.jpg" alt="The original plaque on the fireplace at Camp Happy. "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The process I followed to create this...&lt;/h2&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20110903_P1000010.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20110903_P1000010_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Backing board for setup to pour wax from a double-boiler. Packing tape was used for the side-walls of the mold.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I started off by printing a photo of the original scaled to the desired
size and overlain with a grid.  From this, I took a piece of MDF and cut
it to the right shape to make the backing.  While I used 1/2" MDF, this
ended up resulting in a much thicker casting in the end.  I would have
been better off using a much thinner backing board (such as 1/8").&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20110903_P1000012.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20110903_P1000012_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Part way through pouring the wax. A digital thermometer was used to control the temperature of the double-boiler.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I leveled the backing board on a table, put nails into it to gauge
height, and used sides of packing tape to make a mold.  Donning
appropriate protective gear (full face mask, respirator, long-sleeves,
and working outside), I used a in improvised double-boiler to melt
&lt;a href="https://www.sculpt.com/catalog_98/Wax/Micro.htm"&gt;"Victory Brown" sculpture wax&lt;/a&gt; and then poured it onto the backing
board to the desired depth.  &lt;em&gt;(If you try this, make sure to take
appropriate safety precautions!)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Once it cooled, I cleaned up the wax surface and edges using various
carving tools so that I would have a good blank to start from.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20110905_P1000015%20%28Modified%29.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20110905_P1000015%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;The wax blank after some cleanup and smoothing to make it flat.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Next, I used a loop tool to rough-in the design.  In retrospect, I ended
up carving deeper than I probably intended to, resulting a deeper
relief.  If I was to do this again I might start off carving more
shallowly.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20110907_P1000019%20%28Modified%29.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20110907_P1000019%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Roughing-in the design, primarily using ribbon tools.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I worked from the upper left corner down to the bottom right corner.  I
was primarily using &lt;a href="https://www.amazon.com/gp/product/B000SVRSRY/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nygrenorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000SVRSRY"&gt;wax carving tools&lt;/a&gt;, along with a metal loop
tool.  I also would sometimes use a piece of canvas or nylons to smooth
our the wax (almost acting like sandpaper).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20111120_P1020570.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20111120_P1020570_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;In-progress, but no cleanup yet. Working on the details from the upper-left down to the lower-right.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Below is the initial completed version before I refined it...  One thing
I changed was the symbol in the upper right shield.  It seemed to be
impossible to find a Norse symbol for Odin or the sun that hasn't been
subverted so I finally just made something up that fit the space and
still looked a little like a sun.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20111216_IMG_5273.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20111216_IMG_5273_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Initial version before refinements.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I took it over to the foundry and got a number of suggestions for things
I needed to do differently before casting it.  In particular, I needed
to smooth the edges so the sand wouldn't catch, make sure that
everything had enough draft (diagonal slope) and no undercuts, and then
coat it with a hard lacquer so that the sand wouldn't stick to the wax. 
I also used the opportunity to make some improvements suggested by my
mom: improving the leading edge of the sail and changing the position of
the oars to give them a more definitive line.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120226_IMG_5769%20%28Modified%29.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120226_IMG_5769%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;The final wax, before being laquered and cast. Refinements included changing the oar location, the sail shape, and ensuring that there was a proper angle everywhere to get a good draft.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120226_IMG_5778.JPG"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120226_IMG_5778_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Close-up of the final wax.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120226_IMG_5780.JPG"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120226_IMG_5780_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Close-up of the final wax.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;With the wax prepared, I took it over to &lt;a href="https://www.mysticvalleyfoundry.com/"&gt;Mystic Valley Foundry&lt;/a&gt; in
Somerville and had them make two aluminum sand castings.  (Given the
thickness due to the backing board, bronze would have been way too
heavy.)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=%2F2012%2F05-viking-plaque&amp;amp;image=20120331_aluminum-castings-2.JPG&amp;amp;maxDimension=640"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120331_aluminum-castings-2_disp640.jpg"&gt;&lt;/a&gt;
&lt;em&gt;The aluminum sand castings, just back from Mystic Valley Foundry&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The castings came back in about two weeks.  Each of them had its own
natural imperfections from the casting process.  The next step was to
take one of them and clean it up.  After a day with a &lt;a href="https://www.amazon.com/gp/product/B002L3RUW0/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nygrenorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B002L3RUW0"&gt;dremel tool&lt;/a&gt;
and hand files, I had the piece cleaned up nicely.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120413_IMG_5933%20%28Modified%29.JPG"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120413_IMG_5933%20%28Modified%29_disp640.jpg"&gt;&lt;/a&gt;
&lt;em&gt;One of the castings after being cleaned up with a dremel tool and hand files.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To prepare for finishing, I primed the plaque with an aluminum spray
primer so that the top coat would bond better.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120415_IMG_5937%20%28Modified%29.JPG"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120415_IMG_5937%20%28Modified%29_disp640.jpg"&gt;&lt;/a&gt;
&lt;em&gt;After priming with self-etching aluminum primer.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I then used an &lt;a href="https://www.amazon.com/gp/product/B000BPWT76/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nygrenorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000BPWT76"&gt;airbrush&lt;/a&gt; to apply &lt;a href="https://www.amazon.com/gp/product/B000Z4DNPK/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nygrenorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000Z4DNPK"&gt;Modern Masters reactive bronze
paint&lt;/a&gt;.  (I'd experimented with some other types of coatings to get a
bronze finish, and I'd also tried applying this with a brush, but
neither worked well enough.)  As with all of the other steps (spray
painting, using the dremel tool, etc), having adequate face protection
is key.  The &lt;a href="https://www.amazon.com/gp/product/B0002STR86/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nygrenorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B0002STR86"&gt;3M full-facepiece respirators&lt;/a&gt; work well as they don't
fog up like separate googles and respirators do.&lt;/p&gt;
&lt;p&gt;The result of the bronze spray painting turned nicely, and might not
have been a bad place to stop, but it looks a little too "new".&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120415_IMG_5940%20%28Modified%29.JPG"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120415_IMG_5940%20%28Modified%29_disp640.jpg"&gt;&lt;/a&gt;
&lt;em&gt;After airbrushing with Modern Masters bronze paint.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I then applied the a second coat of paint and while it was still wet
applied the &lt;a href="https://www.amazon.com/gp/product/B000I1VF0K/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nygrenorg-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000I1VF0K"&gt;Modern Masters blue patina aging solution&lt;/a&gt;.  After it was
on for a bit, I wiped it off to stop the reaction.&lt;/p&gt;
&lt;p&gt;It turns out to be very fussy to get the right look out of the patina. 
I tried doing some touch-up, but it seemed like each time I tried I made
things a little worse.  I finally decided to stop.  One lesson I learned
a little too late is that the blue patina aging solution leaves some
white copper salts behind.  After the paint has dried you can remove
them with a damp towl for a better end result.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120427_IMG_6098%20%28Modified%29.JPG"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120427_IMG_6098%20%28Modified%29_disp640.jpg"&gt;&lt;/a&gt;
&lt;em&gt;After applying patina&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120427_IMG_6103.JPG"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120427_IMG_6103_disp640.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120427_IMG_6111%20%28Modified%29.JPG"&gt;&lt;img src="https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120427_IMG_6111%20%28Modified%29_disp640.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To install the plaque, I mounted some brackets in the back and used
those to hang it on the fireplace.  I'm quite pleased with the finished
result.  We also setup a spotlight with an MR16 GU10 LED bulb for
illumination at light.&lt;/p&gt;
&lt;p&gt;Now that it's done I'll need to figure out what project to work on next
--- after we finish our kitchen remodel.  At some point I should also
finish up the second one, as well as see how well I can make a resin
casting (which might be much cheaper and lighter than the aluminum
casting, albeit not as nifty).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2012/05-viking-plaque&amp;amp;image=20120429_IMG_4938.jpg"&gt;&lt;img src=" https://nygren.org/gallery/image-cache/2012/05-viking-plaque/20120429_IMG_4938_disp640.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Me with the finished plaque in-front of my parents' fireplace.&lt;/em&gt;&lt;/p&gt;</content><category term="Crafts"></category><category term="carving"></category><category term="casting"></category><category term="relief"></category><category term="wax"></category></entry><entry><title>Experimenting with Cricut-assisted leather tooling</title><link href="https://erik.nygren.org/experimenting-with-cricut-assisted-leather-tooling.html" rel="alternate"></link><published>2011-05-15T16:07:00-04:00</published><updated>2011-05-15T16:07:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2011-05-15:/experimenting-with-cricut-assisted-leather-tooling.html</id><summary type="html">&lt;p&gt;Recently, our friends Ariel and Andy inspired me to try using the Cricut
(a 2D cutting plotter that can be controlled with third-party software
called Sure-Cuts-A-Lot) to assist in leather-tooling and provided some
leather scraps to try with.  (I'd tried with the wrong type of leader
before without useful effect …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recently, our friends Ariel and Andy inspired me to try using the Cricut
(a 2D cutting plotter that can be controlled with third-party software
called Sure-Cuts-A-Lot) to assist in leather-tooling and provided some
leather scraps to try with.  (I'd tried with the wrong type of leader
before without useful effect.  Ariel suggested that it is necessary to
use tooling leather.)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=%2F2011%2F05-cricut-leather-tooling&amp;amp;image=IMG_6876.JPG&amp;amp;maxDimension=512"&gt;&lt;img alt="Gears design, cut on the cricut and tooled." src="https://nygren.org/gallery/image-cache/2011/05-cricut-leather-tooling/IMG_6876_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Gears design, cut on the cricut and tooled.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Of the various leather scraps I tried, it appears necessary to use
reasonably thin "tooling leather" with the deep-cut blade holder.  The
normal blade holder doesn't provide enough clearance (this seems to be
one major difference between them).  Setting the blade to a depth of
around 4-5 seems to work fine (I haven't extensively tried other
depths).  In addition to using the deep-cut blade, I also tried using a
modified bit that I made (from sawing down a nail of the same diameter
of the Cricut blades) and it seems to score the leather somewhat in a
way that can come out better with a wash.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/05-cricut-leather-tooling&amp;amp;image=IMG_6879.JPG"&gt;&lt;img alt="Fleur-de-lis pattern before coloring." src="https://nygren.org/gallery/image-cache/2011/05-cricut-leather-tooling/IMG_6879_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Fleur-de-lis pattern before coloring.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I tried two patterns to experiment with: for the first one I used a
fleur-de-lis pattern built into the Cricut.  For the second pattern, I
used a Steampunk-style gears design that I put together in Inkscape. 
For the very small patterns, just holding the leather to the Cricut's
cutting mat worked ok.  For the larger pattern, the leather wouldn't
hold effectively.  After trying a few glues (rubber cement, superglue)
which didn't work, I tried stapling the leather to a worn cutting mat. 
That seems to actually work reasonably well, although it's important to
ensure the staple doesn't get caught in the Cricut's mechanism.  The
biggest problem that I encountered was that the Cricut appears to lose
registration for complex leather patterns, possibly due to the thickness
of the leather interfering with the in-and-out rolling distance movement
assumptions, or due to the mat shifting due to the leather scrap not
having uniform thickness.  I will need to experiment a few more times,
although I'll need to get more large scraps first.&lt;/p&gt;
&lt;p&gt;Following cutting the designs into the leather, I used a mixture of
tools to work the leather after spraying it with water.  In addition to
the basic Tandy leather tools, I also found that jewelry screwdrivers
worked extremely well for tooling smaller parts of the design.  As this
is my first attempt (and as the Cricut mat slipped a few times with the
gears design), some parts didn't work out as well as I'd hoped.&lt;/p&gt;
&lt;p&gt;Following the cutting and the tooling, I then tried to color them.  For
the fluer-de-lis pattern, I used a mixture of acrylic paint (Jo Sonja
Burnt Umber) with antiquing medium and then wiped it off immediately.  I
really like the result:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/05-cricut-leather-tooling&amp;amp;image=IMG_6882%20%28Modified%29.JPG"&gt;&lt;img alt="Fleur-de-lis after coloring.  The pattern in the upper-left wasn't actually cut, but was embossed into the leather with my modified &amp;quot;nail bit&amp;quot; on the Cricut." src="https://nygren.org/gallery/image-cache/2011/05-cricut-leather-tooling/IMG_6882%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt;
&lt;em&gt;Fleur-de-lis after coloring.  The pattern in the upper-left wasn't actually cut, but
was embossed into the leather with my modified "nail bit" on the Cricut.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the gears design, I then painted it using acrylic paints, also using
some antiquing medium (and rubbing some of the darker color off).  Note
that some of the gears pattern is off as the Cricut slipped and cut some
things in the wrong places.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/05-cricut-leather-tooling&amp;amp;image=IMG_6884.JPG"&gt;&lt;img alt="3" src="https://nygren.org/gallery/image-cache/2011/05-cricut-leather-tooling/IMG_6884_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/05-cricut-leather-tooling&amp;amp;image=IMG_6887.JPG"&gt;&lt;img alt="4" src="https://nygren.org/gallery/image-cache/2011/05-cricut-leather-tooling/IMG_6887_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm going to have to play with making a few more
other things with this technique.  I will need to find ways to minimize
the impact of the Cricut slipping on the material.  In general, I think
the more organic/natural/older designs may work better than something
industrial such as gears.  At some point I'll have to try making some
larger pieces as well, although I have a few other projects that I need
to work more on first.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: We seem to be using our Cricut for plenty of crafty projects,
including many wedding projects.  I've recommended the Cricut that we
have to a few people, but given that they are now suing the makers of
the Sure-Cuts-A-Lot software that makes it useful to us, I can no longer
recommend the Cricut.  It looks like there are a number of new entrants
to this market since we got ours that are hopefully less litigious
against people who make their devices actually useful, so we may explore
getting one of those at some point.&lt;/em&gt;&lt;/p&gt;</content><category term="Crafts"></category><category term="Cricut"></category><category term="leather"></category><category term="leather tooling"></category><category term="SCAL2"></category><category term="Sure-Cuts-A-Lot"></category></entry><entry><title>Our wedding software</title><link href="https://erik.nygren.org/our-wedding-software.html" rel="alternate"></link><published>2011-04-30T19:40:00-04:00</published><updated>2011-04-30T19:40:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2011-04-30:/our-wedding-software.html</id><summary type="html">&lt;p&gt;When Ksusha and I got married, I decided to use it as an opportunity to
write some software to manage all aspects of our wedding, from tracking
guests and RSVPs to generating place cards for printing.  Given that
half of the fun of wedding preparation (for us at least) was …&lt;/p&gt;</summary><content type="html">&lt;p&gt;When Ksusha and I got married, I decided to use it as an opportunity to
write some software to manage all aspects of our wedding, from tracking
guests and RSVPs to generating place cards for printing.  Given that
half of the fun of wedding preparation (for us at least) was DIY
projects, what better than to mix in a DIY software project? &lt;!--  You can
see the public results of my efforts at wedding.eriksu.org (although
most of the interesting features are hidden within the RSVP and admin
interfaces). --&gt;&lt;/p&gt;
&lt;p&gt;After requests from a few friends, I finally got around to packaging up
and posting this software as a starting-point for others (and you can
&lt;a href="https://nygren.org/projects/djwed/"&gt;download it here&lt;/a&gt;).  I'm releasing it under the MIT License, meaning
you can pretty much do whatever you want with it as long as you don't
sue me, even if some bug somehow ruins your perfect day.&lt;/p&gt;
&lt;p&gt;The djWed package is personal web-based wedding management software
written in the Python Django web framework.  This is intended entirely
as a starting point of code to develop from, and is not intended to be
something that works out-of-the-box.  Rather, it is  software that you
can hack to do what you want.&lt;/p&gt;
&lt;p&gt;When writing software for your own wedding, one initially encounters a
pleasant design constraint that is rarely encountered in software
engineering: code designed to be used exactly once.  In fact, I intend
to get married exactly once (now complete) and thus never use djWed ever
again.&lt;/p&gt;
&lt;p&gt;This meant that I took many short-cuts that I might not have otherwise
taken, but which made sense for expediency.  For example, generating
mass emails or PDF/PS output from SVG templates is fairly awkward. 
However, it didn't make sense for me to develop an elegant user
experience for functions that would be executed exactly once by just one
person.  Similarly, I hard-coded in that I'd have two wedding and
reception venues ("MA" and "CA") as that&lt;br&gt;
simplified some code.  I was also much worse about documenting the code
or developing regression or unit tests than I would have been if I was
developing production software.&lt;/p&gt;
&lt;p&gt;However, now that our wedding is finished, some friends have asked to
use this code.  As such, these friends may need to live with the
consequences of these decisions if they wish to start from this code
base.  They will encounter many bugs, hacks, quirks, and perhaps even a
few squirrels.  If you are one of these people, you are welcome to do
the same as I did and adapt the code for your single use, or you can do
cleanup to generalize this software so that it could more readily be
used by others.  If you do clean it up and post it, let me know so I can
link to it from here.&lt;/p&gt;
&lt;p&gt;Some of the features included are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Track guests and invitees (where each invitee may consist of
    multiple guests).&lt;/li&gt;
&lt;li&gt;Each invitee has an "invite code" that they can use to login.&lt;/li&gt;
&lt;li&gt;Invitees can update their contact information and leave comments.&lt;/li&gt;
&lt;li&gt;Invitees can RSVP and select meals and other options.&lt;/li&gt;
&lt;li&gt;Send mass emails to invitees with form-filling.&lt;/li&gt;
&lt;li&gt;Web-based reports on RSVPs, meal selections, and more.&lt;/li&gt;
&lt;li&gt;Spreadsheet exports of reports.&lt;/li&gt;
&lt;li&gt;Gift and thank-you note tracking.&lt;/li&gt;
&lt;li&gt;Generate mailing labels for invitees.&lt;/li&gt;
&lt;li&gt;Table assignment tracking (but no automated table-assignments).&lt;/li&gt;
&lt;li&gt;Multiple venue support (currently hard-coded at two venues in some
    places).&lt;/li&gt;
&lt;li&gt;Integrated photo gallery using a modified version of Photologue that
    lets guests upload their photos.&lt;/li&gt;
&lt;li&gt;Web-based editing of informational pages (HTML "page snippets").&lt;/li&gt;
&lt;li&gt;Initial import of guest information from a CSV spreadsheet.&lt;/li&gt;
&lt;li&gt;Generation of printed materials from SVG templates, including:&lt;ul&gt;
&lt;li&gt;Save-the-date cards with RSVP invite codes.&lt;/li&gt;
&lt;li&gt;Personalized place cards (even including food selection)&lt;/li&gt;
&lt;li&gt;Personalized RSVP cards&lt;/li&gt;
&lt;li&gt;Personalized envelopes with artwork&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;﻿Now that this is done, perhaps I'll never need to look at this code
again, although I have already reused some snippets from it for other
projects.&lt;/p&gt;
&lt;p&gt;At some point in the future, I may post some examples of printed
materials generated, as well as some of the artwork we created.  (We
have plenty of wedding DIY projects that I should go back and write-up
here.)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note that subsequently &lt;a href="https://github.com/cshabsin/djwed"&gt;Chris Shabsin and Dana Scott forked this software and used
it for their wedding&lt;/a&gt;, as has at least one other person.&lt;/em&gt;&lt;/p&gt;</content><category term="Software"></category><category term="diy"></category><category term="django"></category><category term="djwed"></category><category term="python"></category><category term="Software"></category><category term="Wedding"></category></entry><entry><title>Paskha mold: version 1.0</title><link href="https://erik.nygren.org/paskha-mold-version-1-0.html" rel="alternate"></link><published>2011-04-30T15:08:00-04:00</published><updated>2011-04-30T15:08:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2011-04-30:/paskha-mold-version-1-0.html</id><summary type="html">&lt;p&gt;Early Spring in our house is a time for cooking and crafts
projects as we celebrate both Passover and (Russian) Easter.  Both of
these holidays are great excuses to cook lots of tasty recipes that we
learned from our parents and grandparents, and then to enjoy this food
surrounded by …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Early Spring in our house is a time for cooking and crafts
projects as we celebrate both Passover and (Russian) Easter.  Both of
these holidays are great excuses to cook lots of tasty recipes that we
learned from our parents and grandparents, and then to enjoy this food
surrounded by friends and family.  This year was no exception, and was
also the first year in over a decade when we were blessed to have my
parents in-town for both holidays.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/04-pascha-mold&amp;amp;image=IMG_1559.jpg"&gt;&lt;img alt="Pascha and Kulich - the final product" src="https://nygren.org/gallery/image-cache/2011/04-pascha-mold/IMG_1559_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Back in Russia, one of Ksusha's family traditions was to make &lt;a href="http://en.wikipedia.org/wiki/Paskha_%28meal%29"&gt;Paskha&lt;/a&gt;
and &lt;a href="http://en.wikipedia.org/wiki/Kulich"&gt;Kulich&lt;/a&gt;, and she has been making them here for Russian Easter for
as long as I remember.  Both are very tasty!  Pascha is made from tvarog
(similar to farmers cheese) with various other items such as brandied
raisins mixed in.  Kulich is a cake similar to panettone (and even
tastier from my biased viewpoint, causing me to pretend that Passover
has ended a few days earlier than it actually ends).   To make the
Paskha, Ksusha makes her own curd through a process involving whole
milk, a bit of sour cream, a slow cooker, and then draining out the whey
through cheese cloth.  To make the final Paskha, the curd (and other
flavorings) is pressed into a specially-made box lined with
cheese-cloth.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/04-pascha-mold&amp;amp;image=110423-194854_JN-iPhone.JPG"&gt;&lt;img alt="Carving details in the mold (photo by John)" src="https://nygren.org/gallery/image-cache/2011/04-pascha-mold/110423-194854_JN-iPhone_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Alas, Ksusha's family Paskha molds ("пасочница" or
pasochnitsa) are back in Russia.  (&lt;a href="http://www.google.com/search?q=пасочница&amp;amp;prmd=ivns&amp;amp;source=lnms&amp;amp;tbm=isch"&gt;A google image search shows some
examples of some.&lt;/a&gt;)  As such, I've been meaning to make one for the
past few years, so this year was my first try.&lt;/p&gt;
&lt;p&gt;I used a mixture of 1/2" and 1/4" white ash from Rockler (both 5" wide),
as that's what they had available.  I played with a few different design
ideas initially, and then I made templates in qcad and then went down to
the shop to make the parts.&lt;/p&gt;
&lt;p&gt;In the end, I had two of the sides (with the routed grooves) be 1/2"
thick and the other two sides (with the tabs) were 1/4" thick. I then
used a dremel tool to carve designs into the wood.  One of the
traditional designs is an Eastern Orthodox cross, and the other "XB"
stands for "Christ has Risen".  The resulting side panels:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/04-pascha-mold&amp;amp;image=IMG_3733%20%28Modified%29.JPG"&gt;&lt;img alt="Pascha mold panels" src="https://nygren.org/gallery/image-cache/2011/04-pascha-mold/IMG_3733%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The various pieces fit together by putting the tabs through the slots
and then using the wood pins to hold everything together.  (One of the
tabs broke when drilling a hole for a pin, but I was able to
improvise.)  When assembled the box looks like:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/04-pascha-mold&amp;amp;image=IMG_3740%20%28Modified%29.JPG"&gt;&lt;img alt="3" src="https://nygren.org/gallery/image-cache/2011/04-pascha-mold/IMG_3740%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt; &lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/04-pascha-mold&amp;amp;image=IMG_3738%20%28Modified%29.JPG"&gt;&lt;img alt="4" src="https://nygren.org/gallery/image-cache/2011/04-pascha-mold/IMG_3738%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After pressing the curd in the mold overnight, we removed it from the
mold and while the Paskha was a little soft, it held its shape and the
design were clearly visible.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/04-pascha-mold&amp;amp;image=110424-103308_JN-iPhone%20%28Modified%20%282%29%29.JPG"&gt;&lt;img alt="5" src="https://nygren.org/gallery/image-cache/2011/04-pascha-mold/110424-103308_JN-iPhone%20%28Modified%20%282%29%29_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In retrospect, I would have been better off making everything
from 1/2" thick pieces as the moisture caused the 1/4" parts to warp
(although I was able to flatten them back out by pressing them while wet
under a heavy pot overnight).  I would also have been better off having
the carvings higher on the pieces so that the press didn't push the curd
too close to the design.  We would also have been better off using a
slightly more firm version of the curd, as this one was fairly liquid
and required too many layers of cheese cloth (impacting the visibility
of the patterns).&lt;/p&gt;
&lt;p&gt;Next year we'll have another Easter and I'll make another version.&lt;/p&gt;
&lt;p&gt;The final result of this effort was this year's Paskha:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=image&amp;amp;album=/2011/04-pascha-mold&amp;amp;image=IMG_1557%20%28Modified%29.jpg"&gt;&lt;img alt="6" src="https://nygren.org/gallery/image-cache/2011/04-pascha-mold/IMG_1557%20%28Modified%29_disp512.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Many thanks to my parents for taking some of the photos above while we were busy cooking and crafting away...)&lt;/em&gt;&lt;/p&gt;</content><category term="Crafts"></category><category term="dremel"></category><category term="pascha"></category><category term="paskha"></category><category term="wood carving"></category><category term="food"></category><category term="crafts"></category></entry><entry><title>Pumpkin Carving: Halloween 2008</title><link href="https://erik.nygren.org/2008-pumpkin-carving.html" rel="alternate"></link><published>2008-10-30T22:46:00-04:00</published><updated>2008-10-30T22:46:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2008-10-30:/2008-pumpkin-carving.html</id><summary type="html">&lt;p&gt;I just finished my first pumpkin for the year. I probably ended up with bits of pumpkin in my hair.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=2008/10-pumpkin"&gt;&lt;img alt="" src="https://erik.nygren.org/images/2008/2008-pumpkin-1.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just completed pumpkin number two. I'm not sure that I like it as much as the first one.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://meepity.net/gallery/index.cgi?mode=album&amp;amp;album=/2008/10-pumpkin-carving"&gt;&lt;img alt="" src="https://erik.nygren.org/images/2008/2008-pumpkin-2.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since a few people asked how to carve pumpkins like this …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I just finished my first pumpkin for the year. I probably ended up with bits of pumpkin in my hair.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=2008/10-pumpkin"&gt;&lt;img alt="" src="https://erik.nygren.org/images/2008/2008-pumpkin-1.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just completed pumpkin number two. I'm not sure that I like it as much as the first one.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://meepity.net/gallery/index.cgi?mode=album&amp;amp;album=/2008/10-pumpkin-carving"&gt;&lt;img alt="" src="https://erik.nygren.org/images/2008/2008-pumpkin-2.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since a few people asked how to carve pumpkins like this, &lt;a href="http://meepity.net/gallery/index.cgi?mode=album&amp;amp;album=/2008/10-pumpkin-carving"&gt;I took some pictures this time&lt;/a&gt;. I primarily use potato peelers, ceramic ribbon/loop tools (the sort with blades), wood/wax carving tools, and a microplane grater.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(This post is recovered from the vaults.)&lt;/em&gt;&lt;/p&gt;</content><category term="Crafts"></category><category term="pumpkin"></category></entry><entry><title>Power optimization</title><link href="https://erik.nygren.org/power-optimization.html" rel="alternate"></link><published>2007-12-08T22:54:00-05:00</published><updated>2007-12-08T22:54:00-05:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2007-12-08:/power-optimization.html</id><summary type="html">&lt;p&gt;One of my household projects the past few weeks has been to profile my
home power usage with the goal of seeing where I can reduce it with
small investments of time and money. The &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/B00009MDBU/"&gt;$20 Kill-a-Watt&lt;/a&gt; tool has
been invaluable in this exercise. So far, I've managed to reduce …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of my household projects the past few weeks has been to profile my
home power usage with the goal of seeing where I can reduce it with
small investments of time and money. The &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/B00009MDBU/"&gt;$20 Kill-a-Watt&lt;/a&gt; tool has
been invaluable in this exercise. So far, I've managed to reduce my
estimated power usage by around 10% ($190/year) with another 3% of
quick-wins yet to do as well as some future projects that could yield
another 20-30% savings. For the full details, &lt;a href="http://www.bay13.org/projects/power/powerusage-2007-12.xls"&gt;here's the spreadsheet
that I've been using&lt;/a&gt;.&lt;/p&gt;
&lt;!--more--&gt;

&lt;p&gt;Here are some interesting facts that I've learned along the way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Massachusetts has some of the most expensive electricity in the
    contintental US.&lt;/li&gt;
&lt;li&gt;In my house, just the three computers (office desktop, router,
    mediacenter pc) and three TiVos that were turned on 24/7 account for
    425W 24x7 (and that's not counting laptops, and even with the
    monitors and 170W Windows box turned off). This is around half my
    electric bill! I suspect that many of you are in similar
    situations... Over time, I think that I'll start to replace some of
    these with low-powered Via Eden or AMD LX800 boxes with
    solid-state-drives. Even when buying new desktops, low-power CPUs
    will likely pay for themselves in MA.&lt;/li&gt;
&lt;li&gt;Computer processors use up lots of power, but so do hard drives.
    Across my desktop computers and TiVos, I have 12 hard drives in the
    house. That's around 100W just by themselves! Configuring drives to
    spin-down when not in use can save 4-10W per drive. Taking the
    second CPU out of my router was also a quick-win.&lt;/li&gt;
&lt;li&gt;For TiVos and other similar devices, the power costs can be a
    significant portion of the cost-of-ownership. For example, my
    Series3 TiVo draws 40W which costs about $5.50/month or $200 over
    three years. This is about half the cost of the service
    subscription!&lt;/li&gt;
&lt;li&gt;Those power bricks do add up (at 500mW-2W each), but a few
    individual turned-off-but-plugged-in devices may dwarf those at
    10-15W each. Finding those and putting together mitigation
    strategies for those few devices are faster wins than dealing with
    power bricks. For example, my subwoofers use 10-20W even when in
    "power-saving mode". Two Yamaha stereos that I have from \~1993 use
    16W even when turned off. By contrast, my newer Yamaha receiver in
    my home theater only uses 1W when turned off.&lt;/li&gt;
&lt;li&gt;There are some dimmable compact florescents that play nicely with
    X10/SmartHome dimmer switches. In particular, the Philips Marathon
    Alto bulbs seem to work ok so far, although it takes them a little
    time to warm up.&lt;/li&gt;
&lt;li&gt;Plasma TVs use *lots* of power when they're turned on. My 42" 480p
    display uses around 220W when turned on, but 1080p plasmas are rated
    to use 2-3x as much. I guess this means that I should get an LCD
    when I eventually upgrade to 1080p.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the highlights of the audit along with example actions taken
(or planned) to save power:&lt;/p&gt;
&lt;table border="1" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td align="center" valign="top"&gt;
**Approx Pct**

&lt;/td&gt;
&lt;td align="center" valign="top"&gt;
**Monthly Kwh**

&lt;/td&gt;
&lt;td align="center" valign="top"&gt;
**Average (W)**

&lt;/td&gt;
&lt;td align="center" valign="top"&gt;
**Example Savings (W)**

&lt;/td&gt;
&lt;td align="center" valign="top"&gt;
**Actions to achieve savings**

&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Home office computers**

&lt;/td&gt;
&lt;td align="center"&gt;
21%

&lt;/td&gt;
&lt;td align="center"&gt;
176

&lt;/td&gt;
&lt;td align="center"&gt;
240

&lt;/td&gt;
&lt;td align="center"&gt;
14

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Remove unused power bricks, configure drives to spin-down when not
in-use, set Windows machine to go into standby when idle, eventually
migrate apps off of desktop server to lower-powered machine

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Lights (total)**

&lt;/td&gt;
&lt;td align="center"&gt;
15%

&lt;/td&gt;
&lt;td align="center"&gt;
128

&lt;/td&gt;
&lt;td align="center"&gt;
175

&lt;/td&gt;
&lt;td align="center"&gt;
54

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Replace selected lights with compact florescents

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Home theater (total, with tivo+computer)**

&lt;/td&gt;
&lt;td align="center"&gt;
14%

&lt;/td&gt;
&lt;td align="center"&gt;
116

&lt;/td&gt;
&lt;td align="center"&gt;
159

&lt;/td&gt;
&lt;td align="center"&gt;
19

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Used trigger cable from receiver to power supply to shutoff subwoofer
and DVD player when not in-use

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Electric clothes dryer**

&lt;/td&gt;
&lt;td align="center"&gt;
11%

&lt;/td&gt;
&lt;td align="center"&gt;
89

&lt;/td&gt;
&lt;td align="center"&gt;
122

&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Planned: replace with energy-efficient gas dryer

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Home router/server**

&lt;/td&gt;
&lt;td align="center"&gt;
10%

&lt;/td&gt;
&lt;td align="center"&gt;
82

&lt;/td&gt;
&lt;td align="center"&gt;
112

&lt;/td&gt;
&lt;td align="center"&gt;
18

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Removed a CPU, configured drives to spin themselves down when not in-use

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Refrigerator**

&lt;/td&gt;
&lt;td align="center"&gt;
7%

&lt;/td&gt;
&lt;td align="center"&gt;
64

&lt;/td&gt;
&lt;td align="center"&gt;
87

&lt;/td&gt;
&lt;td align="center"&gt;
33

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Could save \~33W by replacing with more efficient fridge

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Bedroom A/C (amortized)**

&lt;/td&gt;
&lt;td align="center"&gt;
6%

&lt;/td&gt;
&lt;td align="center"&gt;
49

&lt;/td&gt;
&lt;td align="center"&gt;
67

&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Air purifier**

&lt;/td&gt;
&lt;td align="center"&gt;
6%

&lt;/td&gt;
&lt;td align="center"&gt;
47

&lt;/td&gt;
&lt;td align="center"&gt;
64

&lt;/td&gt;
&lt;td align="center"&gt;
50

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Don't keep always-on

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Kitchen lights**

&lt;/td&gt;
&lt;td align="center"&gt;
4%

&lt;/td&gt;
&lt;td align="center"&gt;
36

&lt;/td&gt;
&lt;td align="center"&gt;
49

&lt;/td&gt;
&lt;td align="center"&gt;
18

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Replaced two 90W R40 bulbs with dimmable 20W Philips Marathon CF bulbs

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**Halogen torchiere in office**

&lt;/td&gt;
&lt;td align="center"&gt;
3%

&lt;/td&gt;
&lt;td align="center"&gt;
29

&lt;/td&gt;
&lt;td align="center"&gt;
40

&lt;/td&gt;
&lt;td align="center"&gt;
28

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Planning to replace with compact florescent

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**TiVo Series3**

&lt;/td&gt;
&lt;td align="center"&gt;
3%

&lt;/td&gt;
&lt;td align="center"&gt;
29

&lt;/td&gt;
&lt;td align="center"&gt;
40

&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**TiVo Series1 w/ 2 drives**

&lt;/td&gt;
&lt;td align="center"&gt;
2%

&lt;/td&gt;
&lt;td align="center"&gt;
20

&lt;/td&gt;
&lt;td align="center"&gt;
28

&lt;/td&gt;
&lt;td align="center"&gt;
28

&lt;/td&gt;
&lt;td align="left" valign="top"&gt;
Retired since I don't really need three TiVos

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left"&gt;
**TiVo Series2**

&lt;/td&gt;
&lt;td align="center"&gt;
2%

&lt;/td&gt;
&lt;td align="center"&gt;
15

&lt;/td&gt;
&lt;td align="center"&gt;
20

&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On a related note, is anyone interested in my old Hacked Series1 TiVo
(with ethernet and extra storage) before I try to sell it? I also have a
bunch of incandescent R30 bulbs for ceiling canisters that are left-over
from my old house. I also have an old CRT TV stand from Ikea that I'd
like to get rid of to make room for a breakfast nook table.&lt;/p&gt;</content><category term="Electronics"></category><category term="energy"></category><category term="environment"></category><category term="Kill-A-Watt"></category><category term="power"></category></entry><entry><title>The Earth, modeled in chocolate</title><link href="https://erik.nygren.org/the-earth-modeled-in-chocolate.html" rel="alternate"></link><published>2006-02-13T22:46:00-05:00</published><updated>2006-02-13T22:46:00-05:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2006-02-13:/the-earth-modeled-in-chocolate.html</id><summary type="html">&lt;p&gt;Ksusha introduced me to Ferrero Rocher chocolates a few days ago. My
first reaction after biting into it was "this would make a great model
of the Earth!"  (Well, maybe that was my second reaction. My first
reaction was "tasty!")&lt;/p&gt;
&lt;p&gt;Thus, it was necessary to slice one in half so …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ksusha introduced me to Ferrero Rocher chocolates a few days ago. My
first reaction after biting into it was "this would make a great model
of the Earth!"  (Well, maybe that was my second reaction. My first
reaction was "tasty!")&lt;/p&gt;
&lt;p&gt;Thus, it was necessary to slice one in half so that I could take a photo
for labeling:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nygren.org/images/silly/ferrero-rocher-earth/ferrero-rocher-earth.large.jpg"&gt;&lt;img alt="Earth In Chocolate" src="https://erik.nygren.org/images/2006/ferrero-rocher-earth.small.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Alas, the crust-to-mantle thickness ratio isn't quite right, and there
isn't a clear differentiation between the upper and lower mantle. Now to
go eat what remains of my Earth model. Hopefully it's not a voodoo
Earth...&lt;/p&gt;</content><category term="Food"></category></entry><entry><title>Plush Sawzall</title><link href="https://erik.nygren.org/plush-sawzall.html" rel="alternate"></link><published>2004-09-28T23:01:00-04:00</published><updated>2004-09-28T23:01:00-04:00</updated><author><name>nygren</name></author><id>tag:erik.nygren.org,2004-09-28:/plush-sawzall.html</id><summary type="html">&lt;p&gt;The &lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/02-sawzall"&gt;plush sawzall&lt;/a&gt; that I made in the spring for the child of two
friends of mine has finally been &lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/09-sawzall"&gt;presented&lt;/a&gt;. The parents were greatly
amused. The child wasn't quite sure how to operate it. Some people on
the dinner trip suggested that he needed plush safety goggles first.&lt;/p&gt;
&lt;p&gt;Either …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/02-sawzall"&gt;plush sawzall&lt;/a&gt; that I made in the spring for the child of two
friends of mine has finally been &lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/09-sawzall"&gt;presented&lt;/a&gt;. The parents were greatly
amused. The child wasn't quite sure how to operate it. Some people on
the dinner trip suggested that he needed plush safety goggles first.&lt;/p&gt;
&lt;p&gt;Either way, this means I can finally post &lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/02-sawzall"&gt;pictures&lt;/a&gt;...
:-)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/02-sawzall"&gt;&lt;img alt="" src="https://erik.nygren.org/images/2004-sawzall/sawzall.medium.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And here are some more pictures of &lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/09-sawzall"&gt;Kids With Plush Power
Tools&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nygren.org/gallery/index.cgi?mode=album&amp;amp;album=/2004/09-sawzall"&gt;&lt;img alt="" src="https://erik.nygren.org/images/2004-sawzall/ronan-with-sawzall.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A few people have asked for the pattern. At some point I may get
around to scanning it in and posting it, just to inspire more chaos in
the world.&lt;/p&gt;</content><category term="Crafts"></category><category term="plush"></category><category term="sawzall"></category><category term="sewing"></category><category term="Baby"></category></entry></feed>