[{"content":"Every so often I check LinkedIn, I have colleagues, friends, and a few enemies on there I catch up with periodically. And EVERY time my brain seems to end up scrolling the LinkedIn feed and reading things, today I saw this post:\n(I am SO sorry if you\u0026rsquo;re reading this)\nOne of my employees asked for every Friday off this summer. Not PTO. Not sick days.\nJust\u0026hellip; Fridays. For 3 months.\nMy first instinct was to say no. We\u0026rsquo;re in the middle of our biggest AI launch. Fridays are ship days. Losing a full day every week for 3 months? I wasn\u0026rsquo;t sure we could absorb that.\nBut before I said no, I asked why.\nShe told me her dad was diagnosed in the spring. Not a lot of summers left. They always went fishing on Fridays when she was a kid.\nShe wasn\u0026rsquo;t asking for a break from work. She was asking to not miss these ones with her father.\nSo I said yes. We shifted her ship days. The team covered without blinking.\nHere\u0026rsquo;s what I didn\u0026rsquo;t expect:\nShe delivers every single thing on time She\u0026rsquo;s mentored two juniors better than she ever had She told me it\u0026rsquo;s the best summer of her life We\u0026rsquo;re only halfway through it.\nBut she already looks at this company differently. And I know she\u0026rsquo;ll never forget that we said yes when it mattered most.\nEngagement isn\u0026rsquo;t a survey score.\nIt\u0026rsquo;s what your people remember when they think about who had their back. Say yes more often. You rarely regret it.\n(WTAFWT) - What. The. Actual. Fuck. Was. That.\nWhy? Just Why? Why would anyone post this?\nI\u0026rsquo;m going to be a little reductive and say this post has two possibilities, it is (mostly) true or (mostly) false. Let\u0026rsquo;s think about what each possibility says about this kind of thing.\nIt\u0026rsquo;s (mostly) True How could someone, with a straight face, ask the employee who is going through the grief of losing a parent, that you were just patting yourself on the back about about being so empathetic to, \u0026ldquo;Hey Vicki, excuse me, can I post about how I was a really good person today, and about your father dying on LinkedIn? Yeah yeah, it\u0026rsquo;s for engagement.\u0026rdquo;\nOr WORSE, not asking?\nAnd assuming it is true. Why? Why LinkedIn? Is this not a private matter? Charity isn\u0026rsquo;t charity when it is public.\nIt\u0026rsquo;s (mostly) False A CEO of a company is lying, publicly, about something that did not happen, about an employee who does not exist, about a story that is fabricated, and about a person who is dying, to get people to feel like they are a good person. Why would someone tell the world that the only stories they have about being empathetic, and kind, are fabricated? I don\u0026rsquo;t understand why you\u0026rsquo;d want to inform the world you think lying is okay. Being a CEO should be a position where you exhume honesty.\nAnd.. If it is false, why? Presumably to build reputation, and obtain more money?\nYou can tell me I\u0026rsquo;m being facetious, that many many people do this, this is how you beat the algorithm and rise to the top. I just. I don\u0026rsquo;t care. This is weird. And gross. And people shouldn\u0026rsquo;t be rewarded for whatever the hell that weird story was. If I made a friend, and I learnt they posted on LinkedIn like this, I would quickly not hang out with this person.\n","permalink":"https://clicky.sh/posts/opinions/what-is-linked-in/","summary":"\u003cp\u003eEvery so often I check LinkedIn, I have colleagues, friends, and a few enemies on there I catch up with periodically. And EVERY time my brain seems to end up scrolling the LinkedIn feed and reading things, today I saw this post:\u003c/p\u003e\n\u003cp\u003e(I am SO sorry if you\u0026rsquo;re reading this)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOne of my employees asked for every Friday off this summer.\nNot PTO. Not sick days.\u003c/p\u003e\n\u003cp\u003eJust\u0026hellip; Fridays. For 3 months.\u003c/p\u003e","title":"What even is LinkedIn?"},{"content":" For full immersion, play the below track and replace \u0026ldquo;space\u0026rdquo; with \u0026ldquo;bus\u0026rdquo; https://open.spotify.com/album/7GGYdBte34n3jsPVcuRkXG?si=P0J55mOuTEyfCVh4o3WGlA\nToday I took the Bus Train. A Bus with attached rail wheels so it can travel along a track. The Bus Train was adopted around 2ish years ago after the old rail cars were de-commissioned due to being hard to repair. Before that (25 years-ish prior) there was a daily train that came from Vancouver. During COVID, no trains ran.\nThe Bus Train connects Seton Portage (a First Nations community) to Lillooet, a larger town. The alternative route is a Forest Service Road which takes longer and is more dangerous. The lake too is apparently not suitable for some kind of Bus Boat. Which is a shame because I want to ride that.\nAs I\u0026rsquo;ve never seen a Bus Train before i had endless questions. Seeing the vehicle go from grocery station to train track is absolutely marvellous, it\u0026rsquo;s so obvious I feel silly. It seems like an excellent tool for small communities around Canada.\nTravelling this beautiful route really impacted me. The driver informed me he had driven trains for over 50 years and had come out of retirement 2 or 3 times to continue this service. He\u0026rsquo;s trained 3 replacements over the years, all of whom have quit. CN doesn\u0026rsquo;t care, and actively wants to stop this route. The supply of food and transit of school children are relying on the backs of 2 people to run this service, of which if 1 quits (or dies), it will be over. But, born in Seton these are his people and they are heavily reliant on its operation. And so it goes, a 69 year old man fighting cancer and his 2nd drive this route, 364 days a year, Monday to Friday, 4 - 6 rides a day, from 7am -\u0026gt; 7pm.\nThis Bus Train driver may be one of the most inspiring and selfless people I\u0026rsquo;ve ever met.\nThe Bus Train certainly took me for a ride. But not the ride I expected.\n","permalink":"https://clicky.sh/posts/photography/bus-train/","summary":"\u003cblockquote\u003e\n\u003cp\u003eFor full immersion, play the below track and replace \u0026ldquo;space\u0026rdquo; with \u0026ldquo;bus\u0026rdquo;\n\u003ca href=\"https://open.spotify.com/album/7GGYdBte34n3jsPVcuRkXG?si=P0J55mOuTEyfCVh4o3WGlA\"\u003ehttps://open.spotify.com/album/7GGYdBte34n3jsPVcuRkXG?si=P0J55mOuTEyfCVh4o3WGlA\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg alt=\"Far Away\" loading=\"lazy\" src=\"/bus-train/faraway.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eToday I took the Bus Train. A Bus with attached rail wheels so it can travel along a track. The Bus Train was adopted around 2ish years ago after the old rail cars were de-commissioned due to being hard to repair. Before that (25 years-ish prior) there was a daily train that came from Vancouver. During COVID, no trains ran.\u003c/p\u003e","title":"Bus Train"},{"content":"I figured I\u0026rsquo;d take some time to jot what I think about AI. I\u0026rsquo;ve never formulated a cohesive opinion on it and this should help me whenever I have to discuss it or evaluate its part in a project. Let\u0026rsquo;s break this whole thing down. I will likely add more in time, but this is a good start for now.\nMy AI journey I started using CoPilot and ChatGPT very early when I first heard about them (2022-3ish) and realised they could be a very powerful programming tool. I initially found them to be like an extremely powerful autocomplete and very helpful for generating smaller chunks of code. Things I still consider them to be good at. I experimented with using ChatGPT to create a Dungeons and Dragons DM after my groups moved away. It couldn\u0026rsquo;t even come close. I used ChatGPT in a hackathon to communicate Grasshopper scripts to it ^[1], it did very well. This project has been continuously cited by various academic papers which has been quite exciting. Eventually I realised I might be leaning on AI more than I\u0026rsquo;d like and decided to stop using it as an experiment. I\u0026rsquo;ve still never shipped code AI generated that I haven\u0026rsquo;t read, and I\u0026rsquo;m glad in retrospect I at least had that pride in my work. I\u0026rsquo;ve largely stopped using AI for programming (occasionally using it for debugging). I\u0026rsquo;m at an impasse where I cannot decide on the correct point in a programmers career to hand them AI. As an Architect my first year I was told to never use CAD and only learn using pens and pencils to learn the importance and intent of every line. I think AI should be treated the same way, but I don\u0026rsquo;t know how many years or which concepts I should have mastered first.\nUPDATE : 16th May 2026\nI am now using Claude Code extensively and very much enjoying it doing lots of awful, boring grunt tasks and code research for me. Prototyping and iterating has become very quick and fun. I\u0026rsquo;m also using, and now creating, MCP Servers.\nUPDATE : 17th July 2026\nI am still using Claude Code, but the honeymoon period is wearing off and there\u0026rsquo;s something not quite right about it. Whilst I find Claude very useful for certain tasks, and do enjoy some of these, it does not spark joy. Writing code and developing applications I care about with it is absolutely joyless, and I\u0026rsquo;ve only just started to realise it. I\u0026rsquo;ve heard it said users don\u0026rsquo;t care if you vibe code, and I think this is largely true. I find making something good, something polished, crafted with love, is not possible (for me) without being in the weeds and doing this myself. I spent my day today iterating on menus. Just menus. I spent all day trying things, learning things, bashing my head against the wall and discovering things I did not know. The end result was something that a Callum from yesterday could not have achieved without this process. And as a lover of the journey, I can see what I have been missing whilst experimenting with AI. If not for the MCP work I have been doing, yesterday would have uninstalled all AI from my machine.\nUltimately my goal in this life is to seek and bring joy, this tool does not bring me joy.\nAI Revolution I\u0026rsquo;ve heard people compare AI to looms and the industrial revolution where we saw a huge shift from manual human labour to automated machines in factories. I don\u0026rsquo;t think this is a good comparison. I\u0026rsquo;m from Manchester originally, I\u0026rsquo;ve seen (and used) manual looms and I\u0026rsquo;ve seen automated looms, they\u0026rsquo;re an incredible thing to behold. But there\u0026rsquo;s something that seems to be ignored when comparing AI to other parts of human history. AI is not determinate. A loom is very much f(x) = y. A loom set to a given encoded program will produce the exact same pattern every time. LLMs are non-determinate ^[2], they do not produce the same output for the same input.\nI do think AI is likely to be a revolution, largely because of the gargantuan amount of human power and money that is being invested into pushing it along. Industries are clearly betting on this technology and there are areas that have found AI to be absolute game changer (e.g OCR, building renderings, girlfriends for losers, debugging programming, and other academic areas). That being said, I think LLMs are the start of this, not the end of this. They are WAY too unprofitable ^[3] to run at present.\nUPDATE : 16th May 2026\nIt seems this determinative thing does not really matter at all. I\u0026rsquo;m able to iterate and get claude to create me things I need. Even if it does a slightly different job each time, this feels negligible. That being said, I am not sure how long this will last, or if this is a good comparison, the loom had a very determinative ROI, whereas AI has so much proprietary dependence.\nWhat has spurred this update and change of page? In a word, Harnesses. The way Claude Code functions is absolutely excellent. I now use it every day and enjoy doing so. I read a long time ago that the winner of the AI Revolution will be the one who makes the best box to put AI in. I think they are right.\nUPDATE 17th July 2026\nAfter using Claude in the area it feels like it was designed for and has the most training for. I have to say that it is untrustworthy and and the solutions it comes up with are uninspiring and very often not good. It lies to me constantly and then admits it after the fact. I have found that when I want to do something I care about, this quickly becomes unacceptable.\nEthical Concerns It\u0026rsquo;s of course worth noting that AI data centers in the US are built unethically and degrade the communities around them. Consuming ungodly amounts of electricity and wasting ungodly amounts of water. I wonder how many tokens is equivalent to a mile of air flight for energy used?\nMy next concern is for artistry. Image generation is trained on stolen work, text is trained on stolen stories, all of which was created by talented people who have as yet never been compensated for this.\nIf I create and expect to be compensated for my creations, how can I use AI un-hypocritically?\nTrust The longer I code, and the more I try to write programs to last forever, the more I evaluate and consider the trustworthiness before incorporating a technology, tool, library or language into my stack. Is it open source? Can I understand its code? What dependencies does it have?\nI don\u0026rsquo;t trust OpenAI, I don\u0026rsquo;t trust Microsoft, I don\u0026rsquo;t trust X/Grok, I don\u0026rsquo;t trust Claude, and I don\u0026rsquo;t trust any for-profit (AI) company. They are unprofitable, and if they can make it past the ponzi scheme phase into profitability, that will, as usual, become their only concern. The AIs will start cramming adverts in, running at lower, dumber levels, and prices will be raised until morale improves amongst the shareholders.\nSo any company offering AI I can\u0026rsquo;t trust that it\u0026rsquo;ll be around in a year, two years, that the price will be reasonable or even how it works.\nLocal models largely resolve this problem. I could download a model from huggingface with some python code and stuff it onto a Raspberry pi that I never connect to the internet ever again.\nResponsibility ADDED : 4th June 2026\nI vibe-coded a small project in typescript to automate tasks locally with some llm-y-ness inside it. I have not seen any of the code, and I\u0026rsquo;m quite astounded how well the first version worked. After some more hours of asking for improvements etc I went for a walk and asked claude to whirr for an hour and just improve things. It did a fantastic job.\nWhy would anyone ever hire a programmer again? Why involve humans at all? Why pay for a service?\nI think ultimately where the rubber hits the tarmac is human to human responsibility and trust. If a service is worth paying for, let\u0026rsquo;s use Figma as an example. Figma is worth paying for because it handles all of the connectivity and hosting. Even if they 100% vibe code it, as a consumer of the app you expect it to work, and if it doesn\u0026rsquo;t you\u0026rsquo;ll stop using it and sales drop as a result.\nIf a human receives your service, they expect it to work, and if it doesn\u0026rsquo;t, the seller is held responsible, either by losing a customer + money, or violating an SLA or agreement the two parties have together. (This only gets more and more important when you\u0026rsquo;re dealing with sensitive data etc). In which case, someone at canva, who again, may 100% vibe code this has to be willing to take responsibility when the axe falls (e.g job loss). And the only way I\u0026rsquo;d be willing to take that responsibility is if I understood the code.\nADDENDUM : 17th July 2026 I think too that basing your business on something that could drastically change price, lie, fail is irresponsible, that said, capitalism is system that promotes responsibility, so maybe more unregulated countries will see many business that do. I think that if countries want to promote human skill, then increasing the severity and ease of punishment for things like user data leaks and SLA contract downtime would ensure companies have a human they can trust managing those parts of the business.\nConsciousness Imagine you are in a burning building. In front of you are two things. A cat, and ChatGPT on a thumb drive, the destruction of which will mean ChatGPT is gone and can never be restored. In effect it will \u0026ldquo;die\u0026rdquo;.\nWhich do you chose?\nIf your answer is not the cat, then I think you\u0026rsquo;re using your consciousness unconsciously. You\u0026rsquo;d save the cat, a living creature, with thoughts, memories, dreams and the ability to love. Nothing is worth more than that.\nLLM AIs are emulating these things, they are not doing these things, they cannot surprise us, upset us and then make amends, or ever care about us.\n^[1] https://github.com/enmerk4r/GHPT/\n^[2] https://152334h.github.io/blog/non-determinism-in-gpt-4/\nNOTE : It does seem that there are and in theory LLMs could be run more deterministically because they are a function, just with a billion parameters. To expand on this point, if I change a small thing in my code, the output will also change slightly. If I change a prompt slightly, the output could change quite drastically. I think this is an important difference when comparing a loom and AI.\n^[3] https://archive.ph/MRdRN\nQUOTE : Cursor estimated last year that a $200-per-month Claude Code subscription could use up to $2,000 in compute, suggesting significant subsidization by Anthropic. Today, that subsidization appears to be even more aggressive, with that $200 plan able to consume about $5,000 in compute, according to a different person who has seen analyses on the company’s compute spend patterns.\n","permalink":"https://clicky.sh/posts/thoughts/ai/","summary":"\u003cp\u003eI figured I\u0026rsquo;d take some time to jot what I think about AI. I\u0026rsquo;ve never formulated a cohesive opinion on it and this should help me whenever I have to discuss it or evaluate its part in a project. Let\u0026rsquo;s break this whole thing down. I will likely add more in time, but this is a good start for now.\u003c/p\u003e\n\u003ch2 id=\"my-ai-journey\"\u003eMy AI journey\u003c/h2\u003e\n\u003cp\u003eI started using CoPilot and ChatGPT very early when I first heard about them (2022-3ish) and realised they could be a very powerful programming tool. I initially found them to be like an extremely powerful autocomplete and very helpful for generating smaller chunks of code. Things I still consider them to be good at. I experimented with using ChatGPT to create a Dungeons and Dragons DM after my groups moved away. It couldn\u0026rsquo;t even come close. I used ChatGPT in a hackathon to communicate Grasshopper scripts to it ^[1], it did very well. This project has been continuously cited by various academic papers which has been quite exciting. Eventually I realised I might be leaning on AI more than I\u0026rsquo;d like and decided to stop using it as an experiment. I\u0026rsquo;ve still never shipped code AI generated that I haven\u0026rsquo;t read, and I\u0026rsquo;m glad in retrospect I at least had that pride in my work. \u003cdel\u003eI\u0026rsquo;ve largely stopped using AI for programming (occasionally using it for debugging)\u003c/del\u003e. I\u0026rsquo;m at an impasse where I cannot decide on the correct point in a programmers career to hand them AI. As an Architect my first year I was told to never use CAD and only learn using pens and pencils to learn the importance and intent of every line. I think AI should be treated the same way, but I don\u0026rsquo;t know how many years or which concepts I should have mastered first.\u003c/p\u003e","title":"What I think of AI"},{"content":" ","permalink":"https://clicky.sh/posts/photography/from-the-plane/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/from-the-plane/plane-trail.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/aerial-clouds.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/aerial-view.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/another-boat.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/boat-i-think.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/cloud-6-shadows.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/cloud-7-mountains.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/clouds-1.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/clouds-2.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/clouds-3.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/clouds-4.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/clouds-5.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/clouds-8-gap.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/clouds-9.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/gap-in-clouds.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/golden-plane.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/horizon.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/lonely-plane.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/oil-rig-i-think.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/shore-clouds.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/shore.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/single-plane.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/wind-turbines.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/from-the-plane/window.jpg\"\u003e\u003c/p\u003e","title":"Fom the Plane"},{"content":"In British Columbia you can just buy a school bus and drive it, on a regular driving license provided you take the seats out and the signs down. It doesn\u0026rsquo;t matter that it weighs 8 tonnes, it doesn\u0026rsquo;t matter than it is basically a steel tank, it doesn\u0026rsquo;t matter that your last car was a smart car, you\u0026rsquo;re free to drive the length and breadth of one of the largest counties on earth.\nEvery day I drive it is a fun day, and everywhere I stay is a new place full of new adventures. It almost feels like too much fun and I keep thinking someone will stop me and tell me it is illegal to have so much fun.\nIt is undoubtedly the stupidest thing I\u0026rsquo;ve ever done, abandoning the stability and predictability of living in an apartment.\nBut then again, you can\u0026rsquo;t beat these views.\nEvery morning the sun wakes me up\nI go for a swim in the lake\nI look at the mountains\nI write a little code\nI look at the stars if the conditions are right\nThen I go to sleep. And I would like to do this every day I can until I can no longer do these things.\nOther things I do\nConverted buses are rare. I have seen a few, but not a lot.\nSometimes I worry I\u0026rsquo;ll get stuck. Then I remember this is fucking bus with a big commerical engine and it does not care.\nI swam in this river one morning and felt quite free ~\nIt blows my mind there are campsites like this that are free for 2 weeks. I cackle myself to sleep every night at these. Take that landhoards.\nThe sunset always lets me know when bed time is approaching. Which means time to read a book :)\nRoof solar panels are awesome. The whole bus is powered by solar and I find that immensely gratifying. I have a little app where I can obsess over the Solar in and various power draws. Once my solar panels hit 110% efficiency, they can actually do that.\nMisc FAQs How do you cook? Deal with food? Like regular people, but using camping equipment. It\u0026rsquo;s much more flexible than having a fixed cooking stove. Most of the food in the fridge is vegetarian/vegan, I\u0026rsquo;m not strict about any particular diet I just like the taste of tofu and these kinds of foods last for months which is really useful if I intend to stay somewhere for a long time. I cannot express how much I do not want to endure food poisoning in the woods. The bus has a nice sized fridge and a small freezer. It doesn\u0026rsquo;t take a lot of power (varies with the weather) but it is the most consistent power draw which takes most of the batteries because it runs on and off, an average I think of 12 hrs a day (again, depending on the weather).\nDelicious soup!\nTofu eggs, rice and veg\nPancakes! A rare but enjoyable treat.\nCleanliness The bus has a composting toilet which works very well, but if there are other toilets available I use those for obvious reasons.\nThe bus has a shower which works OK. But it uses a lot of water so it\u0026rsquo;s only used now and then. Some campsites have showers, which are a welcome treat. Mostly I swim in lakes. I don\u0026rsquo;t take body wash into them I just use a little afterwards. I find this works a lot better than I would have expected. This is likely because I cannot grow hair, so, YMMV. For those with hair, washing in the sink works quite well. Covering your head with water is extremely refreshing and not having it makes me quite miserable, lakes are the best for this, even if a bit chilly, but I have plenty of insulation so I don\u0026rsquo;t mind.\nPower, heat etc. The internal electrics run on 2x 3600 kwh lithium batteries connected to an array of 4 solar panels. This is largely sufficient for most of the year. I have 2x 400W portable panels which are really good for VERY hot days when the bus needs to be in the shade.\nThe bus works like a greenhouse, it heats up very well and gets cold very well. Realistically the temperature inside is the same as the outside. Certainly at night. At night a big duvet and blankets regulate the temperature, that works even at -4C ish.\nWhen it gets cold enough that heaters are required I go stay at RV campgrounds that offer power. It\u0026rsquo;s not too expensive and means that I can stay comfy and warm. I use a little electric heater and have an AC/Heater unit which is very good at keeping too much moisture out of the air and keeping the bus toasty. There is also a diesel heater but I haven\u0026rsquo;t got that working as well or as clean as I\u0026rsquo;d like.\nI do think that if I was going to brave more months of the year in the bus I\u0026rsquo;d work on better insulation, fix up the diesel heater and get more solar panels and I\u0026rsquo;d be just fine. But I\u0026rsquo;m not going to do that so I\u0026rsquo;ve no real need.\nWhere do you stay? How do you pick a route? I just head in A direction and see how that goes, often it might be towards where a friend lives and I\u0026rsquo;ll leisurely make my way there. At some point I got used to having no schedule and nowhere to be which is quite freeing. You can\u0026rsquo;t be a control freak about this kind of stuff, you have to relinquish total control and just see what happens. That being said, Overlander is my best friend when finding places, and does allow for some planning. I gladly pay the optional yearly subscription because of how much they\u0026rsquo;ve saved me and stress. I also make sure to add places and check-in for others.\nUsually I\u0026rsquo;ll create a map of all the places on the route I\u0026rsquo;m going and check out the top of my list and if that falls through, try option 2, 3, etc. I don\u0026rsquo;t think I\u0026rsquo;ve ever gotten past option 2, and even that\u0026rsquo;s rare. Rest stops are usually meh, (there\u0026rsquo;s usually not much to do) but very dependable and the backbone of some longer trips. Casinos are very convenient, all of them will let you stay 1 night in their car park, they ask no money and there\u0026rsquo;s no check-in or out times which for 1 night is perfect. They also have toilets which if not 24/7 will likely be 18/7, a coffee shop and restaurant which are often OK and fairly cheap (subsidised by gambled pensions). I\u0026rsquo;ll often pick them over a campsite for a one night stop just due to convenience. For your first visit all of them will also give you about $10-$20 of \u0026ldquo;have fun\u0026rdquo; money. I always take this, gamble it and you\u0026rsquo;re likely to win something back which I spend on lunch. I don\u0026rsquo;t gamble otherwise, not my thing.\nNo one has ever asked me to move or told me I can\u0026rsquo;t park somewhere when I was going to stay overnight. Someone once informed me I couldn\u0026rsquo;t park in a particular spot, I asked what will happen if I do, and they told me I\u0026rsquo;d get towed. I informed them that a tow truck for an 8 tonne bus takes a minimum of 3 hours to arrive so I can park anywhere for at least 2 hours. Surprisingly enough to me, most people find the converted bus very cool, and I think enjoyable rebellious, so most people are very accommodating, excited to ask about it, and even more excited to come aboard and look around.\nFuel I get lots of questions about fuel, as if the bus is a space ship.\nIt takes Diesel, the fuel cap specifies unleaded which concerns me because I feel like that goes without saying?\nThe tank is 240L.\nI don\u0026rsquo;t know exactly how fuel efficient it is because the fuel gauge is free spirited. I think it\u0026rsquo;s between 1000km and 1200km per tank.\nFilling the tank costs ~ $400, So it\u0026rsquo;s roughly 40c p/km, maybe a bit less honestly, depends on fuel prices.\nI don\u0026rsquo;t spend that much in fuel, for the last trip, which was 5ish months I think I spent about $1400 on fuel total, so 3.5 tanks. Considering I spent $2k p/m on Rent, I think that\u0026rsquo;s a bargain. I can also if I wish to, drive less and spend less which I think is very different than Rent which I can\u0026rsquo;t easily alter the cost of by changing my lifestyle.\nDid you come here in the bus? No, How? We\u0026rsquo;re in Denmark (or wherever you\u0026rsquo;re asking this), what kind of sway do you think I have with container ships or NASA?\nI get asked this in the most crazy of places. It\u0026rsquo;s an American school bus, it can only exist (without the involvement of major complications, costs, large bribes, lawyers and city planners) on the North American plate.\nHow did you buy it? Where from? Some bloke, it cost $18,000, was built in 2009 and had around 100,000 km on it. I was told the engine light only came on as it hadn\u0026rsquo;t been driven in a while. What a gullible chump. I\u0026rsquo;ve since spent maybe $10k in various repairs and improvements since I\u0026rsquo;ve owned it (for about 5 years, travelling for 2). You can actually buy them from schools, which is where this one came from (go figure).\nWas it pre-converted? Nope. I did everything. Largely because most options out there were half baked, done badly, or done VERY well and far exceeded my budget. To be fair even if I had the money I wouldn\u0026rsquo;t buy pre-built. Building it is very satisfying. If you live in it full time, you\u0026rsquo;re going to be fixing it and if it\u0026rsquo;s your un-handiwork you know how to fix it which is very helpful. Definitely worth keeping spare bits around, fuses, screws, straps, tools etc.\nWow you must be handy! Nope. Nothing is straight, and I am a terrible plumber and it is not instagram-worthy. It does however work and I love my bus and my space. I will give credit to myself for the electrics, that stuff has worked without issue.\nI do recall a friend coming to see me as I was working on the tiling and cutting it with a saw. He asked why I was using it without water. And pointed to the box where it said on the box \u0026ldquo;WET TILE SAW\u0026rdquo;. I thought that meant it was for wet tiles like a bathroom. Anyway after adding water it was MUCH easier. So yeah. Not so handy. Stubborn to a fault though which helps finish things.\nThat being said, I did take a welding course so I could weld the seats. I was quite proud of that. Welding is neato, my welds are very amateur but supposedly that doesn\u0026rsquo;t matter too much.\nI spent probably $3000 to $4000 building the interior (sans electrics which were roughly $10k). All of the wood I got free (as offcuts) from my previous job. Insulation and flooring was donated by a good friend, lots of bits and bobs were thrifted. So all I really paid for was the sink, fridge, screws and some tools.\nI will say if you ever plan to do this, having it be at your house would be infinitely easier, I did this near my house until I was told to move it, (quietly) at a U-Haul place until I had better options. I also stored all of the wood inside the bus as it was free and I needed it dry which was a huge pain in the arse.\nShould I do this? I would advise trying it first if you can before you commit. The first month low key sucks, but you\u0026rsquo;re learning to live in a completely different way which is frustrating. After that it\u0026rsquo;s glorious.\nBuild Pics How I bought the bus, most of the seats were already taken out, which made insurance less complex. \u0026gt; 8 seats is a bus which means I can\u0026rsquo;t legally drive it, FUN FACT.\nI was pleasantly surprised to find the floor was not 100% rust. I cleaned it all up then painted it in some VERY expensive chemical that I think will outlast the bus and the human race, it had 5 different chemical warnings on it.\nI laid down some Damp proof membrane, insulation over top, a little wooden frame on the walls and floor and topped it off with some plywood. Did with a few friends too which was fun. The bed was mostly pieces of an IKEA bed I found free on Facebook Marketplace. I recall the man chuckling over a coffee as he watched me load this double bunk bed thing into a smart car. Jokes on him, it fit perfectly, and it was much too late to be drinking coffee, bet he slept like shit.\nShower! Agh! The first thing that felt like I was making a little house. It took 3 attempts until the hole I drilled in the floor didn\u0026rsquo;t hit an I beam of some kind.\nWoodworking is very satisfying, even if you\u0026rsquo;re crap at it.\nBad plumbing, this leaked a lot, but I did fix it.\nAn actually not bad tile job. In retrospect, why did I pick hexagonal tiles for my first tile job, what was I thinking? That being said, I was so proud of this.\nMe welding one of my little seats. Got both done in about 4 hours which was pretty swish I thought. Then they got painted and installed. FUN FACT - BC doesn\u0026rsquo;t seem to have seating regulations and whoever inspected the bus looked at them and said \u0026ldquo;looks fine\u0026rdquo; and legally I have 4 seats with seatbelts now. Wild.\nFridge has a little casing. Note the perforated wall, it\u0026rsquo;s so the wool insulation can breathe.\nSEATS! YEEAHHS Seats.\nFinished shower. So proud I included 2 pics.\nThe bus mostly done, painted etc.\n","permalink":"https://clicky.sh/posts/thoughts/i-live-in-a-bus/","summary":"\u003cp\u003eIn British Columbia you can just buy a school bus and drive it, on a regular driving license provided you take the seats out and the signs down. It doesn\u0026rsquo;t matter that it weighs 8 tonnes, it doesn\u0026rsquo;t matter than it is basically a steel tank, it doesn\u0026rsquo;t matter that your last car was a smart car, you\u0026rsquo;re free to drive the length and breadth of one of the largest counties on earth.\u003c/p\u003e","title":"I live in a bus"},{"content":"Article Link : https://chaoticgood.management/how-to-be-a-leader-when-the-vibes-are-off/\nOverall I agree with the majority of the start of this article and I think it\u0026rsquo;s likely the author and I have worked at very different tech companies, but at a certain point I just saw our opinions diverge and I wanted to jot this down as it got my brain spinning. If you want to have a clue what is going on, read the article first.\nMy standard advice to anyone with a management role and anyone at the Staff+ level of individual contributor is that “wearing the company hat” should be the default.\nFuck that! If you lead a team then they are your number one responsibility. When bullshit rains down from on top you should be there holding an umbrella above the team so they can keep doing what they do best. After that, you go to the source of the bullshit and tell them it\u0026rsquo;s bullshit and why, then figure out how to best resolve this.\nWhen whatever is going on is all over, layoffs, merger, policy change, you\u0026rsquo;ll still know your team and be on good terms with them. You can always move jobs, and likely, your team may want to join you, possibly even many years down the road. those colleagues and friends will know you stuck to your principles and the drive to make something awesome with awesome people. If you side with the company and the company fires you, or tanks, you\u0026rsquo;re left standing on your own in a pile of rubble and tears.\ncontradicting the bosses in a broad forum can kill the credibility you have the leadership across the wider team\nIf credibility is funded from parroting with whatever people above you say, regardless of how much you agree with it, then I think you\u0026rsquo;re building that credibility in a swamp. If you\u0026rsquo;re unable to vocally disagree with management, then management will never understand why a policy, idea or initiative is a bad idea for a group or everyone.\nIt’s also a good way to get yourself fired.\nAnd if you get fired for doing the right thing, then you did the right thing.\nLet them know you’re still on their side\n100% agree. This should never be in question by the team, but reassuring them is always a good move. A good manager doesn\u0026rsquo;t need to tell their team to stand behind them, they will naturally stand behind your leadership.\nThe right thing to do in this situation is to acknowledge that you see the situation the same way they do, but do it privately, within your immediate team only or in 1-1s.\nI half agree. You should tell the entire team so that everyone knows what everyone else knows. Not 1 on 1s. When the team can share a truth together, they can move together without friction or politics. Your team should know that you\u0026rsquo;re in the same seat as them and have their best interests at heart. The best way to achieve this is honesty.\nIn public, you have to support the policies, but when you’re in private with your manager and your peers, that’s the time you can safely push for change.\nSaying one thing in one circle and another thing in a different circle feels spineless to me. A game of playing politics that could very easily end up with you in a scenario where you\u0026rsquo;re questions about two conflicting opinions. Take a stance, and keep it consistent.\n","permalink":"https://clicky.sh/posts/thoughts/vibes-are-off/","summary":"\u003cp\u003eArticle Link : \u003ca href=\"https://chaoticgood.management/how-to-be-a-leader-when-the-vibes-are-off/\"\u003ehttps://chaoticgood.management/how-to-be-a-leader-when-the-vibes-are-off/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eOverall I agree with the majority of the start of this article and I think it\u0026rsquo;s likely the author and I have worked at very different tech companies, but at a certain point I just saw our opinions diverge and I wanted to jot this down as it got my brain spinning. If you want to have a clue what is going on, read the article first.\u003c/p\u003e","title":"The Vibes are Off"},{"content":"Yesterday I learnt my bus had no brakes. I learnt this on the 97 highway north after noticing a leak at a grocery store and booking in an appointment to get it looked at. I had told them I think it might be leaking brake fluid. After arriving safely (thank gosh) and learning first hand why buildings have concrete blocks in front of parking spaces, I headed inside to confirm I had indeed been leaking brake fluid, and my brakes no longer worked, although luckily the leak had stopped for some reason.\nIt could have been much worse. I could have found this out whilst driving down a steep forest road, hours from anywhere. 5 minutes away is about as good as I could hope for.\nI think my older self would have been quite annoyed about the situation, the cost, the inconvenience and general faff. But lately I\u0026rsquo;ve been contextualising my problems in a different context.\nIf I want something, I have to be okay with associated problems.\nIf the bus breaks down, that is part of living in a bus, it\u0026rsquo;s bound to happen eventually. And if my problem stems from having something I want, then it\u0026rsquo;s not a problem. And respectfully, I should up the shut fuck and stop whinging. This isn\u0026rsquo;t to disparage problems, it\u0026rsquo;s just putting into context what that problem stems from. When I view my current situation through this lens many of my \u0026ldquo;problems\u0026rdquo; become not a problem. I\u0026rsquo;m stop being annoyed, I wander about my day happily and if anything, I can be thankful I have the bus at all.\nSmall Caveat I\u0026rsquo;d still be annoyed if I fell off of the bus roof, or got crashed into, but I wouldn\u0026rsquo;t consider that an associated or inevitable scenario. Likewise if I feel pressured and stressed due to my job, that\u0026rsquo;s a real issue that I should take seriously and mitigate.\n","permalink":"https://clicky.sh/posts/thoughts/gratefulness/","summary":"\u003cp\u003eYesterday I learnt my bus had no brakes. I learnt this on the 97 highway north after noticing a leak at a grocery store and booking in an appointment to get it looked at. I had told them I think it might be leaking brake fluid. After arriving safely (thank gosh) and learning first hand why buildings have concrete blocks in front of parking spaces, I headed inside to confirm I had indeed been leaking brake fluid, and my brakes no longer worked, although luckily the leak had stopped for some reason.\u003c/p\u003e","title":"Gratefulness"},{"content":"You take photos? Where do you put them? Where is the Bus now? Which country are you in?\nI\u0026rsquo;m asked regularly where I am, what I\u0026rsquo;m up to. How glorious, to have friends who care.\nI want to use social media, I want to document, log, blog, vlog and express the now creatively for friends and family. But I just can\u0026rsquo;t make myself care about Social Media. I can\u0026rsquo;t make myself post on Instagram regularly. I know browsing it ends up with doomscrolling in Reels, every swipe closer to death.\nI tried bluesky, and it\u0026rsquo;s lovely! But no one I know uses it, so I use it the same way I use HackerNews or reading the news mostly. It\u0026rsquo;s not a social media for me, it\u0026rsquo;s just media.\nI started a journal and I love it, it\u0026rsquo;s paper, freeform and I can just dump whatever I\u0026rsquo;m feeling. I see a nice cat? I can paint it, sketch it, describe it, write a little poem about a handsome cat and it doesn\u0026rsquo;t matter if it\u0026rsquo;s shit. There\u0026rsquo;s no judgement, no follower count, likes, dislikes FOMO. It\u0026rsquo;s perfect.. Except\u0026hellip; I have to be in person to show it, and that\u0026rsquo;s not great when I live far away from many friends and family.\nSo I started a little website. It\u0026rsquo;s all markdown based, which I love! It\u0026rsquo;s in Git, which I\u0026rsquo;m already using! I can post things about the past, migrating content from other sites. I can change the theme, I can make it easy to read, I can do ANYTHING. And there\u0026rsquo;s no likes, dislikes, FOMO, no content subscriber agreement, moderation, content takedown etc etc etc. And the cost? It\u0026rsquo;s hosted by Github so that\u0026rsquo;s free. I pay $80 a year for the domain? That\u0026rsquo;s fine by me.\nOh. And no adverts. I fucking hate adverts.\nSo I say to you, the little internet frog visiting my cottage in the woods. Are you really using social media, or is it using you? I implore you, IGNORE your instagram, forget Facebook, throw your Twitter. Create your own nice little internet cottage in a forest, and invite friends around for tea.\n","permalink":"https://clicky.sh/posts/thoughts/go-nomad/","summary":"\u003cp\u003eYou take photos? Where do you put them? Where is the Bus now? Which country are you in?\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m asked regularly where I am, what I\u0026rsquo;m up to. How glorious, to have friends who care.\u003c/p\u003e\n\u003cp\u003eI want to use social media, I want to document, log, blog, vlog and express the now creatively for friends and family. But I just can\u0026rsquo;t make myself care about Social Media. I can\u0026rsquo;t make myself post on Instagram regularly. I know browsing it ends up with doomscrolling in Reels, every swipe closer to death.\u003c/p\u003e","title":"Be an internet Nomad"},{"content":" ","permalink":"https://clicky.sh/posts/photography/jasper/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831144646.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250829155104.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831105953.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831125031.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831125745.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831150048.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831184052.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831184923.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831223516.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831224026.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250831225110.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250901171949.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250901172040.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250903120052.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250903140715.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250903154651.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250903154936.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/jasper/IMG20250903155859.jpg\"\u003e \u003cvideo controls src=\"../../../static/jasper/VID20250830134655.mp4\" tivideo\u003e\u003c/p\u003e","title":"Around Jasper"},{"content":"\n","permalink":"https://clicky.sh/posts/photography/haida-gwaii/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250801123927.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250802150344.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250802164106.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250806071127.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250806161031.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250807173813.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250807183917.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/haida-gwaii/IMG20250808062224.jpg\"\u003e\u003c/p\u003e","title":"Haida Gwaii"},{"content":" ","permalink":"https://clicky.sh/posts/photography/abandoned-mill/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728110139.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728110119.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728110309.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728110321.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728110512.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728110630.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728110753.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728111252.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728111358.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728133412.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/abandoned-mill/IMG20250728133636.jpg\"\u003e\u003c/p\u003e","title":"Abandoned Mill"},{"content":"A few photos from my favourite little camera.\n","permalink":"https://clicky.sh/posts/photography/hasselblad/","summary":"\u003cp\u003eA few photos from my favourite little camera.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-6.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-1.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-2.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-3.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-4.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-5.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-7.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-8.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-9.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-10.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/hasselblad/hasselblad-11.jpg\"\u003e\u003c/p\u003e","title":"Hasselblad"},{"content":" ","permalink":"https://clicky.sh/posts/photography/serbian-hospital/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317110153.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317110315.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111215.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111430.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111603.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111716.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111734.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111755.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111829.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317111843.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317114206.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/serbia-hospital/IMG20250317114701.jpg\"\u003e\u003c/p\u003e","title":"Serbian Hospital"},{"content":"If you\u0026rsquo;re reading this article, I\u0026rsquo;m going to assume you have a basic understanding of combinatorial and parametrising NUnit tests and now you are pushing up to the limits of this system.\nFor reference, let\u0026rsquo;s examine a simple Combinatorial Test.\n[Test, Combinatorial] public void MyTest( [Values(1, 2, 3)] int x, [Values(\u0026#34;A\u0026#34;, \u0026#34;B\u0026#34;)] string s) { // ... } As the parameters must be entered into an attribute, we are limited to constant values, ints, doubles, strings, enums etc.\nBut what if our tests need to be more complex than that? If we need to compare mutable objects? Maybe we have a collection of \u0026ldquo;good\u0026rdquo; elements and \u0026ldquo;bad\u0026rdquo; elements we want a set of tests to cycle through. Writing an SVG Editor I have a collection of good SVGs that I know must be valid, and a set of bad SVGs that have bad data and will/should fail gracefully. Every time a user posts an issue about my editor and their svg, I verify the SVG and if it passes the sniff test, add the SVG to the good pile and re-run all of my tests against it.\nSo how can I maintain a comprehensive set of tests against this set of mutable objects?\nMy first attempt, indices [Values(1, 2, 3)] int index By using indices, which are constant, we can index into a list maintained elsewhere. Immediately however, I realised this has a few problems.\nIt\u0026rsquo;s not readable, when a new person looks at this test, what does this index mean? The intent is obscured, the index relates to a list only mentioned inside the test, likely confusing Indices and the list must be maintained separately which WILL fail, if we add too many indices, the failure will be obvious, but if we don\u0026rsquo;t add new ones when we get a new test case, the tests will secretly not test that scenario which is a nightmare My next idea, funcs [Values(Element1, Element2, Element3)] Func\u0026lt;MyElement\u0026gt; element This allows us to point at functions that return an element we need, but again, we run up against problems.\nIt\u0026rsquo;s hard to maintain, we\u0026rsquo;ll need to create a function for EVERY element, and if we have lots, this is going to get messy. Again as before with the lists, how do we maintain our good element set against this? Also, unfortunately, these don\u0026rsquo;t count as consts. So they wouldn\u0026rsquo;t work anyway. Sigh. My least favourite option, admitting defeat I hate losing.\n[Test, Combinatorial] public void MyTest() { foreach(var element in MyElements) { foreach(var otherValue in otherValues) { // ... } } } This means 1 test is shown in the test explorer for all the combinations, which makes debugging slow and tiresome, which makes this a bad test, abandoning combinatorial just isn\u0026rsquo;t an option in my mind. So let\u0026rsquo;s refuse defeat, and look at the problem differently.\nProblems so far with every approach Let\u0026rsquo;s review.\nEvery test has a copy of the inputs, which is impossible to maintain Inputs are limited to what is readable, more than 10 per [Values()] gets messy Inputs MUST be constant which is limiting. I want to use combinatorial so I can easily see WHICH combination failed and iterate quickly My eventual solution What I really want, is easy ways to specify a list of mutable objects for each test that requires this combination approach, and sometimes I want to absolutely hammer a test with combinations of variables, that could exceed 1000 combinations, but maintain a readable test and be sure that I haven\u0026rsquo;t missed any weird edge cases. It might be said that what I am making is too complex, but honestly, sometimes it be what it be.\nBut how can we do this, we tried every combination\u0026hellip; Or did we? What about that Values attribute? Does it have some secrets we can gleam? https://github.com/nunit/nunit/blob/main/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs\npublic class ValuesAttribute... Oh sweet googly moogly the attribute is not sealed!\nVictory is oh so sweet Learning this I decided I could inherit the attribute and create parameterised named collections.\npublic class ZoomLevelValuesAttribute : ValuesAttribute { public ZoomLevelValuesAttribute() : base(25, 33, 100, 273, 500) { } } public class ToggleValuesAttribute : ValuesAttribute { public ToggleValueAttribute() : base(true, false) { } } public class GoodElementsValuesAttribute : ValuesAttribute { public GoodElementsValueAttribute() : base() { this.data = Combinatorials.NewElements().Cast\u0026lt;object\u0026gt;().ToArray(); } } And now, my tests have never been more powerful, more readable, and more maintainable.\n[Test, Combinatorial] public void MyTest( [ToggleValues] bool onOff, [ZoomLevelValues] int zoom, [GoodElementsValues] object myElement) { // ... } ","permalink":"https://clicky.sh/posts/testing/nunit-combinatorial/","summary":"\u003cp\u003eIf you\u0026rsquo;re reading this article, I\u0026rsquo;m going to assume you have a basic understanding of \u003ca href=\"https://docs.nunit.org/articles/nunit/writing-tests/attributes/combinatorial.html\"\u003ecombinatorial\u003c/a\u003e and parametrising NUnit tests and now you are pushing up to the limits of this system.\u003c/p\u003e\n\u003cp\u003eFor reference, let\u0026rsquo;s examine a simple Combinatorial Test.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-c#\" data-lang=\"c#\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e[Test, Combinatorial]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e MyTest(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e    [Values(1, 2, 3)]\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e x,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003e    [Values(\u0026#34;A\u0026#34;, \u0026#34;B\u0026#34;)]\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003estring\u003c/span\u003e s)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e// ...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAs the parameters must be entered into an attribute, we are limited to constant values, ints, doubles, strings, enums etc.\u003c/p\u003e","title":"Advanced Combinatorial Testing in NUnit"},{"content":"I find programming quite beautiful, writing good code, good data and logic flow is enchanting to me.\nIf you\u0026rsquo;ve ever watched Severance (no spoilers) the crew work on little computers in which they refine data entirely by how it makes them feel.\nAs daft as looking at a bunch of numbers on a screen and sorting them by vibe sounds I\u0026rsquo;d definitely liken it to my coding style. Good code feels comfy, reassuring and trustworthy. Bad code feels unnerving, concerning, sometimes even anxiety inducing as your brain cannot walk through the control flow, ok code feels, also ok. It feels quite meh and I know in earnest I\u0026rsquo;ll likely return on another sunnier day to turn it into good code.\nI really like working in a space with immutable structures, enums, switches, functions and closures. Likely because whilst this doesn\u0026rsquo;t guarantee good code its a happy space for me I feel warm and fuzzy working with such trustworthy types that aren\u0026rsquo;t going to throw surprises at me now or later.\nNull shits all over this wonderful vibe like a racist Uncle at a Barbecue pervasively entering every conversation to interrupt with their unwelcome thoughts on Gay Marriage and Gender Identity.\nIn this analogy the efficient, enjoyable readable flow of the code is interrupted by having to double check everything, litter my code with ?\u0026rsquo;s, ??\u0026rsquo;s, try catches, and all the extra effort that comes with being forced to mediate any conversation with a drunk idiot.\nNull Null exists to represent that a value is not anything. This is theoretically useful, but there are a many critical issue with its general design.\n1. I can still interact with null and I will be punished for doing so In the case below, the program will attempt to Crash because it doesn\u0026rsquo;t know what else to do, which is fair! We can\u0026rsquo;t carry on without explicitly doing PerformTask or handling its failure.\nMyClass myClass = default; myClass.PerformTask(); // \u0026lt;-- NullReferenceException 2. Null is hidden In the above example, myClass is explicitly declared as null, but there are many times null was not intended and there\u0026rsquo;s no way to know for sure if a value will or will not be null so we need to remain constantly vigilant and eternally paranoid.\nIf instead myClass had a default (non null) value the PerformTask() method could still be run and return a failing value, using structs allows for exactly this.\nMyStruct myStruct = default; myStruct.PerformTask(); 3. Null is too generic Null is the default nothing value for all reference types which isn\u0026rsquo;t very useful, take this example.\npublic bool MyFunction(IInterface thing) { return thing switch { null =\u0026gt; false, _ =\u0026gt; true } } If thing is null, there\u0026rsquo;s no way for me to know what it was supposed to be outside of the interface. I can\u0026rsquo;t check which values it has or should have and I also don\u0026rsquo;t necessarily know why it\u0026rsquo;s null.\nIt would be much better if every class could inherit a kind of INull interface and offer a fallback value instead. I\u0026rsquo;d much prefer this, and generally if I can, I do implement an explicit\n\u0026ndash;\u0026gt; other article stuff\n4. Null takes up too much code real estate I would really really like to avoid this;\nif (value is null) { } this;\nvar result = value?.Property ?? defaultValue; and this;\ntry { // if arg is null the constructor throws a NullReferenceException var instance = new MyType(arg); } catch {} 5. a?.b ?? c If the option was to have or not have ? and ?? I\u0026rsquo;d vote to keep them, they\u0026rsquo;re better than try catches long form null checks everywhere. This example below is something I have to do every day and every time I have to add another one to fix a NullReferenceException I scream internally.\npublic string MyFunction(object data1) { string myValue = data1?.Property1?.Property2?.Name ?? string.Empty; if (string.IsNullOrEmpty(myValue)) return \u0026#34;Empty\u0026#34;; return myValue; } 6. Handling nulls with exceptions is terrible design public void MyFunction(object data1, object data2) { if (data1 is null) throw new NullArgumentException(nameof(data1)) // ... } I see this sort of thing A LOT. And I do NOT understand why. Thank you so much for resolving my null input by trying to crash my program. Bonus points if this exception is not documented in the doc strings. Returning a false is much safer and gives me a chance to handle it myself.\npublic bool MyFunction(object data1, object data2) { if (data1 is null) return false; // ... } 7. Not Sure This function is already a disaster. The only 3 return options are an object, null or an exception. Hoo-rah. And regardless of which it is, I need to check every possible result.\npublic object MyFunction(object data1, object data2) I\u0026rsquo;m a much prefer the TrySomething pattern, as with above, any failures inside the method can return false.\npublic bool TryMyFunction(object data1, object data2, out object result); Most importantly, the function can return this phrase which is something I\u0026rsquo;m very fond of as now I can ALWAYS trust this method to return something usable or give me a false.\nreturn result is not null; 8. Landmine Constructors This constructor is like biting into a jam donut with a bee in it. Nulls break the effectiveness of Constructors in my opinion.\npublic class MyClass { public MyClass(object input1) { if (input1 is null) throw new NullArgumentException(nameof(input1)) } } If it is SO important that the input is not null, why did you allow for it in your design? If I\u0026rsquo;m not supposed to come to your wedding without a present, tell me in advance, don\u0026rsquo;t kick me in the shins when I walk through the door empty handed.\npublic class MyClass { private MyClass() {} public static bool TryCreate(object input1, out MyClass myClass) { myClass = new(); if (input1 is null) return false; myClass.Input1 = input1; return true; } } I don\u0026rsquo;t really like constructors in languages with null for the reasons above, they\u0026rsquo;re not a great pattern. Instead a TryCreate is much safer.\n9. The resulting Try Pattern everywhere public bool TryGetThing(object data, out object thing); The result of all of this is I use this pattern every day everywhere. This is kind of ok. As long as I don\u0026rsquo;t need to do async, certain closures, parallelisation, and a few other scenarios.\nBut it still feels shit. Why do I have to do this everywhere just to be sure I won\u0026rsquo;t stub my toe?\nNow what This isn\u0026rsquo;t to say I always think a value should be \u0026ldquo;something\u0026rdquo;, not-something-useful is a very very useful state for a value\nImmutability Using value types such as structs and enums will prevent nulls entering our code.\npublic enum Result { None = 0, Success, Failure } public Result TryDoThing(int number); // \u0026lt;-- Readable and safe!! public readonly record struct Point(double X, double Y) { public static Point Empty =\u0026gt; new(double.NaN, double.NaN); } public Point GetHighestPoint(IEnumerable\u0026lt;Point\u0026gt; points) { if (points is null || points.Length \u0026lt;= 0) return Point.Empty; // code return highestPoint; } The only issue of course is structs and immutability may not be the best approach. Imagine a 10Mb Bitmap, that would be an awful struct.\nOptions and Results Rust doesn\u0026rsquo;t have null, which is lovely. Instead it uses Option\u0026lt;T\u0026gt; and Result\u0026lt;T\u0026gt;. C# doesn\u0026rsquo;t have these natively (yet), but they\u0026rsquo;re not too hard to create.\nThis style of coding will prevent all nulls, exceptions and heartache as long as you handle every result and option. It looks a bit verbose, but your code will always run as you intended it to with no hidden surprises.\nImagine a Thanksgiving where your intolerant relatives just weren\u0026rsquo;t invited? Doesn\u0026rsquo;t that sound simpler, nicer and also leave more Turkey for everyone?\n","permalink":"https://clicky.sh/posts/opinions/null-is-shit/","summary":"\u003cp\u003eI find programming quite beautiful, writing good code, good data and logic flow is enchanting to me.\u003c/p\u003e\n\u003cp\u003eIf you\u0026rsquo;ve ever watched Severance (no spoilers) the crew work on little computers in which they refine data entirely by how it makes them \u003cem\u003efeel\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Macro Data Refinement\" loading=\"lazy\" src=\"/images/macro-data-refinement.png\"\u003e\u003c/p\u003e\n\u003cp\u003eAs daft as looking at a bunch of numbers on a screen and sorting them by vibe sounds I\u0026rsquo;d definitely liken it to my coding style. Good code \u003cem\u003efeels\u003c/em\u003e comfy, reassuring and trustworthy. Bad code \u003cem\u003efeels\u003c/em\u003e unnerving, concerning, sometimes even anxiety inducing as your brain cannot walk through the control flow, ok code feels, also ok. It feels quite meh and I know in earnest I\u0026rsquo;ll likely return on another sunnier day to turn it into good code.\u003c/p\u003e","title":"Null is Shit"},{"content":" ","permalink":"https://clicky.sh/posts/photography/croatia/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_123847.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_123713.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_123750.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_123755.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_124036.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_124316.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_124400.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_124420.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_124556.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_124608.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125040.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125122.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125146.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125231.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125309.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125329.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125400.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125407.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125417.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125600.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125608.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_125613.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_130003.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_130305.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_131302.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_132538.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_132602.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_132625.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_132645.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_132701.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_132910.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_132949.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_133006.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_133109.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_133201.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_133238.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_133640.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_133756.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_134058.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135501.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135555.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135643.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135650.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135658.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135728.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135856.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_135919.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_140523.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_140615.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/croatia-abandoned/20231230_143140.jpg\"\u003e\u003c/p\u003e","title":"Abandoned in Croatia"},{"content":" ","permalink":"https://clicky.sh/posts/photography/iceland/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/iceland/church.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/arora_borealis.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/boat_water.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/bridge_wreck.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/dacia_duster.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/default.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/dragon_tooth_mountain.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/farmhouse.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/foss_and_twat.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/foss.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/foss2.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/glacier_pilot.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/highway.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/hill.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/huge_foss.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/last_house.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/mmm_mountains.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/mmm_road.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/mmm_sky.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/more_mountains.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/mountain_crack.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/mountain_reflection.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/mountainside.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/mountainside2.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/out_of_plane.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/plane_inside.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/plane_wreck.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/Probably_more_mountains.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/reindeer.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/road3.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/rock.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/sexy_mountains.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/small_rock_big_rock.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/Steamy_Mountain.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/steamy_vents.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/the_cave.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/walk.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/water_rocks.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/waterfall_closeup.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/waterfall_drop.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/waterfall.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/waterfall2.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"/iceland/window_view.png\"\u003e\u003c/p\u003e","title":"Iceland"},{"content":"A mix of 4x5\u0026quot;, 9x12cm, 6x9 etc\nSome of my first attempts at larger formats. Large format is really fun and offers lots of creative options that 35mm doesn\u0026rsquo;t somehow. Usually your camera has bellows, simple lenses and lots of flexibility. It also requires you to learn more about the equipment and try try try. As you can see, some of these are not at all museum quality. Art gallery sure, but not museum quality. The 6x6 shots are on 1967 Ilford film.\n","permalink":"https://clicky.sh/posts/photography/large-format/","summary":"\u003cp\u003eA mix of 4x5\u0026quot;, 9x12cm, 6x9 etc\u003c/p\u003e\n\u003cp\u003eSome of my first attempts at larger formats. Large format is really fun and offers lots of creative options that 35mm doesn\u0026rsquo;t somehow. Usually your camera has bellows, simple lenses and lots of flexibility. It also requires you to learn more about the equipment and try try try. As you can see, some of these are not at all museum quality. Art gallery sure, but not museum quality. The 6x6 shots are on 1967 Ilford film.\u003c/p\u003e","title":"Large Format"},{"content":"Once upon a time, in a little village I made a little house.\nBuild Pics I remember making the little title block as I was trying to go solo as an architect. Not long after this I realised I HATED doing solo projects. Used Revit as that was my forté at the time.\nUnderfloor heating was the best possible heating for the building, took up no space and was very cosy on the feet!\nI think this came on my birthday, and it was EXTREMELY tiring to get move it all around the room.\nMy dad thoroughly enjoyed picking out quality wood for the door.\n","permalink":"https://clicky.sh/posts/photography/postbox/","summary":"\u003cp\u003eOnce upon a time, in a little village I made a little house.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7665.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7666.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7670.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7672.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7673.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7674.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7675.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7678.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7682.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7684.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7686.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7688.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7690.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7692.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7693.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7696.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7697.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7698.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7699.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7700.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7701.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7703.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7704.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7705.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7706.JPG\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/DSCF7707.JPG\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"build-pics\"\u003eBuild Pics\u003c/h1\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/postbox/build-pics/plans.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eI remember making the little title block as I was trying to go solo as an architect. Not long after this I realised I HATED doing solo projects. Used Revit as that was my forté at the time.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/postbox/build-pics/IMG_20170318_133839.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/build-pics/IMG_20170303_074507.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/build-pics/IMG_20170318_144137.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/build-pics/IMG_20170501_093142.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/postbox/build-pics/IMG_20170507_140701.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eUnderfloor heating was the best possible heating for the building, took up no space and was very cosy on the feet!\u003c/p\u003e","title":"The PostBox"},{"content":"My first solo trip. I got the ticket after Jack\u0026rsquo;s Flight Club recommended it. I do recall sitting next to a travel agent on the plane who told me quite smugly she paid 80 quid for her ticket and asked how much I\u0026rsquo;d paid and being quite confused how I\u0026rsquo;d snagged one for 50 quid.\nI was quite surprised to see Dunkin\u0026rsquo; Donuts and Wendys here. I do also recall seeing McDonald\u0026rsquo;s and couples wearing their Sunday best as the McDonald\u0026rsquo;s was the fanciest restaurant in town. Certainly not the best tasting, but it stood out.\nLesson learned, if the price of your zoo ticket is 50 pence, don\u0026rsquo;t go in.\nI think about this bread at least twice a week. It was around 1 Euro equivalent, and it was delicious. Cheese infused bread sometimes with an egg in the middle. Absolutely delicious.\nI found a small LGBT cafe that served vegan food in Georgia. They told me a lot of stories of people who did not agree with this cafe and protested them, sometimes violently. The proprietor also told me her dad did not know about it and she loved Dr Who. A kitten ran in one day under the counter.\nI think this is the part of the holiday where I broke emotionally because my plans had fallen apart and it had all gone to shit and I needed to talk to someone and found some french people and followed them for a while.\nThere was a theme park on top of a hill, I asked if it was open and the cable car guy said yes, and it was absolutely not open. Bastard.\nThis chap insisted we have a photo together and took me around the Georgian Museum of Glory in Kutaisi showing me all of Georgia\u0026rsquo;s triumphs.\nThere\u0026rsquo;s lots of really good dinosaur fossils in Georgia. They had a park dedicated to dinosaurs that looked like it had run out of money and everyone was likely trespassing. The best part of this to me was it looked like Jurassic park (after the first movie).\n","permalink":"https://clicky.sh/posts/photography/georgia/","summary":"\u003cp\u003eMy first solo trip. I got the ticket after Jack\u0026rsquo;s Flight Club recommended it. I do recall sitting next to a travel agent on the plane who told me quite smugly she paid 80 quid for her ticket and asked how much I\u0026rsquo;d paid and being quite confused how I\u0026rsquo;d snagged one for 50 quid.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/georgia/img032.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/georgia/img001.jpg\"\u003e\n\u003cimg loading=\"lazy\" src=\"/georgia/img002.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eI was quite surprised to see Dunkin\u0026rsquo; Donuts and Wendys here. I do also recall seeing McDonald\u0026rsquo;s and couples wearing their Sunday best as the McDonald\u0026rsquo;s was the fanciest restaurant in town. Certainly not the best tasting, but it stood out.\u003c/p\u003e","title":"Georgia"},{"content":"At some point during University I decided to take only 1 photo a day with my 35mm film camera gifted to me by my Gran. I had a lot of fun eyeballing the exposure (As you can see, to mixed success) and developing the film myself in the bath tub. The photos could likely do with some better scanning and more love, but I like that they look a bit amateur-ish.\n","permalink":"https://clicky.sh/posts/photography/one-a-day/","summary":"\u003cp\u003eAt some point during University I decided to take only 1 photo a day with my 35mm film camera gifted to me by my Gran. I had a lot of fun eyeballing the exposure (As you can see, to mixed success) and developing the film myself in the bath tub. The photos could likely do with some better scanning and more love, but I like that they look a bit amateur-ish.\u003c/p\u003e","title":"One Photo a Day"}]