<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Hannah Wolfe]]></title><description><![CDATA[Hannah Wolfe]]></description><link>https://hannah.wf/</link><image><url>https://hannah.wf/favicon.png</url><title>Hannah Wolfe</title><link>https://hannah.wf/</link></image><generator>Ghost 2.21</generator><lastBuildDate>Wed, 24 Apr 2019 20:11:01 GMT</lastBuildDate><atom:link href="https://hannah.wf/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Ghost & Ember @ EmberCamp]]></title><description><![CDATA[<p>On Thursday, I had the privilege of speaking at EmberCamp in London about the experience of switching Ghost to using Ember. I wasn't sure what to expect from EmberCamp, as I'm not really an Ember dev, but I found myself having a thoroughly enjoyable day. The atmosphere of the conference</p>]]></description><link>https://hannah.wf/embercamp-2015/</link><guid isPermaLink="false">5c17bb01084f7900cb421e62</guid><category><![CDATA[Speaking]]></category><category><![CDATA[Conferences]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Wed, 04 Nov 2015 12:48:49 GMT</pubDate><media:content url="https://hannah.wf/content/images/2015/11/Screen-Shot-2015-11-04-at-10-07-01.png" medium="image"/><content:encoded><![CDATA[<img src="https://hannah.wf/content/images/2015/11/Screen-Shot-2015-11-04-at-10-07-01.png" alt="Ghost & Ember @ EmberCamp"><p>On Thursday, I had the privilege of speaking at EmberCamp in London about the experience of switching Ghost to using Ember. I wasn't sure what to expect from EmberCamp, as I'm not really an Ember dev, but I found myself having a thoroughly enjoyable day. The atmosphere of the conference was noticeably positive, upbeat and open minded, it was a great place to be.</p>
<p>Jamie &amp; Leah did a great job of organising this conference to be a small, friendly, community event and I think Yehuda's keynote worked perfectly to set up a positive mindset for the day. I'm really happy that I got to be a part of it :)</p>
<p>Below are the slides from my talk. They won't make much sense on their own (they probably didn't in context either, haha) - so in this post, I thought I'd take a little bit of time to write down the key points of my talk as a reference. Turns out it's a 1500 word essay, who knew? Enjoy...</p>
<p><strong>Update 2015-12-01:</strong> The full talk is now available <a href="https://www.youtube.com/watch?v=oOZ25fjvsc0">on youtube</a>.</p>
<hr>
<h2 id="ghostember">Ghost &amp; Ember</h2>
<script async class="speakerdeck-embed" data-id="f8fee294bec94796be73f3382b9876c3" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
<p>Before Ember, the Ghost admin was a small but messy backbone.js application. In January last year, we hit a roadblock with it. The code had become incredibly fragile, and we had reached a point where we felt we just could not add anything else to it, for the fear that it would just collapse in on itself. We realised we needed a new toolset.</p>
<p>In order to figure out which tool to use, we needed to have a big public discussion, and gather as much input from as many members of the community as possible. This was done via a <a href="https://github.com/TryGhost/Ghost/issues/2144">GitHub issue</a>, which ended up being a very positive, productive discussion.</p>
<p>Ember was chosen for two main reasons:</p>
<ol>
<li>It fit our need for a tool that made lots of decisions for us - making it easier to collaborate in an Open Source environment.</li>
<li>The Ember community got involved with the discussion and showed us that they were a friendly, passionate and helpful group - they gave us the confidence to choose Ember.</li>
</ol>
<h3 id="migration">Migration</h3>
<p>As we started looking at the work of switching, we quickly realised that we needed to improve our JSON API before we'd be able to support an Ember app in Ghost. At the time, our API wasn't clean, consistent or complete so there was much to do, particularly around the auth flows. Building an Ember app necessarily requires you to have a strong API, so this is something to keep in mind when choosing a framework.</p>
<p>Because the API was an area we were familiar with, and Ember was not, the Ghost team ended up focusing heavily on the API improvements. Meanwhile a collection of people from the Ember community and regular Ghost contributors set to work building the admin in Ember on a branch. This meant that the Ghost team barely got to touch Ember - the project was almost entirely completed by volunteers.</p>
<p>Part way through the conversion, we got cold feet about shipping a new version of Ghost that had no tangible improvements for our users. We decided that rather than just completely rewriting the existing admin, we'd write the new admin with multi user support (til then, Ghost had been a single author blog).</p>
<p>So, the project took us about 6 months in total. Longer than we expected, but as well as getting a shiny new Ember admin there were lots of other positive outcomes. For one, we now had a shiny new API.</p>
<p>In particular, we learned a great deal from working with the Ember community. We have always seen the Ember project as a model open source project. Soon after the migration was finished, we adopted the idea of having a '<a href="https://github.com/TryGhost/Ghost/wiki/Core-Team">Core Team</a>' and invited some of our volunteer contributors to join.</p>
<h3 id="oneyearlater">One year later</h3>
<p>It has now been over a year since we shipped the first version of Ghost with an Ember admin UI. This gives us an interesting viewpoint from which we can look back over the decision making process, the migration process and the challenges we've faced in the time since to really assess the impact that switching to Ember has had on our product.</p>
<p>Firstly, we're certain we made the right choice. If we made the decision over again today, we'd still choose Ember. We are now operating on a whole different level in terms of the difficulty of the problems we are able to solve easily with the tools we have.</p>
<p>However, we still feel we're not quite moving as fast as we could be, we believe there's more power &amp; productivity in Ember that we haven't yet unlocked. To explain this thinking, let me explain my theory of Ember &amp; complexity:</p>
<h4 id="embercomplexity">Ember &amp; Complexity</h4>
<p>In explanations about the intentions or goals of Ember, I've heard Yehuda &amp; Tom talk a lot about  complexity. One thing I found very interesting is the idea that, in client-side JS apps, there is a tendency to end up with overly complex applications, largely because of the use of the global scope.</p>
<p>That is, if every object in your application has access to every other object in your application, then it becomes easy to make use of that and build tightly coupled systems. Because of the network effect, complexity can grow exponentially as you add new objects to the application.</p>
<p>If complexity grows exponentially, then there comes a 'point of no return' where you balk at the task of adding anything new because it is so hard. That's what happened with our backbone application.</p>
<p><img src="http://puu.sh/l4yaQ.png" alt="Ghost & Ember @ EmberCamp"></p>
<p>Ember takes measures to prevent this from happening.  Every time you add a new object in an Ember app it starts off isolated. You have to choose to add access to other objects. This is just one of the things that can help to keep complexity to a minimum.</p>
<p>The theory here, is that Ember sort of flips the complexity graph on its head.</p>
<p>When you start with an Ember app, the boiler plate or foundation is already significantly complex - so there's a well-known steep learning curve to getting familiar with all of that 'stuff'.</p>
<p>However, once you overcome that learning curve, the intention is, you hit a 'sweet spot' where that complexity will grow linearly. So there's an upfront cost and you reap the benefits later. As several people said to me after my talk: if you're building multiple Ember apps, you also only ever have to pay this cost once.</p>
<p>For Ghost, I believe that 'sweet spot' is still in the not too distant future. There are still a number of challenges that we are in the process of overcoming that will eventually lead to us (hopefully) hitting that sweet spot.</p>
<h3 id="challenges">Challenges</h3>
<p>Overcoming the Ember learning-curve as an organisation, has been a challenge. We didn't do a great job of internalising Ember knowledge during the migration project, meaning we ended up without a full-time technical leader for the Ember app.</p>
<p>Just a few months ago, we took a major step towards fixing this by hiring our <a href="https://blog.ghost.org/kevin-ansfield/">very own Ember magician</a>. This means we now have clear leadership and direction for the Ember app.</p>
<h4 id="testing">Testing</h4>
<p>One major thing that I believe has been holding us back, has been testing. Ember unit testing wasn't much of a thing when we first started out, so we relied on our existing end-to-end tests that were written in Casper.js. These still worked after we switched to Ember but they lost a lot of their value.</p>
<p>That test suite had been designed to test for the high level problems we were having with Backbone.js. Things like whether items render in the right place at the right time, and if saving still works, etc. However, with Ember.js, the issues that result in bugs and common regressions are a completely different class of problem. Usually a detail of a state or state change, perhaps an edge case, somewhere within a complex component.</p>
<p>These are problems that lend themselves much better to unit testing than to end-to-end testing.</p>
<p>Last year we looked into adding unit tests, and with <a href="https://github.com/TryGhost/Ghost/pull/4527">Robert Jackson's help</a> got our first unit tests in place. However, as there was no real leadership in that area at the time, there hasn't been a push to get good quality coverage.</p>
<p>More recently, we hit a critical point with our old end-to-end tests. They were no longer delivering anywhere near enough value in terms of the problems they detected vs how much work they required to maintain. Random failures meant we had to babysit PRs to get them to pass in Travis.</p>
<p>A few weeks ago, I had a realisation. I had been holding onto those tests because they made me feel confident that the admin panel was working. Yet, if the tests aren't really testing the right things, then this is an illusion - a false sense of confidence.</p>
<p>So I turned the tests off. Now I feel very uncomfortable, but at least that sense of discomfort reflects reality.</p>
<p>We're now working towards getting a full suite of Ember acceptance tests in place. As high quality tests are critical to the idea of 'moving fast and not breaking too many things' I am certain that this will catapult us further over that learning curve and into the sweet spot :)</p>
<h4 id="embermovesfast">Ember moves fast</h4>
<p>When we started out, despite Ember's opinionatedness, there was still confusion around some aspects, particularly views, controllers and components. It's fantastic that the framework is evolving to solve those problems, however it does leave a bunch of legacy code in its wake that needs refactoring in order to keep up.</p>
<p>We've been blessed to have contributors and Ember community members do a great deal of the work to keep us up to date (and we pretty much are), but I think it begs the question:</p>
<blockquote>
<p>What else could have been achieved with that time and effort?</p>
</blockquote>
<p><small>Note: After my talk, it seemed this may have come across as a direct criticism. It really isn't intended that way. I value the fact that Ember evolves quickly and isn't afraid to remove features that don't work well - having to keep up is the trade-off. Perhaps there's a way to shift or improve the balance, but I certainly wouldn't want Ember to stop evolving.</small></p>
<h3 id="opensourceisawesome">Open Source is awesome</h3>
<p>I worried that some of my talk came across as overly negative. It's easy to be critical in hindsight, so I felt it was worth highlighting some key positive aspects of the process.</p>
<p><strong>1. The conversion was a triumph of the open source community.</strong></p>
<p>Our app was built almost entirely by volunteers. The Ember community is amazing, full of people who will help you. It's a great group to be a part of.</p>
<p><strong>2. We haven't gotten stuck</strong></p>
<p>A fear I've heard many times is that because Ember is 'monolithic', sometime in the future you may find yourself in a situation where you want to do something the framework doesn't allow, and you may get stuck.</p>
<p>We're over a year down the line and that hasn't happened :)</p>
<p><strong>3. Stand on the shoulders of giants</strong></p>
<p>Ember is an incredibly powerful tool if you embrace it. When you build an app the way Ember intends, you're leveraging the knowledge, experience and learning of the incredibly smart people behind the project. When you build an app with a tool like Ember, you are standing on the shoulders of giants. This is the true power of Open Source Software.</p>
]]></content:encoded></item><item><title><![CDATA[npm module maintainer must-haves]]></title><description><![CDATA[<p>Maintaining a module on npm can be a little daunting. For modules with lots of dependencies, the task of keeping them up-to-date can be time consuming. These two handy modules are must-haves for making the process quick and easy, install them globally to get the best effect:</p>
<h3 id="nspaudit">nsp audit</h3>
<ul>
<li><code>npm</code></li></ul>]]></description><link>https://hannah.wf/npm-maintenance/</link><guid isPermaLink="false">5c17bb01084f7900cb421e5e</guid><category><![CDATA[node]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Wed, 03 Jun 2015 11:12:37 GMT</pubDate><content:encoded><![CDATA[<p>Maintaining a module on npm can be a little daunting. For modules with lots of dependencies, the task of keeping them up-to-date can be time consuming. These two handy modules are must-haves for making the process quick and easy, install them globally to get the best effect:</p>
<h3 id="nspaudit">nsp audit</h3>
<ul>
<li><code>npm install -g nsp</code></li>
<li><code>nsp audit-package</code></li>
</ul>
<p>The <a href="https://nodesecurity.io/">node security project</a> maintains a database of security vulnerabilities in modules on npm. The <a href="https://www.npmjs.com/package/nsp"><code>nsp</code></a> module will audit your package.json (or npm-shrinkwrap.json) file to check if any of your current dependencies have known vulnerabilities.</p>
<p>Vulnerabilities tend to get patched up pretty quick. Knowing about them gives you the choice to upgrade, or find an alternative dependency to keep your code secure.</p>
<h3 id="npmcheck">npm-check</h3>
<ul>
<li><code>npm install -g npm-check</code></li>
<li><code>npm-check</code></li>
</ul>
<p>This is <em>the</em> missing module for maintainers. <a href="https://www.npmjs.com/package/npm-check"><code>npm-check</code></a> uses semver to output how far out-of-date your dependencies are, and also reports on modules that seem to be unused.</p>
<p>If you've reviewed your dependencies and decided it's time to do some updates you can run <code>npm-check -u</code> to get an interactive upgrade experience! Mark the modules you want to upgrade with a space, then hit enter and npm-check will fix up your package.json, as well as run <code>npm install</code> AND finally, it reminds you to run your test suite at the end. Pure awesome.</p>
<figure>
![npm check](/content/images/2015/06/Screen-Shot-2015-06-03-at-12-48-30.png)
<figcaption><code>npm-check -ups</code> updates all production dependencies, skipping any seemingly unused ones (in Ghost's case, they are used)</figcaption>
</figure>
<hr>
<h2 id="bonustips">Bonus tips...</h2>
<p>Back in February, I watched Dan Hough's talk on <a href="https://www.youtube.com/watch?v=rCM2paoike0">npm module maintenance</a> best practice at <a href="http://lnug.org">LNUG</a>. The talk was also distilled into a handy <a href="http://danhough.com/blog/nodejs-maintainer/">blog post</a>. There were two key take-aways that I wanted to reiterate:</p>
<h3 id="dontoverlookcontributingmd">Don't overlook CONTRIBUTING.md</h3>
<p>GitHub's <code>CONTRIBUTING.md</code> file is a much under-used feature. It's the first thing I look for when I visit a new repo and usually I'm hunting for info on the project's preferred medium for questions, as every project is different. It's always worth taking two minutes to include one, even if it just says 'Please contribute'. It really helps to give new would-be-contributors like me confidence to get involved.</p>
<h3 id="shrinkwrapforreleases">shrinkwrap for releases</h3>
<p>The importance and usefulness of npm-shrinkwrap cannot be understated. I recently started shipping an <code>npm-shrinkwrap.json</code> file with the released versions of Ghost, which helps to ensure everyone gets the same experience. Most importantly, it eliminates tricky bugs caused by dependencies getting accidental breaking changes.</p>
<p>Admittedly, we still don't use it in the master branch because managing the checked-in file is a bit clunky, especially with a fast-moving codebase. However, we'll likely review this as the project matures.</p>
]]></content:encoded></item><item><title><![CDATA[Why Zelda has me so excited.]]></title><description><![CDATA['Zelda' is the (awesome) code name for the latest iteration on the design of the Ghost admin. Built on patterns, it provides space for all future features.]]></description><link>https://hannah.wf/zelda/</link><guid isPermaLink="false">5c17bb01084f7900cb421e5d</guid><category><![CDATA[Ghost]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Sun, 24 May 2015 19:15:19 GMT</pubDate><media:content url="https://hannah.wf/content/images/2015/05/screencapture-localhost-2368-blog-ghost-settings-general-1432385745037.png" medium="image"/><content:encoded><![CDATA[<img src="https://hannah.wf/content/images/2015/05/screencapture-localhost-2368-blog-ghost-settings-general-1432385745037.png" alt="Why Zelda has me so excited."><p>John has been laughing at me this past week because I'm quite literally jumping-up-and-down excited about Zelda. On Friday we merged <a href="https://github.com/TryGhost/Ghost/pull/5273">Zelda</a> into master and I'm bouncing off the walls. The volume of work  involved has caused John to lose a little of his zeal for the project, so I'm gonna shout from the roof tops about it on his behalf.</p>
<hr>
<p>'Zelda' is the (awesome) code name for the latest iteration on the design of the Ghost admin. Here are a few screenshots of how it looks:</p>
<figure>
![Content management screen](/content/images/2015/05/screencapture-localhost-2368-blog-ghost-1-1432381921152.png)
<figcaption>Content management screen with new vertical menu bar</figcaption>
</figure> 
<figure>
![Login screen](/content/images/2015/05/Screen-Shot-2015-05-23-at-10-09-55-1.png)
<figcaption>Login screen with lighter colour scheme</figcaption>
</figure> 
<p>The Ghost admin interface has already had a couple of design iterations. When we started out in 2013, we were building a piece of software based on <a href="http://john.onolan.org/project-ghost/">some sketches</a> in a blog post that people seemed to like. We weren't really thinking about the future, as <a href="https://github.com/TryGhost/Ghost/pull/5273">John said</a> about the interface:</p>
<blockquote>
<p>It was also only designed with a very narrow use-case of &quot;it should do X&quot; - rather than &quot;it should do X now, Y in 6 months and Z in a year&quot;.</p>
</blockquote>
<p>The rigid design of the interface frequently left us stuck unable to add a new feature because there just wasn't a space for it. The least flexible part was the post settings menu, a small popover component that wasn't able to expand to fit new options. This was the no.1 reason why it took us so long to add post cover images.</p>
<figure>
![Old post settings menu](/content/images/2015/05/screencapture-localhost-2368-ghost-editor-1-1432382800774.png)
<figcaption>No room for an image uploader!</figcaption>
</figure> 
<p>Almost a year ago now, during the Ember rewrite, we embarked on adding a new version of the <a href="https://github.com/TryGhost/Ghost/issues/3822">post settings menu</a>, again to use John's words, the new PSM is <em>&quot;extensible, fast, and it is build with patterns instead of a fixed design&quot;</em>. The new flexible layout of the PSM allowed us to quickly add new features including post images and meta data.</p>
<figure>
![New post settings menu](/content/images/2015/05/screencapture-localhost-2368-ghost-editor-1-1432382964756.png)
<figcaption>Space for all the things!</figcaption>
</figure> 
<p>Now that we're <a href="http://blog.ghost.org/year-2/">2 years into this journey</a>, we're very much thinking about where we want Ghost to go, and we've got big ideas.</p>
<p>Zelda represents this turning point. We're no longer working through the backlog of basic features or trying to fulfil the commitments we made during the KickStarter campaign. We're looking to the future, and to the next set of features that will turn Ghost from an awesome little basic blogging tool, into a fully-fledged publishing platform.</p>
<p>The Ghost team is constantly balancing between the 'move fast and break things' approach and consistently delivering stable software that users can rely upon. This is exacerbated by the fact we're fighting technical challenges both in the Ghost software itself, and on our Ghost(Pro) hosting platform, whilst also trying to ensure the features we release are carefully considered and worthy of the Ghost brand.</p>
<p>When the user interface gets in our way, it's just one more thing we have to contend with that keeps us moving slower than we would like. The interface is a particular challenge because it's not something the OSS community can easily help with. As much as we wish there was a GitHub-style solution for design, there really isn't, and that puts a great deal of pressure on John to problem solve every minor UI and UX issue.</p>
<p><em><strong>Zelda gives us the same flexibility and extensibility we have in the post settings menu, but for the entire interface.</strong></em></p>
<p>No more getting stuck looking for a space for a feature or compromising on features because the interface needs a rework. With Zelda not only is there space for more application frame elements (like a search bar) and a more flexible space for navigation items, but there's also more space for writing posts <em>and</em> it automatically works better on mobile.  Zelda sets the Ghost interface free.</p>
<p>And so I'm bouncing off the walls with excitement. I don't know which issue to write first, I don't know which feature to start on next, so many possibilities, so much freedom. So I wrote a blog post instead!</p>
<p><em>Well it was about time.</em></p>
]]></content:encoded></item><item><title><![CDATA[Spring Reflections]]></title><description><![CDATA[<p><img src="https://hannah.wf/content/images/2014/Mar/spring_smaller_png.png" alt></p>
<p>I'm sat outside relaxing &amp; enjoying the last few minutes of sunshine offered by the second joyous March Sunday in a row. In between a spot of gardening, I've managed to finish the refactor &amp; upgrade of the Ghost editor I've been working on for a few days. Now it's</p>]]></description><link>https://hannah.wf/spring-reflections/</link><guid isPermaLink="false">5c17bb01084f7900cb421e52</guid><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Sun, 16 Mar 2014 19:38:19 GMT</pubDate><media:content url="https://hannah.wf/content/images/2014/Mar/spring_smaller_png.png" medium="image"/><content:encoded><![CDATA[<img src="https://hannah.wf/content/images/2014/Mar/spring_smaller_png.png" alt="Spring Reflections"><p><img src="https://hannah.wf/content/images/2014/Mar/spring_smaller_png.png" alt="Spring Reflections"></p>
<p>I'm sat outside relaxing &amp; enjoying the last few minutes of sunshine offered by the second joyous March Sunday in a row. In between a spot of gardening, I've managed to finish the refactor &amp; upgrade of the Ghost editor I've been working on for a few days. Now it's time to test it out.</p>
<blockquote class="twitter-tweet" lang="en"><p>Time to try upgrading CodeMirror &amp; see if we can deliver some incremental, yet important improvements to the Ghost Editor. Fingers Crossed.</p>&mdash; Hannah Wolfe (@ErisDS) <a href="https://twitter.com/ErisDS/statuses/445136520107020289">March 16, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I try to continuously put Ghost through its paces by sitting down and actually blogging, especially when there are big changes. Today I've gotten a bit bored of the 0.4.2 theme update post I've been crafting (coming soon). Instead I had a little wave of inspiration for something a bit different.</p>
<p>I find it fascinating just how much the start of Spring inspires renewal. New Year's resolutions are such a popular tradition, but I personally find the burst of energy brought by that first bit of post-Winter sunshine is a much better springboard for change. This year I feel like the daffodils I just planted - bright, fresh and full of the promise of Spring!</p>
<p>It's been a pretty tough Winter. I've been working so intensively on Ghost that I accidentally became a weird hermit-geek that operates in a dark space, wears the same hoodie day after day and forgets that there is anything outside of the internet. My poor husband deserves many medals.</p>
<p>With the dawn of Spring last weekend came the promise of using outdoor spaces again. Warmth and sunlight means I can ditch the hoodie, the fresh air is intoxicating, the sense of being overwhelmed is melting away, and the physical activity is doing me the world of good. The occasion calls for recognition, I intend to stamp this sense of newness and opportunity on my mind by writing it down.</p>
<p>My personal blog has been much unloved the past year. Part of me feels a sense of loss at not having blogged more of the journey I've been on with Ghost, or the previous transition into the world of JavaScript. There has been so much going on, so many changes, that I haven't really known what was worth writing about.</p>
<p>Today I am committing to changing that. I'm not going to go back and write up the history of the last year, John's already <a href="http://john.onolan.org/part-i-lets-begin-at-the-beginning/">doing that</a> and it's well worth a read. Instead I intend to take back my blog as a space for reflection, somewhere to do a little mental weeding, and perhaps plant an idea or two.</p>
]]></content:encoded></item><item><title><![CDATA[The *official* switch-over]]></title><description><![CDATA[<p>I've spent the majority of the last year of my life building a <a href="https://ghost.org">blogging platform</a>. This has lead to some folk asking why my old blog &amp; homepage 'erisds.co.uk' continued to live on WordPress. It's a sensible question - why should anyone else use our platform if we</p>]]></description><link>https://hannah.wf/the-official-switch-over/</link><guid isPermaLink="false">5c17bb01084f7900cb421e50</guid><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Mon, 24 Feb 2014 08:35:50 GMT</pubDate><content:encoded><![CDATA[<p>I've spent the majority of the last year of my life building a <a href="https://ghost.org">blogging platform</a>. This has lead to some folk asking why my old blog &amp; homepage 'erisds.co.uk' continued to live on WordPress. It's a sensible question - why should anyone else use our platform if we aren't willing to?</p>
<h3 id="bloggingelsewhere">Blogging elsewhere</h3>
<p><img src="https://hannah.wf/content/images/2014/Feb/ss__2014_02_24_at_08_38_53_.jpg" alt="dev.ghost.org"></p>
<p>Truth is I've been blogging on Ghost since day one. I've had 3 or 4 different Ghost blogs about different subjects hosted by various mechanisms, the main one being <a href="http://dev.ghost.org">dev.ghost.org</a>. However, my old blog with its legacy content about PHP stuff that I was doing 3/4 years ago and various pages with who-knows-what lurking on them was a minefield I didn't want to face. It desperately needed a refresh, I wasn't using it, and I have had 100 million more important things on my todo list than sorting out my old website!</p>
<p>At the very beginning of 2011 I moved from doing predominantly PHP &amp; WordPress-based agency work, to working for MOO.COM where my daily tasks had me coding in PHP, Java, ActionScript, JavaScript and even Python. My years at MOO lead me to favour JavaScript, but the enormous commute to London left me little time for blogging. My old site became like a dusty old diary lost under the bed, a shadow of a former me - interesting, perhaps even useful to some, but not really relevant to the developer I am now.</p>
<h2 id="anewleaseoflife">A new lease of life</h2>
<p>Today, I am bringing my old site to life again in a new home and under my real name <a href="http://hannah.wf">Hannah Wolfe</a> (hannah.wf). I've merged my old posts with posts from various Ghost blogs I've been keeping &amp; set it all up in a new home on <a href="https://ghost.org">Ghost's Hosted Service</a>.</p>
<p><img src="https://hannah.wf/content/images/2014/Feb/ss__2014_02_24_at_08_41_42_.jpg" alt="hannah.wf"></p>
<p>It's cleaner, it's more grown up, and it's totally focused on blogging. I hope to continue to keep this blog in the same style as the old - a kind of 'notes to self' (and anyone listenting) diary of interesting things I discover. Expect the content to start leaning heavily towards JavaScript &amp; Open source though - my PHP days are (mostly) over.</p>
]]></content:encoded></item><item><title><![CDATA[Ghost Busting: building node apps for the masses]]></title><description><![CDATA[<p><img src="https://hannah.wf/content/images/2014/Feb/LJSPosters_Ghostbusters.png" alt="Poster"><br>
Poster by <a href="http://twitter.com/lurkmoophy">Luke Murphy</a></p>
<p>On 13th Feb I gave a <a href="http://lanyrd.com/2014/londonjsconf/scwxxb/">talk</a> about Ghost, being open source, and making node work for the masses at <a href="http://www.londonjsconf.com/">London JS Conf</a>.</p>
<p>My slides for the talk can be found on speakerdeck.</p>
<script async class="speakerdeck-embed" data-id="711468507c5001313f563286aa0cf194" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
<p>If you want to make sense of the slides, <a href="http://www.flickr.com/photos/francisrowland/">Francis Rowland</a> did an</p>]]></description><link>https://hannah.wf/ghost-busting-building-node-apps-for-the-masses/</link><guid isPermaLink="false">5c17bb01084f7900cb421e01</guid><category><![CDATA[Speaking]]></category><category><![CDATA[Conferences]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Thu, 20 Feb 2014 18:44:33 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://hannah.wf/content/images/2014/Feb/LJSPosters_Ghostbusters.png" alt="Poster"><br>
Poster by <a href="http://twitter.com/lurkmoophy">Luke Murphy</a></p>
<p>On 13th Feb I gave a <a href="http://lanyrd.com/2014/londonjsconf/scwxxb/">talk</a> about Ghost, being open source, and making node work for the masses at <a href="http://www.londonjsconf.com/">London JS Conf</a>.</p>
<p>My slides for the talk can be found on speakerdeck.</p>
<script async class="speakerdeck-embed" data-id="711468507c5001313f563286aa0cf194" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
<p>If you want to make sense of the slides, <a href="http://www.flickr.com/photos/francisrowland/">Francis Rowland</a> did an awesome set of <a href="http://www.flickr.com/photos/francisrowland/12634568645/in/set-72157641213628793">sketch notes</a>, and there is also a <a href="http://www.richardmccartney.co.uk/london-js-conf-2014/">lovely write-up</a> of the whole <a href="http://www.londonjsconf.com/">London JS Conf</a> which has been published via a Ghost blog :)</p>
]]></content:encoded></item><item><title><![CDATA[Getting Ghost on Joyent SmartOS]]></title><description><![CDATA[<p>This is a quick post about getting Ghost onto a Joyent cloud instance, with the intention of using dtrace on SmartOS to inspect &amp; optimise Ghost's memory utilisation.</p>
<p>Sign up for an account on Joyent, set up your key, and then hit create instance. It'll ask you to choose an</p>]]></description><link>https://hannah.wf/getting-started-with-ghost-on-smartos/</link><guid isPermaLink="false">5c17bb01084f7900cb421dfb</guid><category><![CDATA[Ghost]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Wed, 20 Nov 2013 19:13:39 GMT</pubDate><content:encoded><![CDATA[<p>This is a quick post about getting Ghost onto a Joyent cloud instance, with the intention of using dtrace on SmartOS to inspect &amp; optimise Ghost's memory utilisation.</p>
<p>Sign up for an account on Joyent, set up your key, and then hit create instance. It'll ask you to choose an image, I went for the first one:</p>
<p><img src="http://f.cl.ly/items/3n0K3r0I2k0L1e233l1H/Image%202013.11.20%2019%3A03%3A36.png" alt></p>
<p>And all you need is the smallest package:</p>
<p><img src="http://f.cl.ly/items/3L021w2Q1F2S430v1I2N/Image%202013.11.20%2019%3A02%3A08.png" alt></p>
<p>Give your instance a name, hit 'Create Instance' and wait for it to start. Once it's up and running ssh into the box and run the following commands...</p>
<p>Install unzip, gcc47 and gmake packages:</p>
<p><code>pkgin install unzip gcc47 gmake</code></p>
<p>Download the latest Ghost package:</p>
<p><code>wget http://ghost.org/zip/ghost-latest.zip --no-check-certificate</code></p>
<p>Unzip Ghost into a directory called <code>ghost</code>:</p>
<p><code>unzip ghost-0.3.3.zip -d ghost</code></p>
<p>Change into your new directory</p>
<p><code>cd ghost</code></p>
<p>Install all of Ghost's dependencies:</p>
<p><code>npm install --production</code></p>
<p>Create a config file from the example:</p>
<p><code>cp config.example.js config.js</code></p>
<p>Open the config file for editing:</p>
<p><code>vim config.js</code></p>
<p>Change the IP address and port for development to <code>0.0.0.0</code> and <code>80</code> respectively. Save, and exit vim.</p>
<p>Finally start up ghost by typing</p>
<p><code>npm start</code></p>
<p>And then visit your public IP in a browser to see Ghost running.</p>
<p>Navigate to <code>http://your-ip/ghost/</code> to create an account and start writing posts.</p>
]]></content:encoded></item><item><title><![CDATA[First post on the Ghost hosted service]]></title><description><![CDATA[<p>It's 9am and I'm sat in Lisbon airport making good use of the free WiFi after an excellent trip to <a href="http://2013.lxjs.org/">LxJS 2013</a> (more about that in a later post). I'm super excited because I have just setup my first blog on Ghost.org, Ghost's brand new hosted service. There's more</p>]]></description><link>https://hannah.wf/first-post-on-hosted-service/</link><guid isPermaLink="false">5c17bb01084f7900cb421dfa</guid><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Sat, 05 Oct 2013 07:27:28 GMT</pubDate><content:encoded><![CDATA[<p>It's 9am and I'm sat in Lisbon airport making good use of the free WiFi after an excellent trip to <a href="http://2013.lxjs.org/">LxJS 2013</a> (more about that in a later post). I'm super excited because I have just setup my first blog on Ghost.org, Ghost's brand new hosted service. There's more testing to do yet, but I really can't wait to roll out this experience of Ghost to our users.</p>
<p>I'll likely be keeping this as the new home of my personal blog, more soon.</p>
<p>Tem um bom dia!</p>
]]></content:encoded></item><item><title><![CDATA[Grunt & Ghost]]></title><description><![CDATA[<p>Getting Ghost deployed to an EC2 instance was a real win yesterday. I wrote my first ever bash script to configure EC2 for running Ghost, and quickly managed to write my second ever bash script to build and deploy Ghost to specifc EC2 instance. Feeling pretty pleased with myself.</p>
<p>The</p>]]></description><link>https://hannah.wf/grunt-ghost/</link><guid isPermaLink="false">5c17bb01084f7900cb421dfc</guid><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Tue, 17 Sep 2013 10:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Getting Ghost deployed to an EC2 instance was a real win yesterday. I wrote my first ever bash script to configure EC2 for running Ghost, and quickly managed to write my second ever bash script to build and deploy Ghost to specifc EC2 instance. Feeling pretty pleased with myself.</p>
<p>The build clones Ghost from GitHub and uses a grunt task that we already had setup thanks to <a href="https://github.com/jgable">Jacob Gable</a> to pre-compile sass &amp; handlebars, clean up some config files and get the raw codebase into a state ready for deploy. Grunt is turning into one of my favourite things... it's just <em>so</em> useful for getting tricky things done.</p>
<p>Ghost is already making pretty heavy use of Grunt: for compiling sass &amp; handlebars, for linting, for running tests, for doing builds and soon for building documentation. I have a feeling Grunt &amp; Ghost are going to be best of buddies for a long while.</p>
]]></content:encoded></item><item><title><![CDATA[My first blog post on Ghost]]></title><description><![CDATA[<p>Not much to see here. Finally got a Ghost deploy working on amazon ec2 :)</p>]]></description><link>https://hannah.wf/my-first-blog-post-on-ghost/</link><guid isPermaLink="false">5c17bb01084f7900cb421dfd</guid><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Mon, 01 Jul 2013 10:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Not much to see here. Finally got a Ghost deploy working on amazon ec2 :)</p>
]]></content:encoded></item><item><title><![CDATA[WordPress: Migrate! Version 0.0.4]]></title><description><![CDATA[<p>A new version of <strong>Migrate!</strong> is now available <a href="https://github.com/ErisDS/Migrate/zipball/master" onclick="_gaq.push(['_trackPageview', '/downloads/migrate_github_zip_004']);" title="Download from GitHub">to download from Github</a>.</p>
<h2>What does this fix?</h2>
<p>This is a really small update / bugfix to add support for <kbd>https://</kbd> in the URL checks.</p>
<p>All credit goes to <a href="https://github.com/bteryk" title="bteryk on github" target="_blank">bteryk</a></p>
<h2>It's been a while...</h2>
<p>It's been far too long! This is one small</p>]]></description><link>https://hannah.wf/wordpress-migrate-version-0-0-4/</link><guid isPermaLink="false">5c17bb01084f7900cb421e4b</guid><category><![CDATA[migrate]]></category><category><![CDATA[plugins]]></category><category><![CDATA[WordPress]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Fri, 28 Dec 2012 23:29:05 GMT</pubDate><content:encoded><![CDATA[<p>A new version of <strong>Migrate!</strong> is now available <a href="https://github.com/ErisDS/Migrate/zipball/master" onclick="_gaq.push(['_trackPageview', '/downloads/migrate_github_zip_004']);" title="Download from GitHub">to download from Github</a>.</p>
<h2>What does this fix?</h2>
<p>This is a really small update / bugfix to add support for <kbd>https://</kbd> in the URL checks.</p>
<p>All credit goes to <a href="https://github.com/bteryk" title="bteryk on github" target="_blank">bteryk</a></p>
<h2>It's been a while...</h2>
<p>It's been far too long! This is one small step towards getting Migrate! back into active development. There are many more features &amp; fixes to come, but first I had to get my head around github, pull requests etc again. All that is done now and I'm hoping to push several additional updates in the coming weeks.</p>
<h2>Does this mean it still works?</h2>
<p>I still use Migrate! on a regular basis and always on the most recent version of WordPress. So far it is standing the test of time. There has been an issue reported with Migrate! not migrating the URLs in the new menu feature, but this will only affect you if you hard code absolute URLs in the menu. You can keep up to date with any issues on <a href="https://github.com/ErisDS/Migrate" title="Migrate! on GitHub" target="_blank">GitHub</a></p>
]]></content:encoded></item><item><title><![CDATA[Ubuntu VM: local dev environment on Windows]]></title><description><![CDATA[Bacon ipsum dolor sit amet nulla short loin qui sint, sed commodo proident anim fugiat pork belly swine eiusmod adipisicing quis ea. ]]></description><link>https://hannah.wf/ubuntu-vm-local-dev-environment-on-windows/</link><guid isPermaLink="false">5c17bb01084f7900cb421e4a</guid><category><![CDATA[development environment]]></category><category><![CDATA[linux]]></category><category><![CDATA[Technology]]></category><category><![CDATA[ubuntu]]></category><category><![CDATA[windows]]></category><category><![CDATA[WordPress]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Wed, 26 Dec 2012 11:44:40 GMT</pubDate><content:encoded><![CDATA[<p>Recently, I went through the process of setting up a new development environment on Windows for my playground projects at home. My work is usually done and hosted on Linux with a standard <a title="LAMP" href="http://en.wikipedia.org/wiki/LAMP_(software_bundle)" target="_blank">LAMP</a> stack, so using an ubuntu virtual machine lets me keep my Windows machine for gaming and allows me to develop in a comfortable environment. You can follow along with the steps below, or give me tips on what could be done better :)</p>
<p>Warning, it is quite long! But it does cover installing the tools, setting up a LAMP stack, creating a virtual host and installing WordPress.</p>
<h2 id="install-tools">Step 1: Install the tools</h2>
Download and install VMWare Player: <a title="VMWare Player Download Page" href="https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0" target="_blank">VMWare Player Download Page</a> for running your virtual machine. It's probably worth noting that we're only going to get a terminal interface, not a GUI for the VM (I find this suits my needs perfectly).
<p>Now for our virtual machine, if you want to run Ubuntu like me, then you can download an Ubuntu image from here: <a title="Ubuntu Server Images for VMWare" href="http://www.thoughtpolice.co.uk/vmware/#ubuntu12.04" target="_blank">Ubuntu Server Images for VMWare</a>. I used &quot;32-bit: ubuntu-server-12.04-i386.zip&quot; even though my computer is 64bit. I just didn't see any reason that my web server needed to be a 64 bit machine, but this should probably match whatever you use for hosting.</p>
<p>Next, unzip the Ubuntu image and put it somewhere safe &amp; easily accessible on your hard drive. This will end up containing all your work, so really do make sure it's safe!</p>
<p>Now for the fun part, run VMWare player. Choose &quot;Open a Virtual Machine&quot; and navigate to where you saved your Ubuntu image &amp; choose to open it.</p>
<p>You'll now have the options to &quot;Play virtual machine&quot; or &quot;Edit virtual machine settings&quot;. You can give your new VM a better name by choosing edit, and then going to the options tab.</p>
<img class="alignleft size-full wp-image-2473" alt="VMWare Player" src="http://res.cloudinary.com/hannahwf/image/upload/v1392491688/vmware_ptffqi.png" width="600" height="511">
<p>Hit &quot;Play virtual machine&quot;. <strong>Important:</strong> you will be prompted to choose between &quot;I moved it&quot; and &quot;I copied it&quot;, always choose &quot;I moved it&quot; which is NOT the default option. Failure to do this will cause you problems later. You will be prompted to log in, if you downloaded the suggested Ubuntu image then use the provided username and password from the thought police site, probably something like notroot &amp; thoughtpolice.</p>
<p>Run the following commands to get any updates. It will take a few minutes, but then you will have Ubuntu installed, up-to-date and ready to start playing with.</p>
<pre><code class="language-language-bash">sudo apt-get update
sudo apt-get upgrade
</code></pre>
<p><strong>Note:</strong> throughout this tutorial, whenever you are prompted with a <kbd>[Y/n]</kbd> always type <kbd>Y</kbd>.<br>
<strong>Note:</strong> if you've not used VMWare player before - to focus the VM you click on it as you would expect, but to get out of it and get your mouse cursor back you need to press <kbd>CTRL</kbd> + <kbd>ALT</kbd>.</p>
<h2 id="apache">Step 2: Install apache</h2>
<p>Next, lets turn our Ubuntu install into a working web server, by installing Apache HTTP Server:</p>
<pre><code class="language-language-bash">sudo apt-get install apache2
</code></pre>
<p>We need to edit the config:</p>
<pre><code class="language-language-bash">sudo vim /etc/apache2/httpd.conf
</code></pre>
<p>Add the following line to the file, which will be blank. This defines our web server as being called <code>localhost</code> which is the norm for local development environments.</p>
<p><code>ServerName localhost</code></p>
<blockquote>
<p><strong>Note:</strong> If you've not used vim on the command line to edit a file like this before, you'll need to press <kbd>i</kbd> to enter insert mode and start adding new content to the file. When you're done editing press <kbd>esc</kbd> to leave insert mode, and then type <kbd>:</kbd> followed by <kbd>w</kbd> and then <kbd>q</kbd>. The <kbd>:</kbd> brings up a command line and the <kbd>wq</kbd> means &quot;write and quit&quot;. Press enter and the file will be saved and closed.</p>
</blockquote>
<p>Finally, we need to restart the server for our changes to take effect.</p>
<pre><code class="language-language-bash">sudo /etc/init.d/apache2 restart
</code></pre>
<p>We now have a working local web server, therefore we have files on the Ubuntu VM which are addressable via IP addresses / URLs such that they can be opened and run in a browser. Apache has created these web accessable files a new folder that will be located at <code>/var/www</code>. Let's verify that this is true.</p>
<p>Type the following into your VM:</p>
<pre><code class="language-language-bash">ifconfig
</code></pre>
<p>You should see something similar to the image below, you are looking for the <code>inet address</code> assigned to <code>eth0</code>, which will be the IP address you can use to access your webserver.</p>
<img class="alignleft size-full wp-image-2494" alt="ifconfig" src="http://res.cloudinary.com/hannahwf/image/upload/v1392491685/ifconfig1_kcrg3i.png" width="600" height="377">
<p>Open up your favourite browser, and enter <code>http://#IP address here#</code>, for the example above it would be <code>http://192.168.178.129</code>. You should see the &quot;It works!&quot; default file from apache much like the one shown below:</p>
<img src="http://res.cloudinary.com/hannahwf/image/upload/v1392491683/it-works1_xitjbh.png" alt="Default apache web page" width="600" height="182" class="alignleft size-full wp-image-2499">
<p>You can verify that this is indeed fetching files from your virtual machine by making a change. Navigate to your <code>www</code> folder:</p>
<pre><code class="language-language-bash">cd /var/www/
</code></pre>
<p>Change the owner of the default index file and then open it for editing:</p>
<pre><code class="language-language-bash">sudo chown www-data.www-data index.html
sudo vim index.html
</code></pre>
<p>Make any change you like for testing.</p>
<blockquote>
<p>Don't forget: <kbd>i</kbd> for insert mode, type <kbd>esc</kbd> + <kbd>:wq</kbd> to save and quit</p>
</blockquote>
<p>Once you've edited and saved the file, refresh the page in the browser to see your changes take effect.</p>
<blockquote class="halfwidth alignright">
<h5>Editing the Windows hosts file</h5>
<p>In XP and before, this was merely a case of opening the file, but from Vista onward it's a little trickier as you have to be administrator.</p>
<ul>	
<li>Browse to `C:/Windows/System32` or do a search for `notepad.exe`</li>
<li>Right click on `notepad.exe` and choose `"Run as administrator"`</li>
<li>Go to `File &gt; Open`</li>
<li>Navigate to `C:/Windows/System32/drivers/etc`</li>
<li>Change file types `to All Files (*.*)`</li>
<li>Open `hosts`</li>
</ul>
</blockquote>
<h3 id="localhost">Localhost</h3>
<p>It may be the case that you would prefer to refer to your web server by <code>http://localhost</code>, instead of having to remember the IP address. If this is the case then you need to edit your <a href="http://en.wikipedia.org/wiki/Hosts_(file)" title="Windows hosts file" target="_blank">Windows hosts file</a> to tell Windows about the name you want to use for your IP address. See the block to the right for details of how to open up your Windows hosts file.</p>
<p>Once you've got it open, you need to add a line to it to map the IP address to <code>localhost</code> or whatever name you might like to use:</p>
<p><code>#IP address here# localhost</code></p>
<p>So for my example I would put</p>
<p><code>192.168.178.129 localhost</code></p>
<p>Once you've edited the file you will need to save it. It may take a few seconds to update, but you will then be able to enter <code>http://localhost</code> into your browser and get to the default page. If it doesn't seem to be updating, you may need to flush the DNS cache. This is done in Windows by running <code>ipconfig /flushdns</code> either via the &quot;Search programs &amp; files&quot; box in the start menu, or in a <a href="http://www.tech-recipes.com/rx/1600/vista_dns_cache_flush/" title="Flush Windows DNS Cache" target="_blank">command prompt</a>.</p>
<h2 id="php-mysql">Step 3: Installing PHP &amp; MySQL</h2>
<p>We've got our LA part of LAMP, now it's time for the M &amp; P! This bit is super easy.</p>
<p>To install PHP type the following in Ubuntu:</p>
<pre><code class="language-language-bash">sudo apt-get install php5 libapache2-mod-php5
sudo /etc/init.d/apache2 restart
</code></pre>
<p>Let's check it works, by adding a PHP file:</p>
<pre><code class="language-language-bash">cd /var/www/
sudo vim test.php
</code></pre>
<p>Add the following code to the file and save it:</p>
<pre><code class="language-language-php">&lt;?php
echo &quot;Hello World&quot;;
</code></pre>
<p>You can access this file to test it via either <code>http://192.168.178.129/test.php</code> or if you set it up: <code>http://localhost/test.php</code>.</p>
<img src="http://res.cloudinary.com/hannahwf/image/upload/v1392491682/test-php_bs7blv.png" alt="test-php" width="600" height="95" class="alignleft size-full wp-image-2533">
<p>To get MySQL installed:</p>
<pre><code class="language-language-bash">sudo apt-get install mysql-server
</code></pre>
<p>You will be prompted to set and confirm the password for your MySQL admin user.</p>
<pre><code class="language-language-bash">sudo apt-get install php5-mysql
</code></pre>
<p>You can test that MySQL is installed correctly by playing around with the MySQL admin (you'll be prompted for the password you just setup):</p>
<pre><code class="language-language-bash">mysql -u root -p
</code></pre>
<p>Exit mysql by typing &quot;quit&quot;.</p>
<h2 id="samba">Step 4: install and setup samba</h2>
<p>Samba is what makes using a Linux VM as a development environment really simple. It's a little fiddly to setup, but once it is done you will be able to edit the files in your <code>/var/www/</code> folder directly through Windows, using any IDE you choose. Let's get started...</p>
<pre><code class="language-language-bash">sudo apt-get install samba samba-common
</code></pre>
<p>Add your user to samba (if you used the image suggested, this will be &quot;notroot&quot;):</p>
<pre><code class="language-language-bash">sudo smbpasswd -a #your user#
</code></pre>
<p>Enter your password for your user, then we need to backup and edit our config for Samba so it's safe to edit:</p>
<pre><code class="language-language-bash">cd /etc/samba
sudo cp smb.conf smb.conf.bak
</code></pre>
<p>Open the file for editing</p>
<pre><code class="language-language-bash">sudo vim smb.conf
</code></pre>
<p>You need to make the following changes (use the arrow keys to scroll):</p>
<p>In the &quot;Authentication section, uncomment (remove the hash / semi-colon) from the line</p>
<p><code>security = user</code></p>
<p>Then at the very bottom of the file, add the following and save the file:</p>
<pre><code class="language-language-bash">[www]
comment = Web Root Dir
path = /var/www/
browsable = yes
read only = no
writable = yes
valid users = notroot, www-data
write list = notroot, www-data
read list = notroot, www-data
force user = www-data
force group = www-data
public = no
writable = yes
printable = no
</code></pre>
<p>Note that the user list should be your user (notroot if you are using the recommended Ubuntu image) and www-data.</p>
<p>Finally, restart samba:</p>
<pre><code class="language-language-bash">sudo /etc/init.d/smbd restart
</code></pre>
<p>Now we should be able to connect via Windows. Open up a Windows Explorer Instance and navigate to <code>Computer</code>. At the top you should see a button which reads <code>Map network drive</code>. Select this and in the dialog that appears, choose a letter to map to, and then enter either localhost or the ip address of your web server as you found it earlier in the following format:</p>
<p><code>\\localhost\www\</code> or <code>\\#IP address#\www\</code></p>
<img src="http://res.cloudinary.com/hannahwf/image/upload/v1392491681/samba-connect_zcdexc.png" alt="Connect to your web server in Windows via Samba" width="600" height="396" class="alignleft size-full wp-image-2544">
<p>Press &quot;Finish&quot;, you'll be prompted for your username and password again, enter it and you should see the files <code>index.html</code> and <code>test.php</code> that are in your <code>/var/www/</code> folder.</p>
<p>If you would like to be able to login via PuTTY for a slightly nicer terminal, run the following.</p>
<pre><code class="language-language-bash">sudo apt-get install openssh-server
</code></pre>
<p>Now in PuTTY you should be able to connect to your web server's IP address and login with your username and password.</p>
<h2 id="wordpress">Step 5: Installing WordPress on a virtual host</h2>
<p>Now that we have our LAMP stack all setup, and we have access to edit our files, we're going to use it to do something interesting.</p>
<p>First we need to set up a folder structure which the WordPress files will live in, which should look like <code>/var/www/wordpress/public_html</code>. You can either create these on the command line:</p>
<pre><code class="language-language-bash">cd /var/www/
sudo mkdir wordpress
cd wordpress
sudo mkdir public_html
cd ../
sudo chown -R www-data.www-data ./
</code></pre>
<p>Or now that Samba is setup and working, just create the folders in Windows.</p>
<p>With the folders created, setup a virtual host by creating a new vhost file:</p>
<pre><code class="language-language-bash">sudo vim /etc/apache2/sites-available/wordpress
</code></pre>
<p>Add the following to the file:</p>
<pre><code class="language-language-bash">&lt;virtualhost *:80&gt;
  ServerName wordpress.dev
  DocumentRoot /var/www/wordpress/public_html
  DirectoryIndex index.php
&lt;/virtualhost&gt;
</code></pre>
<p>Save the file. We need to enable our new vhost and then restart apache:</p>
<pre><code class="language-language-bash">sudo a2ensite wordpress
sudo /etc/init.d/apache2 restart
</code></pre>
<p>So that we can access it in the browser, we need to add the new ServerName as a host to the Windows hosts file (see the <a href="#localhost" title="Localhost">localhost</a> section above).</p>
<p>If you added localhost to it earlier, then change the line to look like:</p>
<p><code>#IP address# localhost wordpress.dev</code></p>
<p>Otherwise just add the line:</p>
<p><code>#IP address# wordpress.dev</code></p>
<p>Go to <code>http://wordpress.dev</code> in your favourite browser, and you should get an &quot;It works!&quot; page again.</p>
<blockquote>
<p><strong>Note:</strong> I like to use the fake TLD .dev to remind myself when I'm on the development version of a site, other people prefer to use a subdomain of the correct domain.</p>
</blockquote>
<p>Now for WordPress. Download WordPress from <a href="http://wordpress.org/download/" title="WordPress" target="_blank">wordpress.org</a> and extract the files.<br>
Open the folders until you get to the base of WordPress where you can see the <code>wp-admin</code> folder then copy all of the present files &amp; folders into the <code>/var/www/wordpress/public_html</code> folder using windows explorer.</p>
<p>Our final piece of preparation is to create a database via the MysQL admin client. In VMWare type the following:</p>
<pre><code class="language-language-sql">&gt; mysql -u root -p
CREATE DATABASE wordpressdb;
GRANT ALL PRIVILEGES ON wordpressdb.* TO &quot;wordpressdb&quot;@&quot;localhost&quot; IDENTIFIED BY &quot;wordpressdbuser&quot;;
</code></pre>
<p>Now we have everything we need, go back to <kbd><a href="http://wordpress.dev">http://wordpress.dev</a></kbd> in your browser and you should see the install screen for WordPress.</p>
<p>Follow the on-screen install instructions providing the MySQL database details you setup above.</p>
<p>Finally, we're done! We've got a working web server which is running a virtual host with a WordPress install. Setting up a virtual host for any other purpose is much the same as for WordPress - you need the folders first, then a vhost file, you enable your vhost,restart apache and finally add the new name to your Windows hosts file.</p>
<p>Hopefully this has been useful, it only covers the basics of getting from A to B so there are many, many other configuration options to play with and packages to install depending on what you want to do. It's also not been secured, I do not recommend using these settings for configuring a production server.</p>
<h3>Additional resources</h3>
<ul>
<li><a href="https://help.ubuntu.com/11.10/serverguide/httpd.html">HTTPD</a> - ubuntu help</li>
<li><a href="http://www.unixmen.com/howto-install-amp-and-phpmyadmin-on-ubuntu/">How to install LAMP and PHPMyAdmin on Ubuntu</a> - Unixmen</li>
<li><a href="http://www.sitepoint.com/ubuntu-12-04-lts-precise-pangolin-file-sharing-with-samba/">File sharing with samba</a> - SitePoint</li>
<li><a href="https://www.digitalocean.com/community/articles/how-to-set-up-apache-virtual-hosts-on-ubuntu-12-04-lts">How to set up apache virtual hosts on ubuntu 12 04 lts</a> - digitalocean</li>
<li><a href="http://codex.wordpress.org/Installing_WordPress#Using_the_MySQL_Client">Installing WordPress using the MySQL Client</a> - WordPress Codex</li>
</ul>]]></content:encoded></item><item><title><![CDATA[Has it ever occurred to you that you might be wrong?]]></title><description><![CDATA[<p>I loved this little <a title="Has it ever occurred to you that you might be wrong?" href="http://philipchircop.com/post/8691376552/has-it-ever-occurred-to-you-that-you-might-be" target="_blank">collection of quotes from philipchircop.com </a>and recommend you click on the screen grab, or one of the links to go read them all.</p>
<p>I'm just filing this away here for posterity :)</p>
<p>[caption id=&quot;attachment_2384&quot; align=&quot;alignleft&quot; width=&quot;528&quot;</p>]]></description><link>https://hannah.wf/has-it-ever-occurred-to-you-that-you-might-be-wrong/</link><guid isPermaLink="false">5c17bb01084f7900cb421e48</guid><category><![CDATA[Personal]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Sat, 07 Jan 2012 10:28:29 GMT</pubDate><content:encoded><![CDATA[<p>I loved this little <a title="Has it ever occurred to you that you might be wrong?" href="http://philipchircop.com/post/8691376552/has-it-ever-occurred-to-you-that-you-might-be" target="_blank">collection of quotes from philipchircop.com </a>and recommend you click on the screen grab, or one of the links to go read them all.</p>
<p>I'm just filing this away here for posterity :)</p>
<p>[caption id=&quot;attachment_2384&quot; align=&quot;alignleft&quot; width=&quot;528&quot; caption=&quot;From philipchircop.com, click to see full post&quot;]<a href="http://philipchircop.com/post/8691376552/has-it-ever-occurred-to-you-that-you-might-be"><img class="size-full wp-image-2384" title="Has it ever occurred to you that you might be wrong?" src="http://res.cloudinary.com/hannahwf/image/upload/v1392491690/has-it-ever-occurred_kiie5x.png" alt="Has it ever occurred to you that you might be wrong?" width="528" height="747"></a>[/caption]</p>
]]></content:encoded></item><item><title><![CDATA[Hands up if you're on a January diet...]]></title><description><![CDATA[<img class="alignleft size-medium wp-image-2359" title="Happy New Year" src="http://res.cloudinary.com/hannahwf/image/upload/h_214,w_300/v1392491691/HappyNewYear_aktnb3.png" alt="Happy New Year" width="300" height="214">
<p>I know, we're almost a week into 2012 already, it's a bit late for contemplating achievements and setting resolutions isn't it? Every year, the &quot;January diet&quot; gets further reinforced by our populist media - all the adverts are suddenly for exercise DVDs, clever cookbooks and healthy food -</p>]]></description><link>https://hannah.wf/hands-up-if-youre-on-a-january-diet/</link><guid isPermaLink="false">5c17bb01084f7900cb421e47</guid><category><![CDATA[Personal]]></category><category><![CDATA[random thoughts]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Thu, 05 Jan 2012 22:19:09 GMT</pubDate><content:encoded><![CDATA[<img class="alignleft size-medium wp-image-2359" title="Happy New Year" src="http://res.cloudinary.com/hannahwf/image/upload/h_214,w_300/v1392491691/HappyNewYear_aktnb3.png" alt="Happy New Year" width="300" height="214">
<p>I know, we're almost a week into 2012 already, it's a bit late for contemplating achievements and setting resolutions isn't it? Every year, the &quot;January diet&quot; gets further reinforced by our populist media - all the adverts are suddenly for exercise DVDs, clever cookbooks and healthy food - and nearly everyone I know is &quot;on a diet&quot;. We're a nation gone mad, and yet we'll all be overweight again by Easter. We all strive to be better, and I'm tired of failing... so I've been trying to figure out how to do it right.</p>
<h3>Out with the old and in with the new.</h3>
<p>Why is New Year synonymous with thoughts of past &amp; future personal achievement? As our calendars tick over to a brand new year, most folk feel drawn to it as a fresh start, a simple changing of the date makes us feel like we're starting over. Combined with a break from the weekly work-eat-sleep routine and copious amounts of time with friends &amp; relatives, thoughts turn to work-life balance, evaluating what we've done with our year &amp; reflecting on what was missing.</p>
<p>Then there's the tradition of setting a new years resolution. Usually something spur of the moment, arbitrary to measure and impossible to achieve: 'lose weight', 'quit smoking', 'do more exercise', 'drink less', 'spend more time with family', 'work less' &amp; so on. These day most of us can count at least two of those on our todo lists, and most of us will try really hard for the whole of January only to inevitably forget, give up, or just downright fail.</p>
<h3>Conceived to fail</h3>
<p>Why is it so damned hard to keep up a resolution? Whilst the Christmas &amp; New Year breaks give us all plenty of time to think &amp; have our self-realisations, epiphanies &amp; moments of sworn change, the truth is that unless you make drastic changes to your various environments, it doesn't take long before the old routines take over again, and you remember WHY you smoke/drink/never have time to cook a decent meal/have to stay late at work...again.</p>
<h3>Cause and effect</h3>
<p>I have come to believe, that if you really do want to change something about yourself, you have to look at the cause of your unwanted behaviour and importantly, WHY you want to change it. Habits are usually a coping mechanism of some sort, so either you need to remove the need to cope, or change the way you do it. But when it comes to the why, i'll bet the answer is something along the lines of social pressure from the very same society which gave life to your bad habits in the first place (cue vicious circle and nothing ever changing).</p>
<p>However, once you've figured out the causes and decided whether YOU really want to change (as opposed to feeling like you should do) you'll discover you can set yourself a more realistic goal. Hopefully something along the lines of learning a new skill, or challenging yourself to make a small change. That, or you'll realise you have a much more fundamental problem to solve.</p>
<p>This year, I'm not setting myself a new years resolution. Instead, I'm going to spend some time looking at my list of potentials &amp; really understanding why those things are on that mental list of mine. Then perhaps I'll be able to action some real, long-lasting change.</p>
<p>Happy New Year Everyone. I hope you do something GREAT with it.</p>
]]></content:encoded></item><item><title><![CDATA[Sleep]]></title><description><![CDATA[<img class="alignleft size-thumbnail wp-image-2345" style="border-style: initial; border-color: initial;" title="sleeping kitties" src="http://res.cloudinary.com/hannahwf/image/upload/c_crop,h_600,w_600,x_0,y_0/h_150,w_150/v1392491695/sleeping-kitties_plyix7.jpg" alt="sleeping kitties" width="150" height="150">
<p><strong>** Disclaimer ***</strong> I am well aware that Wikipedia is not the best source of information... but you know... it's just.. there!<br><br><br>
A very dear friend of mine just posted a comment on Facebook that has prompted me to write this &quot;Thinking out loud&quot; post about my sleeping habits, which</p>]]></description><link>https://hannah.wf/sleep/</link><guid isPermaLink="false">5c17bb01084f7900cb421e46</guid><category><![CDATA[Personal]]></category><category><![CDATA[random thoughts]]></category><dc:creator><![CDATA[Hannah Wolfe]]></dc:creator><pubDate>Wed, 28 Dec 2011 17:25:24 GMT</pubDate><content:encoded><![CDATA[<img class="alignleft size-thumbnail wp-image-2345" style="border-style: initial; border-color: initial;" title="sleeping kitties" src="http://res.cloudinary.com/hannahwf/image/upload/c_crop,h_600,w_600,x_0,y_0/h_150,w_150/v1392491695/sleeping-kitties_plyix7.jpg" alt="sleeping kitties" width="150" height="150">
<p><strong>** Disclaimer ***</strong> I am well aware that Wikipedia is not the best source of information... but you know... it's just.. there!<br><br><br>
A very dear friend of mine just posted a comment on Facebook that has prompted me to write this &quot;Thinking out loud&quot; post about my sleeping habits, which is largely an excuse for exploring wikipedia and looking at pictures of cute sleeping kitties. Anyway, here's what I wrote, and what my friend replied with:</p>
<img class="aligncenter size-full wp-image-2337" title="Facebook - why am I so tired?" src="http://res.cloudinary.com/hannahwf/image/upload/v1392491697/facebook-sleep_j6jb9b.jpg" alt="Facebook - why am I so tired?" width="477" height="158">
<p>Holiday-fatigue is something I regularly battle. I always have massive plans for what I can achieve with a long weekend or a week off, but by the time I've spent a day chilling out I'm in relaxed mode and never have the impetus to do any of it. People who do a full working week and still churn out side projects at a rate of knots in their evenings and weekends have both my envy and my awe.</p>
<p>However, my friend's comment made me stop and think because she believes I'm suffering sleep deprivation - this isn't something I recall ever having even hinted to her. Sure, getting up at 5:30 every morning to do a 2 hour commute means I live on the edge of getting enough sleep, but as far as I'm concerned this was something I adjusted to after about 2 months. The idea that it takes more than a few long sleeps to cancel out is also intriguing - so off I went to Wikipedia to read their article on <a title="Wikipedia: Sleep Deprivation" href="http://en.wikipedia.org/wiki/Sleep_deprivation" target="_blank">Sleep Deprivation</a>.</p>
<p>Apparently, your brain keeps a close account of how much sleep you owe it (that's kinda freaky), and if you continue to accrue <a title="Wikipedia: Sleep debt" href="http://en.wikipedia.org/wiki/Sleep_debt" target="_blank">sleep debt</a> (apparently that's a thing) you eventually have to pay it back - sometimes your body will steal it back through unavoidable <a title="Wikipedia: Microsleep" href="http://en.wikipedia.org/wiki/Microsleep" target="_blank">microsleeps</a> or tiny naps (who hasn't had one of those at their desk after a big lunch?!). By this point, I've fallen into a Wikipedia Trap so also had to read the article on the <a title="Wikipedia: Hypnic Jerk" href="http://en.wikipedia.org/wiki/Hypnic_jerk" target="_blank">Hypnic Jerk</a> (tee hee).</p>
<p>All this information on sleep is fascinating: apparently the falling dream that often accompanies a Hypnic Jerk is actually a hallucination (weird!) and also, apparently, you can determine just how sleep deprived you are by<a title="Wikipedia: Multiple Sleep Latency Test" href="http://en.wikipedia.org/wiki/Multiple_Sleep_Latency_Test" target="_blank"> timing how long it takes you to fall asleep</a> (or your &quot;<a title="Wikipedia: Sleep Latency" href="http://en.wikipedia.org/wiki/Sleep_latency" target="_blank">Sleep Latency</a>&quot;). Shockingly (to me at least) according to the sleep latency test, if you fall asleep in less than 15 minutes, you are suffering a level of sleep deprivation?!? It usually takes me 10-15 minutes if I'm comfy in my bed in a quiet, dark room, regardless of how tired I feel or how much sleep I have. Husband on the other hand struggles to sleep without a TV on - so am I not just a good go-to-sleep-er?</p>
<p><a title="About: How much sleep is enough?" href="http://sleepdisorders.about.com/od/howmuchsleepdoineed/a/how_much_sleep.htm" target="_blank">The average adult requires 8 hours sleep</a> (watch it, that link is NOT from Wikipedia haha) so if I'm &quot;the&quot; average adult, and I get roughly 7.5 hours sleep a night, then each week I accrue a sleep debt of 2.5 hours. I usually also get at least one train-nap or lie in a week, gaining me back another 30 minutes and I always have a lie in (at least 10 hours) at the weekend. Therefore, if I'm &quot;the&quot; average adult - I sleep enough (although husband will tell you that I always used to be a 9 hours kinda gal).</p>
<p>I remember a conversation I had before I started my new job where I was saying I couldn't remember the last time I didn't feel like I could fall asleep if you just gave me a pillow and some peace and quiet (this is still true). Back then I put it down to the stresses of my old job because I was commuting 10 minutes and easily getting 9 hours sleep a night. Nowadays I've a spring in my step and a smile on my face - I might not sleep but I'm much less stressed!</p>
<p>All this is purely academic anyway. We're all entirely different and have different needs. I'm certian that energy levels have as much to do with diet and levels of physical &amp; mental exertion as they do your sleep debt.  Who knows what we really know or understand about sleep? We know naff-all about dreams. Most adults I know complain of little other than the weather and feeling tired.</p>
<p>So there we go, my random Wikipedia &amp; thought trail is over. I have a cup of coffee in hand and feel more awake than I did before I wrote this... so what about you? Got any weird sleep habits?!</p>
<img src="http://res.cloudinary.com/hannahwf/image/upload/v1392491693/sleeping-kitties2_atnxtr.jpg" alt title="sleeping-kitties2" width="580" height="193" class="aligncenter size-full wp-image-2351">]]></content:encoded></item></channel></rss>