[{"data":1,"prerenderedAt":1233},["ShallowReactive",2],{"blog-all":3},[4,345,423,635,777,1039,1134],{"id":5,"title":6,"body":7,"category":334,"date":335,"description":336,"extension":337,"meta":338,"navigation":339,"path":340,"seo":341,"stem":342,"thumbnail":343,"__hash__":344},"blogs\u002Fblog\u002F2025-02-12-automate-formatting-of-code-with-prettier-and-husky.md","Automate Formatting of Code with Prettier and Husky",{"type":8,"value":9,"toc":328},"minimark",[10,15,19,23,62,66,150,153,172,195,263,266,270,273,276,288,295,298,314,324],[11,12,14],"h2",{"id":13},"standardizing-the-code-format-before-committing-to-github","Standardizing the code format before committing to GitHub",[16,17,18],"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.",[11,20,22],{"id":21},"step-1-install-the-dependencies","Step 1: Install the dependencies",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-bash shiki shiki-themes github-dark","npm install -D husky lint-staged eslint prettier\n","bash","",[31,32,33],"code",{"__ignoreMap":29},[34,35,38,42,46,50,53,56,59],"span",{"class":36,"line":37},"line",1,[34,39,41],{"class":40},"svObZ","npm",[34,43,45],{"class":44},"sU2Wk"," install",[34,47,49],{"class":48},"sDLfK"," -D",[34,51,52],{"class":44}," husky",[34,54,55],{"class":44}," lint-staged",[34,57,58],{"class":44}," eslint",[34,60,61],{"class":44}," prettier\n",[11,63,65],{"id":64},"step-2-create-config-for-prettier","Step 2: Create config for Prettier",[24,67,72],{"className":68,"code":69,"filename":70,"language":71,"meta":29,"style":29},"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",[31,73,74,80,95,107,120,133,144],{"__ignoreMap":29},[34,75,76],{"class":36,"line":37},[34,77,79],{"class":78},"s95oV","{\n",[34,81,83,86,89,92],{"class":36,"line":82},2,[34,84,85],{"class":48},"  \"singleQuote\"",[34,87,88],{"class":78},": ",[34,90,91],{"class":48},"true",[34,93,94],{"class":78},",\n",[34,96,98,101,103,105],{"class":36,"line":97},3,[34,99,100],{"class":48},"  \"semi\"",[34,102,88],{"class":78},[34,104,91],{"class":48},[34,106,94],{"class":78},[34,108,110,113,115,118],{"class":36,"line":109},4,[34,111,112],{"class":48},"  \"printWidth\"",[34,114,88],{"class":78},[34,116,117],{"class":48},"100",[34,119,94],{"class":78},[34,121,123,126,128,131],{"class":36,"line":122},5,[34,124,125],{"class":48},"  \"trailingComma\"",[34,127,88],{"class":78},[34,129,130],{"class":44},"\"all\"",[34,132,94],{"class":78},[34,134,136,139,141],{"class":36,"line":135},6,[34,137,138],{"class":48},"  \"endOfLine\"",[34,140,88],{"class":78},[34,142,143],{"class":44},"\"auto\"\n",[34,145,147],{"class":36,"line":146},7,[34,148,149],{"class":78},"}\n",[16,151,152],{},"Use the following to format the code:",[24,154,156],{"className":26,"code":155,"language":28,"meta":29,"style":29},"npx prettier --write .\n",[31,157,158],{"__ignoreMap":29},[34,159,160,163,166,169],{"class":36,"line":37},[34,161,162],{"class":40},"npx",[34,164,165],{"class":44}," prettier",[34,167,168],{"class":48}," --write",[34,170,171],{"class":44}," .\n",[16,173,174,175,178,179,182,183,186,187,190,191,194],{},"You may add the following to the ",[31,176,177],{},"scripts"," section of ",[31,180,181],{},"package.json"," so that you can run ",[31,184,185],{},"npm run format"," to format manually all files while ",[31,188,189],{},"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 ",[31,192,193],{},"*.{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.",[24,196,198],{"className":68,"code":197,"filename":181,"language":71,"meta":29,"style":29},"\"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",[31,199,200,208,214,226,236,241,248,258],{"__ignoreMap":29},[34,201,202,205],{"class":36,"line":37},[34,203,204],{"class":44},"\"scripts\"",[34,206,207],{"class":78},": {\n",[34,209,210],{"class":36,"line":82},[34,211,213],{"class":212},"sAwPA","  \u002F\u002F Other default scripts\n",[34,215,216,219,221,224],{"class":36,"line":97},[34,217,218],{"class":48},"  \"format\"",[34,220,88],{"class":78},[34,222,223],{"class":44},"\"prettier --write .\"",[34,225,94],{"class":78},[34,227,228,231,233],{"class":36,"line":109},[34,229,230],{"class":48},"  \"lint-staged\"",[34,232,88],{"class":78},[34,234,235],{"class":44},"\"lint-staged\"\n",[34,237,238],{"class":36,"line":122},[34,239,240],{"class":78},"},\n",[34,242,243,246],{"class":36,"line":135},[34,244,245],{"class":44},"\"lint-staged\"",[34,247,207],{"class":78},[34,249,250,253,255],{"class":36,"line":146},[34,251,252],{"class":48},"  \"*.{js,ts,vue}\"",[34,254,88],{"class":78},[34,256,257],{"class":44},"\"prettier --write\"\n",[34,259,261],{"class":36,"line":260},8,[34,262,240],{"class":78},[16,264,265],{},"At this step, you would see that you have almost all files with corrections. You may want to commit it and save it.",[11,267,269],{"id":268},"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",[16,271,272],{},"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.",[16,274,275],{},"Initialize Husky:",[24,277,279],{"className":26,"code":278,"language":28,"meta":29,"style":29},"npx husky-init\n",[31,280,281],{"__ignoreMap":29},[34,282,283,285],{"class":36,"line":37},[34,284,162],{"class":40},[34,286,287],{"class":44}," husky-init\n",[16,289,290,291,294],{},"You may delete the ",[31,292,293],{},".husky\u002F_"," folder as it is not being used in this example. We are only using the pre-commit feature.",[16,296,297],{},"Update the file below:",[24,299,302],{"className":26,"code":300,"filename":301,"language":28,"meta":29,"style":29},"npm run lint-staged\n",".husky\u002Fpre-commit",[31,303,304],{"__ignoreMap":29},[34,305,306,308,311],{"class":36,"line":37},[34,307,41],{"class":40},[34,309,310],{"class":44}," run",[34,312,313],{"class":44}," lint-staged\n",[16,315,316,317,320,321,323],{},"Now, whenever we run ",[31,318,319],{},"git commit",", all the defined scripts will run before the commit finalizes. You may now proceed to change the format by tweaking the ",[31,322,70],{}," file.",[325,326,327],"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":29,"searchDepth":82,"depth":82,"links":329},[330,331,332,333],{"id":13,"depth":82,"text":14},{"id":21,"depth":82,"text":22},{"id":64,"depth":82,"text":65},{"id":268,"depth":82,"text":269},"Productivity","2025-02-12","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":336},"blog\u002F2025-02-12-automate-formatting-of-code-with-prettier-and-husky","\u002Fimg\u002Fblog\u002Fautomate-formatting-of-code-with-husky-cover.webp","WJiDkYet2zG_xPFsOICyENw466jeXA3XLBw3qAWJQoY",{"id":346,"title":347,"body":348,"category":415,"date":416,"description":352,"extension":337,"meta":417,"navigation":339,"path":418,"seo":419,"stem":420,"thumbnail":421,"__hash__":422},"blogs\u002Fblog\u002F2019-08-11-endless-potential-of-blockchain-technology.md","Endless Potential of Blockchain Technology",{"type":8,"value":349,"toc":408},[350,353,356,375,379,382,386,389,392,395,398,401,405],[16,351,352],{},"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.",[16,354,355],{},"There are a few characteristics of blockchain that are able to benefit the users and will be highlighted in this article.",[357,358,359,363,366,369,372],"ol",{},[360,361,362],"li",{},"Immutability of the data",[360,364,365],{},"Timestamp of the transactions",[360,367,368],{},"Traceability of the transactions",[360,370,371],{},"Transparency of the transactions",[360,373,374],{},"Randomness of the Block Hash",[376,377,362],"h3",{"id":378},"immutability-of-the-data",[16,380,381],{},"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.",[376,383,385],{"id":384},"timestamp-of-the-transaction","Timestamp of the transaction",[16,387,388],{},"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.",[376,390,368],{"id":391},"traceability-of-the-transactions",[16,393,394],{},"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.",[376,396,371],{"id":397},"transparency-of-the-transactions",[16,399,400],{},"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.",[376,402,404],{"id":403},"randomness-of-the-block-hash","Randomness of the block hash",[16,406,407],{},"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":29,"searchDepth":82,"depth":82,"links":409},[410,411,412,413,414],{"id":378,"depth":97,"text":362},{"id":384,"depth":97,"text":385},{"id":391,"depth":97,"text":368},{"id":397,"depth":97,"text":371},{"id":403,"depth":97,"text":404},"Blockchain","2019-08-11",{},"\u002Fblog\u002F2019-08-11-endless-potential-of-blockchain-technology",{"title":347,"description":352},"blog\u002F2019-08-11-endless-potential-of-blockchain-technology","\u002Fimg\u002Fblog\u002Fendless-potential-of-blockchain-technology-cover.png","ybZIBTe7xoAUbgs9gR_1wqkMverAJznhWoj6nPD6UX0",{"id":424,"title":425,"body":426,"category":415,"date":627,"description":628,"extension":337,"meta":629,"navigation":339,"path":630,"seo":631,"stem":632,"thumbnail":633,"__hash__":634},"blogs\u002Fblog\u002F2019-03-12-triveasset-before-inscriptions.md","TriveAsset — Putting Assets on Bitcoin Before the Inscription Wave",{"type":8,"value":427,"toc":621},[428,434,441,445,448,451,475,480,494,497,501,504,526,529,551,555,558,565,572,601,607,611,618],[16,429,430],{},[431,432,433],"em",{},"An archival field note — documenting work from that era, written up for the record later.",[16,435,436,437,440],{},"We built TriveAsset — TA for short — to encode both fungible and non-fungible assets directly on Bitcoin. No sidechain, no smart-contract state machine. Just a Bitcoin transaction carrying a tiny \"dust\" output for ownership and an ",[31,438,439],{},"OP_RETURN"," payload for the asset's data. It sat squarely in the colored-coins lineage — the same broad instinct the industry would later chase again with \"inscriptions,\" though by a different mechanism. We were early. Early is not the same as polished, and I want to be honest about both halves of that sentence.",[11,442,444],{"id":443},"the-mechanism-plainly","The mechanism, plainly",[16,446,447],{},"Bitcoin doesn't have accounts. It has UTXOs — unspent transaction outputs. Your balance is just the set of outputs you can spend. TriveAsset piggybacks on that.",[16,449,450],{},"To issue an asset, you broadcast a transaction with two things in it:",[452,453,454,466],"ul",{},[360,455,456,457,461,462,465],{},"A tiny ",[458,459,460],"strong",{},"dust output"," — a few hundred satoshis sent to an address. This UTXO ",[431,463,464],{},"is"," the asset. Whoever can spend it, owns the asset. Transfer ownership by spending the dust to a new address.",[360,467,468,469,474],{},"An ",[458,470,471,473],{},[31,472,439],{}," output"," carrying the \"open data\" — the asset's rules and metadata: what it is, how many units, divisible or not, this operation's issue\u002Ftransfer\u002Fburn intent.",[16,476,477,479],{},[31,478,439],{}," is an unspendable, prunable output built for exactly this — attaching a small blob of data to a transaction. On Bitcoin that blob was capped at 80 bytes of payload, which matters a lot later.",[16,481,482,483,486,487,490,491,493],{},"The chain itself has no idea any of this means \"an asset.\" Bitcoin sees a normal transaction moving dust around. The ",[431,484,485],{},"meaning"," lives entirely off-chain: a ",[458,488,489],{},"wallet or indexer"," walks the blockchain, finds transactions tagged as TriveAsset, reads each ",[31,492,439],{},", follows the dust UTXOs as they're spent, and reconstructs who owns what. The blockchain stores the events; the indexer computes the state.",[16,495,496],{},"That's the whole trick. On-chain data, off-chain interpretation.",[11,498,500],{"id":499},"we-did-not-invent-this-and-that-matters","We did not invent this — and that matters",[16,502,503],{},"I want to place this honestly in its lineage, because the honest version is more useful than the flattering one.",[16,505,506,507,510,511,514,515,518,519,522,523,525],{},"Embedding asset meaning into Bitcoin's UTXOs is the ",[458,508,509],{},"colored coins"," family, and it predates us by years. Yoni Assia floated \"colored bitcoin\" in 2012; Meni Rosenfeld's colored-coins writeup landed the same year. Then came the protocol wave: ",[458,512,513],{},"Mastercoin"," (2013, later renamed ",[458,516,517],{},"Omni"," — the rail Tether first launched on in 2014), and ",[458,520,521],{},"Counterparty"," (2014), which was one of the first to use ",[31,524,439],{}," to carry asset data directly. Those projects proved you could run programmable asset infrastructure on top of Bitcoin without touching the base protocol.",[16,527,528],{},"TriveAsset stands on that shoulder. We didn't invent embedding assets on Bitcoin. What we did was build and ship our own take on it — a working tokenization layer for fungible and non-fungible assets — inside Trivechain, at a time when almost nobody in our region had operated this class of system end to end.",[16,530,531,532,535,536,539,540,543,544,546,547,550],{},"The honest, still-interesting claim is the narrow one: ",[458,533,534],{},"we were building asset-on-Bitcoin encoding years before the inscription wave made the idea mainstream."," When Casey Rodarmor shipped Ordinals in January 2023, and ",[31,537,538],{},"@domodata"," posted the BRC-20 schema that March, the mechanism was different — inscriptions write into Taproot ",[458,541,542],{},"witness"," data rather than an 80-byte ",[31,545,439],{}," — but the ",[431,548,549],{},"philosophy"," rhymed with the colored-coins lineage we were already living in: put the asset's data directly onto Bitcoin instead of into a smart-contract state machine, and let indexers reconstruct the rest. BRC-20 ran into a familiar set of tradeoffs — off-chain indexer consensus, fee overhead, no native on-chain state — the same class of problems we'd already hit, even where the specifics differed.",[11,552,554],{"id":553},"the-honest-contrast-it-was-clunkier-than-erc-20","The honest contrast: it was clunkier than ERC-20",[16,556,557],{},"If you've only worked with ERC-20, the UTXO approach feels like fighting the tool. That feeling is correct.",[16,559,560,561,564],{},"ERC-20 is ",[458,562,563],{},"account\u002Fstate-based",". One smart contract holds a clean global balance table — a mapping from address to balance — and the chain enforces it. You query the contract and it just tells you the truth. The state is native.",[16,566,567,568,571],{},"UTXO-embedded assets have ",[458,569,570],{},"no native state",". There is no balance table anywhere on-chain. You reconstruct it by replaying every relevant transaction through an indexer. Which means:",[452,573,574,580,586,595],{},[360,575,576,579],{},[458,577,578],{},"You depend on off-chain indexers."," Two indexers with slightly different rules can disagree about a balance. The chain won't referee — it doesn't know the asset exists.",[360,581,582,585],{},[458,583,584],{},"You fight the dust limit."," Every ownership record is a live UTXO you have to keep funded above dust. Assets bloat the UTXO set, and you're paying attention to satoshi-level accounting just to hold a token.",[360,587,588,594],{},[458,589,590,591,593],{},"You fight ",[31,592,439],{}," size."," 80 bytes is enough for a tag or a hash, not for rich metadata. You encode tightly, or you spill data across transactions, or you point to something off-chain.",[360,596,597,600],{},[458,598,599],{},"You pay fee overhead on everything."," Every mint, transfer, and burn is a full Bitcoin transaction with real miner fees, whether the asset is worth a lot or nothing.",[16,602,603,604,606],{},"None of that is fatal. All of it is friction. Sending an ERC-20 is one contract call; doing the equivalent with dust plus ",[31,605,439],{}," is a small archaeology project every time you want to know the truth. I'm not going to pretend the UX was competitive. It wasn't.",[11,608,610],{"id":609},"what-being-early-actually-taught-me","What being early actually taught me",[16,612,613,614,617],{},"Being early doesn't hand you the market. It hands you the ",[431,615,616],{},"shape of the problem"," before anyone agrees on a name for it. We hit the indexer-consensus problem, the dust-management problem, the metadata-size problem, and the fee-overhead problem years before \"BRC-20\" was a phrase people argued about on Twitter. When the inscription wave arrived and the whole ecosystem started tripping over those same four rocks, none of them were new to us.",[16,619,620],{},"That's the real lesson, and it's not a victory lap. Early only pays if you're still standing when the idea's time arrives. Being early is a form of tuition — you pay it in clunky UX and dead ends, and the return only shows up if you survive to the moment the market catches up. We built asset encoding on Bitcoin before the mainstream cared. That taught me the terrain. Whether the timing ever paid off is a different question, and an honest post keeps those two things apart.",{"title":29,"searchDepth":82,"depth":82,"links":622},[623,624,625,626],{"id":443,"depth":82,"text":444},{"id":499,"depth":82,"text":500},{"id":553,"depth":82,"text":554},{"id":609,"depth":82,"text":610},"2019-03-12","How we encoded fungible and non-fungible assets directly on Bitcoin using a dust UTXO plus OP_RETURN data — the same idea inscriptions later made mainstream, and the same tradeoffs they rediscovered.",{},"\u002Fblog\u002F2019-03-12-triveasset-before-inscriptions",{"title":425,"description":628},"blog\u002F2019-03-12-triveasset-before-inscriptions","\u002Fimg\u002Fblog\u002Ftriveasset-before-inscriptions-cover.svg","aRS4se0xvCpglNGH90PtOzj6w32OPW_9WXPPJvCjvqY",{"id":636,"title":637,"body":638,"category":415,"date":769,"description":770,"extension":337,"meta":771,"navigation":339,"path":772,"seo":773,"stem":774,"thumbnail":775,"__hash__":776},"blogs\u002Fblog\u002F2018-06-18-storing-declarations-on-bitcoin.md","Storing a Minister's Declarations on Bitcoin",{"type":8,"value":639,"toc":763},[640,644,651,654,657,661,671,677,687,691,694,697,707,711,714,720,730,740,747,751,754,757],[16,641,642],{},[431,643,433],{},[16,645,646,647,650],{},"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 speech transcript loses a paragraph. A quote gets walked back and the walk-back gets more coverage than the quote. The words existed, but proving ",[431,648,649],{},"when"," they existed, and that they haven't changed since, turns out to be surprisingly hard.",[16,652,653],{},"So we built a small demonstration to prove a point. Our team took a minister's declarations and wrote them into the Bitcoin blockchain. Not a private ledger, not a permissioned chain — the actual public BTC chain that anyone on earth can read. The idea was simple: once a statement is in there, it is timestamped, it cannot be silently changed, and anyone can verify it themselves without asking us for permission.",[16,655,656],{},"I want to be precise about what this was. It was a demonstration. Nobody adopted it as an official system, nothing was mandated, and 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.",[11,658,660],{"id":659},"the-tool-op_return","The tool: OP_RETURN",[16,662,663,664,666,667,670],{},"Bitcoin has an opcode called ",[31,665,439],{},". It creates a ",[431,668,669],{},"provably unspendable"," output — one that lets you attach a small piece of arbitrary data to a transaction. Because the output is provably unspendable, full nodes don't have to keep it in the UTXO set (the working memory of who-owns-what), which is exactly why the network tolerates people using it to carry data instead of coins.",[16,672,673,674,676],{},"You put your bytes in the ",[31,675,439],{}," output, you pay the transaction fee, the transaction gets mined into a block, and now your data lives in the chain's history forever alongside everyone else's.",[16,678,679,680,682,683,686],{},"The catch — and this is the whole engineering story — is the size limit. By default, nodes only relay ",[31,681,439],{}," outputs up to ",[458,684,685],{},"80 bytes"," of data. That limit wasn't always there: early on it was 40 bytes, and it was raised to 80 bytes in Bitcoin Core 0.11 (2015). Eighty bytes is not a lot. It's a sentence fragment. You are not fitting a minister's full remarks into a single output.",[11,688,690],{"id":689},"chunking-the-text","Chunking the text",[16,692,693],{},"So how do you store something longer than 80 bytes? You have two honest options.",[16,695,696],{},"The clean one: hash the full text, store only the hash on-chain, and keep the full text somewhere off-chain. The chain then proves the text existed and hasn't changed, but you have to hold the original yourself for anyone to read the actual words.",[16,698,699,700,703,704,706],{},"The one we did for the demonstration: ",[458,701,702],{},"chunk the text into the open data itself."," We split the declaration into 80-byte pieces and wrote each piece into its own ",[31,705,439],{}," output across a sequence of transactions, so the words themselves — not just a fingerprint of them — sit in the public chain. It was deliberately clunky. Chunking plain text across many outputs is not elegant, and it costs a fee per transaction. But it meant anyone could open a block explorer, read the raw data straight off the chain, and reassemble the statement without trusting our copy of it. That was the point we wanted to make visible.",[11,708,710],{"id":709},"what-bitcoin-actually-gives-you","What Bitcoin actually gives you",[16,712,713],{},"It helps to be clear-eyed about what you're buying here, because it's easy to oversell.",[16,715,716,719],{},[458,717,718],{},"Immutability."," Once the transaction is mined and buried under enough confirmations, rewriting it means rewriting proof-of-work history — economically absurd on Bitcoin. The words are stuck.",[16,721,722,725,726,729],{},[458,723,724],{},"A timestamp."," The block your data lands in has a block time. That gives you a credible \"this existed no later than ",[431,727,728],{},"this"," moment\" — a notarization anyone can check.",[16,731,732,735,736,739],{},[458,733,734],{},"Public verifiability."," No API key, no login, no asking us. Anyone with a block explorer can read it. That's the property that makes it worth doing on a ",[431,737,738],{},"public"," chain instead of a database we control.",[16,741,742,743,746],{},"What it is ",[431,744,745],{},"not"," is a database. You don't query it, you don't index it well, you don't update a record. Bitcoin here is a notarization layer — an attestation that a specific string of bytes existed at a specific time and has not changed. Nothing more. If you need more, you're using the wrong tool.",[11,748,750],{"id":749},"why-it-still-matters","Why it still matters",[16,752,753],{},"Back in 2018 there wasn't a tidy name for this. The whole industry vocabulary of \"on-chain attestations\" and \"verifiable credentials\" that came later hadn't crystallized yet. We were just a small team in Malaysia proving that the immutability and timestamping properties I keep talking about could be pointed at something real — a public statement, made by a public figure, pinned to a public chain.",[16,755,756],{},"The honest value of the exercise was narrow and specific: a declaration can be quietly edited or denied later, but a statement written into Bitcoin provably existed at a point in time and can never be silently changed. You don't have to trust the person who published it. You don't have to trust us. You check the chain.",[16,758,759,760,762],{},"We didn't invent the technique — ",[31,761,439],{}," was already there, and people were already stuffing data into it. What we did was aim it at a use case that actually needed the trust properties Bitcoin provides, and show it working end to end. Being early to that idea is the thing I'm proud of. Not a mandate, not an official system — a demonstration that the record can be made to hold still.",{"title":29,"searchDepth":82,"depth":82,"links":764},[765,766,767,768],{"id":659,"depth":82,"text":660},{"id":689,"depth":82,"text":690},{"id":709,"depth":82,"text":710},{"id":749,"depth":82,"text":750},"2018-06-18","A field note on a demonstration we built — writing public statements into the Bitcoin chain via OP_RETURN so they are immutable, timestamped, and verifiable by anyone.",{},"\u002Fblog\u002F2018-06-18-storing-declarations-on-bitcoin",{"title":637,"description":770},"blog\u002F2018-06-18-storing-declarations-on-bitcoin","\u002Fimg\u002Fblog\u002Fstoring-declarations-on-bitcoin-cover.svg","CzOgAb3_YO38-soKjvbpWTYZ_ASChFJTI7Ww_-ioXhU",{"id":778,"title":779,"body":780,"category":1030,"date":1031,"description":1032,"extension":337,"meta":1033,"navigation":339,"path":1034,"seo":1035,"stem":1036,"thumbnail":1037,"__hash__":1038},"blogs\u002Fblog\u002F2018-04-18-blazing-fast-serverless-site.md","Blazing Fast Serverless Site",{"type":8,"value":781,"toc":1021},[782,786,819,822,825,829,837,840,843,846,850,858,861,864,869,872,875,878,884,890,896,900,903,906,915,920,927,936,941,944,947,953,957,966,969,976,983,989,993,996,1004,1007,1015,1018],[11,783,785],{"id":784},"how-is-it-possible-to-host-a-website-without-a-server","How is it possible to host a website without a server?",[16,787,788,789,796,797,796,802,796,807,812,813,818],{},"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 ",[790,791,795],"a",{"href":792,"rel":793},"https:\u002F\u002Faws.amazon.com\u002F",[794],"nofollow","Amazon Web Services (AWS)",", ",[790,798,801],{"href":799,"rel":800},"https:\u002F\u002Fcloud.google.com\u002F",[794],"Google Cloud Platform (GCP)",[790,803,806],{"href":804,"rel":805},"https:\u002F\u002Fazure.microsoft.com",[794],"Microsoft Azure",[790,808,811],{"href":809,"rel":810},"https:\u002F\u002Fwww.ibm.com\u002Fcloud\u002F",[794],"IBM Cloud"," and ",[790,814,817],{"href":815,"rel":816},"https:\u002F\u002Fwww.alibabacloud.com\u002F",[794],"Alibaba Cloud (Aliyun)",".",[16,820,821],{},"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?",[16,823,824],{},"Imagine the scenarios below:",[11,826,828],{"id":827},"scenario-1-a-website-that-provides-information-to-readers","Scenario 1: A website that provides information to readers.",[452,830,831,834],{},[360,832,833],{},"The usual concurrent readers on the website is around 10.",[360,835,836],{},"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.",[16,838,839],{},"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.",[16,841,842],{},"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.",[16,844,845],{},"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.",[11,847,849],{"id":848},"scenario-2-a-game-that-requires-connecting-to-the-server","Scenario 2: A game that requires connecting to the server.",[452,851,852,855],{},[360,853,854],{},"The first day of the launch, there is little to no person playing the game for about 1 month.",[360,856,857],{},"On a fine day after a YouTuber review the game, there are 100,000 downloads within 24 hours.",[16,859,860],{},"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.",[16,862,863],{},"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.",[865,866,868],"h4",{"id":867},"the-game-changer-serverless-architecture","The game changer - serverless architecture",[16,870,871],{},"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.",[16,873,874],{},"Every API call or action performed on your website, you are charged for as low as 100 milliseconds per block of payment.",[16,876,877],{},"Serving the website is charged based on the number of request and bandwidth only.",[16,879,880,881,818],{},"If nobody visits your website, you ",[458,882,883],{},"pay nothing",[16,885,886,887,818],{},"Sudden spike where many people visit your website at the same time? You ",[458,888,889],{},"pay according to the number of visitors",[891,892,893],"blockquote",{},[16,894,895],{},"Pay only what you use!",[376,897,899],{"id":898},"speed-regardless-of-location","Speed regardless of location",[16,901,902],{},"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.",[16,904,905],{},"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.",[16,907,908,909,914],{},"Before going further on the topic, I will share my speed test result of my website from multiple different locations using an ",[790,910,913],{"href":911,"rel":912},"https:\u002F\u002Fwww.dotcom-tools.com\u002Fwebsite-speed-test.aspx",[794],"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).",[891,916,917],{},[16,918,919],{},"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.",[16,921,922],{},[923,924],"img",{"alt":925,"src":926},"Speed test from different location","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-001.png",[16,928,929,930,935],{},"That is mainly thanks to a product from my serverless cloud provider, ",[790,931,934],{"href":932,"rel":933},"https:\u002F\u002Faws.amazon.com\u002Fcloudfront\u002F",[794],"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.",[891,937,938],{},[16,939,940],{},"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",[16,942,943],{},"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.",[16,945,946],{},"There are more edges coming from time to time to give your user the best and lowest latency possible.",[16,948,949],{},[923,950],{"alt":951,"src":952},"AWS Cloudfront Edge Locations","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-003.png",[376,954,956],{"id":955},"optimization-for-better-user-experience","Optimization for better user experience",[16,958,959,960,965],{},"There is another tool that I used to measure the loading and rendering speed that you would experience on my webpage. This ",[790,961,964],{"href":962,"rel":963},"https:\u002F\u002Fdevelopers.google.com\u002Fspeed\u002Fpagespeed\u002Finsights\u002F",[794],"PageSpeed Insight developer tool"," analyses your website using mobile and desktop to give you a score of how well your website is optimized.",[16,967,968],{},"There are some really good optimization suggestions that you can follow to provide the best user experience to users that come to your website.",[16,970,971,972,975],{},"If you found that most of the things listed on optimizations already presented instead of optimization suggestions. ",[458,973,974],{},"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.",[16,977,978,979,982],{},"I will end this segment with my optimization score of ",[458,980,981],{},"99\u002F100",". I hope that I could further improve the page speed optimization to a perfect score of 100\u002F100 in the near future.",[16,984,985],{},[923,986],{"alt":987,"src":988},"Page Optimization with Google PageSpeed Insight","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-002.png",[376,990,992],{"id":991},"little-recap-of-what-i-have-shared","Little recap of what I have shared",[16,994,995],{},"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.",[16,997,998,999],{},"Good Read on Serverless Architecture: ",[790,1000,1003],{"href":1001,"rel":1002},"https:\u002F\u002Fwww.alibabacloud.com\u002Fblog\u002Fhow-does-alibaba-cloud-power-the-biggest-online-shopping-festival_231673",[794],"How Does Alibaba Cloud Power the Biggest Online Shopping Festival?",[16,1005,1006],{},"I have also introduced 2 tools that I used to measure my website performance.",[452,1008,1009,1012],{},[360,1010,1011],{},"Loading speed from multiple locations (optimized with the help of CDN edges)",[360,1013,1014],{},"Loading optimization (optimized separately using a couple of techniques)",[16,1016,1017],{},"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.",[16,1019,1020],{},"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":29,"searchDepth":82,"depth":82,"links":1022},[1023,1024,1025],{"id":784,"depth":82,"text":785},{"id":827,"depth":82,"text":828},{"id":848,"depth":82,"text":849,"children":1026},[1027,1028,1029],{"id":898,"depth":97,"text":899},{"id":955,"depth":97,"text":956},{"id":991,"depth":97,"text":992},"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":779,"description":1032},"blog\u002F2018-04-18-blazing-fast-serverless-site","\u002Fimg\u002Fblog\u002Fblazing-fast-serverless-site-cover.png","Mo7l_6ChVITRlMpbk2OJmFYNb1RPnQVW9xKYE6kXkeQ",{"id":1040,"title":1041,"body":1042,"category":334,"date":1127,"description":1050,"extension":337,"meta":1128,"navigation":339,"path":1129,"seo":1130,"stem":1131,"thumbnail":1132,"__hash__":1133},"blogs\u002Fblog\u002F2018-04-07-maximizing-my-productivity-while-on-the-go.md","Maximizing my productivity while on the go",{"type":8,"value":1043,"toc":1122},[1044,1048,1051,1054,1057,1060,1064,1067,1070,1079,1082,1085,1089,1092,1095,1101,1110,1113,1116,1119],[11,1045,1047],{"id":1046},"the-productivity-that-comes-with-more-than-one-screen","The productivity that comes with more than one screen",[16,1049,1050],{},"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.",[16,1052,1053],{},"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.",[16,1055,1056],{},"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...",[16,1058,1059],{},"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.",[11,1061,1063],{"id":1062},"what-kind-of-app-to-be-placed-on-each-monitor","What kind of app to be placed on each monitor",[16,1065,1066],{},"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.",[16,1068,1069],{},"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.",[16,1071,1072,1073,1078],{},"Since I am also a full stack web developer, I have a different setup when it comes to web development. I will often have ",[790,1074,1077],{"href":1075,"rel":1076},"https:\u002F\u002Fwww.sublimetext.com\u002F",[794],"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.",[16,1080,1081],{},"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.",[16,1083,1084],{},"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.",[11,1086,1088],{"id":1087},"ability-to-carry-extra-screen-while-leaving-the-office","Ability to carry extra screen while leaving the office",[16,1090,1091],{},"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...",[16,1093,1094],{},"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.",[16,1096,1097],{},[923,1098],{"alt":1099,"src":1100},"using Duet at Starbucks","\u002Fimg\u002Fblog\u002Fmaximizing-my-productivity-while-on-the-go-001.jpg",[16,1102,1103,1104,1109],{},"Introducing ",[790,1105,1108],{"href":1106,"rel":1107},"https:\u002F\u002Fwww.duetdisplay.com\u002F",[794],"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.",[16,1111,1112],{},"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.",[16,1114,1115],{},"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.",[16,1117,1118],{},"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.",[16,1120,1121],{},"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":29,"searchDepth":82,"depth":82,"links":1123},[1124,1125,1126],{"id":1046,"depth":82,"text":1047},{"id":1062,"depth":82,"text":1063},{"id":1087,"depth":82,"text":1088},"2018-04-07",{},"\u002Fblog\u002F2018-04-07-maximizing-my-productivity-while-on-the-go",{"title":1041,"description":1050},"blog\u002F2018-04-07-maximizing-my-productivity-while-on-the-go","\u002Fimg\u002Fblog\u002Fmaximizing-my-productivity-while-on-the-go-cover.png","qqfBw6TIXOTb6r9EjzK1MpgJyGZedX9JI1Mf7TV5F-0",{"id":1135,"title":1136,"body":1137,"category":334,"date":1226,"description":1141,"extension":337,"meta":1227,"navigation":339,"path":1228,"seo":1229,"stem":1230,"thumbnail":1231,"__hash__":1232},"blogs\u002Fblog\u002F2018-03-31-365-days-of-procrastination.md","365 Days of Procrastination",{"type":8,"value":1138,"toc":1221},[1139,1142,1151,1155,1158,1161,1164,1170,1174,1177,1180,1183,1189,1193,1196,1199,1204,1207,1210,1213,1218],[16,1140,1141],{},"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.",[16,1143,1144],{},[923,1145],{"alt":1146,"src":1147,"className":1148},"tanjisheng.com - landing","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-001.gif",[1149,1150],"mx-auto","w-full",[11,1152,1154],{"id":1153},"the-idea-and-structure-of-the-website","The idea and structure of the website",[16,1156,1157],{},"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\".",[16,1159,1160],{},"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.",[16,1162,1163],{},"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.",[16,1165,1166],{},[923,1167],{"alt":1168,"src":1169},"tanjisheng.com - about","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-002.png",[11,1171,1173],{"id":1172},"the-genesis-of-the-procrastination","The genesis of the procrastination",[16,1175,1176],{},"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.",[16,1178,1179],{},"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.",[16,1181,1182],{},"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.",[16,1184,1185],{},[923,1186],{"alt":1187,"src":1188},"tanjisheng.com - blog","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-003.png",[11,1190,1192],{"id":1191},"the-motivation-to-end-the-procrastination","The motivation to end the procrastination",[16,1194,1195],{},"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.",[16,1197,1198],{},"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.",[891,1200,1201],{},[16,1202,1203],{},"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.",[16,1205,1206],{},"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.",[16,1208,1209],{},"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.",[16,1211,1212],{},"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.",[891,1214,1215],{},[16,1216,1217],{},"Luck Is What Happens When Preparation Meets Opportunity",[16,1219,1220],{},"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":29,"searchDepth":82,"depth":82,"links":1222},[1223,1224,1225],{"id":1153,"depth":82,"text":1154},{"id":1172,"depth":82,"text":1173},{"id":1191,"depth":82,"text":1192},"2018-03-31",{},"\u002Fblog\u002F2018-03-31-365-days-of-procrastination",{"title":1136,"description":1141},"blog\u002F2018-03-31-365-days-of-procrastination","\u002Fimg\u002Fblog\u002F365-days-of-procrastination-cover.png","oQxahVv3r_kj9G5xn_QAj6OJvAYsEFuKU8aecRnoxMM",1783650495300]