<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Jason Wang on Medium]]></title>
        <description><![CDATA[Stories by Jason Wang on Medium]]></description>
        <link>https://medium.com/@jasonwang.public?source=rss-fb2b7847cb36------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Stories by Jason Wang on Medium</title>
            <link>https://medium.com/@jasonwang.public?source=rss-fb2b7847cb36------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 02:24:53 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@jasonwang.public/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Bar chart race]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@jasonwang.public/bar-chart-race-4e499cda571b?source=rss-fb2b7847cb36------2"><img src="https://cdn-images-1.medium.com/max/840/0*-5QKGVy7vsA8o38y.png" width="840"></a></p><p class="medium-feed-snippet">I&#x2019;ve seen a lot of impressive animated bar charts(i.e. Bar Chart Race) and was wondering how they were created. After extensive research&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@jasonwang.public/bar-chart-race-4e499cda571b?source=rss-fb2b7847cb36------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@jasonwang.public/bar-chart-race-4e499cda571b?source=rss-fb2b7847cb36------2</link>
            <guid isPermaLink="false">https://medium.com/p/4e499cda571b</guid>
            <category><![CDATA[visualization]]></category>
            <category><![CDATA[tableau]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[ffmpeg]]></category>
            <category><![CDATA[free-bar-chart-race]]></category>
            <dc:creator><![CDATA[Jason Wang]]></dc:creator>
            <pubDate>Sun, 17 Mar 2024 07:02:12 GMT</pubDate>
            <atom:updated>2024-03-17T07:14:55.832Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Personal reflection on Google Adsense]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-snippet">In this article, I will share my journey with Google Adsense. There are a few lessons learned and hopefully this article can give you some&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@jasonwang.public/personal-reflection-on-google-adsense-7e27e9950ec7?source=rss-fb2b7847cb36------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@jasonwang.public/personal-reflection-on-google-adsense-7e27e9950ec7?source=rss-fb2b7847cb36------2</link>
            <guid isPermaLink="false">https://medium.com/p/7e27e9950ec7</guid>
            <category><![CDATA[making-money]]></category>
            <category><![CDATA[blogging]]></category>
            <category><![CDATA[adsense]]></category>
            <category><![CDATA[personal-reflection]]></category>
            <category><![CDATA[making-money-online]]></category>
            <dc:creator><![CDATA[Jason Wang]]></dc:creator>
            <pubDate>Wed, 06 Mar 2024 11:41:36 GMT</pubDate>
            <atom:updated>2024-03-06T11:41:36.725Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Free VPN server setup]]></title>
            <link>https://medium.com/@jasonwang.public/free-vpn-server-setup-9fbfd5198b80?source=rss-fb2b7847cb36------2</link>
            <guid isPermaLink="false">https://medium.com/p/9fbfd5198b80</guid>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[vpn-server]]></category>
            <category><![CDATA[free-app-development]]></category>
            <dc:creator><![CDATA[Jason Wang]]></dc:creator>
            <pubDate>Wed, 06 Mar 2024 10:46:18 GMT</pubDate>
            <atom:updated>2024-03-06T10:46:18.910Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><strong>I recently posted on how to host WordPress for free using Oracle VM, this is a follow-up post to show how to run a VPN server on the same machine.</strong></blockquote><p>The easiest is to follow Oracle’s official post “<a href="https://blogs.oracle.com/developers/post/launching-your-own-free-private-vpn-in-the-oracle-cloud"><strong>Launching Your Own Free Private VPN In The Oracle Cloud</strong></a>“, which uses a pre-built OpenVPN image from the Oracle Cloud Marketplace. The image offers 2 free VPN connections bundled with <strong>OpenVPN Access Server</strong>(A web admin panel to manage users, a separate product offered by OpenVPN).</p><p>The above solution works fine if you plan to run the VPN service on a dedicated VM instance and happy to have 2 free users; For me, they are too restrictive so I went with another solution, i.e. run the server without Access Server and create user certificates on demand.</p><p>The steps to set up OpenVPN server and configure certificate and iptables are quite complex, fortunately I found a script that helps automate most of the parts. Below are the steps:</p><ol><li>Github repo: <a href="https://github.com/Nyr/openvpn-install">https://github.com/Nyr/openvpn-install</a> and follow its prompts. This is a <a href="https://www.cyberciti.biz/faq/ubuntu-22-04-lts-set-up-openvpn-server-in-5-minutes/">good article</a> on some details about this script.</li><li>The script asks your VM ip address and configures server’s CA, server key and certificate as well as clients’ key and certificates. After you finish your first client, just run the script again to add other clients. If you’re interested in all detailed steps it does, refer to <a href="https://ubuntu.com/server/docs/service-openvpn">this post</a></li><li>You will also need to configure Oracle’s network to allow ingress on UDP 1194</li><li>The script will package an ovpn file that you can import on any OpenVPN client(PC, Apple, Android)</li><li>For some reason, I had to add the following two entries in the client.opvn file so that my client can use the Google’s DNS 8.8.8.8</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/433/0*YImV7GW5KUdrwOtJ.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9fbfd5198b80" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Free VPS for WordPress]]></title>
            <link>https://medium.com/@jasonwang.public/free-vps-for-wordpress-6fbd11dfd7d9?source=rss-fb2b7847cb36------2</link>
            <guid isPermaLink="false">https://medium.com/p/6fbd11dfd7d9</guid>
            <category><![CDATA[hestia]]></category>
            <category><![CDATA[free-vps-hosting]]></category>
            <category><![CDATA[wordpress]]></category>
            <category><![CDATA[oracle-cloud]]></category>
            <dc:creator><![CDATA[Jason Wang]]></dc:creator>
            <pubDate>Mon, 10 Jul 2023 11:23:08 GMT</pubDate>
            <atom:updated>2023-07-10T11:23:08.199Z</atom:updated>
            <content:encoded><![CDATA[<p>I was a small blogger so never had the idea to move on to a “Pro” WordPress hosting plan; however I was constantly approached by my hosting provider saying “my site exceeds their resource limit”. I felt pushed that it seemed I had to move to a much more expensive hosting plan.</p><p>Luckily I found Oracle Cloud is providing Arm-based A1 4-cores CPU + 24G memory on its “always free tier”, this seems irresistible so a journey started!</p><p>Provisioning a free VM on Oracle Cloud was very easy, in fact during my try, I created, destroyed, recreated several VMs, all went smoothly within short period of time, a great thanks to Oracle here.</p><p>I spent about two days and at the end, moved this blog site to a much faster dedicated VM, plus a fully functioning email server(which was always problematic when the site was with my old hosting provider). Very happy for less money (only need to pay for domain registration) and lighting speed.</p><p>Below are my notes for my work and I encourage everyone like me to consider this option.</p><ul><li><strong>Provision a free tier VM</strong> at <a href="https://www.oracle.com/au/cloud/free/">Oracle Cloud</a></li><li><a href="https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/creatingkeys.htm"><strong>SSH Key configuration</strong></a> <a href="https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/creatingkeys.htm">https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/creatingkeys.htm</a></li><li><strong>Configure its network</strong> to allow ingress for port 80, 8083(used by Hestiacp), 443, 25,110,143,465,587, 993,995 (for email)</li><li>Any question from the above two steps, refer to this <a href="https://docs.oracle.com/en-us/iaas/developer-tutorials/tutorials/wp-on-ubuntu/01-summary.htm">article https://docs.oracle.com/en-us/iaas/developer-tutorials/tutorials/wp-on-ubuntu/01-summary.htm</a></li><li><strong>Configure you DNS entries</strong> on your Domain Provider. Make sure the following entries are added. hcp.aus800.com.au is the Hestiacp console</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/745/1*Q_PCEQKOHGPdVoAWngKaug.png" /></figure><ul><li><strong>Install </strong><a href="https://www.hestiacp.com/"><strong>Hestia</strong> </a>This is a tool similar to cPanel which helps you configure domains, email and install WordPress</li><li>Configure domain</li><li>This is the <a href="https://www.youtube.com/watch?v=EnPLxt6gcVs">video </a>I referred the most</li><li>bash hst-install.sh --interactive no --email help@aus800.com.au --password YourPassWordHere --hostname hcp.aus800.com.au -f</li><li>v-add-letsencrypt-host</li><li><strong>Migrate WordPress site from my old provider to this VM</strong> After the above, you should have the new WordPress running on your new VM. I used <a href="https://wordpress.org/plugins/updraftplus/">UpdraftPlus</a> to backup my old site and restore to the new site. My existing All-in-One WP Migration plug-in requires paid version to handle content size &gt; 50M but UpdraftPlus offers free for unlimited file size. In my opinion, UpdraftPlus is worth buying as it offers a lot of backup strategies if you want to protect your content.</li><li><strong>Configure Email</strong>, including SMTP. I mainly following <a href="https://www.youtube.com/watch?v=BK7qyPa-VmI">this video</a></li><li>Note SMTP relay service is needed as otherwise you won’t be able to send emails to outside world from the VM. I used Sendinblue as suggested in the above video.</li><li>Also in order to receive emails, you need to enable SMTP port 25 as Ingress in firewall setting as otherwise outside mail servers won’t be able to connect with your mail server.</li></ul><p>There is <a href="https://www.youtube.com/watch?v=C0nxOZBo6Dw">another good video</a> for configuring xrdp so that you can use Microsoft Remote Desktop to log into the VM. It covers network trouble shooting steps which are quite useful. I didn’t enable xrdp as hosting WordPress doesn’t need it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6fbd11dfd7d9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a PostgreSQL docker container with debugger (pldebugger)]]></title>
            <link>https://medium.com/@jasonwang.public/building-a-postgresql-docker-container-with-debugger-pldebugger-da805bf162b7?source=rss-fb2b7847cb36------2</link>
            <guid isPermaLink="false">https://medium.com/p/da805bf162b7</guid>
            <category><![CDATA[pldebugger]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[debugger]]></category>
            <dc:creator><![CDATA[Jason Wang]]></dc:creator>
            <pubDate>Mon, 10 Jul 2023 11:03:43 GMT</pubDate>
            <atom:updated>2023-07-10T11:17:35.123Z</atom:updated>
            <content:encoded><![CDATA[<p>I wanted to enable debugging in PostgreSQL Docker container so that it can be used together with <a href="https://www.pgadmin.org/">PGAdmin4</a>.</p><p>The challenge is it is not enabled by default in any of available Docker images; I also tried to recompile from source but failed with different kinds of errors.</p><p>Just for information, the debugger has its git site where you can find all source code here: <a href="https://git.postgresql.org/gitweb/?p=pldebugger.git;a=summary">https://git.postgresql.org/gitweb/?p=pldebugger.git;a=summary</a></p><p>At the end I found a simple solution because the debugger extension is already in Debian’s package repository (<a href="https://packages.debian.org/sid/amd64/postgresql-11-pldebugger/download">https://packages.debian.org/sid/amd64/postgresql-11-pldebugger/download</a>) , all we need to do is to use <a href="https://hub.docker.com/_/postgres/">official PostgreSQL Docker image</a> and then install this extension.</p><p>Below is my docker-compose.yml</p><pre>version: &#39;3&#39;<br>services: <br>  app: <br>    build: <br>        context: . <br>        dockerfile: docker/php/Dockerfile <br>    image: ci-docker <br>    container_name: tarwis_crm_container <br>    ports: <br>        - &quot;8080:80&quot;<br>    volumes: <br>       #bind mount app to container folder /var/www/tarwis <br>        - ./app:/var/www/tarwis <br>    #by defining the same &quot;user defined network&quot;, all containers can talk to each other <br>    #do NOT use link as it may not be supported in future <br>    networks: <br>      - appnet <br>    environment: <br>      #env variables, used by your application<br>      DB_HOSTNAME: postgres <br>      #this points to the postgres db&#39;s name <br>      DB_DATABASE: yourDBName <br>      DB_PORT: 5432 <br>      DB_USERNAME: yourUserName <br>      DB_PASSWORD: yourPassword<br>  <br><br>  postgres: <br>    build: <br>        context: . dockerfile: docker/postgres/Dockerfile<br>    image: postgres <br>    #when container_name is specified, as <br>    #container name is always unique you cannot scale a service beyond 1 container <br>    container_name: pg_container <br>    restart: always <br>    environment: <br>        #specify db name <br>        POSTGRES_DB: yourDBName <br>        #default is postgres but custom it here for clarity <br>        POSTGRES_USER: postgres <br>        POSTGRES_PASSWORD: hardToGuess <br>    ports: <br>      - &quot;15432:5432&quot; <br>    #by defining the same &quot;user defined network&quot;, all containers can talk to each other <br>    networks: <br>      - appnet <br><br>#definition of all networks<br>networks: <br>  #with default settings (which is a load-balanced overlay network) <br>  appnet: <br><br>#no need of volumes</pre><p>Below is my Dockerfile for the PostgreSQL image, with debugger installed at the end. ( My link above is for PG V11 but V10 exists as well, you can simply change environment variable ENV PG_MAJOR 10 to ENV PG_MAJOR 11)</p><pre>FROM postgres:10.6 <br><br>MAINTAINER YourName@Tarwis Tech <br><br>ENV PG_MAJOR 10 <br>ENV PG_FULL 10.6 <br><br># Install the postgresql debugger<br>RUN apt-get update \ &amp;&amp; apt-get install -y --no-install-recommends \ postgresql-$PG_MAJOR-pldebugger <br><br>EXPOSE 5432 <br><br>#run below in DB to enable the extension <br>#CREATE EXTENSION pldbgapi; <br><br>#reference: <br>#https://hub.docker.com/r/codejuggle/postgresql/~/dockerfile/ <br>#https://docs.docker.com/engine/docker-overview/#docker-registries <br>#https://github.com/docker-library/postgres/blob/2d40c8a89bfc888fb99463e919ac748cd54c0fcc/11/Dockerfile <br>#https://gist.github.com/sethbergman/1a34dcf925badee366b46b7c52526701 <br>#https://github.com/sameersbn/docker-postgresql#enabling-extensions <br>#https://github.com/docker-library/postgres/blob/f5a7e06b42aa14cad6edfaeefa676a5312d27618/10/Dockerfile</pre><p>Run the following commands to build and bring up the containers</p><pre>docker-compose build <br>docker-compose up</pre><p>Then login to the PostgreSQL instance using PGAdmin, on port 15432(this is re-directed by Docker itself)</p><p>In the DB you’re working in, install the extension</p><pre>CREATE EXTENSION pldbgapi;</pre><p>Done!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da805bf162b7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Scan your bank statements using those free apps]]></title>
            <link>https://medium.com/@jasonwang.public/scan-your-bank-statements-using-those-free-apps-2956f5e1985a?source=rss-fb2b7847cb36------2</link>
            <guid isPermaLink="false">https://medium.com/p/2956f5e1985a</guid>
            <category><![CDATA[paperless]]></category>
            <category><![CDATA[app-review]]></category>
            <category><![CDATA[free-apps]]></category>
            <category><![CDATA[digitizing]]></category>
            <category><![CDATA[bank-statement]]></category>
            <dc:creator><![CDATA[Jason Wang]]></dc:creator>
            <pubDate>Thu, 05 May 2022 06:54:12 GMT</pubDate>
            <atom:updated>2024-03-06T10:39:20.111Z</atom:updated>
            <content:encoded><![CDATA[<p>In my last post of “ <a href="https://aus800.com.au/digitize-your-paper-invoices-and-documents/">digitizing your paper invoices and documents</a>”, I provided step by step instructions on how to install <a href="https://github.com/paperless-ngx/paperless-ngx">Paperless-NGX</a>. I’ve been using this tool to archive my papers, bank statements, receipts, books, whatsoever ever since, it’s an exciting journey that totally transformed my storage of those files.</p><p>I also installed an mobile app <strong>Paperless</strong> on my phone so in most cases, I just use my phone to take a photo and upload it into the backend Paperless-NGX, which converts the photo into PDF and does the OCR automatically.</p><p>The mobile app Paperless is not very user friendly as in most cases, I have to manually crop photos and it allows one page only; I recently discovered I can use Microsoft Lens to take photos, save them into PDF, then <strong>share</strong> with Paperless; This completely changed my user experience as now storing files into your computer is just a few clicks away!</p><p>Great thanks to Microsoft Lens, app Paperless, and Paperless-NGX, they just made electronic paper archiving easy and pleasant!</p><p>Scan the below QR code to read</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*hSp3UtZZe7URU9DF.png" /></figure><p>Scan your bank statements using those free apps</p><p><em>Originally published at </em><a href="https://aus800.com.au/scan-your-bank-statements-using-those-free-apps/"><em>https://aus800.com.au</em></a><em> on May 5, 2022.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2956f5e1985a" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>