{
  "version": "https://jsonfeed.org/version/1",
  "title": "Wesley Hill",
  "home_page_url": "https://wesleyhill.co.uk/",
  "feed_url": "https://wesleyhill.co.uk/feed.json",
  "description": "software engineer & (hobbyist) animator. Blogging about reading, writing and executing code. (mostly writing)",
  "favicon": "https://wesleyhill.co.uk/assets/icons/favicon-96x96.png",
  "icon": "https://wesleyhill.co.uk/assets/icons/apple-touch-icon.png",
  "author": {
      "name": "Wesley Hill",
      "url": "https://wesleyhill.co.uk/"
  },
  "expired": "false",
  "items": [

    {
      "id": "/p/reflections-on-flash-and-preservation",
      "url": "https://wesleyhill.co.uk/p/reflections-on-flash-and-preservation/?utm_source=jsonFeed&amp;utm_medium=jsonFeed&amp;utm_campaign=ReflectionsonFlash&amp;Preservation",
      "title": "Reflections on Flash & Preservation",
      "content_html": "<p>TL;DR:</p>\n\n<p><em>Adobe Flash player is officially dead and Ruffle is here to preserve flash content, there is a long way to go but it’s a good start.</em></p>\n\n<p>It took a while to get here, with this year now over, but there isn’t any “20/20 hindsight<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\">1</a></sup>” that the Adobe Flash player is now left behind for good. <a href=\"https://www.wired.com/2011/11/adobe-mobile-flash-dead\">We knew</a> <a href=\"https://www.wired.com/story/adobe-finally-kills-flash-dead/\">the day was coming</a> and it is <a href=\"https://www.adobe.com/products/flashplayer/end-of-life.html\">finally here</a>.</p>\n\n<h2 id=\"the-bad\">The Bad</h2>\n\n<p>It’s been about over 10 years since the apple man penned <a href=\"https://en.wikipedia.org/wiki/Thoughts_on_Flash\">“Thoughts on Flash”</a>. Since then the flash player has been on the downfall and it’s no surprise why for those who have used it.</p>\n\n<p>You’ll get different reactions depending on who you talk to on the flash player:</p>\n\n<ul>\n  <li>For web developers<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\">2</a></sup>, it’s ire, resentment and good riddance for not having to deal with the treadmill of security issues that the flash player plagued with every update.</li>\n</ul>\n\n<p>(alongside some confusion with the flash authoring software if it’s brought up).</p>\n\n<ul>\n  <li>\n    <p>For consumers, it’s another thing they had to install to access games &amp; content, sometimes it slows the page down too (don’t forget those flash ads)</p>\n  </li>\n  <li>\n    <p>For content creators, (animators &amp; game devs) a mixture of the two, an easier way to bring content to the web on all browsers.</p>\n  </li>\n</ul>\n\n<p>Many will have different experiences with it, but the above three is what I see all the time. In the end the first group won, causing Adobe to kill the flash player all together.</p>\n\n<h2 id=\"the-good\">The Good</h2>\n\n<p>Entire communities built on Flash helped speed up its adoption. I remember times going onto <a href=\"https://www.miniclip.com/games/en/\">MiniClip</a>, <a href=\"https://www.kongregate.com/\">Kongregate</a> and especially <a href=\"https://newgrounds.com/\">Newgrounds</a> for animations.</p>\n\n<p>Newgrounds continues to remain independent, experimenting and showcasing content that has made the careers of many content creators throughout the years.</p>\n\n<p>In an age where we keep talking about buzzwords like <em>“The Algorithm”</em> and <em>“Machine Learning”</em> on practically anything (ugh), NG’s feed continues to showcase creations by the community and not corporations. <a href=\"https://www.newgrounds.com/supporter\">(I highly recommend supporting them)</a></p>\n\n<p>The first group (web devs) talk about the <a href=\"https://en.wikipedia.org/wiki/Web_platform\">“open web”</a> a lot, a web not controlled by corporations and governments and is free from censorship.</p>\n\n<p>Despite it’s community being built around a proprietary plugin, Newgrounds fits in this space of the open web and now adopts HTML5 video, audio players all powered by the web. One could even argue freeing itself from the dependency of Flash.</p>\n\n<h2 id=\"the-future\">The Future</h2>\n\n<p>As far as I know, there hasn’t been any intent by Adobe to preserve what was created with Adobe Flash, <a href=\"https://github.com/open-source-flash/open-source-flash\">even with calls to open source the flash player</a>.</p>\n\n<p>So what usually comes next is emulation. When <a href=\"https://ruffle.rs/demo\">Ruffle</a> (A Flash player emulator) was announced by <a href=\"https://twitter.com/Herschel\">Mike Welsh, creator of Swivel</a>, this renewed hope for Flash preservation and has a better future than the alternatives<sup id=\"fnref:3\"><a href=\"#fn:3\" class=\"footnote\">3</a></sup>.</p>\n\n<p>Difference is with Ruffle is that there are no extra plugins to install, only a modern browser (a better experience than Flash) and uses <a href=\"https://www.rust-lang.org/\">Rust</a> and <a href=\"https://webassembly.org/\">WebAssembly</a> to play Flash content in a secure environment on the desktop and in the browser.</p>\n\n<p>Initially funded by Newgrounds and now has many other sponsors<sup id=\"fnref:4\"><a href=\"#fn:4\" class=\"footnote\">4</a></sup>,  Ruffle may not be finished completely with emulating everything the flash player has to offer, but at least it’s already in use in Newgrounds to play games / animations in SWF format and more recently, the <a href=\"http://blog.archive.org/2020/11/19/flash-animations-live-forever-at-the-internet-archive/\">Internet Archive</a>.</p>\n\n<p>You can try it for yourself at <a href=\"https://ruffle.rs/demo\">https://ruffle.rs/demo</a> in your browser.</p>\n\n<h2 id=\"the-end-of-flash\">The End (of Flash)</h2>\n\n<p>Now that the <a href=\"https://www.adobe.com/products/flashplayer/end-of-life.html\">Flash Player is now discontinued</a> at least we have something built with open technologies that replaces it securely.</p>\n\n<p>Happy New Year!</p>\n\n<h2 id=\"thoughts-on-preserving-ios-apps\">Thoughts on preserving iOS apps</h2>\n\n<p>Thinking ahead a bit here,</p>\n\n<p>iOS is one of the biggest platforms for mobile devices with the App Store harbouring thousands of apps. Both of them are most definitely not open.</p>\n\n<p>First, I’ve not seen a single emulator that runs <strong>real</strong> iOS applications (other than Apple’s own limited simulator). Second, the apple man once said that HTML5 was the future for applications on the iPhone, but instead Apple opted for the App Store approach.</p>\n\n<p>If both of these were to come to an end someday, how do we preserve and run apps for iOS? Will there be an Internet Archive for apps, especially iOS apps and games of old?</p>\n\n<p>It would be nice to see how some old apps/games looked and worked back then on iOS like Infinity Blade or Vine. But it’s near impossible because these apps aren’t available on the App Store and not easily downloadable. Even if they are, they only run on Apple hardware<sup id=\"fnref:5\"><a href=\"#fn:5\" class=\"footnote\">5</a></sup>.</p>\n\n<p>Right now, I’m looking to something like <a href=\"https://corellium.com/platform\">Corellium (iOS Emulation service)</a> to see if they would do something for iOS like what Ruffle is doing for Flash.</p>\n\n<p>It’s early days (even if their service is not open), but there could be some hope for iOS app preservation in the future.</p>\n\n<div class=\"footnotes\">\n  <ol>\n    <li id=\"fn:1\">\n      <p>I will also leave this pun behind this year too. <a href=\"#fnref:1\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n    <li id=\"fn:2\">\n      <p>If you are both a web and game developer on flash, sorry. <a href=\"#fnref:2\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n    <li id=\"fn:3\">\n      <p>Many Flash emulators like Mozilla’s Shumway and GNU Gnash and Lightspark. <a href=\"#fnref:3\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n    <li id=\"fn:4\">\n      <p>NYTimes, Armor Games, CPMStar, Crazy Games, Deep Night, Cool Math Games and many other supporters. <a href=\"#fnref:4\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n    <li id=\"fn:5\">\n      <p>Luckily for some games and apps they are (hopefully) cross platform, but it’s a different story if they are iOS only. <a href=\"#fnref:5\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n  </ol>\n</div>\n",
      
      "tags":  [ "" ],
      
      "date_published": "2020-12-31T00:00:00+00:00",
      "date_modified": "2020-12-31T00:00:00+00:00"
    },

    {
      "id": "/p/custom-callback-notifcations-in-3ds-max",
      "url": "https://wesleyhill.co.uk/p/custom-callback-notifcations-in-3ds-max/?utm_source=jsonFeed&amp;utm_medium=jsonFeed&amp;utm_campaign=CustomCallbackNotificationsinAutodesk3DSMax",
      "title": "Custom Callback Notifications in Autodesk 3DS Max",
      "content_html": "<style>\npre {\n width: 100%;\n}\n</style>\n\n<p>Discovering new things is awesome, especially by accident. This was the case when I was working with the <a href=\"https://en.m.wikipedia.org/wiki/Autodesk_3ds_Max\">Autodesk 3ds Max</a> <a href=\"https://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=__developer_3ds_max__net_sdk_html\">.NET SDK</a>, as I was tasked to add a feature that required using a custom <a href=\"https://en.wikipedia.org/wiki/Callback_(computer_programming)\">callback function</a>.</p>\n\n<p>Skip to the <strong><a href=\"#skip\">solution &amp; code examples</a></strong> if you’re already familiar with 3ds Max.</p>\n\n<h3 id=\"undocumented-territory\">Un(document)ed Territory</h3>\n\n<p>If you’ve worked with Autodesk 3ds Max long enough, you would know you can use MaxScript, Python, C# and C++ to interface with it. Unlike the former two languages, C++ &amp; C# uses the 3ds Max SDK, which comes with <strong>extremely sparse</strong> documentation online, resulting in you trawling through a revolving door of redirects or 404 pages galore.</p>\n\n<p>The only way to get code samples is to install the SDK from the 3ds Max disk image (I didn’t have this available and I <strong>strongly</strong> recommend doing this). But even then, the SDK has no .NET samples. Luckily, the C# codebase is structured nicely and well commented; a nice substitute.</p>\n\n<p>Since the tool I worked on is written in C#, the <a href=\"https://en.m.wikipedia.org/wiki/Dynamic-link_library\">DLL</a> needed to use these notifications are in <code class=\"highlighter-rouge\">Autodesk.Max.dll</code> (found in the installation directory) one can use a .NET disassembler to pry into the classes, methods, constants, etc. I stumbled across <code class=\"highlighter-rouge\">SystemNotificationCode.cs</code>, a list of notification events defined in 3ds Max. <a href=\"https://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=__developer_3ds_max__net_sdk_passing_function_callbacks_in__n_html\">Here is a small example on how to use it</a> and below is a truncated list of example notifications <a href=\"https://gist.github.com/hako/6e94cbe73966acc065bf00974bd68f2b\">(the full list is here)</a></p>\n\n<div class=\"language-cs highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">public</span> <span class=\"k\">enum</span> <span class=\"n\">SystemNotificationCode</span> <span class=\"p\">:</span> <span class=\"kt\">uint</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">UnitsChange</span> <span class=\"p\">=</span> <span class=\"m\">1</span><span class=\"p\">,</span>\n    <span class=\"n\">TimeunitsChange</span> <span class=\"p\">=</span> <span class=\"m\">2</span><span class=\"p\">,</span>\n    <span class=\"n\">ViewportChange</span> <span class=\"p\">=</span> <span class=\"m\">3</span><span class=\"p\">,</span>\n    <span class=\"p\">...</span>\n    <span class=\"n\">LayerHiddenStateChanged</span> <span class=\"p\">=</span> <span class=\"m\">8193</span><span class=\"p\">,</span>\n    <span class=\"n\">LayerRenamed</span> <span class=\"p\">=</span> <span class=\"m\">8194</span><span class=\"p\">,</span>\n    <span class=\"n\">InternalUseStart</span> <span class=\"p\">=</span> <span class=\"m\">1879048192</span>\n<span class=\"p\">}</span>\n</code></pre></div></div>\n\n<p>If you <strong>look closely</strong> at that list, you will notice <code class=\"highlighter-rouge\">Custom1</code> to <code class=\"highlighter-rouge\">Custom7</code> notifications.</p>\n\n<div class=\"language-cs highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">...</span>\n<span class=\"n\">Custom1</span> <span class=\"p\">=</span> <span class=\"m\">4098</span><span class=\"p\">,</span>\n<span class=\"n\">Custom2</span> <span class=\"p\">=</span> <span class=\"m\">4099</span><span class=\"p\">,</span>\n<span class=\"n\">Custom3</span> <span class=\"p\">=</span> <span class=\"m\">4100</span><span class=\"p\">,</span>\n<span class=\"n\">Custom4</span> <span class=\"p\">=</span> <span class=\"m\">4101</span><span class=\"p\">,</span>\n<span class=\"n\">Custom5</span> <span class=\"p\">=</span> <span class=\"m\">4102</span><span class=\"p\">,</span>\n<span class=\"n\">Custom6</span> <span class=\"p\">=</span> <span class=\"m\">4103</span><span class=\"p\">,</span>\n<span class=\"n\">Custom7</span> <span class=\"p\">=</span> <span class=\"m\">4104</span><span class=\"p\">,</span>\n<span class=\"p\">...</span>\n</code></pre></div></div>\n\n<p>It turns out you can use these as custom callback notifications. I was looking for documentation on this in the SDK and on Google. There really wasn’t anything related to calling these custom notifications. I had a hunch that these notifications are also built into 3ds Max, so it was a case of just trying it out.</p>\n\n<h3 id=\"calling-the-custom-callback-notification\">Calling the Custom Callback Notification</h3>\n\n<p>To see what this looks like in action, below is a list of event notifications tied to their respective functions.</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/callback_setup.png\" />\n</p>\n\n<p>For example if you reset the whole scene in 3DS Max, <a href=\"https://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=__cpp_ref_group___notification_codes_html#ga5303fe3def5b0e9d9db43d72f21a57a7\"><code class=\"highlighter-rouge\">SystemPreReset</code></a> will be triggered <strong>before</strong> the scene gets reset and <a href=\"https://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=__cpp_ref_group___notification_codes_html#ga7c7cc8d157e42c9472dd44f4c55e5f0d\"><code class=\"highlighter-rouge\">SystemPostReset</code></a> will be triggered <strong>after</strong> the scene gets reset, causing our nicely named notifications <code class=\"highlighter-rouge\">onSystemPreReset</code> and <code class=\"highlighter-rouge\">onSystemPostReset</code> to be called.</p>\n\n<p><span id=\"skip\"></span>\nTo trigger the custom system notification <code class=\"highlighter-rouge\">CustomN</code>, we have to turn to MaxScript for help. A very handy property of MaxScript is that it can interoperate with Python and .NET.</p>\n\n<div class=\"language-lua highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n<span class=\"n\">bn</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">dotNetClass</span> <span class=\"s2\">\"Autodesk.Max.GlobalInterface\"</span><span class=\"p\">).</span><span class=\"n\">Instance</span><span class=\"p\">.</span><span class=\"n\">BroadcastNotification</span>\n<span class=\"n\">bn</span> <span class=\"p\">(</span><span class=\"n\">dotNetClass</span> <span class=\"s2\">\"Autodesk.Max.SystemNotificationCode\"</span><span class=\"p\">).</span><span class=\"n\">Custom3</span>\n\n</code></pre></div></div>\n\n<p>Once this code runs, any function that is hooked onto <code class=\"highlighter-rouge\">Custom3</code> would execute. This function can be in MaxScript, Python, C# or C++.</p>\n\n<p>That’s it really…</p>\n\n<h3 id=\"code-examples\">Code Examples</h3>\n\n<p>You’re not leaving empty handed! I’ve taken it upon myself to write 4 basic examples of calling custom notifications in MaxScript, Python, C# and C++; something akin to samples Autodesk should have provided.</p>\n\n<p>Try it out yourself! the code is over on <a href=\"https://github.com/hako/3dsMax-CustomNotifications\">GitHub</a>.</p>\n\n<p>Instructions for installation and how to build/run the project are on the README.</p>\n\n<p><em>(Or if you’re lazy just download the DLL (C#) / DLU (C++) from the <a href=\"https://github.com/hako/3dsMax-CustomNotifications/releases/tag/1.0.0\">releases section</a> and follow the instructions.</em></p>\n",
      
      "tags":  [ "" ],
      
      "date_published": "2019-11-29T00:00:00+00:00",
      "date_modified": "2019-11-29T00:00:00+00:00"
    },

    {
      "id": "/p/alternatives-to-jwt-tokens",
      "url": "https://wesleyhill.co.uk/p/alternatives-to-jwt-tokens/?utm_source=jsonFeed&amp;utm_medium=jsonFeed&amp;utm_campaign=AlternativestoJSONWebTokens(JWT)",
      "title": "Alternatives to JSON Web Tokens (JWT)",
      "content_html": "<style>\nvideo {\n  width: 100%    !important;\n  height: auto   !important;\n}\n</style>\n\n<p>Back in around November of 2018, I gave a talk at <a href=\"https://www.meetup.com/Go-London-User-Group/\">London Gophers Meetup</a> @ <a href=\"https://www.riverisland.com\">River Island</a> about alternatives to <a href=\"https://jwt.io\">JWT tokens</a>.</p>\n\n<p>If you’re in a hurry or want a TL;DR/DW, jump straight to the <strong><a href=\"https://wesleyhill.co.uk/p/alternatives-to-jwt-tokens#alternatives\">alternatives</a></strong> or read on if you want to read my motivation for doing the talk.</p>\n\n<p>You can see the video and slides below: (note requires JavaScript):</p>\n\n<h3 id=\"slides\">Slides</h3>\n\n<script async=\"\" class=\"speakerdeck-embed\" data-id=\"b11ffc80494346c7b36af55a1ce52643\" data-ratio=\"1.77777777777778\" src=\"//speakerdeck.com/assets/embed.js\"></script>\n\n<h3 id=\"video-10-mins\">Video (10 mins)</h3>\n\n<video controls=\"\" width=\"250\">\n    <source src=\"https://wesleyhill.co.uk/assets/v/exploring-alternatives-to-jwt.mp4\" type=\"video/mp4\" />\n    Sorry, your browser doesn't support embedded videos.\n</video>\n\n<p><br /></p>\n\n<h3 id=\"motivation\">Motivation</h3>\n\n<p>The gist of why I did this talk is the fact that on Reddit, Medium and especially on HN, I see the following discussion on JWT’s:</p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>A: Don't use JWT.\nB: What are some alternatives to JWT?\n</code></pre></div></div>\n\n<p>Pretty much the discussion diverges into an array of setups of how to handle JWT situations such as token revocation, blacklisting tokens, etc for which I have little time for reading threads of different JWT setups. <a href=\"https://hn.algolia.com/?query=JWT&amp;sort=byPopularity&amp;prefix&amp;page=0&amp;dateRange=all&amp;type=story\">You only have to look at few of the comments on these to get my point.</a></p>\n\n<p>From what I see, the reasons JWTs are frowned upon is that:</p>\n\n<ul>\n  <li><strong><a href=\"http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/\">JWTs shouldn’t be used for sessions.</a></strong>\n    <ul>\n      <li>Sven Slootweg (@joepie91) outlines the (claimed) advantages and drawbacks of JWT’s and the real use case in which you should use them for i.e short lived tokens.</li>\n    </ul>\n  </li>\n  <li><strong><a href=\"https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid\">JOSE is a cryptographically bad standard.</a></strong>\n    <ul>\n      <li>Scott Arciszewski (@CiPHPerCoder) argues from a cryptography standpoint, in which the JOSE standard (which JWT is a part of) is complex, error prone and leads to insecurity. He mentions <a href=\"https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid#jws-forgery\">token forgery as an example by changing the <code class=\"highlighter-rouge\">\"alg\"</code> header</a>.</li>\n    </ul>\n  </li>\n</ul>\n\n<p>That being said, I am sure there are many more reasons but those two are the most common ones.</p>\n\n<h1 id=\"alternatives\">Alternatives?</h1>\n\n<p>The alternatives shown in my lightning talk were:</p>\n\n<ul>\n  <li>\n    <p><a href=\"https://paseto.io\">PASETO</a> - Made by Scott Arciszewski</p>\n  </li>\n  <li>\n    <p><a href=\"https://branca.io\">Branca</a> – Made by Mika Tuupola</p>\n  </li>\n  <li>\n    <p><a href=\"http://macaroons.io\">Macaroons</a> - Made by Google</p>\n  </li>\n</ul>\n\n<p>These three alternatives have one shared advantage over JWT, <strong>they don’t allow the user to change the algorithm</strong> and use best practices of modern cryptography. You can also see implementations of these alternatives in your favourite language.</p>\n\n<p>The individual advantages of each alternative token are on the last page of my slide (note requires JavaScript):</p>\n\n<script async=\"\" class=\"speakerdeck-embed\" data-slide=\"20\" data-id=\"b11ffc80494346c7b36af55a1ce52643\" data-ratio=\"1.77777777777778\" src=\"//speakerdeck.com/assets/embed.js\"></script>\n\n<h1 id=\"whos-using-them\">Who’s using them?</h1>\n\n<p>Good question! this section will be continuously updated until I lose count, but here are a few:</p>\n\n<ul>\n  <li>\n    <p><a href=\"https://paseto.io\">PASETO</a></p>\n  </li>\n  <li><a href=\"https://branca.io\">Branca</a>\n    <ul>\n      <li><a href=\"https://micro.mu/\">Micro HQ</a></li>\n    </ul>\n  </li>\n  <li><a href=\"http://macaroons.io\">Macaroons</a>\n    <ul>\n      <li><a href=\"https://github.com/rescrv/HyperDex\">HyperDex</a></li>\n    </ul>\n  </li>\n</ul>\n\n<p><br /></p>\n\n<h4 id=\"acknowledgements\">Acknowledgements</h4>\n\n<p><em>I would like to thank Mika Tuupola, Scott Arciszewski and Paul Jolly for checking over my slides and the London Gophers Meetup organisers + River Island for having me.</em></p>\n",
      
      "tags":  [ "" ],
      
      "date_published": "2018-12-31T00:00:00+00:00",
      "date_modified": "2018-12-31T00:00:00+00:00"
    },

    {
      "id": "/p/drawpile-on-haiku!",
      "url": "https://wesleyhill.co.uk/p/drawpile-on-haiku!/?utm_source=jsonFeed&amp;utm_medium=jsonFeed&amp;utm_campaign=DrawpileonHaiku!",
      "title": "Drawpile on Haiku!",
      "content_html": "<p>A few months ago, I stumbled across an interesting piece of software called <a href=\"https://drawpile.net\"><em>Drawpile</em></a>. It is an open source drawing program which allows users anywhere in the world to draw together. It turns out (and I’m glad) that this program is available on Windows, Mac and GNU/Linux.</p>\n\n<p>But why stop at those three? I had the idea of porting Drawpile to Haiku as a bonus. For those who don’t know what Haiku is:</p>\n\n<blockquote>\n  <p>Haiku is an open-source operating system that specifically targets personal computing. Inspired by the BeOS, Haiku is fast, simple to use, easy to learn and yet very powerful. – haiku-os.org</p>\n</blockquote>\n\n<p>BeOS, developed by Be Inc., has been long discontinued and Haiku supports most (if not all) of it’s features. You can find out more through their <a href=\"https://www.haiku-os.org/about/faq/\">FAQ</a>. Haiku has it’s own package manager called <em>HaikuDepot</em> (think of it like an App Store) where you can download applications for Haiku such as: <a href=\"https://depot.haiku-os.org/#!/pkg/telegram_desktop/haikuports/1/3/10/-/1/x86_64?bcguid=bc6660-GJUI\">Telegram</a>, <a href=\"https://depot.haiku-os.org/#!/pkg/blender/haikuports/2/79b/-/-/7/x86_64?bcguid=bc33-PFWK\">Blender</a>, <a href=\"https://depot.haiku-os.org/#!/pkg/libreoffice/haikuports/6/2/0.0/git/14/x86_64?bcguid=bc89-LPIJ\">LibreOffice</a> and <a href=\"https://depot.haiku-os.org/#!/pkg/transmission/haikuports/2/94/-/-/2/x86_64?bcguid=bc130-STJV\">Transmission</a>. For developers: <a href=\"https://depot.haiku-os.org/#!/pkg/qt_creator/haikuports/4/6/2/-/1/x86_64?bcguid=bc1874-TWFX\">Qt</a>, <a href=\"https://depot.haiku-os.org/#!/pkg/vim/haikuports/8/0/1176/-/1/x86_64?bcguid=bc2069-XOXY\">Vim</a>, <a href=\"https://depot.haiku-os.org/#!/pkg/emacs/haikuports/26/1/-/-/3/x86_64?bcguid=bc2158-OXAN\">Emacs</a>, <a href=\"https://depot.haiku-os.org/#!/pkg/python/haikuports/2/7/14/-/2/x86_64?bcguid=bc2254-NUSI\">Python</a>, <a href=\"https://depot.haiku-os.org/#!/pkg/rust_bin/haikuports/1/28/0/-/1/x86_64?bcguid=bc153-TOKK\">Rust</a> and <a href=\"https://depot.haiku-os.org/#!/pkg/swift_lang/haikuports/3/1/-/-/1/x86_64?bcguid=bc191-WSEF\">Swift</a> <a href=\"https://depot.haiku-os.org/#!/?bcguid=bc1-YVYB&amp;repos=haikuports&amp;arch=x86_64&amp;viewcrttyp=CATEGORIES&amp;pkgcat=development\">etc..</a></p>\n\n<p>Porting Drawpile to Haiku required a few dependencies that already existed on Haiku such as Qt5, libsodium and KF5 KArchive. I wrote a buildscript (called a recipe) which builds Drawpile into a nice package for HaikuDepot. A few changes to the buildscript later and Drawpile compliled on Haiku!</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/drawpile_installed.png\" />\n</p>\n\n<p>With the installation complete, I launched it from <code class=\"highlighter-rouge\">Applications / Drawpile</code> in the menu screen and the GUI opened with no issues and drawing works well too.</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/drawpile_test.png\" />\n</p>\n\n<p>I connected to a random Drawpile server to test if it worked without issues, turns out it does quite well. Note that I’m using VirtualBox to run Drawpile and it’s a bit cumbersome to use under a VM, but you get the idea.</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/gif/drawpile_demo.gif\" />\n</p>\n\n<p>I made a <a href=\"https://github.com/haikuports/haikuports/pull/2752\">pull request (PR) to HaikuPorts</a> (the recipe repository for haiku packages) to include Drawpile into Haiku, you should see it in the HaikuDepot once the PR has merged. If you want to try it out, you can download the Drawpile package with previous versions directly from <a href=\"https://depot.haiku-os.org/#!/pkg/drawpile?bcguid=bc15-KQHA\">HaikuDepot</a>.</p>\n\n<p>If you’d like to contribute more software to Haiku, I recommend starting at the HaikuPorts repository wiki.</p>\n\n<p><a href=\"https://github.com/haikuports/haikuports/wiki\">HaikuPorts Wiki</a></p>\n\n<p><a href=\"https://www.haiku-os.org/blog/humdinger/2017-02-22_building_packages_with_haikuporter\">Building packages with haikuporter</a></p>\n",
      
      "tags":  [ "" ],
      
      "date_published": "2018-08-19T00:00:00+01:00",
      "date_modified": "2018-08-19T00:00:00+01:00"
    },

    {
      "id": "/p/writing-gui-apps-using-the-red-programming-language",
      "url": "https://wesleyhill.co.uk/p/writing-gui-apps-using-the-red-programming-language/?utm_source=jsonFeed&amp;utm_medium=jsonFeed&amp;utm_campaign=WritingGUIappsusingtheRedProgrammingLanguage",
      "title": "Writing GUI apps using the Red Programming Language",
      "content_html": "<p><em><a rel=\"nofollow\" href=\"https://www.oschina.net/translate/writing-gui-apps-using-the-red-programming-language\"> Chinese Translation</a> by <a href=\"https://oschina.net\">oschina.net</a></em></p>\n\n<p><em><a rel=\"nofollow\" href=\"https://vectorified.com/uz-red-programming\"> Uzbek Translation</a> by <a href=\"https://vectorified.com\">vectorified.com</a></em></p>\n\n<p>After trying (and failing) to wrap “executable” ducktape around a Python script using PyInstaller on Windows, The class of programming languages which now usually pique my interest have the following attributes:</p>\n\n<ul>\n  <li>Static <strong>binary</strong> compilation. (<strong>producing a binary</strong>, not running bytecode i.e Java, Python)</li>\n  <li><em><strong>Fast</strong></em>.</li>\n  <li><strong>Cross Platform</strong>. (Windows, Mac, Linux, *BSD and/or <a href=\"https://www.haiku-os.org\">Haiku</a> (Bonus) )</li>\n</ul>\n\n<p>Having picked up <a href=\"https://golang.org\">Go</a> three years ago for this purpose, <a href=\"https://www.hakobaito.co.uk/b/introducing-swell-beta/\">(started developing an app with it)</a> I can guarantee that Go binaries work across multiple platforms through cross compilation. Other languages such as <a href=\"https://crystal-lang.org/\">Crystal</a> and <a href=\"https://www.rust-lang.org/\">Rust</a> also tick the boxes above, but both were not stable at the time. Today, I’m exploring options for <strong>native cross platform GUIs</strong><sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\">1</a></sup>.</p>\n\n<p>There have been lots of “modern desktop applications” being built with <a href=\"https://electron.atom.io\">Electron</a>. This allows programmers to build desktop applications with HTML, CSS and JavaScript. Sounds awesome right? Well…</p>\n\n<p>While Electron is easier, faster to market and cost effective for programmers, Electron is notorious for the <strong>sheer</strong> amount of bloat it carries in binary size and in RAM usage<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\">2</a></sup>. You may have come across posts <a href=\"https://drewdevault.com/2016/11/24/Electron-considered-harmful.html\">lamenting</a> <a href=\"https://medium.com/@caspervonb/electron-is-cancer-b066108e6c32\">the use of it</a>, to the point that bashing Electron is almost guaranteed in an online tech forum if any application dares to use it.</p>\n\n<p>To your disappointment, this is not one of these posts. Qt and GTK+ are interesting alternatives, I even plan to use them myself. However, both are not as quick to develop in as Electron is. Can we have <strong>both?</strong> A native cross platform GUI that is also faster to develop in? <strong>Enter Red</strong>.</p>\n\n<h1 id=\"red\">Red</h1>\n\n<blockquote>\n  <p>“<a href=\"https://en.m.wikipedia.org/wiki/Red_(programming_language)\">Red</a> is a next-generation programming language strongly inspired by <a href=\"https://en.m.wikipedia.org/wiki/Rebol\">Rebol</a>.”</p>\n</blockquote>\n\n<p>Red was made largely because Rebol was proprietary, closed source software <em>(That is until in 2012, Rebol 3 was made open source)</em>. Both languages have a great GUI system (which we will get into), the difference Red makes is that it can be used for systems programmming with a DSL called <a href=\"http://static.red-lang.org/red-system-specs.html#section-1\">Red/System</a> and the compiler is amazingly <strong>less than 2MB</strong>.  You can find out more about Red <a href=\"http://www.red-lang.org/p/about.html\">here</a> and you can <a href=\"http://www.red-lang.org/p/download.html\">download it here</a>.</p>\n\n<h2 id=\"gui\">GUI</h2>\n\n<p>Here is a “Hello World” using Red’s GUI system.</p>\n\n<p>Red comes with an interpreter, so you can go ahead and run the code below by typing <code class=\"highlighter-rouge\">red hello_world_gui.red</code></p>\n\n<div class=\"language-rb highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"no\">Red</span> <span class=\"p\">[]</span>\n<span class=\"n\">view</span> <span class=\"p\">[</span> <span class=\"n\">text</span> <span class=\"s2\">\"Hello World\"</span> <span class=\"p\">]</span>\n</code></pre></div></div>\n<p>Red will interpret this code and run it without compiling it to a binary. If you want to produce a binary, amend the code to the following:</p>\n\n<pre><code class=\"language-red\">Red [ needs: 'View ]\nview [ text \"Hello World\" ]\n</code></pre>\n\n<p>and run:</p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>red -r -c hello_world_gui.red\n</code></pre></div></div>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/hw.png\" />\n</p>\n\n<p>The result of this compilation is a single binary that shows the words <em>“Hello World”</em> in a GUI. <strong>GUI support is not currently available on Linux yet</strong> <a href=\"https://twitter.com/red_lang/status/903538726906740737\">(it’s experimental)</a>, but compiling this works on Windows and Mac. Red supports cross compilation so that you can compile binaries for a different platform, We can get a list of the available cross compilation targets that Red can compile to.</p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>hako ~ red -h\n...\nCross-compilation targets:\n\n    MSDOS        : Windows, x86, console (+ GUI) applications\n    Windows      : Windows, x86, GUI applications\n    WindowsXP    : Windows, x86, GUI applications, no touch API\n    Linux        : GNU/Linux, x86\n    Linux-ARM    : GNU/Linux, ARMv5, armel (soft-float)\n    RPi          : GNU/Linux, ARMv5, armhf (hard-float)\n    Darwin       : macOS Intel, console or GUI applications\n    macOS        : macOS Intel, GUI-only, applications bundles\n    Syllable     : Syllable OS, x86\n    FreeBSD      : FreeBSD, x86\n    Android      : Android, ARMv5\n    Android-x86  : Android, x86\n</code></pre></div></div>\n\n<p>A “Hello World” isn’t that useful though, let’s go further with a simple image viewer where we get a random image, here is the code:</p>\n\n<pre><code class=\"language-red\">Red [\n\ttitle: \"Simple Image Viewer\"\n\tauthor: \"Wesley Hill\"\n\tversion: 0.1\n\tneeds: 'View\n]\n\nrand_img: https://source.unsplash.com/random/310x200\nmessage: \"Press Random for a random image!\"\n\nview/options [title \"Simple Image Viewer\"\n\t below center\n\t pictures: image 310x200 message\n\t across\n\t random_btn: button \"Random\" [\n\t\tnew_image: load rand_img\n\t\tpictures/image: new_image\n\t\tpictures/text: \"\"\n\t]\n\t text \"A Simple Image Viewer in Red\"\n][]\n</code></pre>\n\n<p>The two variables <code class=\"highlighter-rouge\">rand_img</code> and <code class=\"highlighter-rouge\">message</code> are created above, and we use the <code class=\"highlighter-rouge\">view</code> function to invoke Red’s <a href=\"https://doc.red-lang.org/en/vid.html\">VID dialect</a> and <a href=\"https://doc.red-lang.org/en/view.html#_text\">View Engine</a>, we set our title and layout to being in the center of the window. Our images will be of size <code class=\"highlighter-rouge\">310x200</code> using the <a href=\"http://www.red-by-example.org/#pairxex\"><code class=\"highlighter-rouge\">pair</code></a> datatype and we set our button <code class=\"highlighter-rouge\">random_btn</code> and <code class=\"highlighter-rouge\">text</code> to be across from one another. Finally, once we click the “Random” button, we use the <a href=\"http://www.red-by-example.org/#load\"><code class=\"highlighter-rouge\">load</code></a> function to retrieve data from a source. The source needs to be a path, which can be a <code class=\"highlighter-rouge\">file</code>, <code class=\"highlighter-rouge\">string</code>, <code class=\"highlighter-rouge\">binary</code> or <code class=\"highlighter-rouge\">url</code> datatype.</p>\n\n<p>In this case we are using the <code class=\"highlighter-rouge\">url</code> datatype from <code class=\"highlighter-rouge\">rand_img</code> and we set our image with <code class=\"highlighter-rouge\">pictures/image:</code> to our new image held in <code class=\"highlighter-rouge\">new_image</code>. We only want our image to be displayed, so we set the text in the image to be empty.</p>\n\n<p>We can inspect the datatype with the <code class=\"highlighter-rouge\">type?</code> built-in function. Note that Red has over <a href=\"http://red-by-example.org/#cat-d03\">50+ types</a>.</p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>&gt;&gt; print type? rand_img\nurl\n&gt;&gt; print type? message\nstring\n&gt;&gt; \n</code></pre></div></div>\n\n<p>Once we run the code above we get our simple image viewer!</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/gif/siv.gif\" />\n</p>\n\n<p>…and it also works on Windows</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/gif/siv_2.gif\" />\n</p>\n\n<p>Red can be used for more advanced applications, here are a few:</p>\n\n<h2 id=\"automated-photo-copier\">Automated Photo Copier</h2>\n\n<p>For a more advanced application using Red, I wrote a program for my Dad to deal with moving hundreds of photos. Below is the GUI of the program in action, I’m using a collection of random photos to demonstrate the program.</p>\n\n<p>These demo photos are tiny (~5KB on average), and the photos my Dad works with are usually around ~14MB per photo in a sea of thousands of photos.</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/gif/apc_demo.gif\" />\n</p>\n\n<h2 id=\"parsing-the-data\">Parsing the data</h2>\n\n<p>The input data is actually an email containing a list of photos that the client has selected.</p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>Selected the following images:\n\nBIRTHDAY PARTY &gt; ABC 7453\nTIF_FILE_ID: 0123456789\n\nBIRTHDAY PARTY &gt; ABC 7454\nTIF_FILE_ID: 0123456790\n\n...\n\nBIRTHDAY PARTY &gt; ABC 8217\nTIF_FILE_ID: 0123456899\n</code></pre></div></div>\n\n<p>The filename of the selected photos takes the form of <code class=\"highlighter-rouge\">ABC_1234.jpg</code>. So it would make sense to use <a href=\"https://en.wikipedia.org/wiki/Regular_expression\">Regular Expressions</a> for this problem. Instead, Red has it’s own pattern matching parser originally invented by Rebol called <a href=\"http://www.red-lang.org/2013/11/041-introducing-parse.html\">PARSE</a>.</p>\n\n<p>The following regular expression below…</p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>[A-Z]{3,}\\s\\d\\S{3,}\n</code></pre></div></div>\n\n<p>…is similar to the following PARSE rule:</p>\n\n<pre><code class=\"language-red\">[some letter space 4 digit opt letter]\n</code></pre>\n\n<p>Given the following rules of <code class=\"highlighter-rouge\">letter</code> and <code class=\"highlighter-rouge\">digit</code>:</p>\n\n<pre><code class=\"language-red\">letter: charset [#\"A\" - #\"Z\"]\ndigit:  charset \"0123456789\"\n</code></pre>\n\n<p>The reason why <code class=\"highlighter-rouge\">opt letter</code> is included in the parse rule, is to catch the <code class=\"highlighter-rouge\">ABC 1234A</code> optional edgecase which sometimes appears in the email. Below is how the parser sees this rule:</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/parse_syntax.png\" />\n</p>\n\n<p>Using the Red interpreter, we can test that the parse rule is working. For successful matches PARSE returns <code class=\"highlighter-rouge\">true</code> and <code class=\"highlighter-rouge\">false</code> otherwise.</p>\n\n<pre><code class=\"language-red\">&gt;&gt; parse \"ABC 1234\" [some letter space 4 digit]\n== true\n&gt;&gt; parse \"ABC 1234A\" [some letter space 4 digit opt letter]\n== true\n&gt;&gt; parse \"ABC 1234AB\" [some letter space 4 digit opt letter]\n== false\n</code></pre>\n\n<p>PARSE is a Rebol/Red specific alternative to the now universal regular expression syntax which most if not all experienced programmers are familiar with.  It took me a while to learn the syntax and I appreciate the fact that the rules are in plain readable english unlike regex.</p>\n\n<p>Writing this app took me a weekend after prototyping and testing it in Python, it is &lt; 220 lines of code. My Dad uses a Mac, so generating a binary is as easy as compiling the source in release mode for macOS.</p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>red -r -o \"APC\" -t macOS apc.red --red-only -v 4\n</code></pre></div></div>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/apc.png\" />\n</p>\n\n<p>and it’s not even 2MB and <strong>it. just. works.™</strong></p>\n\n<h2 id=\"lines-clone\">Lines Clone</h2>\n\n<p>To demonstrate Red’s networking and serialisation capabilities, I re-created an app I had on my phone called Lines, which is a simple London tube status app. Unfortunately it’s not available on the App Store anymore, but I still have it on my old iPhone. The image on the right shows what it looks like.</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/lines_ios11.png\" />\n    <img src=\"/assets/img/v/png/f/lines_ios.png\" />\n</p>\n\n<p>Below is the same app implemented in Red. Clicking on the “Lines” will pop open information about a particular tube line.</p>\n\n<p style=\"text-align: center;\">\n    <img src=\"/assets/img/v/png/f/lines_red.png\" />\n    <img src=\"/assets/img/v/png/f/status.png\" />\n</p>\n\n<p>Currently Red has no built-in JSON parser. <a href=\"https://github.com/red/code/pull/28\">I found a JSON parser floating around</a> that was good enough for this demonstration. Building this app took around 3 days of free time to make and is around 897KB in size.</p>\n\n<h2 id=\"closing-thoughts\">Closing Thoughts</h2>\n\n<p>Apart from the GUI system which could do with a Linux implementation (A GTK3 backend is in the works for Red), be aware that Red currently compiles binaries in <strong>32bit</strong>. With the Automated Photo Copier app I had problems when I was copying large photos using Red and often the program just crashed all of a sudden. I switched to using <code class=\"highlighter-rouge\">cp</code> to copy the photos (Since I knew that my Dad was only using a Mac) by calling <a href=\"http://www.red-by-example.org/index.html#call\"><code class=\"highlighter-rouge\">call/console</code></a> to the <code class=\"highlighter-rouge\">cp</code> command. At that point it copies the images flawlessly. This would be a different story had he used Windows instead.</p>\n\n<p>Is Red a good alternative to Electron? If you’re building a small internal tool that needs a quick GUI or need a cross platform GUI with less development headaches, then <strong>yes</strong>. It isn’t production ready yet, but Red has a lot of huge potential in the future <a href=\"http://www.red-lang.org/p/roadmap.html\">looking at their roadmap</a>. I have to admit the learning curve is slightly moderate if you are not familiar with Rebol (resources and links below). An alternative I have yet to try out is <a href=\"http://www.lazarus-ide.org\">Lazarus</a> (maybe in a future blogpost!), but the speed of developing GUI’s in Red is very promising.</p>\n\n<p>The Lines clone code is <a href=\"https://github.com/hako/lines\">open source on GitHub</a>.</p>\n\n<p><br /></p>\n\n<p>If you’re interested in learning more about Red, check out these links:</p>\n\n<p><a href=\"http://helpin.red\">Helpin’Red</a> — (Recommended)</p>\n\n<p><a href=\"http://rebol.com/r3/docs/index.html\">Rebol Documentation</a> — (Recommended)</p>\n\n<p><a href=\"https://ungaretti.gitbooks.io/red-language-notebook/content/\">The Red Language Notebook</a> — (Recommended)</p>\n\n<p><a href=\"http://www.rebol.com/docs/core23/rebolcore.html\">Rebol Core Users Guide</a></p>\n\n<p><a href=\"https://doc.red-lang.org\">Red Official Documentation</a> — (Slightly incomplete)</p>\n\n<p><a href=\"http://www.red-lang.org/p/documentation.html\">Red guides and community material</a></p>\n\n<p><a href=\"http://www.red-by-example.org/\">Red by Example</a></p>\n\n<div class=\"footnotes\">\n  <ol>\n    <li id=\"fn:1\">\n      <p>I used the tried and tested ones, you know: Python, Ruby, Java, C/++/# and JS, but wanted to try something new. In terms of GUI’s for Go, <a href=\"https://github.com/golang/exp/tree/master/shiny\">shiny</a> is experimental, there is <a href=\"https://github.com/therecipe/qt\">therecipe/qt</a> and my personal favorite, <a href=\"https://github.com/andlabs/ui\">andlabs/ui</a>. <a href=\"#fnref:1\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n    <li id=\"fn:2\">\n      <p>There exists some performant Electron apps (Visual Studio Code), but this is the exception and not the rule. <a href=\"#fnref:2\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n  </ol>\n</div>\n",
      
      "tags":  [ "" ],
      
      "date_published": "2017-12-19T00:00:00+00:00",
      "date_modified": "2017-12-19T00:00:00+00:00"
    },

    {
      "id": "/p/dissertation",
      "url": "https://wesleyhill.co.uk/p/dissertation/?utm_source=jsonFeed&amp;utm_medium=jsonFeed&amp;utm_campaign=Dissertation",
      "title": "Dissertation",
      "content_html": "<style>\n.prose blockquote p {\n    font-size: 20px;  \n}\n@media (min-width: 52em) {\n  .prose blockquote p {\n    font-size: 20px; \n    } \n}\n</style>\n\n<h1 id=\"abstract\">Abstract</h1>\n\n<blockquote>\n  <p>Emotion Recognition is a field that computers are getting very good at identifying; whether it’s through images, video or audio. Emotion Recognition has shown promising improvements when combined with classifiers and Deep Neural Networks showing a validation rate as high as 59% and a recognition rate of 56%.</p>\n\n  <p>The focus of this dissertation will be on facial based emotion recognition. This consists of detecting facial expressions in images and videos. While the majority of research uses human faces in an attempt to recognise basic emotions, there has been little research on whether the same deep learning techniques can be applied to faces in cartoons.</p>\n\n  <p>The system implemented in this paper, aims to classify at most three emotions (happiness, anger and surprise) of the 6 basic emotions proposed by psychologists Ekman and Friesen, with an accuracy of <strong>80%</strong> for the 3 emotions. Showing promise of applications of deep learning and cartoons. This project is an attempt to examine if emotions in cartoons can be detected in the same way that human faces can.</p>\n</blockquote>\n\n<p>As a first post, here is my dissertation I did at Lincoln, <em>‘Deep Learning for Emotion Recognition in Cartoons’</em>. Most of the information is all on the <a href=\"https://github.com/hako/dissertation\">README page on GitHub</a>.</p>\n\n<p>I really enjoyed doing this project and I hope you enjoy reading it too.</p>\n\n<p><a href=\"https://github.com/hako/dissertation/raw/master/dissertation.pdf\">PDF</a> <a href=\"https://hako.github.io/dissertation/\">HTML</a></p>\n",
      
      "tags":  [ "" ],
      
      "date_published": "2017-12-10T00:00:00+00:00",
      "date_modified": "2017-12-10T00:00:00+00:00"
    },

    {
      "id": "/p/what-to-expect",
      "url": "https://wesleyhill.co.uk/p/what-to-expect/?utm_source=jsonFeed&amp;utm_medium=jsonFeed&amp;utm_campaign=Whattoexpect",
      "title": "What to expect",
      "content_html": "<p>Welcome to my <em>new</em> blog, if you’re coming from <a href=\"https://www.hakobaito.co.uk/\">my other one</a> you may find something very different about it.</p>\n\n<p>Instead of the traditional <code class=\"highlighter-rouge\">=&gt; \"Hello World\"</code> most first posts always do, I’ll get straight to the point.</p>\n\n<p>This is my <em>personal</em> blog, where i’ll post about whatever I find very interesting and worth a post.</p>\n\n<p><br /></p>\n\n<p>Expect some posts to cover <strong>technology</strong>, <strong>software engineering</strong>,  <strong>computer science</strong>, <strong>startups</strong>, <strong>security</strong>, <strong>open source</strong>, <em>(and my favorite)</em> <strong>animation</strong><sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\">1</a></sup>. But that’s not all.</p>\n\n<p>If time permits, I plan on posting experimental content. Some of these are derived from my software and animations such as <strong>sketches</strong>, <strong>sample code</strong>, <strong>GIFs!</strong> <em>(or JIFs???)</em> and especially <strong>zines</strong>!<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\">2</a></sup>.</p>\n\n<p>This will benefit readers those who like to look at graphics, instead of walls of text. I’m sure I’ll enjoy creating graphics for this blog as I did on my other one.</p>\n\n<aside class=\"instapaper_ignore\">\n    <p>To summarise in one picture: <i>(Some readers may get the reference)</i></p>\n</aside>\n\n<aside class=\"instapaper_ignore\">\n<svg viewBox=\"0 0 442 315\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n  <defs>\n    <linearGradient id=\"a\" x1=\"-75.35\" x2=\"427.45\" y1=\"174.35\" y2=\"174.35\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"61.17647059%\" stop-color=\"#E85947\" />\n      <stop offset=\"95.29411765%\" stop-color=\"#FFF\" />\n    </linearGradient>\n    <linearGradient id=\"b\" x1=\"-75.35\" x2=\"427.45\" y1=\"174.35\" y2=\"174.35\" gradientUnits=\"userSpaceOnUse\">\n      <stop offset=\"0%\" stop-color=\"#E75244\" />\n      <stop offset=\"100%\" stop-color=\"#F19764\" />\n    </linearGradient>\n    <g id=\"c\">\n      <path id=\"b\" d=\"M310.05 179.25q-.35 0-.65.15-.3.1-.55.5v-2.05h-1.1v5.75h1.1v-2.3q0-.55.2-.85.25-.3.7-.3.4 0 .55.3.1.2.1.55v2.6h1.15v-2.5q0-.55-.05-.8 0-.3-.2-.5-.2-.3-.5-.45-.35-.1-.75-.1m13.85 3.1h-1.15q-.1.2-.2.3-.25.2-.65.2-.35 0-.6-.15-.4-.3-.45-.9h3.1q0-.55-.05-.85-.05-.5-.3-.9-.3-.4-.75-.6-.45-.2-1-.2-.95 0-1.55.55-.55.6-.55 1.7 0 1.2.65 1.7.65.55 1.5.55 1 0 1.6-.65.35-.35.4-.75m-2.05-2.2q.4 0 .65.25.25.2.3.65h-1.9q.05-.4.3-.65.2-.25.65-.25m-5.45 2.2h-1.15q-.1.2-.2.3-.25.2-.65.2-.35 0-.6-.15-.4-.3-.45-.9h3.1q0-.55-.05-.85-.05-.5-.3-.9-.3-.4-.75-.6-.45-.2-1-.2-.95 0-1.55.55-.55.6-.55 1.7 0 1.2.65 1.7.65.55 1.5.55 1 0 1.6-.65.35-.35.4-.75m-1.4-1.95q.25.2.3.65h-1.9q.05-.4.3-.65.2-.25.65-.25.4 0 .65.25m4.35-1.15h-.05q-.5 0-.85.25-.15.15-.45.6v-.75h-1.05v4.25h1.15v-2.05q0-.5.1-.75.25-.45.9-.45h.15l.2.05v-1.15h-.1m-16.4 3.6q-.35 0-.6-.15-.4-.3-.45-.9h3.1q0-.55-.05-.85-.05-.5-.3-.9-.3-.4-.75-.6-.45-.2-1-.2-.95 0-1.55.55-.55.6-.55 1.7 0 1.2.65 1.7.65.55 1.5.55 1 0 1.6-.65.35-.35.4-.75h-1.15q-.1.2-.2.3-.25.2-.65.2m-.05-2.7q.4 0 .65.25.25.2.3.65h-1.9q.05-.4.3-.65.2-.25.65-.25m-2.4-.9h-.15q-.5 0-.85.25-.15.15-.45.6v-.75H298v4.25h1.15v-2.05q0-.5.1-.75.25-.45.9-.45h.15l.2.05v-1.15m25.3.05q-.3-.7-.9-1.55h-.85l.25.45q.5.9.65 1.9.15.65.15 1.4 0 1.2-.35 2.2-.2.6-.7 1.5h.8l.3-.35q.25-.35.55-1.05.55-1.2.55-2.4 0-1.05-.45-2.1m-28.7 1.25q0-.75-.55-1.05-.55-.25-1.25-.25-1.05 0-1.5.55-.3.35-.35.9h1.1q.05-.2.15-.35.15-.2.55-.2.35 0 .55.1.2.1.2.35 0 .2-.25.3-.15.05-.45.1l-.4.05q-.6.1-.95.3-.6.35-.6 1.1 0 .6.35.95.4.35.95.35.5 0 .85-.2.3-.2.5-.45l.1.5h1.25v-.15q-.1-.05-.2-.15-.05-.05-.05-.3v-2.45m-2.65 1.85q0-.35.25-.5.15-.1.5-.15l.55-.1.25-.1v.4q0 .55-.35.75-.3.2-.65.2-.25 0-.4-.1-.15-.15-.15-.4m24.3 30.5q-.5-.7-1.6-.7t-1.65.7q-.55.65-.55 1.6 0 .9.55 1.6.55.65 1.65.65 1.1 0 1.6-.65.55-.7.55-1.6 0-.95-.55-1.6m-2.65 1.6q0-.65.3-1 .25-.35.75-.35.45 0 .75.35.25.35.25 1 0 .6-.25.95-.3.35-.75.35-.5 0-.75-.35-.3-.35-.3-.95m6.1-2.15q-.25-.1-.6-.1-.85 0-1.3.65-.5.65-.5 1.6 0 .95.5 1.55.5.55 1.3.55.55 0 .85-.25.2-.1.35-.4v.3q0 .6-.1.85-.2.4-.8.4-.45 0-.65-.15-.1-.1-.15-.3h-1.2q.05.65.6.95.5.35 1.3.35 1.35 0 1.85-.75.25-.4.25-1.2v-4.05h-1.05v.6q-.25-.45-.65-.6m-1.25 2.15q0-.45.15-.75.2-.55.8-.55.4 0 .65.35.25.3.25.9 0 .65-.25.95-.25.3-.65.3-.6 0-.8-.55-.15-.3-.15-.65m-7.9-3.65v5.75h1.1v-5.75h-1.1m-8.15 0h-1.1v5.75h1.1v-5.75m5.6 1.4q-.5 0-.8.2-.25.15-.45.45v-2.05h-1.1v5.75h1.1v-.55q.2.35.4.45.3.2.85.2.85 0 1.3-.65.5-.65.5-1.65 0-.95-.5-1.55-.45-.6-1.3-.6m.6 2.3q0 .55-.25.9-.2.35-.65.35-.5 0-.75-.35t-.25-.9q0-.5.15-.8.2-.55.8-.55.6 0 .85.6.1.3.1.75m-20.75-35.2h-1.1v2.3q0 .4-.1.65-.2.5-.8.5-.45 0-.6-.35-.05-.2-.05-.55v-2.55h-1.15v2.55q0 .75.15 1.1.35.7 1.3.7.3 0 .55-.1.25-.1.5-.3l.15-.2.1-.1v.6h1.05v-4.25m-8.35.55q-.55.65-.55 1.6 0 .9.55 1.6.55.65 1.65.65 1.1 0 1.6-.65.55-.7.55-1.6 0-.95-.55-1.6-.5-.7-1.6-.7t-1.65.7m.9 2.55q-.3-.35-.3-.95 0-.65.3-1 .25-.35.75-.35.45 0 .75.35.25.35.25 1 0 .6-.25.95-.3.35-.75.35-.5 0-.75-.35m-7.35-4.7q-.6.85-.9 1.55-.45 1.05-.45 2.1 0 1.2.55 2.4.3.7.55 1.05l.3.35h.8q-.5-.9-.7-1.5-.35-1-.35-2.2 0-.75.15-1.4.15-1 .65-1.9l.25-.45h-.85m6.2.1h-1.35l-1.15 2.5-1.2-2.5h-1.4l2 3.6v2.15h1.2v-2.15l1.9-3.6m44.5 34.45q-.3-.7-.9-1.55h-.85l.25.45q.5.9.65 1.9.15.65.15 1.4 0 1.2-.35 2.2-.2.6-.7 1.5h.8l.3-.35q.25-.35.55-1.05.55-1.2.55-2.4 0-1.05-.45-2.1m-25.2-.05q-1.05 0-1.5.55-.3.35-.35.9h1.1q.05-.2.15-.35.15-.2.55-.2.35 0 .55.1.2.1.2.35 0 .2-.25.3-.15.05-.45.1l-.4.05q-.6.1-.95.3-.6.35-.6 1.1 0 .6.35.95.4.35.95.35.5 0 .85-.2.3-.2.5-.45l.1.5h1.25v-.15q-.1-.05-.2-.15-.05-.05-.05-.3v-2.45q0-.75-.55-1.05-.55-.25-1.25-.25m-.6 2.65q.15-.1.5-.15l.55-.1.25-.1v.4q0 .55-.35.75-.3.2-.65.2-.25 0-.4-.1-.15-.15-.15-.4 0-.35.25-.5m-2.5-2.3q-.4-.35-1.05-.35-.55 0-.9.25-.2.15-.4.45v-.6h-1.05v4.25h1.1v-2.3q0-.4.1-.65.2-.5.75-.5.5 0 .65.35.1.15.1.5v2.6h1.1v-2.85q0-.8-.4-1.15m-13.45-.35q-.5 0-.85.25-.15.15-.45.6v-.75h-1.05v4.25h1.15v-2.05q0-.5.1-.75.25-.45.9-.45h.15l.2.05v-1.15h-.15m1.75 1.2q0-.15.15-.25.15-.15.5-.15.45 0 .65.25.1.1.1.35h1.15q-.1-.8-.6-1.1-.5-.35-1.3-.35-.85 0-1.3.45-.45.4-.45 1 0 .5.3.75.3.3 1 .45 1 .25 1.15.35.15.1.15.3 0 .2-.15.3-.2.1-.55.1-.55 0-.75-.25-.15-.1-.15-.4H285q0 .65.5 1.05.45.45 1.45.45t1.5-.4q.45-.4.45-1.05 0-.45-.35-.8-.3-.3-1-.45-1-.25-1.15-.3-.15-.1-.15-.3m6.95-.55q-.5-.7-1.6-.7t-1.65.7q-.55.65-.55 1.6 0 .9.55 1.6.55.65 1.65.65 1.1 0 1.6-.65.55-.7.55-1.6 0-.95-.55-1.6m-2.65 1.6q0-.65.3-1 .25-.35.75-.35.45 0 .75.35.25.35.25 1 0 .6-.25.95-.3.35-.75.35-.5 0-.75-.35-.3-.35-.3-.95m-10-2.05q-.45-.2-1-.2-.95 0-1.55.55-.55.6-.55 1.7 0 1.2.65 1.7.65.55 1.5.55 1 0 1.6-.65.35-.35.4-.75h-1.15q-.1.2-.2.3-.25.2-.65.2-.35 0-.6-.15-.4-.3-.45-.9h3.1q0-.55-.05-.85-.05-.5-.3-.9-.3-.4-.75-.6m-1 .7q.4 0 .65.25.25.2.3.65h-1.9q.05-.4.3-.65.2-.25.65-.25m-6.65-.8v5.95h1.1v-2.25q.15.3.35.4.35.25.85.25.8 0 1.3-.55.5-.6.5-1.75 0-1.05-.5-1.6t-1.25-.55q-.55 0-.9.3-.2.15-.4.4v-.6h-1.05m2.95 2.1q0 .6-.2 1-.25.35-.75.35-.3 0-.55-.2-.4-.3-.4-1.05 0-.45.1-.75.25-.6.85-.6.5 0 .75.4.2.4.2.85m-5.3-2.15q-.45 1.05-.45 2.1 0 1.2.55 2.4.3.7.55 1.05l.3.35h.8q-.5-.9-.7-1.5-.35-1-.35-2.2 0-.75.15-1.4.15-1 .65-1.9l.25-.45h-.85q-.6.85-.9 1.55M319.4 67.45q0-.45-.35-.8-.3-.3-1-.45-1-.25-1.15-.3-.15-.1-.15-.3 0-.15.15-.25.15-.15.5-.15.45 0 .65.25.1.1.1.35h1.15q-.1-.8-.6-1.1-.5-.35-1.3-.35-.85 0-1.3.45-.45.4-.45 1 0 .5.3.75.3.3 1 .45 1 .25 1.15.35.15.1.15.3 0 .2-.15.3-.2.1-.55.1-.55 0-.75-.25-.15-.1-.15-.4h-1.15q0 .65.5 1.05.45.45 1.45.45t1.5-.4q.45-.4.45-1.05m4.55-2.95h-1.1v2.3q0 .4-.1.65-.2.5-.8.5-.45 0-.6-.35-.05-.2-.05-.55V64.5h-1.15v2.55q0 .75.15 1.1.35.7 1.3.7.3 0 .55-.1.25-.1.5-.3l.15-.2.1-.1v.6h1.05V64.5m-19 0h-1.05v4.25h1.1v-2.3q0-.4.1-.65.2-.5.75-.5.5 0 .65.35.1.15.1.5v2.6h1.1V65.9q0-.8-.4-1.15-.4-.35-1.05-.35-.55 0-.9.25-.2.15-.4.45v-.6m7.65-1.5h-1.15v2.05q-.15-.3-.45-.5-.3-.15-.7-.15-.85 0-1.35.6-.5.65-.5 1.75 0 .95.5 1.55.5.6 1.25.6.45 0 .75-.2.3-.15.55-.55v.6h1.1V63m-1.35 4.6q-.25.35-.7.35-.5 0-.7-.35-.25-.35-.25-.95 0-.55.25-.9.2-.4.7-.4.3 0 .55.2.4.35.4 1.15 0 .55-.25.9m16.85-2.85q-.5-.35-1.3-.35-.95 0-1.5.6-.5.6-.5 1.7 0 1 .45 1.6.5.6 1.55.6 1 0 1.55-.75.3-.45.35-.95h-1.15q-.05.35-.2.55-.15.2-.55.2-.55 0-.75-.5-.1-.3-.1-.75 0-.5.1-.8.2-.55.75-.55.4 0 .6.25.15.2.15.4h1.15q-.1-.9-.6-1.25m5.75-1.85l.25.45q.5.9.65 1.9.15.65.15 1.4 0 1.2-.35 2.2-.2.6-.7 1.5h.8l.3-.35q.25-.35.55-1.05.55-1.2.55-2.4 0-1.05-.45-2.1-.3-.7-.9-1.55h-.85m-1.35 1.6q-.35-.1-.75-.1-.35 0-.65.15-.3.1-.55.5V63h-1.1v5.75h1.1v-2.3q0-.55.2-.85.25-.3.7-.3.4 0 .55.3.1.2.1.55v2.6h1.15v-2.5q0-.55-.05-.8 0-.3-.2-.5-.2-.3-.5-.45m-31.35-.1q-1.05 0-1.5.55-.3.35-.35.9h1.1q.05-.2.15-.35.15-.2.55-.2.35 0 .55.1.2.1.2.35 0 .2-.25.3-.15.05-.45.1l-.4.05q-.6.1-.95.3-.6.35-.6 1.1 0 .6.35.95.4.35.95.35.5 0 .85-.2.3-.2.5-.45l.1.5h1.25v-.15q-.1-.05-.2-.15-.05-.05-.05-.3V65.7q0-.75-.55-1.05-.55-.25-1.25-.25m-.6 2.65q.15-.1.5-.15l.55-.1.25-.1v.4q0 .55-.35.75-.3.2-.65.2-.25 0-.4-.1-.15-.15-.15-.4 0-.35.25-.5m-7.8-1.25q0 .5.3.75.3.3 1 .45 1 .25 1.15.35.15.1.15.3 0 .2-.15.3-.2.1-.55.1-.55 0-.75-.25-.15-.1-.15-.4h-1.15q0 .65.5 1.05.45.45 1.45.45t1.5-.4q.45-.4.45-1.05 0-.45-.35-.8-.3-.3-1-.45-1-.25-1.15-.3-.15-.1-.15-.3 0-.15.15-.25.15-.15.5-.15.45 0 .65.25.1.1.1.35h1.15q-.1-.8-.6-1.1-.5-.35-1.3-.35-.85 0-1.3.45-.45.4-.45 1m-2.35-1.4q-.55 0-.9.25-.2.15-.4.45v-.6h-1.05v4.25h1.1v-2.3q0-.4.1-.65.2-.5.75-.5.5 0 .65.35.1.15.1.5v2.6h1.1V65.9q0-.8-.4-1.15-.4-.35-1.05-.35m-13.45.15v-1.2h-1.1v1.2h-.6v.75h.6v2.65q0 .4.15.6.15.15.45.2.25.05.65.05h.5v-.85h-.2q-.35 0-.4-.05-.05-.05-.05-.35V65.3h.65v-.75h-.65m6.5.5q-.55.65-.55 1.6 0 .9.55 1.6.55.65 1.65.65 1.1 0 1.6-.65.55-.7.55-1.6 0-.95-.55-1.6-.5-.7-1.6-.7t-1.65.7m2.4 2.55q-.3.35-.75.35-.5 0-.75-.35-.3-.35-.3-.95 0-.65.3-1 .25-.35.75-.35.45 0 .75.35.25.35.25 1 0 .6-.25.95m-3.45-.95q0-.95-.55-1.6-.5-.7-1.6-.7t-1.65.7q-.55.65-.55 1.6 0 .9.55 1.6.55.65 1.65.65 1.1 0 1.6-.65.55-.7.55-1.6m-2.9-1q.25-.35.75-.35.45 0 .75.35.25.35.25 1 0 .6-.25.95-.3.35-.75.35-.5 0-.75-.35-.3-.35-.3-.95 0-.65.3-1m-6.95-1.15v4.25h1.15V66.7q0-.5.1-.75.25-.45.9-.45h.15l.2.05V64.4h-.15q-.5 0-.85.25-.15.15-.45.6v-.75h-1.05m-2.7-.1q-1.05 0-1.5.55-.3.35-.35.9h1.1q.05-.2.15-.35.15-.2.55-.2.35 0 .55.1.2.1.2.35 0 .2-.25.3-.15.05-.45.1l-.4.05q-.6.1-.95.3-.6.35-.6 1.1 0 .6.35.95.4.35.95.35.5 0 .85-.2.3-.2.5-.45l.1.5h1.25v-.15q-.1-.05-.2-.15-.05-.05-.05-.3V65.7q0-.75-.55-1.05-.55-.25-1.25-.25m-.7 3.55q-.15-.15-.15-.4 0-.35.25-.5.15-.1.5-.15l.55-.1.25-.1v.4q0 .55-.35.75-.3.2-.65.2-.25 0-.4-.1M236.25 64v-1.05h-1.1V64h1.1m0 .5h-1.1v4.25h1.1V64.5m3.45-.1q-.55 0-.9.25-.2.15-.4.45v-.6h-1.05v4.25h1.1v-2.3q0-.4.1-.65.2-.5.75-.5.5 0 .65.35.1.15.1.5v2.6h1.1V65.9q0-.8-.4-1.15-.4-.35-1.05-.35m14.2.65q-.55.65-.55 1.6 0 .9.55 1.6.55.65 1.65.65 1.1 0 1.6-.65.55-.7.55-1.6 0-.95-.55-1.6-.5-.7-1.6-.7t-1.65.7m.9.6q.25-.35.75-.35.45 0 .75.35.25.35.25 1 0 .6-.25.95-.3.35-.75.35-.5 0-.75-.35-.3-.35-.3-.95 0-.65.3-1m6.05-1.25h-.05q-.5 0-.85.25-.15.15-.45.6v-.75h-1.05v4.25h1.15V66.7q0-.5.1-.75.25-.45.9-.45h.15l.2.05V64.4h-.1m-17.55 4.35V63h-1.1v5.75h1.1m1.85-4.25h-1.2l1.55 4.45q0 .05-.1.25-.05.2-.15.25-.1.1-.25.1h-.45v.9h.5q.75 0 1-.25.25-.3.65-1.5l1.45-4.2H247l-.9 3.15-.95-3.15m7.8-1.55h-.4q-.95 0-1.2.35-.2.25-.2.95v.3h-.6v.75h.6v3.45h1.1V65.3h.75v-.75h-.75v-.4q0-.1.1-.2t.3-.1h.3v-.9m11.85 2.95q.2-.55.75-.55.4 0 .6.25.15.2.15.4h1.15q-.1-.9-.6-1.25t-1.3-.35q-.95 0-1.5.6-.5.6-.5 1.7 0 1 .45 1.6.5.6 1.55.6 1 0 1.55-.75.3-.45.35-.95h-1.15q-.05.35-.2.55-.15.2-.55.2-.55 0-.75-.5-.1-.3-.1-.75 0-.5.1-.8m-32.4-1.5q-1.05 0-1.5.55-.3.35-.35.9h1.1q.05-.2.15-.35.15-.2.55-.2.35 0 .55.1.2.1.2.35 0 .2-.25.3-.15.05-.45.1l-.4.05q-.6.1-.95.3-.6.35-.6 1.1 0 .6.35.95.4.35.95.35.5 0 .85-.2.3-.2.5-.45l.1.5h1.25v-.15q-.1-.05-.2-.15-.05-.05-.05-.3V65.7q0-.75-.55-1.05-.55-.25-1.25-.25m-.1 2.5l.55-.1.25-.1v.4q0 .55-.35.75-.3.2-.65.2-.25 0-.4-.1-.15-.15-.15-.4 0-.35.25-.5.15-.1.5-.15m-3.35-2.4q-.3-.1-.55-.1-.45 0-.8.15-.3.2-.55.6-.1-.35-.35-.55-.3-.2-.8-.2t-.85.25q-.15.15-.35.45v-.6h-1.1v4.25h1.15V66.2q0-.35.05-.55.2-.3.65-.3.4 0 .55.3.1.2.1.55v2.55h1.1V66.2q0-.25.1-.45.2-.4.65-.4.4 0 .55.3.05.15.05.4v2.7h1.15v-2.7q0-.4-.05-.6-.05-.35-.2-.55-.25-.3-.5-.4M319 200.05v2.5h2.55v-2.5H319m-2.25-9.75h-2.35v12.25h2.35V190.3m-4.7 0h-2.35v12.25h2.35V190.3m-4.65 3.2H305v9.05h2.4v-9.05m0-3.25H305v2.15h2.4v-2.15m-10.4.1h-2.4v12.2h2.4v-4.9q0-1.15.45-1.8.5-.6 1.45-.6.9 0 1.2.6.25.45.25 1.2v5.5h2.4v-5.3q0-1.25-.05-1.75-.1-.55-.5-1.05-.4-.6-1.1-.9-.7-.3-1.5-.3-.75 0-1.45.35-.65.3-1.15 1.05v-4.3m-3.8 3.15h-2.5l-1.85 6.7-2-6.7h-2.65l3.35 9.45q0 .1-.15.55-.2.45-.4.6-.2.15-.55.2h-.95v1.9h1.1q1.55 0 2.1-.6.5-.65 1.4-3.2l3.1-8.9m-19.8-3.2h-2.35v12.25h2.35V190.3m6.05 2.95q-1.95 0-3.2 1.25-1.25 1.25-1.25 3.65 0 2.5 1.35 3.6 1.4 1.1 3.2 1.1 2.2 0 3.4-1.3.8-.85.9-1.65h-2.45q-.2.4-.45.6-.5.45-1.35.45-.75 0-1.3-.35-.85-.55-.95-1.9h6.6q.05-1.2-.05-1.8-.2-1.05-.75-1.9-.6-.9-1.55-1.3-.95-.45-2.15-.45m0 1.95q.85 0 1.45.5.55.5.6 1.45h-4.05q.1-.9.6-1.4.5-.55 1.4-.55m-56.7-131.85l.25-.45h-.85q-.6.85-.9 1.55-.45 1.05-.45 2.1 0 1.2.55 2.4.3.7.55 1.05l.3.35h.8q-.5-.9-.7-1.5-.35-1-.35-2.2 0-.75.15-1.4.15-1 .65-1.9m123.3 139.2v-2.5h-2.55v2.5h2.55m17.85-9l-3 3.4v-6.6h-2.3v12.2h2.3v-2.85l1-1 2.15 3.85h2.9l-3.35-5.65 3.25-3.35h-2.95m-7.55-.05h-2.4v4.9q0 .9-.25 1.45-.45.95-1.65.95-.95 0-1.25-.7-.2-.35-.2-1.15v-5.45h-2.4v5.45q0 1.55.4 2.35.7 1.45 2.7 1.45.65 0 1.2-.2.5-.15 1.05-.65l.3-.4q.1-.1.2-.25v1.3h2.3v-9.05m-15.6 1.15q-1.15-1.45-3.5-1.45-2.3 0-3.45 1.45-1.15 1.45-1.15 3.4 0 2 1.15 3.4t3.45 1.4q2.35 0 3.5-1.4t1.15-3.4q0-1.95-1.15-3.4m-5.1 1.3q.6-.75 1.6-.75 1.05 0 1.6.75t.55 2.1q0 1.35-.55 2.1-.55.7-1.6.7-1 0-1.6-.7-.55-.75-.55-2.1t.55-2.1m-4.05.8q-.2-1.95-1.3-2.7-1.1-.75-2.8-.75-2 0-3.1 1.3-1.15 1.3-1.15 3.6 0 2.05 1 3.35 1.05 1.3 3.25 1.3 2.15 0 3.3-1.55.7-.95.75-2.05h-2.4q-.1.75-.4 1.2-.35.4-1.2.4-1.2 0-1.6-1.1-.25-.6-.25-1.6 0-1.05.25-1.7.45-1.15 1.65-1.15.85 0 1.25.55.25.4.3.9h2.45m-69.35-2.6q-1 .9-1 2.15 0 1.05.65 1.65.65.55 2.15.95 2.15.5 2.5.7.3.2.3.6 0 .4-.4.6-.4.25-1.1.25-1.2 0-1.65-.5-.25-.25-.3-.9H261q0 1.4 1 2.3 1 .9 3.15.9 2.1 0 3.1-.85t1-2.2q0-1-.7-1.7-.7-.65-2.1-1-2.1-.45-2.45-.65-.35-.2-.35-.6 0-.3.3-.55.35-.25 1.1-.25.95 0 1.35.5.2.25.25.7H269q-.15-1.65-1.2-2.3-1.1-.7-2.8-.7-1.75 0-2.75.9m-4.25-.45q-.95-.45-2.15-.45-1.95 0-3.2 1.25-1.25 1.25-1.25 3.65 0 2.5 1.35 3.6 1.4 1.1 3.2 1.1 2.2 0 3.4-1.3.8-.85.9-1.65h-2.45q-.2.4-.45.6-.5.45-1.35.45-.75 0-1.3-.35-.85-.55-.95-1.9h6.6q.05-1.2-.05-1.8-.2-1.05-.75-1.9-.6-.9-1.55-1.3m-2.15 1.5q.85 0 1.45.5.55.5.6 1.45h-4.05q.1-.9.6-1.4.5-.55 1.4-.55m-15.4-1.7h-2.55l2.55 9.05h2.45l1.45-6.6 1.4 6.6h2.45l2.6-9.05h-2.45l-1.4 6.5-1.4-6.5h-2.4l-1.3 6.5-1.4-6.5z\" />\n      <path fill=\"#F96\" d=\"M300.75 52.2v2.5h2.55v-2.5h-2.55m-18.2-6.55h-2.4v9.05h2.4v-9.05m0-3.25h-2.4v2.15h2.4V42.4M319 45.35q-2.3 0-3.45 1.45-1.15 1.45-1.15 3.4 0 2 1.15 3.4T319 55q2.35 0 3.5-1.4t1.15-3.4q0-1.95-1.15-3.4t-3.5-1.45m0 2q1.05 0 1.6.75t.55 2.1q0 1.35-.55 2.1-.55.7-1.6.7-1 0-1.6-.7-.55-.75-.55-2.1t.55-2.1q.6-.75 1.6-.75m-5.65 1.55q-.2-1.95-1.3-2.7-1.1-.75-2.8-.75-2 0-3.1 1.3-1.15 1.3-1.15 3.6 0 2.05 1 3.35 1.05 1.3 3.25 1.3 2.15 0 3.3-1.55.7-.95.75-2.05h-2.4q-.1.75-.4 1.2-.35.4-1.2.4-1.2 0-1.6-1.1-.25-.6-.25-1.6 0-1.05.25-1.7.45-1.15 1.65-1.15.85 0 1.25.55.25.4.3.9h2.45M298 46.8q-1.15-1.45-3.5-1.45-2.3 0-3.45 1.45-1.15 1.45-1.15 3.4 0 2 1.15 3.4t3.45 1.4q2.35 0 3.5-1.4t1.15-3.4q0-1.95-1.15-3.4m-3.5.55q1.05 0 1.6.75t.55 2.1q0 1.35-.55 2.1-.55.7-1.6.7-1 0-1.6-.7-.55-.75-.55-2.1t.55-2.1q.6-.75 1.6-.75m-7-4.15h-2.35v2.55h-1.3v1.65h1.3V53q0 .85.4 1.25.3.3.85.45.6.15 1.45.1h1.1V53l-.25.05h-.2q-.75 0-.9-.15-.1-.15-.1-.7v-4.8h1.45v-1.65h-1.45V43.2m37.75 11.5h2.55v-2.5h-2.55v2.5m20.1-5.65l3.25-3.35h-2.95l-3 3.4v-6.6h-2.3v12.2h2.3v-2.85l1-1 2.15 3.85h2.9l-3.35-5.65m-7.25-3.4h-2.4v4.9q0 .9-.25 1.45-.45.95-1.65.95-.95 0-1.25-.7-.2-.35-.2-1.15v-5.45h-2.4v5.45q0 1.55.4 2.35.7 1.45 2.7 1.45.65 0 1.2-.2.5-.15 1.05-.65l.3-.4q.1-.1.2-.25v1.3h2.3v-9.05m-67.1 1q-.6.75-.65 1.95h2.25q.1-.55.35-.85.35-.4 1.2-.4.75 0 1.15.2.4.2.4.75 0 .45-.5.7-.3.1-.95.2l-.8.1q-1.4.15-2.1.6-1.3.7-1.3 2.4 0 1.3.8 2t2.05.7q.95 0 1.7-.45.65-.4 1.15-.9l.2 1.05h2.6v-.35q-.25-.1-.35-.25-.1-.2-.15-.65v-5.2q0-1.65-1.15-2.2-1.15-.6-2.65-.6-2.3 0-3.25 1.2m3.05 4.15l1.2-.25.45-.25v.9q-.05 1.15-.7 1.6-.65.45-1.4.45-.5 0-.85-.25-.35-.3-.35-.9 0-.65.55-1 .35-.2 1.1-.3m-11.45-8.3h-2.4v12.2h2.35v-1.15q.5.7.9.95.65.45 1.8.45 1.8 0 2.8-1.4 1-1.4 1-3.5 0-2-1-3.3-1.05-1.3-2.85-1.3-1 0-1.6.4-.55.35-1 1V42.5m1.95 5q1.3 0 1.75 1.2.25.65.25 1.6 0 1.2-.5 1.95t-1.45.75q-1.05 0-1.55-.75-.55-.8-.55-1.95 0-1 .25-1.6.5-1.2 1.8-1.2M254 45.35q-2.3 0-3.45 1.45-1.15 1.45-1.15 3.4 0 2 1.15 3.4T254 55q2.35 0 3.5-1.4t1.15-3.4q0-1.95-1.15-3.4t-3.5-1.45m0 2q1.05 0 1.6.75t.55 2.1q0 1.35-.55 2.1-.55.7-1.6.7-1 0-1.6-.7-.55-.75-.55-2.1t.55-2.1q.6-.75 1.6-.75m-5.25-1.65h-2.95l-3 3.4v-6.6h-2.3v12.2h2.3v-2.85l1-1 2.15 3.85h2.9l-3.35-5.65 3.25-3.35m-17.35.95q-.6.75-.65 1.95H233q.1-.55.35-.85.35-.4 1.2-.4.75 0 1.15.2.4.2.4.75 0 .45-.5.7-.3.1-.95.2l-.8.1q-1.4.15-2.1.6-1.3.7-1.3 2.4 0 1.3.8 2t2.05.7q.95 0 1.7-.45.65-.4 1.15-.9l.2 1.05h2.6v-.35q-.25-.1-.35-.25-.1-.2-.15-.65v-5.2q0-1.65-1.15-2.2-1.15-.6-2.65-.6-2.3 0-3.25 1.2m4.25 3.9l.45-.25v.9q-.05 1.15-.7 1.6-.65.45-1.4.45-.5 0-.85-.25-.35-.3-.35-.9 0-.65.55-1 .35-.2 1.1-.3l1.2-.25M226.2 48q.25.45.25 1.2v5.5h2.4v-5.3q0-1.25-.05-1.75-.1-.55-.5-1.05-.4-.6-1.1-.9-.7-.3-1.5-.3-.75 0-1.45.35-.65.3-1.15 1.05v-4.3h-2.4v12.2h2.4v-4.9q0-1.15.45-1.8.5-.6 1.45-.6.9 0 1.2.6m-10.25 4.2v2.5h2.55v-2.5h-2.55m-3.7-9.8h-1.45v2l-1.7-.55-.4 1.2 1.75.55-1.15 1.65 1.05.75 1.2-1.55L212.7 48l1.05-.75-1.15-1.65 1.8-.55-.4-1.2-1.75.55v-2z\" />\n    </g>\n    <path id=\"d\" fill=\"none\" stroke=\"url(#a)\" stroke-width=\"18.55\" d=\"M64.75 89.9q20.2 6.25 39.4 14.95 20.85 9.5 38.45 24 17.8 14.7 25.25 36.35 5.75 16.6 2.6 33.75-4.3 23.45 9.15 42.55 3.9 5.65 9.75 9.1 13.95 8.2 29.7 10.6 5.6.85 11.45.95 17.85.9 35.6-1.05m5.75.15q.25-11 8.1-18.8 8.1-8.1 19.55-8.1 11.45 0 19.55 8.1 8.05 8.1 8.05 19.55 0 11.45-8.05 19.55-8.1 8.1-19.55 8.1-11.45 0-19.55-8.1-8.1-8.1-8.1-19.55v-.75z\" stroke-linejoin=\"round\" stroke-linecap=\"square\" />\n    <path id=\"e\" fill=\"none\" stroke=\"url(#b)\" stroke-width=\"18.55\" d=\"M362.95 87.45q.25-11 8.1-18.85 8.1-8.05 19.55-8.05 11.45 0 19.55 8.05 8.05 8.1 8.05 19.55 0 11.45-8.05 19.55-8.1 8.1-19.55 8.1-11.45 0-19.55-8.1-8.1-8.1-8.1-19.55v-.7zm-5.1 0h-12.4m-93.85 0H131.55m195.95 0h-59.75m-143.35 0H-10.8q-.3 11-8.1 18.8-8.1 8.1-19.55 8.1-11.45 0-19.55-8.1-8.1-8.1-8.1-19.55 0-11.45 8.1-19.55 8.1-8.1 19.55-8.1 11.45 0 19.55 8.1 8.1 8.1 8.1 19.55v.75\" stroke-linejoin=\"round\" stroke-linecap=\"square\" />\n  </defs>\n  <use xlink:href=\"#c\" />\n  <use xlink:href=\"#d\" />\n  <use xlink:href=\"#e\" />\n  <use xlink:href=\"#b\" />\n</svg>\n</aside>\n\n<p>Here are some of my “greatest hits” from my previous blog.</p>\n\n<p><a href=\"https://www.hakobaito.co.uk/b/bypassing-snaptcha/\">Bypassing “Snaptcha”</a></p>\n\n<p><a href=\"https://www.hakobaito.co.uk/b/creating-exclusive-wifi-hotspots-with-emoji/\">Creating exclusive wifi hotspots with emoji</a></p>\n\n<p><a href=\"https://www.hakobaito.co.uk/b/setting-up-lets-encrypt-on-dokku/\">Setting up Let’s Encrypt on Dokku</a></p>\n\n<p><a href=\"https://www.hakobaito.co.uk/b/peach-app-token-reuse-flaw/\">Peach App Token Reuse Flaw</a></p>\n\n<p><br /></p>\n\n<h2 id=\"misc\">Misc</h2>\n\n<p>Some other things you should know about this site:</p>\n\n<ul>\n  <li>Accessibility and Readability comes first.</li>\n  <li>This site mintains a <strong>zero dead link policy</strong><sup id=\"fnref:3\"><a href=\"#fn:3\" class=\"footnote\">3</a></sup>.</li>\n  <li>Translations to other languages are welcome, please contact me about this.</li>\n  <li>RSS and JSON feeds are available.</li>\n  <li>Dark mode is available for night owls.</li>\n  <li>…and finally, JavaScript is not required to view this site <em>(except dark mode, sorry)</em>.</li>\n</ul>\n\n<div class=\"footnotes\">\n  <ol>\n    <li id=\"fn:1\">\n      <p>There will be some random miscellaneous posts too, but don’t expect <em>too</em> much of those… ;) <a href=\"#fnref:1\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n    <li id=\"fn:2\">\n      <p>I recommend reading <a href=\"https://jvns.ca/teach-tech-with-cartoons/\">Julia Evans’s post on this.</a> <a href=\"#fnref:2\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n    <li id=\"fn:3\">\n      <p>Unless otherwise stated, If the original link is dead and no other replacement exists, <a href=\"https://archive.org/web/\">archive.org</a> will be used as a fallback. <a href=\"#fnref:3\" class=\"reversefootnote\">&#8617;</a></p>\n    </li>\n  </ol>\n</div>\n",
      
      "tags":  [ "" ],
      
      "date_published": "2017-10-20T00:00:00+01:00",
      "date_modified": "2017-10-20T00:00:00+01:00"
    }

  ]
}
