<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/style.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>John Maguire&apos;s Blog</title><description>Personal website and blog of John Maguire - software engineer writing about networking, Linux, open source, and photography.</description><link>https://johnmaguire.me/</link><item><title>How to configure a Weechat ignore list toggle</title><link>https://johnmaguire.me/blog/better-ignores-in-weechat-420/</link><guid isPermaLink="true">https://johnmaguire.me/blog/better-ignores-in-weechat-420/</guid><description>Weechat 4.2.0 has introduced a new feature that lets you tag messages from ignored users, allowing you to dynamically enable and disable ignores.</description><pubDate>Tue, 13 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I spend a bit too much time on &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc1459&quot;&gt;IRC&lt;/a&gt;. Spend enough time and you&apos;ll run into someone you&apos;d rather not engage with.&lt;/p&gt;
&lt;p&gt;While Weechat offers the ability to ignore users, until recently you couldn&apos;t retroactively disable the ignore to see what was said. This can be a problem if you&apos;ve ignored someone who ends up involved in a conversation you&apos;re actually interested in.&lt;/p&gt;
&lt;p&gt;Helpfully, &lt;a href=&quot;https://weechat.org/files/doc/weechat/ChangeLog-devel.html#v4.2.0&quot;&gt;Weechat 4.2.0&lt;/a&gt; added a new option &lt;code&gt;irc.look.ignore_tag_messages&lt;/code&gt; which allows you to tag messages from ignored users instead of removing them. You can then add a manual filter for the tagged messages, which can be enabled or disabled dynamically.&lt;/p&gt;
&lt;p&gt;To enable the feature, you can run the following in Weechat:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/set irc.look.ignore_tag_messages on
/filter add ignored * irc_ignored *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then manage your ignores as usual (e.g. &lt;code&gt;/ignore add &amp;lt;nick&amp;gt;&lt;/code&gt;) and messages from those users will be hidden. The following commands will toggle visibility of ignored users&apos; messages:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/filter disable ignored
/filter enable ignored
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or, for quicker access, bind toggle to a key (hint: run &lt;code&gt;/key bind meta-i&lt;/code&gt; first to make sure it&apos;s not already bound):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/key bind meta-i /filter toggle ignored
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Happy idling!&lt;/p&gt;
</content:encoded></item><item><title>Camera App Connection Issues and VPNs on Android Phones</title><link>https://johnmaguire.me/blog/camera-connection-issues-with-android-vpns/</link><guid isPermaLink="true">https://johnmaguire.me/blog/camera-connection-issues-with-android-vpns/</guid><description>If you&apos;re having trouble connecting to a camera or IoT device from its Android app (e.g. Sony, Fujifilm, Nikon, GoPro, Ricoh, etc.) and you are connected to a VPN (e.g. Nebula, Wireguard, Tailscale, etc.), try disabling the VPN first.</description><pubDate>Thu, 09 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When connected to a VPN app, such as Nebula, Wireguard, or Tailscale, camera apps used to download photos may be unable to access the camera&apos;s network. Some VPN apps may offer the ability to exclude these apps from the VPN connection—otherwise, you must temporarily disconnect from the VPN when using the camera app.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;As a software engineer working on &lt;a href=&quot;https://defined.net&quot;&gt;mesh overlay networks&lt;/a&gt; (a type of VPN product) I typically have a VPN process running on my Android phone (usually a Pixel.) I&apos;m also a hobbyist photographer, and have owned cameras from a variety of manufacturers, including Sony, Fujifilm, Ricoh, and GoPro.&lt;/p&gt;
&lt;p&gt;A constant over the years, regardless of which ecosystem I&apos;m a part of, is user complaints around the app which downloads photos from the camera to a phone. The specifics vary: usually poor UX, performance issues, or finicky file transfers. I personally found the Ricoh app to be so unreliable that I finally broke down and &lt;a href=&quot;https://www.johnmaguire.me/blog/eureka-android-app-for-ricoh-gr/&quot;&gt;wrote my own Android app&lt;/a&gt;. But I have noticed one issue that is constant among camera brands and seems to be a bug inherent to Android itself.&lt;/p&gt;
&lt;p&gt;When a VPN is active, Android apps—even those configured only to route IP addresses outside of the WiFi network range—are unable to access the local network (i.e. the camera&apos;s WiFi network.)&lt;/p&gt;
&lt;p&gt;I&apos;ve seen some argue that this is the correct behavior, noting that a VPN should sit between your phone and the rest of the Internet, for privacy&apos;s sake. However, a local area network is not the Internet, and VPNs are used for purposes outside privacy-focused &quot;exit nodes&quot;—after all, they are just Virtual Private Networks. When a VPN registers a route for &lt;code&gt;100.64.0.0/10&lt;/code&gt;, it shouldn&apos;t affect traffic flowing to the &lt;code&gt;192.168.0.0/16&lt;/code&gt; subnet.&lt;/p&gt;
&lt;p&gt;This bug even affects Google applications which use the WiFi IoT APIs, such as Stadia, RCS, and Android Auto (see for example &lt;a href=&quot;https://github.com/tailscale/tailscale-android/pull/50&quot;&gt;this Tailscale pull request to fix the aforementioned services&lt;/a&gt;). While VPN apps can resolve this issue on a per-app basis by excluding the app from the network, camera manufacturers can&apos;t work around the issue in their own app. While some VPNs such as &lt;a href=&quot;https://tailscale.com/kb/1444/android-app-split-tunneling&quot;&gt;Tailscale&lt;/a&gt; and Wireguard allow you to configure apps to exclude in their settings, others do not—and in this case the only known workaround is to temporarily disable the VPN.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For further reading, here are &lt;a href=&quot;https://www.reddit.com/r/gopro/comments/1fdfpz8/i_have_a_go_pro_12_and_im_having_massive_issues/&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;https://www.reddit.com/r/gopro/comments/19eu27y/solution_to_gopro_footage_not_showing_up_in_the/&quot;&gt;examples&lt;/a&gt; &lt;a href=&quot;https://www.reddit.com/r/gopro/comments/1eqwu34/camera_preview_issue_with_quick_app/&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;https://www.reddit.com/r/fujifilm/comments/13xblj4/xapp_problem_solved_for_me/&quot;&gt;this&lt;/a&gt; &lt;a href=&quot;https://www.reddit.com/r/Nikon/comments/1emvf29/cannot_connect_smartbridge_z5_with_android_14/&quot;&gt;issue&lt;/a&gt; &lt;a href=&quot;https://www.reddit.com/r/ricohGR/comments/176b08v/comment/k7xz5fw/&quot;&gt;on&lt;/a&gt; &lt;a href=&quot;https://www.reddit.com/r/ricohGR/comments/qmqxe6/comment/m68ioe0/&quot;&gt;Reddit&lt;/a&gt;. I have a foggy memory of an Android issue tracker bug on the matter as well, but I can no longer find it.&lt;/p&gt;
</content:encoded></item><item><title>How to clean dust from a Ricoh GR III / IIIx sensor or lens</title><link>https://johnmaguire.me/blog/cleaning-ricoh-sensor-dust/</link><guid isPermaLink="true">https://johnmaguire.me/blog/cleaning-ricoh-sensor-dust/</guid><description>A tutorial on disassembling, cleaning, and reassembling a Ricoh GR III or IIIx camera.</description><pubDate>Tue, 21 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I absolutely adore my Ricoh GR camera. It&apos;s small enough to fit in my pants pocket, so it goes everywhere with me. And, as the saying goes, the best camera is the one you have with you.&lt;/p&gt;
&lt;p&gt;Unfortunately these cameras tend to be susceptible to dust which can cause artifacts in your images, especially when using narrow apertures (e.g. f/8-f/16.)&lt;/p&gt;
&lt;p&gt;Some owners of this camera try to avoid dust entering the camera through the use of lens caps, protective cases, and other accessories, but this makes it difficult to carry the camera in your pocket. Even with careful use of the camera, dust has a habit of sneaking in. Thankfully, it&apos;s neither difficult nor time consuming to remove the dust with the right tools!&lt;/p&gt;
&lt;h3&gt;Disclaimer&lt;/h3&gt;
&lt;p&gt;If your camera is under warranty, following this guide may void it. Cameras contain sensitive electronics which can easily be damaged. It is possible to cause irreparable damage to your camera by attempting this repair.&lt;/p&gt;
&lt;p&gt;By following this guide you acknowledge that I am in no way responsible for any damage that occurs to your camera. If you are not confident in your repair skills please consider finding a qualified technician to remove the dust for you.&lt;/p&gt;
&lt;p&gt;That being said there&apos;s nothing inherently difficult about this process. Pay attention, take photos to remind yourself how everything fits together, and your camera will be dust-free before you know it.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;This process can be completed in approximately 15 minutes once you know how it&apos;s done. Expect your first repair to take about an hour.&lt;/p&gt;
&lt;p&gt;You&apos;ll need the following tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Wiha-96100-Phillips-Screwdriver-Precision/dp/B0006OBFOA/&quot;&gt;PH00 screwdriver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Giottos-AA1900-Rocket-Blaster-Large/dp/B00017LSPI&quot;&gt;Rocket blower&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A small flathead screwdriver&lt;/li&gt;
&lt;li&gt;A safe spot to store your screws&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Optional&lt;/em&gt; - APS-C sensor cleaning kit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will be removing screws of different lengths, so it&apos;s a good idea to lay them out in such a way that you&apos;ll remember where they came from. Be sure to use the correct bit (PH00) to avoid stripping screws.&lt;/p&gt;
&lt;p&gt;A sensor cleaning kit is usually unnecessary because, unlike an interchangeable lens camera, the sensor is never directly exposed to the elements. However, if your sensor is severely dirty a cleaning kit may help to remove stubborn deposits. In my experience a rocket blower is all you need.&lt;/p&gt;
&lt;h2&gt;Test Photo&lt;/h2&gt;
&lt;p&gt;Before you begin, take a photo of a white wall or piece of paper at f/16 with macro mode on. This will make all the dust on the sensor visible, and will help you determine you&apos;ve removed all the dust.&lt;/p&gt;
&lt;h2&gt;Disassembly&lt;/h2&gt;
&lt;p&gt;Throughout this guide I will refer to the sides of the camera as if you are holding it in your hands with the LCD screen on the back of the camera visible. Therefore, the movie button is on the left side of the camera, the USB port is on the right side of the camera, the lens is at the front of the camera, the shutter button is on the top of the camera, and so on.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-1.jpg&quot; alt=&quot;Orientation diagram showing the movie button on the left side, USB port on the right side, lens at the front, display at the back, shutter button on top, and battery at the bottom of the camera.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;Step 1: Remove any accessories from the camera.&lt;/h3&gt;
&lt;p&gt;Begin by removing any wrist or neck strap, battery, SD card, and hotshoe cover on the camera.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-2.jpg&quot; alt=&quot;Ricoh GR III camera with battery, SD card, and hotshoe cover removed.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;Step 2: Removing chassis screws&lt;/h3&gt;
&lt;p&gt;Starting with the left side of the camera, remove the screw located at the bottom right corner (closer to the LCD screen.)&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-3.jpg&quot; alt=&quot;Arrow pointing to the screw on the left side of the camera, nearest the back side of the camera.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Facing the LCD screen, there is a recessed screw in the upper left corner, next to the &quot;RICOH&quot; text. Remove it.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-4.jpg&quot; alt=&quot;Arrow pointing to the recessed screw in the upper left corner of the back of the camera.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;There are two screws to remove from the right side of the camera. The first is located center-top, just left of the wrist strap loop. The second is hidden behind a piece of rubber just below and slightly to the left of the first screw. Peel back the rubber piece which straddles the play/review button starting from the top right corner to reveal it. (It won&apos;t lose its stickiness.)&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-5.jpg&quot; alt=&quot;Arrow pointing to the two screws to remove from the right side of the camera, with the rubber cover peeled back to reveal the hidden screw.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Orient the bottom of the camera so that the writing on the labels is right-side up and remove the two upper screws.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-6.jpg&quot; alt=&quot;Arrow pointing to the two screws on the bottom of the camera nearest the back of the camera.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Looking at the top of the camera, remove the screw under the hotshoe. Use a small flathead screwdriver or a spudger tool to pop out the clip from the hotshoe (see image below.) Finally, remove the four screws holding the hotshoe and mount in place, and lift out the hotshoe mount.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-7.jpg&quot; alt=&quot;A flathead screwdriver positioned to release the hotshoe clip.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-8.jpg&quot; alt=&quot;Arrows pointing to the four remaining screws to remove to release the hotshoe mount and the empty hole where a screw was already removed.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;Step 3: Opening the chassis&lt;/h3&gt;
&lt;p&gt;You should now be able to pop the top plate up and off of the camera. Be careful of the hotshoe ribbon cable when doing so.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-9.jpg&quot; alt=&quot;Ricoh GR III camera with the top plate removed.&quot; width=&quot;1200&quot; height=&quot;960&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Open the USB charging port flap and, working from the left side of the camera first, gently pry the back case of the camera away from the rest of the chassis. Be careful, as there is a ribbon cable connecting the two pieces (see image below.)&lt;/p&gt;
&lt;p&gt;While it is possible to finish this procedure without disconnecting the ribbon cable as I have done in the following images, you may find it safer and easier to disconnect the cable now. Gently pry the ribbon cable connector on the main chassis from the edges to loosen it and then pull straight up to disconnect it.&lt;/p&gt;
&lt;h3&gt;Step 4: Reveal the sensor&lt;/h3&gt;
&lt;p&gt;Remove the three silver screws holding the sensor mount to the camera body, and flip it over to reveal the sensor. &lt;strong&gt;Note the three springs used on each screw - do not lose them!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-10.jpg&quot; alt=&quot;Arrows pointing to the three silver screws holding the sensor mount to the camera body.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Now that the sensor is exposed, be very careful not to scratch or damage it in any way!&lt;/p&gt;
&lt;h2&gt;Cleaning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Warning: Do not use any cleaning products which are not made specifically for cleaning camera sensors! Do not touch the sensor with anything other than a sensor cleaning swab appropriately sized for an APS-C sensor.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning: Do not substitute a can of compressed air for a rocket blower!&lt;/strong&gt; Canned air is propelled at high pressure by a liquefied gas which can spray onto the sensor as a freezing liquid residue.&lt;/p&gt;
&lt;p&gt;With the sensor exposed, use your rocket blower to blast the sensor and lens clean. If you opted to use an APS-C sensor cleaning kit, follow the included instructions.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-11.jpg&quot; alt=&quot;Inside of Ricoh GR III camera with the sensor and lens labelled.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;You can see in the above image that there is a large speck of dust on the sensor near the top right corner. I find the dust is usually on the sensor rather than the lens itself. A few blasts from the rocket blower was enough to remove it and some other smaller pieces of dust.&lt;/p&gt;
&lt;h1&gt;Reassembly&lt;/h1&gt;
&lt;p&gt;Carefully re-seat the sensor, ensuring that all three springs are still in place, and reinstall the three silver screws, being mindful of any ribbon cables. Reconnect the display ribbon cable if you disconnected it earlier.&lt;/p&gt;
&lt;p&gt;Pull the hotshoe cable through the top plate and seat the hotshoe.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-12.jpg&quot; alt=&quot;Top view of Ricoh GR III camera with the hotshoe seated.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Replace the hotshoe mount and install the four under-hotshoe screws you removed earlier (the longer two screws are installed on the front, or lens side, of the camera) plus the fifth screw that sits under the hotshoe. Push the hotshoe clip back into place.&lt;/p&gt;
&lt;p&gt;Reinstall the two longer screws on the bottom front of the camera.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hint: Now is a good time to retake your test photo to ensure all the dust is gone! If the test photo doesn&apos;t show any dust, continue on...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The shortest screw, with the wider head, goes behind the rubber cover near the play/review button. Of the three remaining screws, the medium-length one is installed just above it.&lt;/p&gt;
&lt;p&gt;The long screw goes into the recessed hole near the text &quot;RICOH&quot; on the back of the camera.&lt;/p&gt;
&lt;p&gt;The final short screw should be reinstalled on the left side of the camera.&lt;/p&gt;
&lt;p&gt;With all the screws back in place, make sure that the battery door swings open on its own when the toggle is switched to &quot;OPEN&quot;. The battery door spring can be maneuvered into the correct position using a small flathead screwdriver or a pick.&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-dust-13.jpg&quot; alt=&quot;Ricoh GR III camera with battery door open, showing the correct battery door spring position.&quot; width=&quot;1200&quot; height=&quot;800&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Congrats, you&apos;re all done! Enjoy your Ricoh GR!&lt;/p&gt;
&lt;h1&gt;Acknowledgements&lt;/h1&gt;
&lt;p&gt;I learned how to perform this repair by watching &lt;a href=&quot;https://www.youtube.com/watch?v=2WI5Gb6K_UU&quot;&gt;this video by DIGI SERVICE on YouTube.&lt;/a&gt; However, the video includes some unnecessary steps, and I personally prefer text/photo tutorials to video tutorials, so I wrote one. I hope it helps!&lt;/p&gt;
&lt;p&gt;P.S. If you have a Ricoh GR II, the process is very similar. &lt;a href=&quot;https://jamiecollinson.com/blog/disassembling-ricoh-gr-for-sensor-cleaning/&quot;&gt;Jamie Collinson&apos;s guide&lt;/a&gt; is a great resource.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;p style=&quot;font-size: .8em;&quot;&amp;gt;
&amp;lt;strong&amp;gt;Thanks for stopping by!&amp;lt;/strong&amp;gt; While you&apos;re here, I&apos;d like to mention &amp;lt;a href=&quot;https://play.google.com/store/apps/details?id=me.johnmaguire.eureka&quot; data-umami-event=&quot;play-store-click&quot;&amp;gt;Eureka&amp;lt;/a&amp;gt;, an Android app I built to download photos from your Ricoh GR camera after struggling with Ricoh&apos;s official Image Sync app. If that sounds like it could be useful, please give it a try.
&amp;lt;/p&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Configuring Let&apos;s Encrypt for nginx with Automatic Renewal</title><link>https://johnmaguire.me/blog/configuring-lets-encrypt-for-nginx-with-automatic-renewal/</link><guid isPermaLink="true">https://johnmaguire.me/blog/configuring-lets-encrypt-for-nginx-with-automatic-renewal/</guid><description>Learn how to configure Let&apos;s Encrypt SSL certificates for nginx with automatic renewal using cron — a 2015 guide from the early days of free, automated HTTPS.</description><pubDate>Sat, 05 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;This post was originally published in December 2015. Let&apos;s Encrypt and certbot have matured significantly since then — modern setups handle renewal automatically. This is preserved for historical interest.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; is a new Certificate Authority that offers free certificates and automatic renewal through a new standard known as ACME (Automated Certificate Management Environment.)&lt;/p&gt;
&lt;p&gt;It recently entered public beta, but nginx support is somewhat lacking. However, it&apos;s really not that difficult to get started.&lt;/p&gt;
&lt;p&gt;Note that these instructions are for Debian, but can probably be easily modified to suit your favorite distro.&lt;/p&gt;
&lt;p&gt;First, you&apos;ll need to &lt;a href=&quot;https://letsencrypt.readthedocs.org/en/latest/using.html#installation&quot;&gt;install Let&apos;s Encrypt&lt;/a&gt;. I downloaded the &lt;a href=&quot;https://github.com/letsencrypt/letsencrypt/releases&quot;&gt;v0.1.0 release from Github&lt;/a&gt; and ran &lt;code&gt;python setup.py install&lt;/code&gt;, but you can use whatever method you prefer.&lt;/p&gt;
&lt;p&gt;Next, let&apos;s create a couple helper scripts. The first one will help us to generate new certificates, while we can use the second one to renew our certificates. This will come in handy when we setup a cron job later. I saved these two scripts in &lt;code&gt;/usr/local/bin&lt;/code&gt; as &lt;code&gt;letsencrypt_gen&lt;/code&gt; and &lt;code&gt;letsencrypt_renew&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
if [[ -z &quot;$DOMAINS&quot; ]]; then
  echo &quot;Please set DOMAINS environment variable (e.g. \&quot;-d example.com -d www.example.com\&quot;)&quot;
  exit 1
fi

if [[ -z &quot;$DIR&quot; ]]; then
  export DIR=/tmp/letsencrypt-auto
fi

mkdir -p $DIR &amp;amp;&amp;amp; letsencrypt certonly \
  --server https://acme-v01.api.letsencrypt.org/directory \
  --webroot \
  --webroot-path=$DIR \
  $DOMAINS
service nginx reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second script is almost identical to the first but passes a &lt;code&gt;--renew&lt;/code&gt; flag.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
if [[ -z &quot;$DOMAINS&quot; ]]; then
  echo &quot;Please set DOMAINS environment variable (e.g. \&quot;-d example.com -d www.example.com\&quot;)&quot;
  exit 1
fi

if [[ -z &quot;$DIR&quot; ]]; then
  export DIR=/tmp/letsencrypt-auto
fi

mkdir -p $DIR &amp;amp;&amp;amp; letsencrypt --renew certonly \
  --server https://acme-v01.api.letsencrypt.org/directory \
  --webroot \
  --webroot-path=$DIR \
  $DOMAINS
service nginx reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, before we can use these scripts we need to add a location block in our nginx config. This will allow Let&apos;s Encrypt to verify that we own the domains we&apos;re trying to generate certificates for.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    # ...

    location /.well-known/acme-challenge {
        default_type &quot;text/plain&quot;;
        root /tmp/letsencrypt-auto;
    }

    # ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The scripts we created earlier will automatically generate the files necessary to validate our identity in &lt;code&gt;/tmp/letsencrypt-auto&lt;/code&gt;, and so the rest is taken care of for us. The only thing we need to do is reload the nginx configuration so the changes take effect. On Debian, run &lt;code&gt;service nginx reload&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now it&apos;s time to generate our SSL certificate! We can call the script we saved earlier like so: &lt;code&gt;DOMAINS=&quot;-d johnmaguire.me -d www.johnmaguire.me&quot; letsencrypt_gen&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I also created a DH parameter file inside my &lt;code&gt;/etc/nginx&lt;/code&gt; directory using OpenSSL: &lt;code&gt;openssl dhparam -out dhparams.pem 2048&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;At this point, we just need to configure an SSL-enabled server block. Mine looks like this, but you can customize it to your needs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 443 ssl;
    server_name johnmaguire.me www.johnmaguire.me;

    # certificates from letsencrypt
    ssl_certificate /etc/letsencrypt/live/johnmaguire.me/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/johnmaguire.me/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites
    ssl_dhparam /etc/nginx/dhparam.pem;

    # modern configuration
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers &apos;ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK&apos;;
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers required) - 6 months
    # add_header Strict-Transport-Security max-age=15768000;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response
    ssl_trusted_certificate /etc/letsencrypt/live/johnmaguire.me/chain.pem;

    # ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://mozilla.github.io/server-side-tls/ssl-config-generator/&quot;&gt;Mozilla&lt;/a&gt; has an excellent SSL configuration generator. You can verify that SSL is working properly &lt;a href=&quot;https://www.ssllabs.com/ssltest/&quot;&gt;using this tool from Qualys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once everything is setup correctly, we can create a cron job to automatically renew our certificate. Run &lt;code&gt;crontab -e&lt;/code&gt; and add the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 2 1 * * DOMAINS=&quot;-d johnmaguire.me -d www.johnmaguire.me&quot; /usr/local/bin/letsencrypt_renew &amp;gt;&amp;gt; /var/log/le-renewal.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will set cron up to renew your domain every month, on the first, at 2am. The process will be appended to a log file at &lt;code&gt;/var/log/le-renewal.log&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can also test out certificate renewal by running the above command manually, and viewing the certificate as reported by your browser. It will only be valid beginning at the time you created the certificate.&lt;/p&gt;
&lt;p&gt;Finally, if you&apos;d like to send users who access your site via HTTP over to your HTTPS endpoint, you can create a catch-all location block in nginx like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name johnmaguire.me www.johnmaguire.me;

    # ...

    location / {
        return 301 https://$server_name$request_uri;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If everything is working correctly, consider uncommenting the &lt;a href=&quot;https://www.owasp.org/index.php/HTTP_Strict_Transport_Security&quot;&gt;HSTS&lt;/a&gt; line in the above configuration. It will allow your users&apos; browsers to remember that they&apos;ve connected with SSL before, and refuse to use non-SSL connections. Please understand that this is a fairly permanent choice.&lt;/p&gt;
&lt;p&gt;If you do decide to use HSTS, you can also add your website to browser vendors&apos; HSTS preload list, which will let the browser know your site has SSL before a user even hits it. Use extreme caution with &lt;a href=&quot;https://hstspreload.appspot.com/&quot;&gt;this tool&lt;/a&gt;. Please read the entire page and make sure you understand what it means before submitting your domain.&lt;/p&gt;
</content:encoded></item><item><title>Eureka: Alternative Android app for Ricoh GR cameras</title><link>https://johnmaguire.me/blog/eureka-android-app-for-ricoh-gr/</link><guid isPermaLink="true">https://johnmaguire.me/blog/eureka-android-app-for-ricoh-gr/</guid><description>Eureka is an alternative to the Image Sync app for Ricoh GR II/III/IIIx cameras. Eureka makes it fast and easy to download images from your Ricoh camera to your Android device.</description><pubDate>Thu, 12 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For years, I&apos;ve suffered with the &quot;Image Sync&quot; app that Ricoh offers for its GR line of cameras: I find that if it will connect at all, it&apos;s often too slow to be usable.&lt;/p&gt;
&lt;p&gt;On iOS, users have had a few alternatives to choose from (e.g. &lt;a href=&quot;https://apps.apple.com/us/app/grimageviewer/id1530691089&quot;&gt;GRImageViewer&lt;/a&gt;, &lt;a href=&quot;https://apps.apple.com/lc/app/gr-linker-image-sync/id1600925588&quot;&gt;GR Linker&lt;/a&gt;, and &lt;a href=&quot;https://apps.apple.com/us/app/gr-remote-viewer-for-gr2-gr3/id941671702&quot;&gt;GR Remote Viewer&lt;/a&gt; to name a few) while on Android, we&apos;re stuck with the official app — that is, until now.&lt;/p&gt;
&lt;p&gt;I spent a few free afternoons getting up to speed with Android development in order to create a simple app capable of showing thumbnails of your JPEGs &amp;amp; RAWs, downloading them with a tap. Ricoh GR II, GR III, and GR IIIx cameras are supported.&lt;/p&gt;
&lt;p&gt;If you&apos;ve had trouble with Image Sync, it may be worth a try. Check out &amp;lt;a href=&quot;https://play.google.com/store/apps/details?id=me.johnmaguire.eureka&quot; data-umami-event=&quot;play-store-click&quot;&amp;gt;Eureka on the Play Store&amp;lt;/a&amp;gt;.&lt;/p&gt;
</content:encoded></item><item><title>Firefox Starter Pack: Recommended Add-ons</title><link>https://johnmaguire.me/blog/firefox-starter-pack-recommended-addons/</link><guid isPermaLink="true">https://johnmaguire.me/blog/firefox-starter-pack-recommended-addons/</guid><description>A list of Firefox add-ons and features that I use on a daily basis.</description><pubDate>Wed, 07 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m a big fan of the Firefox browser and have been using it as my daily driver for a few years now. Over time, I&apos;ve honed my workflow with some useful add-ons and features. I thought I&apos;d share them in case they&apos;re useful to you too!&lt;/p&gt;
&lt;h2&gt;Must Have&lt;/h2&gt;
&lt;p&gt;I install these add-ons on every Firefox profile I use.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/&quot;&gt;uBlock Origin&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;uBlock Origin is hands down my favorite ad blocker. It&apos;s fast and lightweight, and just works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Protip&lt;/strong&gt;: After installing uBlock Origin, enable one of the &quot;Annoyances&quot; lists (I recommend the one from EasyList.) This will remove all kinds of annoying content, such as popups for mailing lists and GDPR cookie notices.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/sponsorblock/&quot;&gt;SponsorBlock&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While ad blockers are a must, I also recommend SponsorBlock. Using community-sourced data, it skips over sponsored content in YouTube videos. You can also configure it for other categories, such as skipping intros and outros, or non-music sections of music videos.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/1password-x-password-manager/&quot;&gt;1Password&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you don&apos;t already use a password manager, you need to start. &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt; is my favorite and works well on all platforms. It&apos;s not free, but worth it to me. If you&apos;re looking for a free alternative, I&apos;ve heard good things about &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/&quot;&gt;Bitwarden&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://github.com/bpc-clone/bypass-paywalls-firefox-clean&quot;&gt;Bypass Paywalls Clean&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Unlisted on Monzilla&apos;s add-on store and Github due to DMCA Takedown Notices, you can still find a download link (on a site called GitFlic) on this Github repository. Even though it&apos;s not listed on by Mozilla, it is still checked and signed by Mozilla.&lt;/p&gt;
&lt;p&gt;It won&apos;t get past every paywall, but it&apos;s a great start. For the rest, &lt;a href=&quot;https://archive.ph/&quot;&gt;archive.ph&lt;/a&gt; or &lt;a href=&quot;https://archive.is&quot;&gt;archive.is&lt;/a&gt; tends to work.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/pushbullet/&quot;&gt;Pushbullet&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pushbullet seems like it&apos;s on life support, but it&apos;s still the easiest way I know of to quickly send a link to my Android phone from Firefox.&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- Simple Translate applies custom CSS to elements with the ID simple-translate, so use a different ID --&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/simple-translate/&quot;&gt;Simple Translate&lt;/a&gt; {#simple-translate-}&lt;/h3&gt;
&lt;p&gt;Firefox added a &lt;a href=&quot;https://support.mozilla.org/en-US/kb/website-translation&quot;&gt;website translation feature&lt;/a&gt; in Firefox 118, released in 2023. However, it only appears when Firefox detects a supported language other than your system language. At times, it is useful to manually translate a page. This add-on adds a &quot;Translate this page&quot; option to the page context menu.&lt;/p&gt;
&lt;h2&gt;Extra Customization&lt;/h2&gt;
&lt;p&gt;These aren&apos;t always useful, and are more for power users. I usually won&apos;t install them unless I have a specific reason to.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/violentmonkey/&quot;&gt;Violentmonkey&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Back in the day, &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/&quot;&gt;Greasemonkey&lt;/a&gt; was the go-to for customizing websites with user scripts. However, Violentmonkey seems to be more actively maintained. Another alternative is &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/tampermonkey/&quot;&gt;Tampermonkey&lt;/a&gt;, but it&apos;s closed source.&lt;/p&gt;
&lt;p&gt;You can find premade user scripts on &lt;a href=&quot;https://greasyfork.org/en/&quot;&gt;Greasy Fork&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/styl-us/&quot;&gt;Stylus&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Stylus is similar to Violentmonkey, but for customizing websites with user styles. Stylish used to be used for this but after they &lt;a href=&quot;https://robertheaton.com/2018/07/02/stylish-browser-extension-steals-your-internet-history/&quot;&gt;added invasive tracking&lt;/a&gt; most users switched to Stylus.&lt;/p&gt;
&lt;p&gt;You can find some premade user styles &lt;a href=&quot;https://uso.kkx.one/browse/styles&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/darkreader/&quot;&gt;Dark Reader&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dark Reader is simpler than Stylus - instead of installing user scripts, it automatically darkens websites. It&apos;s great for night time browsing.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/&quot;&gt;Tree Style Tab&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I no longer use Tree Style Tab, but it&apos;s a neat way to organize tabs that you might prefer. Give it a try and see what you think!&lt;/p&gt;
&lt;h2&gt;Other Suggestions&lt;/h2&gt;
&lt;p&gt;Even more specific, these add-ons are useful for certain workflows.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/enhancer-for-youtube/&quot;&gt;Enhancer for YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Extra control over playback quality, speed, autoplay, and more. If you use YouTube often, it&apos;s worth a look.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/dearrow/&quot;&gt;DeArrow&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Created by the same author of SponsorBlock, &lt;a href=&quot;https://ajay.app&quot;&gt;Ajay Ramachandran&lt;/a&gt;, DeArrow removes annoying clickbait titles and thumbnails from YouTube.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/clearurls/&quot;&gt;ClearURLs&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Removes tracking elements from URLs. I much prefer sending links to others with tracking parameters removed, and this add-on takes care of it automatically.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/refined-github-/&quot;&gt;Refined Github&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Refined Github greatly enhances my Github workflow. Since I use Github every day at work, it&apos;s a must-have for me.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/old-reddit-redirect/&quot;&gt;Old Reddit Redirect&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I prefer the old Reddit design (yes, still!) and this add-on automatically redirects me to it whenever I click on a Reddit link.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/linkding-extension/&quot;&gt;linkding extension&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Instead of paying for Pinboard, I self-host &lt;a href=&quot;https://github.com/sissbruecker/linkding&quot;&gt;linkding&lt;/a&gt;. This extension makes it easy to save links.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/linkding-injector/&quot;&gt;linkding injector&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Adds relevant linkding bookmarks to search results. In all honesty, I&apos;m not so sure this has provided me much value yet. Still, it&apos;s cool when my bookmarks show up on the Google results page.&lt;/p&gt;
&lt;h2&gt;Useful built-in features&lt;/h2&gt;
&lt;p&gt;These are not add-ons, but they are super handy!&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages&quot;&gt;Reader View&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Reader View is a built-in feature that removes all the clutter from around articles and blog posts. It&apos;s great for long-form content, poorly designed pages, and night time reading.&lt;/p&gt;
&lt;p&gt;Also, sometimes it can be used to get around a paywall. If you&apos;re hit with a paywall, try clicking the Reader View icon. If that still doesn&apos;t work, try refreshing the page. If all else fails, try the Bypass Paywalls Clean add-on.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://support.mozilla.org/en-US/kb/https-only-prefs&quot;&gt;HTTPS-Only Mode&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In the past, it was necessary to install the HTTPS Everywhere add-on created by the EFF. Nowadays, this functionality is baked in. I highly recommend enabling it as most websites today support HTTPS!&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Well, I hope you found something useful! Is there a glaring omission? Let me know! My email is contact@ojohnmaguire.me.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Changelog&lt;/h3&gt;
&lt;p&gt;Mar 1, 2024 - Removed &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/nitter-redirect/&quot;&gt;Nitter Redirect&lt;/a&gt; as it no longer works.&lt;/p&gt;
</content:encoded></item><item><title>IPv6 is not insecure because it lacks a NAT</title><link>https://johnmaguire.me/blog/ipv6-is-not-insecure-because-it-lacks-nat/</link><guid isPermaLink="true">https://johnmaguire.me/blog/ipv6-is-not-insecure-because-it-lacks-nat/</guid><description>This post is intended to dispell the mistaken belief that IPv4 is more secure than IPv6 because it includes a NAT which must be configured to allow inbound traffic.</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently saw a discussion where someone argued that IPv4 is more secure than IPv6 because &quot;the NAT-by-default of IPv4 effectively means that I get the benefit of a default-deny security strategy.&quot; This is a common misconception that I think is worth addressing.&lt;/p&gt;
&lt;p&gt;The fundamental issue here is conflating NAT (Network Address Translation) with security. NAT isn&apos;t actually a security feature—it&apos;s an address conservation mechanism that became necessary because we ran out of IPv4 addresses. (Although it is totally possible to use a NAT with IPv6 too!)&lt;/p&gt;
&lt;p&gt;NAT allows multiple devices on a home network to share a single IP address on the public Internet by rewriting the destination IP of a packet based on its destination port. It chooses a new destination IP based on the &quot;port mappings&quot; or &quot;port forwards&quot; configured by the network admin.&lt;/p&gt;
&lt;p&gt;The consequence of this is that when receiving inbound traffic to a NAT&apos;d IP, packets with an unexpected destination port (one which has not been forwarded) will keep the destination IP of the public machine and will not be routed to another machine on the network.&lt;/p&gt;
&lt;p&gt;But the security benefits people attribute to NAT &lt;em&gt;actually&lt;/em&gt; come from the stateful firewall that&apos;s typically bundled with NAT routers. Modern routers ship with firewall policies that deny inbound traffic by default, even when a NAT is not being used. The firewall will drop packets with an unexpected destination before even considering whether to rewrite or route the packets. For example, UniFi routers ship with these default IPv6 firewall rules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Allow Established/Related Traffic (outbound return traffic)&lt;/li&gt;
&lt;li&gt;Block Invalid Traffic&lt;/li&gt;
&lt;li&gt;Block All Other Traffic&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Therefore, in order to allow unsolicited inbound traffic to any IPv6 device hosted behind the router, you must explicitly add a firewall rule to allow the traffic, whether using a NAT or not.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=46696303&quot;&gt;Discussion on Hacker News&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>How to uncrop Ricoh GR III, IIIx, and IV photos</title><link>https://johnmaguire.me/blog/uncrop-ricoh-gr-iii-photos/</link><guid isPermaLink="true">https://johnmaguire.me/blog/uncrop-ricoh-gr-iii-photos/</guid><description>The in-camera crop functionality of the GR III, IIIx, and IV cameras can be useful for gaining a little reach while shooting. But sometimes, when reviewing images, we wish we had captured a little more context. This guide will show you how to uncrop the image to the camera&apos;s native field of view.</description><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you own a Ricoh GR camera then you may know about crop mode—a mode which allows you to treat the built-in lens a bit as though you had three lenses of different focal lengths by cropping the sensor&apos;s image in to one of two predefined fields of view.&lt;/p&gt;
&lt;p&gt;This can be a big help when framing a shot you plan to crop anyway, but occasionally I&apos;ve found myself wishing I could recover a wider field of view than the crop mode captured. This is possible!&lt;/p&gt;
&lt;p&gt;The GR always records data from across the entire sensor—even when crop mode is enabled. The crop is simply embedded as a property of the image&apos;s EXIF data. So, you can use the following &lt;a href=&quot;https://exiftool.org/&quot;&gt;&lt;code&gt;exiftool&lt;/code&gt;&lt;/a&gt; commands at the terminal to recover the edges:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;exiftool -DefaultCropOrigin=&quot;5 6&quot; R0004690.DNG
exiftool -DefaultCropSize=&quot;6000 4000&quot; R0004690.DNG
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Actually, the cameras record a little more information than is visible even in the native crop. You can access these pixels via the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;exiftool -DefaultCropOrigin=&quot;0 0&quot; R0004690.DNG
exiftool -DefaultCropSize=&quot;6010 4012&quot; R0004690.DNG
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course, running terminal commands can be a bit tedious. If you are a Lightroom user, you are in luck! Long ago, Adobe created a plug-in called DNG Recover Edges that does the exact same thing. Unfortunately, they no longer offer it on their website, but it still works perfectly. Thanks to the fine folks at the &lt;a href=&quot;https://archive.org/donate&quot;&gt;Internet Archive&lt;/a&gt;, you can still download it via the Wayback Machine.&lt;/p&gt;
&lt;p&gt;The download page is &lt;a href=&quot;https://web.archive.org/web/20221012133619/https://helpx.adobe.com/lightroom-classic/kb/canon-5d-mark-iii-images.html&quot;&gt;here&lt;/a&gt; but the download button does not work when clicked directly. Instead, right click &quot;Get file&quot;, select &quot;Copy link&quot; and paste it into your URL bar--or just &lt;a href=&quot;https://web.archive.org/web/20221012133619/https://helpx.adobe.com/content/dam/help/en/lightroom-classic/kb/canon-5d-mark-iii-images/jcr_content/main-pars/download_section/download-1/DNGRecoverEdges.zip&quot;&gt;click here&lt;/a&gt; for a direct download.&lt;/p&gt;
&lt;p&gt;Then, open Lightroom and navigate to File &amp;gt; Plug-in Manager..., click the Add button, find the plugin in your Downloads folder and open it.&lt;/p&gt;
&lt;p&gt;With the plugin added, navigate to a DNG from your Ricoh GR camera taken in crop mode and click File &amp;gt; Plug-in Extras &amp;gt; DNG Recover Edges &amp;gt; Apply.&lt;/p&gt;
&lt;p&gt;At this point, on macOS, you will probably see the following security message:&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-uncrop-security-warning.png&quot; alt=&quot;Screenshot showing a warning from Apple that it did not open DNGRecoverEdgesMac because it can not verify it is free from malware.&quot; width=&quot;372&quot; height=&quot;374&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;To resolve it, open System Settings, find the Security tab, and then scroll down to the bottom until you see the following message, and click &quot;Allow Anyway.&quot;&lt;/p&gt;
&lt;p&gt;&amp;lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;/images/ricoh-uncrop-system-settings.png&quot; alt=&quot;Screenshot of an arrow pointing to the &apos;Allow Anyway&apos; button for DNGRecoverEdgesMac under the Security tab of System Settings&quot; width=&quot;827&quot; height=&quot;960&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Apply the plugin again. macOS will give another warning but this time you will be able to tell macOS to run the plugin anyway.&lt;/p&gt;
&lt;p&gt;When run, the plugin will create a new file with the suffix &quot;_full.dng&quot;. The new file will initially show the same crop as the original, but now when you set the crop in Lightroom to &quot;As Shot,&quot; the full 6010 x 4012 resolution will be shown.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;p style=&quot;font-size: .8em;&quot;&amp;gt;
P.S. If you&apos;re an Android user struggling to download images from your Ricoh GR using the official Image Sync app, consider trying &amp;lt;a href=&quot;https://play.google.com/store/apps/details?id=me.johnmaguire.eureka&quot; data-umami-event=&quot;play-store-click&quot;&amp;gt;Eureka&amp;lt;/a&amp;gt;, an app I built to deal with connection issues I experienced with the original app.
&amp;lt;/p&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>