Category: Uncategorized

  • Songs for the Cure 2010

    Last year, I was proud to be part of the inaugural Indie Music Cancer Drive. Along with a whole lot of very talented artists, I contributed music to a compilation album, “Songs for the Cure”. All the proceeds from the sales of this album went to the American Cancer Society.

    Songs for the Cure 2010

    This year, I am once again contributing. I just finished work on the track I will be contributing, so I thought it high time I let everyone know about this. Josh Whelchel, the organiser of the drive (and a fantastic musician to boot), has set a target of $10,000 for this year. If you donate $25 or more, you receive a physical copy of the (two disc!) album; otherwise, you receive the album digitally.

    Here’s the official media release:

    Indie Music Cancer Drive to Release Songs for the Cure ’10 Album

    Twenty-eight artists join together to raise money for the American Cancer Society and aim to raise $10,000.

    Cincinnati, OH, January 24th, 2010. – The Indie Music Cancer Society will release it’s 2010 compilation, Songs for the Cure ’10 on March 1st, 2010 and forward 100% of all donations and profits to the American Cancer Society through its Relay for Life event held on April 23rd, 2010 at the University of Cincinnati. The album will feature music from over twenty-eight (28) diverse artists, including Select Start, big giant circles, Alec Holowka, Two Seconds Away, Jay Tholen, Josh Whelchel, Renee Winter, and others. The organization is currently accepting donations, and all donors of $25 or more before MARCH 1, 2010 will receive a free physical copy of the album. Supporters with $10 or more will receive a free digital copy. Genres represented include Pop, Rock, Alternative, Chiptunes, Instrumental, Opera, Classical, Avant-Garde, Jazz, Fusion, and many others. The organization raised over $6,000 for the event last year and is still forwarding profits from last year’s album, available on iTunes, Amazon, and others. A full list of artists can be found at the Songs for the Cure ’10 website at http://www.cancerdrive.org. The fundraiser aims to raise $10,000 by April 23rd, 2010, preceding a digital release of the album to iTunes, Amazon, CDBaby, and other retailers. Donations are accepted through http://www.cancerdrive.org.

    For more information please contact:

    JOSH WHELCHEL
    (513) 549-2336
    http://www.cancerdrive.org

    So there you have it. And for good measure, here’s the promotional video:

  • Another new theme

    I was never really happy with my previous 2010 theme, so I’ve gone and done a completely new one.

    This new one makes extensive use of CSS3 properties, such as gradients and shadows. It looks best in Firefox >= 3.6,followed by Safari >= 4, then Chrome >= 4, Opera >= 10, and IE >= 8. Theoretically, Firefox and Safari/Chrome support the same level of features, but the webkit gradient syntax is absolutely awful. It’s confusing, needlessly complex, and poorly thought-out, in my opinion. Contrast the following two lines:
    [sourcecode language=css]background: -moz-linear-gradient(top, #111, #333);
    background: -webkit-gradient(linear, left top, left bottom, from(#222), to(#333));[/sourcecode]
    See what I mean?

    Gecko (Firefox), Webkit (Safari), and Trident (IE) rendering.

  • Clean Word markup

    When writing a web-app that accepts formatted input from users, you’ll often find that they will copy and paste text from Microsoft Word. Unfortunately, Word fills the markup with lots of unnecessary and unwanted muck. To clean this all up, I wrote the following function (directly implemented on the String prototype below):

    [sourcecode language=javascript]String.implement({
    sanitiseWord: function() {
    var s = this.replace(/\r/g, ‘\n’).replace(/\n/g, ‘ ‘);
    var rs = [];
    rs.push(//g); // Comments
    rs.push(/.+?<\/title>/g); // Title<br /> rs.push(/<(meta|link|.?o:|.?style|.?div|.?head|.?html|body|.?body|.?span|!\[)[^>]*?>/g); // Unnecessary tags<br /> rs.push(/ v:.*?=”.*?”/g); // Weird nonsense attributes<br /> rs.push(/ style=”.*?”/g); // Styles<br /> rs.push(/ class=”.*?”/g); // Classes<br /> rs.push(/( ){2,}/g); // Redundant  s<br /> rs.push(/</p><p>(\s| )*?<\/p>/g); // Empty paragraphs<br /> rs.each(function(regex) {<br /> s = s.replace(regex, ”);<br /> });<br /> return s.replace(/\s+/g, ‘ ‘);<br /> }<br /> });[/sourcecode]</p><p>If you’re not using MooTools, the function will look something like this:<br /> [sourcecode language=javascript]String.prototype.sanitiseWord = function() {<br /> // function body here…<br /> };[/sourcecode]</p><h2>Usage</h2><p>[sourcecode language=javascript]var s = “(some awful Word markup)”.sanitiseWord();[/sourcecode]</p><p>In one of the tests I ran, the input went from around 7000 characters to just 700.</p><h2>Example</h2><p><iframe data-lazyloaded="1" src="about:blank" style="width: 100%; height: 300px" data-litespeed-src="http://mootools.net/shell/26Jpf/embedded/"></iframe></p><p>Some of the regular expressions I used were adapted from C# ones in <a href="http://www.codinghorror.com/blog/archives/000485.html">a post by Jeff Atwood</a>.</p></div><div style="margin-top:var(--wp--preset--spacing--40);" class="wp-block-post-date has-small-font-size"><time datetime="2010-01-20T12:21:24+08:00"><a href="https://barryvan.com.au/2010/01/clean-word-markup/">2010-01-20</a></time></div></div></li><li class="wp-block-post post-225 post type-post status-publish format-standard hentry category-javascript category-mootools category-programming category-uncategorized category-web-design tag-algorithms tag-javascript tag-sort tag-tips tag-web"><div class="wp-block-group alignfull has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><h2 class="wp-block-post-title has-x-large-font-size"><a href="https://barryvan.com.au/2009/08/quicksort-an-array-of-objects/" target="_self" >Quicksort an array of objects</a></h2><div class="entry-content alignfull wp-block-post-content has-medium-font-size has-global-padding is-layout-constrained wp-block-post-content-is-layout-constrained"><p>Often, you will need to sort an array of objects in Javascript. The inbuilt <em>sort()</em> function can’t do this, but here is a Quicksort implementation for doing just this.</p><h2>Parameters</h2><p><strong>array</strong> The array to be sorted. (See below for an implementation on the Array Native itself, which makes this variable unnecessary).</p><p><strong>key</strong> The key to sort by. Make sure every object in your array has this key.</p><h2>Examples</h2><p>[sourcecode language=’javascript’]<br /> var objs = [<br /> {fruit:”cherry”},<br /> {fruit:”apple”},<br /> {fruit:”banana”}<br /> ];</p><p>console.log(objs.sortObjects(‘fruit’));<br /> // Logs [{fruit:”apple”},{fruit:”banana”},{fruit:”cherry”}] to the console<br /> [/sourcecode]</p><h2>The code</h2><p>[sourcecode language=’javascript’]<br /> sortObjects: function(array, key) {<br /> for (var i = 0; i < array.length; i++) { var currVal = array[i][key]; var currElem = array[i]; var j = i - 1; while ((j >= 0) && (array[j][key] > currVal)) {<br /> array[j + 1] = array[j];<br /> j–;<br /> }<br /> array[j + 1] = currElem;<br /> }<br /> }<br /> [/sourcecode]</p><h3>Implemented on the Array native:</h3><p>[sourcecode language=’javascript’]<br /> Array.implement({<br /> sortObjects: function(key) {<br /> for (var i = 0; i < this.length; i++) { var currVal = this[i][key]; var currElem = this[i]; var j = i - 1; while ((j >= 0) && (this[j][key] > currVal)) {<br /> this[j + 1] = this[j];<br /> j–;<br /> }<br /> this[j + 1] = currElem;<br /> }<br /> }<br /> });<br /> [/sourcecode]</p></div><div style="margin-top:var(--wp--preset--spacing--40);" class="wp-block-post-date has-small-font-size"><time datetime="2009-08-05T16:14:51+08:00"><a href="https://barryvan.com.au/2009/08/quicksort-an-array-of-objects/">2009-08-05</a></time></div></div></li><li class="wp-block-post post-209 post type-post status-publish format-standard hentry category-uncategorized tag-fun tag-lexicon tag-word-play tag-wordplay"><div class="wp-block-group alignfull has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><h2 class="wp-block-post-title has-x-large-font-size"><a href="https://barryvan.com.au/2009/07/words-i-have-invented/" target="_self" >Words I have invented</a></h2><div class="entry-content alignfull wp-block-post-content has-medium-font-size has-global-padding is-layout-constrained wp-block-post-content-is-layout-constrained"><p>Here are just two of the words that I have invented to fill gaps in the English language. Adopt, disseminate, and promulgate them!</p><p><span style="font-size:150%;font-weight:bold;">Spanxiety</span> <em>cf. spangst, spanxious</em></p><p>The fear of being punished; trepidation at the thought of retribution for past transgressions.</p><p><em>Little Jimmy, having been seen stealing the cookies, was now feeling quite spanxious.</em><br /> <em>I suffered a bout of spanxiety at the thought of what she would do to me.</em></p><hr /><p><span style="font-size:150%;font-weight:bold;">Illigiterate</span> <em>cf. illigiteracy</em></p><p>Children born out of wedlock who lack basic reading and writing skills.</p><p><em>With the advent of widely-available contraceptives and education, illigiteracy has fallen in Australia.</em><br /> <img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNTUiIGhlaWdodD0iMTg3IiB2aWV3Qm94PSIwIDAgMzU1IDE4NyI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc3R5bGU9ImZpbGw6I2NmZDRkYjtmaWxsLW9wYWNpdHk6IDAuMTsiLz48L3N2Zz4=" loading="lazy" decoding="async" data-src="/temp/illigiterate.png" alt="Illigiteracy Venn Diagram" title="Illigiteracy Venn Diagram" width="355" height="187" class="alignnone size-full wp-image-213" /></p></div><div style="margin-top:var(--wp--preset--spacing--40);" class="wp-block-post-date has-small-font-size"><time datetime="2009-07-30T18:23:06+08:00"><a href="https://barryvan.com.au/2009/07/words-i-have-invented/">2009-07-30</a></time></div></div></li><li class="wp-block-post post-195 post type-post status-publish format-standard hentry category-uncategorized tag-ariel tag-camping tag-holidays tag-photographs"><div class="wp-block-group alignfull has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><h2 class="wp-block-post-title has-x-large-font-size"><a href="https://barryvan.com.au/2009/06/camping-june-2009/" target="_self" >Camping: June 2009</a></h2><div class="entry-content alignfull wp-block-post-content has-medium-font-size has-global-padding is-layout-constrained wp-block-post-content-is-layout-constrained"><p>Well, Ariel and I have just returned from a weekend away at Dwellingup, camping. How was it? First and foremost, it was <strong>cold</strong>. Bitterly cold. Notwithstanding the sub-arctic conditions, however, it was absolutely fantastic.</p><p>The Murray River is beautiful, and we were camped no more than fifty metres away from it. We camped in the “Stringers” area of the Lane Poole Reserve, and managed to wrangle probably the best camping site in the entire park — secluded, equipped with a fire pit, and quiet.</p><p>As you can see from the photos below, our two primary concerns were a) exploring the banks of the river, and b) fire. When it’s so cold at noon that you can see your breath, a fire is a wonderful thing.</p><table class="photoGallery" cellspacing="0" cellpadding="0"><tr><td><a href="/photos/DSC09784.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09784_tn.jpg" title="The first night's fire"/></a></td><td><a href="/photos/DSC09801.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09801_tn.jpg" title="Reflections on the Murray"/></a></td><td><a href="/photos/DSC09817.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09817_tn.jpg" title="Looking out over the Murray"/></a></td><td><a href="/photos/DSC09860.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09860_tn.jpg" title="Lazing around at camp"/></a></td><td><a href="/photos/DSC09879.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09879_tn.jpg" title="Ari on a log"/></a></td><td><a href="/photos/DSC09889.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09889_tn.jpg" title="The Murray up close"/></a></td></tr><tr><td><a href="/photos/DSC09895.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09895_tn.jpg" title="Rope swing over the Murray"/></a></td><td><a href="/photos/DSC09898.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09898_tn.jpg" title="The Murray River"/></a></td><td><a href="/photos/DSC09936.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09936_tn.jpg" title="Ari on another log"/></a></td><td><a href="/photos/DSC09974.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09974_tn.jpg" title="The campsite"/></a></td><td><a href="/photos/DSC09997.jpg" rel="lightbox[camping-june-2009]"><img data-lazyloaded="1" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iNzUiIHZpZXdCb3g9IjAgMCAxMDAgNzUiPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHN0eWxlPSJmaWxsOiNjZmQ0ZGI7ZmlsbC1vcGFjaXR5OiAwLjE7Ii8+PC9zdmc+" width="100" height="75" decoding="async" data-src="/photos/DSC09997_tn.jpg" title="The last night's fire"/></a></td><td> </td></tr></table><p><em>(Click on an image for a larger view)</em></p></div><div style="margin-top:var(--wp--preset--spacing--40);" class="wp-block-post-date has-small-font-size"><time datetime="2009-06-07T17:59:39+08:00"><a href="https://barryvan.com.au/2009/06/camping-june-2009/">2009-06-07</a></time></div></div></li><li class="wp-block-post post-152 post type-post status-publish format-standard hentry category-uncategorized tag-dinosaur-comics tag-fun tag-ryan-north"><div class="wp-block-group alignfull has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><h2 class="wp-block-post-title has-x-large-font-size"><a href="https://barryvan.com.au/2009/05/the-amazing-regret-index/" target="_self" >The amazing Regret Index</a></h2><div class="entry-content alignfull wp-block-post-content has-medium-font-size has-global-padding is-layout-constrained wp-block-post-content-is-layout-constrained"><p>Ryan North, of <a href="http://www.qwantz.com">Dinosaur Comics</a> fame, has crafted an awesome little webapp: <a href="http://qwantz.com/regret/index.php">The Regret Index</a>. Essentially, you vote on whether or not you regret certain things. You can even add your own regrets or search for regrets.</p><p>Most of them aren’t particularly serious, and a lot of them are kinda fun. It’s worth having a browse through the archive of regrets, looking at the votes, and reading the comments people have left. Some of my favourite ‘regrets’ on the site include</p><ul><li>Eating a kitten just to prove you’re evil</li><li>Supergluing your foot to the bathroom floor</li><li>Constantly fearing regret</li><li>Starting to think all these questions are addressing you specifically</li></ul><p>Check it out — it’s well worth a look.</p></div><div style="margin-top:var(--wp--preset--spacing--40);" class="wp-block-post-date has-small-font-size"><time datetime="2009-05-01T13:17:39+08:00"><a href="https://barryvan.com.au/2009/05/the-amazing-regret-index/">2009-05-01</a></time></div></div></li><li class="wp-block-post post-116 post type-post status-publish format-standard hentry category-uncategorized tag-web-design"><div class="wp-block-group alignfull has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><h2 class="wp-block-post-title has-x-large-font-size"><a href="https://barryvan.com.au/2009/03/best-wordpress-design-award/" target="_self" >Best WordPress Design Award</a></h2><div class="entry-content alignfull wp-block-post-content has-medium-font-size has-global-padding is-layout-constrained wp-block-post-content-is-layout-constrained"><p>Over at WPWebHost, they’re hosting the <a href="http://wpwebhost.com/best-wordpress-design-award/">Best WordPress Design Award</a>, which should produce a lot of really great designs. I recommend taking a look!</p></div><div style="margin-top:var(--wp--preset--spacing--40);" class="wp-block-post-date has-small-font-size"><time datetime="2009-03-17T13:55:32+08:00"><a href="https://barryvan.com.au/2009/03/best-wordpress-design-award/">2009-03-17</a></time></div></div></li></ul><div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"></div><div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-block-group-is-layout-constrained"></div></div></main><footer class="wp-block-template-part"><div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--50)"><div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow"><div class="wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-e5edad21 wp-block-group-is-layout-flex"><div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex"><div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%"><h2 class="wp-block-site-title"><a href="https://barryvan.com.au" target="_self" rel="home">barryvan</a></h2></div><div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div style="height:var(--wp--preset--spacing--40);width:0px" aria-hidden="true" class="wp-block-spacer"></div></div></div><div class="wp-block-group is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-570722b2 wp-block-group-is-layout-flex"><nav class="is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-fe9cc265 wp-block-navigation-is-layout-flex"><ul class="wp-block-navigation__container is-vertical wp-block-navigation"><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Blog</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">About</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">FAQs</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Authors</span></a></li></ul></nav><nav class="is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-fe9cc265 wp-block-navigation-is-layout-flex"><ul class="wp-block-navigation__container is-vertical wp-block-navigation"><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Events</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Shop</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Patterns</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="#"><span class="wp-block-navigation-item__label">Themes</span></a></li></ul></nav></div></div><div style="height:var(--wp--preset--spacing--70)" aria-hidden="true" class="wp-block-spacer"></div><div class="wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-91e87306 wp-block-group-is-layout-flex"><p class="has-small-font-size">Twenty Twenty-Five</p><p class="has-small-font-size"> Designed with <a href="https://wordpress.org" rel="nofollow">WordPress</a></p></div></div></div></footer></div> <script type="speculationrules">{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/twentytwentyfive\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}</script> <script id="wp-block-template-skip-link-js-after" type="litespeed/javascript">(function(){var skipLinkTarget=document.querySelector('main'),sibling,skipLinkTargetID,skipLink;if(!skipLinkTarget){return} sibling=document.querySelector('.wp-site-blocks');if(!sibling){return} skipLinkTargetID=skipLinkTarget.id;if(!skipLinkTargetID){skipLinkTargetID='wp--skip-link--target';skipLinkTarget.id=skipLinkTargetID} skipLink=document.createElement('a');skipLink.classList.add('skip-link','screen-reader-text');skipLink.id='wp-skip-link';skipLink.href='#'+skipLinkTargetID;skipLink.innerText='Skip to content';sibling.parentElement.insertBefore(skipLink,sibling)}())</script> <script data-no-optimize="1">!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function i(t){return e({},it,t)}function o(t,e){var n,a="LazyLoad::Initialized",i=new t(e);try{n=new CustomEvent(a,{detail:{instance:i}})}catch(t){(n=document.createEvent("CustomEvent")).initCustomEvent(a,!1,!1,{instance:i})}window.dispatchEvent(n)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,bt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,bt,e)}function r(t){return s(t,null),0}function u(t){return null===c(t)}function d(t){return c(t)===vt}function f(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function _(t,e){nt?t.classList.add(e):t.className+=(t.className?" ":"")+e}function v(t,e){nt?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function b(t,e){!e||(e=e._observer)&&e.unobserve(t)}function p(t,e){t&&(t.loadingCount+=e)}function h(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function m(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function E(t){return!!t[st]}function I(t){return t[st]}function y(t){return delete t[st]}function A(e,t){var n;E(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[st]=n)}function k(a,t){var i;E(a)&&(i=I(a),t.forEach(function(t){var e,n;e=a,(t=i[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function L(t,e,n){_(t,e.class_loading),s(t,ut),n&&(p(n,1),f(e.callback_loading,t,n))}function w(t,e,n){n&&t.setAttribute(e,n)}function x(t,e){w(t,ct,l(t,e.data_sizes)),w(t,rt,l(t,e.data_srcset)),w(t,ot,l(t,e.data_src))}function O(t,e,n){var a=l(t,e.data_bg_multi),i=l(t,e.data_bg_multi_hidpi);(a=at&&i?i:a)&&(t.style.backgroundImage=a,n=n,_(t=t,(e=e).class_applied),s(t,ft),n&&(e.unobserve_completed&&b(t,e),f(e.callback_applied,t,n)))}function N(t,e){!e||0<e.loadingCount||0<e.toLoadCount||f(t.callback_finish,e)}function C(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function M(t){return!!t.llEvLisnrs}function z(t){if(M(t)){var e,n,a=t.llEvLisnrs;for(e in a){var i=a[e];n=e,i=i,t.removeEventListener(n,i)}delete t.llEvLisnrs}}function R(t,e,n){var a;delete t.llTempImage,p(n,-1),(a=n)&&--a.toLoadCount,v(t,e.class_loading),e.unobserve_completed&&b(t,n)}function T(o,r,c){var l=g(o)||o;M(l)||function(t,e,n){M(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";C(t,a,e),C(t,"error",n)}(l,function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_loaded),s(e,dt),f(n.callback_loaded,e,a),i||N(n,a),z(l)},function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_error),s(e,_t),f(n.callback_error,e,a),i||N(n,a),z(l)})}function G(t,e,n){var a,i,o,r,c;t.llTempImage=document.createElement("IMG"),T(t,e,n),E(c=t)||(c[st]={backgroundImage:c.style.backgroundImage}),o=n,r=l(a=t,(i=e).data_bg),c=l(a,i.data_bg_hidpi),(r=at&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),L(a,i,o)),O(t,e,n)}function D(t,e,n){var a;T(t,e,n),a=e,e=n,(t=It[(n=t).tagName])&&(t(n,a),L(n,a,e))}function V(t,e,n){var a;a=t,(-1<yt.indexOf(a.tagName)?D:G)(t,e,n)}function F(t,e,n){var a;t.setAttribute("loading","lazy"),T(t,e,n),a=e,(e=It[(n=t).tagName])&&e(n,a),s(t,vt)}function j(t){t.removeAttribute(ot),t.removeAttribute(rt),t.removeAttribute(ct)}function P(t){m(t,function(t){k(t,Et)}),k(t,Et)}function S(t){var e;(e=At[t.tagName])?e(t):E(e=t)&&(t=I(e),e.style.backgroundImage=t.backgroundImage)}function U(t,e){var n;S(t),n=e,u(e=t)||d(e)||(v(e,n.class_entered),v(e,n.class_exited),v(e,n.class_applied),v(e,n.class_loading),v(e,n.class_loaded),v(e,n.class_error)),r(t),y(t)}function $(t,e,n,a){var i;n.cancel_on_exit&&(c(t)!==ut||"IMG"===t.tagName&&(z(t),m(i=t,function(t){j(t)}),j(i),P(t),v(t,n.class_loading),p(a,-1),r(t),f(n.callback_cancel,t,e,a)))}function q(t,e,n,a){var i,o,r=(o=t,0<=pt.indexOf(c(o)));s(t,"entered"),_(t,n.class_entered),v(t,n.class_exited),i=t,o=a,n.unobserve_entered&&b(i,o),f(n.callback_enter,t,e,a),r||V(t,n,a)}function H(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function B(t,i,o){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?q(t.target,t,i,o):(e=t.target,n=t,a=i,t=o,void(u(e)||(_(e,a.class_exited),$(e,n,a,t),f(a.callback_exit,e,n,t))));var e,n,a})}function J(e,n){var t;et&&!H(e)&&(n._observer=new IntersectionObserver(function(t){B(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function K(t){return Array.prototype.slice.call(t)}function Q(t){return t.container.querySelectorAll(t.elements_selector)}function W(t){return c(t)===_t}function X(t,e){return e=t||Q(e),K(e).filter(u)}function Y(e,t){var n;(n=Q(e),K(n).filter(W)).forEach(function(t){v(t,e.class_error),r(t)}),t.update()}function t(t,e){var n,a,t=i(t);this._settings=t,this.loadingCount=0,J(t,this),n=t,a=this,Z&&window.addEventListener("online",function(){Y(n,a)}),this.update(e)}var Z="undefined"!=typeof window,tt=Z&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),et=Z&&"IntersectionObserver"in window,nt=Z&&"classList"in document.createElement("p"),at=Z&&1<window.devicePixelRatio,it={elements_selector:".lazy",container:tt||Z?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",rt="srcset",ct="sizes",lt="poster",st="llOriginalAttrs",ut="loading",dt="loaded",ft="applied",_t="error",vt="native",gt="data-",bt="ll-status",pt=[ut,dt,ft,_t],ht=[ot],mt=[ot,lt],Et=[ot,rt,ct],It={IMG:function(t,e){m(t,function(t){A(t,Et),x(t,e)}),A(t,Et),x(t,e)},IFRAME:function(t,e){A(t,ht),w(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){A(t,ht),w(t,ot,l(t,e.data_src))}),A(t,mt),w(t,lt,l(t,e.data_poster)),w(t,ot,l(t,e.data_src)),t.load()}},yt=["IMG","IFRAME","VIDEO"],At={IMG:P,IFRAME:function(t){k(t,ht)},VIDEO:function(t){a(t,function(t){k(t,ht)}),k(t,mt),t.load()}},kt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,i=this._settings,o=X(t,i);{if(h(this,o.length),!tt&&et)return H(i)?(e=i,n=this,o.forEach(function(t){-1!==kt.indexOf(t.tagName)&&F(t,e,n)}),void h(n,0)):(t=this._observer,i=o,t.disconnect(),a=t,void i.forEach(function(t){a.observe(t)}));this.loadAll(o)}},destroy:function(){this._observer&&this._observer.disconnect(),Q(this._settings).forEach(function(t){y(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;X(t,n).forEach(function(t){b(t,e),V(t,n,e)})},restoreAll:function(){var e=this._settings;Q(e).forEach(function(t){U(t,e)})}},t.load=function(t,e){e=i(e);V(t,e)},t.resetStatus=function(t){r(t)},Z&&function(t,e){if(e)if(e.length)for(var n,a=0;n=e[a];a+=1)o(t,n);else o(t,e)}(t,window.lazyLoadOptions),t});!function(e,t){"use strict";function a(){t.body.classList.add("litespeed_lazyloaded")}function n(){console.log("[LiteSpeed] Start Lazy Load Images"),d=new LazyLoad({elements_selector:"[data-lazyloaded]",callback_finish:a}),o=function(){d.update()},e.MutationObserver&&new MutationObserver(o).observe(t.documentElement,{childList:!0,subtree:!0,attributes:!0})}var d,o;e.addEventListener?e.addEventListener("load",n,!1):e.attachEvent("onload",n)}(window,document);</script><script data-no-optimize="1">var litespeed_vary=document.cookie.replace(/(?:(?:^|.*;\s*)_lscache_vary\s*\=\s*([^;]*).*$)|^.*$/,"");litespeed_vary||fetch("/wp-content/plugins/litespeed-cache/guest.vary.php",{method:"POST",cache:"no-cache",redirect:"follow"}).then(e=>e.json()).then(e=>{console.log(e),e.hasOwnProperty("reload")&&"yes"==e.reload&&(sessionStorage.setItem("litespeed_docref",document.referrer),window.location.reload(!0))});</script><script data-optimized="1" type="litespeed/javascript" data-src="https://barryvan.com.au/wp-content/litespeed/js/1518570de88f10e7f6bc3a4483a1a761.js?ver=05746"></script><script>const litespeed_ui_events=["mouseover","click","keydown","wheel","touchmove","touchstart"];var urlCreator=window.URL||window.webkitURL;function litespeed_load_delayed_js_force(){console.log("[LiteSpeed] Start Load JS Delayed"),litespeed_ui_events.forEach(e=>{window.removeEventListener(e,litespeed_load_delayed_js_force,{passive:!0})}),document.querySelectorAll("iframe[data-litespeed-src]").forEach(e=>{e.setAttribute("src",e.getAttribute("data-litespeed-src"))}),"loading"==document.readyState?window.addEventListener("DOMContentLoaded",litespeed_load_delayed_js):litespeed_load_delayed_js()}litespeed_ui_events.forEach(e=>{window.addEventListener(e,litespeed_load_delayed_js_force,{passive:!0})});async function litespeed_load_delayed_js(){let t=[];for(var d in document.querySelectorAll('script[type="litespeed/javascript"]').forEach(e=>{t.push(e)}),t)await new Promise(e=>litespeed_load_one(t[d],e));document.dispatchEvent(new Event("DOMContentLiteSpeedLoaded")),window.dispatchEvent(new Event("DOMContentLiteSpeedLoaded"))}function litespeed_load_one(t,e){console.log("[LiteSpeed] Load ",t);var d=document.createElement("script");d.addEventListener("load",e),d.addEventListener("error",e),t.getAttributeNames().forEach(e=>{"type"!=e&&d.setAttribute("data-src"==e?"src":e,t.getAttribute(e))});let a=!(d.type="text/javascript");!d.src&&t.textContent&&(d.src=litespeed_inline2src(t.textContent),a=!0),t.after(d),t.remove(),a&&e()}function litespeed_inline2src(t){try{var d=urlCreator.createObjectURL(new Blob([t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1"))}return d}</script></body></html> <!-- Page optimized by LiteSpeed Cache @2025-06-09 16:56:29 --> <!-- Page cached by LiteSpeed Cache 7.1 on 2025-06-09 16:56:27 --> <!-- Guest Mode --> <!-- QUIC.cloud UCSS in queue -->