<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sam Smith</title><link>https://samsm.ch/</link><description>Recent content on Sam Smith</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Thu, 26 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://samsm.ch/index.xml" rel="self" type="application/rss+xml"/><item><title>Notes on a trip to China</title><link>https://samsm.ch/china-trip-2025/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://samsm.ch/china-trip-2025/</guid><description>&lt;p&gt;In September 2025 my wife and I spent just over 3 week in China, her first time
back to her home country in 2 years and my third trip there, having been in 2017
and 2018. We spent most of our time in my wife&amp;rsquo;s home city of Chengdu, while
also visited the nearby cities of Chongqing and Guiyang. This post is a
collection of my thoughts and opinions on the places we visited, along with some
photos I took during the trip.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24008/"&gt;
	&lt;img src="https://samsm.ch/photo/24008/24008.avif"
 title="文殊院 Wenshu Temple, Chengdu"
 alt="A large, 3 storey Chinese temple building obscured by trees, 3 of which are visible as trunks in the foreground. In the lower third of the image a paved path from which two of the trees protrude, black and white."
		 height="1000"
		 width="1000" loading="eager" fetchpriority="high" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;文殊院 Wenshu Temple, Chengdu&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;h2 id="chengdu"&gt;Chengdu&lt;/h2&gt;
&lt;p&gt;When I first went to Chengdu in 2018 I wasn&amp;rsquo;t very interested in the place, it&amp;rsquo;s
very flat and generally lacking in visual interest, but I did meet my wife there
so I do have a bit of a soft spot for the place. When I travel alone I tend to
spend most of my time just exploring and looking for interesting areas to
photograph, and Chengdu isn&amp;rsquo;t great for that. Going back with my wife was much
different, she knows all the best spots and between her missing the food she&amp;rsquo;d
grown up with and me having more of an interest than I did last time, we spent a
lot of time eating.&lt;/p&gt;
&lt;p&gt;Chengdu is, in my mind, the best food city in the world when it comes to native
cuisine, not that I&amp;rsquo;m claiming to be an expert in this regard. My favourites
were: &lt;em&gt;甜‍水‍面 Tian Shui Mian&lt;/em&gt;, thicky chewy noodles with a delicious
spicy sauce&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; – &lt;em&gt;钟‍水‍饺 Zhong Shuijiao&lt;/em&gt;, simple pork dumplings with
a different but equally delicious spicy sauce&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; – and of course &lt;em&gt;火‍锅
Huo Guo&lt;/em&gt;, or hot pot, where you get a big pot of spicy broth on a burner in the
middle of your table and a selection of meats and vegetables to cook in it.&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24101/"&gt;
	&lt;img src="https://samsm.ch/photo/24101/24101.avif"
 title="均隆滨河路 Junlong Binhe Road, Chengdu"
 alt="Looking across a riverside path at a large old tree with some material hanging from some branches on the right. In the foreground a ramp in front of a wall, and a bike wheel pokes out from behind, black and white."
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;均隆滨河路 Junlong Binhe Road, Chengdu&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;p&gt;There&amp;rsquo;s also a recent boom of nice coffee shops and really good coffee in
Chengdu. It&amp;rsquo;s not hard to find a specialist coffee shop, they almost always have
a choice of beans, and that choice almost always includes a sour and fruity
light roast which made me very happy – my top recommendation is &lt;em&gt;agua café&lt;/em&gt;.&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;
I found walking around Chengdu, particularly in the area near where we stayed,
around the &lt;em&gt;牛‍王‍庙 Niuwangmiao&lt;/em&gt; metro station, I was constantly
seeing nice looking restaurants, coffee shops, and bars that I wanted to visit.
I have the same experience every time we visit Paris.&lt;/p&gt;
&lt;p&gt;Getting around Chengdu is easy. The street layout feels like it was built with
the &lt;em&gt;superblocks&lt;/em&gt;&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt; idea in mind. There&amp;rsquo;s something of a grid of large roads,
and inside the blocks created by this grid are a maze of smaller much quieter
streets which are much more pleasant to walk on, if you can find a reasonable
route through. Crossing these large roads is a frustrating experience. First you
have to get across the slip lane with limited visibility around the corner and
where no cars will stop for you, then you&amp;rsquo;re waiting multiple minutes on the
island with no shade and surrounded by people on scooters until you get to
cross. On the other hand, Chengdu&amp;rsquo;s metro is amazing, the coverage is very good,
the platforms tend to be very close to ground level so it&amp;rsquo;s quick to get to the
trains, and it&amp;rsquo;s very fast and frequent.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24105/"&gt;
	&lt;img src="https://samsm.ch/photo/24105/24105.avif"
 title="人民公园 People&amp;rsquo;s Park, Chengdu"
 alt="15 small row boats, each with some Chinese text on the back of the seat, on a small lake in a park, black and white."
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;人民公园 People&amp;rsquo;s Park, Chengdu&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;h2 id="the-train"&gt;The Train&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s not much to complain about with China&amp;rsquo;s high speed rail system. The
headline being the high speed, we took a train from Chengdu East Station to
Shapingba in Chongqing, travelling 299km in 62 minutes, which means we
&lt;strong&gt;averaged&lt;/strong&gt; almost 300km/h. I also liked how my wife was able to choose seats
before booking our tickets, which meant if we weren&amp;rsquo;t able to get seats next to
each other, we could just travel at a different time – and, we didn&amp;rsquo;t try this,
but you can order food from a restaurant near a station you&amp;rsquo;re stopping at to
be delivered to your seat.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not a fan of the more airport like experience of the stations. They tend to
be further towards the edge of the city, albeit much closer than an airport and
of course well connected by metro. You have to go through some security theatre
to get into the station which is annoying, especially for me carrying film that
I&amp;rsquo;d like to avoid putting through the scanners (that said, they were always
happy to hand check it when asked). The check does tend to be quick and I never
saw much of a queue. The waiting area is usually a huge hall with a selection of
shops, quite a bit of seating, and rows of escalators to get down to platform
level. You can only go to the platform shortly before your departure, so there&amp;rsquo;s
another queue to wait in and crowd to navigate to scan your ticket and board.&lt;/p&gt;
&lt;h2 id="chongqing"&gt;Chongqing&lt;/h2&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24107/"&gt;
	&lt;img src="https://samsm.ch/photo/24107/24107.avif"
 title="朝天门广场 Chaotianmen Square, Chongqing"
 alt="A paved path between planted areas, with multiple skyscrapers and a spaceship looking building in the background, black and white."
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;朝天门广场 Chaotianmen Square, Chongqing&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;p&gt;On my previous visit to Chongqing in 2018 I was really taken by the city. It is,
at least in terms of urban form and landscape, the total opposite of Chengdu.
Chongqing is a huge city built on almost mountainous terrain, at the confluence
of two large rivers. It often feels like everything is built on top of
everything else, you can be on the ground floor on one side of a building and
the 20th floor on the other side. I enjoy photographing how human infrastructure
interacts with nature and Chongqing is full of interesting examples of this.&lt;/p&gt;
&lt;p&gt;During this visit I had less time to explore the odd corners of the city, but we
still got around a good bit. We repeated a walk I had done previously, going
from &lt;em&gt;李‍子‍坝 Liziba&lt;/em&gt; station (where the monorail passes through an
apartment building, which was very quiet in 2018 but now a busy tourist
attraction) up a steep hillside the eventually make it to the pagoda at the top
of &lt;em&gt;鹅‍岭‍公‍园 Eling Park&lt;/em&gt;. The route took us up steep sets of
stairs past some abandoned buildings, then into a wealthier hilltop
neighbourhood, and finally the park. For me, Chongqing is a city to be explored
on foot, there&amp;rsquo;s constantly cool things to see and the terrain gives you
interesting vantage points from which to see them. This can, however, be a bit
less fun when you consider the weather. It can get very hot and very humid in
Chongqing, it&amp;rsquo;s considered one of China&amp;rsquo;s &lt;em&gt;oven cities&lt;/em&gt;. When we were there in
September it mercifully stayed in the low 30s, but that heat combined with
seemingly having to walk uphill to get anywhere can be pretty brutal.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24206/"&gt;
	&lt;img src="https://samsm.ch/photo/24206/24206.avif"
 title="嘉陵江 Jialing River, Chongqing"
 alt="A cityscape showing many tall buildings and skyscrapers with a river cutting through the centre, which has two bridges crossing, black and white."
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;嘉陵江 Jialing River, Chongqing&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;p&gt;Finding nice coffee in Chongqing wasn&amp;rsquo;t so easy, multiple places we found online
and tried to visit weren&amp;rsquo;t open when they said they were, which sometimes meant
quite a bit of walking around in the excessive heat. The best spot we found was
Guaguajun coffee on Daijia Alley, which also had a great view over the Jialing
River.&lt;/p&gt;
&lt;p&gt;Chongqing has a huge metro system, including two monorail lines. Line 2 is
particularly scenic, following the south bank of the Jialing River for a
section. It can often still take quite a bit of effort to get to a train, with
deep stations and long corridors for transferring between lines, another impact
of the terrain. One station we visited, &lt;em&gt;红‍土‍地 Hongtudi&lt;/em&gt;, took 6
escalators to get down to platform level, and that&amp;rsquo;s not even the deepest. We
went to &lt;em&gt;Hongtudi&lt;/em&gt; to experience another form of physical punishment enjoyed
by Chongqingers – their brutally spicy and mouth-numbing hot pot. Specifically
for a hot pot restaurant in a 500m long air raid shelter built during WWII.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24208/"&gt;
	&lt;img src="https://samsm.ch/photo/24208/24208.avif"
 title="长江 Yangtze River, Chongqing"
 alt="A park containing a grid of small square planters in front of a large river, on the other side of which is a dense neighbourhood of skyscrapers, black and white."
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;长江 Yangtze River, Chongqing&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;h2 id="guiyang"&gt;Guiyang&lt;/h2&gt;
&lt;p&gt;Guiyang is the only city we visited on this trip that I hadn&amp;rsquo;t been to before.
It&amp;rsquo;s significantly smaller than the other two cities, with &lt;em&gt;just&lt;/em&gt; 4.5 million
people, compared to 16 and 11 million in Chengdu and Chongqing. I also generally
found it the least interesting of the three. Guiyang is built on hills, but
nowhere near to the degree that Chongqing is, so it doesn&amp;rsquo;t really give the same
sorts of views. The streets are much narrower than those in Chengdu and it
doesn&amp;rsquo;t have the same sort of super-block structure, but the streets are still
very car oriented so you end up with a pretty poor pedestrian experience. What
is interesting is the proliferation of pedestrian underpasses, which exist under
many four-way junctions around town, and these are often full of shops. This is
nice as it lets your briefly avoid the heat and not have to wait to cross, but
to me it just reinforces the feeling of being second class compared to cars.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24303/"&gt;
	&lt;img src="https://samsm.ch/photo/24303/24303.avif"
 title="南明河 Nanming River, Guiyang"
 alt="Looking down on 3 fishermen and their rods cast out into a river with another footpath and a large geometric road bridge on the other side, black and white."
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;南明河 Nanming River, Guiyang&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;p&gt;The reason to visit Guiyang is the food, it has a very distinct cuisine compared
to Chengdu and Chongqing (and the rest of China). We tried sour noodles, which
came with a bucket of raw, unpeeled garlic cloves on the table for you to chew
on – multiple different types of hot pot that I hadn&amp;rsquo;t heard of before, one with
a bean flavoured soup base and another that was mostly just a big pot of
tomatoes and chicken – and the highlight was &lt;em&gt;烙‍锅 Lao Guo&lt;/em&gt;, which is
conceptually similar to hot pot except instead of a pot of hot broth you have a
large pan on which to cook your various meats and vegetables, with a bowl of
spicy dip in the centre.&lt;/p&gt;
&lt;p&gt;Guiyang also has a lively specialty coffee scene, but at least in the short time
we spent there I didn&amp;rsquo;t find any coffee I liked as much as what we were having
in Chengdu. We queued outside Captain George&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;, the pioneer of specialty
coffee in Guiyang, and tried to visit DuiDe Coffee each morning only to find
it with a large queue each time until the third day. For me neither lived up to
the hype.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/24310/"&gt;
	&lt;img src="https://samsm.ch/photo/24310/24310.avif"
 title="南明河 Nanming River, Guiyang"
 alt="A cluster of tall buildings across a river, meeting a tributary at the centre of the image, which has two brdiges crossing. Multiple people are seen walking along the river, black and white."
		 height="1000"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;南明河 Nanming River, Guiyang&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;

&lt;h2 id="parting-thoughts"&gt;Parting Thoughts&lt;/h2&gt;
&lt;p&gt;We had a great time on our trip, I particularly enjoyed Chengdu and would love
to go back, I still feel like there&amp;rsquo;s a lot more exploring to do in Chongqing,
and I&amp;rsquo;m very glad we went to Guiyang but I don&amp;rsquo;t think I&amp;rsquo;d go out of my way to
return.&lt;/p&gt;
&lt;/br&gt;
&lt;p&gt;All the photos in the post were shot on my Hasselblad 501c with an 80mm f/2.8 CB
lens using Ilford HP5+ shot at ISO 800 and developed in Ilfotec HC 1:49 for 11
minutes. I scanned them with an Epson V800 and edited them in darktable.&lt;/p&gt;
&lt;/br&gt;
&lt;p&gt;With thanks to my wife for making the trip what it was, as well as for helping
me put together this post.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;See &lt;em&gt;We Tried China’s Iconic Sichuan Sweet Water Noodles – Bon Appétit&lt;/em&gt;
­ &lt;a href="https://www.youtube.com/watch?v=zVFcNCsiZII"&gt;https://www.youtube.com/watch?v=zVFcNCsiZII&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;See &lt;em&gt;The Legendary Chinese Dumplings Served in an Auntie&amp;rsquo;s Living Room –
Bon Appétit&lt;/em&gt; ­ &lt;a href="https://www.youtube.com/watch?v=i_y-Eg2xX_M"&gt;https://www.youtube.com/watch?v=i_y-Eg2xX_M&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;With a hot pot, you&amp;rsquo;ll also always have your own little customisable dip
bowl, and my tip for if you&amp;rsquo;re like me and not great with spice is to fill
it mostly with vinegar, this really helps to manage the spiciness.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;&lt;a href="https://www.instagram.com/cafe.agua"&gt;https://www.instagram.com/cafe.agua&lt;/a&gt;&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Superblocks are an urban planning concept, in which city blocks are
combined together, allowing traffic to flow around, but only cars heading to
a destination within the superblock are allowed to drive in. The concept is
usually associated with it&amp;rsquo;s implementation in Barcelona.&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;&lt;a href="https://www.instagram.com/captaingeorgecoffee_"&gt;https://www.instagram.com/captaingeorgecoffee_&lt;/a&gt;&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>This site is moving</title><link>https://samsm.ch/this-site-is-moving/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>https://samsm.ch/this-site-is-moving/</guid><description>&lt;p&gt;I have finally bought a domain for this website and it is moving to &lt;a href="https://samsm.ch"&gt;samsm.ch&lt;/a&gt;. It will continue to be available at &lt;a href="http://sams96.github.io"&gt;sams96.github.io&lt;/a&gt; for the time being but that should change at some point and will do so without warning.&lt;/p&gt;</description></item><item><title>Photo Series: Standout</title><link>https://samsm.ch/standout/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate><guid>https://samsm.ch/standout/</guid><description>&lt;p&gt;Standout is a short series of shots taken in Switzerland between March 2021 and
May 2024. They are photos showing telephone poles, electricity pylons,
signposts, and fence posts standing out.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/19106/"&gt;
	&lt;img src="https://samsm.ch/photo/19106/19106.avif"
 title="Standout 01"
 alt="A telephone pole with a second angled support pole in front of a white sky in a field with a patch of snow in the background, black and white."
		 height="1000"
		 width="1000" loading="eager" fetchpriority="high" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/23510/"&gt;
	&lt;img src="https://samsm.ch/photo/23510/23510.avif"
 title="Standout 02"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/20301/"&gt;
	&lt;img src="https://samsm.ch/photo/20301/20301.avif"
 title="Standout 03"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/23402/"&gt;
	&lt;img src="https://samsm.ch/photo/23402/23402.avif"
 title="Standout 04"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/19504/"&gt;
	&lt;img src="https://samsm.ch/photo/19504/19504.avif"
 title="Standout 05"
 alt="In the foreground, a road sign seen from behind at the crossroads of two gravel tracks. A flat field extends behind with pylons and wires above, and some farm buildings behind. Beyond that a partially snow covered mountain, black and white."
		 height="997"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/23503/"&gt;
	&lt;img src="https://samsm.ch/photo/23503/23503.avif"
 title="Standout 06"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/19105/"&gt;
	&lt;img src="https://samsm.ch/photo/19105/19105.avif"
 title="Standout 07"
 alt="A grassy hill with odd fence posts starting in the front left and extending rightwards and into the distance, black and white."
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/23504/"&gt;
	&lt;img src="https://samsm.ch/photo/23504/23504.avif"
 title="Standout 08"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/23509/"&gt;
	&lt;img src="https://samsm.ch/photo/23509/23509.avif"
 title="Standout 09"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;p&gt;Every photo in the series was shot on my Hasselblad 501c with either a 60mm
f/3.5 CF or 80mm f/2.8 CB lens using Ilford HP5+ shot at ISO 800 and developed
in Ilfotec HC 1:49 for 11 minutes. I scanned them with an Epson V800 and edited
them in darktable.&lt;/p&gt;</description></item><item><title>Always Sort by ID — An Interesting Gotcha</title><link>https://samsm.ch/always-sort-by-ID/</link><pubDate>Tue, 27 May 2025 00:00:00 +0000</pubDate><guid>https://samsm.ch/always-sort-by-ID/</guid><description>&lt;p&gt;If you&amp;rsquo;re writing a database query for your web service and there&amp;rsquo;s pagination,
you should always sort by a unique field like ID. This should also be done on
top of any other sorting. Otherwise you can get double entries or lose results
across pages.&lt;/p&gt;
&lt;/br&gt;
&lt;p&gt;A sort can be non-determinstic, as in if you have multiple items with the same
value in the field you are sorting by, there are multiple valid ways to sort it.
This can be okay, until you need that sorting to persist through multiple
queries, as you will when using pagination. This means that your query for your
second page could sort your results differently and give the same entry again,
or completely miss an entry. In the example below, both tables show valid ways
to sort by Customer Name, but give different results which in this case leads to
one order being missed and another shown twice.&lt;/p&gt;
&lt;h3 id="page-1"&gt;Page 1&lt;/h3&gt;
&lt;p&gt;The first two results are returned.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;ID&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Customer name&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Item Ordered&lt;/strong&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;-&amp;gt;&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Alan&lt;/td&gt;
 &lt;td&gt;Apple&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-&amp;gt;&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Betty&lt;/td&gt;
 &lt;td&gt;Banana&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;Betty&lt;/td&gt;
 &lt;td&gt;Grape&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;Callum&lt;/td&gt;
 &lt;td&gt;Apple&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="page-2"&gt;Page 2&lt;/h3&gt;
&lt;p&gt;Now with an offset of 2 the third and forth results are returned, but because we
are sorting in an non-determinstic way, the order has changed and we get
different results than expected.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;ID&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Customer name&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Item Ordered&lt;/strong&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Alan&lt;/td&gt;
 &lt;td&gt;Apple&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;Betty&lt;/td&gt;
 &lt;td&gt;Grape&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-&amp;gt;&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Betty&lt;/td&gt;
 &lt;td&gt;Banana&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-&amp;gt;&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;Callum&lt;/td&gt;
 &lt;td&gt;Apple&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This only applies when using the classic &lt;code&gt;LIMIT&lt;/code&gt; and &lt;code&gt;OFFSET&lt;/code&gt; method of
pagination. &lt;a href="https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/"&gt;Other methods are
available&lt;/a&gt;,
but those tend to come with other downsides that make them less viable for the
type of web services I work on, requiring either more resources or less
flexibility.&lt;/p&gt;
&lt;p&gt;The simple solution here is to just always include a sort by a unique ID, on top
of any existing sorting or any requested by the client. That way your sorting is
always deterministic and no results are lost.&lt;/p&gt;</description><comments>https://toot.io/@mondoman712/114581276592302845</comments></item><item><title>Rgeo — 5 Years On</title><link>https://samsm.ch/rgeo-5-years-on/</link><pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><guid>https://samsm.ch/rgeo-5-years-on/</guid><description>&lt;p&gt;5 years ago I wrote &lt;a href="https://github.com/sams96/rgeo"&gt;Rgeo&lt;/a&gt;, a small Go package
for reverse geocoding (you input some coordinates, it gives you information
about the location). Today I am putting the projected on an indefinite hiatus.&lt;/p&gt;
&lt;/br&gt;
&lt;p&gt;That&amp;rsquo;s maybe a tad dramatic for my little project that I barely touch anyway,
but I thought I should be clear about the fact that I&amp;rsquo;m not really working on it
at all, and I thought I&amp;rsquo;d just write up my thoughts about it here.&lt;/p&gt;
&lt;/br&gt;
&lt;p&gt;In the time since, Rgeo has been noticed somewhat (much more than I expected),
gaining over 50 stars on GitHub and getting some really nice contributions. I am
very happy with how the project has been received by others, despite my neglect.&lt;/p&gt;
&lt;p&gt;My main motivation for writing Rgeo in the first place was as a portfolio piece,
something that I could show prospective employers to prove that I can write
decent Go code, since at that time I didn&amp;rsquo;t have any professional experience. It
served that purpose well, I got a job writing Go not long after the initial
release. And after that I lost the motivation to work on it, since I had a full
time job writing Go.&lt;/p&gt;
&lt;p&gt;I have been reflecting on this project recently because, despite the fact that I
am still waiting Go professionally, I&amp;rsquo;ve had some more motivation to work on my
own projects, but not this project. I don&amp;rsquo;t have any use for the package myself
so I’m not finding issues nor coming up with new features to add.&lt;/p&gt;
&lt;h2 id="what-to-use-now"&gt;What to use now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/smilyorg/tinygpkg"&gt;smilyorg/tinygpkg&lt;/a&gt; - Very nice package
inspired by Rgeo. It uses a different approach to vastly reduce startup time at
the cost of slightly slower queries.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authenticvision/rgeo"&gt;authenticvision/rgeo&lt;/a&gt; - The most
active fork of Rgeo, and most of the contributions I’ve had have come from
these guys.&lt;/li&gt;
&lt;li&gt;Rgeo - There’s no external API calls here so I don’t really see there being
any security concerns, and I will try to keep dependencies up to date and be
better at merging any fixes that come in. There just won’t be any new features
for the time being (not that there has been for a while).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rgeo-v20"&gt;Rgeo v2.0&lt;/h2&gt;
&lt;p&gt;I have an idea of what I would like to do for a version 2 if I ever come back to
this project, and that is to split the querying logic (which would stay in the
main package) from the parts specific to the natural earth data geojson files
used (which would go into a new sub-package). This would provide a more general
use for the package in handling data from any source while still giving easy
access to the same existing functionality. I also like
&lt;a href="https://github.com/SaTae66"&gt;SaTae66&lt;/a&gt;’s snapping PR, but I wonder if similarly
things could be generalised and more tools could be provided, for example
querying for the closest geojson feature to a given point.&lt;/p&gt;</description><comments>https://toot.io/@mondoman712/114126461240720151</comments></item><item><title>Applying Hexagonal Architecture to a Mid-Size Go Backend</title><link>https://samsm.ch/go-project-layout/</link><pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate><guid>https://samsm.ch/go-project-layout/</guid><description>&lt;p&gt;I&amp;rsquo;ve been working on web backends in Go for the past 5 years, and on various
projects of covering a range of ages from brand new greenfield projects to one
built on top of a core that predates the Go language. The needs of these
backends tend not to be overly complex, handling user management, payments, and
a relativly simple product. They&amp;rsquo;re maintained by teams of 2-20 backend
engineers and work with a SPA web frontend communicating with JSON over HTTP.&lt;/p&gt;
&lt;p&gt;With my most recent work being mostly greenfield, I&amp;rsquo;ve been thinking more about
how I can apply what I&amp;rsquo;ve learned from my colleagues working on older projects,
and avoid decisions made in the name of moving fast which cause a lot of pain
further down the line.&lt;/p&gt;
&lt;/br&gt;
&lt;p&gt;What needs to be considered when it comes to layout out a project is finding the
right balance of flexibility without over-abstracting. You want to be able to
move quickly and adapt to ever-changing requirements without being slowed down
by your own code. This heavily depends on what you&amp;rsquo;re working on, but I&amp;rsquo;m going
present what I find works for me for the type of projects I have experience
working on.&lt;/p&gt;
&lt;p&gt;I arrived at this layout not purely by attempting to apply hexagonal
architecture to the projects I have worked on. It is something that I have read
about and is often brought up when it comes to Go project layouts, but I have
arrived here mostly through my experience and by thinking about how to find the
right level of abstraction that works well for these projects.&lt;/p&gt;
&lt;p&gt;Hexagonal architecture splits packages into one of two types: the application&amp;rsquo;s
core and its adapters. The core being the part that defines your application&amp;rsquo;s
business logic and ties the adapters together, and the adapters being wrappers
around external services or other external communication. I would further add a
third type to this, which is utility packages that fill neither of the above
roles.&lt;/p&gt;
&lt;h2 id="core"&gt;Core&lt;/h2&gt;
&lt;p&gt;Core packages should contain all of your main type definitions which the
adapters will also be built around, as well as functions defining the actions
that can take place. In the simplest case this could just be a wrapper around a
database function, but it could also involve much more, including validation and
coordination of different adapters.&lt;/p&gt;
&lt;p&gt;You can split your core where you have clear seperation between domains. A
simple example of this is splitting the user management away from the actual
functionality of your application (assuming that the functionailty isn&amp;rsquo;t heavily
relieant on user management). If your application is small, you can just leave
it all in one package. If you aren&amp;rsquo;t sure, just leave it in one package until
clear lines emerge&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Below I have used a simple user management package as an example framework for a
core package. I have omitted contexts (which you really should be passing) and
imports for brevity. &lt;em&gt;All code samples in this article are for illustrative
purposes only, don&amp;rsquo;t expect them to work as is&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;users&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;User&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;ID&lt;span style="color:#bbb"&gt; &lt;/span&gt;uuid.UUID&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;Email&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserStorer&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;interface&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;NewUser&lt;/span&gt;(email,&lt;span style="color:#bbb"&gt; &lt;/span&gt;password&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;User,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Manager&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;store&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserStorer&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;NewManager&lt;/span&gt;(store&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserStorer)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;Manager&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;&amp;amp;&lt;/span&gt;Manager{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;		&lt;/span&gt;store:&lt;span style="color:#bbb"&gt; &lt;/span&gt;store,&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(m&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;Manager)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;New&lt;/span&gt;(email,&lt;span style="color:#bbb"&gt; &lt;/span&gt;password&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;User,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="font-weight:bold"&gt;...&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;UserStorer&lt;/code&gt; here will likely only have one definition. Even though as
developers we like the idea of having flexibility to swap out the database
easily, in my experience in a commercial setting it&amp;rsquo;s very unlikely to happen.
I also don&amp;rsquo;t think it&amp;rsquo;s really needed for testing, I would just write
integration tests here and run against the DB instead of mocking it. That said,
I like to have the interface defined here anyway because it fits nicely with the
philosphy of core package and having it define what the adapters do.&lt;/p&gt;
&lt;p&gt;Ideally, your core packages won&amp;rsquo;t be dependant on each other and you can keep
everything entirely separate, however this often isn&amp;rsquo;t the case. In some simple
cases, you can just rely on the layer above (the driving adapter, see below) to
call separate functions in different core packages. For more complex
dependencies, I think it&amp;rsquo;s fine for the core packages to sometimes be dependant
on one another (i.e my user manager might include a manager of another domain).
The Go compiler&amp;rsquo;s blocking of circular dependencies should prevent things from
getting too complex here.&lt;/p&gt;
&lt;h2 id="adapters"&gt;Adapters&lt;/h2&gt;
&lt;p&gt;Adapters are what let your core code communicate with the outside world. They
generally exist either as a wrapper around some third party service in order for
it to conform to an interface that has been defined in the core, the obvious
example being your database layer, or as an API calling the functions in your
core package. These are sometimes referred to as &lt;em&gt;driven&lt;/em&gt; and &lt;em&gt;driving&lt;/em&gt;
adapters.&lt;/p&gt;
&lt;h3 id="driven-adapters"&gt;Driven Adapters&lt;/h3&gt;
&lt;p&gt;Driven adapters are those called by your core package, and should satisy the
interface defined there. The most common example, and the one I&amp;rsquo;ve used as an
example below is a database but they could also easily be a key-value store or
object storage. Beyond that, the same pattern can be used to send analytics
events or transactional emails.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;postgres&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;DB&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;db&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;sqlx.DB&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;NewDB&lt;/span&gt;(&lt;span style="color:#998;font-style:italic"&gt;/* connection info */&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;DB&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;...&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(db&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;DB)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;NewUser&lt;/span&gt;(email,&lt;span style="color:#bbb"&gt; &lt;/span&gt;password&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;User,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;...&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I would keep all of the code relating to a single external service in the same
package, so even if you have multiple core packages interacting with one. If
it&amp;rsquo;s a single db, all of the database code can go in one place&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h3 id="driving-adapters"&gt;Driving Adapters&lt;/h3&gt;
&lt;p&gt;A driving adapter is one that calls the functions in your core, and makes them
available externally. For this example I&amp;rsquo;m going to use a simple &lt;em&gt;REST&lt;/em&gt;&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; API
for our user service, designed for some SPA frontend, as this is what I have
most commonly encountered.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;webapi&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Handlers&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;users&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;users.Manager&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;NewHandlers&lt;/span&gt;(users&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;users.Manager)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;Handlers&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;&amp;amp;&lt;/span&gt;Handlers{users:&lt;span style="color:#bbb"&gt; &lt;/span&gt;users}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(h&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;Handlers)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;Route&lt;/span&gt;(mux&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;http.ServeMux)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;mux.&lt;span style="color:#900;font-weight:bold"&gt;HandleFunc&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;POST /register&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;h.handlePostRegister)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(h&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;Handlers)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;handlePostRegister&lt;/span&gt;(w&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.ResponseWriter,&lt;span style="color:#bbb"&gt; &lt;/span&gt;r&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;http.Request)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;req&lt;span style="color:#bbb"&gt; &lt;/span&gt;postRegisterRequest&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;json.&lt;span style="color:#900;font-weight:bold"&gt;NewDecoder&lt;/span&gt;(r.Body).&lt;span style="color:#900;font-weight:bold"&gt;Decode&lt;/span&gt;(&lt;span style="font-weight:bold"&gt;&amp;amp;&lt;/span&gt;req)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;		&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;/* handle error */&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;user,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;h.users.&lt;span style="color:#900;font-weight:bold"&gt;New&lt;/span&gt;(req.Email,&lt;span style="color:#bbb"&gt; &lt;/span&gt;req.Password)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;		&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;/* handle error */&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;resp&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;postRegisterResponse{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;		&lt;/span&gt;UserID:&lt;span style="color:#bbb"&gt; &lt;/span&gt;user.ID,&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;json.&lt;span style="color:#900;font-weight:bold"&gt;NewEncoder&lt;/span&gt;(w).&lt;span style="color:#900;font-weight:bold"&gt;Encode&lt;/span&gt;(&lt;span style="font-weight:bold"&gt;&amp;amp;&lt;/span&gt;resp)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;		&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;/* handle error */&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;w.&lt;span style="color:#900;font-weight:bold"&gt;WriteHeader&lt;/span&gt;(http.StatusCreated)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When it comes to factoring this package, I like to divide it by intended
consumer, so routes for your SPA frontend go in one place, and webhook handlers
go in another etc. That way the request and reply formats and expectations of
all routes in one package is the same, as is the authentication.&lt;/p&gt;
&lt;h2 id="utilities"&gt;Utilities&lt;/h2&gt;
&lt;p&gt;Utility packages are those that don&amp;rsquo;t fit into either previous category, by both
not implementing business logic and not interacting direcltly with an external
service. Aside from any convenience abstractions that you want to reuse in
multiple packages, the main thing I expect to fit this category in our web app
is authorization. Auth &lt;em&gt;kind of&lt;/em&gt; fits in with the driving adapter, but also
splits of nicely, and if you&amp;rsquo;re exposing multiple APIs you&amp;rsquo;re probably going to
reuse some of the code.&lt;/p&gt;
&lt;p&gt;Also, don&amp;rsquo;t take this category as a suggestion to create a &lt;code&gt;utils&lt;/code&gt; package.
Generically named packages like this are recommended against in go, and &lt;em&gt;A
little copying is better than a little dependancy&lt;/em&gt;&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id="conclusion-and-other-thoughts"&gt;Conclusion and other thoughts&lt;/h2&gt;
&lt;p&gt;When it comes to the folder structure, I would advise keeping everything as flat
as possible, Subfolders are nice where you have a bunch of non-go files related
to a package, such as your database migrations. You probably don&amp;rsquo;t need a &lt;code&gt;src&lt;/code&gt;,
&lt;code&gt;pkg&lt;/code&gt;, or &lt;code&gt;internal&lt;/code&gt; folder to contain other packages. You can just leave
everything in the top level of your repo. These make sense in very large
projects like &lt;a href="https://github.com/moby/moby"&gt;Moby&lt;/a&gt; or
&lt;a href="https://github.com/kubernetes/kubernetes"&gt;Kubernetes&lt;/a&gt;, but for our web service
you&amp;rsquo;re just making things harder to find. Leave it at the top level until that
starts to cause issues.&lt;/p&gt;
&lt;/br&gt;
&lt;p&gt;As I said at the top, this is the layout that I&amp;rsquo;ve arrived at from my experience
working on commercial web backends in Go. I think it&amp;rsquo;s a practical level of
abstraction to stay flexible without spending too much time or adding too much
complexity.&lt;/p&gt;
&lt;p&gt;You might think that there isn&amp;rsquo;t actually much to what I have
suggested here, but that&amp;rsquo;s part of the point. You don&amp;rsquo;t need much abstraction
and not having it will help reduce the mental load of working on your codebase,
allowing you to focus on productive work and for new developers to be onboarded
more easily.&lt;/p&gt;
&lt;h3 id="further-reading"&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://alistair.cockburn.us/hexagonal-architecture/"&gt;Hexagonal architecture&lt;/a&gt; - Alistair Cockburn&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go.dev/blog/package-names"&gt;Package names&lt;/a&gt; - Sameer Ajmani&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html"&gt;Less is exponentially more&lt;/a&gt; - Rob Pike&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://grugbrain.dev/#grug-on-factring-your-code"&gt;Don&amp;rsquo;t factor early&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;At least until you start splitting your tables into different schemas.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;This isn&amp;rsquo;t actually REST, but is often referred to as REST, see
&lt;a href="https://htmx.org/essays/how-did-rest-come-to-mean-the-opposite-of-rest/"&gt;&lt;em&gt;How Did REST Come To Mean The Opposite of REST?&lt;/em&gt;&lt;/a&gt;&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;From &lt;a href="https://www.youtube.com/watch?v=PAAkCSZUG1c&amp;amp;t=568s"&gt;Go Proverbs with Rob Pike&lt;/a&gt;
at Gopherfest 2015&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><comments>https://toot.io/@mondoman712/114071633084030867</comments></item><item><title>Portfolio V - 2020</title><link>https://samsm.ch/portfolio-v/</link><pubDate>Sun, 19 Dec 2021 00:00:00 +0000</pubDate><guid>https://samsm.ch/portfolio-v/</guid><description>&lt;p&gt;This year was, unlike the previous few, without any major travel. Although I did
move from the UK to Switzerland, which did give me a new place to explore and
photograph. Even with that I took a fraction of the number of photos I usually
take in a year in 2020, which left me with not much to choose from for this
selection. I chose to still put it together though because I like that this has
become somewhat of a yearly reflection (even if it does take me the better part
of the next year to put them together) and I thought that given it was somewhat
of an interesting year it could be nice to have this record.&lt;/p&gt;
&lt;p&gt;Along with the reduced number of photos taken came a complete lack of work
towards any larger serious projects, although I have started a couple of
collections of images taken with my phone that could become something
eventually.&lt;/p&gt;
&lt;p&gt;


&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/16704/"&gt;
	&lt;img src="https://samsm.ch/photo/16704/16704.avif"
 title="Grand Union Canal"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Grand Union Canal&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/16711/"&gt;
	&lt;img src="https://samsm.ch/photo/16711/16711.avif"
 title="Worcester &amp;amp; Birmingham Canal I"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Worcester &amp;amp; Birmingham Canal I&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/16712/"&gt;
	&lt;img src="https://samsm.ch/photo/16712/16712.avif"
 title="Worcester &amp;amp; Birmingham Canal II"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Worcester &amp;amp; Birmingham Canal II&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/16907/"&gt;
	&lt;img src="https://samsm.ch/photo/16907/16907.avif"
 title="Sihl"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Sihl&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17101/"&gt;
	&lt;img src="https://samsm.ch/photo/17101/17101.avif"
 title="Stockwald"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Stockwald&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17103/"&gt;
	&lt;img src="https://samsm.ch/photo/17103/17103.avif"
 title="Melchsee"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Melchsee&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17105/"&gt;
	&lt;img src="https://samsm.ch/photo/17105/17105.avif"
 title="Bettenalp"
 alt="TODO alt text"
		 height="1000"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Bettenalp&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17108/"&gt;
	&lt;img src="https://samsm.ch/photo/17108/17108.avif"
 title="Balconies I"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Balconies I&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17204/"&gt;
	&lt;img src="https://samsm.ch/photo/17204/17204.avif"
 title="Balconies II"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Balconies II&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17205/"&gt;
	&lt;img src="https://samsm.ch/photo/17205/17205.avif"
 title="Siedlung Langgrüt"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Siedlung Langgrüt&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17304/"&gt;
	&lt;img src="https://samsm.ch/photo/17304/17304.avif"
 title="Fernsehturm Üetliburg"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Fernsehturm Üetliburg&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/17306/"&gt;
	&lt;img src="https://samsm.ch/photo/17306/17306.avif"
 title="Schlittelweg Üetliberg"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Schlittelweg Üetliberg&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;This year actually came with a change in equipment. I swapped out my Hasselblad
500C/M for a newer 501C, and with the change gained an 80mm CB lens, which which
all but one of the above images were taken. I did however stick with the trusty
Ilford HP5+ throughout, all shot at 400 except the last two which were at 800.&lt;/p&gt;</description></item><item><title>August 01</title><link>https://samsm.ch/august-01/</link><pubDate>Tue, 03 Aug 2021 00:00:00 +0000</pubDate><guid>https://samsm.ch/august-01/</guid><description>&lt;p&gt;August 01 is Swiss national day, and one of the few days of the year that it&amp;rsquo;s
legal to set off fireworks here in Zurich. I decided to head out in the evening
with my digital camera to see the fireworks and take a few photos, primarily
just for myself and maybe to put a few on my Instagram story (hence the vertial
compositions). In the end I thought I had a nice little atmospheric photo series
which would fit nicely here.&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/23Sopq"&gt;
	&lt;img src="https://live.staticflickr.com/65535/51355630358_6ae2d1a26e_h.jpg" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/3Sb77D"&gt;
	&lt;img src="https://live.staticflickr.com/65535/51355402696_39b5777a8d_h.jpg" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="https://live.staticflickr.com/65535/51355402471_da0d001689_h.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="https://live.staticflickr.com/65535/51355402521_715292695a_h.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="https://live.staticflickr.com/65535/51356417910_7db8357fa5_h.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="https://live.staticflickr.com/65535/51354659772_495640c83d_h.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Portfolio IV - 2019</title><link>https://samsm.ch/portfolio-iv/</link><pubDate>Sun, 22 Nov 2020 00:00:00 +0000</pubDate><guid>https://samsm.ch/portfolio-iv/</guid><description>&lt;p&gt;2019 was another active year for me, with a trip to Venice in July and then a
long trip to Barcelona, the U.S, Vietnam, Thailand but mostly Taiwan. I only
shot colour film in Vietnam and Thailand so those won&amp;rsquo;t appear here, and my film
from Thailand was actually the first film I&amp;rsquo;ve posted to a lab due to running
out of chems and Corona, and they were annoyingly lost before they made it
there.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t do as much towards photo series in 2019 as I would&amp;rsquo;ve liked to. I did
make together my &lt;a href="https://samsm.ch/ny-architecture"&gt;New York Architecture post&lt;/a&gt; and put together
&lt;a href="https://samsm.ch/edgeland-nottingham"&gt;a series of images I shot in Nottingham&lt;/a&gt; since I started
studying there. I did think about starting a series many times throughout the
year but I left Nottingham in June and didn&amp;rsquo;t know where I was going to be in
the longer term so I didn&amp;rsquo;t want to start anything big that I wouldn&amp;rsquo;t be able
to finish.&lt;/p&gt;
&lt;p&gt;


&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12609/"&gt;
	&lt;img src="https://samsm.ch/photo/12609/12609.avif"
 title="Brinklow Tower"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Brinklow Tower&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12907/"&gt;
	&lt;img src="https://samsm.ch/photo/12907/12907.avif"
 title="Wollaton Oak"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Wollaton Oak&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/13606/"&gt;
	&lt;img src="https://samsm.ch/photo/13606/13606.avif"
 title="Llangrannog Beach"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Llangrannog Beach&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/13611/"&gt;
	&lt;img src="https://samsm.ch/photo/13611/13611.avif"
 title="Talley Woodland"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Talley Woodland&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/13803/"&gt;
	&lt;img src="https://samsm.ch/photo/13803/13803.avif"
 title="Wollaton Deer"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Wollaton Deer&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14110/"&gt;
	&lt;img src="https://samsm.ch/photo/14110/14110.avif"
 title="Nordic Pavilion"
 alt="A wooden door in a concrete wall left of centre, to the right cornered steps rising up two thids of the way up the frame with dark trees in in the background above, black and white"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Nordic Pavilion&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14507/"&gt;
	&lt;img src="https://samsm.ch/photo/14507/14507.avif"
 title="Chatham Green"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Chatham Green&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14611/"&gt;
	&lt;img src="https://samsm.ch/photo/14611/14611.avif"
 title="Americana Submarine"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Americana Submarine&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14706/"&gt;
	&lt;img src="https://samsm.ch/photo/14706/14706.avif"
 title="Hilliard Towers"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Hilliard Towers&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/15304/"&gt;
	&lt;img src="https://samsm.ch/photo/15304/15304.avif"
 title="Hualien Breakwater"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Hualien Breakwater&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/16007/"&gt;
	&lt;img src="https://samsm.ch/photo/16007/16007.avif"
 title="Huajiang Riverside Park"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Huajiang Riverside Park&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/16510/"&gt;
	&lt;img src="https://samsm.ch/photo/16510/16510.avif"
 title="Power Lines"
 alt="TODO alt text"
		 height="999"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Power Lines&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As usual all of these images were, again, shot with my Hasselblad 500C/M and
60mm CF and 150mm CF lenses on Ilford film. Mostly HP5+ at 400 or 800, but the
last shot is at 3200, and two in the middle are Pan F+.&lt;/p&gt;</description></item><item><title>Edgeland Nottingham</title><link>https://samsm.ch/edgeland-nottingham/</link><pubDate>Sun, 29 Mar 2020 00:00:00 +0000</pubDate><guid>https://samsm.ch/edgeland-nottingham/</guid><description>&lt;p&gt;I was recently looking through all the photos I took during my 4 years living in
Nottingham to see if I could come up with some kind of series out of them. After
cutting it down to all the black &amp;amp; white images that turned out reasonably I had
just over 200 photos so I needed to come up with some more specific ideas. One
theme I tend to shoot a lot is where nature meets the built environment, which
lead me to put together this series. I got the title, and some inspiration, from
&lt;a href="https://www.robinfriend.co.uk/bastard-countryside"&gt;Robin Friend&amp;rsquo;s Bastard
Countryside&lt;/a&gt; (watch &lt;a href="https://www.youtube.com/watch?v=EkS_jxaej90"&gt;this
video&lt;/a&gt; for a good introduction).



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/13707/"&gt;
	&lt;img src="https://samsm.ch/photo/13707/13707.avif"
 title="Edgeland Nottingham 01"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;
&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12010/"&gt;
	&lt;img src="https://samsm.ch/photo/12010/12010.avif"
 title="Edgeland Nottingham 02"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;div class="diptych"&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12812/"&gt;
	&lt;img src="https://samsm.ch/photo/12812/12812.avif"
 title="Edgeland Nottingham 03"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12810/"&gt;
	&lt;img src="https://samsm.ch/photo/12810/12810.avif"
 title="Edgeland Nottingham 04"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;/div&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6602/"&gt;
	&lt;img src="https://samsm.ch/photo/6602/6602.avif"
 title="Edgeland Nottingham 05"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12805/"&gt;
	&lt;img src="https://samsm.ch/photo/12805/12805.avif"
 title="Edgeland Nottingham 06"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12806/"&gt;
	&lt;img src="https://samsm.ch/photo/12806/12806.avif"
 title="Edgeland Nottingham 07"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;div class="diptych"&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12709/"&gt;
	&lt;img src="https://samsm.ch/photo/12709/12709.avif"
 title="Edgeland Nottingham 08"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/13201/"&gt;
	&lt;img src="https://samsm.ch/photo/13201/13201.avif"
 title="Edgeland Nottingham 09"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;/div&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/13210/"&gt;
	&lt;img src="https://samsm.ch/photo/13210/13210.avif"
 title="Edgeland Nottingham 10"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/13206/"&gt;
	&lt;img src="https://samsm.ch/photo/13206/13206.avif"
 title="Edgeland Nottingham 11"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/11810/"&gt;
	&lt;img src="https://samsm.ch/photo/11810/11810.avif"
 title="Edgeland Nottingham 12"
 alt="TODO alt text"
		 height="999"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6410/" name="13" &gt;
	&lt;img src="https://samsm.ch/photo/6410/6410.avif"
 title="Edgeland Nottingham 13"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7101/"&gt;
	&lt;img src="https://samsm.ch/photo/7101/7101.avif"
 title="Edgeland Nottingham 14"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6910/"&gt;
	&lt;img src="https://samsm.ch/photo/6910/6910.avif"
 title="Edgeland Nottingham 15"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;div class="diptych"&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12707/"&gt;
	&lt;img src="https://samsm.ch/photo/12707/12707.avif"
 title="Edgeland Nottingham 16"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7008/"&gt;
	&lt;img src="https://samsm.ch/photo/7008/7008.avif"
 title="Edgeland Nottingham 17"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;/div&gt;
&lt;div class="diptych"&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6310/"&gt;
	&lt;img src="https://samsm.ch/photo/6310/6310.avif"
 title="Edgeland Nottingham 18"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7106/"&gt;
	&lt;img src="https://samsm.ch/photo/7106/7106.avif"
 title="Edgeland Nottingham 19"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;/div&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7105/"&gt;
	&lt;img src="https://samsm.ch/photo/7105/7105.avif"
 title="Edgeland Nottingham 20"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7102/"&gt;
	&lt;img src="https://samsm.ch/photo/7102/7102.avif"
 title="Clifton Bridge"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7012/"&gt;
	&lt;img src="https://samsm.ch/photo/7012/7012.avif"
 title="Edgeland Nottingham 22"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6311/"&gt;
	&lt;img src="https://samsm.ch/photo/6311/6311.avif"
 title="Edgeland Nottingham 23"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6306/"&gt;
	&lt;img src="https://samsm.ch/photo/6306/6306.avif"
 title="Edgeland Nottingham 24"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;p&gt;This series was shot with my Hasselblad 500C/M, CF 60mm and 150mm lenses, and
Ilford HP5+ at EI 800 and developed in HC-110 1+49 for 11 minutes, except for
&lt;a href="https://samsm.ch/edgeland-nottingham/#13"&gt;image 13&lt;/a&gt;, which was shot on Ilford FP4+ at EI 400 and developed in HC-110
1+49 for 16 minutes.&lt;/p&gt;
&lt;p&gt;In Feburary 2019 I started shooting a series with a similar theme in a small
nature reserve in Nottingham on Fuji Pro 400H, but I&amp;rsquo;ve never been able to get
acceptable scans from the 2 rolls I shot. If I do manage to get something useful
from them I might put together a part 2 to this project.&lt;/p&gt;</description></item><item><title>Photo Series: New York Architecture</title><link>https://samsm.ch/ny-architecture/</link><pubDate>Sun, 15 Mar 2020 00:00:00 +0000</pubDate><guid>https://samsm.ch/ny-architecture/</guid><description>&lt;p&gt;Just 15 months after I posted my &lt;a href="https://samsm.ch/singaporean-architecture/"&gt;Singapore Architecture photo
series&lt;/a&gt;, I have decided to revisit this theme with
some photos I took in New York last September. Despite what this series might
suggest, I did explore beyond Manhattan but not as much because I found
Manhattan to be the most interesting photographically.&lt;/p&gt;
&lt;div class="diptych"&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14510/"&gt;
	&lt;img src="https://samsm.ch/photo/14510/14510.avif"
 title="New York Architecture 01"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14507/"&gt;
	&lt;img src="https://samsm.ch/photo/14507/14507.avif"
 title="Chatham Green"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;/div&gt;
&lt;p&gt;


&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14401/"&gt;
	&lt;img src="https://samsm.ch/photo/14401/14401.avif"
 title="New York Architecture 03"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14403/"&gt;
	&lt;img src="https://samsm.ch/photo/14403/14403.avif"
 title="New York Architecture 04"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14409/"&gt;
	&lt;img src="https://samsm.ch/photo/14409/14409.avif"
 title="New York Architecture 05"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14502/"&gt;
	&lt;img src="https://samsm.ch/photo/14502/14502.avif"
 title="New York Architecture 06"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14503/"&gt;
	&lt;img src="https://samsm.ch/photo/14503/14503.avif"
 title="New York Architecture 07"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14412/"&gt;
	&lt;img src="https://samsm.ch/photo/14412/14412.avif"
 title="New York Architecture 08"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;
&lt;/p&gt;
&lt;div class="diptych"&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14411/"&gt;
	&lt;img src="https://samsm.ch/photo/14411/14411.avif"
 title="New York Architecture 09"
 alt="TODO alt text"
		 height="999"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14511/"&gt;
	&lt;img src="https://samsm.ch/photo/14511/14511.avif"
 title="New York Architecture 10"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;/div&gt;
&lt;div class="diptych"&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14509/"&gt;
	&lt;img src="https://samsm.ch/photo/14509/14509.avif"
 title="Manhattan Bridge"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/14508/"&gt;
	&lt;img src="https://samsm.ch/photo/14508/14508.avif"
 title="Brooklyn Bridge"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;/div&gt;
&lt;p&gt;This series was shot with my Hasselblad 500C/M and CF 150mm lens, on Ilford HP5+
shot at EI 800 and developed in HC-110 1+49 for 11 minutes.&lt;/p&gt;</description></item><item><title>Rgeo — A Go package for basic, fast, local reverse geocoding</title><link>https://samsm.ch/rgeo/</link><pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate><guid>https://samsm.ch/rgeo/</guid><description>&lt;p&gt;&lt;a href="https://github.com/sams96/rgeo"&gt;Rgeo&lt;/a&gt; is a fast, simple solution for local
reverse geocoding, Rather than relying on external software or online APIs, rgeo
packages all of the data it needs in your binary. This means it will only ever
work down to the level of cities , but if that&amp;rsquo;s all you need then this is the
library for you.&lt;/p&gt;
&lt;p&gt;Rgeo uses data from &lt;a href="https://naturalearthdata.com"&gt;naturalearthdata.com&lt;/a&gt;, if
your coordinates are going to be near specific borders I would advise checking
the data beforehand (links to which are in the files). If you want to use your
own dataset, check out
&lt;a href="https://github.com/sams96/rgeo/tree/master/datagen"&gt;datagen&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="key-features"&gt;Key Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast&lt;/strong&gt; - So I haven&amp;rsquo;t &lt;em&gt;actually&lt;/em&gt; benchmarked other reverse geocoding tools
but on my laptop rgeo can run at under 800ns/op.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local&lt;/strong&gt; - Rgeo doesn&amp;rsquo;t require pinging some API, most of which either cost
money to use or have severe rate limits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lightweight&lt;/strong&gt; - The rgeo repo is 141MB, which is large for a Go package but
compared to the 800GB needed for a full planet install of
&lt;a href="https://nominatim.org/release-docs/latest/admin/Installation/#hardware"&gt;Nominatim&lt;/a&gt;
it&amp;rsquo;s miniscule.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Download with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go get github.com/sams96/rgeo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and add&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;&amp;#34;github.com/sams96/rgeo&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to the top of your Go file to include it in your project.&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;New&lt;/span&gt;(Provinces10,&lt;span style="color:#bbb"&gt; &lt;/span&gt;Cities10)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Handle error&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;loc,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;r.&lt;span style="color:#900;font-weight:bold"&gt;ReverseGeocode&lt;/span&gt;([]&lt;span style="color:#458;font-weight:bold"&gt;float64&lt;/span&gt;{&lt;span style="color:#099"&gt;141.35&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#099"&gt;43.07&lt;/span&gt;})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Handle error&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Println&lt;/span&gt;(loc)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Output: &amp;lt;Location&amp;gt; Sapporo, Hokkaido, Japan (JPN), Asia&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First initialise rgeo using &lt;code&gt;rgeo.New&lt;/code&gt;,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;New&lt;/span&gt;(datasets&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;...&lt;/span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;[]&lt;span style="color:#458;font-weight:bold"&gt;byte&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;Rgeo,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;which takes any non-zero number of datasets as arguments. The included datasets
are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Countries110&lt;/code&gt; - Just country information, smallest and lowest detail of the
included datasets.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Countries10&lt;/code&gt; - The same as above but with more detail.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Provinces10&lt;/code&gt; - Includes province information as well as country, so can
still be used alone.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cities10&lt;/code&gt; - Just city information, if you want provinces and/or countries as
well use one of the above datasets with it.
Once initialised you can use &lt;code&gt;ReverseGeocode&lt;/code&gt; on the value returned by &lt;code&gt;New&lt;/code&gt;,
with your coordinates to get the location information. See the &lt;a href="https://pkg.go.dev/github.com/sams96/rgeo"&gt;Go
Docs&lt;/a&gt; for more information on usage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then use &lt;code&gt;ReverseGeocode&lt;/code&gt; to get the location information of the given coordinate.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(r&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;*&lt;/span&gt;Rgeo)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#900;font-weight:bold"&gt;ReverseGeocode&lt;/span&gt;(loc&lt;span style="color:#bbb"&gt; &lt;/span&gt;geom.Coord)&lt;span style="color:#bbb"&gt; &lt;/span&gt;(Location,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The input is a &lt;a href="https://github.com/twpayne/go-geom"&gt;&lt;code&gt;geom.Coord&lt;/code&gt;&lt;/a&gt;, which is just
a &lt;code&gt;[]float64&lt;/code&gt; with the longitude in the zeroth position and the latitude in the
first position (i.e. &lt;code&gt;[]float64{lon, lat}&lt;/code&gt;). &lt;code&gt;ReverseGeocode&lt;/code&gt; returns a
&lt;code&gt;Location&lt;/code&gt;, which looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Location&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Commonly used country name&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;Country&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;country,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Formal name of country&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;CountryLong&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;country_long,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// ISO 3166-1 alpha-1 and alpha-2 codes&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;CountryCode2&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;country_code_2,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;CountryCode3&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;country_code_3,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;Continent&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;continent,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;Region&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;region,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;SubRegion&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;subregion,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;Province&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;province,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// ISO 3166-2 code&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;ProvinceCode&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;province_code,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;City&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#458;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b84"&gt;`json:&amp;#34;city,omitempty&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, to put it all together:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;rgeo.&lt;span style="color:#900;font-weight:bold"&gt;New&lt;/span&gt;(Countries110)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Handle error&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;loc,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;r.&lt;span style="color:#900;font-weight:bold"&gt;ReverseGeocode&lt;/span&gt;([]&lt;span style="color:#458;font-weight:bold"&gt;float64&lt;/span&gt;{&lt;span style="color:#099"&gt;0&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#099"&gt;52&lt;/span&gt;})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;	&lt;/span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Handle error&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;loc.Country)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;loc.CountryLong)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;loc.CountryCode2)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;loc.CountryCode3)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;loc.Continent)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;loc.Region)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.&lt;span style="color:#900;font-weight:bold"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b84"&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;loc.SubRegion)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Output: United Kingdom&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// United Kingdom of Great Britain and Northern Ireland&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// GB&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// GBR&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Europe&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Europe&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#998;font-style:italic"&gt;// Northern Europe&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="projects-using-rgeo"&gt;Projects using rgeo&lt;/h2&gt;
&lt;p&gt;Currently the only project that I know of is my own
&lt;a href="https://github.com/sams96/rgeoSrv"&gt;rgeoSrv&lt;/a&gt;, which aims to wrap rgeo into a
microservice. I am also planning on writing a command line appication to apply
IPTC location tags to images that already contain geolocation information.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;The data used by rgeo is made from a collection of GeoJSON files aquired from
&lt;a href="https://github.com/nvkelso/natural-earth-vector/tree/master/geojson"&gt;Natural Earth
Data&lt;/a&gt;,
which are packaged into Go files by
&lt;a href="https://github.com/sams96/rgeo/tree/master/datagen"&gt;datagen&lt;/a&gt;. The go files
contain functions which return byte slices that contain the base 64 encoded,
gzipped GeoJSON files. They&amp;rsquo;re packaged into function because that seems to be
the only way to have the Go compiler ignore them if they aren&amp;rsquo;t used (so your
program isn&amp;rsquo;t inflated by huge data files that you aren&amp;rsquo;t using).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;New&lt;/code&gt; takes the datasets, decodes the data and parses the GeoJSON. It creates an
&lt;code&gt;Rgeo&lt;/code&gt; struct which contains an &lt;a href="https://github.com/golang/geo"&gt;s2&lt;/a&gt; shape index,
a map to store the location information of each area and an s2 contains point
query. The shape index contains s2 polygons for each of the areas in the given
dataset, and the contains point query is what goes from the input coordinates to
a shape. The map is then used to get the location information from the shape.&lt;/p&gt;
&lt;p&gt;One thing I discovered through working on this is initialising s2 loops and
polygons is very slow and there&amp;rsquo;s no way to store them that doesn&amp;rsquo;t have to run
all the validation code upon loading them. I found that going from creating the
s2 types every time to using geom&amp;rsquo;s &lt;code&gt;IsPointInRing&lt;/code&gt; function yields a ~100x
speed increase. I used s2 types because I wrote rgeo to be used many times in a
program rather than a few, and s2&amp;rsquo;s contains point query is &lt;em&gt;very&lt;/em&gt; fast
(although I don&amp;rsquo;t have any benchmarks to hand).&lt;/p&gt;</description></item><item><title>Campus Lights Updates and Out-takes</title><link>https://samsm.ch/campus-lights-updates/</link><pubDate>Wed, 24 Jul 2019 00:00:00 +0000</pubDate><guid>https://samsm.ch/campus-lights-updates/</guid><description>&lt;p&gt;It&amp;rsquo;s 5 months since I posted my project &lt;a href="https://samsm.ch/campus-lights-updates/"&gt;Campus Lights&lt;/a&gt;.
Sadly I didn&amp;rsquo;t manage to make any progress with getting anything changed on
campus, the person I&amp;rsquo;d emailed didn&amp;rsquo;t get back to me and my exams &amp;amp; dissertation
took precedence so I didn&amp;rsquo;t pursue it any further.&lt;/p&gt;
&lt;p&gt;I did manage to write a slightly extended version of the article for
&lt;a href="https://emulsive.org/articles/campus-lights-documenting-local-light-pollution-on-film"&gt;Emulsive&lt;/a&gt;,
for which I also swapped out a couple of photos. I consider this to be the final
version of the project and I am very happy with how it turned out.&lt;/p&gt;
&lt;p&gt;Also reddit user &lt;a href="https://www.reddit.com/user/ISUOnFilm"&gt;ISUOnFilm&lt;/a&gt; created
&lt;a href="https://www.reddit.com/r/AnalogCommunity/comments/axqfab/campus_lights_2_my_version_of_a_project_by/"&gt;their own version&lt;/a&gt;
of the project which I think turned out really well.
&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/X932W6"&gt;
	&lt;img src="https://live.staticflickr.com/65535/48366107342_cc00f4b651_b.jpg"
 alt="Campus Lights 10" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Replacement for Campus Lights 10 in Emulsive version&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/1r5U0L"&gt;
	&lt;img src="https://live.staticflickr.com/65535/48365976091_d2be5d79f1_b.jpg"
 alt="Campus Lights 24" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Replacement for Campus Lights 24 in Emulsive version&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The following 3 photos are ones that I took for the project, didn&amp;rsquo;t make it into
the final cut but I still wanted to share.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/x06ue6"&gt;
	&lt;img src="https://live.staticflickr.com/65535/48365982971_a562428381_b.jpg"
 alt="Campus Lights Out-take 1" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Campus Lights Out-take 1&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/034t81"&gt;
	&lt;img src="https://live.staticflickr.com/65535/48365984271_ac0d5f5e18_b.jpg"
 alt="Campus Lights Out-take 2" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Campus Lights Out-take 2&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/278p73"&gt;
	&lt;img src="https://live.staticflickr.com/65535/48366118977_03fa2d6a43_b.jpg"
 alt="Campus Lights Out-take 3" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Campus Lights Out-take 3&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Overall I am very pleased with how the project turned out and with how it was
received. My main goal with projects going forward is to try something longer
term, and I hope to revisit the topic of light pollution at some point.&lt;/p&gt;</description></item><item><title>Portfolio III - 2018</title><link>https://samsm.ch/portfolio-iii/</link><pubDate>Tue, 18 Jun 2019 00:00:00 +0000</pubDate><guid>https://samsm.ch/portfolio-iii/</guid><description>&lt;p&gt;Having finished my &lt;a href="https://samsm.ch/portfolio-ii/"&gt;last portfolio&lt;/a&gt;
at the end of 2017 I can now start doing them yearly, so this one covers 2018.
This includes two trips to the Canary islands, one to Gran Canaria in March and
another to Fuerteventura in December as well as another long trip around Asia in
the summer.&lt;/p&gt;
&lt;p&gt;2018 is also the year during which I started to become more interested in
collections of images rather than just single photos. I shot two rather short
projects over the year, &lt;a href="https://samsm.ch/subways/"&gt;Subways&lt;/a&gt; and
&lt;a href="https://samsm.ch/campus-lights/"&gt;Campus Lights&lt;/a&gt;.
I also attended a photo sequencing workshop at The Photo Parlour in Nottingham
as part of the Off-Centre photo festival during which we looked at a selection
of prints of my photos taken in China, which I have continued to work on.&lt;/p&gt;
&lt;p&gt;


&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7102/"&gt;
	&lt;img src="https://samsm.ch/photo/7102/7102.avif"
 title="Clifton Bridge"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Clifton Bridge&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/7512/"&gt;
	&lt;img src="https://samsm.ch/photo/7512/7512.avif"
 title="Barranco de los Mocanes"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Barranco de los Mocanes&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/8101/"&gt;
	&lt;img src="https://samsm.ch/photo/8101/8101.avif"
 title="Two Leaves"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Two Leaves&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/8405/"&gt;
	&lt;img src="https://samsm.ch/photo/8405/8405.avif"
 title="Subways 01"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Subways 01&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/8505/"&gt;
	&lt;img src="https://samsm.ch/photo/8505/8505.avif"
 title="Cascade Cavern"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Cascade Cavern&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/9204/"&gt;
	&lt;img src="https://samsm.ch/photo/9204/9204.avif"
 title="Macaque"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Macaque&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/9609/"&gt;
	&lt;img src="https://samsm.ch/photo/9609/9609.avif"
 title="Scrap Collectors"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Scrap Collectors&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/10601/"&gt;
	&lt;img src="https://samsm.ch/photo/10601/10601.avif"
 title="Victoria Harbour"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Victoria Harbour&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/10603/"&gt;
	&lt;img src="https://samsm.ch/photo/10603/10603.avif"
 title="Queen&amp;#39;s Road Central"
 alt="TODO alt text"
		 height="1000"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Queen's Road Central&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/10711/"&gt;
	&lt;img src="https://samsm.ch/photo/10711/10711.avif"
 title="Ronghu Lake"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Ronghu Lake&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/10906/"&gt;
	&lt;img src="https://samsm.ch/photo/10906/10906.avif"
 title="Yuzhong"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Yuzhong&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/12407/"&gt;
	&lt;img src="https://samsm.ch/photo/12407/12407.avif"
 title="Towards Triquivijate"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Towards Triquivijate&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As usual all of these images were shot with my Hasselblad 500C/M and 60mm CF and
150mm CF lenses on Ilford film, although with a bit more variation that last
year as I have included one shot taken on Delta 100 and one on Pan F+ but the
rest are my usual HP5+. There&amp;rsquo;s also more photos taken with my 60mm lens
included this year than there was last year.&lt;/p&gt;</description></item><item><title>Campus Lights</title><link>https://samsm.ch/campus-lights/</link><pubDate>Sat, 16 Feb 2019 00:00:00 +0000</pubDate><guid>https://samsm.ch/campus-lights/</guid><description>&lt;p&gt;As an astronomy student and hobbyist, light pollution has sort of become my
environmental issue of choice. Not only is it an annoyance to astronomers, but
also damaging to wildlife as well as our health and is a large energy sink. I
have taken particular notice of the amount of light pollution on my university&amp;rsquo;s
campus lately as I am back living on campus after 2 years of living elsewhere,
and my dissertation involves using the telescope on the roof of the physics
building. This is a university that seems to boast about being &lt;em&gt;green&lt;/em&gt; but seems
to ignore this aspect of the environment.&lt;/p&gt;
&lt;p&gt;All of the photos in this series were taken between 11pm and 2am, outside of
those times of the year when things stay open through the night (around exams
and big deadlines) and mostly away from the residential areas, so this should
show the darkest the university gets within term time.&lt;/p&gt;
&lt;p&gt;I have been in contact with a relevant member of staff about the situation and
they seemed to be very receptive to this and I am awaiting an update. My main
goal with this project is to raise some awareness for this issue while also
documenting what the campus looks like before it hopefully gets darker.
&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/VEbu5C"&gt;
	&lt;img src="https://farm5.staticflickr.com/4831/31900698007_e92b62e09e_b.jpg"
 alt="Campus Lights 1" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/gw5Rk5"&gt;
	&lt;img src="https://farm8.staticflickr.com/7886/31900698137_70fdc71352_b.jpg"
 alt="Campus Lights 2" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div class="diptych"&gt;
&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/c2341k"&gt;
	&lt;img src="https://farm8.staticflickr.com/7803/31900698147_2ae67c10fc_b.jpg"
 alt="Campus Lights 3" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/5RWCzN"&gt;
	&lt;img src="https://farm8.staticflickr.com/7898/31900698267_d1feb7d27c_b.jpg"
 alt="Campus Lights 4" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/A197YU"&gt;
	&lt;img src="https://farm5.staticflickr.com/4842/46116785244_8e91eec034_b.jpg"
 alt="Campus Lights 5" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/NZ7Ww9"&gt;
	&lt;img src="https://farm5.staticflickr.com/4870/46842025301_b3121043a5_b.jpg"
 alt="Campus Lights 6" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/DA3717"&gt;
	&lt;img src="https://farm8.staticflickr.com/7812/46116785624_d7506e0dd3_b.jpg"
 alt="Campus Lights 7" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/DB97ZX"&gt;
	&lt;img src="https://farm8.staticflickr.com/7898/46116785974_47aa11dd05_b.jpg"
 alt="Campus Lights 8" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/vi4b53"&gt;
	&lt;img src="https://farm8.staticflickr.com/7803/39876984053_68614575ed_b.jpg"
 alt="Campus Lights 9" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/bZ64e1"&gt;
	&lt;img src="https://farm8.staticflickr.com/7872/46116786284_8df3f80a80_b.jpg"
 alt="Campus Lights 10" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/QDjiXV"&gt;
	&lt;img src="https://farm8.staticflickr.com/7861/45927541825_ccc5f59cb9_b.jpg"
 alt="Campus Lights 11" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/nt38Cq"&gt;
	&lt;img src="https://farm8.staticflickr.com/7901/39876984473_580b50ddc2_b.jpg"
 alt="Campus Lights 12" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/499q0q"&gt;
	&lt;img src="https://farm5.staticflickr.com/4813/45927542275_0530682b0a_b.jpg"
 alt="Campus Lights 13" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/5z2T8F"&gt;
	&lt;img src="https://farm8.staticflickr.com/7910/39876985383_00cd00fd57_b.jpg"
 alt="Campus Lights 14" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/5665A7"&gt;
	&lt;img src="https://farm5.staticflickr.com/4818/45927543055_b11527b8e8_b.jpg"
 alt="Campus Lights 15" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;div class="diptych"&gt;
&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/9ZHoZ9"&gt;
	&lt;img src="https://farm8.staticflickr.com/7927/46842026631_7ffa0e3d3a_b.jpg"
 alt="Campus Lights 16" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/71zkik"&gt;
	&lt;img src="https://farm8.staticflickr.com/7857/45927543795_003ac6c862_b.jpg"
 alt="Campus Lights 17" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;/div&gt;
&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/3X7Q5o"&gt;
	&lt;img src="https://farm5.staticflickr.com/7871/46200161945_0f39d11c9e_b.jpg"
 alt="Campus Lights 18" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/1N90MY"&gt;
	&lt;img src="https://farm5.staticflickr.com/4867/46842027101_a67a68619a_b.jpg"
 alt="Campus Lights 19" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/G515HS"&gt;
	&lt;img src="https://farm8.staticflickr.com/7828/45927544575_cea9d3f515_b.jpg"
 alt="Campus Lights 20" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/kH186M"&gt;
	&lt;img src="https://farm5.staticflickr.com/4827/46116789514_b37174263f_b.jpg"
 alt="Campus Lights 21" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/yq2n75"&gt;
	&lt;img src="https://farm8.staticflickr.com/7911/46200162345_1835a7fcae_b.jpg"
 alt="Campus Lights 22" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/rmvZ7k"&gt;
	&lt;img src="https://farm8.staticflickr.com/7915/46842027631_4f9e8a89dc_b.jpg"
 alt="Campus Lights 23" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/gp/ss9679/1CJ40C"&gt;
	&lt;img src="https://farm5.staticflickr.com/4897/46116790304_58fc70356e_b.jpg"
 alt="Campus Lights 24" loading="lazy" /&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;This series was shot on my Hasselblad 500C/M with 150mm CF lens and Rollei CR200
film, developed by Palm Labs in Birmingham and scanned with my Epson 4180.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a name="ref1"
href="https://books.google.co.uk/books?id=dEEGtAtR1NcC&amp;lpg=PR5"&gt;Catherine Rich,
Travis Longcore. Ecological consequences of artifical night lighting. Island
Press 2006&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a name="ref2"
href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2627884/"&gt;Ron Chepesiuk.
Missing the dark: health effects of light pollution. Environ Health Perspect.
2009 Jan; 117(1): A20-A27&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Burmese Dogs</title><link>https://samsm.ch/burmese-dogs/</link><pubDate>Mon, 21 Jan 2019 00:00:00 +0000</pubDate><guid>https://samsm.ch/burmese-dogs/</guid><description>&lt;blockquote&gt;"The pariah curs were baying the moon - it was only a quarter full
and nearly down by midnight, but the dogs slept all day in the heat, and they
had begun their moon-choruses already" &lt;footer class="bq"&gt;- George Orwell&lt;/footer&gt;
&lt;/blockquote&gt;&lt;br&gt;
&lt;figure&gt;
	&lt;img src="https://samsm.ch/burmese-dogs/burmese-dogs-01.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;br&gt;
&lt;p&gt;It was on the first night of the 3 day trek from Kalaw to Inle Lake, in a small
hilltop village, at about 4 a.m when, as we discovered later in the morning, we
had all been awoken by the &lt;i&gt;moon-choruses&lt;/i&gt; of a group of dogs that must
have been larger than the human population of the town.&lt;/p&gt;
&lt;p&gt;This is a series of photos I took with my phone while travelling around Burma
during July 2018. I found the similarities between Burma as I visited it and how
George Orwell wrote about it to be quite interesting, especially with regards to
the dogs.&lt;/p&gt;
&lt;figure&gt;
	&lt;img src="burmese-dogs-02.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-03.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-04.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-05.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-06.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-07.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-08.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;div class="diptych"&gt;
&lt;figure&gt;
	&lt;img src="burmese-dogs-09.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-10.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;/div&gt;
&lt;figure&gt;
	&lt;img src="burmese-dogs-11.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;

&lt;figure&gt;
	&lt;img src="burmese-dogs-12.jpg" loading="lazy" /&gt; 
&lt;/figure&gt;</description></item><item><title>Photo Series: Singaporean Architecture</title><link>https://samsm.ch/singaporean-architecture/</link><pubDate>Sun, 02 Dec 2018 00:00:00 +0000</pubDate><guid>https://samsm.ch/singaporean-architecture/</guid><description>&lt;p&gt;In another attempt at post-shooting photo series creation, I have put together a
collection of architecture shots I took during my brief stay in Singapore in
June of 2018.&lt;/p&gt;



&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/8908/"&gt;
	&lt;img src="https://samsm.ch/photo/8908/8908.avif"
 title="Singaporean Architecture 01"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;

&lt;p&gt;


&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/9004/"&gt;
	&lt;img src="https://samsm.ch/photo/9004/9004.avif"
 title="Singaporean Architecture 02"
 alt="A small sections of a modern building, with lots of glass, some pillars and thin beams connecting them, black and white"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/9002/"&gt;
	&lt;img src="https://samsm.ch/photo/9002/9002.avif"
 title="Singaporean Architecture 03"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/9003/"&gt;
	&lt;img src="https://samsm.ch/photo/9003/9003.avif"
 title="Singaporean Architecture 04"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/9005/"&gt;
	&lt;img src="https://samsm.ch/photo/9005/9005.avif"
 title="Singaporean Architecture 05"
 alt="A footbridge between two sections of a large residential building, black and white"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/9009/"&gt;
	&lt;img src="https://samsm.ch/photo/9009/9009.avif"
 title="Singaporean Architecture 05"
 alt="Part of a large modernist building with many pillars, white panels and wide strips of windows angled downwards, in black and white"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/8912/"&gt;
	&lt;img src="https://samsm.ch/photo/8912/8912.avif"
 title="Singaporean Architecture 07"
 alt="TODO alt text"
		 height="999"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/8909/"&gt;
	&lt;img src="https://samsm.ch/photo/8909/8909.avif"
 title="Singaporean Architecture 08"
 alt="TODO alt text"
		 height="999"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;
	&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Portfolio II</title><link>https://samsm.ch/portfolio-ii/</link><pubDate>Sun, 25 Nov 2018 00:00:00 +0000</pubDate><guid>https://samsm.ch/portfolio-ii/</guid><description>&lt;p&gt;This set of images begins where the &lt;a href="https://samsm.ch/portfolio-i/"&gt;last portfolio&lt;/a&gt;
leaves off and primarily shows my travels during the summer of 2017, with the
last image being the only one outside of that. I have again chosen to stick to
black and white images taken with my Hasselblad for consistency, and because
it&amp;rsquo;s what I primarily use. I am planning on doing one of these with the colour
photos that I&amp;rsquo;ve taken since I started shooting square format.&lt;/p&gt;
&lt;p&gt;


&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/4707/"&gt;
	&lt;img src="https://samsm.ch/photo/4707/4707.avif"
 title="蒙自西路 West Mengzi Road"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;蒙自西路 West Mengzi Road&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/4807/"&gt;
	&lt;img src="https://samsm.ch/photo/4807/4807.avif"
 title="West Lake"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;West Lake&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/4811/"&gt;
	&lt;img src="https://samsm.ch/photo/4811/4811.avif"
 title="Great Wall"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Great Wall&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/5101/"&gt;
	&lt;img src="https://samsm.ch/photo/5101/5101.avif"
 title="Koishikawa Kōrakuen Garden"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Koishikawa Kōrakuen Garden&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/5104/"&gt;
	&lt;img src="https://samsm.ch/photo/5104/5104.avif"
 title="Tensouchi"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Tensouchi&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/5305/"&gt;
	&lt;img src="https://samsm.ch/photo/5305/5305.avif"
 title="Red Gum"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Red Gum&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/5802/"&gt;
	&lt;img src="https://samsm.ch/photo/5802/5802.avif"
 title="Tasman Island"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Tasman Island&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/5805/"&gt;
	&lt;img src="https://samsm.ch/photo/5805/5805.avif"
 title="Lake Gordon"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Lake Gordon&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/5906/"&gt;
	&lt;img src="https://samsm.ch/photo/5906/5906.avif"
 title="Adelaide Palm House"
 alt="TODO alt text"
		 height="999"
		 width="999" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Adelaide Palm House&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6002/"&gt;
	&lt;img src="https://samsm.ch/photo/6002/6002.avif"
 title="Escalators"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Escalators&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6007/"&gt;
	&lt;img src="https://samsm.ch/photo/6007/6007.avif"
 title="Ulsanbawi"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Ulsanbawi&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;




&lt;figure&gt;
	&lt;a href="https://samsm.ch/photo/6609/"&gt;
	&lt;img src="https://samsm.ch/photo/6609/6609.avif"
 title="Clifton Boulevard"
 alt="TODO alt text"
		 height="1000"
		 width="1000" loading="lazy" fetchpriority="auto" /&gt; 
 &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Clifton Boulevard&lt;/p&gt;
 &lt;/figcaption&gt;
	&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;All of these images were shot on Ilford HP5+, and all but the last one pushed to
ISO 800, which has become something of a default for me. Also, all &lt;a href="https://samsm.ch/portfolio-ii/#gordon"&gt;but
one&lt;/a&gt; of these images were shot with the 150mm lens, which I bought in
March of 2017 and also used for the last four images in &lt;a href="https://samsm.ch/portfolio-i"&gt;Portfolio
I&lt;/a&gt;. I seem to use both of the lenses I own for my Hasselblad (the
60mm and 150mm) pretty evenly but I find most of the images that I take that I
really like have been with the 150mm.&lt;/p&gt;</description></item><item><title>Qingdao Diptych</title><link>https://samsm.ch/qingdao-diptych/</link><pubDate>Wed, 21 Nov 2018 00:00:00 +0000</pubDate><guid>https://samsm.ch/qingdao-diptych/</guid><description>&lt;div class="diptych"&gt;
&lt;a href="https://www.flickr.com/photos/ss9679/44647184712/"
	title="Moon Over Qingdao"&gt;
&lt;img src="https://farm2.staticflickr.com/1866/44647184712_8eae88c304_b.jpg"
	alt="Moon Over Qingdao"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/photos/ss9679/44711556062/"
	title="Huiquan Cape"&gt;
&lt;img src="https://farm2.staticflickr.com/1886/44711556062_b55c427684_b.jpg"
	alt="Huiquan Cape"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;This is a pair of photos that I took from the top floor of a pagoda in
小鱼山公园 (Xiaoyushan park, or Little Fish Hill
Park) in Qingdao, China.&lt;/p&gt;</description></item><item><title>Portfolio I</title><link>https://samsm.ch/portfolio-i/</link><pubDate>Fri, 09 Nov 2018 00:00:00 +0000</pubDate><guid>https://samsm.ch/portfolio-i/</guid><description>&lt;p&gt;This series of photographs represents approximately a years worth of work,
starting in &lt;time&gt;April 2016&lt;/time&gt; when I got my Hasselblad. I chose to start
then not because I feel that the change of camera increased the quality of
images that I was producing but rather I wanted to keep the format consistent
throughout. Also it was about a year after I started shooting film, and when I
started pursuing photography as a hobby.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/26425484751/"&gt;
	&lt;img src="https://farm2.staticflickr.com/1481/26425484751_ca29dbd18a_b.jpg"
 alt="Under the Bridge" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Under the Bridge&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/27426121894/"&gt;
	&lt;img src="https://farm8.staticflickr.com/7437/27426121894_31706534e7_b.jpg"
 alt="Ruined House" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Ruined House&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/28282682892/"&gt;
	&lt;img src="https://farm8.staticflickr.com/7440/28282682892_a0b78a27d3_b.jpg"
 alt="Llyn Cau" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Llyn Cau&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/28298352473/"&gt;
	&lt;img src="https://farm9.staticflickr.com/8582/28298352473_71d687ae86_b.jpg"
 alt="Mauerpark Karaoke" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Mauerpark Karaoke&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/28529132240/"&gt;
	&lt;img src="https://farm9.staticflickr.com/8828/28529132240_c1b893424f_b.jpg"
 alt="Wetzsteinhorn" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Wetzsteinhorn&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/28385500243/"&gt;
	&lt;img src="https://farm9.staticflickr.com/8541/28385500243_a666f4bb79_b.jpg"
 alt="Matterhorn" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Matterhorn&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/33172757860/"&gt;
	&lt;img src="https://farm4.staticflickr.com/3943/33172757860_a93993b156_b.jpg"
 alt="Rocks" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Rocks&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/33547847840/"&gt;
	&lt;img src="https://farm4.staticflickr.com/3946/33547847840_0fc1620d68_b.jpg"
 alt="Wye" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Wye&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/33296099653/"&gt;
	&lt;img src="https://farm4.staticflickr.com/3928/33296099653_008b61b158_b.jpg"
 alt="Fire Exit" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Fire Exit&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/34058489572/"&gt;
	&lt;img src="https://farm3.staticflickr.com/2878/34058489572_ec53b3ed29_b.jpg"
 alt="Bickenhill Plantation" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Bickenhill Plantation&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/33441511774/"&gt;
	&lt;img src="https://farm5.staticflickr.com/4188/33441511774_e848155c88_b.jpg"
 alt="Nyhavn" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Nyhavn&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://www.flickr.com/photos/ss9679/34427864245/"&gt;
	&lt;img src="https://farm5.staticflickr.com/4156/34427864245_b419920446_b.jpg"
 alt="Tarn Hows Road" loading="lazy" /&gt; &lt;/a&gt;&lt;figcaption&gt;
 &lt;p&gt;Tarn Hows Road&lt;/p&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Between taking these photos at least a year and a half ago, compiling this
series 6 months ago and now, my opinion of these images doesn&amp;rsquo;t seem to have
changed too much. I think I can put this down to the memories I have attached to
these photos and the fact that I didn&amp;rsquo;t take a whole lot else that was any good.&lt;/p&gt;</description></item><item><title>Subways</title><link>https://samsm.ch/subways/</link><pubDate>Fri, 07 Sep 2018 00:00:00 +0000</pubDate><guid>https://samsm.ch/subways/</guid><description>&lt;p&gt;This is the remnants of a failed attempt at a photo project looking at
Birmingham&amp;rsquo;s pedestrian subways. I never really thought it was a very good idea
for a project but I decided to give it a go anyway because I wanted to try
shooting a project and it was the best idea that I had, also the subways are the
sort of thing that I usually like to shoot anyway.&lt;/p&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/772aw3" title="Subways 1"&gt;
&lt;img src="https://farm2.staticflickr.com/1875/44447904432_9f203051d9_b.jpg"
	alt="Subways 1"&gt;&lt;/a&gt;
&lt;p&gt;Everything in this series was shot with my Hasselblad 500C/M and Zeiss 60mm
Distagon CF with Ilford HP5+ rated at 800 and developed with Kodak HC-110 at a
dilution of 1+49 for 11 minutes. This is what I shoot most of the time anyway
but I thought that the pushed HP5+ would work well for the sort of gritty feel
of the subways. I shot 3 separate rolls of film on 3 different days in May of
2018. I have chosen 12 of the 23 pictures that I took that I feel fit the scope
of the project.&lt;/p&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/L370T7" title="Subways 2"&gt;
&lt;img src="https://farm2.staticflickr.com/1900/43780054014_f946c62a8e_b.jpg"
	alt="Subways 2"&gt;&lt;/a&gt;
&lt;p&gt;The intention behind the project was to capture the feeling of the subways,
which I think I was at least partially successful in doing. I think photos 2, 8
and 9 capture some of the dread and uncertainty I, at least used to, feel when
entering one of these. At some point when hunting these things down I began to
realise how quickly they were disappearing, a couple that I photographed were
fenced off and one that I visited had been totally filled in. I was then also
trying to document some of these before they were also demolished. The main
thing that I failed to capture was a human aspect of the subways, although I&amp;rsquo;m
not sure that photographing people walking through these areas or homeless
people sleeping in them would be more compelling than what I have.&lt;/p&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/uMop8f" title="Subways 3"&gt;
&lt;img src="https://farm2.staticflickr.com/1843/43780061104_aaa0c094b6_b.jpg"
	alt="Subways 3"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/191w4E" title="Subways 4"&gt;
&lt;img src="https://farm2.staticflickr.com/1848/43780020194_3e68ef687b_b.jpg"
	alt="Subways 4"&gt;&lt;/a&gt;
&lt;p&gt;I gave up on the project mostly just because I&amp;rsquo;d lost interest in it. I visited
almost all of the subways that I managed to find, some a few times, and despite
only shooting 23 images I was starting to feel like there wasn&amp;rsquo;t really any new
compositions left since they&amp;rsquo;re all quite visually similar.&lt;/p&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/K3TP8e" title="Subways 5"&gt;
&lt;img src="https://farm2.staticflickr.com/1891/43588235415_999865fd9d_b.jpg"
	alt="Subways 5"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/NoZ879" title="Subways 6"&gt;
&lt;img src="https://farm2.staticflickr.com/1871/43588240975_94a4292736_b.jpg"
	alt="Subways 6"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/3bT9Dm" title="Subways 7"&gt;
&lt;img src="https://farm2.staticflickr.com/1873/42688994970_a030807978_b.jpg"
	alt="Subways 7"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/y7jpR7" title="Subways 8"&gt;
&lt;img src="https://farm2.staticflickr.com/1841/44497949131_60c1abdc55_b.jpg"
	alt="Subways 8"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/799MBX" title="Subways 9"&gt;
&lt;img src="https://farm2.staticflickr.com/1859/44497941211_1f77629eb0_b.jpg"
	alt="Subways 9"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/tPtpMi" title="Subways 10"&gt;
&lt;img src="https://farm2.staticflickr.com/1891/42689049890_bd8d4fa4d9_b.jpg"
	alt="Subways 10"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/o0D6m5" title="Subways 11"&gt;
&lt;img src="https://farm2.staticflickr.com/1874/44497919131_15db9446f7_b.jpg"
	alt="Subways 11"&gt;&lt;/a&gt;
&lt;a href="https://www.flickr.com/gp/ss9679/Sy06u1" title="Subways 12"&gt;
&lt;img src="https://farm2.staticflickr.com/1876/29560354447_95e3690f70_b.jpg"
	alt="Subways 12"&gt;&lt;/a&gt;
&lt;/br&gt;
&lt;p&gt;See also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.flickr.com/photos/ss9679/sets/72157670945132397"&gt;Flickr album&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/AnalogCommunity/comments/9jdvur/subways_my_first_attempt_at_a_photography_project/"&gt;Reddit discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>