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

<channel>
	<title>jasongi, Author at JasonGi</title>
	<atom:link href="https://jasongi.com/author/jasongi/feed/" rel="self" type="application/rss+xml" />
	<link>https://jasongi.com/author/jasongi/</link>
	<description>Jason Giancono</description>
	<lastBuildDate>Sat, 21 Mar 2026 17:55:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/jasongi.com/wp-content/uploads/2024/03/cropped-jg-2.png?fit=32%2C32&#038;ssl=1</url>
	<title>jasongi, Author at JasonGi</title>
	<link>https://jasongi.com/author/jasongi/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">56842507</site>	<item>
		<title>Speed up Django&#8217;s collectstatic command with Collectfasta</title>
		<link>https://jasongi.com/2024/03/04/speed-up-djangos-collectstatic-command-with-collectfasta/</link>
					<comments>https://jasongi.com/2024/03/04/speed-up-djangos-collectstatic-command-with-collectfasta/#respond</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Mon, 04 Mar 2024 13:31:31 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[collectfasta]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=7505</guid>

					<description><![CDATA[<p>Django&#8217;s collectstatic command (added in Django 1.3 &#8211; March 23, 2011) was designed for storage backends where file retrieval was cheap because it was on your local disk. In Django 1.4 (March 23, 2012) Django introduced CachedStaticFilesStorage which would append md5 hashes to the end of files so that you could have multiple versions of &#8230; <a href="https://jasongi.com/2024/03/04/speed-up-djangos-collectstatic-command-with-collectfasta/" class="more-link">Continue reading<span class="screen-reader-text"> "Speed up Django&#8217;s collectstatic command with Collectfasta"</span></a></p>
<p>The post <a href="https://jasongi.com/2024/03/04/speed-up-djangos-collectstatic-command-with-collectfasta/">Speed up Django&#8217;s collectstatic command with Collectfasta</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Django&#8217;s <code>collectstatic</code> command (<a href="https://docs.djangoproject.com/en/5.0/releases/1.3/#extended-static-files-handling" target="_blank" rel="noreferrer noopener">added in Django 1.3 </a>&#8211; March 23, 2011) was designed for storage backends where file retrieval was cheap because it was on your local disk. </p>



<p>In <a href="https://docs.djangoproject.com/en/5.0/releases/1.4/#cachedstaticfilesstorage-storage-backend" target="_blank" rel="noreferrer noopener">Django 1.4</a> (March 23, 2012) Django introduced <code>CachedStaticFilesStorage</code> which would append md5 hashes to the end of files so that you could have multiple versions of files which could stick around while you did a blue/green deployment. It also meant you could put your app in-front of a CDN and the filename hashes would ensure that when the file changed so did the cache key. This meant you didn&#8217;t need to worry about invalidating the CDN assets or users&#8217; browser caches.</p>



<p>Later on (<a href="https://docs.djangoproject.com/en/5.0/releases/1.7/#django-contrib-staticfiles" target="_blank" rel="noreferrer noopener">Django 1.7 &#8211; September 2, 2014</a>) we got <code>ManifestStaticFilesStorage</code> which stores the filenames in a json file assisting with hosting on remote storage like S3.</p>



<p>The original <code>django-storages</code> is even older than <code>collectstatic</code> &#8211; <a href="https://github.com/jschneier/django-storages/commit/020143f5d4b128b5e02ea2003d5da4ccb7067f48" target="_blank" rel="noreferrer noopener">the initial commit</a> was back in  Jun 12, 2008. Its purpose was to provide a storage backend for AWS S3 which has since taken over the world. It also provides S3ManifestStaticStorage which is great for static file serving &#8211; you don&#8217;t even need to set up a static web server to serve them &#8211; they can come straight from the bucket or CDN.</p>



<p>The big problem with all of this is that running <code>collectstatic</code> on S3-based storage is painfully <strong>slow</strong>. Especially hashing storage which uses the post-process hook to modify and re-upload files to update file references (which then can trigger further updates). There used to be a solution to this &#8211; <a href="https://github.com/antonagestam/collectfast" target="_blank" rel="noreferrer noopener">Collectfast</a> (released May 2013) was an awesome drop-in replacement for the collectstatic management command which would auto-magically speed things up. Unfortunely, it <a href="https://github.com/antonagestam/collectfast/issues/212">has been archived and is no longer maintained</a> &#8211; the last release being in 2020. Waiting for collectstatic to run has become tiring.</p>



<p>I&#8217;ve spent the past few weekends forking the original <code>Collectfast</code> trying to get the repo up-to-date and working again. It has been an interesting challenge and I&#8217;ve finally got it to a state where I am happy with the performance improvements it provides over the Django command and am confident it works. Introducing&#8230;. <strong><a href="https://github.com/jasongi/collectfasta">Collectfasta</a></strong> -an updated fork of Collectfast &#8211; even faster than before.</p>



<h2 class="wp-block-heading">What&#8217;s new in Collectfasta?</h2>



<h3 class="wp-block-heading">You can now run all tests without connecting to cloud services</h3>



<p>One of the reasons <code>Collectfast</code> was archived was because it was difficult to find a new maintainer, as most tests, specifically the &#8216;live tests&#8217;, required real Google Cloud Platform (GCP) and AWS credentials for execution.</p>



<p>I have now set up popular mocking tools <a href="https://www.localstack.cloud/">LocalStack</a> and <a href="https://github.com/fsouza/fake-gcs-server">fake-gcs-server</a> to allow these tests to run without any AWS or GCP credentials. This has also opened up a new avenue of testing since you can run these mocks for free: testing for performance on many files rather than just a single file. I&#8217;m observing performance improvements of 5x-10x with local mocks, and these improvements are even more significant with remote APIs.</p>



<p>I&#8217;ve kept both the live tests and the docker tests running on master for better coverage.</p>



<h3 class="wp-block-heading">AWS_PRELOAD_METADATA reimplemented</h3>



<p>AWS_PRELOAD_METADATA has been <a href="https://github.com/jschneier/django-storages/pull/636">removed in django-storages 1.10 (2020-08-30)</a> and hard-coding <code>preload_metadata = True</code> has been a key performance optimisation that <code>collectfast</code> made in the boto3 strategy. The reason was straightforward: during <code>collectstatic</code> the <code>exists</code> method checks if a file already exists. This is fine when <code>exists</code> is cheap &#8211; but for the S3Storage <code>exists</code> will do a <a href="https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html">HeadObject</a> request to the S3 API every time, for every file. </p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-8cf370e7 wp-block-group-is-layout-flex">
<p>In contrast, when <code>preload_metadata</code> was working:</p>



<ol class="wp-block-list">
<li>it would initially call <a href="https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html">ListObjectsV2</a> to see what is already there </li>



<li>stores the results in a <code>dict</code>, </li>



<li>then <code>exists</code> checks the <code>dict</code> first, returning <code>True</code> if the key exists &#8211; otherwise deferring to the initial implementation. </li>
</ol>



<p>This significantly speeds up subsequent <code>collectstatic</code> runs on the same files, since you&#8217;re replacing hundreds of API calls with one.</p>
</div>
</div></div>



<p>Removing this feature from <code>django-storages</code> made sense &#8211; it&#8217;s not the kind of thing you want people enabling on a web server &#8211; because it will cause memory leaks and is not concurrent-safe. However, for a management command like <code>collectstatic</code> &#8211; concurrency doesn&#8217;t matter.</p>



<p>Re-implementing the functionality was nasty &#8211; I wrapped the storage object with my own storage subclass of key methods that saved the preloaded data so that it could be kept up to date on <code>save</code>, <code>delete</code> etc. There&#8217;s surely a better pattern than what I ended up with &#8211; but I was optimising for replicating the removed logic rather than beautiful code &#8211; this is ripe for a refactor.</p>



<h3 class="wp-block-heading">The two-pass strategy</h3>



<p>After I got the <code>preload_metadata</code> working again, I found that my code was still pretty slow. The culprit was the multiple post-processing hashing passes that occur when the files reference each other. It confused me a lot because there are comments in ManifestFilesMixin that specifically mention consideration for S3:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
            # use the original, local file, not the copied-but-unprocessed
            # file, which might be somewhere far away, like S3
            storage, path = paths&#x5B;name]
</pre></div><cite><a href="https://github.com/django/django/blame/3d4fe39bac082b835a2d82b717b6ae88ea70ea15/django/contrib/staticfiles/storage.py#L347">django/contrib/staticfiles/storage.py#L341</a></cite></blockquote>



<p>Upon further investigation, I discovered the cause was worse than I thought. Staticfiles does an <code>exists</code> check here on <a href="https://github.com/django/django/blame/3d4fe39bac082b835a2d82b717b6ae88ea70ea15/django/contrib/staticfiles/storage.py#L358">L358</a> and then deletes the file that exists on <a href="https://github.com/django/django/blame/3d4fe39bac082b835a2d82b717b6ae88ea70ea15/django/contrib/staticfiles/storage.py#L378C24-L378C42">L378</a> which means we need to re-upload it &#8211; this happens when there&#8217;s references between the static files. As a result, the system re-uploads these files every time, even with the <code>preload_metadata</code> optimisations. I wanted to find a better way.</p>



<p>I thought of a simple solution: a two-pass strategy. It works by running collectstatic using the <code>InMemoryStorage</code> or <code>FileSystemStorage</code> mixed in with <code>ManifestFilesMixin</code>. This means all the post-processing happens locally. Then for the second pass, we just iterate over the storage used in the first-pass and copy the files, as-is to S3. It means that it is still quite a bit slower than other strategies, because the first-pass has to run every time. But the first-pass is quite fast, and on subsequent runs the second-pass copies 0 files if they haven&#8217;t changed. It also only does a single ListObjectsV2 call at the start as we re-use the preload strategy for the second pass.</p>



<h3 class="wp-block-heading">What needs work?</h3>



<ol class="wp-block-list">
<li>The tests could be refactored to be a bit simpler &#8211; as raised in <a href="https://github.com/antonagestam/collectfast/issues/217">#217</a></li>



<li>The two-pass strategy only works for AWS &#8211; the Google version doesn&#8217;t even have a manifest files version in <code>django-storages</code></li>



<li>I haven&#8217;t touched the filesystem strategies at all &#8211; but in my experience filesystem storages are usually fast anyway. Potentially they (and the threading vars) could be removed &#8211; the main bottleneck I think has always been network requests.</li>



<li>I fought the current Strategy abstraction quite a bit &#8211; especially for two-pass &#8211; there&#8217;s an opportunity to refactor this to something simpler.</li>
</ol>



<p>PRs are accepted / encouraged &#8211; <a href="https://github.com/jasongi/collectfasta">github.com/jasongi/collectfasta</a></p>



<p></p>
<p>The post <a href="https://jasongi.com/2024/03/04/speed-up-djangos-collectstatic-command-with-collectfasta/">Speed up Django&#8217;s collectstatic command with Collectfasta</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2024/03/04/speed-up-djangos-collectstatic-command-with-collectfasta/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7505</post-id>	</item>
		<item>
		<title>Superloop vs Aussie Broadband &#8211; a 2023 comparison</title>
		<link>https://jasongi.com/2023/11/28/superloop-vs-aussie-broadband-2023/</link>
					<comments>https://jasongi.com/2023/11/28/superloop-vs-aussie-broadband-2023/#respond</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Tue, 28 Nov 2023 15:57:57 +0000</pubDate>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Superloop cgnat]]></category>
		<category><![CDATA[Superloop port blocking]]></category>
		<category><![CDATA[Superloop vs Aussie Broadband]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=7399</guid>

					<description><![CDATA[<p>A few years back, during the 2020 lockdowns, I posted &#8220;Moving from Aussie Broadband to Superloop&#8220;, which turned out to be one of the most trafficked posts on this site. A lot has changed since 2023, including me moving from Superloop back to Aussie Broadband for a few months, then back to Superloop. This is &#8230; <a href="https://jasongi.com/2023/11/28/superloop-vs-aussie-broadband-2023/" class="more-link">Continue reading<span class="screen-reader-text"> "Superloop vs Aussie Broadband &#8211; a 2023 comparison"</span></a></p>
<p>The post <a href="https://jasongi.com/2023/11/28/superloop-vs-aussie-broadband-2023/">Superloop vs Aussie Broadband &#8211; a 2023 comparison</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>A few years back, during the 2020 lockdowns, I posted &#8220;<a href="https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/">Moving from Aussie Broadband to Superloop</a>&#8220;, which turned out to be one of the most trafficked posts on this site.</p>



<p>A lot has changed since 2023, including me moving from Superloop back to Aussie Broadband for a few months, then back to Superloop. This is what has changed.</p>



<p><strong>The Price</strong><br>Back in 2020, 100/40 was <strong>$109</strong> (Aussie) vs <strong>$98</strong> (Superloop) with 6 months at <strong>$88</strong>. Recently, <a href="https://www.nbnco.com.au/corporate-information/media-centre/media-statements/statement-on-nbn-wholesale-prices">NBN has reduced the wholesale costs</a> of faster plans to encourage upgrades.. Superloop prices have lowered due to this, now with a 6 month introductory peroid of <strong>$75 </strong>and ongoing <strong>$89</strong> &#8211; this $20 &#8211; $26 dollar difference is why I switched back and will still reccomend them. <a href="https://www.superloop.com/internet/nbn?referral_code=SLC-1516610" target="_blank" rel="noreferrer noopener nofollow">Here&#8217;s a sign up link (referral link)</a>. Meanwhile Aussie has only decreased from <strong>$105</strong> to <strong>$109</strong>.</p>



<p><strong>CVC Graphs</strong><br>Part of the draw of Superloop was that they published their CVC Graphs for all to see that they weren&#8217;t being congested. Since merging with Exetel, the CVC Graphs are disappointingly not available on their public website, however they are still accessible and <a href="https://jasongi.com/superloop-cvc-graph-archive/">I will continue to archive them</a> while they are. Because there&#8217;s no information out there about this, I have no idea if they apply only to legacy superloop customers or also to Exetel/new Superloop signups. However the ACCC heavily monitor speeds now so it seems unlikely they will be able to get away with purchasing less CVC to cover the price drop/discounting.</p>



<p><strong>The Transfer</strong><br>It&#8217;s still just as fast. I was connected within an hour, and luckily Aussie still will pro-rata your month when cancelling (Superloop require 30 days notice).</p>



<p><strong>No Port Blocking &#8211; but opt-out CGNAT</strong><br>Superloop now by default opt you in to <strong>CGNAT</strong> &#8211; which is annoying if you&#8217;re a developer, have a home-lab or play video games. However, you can still opt-out by contacting support (they have chat!). There&#8217;s still no port blocking.</p>
<p>The post <a href="https://jasongi.com/2023/11/28/superloop-vs-aussie-broadband-2023/">Superloop vs Aussie Broadband &#8211; a 2023 comparison</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2023/11/28/superloop-vs-aussie-broadband-2023/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7399</post-id>	</item>
		<item>
		<title>Fixing the Siemens SINUMERIK 828D when USB drives won&#8217;t mount</title>
		<link>https://jasongi.com/2023/03/28/fixing-the-siemens-sinumerik-828d-when-usb-wont-mount/</link>
					<comments>https://jasongi.com/2023/03/28/fixing-the-siemens-sinumerik-828d-when-usb-wont-mount/#respond</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Tue, 28 Mar 2023 00:37:56 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=7374</guid>

					<description><![CDATA[<p>I came across an interesting problem the other day. All of a sudden, after saving a particular file to USB on the SINUMERIK 828D (a popular CNC machine controller) all USB drives stopped showing up on the HMI. After looking through the file browser, you could see that /user/sinumerik/mnt/USB had the file in it &#8211; &#8230; <a href="https://jasongi.com/2023/03/28/fixing-the-siemens-sinumerik-828d-when-usb-wont-mount/" class="more-link">Continue reading<span class="screen-reader-text"> "Fixing the Siemens SINUMERIK 828D when USB drives won&#8217;t mount"</span></a></p>
<p>The post <a href="https://jasongi.com/2023/03/28/fixing-the-siemens-sinumerik-828d-when-usb-wont-mount/">Fixing the Siemens SINUMERIK 828D when USB drives won&#8217;t mount</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>I came across an interesting problem the other day. All of a sudden, after saving a particular file to USB on the SINUMERIK 828D (a popular CNC machine controller) all USB drives stopped showing up on the HMI.</p>



<p>After looking through the file browser, you could see that <code>/user/sinumerik/mnt/USB</code> had the file in it &#8211; even when a USB was not plugged in. This is a common problem in the linux world. What probably happened is that for some reason, the HMI, saved the file to <code>/user/sinumerik/mnt/USB</code>, and then when plugging in the USB drive it would not mount as the directory already existed with files in it.</p>



<p>The next problem was &#8211; how do we fix it. We couldn&#8217;t delete the folder via the HMI, because there was inadequate permissions (even as the manufacturer user)  so the end solution was to remove the system CF card from the unit, mount it on a linux computer  (as it&#8217;s formatted ex4) with a USB CF card reader and then remove the file. Obviously this is risky, and you should always backup before attempting this. Another solution would be to SSH into the machine as root, but this requires it to be networked, and also the ability to get root access which I couldn&#8217;t figure out.</p>



<p>After mounting on a separate computer, we could see that the USB folder existed and had different permissions to the other drive mounts. After deleting the file and putting the CF card back in the 828D, USB drives were able to be mounted again.</p>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?ssl=1"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="840" height="172" src="https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?resize=840%2C172&#038;ssl=1" alt="Screenshot of 828D filesystem" class="wp-image-7377" srcset="https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?resize=1024%2C210&amp;ssl=1 1024w, https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?resize=300%2C61&amp;ssl=1 300w, https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?resize=768%2C157&amp;ssl=1 768w, https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?resize=1536%2C314&amp;ssl=1 1536w, https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?resize=624%2C128&amp;ssl=1 624w, https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?w=1740&amp;ssl=1 1740w, https://i0.wp.com/jasongi.com/wp-content/uploads/2023/03/828D-mount-directory-1.png?w=1680&amp;ssl=1 1680w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a><figcaption class="wp-element-caption">You can see that the USB folder, unlike the other mounts, is not a link and does not allow non-root user&#8217;s write access</figcaption></figure>
<p>The post <a href="https://jasongi.com/2023/03/28/fixing-the-siemens-sinumerik-828d-when-usb-wont-mount/">Fixing the Siemens SINUMERIK 828D when USB drives won&#8217;t mount</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2023/03/28/fixing-the-siemens-sinumerik-828d-when-usb-wont-mount/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7374</post-id>	</item>
		<item>
		<title>Adding a throttle to the Entity ECU-100 controller on the ALDI Cell Electric bicycle</title>
		<link>https://jasongi.com/2022/04/01/adding-a-throttle-to-the-entity-ecu-100-controller-on-the-aldi-cell-electric-bicycle/</link>
					<comments>https://jasongi.com/2022/04/01/adding-a-throttle-to-the-entity-ecu-100-controller-on-the-aldi-cell-electric-bicycle/#comments</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Thu, 31 Mar 2022 21:18:35 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=6738</guid>

					<description><![CDATA[<p>Back in 2019 I bought an ALDI &#8220;special buy&#8221; e-bike for $999 &#8211; the Cell Ultimo Urban E-bike. It is an OK bike, but due to the way the pedal assist works it can be a bit annoying trying to take off on a high gear (as you need to begin to pedal before it &#8230; <a href="https://jasongi.com/2022/04/01/adding-a-throttle-to-the-entity-ecu-100-controller-on-the-aldi-cell-electric-bicycle/" class="more-link">Continue reading<span class="screen-reader-text"> "Adding a throttle to the Entity ECU-100 controller on the ALDI Cell Electric bicycle"</span></a></p>
<p>The post <a href="https://jasongi.com/2022/04/01/adding-a-throttle-to-the-entity-ecu-100-controller-on-the-aldi-cell-electric-bicycle/">Adding a throttle to the Entity ECU-100 controller on the ALDI Cell Electric bicycle</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Back in 2019 I bought an ALDI &#8220;special buy&#8221; e-bike for $999 &#8211; the <a href="https://www.ozbargain.com.au/node/503350">Cell Ultimo Urban E-bike</a>. It is an OK bike, but due to the way the pedal assist works it can be a bit annoying trying to take off on a high gear (as you need to begin to pedal before it works) or go up a hill on a high gear.</p>



<p>I wanted to fix this by adding a throttle. In some states this may be an illegal modification and will definitely void your warranty so please do your own research.</p>



<p>The Cell bikes use the <a href="https://www.entitycycling.com/entity-ecu-100-sine-wave-controller-e100-series">Entity ECU-100 </a>as it&#8217;s controller. There&#8217;s no datasheet or diagram of the available pins for this controller but researching generic e-bike controller boards (the kind you see on aliexpress/ebay) I found that you wire up a throttle to the &#8220;SP&#8221; pin.  </p>



<p>Remove the two screws on the back of the battery housing where the controller is, then proceeded to label each of the wires while detaching them (this is important, there are many different connections and you don&#8217;t want to wire up the wrong thing when reconnecting them). </p>



<p>Remove the three screws on the side of the controller housing and then the four screws on front and back. You can now see the SP pin. </p>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?ssl=1"><img data-recalc-dims="1" decoding="async" width="840" height="495" src="https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled.jpg?resize=840%2C495&#038;ssl=1" alt="" class="wp-image-6739" srcset="https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?resize=1024%2C603&amp;ssl=1 1024w, https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?resize=300%2C177&amp;ssl=1 300w, https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?resize=768%2C452&amp;ssl=1 768w, https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?resize=1536%2C904&amp;ssl=1 1536w, https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?resize=2048%2C1206&amp;ssl=1 2048w, https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?resize=624%2C367&amp;ssl=1 624w, https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?w=1680&amp;ssl=1 1680w, https://i0.wp.com/jasongi.com/wp-content/uploads/2022/04/Untitled-scaled.jpg?w=2520&amp;ssl=1 2520w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a><figcaption>Three wires soldered to the SP, 5v and GND pins. You should use proper colours for the wire unlike me (Red for 5v, Black for GND, White/coloured for SP)</figcaption></figure>



<p>Solder three wires to the controller board. I drilled an extra hold in the plate the writes come out of, fed them through and crimped them to some bullet (socket) connectors.</p>



<p>I purchased a random thumb throttle from ebay for about $20, snipped the end off and crimped on some bullet plug connectors, ran the wires through the bike tube (you want to find something long and slightly bendy to feed it through).</p>



<p>Now everything is hooked up, you can put it all back together and enjoy your new speedy bike.</p>
<p>The post <a href="https://jasongi.com/2022/04/01/adding-a-throttle-to-the-entity-ecu-100-controller-on-the-aldi-cell-electric-bicycle/">Adding a throttle to the Entity ECU-100 controller on the ALDI Cell Electric bicycle</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2022/04/01/adding-a-throttle-to-the-entity-ecu-100-controller-on-the-aldi-cell-electric-bicycle/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6738</post-id>	</item>
		<item>
		<title>How to host Jackbox over Zoom on Mac OSX &#8211; with sound!</title>
		<link>https://jasongi.com/2020/11/17/how-to-host-jackbox-over-zoom-on-mac-osx-with-sound/</link>
					<comments>https://jasongi.com/2020/11/17/how-to-host-jackbox-over-zoom-on-mac-osx-with-sound/#comments</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Tue, 17 Nov 2020 12:54:14 +0000</pubDate>
				<category><![CDATA[Gaming]]></category>
		<category><![CDATA[jackbox]]></category>
		<category><![CDATA[zoom]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=5767</guid>

					<description><![CDATA[<p>The Jackbox Party Packs by Jackbox Games have been a lifesaver in the COVID-19 pandemic given it has been very hard to see people in person. Most of the games work great over Zoom, but unfortunately getting the perfect Jackbox setup it isn&#8217;t the most straightforward task. I have experimented with various setups and I &#8230; <a href="https://jasongi.com/2020/11/17/how-to-host-jackbox-over-zoom-on-mac-osx-with-sound/" class="more-link">Continue reading<span class="screen-reader-text"> "How to host Jackbox over Zoom on Mac OSX &#8211; with sound!"</span></a></p>
<p>The post <a href="https://jasongi.com/2020/11/17/how-to-host-jackbox-over-zoom-on-mac-osx-with-sound/">How to host Jackbox over Zoom on Mac OSX &#8211; with sound!</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The Jackbox Party Packs by <a href="https://www.jackboxgames.com/">Jackbox Games</a> have been a lifesaver in the COVID-19 pandemic given it has been very hard to see people in person. Most of the games work great over Zoom, but unfortunately getting the perfect Jackbox setup it isn&#8217;t the most straightforward task. I have experimented with various setups and I believe I have found the perfect method to a seamless Jackbox experience.</p>



<h3 class="wp-block-heading">Set Jackbox to windowed mode</h3>



<p>Before you begin your game, open up Jackbox and set it to windowed mode. This will allow you to see your friends, control zoom and play at the same time with a single screen. It&#8217;s slightly different for each pack, but most of them have a settings option in the main menu where you can choose the volume and full-screen/windowed. After you have done this, exit Jackbox.</p>



<h3 class="wp-block-heading">Start your zoom call</h3>



<p>Start your Zoom call, no need to invite anyone yet.</p>



<h3 class="wp-block-heading">Before you open Jackbox, share your screen with computer sound</h3>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" decoding="async" width="840" height="552" src="https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?resize=840%2C552&#038;ssl=1" alt="" class="wp-image-5771" srcset="https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?resize=1024%2C673&amp;ssl=1 1024w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?resize=1536%2C1009&amp;ssl=1 1536w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?resize=2048%2C1346&amp;ssl=1 2048w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?resize=624%2C410&amp;ssl=1 624w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?w=1680&amp;ssl=1 1680w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.23.07-pm-1.png?w=2520&amp;ssl=1 2520w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></figure>



<p>It&#8217;s very important to do this <strong>before</strong> you start the Jackbox pack you will be playing. When you share your screen with the Share Computer Sound, it creates the &#8220;ZoomAudioDevice&#8221; which aggregates your microphone and computer audio into a single device for Zoom to use. It is important to do this before Jackbox starts because Jackbox picks the audio output on startup and keeps it for the entire session, if the ZoomAudioDevice isn&#8217;t there then no matter how many times you try sharing your screen the sound won&#8217;t come through.</p>



<h3 class="wp-block-heading">Start Jackbox</h3>



<p>Start up your desired Jackbox Party Pack (make sure you&#8217;ve set it to windowed mode).</p>



<h3 class="wp-block-heading">Stop sharing your screen then share the Jackbox window</h3>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="840" height="552" src="https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?resize=840%2C552&#038;ssl=1" alt="" class="wp-image-5770" srcset="https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?resize=1024%2C673&amp;ssl=1 1024w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?resize=768%2C504&amp;ssl=1 768w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?resize=1536%2C1009&amp;ssl=1 1536w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?resize=2048%2C1345&amp;ssl=1 2048w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?resize=624%2C410&amp;ssl=1 624w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?w=1680&amp;ssl=1 1680w, https://i0.wp.com/jasongi.com/wp-content/uploads/2020/11/Screen-Shot-2020-11-17-at-11.24.42-pm-1.png?w=2520&amp;ssl=1 2520w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></figure>



<p>You could just play Jackbox sharing your screen as above, but it is a sub-par experience. Your friends will be able to see all your saucy notifications, all your chrome tabs open in the background etc. What you really want is to just share the Jackbox window. If you stop sharing and then press share screen again, you will now have the option to choose the Jackbox window. Pick it then press share. You could also choose to share a screen portion instead of the window, but this could result in things drawing over the window, although it will make it easier to switch party packs.</p>



<p>NOTE: You&#8217;ll see on my screenshots I have unticked Optimise Screen Share for Video Clip. This is because I have found that although this improves the quality of the stream, the trade-off is some extra latency at times which is much more annoying when playing games with countdown timers. You milage may vary.</p>



<h3 class="wp-block-heading">Whenever you switch a party pack, repeat all the steps</h3>



<p>It is important that whenever you start a party pack you do it with your screen sharing on and share computer sound ticked, otherwise your sound will not work. Exiting a party pack will stop the window screen sharing, so you will need to start at the first stop.</p>



<h3 class="wp-block-heading">Other Methods</h3>



<p>I only discovered this method recently, prior to this I was using a more convoluted setup that involved two laptops and a program called <a href="https://github.com/mattingalls/Soundflower">Soundflower</a>, which I will go into more detail into another post however this method is much easier to set up.</p>



<p>I hope this helps, happy Jackboxing!</p>
<p>The post <a href="https://jasongi.com/2020/11/17/how-to-host-jackbox-over-zoom-on-mac-osx-with-sound/">How to host Jackbox over Zoom on Mac OSX &#8211; with sound!</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2020/11/17/how-to-host-jackbox-over-zoom-on-mac-osx-with-sound/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5767</post-id>	</item>
		<item>
		<title>Moving from Aussie Broadband to Superloop</title>
		<link>https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/</link>
					<comments>https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/#comments</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Sat, 05 Sep 2020 11:33:16 +0000</pubDate>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[NBN CVC graphs]]></category>
		<category><![CDATA[Superloop cgnat]]></category>
		<category><![CDATA[Superloop cvc]]></category>
		<category><![CDATA[Superloop port blocking]]></category>
		<category><![CDATA[Superloop vs Aussie Broadband]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=5611</guid>

					<description><![CDATA[<p>Update: See the updated 2023 comparison here After a few years as a happy Aussie Broadband customer, I have decided to move to Superloop. This is a quick summary of my experience. The PriceAussie Broadband recently announced they are increasing the price of their 100mbps plans by $10 a month. This means that an unlimited &#8230; <a href="https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/" class="more-link">Continue reading<span class="screen-reader-text"> "Moving from Aussie Broadband to Superloop"</span></a></p>
<p>The post <a href="https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/">Moving from Aussie Broadband to Superloop</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong><a href="https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/">Update: See the updated 2023 comparison here</a></strong></p>



<p>After a few years as a happy Aussie Broadband customer, I have decided to move to <a href="https://members.superloop.com/signup?referral_code=ZALGJR&amp;plan=1507" target="_blank" rel="noreferrer noopener">Superloop</a>. This is a quick summary of my experience.</p>



<p><strong>The Price</strong><br>Aussie Broadband recently announced they are increasing the price of their 100mbps plans by $10 a month. This means that an unlimited 100/40 plan is <strong>$98</strong> for Superloop vs <strong>$109</strong> for Aussie. Couple it with a referral code/link and you can get it for <strong>$88</strong> for 6 months (<a href="https://superloop.com/internet/nbn?referral_code=SLC-874171" target="_blank" rel="noreferrer noopener">here is my referral link</a>). Aussie broadband have never been the cheapest provider, but this new hike is uncompetitive.</p>



<p><strong>Superloop</strong><br>Superloop has copied the Aussie Broadband playbook as a premium NBN provider. They publish <a href="https://www.superloop.com/consumer/home-broadband/cvc-graphs.html">daily CVC graphs</a>, which aren&#8217;t as detailed as Aussie Broadband&#8217;s but are good enough for you to identify if they are not provisioning enough CVC to your POI. Like Aussie Broadband there&#8217;s no lock in contracts and extra connection fees, which is a great way of knowing that if they do something like increase your plan costs or have a decline in service quality, you can easily move without penalty.</p>



<p><strong>The Transfer</strong><br>Churning was ridiculously quick. There was no need to cancel my connection with Aussie Broadband, I simply signed up on the Superloop website and within 5 minutes the connection had been swapped over with no noticeable connection interruption. No need to talk to anyone. One annoying thing is that the only payment methods they offer are Credit Card and BPay, so Credit Card is the only automatic way of paying &#8211; luckily though there is no surcharge for this.</p>



<p><strong>No More CGNAT or Port Blocking</strong><br>Something annoying about Aussie Broadband is that when you sign up or move house you need to wait until the connection is active, then contact their support to remove CGNAT (which messes with things like online games) and unblock incoming ports (important if, like me, you do some web development type stuff on your network). I was pleasantly surprised that Superloop hand out Dynamic IPv4 addresses by default and doesn&#8217;t engage in port blocking.</p>



<p>Similarly to my <a href="https://jasongi.com/abb-cvc-archive/">Aussie Broadband CVC Archive</a>, I have started archiving <a href="https://jasongi.com/superloop-cvc-graph-archive/">Superloop&#8217;s CVC graphs too</a>.</p>
<p>The post <a href="https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/">Moving from Aussie Broadband to Superloop</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2020/09/05/moving-from-aussie-broadband-to-superloop/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5611</post-id>	</item>
		<item>
		<title>Name list generator</title>
		<link>https://jasongi.com/2020/05/21/name-list-generator/</link>
					<comments>https://jasongi.com/2020/05/21/name-list-generator/#respond</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Thu, 21 May 2020 23:51:01 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=5401</guid>

					<description><![CDATA[<p>Need a list of names generated? Just load up this page with names as a query param with your comma separated list of names and it shall generate a random list, e.g jasongi.com/2020/05/21/name-list-generator/?names=Jason,Fred,Jane! Perfect for Zoom stand-ups!</p>
<p>The post <a href="https://jasongi.com/2020/05/21/name-list-generator/">Name list generator</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Need a list of names generated? Just load up this page with names as a query param with your comma separated list of names and it shall generate a random list, e.g <a href="https://jasongi.com/2020/05/21/name-list-generator/?names=Jason,Fred,Jane">jasongi.com/2020/05/21/name-list-generator/?names=Jason,Fred,Jane</a>! Perfect for Zoom stand-ups!</p>



<ol id="name-list"></ol>
<script>
function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, '\\$&');
    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return '';
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
function shuffleArray(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
(function() {
   var names = getParameterByName("names").split(",");
   shuffleArray(names)
   names.forEach(function(name) {
   		var ol = document.getElementById("name-list");
        var li = document.createElement("li");
   		li.appendChild(document.createTextNode(name.replace(/[^\w\s!?]/g,'')));
        ol.appendChild(li);
   });
})();
</script>



<p></p>
<p>The post <a href="https://jasongi.com/2020/05/21/name-list-generator/">Name list generator</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2020/05/21/name-list-generator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5401</post-id>	</item>
		<item>
		<title>Hottest 100 Prediction 2019</title>
		<link>https://jasongi.com/2020/01/24/hottest-100-prediction-2019/</link>
					<comments>https://jasongi.com/2020/01/24/hottest-100-prediction-2019/#respond</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Fri, 24 Jan 2020 12:41:26 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Triple J]]></category>
		<guid isPermaLink="false">https://jasongi.com/?p=4617</guid>

					<description><![CDATA[<p>I have been busy the last couple of months, which means I haven&#8217;t been able to do as big a write up for the hottest 100 prediction. I have been running it with just scraping instagram and below are the results. Expect a further write up soon!</p>
<p>The post <a href="https://jasongi.com/2020/01/24/hottest-100-prediction-2019/">Hottest 100 Prediction 2019</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I have been busy the last couple of months, which means I haven&#8217;t been able to do as big a write up for the hottest 100 prediction. I have been running it with just scraping instagram and below are the results. Expect a further write up soon!</p>
<p><!-- metabase-replacement:start f43c89b0-d9c1-45f5-956f-3093547a8f4b --></p>
<style>#metabase-embed-wrap-f43c89b0-d9c1-45f5-956f-3093547a8f4b{width:100%;max-width:100%;container-type:inline-size;}#metabase-embed-f43c89b0-d9c1-45f5-956f-3093547a8f4b{width:100% !important;max-width:100% !important;height:auto !important;display:block;border:0;box-sizing:border-box;aspect-ratio:1.45 / 1;}@container (max-width: 640px){#metabase-embed-f43c89b0-d9c1-45f5-956f-3093547a8f4b{aspect-ratio:0.9 / 1;}}</style>
<div id="metabase-embed-wrap-f43c89b0-d9c1-45f5-956f-3093547a8f4b"><iframe id="metabase-embed-f43c89b0-d9c1-45f5-956f-3093547a8f4b" src="https://static.pub.jasongi.com/metabase-replacement/pages/f43c89b0-d9c1-45f5-956f-3093547a8f4b.html?v=20260321-173940&#038;embed=1" title="Metabase replacement f43c89b0-d9c1-45f5-956f-3093547a8f4b" loading="lazy" style="width:100% !important;max-width:100% !important;height:auto !important;border:0;display:block;" referrerpolicy="strict-origin-when-cross-origin"></iframe></div>
<p><!-- metabase-replacement:end f43c89b0-d9c1-45f5-956f-3093547a8f4b --></p>
<p>The post <a href="https://jasongi.com/2020/01/24/hottest-100-prediction-2019/">Hottest 100 Prediction 2019</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2020/01/24/hottest-100-prediction-2019/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4617</post-id>	</item>
		<item>
		<title>100 Toasty Tofu(s) 2018 Edition</title>
		<link>https://jasongi.com/2019/01/20/100-toasty-tofus-2018-edition/</link>
					<comments>https://jasongi.com/2019/01/20/100-toasty-tofus-2018-edition/#comments</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Sun, 20 Jan 2019 07:42:01 +0000</pubDate>
				<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[hottest 100]]></category>
		<category><![CDATA[Triple J]]></category>
		<guid isPermaLink="false">http://jasongi.com/?p=3396</guid>

					<description><![CDATA[<p>It&#8217;s that time of the year again. Last year I made the foray into predicting Triple J&#8217;s Hottest 100 and it was fun so this year I&#8217;ve given it another go with some key differences. I completely rewrote the script that does the legwork, and decided to go one step further with doing some demographic &#8230; <a href="https://jasongi.com/2019/01/20/100-toasty-tofus-2018-edition/" class="more-link">Continue reading<span class="screen-reader-text"> "100 Toasty Tofu(s) 2018 Edition"</span></a></p>
<p>The post <a href="https://jasongi.com/2019/01/20/100-toasty-tofus-2018-edition/">100 Toasty Tofu(s) 2018 Edition</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s that time of the year again. Last year I made the foray into predicting <a href="https://hottest100.abc.net.au/" target="_blank" rel="noopener">Triple J&#8217;s Hottest 100</a> and it was fun so this year I&#8217;ve given it another go with some key differences. I completely rewrote the script that does the legwork, and decided to go one step further with doing some demographic weighting and analysis.</p>
<h4>The New Script</h4>
<p>Last year I was using <a href="https://github.com/tesseract-ocr/tesseract" target="_blank" rel="noopener">Tesseract</a>, one of the leading open source projects. This year I decided to test out some cloud based OCR to see if it was any better. I tried <a href="https://aws.amazon.com/rekognition/" target="_blank" rel="noopener">Amazon Recognition</a> and <a href="https://cloud.google.com/vision/docs/ocr" target="_blank" rel="noopener">Google Cloud Vision</a>. After testing both it became clear that Google Cloud Vision is miles ahead of Recognition in both text detection and paragraph detection, so I went with that. I&#8217;ve also hooked up all the data to a <a href="https://metabase.com/" target="_blank" rel="noopener">metabase</a> instance, which is great for easily displaying data.</p>
<p><a href="https://100warmtunas.com">100 warm tunas</a> is now scraping twitter and instagram. I considered whether my script should do the same but decided against it for a few reasons. Last year,  <a href="https://www.reddit.com/r/triplej/comments/7sugnl/i_wrote_a_program_to_predict_the_outcome_of/">ZestfullyGreen did a twitter scraper</a> but it failed to predict the #1 song. This lead me to believe that the sample of people on twitter are not representative of the Hottest 100 voting population and would not improve the prediction while instagram has a strong history is accurate predictions.</p>
<h4>The Results</h4>
<p>Without further ado, these are the raw counts.</p>
<p><!-- metabase-replacement:start 4e384d38-8980-4552-937d-093977b16739 --><br />
<iframe src="https://static.pub.jasongi.com/metabase-replacement/pages/4e384d38-8980-4552-937d-093977b16739.html?v=20260321-173940" title="Metabase replacement 4e384d38-8980-4552-937d-093977b16739" loading="lazy" style="width:100%;height:min(1200px,80vh);border:0;display:block;" referrerpolicy="strict-origin-when-cross-origin"></iframe><br />
<!-- metabase-replacement:end 4e384d38-8980-4552-937d-093977b16739 --></p>
<p>Interestingly it wasn&#8217;t always like this. If you look at the day by day counts, former bookie favourite This Is America won the first day and it took a few more days for Ocean Alley&#8217;s total to catch up. We could be in for a close Hottest 100.</p>
<p><!-- metabase-replacement:start 15136509-f0c8-4e3f-9f43-8c91c282d146 --></p>
<style>#metabase-embed-wrap-15136509-f0c8-4e3f-9f43-8c91c282d146{width:100%;max-width:100%;container-type:inline-size;}#metabase-embed-15136509-f0c8-4e3f-9f43-8c91c282d146{width:100% !important;max-width:100% !important;height:auto !important;display:block;border:0;box-sizing:border-box;aspect-ratio:1.45 / 1;}@container (max-width: 640px){#metabase-embed-15136509-f0c8-4e3f-9f43-8c91c282d146{aspect-ratio:0.9 / 1;}}</style>
<div id="metabase-embed-wrap-15136509-f0c8-4e3f-9f43-8c91c282d146"><iframe id="metabase-embed-15136509-f0c8-4e3f-9f43-8c91c282d146" src="https://static.pub.jasongi.com/metabase-replacement/pages/15136509-f0c8-4e3f-9f43-8c91c282d146.html?v=20260321-173940&#038;embed=1" title="Metabase replacement 15136509-f0c8-4e3f-9f43-8c91c282d146" loading="lazy" style="width:100% !important;max-width:100% !important;height:auto !important;border:0;display:block;" referrerpolicy="strict-origin-when-cross-origin"></iframe></div>
<p><!-- metabase-replacement:end 15136509-f0c8-4e3f-9f43-8c91c282d146 --></p>
<h4>Looking a little deeper</h4>
<p>Every year, Triple J loves to wheel out the stats on the Hottest 100 while refusing to release counts. This makes seeing how far off previous predictions are difficult. I did some research and found several interesting articles.</p>
<p><a href="https://www.abc.net.au/triplej/news/musicnews/this-years-hottest-100-is-record-breaking-year/9350308">This year&#8217;s Hottest 100 has set a new voting record!</a> Gave us a breakdown by state, gender and age bracket (kinda) of who voted.</p>
<blockquote>
<ul>
<li>More women than men voted this year, 51% female compared to 48% male (rounded out by 1% for &#8216;Other&#8217; and &#8216;No answer&#8217;)</li>
<li>New South Wales took the lion’s share of votes (29%), followed by Victoria (23%), backed up by QLD (20%), and in order after that, WA (11%), SA (8%), ACT and TAS (3%), Overseas voters (2%), and NT (1%).</li>
<li>The most common age of voters was 21 years old. About half of voters were aged 18-24 and around 80% of voters were under 30.</li>
</ul>
</blockquote>
<p><em><a href="https://www.abc.net.au/triplej/news/musicnews/did-guys-and-gals-vote-differently-in-the-hottest-100-lets-fi/9379174" target="_blank" rel="noopener">Did guys and gals vote differently in the Hottest 100? Let&#8217;s find out</a></em> showed us the gender divide in music tastes. <em><a href="https://www.abc.net.au/triplej/news/musicnews/hottest-100-voting-by-state/9382790">Hottest 100: What songs were most popular with each state and territory?</a> </em>did the same for states/territories.</p>
<p>Instagram doesn&#8217;t list a location for people or their gender, but I figured gender could be approximated by running people&#8217;s names through <a href="https://github.com/lead-ratings/gender-guesser">gender_guesser</a>, a library for python that uses a name dataset to guess gender. This decreases our sample size as not everyone has their name of instagram, but is an interesting experiment. Here you can see the differences in votes.</p>
<p><!-- metabase-replacement:start 22946613-9dc4-42f9-a22a-cde2224493fc --><br />
<iframe src="https://static.pub.jasongi.com/metabase-replacement/pages/22946613-9dc4-42f9-a22a-cde2224493fc.html?v=20260321-173940" title="Metabase replacement 22946613-9dc4-42f9-a22a-cde2224493fc" loading="lazy" style="width:100%;height:min(1200px,80vh);border:0;display:block;" referrerpolicy="strict-origin-when-cross-origin"></iframe><br />
<!-- metabase-replacement:end 22946613-9dc4-42f9-a22a-cde2224493fc --></p>
<p>The divide is clear. Everybody loves Ocean Alley and Gambino, but people with masculine names seem to have an aversion to Wafia and Amy Shark (Could this be why she has never gotten a #1?). Masculine names also enjoy Ruby Fields &#8211; Dinosaur more than people with feminine names.</p>
<p>For location, I used a different approximation. Sometimes people tag their photos with a location, and it&#8217;s probable that that location is where they live. So the script tries to find the last tagged location and puts them into that state. It&#8217;s not perfect but provides some interesting results.</p>
<p><!-- metabase-replacement:start 25676cf4-93a4-45b6-89c6-44f02e491b92 --><br />
<iframe src="https://static.pub.jasongi.com/metabase-replacement/pages/25676cf4-93a4-45b6-89c6-44f02e491b92.html?v=20260321-173940" title="Metabase replacement 25676cf4-93a4-45b6-89c6-44f02e491b92" loading="lazy" style="width:100%;height:min(1400px,80vh);border:0;display:block;" referrerpolicy="strict-origin-when-cross-origin"></iframe><br />
<!-- metabase-replacement:end 25676cf4-93a4-45b6-89c6-44f02e491b92 --></p>
<p>When we put this altogether, we can produce weighted prediction of the Hottest 100 based on either gender, state or both.</p>
<p><!-- metabase-replacement:start 56e1e6e7-66fa-4351-a057-9a2002225c2b --><br />
<iframe src="https://static.pub.jasongi.com/metabase-replacement/pages/56e1e6e7-66fa-4351-a057-9a2002225c2b.html?v=20260321-173940" title="Metabase replacement 56e1e6e7-66fa-4351-a057-9a2002225c2b" loading="lazy" style="width:100%;height:min(1400px,80vh);border:0;display:block;" referrerpolicy="strict-origin-when-cross-origin"></iframe><br />
<!-- metabase-replacement:end 56e1e6e7-66fa-4351-a057-9a2002225c2b --></p>
<p>This doesn&#8217;t affect the top songs but you can see ones with a particular bias (e.g Mallrat, which is popular with feminine names) shoots up.</p>
<p>This year&#8217;s Hottest 100 is set to be a close one. If you think you&#8217;re better at predicting these things, <a href="https://jasongi.com/100-toasty-tofus-hottest-100-predictor/triple-j-hottest-100-prediction-tracker-submission/">submit your prediction here</a> and then <a href="https://jasongi.com/100-toasty-tofus-prediction-leaderboard-2018/">watch it count down here</a>.</p>
<p>The post <a href="https://jasongi.com/2019/01/20/100-toasty-tofus-2018-edition/">100 Toasty Tofu(s) 2018 Edition</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2019/01/20/100-toasty-tofus-2018-edition/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3396</post-id>	</item>
		<item>
		<title>Aussie Broadband CVC Archive</title>
		<link>https://jasongi.com/2018/04/08/aussie-broadband-cvc-archive/</link>
					<comments>https://jasongi.com/2018/04/08/aussie-broadband-cvc-archive/#respond</comments>
		
		<dc:creator><![CDATA[jasongi]]></dc:creator>
		<pubDate>Sun, 08 Apr 2018 05:27:45 +0000</pubDate>
				<category><![CDATA[Internet]]></category>
		<guid isPermaLink="false">http://jasongi.com/?p=3143</guid>

					<description><![CDATA[<p>Aussie Broadband is a great NBN internet provider. They are the only one that posts daily CVC Utilization graphs which are the only real way you can see if you&#8217;re going to get peak time congestion. After suffering congestion under other ISPs I moved to Aussie and haven&#8217;t had any speed slowdown Unfortunately for whatever &#8230; <a href="https://jasongi.com/2018/04/08/aussie-broadband-cvc-archive/" class="more-link">Continue reading<span class="screen-reader-text"> "Aussie Broadband CVC Archive"</span></a></p>
<p>The post <a href="https://jasongi.com/2018/04/08/aussie-broadband-cvc-archive/">Aussie Broadband CVC Archive</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://www.aussiebroadband.com.au/nbn-signup/?rc=1304153">Aussie Broadband</a> is a great NBN internet provider. They are the only one that posts <a href="https://www.aussiebroadband.com.au/network-centre/">daily CVC Utilization</a> graphs which are the only real way you can see if you&#8217;re going to get peak time congestion. After suffering congestion under other ISPs I moved to Aussie and haven&#8217;t had any speed slowdown</p>
<p>Unfortunately for whatever reason they don&#8217;t offer historic CVC data, they only display the previous day&#8217;s, I&#8217;ve kindly started backing it up so that Aussie users can see historic CVC data. All this data belongs to ABB and I take no responsibility for its accuracy. But seriously, they are great and you should <a href="https://www.aussiebroadband.com.au/nbn-signup/?rc=1304153">switch to them if you can</a>.</p>
<p><a href="https://jasongi.com/abb-cvc-archive/">See the archive here</a>.</p>
<p>The post <a href="https://jasongi.com/2018/04/08/aussie-broadband-cvc-archive/">Aussie Broadband CVC Archive</a> appeared first on <a href="https://jasongi.com">JasonGi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jasongi.com/2018/04/08/aussie-broadband-cvc-archive/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3143</post-id>	</item>
	</channel>
</rss>
