[{"data":1,"prerenderedAt":1255},["ShallowReactive",2],{"blog-all":3},[4,348,479,571,648,796,1058,1154],{"id":5,"title":6,"archiveNote":7,"body":8,"category":335,"date":336,"dateKind":337,"description":338,"extension":339,"meta":340,"navigation":341,"path":342,"seo":343,"stem":344,"thumbnail":345,"updated":346,"__hash__":347},"blogs\u002Fblog\u002F2025-02-12-automate-formatting-of-code-with-prettier-and-husky.md","Automate Formatting of Code with Prettier and Husky","Historical engineering tutorial from February 2025. The installation and hook commands are version-sensitive and have not been retested for this edition. Check the documentation for the versions in your project before applying them.",{"type":9,"value":10,"toc":329},"minimark",[11,16,20,24,63,67,151,154,173,196,264,267,271,274,277,289,296,299,315,325],[12,13,15],"h2",{"id":14},"standardizing-the-code-format-before-committing-to-github","Standardizing the code format before committing to GitHub",[17,18,19],"p",{},"When working as a team, having a consistent coding structure and format is very important. Imagine a scenario where someone in the team installs a formatter while others don't. This results in commits that appear to have significant changes, but in reality, they only involve minor formatting differences, such as spaces and quote styles. Here comes the automation that I personally use for most of my projects and decided to write it down as a blog so that I could share it with future developers or even my future self.",[12,21,23],{"id":22},"step-1-install-the-dependencies","Step 1: Install the dependencies",[25,26,31],"pre",{"className":27,"code":28,"language":29,"meta":30,"style":30},"language-bash shiki shiki-themes github-dark","npm install -D husky lint-staged eslint prettier\n","bash","",[32,33,34],"code",{"__ignoreMap":30},[35,36,39,43,47,51,54,57,60],"span",{"class":37,"line":38},"line",1,[35,40,42],{"class":41},"svObZ","npm",[35,44,46],{"class":45},"sU2Wk"," install",[35,48,50],{"class":49},"sDLfK"," -D",[35,52,53],{"class":45}," husky",[35,55,56],{"class":45}," lint-staged",[35,58,59],{"class":45}," eslint",[35,61,62],{"class":45}," prettier\n",[12,64,66],{"id":65},"step-2-create-config-for-prettier","Step 2: Create config for Prettier",[25,68,73],{"className":69,"code":70,"filename":71,"language":72,"meta":30,"style":30},"language-json shiki shiki-themes github-dark","{\n  \"singleQuote\": true,\n  \"semi\": true,\n  \"printWidth\": 100,\n  \"trailingComma\": \"all\",\n  \"endOfLine\": \"auto\"\n}\n",".prettierrc.json","json",[32,74,75,81,96,108,121,134,145],{"__ignoreMap":30},[35,76,77],{"class":37,"line":38},[35,78,80],{"class":79},"s95oV","{\n",[35,82,84,87,90,93],{"class":37,"line":83},2,[35,85,86],{"class":49},"  \"singleQuote\"",[35,88,89],{"class":79},": ",[35,91,92],{"class":49},"true",[35,94,95],{"class":79},",\n",[35,97,99,102,104,106],{"class":37,"line":98},3,[35,100,101],{"class":49},"  \"semi\"",[35,103,89],{"class":79},[35,105,92],{"class":49},[35,107,95],{"class":79},[35,109,111,114,116,119],{"class":37,"line":110},4,[35,112,113],{"class":49},"  \"printWidth\"",[35,115,89],{"class":79},[35,117,118],{"class":49},"100",[35,120,95],{"class":79},[35,122,124,127,129,132],{"class":37,"line":123},5,[35,125,126],{"class":49},"  \"trailingComma\"",[35,128,89],{"class":79},[35,130,131],{"class":45},"\"all\"",[35,133,95],{"class":79},[35,135,137,140,142],{"class":37,"line":136},6,[35,138,139],{"class":49},"  \"endOfLine\"",[35,141,89],{"class":79},[35,143,144],{"class":45},"\"auto\"\n",[35,146,148],{"class":37,"line":147},7,[35,149,150],{"class":79},"}\n",[17,152,153],{},"Use the following to format the code:",[25,155,157],{"className":27,"code":156,"language":29,"meta":30,"style":30},"npx prettier --write .\n",[32,158,159],{"__ignoreMap":30},[35,160,161,164,167,170],{"class":37,"line":38},[35,162,163],{"class":41},"npx",[35,165,166],{"class":45}," prettier",[35,168,169],{"class":49}," --write",[35,171,172],{"class":45}," .\n",[17,174,175,176,179,180,183,184,187,188,191,192,195],{},"You may add the following to the ",[32,177,178],{},"scripts"," section of ",[32,181,182],{},"package.json"," so that you can run ",[32,185,186],{},"npm run format"," to format manually all files while ",[32,189,190],{},"npm run lint-staged"," to check prettier on the staged files which is what we want to do in the end of the tutorial. In the example below, I am using ",[32,193,194],{},"*.{js,ts,vue}"," to format all JavaScript, TypeScript, and Vue files. For different project that use different languages, you may want to change the file extension.",[25,197,199],{"className":69,"code":198,"filename":182,"language":72,"meta":30,"style":30},"\"scripts\": {\n  \u002F\u002F Other default scripts\n  \"format\": \"prettier --write .\",\n  \"lint-staged\": \"lint-staged\"\n},\n\"lint-staged\": {\n  \"*.{js,ts,vue}\": \"prettier --write\"\n},\n",[32,200,201,209,215,227,237,242,249,259],{"__ignoreMap":30},[35,202,203,206],{"class":37,"line":38},[35,204,205],{"class":45},"\"scripts\"",[35,207,208],{"class":79},": {\n",[35,210,211],{"class":37,"line":83},[35,212,214],{"class":213},"sAwPA","  \u002F\u002F Other default scripts\n",[35,216,217,220,222,225],{"class":37,"line":98},[35,218,219],{"class":49},"  \"format\"",[35,221,89],{"class":79},[35,223,224],{"class":45},"\"prettier --write .\"",[35,226,95],{"class":79},[35,228,229,232,234],{"class":37,"line":110},[35,230,231],{"class":49},"  \"lint-staged\"",[35,233,89],{"class":79},[35,235,236],{"class":45},"\"lint-staged\"\n",[35,238,239],{"class":37,"line":123},[35,240,241],{"class":79},"},\n",[35,243,244,247],{"class":37,"line":136},[35,245,246],{"class":45},"\"lint-staged\"",[35,248,208],{"class":79},[35,250,251,254,256],{"class":37,"line":147},[35,252,253],{"class":49},"  \"*.{js,ts,vue}\"",[35,255,89],{"class":79},[35,257,258],{"class":45},"\"prettier --write\"\n",[35,260,262],{"class":37,"line":261},8,[35,263,241],{"class":79},[17,265,266],{},"At this step, you would see that you have almost all files with corrections. You may want to commit it and save it.",[12,268,270],{"id":269},"step-3-automate-this-process-every-time-you-have-new-code-to-commit","Step 3: Automate this process every time you have new code to commit",[17,272,273],{},"Pre-commit hooks allow us to run a set of commands before the commit is finalized. We will be setting up the pre-commit hook to run Prettier every time we are about to commit. We will be using Husky to achieve this.",[17,275,276],{},"Initialize Husky:",[25,278,280],{"className":27,"code":279,"language":29,"meta":30,"style":30},"npx husky-init\n",[32,281,282],{"__ignoreMap":30},[35,283,284,286],{"class":37,"line":38},[35,285,163],{"class":41},[35,287,288],{"class":45}," husky-init\n",[17,290,291,292,295],{},"You may delete the ",[32,293,294],{},".husky\u002F_"," folder as it is not being used in this example. We are only using the pre-commit feature.",[17,297,298],{},"Update the file below:",[25,300,303],{"className":27,"code":301,"filename":302,"language":29,"meta":30,"style":30},"npm run lint-staged\n",".husky\u002Fpre-commit",[32,304,305],{"__ignoreMap":30},[35,306,307,309,312],{"class":37,"line":38},[35,308,42],{"class":41},[35,310,311],{"class":45}," run",[35,313,314],{"class":45}," lint-staged\n",[17,316,317,318,321,322,324],{},"Now, whenever we run ",[32,319,320],{},"git commit",", all the defined scripts will run before the commit finalizes. You may now proceed to change the format by tweaking the ",[32,323,71],{}," file.",[326,327,328],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":30,"searchDepth":83,"depth":83,"links":330},[331,332,333,334],{"id":14,"depth":83,"text":15},{"id":22,"depth":83,"text":23},{"id":65,"depth":83,"text":66},{"id":269,"depth":83,"text":270},"Productivity","2025-02-12","Original publication","Learn how to automate the formatting of your code using Prettier and Husky. This guide walks you through setting up Prettier for consistent code formatting and using Husky to enforce these standards with pre-commit hooks, ensuring a clean and uniform codebase for your team.","md",{},true,"\u002Fblog\u002F2025-02-12-automate-formatting-of-code-with-prettier-and-husky",{"title":6,"description":338},"blog\u002F2025-02-12-automate-formatting-of-code-with-prettier-and-husky","\u002Fimg\u002Fblog\u002Fautomate-formatting-of-code-with-husky-cover.svg",null,"sRid8KtMwGYCEgPYQenRa1awWMz8FJUnEfJdngAuxNo",{"id":349,"title":350,"archiveNote":351,"body":352,"category":469,"date":470,"dateKind":337,"description":471,"extension":339,"meta":472,"navigation":341,"path":473,"seo":474,"stem":475,"thumbnail":476,"updated":477,"__hash__":478},"blogs\u002Fblog\u002F2020-01-15-understanding-daos.md","Understanding DAOs — Governance You Can Read Off the Chain","Originally published on TriveAcademy in January 2020, then rewritten and expanded here. The treasury example concerns Trivechain; it is not a universal description of every DAO.",{"type":9,"value":353,"toc":463},[354,360,363,367,370,373,377,380,406,409,413,416,442,449,453,460],[17,355,356],{},[357,358,359],"em",{},"First published on TriveAcademy in January 2020 — rewritten and expanded here.",[17,361,362],{},"Most explanations of a DAO — a Decentralized Autonomous Organization — start with the acronym and end with a utopia. I'd rather start from the boring, useful middle, because at Trivechain we didn't just write about DAOs. We ran one. The treasury that funded our development was governed by masternode operators voting on-chain, and living inside that system taught me more about its edges than any whitepaper did.",[12,364,366],{"id":365},"what-a-dao-actually-is","What a DAO actually is",[17,368,369],{},"A DAO coordinates decisions through shared governance rules and digital infrastructure. The details vary: some use smart contracts for execution; others combine on-chain voting with people, multisignature signers or legal entities implementing the result.",[17,371,372],{},"For Trivechain, the relevant mechanism was a masternode-governed treasury: operators voted on proposals and the network applied its treasury rules. That is the specific model discussed below. It does not mean every DAO is fully automatic, permissionless, or implemented as a general-purpose smart contract.",[12,374,376],{"id":375},"how-trivechains-dao-worked","How Trivechain's DAO worked",[17,378,379],{},"Ours was concrete, not theoretical. Trivechain ran a treasury governed by masternode operators and denominated in our native token, TRVC:",[381,382,383,392,399],"ul",{},[384,385,386,387,391],"li",{},"To put up a proposal, you ",[388,389,390],"strong",{},"staked TRVC",". A small cost, but enough to keep spam out.",[384,393,394,395,398],{},"Masternode operators ",[388,396,397],{},"voted — one node, one vote"," — agree or disagree, over a fixed window.",[384,400,401,402,405],{},"If a proposal passed, the ",[388,403,404],{},"treasury funded it in TRVC",", and the payout executed on-chain, automatically.",[17,407,408],{},"The proposals ran the range you'd expect: a marketing push, a piece of protocol work, an integration someone wanted built. The money didn't move because a CEO signed a form. It moved because the network voted and the chain did what the vote said.",[12,410,412],{"id":411},"the-honest-limits","The honest limits",[17,414,415],{},"Operating a DAO makes you honest about the model's tradeoffs quickly, because you feel each one:",[381,417,418,424,430,436],{},[384,419,420,423],{},[388,421,422],{},"Turnout is hard."," Plenty of eligible voters simply don't vote. Quorum is a real, recurring problem, not a footnote.",[384,425,426,429],{},[388,427,428],{},"Votes follow weight."," \"One node, one vote\" sounds egalitarian until you ask who can afford the most nodes. Any stake-weighted system tilts toward whoever holds the most.",[384,431,432,435],{},[388,433,434],{},"On-chain governance is slow."," A fixed voting window is excellent for legitimacy and terrible for anything urgent.",[384,437,438,441],{},[388,439,440],{},"Code executes exactly what passed — mistakes included."," There's no manager to catch a bad proposal after the vote. The contract just does it.",[17,443,444,445,448],{},"None of these are reasons not to build a DAO. They're the reason a DAO is a ",[357,446,447],{},"design choice",", not a moral upgrade. You trade a manager's discretion for a crowd's rules, and you inherit the crowd's apathy and the rules' rigidity right alongside the transparency.",[12,450,452],{"id":451},"why-it-still-matters","Why it still matters",[17,454,455,456,459],{},"What a DAO actually buys you is narrow and real: decisions and money that anyone can audit, and a treasury no single person can quietly drain. In an industry where \"trust me\" has burned so many people, that's worth a lot. It is not a cure for coordination — humans still have to show up, read, and vote — but it changes ",[357,457,458],{},"what"," you have to trust. You stop trusting the person and start trusting the rules, and you can check the rules yourself.",[17,461,462],{},"Back in 2020, that was still a strange thing to explain to most people. It's less strange now — and the tradeoffs I felt running one are the same ones every DAO still argues about today.",{"title":30,"searchDepth":83,"depth":83,"links":464},[465,466,467,468],{"id":365,"depth":83,"text":366},{"id":375,"depth":83,"text":376},{"id":411,"depth":83,"text":412},{"id":451,"depth":83,"text":452},"Blockchain","2020-01-15","Most DAO explainers end in utopia. At Trivechain we actually ran one — a masternode-governed treasury denominated in TRVC — and operating it taught me the model's real edges — turnout, weight-based voting, and the rigidity of rules that execute themselves.",{},"\u002Fblog\u002F2020-01-15-understanding-daos",{"title":350,"description":471},"blog\u002F2020-01-15-understanding-daos","\u002Fimg\u002Fblog\u002Funderstanding-daos-cover.svg","2026-09-05","bB7mOqwEcgGi05G1nfy437IuQQllg97QWjtOF1TRF8w",{"id":480,"title":481,"archiveNote":482,"body":483,"category":469,"date":562,"dateKind":563,"description":564,"extension":339,"meta":565,"navigation":341,"path":566,"seo":567,"stem":568,"thumbnail":569,"updated":346,"__hash__":570},"blogs\u002Fblog\u002F2019-08-16-storing-declarations-on-trivechain.md","Storing a Minister's Declarations on Trivechain","Retrospective account of a 2019 proof of concept, written later. The displayed date identifies the work, not a verified publication date. This was not official government adoption. The former live explorer should not be assumed available; independent verification now requires preserved transaction and chain data.",{"type":9,"value":484,"toc":556},[485,490,497,504,507,511,518,522,529,540,544,551,553],[17,486,487],{},[357,488,489],{},"An archival field note — documenting work from that era, written up for the record later.",[17,491,492,493,496],{},"A public statement is a fragile thing. Someone says something on the record, and then the record moves — a press release gets quietly edited, a transcript loses a paragraph, a quote gets walked back and the walk-back outshouts the quote. The words existed. Proving ",[357,494,495],{},"when"," they existed, and that they haven't changed since, turns out to be surprisingly hard.",[17,498,499,500,503],{},"So we built a small demonstration. Our team took a minister's declarations and wrote them onto ",[388,501,502],{},"Trivechain"," — the public Layer-1 I was lead developer of. Not a private ledger we controlled: a public chain with its own block explorer, where anyone could pull up the record and read it back without asking us. Once a statement was in there it carried a timestamp, it couldn't be quietly edited, and anyone could verify it themselves straight from the Trivechain explorer.",[17,505,506],{},"I want to be precise about what this was. A demonstration — nobody adopted it as an official system, nothing was mandated, it wasn't a national registry. We were proving a capability, not launching a product. But the capability is real, and I still think it matters.",[12,508,510],{"id":509},"the-mechanism-plainly","The mechanism, plainly",[17,512,513,514,517],{},"Trivechain is a UTXO chain in the Bitcoin family, so it can carry a small piece of arbitrary data inside an ordinary transaction. You write the bytes in, pay the fee, the transaction gets mined into a block, and the data now lives in the chain's history alongside everyone else's. Point the block explorer at that transaction and the words are right there — no API key, no login, no asking us. That last property is the whole reason to do it on a ",[357,515,516],{},"public"," chain instead of a database we could edit.",[12,519,521],{"id":520},"the-honest-half","The honest half",[17,523,524,525,528],{},"Here's the part I won't skip, because it matters more than the demo did. We ran this on ",[388,526,527],{},"our own"," chain.",[17,530,531,532,535,536,539],{},"Writing to a chain you operate proves the ",[357,533,534],{},"capability"," — public, permissionless, verify-it-yourself recording. It does not hand you Bitcoin's ",[357,537,538],{},"security",". A statement is only as tamper-proof as the proof-of-work underneath it, and a regional chain's hashpower is a fraction of Bitcoin's. If your threat model is a well-resourced adversary rewriting history, your own chain is not where you anchor something that has to survive that — Bitcoin is the gold standard for exactly that reason. What Trivechain gave us was a genuine, working demonstration of on-chain verifiability on infrastructure we ran end to end. It was never a claim to Bitcoin-grade permanence. Those are two different things, and an honest note keeps them apart.",[12,541,543],{"id":542},"where-it-went","Where it went",[17,545,546,547,550],{},"That same idea — write a document once, verify it forever from the explorer — is what we productized as ",[388,548,549],{},"TriveCredential",": verifiable certificates recorded on Trivechain. By late 2019 we were issuing blockchain certificates with it for real events, including the IIUM KICT Postgraduate Colloquium, where I shared the work with postgraduate students. The minister demo was the proof of concept; TriveCredential was the thing it grew into.",[12,552,452],{"id":451},[17,554,555],{},"The narrow, honest value of the exercise: a public statement can be quietly edited or denied later, but a statement written onto a public chain provably existed at a point in time and can be checked by anyone — without trusting the person who published it, or us. Run it on your own chain and you have proven the mechanism. Run it on Bitcoin and you have bought the security. We proved the mechanism, shipped it as a product, and I learned the difference the honest way.",{"title":30,"searchDepth":83,"depth":83,"links":557},[558,559,560,561],{"id":509,"depth":83,"text":510},{"id":520,"depth":83,"text":521},{"id":542,"depth":83,"text":543},{"id":451,"depth":83,"text":452},"2019-08-16","Work documented","A field note on a demonstration we built — writing a minister's declarations onto Trivechain, our own Layer-1, so they are timestamped and independently verifiable from the block explorer. Plus an honest note on what running it on your own chain does and doesn't buy you.",{},"\u002Fblog\u002F2019-08-16-storing-declarations-on-trivechain",{"title":481,"description":564},"blog\u002F2019-08-16-storing-declarations-on-trivechain","\u002Fimg\u002Fblog\u002Fstoring-declarations-on-trivechain-cover.svg","xdnmHqX4nz-2kDoRI-Li6ukrqeT7bl1XExdWmBlduts",{"id":572,"title":573,"archiveNote":574,"body":575,"category":469,"date":641,"dateKind":337,"description":579,"extension":339,"meta":642,"navigation":341,"path":643,"seo":644,"stem":645,"thumbnail":646,"updated":346,"__hash__":647},"blogs\u002Fblog\u002F2019-08-11-endless-potential-of-blockchain-technology.md","Endless Potential of Blockchain Technology","Historical perspective from 2019. Blockchain records do not establish the truth of submitted data; block timestamps are not exact trusted wall-clock timestamps. A block hash alone is not a general-purpose unbiased randomness source, and availability depends on retained network data. Read the claims below in that historical context.",{"type":9,"value":576,"toc":634},[577,580,583,601,605,608,612,615,618,621,624,627,631],[17,578,579],{},"There are various sectors where blockchain technology can be implemented and it is not restricted only to the realm of the financial sector. For instance, retail and e-commerce services, healthcare services, financial services and real estate industries.",[17,581,582],{},"There are a few characteristics of blockchain that are able to benefit the users and will be highlighted in this article.",[584,585,586,589,592,595,598],"ol",{},[384,587,588],{},"Immutability of the data",[384,590,591],{},"Timestamp of the transactions",[384,593,594],{},"Traceability of the transactions",[384,596,597],{},"Transparency of the transactions",[384,599,600],{},"Randomness of the Block Hash",[602,603,588],"h3",{"id":604},"immutability-of-the-data",[17,606,607],{},"Since every transaction is added together and going through a hashing process to create the Merkle Root Hash and the blocks are linked together with the previous block by including the block hash of the previous block in the header of the next block and going through an expensive process of Proof-of-Work. The data could be said as immutable and will always be with the blockchain. Under this assumption, we are able to publish information that needs to be stored in the blockchain forever.",[602,609,611],{"id":610},"timestamp-of-the-transaction","Timestamp of the transaction",[17,613,614],{},"Every transaction needs to be broadcasted before it is added to the blockchain hence the time that the transaction is broadcasted is recorded as part of the header of the transaction that made up the transaction identity (TXID) and the time that the block is found is added to the block header to be sealed to the blockchain, we can safely use the time that the transaction is broadcasted or the time that on the block header as the time that this transaction have happened.",[602,616,594],{"id":617},"traceability-of-the-transactions",[17,619,620],{},"In some situation, we will want to trace the source of the funds. Blockchain provides traceability of the funds on the block explorer. But the developer should not constraint himself or herself to only the source of the coins that are on the Blockchain. Data can be added to Blockchain and that with proper planning the change of data can be traced on the public blockchain.",[602,622,597],{"id":623},"transparency-of-the-transactions",[17,625,626],{},"This characteristic does not apply to blockchain protocol but this is applied to a public blockchain like Trivechain. We are able to see all transactions that are happening and who is involved. For example, how do we show proof that we have transferred the crypto coin to another party? We show the receiving party the transaction on a public blockchain explorer.",[602,628,630],{"id":629},"randomness-of-the-block-hash","Randomness of the block hash",[17,632,633],{},"The block hash that is calculated with Proof-of-Work depends usually on a constraint that the block hash is higher in difficulty than the minimum proof of work limit, usually the block hash generates a certain number of 0 in front of the block hash and the hexadecimal after the leading zeros are random. This is a characteristic that makes it possible to make games that involves randomness. When we play games online, how do we ensure that the users that have rare or legendary weapon are a result of a random occurrence instead of a code that favour the developers? If the occurrence is computed based on the trailing hexadecimal of the block hash. The game will be fairer.",{"title":30,"searchDepth":83,"depth":83,"links":635},[636,637,638,639,640],{"id":604,"depth":98,"text":588},{"id":610,"depth":98,"text":611},{"id":617,"depth":98,"text":594},{"id":623,"depth":98,"text":597},{"id":629,"depth":98,"text":630},"2019-08-11",{},"\u002Fblog\u002F2019-08-11-endless-potential-of-blockchain-technology",{"title":573,"description":579},"blog\u002F2019-08-11-endless-potential-of-blockchain-technology","\u002Fimg\u002Fblog\u002Fendless-potential-of-blockchain-technology-cover.svg","crc0P-80XCnkSLFEsDGb2-YmEtZnkcjt_ZqgzmlywiU",{"id":649,"title":650,"archiveNote":651,"body":652,"category":469,"date":788,"dateKind":563,"description":789,"extension":339,"meta":790,"navigation":341,"path":791,"seo":792,"stem":793,"thumbnail":794,"updated":346,"__hash__":795},"blogs\u002Fblog\u002F2019-03-12-triveasset-on-trivechain.md","TriveAsset — Tokenizing Assets on Trivechain","Retrospective account of work from 2019, written later. The displayed date identifies the work being documented, not a verified original publication date. Trivechain has since been wound down.",{"type":9,"value":653,"toc":782},[654,658,668,670,673,676,695,702,705,712,716,719,726,752,755,759,765,771,775],[17,655,656],{},[357,657,489],{},[17,659,660,661,663,664,667],{},"We built TriveAsset — TA for short — to put real, tradable assets directly onto ",[388,662,502],{},", the Layer-1 I was lead developer of. Not a separate smart-contract platform, not a sidechain — a token layer riding on Trivechain's own transactions: a tiny \"dust\" output that ",[357,665,666],{},"is"," the ownership, and an on-chain data payload that carries the asset's rules. Fungible or non-fungible, the idea was the same — represent something real as something you can hold, transfer, and verify on our chain.",[12,669,510],{"id":509},[17,671,672],{},"Trivechain is a UTXO chain — your balance is just the set of outputs you can spend — and TriveAsset piggybacks on that.",[17,674,675],{},"To issue an asset, you broadcast a transaction carrying two things:",[381,677,678,688],{},[384,679,680,681,684,685,687],{},"A minimal ",[388,682,683],{},"dust output"," — the smallest spendable amount, sent to an address. That output ",[357,686,666],{}," the asset. Whoever can spend it owns the asset; you transfer ownership by spending the dust to a new address.",[384,689,690,691,694],{},"A ",[388,692,693],{},"data payload"," carrying the asset's open data — what it is, how many units, divisible or not, and whether this operation issues, transfers, or burns.",[17,696,697,698,701],{},"The chain itself has no idea any of this means \"an asset.\" Trivechain sees an ordinary transaction moving dust around. The ",[357,699,700],{},"meaning"," lives in a wallet or indexer that walks the chain, finds the TriveAsset transactions, reads each payload, follows the dust as it's spent, and reconstructs who owns what. The blockchain stores the events; the indexer computes the state.",[17,703,704],{},"That's the whole trick: on-chain data, off-chain interpretation.",[17,706,707],{},[708,709],"img",{"alt":710,"src":711},"A TriveAsset test transaction on the Trivechain block explorer — its metadata reads \"The TriveAsset Test (TAT) is used to ensure that the asset is issued correctly.\"","\u002Fimg\u002Fblog\u002Ftriveasset-test-transaction.png",[12,713,715],{"id":714},"the-honest-tradeoff-clunkier-than-an-erc-20","The honest tradeoff: clunkier than an ERC-20",[17,717,718],{},"If you've only worked with account-based tokens, the UTXO approach feels like fighting the tool. That feeling is correct, and I won't pretend otherwise.",[17,720,721,722,725],{},"An ERC-20 lives in one smart contract with a clean global balance table the chain enforces natively — you ask the contract and it tells you the truth. TriveAsset had ",[388,723,724],{},"no native state",". There's no balance table on-chain; you reconstruct it by replaying every relevant transaction through an indexer. Which means:",[381,727,728,734,740,746],{},[384,729,730,733],{},[388,731,732],{},"You depend on off-chain indexers."," Two indexers with slightly different rules can disagree about a balance, and the chain won't referee — it doesn't know the asset exists.",[384,735,736,739],{},[388,737,738],{},"You fight the dust limit."," Every ownership record is a live output you keep funded above dust. Assets bloat the UTXO set, and you're doing dust-level accounting just to hold a token.",[384,741,742,745],{},[388,743,744],{},"You fight payload size."," On-chain data slots are small — enough for a tag or a hash, not rich metadata. You encode tightly, or you point to something off-chain.",[384,747,748,751],{},[388,749,750],{},"You pay a fee on everything."," Every mint, transfer, and burn is a full transaction with real fees, whether the asset is worth a lot or nothing.",[17,753,754],{},"None of that is fatal. All of it is friction. I'm not going to claim the UX rivalled an account-based token — it didn't. What it did do was work, on infrastructure we ran end to end.",[12,756,758],{"id":757},"where-it-ended-up","Where it ended up",[17,760,761,762,764],{},"TriveAsset wasn't a demo that sat on a shelf. It became the tokenization layer underneath ",[388,763,549],{}," — our system for recording verifiable certificates on Trivechain. When we issued blockchain certificates for real events in late 2019, including the IIUM KICT Postgraduate Colloquium, TriveAsset was the machinery underneath: an asset — here, a credential — encoded on-chain, owned by a recipient, verifiable by anyone from the block explorer.",[17,766,767],{},[708,768],{"alt":769,"src":770},"Trivechain's live block explorer — four TriveAssets issued on-chain, on a network of 122 masternodes.","\u002Fimg\u002Fblog\u002Ftrivechain-explorer-stats.jpg",[12,772,774],{"id":773},"what-building-it-taught-me","What building it taught me",[17,776,777,778,781],{},"Encoding assets on a UTXO chain wasn't an idea I invented; representing ownership through spendable outputs was floating around the ecosystem well before us. What I did was build and ship a working version of it, end to end, on a live Layer-1, at a time when almost nobody in our region had operated this class of system. The honest, still-interesting claim is the narrow one: I learned the ",[357,779,780],{},"shape"," of on-chain tokenization — indexer consensus, dust management, payload limits, fee overhead — by hitting every one of those rocks myself. That's not a victory lap. It's tuition, and it's exactly why I can see those tradeoffs coming now.",{"title":30,"searchDepth":83,"depth":83,"links":783},[784,785,786,787],{"id":509,"depth":83,"text":510},{"id":714,"depth":83,"text":715},{"id":757,"depth":83,"text":758},{"id":773,"depth":83,"text":774},"2019-03-12","How we built TriveAsset, the tokenization layer on Trivechain — encoding fungible and non-fungible assets directly on our own UTXO chain, with ownership as a spendable output and the asset's rules as on-chain data. The honest tradeoffs of doing it the UTXO way, and where it ended up — powering TriveCredential.",{},"\u002Fblog\u002F2019-03-12-triveasset-on-trivechain",{"title":650,"description":789},"blog\u002F2019-03-12-triveasset-on-trivechain","\u002Fimg\u002Fblog\u002Ftriveasset-on-trivechain-cover.svg","W1DalAROtUOY02lrawzLZZiwdi-mO5HZKIfPxEoYwqc",{"id":797,"title":798,"archiveNote":799,"body":800,"category":1049,"date":1050,"dateKind":337,"description":1051,"extension":339,"meta":1052,"navigation":341,"path":1053,"seo":1054,"stem":1055,"thumbnail":1056,"updated":346,"__hash__":1057},"blogs\u002Fblog\u002F2018-04-18-blazing-fast-serverless-site.md","Blazing Fast Serverless Site","Architecture archive from 2018. Performance, availability, pricing and provider comparisons describe that period. They are not current measurements of this site.",{"type":9,"value":801,"toc":1040},[802,806,839,842,845,849,857,860,863,866,870,878,881,884,889,892,895,898,904,910,916,920,923,926,935,940,946,955,960,963,966,972,976,985,988,995,1002,1008,1012,1015,1023,1026,1034,1037],[12,803,805],{"id":804},"how-is-it-possible-to-host-a-website-without-a-server","How is it possible to host a website without a server?",[17,807,808,809,816,817,816,822,816,827,832,833,838],{},"It is actually not possible to host a website without a server or a physical computer that serves the content of the website. So, serverless architectures refer to applications that depend on a third-party services that manage all the infrastructure for you - the mighty cloud service provider like ",[810,811,815],"a",{"href":812,"rel":813},"https:\u002F\u002Faws.amazon.com\u002F",[814],"nofollow","Amazon Web Services (AWS)",", ",[810,818,821],{"href":819,"rel":820},"https:\u002F\u002Fcloud.google.com\u002F",[814],"Google Cloud Platform (GCP)",[810,823,826],{"href":824,"rel":825},"https:\u002F\u002Fazure.microsoft.com",[814],"Microsoft Azure",[810,828,831],{"href":829,"rel":830},"https:\u002F\u002Fwww.ibm.com\u002Fcloud\u002F",[814],"IBM Cloud"," and ",[810,834,837],{"href":835,"rel":836},"https:\u002F\u002Fwww.alibabacloud.com\u002F",[814],"Alibaba Cloud (Aliyun)",".",[17,840,841],{},"There are many concepts behind serverless that I could not explain in a single post. I shall introduce them from time to time on my blog. Typically, a serverless architecture should allow you to pay only when a service is delivered or resources are used. It does not make sense to pay for something that you did not use right?",[17,843,844],{},"Imagine the scenarios below:",[12,846,848],{"id":847},"scenario-1-a-website-that-provides-information-to-readers","Scenario 1: A website that provides information to readers.",[381,850,851,854],{},[384,852,853],{},"The usual concurrent readers on the website is around 10.",[384,855,856],{},"You want to run a campaign that will have 1,000 people accessing the website at a particular instance, say 12 am of a single day to get a freebie.",[17,858,859],{},"On a traditional situation where you own the server, you have to call the service provider to insert a new server the week before you want to launch the campaign. And you start to incur extra cost. Most probably you can not return the server after the event either.",[17,861,862],{},"For a shared server, on the other hand, you can change to a higher package that can withstand the load but they will usually ask you to sign for a deal of 3 months at least. Which is not a good deal for you either.",[17,864,865],{},"Moving on to the cloud, where you still manage the infrastructure like an Elastic Compute. You are safe in this situation. Just scale up to a larger instance and after the event, scale down to the original instance that you are using. Perfect, nothing to worry.",[12,867,869],{"id":868},"scenario-2-a-game-that-requires-connecting-to-the-server","Scenario 2: A game that requires connecting to the server.",[381,871,872,875],{},[384,873,874],{},"The first day of the launch, there is little to no person playing the game for about 1 month.",[384,876,877],{},"On a fine day after a YouTuber review the game, there are 100,000 downloads within 24 hours.",[17,879,880],{},"I will put the traditional server management and shared server aside for this scenario. Let us talk about the cloud that we have already discussed.",[17,882,883],{},"Yes, indeed, you can quickly scale up or start a new load balancer when the load could not handle and you start to see people complaining. Perfect situation and nothing much to worry except for the extra cost that incurs after the peak and before the cooldown threshold for the load balancer to close down the server.",[885,886,888],"h4",{"id":887},"the-game-changer-serverless-architecture","The game changer - serverless architecture",[17,890,891],{},"What if I tell you that there is a way that you do not need to worry about all those scaling up and down at all? That is the benefit of using a serverless architecture, a new way of using the cloud.",[17,893,894],{},"Every API call or action performed on your website, you are charged for as low as 100 milliseconds per block of payment.",[17,896,897],{},"Serving the website is charged based on the number of request and bandwidth only.",[17,899,900,901,838],{},"If nobody visits your website, you ",[388,902,903],{},"pay nothing",[17,905,906,907,838],{},"Sudden spike where many people visit your website at the same time? You ",[388,908,909],{},"pay according to the number of visitors",[911,912,913],"blockquote",{},[17,914,915],{},"Pay only what you use!",[602,917,919],{"id":918},"speed-regardless-of-location","Speed regardless of location",[17,921,922],{},"In the today's technology, we want to have our website loaded almost immediately without any buffer or loading. But a typical loading speed of a web page usually depends on a server location. \"A server\" could only exist in a particular physical location.",[17,924,925],{},"This provides a bad experience when you are trying to load a website across the region. For example, loading a web page from the United States and the server is hosted in Australia; The underwater fibre optics cable might add up a little latency to the website loading.",[17,927,928,929,934],{},"Before going further on the topic, I will share my speed test result of my website from multiple different locations using an ",[810,930,933],{"href":931,"rel":932},"https:\u002F\u002Fwww.dotcom-tools.com\u002Fwebsite-speed-test.aspx",[814],"online tool",". The online tool uses a browser from a different region to load the same website; Some useful information is recorded, like the time taken for the website to load for the first time and second time (loading speed for the second attempt can be used to test for caching optimization), the number of files loaded (if there is any error loading any file will be recorded here as well).",[911,936,937],{},[17,938,939],{},"I managed to achieve an average of 2.4 seconds and 1.2 seconds for the first visit and second visit respectively from 22 different locations around the world.",[17,941,942],{},[708,943],{"alt":944,"src":945},"Speed test from different location","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-001.png",[17,947,948,949,954],{},"That is mainly thanks to a product from my serverless cloud provider, ",[810,950,953],{"href":951,"rel":952},"https:\u002F\u002Faws.amazon.com\u002Fcloudfront\u002F",[814],"AWS Cloudfront",". A global content delivery network (CDN) service that securely delivers data, videos, applications, APIs or any files that you upload and configured with low latency and readily available in edges of AWS.",[911,956,957],{},[17,958,959],{},"AWS Cloudfront have a global network of 114 Points of Presence (103 Edge Locations and 11 Regional Edge Caches) in 56 cities across 24 countries",[17,961,962],{},"Let's look at the image below of where they are located.\nThe number of edges and the snapshot are correct and updated as of the day I wrote the blog post.",[17,964,965],{},"There are more edges coming from time to time to give your user the best and lowest latency possible.",[17,967,968],{},[708,969],{"alt":970,"src":971},"AWS Cloudfront Edge Locations","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-003.png",[602,973,975],{"id":974},"optimization-for-better-user-experience","Optimization for better user experience",[17,977,978,979,984],{},"There is another tool that I used to measure the loading and rendering speed that you would experience on my webpage. This ",[810,980,983],{"href":981,"rel":982},"https:\u002F\u002Fdevelopers.google.com\u002Fspeed\u002Fpagespeed\u002Finsights\u002F",[814],"PageSpeed Insight developer tool"," analyses your website using mobile and desktop to give you a score of how well your website is optimized.",[17,986,987],{},"There are some really good optimization suggestions that you can follow to provide the best user experience to users that come to your website.",[17,989,990,991,994],{},"If you found that most of the things listed on optimizations already presented instead of optimization suggestions. ",[388,992,993],{},"Congratulations",", you have done a good job in optimizing your website. Your user would love to visit your website more often thanks to the optimization you have done for them in providing the best user experience you could ever provide.",[17,996,997,998,1001],{},"I will end this segment with my optimization score of ",[388,999,1000],{},"99\u002F100",". I hope that I could further improve the page speed optimization to a perfect score of 100\u002F100 in the near future.",[17,1003,1004],{},[708,1005],{"alt":1006,"src":1007},"Page Optimization with Google PageSpeed Insight","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-002.png",[602,1009,1011],{"id":1010},"little-recap-of-what-i-have-shared","Little recap of what I have shared",[17,1013,1014],{},"I hope you have known a little more about serverless architecture presented by modern cloud providers. They are really a game changer in a lot of cases. They ensure high availability and reliability while keeping costs to a minimum.",[17,1016,1017,1018],{},"Good Read on Serverless Architecture: ",[810,1019,1022],{"href":1020,"rel":1021},"https:\u002F\u002Fwww.alibabacloud.com\u002Fblog\u002Fhow-does-alibaba-cloud-power-the-biggest-online-shopping-festival_231673",[814],"How Does Alibaba Cloud Power the Biggest Online Shopping Festival?",[17,1024,1025],{},"I have also introduced 2 tools that I used to measure my website performance.",[381,1027,1028,1031],{},[384,1029,1030],{},"Loading speed from multiple locations (optimized with the help of CDN edges)",[384,1032,1033],{},"Loading optimization (optimized separately using a couple of techniques)",[17,1035,1036],{},"If you like the content that I have shared, I hope that you could share it with your friends instead of keeping it to yourself. Do comment below if you have any questions and thoughts or you like the content you are seeing - this will certainly motivate me to write more content.",[17,1038,1039],{},"The next post will be about, \"Hosting your first website using serverless architecture on AWS\". This will be my first tutorial series with some code and screenshots that you can follow along to get your website hosted and only pay when people visit your website. Hope you look forward to it as much as I do!",{"title":30,"searchDepth":83,"depth":83,"links":1041},[1042,1043,1044],{"id":804,"depth":83,"text":805},{"id":847,"depth":83,"text":848},{"id":868,"depth":83,"text":869,"children":1045},[1046,1047,1048],{"id":918,"depth":98,"text":919},{"id":974,"depth":98,"text":975},{"id":1010,"depth":98,"text":1011},"Architecture","2018-04-18","It is actually not possible to host a website without a server or a physical computer that serves the content of the website. So, serverless architectures refer to applications that depend on a third-party services that manage all the infrastructure for you - the mighty cloud service provider",{},"\u002Fblog\u002F2018-04-18-blazing-fast-serverless-site",{"title":798,"description":1051},"blog\u002F2018-04-18-blazing-fast-serverless-site","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-cover.svg","XKFWfrBWGVQjszwe05wFoTVuJrbOt69wKGzxNTauM0o",{"id":1059,"title":1060,"archiveNote":1061,"body":1062,"category":335,"date":1147,"dateKind":337,"description":1070,"extension":339,"meta":1148,"navigation":341,"path":1149,"seo":1150,"stem":1151,"thumbnail":1152,"updated":346,"__hash__":1153},"blogs\u002Fblog\u002F2018-04-07-maximizing-my-productivity-while-on-the-go.md","Maximizing my productivity while on the go","Personal archive from 2018. Hardware, apps and workflow recommendations reflect that period and have not been retested for this edition.",{"type":9,"value":1063,"toc":1142},[1064,1068,1071,1074,1077,1080,1084,1087,1090,1099,1102,1105,1109,1112,1115,1121,1130,1133,1136,1139],[12,1065,1067],{"id":1066},"the-productivity-that-comes-with-more-than-one-screen","The productivity that comes with more than one screen",[17,1069,1070],{},"A developer often has to switch between multiple applications. A typical Android application developer, for example, will have a few applications turned on at any point in time. An IDE, the Android Studio, the application that allows the developer to write code; A website that consists of code example or documentation of how to use a particular function; An emulator or plugged Android phone.",[17,1072,1073],{},"A web developer, on the other hand, uses multiple application that is slightly different from an Android application developer. The developer will have a favourite text editor; A web browser showing the web application that is under development; A web browser debugger to debug for any CSS issue or maybe JavaScript issue; A web browser that acts as a documentation to refer for some syntax or even identify what went wrong with the code.",[17,1075,1076],{},"Given such condition, if the developers are given only one small monitor, switching between application may not be a good idea. The focus might be disturbed or loss when the developer switch to a screen that is not what they are supposed to be looking at, Mail, Slack, Whatsapp...",[17,1078,1079],{},"So, having more than a screen can really help. Whether it is about switching between programs, copying and pasting items, dragging and dropping files or comparing two documents or codes. It is going to be more efficient with more than one monitor, the developer often benefit by not losing focus having to perform the task mentioned. I will keep the use of ultra wide monitor in a separate post, personally, I use a curved ultrawide monitor at home, giving me a better productivity but comes at a cost of adaptability.",[12,1081,1083],{"id":1082},"what-kind-of-app-to-be-placed-on-each-monitor","What kind of app to be placed on each monitor",[17,1085,1086],{},"Being able to stay focus really play an important role in the productivity of a development work. That is also another reason why developers often stay up late to work. Working in the middle of the night often mean that the superior, the client, the kid or anyone that can potentially disturb the focus is not able to distract the focus that is needed. Next, I will be sharing a few combinations that I used for my extra monitor.",[17,1088,1089],{},"When developing as an Android or iOS developer, I often keep my IDE to be on my MacBook Pro while the extra monitor used to display a mockup that I have created previously; The website that allows me to refer to the documentation is kept alongside with the mockup images; There is a third screen, in this case, my Android phone or my iPhone that acts as the development device, being able to see the app compiled and touch on physical screen is a game changer when it comes to User Experience (UX), I tried to use emulator when I was a rookie developer, I ended up with some weird button that is too tiny and hard to be pressed.",[17,1091,1092,1093,1098],{},"Since I am also a full stack web developer, I have a different setup when it comes to web development. I will often have ",[810,1094,1097],{"href":1095,"rel":1096},"https:\u002F\u002Fwww.sublimetext.com\u002F",[814],"Sublime Text Editor"," on my main screen while the web application on the extra monitor. The documentation and the debugging browser, on the other hand, sits on my main screen. So, I have to switch between debugger, documentation and the text editor on my main screen.",[17,1100,1101],{},"Being able to use multiple screens really push me into a state of focus, allowing me to quickly get the look and feel of the code I have written and check documentation whenever necessary.",[17,1103,1104],{},"If you have a better way of using the extra screen, kindly share with me in the comment below. I may update the blog post to better address the issue of being a productive developer.",[12,1106,1108],{"id":1107},"ability-to-carry-extra-screen-while-leaving-the-office","Ability to carry extra screen while leaving the office",[17,1110,1111],{},"If you are still reading this blog post. Most probably you are a developer, a designer or someone that would love to bring your extra monitor out to a coffee shop without the need to plug your monitor into a charging port...",[17,1113,1114],{},"I often think, what I could do to have an extra screen. Initially, before finding this app, I use my iPad to turn on the mockup sent via my email which is considered a not bad idea to keep up with my productivity. But this app really turns my iPad into a useful extra screen to keep up with my ability to code with a minimal distraction of changing between screens while I am travelling.",[17,1116,1117],{},[708,1118],{"alt":1119,"src":1120},"using Duet at Starbucks","\u002Fimg\u002Fblog\u002Fmaximizing-my-productivity-while-on-the-go-001.jpg",[17,1122,1123,1124,1129],{},"Introducing ",[810,1125,1128],{"href":1126,"rel":1127},"https:\u002F\u002Fwww.duetdisplay.com\u002F",[814],"Duet",", an iPad app that turns your iPad into a second screen when you plug your iPad into your MacBook or a Windows Laptop. Basically giving you the extra screen that you need, despite it might look very small compared to your monitor at home.",[17,1131,1132],{},"Love the idea of touch bar but does not want to spend the extra money to buy a new MacBook Pro or thinking that the extra touchpad could be a bad trade-off for the battery life? Worry not, Duet actually lets you have a touchpad that sits virtually just below your extra screen.",[17,1134,1135],{},"If you happen to have an iPad 9.7 inch or an iPad Pro that supports Apple pencil. Congratulations, this app allows you to treat your iPad like a drawing pad and really draw on your iPad just like how you would with your drawing pad.",[17,1137,1138],{},"I love working while travelling, a coffee shop could provide me with a different atmosphere and bring along my iPad is becoming a norm to boost my productivity while on the go, especially when I am out of town, away from Kuala Lumpur.",[17,1140,1141],{},"I hope you enjoy the sharing that I have put in for this post. I will continue to work on more post about my journey as an entrepreneur, developer, research postgraduate student. Let me know if you have any thoughts or a particular topic that might interest you.",{"title":30,"searchDepth":83,"depth":83,"links":1143},[1144,1145,1146],{"id":1066,"depth":83,"text":1067},{"id":1082,"depth":83,"text":1083},{"id":1107,"depth":83,"text":1108},"2018-04-07",{},"\u002Fblog\u002F2018-04-07-maximizing-my-productivity-while-on-the-go",{"title":1060,"description":1070},"blog\u002F2018-04-07-maximizing-my-productivity-while-on-the-go","\u002Fimg\u002Fblog\u002Fmaximizing-my-productivity-while-on-the-go-cover.svg","d5SskkgxZ9rMn7avwR8pClQfsetggg_eC15iA7s26sg",{"id":1155,"title":1156,"archiveNote":1157,"body":1158,"category":335,"date":1247,"dateKind":337,"description":1248,"extension":339,"meta":1249,"navigation":341,"path":1250,"seo":1251,"stem":1252,"thumbnail":1253,"updated":346,"__hash__":1254},"blogs\u002Fblog\u002F2018-03-31-365-days-of-procrastination.md","365 Days of Procrastination","Historical personal essay. References to being a research student describe that period. The MMU research project was delivered and a paper published; the thesis was not completed and no master’s degree is claimed.",{"type":9,"value":1159,"toc":1242},[1160,1163,1172,1176,1179,1182,1185,1191,1195,1198,1201,1204,1210,1214,1217,1220,1225,1228,1231,1234,1239],[17,1161,1162],{},"If you have been to tanjisheng.com anytime from January 2017 to March 2018. You would have been to the 2nd generation of my personal website that showcases my skills and some information about myself. Featuring a nice animated connected dots that symbolizes networks of data being connected. The rebuilds from 1st generation of a static and boring site was a move away step from bachelor degree student to a master degree student.",[17,1164,1165],{},[708,1166],{"alt":1167,"src":1168,"className":1169},"tanjisheng.com - landing","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-001.gif",[1170,1171],"mx-auto","w-full",[12,1173,1175],{"id":1174},"the-idea-and-structure-of-the-website","The idea and structure of the website",[17,1177,1178],{},"The idea of designing the website with connected dots are related to my focus and research that I am working full time on, my master degree research with the title \"Automated feature learning using deep learning for network fault prediction\".",[17,1180,1181],{},"On a layman term, the research uses machine learning or artificial intelligence to determine if a customer is going to suffer from network fault which can cause disruption to their home network without prior knowledge from the network experts on what are the causes parameters. So, the machine should be able to capture the patterns that lead to a network fault automatically.",[17,1183,1184],{},"The about page features a picture of myself from a studio shooting of my graduation back in mid-year 2016, the year where I graduated my bachelors of degree in computer science. There are 3 main things that I picture myself working on. Research, Development and Consultation. In another word, my Master Research and freelancer work involving development and consultation.",[17,1186,1187],{},[708,1188],{"alt":1189,"src":1190},"tanjisheng.com - about","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-002.png",[12,1192,1194],{"id":1193},"the-genesis-of-the-procrastination","The genesis of the procrastination",[17,1196,1197],{},"If you have ever press on the blog on the top right of the website. It will lead you to a countdown page that tells you how many days until 1st April 2017. Initially, when I put up the website, I gave myself time until 1st April to complete the User Interface and the blog post on my personal website.",[17,1199,1200],{},"The second generation of the website has another objective, which is to serve the website using serverless architecture. So, the entire website is hosted on Amazon Web Services and uses edges to duplicate the website giving lower latency in loading the resources.",[17,1202,1203],{},"However, one of the reasons which demotivated me is that every post that I write needs to be a standalone HTML and rename manually. This is something bad about writing static site on AWS S3. Another reason being, I could not find the scope of what I wanted to cover or what I am trying to achieve from this blog.",[17,1205,1206],{},[708,1207],{"alt":1208,"src":1209},"tanjisheng.com - blog","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-003.png",[12,1211,1213],{"id":1212},"the-motivation-to-end-the-procrastination","The motivation to end the procrastination",[17,1215,1216],{},"I spent exactly 365 days not working on my blog and procrastinated. Until early in the year 2018, I found reasons to start blogging. I may not have a lot of stories to share at the moment but being able to look back at what I have been through and lessons that come with it is something that is worth the effort.",[17,1218,1219],{},"I came across a book written by a friend of mine named \"The Art of Owning Your Story\", there is a quote that I love in the book that sparks the idea of me going back to blogging.",[911,1221,1222],{},[17,1223,1224],{},"Writing my life story is not about knowing enough about life, but to do enough in life, to keep asking questions and seeking for answers.",[17,1226,1227],{},"A few months ago, I met a person that changed my mindset. She is extremely hard working and goal oriented. Her persistent in pursuing her dreams despite hardship and the spirit of never give up when things get tough are traits that are extremely admirable.",[17,1229,1230],{},"How she uses her blog to spread her thoughts and sharing tips and tricks on topics that she knows best somewhat motivates me to do the same.",[17,1232,1233],{},"I aim to structure my blog towards sharing my reflection on a particular event, simplifying of technology jargon, reviewing of technology product as well as my journey as an entrepreneur.",[911,1235,1236],{},[17,1237,1238],{},"Luck Is What Happens When Preparation Meets Opportunity",[17,1240,1241],{},"Today is indeed the special day for the special someone and also a special day for me as it marks the very special day where I restructure and relaunch my website as well as my life towards my dream. I will prepare myself hoping the opportunity to knock on my door and I could be the lucky person.",{"title":30,"searchDepth":83,"depth":83,"links":1243},[1244,1245,1246],{"id":1174,"depth":83,"text":1175},{"id":1193,"depth":83,"text":1194},{"id":1212,"depth":83,"text":1213},"2018-03-31","A personal archive from 2018 about rebuilding my website while pursuing research at MMU.",{},"\u002Fblog\u002F2018-03-31-365-days-of-procrastination",{"title":1156,"description":1248},"blog\u002F2018-03-31-365-days-of-procrastination","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-cover.svg","Gp2zRXSDYxljJ63VJwpXyjou71mJW7ePC3pdNQ7Eu98",1788587592306]