<?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"><channel><title><![CDATA[The Divine Forge]]></title><description><![CDATA[Tinkering at the Forge: Exploring Tech Trends, Cloud Computing, Linux Foundation Insights, and Game Development. A journal of continuous learning and discoverie]]></description><link>https://blog.divineforge.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1735726398279/68d3f925-faf5-4ba7-b633-5f24577b0c9c.png</url><title>The Divine Forge</title><link>https://blog.divineforge.com</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 09:09:17 GMT</lastBuildDate><atom:link href="https://blog.divineforge.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[December Issue 2024.1228]]></title><description><![CDATA[The Windsurf Editor
One biggest differences of using Windsurf Editor, is that’s like having an Agent, a smart assistant working together with a Good understanding of the context. What’s more, that’s also having the capability to make suggestions, pro...]]></description><link>https://blog.divineforge.com/december-issue-20241228</link><guid isPermaLink="true">https://blog.divineforge.com/december-issue-20241228</guid><category><![CDATA[Visual Studio Code]]></category><category><![CDATA[copilot AI]]></category><category><![CDATA[realtime]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Fri, 27 Dec 2024 16:00:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-the-windsurf-editor">The Windsurf Editor</h2>
<p>One biggest differences of using Windsurf Editor, is that’s like having an Agent, a smart assistant working together with a Good understanding of the context. What’s more, that’s also having the capability to make suggestions, prompt one to review, and execute the command. It can create the code files, and run the instruction. In my test, the ‘Cascade Agent’ in the Windsurf IDE was able to examine my Linux OS condition, via the commands in the terminal, then make suggestions on how to fix it. May explore here at: <a target="_blank" href="https://codeium.com/windsurf">https://codeium.com/windsurf</a> , but since I’m just testing how good is it, I couldn’t be 100% sure about its pricing, is it the only way? The downside is that having to use another editor other than vscode, it’s kinda contradicting my own preferred workflow. I shall continue to observe this, to see how viable it is, and what’s in it for me.</p>
<h3 id="heading-github-copilot-free-tier-amp-continuedev">GitHub Copilot Free Tier &amp; Continue.dev</h3>
<p>I came to aware that GitHub pilot is now offering free tier, at giving access to 2,000 code completions and 50 chat messages per month, at the same time, inspired by my other colleague, they have studied the ‘Continue.dev’ extension that would work nicely on vscode, and able to connect to own LLM, which maybe an interesting solutions, to build something that work for ourselves.</p>
<p>So aside from the GitHub copilot, the other thing, where I find it works well with my workflow would be the Codeium extension for vscode. With generous FREE tier for individual.</p>
<h2 id="heading-real-time-synchronisation-framework">Real-Time Synchronisation Framework</h2>
<p>Then I came across this real-time synchronisation framework which offers software / sdk / as a service, that is like an upstream service provider making the development easier. At the same time, which also reminds me of the Multiplayer server library, Colyseus (see here: <a target="_blank" href="https://colyseus.io/framework/">https://colyseus.io/framework/</a>) that’s targetting the game development scene.</p>
<p>The ‘Velt’ real-time synchronization framework comes from this article: <a target="_blank" href="https://dev.to/astrodevil/build-real-time-presence-features-like-figma-and-google-docs-in-your-app-in-minutes-1lae">https://dev.to/astrodevil/build-real-time-presence-features-like-figma-and-google-docs-in-your-app-in-minutes-1lae</a></p>
<p>and its official website here: <a target="_blank" href="https://velt.dev/">https://velt.dev/</a></p>
<p>some little and simple demo on their website shows a very creative idea of how things can be. The only caveat is about the pricing whether we’re truly comfortable with using another SaaS or PaaS-based deployment, by having the SDK into our code, and eventually having the subscription… that depends on the context of the software of what we’re building. This does have a generous free tier though.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1735555350623/59a75614-3996-4e5f-a2be-b6a34387df6b.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-azerothcore-wow-simulator">AzerothCore WoW Simulator</h2>
<p>Of all the years, there is some community building and supporting the private world of Warcraft server, <a target="_blank" href="https://github.com/azerothcore">https://github.com/azerothcore</a> ; it’s one of the projects that was inspired by the Massive Network Game Object Server Suite (<abbr>MaNGOS</abbr> for short) included as a single project for World of Warcraft. <a target="_blank" href="https://www.getmangos.eu/">https://www.getmangos.eu/</a> ; Out of curiosity, I tried a deployment of the AzerothCore WoTLK version, and decided to go with Portainer, to run the containerised image. It wasn’t entirely intuitive, and has some caveats to bring up the realm (login server) and the game server; and also noticed a minor discrepancy unable to create an account, where I have to ask for AI to verify where it goes wrong, and suggest some minor database column type changes. hmm. left to ponder. Nonetheless, eventually, I can get the older game client to work with the self-hosted server emulation, allowing some room for future experimentation.</p>
]]></content:encoded></item><item><title><![CDATA[December Issue 2024.1221]]></title><description><![CDATA[this week reading, and compilation of the news that I come across
I’ve been thinking how to get macOS on Linux
I love running Linux, and have been a fan of Fedora Linux in the year of 2024, at the same time, I missed the goodness from macOS which has...]]></description><link>https://blog.divineforge.com/december-issue-20241221</link><guid isPermaLink="true">https://blog.divineforge.com/december-issue-20241221</guid><category><![CDATA[scylladb]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Go Language]]></category><category><![CDATA[golang]]></category><category><![CDATA[macOS]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sat, 21 Dec 2024 03:52:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735723708861/bba4bcf8-12d7-4010-8f23-1b56670a0a7c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>this week reading, and compilation of the news that I come across</p>
<h1 id="heading-ive-been-thinking-how-to-get-macos-on-linux">I’ve been thinking how to get macOS on Linux</h1>
<p>I love running Linux, and have been a fan of Fedora Linux in the year of 2024, at the same time, I missed the goodness from macOS which has been my daily drivers, for work, code, and learning mostly. Just if there is a method that I could actually make use of macOS over Linux environment… <a target="_blank" href="https://github.com/sickcodes/Docker-OSX">https://github.com/sickcodes/Docker-OSX</a> ; reading this, observing some mild complications, hence recording this for future experimentation. The only downside from macOS / Apple Ecosystem that I really missed only a few; the ‘Password’ (allows shared password, and TOTP generation, which also facilitate sharing amongst family members); then the Notes application perhaps, on certain cases, and maybe freely shared amongst family members, with more advanced formatting, and come as default FREE option (doesn’t have to pay extra for its feature). All the downside about Apple Ecosystem products is that they are into the native experience, native applications, where the web-based experience like iCloud are poorly done. Shall evaluate again the hassle and complexity whether worth running this dockerised macOS.. Good to know at least there is option here.</p>
<h1 id="heading-reading-someones-golang-journey">Reading someone’s Golang Journey</h1>
<p>A casual browsing of learning Go, discover more Gems. I tend to think there a lot to learn when picking up Golang, easily gets into the discovery of its associated ecosystem. Example this one here: <a target="_blank" href="https://dev.to/danielhe4rt/this-is-all-what-ive-learned-about-go-in-two-weeks-1bf2">https://dev.to/danielhe4rt/this-is-all-what-ive-learned-about-go-in-two-weeks-1bf2</a> then from the article, I learnt about ScyllaDB</p>
<h2 id="heading-scylladb">ScyllaDB</h2>
<p>I learn about this assignment related to Golang that works with ScyllaDB (<a target="_blank" href="https://github.com/basementdevs/throttiling-requests-scylladb-go-test">https://github.com/basementdevs/throttiling-requests-scylladb-go-test</a>) which I come to realise about ScyllaDB being one of the NoSQL ; and reading the comparison with MongoDB; based on the Numberly use-cases for 5 years in the production <a target="_blank" href="https://www.scylladb.com/2023/06/13/when-to-use-scylladb-vs-mongodb-lessons-learned-from-5-years-in-production/">https://www.scylladb.com/2023/06/13/when-to-use-scylladb-vs-mongodb-lessons-learned-from-5-years-in-production/</a> ; anyway more to read from here: <a target="_blank" href="https://www.scylladb.com/compare/scylladb-vs-mongodb/">https://www.scylladb.com/compare/scylladb-vs-mongodb/</a></p>
<p>I though that’s interesting to know how to use the database and to learn from others use-cases.</p>
<h1 id="heading-kubernetes-alternatives-openshift-ecs-rancher-docker-compose">Kubernetes alternatives! (OpenShift, ECS, Rancher, Docker Compose)</h1>
<p>I have been thinking how to get started on the Kubernetes, container, and applying those onto the production workload. At times, we really need a real-world use-cases, something that at least serving a solid purpose. This gave me a good read, into comparison of various containerisation, orchestration, and abstraction over the infrastructure. <a target="_blank" href="https://last9.io/blog/kubernetes-alternatives">https://last9.io/blog/kubernetes-alternatives</a></p>
]]></content:encoded></item><item><title><![CDATA[Starting with a Golang journey]]></title><description><![CDATA[Roadmap (how to start)
The first thing that comes to mind is having a structured learning experience. this time instead of going to the classroom, I looked up the roadmap.sh m, I look up the roadmap.sh (https://roadmap.sh/golang)
I decided to start l...]]></description><link>https://blog.divineforge.com/starting-with-a-golang-journey</link><guid isPermaLink="true">https://blog.divineforge.com/starting-with-a-golang-journey</guid><category><![CDATA[golang]]></category><category><![CDATA[Go Language]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Wed, 18 Sep 2024 07:02:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735723778974/c7c35370-9094-4df3-a3ae-6cba8ab92d4f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-roadmap-how-to-start">Roadmap (how to start)</h2>
<p>The first thing that comes to mind is having a structured learning experience. this time instead of going to the classroom, I looked up the roadmap.sh m, I look up the roadmap.sh (<a target="_blank" href="https://roadmap.sh/golang">https://roadmap.sh/golang</a>)</p>
<p>I decided to start learning a few things from the go.dev tutorial here; this is going to be a non-linear learning method, considering it like the open world exploration, random pecking into the Golang as we make demo program, and test writing codes. Hence I directly jump into the intrinsic part of the Golang how to refer to the module, basic error handling, and function, variable declaration. I guess the rest would fall into its place as we start building some mini-application. The quick tour of Golang, help me to understand and appreciate the cleanliness of the language itself. (<a target="_blank" href="https://go.dev/tour/basics/11">https://go.dev/tour/basics/11</a>)</p>
<h2 id="heading-tools-and-editors-what-to-use">Tools and Editors (what to use)</h2>
<ul>
<li><p>thinking of working on the Linux machine, primary choice Fedora Linux, Gnome</p>
</li>
<li><p>tested with GoLand, JetBrains product to observe how it goes. Eventually, I decided that this is kind of a similar experience if one already knows how to customise for the VSCode. Hence I go with Visual Studio Code.</p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726446479622/9fde343a-9e1d-410c-a410-d327a77bd40b.png" alt="The goland IDE experience" class="image--center mx-auto" /></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726641552518/d4e861d7-9b24-4e53-bc78-5f316738995f.png" alt="this is the visual code example" class="image--center mx-auto" /></p>
<p>I have a feeling that JetBrains IDE is getting more and more like Visual Studio code. Perhaps behind the scenes, there is some kind of conspiracy for the cloud-based environment, cloud-native concept? (not sure, “shrug”). Nonetheless, I’m happy with the VS Code for now, given it offers me better flexibility and is kind of pocket-friendly at the moment.</p>
<h2 id="heading-some-ideas-to-build-upon-golang">Some ideas to build upon Golang</h2>
<p>To make use of what Golang could offer, perhaps I could try some CLI, or TUI- terminal user interface, to build something that might be useful for me. Here’s some idea that popped into my mind.</p>
<ul>
<li><p>using Golang to populate a database on MongoDB with some open-source self-hosted solutions information.</p>
</li>
<li><p>build something like a Multi-User Dungeon, in a text-based format?</p>
</li>
<li><p>contribute to the open-source project that’s written in Golang. Kubernetes, microservices related? example one: <a target="_blank" href="https://github.com/zeromicro/go-zero">https://github.com/zeromicro/go-zero</a></p>
</li>
<li><p>study and learn tools in the CNCF Landscape. <a target="_blank" href="https://landscape.cncf.io/">https://landscape.cncf.io/</a></p>
</li>
</ul>
<h2 id="heading-additional-inspiring-content-i-found-as-i-started-on-this-article">Additional Inspiring content I found as I started on this article</h2>
<ul>
<li><p>Golang in the Game Development and operations in RiotGames <a target="_blank" href="https://technology.riotgames.com/news/leveraging-golang-game-development-and-operations">https://technology.riotgames.com/news/leveraging-golang-game-development-and-operations</a></p>
</li>
<li><p>Learning Golang from the FreeCodeCamp resources: <a target="_blank" href="https://www.freecodecamp.org/news/tag/golang/">https://www.freecodecamp.org/news/tag/golang/</a></p>
</li>
<li><p>Why should go for Golang in the next big project: <a target="_blank" href="https://www.scalefocus.com/blog/why-you-should-go-with-go-for-your-next-software-project">https://www.scalefocus.com/blog/why-you-should-go-with-go-for-your-next-software-project</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[The Umbrel  OS for home-lab doer, or self-hoster]]></title><description><![CDATA[this is a short article on the discovery of Umbrel. See more from here: https://umbrel.com/umbrel-home . The key driver is that instead of everything rely on cloud services, and subscriptions, just if we have some spare hardware we could host some wo...]]></description><link>https://blog.divineforge.com/the-umbrel-os-for-home-lab-doer-or-self-hoster</link><guid isPermaLink="true">https://blog.divineforge.com/the-umbrel-os-for-home-lab-doer-or-self-hoster</guid><category><![CDATA[Homelab]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sat, 27 Jul 2024 14:53:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/X_TYa6Nxu2A/upload/d0d082c883c8c2c529423c05c2eaae6d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>this is a short article on the discovery of Umbrel. See more from here: <a target="_blank" href="https://umbrel.com/umbrel-home">https://umbrel.com/umbrel-home</a> . The key driver is that instead of everything rely on cloud services, and subscriptions, just if we have some spare hardware we could host some workload for ourselves, or our family. Doing some private customization to the home. From home media servers, photo sharing, smart home automation, or any self-hosted applications. The key idea is to do something custom tailored to specific use case. As well as an alternative cheap method to study the cloud computing, and hosting knowledge. All these could be useful like added knowledge to contribute back to organizational, enterprise infrastructure planning. Start small, as the entry point.</p>
<h2 id="heading-more-on-umbrel-os-installation-and-offering">More on Umbrel OS Installation and Offering</h2>
<p>articles, YouTube and related resources that I came across:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=QIdj3qwvNF4">https://www.youtube.com/watch?v=QIdj3qwvNF4</a></div>
<p> </p>
<p>I also learnt that Umbrel it comes with its own preconfigured hardware, as well as custom installable media on the Raspberry Pi in the following article: <a target="_blank" href="https://community.umbrel.com/t/how-to-install-umbrel-on-raspberry-pi-5/14787">https://community.umbrel.com/t/how-to-install-umbrel-on-raspberry-pi-5/14787</a></p>
<h2 id="heading-some-other-things-i-learn-from-umbrel-os-appstore-a-curated-list-of-applications">Some other things I learn from Umbrel OS AppStore (a curated list of applications)</h2>
<p><a target="_blank" href="https://apps.umbrel.com/">https://apps.umbrel.com/</a> Even if I have not started to use Umbrel OS some of the applications listed on the App Store may help to reinforce and validate my choice of certain applications to be used in the homelab situation. For example, the home networking, personal VPN, to use the Tailscale. <a target="_blank" href="https://tailscale.com/">https://tailscale.com/</a> which is also listed on the Umbrel App Store. With that information, that's quite helpful for me to further discover many other self-hosted solutions that can be useful for home lab DIY-crafting.</p>
]]></content:encoded></item><item><title><![CDATA[Evolutions of Chess & Computer in My Life]]></title><description><![CDATA[this begins with the days of cardboard box and chessboard, that's how I get to know the existence of chess, and these picture are found from the internet. My original box, already lost to time, wear and tear. I kinda remember at the back of the cover...]]></description><link>https://blog.divineforge.com/evolutions-of-chess-computer-in-my-life</link><guid isPermaLink="true">https://blog.divineforge.com/evolutions-of-chess-computer-in-my-life</guid><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sat, 03 Feb 2024 12:53:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/XNBctyQeN90/upload/da99f9249da240824e73b533b8611110.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>this begins with the days of cardboard box and chessboard, that's how I get to know the existence of chess, and these picture are found from the internet. My original box, already lost to time, wear and tear. I kinda remember at the back of the cover there is some instructions explaining how to play the pieces.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705664837520/09fa9ab8-2384-43ef-b220-719726849da4.jpeg?auto=compress,format&amp;format=webp" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1706963378509/ee1b09c1-597c-4e0c-ad31-be5987eb6e5e.jpeg" alt class="image--center mx-auto" /></p>
<p>Then the discovery from Microsoft Entertainment Pack 4*, back then on Windows 95, or windows 98. From there, I kinda fascinated by the 'move list' I wasn't sure what was that then, and also discovering the opening book thingy, again, I don't have clue at that age, and English was something I don't understand much then.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705664829342/db7b6294-6737-4565-b04d-1ce5333635bc.jpeg?auto=compress,format&amp;format=webp" alt /></p>
<p>Some time later, when there is change of computer, trying to find back what's the original chess program above, to no avail, there landed on this Classic Board games, which come in the form of CD installer. I remembered that in order to have full experience, music sound track, then I have to put in the CD, otherwise, the game itself is still playable. That's .. a totally simplified chess experience, it does help me to discover other things like, Shogi.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1706963534375/da865afc-db08-4be3-83f5-3956ecb39e5f.png" alt class="image--center mx-auto" /></p>
<p>Some time later, when the Internet Era comes, I finally came across the 'FreeChess.org', where nowadays there is finally a modern only chess interface, a web app. 'freechess.club' . This was one of the client-server kind of chess games, with a lot 'chat channels', and get to watch some tutorials.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705664833685/6e3f7879-362d-41cd-8a0a-f9d8645d2fba.jpeg?auto=compress,format&amp;format=webp" alt /></p>
<p>fast-forwards many years later like 2023, now we have lichess.org, things are lot more mature, and we have sophisticated chess engine.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705664836170/ab1fc13c-62fd-4bd2-b768-e4d18a0c1d46.jpeg?auto=compress,format&amp;format=webp" alt /></p>
<p>thus, a long journey from a simple game on physical chessboard, at some points I substitute the paper one with wooden board (cake board), that last a long while during my teenage time, and now finally to the digital age. A long and interesting journey in chess. Much have changed in the landscape of learning to play chess.</p>
]]></content:encoded></item><item><title><![CDATA[Into the Homelab computing]]></title><description><![CDATA[A homelab is a personal laboratory setup at home for the purpose of learning and experimenting with technology. It typically consists of a computer, networking equipment, and other components such as storage devices, servers, and software. Homelabs c...]]></description><link>https://blog.divineforge.com/into-the-homelab-computing</link><guid isPermaLink="true">https://blog.divineforge.com/into-the-homelab-computing</guid><category><![CDATA[Homelab]]></category><category><![CDATA[Linux]]></category><category><![CDATA[homebridge]]></category><category><![CDATA[Home Assistant]]></category><category><![CDATA[pm2]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sun, 03 Dec 2023 13:11:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ISG-rUel0Uw/upload/76c5b1267ce1020874731eb41f2f2779.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A homelab is a personal laboratory setup at home for the purpose of learning and experimenting with technology. It typically consists of a computer, networking equipment, and other components such as storage devices, servers, and software. Homelabs can be used to learn about different technologies, develop applications, or even host websites.</p>
<h2 id="heading-tech-ingredients-that-i-begin-with">Tech Ingredients that I begin with</h2>
<h3 id="heading-fedora-linux-amp-the-ecosystem-pm2">Fedora, Linux &amp; the ecosystem, PM2</h3>
<p><img src="https://fedoraproject.org/assets/images/server-logo-dark.png" alt class="image--center mx-auto" /></p>
<p>One of my favourite ingredients for a home lab is <a target="_blank" href="https://fedoraproject.org/server/download">Fedora Linux Server.</a> Fedora is an open-source operating system that provides a secure and stable platform for running applications. It also includes a wide range of tools for managing and configuring systems. I used to think that I may need a Linux with Desktop; however macOS is my daily driver, for the servers, the command line version remains much more powerful and manageable in most cases. Thus far, I'm using local SSH with public key authentication/along with password-based authentication to manage it over home wifi network.</p>
<p>The <a target="_blank" href="https://cockpit-project.org/"><strong>Cockpit from Fedora Linux</strong></a> is also a great ingredient for a home lab. The Cockpit is a web-based interface for managing and monitoring systems. It provides an easy way to manage and monitor multiple systems from a single interface. Once if we have installed the Fedora Linux Server edition, we could then enable the Cockpit console, then it's available at the local server-IP and port. Having it offers easier solutions for me to configure &amp; monitor the Linux server box.</p>
<p>Bonus part, <a target="_blank" href="https://pm2.keymetrics.io/">PM2 Process Manager</a> would be an effective tool to run some nodeJS services &amp; processes. It helps to keep applications running smoothly and efficiently.</p>
<h3 id="heading-docker-docker-compose">Docker, Docker Compose</h3>
<p><img src="https://d1q6f0aelx0por.cloudfront.net/product-logos/library-docker-logo.png" alt class="image--center mx-auto" /></p>
<p>Docker Runtime and Docker Compose are great ingredients for a home lab. Docker Runtime is a container runtime environment that allows users to run applications in isolated containers. Docker Compose is a tool for defining and running multi-container applications. For the subsequent ingredients, I realise it's very convenient to run them via Docker Compose, then enable the root-ful docker, as well as add the primary admin user in the OS into the docker group.. there is some long technical configuration, just at the tradeoff of certain security level, if one isn't exposing the home network to the internet, having the root-ful docker address many ports, firewall configuration, and mapping issues from the services to devices in the home network.</p>
<h3 id="heading-home-assistant">Home Assistant</h3>
<p><img src="https://www.home-assistant.io/images/home-assistant-logo.svg" alt class="image--center mx-auto" /></p>
<p>For home lab, I'm testing out with <a target="_blank" href="https://www.home-assistant.io/">Home Assistant</a>. Home Assistant is an open-source home automation platform that allows users to control their home from anywhere. It supports a wide range of devices and services, including lights, switches, thermostats, and more. The step before these, I have invested in replacing conventional switches mostly with Tuya-compatible IOT smart switches; and configuring them with the official Tuya app. Check out this <a target="_blank" href="https://developer.tuya.com/en/">Tuya Developer platform</a>, that would be part of the requirement when we're integrating Tuya devices into the Home Assistant system.</p>
<h3 id="heading-home-bridge">Home Bridge</h3>
<p><img src="https://t0.gstatic.com/images?q=tbn:ANd9GcTivBG6IGDCaiRFheuANHhqjtFdwnaZkoZlZzxoW2bd8Edh3JId" alt class="image--center mx-auto" /></p>
<p>When I was testing the integration with the Apple Homekit ecosystem; I came to discover that <a target="_blank" href="https://homebridge.io/">Home Bridge</a> is another great ingredient for a home lab; Home Bridge is an open-source bridge between home automation devices and Apple's HomeKit. This allows users to control their home automation devices using Siri voice commands.</p>
<h2 id="heading-conclusions">Conclusions</h2>
<p>In conclusion, our homelab, underpinned by Fedora Linux Server and empowered by the orchestration of Home Assistant, Homebridge, and Docker, is a triumph of modern home automation and personal computing. It epitomizes the seamless integration of various technologies, providing a flexible, secure, and scalable smart home environment. This project has not only enriched our technical prowess but also granted us a highly customized ecosystem that caters to our unique digital lifestyle. The journey of building this lab reaffirms the invaluable potential of open-source solutions in crafting an interconnected, automated home infrastructure poised for future expansions and innovations.</p>
]]></content:encoded></item><item><title><![CDATA[of Defender, Dashing into Deeper Dart with Mixin]]></title><description><![CDATA[Context
Today let's do some experiment with mixin to see how this syntax and coding approach, helps to make something intuitive in coding.
I go with the context of a Warrior class, with Sword and Shield to perform a defender role. Let's examine the f...]]></description><link>https://blog.divineforge.com/of-defender-dashing-into-deeper-dart-with-mixin</link><guid isPermaLink="true">https://blog.divineforge.com/of-defender-dashing-into-deeper-dart-with-mixin</guid><category><![CDATA[Dart]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Fri, 13 Jan 2023 15:42:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/LbJ_jSAepKM/upload/2fc629ba171ee0bb718acfba5cb68c8e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-context">Context</h2>
<p>Today let's do some experiment with <code>mixin</code> to see how this syntax and coding approach, helps to make something intuitive in coding.</p>
<p>I go with the context of a Warrior class, with <code>Sword</code> and <code>Shield</code> to perform a defender role. Let's examine the following codes.</p>
<pre><code class="lang-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SwordMixin</span> </span>{
  <span class="hljs-keyword">void</span> wieldSword() {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Wielding sword"</span>);
  }
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ShieldMixin</span> </span>{
  <span class="hljs-keyword">void</span> holdShield() {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Holding shield"</span>);
  }
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Warrior</span> <span class="hljs-title">with</span> <span class="hljs-title">SwordMixin</span>, <span class="hljs-title">ShieldMixin</span> </span>{
  <span class="hljs-keyword">void</span> attack() {
    wieldSword();
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Attacking enemy"</span>);
  }

  <span class="hljs-keyword">void</span> defend() {
    holdShield();
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Defending against enemy"</span>);
  }
}

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> warrior = Warrior();
  warrior.attack(); <span class="hljs-comment">// Output: "Wielding sword", "Attacking enemy"</span>
  warrior.defend(); <span class="hljs-comment">// Output: "Holding shield", "Defending against enemy"</span>
</code></pre>
<h2 id="heading-bonus">Bonus</h2>
<p>How about a slightly interesting example from the Archer class. Let's examine the following relationship, with Bow, arrow and quiver.</p>
<pre><code class="lang-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">QuiverMixin</span> </span>{
  <span class="hljs-built_in">int</span> arrowCount = <span class="hljs-number">10</span>;
  <span class="hljs-keyword">void</span> reloadArrows() {
    arrowCount += <span class="hljs-number">10</span>;
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Reloading arrows. Arrow count: <span class="hljs-subst">$arrowCount</span>"</span>);
  }
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BowAndArrowMixin</span> </span>{
  <span class="hljs-keyword">void</span> drawBow() {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Drawing bow"</span>);
  }
  <span class="hljs-keyword">void</span> fireArrow() {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Firing arrow"</span>);
  }
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Archer</span> <span class="hljs-title">with</span> <span class="hljs-title">QuiverMixin</span>, <span class="hljs-title">BowAndArrowMixin</span> </span>{
  <span class="hljs-keyword">void</span> attack() {
    <span class="hljs-keyword">if</span>(arrowCount &gt; <span class="hljs-number">0</span>) {
      drawBow();
      fireArrow();
      arrowCount--;
      <span class="hljs-built_in">print</span>(<span class="hljs-string">"Remaining arrows: <span class="hljs-subst">$arrowCount</span>"</span>);
    } <span class="hljs-keyword">else</span> {
      reloadArrows();
    }
  }
}

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> archer = Archer();
  archer.attack(); <span class="hljs-comment">// Output: "Drawing bow", "Firing arrow", "Remaining arrows: 9"</span>
  archer.attack(); <span class="hljs-comment">// Output: "Drawing bow", "Firing arrow",</span>
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>That summarized the introduction to <code>mixin</code> in dart, the demonstrate the intuitiveness adding "tools" to the main class.</p>
]]></content:encoded></item><item><title><![CDATA[Dash into Dart]]></title><description><![CDATA[Forewords: The core idea here, shall we reflect on the foundation of programming language, before the leap into the Flutter framework. Let's take a look at the primitive programming build blocks from the variables, and operators, to Type. Many credit...]]></description><link>https://blog.divineforge.com/dash-into-dart</link><guid isPermaLink="true">https://blog.divineforge.com/dash-into-dart</guid><category><![CDATA[Flutter]]></category><category><![CDATA[Dart]]></category><category><![CDATA[Programming Tips]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Fri, 06 Jan 2023 14:23:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/jLwVAUtLOAQ/upload/ea60ff49671093799c07c805a77c3e49.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Forewords</strong>: The core idea here, shall we reflect on the foundation of programming language, before the leap into the Flutter framework. Let's take a look at the primitive programming build blocks from the variables, and operators, to Type. Many credits to <a target="_blank" href="https://www.tutorialspoint.com/dart_programming/dart_programming_environment.htm">TutorialsPoint</a> for the material, and inspiration from the content.</p>
<h2 id="heading-dart-programming-language-concepts">Dart Programming Language concepts</h2>
<p>the following is based on the <strong>Dark SDK 2.18.6</strong> at the time of writing &amp; (Flutter 3.3.10) in <strong>DartPad</strong> <a target="_blank" href="https://dartpad.dev/">https://dartpad.dev/</a>. Here's a quick summarized code for our studies. Fancy trying it out? Copy and paste to DartPad into a <code>void main()</code> function and explore.</p>
<pre><code class="lang-dart">  <span class="hljs-comment">//Loops &amp; Labels</span>
  currentLoop: 
  <span class="hljs-keyword">for</span> (<span class="hljs-built_in">int</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">7</span>; i++) {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">'hello <span class="hljs-subst">${i + <span class="hljs-number">1</span>}</span>'</span>);
    <span class="hljs-keyword">if</span> (i==<span class="hljs-number">5</span>) <span class="hljs-keyword">break</span> currentLoop; <span class="hljs-comment">//break means exit the loop</span>
    <span class="hljs-keyword">if</span>(i==<span class="hljs-number">4</span>) <span class="hljs-keyword">continue</span> currentLoop; <span class="hljs-comment">//skip current element</span>
  }

  <span class="hljs-comment">//types</span>
  <span class="hljs-keyword">var</span> abc = <span class="hljs-string">'Smith'</span>; <span class="hljs-comment">//abc can't be assigned to 1</span>
  <span class="hljs-comment">//abc = 1; //this has compile error</span>

  <span class="hljs-built_in">dynamic</span> dyn = <span class="hljs-string">'Hello'</span>; <span class="hljs-comment">//dyn could be assigned to 1</span>
  dyn = <span class="hljs-number">1</span>;

  <span class="hljs-built_in">print</span>(dyn <span class="hljs-keyword">is</span> <span class="hljs-built_in">int</span>); <span class="hljs-comment">//true, best for checking 'dynamic'</span>
  <span class="hljs-built_in">print</span>(dyn <span class="hljs-keyword">is</span>! <span class="hljs-built_in">String</span>); <span class="hljs-comment">//false</span>

  <span class="hljs-comment">//prefer lowerCamelCase for constant names</span>
  <span class="hljs-comment">/* https://dart.dev/guides/language/effective-dart/style */</span>
  <span class="hljs-keyword">final</span> solidName = <span class="hljs-string">'the rock'</span>; <span class="hljs-comment">//set once during runtime.</span>
  <span class="hljs-keyword">const</span> heavyName = <span class="hljs-string">'the boulder'</span>; <span class="hljs-comment">//compile time constant</span>

  <span class="hljs-comment">//operators</span>
  <span class="hljs-built_in">double</span> totalSum = <span class="hljs-number">1</span> + <span class="hljs-number">2</span> - <span class="hljs-number">3</span> * <span class="hljs-number">4</span> / <span class="hljs-number">5</span> % <span class="hljs-number">6</span>;
  <span class="hljs-keyword">final</span> integerResult = <span class="hljs-number">5</span> ~/ <span class="hljs-number">2</span> ; <span class="hljs-comment">// expect 2</span>
  <span class="hljs-keyword">final</span> increased5 = ++totalSum;
  <span class="hljs-keyword">final</span> decreased4 = --totalSum;

  <span class="hljs-comment">//Print, Output</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">"<span class="hljs-subst">$solidName</span> : <span class="hljs-subst">$abc</span>"</span>);
  <span class="hljs-comment">//=&gt; the rock : Smith</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">"<span class="hljs-subst">$dyn</span> &amp; <span class="hljs-subst">$heavyName</span> is <span class="hljs-subst">$increased5</span> vs <span class="hljs-subst">$decreased4</span>"</span>);
  <span class="hljs-comment">//=&gt; 1 &amp; the boulder is 1.6 vs 0.6000000000000001</span>

  <span class="hljs-comment">//Number, properties, then methods</span>
  totalSum.sign;
  integerResult.isEven;
  <span class="hljs-built_in">print</span>(totalSum.hashCode); <span class="hljs-comment">//hashcode for numeric value?</span>

  <span class="hljs-built_in">print</span>(<span class="hljs-string">"<span class="hljs-subst">$totalSum</span> <span class="hljs-subst">${totalSum.ceil()}</span>"</span>); <span class="hljs-comment">//method for ceiling</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">"<span class="hljs-subst">${(<span class="hljs-number">-4</span>).abs()}</span>"</span>); 
  <span class="hljs-comment">//we do (-4) because the -negate function acts after the function</span>
</code></pre>
<p>Here's a little break, before we resume with String, Boolean, List &amp; Map, and of Dynamic Type. Personally, I think Dart is a very interesting programming language, much reminded me of the fun learning programming of Java in the older days.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672685160021/ef3aa4f2-75d3-4eb2-9904-4ebb65e52ea6.png" alt="Target icons created by Freepik - Flaticon" class="image--center mx-auto" /></p>
<p>Photo by <a target="_blank" href="https://www.flaticon.com/free-icons/target">Target icons created by Freepik - Flaticon</a></p>
<h2 id="heading-look-into-the-string-andamp-boolean">Look into the String &amp; Boolean</h2>
<pre><code class="lang-dart">   <span class="hljs-comment">// ---------- Strings ----------</span>
  <span class="hljs-keyword">var</span> singleLine = <span class="hljs-string">'hello world'</span>;
  <span class="hljs-keyword">var</span> multiLine = <span class="hljs-string">'''hello world
    this is a message
    from the far far galaxy '''</span>;
  <span class="hljs-keyword">var</span> jointLine = <span class="hljs-string">'hello in single line '</span>
      <span class="hljs-string">'I have a message to write'</span>;

  <span class="hljs-built_in">print</span>(singleLine); <span class="hljs-comment">// hello world</span>
  <span class="hljs-built_in">print</span>(multiLine); <span class="hljs-comment">// print the following include the indent</span>
<span class="hljs-comment">/*
    hello world
        this is a message
        from the far far galaxy */</span>

  <span class="hljs-built_in">print</span>(jointLine); <span class="hljs-comment">//split message but join as one</span>
    <span class="hljs-comment">//print: hello in single line I have a message ...</span>

  <span class="hljs-built_in">print</span>(<span class="hljs-string">'The sum of 100+101 is <span class="hljs-subst">${<span class="hljs-number">100</span>+<span class="hljs-number">101</span>}</span>'</span>);
  <span class="hljs-keyword">var</span> newline = singleLine.toUpperCase().toLowerCase().replaceAll(<span class="hljs-string">'l'</span>,<span class="hljs-string">'n'</span>);

  <span class="hljs-comment">//string are immutable, cannot be changed, </span>
  <span class="hljs-comment">////<span class="markdown">new instance could be made for all the modification</span></span>
  <span class="hljs-built_in">print</span>(singleLine); 
  <span class="hljs-built_in">print</span>(newline); <span class="hljs-comment">//prints `henno wornd`</span>


  <span class="hljs-comment">// ---------- Boolean ----------</span>
  <span class="hljs-built_in">bool</span> isModified = <span class="hljs-keyword">false</span>;
  <span class="hljs-built_in">bool</span> hadBreakfast = <span class="hljs-keyword">true</span>;

  <span class="hljs-built_in">print</span>(isModified || hadBreakfast); <span class="hljs-comment">// return true</span>

  <span class="hljs-built_in">print</span>(singleLine.isEmpty); <span class="hljs-comment">//property, that return false</span>

  <span class="hljs-comment">//example expect Uniform ID of length 5, 00010</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'10'</span>.padLeft(<span class="hljs-number">5</span>, <span class="hljs-string">'0'</span>)); <span class="hljs-comment">//return 00010</span>
</code></pre>
<h2 id="heading-decision-making-with-if-else-and-switch-cases">Decision-Making with If-else, and Switch Cases</h2>
<p>for additional reference, only the linting part, check out this one <a target="_blank" href="https://dart-lang.github.io/linter/lints/curly_braces_in_flow_control_structures.html"><strong>[Curly_braces_in_flow_control_structures]</strong></a></p>
<pre><code class="lang-dart">  <span class="hljs-comment">// ---- Decision Making -------</span>
  <span class="hljs-keyword">var</span> fruit = <span class="hljs-string">'apple'</span>;

  <span class="hljs-comment">//linter - apply braces for all control statements</span>
  <span class="hljs-comment">// if -- else</span>
  <span class="hljs-keyword">if</span>(fruit == <span class="hljs-string">'apple'</span>){
    <span class="hljs-built_in">print</span>(<span class="hljs-string">'red'</span>);
  }
  <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(fruit ==<span class="hljs-string">'banana'</span>){
    <span class="hljs-built_in">print</span>(<span class="hljs-string">'yellow'</span>);
  }
  <span class="hljs-keyword">else</span>{
    <span class="hljs-built_in">print</span>(<span class="hljs-string">'I don\'t know'</span>);
  }

  fruit = <span class="hljs-string">'kiwi'</span>;

  <span class="hljs-comment">// switch case</span>
  <span class="hljs-keyword">switch</span>(fruit){
    <span class="hljs-keyword">case</span> <span class="hljs-string">'apple'</span>: 
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'red'</span>);
      <span class="hljs-keyword">break</span>;
    <span class="hljs-keyword">case</span> <span class="hljs-string">'banana'</span>: 
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'yellow'</span>);  
      <span class="hljs-keyword">break</span>;
    <span class="hljs-keyword">default</span>: 
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'I don\'t know'</span>);
  }
</code></pre>
<h2 id="heading-list-with-null-safety-enabled-map">List - with null-safety enabled, Map</h2>
<pre><code class="lang-dart">  <span class="hljs-comment">//with null safety enabled</span>
  <span class="hljs-keyword">var</span> fixedList = <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt;.filled(<span class="hljs-number">3</span>, <span class="hljs-number">0</span>, growable: <span class="hljs-keyword">false</span> );
  <span class="hljs-keyword">var</span> growableList = <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt;.filled(<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, growable: <span class="hljs-keyword">true</span> );
  <span class="hljs-built_in">print</span>(fixedList); <span class="hljs-comment">// prints [0,0,0]</span>
  <span class="hljs-built_in">print</span>(growableList); <span class="hljs-comment">//print [1,1,1]</span>

  growableList.add(<span class="hljs-number">5</span>);

  <span class="hljs-keyword">var</span> keyValuePairs = {<span class="hljs-string">'apple'</span>:<span class="hljs-string">'red'</span>, <span class="hljs-string">'banana'</span>:<span class="hljs-string">'yellow'</span>};
  keyValuePairs[<span class="hljs-string">'orange'</span>]=<span class="hljs-string">'orange'</span>;
  <span class="hljs-built_in">print</span>(keyValuePairs);
  <span class="hljs-built_in">print</span>(keyValuePairs.keys); <span class="hljs-comment">//apple,banana, orange</span>
  <span class="hljs-comment">//Dynamic Type - Dart is an optionally typed language</span>
</code></pre>
<p>the beauty of dart here is that we don't have to loop. The <strong><em>print</em></strong> would show the primitive content of the list.</p>
<h2 id="heading-bonus-fun-with-the-string-runes">🎁 Bonus: Fun with the String, Runes</h2>
<pre><code class="lang-dart">   <span class="hljs-comment">//-------- Bonus ----------</span>
  <span class="hljs-built_in">String</span> x = <span class="hljs-string">'ABC aeroplane'</span>;
  <span class="hljs-built_in">print</span>(x.codeUnits); <span class="hljs-comment">//prints the UTF-16 code,</span>
  <span class="hljs-comment">//Upper and Lower case difference = A 65, a 97 = 32. </span>

  x.runes.forEach((_){
    <span class="hljs-built_in">print</span>(<span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>.fromCharCode(_));
  });

  <span class="hljs-comment">//Runes access to the character codes</span>
  Runes input = <span class="hljs-keyword">new</span> Runes(<span class="hljs-string">'\u{1F600}'</span>); <span class="hljs-comment">//smiley 😀</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>.fromCharCodes(input));
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>This is merely some handpicked example from Dart, it's not exhaustive. In the future article, we may explore some additional syntax available in the Dart language.</p>
]]></content:encoded></item><item><title><![CDATA[The "Muses" in My Software Engineering Toolbox]]></title><description><![CDATA[These are the sets of tools, software, and hardware combination that I'm currently working with. I would call them my Muses in Software Engineering. These tools give me the inspiration to continue coding and sustaining my professional interest. Let's...]]></description><link>https://blog.divineforge.com/the-muses-in-my-software-engineering-toolbox</link><guid isPermaLink="true">https://blog.divineforge.com/the-muses-in-my-software-engineering-toolbox</guid><category><![CDATA[Node.js]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[tools]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[setup]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sat, 23 Apr 2022 17:28:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1650732358219/js160Dm7N.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>These are the sets of tools, software, and hardware combination that I'm currently working with. I would call them my Muses in Software Engineering. These tools give me the inspiration to continue coding and sustaining my professional interest. Let's jump straight into the list:</p>
<h2 id="heading-the-toolboxes-of-software-editor-and-terminal">The Toolboxes of Software, Editor and Terminal</h2>
<ul>
<li>Visual Studio Code, with the GitHub AI Copilot</li>
<li>Sublime</li>
<li>iTerm with PowerLevel10k, Fig;  Warp</li>
</ul>
<h3 id="heading-the-visual-studio-code-with-github-copilot-is-a-staple">The Visual Studio Code with GitHub Copilot is a staple</h3>
<p>I believe nowadays with IntelliSense is the bare minimum, and having an intelligence code suggestion, its like having a co-pilot pair programming experience. Although at the time of writing it's in technical preview. work checking out the awesome offered by GitHub https://copilot.github.com/</p>
<h3 id="heading-sublime-editor-the-scratchpad-for-any-simple-texting-and-formatting">Sublime Editor - the 'Scratchpad' - for any simple texting and formatting</h3>
<p>sublime is not my main driver for programming, however, it's great in terms of note-taking, formatting the text, running some macros, or just any kind of quick text processing stuff. I think the greatest benefit is that it launches in splits second. Be sure to include the Package Control in the Sublime too. https://packagecontrol.io/</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650732358219/js160Dm7N.jpg" alt="sublime" /></p>
<h3 id="heading-iterm-and-warp-both-are-great-command-line-tools-in-my-view">iTerm and Warp both are great command-line tools in my view</h3>
<p>I replaced the default Terminal on Mac with iTerm and surely enhanced it with the <a target="_blank" href="https://github.com/romkatv/powerlevel10k">PowerLevel10k</a> that adds a lot of interesting flavours. Another customizable enhancement would be the 'Autocomplete' to the terminal with <a target="_blank" href="https://fig.io/">Fig</a></p>
<p>recently I also embarked on the newly announced tool <a target="_blank" href="warp.dev">Warp</a> as shown in daily.dev articles.  I'm still evaluating it, which looks promising, maybe.. it could be replacing my current workflow with iTerm
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650732931419/uK05c7utn.jpg" alt="warp.jpg" /></p>
<h2 id="heading-complimentary-booster-tools">Complimentary Booster Tools</h2>
<ul>
<li>Obsidian Notes with Sync</li>
<li>Todoist</li>
<li>GitHub &amp; Fork</li>
<li>Telegram</li>
<li>Authy</li>
</ul>
<p>These are secondary to the program, but they offer me a number of perks.
starting with Obsidian note https://obsidian.md/ it serves as my 'second brain' for everything I have learnt and keeps my information and knowledge in a structured manner that I could always refer back to. What's more, doing notes in the markdown is very efficient. Think Hashnode blogging is in Markdown, Obsidian in Markdown, and GitHub documentation also in Markdown, it's easily reusable in many contexts for note sharing, documentation sharing, potentially creating a kind of mini-wiki. </p>
<p>Todoist and GitHub Project are great for managing the tasks, and development notes. Besides, I do recommend <a target="_blank" href="https://todoist.com/">Todoist</a> for managing personal matters too. thanks to the intuitive user interface, an amazing date feature that you could put it says <code>in 7 days,</code>in 2 weeks<code>,</code>ev! Sunday that kind of smart date filtering makes it great for planning. To maximize the usefulness of the tool, I'll recommend blending it with productivity management workflow from the internet, check out tips from <a target="_blank" href="https://www.youtube.com/watch?v=do9HmX51tis">Youtube, by Carl Pullein</a></p>
<p>GitHub is now my current favourite VCS platform. I have tried a number of others from BitBucket, and GitLab, which are great and served me well in past for various scenarios. For now, I decided to stay with GitHub for its simplicity and due to a large number of Open-Source projects there, moreover, also aligned with my professional work. Nonetheless, in the Git Client part, I'd highly recommend going with <a target="_blank" href="https://git-fork.com/">Fork Git Client</a> I could also do everything I need with it, multiple remote, rebase-interactive, cherry-pick, to all kinds of branching, and stash, commit, push operation. I'm totally happy with the kind of simplicity and intuitive design it gives. besides it also become the de facto standard for me to share with fellow Developers how to work with Git Source Control.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650733697902/N6IS0L205.jpeg" alt="fork.jpeg" /></p>
<p>some may wonder why <strong>Telegram</strong> on this list.. in my case, I appreciate what Telegram offers as a collaborative platform in my workplace, and also running a simple Bot to help put up the Pull Request/Code Commit from GitHub to the conversation. it's a great tool to assist me in work. Besides, there is an innovative use-case, such as making good use of the 'Saved-Message' function for quick note-taking and transferring quick notes and files between computers and devices using telegram. To further make it greater, I created a temporary channel with an auto-delete message feature, to upkeep /cleanup my 'temporary' notes, and files on telegram. There are just many ways one could hack it out from telegram, using it more than a simple communication tool</p>
<p><a target="_blank" href="https://authy.com/">Authy</a> gotta be another stapled in my workflow. Due to various security concerns, each platform requiring 2FA, I'm glad that almost 90% of the things I used were able to work with Authy, that I could centralize all the tokens with it. This is a lifesaver I'd recommend to many people</p>
<h2 id="heading-hardware-choices">Hardware Choices</h2>
<p>last but not least, if anyone is ever curious about what kind of hardware preference, I'm looking at the following. Once you explore development with macOS, most probably you'd never want to turn back to Windows.. except.. sometimes, I'm back to Windows mostly for gaming needs. Additionally, I'd recommend a good keyboard. Although I started into the external keyboard with the intention to prevent myself from damaging the MacBook keyboard.. (yea over time, for a machine used for years, I do notice keycaps on my mac did wear out..) Hence I strongly recommend an external keyboard to work with. </p>
<ul>
<li><strong>macOS</strong> with a Shortcuts &amp; Rectangle, the Unarchiver, Lunar, DaisyDisk</li>
<li><strong>Keychron</strong> K3 - Low Profile - optical brown switch mechanical Keyboard</li>
</ul>
<p>Perhaps share with me what works best for you! :)</p>
]]></content:encoded></item><item><title><![CDATA[Surviving the Engineering & Programming work in a Regulated Environment]]></title><description><![CDATA[Knight vector created by macrovector - www.freepik.com
This is probably.. the darker side of the story of being a programmer in a low-risk appetite environment. Doing Software Engineering or Application Development is a risky operation because of the...]]></description><link>https://blog.divineforge.com/surviving-the-engineering-and-programming-work-in-a-regulated-environment</link><guid isPermaLink="true">https://blog.divineforge.com/surviving-the-engineering-and-programming-work-in-a-regulated-environment</guid><category><![CDATA[Developer]]></category><category><![CDATA[Experience ]]></category><category><![CDATA[Learning Journey]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sun, 17 Apr 2022 17:55:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1650471077116/IVBIVAh9L.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.freepik.com/vectors/knight">Knight vector created by macrovector - www.freepik.com</a></p>
<p>This is probably.. the <strong>darker side of the story of being a programmer</strong> in a low-risk appetite environment. Doing Software Engineering or Application Development is a risky operation because of the rate of project failure, the return doesn't meet the investment poured into the project. Just how much ROI do you think in the average scenario? Think about High turnovers of Developers because the opposite pastures are greeners and the conundrum of Software Development in a complex landscape... </p>
<h2 id="heading-the-ideal-development-environment">The Ideal Development Environment</h2>
<p>I think we may have heard awesome Continuous Integration, Continuous Deployment (CI/CD), powerful collaboration tools such as GitHub discussion, then Slack or maybe Discord. Perhaps a picture like this of a small conversation sparked in the morning, a few persons throwing some ideas in the chat, then some Pull Requests and a few more code improvements on top of each other, supported by peers from various timezone, then voila .. an amazing product is born in the evening. Something akin to GitHub Universe 2020 Opening Keynote here: https://youtu.be/2m9nUP-e8Co?t=53</p>
<p>To me, that's an ideal workplace and amazing Developer Experience. Also, that can be.. way too ideal kind of perception towards the software industry. I mean in real life we don't get to film all the awesome chain of events right? The software world is often filled with stress and dismay due to misunderstanding, poor communication, and reluctance to collaborate... likely of an unfavourable interaction in the past, and communicating with another person maybe it's a total paradox in our work: communicate with the machine. </p>
<h2 id="heading-the-reality-that-im-experiencing">The reality that I'm experiencing</h2>
<p>The reality that I'm living in, full of people from other fields, other expertises, probably you're the just the rare one speaking of IT programming languages around them. Just when you happen to find another programmer peer, that I realize; most of us work in a silo. We try to avoid code conflict, hopefully picking up a task that solo focus on individual contribution, enjoying the zen of programming, submitting and everything went well. Why do we become the lone developer? Maybe mainly we're serving and pairing with another non-IT colleague most of the time, attempting to deliver something for them. You might have seen the comical scenario of 9 persons watching and managing a single Developer to deliver the piece of much-anticipated work. This has a solid reference to the real world of software development. </p>
<blockquote>
<p>At times, I have doubts about why do we even want to do custom programming? Perhaps just getting something off the shelves save us a lot of time, in bug-fighting, an endless cycle of imperfection and iteration, and never-ending piles of technical debt... overwhelming us.</p>
</blockquote>
<p>Each kind of organisation has their own dilemma with Information Technology and their share of problems. Just like someplace people are struggling for food and basic necessity. Here are the two extreme opposites that I met, at least around my circle. There are smaller organizations, with wild dreams, and a lot more freedom to explore, unregulated where innovation is high, yet.. often change direction, easily switch commitment, most of the projects developed half way, and potentially keep inside the fridge. Yet some projects started for a while but without a real customer, segment to sell to. </p>
<p>Information technology investments are costly. Discount the hardware, laptop that's used for coding, the electricity bills, and then compensation for the programmer, some software costs money, and some elegant software also costs support fees, and then some hosting solutions on the cloud costs operating fees, compute power charges, data transfer charges, and API rate charges, ...</p>
<blockquote>
<p>What's more software and technology are quick to obsolete. it's the game of never-ending version upgrades, chasing for security patches, releases, and matching up with the greater ecosystem of technology dependencies.</p>
</blockquote>
<h2 id="heading-on-making-our-code-and-our-work-auditable-is-truly-a-challenge">On Making our code and our work auditable is truly a challenge</h2>
<p>we're the dangerous breed of people, akin to builders who build houses but with a lot of invisible bricks, and intangible underlying pipes and wirings. Pity the folks who want to buy the house from us. but may not even have the chance to claim the warranty nor to discuss the intangible problem with us... because a lot of problem is there, but it's much covered in a black box, not that easily accessible to others like those word documents that could be inspected upon... it demands just programming literacy.. then we're 'forced' into writing a lot more documentation more than codes we wrote, "sometimes".</p>
<p>in a regulated industry, basically, every customer wants some form of safety. They are worried about the software breach or malicious code inside.. thus various government departments are set up to do inspections at their best effort to inquiry, to 'interrogate', to carry a zero-trust policy against every single piece of code that's written and intend to go to the mass. the world is right about it, which also.. we're at the disadvantage ends if we don't get enough support to help justify our work is clean.</p>
<blockquote>
<p>Development can become a hassle when we're diverted from just writing code, now we need to justify our code.</p>
</blockquote>
<h2 id="heading-survival-and-finding-the-muse-amidst-the-constraints">Survival and finding the muse amidst the constraints</h2>
<p>and so there is hope. 
software .. some time ago was much less accessible to many of us. Luckily. nowadays we have the luxury to work with more open sources libraries and enjoy more free tiers, trials, and evaluation (long term) copy, all these minor efforts do help to bring the development circle a lot breathable. Hence make use of these available tools. Try to reduce the number of codes, towards less code, or low code, or maybe zero-code. </p>
<p>Enterprise solutions can be really fun if we get to see them through the opposite lens. We may have been sold to the Cloud technology, yet there is more to meet the eyes of those offering on-premises solutions, local data centres, and various solutions to help manage the ownership of data, infra, and while meeting all kinds of compliance requirements.</p>
<p>I learnt all these enterprise architecture just by accumulating experience and exploring the uncharted territory in attempting to build something new to the landscape, deliberate it in the Enterprise Architecture forum, people may push back on your novel idea, ask you to re-evaluate existing available solutions,  yet might also be in goodwill to offer what's closest to the availability that they could provide to you. </p>
<p>There are some gems from what the previous generation has set up and invested in. For example, those offerings from Oracle, Dell, Nutanix infrastructure, and Zerto technology .. everything that powers up the infrastructure and the overall solutions, they worth something, and they are worth discovering the philosophy behind those products. Although these are enterprise options that are less accessible to us as an individual. it might have saved the organization for many countless audit events, compliancy checks, ISO standards, and keeping a steady income, such that.. we could sit tight and get the monthly wages predictably.</p>
<h2 id="heading-assembling-the-delightful-component-to-shape-the-dev-experience-for-next-generation">Assembling the delightful component to shape the Dev Experience for Next Generation</h2>
<p>I'll call it finding the muse in the sea of conundrums. Which that combination would unlock your innovation, break your limits, and sugarcoats the pain one's having in the work environment. 
So there is a lot we could do, we could try to embrace GitHub and CI/CD tools where applicable. formulating the 'grey area' for software development culture first. then produce fully compliant delivery insert onto the regulated enterprise component, submitting source code to the centralized VCS, such that it runs on the on-premises continuous integration, deployment pipeline tools, despite we don't have the best in class infrastructure, at least most of the time, the server are reliable, monitored by Security department, and knowing that a number of the department from the shared services would aid us whenever we lodge a service request... that's the benefit of enterprise programming. all it takes is to be brave to network outside your computer, work beyond what's the 'screen' in front of you, <strong>work with people, focus on solutions over problems </strong> and let that (your screen, your computer, your keyboards, your mouse) be the windows that bring you to communicate with the world out there. </p>
<p>Go Forth, and find your ally! </p>
]]></content:encoded></item><item><title><![CDATA[Tools, Assets & Boosters for Game Making]]></title><description><![CDATA[We may have heard about stories of Indie game developers, akin to solo entrepreneurs, doing everything from artworks to programming, to marketing, and publishing the game all by themselves. 
Just is there a way to ease the development life of those i...]]></description><link>https://blog.divineforge.com/tools-assets-and-boosters-for-game-making</link><guid isPermaLink="true">https://blog.divineforge.com/tools-assets-and-boosters-for-game-making</guid><category><![CDATA[Game Development]]></category><category><![CDATA[tools]]></category><category><![CDATA[Games]]></category><category><![CDATA[Art]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sat, 16 Apr 2022 16:59:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/uNKyYp616wo/upload/v1650991594087/wlX3pTwoq.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We may have heard about stories of Indie game developers, akin to solo entrepreneurs, doing everything from artworks to programming, to marketing, and publishing the game all by themselves. </p>
<p>Just is there a way to ease the development life of those indie game developers? what could be a booster for them during the initial game development? Here's my list of top 6 sources that I find useful for creating first games, venturing into the Game Development World as an indie developer, or perhaps beginning the hobby game programming.</p>
<h2 id="heading-humblebundle">Humblebundle</h2>
<p>this is like the marketplace where I could pick up some games, maybe some tutorial courses, books, as well as game assets and tools. From time to time they have different tools, assets, and software up for sale. You may specify the amount of donation you want to pay for the items you wish to grab.
sometimes, pretty much value from that 1USD donation too. 
Heads out to https://www.humblebundle.com/software to see what's available at the moment.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650990709781/6UkI_x-_i.jpg" alt="humblebundle.jpg" /></p>
<h2 id="heading-kenney-assets">Kenney Assets</h2>
<p>I'm pretty impressed with the work and amount of assets he puts up for free in the Indie developer community. You may find regular updates, sharing, and communication from his Twitter profile https://twitter.com/KenneyNL here, and the download at his website.
https://www.kenney.nl/assets</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650991305096/7OeHL8Jeb.jpg" alt="kenny-asset.jpg" /></p>
<h2 id="heading-itchio-free-game-assets">itch.io FREE game assets</h2>
<p>the place where Game Developers may freely share their works on this platform. There is tons of material and inspiration here. You may find art styles that you like, or game mechanisms that might catch your attention. 
https://itch.io/game-assets/free</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650991516439/Do1EZsxsY.jpg" alt="itch.io.jpg" /></p>
<h2 id="heading-texture-packer">Texture Packer</h2>
<p>This one is a tool that has been a while for a long time.. considering sometimes we want to do the Sprintsheet for animation, it's quite useful for combining all the pictures assets. Very likely you find a good use case with this tool</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650991919031/OyTLa-3dg.jpg" alt="Screenshot 2022-04-27 at 12.51.25 AM.jpg" />
https://www.codeandweb.com/texturepacker</p>
<h2 id="heading-chiptone">Chiptone</h2>
<p>one of the sound clip production tool that still available until today, (which they ported from Flash to HTML5). It's an amazing tool that I used for GameJam, or just creating sounds effect for my mini-game. You may enjoy the crisp, retro, pixel games sound effects from this sound editor too.  https://sfbgames.itch.io/chiptone</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650991769926/i2OXA4_sp.jpg" alt="chiptone.jpg" /></p>
<h2 id="heading-arpeggios">Arpeggios</h2>
<p>lastly here.. a simple yet interesting music reference. It's not a tool to produce anything, but more like an inspiration to you on creating some basic loop background music for pixel games. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650992101059/SMDTZxs40.jpg" alt="Screenshot 2022-04-27 at 12.21.56 AM.jpg" />
https://musiclab.chromeexperiments.com/Arpeggios</p>
<p>here's just few tools from me that I find them useful. Do you have any tools, assets source, reference sitting in your toolbox? Perhaps share with me in the comment below.</p>
]]></content:encoded></item><item><title><![CDATA[A few tips on managing Linux Servers]]></title><description><![CDATA[this will be a post on my collection of Linux commands which I find handy, in the various scenarios.
Check for Operation System Information
hostnamectl
uname -r
free -m
top
htop

Investigate what are the listening ports
sometimes there is something a...]]></description><link>https://blog.divineforge.com/a-few-tips-on-managing-linux-servers</link><guid isPermaLink="true">https://blog.divineforge.com/a-few-tips-on-managing-linux-servers</guid><category><![CDATA[linux for beginners]]></category><category><![CDATA[Linux]]></category><category><![CDATA[cli]]></category><category><![CDATA[command line]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Thu, 14 Apr 2022 17:43:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/4Mw7nkQDByk/upload/v1650995015322/o5wAmLifs.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>this will be a post on my collection of Linux commands which I find handy, in the various scenarios.</p>
<h2 id="heading-check-for-operation-system-information">Check for Operation System Information</h2>
<pre><code class="lang-shell">hostnamectl
uname -r
free -m
top
htop
</code></pre>
<h2 id="heading-investigate-what-are-the-listening-ports">Investigate what are the listening ports</h2>
<p>sometimes there is something already running on the port, that you're unable to start your program.. here's some way to find them.</p>
<pre><code class="lang-bash">sudo lsof -i -P -n
sudo lsof -i -P -n | grep LISTEN
sudo lsof -i :3000
<span class="hljs-built_in">kill</span> -9 &lt;PID&gt;
</code></pre>
<h2 id="heading-some-su-sudo-tips">Some SU / SUDO Tips</h2>
<ul>
<li><code>sudo -i</code>  . (switch to root user)</li>
<li><code>sudo !!</code>  (execute the previous command as sudo)</li>
<li><code>su -</code>  sets up the shell environment as if it's new login</li>
<li><code>su</code>   just start shell as that user, use 'original user's environment settings.</li>
</ul>
<p>and well... another tip <code>cd -</code> change directory back to the previous directory</p>
<h2 id="heading-what-if-we-want-a-user-that-act-like-the-root-id-at-the-meanwhile-not-using-sudoer-file">What if we want a User that act like the Root Id, at the meanwhile not using sudoer file?</h2>
<p>this is another trick to set a account to be 'root' by changing its iD
<code>uname</code> check operating system 
list existing users view <code>/etc/passwd</code>
assign ID with root equivalent privileges by changing the current UID value of the new ID to UID=0</p>
<h2 id="heading-want-a-more-efficient-way-to-copy-files-compare-difference-then-only-sync-those">Want a more efficient way to Copy files, Compare difference then only sync those?</h2>
<p>Try rsync! 
Rsync is a useful utilities native to the linux environment. It has a parameter <code>n</code> to allow one to have dry-run session first to observe the verbose output.</p>
<p>A sample of a rsync command.</p>
<pre><code class="lang-shell">rsync -razvh --delete --exclude doc /data/source /data/destination
</code></pre>
<p>this runs recursive manner into the folder below, remove the files on the destination mirroring the source, and exclude target 'doc' pattern folder/files.</p>
<p>you could find more about this command from the manual or internet too. So something to consider along with <code>sftp, ftp, scp ...</code></p>
<h2 id="heading-what-about-sometimes-we-want-to-understand-what-a-set-of-commands-does">What about sometimes we want to understand what a set of commands does?</h2>
<p>just copy-paste the command onto https://explainshell.com/
I wish I would have discovered this earlier. My early days of learning the unix/linux command was to dig through the 'manual' from 'man' or 'help' to see what each parameter does and arguments are for.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650993549235/DQ2qWC7BE.jpg" alt="explainshell.jpg" /></p>
<p>I think this is not exhaustive list yet. just some of extract from my note. Perhaps you may share with me your favourite commands in linux in comment below too.</p>
]]></content:encoded></item><item><title><![CDATA[List of Content Management System]]></title><description><![CDATA[Here's a long list, in my note, that I jot down from the last JamStack event.. (some time ago.. em..) let's post it here for everyone's reference. I'll also look up their link and added it here, and so here we go. 

Adobe Experience Manager (https://...]]></description><link>https://blog.divineforge.com/list-of-content-management-system</link><guid isPermaLink="true">https://blog.divineforge.com/list-of-content-management-system</guid><category><![CDATA[content]]></category><category><![CDATA[headless cms]]></category><category><![CDATA[cms]]></category><category><![CDATA[JAMstack]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Tue, 12 Apr 2022 18:11:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/hpjSkU2UYSU/upload/v1650995508637/2bOxF6c4v.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here's a long list, in my note, that I jot down from the last JamStack event.. (some time ago.. em..) let's post it here for everyone's reference. I'll also look up their link and added it here, and so here we go. </p>
<ul>
<li>Adobe Experience Manager (https://business.adobe.com/sea/products/experience-manager/adobe-experience-manager.html) they have both content management system, and digital asset management. Hence picked your use-case. The latter is more on managing assets that was generated in the studio/department. e.g Game Development Assets.</li>
<li>Contentful (https://www.contentful.com/) API First content platform</li>
<li>Craft (https://craftcms.com/) - Free forever for Solo</li>
<li>Dato (https://www.datocms.com/) - the most complete, user-friendly and performant Headless CMS</li>
<li>Drupal (https://www.drupal.org/) proudly open source tool for digital experience platform (DXP) on the web. Been a long time.</li>
<li>Forestry (https://forestry.io/) - Git based CMS .. a fundamentally different concept</li>
<li>Ghost (https://ghost.org/) - Ghost is a powerful app for new-media creators to publish, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters &amp; offer paid subscriptions to members. (Paid solutions)</li>
<li>Kentico (https://www.kentico.com/) - Kentico is no longer just a content management system. It is a strong vendor brand, a caring employer and a global company with two fully fledged products—Kontent and Xperience.</li>
<li>Magnolia (https://www.magnolia-cms.com/) - claims as the fastest way to launch digital experience, my personal view that it's like the alternative to Adobe solutions.</li>
<li>Netlify CMS (https://www.netlifycms.org/) - git-based cms for static site generators. I think possibly a fit to mix &amp; match well with JS stack development.</li>
<li>Prismic (https://prismic.io/) I think they are quite promising too, when matching with Jamstack development</li>
<li>Sanity (https://www.sanity.io/) - unified content platform that powers better digital experiences, and it comes in a NPM package.</li>
<li>Sitecore (https://www.sitecore.com/) - solutions for digital experiences. more like an off-the-shelves product.</li>
<li>SquareSpace (https://www.squarespace.com/) that's more like a range of product that build digital presences</li>
<li>Strapi (https://strapi.io/) the open source headless CMS.. and 100% in Javascript. also the one that I actually use it in my project.</li>
<li>Typos3 (https://typo3.org/) the professional, flexible content management system</li>
<li>Umbraco (https://umbraco.com/) -  the flexible open-source .NET (ASP.NET Core) CMS probably.. for another camp on the MS .NET technology.</li>
<li>Webflow (https://webflow.com/cms) - content management for building website</li>
<li>Weebly (https://www.weebly.com) - leans towards the website building.</li>
<li>Wix (https://www.wix.com/) - towards building the website</li>
<li>WordPress &amp; WordPress Headless (https://wordpress.com/) - that's possible to use WordPress as headless CMS to provide API , act as data source for front-end application</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Those Little Things that affected the Developer Experience, and yield Impact on the Project Delivery]]></title><description><![CDATA[After reading this article on Linkedin I agree that "work has become more transactional as social circles shrink to family and closest friends". Minus the part good/bad for the business, let's take this context, and talk about how we as Developers an...]]></description><link>https://blog.divineforge.com/those-little-things-that-affected-the-developer-experience-and-yield-impact-on-the-project-delivery</link><guid isPermaLink="true">https://blog.divineforge.com/those-little-things-that-affected-the-developer-experience-and-yield-impact-on-the-project-delivery</guid><category><![CDATA[Developer]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[Experience ]]></category><category><![CDATA[team]]></category><category><![CDATA[Culture]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Sun, 10 Apr 2022 11:01:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/mpN7xjKQ_Ns/upload/v1651053381550/h1MWeFTgA6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After reading <a target="_blank" href="https://www.linkedin.com/news/story/what-you-lose-if-you-optimise-work-5843826/">this article on Linkedin</a> I agree that "work has become more transactional as social circles shrink to family and closest friends". Minus the part good/bad for the business, let's take this context, and talk about how we as Developers and extended team members work together in coding, delivery of features, and products.</p>
<h2 id="heading-bonding-and-candour">Bonding and Candour</h2>
<p>I think it's important to have Engagement between Developers and also the extended team. A genuine exchange of what's difficult in the current work implementation, or impediment creates trust. That kind of transparency leads to team harmony. A lot of supporting ideas from the <a target="_blank" href="https://www.scrum.org/resources/blog/5-scrum-values-take-center-stage">5 Scrum.org core values</a>. Most important is expecting some form of courage and openness, thus leading to the adoption of a few core values like 'focus, commitment, respect'. On the other hand, I think shrewdness &amp; scheming are something definitely need to be avoided.  I mean encourage a higher level of transparency by communicating the context, adding description and elaboration to the statement that was presented. Even if someone utters something silly, give them a chance, and provide a safe environment to step down. </p>
<h2 id="heading-build-tools-and-swiss-army-knife-to-your-operation-problem">Build Tools and Swiss-Army Knife to your operation problem</h2>
<p>consider building small tools to assist your developer to run things, to fixing things. Such to automate the deployment process, that could instantly serve their code from local to the shared Development environment that others could validate and audit.
The smoothness in the development work would really give a good impact on the overall team morale. Another example would be considered a minor script that reset some system behaviour in case testing went wrong, or some data reset script, dump restores database script.. Anything you think that would bring the Quality of Life improvement to yourself, and your team, that's something worth investing a little bit of time to make happen.</p>
<h2 id="heading-think-about-how-you-build-andamp-develop-your-solution">Think about how you build &amp; develop your solution</h2>
<p>creating a platform that makes development work iterable, and repeatable at such would reduce the strain and stress on your development team, such that they could allocate energy for high-level thinking. For example, when introducing a new entity in the database, there is often the need to build the CRUD operation and REST API.. just if those things could be replaced with a framework like Strapi? (https://strapi.io) or some headless CMS then the developer could allocate their time for other frontend customization, or more advanced business algorithms. Indirectly those redirections of energy would result in a more productive team, and better quality of delivery, less error-prone.</p>
<p>The trick is.. write as little code as possible, then less work for the developer to debug things. </p>
<h2 id="heading-complicated-works-that-require-more-than-1-person-to-handle-it">Complicated Works that require more than 1 person to handle it</h2>
<p>in the workplace, it's mostly about interdependency. From time to time we have works that require a deeper thought process. Thus I'll say to split into smaller chunks, walk through all the developers to have a common ground of understanding the context, the rationale why we need to build that, and what technical path we have traversed down.</p>
<p>Preparing a guided conversation, and implementation plan, would create alignment and improve the team morale. Ask them any questions, ask them if any concerns, attempt to spark conversation, and give everyone a chance to be heard. Perhaps from their angle, that would help to validate the idea. Sometimes, people have a brilliant idea that I would find well compensate for what I'm lacking.</p>
<h2 id="heading-promotes-higher-degree-of-communication">Promotes Higher Degree of Communication</h2>
<p>Encourage team members to pick up necessary soft skills, and communication skills ability. The ability to explain that intangible context, really saves our time and effort to search in the blind or avoid some unnecessary implementation, and code duplication. 
Moreover, don't set a trap for your peer developer, if you see a problem, probably you can see the solutions too. Otherwise, alert the team to brainstorm together</p>
<h2 id="heading-summary-of-my-view-on-developer-experience">Summary of my view on Developer Experience</h2>
<p>DevExp is about shared responsibilities, each one of us plays a part in shaping the experience for others, either by improving the IDE and project setup, CI/CD, creating tools, all the way communication style, and collaboration methods.</p>
<p>Hence, how about something to hear from you, fellow reader? Are there actually tools you want to mention that may change the landscape of programming?</p>
]]></content:encoded></item><item><title><![CDATA[Into the Selection of Game Development Tools and Framework]]></title><description><![CDATA[there are a lot of choices in the market, my view is to decide on a particular platform and dive deeper into it, select one that fits your need, and especially as an immediate step that you are interested in, or you have built previously.
I'm going t...]]></description><link>https://blog.divineforge.com/into-the-selection-of-game-development-tools-and-framework</link><guid isPermaLink="true">https://blog.divineforge.com/into-the-selection-of-game-development-tools-and-framework</guid><category><![CDATA[unity]]></category><category><![CDATA[Game Development]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Tue, 28 Dec 2021 04:48:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/p0j-mE6mGo4/upload/v1640667100638/Lx7z9NShB.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>there are a lot of choices in the market, my view is to decide on a particular platform and dive deeper into it, select one that fits your need, and especially as an immediate step that you are interested in, or you have built previously.</p>
<p>I'm going to focus on finding the option that has better viability and might have a better chance to port onto multiple platforms (Web, Mobile, Desktop), and also to integrate with your current website, mobile app, or any backend system. </p>
<p>I'm particular in favour of a client and server model. One may start from the game client development, be it from offline, then integrate with some online tools, database, backend, allow sign-in, high score, leaderboard, then eventually for multiplayer gaming.</p>
<p>to start with the game development, a few Game Clients development choices that I came across would like to highlight are</p>
<h1 id="heading-game-client-development-reference">Game Client Development Reference</h1>
<p>a few that intrigues me - Phaser, Unity, and Godot.</p>
<h2 id="heading-unityhttpsunitycom"><a target="_blank" href="https://unity.com/">Unity</a></h2>
<p>has expanded quite aggressively and powered many games nowadays, since I get to know about it nearly a decade ago. I was once a Unity Developer, and it was my primary game editor. Nowadays they offer plenty of learning resources on their site to help people to pick up the tool. Aside from that, is that required to dive really dive into the C#? I think that shouldn't be an obstacle. The programming syntax could be learnt passively. As you have a goal and idea that you want to implement, checking out examples, and reference, you would get it there, and the learning process would have been more fun compared to reading through all the language tutorials.</p>
<p>I recommend it first, because it has a rich ecosystem, and many SDK support for various cloud integration, and client development, for example, integrating with Firebase, AWS, or maybe the Google Play SDK. Another plus point is that Unity seems to be possible to plug into the Flutter app , with this  <a target="_blank" href="https://pub.dev/packages/flutter_unity_widget">Flutter widget</a> </p>
<h2 id="heading-godot-enginehttpsgodotengineorg"><a target="_blank" href="https://godotengine.org/">Godot Engine</a></h2>
<p>Godot shines in the open sources space and has a very permissive MIT license. I do have the dilemma of whether to invest time and energy to start with this platform. because of possibly lighter weight, more manageable project files, and the simplicity of the tools. its editor has a more cosy layout, bigger font, and space but is just a little, it's an all-in-one tool, code and design in the same editor. Everything looks simpler, however, I also observe that being in the open-source space also meant that the development pacing can be slower compared to the commercial counterpart. </p>
<h2 id="heading-phaserhttpsphaserio"><a target="_blank" href="https://phaser.io/">Phaser</a></h2>
<p>building game runs directly on the browser. HTML 5 and javascript, perhaps just all the goodies of blending well with the web development and the ubiquitous javascript stack. Additionally, this also leads me to the discovery of other smaller lightweight javascript game libraries as below:</p>
<h3 id="heading-js13kgames-resources">JS13KGames Resources</h3>
<blockquote>
<p>js13kGames is a JavaScript coding competition for HTML5 Game Developers running yearly since 2012. The fun part of the compo is the file size limit set to 13 kilobytes.</p>
</blockquote>
<p><a target="_blank" href="https://js13kgames.com/">read more about JS13kGames here</a> 
a long list of Javascript frameworks, web-based game development frameworks worth checking out
https://js13kgames.github.io/resources/</p>
<h1 id="heading-backend-game-server">Backend Game Server</h1>
<p>usually, when we're thinking about building a game server backend, there goes the Authoritative Server. PUN/Photon engine has a very <a target="_blank" href="https://doc.photonengine.com/zh-CN/bolt/current/troubleshooting/authoritative-server-faq">good explanation about this</a> </p>
<p>in fact, one could possibly consider Unity + Photon.. just in my case, I have some doubts that I wish to build it along with other NodeJS solutions, and integrate some existing work with it. Hence I found an alternative, which is Colyseus</p>
<h2 id="heading-colyseushttpswwwcolyseusio"><a target="_blank" href="https://www.colyseus.io/">Colyseus</a></h2>
<p>perhaps that it was built on NodeJS, that is what appears to be interesting, having room for expansion and writing custom codes. </p>
<p>that's it at the moment, an introduction to some of the tools that I handpicked, which I think would fit into the Javascript, Typescript full-stack ecosystem. </p>
]]></content:encoded></item><item><title><![CDATA[Your Workplace Developer Experience starts with you.]]></title><description><![CDATA[Developer experience
Photo by Annie Spratt on Unsplash
when the first thing you googled what's DX (Developer Experience) you may come across an article from redhat.com.

Developer experience describes the interactions and feelings that a developer ha...]]></description><link>https://blog.divineforge.com/your-workplace-developer-experience-starts-with-you</link><guid isPermaLink="true">https://blog.divineforge.com/your-workplace-developer-experience-starts-with-you</guid><category><![CDATA[Developer]]></category><category><![CDATA[Experience ]]></category><dc:creator><![CDATA[William Cheong Weelau]]></dc:creator><pubDate>Wed, 08 Sep 2021 16:26:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1630785408038/GOuKCkQ4g.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="developer-experience">Developer experience</h1>
<p>Photo by <a href="https://unsplash.com/@anniespratt?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Annie Spratt</a> on <a href="https://unsplash.com/s/photos/happy-computer?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>when the first thing you googled what's DX (Developer Experience) you may come across an article from redhat.com.</p>
<blockquote>
<p>Developer experience describes the interactions and feelings that a developer has when working with a body of code in order to meet a specific objective.</p>
</blockquote>
<h2 id="my-take-on-the-developer-experience">My take on the Developer Experience</h2>
<p>I have a renewed perspective of Developer Experience when I was reading the book on Montessori education for kids. Essentially it is describing how to prepare the environment, to complement the parent and child interaction. </p>
<p>translating it to our context, this may become preparing the environment to complement the interaction between the People and the Technology. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1631115230010/bOeimO30-.png" alt="PET.png" /></p>
<p>Let's start with people. It's only by becoming the better employer, able to retain employees grow them to be 2x if not 5x or 10x Developers. Building Talents in another word translate to a higher chance of success. </p>
<h3 id="people-interaction-probably-are-the-hardest-however-collaborative-behaviour-could-be-advocated">People interaction probably are the hardest however collaborative behaviour could be advocated.</h3>
<ul>
<li>creating a fixed routine for different activities. Adopting an Agile Framework, either kanban or scrum helps. Expectable routines create a sense of comfortability for everyone. and the following agile manifesto would help to guide us in many debatable situations.</li>
</ul>
<p><img src="https://hygger.io/wp-content/uploads/2021/03/Agile-Manifesto-values.jpg" alt="Agile Manifesto" /> sources from: https://hygger.io/guides/agile/manifesto/</p>
<ul>
<li>People has a different level of imaginations. Software development is often a highly abstract art, the creation process is hardly tangible. Thus creating visuals that assist others in understanding is an ideal approach.</li>
<li>create different views for different audiences. developers may want to data structures, tables, wireframes or flow, business users may want to see screens &amp; flow, stakeholders may want to see components and timeline, roadmap.</li>
<li>do a pulse check on your teammates, ask if they have troubles in their development task. Instead of going solo, going in pair-programming works.</li>
</ul>
<h3 id="decide-on-the-technology-infrastructure-that-is-optimized-for-your-team-delivery">Decide on the Technology, Infrastructure that is optimized for your team delivery.</h3>
<p>decision plays an important role. sometimes we may pick the easiest framework at the beginning and over time then we face problems maintaining it as the code becoming larger, and we have scalability issues. </p>
<p>We realize we may need to overhaul a bit, or doing some refactoring such that we could developer faster in the next iteration. Let's look at some popular opinions versus some conventional choices. The possible flip side of the situation.</p>
<ul>
<li><p><strong>utility based, libraries vs opinionated framework</strong>, this gives developer freedom in the former choice, then over time when there are more developers, more business requirements, everyone has their style and way of structuring the codes, more utils being added.</p>
</li>
<li><p><strong>the microservices vs mono-repo, monolithic design</strong>, it's nothing wrong to pick microservices, it gives a certain degree of freedom. it also means increasing demands on the team size more redundant infrastructure, and setup, introducing certain complexity. </p>
</li>
</ul>
<p>evaluate what's best for your situation. Everyone's mileage may vary. Trust the gut feeling. Take it with a pinch of salt. You just need to courage to make it happen.</p>
<blockquote>
<p>Loose Coupling and High Cohesion</p>
</blockquote>
<p>this is one of my favourite guiding principles when managing technology. 
Applying the right amount of abstraction to make things simpler, show people what actually need from your class, your service, or your API. Things should be loosely coupled, reducing any dependencies on others. such that impacts are dampened, and made minimal, avoiding the domino effect of ... collapsing.</p>
<p>Write readable code, may employ longer variable name, annotation, comment, descriptive API routes, setup an accessible swagger document that allows instant testing, or GraphQL Playground</p>
<p>Last by not least, share your favourite IDE + Extensions that delight your day to day working experience. 💻</p>
<h3 id="cultivate-a-delightful-and-safe-environment-for-collaboration-question-and-discussion">Cultivate a delightful and safe environment for collaboration, question and discussion</h3>
<p>A few things for consideration:</p>
<ul>
<li>how easy to boot up a local development on a developer machine? </li>
<li>is there a quick start markdown <code>README.md</code> to provide insight into the software?</li>
<li><p>do you have a communication platform for questions, pinned notes, and different spaces for specific topic discussion? - think of tools like Slack, Discord, or Webex, (with workspace &amp; team in mind)</p>
<p>each individual can do something to change the energy &amp; atmosphere in a team. If you practise being calm, it generates a sense of peaceful moment with your presence. if you're helping people with understanding, providing clarity, people feel good with your presence too. If you're volunteering to assist in those seeming important works by gotten least attention (e.g. project configuration, document, build automation tools, scripts, posting of information, organized materials &amp; docs), you might notice as-if the entire engine runs with lubricant, and things go smoother</p>
</li>
</ul>
<p><strong>Always keep trying</strong> (regardless if disappointment, mismatched expectation happened). Aim to create a Positive Learning Experience for your teammates. The harmony ends the moment when someone said he/she tried. There are ups and downs, just learn to rejuvenate over the never-ending journey of development. </p>
<p>Meanwhile allow trials and errors, creating a safety net, and allow the margin for any experiment. Practising effective source-control like Git, mastering the proper tagging, branching, cherry-pick, interactive rebase, could almost save disaster that happened to the project code repository.</p>
<blockquote>
<p>TIPS: if someone ever struggled to set up the complete environment, make some of the components shareable, runs it in the cloud, creating a common backend API, or shared database. this would greatly enhance the developer experience.</p>
</blockquote>
<p>At the end of the day, culture plays a large part in determining the overall success of the project execution. </p>
<ul>
<li>Are we helping each other to be better Developers?</li>
<li>Are we creating competition or we're welcoming voluntary contributions? </li>
<li>Are we creating a vicious loop to add stress &amp; question to everyone or do we pause for a moment to assist our peers in delivering their work?</li>
<li>Are we the ever-busy person, or do we actually make time to assist our teammates to solve problems together?</li>
</ul>
<blockquote>
<p>TIPS: a fully 100% utilized day is most probably the unproductive approach. Less is more. Make room for imagination, experiment, and exploration. </p>
</blockquote>
<p>Many aspects were actually answered in the Scrum methodology. 
We do carry the responsibility to shape our environment, value adds to the technology and positively influencing our colleagues for a better developer experience.</p>
]]></content:encoded></item></channel></rss>