Mar 14, 2026

TEDUH Chrome Extension is back, and now it works in a much better way

Some time ago, I built a Chrome extension called Teduh Unit Counter to help property buyers browse TEDUH more conveniently. The earlier version has since been marked deprecated after TEDUH revamped its website and removed the old direct, URL-friendly experience.

In the old version, the extension depended heavily on the webpage UI itself. 

It needed the TEDUH page to load first, then it would read and extract the information shown on screen. That approach worked before, but it became much more fragile once the new TEDUH frontend was introduced.

What changed in the new version

The revived version now works in a very different way.

Instead of depending on the TEDUH webpage UI to expose the data, the extension now retrieves the information directly from TEDUH's server-side endpoints. This means the extension no longer needs to rely on opening a specific project page and scraping the rendered page content just to get the data.

From a technical point of view, this is a much stronger foundation than before.

Why this is better

  • Lookup is faster because the extension requests the data directly
  • It is less dependent on TEDUH's frontend layout and modal flow
  • The user experience is cleaner because data retrieval no longer depends on page rendering
  • The extension is now easier to maintain when the website UI changes again

What remains in real time

The project details and unit list are now retrieved live whenever a lookup is performed. In that sense, the extension now gives a real-time TEDUH lookup experience in a more direct way than before.

The trade-off

There is still a trade-off.

The old version was tightly coupled to the TEDUH webpage flow, so some page-specific observations were easier to derive directly from what was visibly loaded in the browser. The new version no longer depends on that rendered UI layer.

However, this does not mean newly sold tracking is completely gone. The extension still keeps track of newly sold units by comparing the latest fetched unit statuses with the previously saved local snapshot. So the feature still exists, but it is now based on local comparison logic rather than depending on the TEDUH webpage display itself.

Why I think this is the right direction

The old extension solved a real problem, but it was tied too closely to the website structure. Once the TEDUH frontend changed, the original approach naturally became outdated.

Rebuilding it around direct server-side data retrieval makes the extension more practical, more stable, and more future-resistant. It also makes the TEDUH experience much more convenient again for users who just want quick access to project information without clicking through multiple layers of UI.

Final note

So yes, the TEDUH Chrome extension is back.

This time, it is not just revived. It has been rebuilt on a better approach.

The previous version depended on the webpage. The new version talks to the data source more directly. That is the key difference, and it is exactly why the new version now comes back stronger than before.

Mar 6, 2026

My Experience Running MystNode on Phone, Computer, and Raspberry Pi

Do you know you can run MystNode from your phone or computer to contribute your idle internet connection and earn a little MYST with it?

I've been trying MystNode for quite a while - from Android phone, to the Chrome browser extension, until I finally settled on running it 24/7 with a Raspberry Pi.

From my experience, Raspberry Pi is the most convenient way to run it. I barely need to care about it, the device itself is cheap to keep on 24/7, and it's always there doing its job.

Running it on Android or computer feels more manual. Sometimes it goes offline for unknown reasons, possibly due to connection issues, and MystNode may turn itself off automatically. That means you need to check and reactivate it again.


Don't put too much expectation on how fast you can earn.

At first, I kept checking the earnings again and again until I eventually gave up, because the manual upkeep just didn't work well for me mentally. I had to be disciplined enough to keep it running properly. Switching to Raspberry Pi completely changed my view of the whole earning experience.

The earning rate is heavily geography-dependent. Nodes in countries with higher traffic demand naturally have more earning potential than those in lower-demand countries. So if you're running a node from a lower-demand country, it's better not to expect too much.

That said, I came back to it because of curiosity and experimentation. The journey wasn't very smooth, but I eventually understood better how it works, accepted the lower earning rate in my region, and honestly felt the experience itself was more valuable than the actual returns.

If you're curious, it's worth trying at least once.


MystNodes has also just released a new rewards system. From what I understand, you can now earn points in multiple ways, including by holding at least 100 MYST in your linked wallet. Running MystNode also contributes through uptime and shared internet traffic, so you may end up benefiting from more than one source at the same time.



I only found out about this new rewards system today, and since it was launched only a few days ago, I can't say yet how much the final result will be after one month. That part still needs time to see.

If you want to try it, here's my referral link:

https://mystnodes.co/?referral_code=9k0hY5CNpL13VRxicOmzMDR6ByK5AGT0TZhAHX6S

According to MystNodes, new users joining through a referral link can get a 5% bonus for one month from their MystNode earnings.

Enjoy earning with your spare internet traffic.

Feb 26, 2026

DevStorage - Chrome Webstore (simple quick tool for web dev)

DevStorage Is Live

Short announcement post

I am excited to share that my new Chrome extension, DevStorage, is officially live.

This started as a small side project. Not a startup idea. Not a big launch plan. Just a tool I built because I kept running into the same annoying workflow issue during local development.

If you have worked on modern web apps for a while, you probably know the feeling. You are testing authentication. You are toggling feature flags. You are simulating user states. And at some point, you end up deep inside Chrome DevTools trying to inspect or edit localStorage.

It works, technically. But it is not smooth.

You switch tabs. You open Application. You expand Storage. You scroll through keys. You copy and paste JSON. You clear everything when you only meant to delete one item. Then you start over.

After repeating that cycle enough times, I decided to fix it for myself. That is how DevStorage was born.

Chrome Web Store listing: DevStorage

What DevStorage does

DevStorage is a lightweight Chrome extension that makes working with localStorage faster and less frustrating.

It lets you view keys clearly, edit values quickly, remove specific entries without wiping everything, and clean up storage without digging through DevTools every time.

The goal was simple: reduce friction.

I did not want to replace DevTools. I just wanted something that feels more direct when you are in the middle of debugging and need to adjust storage quickly.

When we are building SPAs, storage becomes part of the debugging loop. Tokens live there. Feature flags live there. Temporary state lives there. Having fast access to that data saves time, especially when you are jumping between environments or testing edge cases.

Why I decided to ship it publicly

Originally, this was just a small internal helper. I built it to make my own workflow cleaner.

But after using it for a while, a teammate asked how I was managing storage so quickly. That is when I realized it might actually help other developers too.

Shipping it publicly forced me to polish things properly. Clean up the UI. Double-check permissions. Make sure performance stayed tight. Write clearer descriptions. Remove things that only made sense to me.

That process alone was valuable. It reminded me that even small tools deserve thoughtful design.

What I focused on while building it

I kept the scope intentionally narrow.

The first version does one thing well: it gives developers clean, fast control over localStorage.

I avoided adding too many features. No analytics. No cloud sync. No complicated dashboards. Just a focused interface that shows your storage clearly and lets you manage it without noise.

One thing I learned is that simplicity takes effort. My early versions had more buttons and more UI states. It looked powerful, but it felt heavy.

So I asked myself a basic question: what do I actually use every day? Anything that did not serve that answer got removed. That decision made the extension better.

What building this taught me

Even though this is a relatively small extension, it reinforced a few lessons for me.

Chrome extension architecture matters more than you think. Understanding permissions, background scripts, and storage APIs early saved me from messy refactors later.

UI clarity is harder than writing logic. The functionality worked early on. Making it intuitive took longer.

And most importantly, developer tools should feel invisible. When you click the extension icon, you should not have to think. You should just see what you need and move on.

That was the benchmark I kept testing against.

Who this is for

DevStorage is useful if you regularly work with localStorage during development.

If you debug login flows, test feature flags, simulate user states, or often need to reset specific keys without clearing everything, this will probably save you time.

If you rarely touch browser storage, you might not need it. And that is fine. I would rather build something focused that genuinely helps a specific group of developers than something broad and generic.

What is next

Now that it is live, the real work begins.

I am paying attention to feedback and watching how people actually use it. There are ideas I am considering, like adding search, supporting sessionStorage, or allowing export and import of storage snapshots.

But I do not want to guess what developers need. I would rather improve it based on real workflows.

If something feels awkward or unnecessary, that is exactly the kind of feedback I want.

Final thoughts

DevStorage started as a small fix for a daily annoyance. It turned into a public Chrome extension that I am genuinely proud of.

It solves a real problem in my workflow. That alone makes it worth building.

If you spend time debugging browser storage, give it a try. And if you are building small tools of your own, I would encourage you to ship them. You do not need a huge idea to create something useful. Sometimes removing a tiny bit of friction is enough.

If you try DevStorage, let me know what you think. I am always open to improving it.

Feb 3, 2026

Simple systems just survive longer

Why simple systems survive longer

Simple systems tend to last because they're easier to maintain, explain, test, and recover. Complexity can create short-term speed, but simplicity builds long-term trust.

  • When a system grows, break it into smaller chunks (modules/services) so changes stay local and safer.
  • Give each chunk a single purpose and clear boundaries, so it can be understood and evolved independently. (Not "isolated forever" - just intentionally scoped.)
  • Keeping chunks small and maintainable is one of the most reliable strategies in system design - not a universal law, but a principle that keeps paying rent.

Keep it small. Keep it clear. Keep it alive.

Jan 20, 2026

Lat/Lon vs Lon/Lat in GIS: Why the world wants to keep them so confusing?

Every time I touch GIS coordinates, I hit the same trap: sometimes coordinates are written as latitude then longitude, and sometimes they are longitude then latitude. Both look valid, both are common, and the mistake often does not throw an error. Instead, the point quietly lands in the wrong country, or worse, in the ocean.

This post is my quick reference: first the mental model (why the order differs), then the technique I used in my own project to stop the confusion from spreading.

A picture of the classic bug

When lat and lon get swapped, a real point often ends up "somewhere in the ocean." (If you are adding an image here, upload it to Blogspot first, then insert it into this section.)


A red GPS map pin floating alone in the ocean, representing swapped latitude and longitude coordinates.
A swapped coordinate pair often becomes a pin in the ocean, with no error messages.

The two worlds that collide

There are two different coordinate traditions that keep clashing:

1) Human geography tradition: (latitude, longitude)

Most people learn latitude and longitude in school as:

  • Latitude: north or south (up and down)
  • Longitude: east or west (left and right)

So a location is commonly written as:

  • (lat, lon)

Example for Kuala Lumpur (approx):

  • (3.1390, 101.6869)

This feels natural because we say "latitude and longitude" in that order.

2) Mapping and GIS tradition: (x, y) which becomes (longitude, latitude)

Most mapping engines and GIS systems think in Cartesian terms:

  • X axis is horizontal
  • Y axis is vertical

When coordinates are mapped into (x, y):

  • X corresponds to longitude
  • Y corresponds to latitude

So in GIS engine terms the same point becomes:

  • (lon, lat)

Same Kuala Lumpur example:

  • (101.6869, 3.1390)

This is not random. It is the consistent "x first, y second" rule.

The most important practical rule: GeoJSON is strict

If I am dealing with GeoJSON, there is almost no debate:

  • GeoJSON Point coordinates are always [longitude, latitude]

Example:

{
  "type": "Point",
  "coordinates": [101.6869, 3.1390]
}

If I swap them to [lat, lon], the data is still valid JSON, but the point ends up in the wrong place. That is why this bug can be so annoying.

Databases and spatial functions usually follow x, y too

Many spatial databases and geometry constructors follow:

  • (x, y) = (lon, lat)

Even if a library accepts different input types, the underlying geometry model is still "x then y."

Why this confusion keeps happening

  1. People say "lat/long" in that order for decades, so apps and UIs follow it.
  2. GIS engines and geometry models prefer "x/y," which becomes lon/lat.
  3. Some libraries try to be helpful and auto-swap depending on context.
  4. Some standards define axis order, but older systems may ignore it, so behavior varies.

The technique that stopped it in my codebase

The conceptual explanation is useful, but it does not prevent bugs. What actually helped was enforcing one simple rule: never manually swap coordinate order scattered around the code.

Instead, I introduced a single conversion layer that acts as the boundary between:

  • Frontend map UI (Leaflet), which naturally works with (lat, lng)
  • Storage and backend models, which I keep aligned to (lng, lat) / (x, y)

Concept: "Coordinate conversion layer"

In my project I called it CoordinateConversionService, but the important part is not the name. The idea is: create one dedicated place that converts between formats, and make every other part of the app call into it. This turns a messy convention problem into a controlled interface.

Typical responsibilities of this conversion layer:

  • Convert Leaflet coordinates (lat,lng) to GeoJSON coordinates (lng,lat) for saving.
  • Convert GeoJSON (lng,lat) back to Leaflet (lat,lng) for rendering.
  • If the backend stores GPS as x,y, keep x=lng and y=lat consistently.

Quick example

// Leaflet UI (lat, lng)
[2.765207, 102.904707]

// GeoJSON storage (lng, lat)
[102.904707, 2.765207]

// Backend GPS model (x=lng, y=lat)
{x: 102.904707, y: 2.765207}

Concept: "Update direction guard" (to avoid feedback loops)

A second practical issue appears in map editors: there are two ways a coordinate can change.

  1. User drags a marker on the map, and the form fields must update.
  2. User edits the coordinate fields, and the marker must move.

If both directions trigger each other, the app can end up in a loop or jittery updates. The simplest fix is to track the source of the current update.

In my project I used a flag named isUpdatingFromMapDrag. Again, the name is not the point. The concept is: when the map drag handler is actively pushing values into the form, temporarily ignore form-driven map updates (or vice versa).

This guard makes the editor stable and prevents accidental recursion.

A small but important rendering detail

When only a marker position changes, I update the existing marker in place (for example, Leaflet's setLatLng) instead of clearing and re-adding layers. This avoids flicker and "marker disappeared" bugs.

My cheat sheet

  • Human-friendly display: often (lat, lon)
  • GIS engine, GeoJSON, storage: usually (lon, lat)
  • Practical rule: keep one conversion boundary and forbid manual swapping elsewhere
  • Editor stability: use an update-direction guard to avoid feedback loops

Final note to future me

If a point suddenly appears in a completely wrong place and there are no errors, check coordinate order first. If the codebase has a conversion layer, the bug is usually that some new code bypassed it.

Jul 30, 2025

Fixing WSL2 "Access Denied" Error on Windows After Reboot

If your WSL2 suddenly throws an error like:

Failed to attach disk 'F:\ext4.vhdx' to WSL2: Access is denied.
Error code: Wsl/Service/CreateInstance/MountDisk/HCS/E_ACCESSDENIED

This usually happens because Windows lost permissions to access your WSL2 disk image (ext4.vhdx). Here's a quick fix:

Step-by-Step Solution

  1. Open PowerShell as Administrator.
  2. Run these commands (replace F:\ext4.vhdx with your actual VHDX file location):
    $VhdPath = "F:\ext4.vhdx"
    wsl --shutdown
    icacls $VhdPath /grant:r 'SYSTEM:(F)' 'Administrators:(F)' /inheritance:e
    icacls $VhdPath /grant '*S-1-5-83-0:(M)'
    attrib +R $VhdPath
  • This sets permissions properly for SYSTEM, Administrators, and WSL2 Virtual Machines.
  • The attrib +R command makes the file read-only, preventing antivirus or backup software from interfering with permissions.
  1. Restart WSL2 by simply running:
    wsl

Confirm the Fix

To double-check permissions:

icacls $VhdPath

You should see entries for SYSTEM, Administrators, and a group SID starting with S-1-5-83-0.

That's it! Your WSL2 environment should now work smoothly after reboots or updates.

Jul 9, 2025

Update: Newly Sold Unit Indicators in Teduh Unit Counter

Back in May, I introduced a Chrome extension called Teduh Unit Counter, built to help users track property unit availability more efficiently while browsing the Teduh housing platform.

After receiving helpful feedback from users monitoring multiple projects, I've added a new enhancement that makes it easier to identify recently sold units, without needing to manually compare listings each time.

What's New: Highlighting Newly Sold Units

The latest update introduces the Newly Sold Unit Indicators feature. It flags units that have recently been marked as "Telah Dijual" (sold) since your last visit. This makes it faster to identify changes, especially for users keeping an eye on specific buildings or units.

Newly sold unit indicator


How It Works

1. Automatic Comparison

When you load a property page, the extension checks for any units that have changed from "available" to "sold" by comparing the current page data with previously stored unit status.

2. Data Storage

The newly sold unit data is saved in Chrome's localStorage under the newlySoldUnits key (in short, what it means is that the data persists even after the browser is closed, and no data is being sent to external servers, no privacy concerns). Each entry contains:

  • unitNumber: The unique identifier of the unit
  • dateMarkedSold: The timestamp when the unit was marked as sold (stored in ISO format)

3. Visual Highlight

To make changes easier to spot, units newly marked as sold are styled with:

  • A light yellow background
  • Red text and a yellow border

4. UI Panel Updates

The extension popup now includes a dedicated section showing:

  • The total number of newly sold units
  • A list of unit numbers
  • The most recent sold timestamp, e.g., "July 2, 2025, 14:30"
  • A "Mark as Read" button to clear these highlights after reviewing

5. Persistent Across Sessions

All data remains intact across browser sessions. When you revisit the same project, you'll still see what was previously marked as sold, until you manually clear it.

Why This Matters

Tracking changes in property listings can be tedious, especially when revisiting projects to check what's been taken. With this new feature, users can:

  • Save time by focusing only on new changes
  • Improve clarity with color-coded visual indicators
  • Make informed decisions with real-time updates

What's Next

This update is part of a larger plan to make the extension more intelligent and intuitive. Some upcoming ideas:

  • Optional desktop notifications for sold updates
  • A unit history tracker
  • Multi-project summaries

If you're using the extension and have ideas to improve it, feel free to reach out, feedback is always welcome.

Recap: Key Features in This Update

  • New Newly Sold Unit Indicators feature
  • Tracks changes in unit status between visits
  • Stores sold data in localStorage with timestamps
  • Visual highlight with yellow background and red text
  • Extension UI shows sold unit summary with clear date/time
  • Data remains available until manually cleared

You can install or update the extension from your Chrome browser as usual. Stay tuned for more updates in the future. If you have already installed the extension, it should automatically update to the latest version.

May 21, 2025

(Deprecated) Chrome Extension: Teduh Unit Counter

Update: Since the Teduh website was completely revamped, this extension has become unusable. The new site structure is far less URL-friendly, eliminating quick, direct access to individual project information.                

Jan 2, 2025

The Magic Behind GPT: How Does It Work?

Have you ever wondered how ChatGPT, or any large language model (LLM), understands your input and crafts a coherent response? 




From the moment you type your query to the instant you receive a detailed reply, there's a complex journey happening behind the scenes. 

While I’ve included a flowchart link to break down this cycle visually, let’s briefly explore the main steps that drive this incredible technology. 

Understanding the cycle can demystify how these LLM operates and highlight just how powerful they truly are. 

Overview of sequence of LLM

User Input > Tokenization > Context Management > Self-Attention > Contextual Analysis > Token Prediction > Response Generation > Return Output to User

 


LLM workflow overview

Oct 3, 2024

Staying Ahead in the AI Game as a Web Dev

Major AI Trends in 2024: Staying Ahead in the AI Game

Hey there! So, AI has been on a wild ride lately, right? If you're keen on keeping up and making the most out of what's new, let's chat about the biggest AI trends of 2024 and how you can dive in.

1. Generative AI is Booming

Generative AI is seriously shaking things up.

  • In Web Development: Tools like GitHub Copilot and ChatGPT Code Interpreter have become total game-changers. They're super helpful for cranking out boilerplate code, automating tests, and even debugging.

  • For Media Creation: Ever tried OpenAI’s DALL-E 3 or RunwayML? They're making text-to-image, audio, and video generation a breeze. If you're into tech, it's worth looking into how you can weave these into your web projects.

Takeaway: Get cozy with these tools, they're becoming essential for boosting productivity and sparking creativity.

2. AI Agents are on the Rise

Autonomous AI agents like AutoGPT and BabyAGI are gaining traction. They're designed to tackle entire tasks without you having to babysit them constantly.

Action Step: Play around with these agents to automate chunks of your workflow. Especially handy for side hustles that involve research or repetitive tasks. Imagine freeing up time from routine stuff!

3. AI Meets the Cloud

AI is digging deeper roots into cloud services like AWS Bedrock, Azure OpenAI, and Google Vertex AI. They're offering pre-trained models you can plug right into your apps for things like sentiment analysis or recommendation engines.

Action Step: Learn how to tap into these cloud APIs. It could give your web apps a smart edge without you having to reinvent the wheel.

4. AI is Shaping UX

User experience is getting a makeover thanks to AI.

  • Smarter UX Tools: Tools like DebugBear are using AI to boost web performance. It's all about optimizing design based on how users actually behave and predicting what they'll do next.

Action Step: If you're building apps, check out AI tools that can analyze user interactions and tweak the experience on the fly. Personalized and efficient interfaces? Yes, please!

5. Ethical AI is a Big Deal

With AI everywhere, people care more about how it's used. There's a push for explainable AI and making sure it's fair and transparent.

Action Step: Get familiar with ethical frameworks like LIME and SHAP for explaining AI models, and Fairlearn to keep things fair. It'll help you build trust and stay on the right side of regulations.

Tips for Your AI Journey

1. Keep it Technical

You're rocking web development with Angular and Ionic, so why not amp it up with AI? Tools like OpenAI’s APIs or Hugging Face can add some serious firepower to your projects.

Next Step: Start playing with models, fine-tune them for what you need or use them to spice up content in your projects.

2. Side Hustles + AI = Win

AI can take your side gigs to the next level. Whether it's micro-SaaS, freelancing, or data dashboards, adding AI can make your offerings stand out.

Action Step: Think about offering AI-powered services like chatbots or data analysis to small businesses. It's a great value-add that clients will love.

3. Level Up Your AI Knowledge

Dive deeper into Machine Learning frameworks like TensorFlow, PyTorch, and AutoML. Even if you're not building models from scratch, knowing how they work can help you implement and tweak them better.

Action Step: Check out TensorFlow.js, it's all about running ML models right in the browser. Could be a cool addition to your web dev toolkit.

Cool Tools & Platforms to Watch

  1. Meta’s LLaMA 3: An open-source language model that's super flexible.

  2. Anthropic’s Claude: Focused on making AI outputs safe and reliable.

  3. DeepMind’s Gemini: Google's next big thing, aiming to handle text, images, and more all at once.

Why This Matters

  • Generative AI: It's becoming a staple for getting things done faster and more creatively.

  • AI Agents: They can handle the boring stuff, freeing you up for bigger ideas.

  • Cloud Integration: As AI becomes more cloud-friendly, it's easier to scale your projects without heavy lifting.

  • Ethical AI: Building trustworthy AI isn't just good karma, it's what users and regulators are starting to expect.

Next Steps to Kickstart Your AI Adventure

  1. Choose Your Path: Figure out if you want to dive deeper into AI in web dev, cloud services, or automation for projects.

  2. Get Hands-On: Apply AI to something you're already working on. Maybe automate content creation or jazz up the UX with some predictive magic.

  3. Learn More:

    • Coursera: They have awesome courses on generative AI and cloud-based AI.

    • Hugging Face: Great for getting practical with AI models.

    • AI Ethics Guides: Google and Microsoft have resources that'll get you up to speed on building responsible AI.

Wrapping Up

AI is moving fast, and 2024 is shaping up to be a big year. Whether you're integrating AI into your current projects or starting something totally new, there's no better time to jump in. Stay curious, keep experimenting, and have fun with it!

Aug 29, 2024

Migrating from tslint (of an old project) to eslint - Angular Project

Since TSLint is no longer maintained, it’s time for us to migrate to ESLint, especially if you’re working with TypeScript or Angular projects. Don’t worry, it’s quite straightforward if you use the tslint-to-eslint-config tool. Let me show you how to do it quickly.


Migrate Using tslint-to-eslint-config

1. Install the tslint-to-eslint-config Tool:
First things first, you need to install the tslint-to-eslint-config tool. You can install it globally or just within your project.

npm install -g tslint-to-eslint-config

Or, if you prefer to keep things local:

npm install --save-dev tslint-to-eslint-config


2. Conversion Command 

let’s use the tool to convert your TSLint config to ESLint. This command will create a new .eslintrc.js file for you, no need to worry.

npx tslint-to-eslint-config

3. Check the Generated ESLint Config

Open up the new .eslintrc.js file and take a look. The tool does most of the work for you, but sometimes you might need to tweak a few things yourself.

4. Install ESLint and Plugins

Install necessary plugins (you may not have it until now)

npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin 

5. Update Your angular.json

Don’t forget to update the angular.json file to use ESLint instead of TSLint. Just change the lint builder to something like below

	
		{
  "projects": {
    "your-project-name": {
      "architect": {
        "lint": {
          "builder": "@angular-eslint/builder:lint",
          "options": {
            "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
          }
        }
      }
    }
  }
}
	

 6. Run ESLint to Check Everything

time to run ESLint and see if everything is okay, fix any problem that listed by it and your code would be soon clean & clear.

npx eslint . --ext .ts,.html

7. Clean Up the Old TSLint Stuff

Once everything’s good, you can delete the old tslint.json file and any TSLint dependencies you don’t need anymore.
That’s it! By using tslint-to-eslint-config, you can migrate to ESLint easily and keep your project up to date. Senang je!
Happy coding, and jangan lupa to keep your code clean!

Mar 18, 2023

Making internet a safer place by running Snowflake proxy

What is Snowflake?


Taiwanese F&B Brand - Snowflake (雪花栈)

Of course, this is not about the food!

The Snowflake plugin offered by TorProject is an excellent tool for making the internet a safer place. You can easily download this plugin for free from the Chrome Store.

How does it work?

Think of it as a USB stick storage device that we use in our everyday lives. 

The plugin can be plugged into any computer, much like the internet can be accessed from any place any time. If you close your browser, the plugin automatically stops and becomes "unplugged" from the internet.

On the other hand, when you open your browser, the plugin again connects your internet to the Snowflake network, making it more secure and private.

How does "plugging your internet" help others bypass censorship?

So after the Snowflake plugin connects to the Snowflake network, that means you are already participating in the Snowflake network, and you can start helping to support the fight for online freedom and accessibility around the world.

To put it simply, when you use a Snowflake proxy like many other volunteers, it enables internet users on Tor Browser to bypass censorship and conceal their identity by "randomly bouncing" through a vast network of proxies.


Have fun safeguarding the internet from censorship.

Jun 9, 2022

Step'N GameFi, earn by moving around

 Warning: There is absolutely no financial advice on this or on any other pages of this blog.

Good news!

Jogger, runner and walker, you can now earn by staying healthier!

If you have been around the GameFi space, then surely you already know this controversial project. This project offer utility token, the GST (green satoshi token) as rewards, and this is the token you need to spend in order level up/upgrade/buy equipment so your sneaker earn even more.

In the same time, GST value has been very volatile, its value has been dragged by the overall value clash around the crypto space. It went to 10USD and now drop to 0.53USD by the time of this writing. So for me, enjoying the game at lower cost/loss is better when the game item in the game is lower in price (compared to peak price on April 2022, which range around 12-18 sol).

Drop from USD5 to USD0.53



Before you start, please do your own research (DYOR), don't invest with your hard earn money which you can't risk losing. Again, the value of GST has been dropping from approx 10usd to 0.50usd, and this has pushed away many investor who joined at the peak floor price and hope for just profit instead of enjoying the game. Be informed!

How to get started?

  1. Download the app from Apple app store or google play (visit official website for download link: https://www.stepn.com/howToPlay)
  2. Get activation code from Stepn discord or get the code from your friend who has it
  3. Create a wallet and keep your private key (seed) in a safe place (if anything, you'll need this key to recover the access to your wallet)
  4. Deposit Solana into your wallet
  5. Transfer solana from wallet to your spending wallet
  6. For starter, look for a sneaker with good Efficiency and Resilience (you can ignore luck and comfort at the early stage of the game)
  7. Try start moving with the app without any owning sneaker (Test the speed you like, so you aware of which type of sneaker you should own, there are walker/jogger/runner/trainer)
  8. Buy a sneaker (If you don't exercise often, I recommend getting a "walker" to start with)
  9. Wait energy to be filled (2 max for first timer), your energy will get filled up 1/4 of your max energy every 6 hours.
  10. Once you have the energy filled, start walk/jog/run & earning!


Delving deeper in the "why"

Point 7 is important, to make a wise choice, you should consider which speed you can keep steadily for a period of your effective energy spending period. Given that you have 2 energy to spend, it gives you 10 minutes of moving time. If you have a runner type sneaker, this sneaker expect you keep maintaining the speed between 8km/h - 20km/h for 10 minute to maximise the earning.

Any speed outside of this 8-20km/h is not calculated into your earning, it means you are losing the earning as you can't maintain the speed.

Type of sneaker
  • Walker: 1 - 6 km/h
  • Jogger: 4 - 10 km/h
  • Runner: 8 - 20 km/h
  • Trainer: 1 - 20 km/h (this is best option, but it's also the most expensive type)
I'm not a runner, I seldom move at the constant speed of 8km/h, my stamina has room for improvement, I regret my purchase now. All in all, test your preferred speed first before you make your purchase decision.


For me, getting a walker in Point 8 is safest.
I walk my dog often, with that I don't move very fast and usually it falls between the 1-6km/h range. This speed is also reasonable speed for a daily random walk around the street, I won't get wrong moving within this speed range.


Apr 27, 2022

Earned 20 Myst running Mysterium node for 3.5 months

Warning: There is absolutely no financial advice on this or on any other pages of this blog.

Earned 20 Myst 

You do the math to evaluate if it is worth running the node at home. 20 Myst is approx USD6, you earned roughly 2 dollars a month. This calculation also discounted the electricity used to run the node.

It really depends on the userbase of the ecosystem, if not many users are looking to run their internet as your geolocation, you may earn really less.


Withdrawal transaction fee that's costly a little too much

The settlement fee is fixed at 20% + the blockchain fee.
So, with these fees, you are losing more than 20% of your earnings each time you withdraw.

The settlement with a 20% earnings deduction

If you earned 5 myst, your final income is roughly 4 myst. And this withdrawal is done automatically whenever the earnings reach 5 myst.

Next, you can also see the exact amount you are getting from their [Auto withdrawal: On ] button.




Honestly, I'm not a fan of the 20% settlement fees, I believe no one does like it. For node runners with low earnings already not getting much, the 20% further reduces the motivation causing us to lose interest fairly quickly. Hopefully it's something Mysterium Network would focus to improve in the near future to help and motivate the low earners.

Jan 3, 2022

Trying to earn MYST crypto with my unused bandwidth, but...

Warning: There is absolutely no financial advice on this or on any other pages of this blog.

New Updates: 

Monday, 17 January 2022


Dashboard Overview

The screen below will give you the insights about how your node is being used.
My 1.10MYST earning took me 10 days, at the time of this writing, it worth around 50cents USD.

Dashboard Overview

The earning is fairly slow, and don't forget there is a 20% fee before you can cash out (the settle button) your MYST.
20% blockchain fee

If 10MYST earned, we only get a clean 8MYST profit, but earning just 1 MYST is quite hard already, because you don't often get active session frequently.
The earning is slow, plus the 20% blockchain fee, I have the feeling not much node hoster has positive impression about this "profit".

But from a Mysterium Network dVPN consumer's point of view, this is a very cheap choice! 
Using its dVPN service for 24/7 without heavy traffic, and stay active for a non-stop year could possibly cost only 10MYST which is less than USD5

If the VPN security and stability result turns out great, we may no longer need to consider other high reputation and highly priced VPN service provider.


Sunday, 9 January 2022

After few days of waiting, my node is up and running now. I did file a report to Mysterium customer support, and this is what I received! Not instant, but at least I now acknowledged it's the surge of registration which need more time to process before my node is successfully accepted.

My suggestion: A better error message in the UI may help user to be more patient with this similar kind of issue.



Nov 18, 2021

Create a bootable USB stick with Mac to install Debian

UPDATE: Tuesday, 22 February 2022

I discovered an alternative open-source and safe tool we can use to do the same "burning" (flashing) action, no complex and scary commands code is needed to do this. Plus, this software is available on almost any platform.

It's always better and safer to download the tool directly from its official website: https://www.balena.io/etcher/


Nov 15, 2021

Jasmine in Angular Unit-test: Modify a Read-only value with "Object.definedProperty"

If you are using Typescript and when you're not as well-versed with it (like I do), then surely you'll come into type issue from time to time.

If unlucky, eslint will also give you some headache time during your development work too, but that's good sign that you are learning.

Problems

Modifying a read-only value in Angular Unit-Test (*.spec.ts) files will give you warning like below:

Cannot assign a value to a read-only property even on Unit Test script

the routerSpy is a mocked Router from '@angular/router'.

let routerSpy: jasmine.SpyObj<Router>;


Solution

With the help from native Javascript Object.defineProperty(), we can set value manually through method below:

Set value through Object.defineProperty


Nov 2, 2021

Oh no! Now I learned my lesson, I missed the best time to cash out Banano!

Recently, Banano value jump to the peak of $0.05USD from its usual $0.009USD. And sadly, I wanted to cash out my banano and I can't because I have no idea how to do it!

Banano - From $0.009USD to $0.054USD

I've learned my lesson, I missed the best time to cash out while keep seeing the value drop before my very eyes. So I hope this article can help someone who has the same situation as I did.

If you've follow my post earlier about Folding@Home (FAH), by now you may have learned how to earn it, or may already have some Banano in your wallet.

What's next?

Yup, as everyone would has, the same question with regard to "what can we do about the earned banano?". If you have the same question, you are at the right place! Let's go through the steps together below!

Wrapping Banano into Wrapped Banano (wBan)

You can convert (or wrap, that's how they call it) your Banano into wBan before you can do anything with your hard earned Banano. 

In this article, I would only focus on WHAT instead of WHY. The "WHY" topic is a whole conceptual topic to discuss about, especially when I hope to make it more beginner friendly for those who are new to the blockchain world. P/s: Btw, I'm not an expert though, there are a lot more stuff to explore.

Steps: Banano to wBan Wrapping

In the steps section, what's writen below are based on Chrome browser (it has the most user base).

Prerequisites

Before you can continue, you must have:
  • BNB, Binance Coin (beginner may find this difficult. Be warned, spending a little real money, or fiat money, to make this transaction success)
  • Banano coins
  • A Banano wallet
  • Chrome Browser
  • MetaMask from Chrome Web Store
  • Created wallet in your MetaMask with some BNB deposited (approx ~$2USD)

Steps

  1. Install MetaMask Chrome Extension
  2. Visit bsc.banano.cc and "connect" your wallet through MetaMask (chrome extension from 1st step)
  3. Follow the wallet creation step as needed in MetaMask (follow the instructions from the extension)
  4. Transfer your banano to wBan (make sure your sender and receiver addresses are accurate, it's always better to us QR scanner than typing it manually)
  5. After trasnfered, your Ban coin will show up pretty fast. Fill in amount you want to wrap into wBan.
  6. Before you can continue, please make sure you have a little amount of BNB in your MetaMask wallet for "gas fee" or transaction fee. (You can get it through many platform: check out the "buy" button here)
  7. After purchasing from a platform, first you need to transfer them to your MetaMask BNB coin wallet address. Yup, this transaction cost gas fee too.
  8. Back to the wBan wrapping screen you now can start wrapping. Add wBan coin to your wallet by pressing "Add wBan to MetaMask" button.
  9. Pressing the "wrap" button, MetaMask will prompt you to confirm the transaction.
  10. After the transaction is confirmed, amount of wrapped wBan will reflect on your MetaMask wallet. 
  11. Convert/swap your wBan to different coin, where this coin must be a coin that allow you to easily cash out on different platform, for example BNB coin.
  12. After you swap wBan into BNB, withdraw it to BNB wallet address, usually it's where you first get and where it's transferred from on step 7.
  13. Now you have more BNB. You can then decide further invest it or cash out to enjoy your earning.
Enjoy!

Oct 27, 2021

jsonwebtoken error troubleshoot: Uncaught Error: error:0909006C:PEM routines:get_name: no start line

jsonwebtoken error

Description

If you encounter error below:

Uncaught Error: error:0909006C:PEM routines:get_name:no start line


Reason

Bad format private key value. In the jsonwebtoken node package, the sign() function.
Example,


  jsonwebtoken.sign(PAYLOAD, PRIVATE_KEY, OPTIONS)

the PRIVATE_KEY value above must be string, and sometimes this string can be mistakenly "JSON.stringify()". Even though the end result is still a string, but JSON.stringify encoding turns the string into JSON string format, and it's not a value we want to provide to the sign() function.


Below is example error code

ERR_OSSL_PEM_NO_START_LINE



//error from node_modules/jsonwebtoken/sign.js

{
  library: 'PEM routines',
  function: 'get_name',
  reason: 'no start line',
  code: 'ERR_OSSL_PEM_NO_START_LINE'
}

Aug 30, 2021

CakeDeFi - Earn passive income by staking your crypto and forget about it

Warning: There is absolutely no financial advice on this or on any other pages of this blog.

Old way of earning from crypto

It's been a while having my crypto sit quietly in my crypto wallet. As an non-savvy crypto owner, mining and trading crypto is most I know about how one can earn from crypto.

Crypto Staking Experiment with Cake DeFi

"Staking" has been a new term to my early this year (of 2021). It's nowadays an easier approach to generate revenue with your available crypto without the need of hunting for expensive GPU (for mining) and additional payment monthly electricity bill.

My first staking experience was started with CakeDeFi (affiliate link)

My first experiment started 4 months ago (April 2021), I transferred 20 DFI to my partner. And then she directly put them all into "Staking" with auto-compound and she forgot about it until she received an email today.

20 DFI + staking became USD106


In this case:

20DFI worth approximate USD75 (4 months ago)

20DFI + staking (auto-compound) = ~USD106 (August same year)


Looking at the chart below, I picked the peak value point on April as example. Compared to the highlighted value, it has lower price today at the time of this writing (USD2.79 / DFI). The value of staking with autocompound compensated the drop in USD value, while still profit from the extra DFI token earned from staking.


USD price changes of DFI



How does earning from staking work?

When you stake your DFI, you get paid with DFI twice a day. 
Here's come the best part, all you need to do, in short, stake your DFI and forget about it.

You have an option to enable "auto-compound" and let it to continue to stake with all the new earning without having to manually add them after every earning cycle. Which it also means, we can just stake now and forget about it until you login again next time to find out how much you've gained in your asset, but just remember to enable "auto-compound" option.

DFI Staking - auto-compound setting


The following is an example about daily earning:

Auto-compound (staking) & Earning



See the result for yourself first

Okay, since the very first transaction would usually require you spend hardearned money to get started . Please don't simply believe that anyone can just earn a fortune out from this.
Risk is always there, for a non-savvy crypto owner, I'd usually start small (where it won't hurt a bit if I lost all of it) until I've gain enough confidence to make a big decision. Trust no one until you see for yourself first.

This isn't a financial advisor post, please DO NOT read or treat it like one. I'm not any certified financial advisor, I'm just sharing my good experience with what've achieved with CakeDeFi. If you are a owner of crypto already, then you may have already know the how's its volatility affect its value, so please be warned, do it only what you think you capable of, never overdo anything. Like the old saying, never put all your eggs in one basket.

If you are interested to get an account, you can use this CakeDefi affiliate link and get extra USD$30 worth of DFI after you sign up & make your first $50 deposit.

How does it looks like inside?

Liquidity Mining (risky, due to the volatility value changes - Impermanent Loss)

Impermanent Loss happens because you add liquidity in pair (BTC - DFI as example below).
Either of the crypto drop or rise in value, the other paired crypto would need to increase or reduce itself to breakeven and to maintain the initial share you have started with.


Interface for Staking DFI
This one is straight forward. You'll need to swap your token into DFI, and start staking.
You'll get staking reward every day, and "auto-compound" option will help you auto-stake the daily earnings, so you are staking with the most DFI you have available (to maintain highest earning capability).



Have fun staking!