<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ianmjones</title>
	<atom:link href="https://www.ianmjones.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.ianmjones.com</link>
	<description>Always developing</description>
	<lastBuildDate>Tue, 20 Apr 2021 21:39:07 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.7.2</generator>

<image>
	<url>https://cdn.ianmjones.com/wp-content/uploads/2020/02/29214956/cropped-ianmjones-process-467x467-2-32x32.png</url>
	<title>ianmjones</title>
	<link>https://www.ianmjones.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AlwaysDeveloping.show is now on YouTube</title>
		<link>https://www.ianmjones.com/alwaysdeveloping-show-is-now-on-youtube/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 20 Apr 2021 21:39:07 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=612</guid>

					<description><![CDATA[The Always Developing podcast is dead, long live AlwaysDeveloping.show! As heavily hinted in my 4th goal for 2021, I've decided that the Always Developing podcast was not working out. So instead I am &#34;live coding&#34; on YouTube. I'll let the blurb from the about page explain what it's all about... Live coding an app with &#8230; <a href="https://www.ianmjones.com/alwaysdeveloping-show-is-now-on-youtube/" class="more-link">Continue reading <span class="screen-reader-text">AlwaysDeveloping.show is now on YouTube</span></a>]]></description>
										<content:encoded><![CDATA[<p>The Always Developing podcast is dead, long live <a href="https://www.youtube.com/c/IanJonesDev/" title="AlwaysDeveloping.show">AlwaysDeveloping.show</a>!</p>
<p>As heavily hinted in my <a href="https://www.ianmjones.com/2021-goals/#goal4">4th goal for 2021</a>, I've decided that the Always Developing podcast was not working out. So instead I am &quot;live coding&quot; <a href="https://www.youtube.com/c/IanJonesDev/">on YouTube</a>.</p>
<p>I'll let the blurb from the <a href="https://www.youtube.com/c/IanJonesDev/about">about page</a> explain what it's all about...</p>
<blockquote>
<p>Live coding an app with SvelteJS, Go, CockroachDB, and Juju Charms in Python. Sometimes Linux desktop app or WordPress plugin development too.</p>
<p>Before starting every work day, I do half an hour of noodling on side projects, making sure to keep them moving forward, albeit slowly.</p>
<p>Working on these side projects is how I learn new programming languages, frameworks and technologies.</p>
<p>Chances are I'll fail miserably each and every day, so at the very least you can take comfort in seeing a so-called senior developer fumbling through some development with little success.</p>
</blockquote>
<p>Because live streaming sounds like an absolute nightmare for concentration, and the goal is to lean and keep progressing my side projects, it's recorded coding sessions. However, I am recording them &quot;live&quot; with <a href="https://obsproject.com/">OBS</a>, and not editing them except for editing out any sensitive data (once so far), or should there be some sort of interruption (none yet <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" />).</p>
<p>And true to the description on YouTube, there has already been plenty of opportunities to learn from my mistakes in the <a href="https://www.youtube.com/playlist?list=PLDWtdmaxq1few8CjnK4MC3LLBMVpi_aCS" class="broken_link">10 episodes</a> I've recorded so far (11 if you include the short follow-up <a href="https://www.youtube.com/watch?v=nzY6nAqlNn4&amp;list=PLDWtdmaxq1few8CjnK4MC3LLBMVpi_aCS&amp;index=10">episode 9.1</a>).</p>
<p>The idea of doing half an hour of development every day was inspired by one of <a href="https://www.youtube.com/c/AndreasKling">Andreas Kling's</a> <a href="https://www.youtube.com/playlist?list=PLMOpZvQB55bd_1pkBL-ExXgDPdf__IU25" class="broken_link">Car talk</a> episodes. In <a href="https://www.youtube.com/watch?v=mDqn-YAXCtI">Car talk: My technique for discipline</a> he was answering a question on how he is able to be so disciplined. His answer was basically that he's not disciplined, he just has a routine that works well for him. He also mentioned that even if you could do half an hour of something every day, it would add up nicely over a year.</p>
<p>Given that I work approx 46 weeks in a year, that's 115 hours worth of half hours before work. That amounts to about 15 professional days for me (I do 7.5 hours per day). 3 weeks of pure coding days (which never ever happens in a real job) should produce something of worth, and at the very least I will learn a lot.</p>
<p>I'm doing the coding before work for a couple of reasons:</p>
<ol>
<li>
<p>The first and most important is that it's easy for me to slot in half an hour as part of my pre-work routine, just after having breakfast while catching up on that there internet thing. If I tried to schedule something in the evening I would forever be skipping the session for some reason or another as evenings are much less structured for me. There's always the problem of motivation in the evenings too, YouTube isn't going to watch itself you know, someone's got to do it. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f61c.png" alt="😜" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
</li>
<li>
<p>The second is that I have a daily 10am stand-up meeting with my team mate <a href="https://twitter.com/eriktorsner">Erik</a> which forces a hard stop, giving me a sense of time scarcity to concentrate my mind and reason to step away and come back with fresh eyes.</p>
</li>
</ol>
<p>And so far it's worked out well. My very first attempt on April 1st 2021 didn't go so well though, and has been trashed. In that joke of a recording session I was trying to also code at my standing desk, which I never do, and it just didn't work at all. I struggled to use the keyboard properly, and what with trying to code and talk at the same time too, it was a fool's errand. I should have known given the date.</p>
<p>Since then I've been sitting at my desk, so am way more comfortable, and haven't been trying so hard to explain absolutely everything that's gong on. I haven't really properly introduced what I'm working on either, as each session needs to stand on it's own feet.</p>
<p>It's still very very early days and I've a lot to learn about live coding and recording etc, let alone learn all the development technologies I'm working with, but I'm enjoying it and making progress.</p>
<p>So head on over to <a href="https://www.youtube.com/c/IanJonesDev/">YouTube</a> and start watching me fumble my way through learning some stuff!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>This is why I like the snap store</title>
		<link>https://www.ianmjones.com/this-is-why-i-like-the-snap-store/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 04 Mar 2021 08:38:04 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=601</guid>

					<description><![CDATA[Just one full day after releasing Snippet Pixie 1.5.1 on the snap store, and 75% of users have it already. For a software developer, seeing this level of rapid deployment of a new release is awesome. Having users using the latest version quickly and easily helps get bug fixes out rapidly, which in turn reduces &#8230; <a href="https://www.ianmjones.com/this-is-why-i-like-the-snap-store/" class="more-link">Continue reading <span class="screen-reader-text">This is why I like the snap store</span></a>]]></description>
										<content:encoded><![CDATA[<p>Just one full day after releasing Snippet Pixie 1.5.1 on the <a href="https://snapcraft.io/snippetpixie">snap store</a>, and 75% of users have it already.</p>
<p><a href="https://cdn.ianmjones.com/wp-content/uploads/2021/03/04082455/snippetpixie-snap-at-75-percent-adoption-in-one-day.png"><img src="https://cdn.ianmjones.com/wp-content/uploads/2021/03/04082455/snippetpixie-snap-at-75-percent-adoption-in-one-day.png" alt="Graph showing Snippet Pixie 1.5.1 at 75% adoption in 1 day" /></a></p>
<p>For a software developer, seeing this level of rapid deployment of a new release is awesome. Having users using the latest version quickly and easily helps get bug fixes out rapidly, which in turn reduces the chances of the user having problems and needing support.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Snippet Pixie 1.5.0</title>
		<link>https://www.ianmjones.com/snippet-pixie-1-5-0/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sun, 28 Feb 2021 16:12:46 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=597</guid>

					<description><![CDATA[I've just realised that I forgot to post that Snippet Pixie 1.5.0 was released, almost 4 months ago! Here's what the 1.5.0 released included: Added search of Snippets in main window. Added last used Snippets shown first in Search and Paste window. Added shortcuts for main window actions such as Add Snippet (Ctrl+n). Added support &#8230; <a href="https://www.ianmjones.com/snippet-pixie-1-5-0/" class="more-link">Continue reading <span class="screen-reader-text">Snippet Pixie 1.5.0</span></a>]]></description>
										<content:encoded><![CDATA[<p>I've just realised that I forgot to post that <a href="https://github.com/bytepixie/snippetpixie/releases/tag/1.5.0">Snippet Pixie 1.5.0 was released</a>, almost 4 months ago!</p>
<p>Here's what the 1.5.0 released included:</p>
<ul>
<li>Added search of Snippets in main window.</li>
<li>Added last used Snippets shown first in Search and Paste window.</li>
<li>Added shortcuts for main window actions such as Add Snippet (<code>Ctrl+n</code>).</li>
<li>Added support for system Light and Dark appearance preference.</li>
<li>Improved theming of window controls to be more consistent with system.</li>
</ul>
<p>Being able to search snippets in the main window is very useful while adding or editing snippets, especially once you've accumulated quite a few.</p>
<p>Over time I've found that I tend to use the same handful of snippets over and over again while working in a particular context. So this release now orders the entries shown in the Search &amp; Paste window by most recently used first, whether there's a search or not. This has proven to be a huge productivity boost for me.</p>
<p>Once you've got a good library of snippets created, adding shortcuts to the main window in this release doesn't really make much difference to you as you rarely using that window. However, when you're starting out with Snippet Pixie or in a phase of editing a bunch of existing snippets, this new feature will be very helpful.</p>
<p>The last two entries in the release notes relate to how the main and search &amp; paste windows are themed. If a Linux desktop supports light and dark themes, Snippet Pixie should now switch its styling according to the user's preference. Along with that came a reduction in custom styling for Snippet Pixie, it's now using standard colours for the header bar and pretty much everywhere else so that it can easily switch between light and dark, and generally fit in with whatever desktop is in use.</p>
<p>Snippet Pixie 1.5.0 is available from the  <a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie">elementary OS AppCenter</a>, the <a href="https://snapcraft.io/snippetpixie">Snap Store</a>, and <a href="https://search.nixos.org/packages?channel=unstable&amp;show=snippetpixie&amp;from=0&amp;size=50&amp;sort=relevance&amp;query=snippetpixie">nixpkgs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2021 Goals</title>
		<link>https://www.ianmjones.com/2021-goals/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Fri, 01 Jan 2021 18:19:03 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=573</guid>

					<description><![CDATA[At the end of my 2020 Year in Review post I mentioned that I intend to write up some goals for 2021 so that we can all have a good laugh at how badly I fail to achieve them in a 2021 Year in Review post. So here we are, let's do this! To me, &#8230; <a href="https://www.ianmjones.com/2021-goals/" class="more-link">Continue reading <span class="screen-reader-text">2021 Goals</span></a>]]></description>
										<content:encoded><![CDATA[<p>At the end of my <a href="https://www.ianmjones.com/2020-year-in-review/">2020 Year in Review</a> post I mentioned that I intend to write up some goals for 2021 so that we can all have a good laugh at how badly I fail to achieve them in a 2021 Year in Review post. So here we are, let's do this!</p>
<p>To me, goals are worthless unless they're <a href="https://en.wikipedia.org/wiki/SMART_criteria">S.M.A.R.T</a>. There's a few variants of what SMART stands for, but the version I learnt many moons ago is as follows:</p>
<ul>
<li>Specific - targeting a specific area for improvement</li>
<li>Measurable - progress can be measured numerically</li>
<li>Achievable - has to be attainable</li>
<li>Realistic - has to be achievable within the alotted time span</li>
<li>Time-boxed - there must be a target end date for reaching the goal</li>
</ul>
<p>So, given the above, I'm setting goals for 2021 that cover areas of my life where I feel I need to make significant improvements, or keep on top of and simply not screw up.</p>
<h2 id="business">Business</h2>
<p>My business is software development, that's what I do, and love doing it. However, the vast majority of my income comes from being a contract software developer where I effectively trade time for money.</p>
<p>For a very long time now I've wanted to at least partially supplement my consultancy income with passive income from software products. While I've had some success with this in the past, at present I'm failing bad, with only <a href="https://www.bytepixie.com/wp-table-pixie/">WP Table Pixie</a> and <a href="https://www.snippetpixie.com">Snippet Pixie</a> available as a way of generating passive income. The annual revenue from them combined might just stretch to a nice meal out for the wife and I (finger's crossed we can do that this year).</p>
<p>I don't think either of the above products have much chance of making any significant revenue in the long term, but my <a href="https://www.ianmjones.com/2020-year-in-review/#secret-project">Secret Project</a> might make something worthwhile eventually.</p>
<h3 id="goal1">Goal 1: Release 1 new software product by 01/11/2021</h3>
<p>My little secret project should be available for anyone to sign up for and use by 1st November 2021.</p>
<p>It's important to get the software to Minimum Viable Product and available for use by people I don't know. If it's not available for anyone to use, I can't possibly make any money from it.</p>
<h3 id="goal2">Goal 2: Secret Project earns $10 MRR by 31/12/2021</h3>
<p>My little secret project should have however many paying customers it needs to be earning $10 USD per month by 31st December 2021.</p>
<p>Just having that validation is key here, I can worry about growing revenue in the future. I need to do whatever it takes to get people interested in, trying and paying for it. There's a lot to that beyond simply making the product available for sign up.</p>
<p>The product may not even be something you pay for on a monthly basis, but there'll be some way of working out a monthly recurring revenue figure.</p>
<h2 id="personal-growth">Personal Growth</h2>
<p>While I've learnt a lot in relation to programming in 2020 having picked up <a href="https://www.ianmjones.com/2020-year-in-review/#secret-project">Go, Svelte, and some ancillary technologies</a>, I've really not grown my social skills as I had hoped.</p>
<p>On the face of things you'd think growing my social skills is a bit of a hard goal to quantify, but I think I have two goals that will achieve what I want in terms of helping me communicate better and improve my interactions with the World at large.</p>
<h3 id="goal3">Goal 3: Write 12 blog posts by 31/12/2021</h3>
<p>There should be a new blog post published on this site every month, for a total of 12 posts by the end of the year. While the goal is to have 12 new posts by the end of the year, I really mean to publish something every month.</p>
<p>I need to greatly improve my writing skills, and just writing something that is publicly available at least once per month should help with that.</p>
<p>I'm not even worried about how big each post is, or how profound it may be, I just need to write something on this blog.</p>
<p>I'm already over achieving on this goal as this post and <a href="https://www.ianmjones.com/2020-year-in-review/">2020 Year in Review</a> are definitely going to count! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f606.png" alt="😆" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h3 id="goal4">Goal 4: Release 6 episodes of Always Developing by 31/12/2021</h3>
<p>It doesn't matter whether I decide to release audio or video, but by the end of the year there must be 6 new episodes of <a href="https://www.ianmjones.com/podcast">Always Developing</a> available.</p>
<h2 id="health-fitness">Health &amp; Fitness</h2>
<p>I've been really lazy in 2020, and my strength and suppleness have suffered as a consequence. I've noticed this simply when going for longer walks with my daughter, or doing various DIY tasks around the house this year. Getting more fit and healthy will not only directly improve my quality of life, but is also very important for those that I love.</p>
<h3 id="goal5">Goal 5: Practice strength yoga 156 times by 31/12/2021</h3>
<p>That's 3 times per week of doing either <a href="https://www.alomoves.com/series/yoga-strength-basics-for-beginners">Yoga Strength Basics for Beginners</a> or <a href="https://www.alomoves.com/series/beginner-yoga-strength-classes">Beginner Yoga Strength Classes</a>.</p>
<p>These classes should help me achieve both increased strength and suppleness over time. I'm intending to start my day off by following these classes before sitting down for breakfast, catching up on the internet, and starting my work day. The classes have built in rest days, but my intent is to limit the sessions to work days, and leave weekends for other activities.</p>
<h2 id="summary">Summary</h2>
<p>While five goals is quite a bit to juggle at one time, there's two sets of two that go hand in hand, and I feel all three areas balance each other and hopefully help one another too.</p>
<p>In January 2022 I'll write a 2021 Year in Review post and include a section reviewing how I got on with these goals.</p>
<p>I might even do an interim post at some point in the year to see how things are going and whether any course corrections have been required. That'll at least help with <a href="#goal3">goal 3</a> anyway!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2020 Year in Review</title>
		<link>https://www.ianmjones.com/2020-year-in-review/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Fri, 01 Jan 2021 01:01:59 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=548</guid>

					<description><![CDATA[I don't normally do year in review posts, but I feel like 2020 warrants one. Probably to satisfy a longing for closure, and to mark the beginning of what I hope will be a much more positive year. That's not to say that 2020 has been a terrible year for me and my family, or &#8230; <a href="https://www.ianmjones.com/2020-year-in-review/" class="more-link">Continue reading <span class="screen-reader-text">2020 Year in Review</span></a>]]></description>
										<content:encoded><![CDATA[<p>I don't normally do year in review posts, but I feel like 2020 warrants one. Probably to satisfy a longing for closure, and to mark the beginning of what I hope will be a much more positive year.</p>
<p>That's not to say that 2020 has been a terrible year for me and my family, or for my business. In a lot of respects it's been a relatively positive year compared to some people's, but still, there's been ups and downs.</p>
<h2 id="business">Business</h2>
<p>I'm very fortunate to have been working with <a href="https://deliciousbrains.com">Delicious Brains</a> as a senior software developer for over 6 years now. As a fully 100% remote company, the COVID-19 pandemic didn't disrupt the daily work routine too much as we're all already working from home.</p>
<p>I continued to work on <a href="https://deliciousbrains.com/wp-offload-media/">WP Offload Media</a> this year, a WordPress plugin that I'm very passionate about and keen to keep on moving forward.</p>
<p>At the beginning of the year I was the primary developer on WP Offload Media, in a team with <a href="https://twitter.com/mattgrshaw">Matt</a>, who primarily worked on <a href="https://deliciousbrains.com/wp-offload-ses/">WP Offload SES</a>. We bounced ideas off of each other and reviewed each other's code etc, but for the most part just got on with our work.</p>
<p>This worked ok, but WP Offload Media has become a bit of a victim of its own success, as the support load has increased significantly over time as more and more WordPress site owners rather than site developers have started using the plugin, and they tend to have less experience with cloud storage, content delivery networks, DNS, and general WordPress admin. Matt and I found ourselves doing quite a lot of support, and much less development on our respective plugins.</p>
<p>We weren't the only ones at Delicious Brains to be struggling with support detracting from development, <a href="https://deliciousbrains.com/wp-migrate-db-pro/">WP Migrate DB Pro</a> and <a href="https://spinupwp.com/">SpinupWP</a> also had the same problem as they saw increased popularity too.</p>
<p>Luckily <a href="https://twitter.com/bradt">Brad</a> (owner of Delicious Brains) recognised the problem and has been effectively on full time recruitment duty for as long as I can remember now!</p>
<p>Since early on in the year we've had dedicated 1st line support staff trialled and come on board to help with the more administrative and technical sales style support requests for all our products. They've seriously improved the life for us software developers, and for <a href="https://twitter.com/caillie_west">Caillie</a> who was helping us out as much as she could, detracting from her primary role too.</p>
<p>We've also had developers come on board this year to help speed up the development of all our products at Delicious Brains, along with a little shake up of the teams.</p>
<p>For me this meant losing Matt as he's now working with <a href="https://twitter.com/petetasker">Pete</a> on WP Migrate DB Pro, but getting a brand new team member on WP Offload Media, <a href="https://twitter.com/eriktorsner">Erik</a>.</p>
<p>Erik has gotten off to a flying start, we threw him in at the deep end and he's taken to it like a shark.</p>
<p>With there being no chance of a company retreat in 2020, and a general feeling of increased isolation, we've also started doing per team 10 minute stand-up video calls early in the day. For me this has been a massive improvement. Getting just a bit of face time with Erik each day helps immensely, not just for sorting out development related stuff, but for getting to know my Swedish team mate.</p>
<p>Another change at Delicious Brains was <a href="https://twitter.com/polevaultweb/">Iain</a> switching to being a product manager rather than developer. While this happened relatively recently, this too has been a welcome change as Iain has already taken on some of the general product management tasks that detract from development time, but also brings in a different slant on things that I struggle to see myself.</p>
<p>Erik, Iain and I are working on some big things for WP Offload Media, and I'm particularly looking forward to 2021 as I've got some interesting and fun development lined up.</p>
<h2 id="side-projects">Side Projects</h2>
<p>For the most part my side projects have suffered from a lack of attention this year. While I've managed to throw myself into my work at Delicious Brains, all the goings-on in the World have been quite distracting and left me less inclined to work on stuff in my spare time.</p>
<h3 id="snippet-pixie">Snippet Pixie</h3>
<p>The most active of my side projects this year was <a href="https://www.snippetpixie.com">Snippet Pixie</a>, the little text snippet expander application for Linux that has been used quite a lot while writing this post! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>At various times throughout the year I've got the madness for improving Snippet Pixie and worked many hours to release almost complete rewrites or bug fix releases. Apparently <a href="https://github.com/bytepixie/snippetpixie/releases">seven in total</a>.</p>
<p>Developing a snippet manager for Linux has turned out to be quite a tall order, it's harder than it might at first seem. However, once I switched full time to Linux in the summer, it became incredibly important that I had a reliable desktop text expander, and <a href="https://www.ianmjones.com/snippet-pixie-1-4-0-released/">version 1.4.0 was born</a>. This release of Snippet Pixie threw away the notion of universal automatic expansion and conceded that hot-key expansion was a much more reliable mechanism for the many non-native applications that are used on Linux these days.</p>
<p>I'm very proud of Snippet Pixie, and use it many times every day. I think in 2021 I need to work on making it better known in the Linux community, listen out for what people want from it, but otherwise just keep it true to its core reason for being and keep it ticking along.</p>
<p>There are some potential ways I could make a little income from Snippet Pixie in the future by offering some adjacent services that also help push it forward, but I'm not sure it's quite ready for that yet.</p>
<h3 id="wordpress-plugins">WordPress Plugins</h3>
<p>I have two WordPress plugins that I maintain on the side, <a href="https://www.bytepixie.com/wp-table-pixie/">WP Table Pixie</a> and <a href="https://wordpress.org/plugins/wp-cron-pixie/">WP Cron Pixie</a>. Neither are particularly popular, or have received much attention from me this year.</p>
<p>WP Cron Pixie is completely free, and was originally born from a <a href="https://deliciousbrains.com/building-reactive-wordpress-plugins-part-3-elm/">blog series I did for Delicious Brains</a>. It just ticks along and does its thing. I use it quite a bit, have kept it up to date as the underlying technology changes, but otherwise it just exists. I have a vague notion of revamping it by rewriting the front end with <a href="https://svelte.dev/">Svelte</a>, and back end with <a href="https://developer.wordpress.org/rest-api/">WP-REST</a>, but that's maybe best left until I get the green light to add a part 4 to the blog series for it (which is unlikely as there's many more things we can blog about).</p>
<p>WP Table Pixie is freemium, there's a <a href="https://wordpress.org/plugins/wp-table-pixie/">read-only plugin on wp.org</a>, and you can upgrade to the premium version to add editing of postmeta, options and other metadata records. Apart from keeping it compatible with WP I've not worked on WP Table Pixie this year, mainly because it seems to be a very niche product, makes very little money, and I'm not sure it will ever have much of an audience. It's a little frustrating as it's a plugin I use virtually every day when helping WP Offload Media customers, it's great for checking what's really going on in a WordPress site's Media Library data. I seriously considered just making WP Table Pixie completely free this past year, but lack of time, a few more sales than I expected, and that little voice in the back of my head saying I should maybe give it another go kept me from doing it. I'm not sure what's in store for WP Table Pixie in 2021, it may be a make or break year.</p>
<h3 id="podcasting">Podcasting</h3>
<p>In August 2018 I started the RustyElm podcast, a microcast journal of my attempt to learn the Rust and Elm programming languages.</p>
<p>In March 2020 I finally admitted defeat and started a new podcast called <a href="https://www.ianmjones.com/000-why-always-developing-exists/">Always Developing</a>.</p>
<p>And then there were tumble weeds.</p>
<p>I've not podcasted again since that &quot;reboot&quot;.</p>
<p>It's weird because I've been continuously developing software and enjoying it ever since that first Always Developing podcast episode. The problem is I've just not felt that my rambling on about what I've been up to is particularly interesting.</p>
<p>I seriously considered doing some (not so) live streaming of me working on Snippet Pixie or my <a href="#secret-project">Secret Project</a>, even have an <a href="https://obsproject.com/">OBS</a> setup for it, but just not the confidence to actually do it.</p>
<p>I'm a pretty private person, and so social media and tooting my own trumpet in public does not come easy. While my colleagues at Delicious Brains hear my views on subjects more readily than they probably wish, I'm not one for spouting my opinions to people that I don't know. Yes, I'm your typical nerdy introvert, until comfortable enough.</p>
<p>Podcasting was going to be a means for me to combat these tendencies, to improve my social skills, get a few things off my chest and journal, kinda. So far it hasn't worked out, but maybe I'll find a format for podcasting or similar in 2021 that'll help me come out of my shell.</p>
<h3 id="secret-project">Secret Project</h3>
<p>There's a little side project that I've worked on every now and then for at least 16 years now. It's been a tiny little bit of software that I use as a project to test new programming languages and technologies on. It's a great vehicle for learning, has had many incarnations in desktop, mobile and web forms with many languages, and has never ever got past prototype status, even though I've had spells of using it consistently to great success.</p>
<p>In 2020 I started playing with it again, this time using <a href="https://golang.org/">Go</a> for the back end with <a href="https://www.cockroachlabs.com/">CockroachDB</a> as the database, and <a href="https://svelte.dev/">Svelte</a> (<a href="https://sapper.svelte.dev/">Sapper</a>) for the front end. I've thoroughly enjoyed working on it, including taking a bit of a detour into writing <a href="https://juju.is/">Juju Charms</a> in <a href="https://www.python.org/">Python</a> for deployment.</p>
<p>For Go and Svelte I've done my usual deep dive into the technology, thoroughly absorbing them, reading through tutorials and getting to know them well before properly launching into developing with them. It's been a blast, they're both fantastic platforms that just make sense to me.</p>
<p>When I decided to write a custom Juju Charm for the project (which has now ballooned to 3 charms by the way), I took a very different tact to picking up Python in order to work with the <a href="https://github.com/canonical/operator">Operator framework</a>. For this I tried what I call &quot;Stackoverflow&quot; mode, no deep diving, just trying to get somewhere by searching <a href="https://duckduckgo.com/">DuckDuckGo</a> or <a href="https://stackoverflow.com/">Stackoverflow</a> for answers and perusing existing code on <a href="https://github.com">GitHub</a>.</p>
<p>I'm not sure I would ever recommend this style of learning, but it's been relatively effective for the task at hand given that the Juju Charms I've been working on aren't the primary focus of development. As I write this it's been the part of the project I've worked on the most recently, partly because it's been just such fun. Juju is a wonderful system, and Python is a very easy language to accomplish tasks with.</p>
<p>This little side project has had enough iterations now that I think I should probably just make a commitment to it and take it seriously this coming year. It's nothing Earth shattering, but it may be helpful to some people, enough that they're willing to pay a few quid for it. So I think 2021 might be the year that it finally gets properly worked on and released.</p>
<h2 id="personal">Personal</h2>
<p>If you've got this far you may be under the impression that 2020 has been a bit of a quiet year for me in terms of business and side projects. Thankfully it's also been very quite in my personal and family life too.</p>
<p>Although the pandemic has seriously dampened our plans for celebrating some big family birthdays and anniversaries this year, my family and friends have all managed to stay safe and weather the storm.</p>
<p>There's been a lot of &quot;in 2021 we'll ...&quot;, and hopefully that'll all come to pass, but really I just hope we all continue to stay safe and healthy throughout the year, and the World in general gets back on its feet.</p>
<p>The one thing I've not really taken care of this year is my fitness. Although I've kept a good healthy weight, somehow, I'm pretty sure I've lost a good bit of strength and suppleness through a lack of exercise this year. That is probably the one major thing I intend to address in 2021 to ensure I'm fitter and healthier for both myself and my family. But that kind of talk is probably better suited to a &quot;goals&quot; post.</p>
<h2 id="2021-goals">2021 Goals</h2>
<p>Seeing as I've broken the habit of not writing year in review posts, I guess I might as well also write a looking forward post too.</p>
<p>Stay tuned for a much much shorter 2021 Goals post, where I'll briefly go over what I hope to achieve in 2021, so that this time next year you and I can laugh at them in a review post. Assuming my goal of writing a 2021 year in review post should come to pass! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f606.png" alt="😆" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Snippet Pixie 1.4.0 Released</title>
		<link>https://www.ianmjones.com/snippet-pixie-1-4-0-released/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 02 Sep 2020 23:44:56 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=522</guid>

					<description><![CDATA[I give up, there's no way to get Snippet Pixie to auto-expand snippets while typing in non-accessible applications such as browsers or those developed with Electron etc. I tried monitoring keystrokes at a higher level for tell-tale snippet triggers, then faking keystrokes to backtrack select characters and check the select clipboard for an abbreviation match. &#8230; <a href="https://www.ianmjones.com/snippet-pixie-1-4-0-released/" class="more-link">Continue reading <span class="screen-reader-text">Snippet Pixie 1.4.0 Released</span></a>]]></description>
										<content:encoded><![CDATA[<p>I give up, there's no way to get <a href="https://www.snippetpixie.com">Snippet Pixie</a> to auto-expand snippets while typing in non-accessible applications such as browsers or those developed with Electron etc.</p>
<p>I tried monitoring keystrokes at a higher level for tell-tale snippet triggers, then faking keystrokes to backtrack select characters and check the select clipboard for an abbreviation match. This turned out to be a rather resource intensive and flaky method of working out whether a snippet should then be stuffed into the clipboard and pasted over the selection.</p>
<p>I iterated on that method a lot, came up with some routines that made it more and more reliable and performant, but still, some times you had to wait for the checking to do its thing and could often see the selection walking when the error correction and retries kicked in to combat the temperamental async Linux clipboard. If you created any abbreviations that ended in commonly used letters or punctuation characters then you could often find yourself frustratedly waiting for Snippet Pixie to fail so you could carry on typing.</p>
<p>I created a snippet on purpose that I knew would piss me off, it ended in a &quot;$&quot;. I did this to drive my desire to improve the algorithm whenever I was writing code for <a href="https://deliciousbrains.com/wp-offload-media/">my day job</a> in PhpStorm, you use <code>$</code> a lot in PHP. It worked to some extent, it caused me enough headaches that I often ended up right clicking Snippet Pixie's icon and hitting &quot;Stop Snippet Pixie&quot; so I could get on with my day. This would impact other areas of my day as I would seriously miss not having a text expander while answering support requests etc. Just silly things, like not wanting to type &quot;WP Offload Media&quot; over and over again, &quot;ome`&quot; is way shorter and easier to type.</p>
<p>A little over a fortnight ago I was using the most excellent <a href="https://appcenter.elementary.io/com.github.cassidyjames.ideogram">Ideogram</a> app by <a href="https://github.com/cassidyjames">Cassidy James Blaede</a> to pop open an emoji picker and pick <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> for the millionth time that day, when it occurred to me that maybe I should just give in, stop fighting non-accessible apps, and also create a shortcut popup window to search for and paste snippets. So that's what I've done.</p>
<p><a href="https://cdn.ianmjones.com/wp-content/uploads/2020/09/02223824/Snippet-Pixie-Search-and-Paste-Window.png"><img src="https://cdn.ianmjones.com/wp-content/uploads/2020/09/02223824/Snippet-Pixie-Search-and-Paste-Window.png" alt="Snippet Pixie&#039;s Search and Paste Window" /></a></p>
<p>You can open Snippet Pixie's &quot;Search and Paste&quot; window at any time by hitting its shortcut, which by default is Ctrl+` (grave).</p>
<p>You can then just start typing the abbreviation or anything you remember from the abbreviation or its contents to narrow down the list of snippets. Hit tab to focus the list, and then either navigate the list with the usual up and down arrows etc and hit Enter on the one you want to use, or hit its number. You can just press Escape or the Ctrl+` shortcut again if you change your mind and don't want to paste a snippet.</p>
<p>When you do choose a snippet from the Search and Paste window it'll close and the expanded text will be sent to the system clipboard and then pasted into whatever app you had open before hitting the shortcut.</p>
<p>It works really well, and the window and general usage pattern may look really familiar to some people. That's because a lot of the code for the Search and Paste window and how it safely closes and pastes is adapted/liberated/borrowed/stolen from <a href="https://appcenter.elementary.io/com.github.davidmhewitt.clipped">Clipped</a> by <a href="https://github.com/davidmhewitt/">David Hewitt</a>.</p>
<p>Until I started this little exercise a couple of weeks ago I'd never actually used Clipped before, but had used some of its code when trying to get Snippet Pixie compatible with browsers etc previously. I was led to that code via comments in Ideogram's own code that first time, it worked well for what I needed those bits to do. When I started thinking about how to do a popup snippet search and paste window I first took a look at Ideogram, but that quickly led me to Clipped again. This time I took a much deeper look at the app's code, and had a play with it, it's fantastic! As much as I love the convenience of snippets, I'd not really used a clipboard manager before, but now that I've got Clipped I'm a convert, it's saved me having to go back and re-copy and paste stuff many times.</p>
<p>Anyway, back to Snippet Pixie. It wasn't all plain sailing, but I was able to adapt a good chunk of code from Clipped for the new search and paste window, sprinkle in some code for working with snippets, showing their abbreviations and bodies, and a few little tweaks here and there, and Bob's your uncle, we have a search and paste window opening from a shortcut. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>While I've now been able to rip out all the janky clipboard code I was using for searching entered text for an abbreviation to auto-expand, auto-expansion is still in place for accessible apps. So if you're a fan of <a href="https://appcenter.elementary.io/com.github.lainsce.quilter">Quilter</a>,  <a href="https://www.libreoffice.org/">LibreOffice</a>, or any other native Linux app that is accessible, then you're all good, type your abbreviation and Snippet Pixie will expand it in-place for you. You don't <em>have</em> to use the shortcut.</p>
<p>However, if you decide that you prefer the shortcut, or maybe still have issues with auto-expansion in accessible apps <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f631.png" alt="😱" class="wp-smiley" style="height: 1em; max-height: 1em;" />, then Snippet Pixie now has a new &quot;Auto expand snippets&quot; setting you can toggle on and off in its revamped preferences menu, which has also gained a &quot;Shortcut&quot; submenu.</p>
<p><a href="https://cdn.ianmjones.com/wp-content/uploads/2020/09/02233801/Snippet-Pixies-New-Preferences-Menu.png"><img src="https://cdn.ianmjones.com/wp-content/uploads/2020/09/02233801/Snippet-Pixies-New-Preferences-Menu.png" alt="Snippet Pixie&#039;s New Preferences Menu" /></a></p>
<p>Oh, yeah, the shortcut, that too was initially inspired by some of Ideogram's code, but I also found some interesting stuff in Clipped regarding being able to change the shortcut. In Snippet Pixie's Shortcut preferences submenu you can change the shortcut from Ctrl+` to whatever suits you best. Just click on the existing shortcut and you'll be asked to type a new one.</p>
<p><a href="https://cdn.ianmjones.com/wp-content/uploads/2020/09/02234223/Snippet-Pixies-New-Shortcut-Preferences-Menu.png"><img src="https://cdn.ianmjones.com/wp-content/uploads/2020/09/02234223/Snippet-Pixies-New-Shortcut-Preferences-Menu.png" alt="Snippet Pixie&#039;s New Shortcut Preferences Menu" /></a></p>
<p>In the above screenshot you can also see a couple of settings related to how the shortcut works.</p>
<p>You can turn on &quot;Search selected text&quot; if you like. When on, if you have any text selected in an app before you hit the Snippet Pixie search and paste shortcut, then that will be used as the initial search for snippets. It's off by default for a reason though. While at first I thought it was an awesome idea, in reality I often found that the search text was being populated with text I didn't expect, such as previously copied text. This is an unfortunate side effect of how the Linux clipboard works, it's quite easy for the &quot;select&quot; (a.k.a Primary) clipboard to end up with the contents of the copy clipboard. That kind of makes sense when you think about how you first select text and then copy it, but it is a bit annoying some times.</p>
<p>However, if you also use the on by default &quot;Focus search box&quot; setting, then it's not a huge deal as you can just start typing to replace what was automatically inserted into the search box. This is a diversion from how Clipped works, which naturally selects the list of previous clipboard entries as you're very likely to want something just recently clipped and therefore it's more convenient. But with Snippet Pixie I find I'm generally searching for an abbreviation anyway, so by default I've switched initial focus to the search box. However, turn off that &quot;Focus search box&quot; setting and the first entry in the list of snippets will be selected when the window opens. This does have its attractions too when &quot;Search selected text&quot; is enabled as you could find you've got a narrow list of snippets to hand and can quickly select the one you want without having to hit the tab key to focus the list first. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f937-200d-2642-fe0f.png" alt="🤷‍♂️" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>So that's it really, <a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie">Snippet Pixie 1.4.0 is now available on the elementary OS AppCenter</a>, and will be available on the <a href="https://snapcraft.io/snippetpixie">Snap Store</a> soon&sup1;.</p>
<p>Here's the changelog for Snippet Pixie 1.4.0:</p>
<ul>
<li>Added Search and Paste window, opened with shortcut Ctrl+` by default.</li>
<li>Added &quot;Auto expand snippets&quot; checkbox to preferences menu for enabling/disabling snippet expansion while typing in accessible apps.</li>
<li>Added ability to change Search and Paste shortcut in preferences menu.</li>
<li>Added preference for whether text selected before using shortcut is used for initial search.</li>
<li>Added option to focus search box when using the search and paste shortcut.</li>
<li>Fixed support for Wayland.</li>
<li>Removed auto expanding of snippets in non-accessible applications such as browsers and electron apps (use shortcut for search and paste window instead).</li>
</ul>
<p>Enjoy!</p>
<hr />
<p>&sup1; I'm holding off on the Snap just now as there's a couple of improvements in 1.4.1 that are important to Snaps, once through review and test I'll promote it to the Snap's stable channel.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>#000: Why Always Developing Exists</title>
		<link>https://www.ianmjones.com/000-why-always-developing-exists/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Mon, 30 Mar 2020 22:59:53 +0000</pubDate>
				<category><![CDATA[podcast]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=421</guid>

					<description><![CDATA[Ian rambles on about why this podcast exists, and why the RustyElm podcast has come to a close.]]></description>
										<content:encoded><![CDATA[<p>Ian rambles on about why this podcast exists, and why the RustyElm podcast has come to a close.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/329-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 26 Mar 2020 21:00:14 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">https://www.ianmjones.com/?p=329</guid>

					<description><![CDATA[Ahhh, love that new server smell. 😀]]></description>
										<content:encoded><![CDATA[<p>Ahhh, love that new server smell. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2020/03/29214958/new-server-smell.jpg" alt="New server with SpinupWP" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/59-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 18 Mar 2020 21:49:34 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2020/03/18/theres-a-new.html</guid>

					<description><![CDATA[There's a new version of WP Cron Pixie! 🎉 WP Cron Pixie 1.4.1 changelog: Fixed wrong data refreshing into non-primary subsite of directory multisite Minor updates to framework and build tools. Tested with WP 5.4]]></description>
										<content:encoded><![CDATA[<p>There's a new version of <a href="https://wordpress.org/plugins/wp-cron-pixie/">WP Cron Pixie</a>! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>WP Cron Pixie 1.4.1 changelog:</p>
<ul>
<li>Fixed wrong data refreshing into non-primary subsite of directory multisite</li>
<li>Minor updates to framework and build tools.</li>
<li>Tested with WP 5.4</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/58-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 17 Mar 2020 22:21:43 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2020/03/17/hello-make-my.html</guid>

					<description><![CDATA[Hello make, my old friend.]]></description>
										<content:encoded><![CDATA[<p>Hello make, my old friend.</p>
<p><a href="https://cdn.ianmjones.com/wp-content/uploads/2020/03/29214959/hello-make-my-old-friend.png"><img src="https://cdn.ianmjones.com/wp-content/uploads/2020/03/29214959/hello-make-my-old-friend.png" alt="screenshot of make running in terminal" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/57-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 05 Mar 2020 09:37:21 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2020/03/05/enjoyed-attending-dttech.html</guid>

					<description><![CDATA[Enjoyed attending #dttech last night, my first @DigitalTaunton event. Liked the format of 2 main talks + 3 lightning talks after a break. Great talks, and very well organised event, a lot of work must have gone into it, congrats to all! 👏]]></description>
										<content:encoded><![CDATA[<p>Enjoyed attending #dttech last night, my first <a href="https://twitter.com/DigitalTaunton">@DigitalTaunton</a> event.</p>
<p>Liked the format of 2 main talks + 3 lightning talks after a break.</p>
<p>Great talks, and very well organised event, a lot of work must have gone into it, congrats to all! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f44f.png" alt="👏" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Snippet Pixie 1.3.1 Released</title>
		<link>https://www.ianmjones.com/snippet-pixie-1-3-1-released/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sun, 01 Mar 2020 17:56:36 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2020/03/01/snippet-pixie-released.html</guid>

					<description><![CDATA[This week I released Snippet Pixie 1.3, with zero new features, but it took many many hours of development. Umm, what? How could you bump Snippet Pixie up a version, and claim to have spent &#34;many many hours&#34; on development, but not have any new features? And isn't this post titled &#34;Snippet Pixie 1.3.1 Released&#34;? &#8230; <a href="https://www.ianmjones.com/snippet-pixie-1-3-1-released/" class="more-link">Continue reading <span class="screen-reader-text">Snippet Pixie 1.3.1 Released</span></a>]]></description>
										<content:encoded><![CDATA[<p>This week I released <a href="https://www.snippetpixie.com">Snippet Pixie</a> 1.3, with zero new features, but it took many many hours of development.</p>
<blockquote>
<p>Umm, what? How could you bump Snippet Pixie up a version, and claim to have spent &quot;many many hours&quot; on development, but not have any new features?</p>
<p>And isn't this post titled &quot;Snippet Pixie 1.3.1 Released&quot;?</p>
</blockquote>
<p>Well, take a look at the gif attached to this post, that's a snippet expanding in <a href="https://standardnotes.org/">Standard Notes</a>, an <a href="https://www.electronjs.org/">Electron</a> based application. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f631.png" alt="😱" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="https://cdn.ianmjones.com/wp-content/uploads/2020/02/29214959/snippet-pixie-working-with-standard-notes-electron.gif"><img src="https://cdn.ianmjones.com/wp-content/uploads/2020/02/29214959/snippet-pixie-working-with-standard-notes-electron.gif" alt="Demo of Snippet Pixie working with Standard Notes (Electron)" /></a></p>
<p>Ok, to some people that might not mean anything, but believe me, it's a major relief to have Snippet Pixie able to work with Electron based apps, and of course, Chrome and Chromium too.</p>
<p>Before v1.3, Snippet Pixie relied on apps using the <a href="https://valadoc.org/atk/index.html">ATK library</a>, or at the very least, doing what's needed to work with the accessibility DBus interfaces that <a href="https://valadoc.org/atspi-2/index.html">AT-SPI</a> interacts with. Further still, the user had to be typing in an <a href="https://valadoc.org/atspi-2/Atspi.EditableText.html">EditableText</a> and <a href="https://valadoc.org/atspi-2/Atspi.Text.html">Text</a> interface compliant control. There are many Linux applications that are ATK/AT-SPI compliant, but unfortunately a few very popular ones are not.</p>
<p>The biggest trouble maker for Snippet Pixie was Chrome, turns out it's quite a popular browser. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>And many companies build cross platform apps with Electron, a technology that basically uses Chrome under the hood, so they weren't working well with Snippet Pixie.</p>
<p>I tried all kinds of things to try and get Chrome and Electron apps to play nice, and there was the odd occasion when a control here and there would actually work with the accessibility framework, but in the end I had to throw out the accessibility stuff and go &quot;old skool&quot;.</p>
<p>Well, I say &quot;throw out the accessibility stuff&quot;, but that's not quite true, and is the reason for v1.3.1, but we'll come to that in a minute.</p>
<p>Snippet Pixie still uses AT-SPI for monitoring keystrokes, but it's using a method that is a little more greedy in its scope, monitoring &quot;all windows&quot; for the current app rather than just the currently focused text control. With this method, Snippet Pixie can see when a key is pressed that matches the last character of some snippet's abbreviation, and then go look to see whether previously entered text matches an abbreviation.</p>
<p>This may sound less performant than monitoring the currently focused text control, and technically it likely is, but, it turns out that with this method I was able to eliminate a huge performance problem that earlier versions of Snippet Pixie suffered.</p>
<p>Snippet Pixie used to have to notice when the current app changed, then go look through all the widgets in that app to try and find the currently focused one, which hopefully was an editable text control. When that app happens to be a spreadsheet with thousands of widgets, that search for the currently focused control (cell) could take a noticeable amount of time. Now, we're not talking minutes here, not even seconds, but if it took even anything near half a second, you'd notice it.</p>
<p>Because Snippet Pixie is now monitoring at a higher level by default, it does not need to go look for a widget to attach monitoring code to. That's a big boost in performance, it no longer feels like Snippet Pixie is slowing down app switching for some apps.</p>
<blockquote>
<p>Hang on a minute, if you no longer know where the text is being entered, how are you checking whether an abbreviation precedes that key stroke that matches the end of one or more abbreviations?</p>
</blockquote>
<p>Blimey, you do ask some very intelligent questions don't you? <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>So this is where a huge amount of time was spent in developing this release. When I first thought of building Snippet Pixie, one of the initial ideas I had for how to get the just entered text was to see if there was a way to walk back through the text with some sort of selection method, and then check the contents of the selection. I didn't get too far in that investigation before finding the accessibility interfaces, which seemed like a much saner approach.</p>
<p>Recently I found out about another open source text expander style app called <a href="https://github.com/federico-terzi/espanso">Espanso</a>. There was an issue raised on the project about the clipboard being overwritten when an expansion happened, or something like that, can't quite remember. But anyway, seeing that made me think that maybe I should take another look at my mad idea of selecting text, stuffing it into the clipboard and then checking the contents of the clipboard.</p>
<p>After much research and experimentation, I eventually managed to get Snippet Pixie to start a text selection by &quot;pressing&quot; the shift key and then &quot;pressing and releasing&quot; the left cursor key, then fake a copy shortcut, check the contents of the clipboard, and then keep hitting the left cursor key until an abbreviation was found, or the max length of known abbreviations was exceeded.</p>
<p>This kind of worked, and once I had an abbreviation match it was a cinch to then stuff the expanded text into the clipboard and fake a paste hotkey. Thanks for the initial code <a href="https://github.com/davidmhewitt/clipped/">Clipped</a>!</p>
<p>Grabbing the selected text into the clipboard wasn't ideal though. It was very flakey, using the copy shortcut for every extra character was hit and miss, and there was some weirdness with the clipboard not always updating.</p>
<p>I learnt a lot about the async mechanisms that the Linux desktop (<a href="https://valadoc.org/gtk+-3.0/Gtk.Clipboard.html">GTK+ based</a> in this case) clipboard uses, and that there's such a thing as a clipboard that most people think about, but also a second selection clipboard that auto populates when text is selected.</p>
<p>With that knowledge to hand, and after much experimentation with threads and strategic yielding and microscopic usleeps (I hate handling threads, but who doesn't?), I finally got a nice mechanism that recognises the abbreviation via selection, and then expands via the clipboard.</p>
<p>Over time I fine tuned the mechanism, and added a bunch of speed ups and error correcting retries to the way abbreviations are searched for, and ensured that the current clipboard is saved away and restored before and after the expansion respectively. The attached gif is intentionally slow so you can see the walk back working, even error correcting, but in general the mechanism is way quicker.</p>
<p>It worked really well with Chrome, Chromium and even Electron apps, but when I tested LibreOffice Writer, which had worked fine with the previous version of Snippet Pixie, it did the most weird things and lost text selection all the time, making abbreviation recognition impossible.</p>
<p>So I brought back the core abbreviation recognition engine of the old accessibility framework dependent mechanism, and sure enough, that still worked with LibreOffice Writer. Well, it wasn't quite that simple, I also had to add back a mechanism for being notified of when an accessible control was focused, and do a bunch of work to dynamically swap between the &quot;all windows&quot; monitoring method and the control based one as appropriate when apps are switched.</p>
<p>I did not need to re-add the old widget lookup code though, and I was able to improve the accessibility based mechanism with the abbreviation lookup speedups and threading from the new text selection mechanism.</p>
<p>In the end I got to a place where the previously supported applications still worked with the faster accessibility based text editing, and added support for a much wider set of applications via the new text selection mechanism.</p>
<p>When I applied those speed ups to the old mechanism that I created while developing the new one, I did miss one problem that necessitated v1.3.1. I used a slightly different monitoring mode with the re-implemented accessibility based code, async rather than blocking, kinda needed as part of the performance improvements and thread usage. Sometimes the control where the text was being entered would report the caret position incorrectly, especially near the beginning of the control, and after initial switch into the app. Turns out I needed to yield the abbreviation checking thread for a split second to let the app get itself together.</p>
<p>There are unfortunately a few apps that remain incompatible with Snippet Pixie 1.3.1.</p>
<p>The one that hurts the most for me is Firefox, my preferred web browser, which at some point in its last few releases started to misbehave when Snippet Pixie was in use. The old accessible method that Snippet Pixie used stopped working for some reason, something must have changed in Firefox to stop keystroke monitoring. I wouldn't be surprised if this was an intentional security measure, but I bet it also stops screen readers from working now.</p>
<p>When forcing use of the new text selection mechanism with Firefox, it keeps losing focus while you're typing, which breaks everything, text stops being entered. To get around this problem temporarily, until I can find a proper solution, or Firefox gets fixed, Snippet Pixie now blacklists Firefox so at least Firefox is usable, even if snippets don't expand.</p>
<p>Similarly, Snippet Pixie has never worked with terminal emulators, their text handling mechanism is fundamentally different. To avoid any potential issues with the new text selection mechanism that Snippet Pixie uses, a bunch of popular terminal emulators are now blacklisted by Snippet Pixie and it turns off abbreviation checking while they're the active application.</p>
<p>This new blacklisting mechanism actually brought to the fore another performance improvement for Snippet Pixie, as turning off the abbreviation checking speeds things up in incompatible apps. And along with this change, Snippet Pixie also monitors less keystrokes in general now too anyway, as if you're using either the <code>Ctrl</code> or left <code>Alt</code> key, as far as I can tell you can't be entering a character. The right <code>Alt Gr</code> key is still monitored in combination with normal keys though as that's how you generally enter extended characters such as € and ¢.</p>
<p>The final incompatibility with Snippet Pixie 1.3.1 is Wayland compositors. This too hurts as I'm a fan of <a href="https://swaywm.org/">Sway</a>, but alas the way I've had to implement active window / app checking is via <a href="https://valadoc.org/libwnck-3.0/Wnck.html">libwnck</a>, which unfortunately only supports X11.</p>
<p>I'm actively trying to find either an alternative robust method of tracking the current application that works in X11 and Wayland, or an additional Wayland only method that I can use when Wayland is detected.</p>
<p>So I guess you could maybe class the expanded compatibility and vastly improved performance as new features, but even if you don't, I'm sure you can see why I bumped the version from 1.2.x to 1.3.x.</p>
<p>Anyway, that was a bit of a rambling retrospective into what went into Snippet Pixie 1.3.1. Hope you enjoy this release, please submit bugs and feature requests in the <a href="https://github.com/bytepixie/snippetpixie/issues">GitHub repo</a>.</p>
<p><a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie"><img src="https://appcenter.elementary.io/badge.svg?new" alt="Get" /></a></p>
<p><a href="https://snapcraft.io/snippetpixie"><img src="https://snapcraft.io/static/images/badges/en/snap-store-black.svg" alt="Get" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/55-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 18 Dec 2019 11:43:16 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/12/18/fyi-if-you.html</guid>

					<description><![CDATA[FYI, if you try to circumvent paying for support for a client's product I work on by bombarding my personal email address, my contact page, or any other means that are not a proper support channel, I'm still not going to reply to your vague mess of a support request! 👿]]></description>
										<content:encoded><![CDATA[<p>FYI, if you try to circumvent paying for support for a client's product I work on by bombarding my personal email address, my contact page, or any other means that are not a proper support channel, I'm still not going to reply to your vague mess of a support request! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f47f.png" alt="👿" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/54-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Mon, 16 Dec 2019 19:54:58 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/12/16/til-enabling-bootcleantmpdir.html</guid>

					<description><![CDATA[TIL: enabling boot.cleanTmpDir on NixOS can solve the most head-scratchy of head-scratchy things!]]></description>
										<content:encoded><![CDATA[<p>TIL: enabling <code>boot.cleanTmpDir</code> on NixOS can solve the most head-scratchy of head-scratchy things!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/53-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sun, 24 Nov 2019 16:47:32 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/11/24/yay-after-a.html</guid>

					<description><![CDATA[Yay, after a couple of days painting the landing I'm finally at podcast zero! 🎉 (there may have been a good bit of podcast culling and skipping too)]]></description>
										<content:encoded><![CDATA[<p>Yay, after a couple of days painting the landing I'm finally at podcast zero! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> (there may have been a good bit of podcast culling and skipping too)</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/52-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 01 Oct 2019 12:02:31 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/10/01/i-just-wrote.html</guid>

					<description><![CDATA[I just wrote about How I Use tmux For Local Development across on the Delicious Brains blog. If you use the command line at all, you should check it out!]]></description>
										<content:encoded><![CDATA[<p>I just wrote about <a href="https://deliciousbrains.com/tmux-for-local-development/">How I Use tmux For Local Development</a> across on the Delicious Brains blog.</p>
<p>If you use the command line at all, you should check it out!</p>
<p><a href="https://deliciousbrains.com/tmux-for-local-development/"><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/10/29215000/how-i-tmux-for-local-development-scaled.jpg" alt="How I Use tmux For Local Development header image" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Dependency Hell</title>
		<link>https://www.ianmjones.com/dependency-hell/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 30 Jul 2019 22:11:10 +0000</pubDate>
				<category><![CDATA[podcast]]></category>
		<guid isPermaLink="false">http://rustyelm.micro.blog/2019/07/30/dependency-hell.html</guid>

					<description><![CDATA[Hello, my name is Ian Jones, and this is the RustyElm microcast, a short, very ad-hoc journal of my attempt to learn Rust and Elm in order to build a side project. So, I've finally had some time over the last week or so to get stuck into my Rust and Elm project, starting by &#8230; <a href="https://www.ianmjones.com/dependency-hell/" class="more-link">Continue reading <span class="screen-reader-text">Dependency Hell</span></a>]]></description>
										<content:encoded><![CDATA[<p>Hello, my name is Ian Jones, and this is the RustyElm microcast, a short, very ad-hoc journal of my attempt to learn Rust and Elm in order to build a side project.</p>
<p>So, I've finally had some time over the last week or so to get stuck into my Rust and Elm project, starting by trying to get the Rust based server up and running.</p>
<p>Getting a server up and running with a simple &quot;Hello World&quot; is a doddle with <a href="https://rocket.rs/">Rocket</a>, and I had fun playing with the basics of request guards etc. to easily handle calls to /hello/<name> and similar play things to get a grip on how it hangs together.</p>
<p>However, I then made the mistake of jumping into taking a look at how to use the <a href="https://github.com/graphql-rust/juniper">Juniper</a> crate along with Rocket for creating a <a href="https://graphql.org/">GraphQL</a> server. Things very quickly came unstuck as I tried to work through a seemingly endless amount of errors that frankly made no sense to me as I have very little experience with the Rust compiler. I tried following the <a href="https://graphql-rust.github.io/juniper/current/quickstart.html">quick start guide</a> but even that had problems when implemented in Rocket with slight modifications as per the integration docs, and its <a href="https://github.com/graphql-rust/juniper/blob/master/juniper_rocket/examples/rocket_server.rs">example on GitHub</a>. The problems seemed to be related to dependencies, I could never get the derive macros to work properly.</p>
<p>Eventually I came to my senses and decided that maybe I should attempt setting up a couple of simple REST routes that <a href="https://rocket.rs/v0.4/guide/responses/#json">return JSON</a> first, that's built into Rocket, and in the simple case doesn't need hardly any dependencies.</p>
<p>It worked fine, changing the existing play routes to return JSON was easy. Tiny steps for the win!</p>
<p>Then it was time to connect up a database and grab some data from it. I thought it would be relatively simple, as again, I was going to use functionality that is effectively <a href="https://rocket.rs/v0.4/guide/state/#databases">built into Rocket</a> for accessing a database via the <a href="https://diesel.rs/">Diesel ORM</a>.</p>
<p>I have some data I can use from an existing prototype of the application I'm building, the prototype currently uses an <a href="https://sqlite.org/">SQLite</a> database and I have a couple of shell scripts and accompanying SQL scripts built that can extract the data and import it into a <a href="https://www.cockroachlabs.com/">CockroachDB</a> database. I want to use CockroachDB because it uses the <a href="https://www.postgresql.org/">PostgreSQL</a> wire protocol and is mostly SQL compatible with PostgreSQL too, so is easy to use with most languages and frameworks, but can easily scale and have data GEO partitioned. I don't need that scale out capability or GEO partitioning just now, but seeing as Cockroach is a breeze to set up and frankly just cool to play with, I'm going to use it. Have I mentioned that this project is all about learning how to use technologies that I find very interesting and see a great future for?</p>
<p>Anyway, installing the Diesel CLI was dead easy, a simple cargo install diesel_cli and we were done as I had already made sure I had the required PostgreSQL client bits and bobs installed as per the <a href="https://diesel.rs/guides/getting-started/">Quick Start Guide</a>. And the basic setup of its dotenv file along with similar configuration in Rocket.toml was a no-brainer too. A quick run of diesel setup and I had the expected new migrations directory and schema.rs file in my project.</p>
<p>Before getting stuck into using Diesel with Rocket I took a detour to make a few tweaks to my data migration scripts to use UUID columns instead of plain integer style serial columns. It's highly recommended when data can be written to multiple nodes in a cluster, like with CockroachDB, to use random primary keys as it prevents data writes from being clumped together in its range based data setup. However, using UUIDs turned out to cause more dependency headaches further down the line that required some more quick learning, but we'll come to that in a second.</p>
<p>Diesel's migrations feature allowed me to convert the schema definition bits from my data migrations scripts into proper migration steps. The first step to set up a basic schema with extra &quot;old ID&quot; fields in tables, the next step being used for data import so I can re-create it easily from the SQLite database, and a follow on migration that then fixed up the data to convert the pre-existing integer based primary/foreign key pairs to use the new UUID setup. That last step also dropped the &quot;old ID&quot; fields on completion.</p>
<p>Then came the task of creating structs in the code that could be hooked up to the schema with derive(Queryable) macros etc. These macros allow the Diesel ORM to build queries and with the right use statements the fields from the structs can easily be used in code to form predicates. This turned out to be another source of Dependency Hell, largely due to the UUID and TIMESTAMP columns in the schema requiring new crates that exposed the underlying problem I had before.</p>
<p>There were a lot of errors related to traits not being satisfied one way or another, and infuriatingly it would often show trait signatures that exactly matched what I saw in the docs for the UUID or chrono crates that I was using. Every time I searched Stackoverflow or other sources for anything related, they always said that dependencies hadn't been properly added to Cargo.toml or as use statements, and then showed me exactly what I already had. Eventually I pieced together enough information to realise that if the same crate is imported as a dependency by a couple of crates, and/or explicitly by your code, if they happen to import slightly different versions that seemingly have exactly the same function signatures etc, just by being even a debug level different, Rust will consider the traits completely different and incompatible.</p>
<p>I used the excellent <a href="https://github.com/sfackler/cargo-tree">cargo-tree</a> plugin to inspect the dependency tree and saw these tiny differences in crate dependencies. At first I was at a bit of a loss as to what to do, then on a whim I decided to relax the version numbers I'd used in the dependencies sections of the Cargo.toml file. So instead of setting Rocket to be version 0.4.2, I instead used version 0.4, and so on for all the other dependencies. And boom, just like that, cargo test compiled and ran! I had previously set tight versions to try and match what I'd seen in the dependency tree, slightly coaxing versions I had control over to match the versions I saw as automatic imports. That was around the wrong way, a better strategy was to relax the versions a little so that Cargo had wiggle room and could recognise satisfied dependencies based on slightly looser version requirements. Not quite sure where my head was on that one, it's obvious in retrospect, I blame late night programming!</p>
<p>With that I was able to get a couple of routes set up to return information in JSON format from the database based on UUID or other field types I played with. I even set things up so that custom JSON errors were returned when supplied query params weren't as expected and so on.</p>
<p>I've seen it mentioned somewhere before that one of the hardest hurdles to get over when starting with languages like Rust is simply getting past the endless stream of compile time errors you encounter when first trying to find your feet. I very much felt that pain over the last few days, and I expect it's one of the reasons Elm tries so hard to have nice helpful compiler errors that try to suggest fixes. To be fair, in a lot of cases there were helpful hints from the Rust complier too, there were times where I knocked out a big bunch of errors by following the tips it showed.</p>
<p>So I now had the basics of a REST-API server set up, albeit querying a single database table, but alas my GitLab CI pipeline was failing due to the new database stuff. How I got that fixed up and cut down from a run time of 26 minutes to under 3 minutes is a story for another day as I've run out of time.</p>
<p>As always, you can find me on...</p>
<p>Micro.blog: <a href="https://micro.blog/ianmjones">@ianmjones</a></p>
<p>Twitter: <a href="https://twitter.com/ianmjones">@ianmjones</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/51-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Fri, 26 Jul 2019 15:36:43 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/07/26/me-ooh-i.html</guid>

					<description><![CDATA[Me: Ooh, I have a great idea and it'll have a sweet domain too! ... goes to register domain ... Me: Dammit, domain's already taken, and not being used! ... later updating some DNS settings and spots ... that sweet domain that I've had for years! ... Me: 🤦‍♂️]]></description>
										<content:encoded><![CDATA[<p>Me: Ooh, I have a great idea and it'll have a sweet domain too!</p>
<p>... goes to register domain ...</p>
<p>Me: Dammit, domain's already taken, and not being used!</p>
<p>... later updating some DNS settings and spots ... that sweet domain that I've had for years! ...</p>
<p>Me: <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f926-200d-2642-fe0f.png" alt="🤦‍♂️" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/50-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 25 Jul 2019 10:30:16 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/07/25/i-love-how.html</guid>

					<description><![CDATA[I love how the @phpstorm splash screen artwork changes for each major release. It's always very striking.]]></description>
										<content:encoded><![CDATA[<p>I love how the <a href="https://twitter.com/phpstorm">@phpstorm</a> splash screen artwork changes for each major release. It's always very striking.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/07/29215000/phpstorm-20192-splash-screen.png" alt="PhpStorm 2019.2 splash screen" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/49-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 23 Jul 2019 08:21:38 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/07/23/til-the-rc.html</guid>

					<description><![CDATA[TIL: The &#34;rc&#34; in things like .bashrc comes from &#34;runcom&#34;, which is a syllabic abbreviation of &#34;run commands&#34;. Not something like &#34;runtime configuration&#34; like I've always thought.]]></description>
										<content:encoded><![CDATA[<p>TIL: The &quot;rc&quot; in things like <code>.bashrc</code> comes from &quot;<a href="https://unix.stackexchange.com/questions/3467/what-does-rc-in-bashrc-stand-for">runcom</a>&quot;, which is a syllabic abbreviation of &quot;run commands&quot;.</p>
<p>Not something like &quot;runtime configuration&quot; like I've always thought.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/48-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 10 Jul 2019 22:20:21 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/07/10/i-very-much.html</guid>

					<description><![CDATA[I very much like the look of the Plasma desktop with the full Breeze Dark look and feel.]]></description>
										<content:encoded><![CDATA[<p>I very much like the look of the Plasma desktop with the full Breeze Dark look and feel.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/07/29215000/snippet-pixie-on-kde-neon.png" alt="Snippet Pixie on KDE Neon" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/47-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 10 Jul 2019 22:10:01 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/07/10/snippet-pixie-is.html</guid>

					<description><![CDATA[Snippet Pixie is now available as a snap. 🎉 sudo snap install snippetpixie --classic I even tested it with LibreOffice Writer and gedit on KDE Neon, but remember folks, Snippet Pixie is a GTK app, so your mileage will vary greatly.]]></description>
										<content:encoded><![CDATA[<p><a href="https://www.snippetpixie.com">Snippet Pixie</a> is now available as a snap. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<pre><code class="language-bash">sudo snap install snippetpixie --classic</code></pre>
<p>I even tested it with LibreOffice Writer and gedit on KDE Neon, but remember folks, Snippet Pixie is a GTK app, so your mileage will vary greatly.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/07/29215001/snippet-pixie-snap-in-kde-neon-app-store.png" alt="Snippet Pixie Snap in KDE Neon&#039;s app store" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/46-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 18 Jun 2019 18:39:14 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/06/18/roof-top-terrace.html</guid>

					<description><![CDATA[Roof top terrace for the win!]]></description>
										<content:encoded><![CDATA[<p>Roof top terrace for the win!</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/06/29215001/sunset-over-rooftops-of-berlin-scaled.jpg" alt="Sunset over rooftops of Berlin" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/45-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 18 Jun 2019 18:13:44 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/06/18/delicious-brains-spent.html</guid>

					<description><![CDATA[Delicious Brains spent 4 hours walking Berlin on an alternate culture tour today, great way to see and learn about about a side Berlin often missed by tourists.]]></description>
										<content:encoded><![CDATA[<p><a href="https://deliciousbrains.com/">Delicious Brains</a> spent 4 hours walking Berlin on an alternate culture tour today, great way to see and learn about about a side Berlin often missed by tourists.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/06/29215002/walking-through-artistic-area-of-berlin-scaled.jpg" alt="Walking through artistic area of Berlin" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/44-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 11 Jun 2019 12:42:00 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/06/11/wp-offload-media.html</guid>

					<description><![CDATA[WP Offload Media 2.2 is out, with background offload, download, and download and remove tools, plus huge performance improvements in the admin area. 🎉]]></description>
										<content:encoded><![CDATA[<p><a href="https://deliciousbrains.com/wp-offload-media-2-2-released/">WP Offload Media 2.2 is out</a>, with background offload, download, and download and remove tools, plus huge performance improvements in the admin area. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="https://deliciousbrains.com/wp-offload-media-2-2-released/"><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/06/29215002/wp-offload-media-22-release-post-banner-scaled.jpg" alt="WP Offload Media 2.2 release post banner" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/43-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 23 May 2019 15:03:00 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/05/23/just-created-k.html</guid>

					<description><![CDATA[Just created 2k subsites on a @SpinupWP managed site, and thoroughly tested the queue feature of @wpoffloadses! Now to create 300k+ posts/media for @wpoffloadmedia testing!]]></description>
										<content:encoded><![CDATA[<p>Just created 2k subsites on a <a href="https://twitter.com/spinupwp">@SpinupWP</a> managed site, and thoroughly tested the queue feature of <a href="https://twitter.com/wpoffloadses">@wpoffloadses</a>!</p>
<p>Now to create 300k+ posts/media for <a href="https://twitter.com/wpoffloadmedia">@wpoffloadmedia</a> testing!</p>
<p><a href="https://cdn.ianmjones.com/wp-content/uploads/2019/05/29215003/2000-subsites-with-wp-cli.png"><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/05/29215003/2000-subsites-with-wp-cli.png" alt="Screenshot of terminal showing WP-CLI output" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/42-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sat, 18 May 2019 16:17:37 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/05/18/while-mowing-the.html</guid>

					<description><![CDATA[While mowing the lawn this afternoon I rescued this little fella that flew straight into a cobweb.]]></description>
										<content:encoded><![CDATA[<p>While mowing the lawn this afternoon I rescued this little fella that flew straight into a cobweb.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/05/29215003/red-and-black-moth-on-finger-scaled.jpg" alt="Red and black moth on my finger" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Notes on getting autostart working for a classic confined snap</title>
		<link>https://www.ianmjones.com/notes-on-getting-autostart-working-for-a-classic-confined-snap/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sat, 18 May 2019 12:09:43 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/05/03/one-more-thing.html</guid>

					<description><![CDATA[Last night I finally managed to get a working build of the Snippet Pixie snap that pretty much works as hoped, but there were a couple of things I had to change in order to get autostart working that I thought it might help others to mention here. There's a couple of wrinkles due to &#8230; <a href="https://www.ianmjones.com/notes-on-getting-autostart-working-for-a-classic-confined-snap/" class="more-link">Continue reading <span class="screen-reader-text">Notes on getting autostart working for a classic confined snap</span></a>]]></description>
										<content:encoded><![CDATA[<p>Last night I finally managed to get a working build of the <a href="https://snapcraft.io/snippetpixie">Snippet Pixie snap</a> that pretty much works as hoped, but there were a couple of things I had to change in order to get autostart working that I thought it might help others to mention here.</p>
<p>There's a couple of wrinkles due to naming.</p>
<p>The snap is called <code>snippetpixie</code> and uses that in the <code>snapcraft.yaml</code> <a href="https://github.com/bytepixie/snippetpixie/blob/d339965e745e13e60c4af9219f4bc4ef65abacf9/snapcraft.yaml#L27"><code>apps:</code></a> entry, but the binary and canonical name for the app (as used in <code>meson</code> build etc.) is <code>com.github.bytepixie.snippetpixie</code>, and that's the app's &quot;ID&quot; too. It's a GTK app built with <a href="https://valadoc.org/gtk+-3.0/Gtk.html">Vala</a>, initially for <a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie/">elementary OS</a>.</p>
<p>This means the <code>.desktop</code> file is usually called <code>com.github.bytepixie.snippetpixie.desktop</code>. So in the app it uses this as the desktop file name when trying to copy and fix it up to create an <code>autostart</code> version, but the <a href="https://valadoc.org/gio-unix-2.0/GLib.DesktopAppInfo.html"><code>DesktopAppInfo</code></a> class failed to find the file by that name.</p>
<p>Turns out <code>snapd</code>/<code>snapcraft</code> takes that <code>com.github.bytepixie.snippetpixie.desktop</code> file and renames it to <code>snippetpixie_snippetpixie.desktop</code> at some point (I think install time by <code>snapd</code>), making some changes to the <code>Exec</code> line along the way.</p>
<p>This means the <code>DesktopAppInfo</code> class doesn't recognise <code>com.github.bytepixie.snippetpixie.desktop</code> as valid.</p>
<p>In the end I had to add specific code for running as a snap to change the desktop file name to look for, and also be careful about the way the <code>Exec</code> line is changed for the new autostart version to carefully insert the required <code>--start</code> param in the altered command line instead of blindly changing it to <code>com.github.bytepixie.snippetpixie --start</code>.</p>
<p>You can see some of the altered (not very clever, but it works) code in snippetpixie's <a href="https://github.com/bytepixie/snippetpixie/blob/d339965e745e13e60c4af9219f4bc4ef65abacf9/src/Application.vala#L814"><code>update_autostart</code></a> function.</p>
<p>Hope this helps someone else having troubles getting autostart to work for a snap.</p>
<h2>One More Thing...</h2>
<p>I guess I'm also officially announcing that there's candidate availability of a <a href="https://snapcraft.io/snippetpixie">snap for Snippet Pixie</a>!</p>
<p>It can be installed from the candidate channel with…</p>
<pre><code class="language-bash">sudo snap install snippetpixie --classic --candidate</code></pre>
<p>Any feedback on the snap is warmly welcomed via either the Snapcraft forum's &quot;<a href="https://forum.snapcraft.io/t/call-for-testing-snippet-pixie/11066">Call for testing</a>&quot; post, or Snippet Pixie's <a href="https://github.com/bytepixie/snippetpixie/issues">GitHub Issues</a>.</p>
<h2>Get It!!!</h2>
<p><a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie"><img src="https://appcenter.elementary.io/badge.svg?new" alt="Get" /></a></p>
<p><a href="https://snapcraft.io/snippetpixie"><img src="https://snapcraft.io/static/images/badges/en/snap-store-black.svg" alt="Get" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Almost Back In The Saddle</title>
		<link>https://www.ianmjones.com/almost-back-in-the-saddle/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 08 May 2019 20:48:00 +0000</pubDate>
				<category><![CDATA[podcast]]></category>
		<guid isPermaLink="false">http://rustyelm.micro.blog/2019/05/08/almost-back-in.html</guid>

					<description><![CDATA[Hello, my name is Ian Jones, and this is the RustyElm microcast, a short, very ad-hoc journal of my attempt to learn Rust and Elm in order to build a side project. I had a draft podcast way back in mid September 2018, but never finished it as I was just too damn busy. Things &#8230; <a href="https://www.ianmjones.com/almost-back-in-the-saddle/" class="more-link">Continue reading <span class="screen-reader-text">Almost Back In The Saddle</span></a>]]></description>
										<content:encoded><![CDATA[<p>Hello, my name is Ian Jones, and this is the RustyElm microcast, a short, very ad-hoc journal of my attempt to learn Rust and Elm in order to build a side project.</p>
<p>I had a draft podcast way back in mid September 2018, but never finished it as I was just too damn busy.</p>
<p>Things have been kinda crazy, starting with working on multiple huge releases of <a href="https://deliciousbrains.com/wp-offload-media/">WP Offload Media</a>, and helping out with <a href="https://deliciousbrains.com/wp-offload-ses/">WP Offload SES</a>. Giving my best 8 hours or more of mental energy a day to my work for Delicious Brains doesn't leave much in the tank for late night hacking. I very much enjoy working on WP Offload Media, it's an awesome plugin, and I enjoy having primary responsibility for it's development, so I naturally put a lot of my energy into it and am always thinking about it.</p>
<p>Having said that, I did get an itch for something I needed to build that also took my eye off of RustyElm and learning Rust and Elm, that being: <a href="https://www.snippetpixie.com">Snippet Pixie</a>.</p>
<p>Snippet Pixie is &quot;Your little expandable text snippet helper&quot;, for Linux. I couldn't find a good Linux application alternative to the likes of <a href="https://textexpander.com/">Text Expander</a> or <a href="https://kapeli.com/dash">Dash</a> (which I currently use on macOS). So, in the end, I kinda just had to build it, otherwise known as scratching my itch. My primary desktop Linux distribution is <a href="https://elementary.io/">elementary OS</a>, so that's what I built it for, in <a href="https://wiki.gnome.org/Projects/Vala">Vala</a>.</p>
<p>Turns out that may have helped me get my shrivelled little brain around the Rust concept of <a href="https://doc.rust-lang.org/stable/book/ch04-01-what-is-ownership.html">Ownership</a>, as Vala also doesn't let you throw objects around without taking into consideration <a href="https://wiki.gnome.org/Projects/Vala/Tutorial#Ownership">ownership</a>. It caught me out a few times when the complier complained about not being able to assign an unowned reference etc, and reminded me a lot of how Rust handles ownership. Even though things aren't exactly the same, I'm going to chalk that one up as some progress in my learning of Rust, alright?!</p>
<p>Anyhow, Snippet Pixie recently had a <a href="https://www.ianmjones.com/snippet-pixie-1-2-released-with-support-for-placeholders-%f0%9f%8e%89%ef%b8%8f/">momentous release</a> that included date/time, clipboard, embedded snippets and cursor placeholders, adding a whole new level of functionality. And even though I'm in the middle of trying to get a <a href="https://snapcraft.io/snippetpixie">snap</a> sorted so it'll be usable on many more Linux distributions, and still have plans for more improvements to Snippet Pixie, I feel like I no longer have a huge pressure to keep adding functionality and can relax a little bit on it.</p>
<p>As such, I'm starting to look at getting started with my Rust and Elm based project for my evening recreational programming. Stay tuned.</p>
<p>Micro.blog: <a href="https://micro.blog/ianmjones">@ianmjones</a></p>
<p>Twitter: <a href="https://twitter.com/ianmjones">@ianmjones</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Snippet Pixie 1.2 released with support for placeholders 🎉️</title>
		<link>https://www.ianmjones.com/snippet-pixie-1-2-released-with-support-for-placeholders-%f0%9f%8e%89%ef%b8%8f/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Fri, 03 May 2019 09:20:10 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/04/22/snippet-pixie-released.html</guid>

					<description><![CDATA[I'm very proud to announce that Snippet Pixie now includes support for placeholders! 🎉️ This release took an immense amount of work, with lots of thought taken in the design of the placeholders feature, hopefully you find these new super powers useful! Date/Time: Insert the current or calculated date/time with configurable format. Clipboard: Insert the &#8230; <a href="https://www.ianmjones.com/snippet-pixie-1-2-released-with-support-for-placeholders-%f0%9f%8e%89%ef%b8%8f/" class="more-link">Continue reading <span class="screen-reader-text">Snippet Pixie 1.2 released with support for placeholders 🎉️</span></a>]]></description>
										<content:encoded><![CDATA[<p>I'm very proud to announce that <a href="https://www.snippetpixie.com">Snippet Pixie</a> now includes support for <a href="#placeholders">placeholders</a>! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>This release took an immense amount of work, with lots of thought taken in the design of the placeholders feature, hopefully you find these new super powers useful!</p>
<ul>
<li><strong><a href="#date">Date/Time</a>:</strong> Insert the current or calculated date/time with configurable format.</li>
<li><strong><a href="#clipboard">Clipboard</a>:</strong> Insert the text contents of the clipboard.</li>
<li><strong><a href="#snippet">Snippets</a>:</strong> Insert snippets in your snippets!</li>
<li><strong><a href="#cursor">Cursor</a>:</strong> Set where the cursor should end up after the snippet has expanded.</li>
</ul>
<p>Read on for a summary of the placeholders feature and how to use the different types of placeholder.</p>
<h2>Placeholders</h2>
<p>All placeholders are delimited (wrapped) by <code>$$</code>, with the placeholder name starting with an <code>@</code> symbol.</p>
<p>For example, today's date can be inserted with <code>$$@date$$</code>.</p>
<p>Some placeholders allow for extra arguments when <code>:</code> follows their name and that is followed by the argument. For example a format for a date, or the abbreviation for a snippet. Check the following descriptions for each placeholder for more details.</p>
<p>To use <code>$$</code> in your snippet body, escape the second <code>$</code> with a backslash like so: <code>$\$</code>.</p>
<h3>@date</h3>
<p>Quick Examples:</p>
<ul>
<li>Today's date with system format: <code>$$@date$$</code></li>
<li>Today's date with custom format: <code>$$@date:%Y-%m-%d %H:%M:%S$$</code></li>
<li>Tomorrow's date with system format: <code>$$@date@+1D$$</code></li>
<li>Date 2 weeks from today with custom format: <code>$$@date@+2W:%x$$</code></li>
<li>Time 3 hours from now: <code>$$@time@+3H$$</code></li>
</ul>
<p><code>@time</code> is an alias for <code>@date</code>, with one important difference, the default output if no format specified is the default time format (<code>%X</code>) rather than default date format (<code>%x</code>).</p>
<p>The optional format specified after <code>:</code> can take a format string as detailed in the <a href="https://valadoc.org/glib-2.0/GLib.DateTime.format.html">GLib.DateTime.format function's docs</a>.</p>
<p>The optional date calculation starts with an <code>@</code> after the placeholder name, followed by a signed integer and unit. The unit types are as follows:</p>
<ul>
<li><strong>Y:</strong> Years</li>
<li><strong>M:</strong> Months</li>
<li><strong>W:</strong> Weeks</li>
<li><strong>D:</strong> Days</li>
<li><strong>h:</strong> Hours</li>
<li><strong>m:</strong> Minutes</li>
<li><strong>s:</strong> Seconds</li>
</ul>
<p>You can apply more than one date calculation, for example <code>+2h+30m</code> adds 2 hours and 30 minutes to the current time.</p>
<p>You can use both positive (<code>+</code>) and negative calculations, for example <code>-3D</code> takes 3 days from the current date.</p>
<h3>@clipboard</h3>
<p>When <code>$$@clipboard$$</code> is part of a snippet's body, when its abbreviation is expanded the current text contents of the clipboard will replace the placeholder.</p>
<h3>@snippet</h3>
<p>You can have up to three levels of embedded snippets with the <code>@snippet</code> placeholder.</p>
<p>The abbreviation for the snippet to be embedded is entered after <code>:</code>, for example <code>$$@snippet:sigg;$$</code> expands the snippet with abbreviation <code>sigg;</code> in place of the placeholder.</p>
<h3>@cursor</h3>
<p>Adding <code>$$@cursor$$</code> to a snippet's body will put the cursor in its place after expansion instead of at the end of the expanded text.</p>
<p>If <code>$$@cursor$$</code> is entered more than once in a snippet's body or via snippet embedding, then the last occurrence of the cursor placeholder wins.</p>
<h2>Get It!!!</h2>
<p><a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie"><img src="https://appcenter.elementary.io/badge.svg?new" alt="Get" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/40-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 30 Apr 2019 13:12:11 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/04/30/we-often-get.html</guid>

					<description><![CDATA[We often get asked whether WP Offload Media can work with this, that, or the other S3 API compatible storage provider, so I wrote about how I got MinIO working with WP Offload Media: deliciousbrains.com/s3-compatible-storage-provider-minio]]></description>
										<content:encoded><![CDATA[<p>We often get asked whether WP Offload Media can work with this, that, or the other S3 API compatible storage provider, so I wrote about how I got MinIO working with WP Offload Media:</p>
<p><a href="https://deliciousbrains.com/s3-compatible-storage-provider-minio/">deliciousbrains.com/s3-compatible-storage-provider-minio</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/38-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Mon, 08 Apr 2019 12:29:39 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/04/08/this-is-what.html</guid>

					<description><![CDATA[This is what the snapcraft store\'s usage map looks like for an app when you're the only person that knows there's a beta snap available. 😜]]></description>
										<content:encoded><![CDATA[<p>This is what the snapcraft store\'s usage map looks like for an app when you're the only person that knows there's a <a href="https://snapcraft.io/snippetpixie">beta snap</a> available. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f61c.png" alt="😜" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/04/29215004/snippet-pixie-beta-in-snap-store.png" alt="Snippet Pixie beta in Snap Store" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/37-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Fri, 05 Apr 2019 08:37:19 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/04/05/snippet-pixie-released.html</guid>

					<description><![CDATA[Snippet Pixie 1.1.1 released! 🎉 Improved performance, compatibility, and stability. Added French translations. Huge thanks to @NathanBnm on GitHub! 🇨🇵️]]></description>
										<content:encoded><![CDATA[<p><a href="https://www.snippetpixie.com">Snippet Pixie</a> 1.1.1 released! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<ul>
<li>Improved performance, compatibility, and stability.</li>
<li>Added French translations. Huge thanks to <a href="https://github.com/NathanBnm">@NathanBnm</a> on GitHub! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f1e8-1f1f5.png" alt="🇨🇵" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/36-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 04 Apr 2019 08:08:33 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/04/04/big-thanks-to.html</guid>

					<description><![CDATA[Big thanks to everyone that has shown their appreciation for Snippet Pixie with donations via the @elementary AppCenter, or got in contact to say thanks, it means a lot to me and is very encouraging.]]></description>
										<content:encoded><![CDATA[<p>Big thanks to everyone that has shown their appreciation for <a href="https://www.snippetpixie.com">Snippet Pixie</a> with donations via the <a href="https://twitter.com/elementary">@elementary</a> AppCenter, or got in contact to say thanks, it means a lot to me and is very encouraging.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/35-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 02 Apr 2019 20:59:55 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/04/02/til-sudo-apt.html</guid>

					<description><![CDATA[TIL: sudo apt install libreoffice-gtk3 and all of a sudden LibreOffice Writer is compatible with Snippet Pixie! 🎉️]]></description>
										<content:encoded><![CDATA[<p>TIL: <code>sudo apt install libreoffice-gtk3</code> and all of a sudden LibreOffice Writer is compatible with <a href="https://www.snippetpixie.com">Snippet Pixie</a>! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Snippet Pixie 1.1 adds snippets export and import</title>
		<link>https://www.ianmjones.com/snippet-pixie-1-1-adds-snippets-export-and-import/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 06 Feb 2019 11:21:52 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/02/06/snippet-pixie-adds.html</guid>

					<description><![CDATA[I'm super happy to announce that Snippet Pixie 1.1 has been released. 🎉 This release includes two features that go hand in hand, snippets export and import. Snippet Pixie is a great way to build a library of time and keystroke saving short text abbreviations that automatically expand while you type, but up until this &#8230; <a href="https://www.ianmjones.com/snippet-pixie-1-1-adds-snippets-export-and-import/" class="more-link">Continue reading <span class="screen-reader-text">Snippet Pixie 1.1 adds snippets export and import</span></a>]]></description>
										<content:encoded><![CDATA[<p>I'm super happy to announce that <a href="https://www.snippetpixie.com/">Snippet Pixie</a> 1.1 has been released. <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>This release includes two features that go hand in hand, snippets <strong>export</strong> and <strong>import</strong>.</p>
<p>Snippet Pixie is a great way to build a library of time and keystroke saving short text abbreviations that automatically expand while you type, but up until this release you could only add snippets to your second machine by either manually adding them again or finding and copying the settings database.</p>
<h2>Export</h2>
<p>It's now possible to export your snippets to a JSON format file for the purpose of backup or transfer to another machine for import. Now when you add new snippets on one machine you can quickly add them to another machine.</p>
<h2>Import</h2>
<p>When using the import feature Snippet Pixie by default will not overwrite existing snippets with the same abbreviation, but you can optionally do that if you've made changes to the abbreviations on one installation and want to apply them to another.</p>
<p>For safety, the import feature also does not delete any existing snippets.</p>
<h2>UI</h2>
<p>The welcome screen in Snippet Pixie now includes an <strong>Import Snippets</strong> option to get new installations up and running quickly. If you've already got some snippets in Snippet Pixie then you can use the &quot;Import snippets...&quot; option from the cog menu.</p>
<p>The cog menu is where you'll find the &quot;Export snippets...&quot; option too, it's enabled if you have some snippets to export.</p>
<h2>CLI</h2>
<p>Want to script an automatic backup or import? Snippet Pixie has your back as it also has new command line options for export and import.</p>
<pre><code class="language-bash">-e, --export=filename
Export snippets to file

-i, --import=filename
Import snippets from file, skips snippets where abbreviation already exists

--force
If used in conjunction with import, existing snippets with same abbreviation are updated</code></pre>
<h2>File Format</h2>
<p>Some people might be wondering why I picked JSON as the file format. The primary reason is flexability and general support for the format. There are something like eleventy million utilities for handling JSON, so if you want to manipulate or generate your own file of snippets you'll be able to do it easily.</p>
<p>I'll document the format properly at some point, but it's very simple as this vastly trimmed down export of some of my snippets shows...</p>
<pre><code class="language-json">{
  &quot;generator&quot; : &quot;com.github.bytepixie.snippetpixie&quot;,
  &quot;version&quot; : 101,
  &quot;data&quot; : [
    {
      &quot;snippets&quot; : [
        {
          &quot;abbreviation&quot; : &quot;joy`&quot;,
          &quot;body&quot; : &quot;&#x1f602;&quot;
        },
        {
          &quot;abbreviation&quot; : &quot;ksig`&quot;,
          &quot;body&quot; : &quot;Kind regards,\n\nIan&quot;
        },
        {
          &quot;abbreviation&quot; : &quot;shrug`&quot;,
          &quot;body&quot; : &quot;¯\\_(ツ)_/¯&quot;
        },
        {
          &quot;abbreviation&quot; : &quot;sp`&quot;,
          &quot;body&quot; : &quot;Snippet Pixie&quot;
        },
        {
          &quot;abbreviation&quot; : &quot;spu`&quot;,
          &quot;body&quot; : &quot;[www.snippetpixie.com](https://www.snippetpixie.com)&quot;
        }
      ]
    }
  ]
}</code></pre>
<p>The <code>generator</code> and <code>version</code> elements are very important, Snippet Pixie will not <em>currently</em> import a file that doesn't have those two elements with those same values as they signify a format that it understands.</p>
<p>The <code>data</code> array contains a list of data types with data that can be imported, currently there's only <code>snippets</code>.</p>
<p>Each of the objects in the <code>snippets</code> array contains only an <code>abbreviation</code> and <code>body</code>, on export they are ordered alphabetically by the <code>abbreviation</code> and if there are duplicates (it's possible) then by a hidden <code>id</code> which typically means by order of addition unless entries have been renamed. Due to this ordering, if overwriting duplicates on import is allowed then last duplicate in the file will &quot;win&quot;, but by default first entry will &quot;win&quot; if the abbreviation does not exist in Snippet Pixie's library already.</p>
<p>As you can see from the example, it's UTF-8 and supports emoji and new lines (those <code>\n</code> bits), and characters like <code>\</code> are escaped etc.</p>
<h2>Get It!</h2>
<p>As always, you can get Snippet Pixie from the elementary <a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie/">AppCenter</a>.</p>
<p>Hope you like it, if you have any feature requests or problems with Snippet Pixie, please stop by the <a href="https://github.com/bytepixie/snippetpixie/">GitHub repository</a> and <a href="https://github.com/bytepixie/snippetpixie/issues">share your thoughts</a>!</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/02/29215004/snippet-pixie-start-screen-with-import-snippets-option.png" alt="Snippet Pixie start screen with import snippets option" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/33-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 30 Jan 2019 13:05:48 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/01/30/a-couple-of.html</guid>

					<description><![CDATA[A couple of years ago we had a support request regarding Chinese characters in offloaded files, I've used the example file name ever since for testing, including acceptance tests. I've only just now bothered to see what the file name translates too...]]></description>
										<content:encoded><![CDATA[<p>A couple of years ago we had a support request regarding Chinese characters in offloaded files, I've used the example file name ever since for testing, including acceptance tests. I've only just now bothered to see what the file name translates too...</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/01/29215004/screenshot-of-google-translate-showing-peppa-pig-as-result.png" alt="Screenshot of Google Translate showing Peppa Pig as result" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/32-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 16 Jan 2019 21:54:06 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/01/16/snippet-pixie-has.html</guid>

					<description><![CDATA[Snippet Pixie 1.0 has been released! Now autostarts on login by default, and tabbing into the body entry field selects all text, making adding new items a little bit quicker.]]></description>
										<content:encoded><![CDATA[<p><a href="https://www.snippetpixie.com">Snippet Pixie</a> 1.0 has been released!</p>
<p>Now autostarts on login by default, and tabbing into the body entry field selects all text, making adding new items a little bit quicker.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/01/29215005/screenshot-of-elementary-appcenter-showing-snippet-pixie-100.png" alt="Screenshot of Elementary AppCenter showing Snippet Pixie 1.0.0" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/31-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 10 Jan 2019 13:33:26 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/01/10/thanks-for-the.html</guid>

					<description><![CDATA[Thanks for the Hacktoberfest t-shirt, stickers and coaster @digitalocean, @github and @twilio!]]></description>
										<content:encoded><![CDATA[<p>Thanks for the <a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a> t-shirt, stickers and coaster <a href="https://twitter.com/digitalocean">@digitalocean</a>, <a href="https://twitter.com/github">@github</a> and <a href="https://twitter.com/twilio">@twilio</a>!</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/01/29215005/hacktoberfest-2018-t-shirt-and-stickers.jpg" alt="Hacktoberfest 2018 t-shirt and stickers" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/30-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 09 Jan 2019 19:34:21 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2019/01/09/my-handy-new.html</guid>

					<description><![CDATA[🎉 My handy new app for expanding text snippets, Snippet Pixie, is now available in the @elementary AppCenter!]]></description>
										<content:encoded><![CDATA[<p><img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> My handy new app for expanding text snippets, <a href="https://www.snippetpixie.com/">Snippet Pixie</a>, is now available in the <a href="https://twitter.com/elementary">@elementary</a> <a href="https://appcenter.elementary.io/com.github.bytepixie.snippetpixie">AppCenter</a>!</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2019/01/29215005/snippet-pixie-screenshot.png" alt="Snippet Pixie screenshot" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/29-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 05 Dec 2018 15:10:29 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/12/05/while-youre-reskinning.html</guid>

					<description><![CDATA[While you're re-skinning your web app with NES.css you should definitely be listening to Pretty Eight Machine by Inverse Phase, which is an excellent 8-bit tribute to probably my favourite album of all time, Pretty Hate Machine by Nine Inch Nails.]]></description>
										<content:encoded><![CDATA[<p>While you're re-skinning your web app with <a href="https://bcrikko.github.io/NES.css/">NES.css</a> you should definitely be listening to <a href="https://en.wikipedia.org/wiki/Pretty_Eight_Machine_%28album%29">Pretty Eight Machine</a> by <a href="https://en.wikipedia.org/wiki/Inverse_Phase">Inverse Phase</a>, which is an excellent 8-bit tribute to probably my favourite album of all time, <a href="https://en.wikipedia.org/wiki/Pretty_Hate_Machine">Pretty Hate Machine</a> by <a href="https://en.wikipedia.org/wiki/Nine_Inch_Nails">Nine Inch Nails</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/28-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Fri, 23 Nov 2018 12:28:07 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/11/23/just-received-a.html</guid>

					<description><![CDATA[Just received a nice t-shirt and a couple of lovely &#34;Sammy the Shark&#34; stickers in the post, thanks @digitalocean!]]></description>
										<content:encoded><![CDATA[<p>Just received a nice t-shirt and a couple of lovely &quot;Sammy the Shark&quot; stickers in the post, thanks <a href="https://twitter.com/digitalocean">@digitalocean</a>!</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/11/29215006/digitalocean-t-shirt-and-stickers.jpg" alt="DigitalOcean t-shirt and stickers" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/27-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 31 Oct 2018 15:58:24 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/10/31/if-anyones-still.html</guid>

					<description><![CDATA[If anyone's still looking for an Initiative Q invite, I've still got some going spare. initiativeq.com/invite/BB...]]></description>
										<content:encoded><![CDATA[<p>If anyone's still looking for an Initiative Q invite, I've still got some going spare.</p>
<p><a href="https://initiativeq.com/invite/BBat1JAs7">initiativeq.com/invite/BB...</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WP Cron Pixie 1.4 Released</title>
		<link>https://www.ianmjones.com/wp-cron-pixie-1-4-released/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 30 Oct 2018 22:46:45 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/10/30/wp-cron-pixie.html</guid>

					<description><![CDATA[Just released WP Cron Pixie 1.4, the latest update to my little dashboard widget to view the WordPress cron, and run an event now rather than later. In this release we have the following changes... Added checkbox to control whether example cron events should be added to cron. Added checkbox to control whether the display &#8230; <a href="https://www.ianmjones.com/wp-cron-pixie-1-4-released/" class="more-link">Continue reading <span class="screen-reader-text">WP Cron Pixie 1.4 Released</span></a>]]></description>
										<content:encoded><![CDATA[<p>Just released WP Cron Pixie 1.4, the latest update to my little dashboard widget to view the WordPress cron, and run an event now rather than later.</p>
<p>In this release we have the following changes...</p>
<ul>
<li>Added checkbox to control whether example cron events should be added to cron.</li>
<li>Added checkbox to control whether the display should auto refresh.</li>
<li>Added &quot;Refresh&quot; icon for manual refresh of data.</li>
<li>Fixed not all strings in UI being translatable.</li>
<li>Elm 0.19 frontend.</li>
</ul>
<p>A couple of things not mentioned in the changelog are that the &quot;Refresh&quot; icon does a nifty little spin as data is being refreshed or events are being run manually to give a little UI feedback, and this version has been tested with WordPress 5.0 beta 2.</p>
<p>It's available from the <a href="https://wordpress.org/plugins/wp-cron-pixie/">WordPress plugin repository</a>, or from its <a href="https://github.com/ianmjones/wp-cron-pixie/releases">GitHub repository</a>.</p>
<p>I had a lot of fun developing this version, using the <a href="https://elm-lang.org/">Elm</a> language for web development is so fast and efficient. Elm is a small language packed with power, the combination of a functional and static typed compiled language with a well thought out application architecture make for a great development platform.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/10/29215006/wp-cron-pixie-dashboard-widget-screenshot.jpg" alt="WP Cron Pixie dashboard widget screenshot" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/25-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Fri, 12 Oct 2018 15:39:43 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/10/12/so-now-we.html</guid>

					<description><![CDATA[So now we know what @robwalling's next adventure is! TinySeed. The First Startup Accelerator Designed for Bootstrappers. tinyseedfund.com]]></description>
										<content:encoded><![CDATA[<p>So now we know what <a href="https://twitter.com/robwalling">@robwalling</a>'s next adventure is!</p>
<p>TinySeed. The First Startup Accelerator Designed for Bootstrappers.</p>
<p><a href="https://tinyseedfund.com/">tinyseedfund.com</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/24-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 25 Sep 2018 20:26:32 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/09/25/big-day-for.html</guid>

					<description><![CDATA[Big day for me today, after months of work, we at Delicious Brains released WP Offload Media 2.0, our plugin for offloading your WordPress Media Library to cloud storage. It used to be called WP Offload S3 as it worked exclusively with Amazon S3, but now that we've added support for offloading your WordPress Media &#8230; <a href="https://www.ianmjones.com/24-2/" class="more-link">Continue reading <span class="screen-reader-text"></span></a>]]></description>
										<content:encoded><![CDATA[<p>Big day for me today, after months of work, we at Delicious Brains released <a href="https://deliciousbrains.com/wp-offload-s3-is-now-wp-offload-media-and-adds-support-for-digitalocean-spaces/">WP Offload Media 2.0</a>, our plugin for offloading your WordPress Media Library to cloud storage.</p>
<p>It used to be called WP Offload S3 as it worked exclusively with <a href="https://aws.amazon.com/s3/">Amazon S3</a>, but now that we've added support for offloading your WordPress Media Library to <a href="https://www.digitalocean.com/products/spaces/">DigitalOcean Spaces</a> too, seemed like a great time to change the name!</p>
<p>I made a lot of changes to the internals of WP Offload Media in preparation for this release, previously the plugin was scattered with S3 specific code, now it's much more adaptable to alternate storage providers. In fact it should be a lot easier to work in a different SDK than the <a href="https://aws.amazon.com/sdk-for-php/">AWS PHP SDK</a> that we're currently using for both Amazon S3 and DigitalOcean Spaces, you know, should we decide to add something like <a href="https://cloud.google.com/storage/">Google Cloud Storage</a> support via the <a href="https://googleapis.github.io/google-cloud-php/#/">Google Cloud Client Library for PHP</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Slow Going</title>
		<link>https://www.ianmjones.com/slow-going/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 05 Sep 2018 20:59:00 +0000</pubDate>
				<category><![CDATA[podcast]]></category>
		<guid isPermaLink="false">http://rustyelm.micro.blog/2018/09/05/slow-going.html</guid>

					<description><![CDATA[Huge News: Elm 0.19 released! Faster compiler with smaller output Core packages now in &#34;elm&#34; namespace rather than &#34;elm-lang&#34; New Browser module replaces HTML.program stuff New Time module looks nice Looking forward to using Elm again, but first need to get basic Rust backend running... Progress update (reading The Rust Programming Language book): Tests in &#8230; <a href="https://www.ianmjones.com/slow-going/" class="more-link">Continue reading <span class="screen-reader-text">Slow Going</span></a>]]></description>
										<content:encoded><![CDATA[<ul>
<li>Huge News: <a href="https://elm-lang.org/blog/small-assets-without-the-headache">Elm 0.19</a> released!
<ul>
<li>Faster compiler with smaller output</li>
<li>Core packages now in &quot;elm&quot; namespace rather than &quot;elm-lang&quot;</li>
<li>New <a href="https://package.elm-lang.org/packages/elm/browser/latest/Browser">Browser</a> module replaces HTML.program stuff</li>
<li>New <a href="https://package.elm-lang.org/packages/elm/time/latest/">Time</a> module looks nice</li>
<li>Looking forward to using Elm again, but first need to get basic Rust backend running...</li>
</ul>
</li>
<li>Progress update (reading The Rust Programming Language book):
<ul>
<li><a href="https://doc.rust-lang.org/book/second-edition/ch11-00-testing.html">Tests in Rust</a> look great
<ul>
<li>Unit tests in same file as code makes sense</li>
<li>Testing private functions FTW!</li>
<li>Separate integration tests for public library functions makes sense</li>
<li>Skinny main.rs and fat lib.rs files</li>
</ul>
</li>
<li>Read through the <a href="https://doc.rust-lang.org/book/second-edition/ch12-00-an-io-project.html">I/O Project</a> chapter
<ul>
<li>Impatient to get to <a href="https://doc.rust-lang.org/book/second-edition/ch13-00-functional-features.html">Functional Language Features</a></li>
<li>But still refreshed previously learnt concepts nicely</li>
<li>Introduced more new stuff than expected, glad I read it</li>
</ul>
</li>
<li>Finally got to <a href="https://doc.rust-lang.org/book/second-edition/ch13-00-functional-features.html">Functional Language Features</a> chapter
<ul>
<li>Covered anonymous functions and iterators, basically map</li>
<li>The <a href="https://doc.rust-lang.org/book/second-edition/ch13-03-improving-our-io-project.html">Improving Our I/O Project</a> section was probably the best</li>
</ul>
</li>
<li>Just started reading the <a href="https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html">More About Cargo and Crates.io</a> chapter
<ul>
<li>At some point may have crate I'd like to release, who knows?</li>
</ul>
</li>
</ul>
</li>
<li>Released minor update to <a href="https://wordpress.org/plugins/wp-cron-pixie/">WP Cron Pixie</a>
<ul>
<li>Now built with local to project Elm 0.18 tools</li>
<li>Cleaned up package dependency that prevents Elm 0.19 upgrade</li>
<li>Next version will therefore use Elm 0.19</li>
</ul>
</li>
</ul>
<p>Micro.blog: <a href="https://micro.blog/ianmjones">@ianmjones</a></p>
<p>Twitter: <a href="https://twitter.com/ianmjones">@ianmjones</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/23-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sun, 26 Aug 2018 10:41:00 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/26/office-invasion.html</guid>

					<description><![CDATA[Office invasion!]]></description>
										<content:encoded><![CDATA[<p>Office invasion!</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215007/chickens-in-office.jpg" alt="Chickens in office" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/22-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sat, 25 Aug 2018 10:49:25 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/25/just-found-the.html</guid>

					<description><![CDATA[Just found the Two-Bit History blog, and found myself saving pretty much every post to Instapaper. Its Timeline page is a great idea. Nice one @TwoBitHistory!]]></description>
										<content:encoded><![CDATA[<p>Just found the <a href="https://twobithistory.org/">Two-Bit History</a> blog, and found myself saving pretty much every post to Instapaper.</p>
<p>Its <a href="https://twobithistory.org/timeline.html">Timeline</a> page is a great idea.</p>
<p>Nice one <a href="https://twitter.com/TwoBitHistory">@TwoBitHistory</a>!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/21-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 07:56:02 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/22/as-a-family.html</guid>

					<description><![CDATA[As a family we have now also watched MiB3. My wife says that was her favourite as it fills in some of the back story, but Abi and I still think it's narrowly beaten by the original as our favourite.]]></description>
										<content:encoded><![CDATA[<p>As a family we have now also watched MiB3. My wife says that was her favourite as it fills in some of the back story, but Abi and I still think it's narrowly beaten by the original as our favourite.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/20-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sat, 18 Aug 2018 13:49:29 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/18/every-weekend-we.html</guid>

					<description><![CDATA[Every weekend we settle down to watch a family friendly movie that Abi hasn't seen yet. We watched Men in Black one and two back to back last night, so good, just great fun movies. Abi's favourite bit? The talking pug of course!]]></description>
										<content:encoded><![CDATA[<p>Every weekend we settle down to watch a family friendly movie that Abi hasn't seen yet. We watched Men in Black one and two back to back last night, so good, just great fun movies. Abi's favourite bit? The talking pug of course!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/185-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 16 Aug 2018 15:15:51 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://rustyelm.micro.blog/2018/08/16/the-rustyelm-microcast.html</guid>

					<description><![CDATA[The rustyelm microcast is now available via Apple Podcasts and any other podcast app that uses the iTunes Podcast directory! rustyelm in Apple Podcasts]]></description>
										<content:encoded><![CDATA[<p>The rustyelm microcast is now available via Apple Podcasts and any other podcast app that uses the iTunes Podcast directory!</p>
<p><a href="https://podcasts.apple.com/gb/podcast/rustyelm/id1428450597">rustyelm in Apple Podcasts</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/19-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 16 Aug 2018 09:12:00 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/16/apples-podcast-connect.html</guid>

					<description><![CDATA[Apple's Podcast Connect is working again, yay!]]></description>
										<content:encoded><![CDATA[<p>Apple's Podcast Connect is working again, yay!</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215007/screenshot-of-itunes-connect-with-rustyelm-podcast-submitted.png" alt="Screenshot of iTunes Connect with rustyelm podcast submitted" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/18-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Mon, 13 Aug 2018 22:19:03 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/13/umm-oh-dear.html</guid>

					<description><![CDATA[Umm ... oh dear, I ... umm ... just listened to my ... umm ... new microcast episode, and I umm ... did a lot of ... umm ... umms, sorry! https://www.ianmjones.com/alright-lets-do-this/]]></description>
										<content:encoded><![CDATA[<p>Umm ... oh dear, I ... umm ... just listened to my ... umm ... new microcast episode, and I umm ... did a lot of ... umm ... umms, sorry!</p>
<p><a href="https://www.ianmjones.com/alright-lets-do-this/">https://www.ianmjones.com/alright-lets-do-this/</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Alright, Let&#8217;s Do This!</title>
		<link>https://www.ianmjones.com/alright-lets-do-this/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Mon, 13 Aug 2018 21:01:16 +0000</pubDate>
				<category><![CDATA[podcast]]></category>
		<guid isPermaLink="false">http://rustyelm.micro.blog/2018/08/13/alright-lets-do.html</guid>

					<description><![CDATA[Why I decided to go ahead with this microcast Positive feedback on first episode Publicly accountable Have wanted to do a podcast for years! Inspired by many others, recently including: Timetable by Manton Reece Build Your SaaS by Jon Buda &#38; Justin Jackson The Art of Product Podcast by Ben Orenstein &#38; Derrick Reimer Q &#8230; <a href="https://www.ianmjones.com/alright-lets-do-this/" class="more-link">Continue reading <span class="screen-reader-text">Alright, Let&#8217;s Do This!</span></a>]]></description>
										<content:encoded><![CDATA[<ul>
<li>Why I decided to go ahead with this microcast
<ul>
<li>Positive feedback on first episode</li>
<li>Publicly accountable</li>
<li>Have wanted to do a podcast for years!</li>
<li>Inspired by many others, recently including:
<ul>
<li><a href="https://timetable.manton.org/">Timetable</a> by <a href="https://micro.blog/manton">Manton Reece</a></li>
<li><a href="https://saas.transistor.fm/">Build Your SaaS</a> by <a href="https://twitter.com/jonbuda">Jon Buda</a> &amp; <a href="https://twitter.com/mijustin">Justin Jackson</a></li>
<li><a href="http://artofproductpodcast.com/">The Art of Product Podcast</a> by <a href="https://twitter.com/r00k">Ben Orenstein</a> &amp; <a href="https://twitter.com/derrickreimer">Derrick Reimer</a></li>
</ul>
</li>
</ul>
</li>
<li>Q from <a href="https://twitter.com/thisizkp">@thisizkp</a>: Learning both Rust &amp; Elm?
<ul>
<li>Totally new to Rust</li>
<li>Smattering of Elm a couple of years ago
<ul>
<li><a href="https://deliciousbrains.com/building-reactive-wordpress-plugins-part-3-elm/">Building Reactive WordPress Plugins – Part 3 – Elm</a></li>
<li><a href="https://wordpress.org/plugins/wp-cron-pixie/">WP Cron Pixie</a></li>
</ul>
</li>
</ul>
</li>
<li>Progress update:
<ul>
<li>Reading <a href="https://doc.rust-lang.org/book/">The Rust Programming Language</a> book
<ul>
<li>Just finished <a href="https://doc.rust-lang.org/book/second-edition/ch10-00-generics.html">Chapter 10: Generic Types, Traits, and Lifetimes</a>
<ul>
<li>Familiar with concepts of Generics &amp; Traits, but Lifetimes (especially annotating them) will take some getting used too</li>
<li>Yay for compilers! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
</li>
<li>Moving on to <a href="https://doc.rust-lang.org/book/second-edition/ch11-00-testing.html#writing-automated-tests">Chapter 11: Writing Automated Tests</a>
<ul>
<li>Expect to use tests quite a bit in project, less than with PHP though</li>
<li>Yay for compilers! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
</li>
</ul>
</li>
<li>Have a basic &quot;Hello World&quot; Rust app using <a href="https://rocket.rs/">Rocket</a> web framework running</li>
<li>Found old skeleton page navigation test for project written in Elm
<ul>
<li>Won't use it</li>
<li>May nick a few ideas though</li>
</ul>
</li>
</ul>
</li>
<li>What's the project?
<ul>
<li>Not telling ... yet!</li>
</ul>
</li>
</ul>
<p>Micro.blog: <a href="https://micro.blog/ianmjones">@ianmjones</a></p>
<p>Twitter: <a href="https://micro.blog/ianmjones">@ianmjones</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/17-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sat, 11 Aug 2018 11:39:41 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/11/listening-to-cheesemaker.html</guid>

					<description><![CDATA[Listening to @cheesemaker on Micro Monday just now made me wonder when I first started blogging. Turns out it was February 2002, via the now defunct CityDesk desktop application. In that first blog post I make mention of having been building some now long lost CMS of my own, I don't even remember that!]]></description>
										<content:encoded><![CDATA[<p>Listening to <a href="https://micro.blog/cheesemaker">@cheesemaker</a> on <a href="https://monday.micro.blog/2018/04/16/jonathan-hayshttpsmicroblogcheesemaker-joins.html">Micro Monday</a> just now made me wonder when I first started blogging.</p>
<p>Turns out it was <a href="http://old.ianmjones.net/News/200202/FirstCityDeskArticle.html">February 2002</a>, via the now defunct <a href="https://www.joelonsoftware.com/2001/10/12/what-does-citydesk-do/">CityDesk</a> desktop application. In that first blog post I make mention of having been building some now long lost CMS of my own, I don't even remember that!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Decisions, decisions!</title>
		<link>https://www.ianmjones.com/decisions-decisions/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 09 Aug 2018 22:35:52 +0000</pubDate>
				<category><![CDATA[podcast]]></category>
		<guid isPermaLink="false">http://rustyelm.micro.blog/2018/08/09/decisions-decisions.html</guid>

					<description><![CDATA[Hello, my name is Ian Jones, and this is my very first microcast. I'm feverishly trying to learn Rust and brush up on Elm so that I can build a project with those two programming languages. It occurs to me that it might be worthwhile trying to record my fumbling progress in the form of &#8230; <a href="https://www.ianmjones.com/decisions-decisions/" class="more-link">Continue reading <span class="screen-reader-text">Decisions, decisions!</span></a>]]></description>
										<content:encoded><![CDATA[<p>Hello, my name is Ian Jones, and this is my very first microcast.</p>
<p>I'm feverishly trying to learn <a href="https://www.rust-lang.org/">Rust</a> and brush up on <a href="http://elm-lang.org/">Elm</a> so that I can build a project with those two programming languages.</p>
<p>It occurs to me that it might be worthwhile trying to record my fumbling progress in the form of a microcast.</p>
<p>It would be very ad-hoc, no schedule, very much a journal for myself.</p>
<p>It'll initially cover how I get on with learning Rust as I plan to build out a basic backend for the product first, then build out a basic frontend in Elm and iterate on both from there.</p>
<p>There will likely be rumination on the actual product idea too.</p>
<p>So I wonder, would anyone else be interested in listening, or should I just keep this journal to myself?</p>
<p>Decisions, decisions! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f914.png" alt="🤔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Micro.blog: <a href="https://micro.blog/ianmjones">@ianmjones</a></p>
<p>Twitter: <a href="https://twitter.com/ianmjones">@ianmjones</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.ianmjones.com/16-2/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 09 Aug 2018 08:49:29 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/09/its-just-occurred.html</guid>

					<description><![CDATA[It's just occurred to me that one of the reasons I've been drawn to moving my site to Micro.blog is the shear simplicity of the writing experience and themes. It's all about the words, while pictures stand out as real content rather than necessary decoration.]]></description>
										<content:encoded><![CDATA[<p>It's just occurred to me that one of the reasons I've been drawn to moving my site to Micro.blog is the shear simplicity of the writing experience and themes. It's all about the words, while pictures stand out as real content rather than necessary decoration.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Switched Personal Site to Micro.blog</title>
		<link>https://www.ianmjones.com/switched-personal-site-to-micro-blog/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 08 Aug 2018 22:54:08 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/08/08/switched-personal-site.html</guid>

					<description><![CDATA[I've bitten the bullet and switched my personal site to be hosted on Micro.blog. It's been a long time coming, I should have taken the plunge over a year ago when I first got the bug, but decided at the time to keep my WordPress site and cross post to Micro.blog. You can tell from &#8230; <a href="https://www.ianmjones.com/switched-personal-site-to-micro-blog/" class="more-link">Continue reading <span class="screen-reader-text">Switched Personal Site to Micro.blog</span></a>]]></description>
										<content:encoded><![CDATA[<p>I've bitten the bullet and switched my <a href="https://www.ianmjones.com/">personal site</a> to be hosted on <a href="https://micro.blog/">Micro.blog</a>.</p>
<p>It's been a long time coming, I should have taken the plunge over a year ago when I first got the bug, but decided at the time to keep my WordPress site and cross post to Micro.blog. You can tell from my distinct lack of posts that I never really got into that, I mainly used the old site for announcing stuff (a bit like I'm doing now I suppose!), and only sporadically posted to Micro.blog itself, or Twitter for that matter.</p>
<p>So this move is part of an attempt to be more social, something that <a href="https://bradt.ca/">Brad Touesnard</a> has said I suck at big time!</p>
<p>It's also prompted by a desire to consolidate and clean up a few of my &quot;web properties&quot;, with an emphasis on simplifying my hosting etc. There's some stuff <a href="https://deliciousbrains.com/spinning-up-something-new">coming down the pipe</a> from Delicious Brains that I intend to use for my business stuff, but this personal stuff should hopefully flourish here.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>New WordPress Plugin: WP Table Pixie</title>
		<link>https://www.ianmjones.com/new-wordpress-plugin-wp-table-pixie/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 04 Apr 2018 11:32:33 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2018/04/04/113233.html</guid>

					<description><![CDATA[What's this now? A new WordPress plugin called WP Table Pixie? Why yes, Options Pixie and Meta Pixie got together and made a baby! So, when I introduced Meta Pixie my friend and colleague at Delicious Brains, Ashley Rich, had just two comments... Nice, it supports user meta and everything. How come you decided to &#8230; <a href="https://www.ianmjones.com/new-wordpress-plugin-wp-table-pixie/" class="more-link">Continue reading <span class="screen-reader-text">New WordPress Plugin: WP Table Pixie</span></a>]]></description>
										<content:encoded><![CDATA[<p>What's this now? A new WordPress plugin called <a href="https://wordpress.org/plugins/wp-table-pixie/">WP Table Pixie</a>? Why yes, <a href="https://wordpress.org/plugins/options-pixie/">Options Pixie</a> and <a href="https://wordpress.org/plugins/meta-pixie/">Meta Pixie</a> got together and made a baby!</p>
<p>So, when I <a href="https://www.ianmjones.com/new-wordpress-plugin-meta-pixie/">introduced Meta Pixie</a> my friend and colleague at <a href="https://deliciousbrains.com/">Delicious Brains</a>, <a href="https://ashleyrich.com/">Ashley Rich</a>, had just two comments...</p>
<blockquote>
<p>Nice, it supports user meta and everything. How come you decided to make it a separate plugin?</p>
</blockquote>
<p>Apart from obviously loving it ;-), his second comment was basically asking how come I released a brand new plugin for accessing metdata tables rather than adding the functionality to the Options Pixie plugin?</p>
<p>My answer boiled down to how the WordPress database's <code>options</code> and various <code>*meta</code> tables are a different structure, the name Options Pixie didn't really fit for tables like postmeta, and frankly it was nice to have more plugins for people to be able to purchase a Pro addon for and for me to cross promote.</p>
<p>A year and bit later, my opinion has changed in a number of ways, and I've decided to reboot work on my personal WordPress plugin development by merging Options Pixie and Meta Pixie into a single plugin called WP Table Pixie.</p>
<p>At first, WP Table Pixie supports the following tables: commentmeta, options, postmeta, termmeta, sitemeta (multisite) and usermeta. However, the name &quot;WP Table Pixie&quot; is obviously a little more generic than that initial list of tables might suggest. I'm not promising anything, and I haven't figured out a good UI yet, but I'm keen to try and expand the plugin to handle more than just those options and metadata tables, plenty of plugins have custom tables that it would be nice to be able to drill down into and manage. If that's something that appeals, <a href="https://twitter.com/ianmjones">let me know</a>! However, I realised that although the options and metadata tables have obviously different structures, I could mung things a bit in the UI and swap out column labels such as Related ID and Autoload as appropriate as long as I did some jiggery pokery in the background to make things sane.</p>
<p>I've come to very much dislike how having two free plugins with Pro addons means a total of four plugins needing to be installed when wanting to inspect and edit both options and metadata for a customer (I use these plugins a lot when doing support for Delicious Brains).</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215007/multiple-meta-and-options-pixie-plugins.png" alt="Multiple Meta and Options Pixie Plugins" /></p>
<p>Hence <a href="https://wordpress.org/plugins/wp-table-pixie/">WP Table Pixie</a> is now a single free plugin that can do the job of the free Options &amp; Meta Pixie plugins to VIEW ALL THE THINGS, but can also be replaced by the <a href="https://www.bytepixie.com/wp-table-pixie/">Premium version</a> to also EDIT ALL THE THINGS.</p>
<p>This means customers need only install the one plugin, there's no need to install the free plugin before installing the version of WP Table Pixie they receive after purchase. And believe me, there's a lot of benefit to developing a free and expanded premium plugin rather than an addon for a free plugin, I squashed many subtle and not so subtle bugs during the development of WP Table Pixie from a single codebase. With WP Table Pixie I'm moving away from running my own store on my <a href="https://www.bytepixie.com/">business site</a>, and instead I am using <a href="https://freemius.com/">Freemius</a> for both in-plugin upgrades and sales initiated from the (really rough at the moment) <a href="https://www.bytepixie.com/wp-table-pixie/">product page</a>. There are a few reasons why I've made this move from an <a href="https://easydigitaldownloads.com/">Easy Digital Downloads</a> based sales site to using the Freemius service, it feels like I should probably go into those reasons in a follow-up post.</p>
<p>If you're an existing customer that's bought the Pro addon for Options Pixie, Meta Pixie or both (thank you), am I leaving you out to dry? Of course not! By now every Options or Meta Pixie Pro customer should have received an email with a WP Table Pixie license for a multiple sites plan (because the previous plugins started at 10 site licenses) that expires a year after their current license expires. If you had bought both of the previous Pro addons, then you're getting a two years extension to your license as big thank you!</p>
<p>If you have any comments or questions about WP Table Pixie, please <a href="https://twitter.com/ianmjones/">drop me a tweet</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>New Xojo Web SDK Control: ToastrIJ</title>
		<link>https://www.ianmjones.com/new-xojo-web-sdk-control-toastrij/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 02 Mar 2017 23:48:05 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2017/03/02/new-xojo-web.html</guid>

					<description><![CDATA[I've created a little open source Xojo Web SDK control called ToastrIJ. It's a thin wrapper around the most excellent toastr JavaScript library to enable the display of notifications. You know, those little growl like notifications to display information, success, warning and error messages. It's under the MIT license, and you can grab it from &#8230; <a href="https://www.ianmjones.com/new-xojo-web-sdk-control-toastrij/" class="more-link">Continue reading <span class="screen-reader-text">New Xojo Web SDK Control: ToastrIJ</span></a>]]></description>
										<content:encoded><![CDATA[<p>I've created a little open source <a href="https://www.xojo.com">Xojo</a> Web SDK control called <a href="https://github.com/ianmjones/ToastrIJ">ToastrIJ</a>.</p>
<p>It's a thin wrapper around the most excellent <a href="https://github.com/CodeSeven/toastr">toastr</a> JavaScript library to enable the display of notifications. You know, those little growl like notifications to display information, success, warning and error messages.</p>
<p>It's under the <a href="https://opensource.org/licenses/mit-license.php">MIT license</a>, and you can grab it from <a href="https://github.com/ianmjones/ToastrIJ">GitHub</a>.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2017/03/29214957/ToastrIJ.png" alt="ToastrIJ Demo" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Meta Pixie Pro Released</title>
		<link>https://www.ianmjones.com/meta-pixie-pro-released/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 15 Dec 2016 21:15:27 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2016/12/15/meta-pixie-pro.html</guid>

					<description><![CDATA[What? Really? So soon after releasing Meta Pixie? Yep, just one week after releasing Meta Pixie I've managed to finish off and release Meta Pixie Pro. To be honest, I was already working on the Pro addon for Meta Pixie when I announced Meta Pixie's release last week, as I had to wait for Meta &#8230; <a href="https://www.ianmjones.com/meta-pixie-pro-released/" class="more-link">Continue reading <span class="screen-reader-text">Meta Pixie Pro Released</span></a>]]></description>
										<content:encoded><![CDATA[<p>What? Really? So soon after <a href="https://www.ianmjones.com/new-wordpress-plugin-meta-pixie/">releasing Meta Pixie</a>?</p>
<p>Yep, just one week after releasing Meta Pixie I've managed to finish off and release <a href="https://www.bytepixie.com/products/meta-pixie-pro/">Meta Pixie Pro</a>.</p>
<p>To be honest, I was already working on the Pro addon for Meta Pixie when I announced Meta Pixie's release last week, as I had to wait for Meta Pixie to be approved and added to the <a href="https://wordpress.org/plugins/">WordPress Plugin Directory</a>. It took a few late nights of development and much testing, but I wanted to get it out before Christmas and I'm pretty stoked at how well development went.</p>
<p>Meta Pixie Pro adds the following features to Meta Pixie:</p>
<ul>
<li><strong>Add, edit, delete records.</strong></li>
<li><strong>Fix broken serialized values.</strong></li>
<li><strong>Bulk deleting and fixing of records.</strong></li>
<li><strong>Priority email support.</strong></li>
</ul>
<blockquote>
<p>List, sort, search, view, add, edit, delete and fix your WordPress site\'s commentmeta, postmeta, termmeta, sitemeta and usermeta records with style.</p>
</blockquote>
<p>Like <a href="https://www.bytepixie.com/products/options-pixie-pro/">Options Pixie Pro</a>, you can pick up a <a href="https://www.bytepixie.com/products/meta-pixie-pro/">Meta Pixie Pro license</a> for 10, 25 or 50 sites, starting at the super low price of $39. If you want a license for more than 50 sites, <a href="https://www.bytepixie.com/contact/">drop us line</a>.</p>
<p>If you stick both Options Pixie Pro and Meta Pixie Pro in your cart, you'll get a <strong>20% discount</strong> on the second item! (tip: if you're buying a larger pack for one of the plugins, stick it in your cart second for a bigger discount!)</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215007/meta-pixie-pro-screenshot.png" alt="Meta Pixie Pro screenshot" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>New WordPress Plugin: Meta Pixie</title>
		<link>https://www.ianmjones.com/new-wordpress-plugin-meta-pixie/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sat, 10 Dec 2016 15:15:09 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2016/12/10/new-wordpress-plugin.html</guid>

					<description><![CDATA[Ever since I released Options Pixie to enable easy viewing of options records in a WordPress database, my colleague at Delicious Brains, Ashley Rich, has been bugging me virtually non-stop to create something that lets us look at postmeta records. It's really handy for us when working on WP Offload S3 to be able to &#8230; <a href="https://www.ianmjones.com/new-wordpress-plugin-meta-pixie/" class="more-link">Continue reading <span class="screen-reader-text">New WordPress Plugin: Meta Pixie</span></a>]]></description>
										<content:encoded><![CDATA[<p>Ever since I released <a href="https://www.ianmjones.com/my-first-wordpress-plugin-options-pixie/">Options Pixie</a> to enable easy viewing of options records in a WordPress database, my colleague at <a href="https://deliciousbrains.com/">Delicious Brains</a>, <a href="https://ashleyrich.com/">Ashley Rich</a>, has been bugging me virtually non-stop to create something that lets us look at postmeta records. It's really handy for us when working on <a href="https://deliciousbrains.com/wp-offload-s3/">WP Offload S3</a> to be able to see the metadata attached to a Media Library item.</p>
<p>Well, a couple of weeks ago I finally found a few spare evenings to work on a new plugin that enables viewing of not only postmeta table records, but also commentmeta, termmeta, usermeta, and on multisite installs, sitemeta too.</p>
<p><a href="https://wordpress.org/plugins/meta-pixie/">Meta Pixie</a> is now available from the WordPress Plugins repository, and once installed you'll find a Meta Pixie menu option within the Settings menu.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215007/meta-pixie-screenshot.png" alt="Meta Pixie screenshot" /></p>
<p>Now you can inspect your WordPress metadata records to find out what's really going on. For example, you can easily check that a Media Library item has the correct thumbnail metadata.</p>
<p>You can also check the integrity of serialized values, Meta Pixie will highlight broken serialized values (i.e. where it expects a string to be 256 characters long but its actually 255).</p>
<p>For us on the WP Offload S3 team it's awesome to be able to view the plugin specific metadata that we need to generate, as well as settings stored in the sitemeta table of a multisite without having to resort to database admin tools. The rich view means we can easily see the structure of a serialized record without having to unpick plain text.</p>
<p>I'm considering creating a <a href="https://www.bytepixie.com/products/meta-pixie-pro/">Meta Pixie Pro</a> addon that enables add, edit, delete of metadata records, as well as fixing of broken serialized values. If this sounds like something you could use, please let me know by adding your vote to its <a href="https://www.bytepixie.com/products/meta-pixie-pro/">product page</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ActorDB for Docker</title>
		<link>https://www.ianmjones.com/actordb-for-docker/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Wed, 28 Sep 2016 00:06:04 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2016/09/28/actordb-for-docker.html</guid>

					<description><![CDATA[Last weekend I re-stumbled across ActorDB, a very interesting distributed database system that scales near linearly by scoping work to Actors. Every database action, whether that's an insert, select, update, delete or whatnot, always starts by specifying the Actor. This effectively scopes the changes to a single database, which then replicates to its sibling databases &#8230; <a href="https://www.ianmjones.com/actordb-for-docker/" class="more-link">Continue reading <span class="screen-reader-text">ActorDB for Docker</span></a>]]></description>
										<content:encoded><![CDATA[<p>Last weekend I re-stumbled across <a href="http://www.actordb.com">ActorDB</a>, a very interesting distributed database system that scales near linearly by scoping work to Actors. Every database action, whether that's an insert, select, update, delete or whatnot, always starts by specifying the Actor. This effectively scopes the changes to a single database, which then replicates to its sibling databases on other ActorDB nodes in a cluster. There's a lot more to it than that, as you can of course work with multiple actors within a transaction, and can connect to any node, in any cluster, and the data will be routed properly. In short, think user-centric databases all clustered and replicated together, using the <a href="http://sqlite.org">SQLite</a> engine backed by <a href="http://symas.com/mdb">LMDB</a> storage and using <a href="https://raft.github.io">Raft</a> for consensus. There's a little buzz-word bingo for you.</p>
<p>After reading everything I could find on ActorDB, and still having a bit of time to kill before having to go transfer our daughter from one place to another yet again, I figured I'd have a quick play with it.</p>
<p>As is rapidly becoming my norm, I went to <a href="https://hub.docker.com">Docker Hub</a> to find a <a href="https://www.docker.com">Docker</a> image to spin up. To my utter shock and horror (there might be a little bit of exaggeration there), there was not a single image for ActorDB to be found!</p>
<p>My first thought was that maybe there was a very good reason for there not being a Docker image available, but after a little look around <em>that there interwebs</em> I came to the conclusion that it was simply because it's a young project, and generally run on real machines in production. Nothing made me think it was a terrible idea to run ActorDB in a Docker container, so why not give it a bash? <a href="https://github.com/bytepixie/actordb-for-docker">ActorDB for Docker</a> was born!</p>
<h2>The Dockerfile</h2>
<p>Having recently done a bunch of work for <a href="https://deliciousbrains.com">Delicious Brains</a> that involved using Docker, I wasn\'t too phased by the idea of spinning up a new <a href="https://docs.docker.com/engine/reference/builder/">Dockerfile</a>, and luckily there's an <a href="http://www.actordb.com/downloads.html">ActorDB package for Debian</a>.</p>
<p>I built a basic image based on <a href="https://www.debian.org/releases/jessie/">Debian Jessie</a>, and then logged into it and experimented with the steps I needed to run to get ActorDB installed and running. It took much less time than I expected as ActorDB is pretty self contained, the biggest issues I had were with making sure <em>curl</em> had all its dependencies in place to actually download the .deb file from within the running container (it needs some extra root certificates installed via a package).</p>
<p>I also rather stupidly forgot that the <code>actordb</code> program runs as a daemon by default, so the container kept just running and exiting cleanly. Once I realised what was going on, I simply ran the container with <code>--entrypoint /bin/bash</code> and then ran <code>actordb</code> without any arguments to get its usage info. Turns out you can run <code>actordb forground</code> rather than <code>actordb start</code> to get it to run in the current shell. Just what I needed.</p>
<p>I've been working with a <a href="https://hub.docker.com/r/wernight/phantomjs/">PhantomJS image</a> recently, and noticed that it used a script to ensure that the <em>phantomjs</em> binary did not run as the first process in the container (PID 1) as it may cause issues with shutting it down. So I nicked that idea.</p>
<p>The final <em><a href="https://github.com/bytepixie/actordb-for-docker/blob/master/build/Dockerfile">Dockerfile</a></em> is pretty simple, makes sure to expose the required ports and volume primary paths that ActorDB uses, and the image is available as an <a href="https://hub.docker.com/r/bytepixie/actordb/">automated build on Docker Hub</a>.</p>
<h2>Docker Compose</h2>
<p>A distributed database is no good without multiple nodes to distribute its data around, and of course I wanted to ensure the image could be used in a network of containers. I used <a href="https://docs.docker.com/compose/overview/">Docker Compose</a> to set up a very rudimentary cluster of three nodes, you can see the setup in the project root's <em><a href="https://github.com/bytepixie/actordb-for-docker/blob/master/docker-compose.yml">docker-compose.yml</a></em> file.</p>
<p>While the containers seemed to work (on second start, see <a href="https://github.com/bytepixie/actordb-for-docker/issues/1">issue #1</a> for details), could ping each other by their service names (e.g. actordb-server-1 could ping actordb-server-2), I spent ages trying to get the instances of ActorDB to actually replicate data between them. I eventually sorted it out with the following two important realisations:</p>
<ol>
<li>The <code>-name</code> setting in each node's <a href="https://github.com/bytepixie/actordb-for-docker/blob/master/node1/etc/vm.args"><em>vm.args</em></a> file must have a unique name before the @, the ip address/domain name after the @ doesn't make it unique.</li>
<li>You must update your <a href="https://github.com/bytepixie/actordb-for-docker/blob/master/node1/etc/init.example.sql">initialisation script</a> that is run on the leader to also register the other nodes in the cluster (you can register them manually later, but will need to copy the leader's <em>lmdb</em> file to them first).</li>
</ol>
<p>Once I'd worked that out, I was super happy to have a fully working cluster of ActorDB nodes!</p>
<h2>Quick Example</h2>
<p>The following text is a quick run through of bringing up a cluster, initialising it, writing some data to the first node, switching to the second node and showing the data replicated from the first, creating some more data, and then showing it all on the third node, but using the MySQL client. Enjoy!</p>
<pre><code class="language-bash">Ians-MBP:actordb-for-docker ian$ ./up.sh
Creating network actordbfordocker_default with the default driver
Creating actordbfordocker_actordb-server-1_1
Creating actordbfordocker_actordb-server-2_1
Creating actordbfordocker_actordb-server-3_1</code></pre>
<p><strong>actordb-server-1</strong> - Use <em>actordb_console</em> to run the SQL script that initialises the database:</p>
<pre><code class="language-bash">Ians-MBP:actordb-for-docker ian$ docker-compose exec actordb-server-1 actordb_console -f /etc/actordb/init.example.sql
Config updated.
Config updated.
Schema updated.</code></pre>
<p><strong>actordb-server-1</strong> - Use <em>actordb_console</em> to show the schema, create and select some data:</p>
<pre><code class="language-bash">Ians-MBP:actordb-for-docker ian$ docker-compose exec actordb-server-1 actordb_console -u myuser -pw mypass
*******************************************************************
Databases:
use config (use c)  initialize/add nodes and user account management
use schema (use s)  set schema
use actordb (use a) (default) run queries on database
*******************************************************************
Commands:
open         (windows only) open and execute .sql file
q            exit
h            print this header
commit (c)   execute transaction
rollback (r) abort transaction
print (p)    print transaction
show (s)     show schema
show status  show database status
show queries show currently running queries
show shards  show shards on node
*******************************************************************

actordb&gt; actor type1(hello_world);
actordb (1)&gt; insert into tab(id, txt) values(1,&#039;Hello World&#039;);
actordb (2)&gt; c
Error: {error,{nocreate,&gt;}}
actordb&gt; show
****************************************************************************************************************************************************************
sql                                                                                                                                                 type       |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$CREATE TABLE tab (id INTEGER PRIMARY KEY, txt TEXT);                                                                                               type1      |
$CREATE TABLE tab1 (id INTEGER PRIMARY KEY, txt TEXT);                                                                                              type1      |
$ALTER TABLE tab ADD i INTEGER;                                                                                                                     type1      |
$CREATE TABLE tabx (id INTEGER PRIMARY KEY CHECK (typeof(id) == &#039;integer&#039;), txt TEXT CHECK (typeof(id) == &#039;text&#039;));                                 type1      |
$CREATE TABLE asdf (id INTEGER PRIMARY KEY AUTOINCREMENT, txt BLOB);                                                                                type2      |
$CREATE TABLE actors (id TEXT PRIMARY KEY, hash INTEGER, val INTEGER) WITHOUT ROWID;                                                                counters   |
$CREATE TABLE actors (id TEXT PRIMARY KEY, hash INTEGER, size INTEGER)  WITHOUT ROWID;                                                              filesystem |
$CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, fileid TEXT, uid INTEGER, FOREIGN KEY (fileid) REFERENCES actors(id) ON DELETE CASCADE); filesystem |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
actordb&gt; actor type1(hello_world) create;                 
actordb (1)&gt; insert into tab(id, txt) values(1,&#039;Hello World&#039;);
actordb (2)&gt; c
Rowid: 1, Rows changed: 1
actordb&gt; actor type1(hello_world) create;                 
actordb (1)&gt; select * from tab;
actordb (2)&gt; c
*********************
i    id txt         |
---------------------
null 1  Hello World |
---------------------
actordb&gt; q
Bye!     </code></pre>
<p><strong>actordb-server-2</strong> - Use <em>actordb_console</em> to see the data created on actordb-server-1, and create some more:</p>
<pre><code class="language-bash">Ians-MBP:actordb-for-docker ian$ docker-compose exec actordb-server-2 actordb_console -u myuser -pw mypass
*******************************************************************
Databases:
use config (use c)  initialize/add nodes and user account management
use schema (use s)  set schema
use actordb (use a) (default) run queries on database
*******************************************************************
Commands:
open         (windows only) open and execute .sql file
q            exit
h            print this header
commit (c)   execute transaction
rollback (r) abort transaction
print (p)    print transaction
show (s)     show schema
show status  show database status
show queries show currently running queries
show shards  show shards on node
*******************************************************************

actordb&gt; actor type1(hello_world) create;
actordb (1)&gt; select * from tab;
actordb (2)&gt; c
*********************
i    id txt         |
---------------------
null 1  Hello World |
---------------------
actordb&gt; actor type1(hello_world) create;
actordb (1)&gt; insert into tab(id, txt) values(2, &#039;ActorDB Rules!&#039;);
actordb (2)&gt; c
Rowid: 2, Rows changed: 1
actordb&gt; q                                                    
Bye!     </code></pre>
<p><strong>actordb-server-3</strong> - Use the <em>mysql</em> client to connect to actordb-server-3's MySQL protocol port:</p>
<pre><code class="language-bash">Ians-MBP:actordb-for-docker ian$ mysql -u myuser -p -h127.0.0.1 -P33337
Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 0
Server version: 5.5.0-myactor-proto 5.5.0-myactor-proto

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type &#039;help;&#039; or &#039;\h&#039; for help. Type &#039;\c&#039; to clear the current input statement.

mysql&gt; actor type1(hello_world) create; select * from tab;
Query OK, 0 rows affected (0.01 sec)

+------+----------------+------+
| id   | txt            | i    |
+------+----------------+------+
|    1 | Hello World    | NULL |
|    2 | ActorDB Rules! | NULL |
+------+----------------+------+
2 rows in set (0.00 sec)

mysql&gt; actor type1(hello_world) create; update tab set i = id * 100;
Query OK, 0 rows affected (0.00 sec)

Query OK, 2 rows affected (0.02 sec)

mysql&gt; actor type1(hello_world) create; select * from tab;
Query OK, 0 rows affected (0.01 sec)

+------+----------------+------+
| id   | txt            | i    |
+------+----------------+------+
|    1 | Hello World    |  100 |
|    2 | ActorDB Rules! |  200 |
+------+----------------+------+
2 rows in set (0.00 sec)

mysql&gt; exit;
Bye</code></pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Options Pixie Pro Released, Finally.</title>
		<link>https://www.ianmjones.com/options-pixie-pro-released-finally/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 26 May 2016 07:28:03 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2016/05/26/options-pixie-pro.html</guid>

					<description><![CDATA[Well, I finally did it, I got Options Pixie Pro 1.0 for WordPress finished and released! After many late nights (but no weekends), I finally got to a point where I was very happy with how Options Pixie Pro was working, and confident that it provided enough value to be worthy of release. It's pretty &#8230; <a href="https://www.ianmjones.com/options-pixie-pro-released-finally/" class="more-link">Continue reading <span class="screen-reader-text">Options Pixie Pro Released, Finally.</span></a>]]></description>
										<content:encoded><![CDATA[<p>Well, I finally did it, I got <a href="https://www.bytepixie.com/products/options-pixie-pro/">Options Pixie Pro</a> 1.0 for WordPress finished and released!</p>
<p>After many late nights (but no <a href="https://mastermindjam.com/nightsandweekendspodcast/">weekends</a>), I finally got to a point where I was very happy with how Options Pixie Pro was working, and confident that it provided enough value to be worthy of release.</p>
<p>It's pretty awesome to have a new product out in the wild, it's been <a href="http://old.ianmjones.com/archives/2005/11/17/casedetective-10-released/index.html">over 10 years since I released my last product</a> on my own, through pinching time here and there in the evenings.</p>
<p>It feels a bit weird too when I realise that Options Pixie Pro is new to everybody. I've been using it for months during my normal work day, especially when testing <a href="https://deliciousbrains.com/wp-offload-s3/">WP Offload S3</a> as it's been perfect for inspecting the options records created for its settings and processing queues. It's very handy too when you need to <strong>add</strong>, <strong>edit</strong> or <strong>delete</strong> options records to mimic various scenarios while testing a plugin.</p>
<h3>Favourite Feature</h3>
<p>I think one of my favourite features of Options Pixie Pro is how you can edit a Base64 encoded serialized array, or fix a broken serialized array hidden behind Base64 encoding. Options Pixie Pro lets you see the hidden serialized string, edit or auto-fix it, and re-encodes it for you on save. I can only assume that the reason theme developers Base64 encode their settings is to preserve extended character sets regardless of MySQL's character encoding settings, but now you can edit and auto-fix those values. And if you can't be bothered to count the number of characters in the string you've just edited deep within a serialized array or object string, no problem, as long as the format is still valid Options Pixie Pro will fix those pesky character counts for you on save.</p>
<h3>Row Actions</h3>
<p>Of course, there are row level and bulk actions for fixing serialized values...</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215009/options-pixie-pro-fix-serialized-row-action.png" alt="Options Pixie Pro - Fix Serialized Row Action" /></p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215008/options-pixie-pro-fixed-serialized-record.png" alt="Options Pixie Pro - Fixed Serialized Record" /></p>
<h3>Bulk Actions</h3>
<p>And the same goes for row and bulk actions for deleting records...</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215008/options-pixie-pro-delete-row-action.png" alt="Options Pixie Pro - Delete Row Action" /></p>
<h3>Multisite Support</h3>
<p>And if you manage a multisite install of WordPress, you can inspect, add, edit, delete and fix options records across all your subsites...</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215008/options-pixie-pro-multisites-supported.png" alt="Options Pixie Pro - Multisites Supported" /></p>
<h3>Quick Demo</h3>
<p>Below I've embedded a quick animated gif of me exercising some of the features of Options Pixie Pro, click it to get a larger format version.</p>
<p><a href="https://assets.ianmjones.com/media/2017/02/24201939/options-pixie-pro-demo-1680x1050.mp4"><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215008/options-pixie-pro-demo.gif" alt="options-pixie-pro-demo" /></a></p>
<h3>Learning Experience</h3>
<p>It's been quite some learning experience. There's a lot involved in developing any kind of software product that you intend to sell and support. Apart from the actual software development, getting a website set up to sell direct downloads is generally more involved than it might look at first. But the good thing is, once it's set up for the first product, the second should be a lot easier to add.</p>
<p>If you're looking to <em>List, sort, search, view, add, edit, delete and fix your WordPress site's options records with style</em>, then please pop over to my business site and <a href="https://www.bytepixie.com/products/options-pixie-pro/">take a look at Options Pixie Pro</a>!</p>
]]></content:encoded>
					
		
		<enclosure url="https://assets.ianmjones.com/media/2017/02/24201939/options-pixie-pro-demo-1680x1050.mp4" length="15718981" type="video/mp4" />

			</item>
		<item>
		<title>My First WordPress Plugin: Options Pixie</title>
		<link>https://www.ianmjones.com/my-first-wordpress-plugin-options-pixie/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Sat, 06 Feb 2016 16:20:30 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2016/02/06/my-first-wordpress.html</guid>

					<description><![CDATA[There's been a number of times when I've wanted to quickly check the value of a record in the wp_options table of a WordPress site\'s database, but not had easy access to the database, usually when the site and database are on a remote server. I've tried using the /wp-admin/options.php page, but it's not ideal &#8230; <a href="https://www.ianmjones.com/my-first-wordpress-plugin-options-pixie/" class="more-link">Continue reading <span class="screen-reader-text">My First WordPress Plugin: Options Pixie</span></a>]]></description>
										<content:encoded><![CDATA[<p>There's been a number of times when I've wanted to quickly check the value of a record in the <em>wp_options</em> table of a <a href="https://deliciousbrains.com/tour-wordpress-database/#wp_options">WordPress site\'s database</a>, but not had easy access to the database, usually when the site and database are on a remote server. I've tried using the <code>/wp-admin/options.php</code> page, but it's not ideal and does not show the contents of serialized values, which of course is where so many interesting values lie in wait.</p>
<p>There are of course a few existing WordPress plugins for working with the <em>wp_options</em> database table, but none have quite fit my needs, either by not showing values in a usable way, not having good search and sort, or simply throwing a million errors when in debug mode (which you always seem to want on when the need arises for checking your options records).</p>
<p>Although I've been developing WordPress plugins for <a href="https://deliciousbrains.com">Delicious Brains</a> since mid 2014, I've never actually released a plugin of my own. That doesn't seem right, especially as most of my team mates have <a href="https://profiles.wordpress.org/a5hleyrich/#content-plugins">excellent</a> <a href="https://profiles.wordpress.org/bradt/#content-plugins">plugins</a> of <a href="https://profiles.wordpress.org/gilbitron/#content-plugins">their</a> <a href="https://profiles.wordpress.org/polevaultweb/#content-plugins">own</a>.</p>
<p>So I've scratched my itch as they say, and have developed and released my first open source WordPress plugin called <a href="https://wordpress.org/plugins/options-pixie/">Options Pixie</a>.</p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215009/options-pixie-list-view.png" alt="Options Pixie List View" /></p>
<p><img src="https://cdn.ianmjones.com/wp-content/uploads/2018/08/29215009/options-pixie-rich-view.png" alt="Options Pixie Rich View" /></p>
<p>Actually, as I write this, Options Pixie has been released and available from the WordPress plugins repository, <a href="https://github.com/bytepixie/options-pixie">GitHub</a> and my own <a href="https://www.bytepixie.com/products/options-pixie/">business site</a> for over 7 months, as I released it at the beginning of July 2015. I guess the fact that I haven't spoken about it here, only <a href="https://twitter.com/bytepixie/status/619063582907596800">once on twitter</a>, is a testament to my awesome marketing skills. Maybe not.</p>
<p>I'm not sure why I haven't been jumping up and down and shouting about Options Pixie, as I'm really quite proud of it. It works very well for what I need it to do, and I went to great pains to make it a very high quality and robust WordPress plugin. Maybe I can just blame my natural and very British reserve?</p>
<p>Regardless, I've finally finished off this post (I started it just a few days after releasing Options Pixie, 7 months ago), and encourage anyone that finds themselves in the position of needing to check the contents of their WordPress site's options table to search the WordPress plugins repository and install <a href="https://wordpress.org/plugins/options-pixie/">Options Pixie</a>. It's currently at version 1.0.1 having had a few bug fixes, and there's a new version in the wings which improves some of the behind the scenes functionality, enhances working with base64 encoded values, and is tested with the latest versions of WordPress.</p>
<p>Here's the highlights of what Options Pixie offers:</p>
<p>List, filter, sort and view options records, even serialized and base64 encoded values.</p>
<ul>
<li>List, sort and search options</li>
<li>“Rich view” of serialized and JSON string values</li>
<li>Works with base64 encoded serialized and JSON string values</li>
<li>Highlights broken serialized values</li>
<li>Supports Multisites</li>
</ul>
<p>With Options Pixie you can find out what is really going on with your WordPress options. I'm also working on <a href="https://www.bytepixie.com/products/options-pixie-pro/">Options Pixie Pro</a>, a paid addon that adds bulk actions such as delete and fix serialized, add, edit and delete functionality, and of course priority email support.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>My First iOS Game: Missed Three</title>
		<link>https://www.ianmjones.com/my-first-ios-game-missed-three/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Tue, 27 Oct 2015 08:07:36 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2015/10/27/my-first-ios.html</guid>

					<description><![CDATA[Update 2019-10-26: Missed Three is no longer available from the App Store, sorry. Today I had an email from Apple to say that my first iOS game, Missed Three, had entered In Review status, which I thought was pretty good as it'd only been submitted for review a week ago. Then, just 30 minutes later &#8230; <a href="https://www.ianmjones.com/my-first-ios-game-missed-three/" class="more-link">Continue reading <span class="screen-reader-text">My First iOS Game: Missed Three</span></a>]]></description>
										<content:encoded><![CDATA[<p><strong>Update 2019-10-26:</strong> Missed Three is no longer available from the App Store, sorry.</p>
<hr />
<p>Today I had an email from Apple to say that my first iOS game, <a href="http://www.missedthree.com">Missed Three</a>, had entered In Review status, which I thought was pretty good as it'd only been submitted for review a week ago. Then, just 30 minutes later I received another email to tell me that Missed Three was ready <del>for sale through the App Store</del>.</p>
<p>I guess when you make what is probably the simplest game on the App Store, it doesn't take very long to review! <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>It really is a very simple game, keep tapping the targets as they appear, when you've missed a total of three the game is over. Of course, it starts off at a reasonably slow pace, giving you a little while to tap a target before it disappears, but as the game goes on the targets disappear in an ever shorter time. It really does get pretty hectic if you're doing well.</p>
<p>If you get a new high score, you get an opportunity to share it with a friend by sending them an email. I intentionally did not add sharing by Twitter, Facebook or any other social media as I don't like seeing those kinds of things pollute my timeline, so why would I make it easy to do that in my game? Just challenge your friends directly, you know who will or will not take up the challenge, so why annoy anyone else?</p>
<p>If you're looking for something short and sweet to challenge friends with, you can <del>purchase Missed Three from the App Store</del>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Reboot</title>
		<link>https://www.ianmjones.com/reboot/</link>
		
		<dc:creator><![CDATA[ianmjones]]></dc:creator>
		<pubDate>Thu, 17 Sep 2009 09:00:52 +0000</pubDate>
				<category><![CDATA[blog]]></category>
		<guid isPermaLink="false">http://ianmjones.micro.blog/2009/09/17/reboot.html</guid>

					<description><![CDATA[Recently I was able to buy ianmjones.com, a slight upgrade to my existing ianmjones.net domain. On re-appraisal of the old ianmjones.net as was, I felt that the site did not reflect who I am now, so I made the decision to start from scratch, to reboot if you will. You are now reading the first &#8230; <a href="https://www.ianmjones.com/reboot/" class="more-link">Continue reading <span class="screen-reader-text">Reboot</span></a>]]></description>
										<content:encoded><![CDATA[<p>Recently I was able to buy ianmjones.com, a slight upgrade to my existing ianmjones.net domain.</p>
<p>On re-appraisal of the old ianmjones.net as was, I felt that the site did not reflect who I am now, so I made the decision to start from scratch, to reboot if you will.</p>
<p>You are now reading the first post on that clean slate.</p>
<p>Some might say starting again with a clean slate is not in the spirit of blogging, surely a blog should morph and transform over time as you do, and still others might comment that at the very least I will be losing valuable search ranking.</p>
<p>I’m in the process of cleaning out and simplifying many aspects of my life, and this site is most definitely needing my attention, along with all my other web sites.</p>
<p>The majority of traffic to this site over the last couple of years has been to “off topic” posts about matters that have no long-term interest for me from people who in general won’t have any reason to ever return. That’s not very useful, to me, or to those visitors arriving by searches that I would never have occasion to try myself.</p>
<p>As the last post on the old site notes, my old site succumbed to the WordPress worm that has attacked older versions of WordPress and laid dormant until just recently. It's a good time to clean house.</p>
<p>Also, you may or may not have noticed, but this site does not have any form of commenting mechanism. This is not an over-sight, it is intentional. If you would like to comment on anything I should put up on this site, please feel free to send me an email, tweet, IM or even a dead tree letter, or better still write something thought-provoking on your own site.</p>
<p>Often, when this site has been re-born I’ve made some promises or shared some hopes as to what I expected to do with it, this time I make no such promises or declarations of intent.</p>
<p>Previous versions of this site can be found at:</p>
<p><a href="http://old.ianmjones.com">old.ianmjones.com</a> (covering dates 2004-09-30 to 2009-09-16)<br />
<a href="http://old.ianmjones.net">old.ianmjones.net</a> (covering dates 2002-02-11 to 2004-09-30)</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
