<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>wamonomicon</title><link href="https://wamonite.com/" rel="alternate"></link><link href="http://feeds.feedburner.com/wamonomiconfeed" rel="self"></link><id>https://wamonite.com/</id><updated>2025-05-09T00:00:00+01:00</updated><subtitle>infrequently self-promoting on the web since '95</subtitle><entry><title>Eye @ Electromagetic Fields 2024</title><link href="https://wamonite.com/eye_at_emfcamp_2024.html" rel="alternate"></link><published>2025-05-09T00:00:00+01:00</published><updated>2025-05-09T00:00:00+01:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2025-05-09:/eye_at_emfcamp_2024.html</id><summary type="html">&lt;p&gt;It has been a while since I've posted anything here, so thought I would put something up about the first project I managed to take in an even vaguely finished state to Electromagnetic Fields. I first attended in 2016 and was lucky enough to be invited to the amazing Hat …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It has been a while since I've posted anything here, so thought I would put something up about the first project I managed to take in an even vaguely finished state to Electromagnetic Fields. I first attended in 2016 and was lucky enough to be invited to the amazing Hat Village. To get a feeling for the festival I'll refer you to fellow Hat Villager &lt;a href="https://sam.pikesley.org/blog/2024/06/11/the-best-weekend-you-can-have/"&gt;Sam's excellent blog&lt;/a&gt;. If you've returned after reading that, I can state that yes indeed my son will be back for the next one (although it may involve more exam revision this time)!&lt;/p&gt;
&lt;p&gt;We unsurprisingly make silly hats for Hat Village and this started as an idea by my son wanting a hat like the Las Vegas sphere. While impractical as headwear, the idea remained and grew into this. I'm going to put up more details in the &lt;a href="https://github.com/wamonite/emf-eye"&gt;GitHub repository&lt;/a&gt; but here are a few details for now:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It's built from a translucent street light sphere with a 3D printed mount for a micro-projector and fish-eye lens, all designed and assembled by my good friend &lt;a href="https://mastodon.me.uk/@craftit"&gt;Charles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The videos are projected by a Python script running on a Raspberry Pi 5 using OpenGL to warp and move the videos during playback.&lt;/li&gt;
&lt;li&gt;Control is via an &lt;a href="https://www.akaipro.com/lpd8"&gt;Akai LPD8&lt;/a&gt; allowing for video clip selection and tuning of the projection mapping parameters.&lt;/li&gt;
&lt;li&gt;It has an animation capture mode for recording the eye movement via mouse to be used during playback of each video.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It worked really well but there are definitely some things that could be improved:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improve the playback performance by moving the simple OpenGL commands into shaders.&lt;/li&gt;
&lt;li&gt;Add sensors to allow the eye to look and react to people around it.&lt;/li&gt;
&lt;li&gt;Build a bigger one with more projectors for full coverage.&lt;/li&gt;
&lt;li&gt;Build several and have them networked so that they can coordinate when interacting with people.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll also get more video of it in action during the further development process, but here are a few clips of it in situ at Hat Village!&lt;/p&gt;
&lt;div class="embed-responsive embed-responsive-16by9"&gt;
&lt;iframe class="embed-responsive-item" src="https://www.youtube.com/embed/pcSI2EBCRPM?feature=oembed" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;</content><category term="Build"></category></entry><entry><title>Project: Boiler Automation</title><link href="https://wamonite.com/project_boiler_automation.html" rel="alternate"></link><published>2018-02-19T00:00:00+00:00</published><updated>2018-02-19T00:00:00+00:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2018-02-19:/project_boiler_automation.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Building a smart central heating and hot water controller with an Arduino, a Pi Zero W and Home Assistant.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The Brief&lt;/h2&gt;
&lt;p&gt;My study/workspace is in the basement, which can get cold. The central heating button is two floors up at the opposite end of the house. I wanted a …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Building a smart central heating and hot water controller with an Arduino, a Pi Zero W and Home Assistant.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The Brief&lt;/h2&gt;
&lt;p&gt;My study/workspace is in the basement, which can get cold. The central heating button is two floors up at the opposite end of the house. I wanted a cheap, non-invasive device to press the button via a friendly web UI!&lt;/p&gt;
&lt;h2&gt;The Plan&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Actually use one of the many Arduinos I have lying around (a 5V Pro Mini in this case as I was going to add an external regulator).&lt;/li&gt;
&lt;li&gt;Press the central heating and hot water buttons with using servos, with the 'fingers' resting in a retracted position so the buttons can still be reached.&lt;/li&gt;
&lt;li&gt;Read the central heating and hot water 'on' lights so it can report the status if changed manually.&lt;/li&gt;
&lt;li&gt;Read the temperature and humidity of the airing cupboard the boiler controller is in (as I also have plenty of DHT11s lying around).&lt;/li&gt;
&lt;li&gt;Communicate with the Arduino using &lt;a href="https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo"&gt;nRF24L01+ 2.4GHz transceiver&lt;/a&gt; boards using &lt;a href="https://github.com/nRF24/RF24Mesh"&gt;RF24Mesh&lt;/a&gt;, as I was interested in adding other devices to a house mesh network.&lt;/li&gt;
&lt;li&gt;Set up &lt;a href="https://home-assistant.io/"&gt;Home Assistant&lt;/a&gt; as the friendly web UI and write a device plugin for it, running on my &lt;a href="http://www.up-board.org/upsquared/"&gt;Kickstarter-backed UP&lt;sup&gt;2&lt;/sup&gt; home server&lt;/a&gt; (yes, I backed a hardware Kickstarter and it actually made it to production).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What went right&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;To try new tools, I used &lt;a href="https://platformio.org/"&gt;PlatformIO&lt;/a&gt; on &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt; on macOS, which is an excellent setup for development on multiple connected Arduinos.&lt;/li&gt;
&lt;li&gt;Controlling the servos using the Arduino PWMs was a doodle, as was reading the lights with LDRs.&lt;/li&gt;
&lt;li&gt;Making servo/LDR mounts and button pressing 'fingers' is also a doodle if you have a 3D printer.&lt;/li&gt;
&lt;li&gt;Added a beefy 5V regulator to power the Arduino, servos and transceiver.&lt;/li&gt;
&lt;li&gt;Managed to get the nRF24L01+ boards registering with RF24Mesh and communicating Arduino to Arduino.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/project_boiler_automation/initial_controller.jpg" data-lightbox="project_boiler_automation" data-title="Initial controller setup with the nRF24L01+PA+LNA board"&gt;&lt;img alt="initial controller" class="center-block img-responsive" src="https://wamonite.com/photos/project_boiler_automation/initial_controllert.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What went wrong&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Initially couldn't get the nRF24L01+ boards to work at all, even with the recommended passive components on the supply, and thought I'd managed to pick up a &lt;a href="https://hackaday.com/2015/02/23/nordic-nrf24l01-real-vs-fake/"&gt;batch of dodgy copies that had the ACK bit flipped&lt;/a&gt;. Bought a power breakout adapter for my breakout adapter that came with its own 3.3V regulator and the passive components on a PCB which seemed to solve the issue.&lt;/li&gt;
&lt;li&gt;With the nRF24L01+ boards communicating Arduino to Arduino, the boards could not reach the distance required, even with the transmission power at maximum and the bitrate reduced to 250kpbs. Replacing them with nRF24L01+PA+LNA boards (that were thankfully pin-compatible with the power breakout boards) solved the range problem.&lt;/li&gt;
&lt;li&gt;RF24Mesh supports running the master node on Raspberry Pi and Linux with a number of IO drivers, so I thought getting it running on the UP&lt;sup&gt;2&lt;/sup&gt; would be simple as it is Pi GPIO compatible. Not so much. Submitted a pull request to get it building correctly with &lt;a href="https://iotdk.intel.com/docs/master/mraa/"&gt;MRAA&lt;/a&gt;, but even then it wouldn't remain connected for more than 30 minutes without sporadic GPIO timeouts. Gave up.&lt;/li&gt;
&lt;li&gt;As I'd got the Arduino to Arduino communication working, thought the I could attach the nRF24L01+PA+LNA boards to an Arduino set to behave as an &lt;a href="https://en.wikipedia.org/wiki/I%C2%B2C"&gt;I&lt;sup&gt;2&lt;/sup&gt;C&lt;/a&gt; node to the UP&lt;sup&gt;2&lt;/sup&gt;. Built a 3.3V to 5V level-switching board with pull-ups for the I&lt;sup&gt;2&lt;/sup&gt;C bus between the Pi and Arduino, not strictly needed as I&lt;sup&gt;2&lt;/sup&gt;C pins are high impedance, but didn't want to risk blowing the Pi up if I accidentally set the pins wrong. Tested the I&lt;sup&gt;2&lt;/sup&gt;C communications with a PCF8574P (again, lying around) then implemented the Arduino as an I&lt;sup&gt;2&lt;/sup&gt;C node. Worked. Attached the nRF24L01+PA+LNA. Still unreliable. Gave up.&lt;/li&gt;
&lt;li&gt;Was so close to completion but couldn't determine whether the 2.4GHz communication problems were the beta-ness of the mesh network library, electrical noise from the boiler or servos, being overpowered by other local WiFi hubs, dodgy Pi GPIO compatibility on the UP&lt;sup&gt;2&lt;/sup&gt;, my ineptitude or a combination of them all.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/project_boiler_automation/pi_to_arduino_i2c_board.jpg" data-lightbox="project_boiler_automation" data-title="Pi-to-Arduino I2C connector with 3.3V to 5V level shifters and pull-up resistors"&gt;&lt;img alt="pi to arduino i2c board" class="center-block img-responsive" src="https://wamonite.com/photos/project_boiler_automation/pi_to_arduino_i2c_boardt.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What went right (finally)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Replaced the nRF24L01+PA+LNA with a Pi Zero W, as I have perfectly good WiFi in my house, communicating with the Arduino via I&lt;sup&gt;2&lt;/sup&gt;C (phew, the code and Pi-to-Arduino board weren't wasted).&lt;/li&gt;
&lt;li&gt;Found out you can power the Pi via the GPIO 5V pins, admittedly bypassing the fuses, so could run it off the existing 5V regulator.&lt;/li&gt;
&lt;li&gt;Wrote a simple web API for the Arduino with &lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt;, which I ran as a single-threaded single process so I didn't have to think about shared resource management and locking access to the I&lt;sup&gt;2&lt;/sup&gt;C bus BECAUSE I JUST WANTED IT FINISHED.&lt;/li&gt;
&lt;li&gt;Installing Home Assistant on the UP&lt;sup&gt;2&lt;/sup&gt; and writing a switch-derived custom plugin was easy. It has &lt;a href="https://home-assistant.io/developers/platform_example_light/"&gt;good documentation&lt;/a&gt; and being on &lt;a href="https://github.com/home-assistant/home-assistant"&gt;GitHub&lt;/a&gt; you can read the code of the existing plugins.&lt;/li&gt;
&lt;li&gt;Configured Home Assistant security and port-forwarded 443 (SSL with &lt;a href="https://letsencrypt.org/"&gt;Let's Encrypt&lt;/a&gt; of course) to the UP&lt;sup&gt;2&lt;/sup&gt; so I can control it on the go!&lt;/li&gt;
&lt;li&gt;Even with the unused transceivers, the whole device cost about £20.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/project_boiler_automation/controller_with_pi.jpg" data-lightbox="project_boiler_automation" data-title="Controller with a Pi Zero W"&gt;&lt;img alt="controller with pi zero" class="center-block img-responsive" src="https://wamonite.com/photos/project_boiler_automation/controller_with_pit.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It was a fun and practical project that has made my life better (lazier) and even my other half thinks is incredibly useful. So glad to finally find a use for a parts I'd bought thinking 'they would be useful'. Spent way too long with the 2.4GHz transceivers, just because I liked the thought of a house mesh network. Will try them again for future outdoor projects and use a programmable WiFi chip (like an &lt;a href="https://en.wikipedia.org/wiki/ESP8266"&gt;ESP8266&lt;/a&gt;) for indoors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/project_boiler_automation/controller_in_place.jpg" data-lightbox="project_boiler_automation" data-title="Controller 'securely' fixed in place"&gt;&lt;img alt="controller securely in place" class="center-block img-responsive" src="https://wamonite.com/photos/project_boiler_automation/controller_in_placet.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What's left&lt;/h2&gt;
&lt;p&gt;It's been working well for a while now but there are a few things that can be done:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tidy and publish the Arduino, Flask and Home Assistant plugin code.&lt;/li&gt;
&lt;li&gt;make the cables a bit less chaotic looking.&lt;/li&gt;
&lt;li&gt;replace the gaffer tape with a better way to mount (and dismount) the board.&lt;/li&gt;
&lt;li&gt;replace the cable ties fixing the controller circuit and Pi to the board with something less dangly.&lt;/li&gt;
&lt;li&gt;move the DHT11 so it isn't just taking the temperature of the 5V regulator.&lt;/li&gt;
&lt;li&gt;disable the boiler timer and control the schedule with a Home Assistant plugin.&lt;/li&gt;
&lt;li&gt;add wireless thermometers around the house to Home Assistant so I can tune the radiator thermostats and possibly get Home Assistant to control the heating to maintain a set temperature.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Build"></category></entry><entry><title>envassume</title><link href="https://wamonite.com/envassume.html" rel="alternate"></link><published>2017-05-14T00:00:00+01:00</published><updated>2017-05-14T00:00:00+01:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2017-05-14:/envassume.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Assume an AWS IAM role from AWS API credentials in environment variables.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I like to use &lt;a href="https://pypi.python.org/pypi/envdir"&gt;envdir&lt;/a&gt; when selecting AWS API keys for CLI usage. Assuming IAM roles is awkward on the CLI as you have to get the temporary role credentials via &lt;code&gt;aws sts assume-role&lt;/code&gt; and manually extract them …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Assume an AWS IAM role from AWS API credentials in environment variables.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I like to use &lt;a href="https://pypi.python.org/pypi/envdir"&gt;envdir&lt;/a&gt; when selecting AWS API keys for CLI usage. Assuming IAM roles is awkward on the CLI as you have to get the temporary role credentials via &lt;code&gt;aws sts assume-role&lt;/code&gt; and manually extract them to an envdir or environment variables prior to running anything. I wrote &lt;a href="https://pypi.python.org/pypi/envassume"&gt;envassume&lt;/a&gt; to give an envdir-like experience when assuming roles. It uses the current credentials to perform the STS request then extracts and replaces the environment variables with the temporary credentials for the child command e.g.&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code&gt;envassume arn:aws:iam::123456789012:role/example aws s3 ls
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;with an external ID e.g.&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code&gt;envassume -i external_id arn:aws:iam::123456789012:role/example aws s3 ls
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The ARN and external ID can be set in the environment variables &lt;code&gt;AWS_ASSUME_ROLE&lt;/code&gt; and &lt;code&gt;AWS_ASSUME_ID&lt;/code&gt; e.g.&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code&gt;AWS_ASSUME_ROLE=arn:aws:iam::123456789012:role/example AWS_ASSUME_ID=external_id envassume aws s3 ls
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Please note, if the ARN is set by environment variable, then no other envassume options can be set.&lt;/p&gt;
&lt;p&gt;envassume is available on &lt;a href="https://pypi.python.org/pypi/envassume"&gt;pypi&lt;/a&gt; and &lt;a href="https://github.com/wamonite/envassume"&gt;github&lt;/a&gt;.&lt;/p&gt;</content><category term="AWS"></category></entry><entry><title>3D Printer 2017 Plans</title><link href="https://wamonite.com/3d-printer-2017-plans.html" rel="alternate"></link><published>2017-01-02T00:00:00+00:00</published><updated>2017-01-02T00:00:00+00:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2017-01-02:/3d-printer-2017-plans.html</id><summary type="html">&lt;p&gt;I got quite into 3D printing in 2016 after fixing up a borrowed Bits From Bytes printer, then going on to build my own Prusa i3 from scratch.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/3d_printer_2017_plans/printer.jpg" data-lightbox="3d_printer_2017_plans" data-title="My Prusa i3 home build"&gt;&lt;img alt="printer" class="center-block img-responsive" src="https://wamonite.com/photos/3d_printer_2017_plans/printert.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's been an enjoyable project that has taken a few upgrades to improve print quality:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A properly copper etched heated bed as …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;I got quite into 3D printing in 2016 after fixing up a borrowed Bits From Bytes printer, then going on to build my own Prusa i3 from scratch.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/3d_printer_2017_plans/printer.jpg" data-lightbox="3d_printer_2017_plans" data-title="My Prusa i3 home build"&gt;&lt;img alt="printer" class="center-block img-responsive" src="https://wamonite.com/photos/3d_printer_2017_plans/printert.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's been an enjoyable project that has taken a few upgrades to improve print quality:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A properly copper etched heated bed as I need &amp;gt;100C and my original could barely make it over 50C.&lt;/li&gt;
&lt;li&gt;An &lt;a href="http://e3d-online.com/E3D-v6"&gt;E3D V6&lt;/a&gt; as my cheap MK8 seemed to jam at the drop of a hat with ABS.&lt;/li&gt;
&lt;li&gt;Updating X and Y axes with DRV8825 stepper drivers, to give me 1/32 stepping rather than 1/16 (and not because I blew the existing A4988s up).&lt;/li&gt;
&lt;li&gt;Watching streaming video of a print from work via &lt;a href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt; running &lt;a href="http://octoprint.org/"&gt;OctoPrint&lt;/a&gt; on &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Watching the stepper motor temperatures on the &lt;a href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt; via multiple DS18B20 one-wire thermometers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There's plenty to do to improve things even more. My list for 2017 so far:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fit the printer inside the enclosure I've built.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/3d_printer_2017_plans/enclosure.jpg" data-lightbox="3d_printer_2017_plans" data-title="Need to drill holes and but some perspex doors for the MDF enclosure"&gt;&lt;img alt="enclosure" class="center-block img-responsive" src="https://wamonite.com/photos/3d_printer_2017_plans/enclosuret.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fit a heat lamp in the enclosure so I can control the air temperature to improve layer adhesion of my ABS prints.&lt;/li&gt;
&lt;li&gt;Fit and test the inductive sensor so I no longer have to bother with Z calibration!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://wamonite.com/photos/3d_printer_2017_plans/inductive_sensor.jpg" data-lightbox="3d_printer_2017_plans" data-title="The inductive sensor and printed head mount"&gt;&lt;img alt="inductive sensor" class="center-block img-responsive" src="https://wamonite.com/photos/3d_printer_2017_plans/inductive_sensort.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Control the hot end fan and controller fan from the &lt;a href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt; so the printer is automatically quiet when not printing.&lt;/li&gt;
&lt;li&gt;Control some RGB LEDs from the &lt;a href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt; to improve the time-lapse video capture.&lt;/li&gt;
&lt;li&gt;Add a second &lt;a href="http://e3d-online.com/E3D-v6"&gt;E3D V6&lt;/a&gt; so I can print with a &lt;a href="http://e3d-online.com/Scaffold-Support-Material"&gt;water-soluble support material&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="3D Printing"></category></entry><entry><title>Continuous Lifecycle London</title><link href="https://wamonite.com/continuous-lifecycle-london.html" rel="alternate"></link><published>2016-05-31T00:00:00+01:00</published><updated>2016-05-31T00:00:00+01:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2016-05-31:/continuous-lifecycle-london.html</id><summary type="html">&lt;p&gt;As I’ve just updated my &lt;a href="https://github.com/wamonite/relapse"&gt;Pelican relapse theme&lt;/a&gt;, thought I’d better post something.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Continuous Lifecycle London" class="pull-right" src="https://wamonite.com/media/continuous_lifecycle_conf.png"&gt;&lt;/p&gt;
&lt;p&gt;I was lucky enough to attend the &lt;a href="http://continuouslifecycle.london/"&gt;Continuous Lifecycle London&lt;/a&gt; conference recently, a great mix of talks on the culture, practices and technology of devops and continuous delivery at scale, all of which I find …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As I’ve just updated my &lt;a href="https://github.com/wamonite/relapse"&gt;Pelican relapse theme&lt;/a&gt;, thought I’d better post something.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Continuous Lifecycle London" class="pull-right" src="https://wamonite.com/media/continuous_lifecycle_conf.png"&gt;&lt;/p&gt;
&lt;p&gt;I was lucky enough to attend the &lt;a href="http://continuouslifecycle.london/"&gt;Continuous Lifecycle London&lt;/a&gt; conference recently, a great mix of talks on the culture, practices and technology of devops and continuous delivery at scale, all of which I find fascinating. I’ve always been lucky enough to work across the entire process of designing, implementing and deploying interesting software and hardware products. Working on a cloud-native software-as-a-service platform, it’s great to be able to use good software practices to codify, version control, test and deploy everything; software, infrastructure, network, security and even compliance. A long way from burning custom DVDs, cabling racks or flashing firmware!  &lt;/p&gt;
&lt;p&gt;The points that seemed to resonate most for me were:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the more you can automate and the faster you can deploy, the more reliable your application can become and the quicker you can respond to feedback or issues.&lt;/li&gt;
&lt;li&gt;if part of your deployment process is painful, do it much more often and automate it.&lt;/li&gt;
&lt;li&gt;automating your entire deployment pipeline can be hard and laborious, but given how much value it can bring it is worth the investment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While at &lt;a href="http://www.spatialbuzz.com"&gt;SpatialBuzz&lt;/a&gt; we already have an effective release process and automated deployment (our current record is eleven deployments to production in one day) there is always more to automate and optimise. As we work towards containerising our application and moving to an orchestrated container cluster, it really is an exciting time to be in software development (something I’m happy to still be saying after all these years).&lt;/p&gt;
&lt;p&gt;As I work my way through &lt;a href="https://www.amazon.co.uk/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912"&gt;Continuous Delivery&lt;/a&gt; by &lt;a href="https://continuousdelivery.com/"&gt;Jez Humble&lt;/a&gt; and &lt;a href="http://www.continuous-delivery.co.uk/"&gt;Dave Farley&lt;/a&gt;, I’ll leave you with the video of the conference keynote.&lt;/p&gt;
&lt;div class="embed-responsive embed-responsive-16by9"&gt;
&lt;iframe class="embed-responsive-item" src="https://www.youtube.com/embed/76x-RB8f_2U?feature=oembed" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;</content><category term="DevOps"></category><category term="Conference"></category></entry><entry><title>Keepuppy</title><link href="https://wamonite.com/keepuppy-keepass-database-sftp-sync.html" rel="alternate"></link><published>2014-11-06T00:00:00+00:00</published><updated>2014-11-06T00:00:00+00:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2014-11-06:/keepuppy-keepass-database-sftp-sync.html</id><summary type="html">&lt;h2&gt;KeePass database SFTP sync&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/keepuppy"&gt;Keepuppy&lt;/a&gt; is a Python script/package I hacked together to keep 
database files in sync across multiple clients via an SFTP server. It can also be configured to call a script when the
local file is updated. A script for restarting &lt;a href="https://www.keepassx.org/"&gt;KeePassX&lt;/a&gt; on OS X is …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;KeePass database SFTP sync&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/keepuppy"&gt;Keepuppy&lt;/a&gt; is a Python script/package I hacked together to keep 
database files in sync across multiple clients via an SFTP server. It can also be configured to call a script when the
local file is updated. A script for restarting &lt;a href="https://www.keepassx.org/"&gt;KeePassX&lt;/a&gt; on OS X is provided. &lt;/p&gt;
&lt;p&gt;It's also an experiment in:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Robust testing with &lt;a href="https://nose.readthedocs.org"&gt;nose&lt;/a&gt; and &lt;a href="http://www.voidspace.org.uk/python/mock/"&gt;mock&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Configuration via &lt;a href="http://envdir.readthedocs.org/"&gt;envdir&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Version management using &lt;a href="https://github.com/peritus/bumpversion"&gt;bumpversion&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continuous integration via &lt;a href="https://github.com/wamonite/keepuppy"&gt;github&lt;/a&gt; and &lt;a href="https://travis-ci.org/wamonite/keepuppy"&gt;travis-ci&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Python &lt;a href="https://python-packaging-user-guide.readthedocs.org/"&gt;packaging&lt;/a&gt; for &lt;a href="https://pypi.python.org/pypi/keepuppy"&gt;PyPi&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Badge-driven development :)
&lt;a href="https://github.com/wamonite/keepuppy"&gt;&lt;img alt="github" src="http://img.shields.io/github/tag/wamonite/keepuppy.svg"&gt;&lt;/a&gt;
&lt;a href="https://pypi.python.org/pypi/keepuppy"&gt;&lt;img alt="pypi" src="http://img.shields.io/pypi/v/keepuppy.svg"&gt;&lt;/a&gt;
&lt;a href="https://travis-ci.org/wamonite/keepuppy"&gt;&lt;img alt="build" src="https://travis-ci.org/wamonite/keepuppy.svg?branch=master"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Launchd script&lt;/h2&gt;
&lt;p&gt;To run it periodically on OS X, here is a sample &lt;code&gt;launchd&lt;/code&gt; script. For more information on periodic job management with
&lt;code&gt;launchd&lt;/code&gt; check out this &lt;a href="http://alvinalexander.com/mac-os-x/mac-osx-startup-crontab-launchd-jobs"&gt;detailed article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This script will run &lt;code&gt;keepuppy_sync.py&lt;/code&gt;, passing configuration environment variables stored in &lt;code&gt;~/envdir/keepuppy&lt;/code&gt; via
&lt;code&gt;envdir&lt;/code&gt;, all from a &lt;code&gt;virtualenv&lt;/code&gt; called &lt;code&gt;keepuppy&lt;/code&gt;. The job runs every 5 minutes and outputs to log files at
&lt;code&gt;/tmp/keepuppy.log&lt;/code&gt; and &lt;code&gt;/tmp/keepuppy_error.log&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You will need to change the program arguments to match your user, &lt;code&gt;envdir&lt;/code&gt; and &lt;code&gt;virtualenv&lt;/code&gt; paths.&lt;/em&gt;&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;
&amp;lt;dict&amp;gt;
  &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;com.wamonite.keepuppy&amp;lt;/string&amp;gt;

  &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
  &amp;lt;array&amp;gt;
    &amp;lt;string&amp;gt;/Users/warren/.virtualenvs/keepuppy/bin/envdir&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;/Users/warren/envdir/keepuppy/&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;/Users/warren/.virtualenvs/keepuppy/bin/keepuppy_sync.py&amp;lt;/string&amp;gt;
  &amp;lt;/array&amp;gt;

  &amp;lt;key&amp;gt;Nice&amp;lt;/key&amp;gt;
  &amp;lt;integer&amp;gt;1&amp;lt;/integer&amp;gt;

  &amp;lt;key&amp;gt;StartInterval&amp;lt;/key&amp;gt;
  &amp;lt;integer&amp;gt;360&amp;lt;/integer&amp;gt;

  &amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt;
  &amp;lt;true/&amp;gt;

  &amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;/tmp/keepuppy.log&amp;lt;/string&amp;gt;

  &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;/tmp/keepuppy_error.log&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To run it as the desktop user when logged in, copy it to &lt;code&gt;~/Library/LaunchAgents/com.wamonite.keepuppy.plist&lt;/code&gt;. To start it and 
ensure it runs on reboot, use the following command:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-bash"&gt;launchctl load ~/Library/LaunchAgents/com.wamonite.keepuppy.plist
&lt;/code&gt;&lt;/pre&gt;</content><category term="Dev"></category><category term="Python"></category><category term="Keepuppy"></category></entry><entry><title>IP lookup for Vagrant private networking</title><link href="https://wamonite.com/ip-lookup-for-vagrant-private-networking.html" rel="alternate"></link><published>2014-07-12T00:00:00+01:00</published><updated>2014-07-12T00:00:00+01:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2014-07-12:/ip-lookup-for-vagrant-private-networking.html</id><summary type="html">&lt;p&gt;I haven't posted in &lt;em&gt;ages&lt;/em&gt; and given I'm doing so much interesting stuff with
&lt;a href="http://www.spatialbuzz.com"&gt;SpatialBuzz&lt;/a&gt; these days, I felt I needed to post
&lt;em&gt;something&lt;/em&gt;, however short but sweet.&lt;/p&gt;
&lt;p&gt;I spin up a lot of dev instances with Vagrant and VirtualBox on OS X these days and
needed them to be …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I haven't posted in &lt;em&gt;ages&lt;/em&gt; and given I'm doing so much interesting stuff with
&lt;a href="http://www.spatialbuzz.com"&gt;SpatialBuzz&lt;/a&gt; these days, I felt I needed to post
&lt;em&gt;something&lt;/em&gt;, however short but sweet.&lt;/p&gt;
&lt;p&gt;I spin up a lot of dev instances with Vagrant and VirtualBox on OS X these days and
needed them to be host addressable on fixed IPs. I also wanted a single source for managing said IPs.
After trying several Vagrant plugins, playing with DHCP and tweaking &lt;code&gt;pf&lt;/code&gt; rules, the 
easiest solution I found was a local DNS server and getting the &lt;code&gt;Vagrantfile&lt;/code&gt; to
look up its own IP.&lt;/p&gt;
&lt;h2&gt;30-second guide to local DNS on OS X&lt;sup id="fnref:another-dns-guide"&gt;&lt;a class="footnote-ref" href="#fn:another-dns-guide"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;code&gt;dnsmasq&lt;/code&gt; via &lt;a href="http://brew.sh/"&gt;Homebrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your desired homename and IPs to the end of the default config file &lt;code&gt;/usr/local/etc/dnsmasq.conf&lt;/code&gt; in the format &lt;code&gt;address=/&amp;lt;host name&amp;gt;/&amp;lt;IP address&amp;gt;&lt;/code&gt; e.g.:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-text"&gt;address=/db.vagrant.dev/192.168.2.10
address=/web.vagrant.dev/192.168.2.11
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start your local DNS server with the following command (and stop it with &lt;code&gt;unload&lt;/code&gt;):-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-bash"&gt;sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tell OS X to use it for a domain by creating the file &lt;code&gt;/etc/resolver/&amp;lt;domain&amp;gt;&lt;/code&gt; e.g. &lt;code&gt;/etc/resolver/vagrant.dev&lt;/code&gt; with the contents:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-text"&gt;nameserver 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the resolver is listed with:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-bash"&gt;scutil --dns
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Query it directly with:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-bash"&gt;dig db.vagrant.dev @127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Vagrantfile&lt;/h2&gt;
&lt;p&gt;Here's a basic &lt;code&gt;Vagrantfile&lt;/code&gt; to configure a single instance with the host-only network address read from DNS. As the host name is specified
as a parameter, this works for multi-machine setups too. The VM is both addressable via &lt;code&gt;vagrant ssh&lt;/code&gt; and SSH directly to the host name.&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-ruby"&gt;# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = &amp;quot;2&amp;quot;

# Set default to virtualbox unless otherwise specified
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

# hostname.wamonite.com: private IP address read from local DNS
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = &amp;quot;hashicorp/precise64&amp;quot;

    # Set the hostname
    config.vm.hostname = &amp;quot;web.vagrant.dev&amp;quot;

    # Read the IP address from local DNS and set as private network IP
    ip = Socket::getaddrinfo(config.vm.hostname, 'http', nil, Socket::SOCK_STREAM)[0][3]
    config.vm.network &amp;quot;private_network&amp;quot;, ip: ip
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Guest VM lookups&lt;/h2&gt;
&lt;p&gt;On VirtualBox the DNS server is available on the .1 address of the specified class C network, so VMs can address each other if the name
resolution for the guest OS is configured appropriately. In the above example, for a Linux host &lt;code&gt;/etc/resolv.conf&lt;/code&gt; would need to contain:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-text"&gt;nameserver 192.168.2.1
domain vagrant.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:another-dns-guide"&gt;
&lt;p&gt;Another guide with detailed commands can be found at &lt;a href="http://echo.co/blog/never-touch-your-local-etchosts-file-os-x-again"&gt;'Never touch your local /etc/hosts file in OS X again'&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:another-dns-guide" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Dev"></category><category term="Vagrant"></category><category term="OS X"></category><category term="VirtualBox"></category></entry><entry><title>Fixed: Automounted DVDs on openSUSE 11.4</title><link href="https://wamonite.com/fixed-automounted-dvds-on-opensuse-11-4.html" rel="alternate"></link><published>2013-01-10T00:00:00+00:00</published><updated>2013-01-10T00:00:00+00:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2013-01-10:/fixed-automounted-dvds-on-opensuse-11-4.html</id><summary type="html">&lt;p&gt;I had an issue with automounted DVDs on openSUSE 11.4 not appearing in Gnome desktop.
It seems that &lt;code&gt;udisks&lt;/code&gt; honours UDF-mounted directory permissions even if they aren't readable. &lt;sup id="fnref:bug-report"&gt;&lt;a class="footnote-ref" href="#fn:bug-report"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The issue is fixed in &lt;code&gt;udisks&lt;/code&gt; 1.0.3 &lt;sup id="fnref:udisks-release-notes"&gt;&lt;a class="footnote-ref" href="#fn:udisks-release-notes"&gt;2&lt;/a&gt;&lt;/sup&gt; however openSUSE 11.4 stopped updating &lt;code&gt;udisks&lt;/code&gt; at 1.0 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I had an issue with automounted DVDs on openSUSE 11.4 not appearing in Gnome desktop.
It seems that &lt;code&gt;udisks&lt;/code&gt; honours UDF-mounted directory permissions even if they aren't readable. &lt;sup id="fnref:bug-report"&gt;&lt;a class="footnote-ref" href="#fn:bug-report"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The issue is fixed in &lt;code&gt;udisks&lt;/code&gt; 1.0.3 &lt;sup id="fnref:udisks-release-notes"&gt;&lt;a class="footnote-ref" href="#fn:udisks-release-notes"&gt;2&lt;/a&gt;&lt;/sup&gt; however openSUSE 11.4 stopped updating &lt;code&gt;udisks&lt;/code&gt; at 1.0.2.
As the patch &lt;sup id="fnref:patch"&gt;&lt;a class="footnote-ref" href="#fn:patch"&gt;3&lt;/a&gt;&lt;/sup&gt; was minimal, I decided to apply it to the contents of the openSUSE source RPM, increment the RPM spec build number and build a new RPM.&lt;/p&gt;
&lt;p&gt;I'll put it up for download here (unless I find time to put it somewhere more official like the &lt;a href="https://build.opensuse.org/"&gt;openSUSE build server&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a href='static/udisks-1.0.2-3.6.2.i586.rpm' class='btn btn-primary'&gt;Download udisks-1.0.2-3.6.2.i586.rpm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To allow the DVD to be mounted without requiring root authentication I had to get handy with &lt;a href="http://www.freedesktop.org/wiki/Software/polkit"&gt;polkit&lt;/a&gt;.
I added the following &lt;code&gt;10-storage-group-user-override.pkla&lt;/code&gt; file to &lt;code&gt;/var/lib/polkit-1/localauthority/50-local.d/&lt;/code&gt; (you may have to create the &lt;code&gt;50-local.d&lt;/code&gt; directory).&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-text"&gt;[Access to removable media for users]
Identity=unix-group:users
Action=org.freedesktop.udisks.drive-eject;org.freedesktop.udisks.filesystem-mount
ResultAny=yes
ResultInactive=yes
ResultActive=yes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href='static/10-storage-group-user-override.pkla' class='btn btn-primary'&gt;Download 10-storage-group-user-override.pkla&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:bug-report"&gt;
&lt;p&gt;A bug report and patch can be found on the &lt;a href="https://bugs.launchpad.net/ubuntu/+source/udisks/+bug/635499"&gt;Ubuntu issue tracker #635499&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:bug-report" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:udisks-release-notes"&gt;
&lt;p&gt;As listed in the &lt;a href="http://cgit.freedesktop.org/udisks/tree/NEWS?id=c1e14e10f700c5a36d136004f3f3a04791cb8d9e"&gt;release notes&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:udisks-release-notes" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:patch"&gt;
&lt;p&gt;You can view the patch &lt;a href="http://cgit.freedesktop.org/udisks/commit/?id=2d1901f74725da29c7af7602e1c74faf55f14672"&gt;here&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:patch" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="SysAdmin"></category><category term="OpenSUSE"></category><category term="Linux"></category><category term="DVD"></category></entry><entry><title>Fixed: OSX Plex Media Server LAN/Wi-Fi sharing</title><link href="https://wamonite.com/fixed-osx-plex-media-server-lan-wifi-sharing.html" rel="alternate"></link><published>2012-10-29T00:00:00+00:00</published><updated>2012-10-29T00:00:00+00:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2012-10-29:/fixed-osx-plex-media-server-lan-wifi-sharing.html</id><summary type="html">&lt;p&gt;I'm sharing this as it caught me out for a few days and the solution wasn't obvious.
I run &lt;a href="http://www.plexapp.com/"&gt;Plex&lt;/a&gt; to serve media around the home to my TV and few
LAN and Wi-Fi clients. The server runs on a Mac Mini and I keep up with updates.
The client …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm sharing this as it caught me out for a few days and the solution wasn't obvious.
I run &lt;a href="http://www.plexapp.com/"&gt;Plex&lt;/a&gt; to serve media around the home to my TV and few
LAN and Wi-Fi clients. The server runs on a Mac Mini and I keep up with updates.
The client running on the server was fine but suddently LAN and Wi-Fi clients could
no longer connect, even when manually specifying the server IP. Server logs didn't
show any errors but it did look like the clients were no longer managing to connect
or query. It seemed that going to &lt;code&gt;http://server-ip-address:32400&lt;/code&gt; should at least
show something in a browser or the logs.&lt;/p&gt;
&lt;p&gt;I wasn't using myPlex and it didn't appear as if they were forcing it in a recent
release. I was eventually tipped off by this comment in a &lt;a href="http://elan.plexapp.com/2012/06/04/plex-media-server-v0-9-6-3/"&gt;server release changelog&lt;/a&gt;:-&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(Also, we've updated the Plex for OS X download to fix the code signing issue that
was causing the violent disagreement between it and the OS X firewall. Sorry about that!)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I deleted the entries for 'Plex DLNA Server' and 'Plex Media Server.app' from 
System Preferences -&amp;gt; Security &amp;amp; Privacy -&amp;gt; Firewall -&amp;gt; Firewall Options, restarted
the media server and clicked 'allow incoming connections' again for each.
As if by magic all my clients could connect again!&lt;/p&gt;</content><category term="SysAdmin"></category><category term="Plex"></category><category term="OS X"></category></entry><entry><title>Zypper support for Cuisine</title><link href="https://wamonite.com/zypper-support-for-cuisine.html" rel="alternate"></link><published>2012-10-15T00:00:00+01:00</published><updated>2012-10-15T00:00:00+01:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2012-10-15:/zypper-support-for-cuisine.html</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/fabric/fabric"&gt;Fabric&lt;/a&gt; is a great Python module for deploying
and running software on remote SSH-enabled machines without the need for an array of
terminal windows or mad shell-scripting skills.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sebastien/cuisine"&gt;Cuisine&lt;/a&gt; is a Python module adding high-level
administrative functions to Fabric (similar to &lt;a href="http://www.opscode.com/chef"&gt;Chef&lt;/a&gt;
for Ruby).&lt;/p&gt;
&lt;p&gt;I'd been using Fabric for a …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/fabric/fabric"&gt;Fabric&lt;/a&gt; is a great Python module for deploying
and running software on remote SSH-enabled machines without the need for an array of
terminal windows or mad shell-scripting skills.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sebastien/cuisine"&gt;Cuisine&lt;/a&gt; is a Python module adding high-level
administrative functions to Fabric (similar to &lt;a href="http://www.opscode.com/chef"&gt;Chef&lt;/a&gt;
for Ruby).&lt;/p&gt;
&lt;p&gt;I'd been using Fabric for a while but wanted to use Cuisine to automate production
and build system configuration, but was out of luck with package management dependencies.
We use openSUSE which uses &lt;a href="http://en.opensuse.org/Portal:Libzypp"&gt;Zypper&lt;/a&gt; while Cuisine
only supported 'apt' and 'yum'. It was too useful not to have, so by the power of
open source I &lt;a href="https://github.com/wamonite/cuisine"&gt;remedied that&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's an example &lt;code&gt;fabfile.py&lt;/code&gt; to ensure FFmpeg is installed from the Packman repository:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-python"&gt;from cuisine import select_package, package_ensure, repository_ensure_zypper

select_package(&amp;quot;zypper&amp;quot;)

def installFFmpeg():
  repository_ensure_zypper(&amp;quot;http://packman.inode.at/suse/openSUSE_11.4/packman.repo&amp;quot;)
  package_ensure(&amp;quot;ffmpeg&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This could be executed repeatedly without ill effect on the remote hosts &lt;code&gt;peppa&lt;/code&gt; and &lt;code&gt;yaffle&lt;/code&gt;
with the following call:-&lt;/p&gt;
&lt;pre class="highlight line-numbers"&gt;&lt;code class="language-python"&gt;fab -u root -H peppa,yaffle installFFmpeg
&lt;/code&gt;&lt;/pre&gt;</content><category term="Dev"></category><category term="Python"></category><category term="Fabric"></category><category term="Cuisine"></category><category term="Zypper"></category></entry><entry><title>My Markdown Essentials</title><link href="https://wamonite.com/my-markdown-essentials.html" rel="alternate"></link><published>2012-10-08T00:00:00+01:00</published><updated>2012-10-08T00:00:00+01:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2012-10-08:/my-markdown-essentials.html</id><summary type="html">&lt;p&gt;From the &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown website&lt;/a&gt;:-&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've taken to using it wherever I can, including content generation for this site, with these …&lt;/p&gt;</summary><content type="html">&lt;p&gt;From the &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown website&lt;/a&gt;:-&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've taken to using it wherever I can, including content generation for this site, with these useful set of tools:-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://markedapp.com/"&gt;Marked&lt;/a&gt;: markdown preview application for OSX.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://brettterpstra.com/project/nvalt/"&gt;nvAlt&lt;/a&gt;: used in conjunction with Marked for super-charged note taking.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.winterwell.com/software/markdown-editor.php"&gt;Markdown editor plugin for Eclipse&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Dev"></category><category term="Markdown"></category></entry><entry><title>Relapse: a Pelican theme using Bootstrap</title><link href="https://wamonite.com/relapse-a-pelican-theme-using-bootstrap.html" rel="alternate"></link><published>2012-10-07T00:00:00+01:00</published><updated>2012-10-07T00:00:00+01:00</updated><author><name>wamonite</name></author><id>tag:wamonite.com,2012-10-07:/relapse-a-pelican-theme-using-bootstrap.html</id><content type="html">&lt;p&gt;New website, new look and first bit of HTML/CSS design in many years. In the spirit
of open source you can find this &lt;a href="http://pelican.notmyidea.org"&gt;Pelican&lt;/a&gt; theme on
&lt;a href="https://github.com/wamonite/relapse"&gt;Github&lt;/a&gt;.&lt;/p&gt;</content><category term="Dev"></category><category term="Pelican"></category><category term="Bootstrap"></category></entry></feed>