<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5603417613712574860</id><updated>2026-02-15T23:37:12.318+08:00</updated><category term="Programming"/><category term="family business"/><category term="Finance"/><category term="Spring"/><category term="php"/><category term="software development"/><category term="tools"/><category term="webdev"/><category term="Enterprise"/><category term="Functional Programming"/><category term="GAE/J"/><category term="Golf"/><category term="Laptop"/><category term="Scala"/><category term="ads"/><category term="datacentre"/><category term="home"/><category term="joomla"/><category term="public transit"/><category term="ramblings"/><category term="research"/><category term="Engineering"/><category term="FPGA"/><category term="Food for Thoughts"/><category term="Identity"/><category term="JVM to .NET"/><category term="Methodologies"/><category term="Misc"/><category term="OSGi"/><category term="SAP"/><category term="SDLC"/><category term="SaaS"/><category term="Security"/><category term="Spring DM"/><category term="Spring Security"/><category term="Talent"/><category term="Tutorial"/><category term="Words"/><category term="comparisons"/><category term="computers"/><category term="diy"/><category term="electronics"/><category term="fixit"/><category term="good read"/><category term="handyman"/><category term="insurance"/><category term="java"/><category term="machine learning"/><category term="random"/><category term="scratch my own itch"/><category term="windows"/><title type='text'>Self-Professed Nerd</title><subtitle type='html'>Random ramblings and notes for my own amusement</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>100</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-1926133104127238785</id><published>2026-02-15T22:27:00.007+08:00</published><updated>2026-02-15T23:37:12.257+08:00</updated><title type='text'>Qwen Code CLI sandbox bug</title><content type='html'>&lt;p&gt;If you are running `qwen -s` or `qwen --sandbox` and everytime you need to reauthenticate, There is a bug in qwen-code:0.10.1 docker image.&lt;/p&gt;&lt;p&gt;The CLI tool mount host `~/.qwen` directory to the container /home/node/.qwen directory: See https://github.com/QwenLM/qwen-code/blob/9adad2f369bbeea7e7295614f3e3e5342d20ce5a/packages/cli/src/utils/sandbox.ts#L433&lt;/p&gt;&lt;p&gt;But there is a recent commit which removed `User node` from the docker image. See:&amp;nbsp;https://github.com/QwenLM/qwen-code/commit/5c949136432e91a90d2b565116d73fe498fcc262#diff-dd2c0eb6ea5cfc6c4bd4eac30934e2d5746747af48fef6da689e85b752f39557L40&lt;/p&gt;&lt;p&gt;&lt;b&gt;Work around 1 - Rebuild Docker and get it back to run with user node&lt;/b&gt;&lt;/p&gt;&lt;p&gt;check out the qwen-code project, update the Dockerfile, revert some of the change of the commit back and then `npm run build:sandbox`.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Work around 2 - Hack installed qwen-code script in node_modules&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Find the `cli.js` in the node_modules installation. Find the line `/home/node/${SETTINGS_DIRECTORY_NAME}` and change it to&amp;nbsp;`/root/${SETTINGS_DIRECTORY_NAME}`.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Work around 3 - Rebuild Docker and symlink /root/.qwen with /home/node/.qwen&lt;/b&gt;&lt;/p&gt;&lt;p&gt;checkout out the qwen-code project, update the Dockerfile to symlink /root/.qwen to /home/node/.qwen like this&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhfs7V1cQBssKqFA5wkh7SbTzMoOtW5Co4uySIi28EqZ7Xkl2EziZsA4fmkJp56awH_dVPgTgF0DMgee83gX0bFgZJUbZQzZ9ZHI2hdwwNSqBnI9OZMUdYFoIHTOGCwbFeK7IMqt0g5Z7TN0hTYv7MCu_-YiaLEtVvyVFi_GtPqgcTbs208jJMo3ARcovk&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;193&quot; data-original-width=&quot;387&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhfs7V1cQBssKqFA5wkh7SbTzMoOtW5Co4uySIi28EqZ7Xkl2EziZsA4fmkJp56awH_dVPgTgF0DMgee83gX0bFgZJUbZQzZ9ZHI2hdwwNSqBnI9OZMUdYFoIHTOGCwbFeK7IMqt0g5Z7TN0hTYv7MCu_-YiaLEtVvyVFi_GtPqgcTbs208jJMo3ARcovk&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Both workaround 2 &amp;amp; 3 worked for me.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Workaround 1 is &quot;better&quot;, as it adheres to the rule of giving least/minimum access to the execution user, but it is slightly more complicated to get right and I couldn&#39;t quite get it to work yet.&lt;/p&gt;&lt;div id=&quot;professor_prebid-root&quot;&gt;&lt;/div&gt;&lt;div id=&quot;professor_prebid-root&quot;&gt;&lt;/div&gt;&lt;div id=&quot;professor_prebid-root&quot;&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/1926133104127238785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2026/02/qwen-code-cli-sandbox-bug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1926133104127238785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1926133104127238785'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2026/02/qwen-code-cli-sandbox-bug.html' title='Qwen Code CLI sandbox bug'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhfs7V1cQBssKqFA5wkh7SbTzMoOtW5Co4uySIi28EqZ7Xkl2EziZsA4fmkJp56awH_dVPgTgF0DMgee83gX0bFgZJUbZQzZ9ZHI2hdwwNSqBnI9OZMUdYFoIHTOGCwbFeK7IMqt0g5Z7TN0hTYv7MCu_-YiaLEtVvyVFi_GtPqgcTbs208jJMo3ARcovk=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-4806233254205263116</id><published>2026-02-15T14:21:00.000+08:00</published><updated>2026-02-15T14:21:01.552+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ads"/><category scheme="http://www.blogger.com/atom/ns#" term="research"/><title type='text'>Analysis: Websites Using Prebid.js Without Google Publisher Tag</title><content type='html'>&lt;h2 style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative; text-align: left;&quot;&gt;Executive Summary&lt;/h2&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; id=&quot;analysis-websites-using-prebidjs-without-google-publisher-tag&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;4&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;Our investigation into websites using Prebid.js without Google Publisher Tag revealed a surprising trend: despite extensive testing across multiple categories of websites, we found no major publishers that exclusively use Prebid.js without Google Publisher Tag. This finding is particularly relevant in light of recent anti-trust litigation against Google in the digital advertising space.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz1Ev32k_r20Jrf1efbWMez9-6yXLPN4NkTrKPiCKoltuBrU1JGEKU_Rx_myqrXBjxdFAIuIJrP1NkJU4-mr3wSbe1JIpc-m6fSIy1V4xh9VlS0xE_aHfNkvv2xzJQAGXFewBNGO_F5dzyv7JXfYDPoWe4WUP8ifIoJoQQD40QMpiP4RPSG0oS_MEjto8/s1344/17711357892158.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1344&quot; height=&quot;366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz1Ev32k_r20Jrf1efbWMez9-6yXLPN4NkTrKPiCKoltuBrU1JGEKU_Rx_myqrXBjxdFAIuIJrP1NkJU4-mr3wSbe1JIpc-m6fSIy1V4xh9VlS0xE_aHfNkvv2xzJQAGXFewBNGO_F5dzyv7JXfYDPoWe4WUP8ifIoJoQQD40QMpiP4RPSG0oS_MEjto8/w640-h366/17711357892158.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/h1&gt;&lt;h2 class=&quot;code-line&quot; data-line=&quot;6&quot; dir=&quot;auto&quot; id=&quot;key-findings&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em; position: relative;&quot;&gt;Key Findings&lt;/h2&gt;&lt;h3 class=&quot;code-line&quot; data-line=&quot;8&quot; dir=&quot;auto&quot; id=&quot;testing-results&quot; style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; position: relative;&quot;&gt;Testing Results&lt;/h3&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;ul class=&quot;code-line&quot; data-line=&quot;9&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;9&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;Tested over 60 websites across multiple categories (news, tech, entertainment, gaming, newspapers)&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;10&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;Found that nearly all websites using Prebid.js also use Google Publisher Tag&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;11&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;No websites found using Prebid.js without Google Publisher Tag&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;12&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;Some websites use neither technology&lt;/li&gt;&lt;/ul&gt;&lt;/h1&gt;&lt;h3 class=&quot;code-line&quot; data-line=&quot;14&quot; dir=&quot;auto&quot; id=&quot;industry-context-googles-anti-trust-issues&quot; style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; position: relative;&quot;&gt;Industry Context: Google&#39;s Anti-Trust Issues&lt;/h3&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;16&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;Recent developments in the ad tech industry provide important context for these findings:&lt;/p&gt;&lt;ol class=&quot;code-line&quot; data-line=&quot;18&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;18&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;18&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Department of Justice Lawsuit (2023-2024)&lt;/strong&gt;: The U.S. Department of Justice filed an anti-trust lawsuit against Google, specifically targeting its dominance in the digital advertising ecosystem. The lawsuit alleges that Google has monopolized ad tech markets through anti-competitive practices. [^1]&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;20&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;20&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;European Union Actions&lt;/strong&gt;: The EU has also taken regulatory action against Google regarding its advertising practices, including concerns about preferential treatment of Google&#39;s own ad tech products. [^2]&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;22&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;22&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Publisher Dependency&lt;/strong&gt;: The lawsuit has highlighted how publishers have become heavily dependent on Google&#39;s suite of advertising tools, creating barriers to adopting alternative solutions. [^3]&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/h1&gt;&lt;h2 class=&quot;code-line&quot; data-line=&quot;24&quot; dir=&quot;auto&quot; id=&quot;analysis-of-findings&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em; position: relative;&quot;&gt;Analysis of Findings&lt;/h2&gt;&lt;h3 class=&quot;code-line&quot; data-line=&quot;26&quot; dir=&quot;auto&quot; id=&quot;why-publishers-continue-using-both-technologies&quot; style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; position: relative;&quot;&gt;Why Publishers Continue Using Both Technologies&lt;/h3&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;ol class=&quot;code-line&quot; data-line=&quot;28&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;28&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;28&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Market Dominance&lt;/strong&gt;: Google&#39;s dominance in the ad tech ecosystem means publishers often feel compelled to use Google Publisher Tag to maintain access to Google&#39;s demand sources and ad exchange.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;30&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;30&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Revenue Optimization&lt;/strong&gt;: Publishers may use Prebid.js for header bidding to increase competition among demand sources while still relying on Google&#39;s ad server for guaranteed deals and direct-sold inventory.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;32&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;32&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Technical Integration&lt;/strong&gt;: Many publishers have legacy systems built around Google&#39;s ad tech stack, making it difficult to transition to alternative solutions.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;34&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;34&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Demand Access&lt;/strong&gt;: Google&#39;s ad exchange provides access to significant demand that publishers may be reluctant to forgo.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/h1&gt;&lt;h3 class=&quot;code-line&quot; data-line=&quot;36&quot; dir=&quot;auto&quot; id=&quot;the-paradox-of-independence&quot; style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; position: relative;&quot;&gt;The Paradox of Independence&lt;/h3&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;38&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;Despite the anti-trust concerns and the availability of alternative ad servers, our findings suggest that publishers are not moving away from Google&#39;s ad tech stack. This could be attributed to:&lt;/p&gt;&lt;ol class=&quot;code-line&quot; data-line=&quot;40&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;40&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;40&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Switching Costs&lt;/strong&gt;: The technical and operational costs of migrating to alternative ad servers may outweigh the benefits for many publishers.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;42&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;42&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Revenue Risk&lt;/strong&gt;: Publishers may fear revenue loss if they abandon Google&#39;s demand sources.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;44&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;44&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Technical Complexity&lt;/strong&gt;: Managing multiple ad server technologies can be complex and resource-intensive.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/h1&gt;&lt;h2 class=&quot;code-line&quot; data-line=&quot;46&quot; dir=&quot;auto&quot; id=&quot;implications-for-the-ad-tech-industry&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em; position: relative;&quot;&gt;Implications for the Ad Tech Industry&lt;/h2&gt;&lt;h3 class=&quot;code-line&quot; data-line=&quot;48&quot; dir=&quot;auto&quot; id=&quot;impact-of-anti-trust-litigation&quot; style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; position: relative;&quot;&gt;Impact of Anti-Trust Litigation&lt;/h3&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;50&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;The ongoing anti-trust litigation against Google has brought increased attention to the concentration of power in the ad tech industry. However, our findings suggest that:&lt;/p&gt;&lt;ol class=&quot;code-line&quot; data-line=&quot;52&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;52&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;52&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Behavior Change Slow&lt;/strong&gt;: Despite legal challenges, publisher behavior has not significantly shifted toward abandoning Google&#39;s ad tech stack.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;54&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;54&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Market Inertia&lt;/strong&gt;: The complexity and risk associated with changing ad tech infrastructure creates significant market inertia.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;56&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;56&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Alternative Solutions&lt;/strong&gt;: While alternatives like Amazon Publisher Services, Index Exchange, and other non-Google ad servers exist, adoption appears limited among major publishers.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/h1&gt;&lt;h3 class=&quot;code-line&quot; data-line=&quot;58&quot; dir=&quot;auto&quot; id=&quot;future-outlook&quot; style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; position: relative;&quot;&gt;Future Outlook&lt;/h3&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;60&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;The relationship between anti-trust pressure and publisher behavior remains complex:&lt;/p&gt;&lt;ol class=&quot;code-line&quot; data-line=&quot;62&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;62&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;62&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Potential Regulatory Changes&lt;/strong&gt;: If the anti-trust lawsuit results in regulatory changes that limit Google&#39;s ability to favor its own ad tech products, we may see more publishers exploring alternatives.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;64&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;64&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Industry Evolution&lt;/strong&gt;: The ad tech industry continues to evolve, with privacy regulations and changes in browser behavior driving innovation in alternative solutions.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;code-line&quot; data-line=&quot;66&quot; dir=&quot;auto&quot; style=&quot;position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;66&quot; dir=&quot;auto&quot; style=&quot;margin-bottom: 0.7em; margin-top: 0px; position: relative;&quot;&gt;&lt;strong&gt;Publisher Empowerment&lt;/strong&gt;: Initiatives to promote publisher independence and competition in ad tech may gain momentum as regulatory pressure increases.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/h1&gt;&lt;h2 class=&quot;code-line&quot; data-line=&quot;68&quot; dir=&quot;auto&quot; id=&quot;conclusion&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em; position: relative;&quot;&gt;Conclusion&lt;/h2&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;70&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;Our investigation reveals that despite anti-trust concerns and legal challenges facing Google in the ad tech space, major publishers continue to use both Prebid.js and Google Publisher Tag. This suggests that while publishers may embrace header bidding solutions like Prebid.js to increase competition among demand sources, they remain reliant on Google&#39;s ad serving infrastructure.&lt;/p&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;72&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;The lack of publishers using Prebid.js without Google Publisher Tag highlights the entrenched position of Google in the ad tech ecosystem and the challenges facing alternative ad servers in gaining broader adoption. As regulatory scrutiny continues and the industry evolves, it will be important to monitor whether publisher behavior shifts toward greater independence from Google&#39;s ad tech stack.&lt;/p&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;74&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;This finding underscores the importance of continued regulatory oversight and industry initiatives aimed at promoting competition and publisher independence in digital advertising.&lt;/p&gt;&lt;/h1&gt;&lt;h2 class=&quot;code-line&quot; data-line=&quot;76&quot; dir=&quot;auto&quot; id=&quot;code&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em; position: relative;&quot;&gt;Code&lt;/h2&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line code-active-line&quot; data-line=&quot;78&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;Github repository:&amp;nbsp;&lt;a data-href=&quot;https://github.com/lsiu/sites-with-prebid-without-gpt&quot; href=&quot;https://github.com/lsiu/sites-with-prebid-without-gpt&quot; style=&quot;text-decoration-line: none;&quot;&gt;https://github.com/lsiu/sites-with-prebid-without-gpt&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;h2 class=&quot;code-line&quot; data-line=&quot;81&quot; dir=&quot;auto&quot; id=&quot;references&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em; position: relative;&quot;&gt;References&lt;/h2&gt;&lt;h1 class=&quot;code-line&quot; data-line=&quot;0&quot; dir=&quot;auto&quot; style=&quot;border-bottom: 1px solid rgba(255, 255, 255, 0.18); border-left-color: rgba(255, 255, 255, 0.18); border-right-color: rgba(255, 255, 255, 0.18); border-top-color: rgba(255, 255, 255, 0.18); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe WPC&amp;quot;, &amp;quot;Segoe UI&amp;quot;, system-ui, Ubuntu, &amp;quot;Droid Sans&amp;quot;, sans-serif; line-height: 1.25; margin-bottom: 16px; margin-top: 0px; padding-bottom: 0.3em; position: relative;&quot;&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;83&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;[^1]: U.S. Department of Justice. (2023). &quot;Justice Department Sues Google for Monopolizing Digital Advertising Technologies.&quot;&amp;nbsp;&lt;a data-href=&quot;https://www.justice.gov/archives/opa/pr/justice-department-sues-google-monopolizing-digital-advertising-technologies&quot; href=&quot;https://www.justice.gov/archives/opa/pr/justice-department-sues-google-monopolizing-digital-advertising-technologies&quot; style=&quot;text-decoration-line: none;&quot;&gt;https://www.justice.gov/archives/opa/pr/justice-department-sues-google-monopolizing-digital-advertising-technologies&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;85&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;[^2]: European Commission. (2019). &quot;Antitrust: Commission fines Google €1.49 billion for abusive practices in the area of online advertising.&quot;&amp;nbsp;&lt;a data-href=&quot;https://ec.europa.eu/commission/presscorner/detail/en/ip_19_1770&quot; href=&quot;https://ec.europa.eu/commission/presscorner/detail/en/ip_19_1770&quot; style=&quot;text-decoration-line: none;&quot;&gt;https://ec.europa.eu/commission/presscorner/detail/en/ip_19_1770&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;code-line&quot; data-line=&quot;87&quot; dir=&quot;auto&quot; style=&quot;font-size: 14px; font-weight: 400; margin-bottom: 16px; margin-top: 0px; position: relative;&quot;&gt;[^3]: Miles Kruppa, Dave Michaels (2023). &quot;DOJ Sues Google, Seeking to Break Up Online Advertising Business&quot; The Wall Street Journal.&amp;nbsp;&lt;a data-href=&quot;https://www.wsj.com/us-news/law/u-s-sues-google-for-alleged-antitrust-violations-in-its-ad-tech-business-11674582792&quot; href=&quot;https://www.wsj.com/us-news/law/u-s-sues-google-for-alleged-antitrust-violations-in-its-ad-tech-business-11674582792&quot; style=&quot;text-decoration-line: none;&quot;&gt;https://www.wsj.com/us-news/law/u-s-sues-google-for-alleged-antitrust-violations-in-its-ad-tech-business-11674582792&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;div id=&quot;professor_prebid-root&quot;&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/4806233254205263116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2026/02/analysis-websites-using-prebidjs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/4806233254205263116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/4806233254205263116'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2026/02/analysis-websites-using-prebidjs.html' title='Analysis: Websites Using Prebid.js Without Google Publisher Tag'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz1Ev32k_r20Jrf1efbWMez9-6yXLPN4NkTrKPiCKoltuBrU1JGEKU_Rx_myqrXBjxdFAIuIJrP1NkJU4-mr3wSbe1JIpc-m6fSIy1V4xh9VlS0xE_aHfNkvv2xzJQAGXFewBNGO_F5dzyv7JXfYDPoWe4WUP8ifIoJoQQD40QMpiP4RPSG0oS_MEjto8/s72-w640-h366-c/17711357892158.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-6427176882675426575</id><published>2025-12-08T11:48:00.007+08:00</published><updated>2025-12-08T11:50:04.304+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ads"/><title type='text'>Tools to help understand ads on websites</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Professor Prebid -&amp;nbsp;&lt;a href=&quot;https://chromewebstore.google.com/detail/kdnllijdimhbledmfdbljampcdphcbdc?utm_source=item-share-cb&quot;&gt;https://chromewebstore.google.com/detail/kdnllijdimhbledmfdbljampcdphcbdc?utm_source=item-share-cb&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Add `google_console=1` as a URL query parameter to the URL to load the Google Ad Manager | Publisher Console&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/6427176882675426575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2025/12/tools-to-help-understand-ads-on-websites.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/6427176882675426575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/6427176882675426575'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2025/12/tools-to-help-understand-ads-on-websites.html' title='Tools to help understand ads on websites'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-7840272082665433007</id><published>2025-09-13T22:59:00.005+08:00</published><updated>2025-09-21T22:07:21.730+08:00</updated><title type='text'>Try out Qwen CLI in a docker container sandbox</title><content type='html'>&lt;h1 style=&quot;text-align: left;&quot;&gt;Overview&lt;/h1&gt;&lt;div&gt;This run Qwen in a docker container and mount your current working directory into the docker container which qwen runs on.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Why? This limit the damage it can do if these things get out of control. E.g. it tries to run &lt;span style=&quot;font-family: courier;&quot;&gt;rm -rf /&lt;/span&gt; , it on effects your current directory and kills the docker container.&amp;nbsp;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Preqrequisites&lt;/h1&gt;&lt;div&gt;1. Docker Desktop&lt;/div&gt;&lt;div&gt;2. Qwen account -&amp;gt; Register on&amp;nbsp;https://chat.qwen.ai/, it is free.&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Command Line&lt;/h1&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Run Qwen CLI in *nix&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;docker run --rm -it -v .:/src ghcr.io/qwenlm/qwen-code:latest sh -c &quot;cd /src &amp;amp;&amp;amp; qwen&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Run Qwen CLI in Windows&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;docker run --rm -it --mount type=bind,source=.,target=/src ghcr.io/qwenlm/qwen-code:latest sh -c &quot;cd /src &amp;amp;&amp;amp; qwen&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/7840272082665433007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2025/09/try-out-qwen-cli-in-docker-container.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/7840272082665433007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/7840272082665433007'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2025/09/try-out-qwen-cli-in-docker-container.html' title='Try out Qwen CLI in a docker container sandbox'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-328369861473876862</id><published>2024-08-17T18:11:00.001+08:00</published><updated>2024-08-17T18:11:01.497+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="machine learning"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>RAG with local quantized LLM model</title><content type='html'>&lt;p&gt;While there are many Retrieval Augmented Generation (RAG) post out there, many of them rely on external LLM APIs such as OpenAI or Amazon Bedrock, etc.&amp;nbsp;&lt;/p&gt;&lt;p&gt;How well do they work with quantized LLM models that can run locally? I got one &lt;a href=&quot;https://github.com/lsiu/local-rag&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;, and it works quite well for me.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/328369861473876862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2024/08/rag-with-local-quantized-llm-model.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/328369861473876862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/328369861473876862'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2024/08/rag-with-local-quantized-llm-model.html' title='RAG with local quantized LLM model'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-4886124941171614091</id><published>2023-02-04T21:12:00.002+08:00</published><updated>2023-02-04T21:12:22.470+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="comparisons"/><category scheme="http://www.blogger.com/atom/ns#" term="home"/><category scheme="http://www.blogger.com/atom/ns#" term="insurance"/><category scheme="http://www.blogger.com/atom/ns#" term="research"/><title type='text'>How I chose Generali home insurance in 2023?</title><content type='html'>&lt;p&gt;I read through multiple home insurance comparison sites such as &lt;a href=&quot;https://www.blogger.com/blog/post/edit/5603417613712574860/4886124941171614091#&quot;&gt;MoneySmart&lt;/a&gt; and &lt;a href=&quot;https://www.blogger.com/blog/post/edit/5603417613712574860/4886124941171614091#&quot;&gt;MoneyHero&lt;/a&gt;, and articles/sites such as those from &lt;a href=&quot;https://www.blogger.com/blog/post/edit/5603417613712574860/4886124941171614091#&quot;&gt;10life&lt;/a&gt;, &lt;a href=&quot;https://www.blogger.com/blog/post/edit/5603417613712574860/4886124941171614091#&quot;&gt;spacious.hk&lt;/a&gt;, and even this &lt;a href=&quot;https://www.consumer.org.hk/tc/article/429-3752&quot;&gt;old article in 2012 from Consumer Council&lt;/a&gt;, and still have no clue which insurance to get. There are too many &quot;features&#39;&#39; offered by these insurance companies, and it just muddles the water. What it comes down to is really knowing what I want want out of the home insurance, and it comes down to 2 things:&lt;/p&gt;

&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Third-party legal liability protection&lt;/li&gt;&lt;li&gt;Insurance for my home content&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;  
  I went through all the insurance company that offers home insurance: Zurich, FWD, Generali, Blue Cross, Dah Sing, QBE, AIG, Allied World, Prudential, HSBC/AXA, AXA, MSIG, AIA, Pingan, One Degree, Bank of China Group (BOCG), Sompo, Hong Leong and&amp;nbsp; Allianz, and got their annual premium, third party legal liability protection amount and home content insurance amount and calculated the Legal Liability Insured per $ and Home content insured per dollar. I rank them all in this &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1Hs8FbX25OOsPc6iJ5wNciCsl4dtvQ6wAn79JJEBJns0/edit?usp=sharing&quot;&gt;spreadsheet&lt;/a&gt;.
&lt;/p&gt;

&lt;h3 style=&quot;text-align: left;&quot;&gt;Legal Liability Insured per $&lt;/h3&gt;

&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rank&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Company&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rate&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Coverage&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Insured per dollar&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;AXA/HSBC 2&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1680&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;20,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;11,904.76&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Prudential Premier&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1360&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;15,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;11,029.41&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Prudential Harmony&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;990&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;10,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;10,101.01&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One Degree Standard&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1025&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;10,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;9,756.10&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Pingan&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1066&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;10,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;9,380.86&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Dah Sing Plan C&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1280&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;12,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;9,375.00&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Blue Cross Plan B&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;980&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;9,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;9,183.67&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One Degree Plus&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1342&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;12,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;8,941.88&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One Degree Prestige&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1690&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;15,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;8,875.74&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;10&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Generali&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;888.89&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;7,500,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;8,437.49&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 style=&quot;text-align: left;&quot;&gt;Home Content Insured per $&lt;/h3&gt;

&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rank&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Company&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rate&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Coverage&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Insured per dollar&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Generali&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;888.89&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,125.00&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Sompo 2&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;900&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,111.11&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Prudential Premier&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1360&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,500,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,102.94&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Sompo 1&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1000&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Pingan&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1066&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;938.09&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Dah Sing Plan C&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1280&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,200,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;937.50&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;AIG Standard&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1280&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,000,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;781.25&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One Degree Standard&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1025&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;800,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;780.49&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Blue Cross Plan B&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;980&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;750,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;765.31&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;10&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Blue Cross Plan A&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1580&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;1,200,000.00&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;759.49&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The AXA/HSBC Plan 2 offer was quite tempting, given its high legal liability total coverage and insured per dollar. This is especially true after reading unverified information from forums such as this one from baby-kingdom where the poster claimed “&lt;a href=&quot;https://www.baby-kingdom.com/forum.php?mod=redirect&amp;amp;goto=findpost&amp;amp;ptid=21848073&amp;amp;pid=329134984&quot;&gt;someone forgot to turn off the water, flood the elevators and have to pay 15 million Hong Kong dollars for damage&lt;/a&gt;”. However, the home content coverage is a little low at only HK$600,000, which doesn’t even make it to the top 10 for home content insured per $.&lt;/p&gt;

&lt;p&gt;&lt;img height=&quot;137&quot; src=&quot;https://lh3.googleusercontent.com/LYKFNxH0EXfloy7N9Xx44g3y9I1dqGHvspcEDtsjT3a8S6wv7M0p1HujgjHVhUQYHcUjq3t4QPipRF6EhYwXC9iob2lFOiHYYbnrJO6cCo1mD6vJPfAvuDsr9_AXNN_NMYH7rUzsVhbK7T4Jhzf31MQ&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;690&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Did someone really pay HK$15 million for damage to the building’s elevator? Hard to say. Doing my own research, I found a couple of news articles that put claims of flood damage to elevator(s) at &lt;a href=&quot;https://www.hk01.com/%E5%8D%B3%E6%99%82%E5%A8%9B%E6%A8%82/759481/%E6%9D%B1%E5%BC%B5%E8%A5%BF%E6%9C%9B-%E6%B0%B4%E7%AE%A1%E7%88%86%E8%A3%82%E5%BB%B6%E8%AA%A4%E8%99%95%E7%90%86%E6%B5%B8%E5%A3%9E%F0%A8%8B%A2-%E6%A5%AD%E4%B8%BB%E8%A6%81%E8%B2%A0%E8%B2%AC%E7%B6%AD%E4%BF%AE%E8%B2%BB%E4%B8%8A%E7%99%BE%E8%90%AC&quot;&gt;up to K$1 million for this case (2022)&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;https://www.edigest.hk/%E7%90%86%E8%B2%A1/%E6%94%B6%E7%A7%9F-%E6%A5%AD%E4%B8%BB-%E8%B3%A0%E5%84%9F-%E7%88%86%E6%B0%B4%E5%96%89-%E5%8A%89%E5%95%9F%E6%98%8E-%E7%90%86%E8%B2%A1%E5%80%8B%E6%A1%88-%E7%90%86%E8%B2%A1%E8%A7%A3%E7%A2%BC-111805/&quot;&gt;HK$3.5 million for another case (2019)&lt;/a&gt;. It is a good idea to take even news articles with a grain of salt these days, so if anyone in the elevator repair industry or home insurance industry knows what a “sensible” amount to insure for, please do share!&lt;/p&gt;

&lt;p&gt;At the end of the day, I chose Generali, with annual premium at only HK$888.89, with the HK$7.5 million legal liability coverage (rank #10) and HK$1 million dollar home content coverage (rank #1).&lt;/p&gt;

&lt;p&gt;For less than HK$200 extra, Pingan also seems like a decent choice for my situation, with annual premium at HK$1,066, you can HK$10 million legal liability (rank #5) and HK10 million home content (rank $5) insurance coverage.&lt;/p&gt;

&lt;p&gt;For an extra few hundred dollars per year, Prudential Premier with annual premium at HK$1,360, with HK$15 million and HK$15 million is also a good choice if I move into a more upscale condo and I own more expensive stuff in my home.&lt;/p&gt;





</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/4886124941171614091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2023/02/how-i-chose-generali-home-insurance-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/4886124941171614091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/4886124941171614091'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2023/02/how-i-chose-generali-home-insurance-in.html' title='How I chose Generali home insurance in 2023?'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/LYKFNxH0EXfloy7N9Xx44g3y9I1dqGHvspcEDtsjT3a8S6wv7M0p1HujgjHVhUQYHcUjq3t4QPipRF6EhYwXC9iob2lFOiHYYbnrJO6cCo1mD6vJPfAvuDsr9_AXNN_NMYH7rUzsVhbK7T4Jhzf31MQ=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-3845586134463898860</id><published>2021-12-17T20:38:00.004+08:00</published><updated>2023-02-04T21:13:19.543+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="diy"/><category scheme="http://www.blogger.com/atom/ns#" term="electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="fixit"/><category scheme="http://www.blogger.com/atom/ns#" term="handyman"/><category scheme="http://www.blogger.com/atom/ns#" term="home"/><title type='text'>Proluxury PDE001060 dehumidifier will not turn on!</title><content type='html'>&lt;p&gt;This is the second dehumidifier that won&#39;t turn on for me. The first one was a busted tactile switch. I am prettier sure of that because I opened up the dehumidifier to access the circuit board. I was able to short circuit across the switch and the dehumidifier will turn on. First time round, as a spoiled developed-world brat, I just bought another dehumidifier, a Proluxury pde001060 dehumidifier.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir4VrPajL3fVrtdVOfcShXi39R_DII_zwT4sCjMswhj1cfe6YWi8b2w2fdLXM34baLWS5w8EW836C4p47d_SCY2S2PPC6urVi0UYv-Su-tv0a8TWzHwZfb61ojbQk_xxjdz-1Q5UkRYXo/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;750&quot; data-original-width=&quot;750&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir4VrPajL3fVrtdVOfcShXi39R_DII_zwT4sCjMswhj1cfe6YWi8b2w2fdLXM34baLWS5w8EW836C4p47d_SCY2S2PPC6urVi0UYv-Su-tv0a8TWzHwZfb61ojbQk_xxjdz-1Q5UkRYXo/&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This time I also opened up the dehumidifier. Long and behold, another busted tactile switch. I short circuit across the switch pins, and the device turn on.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/Pz-7y33kUfQ&quot; width=&quot;320&quot; youtube-src-id=&quot;Pz-7y33kUfQ&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Took out the circuit board of the dehumidifier.&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf15B1nNUAR2dsTXTCQYU937YvnHKH_ADCBy3l2dtjJAko4iZgqPPSX3relRTQRE5_IPKdK1JBlAgSB4Fvmxewwrom2WdhhgwB-TF76fHoHMHLZyzk_KiBm2g4HG9xqOEOgXNqziH0i54/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;480&quot; data-original-width=&quot;640&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf15B1nNUAR2dsTXTCQYU937YvnHKH_ADCBy3l2dtjJAko4iZgqPPSX3relRTQRE5_IPKdK1JBlAgSB4Fvmxewwrom2WdhhgwB-TF76fHoHMHLZyzk_KiBm2g4HG9xqOEOgXNqziH0i54/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;It actually locked burnt out!&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&quot;Not again!?&quot;, as my daughter will put it. And as an engineer, this is totally not acceptable, so I go about my journey to fix it. Time for some Googling.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoTTHe1dOHTH7RTWSt0rnlgJdSctzNLTDXt_XpuDblAp48M3rwErgYeNu-vKpJDkz_jknRptGjqFeIhkQr4yOlx1jjOfDSNSajXrpfguLNmhZ4luNONAxzLnUVfoyZJSS_7H84FvFhJYg/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoTTHe1dOHTH7RTWSt0rnlgJdSctzNLTDXt_XpuDblAp48M3rwErgYeNu-vKpJDkz_jknRptGjqFeIhkQr4yOlx1jjOfDSNSajXrpfguLNmhZ4luNONAxzLnUVfoyZJSS_7H84FvFhJYg/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu48nROH75Sy8I_dQV4zOK4sBdN32QduVUGCyNC2hpO6cR5J7i8Osi18Go2hMyOy06Q6y1hEmegsqPzIXAH1XvQHQs2nMgJ4rcPP-jpHHeWup0RmU9q2R-WKDrUpeZdFBnjVJ2tHj3LPI/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;968&quot; data-original-width=&quot;473&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu48nROH75Sy8I_dQV4zOK4sBdN32QduVUGCyNC2hpO6cR5J7i8Osi18Go2hMyOy06Q6y1hEmegsqPzIXAH1XvQHQs2nMgJ4rcPP-jpHHeWup0RmU9q2R-WKDrUpeZdFBnjVJ2tHj3LPI/&quot; width=&quot;117&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCBrOivQ00O8zFxBlm3wWJL8PRufsZIZTCFvWk8q9ybkkXQO5H7JtcoY4lFQ84SepMt31FgdvI-8hyphenhyphenk9XCtAeHrAHODPhFDtktqkEY2ub6tXv0GxmJNIux9vEDJcEVD63nvTbiDqv7S2w/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1519&quot; data-original-width=&quot;738&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCBrOivQ00O8zFxBlm3wWJL8PRufsZIZTCFvWk8q9ybkkXQO5H7JtcoY4lFQ84SepMt31FgdvI-8hyphenhyphenk9XCtAeHrAHODPhFDtktqkEY2ub6tXv0GxmJNIux9vEDJcEVD63nvTbiDqv7S2w/&quot; width=&quot;117&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;First off, Google Lens. Yup, found images of the switch, but none of the linked sites tell me the model or where to buy it.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Good thing my google-fu is up to snuff. Measure the size of the switch, let&#39;s try &quot;6mm tactile switch&quot;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPdCet_zOnnXqXFVSbaA7n5lIHd9-BPL7_xdQOw9mvge9duMFoDHLjI1YkqjYjHDI0GxIE2pITH3ZQaWyKJvwj4clpOqkyumvgGJEoR7ygBghxEndO5yLt5S5_N644zQi_1A6ZVJUaLfw/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;480&quot; data-original-width=&quot;360&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPdCet_zOnnXqXFVSbaA7n5lIHd9-BPL7_xdQOw9mvge9duMFoDHLjI1YkqjYjHDI0GxIE2pITH3ZQaWyKJvwj4clpOqkyumvgGJEoR7ygBghxEndO5yLt5S5_N644zQi_1A6ZVJUaLfw/&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Is that 5 or 6mm? as I squint to try and red the tape measurer. Good thing digital zoom on phone camera are awesome these days.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mouser did some excellent SEO, and they are one of the first site to show up. 4 pages worth of 6mm switches. After looking through a few switches, I narrowed it down to the&amp;nbsp;FSM12JH model and it is only HK$1.28! Great! Add to cart, checkout.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7G9xcihvKDyskIu_SGXv692sGYN8rrAsteuVB44JMUjy0LkRDkk2unyPHK9wUSPZxME1vZ7pUfmwt-PT9cq6kKE3_I_zlVJa9KAx5WBQ1rpIM6UQY_q92R3n1uCkaZDXRYLn_c4QezM/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;711&quot; data-original-width=&quot;975&quot; height=&quot;233&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7G9xcihvKDyskIu_SGXv692sGYN8rrAsteuVB44JMUjy0LkRDkk2unyPHK9wUSPZxME1vZ7pUfmwt-PT9cq6kKE3_I_zlVJa9KAx5WBQ1rpIM6UQY_q92R3n1uCkaZDXRYLn_c4QezM/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Wait a minute, HK$125 for shipping!?&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Wait a minute, HK$125 for shipping? Err... That is why Taobao is your friend. CNY 0.5 per switch HK$ 12.31 shipped to Hong Kong. In fact, it was so cheap I am worried that they won&#39;t bother with my order, or have some hidden MOQ. I double check with the seller to see whether they are okay to just ship 4 pcs to Hong Kong, and they are okay with that. I end up buy 10pcs, don&#39;t know why....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKpiAFvF9intQ1srJDo3wTGMK10CpYj8MUWLkayX5PUBducPUdmvFaF_w46gJI56L6denr5DaNIF0M39qff_PzrZEJMzXKQrzv9Hxc-5Qt0Z6_uapsYELE5v63q_avuNiPKuz85VLaSWc/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1518&quot; data-original-width=&quot;738&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKpiAFvF9intQ1srJDo3wTGMK10CpYj8MUWLkayX5PUBducPUdmvFaF_w46gJI56L6denr5DaNIF0M39qff_PzrZEJMzXKQrzv9Hxc-5Qt0Z6_uapsYELE5v63q_avuNiPKuz85VLaSWc/&quot; width=&quot;117&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEX-OuskrASXBT_F7m7O7ylxStM5zsVeVy55IR38Ska6sYKFLx_xZUFBIwfLeZoDPHflFHru-P4gf0iSGMngzRVdd1DpMEaVHccBufYD1Iie_dNiC5g6_OYbe0cfEKlgOx6_D2VCgcGSc/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1516&quot; data-original-width=&quot;738&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEX-OuskrASXBT_F7m7O7ylxStM5zsVeVy55IR38Ska6sYKFLx_xZUFBIwfLeZoDPHflFHru-P4gf0iSGMngzRVdd1DpMEaVHccBufYD1Iie_dNiC5g6_OYbe0cfEKlgOx6_D2VCgcGSc/&quot; width=&quot;117&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Buy and shipping from Taobao to Hong Kong is so affordable!&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Ordered on Sunday 12/12, goods arrived on Friday 12/15. I ordered way more than just the switches, from shops across China, so the shipping took a little longer than if I just ordered the switches. This is expected.&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwZle2WEV1sMSNzWmaPtUnzkdS-TB3M2Ck3UBNitpiLH7YDxRWxI5dPo6z94LqIh8ajxq4uF8LnO8dcaGX4eOQGSouc1XJ2cZ0R92SHHC43uWUy5K_LsMjBTUb4O9wOrPfWu_ev4Ug9sI/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;480&quot; data-original-width=&quot;360&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwZle2WEV1sMSNzWmaPtUnzkdS-TB3M2Ck3UBNitpiLH7YDxRWxI5dPo6z94LqIh8ajxq4uF8LnO8dcaGX4eOQGSouc1XJ2cZ0R92SHHC43uWUy5K_LsMjBTUb4O9wOrPfWu_ev4Ug9sI/&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Hohoho! I went a little nuts with the 12/12 discounts.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUi6XfwBWL9AjTc3oxnXMX6iaNaa7EAOfCsoZU7VtinvV6-ZsO1F7z1ratxpikCZJgCzY7XmGV4TUkCXDfpjCRKF2OUPrp8FOGFqNYPS3VjzimSc10_Bkeg0zaVRfHo_POG7oVT81iWEw/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;480&quot; data-original-width=&quot;360&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUi6XfwBWL9AjTc3oxnXMX6iaNaa7EAOfCsoZU7VtinvV6-ZsO1F7z1ratxpikCZJgCzY7XmGV4TUkCXDfpjCRKF2OUPrp8FOGFqNYPS3VjzimSc10_Bkeg0zaVRfHo_POG7oVT81iWEw/&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Busted out by soldering and de-soldering skills.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/jj6oYaewEZ8&quot; width=&quot;320&quot; youtube-src-id=&quot;jj6oYaewEZ8&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Fixed!&lt;/i&gt;&lt;/div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;div&gt;&lt;div&gt;It will be a lot easier to just by a new dehumidifier, but what a waste for just a busted switch. I am glad I gave it a try and managed to fix it.&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/3845586134463898860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/12/proluxury-pde001060-dehumidifier-will.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/3845586134463898860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/3845586134463898860'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/12/proluxury-pde001060-dehumidifier-will.html' title='Proluxury PDE001060 dehumidifier will not turn on!'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir4VrPajL3fVrtdVOfcShXi39R_DII_zwT4sCjMswhj1cfe6YWi8b2w2fdLXM34baLWS5w8EW836C4p47d_SCY2S2PPC6urVi0UYv-Su-tv0a8TWzHwZfb61ojbQk_xxjdz-1Q5UkRYXo/s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-2581396441138082890</id><published>2021-11-15T22:02:00.002+08:00</published><updated>2021-11-15T22:02:49.739+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laptop"/><title type='text'>The infamous Razer laptop battery swelling / bulging</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSa8rBPs6qIfBAeSjguhtkBAoPtXocS8-YSvw8us-pn9qUINYRrk8ayG7fqbJSYTvNQy40_fUpdGXpkpjwT3saA-uNvxGmcdar2-j3wVPWqxtI-lQ8ptiyOpRs5l39VJVqE1TCpnP2FUo/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;431&quot; data-original-width=&quot;1024&quot; height=&quot;270&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSa8rBPs6qIfBAeSjguhtkBAoPtXocS8-YSvw8us-pn9qUINYRrk8ayG7fqbJSYTvNQy40_fUpdGXpkpjwT3saA-uNvxGmcdar2-j3wVPWqxtI-lQ8ptiyOpRs5l39VJVqE1TCpnP2FUo/w640-h270/razer+blade+battery+swelling.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;The infamous Razer laptop battery swelling / bulging problem&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;_1qeIAgB0cPwnLhDF9XSiJM&quot; style=&quot;border: 0px; font: inherit; margin: 0px; padding: 0.8em 0px 0.25em; vertical-align: baseline;&quot;&gt;The infamous Razer laptop battery swelling / bulging. Yes. I got it too. I have own more than 10+ laptop of various brands - Apple, Lenovo, Dell, HP, Gateway, etc., and my first Razer is the only one that I got a swelling/bulging battery problem.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;p class=&quot;_1qeIAgB0cPwnLhDF9XSiJM&quot; style=&quot;border: 0px; font: inherit; margin: 0px; padding: 0.8em 0px 0.25em; text-align: left; vertical-align: baseline;&quot;&gt;Is it just my luck or razer&#39;s quality problem?&lt;/p&gt;&lt;p class=&quot;_1qeIAgB0cPwnLhDF9XSiJM&quot; style=&quot;border: 0px; font: inherit; margin: 0px; padding: 0.8em 0px 0.25em; text-align: left; vertical-align: baseline;&quot;&gt;Is it a battery quality problem, or just the laptop design will kill any battery?&lt;/p&gt;&lt;p class=&quot;_1qeIAgB0cPwnLhDF9XSiJM&quot; style=&quot;border: 0px; font: inherit; margin: 0px; padding: 0.8em 0px 0.25em; text-align: left; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAZKaZvZKIZTI3fA95e3aDNxq3XUeIfQ59fbKmAyVcRY_6oMLu6ddgOyzMjx6C-x1I1CCpsAgGupAeOWD_qqMXvGml2_CtA7H4rWwb7JOPqbTXPI41eeh6csQ66-ZUBkDz7wO91cRyYDE/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1024&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAZKaZvZKIZTI3fA95e3aDNxq3XUeIfQ59fbKmAyVcRY_6oMLu6ddgOyzMjx6C-x1I1CCpsAgGupAeOWD_qqMXvGml2_CtA7H4rWwb7JOPqbTXPI41eeh6csQ66-ZUBkDz7wO91cRyYDE/w640-h480/razer+blade+battery+swlled+vs+replacement.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;Swelling battery vs replacement battery&lt;/div&gt;&lt;p class=&quot;_1qeIAgB0cPwnLhDF9XSiJM&quot; style=&quot;border: 0px; font: inherit; margin: 0px; padding: 0.8em 0px 0.25em; text-align: left; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;I got a replacement from a TMall Taobao store, which has the most review. I scanned through the reviews and they are look all positive, diverse and genuine. It is definitely not the cheapest, but I do not think going for the cheapest replacement here is a good idea.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Let&#39;s see how long this last and whether I will get a battery swelling problem again.&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/2581396441138082890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/11/the-infamous-razer-laptop-battery.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/2581396441138082890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/2581396441138082890'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/11/the-infamous-razer-laptop-battery.html' title='The infamous Razer laptop battery swelling / bulging'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSa8rBPs6qIfBAeSjguhtkBAoPtXocS8-YSvw8us-pn9qUINYRrk8ayG7fqbJSYTvNQy40_fUpdGXpkpjwT3saA-uNvxGmcdar2-j3wVPWqxtI-lQ8ptiyOpRs5l39VJVqE1TCpnP2FUo/s72-w640-h270-c/razer+blade+battery+swelling.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-5414584385944268984</id><published>2021-09-11T17:02:00.001+08:00</published><updated>2023-02-04T21:13:57.398+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="webdev"/><title type='text'>Smallest Java hello world web application</title><content type='html'>&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Requires no dependencies other the Java runtime itself.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Since JDK 11+, you can run the file directly&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;script src=&quot;https://gist.github.com/lsiu/979645f54d4af85b446a4a01cd2c32eb.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/5414584385944268984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/09/smallest-java-hello-world-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/5414584385944268984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/5414584385944268984'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/09/smallest-java-hello-world-web.html' title='Smallest Java hello world web application'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-3723467228576653307</id><published>2021-05-24T22:28:00.001+08:00</published><updated>2021-05-24T22:28:43.653+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Finance"/><title type='text'>Withholding tax by country of major markets</title><content type='html'>&lt;p&gt;&lt;/p&gt;
&lt;div&gt;Withholding tax by country of major financial markets&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;table class=&quot;tabular-data&quot;&gt;
    &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Australia&lt;/td&gt;&lt;td&gt;30%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;td&gt;25%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;China (Mainland Incorporated)&lt;/td&gt;&lt;td&gt;10%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;China (Offsohore Incorporated)&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Hong Kong&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Japan&lt;/td&gt;&lt;td&gt;20.42%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Singpaore&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Singapore REITs&lt;/td&gt;&lt;td&gt;10%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;U.K.&lt;/td&gt;&lt;td&gt;0%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;U.K. REITs&lt;/td&gt;&lt;td&gt;20%&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;U.S.&lt;/td&gt;&lt;td&gt;30%&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Source: https://www.spglobal.com/spdji/en/documents/additional-material/withholding-tax-index-values.pdf&lt;/i&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/3723467228576653307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/05/withholding-tax-by-country-of-major.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/3723467228576653307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/3723467228576653307'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/05/withholding-tax-by-country-of-major.html' title='Withholding tax by country of major markets'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-5369087083272512494</id><published>2021-05-23T09:52:00.002+08:00</published><updated>2021-05-24T22:23:05.445+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Finance"/><title type='text'>Most stock pickers loses to the index? Just buy the index. Does this advice work in Hong Kong?</title><content type='html'>If you invest in the Hong Kong stock market, Tracker Fund (2800) is one of the bigger and better-known funds. Does just buy the index work?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcXckmKRVqW6UOPJeWH51ii23hrgW_pSca3aKGgkIB-9_BAcmXYZHCE96noX3YolTQCtad8FoNr5Q20YnVegLXQURFsnlLvyVAcxYbRvGYSTc1GxtgMt1n_Gyu_D67mlie3P0dZPhFvgE/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;840&quot; data-original-width=&quot;1156&quot; height=&quot;466&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcXckmKRVqW6UOPJeWH51ii23hrgW_pSca3aKGgkIB-9_BAcmXYZHCE96noX3YolTQCtad8FoNr5Q20YnVegLXQURFsnlLvyVAcxYbRvGYSTc1GxtgMt1n_Gyu_D67mlie3P0dZPhFvgE/w640-h466/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;source: charts created from&amp;nbsp;https://www.tradingview.com/&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;If you invested in 2800 10 years ago (2011-05-16 to 2021-05-17), in the course of this 10 years, you are looking at about 23% capital appreciation. Assuming inflation at 2% p.a., it barely tracks inflation of ~22%. The good news is there is a dividend, and you would have collected 8.01 HKD per share, and this doesn&#39;t look too bad.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxtOFsllmZLn895z966_IjjFBK9rdPQY_dDN0SCfVzK4G-N_WwYVcrCiB_ogbeaMAj9qDcQfP_hSlYXdYahrwxBftNxzG8HyhzZRZcl8zAG8Haddz9c1rNLrO-lMHxzJ5QC0lmBkhsSgg/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;870&quot; data-original-width=&quot;1197&quot; height=&quot;466&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxtOFsllmZLn895z966_IjjFBK9rdPQY_dDN0SCfVzK4G-N_WwYVcrCiB_ogbeaMAj9qDcQfP_hSlYXdYahrwxBftNxzG8HyhzZRZcl8zAG8Haddz9c1rNLrO-lMHxzJ5QC0lmBkhsSgg/w640-h466/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;source:&amp;nbsp;http://www.aastocks.com/en/stocks/analysis/company-fundamental/dividend-history?symbol=02800&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let&#39;s look at trading view says when we click the &quot;adj&quot; - adjust data for dividends, and we are looking at about 70% return.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibypom_mqvgbR2qwsxcbg6a3sXGsPPsvNfx6f_p6NoWjRkLlxHby4PwVGYc5RpAMAYBokKmMiqjUML5-uvAqu8_qWzanlvsYklQ-pZ6V_vbclD_GtUJml33nrOSqx-9ktSF9vWXPKOITE/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;881&quot; data-original-width=&quot;1155&quot; height=&quot;488&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibypom_mqvgbR2qwsxcbg6a3sXGsPPsvNfx6f_p6NoWjRkLlxHby4PwVGYc5RpAMAYBokKmMiqjUML5-uvAqu8_qWzanlvsYklQ-pZ6V_vbclD_GtUJml33nrOSqx-9ktSF9vWXPKOITE/w640-h488/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;source: charts created from&amp;nbsp;https://www.tradingview.com/&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;However, if you look at VTI and DIA in US, you can see 2800 really lacks behind:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;VTI rose 210.92% for the same period&lt;/li&gt;&lt;li&gt;DIA rose 173.96% for the same period&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2gxhOTnRQmi8JGLt68A6GKSTBjCittcN-tvoJFJDKim7UT2LfEUH9FvhCh_CgzwMv8TGlkpA2kpqP31dfTmRSrU6VwAGWkk8WAOhn3LHjUl977tudHpykZQwQ9tZCB790wTsd-OkXfkc/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;840&quot; data-original-width=&quot;1156&quot; height=&quot;466&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2gxhOTnRQmi8JGLt68A6GKSTBjCittcN-tvoJFJDKim7UT2LfEUH9FvhCh_CgzwMv8TGlkpA2kpqP31dfTmRSrU6VwAGWkk8WAOhn3LHjUl977tudHpykZQwQ9tZCB790wTsd-OkXfkc/w640-h466/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;source: charts created from&amp;nbsp;https://www.tradingview.com/&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Although, past performance is not indicative of future results, given this observation, should we bother with investing in the Tracker fund (2800)? Or any Hong Kong index fund / ETFs at all?&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/5369087083272512494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/05/most-stock-pickers-loses-to-index-just.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/5369087083272512494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/5369087083272512494'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/05/most-stock-pickers-loses-to-index-just.html' title='Most stock pickers loses to the index? Just buy the index. Does this advice work in Hong Kong?'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcXckmKRVqW6UOPJeWH51ii23hrgW_pSca3aKGgkIB-9_BAcmXYZHCE96noX3YolTQCtad8FoNr5Q20YnVegLXQURFsnlLvyVAcxYbRvGYSTc1GxtgMt1n_Gyu_D67mlie3P0dZPhFvgE/s72-w640-h466-c/image.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-79615154411519941</id><published>2021-05-19T16:23:00.003+08:00</published><updated>2021-05-19T18:55:08.134+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Is Kotlin still a good choice for JVM based backend today?</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;It has been while since I start a
new JVM project. I needed to build something quick and dirty, e.g., within a
day or two, so I went with something I was most familiar with, Spring Boot, to
get the project up and running.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;-webkit-text-stroke-width: 0px; font-variant-caps: normal; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;It has been a while, but Kotlin
has been the crazy a few years back and I had used it a few times with my
previous employer. It is now a choice among the JVM languages. I have been away
from the JVM space for more than a year (and boy, do I miss it), so it was
either Java or Kotlin for me. I went with Kotlin just to keep it interesting.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;-webkit-text-stroke-width: 0px; font-variant-caps: normal; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;I went with the&amp;nbsp;&lt;a href=&quot;https://start.spring.io/&quot; target=&quot;_blank&quot;&gt;Spring Initializr&lt;/a&gt;, picked my poison and got my project up in no time. It is a
simple Web-MVC application, with one simple page with a form, some REST API
call out to other services, and read only to database. Picking Gradle for build
and Kotlin for language, the project generated a Kotlin base build file&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: black; font-family: Courier; font-size: 13.5pt;&quot;&gt;build.gradle.kts&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;. This is new to me, but the script is
still very readable, so no extra learning curve here.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;-webkit-text-stroke-width: 0px; font-variant-caps: normal; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;Last time I used Spring Boot
with Kotlin, I recalled there are little things here and there that we need to
&quot;tweak&quot; to get Spring Boot feature to work properly with Kotlin.
These &quot;tweaks&quot; feel like some inherent&amp;nbsp;mismatch between Spring
Boot and Kotlin. For my new recent project, it appears all these “mismatch”
still exist.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;For example, to use Kotlin data
class as @ConfigurationProperties object, we need to add this @ConstructorBinding
annotation to the class and add “kapt” plugin to the project. This feels like
some sort of workaround for some incompatibility between Kotlin data class and
how Spring Boot @ConfigurationProperties works. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;Next adding spring-data-jpa
support with Kotlin, we need to add another slew of plugins &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; font-size: 13.5pt; mso-ansi-language: EN-US;&quot;&gt;“plugin.allopen”,
“plugin.noarg”, “plugin.jpa”, and some custom extra gradle configuration:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 13.5pt;&quot;&gt;allOpen
{&lt;br /&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;annotation(&quot;javax.persistence.Entity&quot;)&lt;br /&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;annotation(&quot;javax.persistence.Embeddable&quot;)&lt;br /&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;annotation(&quot;javax.persistence.MappedSuperclass&quot;)&lt;br /&gt;
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;These little problems are often the
reason why many “experienced” developers still refuse to adopt higher order
frameworks such as Spring Boot and Ruby and Rails, and prefer to keep rolling
their own, copy-and-pasting from past projects, because when the magic works,
it is awesome, but if it doesn’t, trying to find the problem on your own is like
trying to find a needle in a haystack. This is the size of the ecosystem
matters, and the good old Spring Boot and its &quot;Google-able-bility&quot; is
still top notch.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;The target deployment environment
is Kubernetes and I had experience using Docker and Dockerfile to build image,
but Spring Boot simplified this for me and all I need is run &lt;/span&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 13.5pt;&quot;&gt;gradlew bootBuildImage&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;. With a little bit more work to setup the
Gitlab pipeline to use kustomize and kubectl to push to EKS, the application
was up in a day.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;font-size: 13.5pt;&quot;&gt;This got me thinking: &lt;i&gt;Is&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;i&gt;Kotlin still a good choice for JVM based backend today&lt;/i&gt;?&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: black; font-size: 13.5pt;&quot;&gt;With Java 17 LTS fast approaching,
and many awesome language features added since the last LTS, such as java
records in Java 16, it appears the language level gap between Kotlin and Java
has shrunk. So, does it still justify using Kotlin, knowing that all these little
incompatibility between the language and other frameworks?&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 13.5pt;&quot;&gt;I think I found my answer in &lt;/span&gt;&lt;a href=&quot;https://www.reddit.com/r/java/comments/ndwz92/can_i_get_some_reasons_to_use_java_instead_of/gyd5yi5/?utm_source=share&amp;amp;utm_medium=web2x&amp;amp;context=3&quot; style=&quot;font-size: 13.5pt;&quot; target=&quot;_blank&quot;&gt;a comment by rzwitserloot in r/java&lt;/a&gt;&lt;span style=&quot;font-size: 13.5pt;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/79615154411519941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/05/is-kotlin-still-good-choice-for-jvm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/79615154411519941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/79615154411519941'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2021/05/is-kotlin-still-good-choice-for-jvm.html' title='Is Kotlin still a good choice for JVM based backend today?'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-8000559805355673384</id><published>2020-12-09T23:59:00.008+08:00</published><updated>2021-05-19T18:26:45.985+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="public transit"/><category scheme="http://www.blogger.com/atom/ns#" term="scratch my own itch"/><title type='text'>An app to show bus ETA to the nearest stop quickly</title><content type='html'>&lt;p&gt;I take the bus to work daily. At least before COVID-19 hit. I could never understand why would any reputable company would put so many ads on their official bus app. Are they so desperate for that little extra revenue?&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  &lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;474&quot; src=&quot;https://www.youtube.com/embed/zduncSbLOtY&quot; width=&quot;571&quot; youtube-src-id=&quot;zduncSbLOtY&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  Terrible UX from CityBus NWFB. An anoying splash screen, then a full page ad, before the app loads.&lt;/div&gt;&lt;p&gt;I just want open the app, and see the ETA of the bus for the stop nearest to me! Luckily CityBus NWFB publish their ETA via API, so I wrote &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.lykcora.hk_bus&quot;&gt;Hong Kong Buses&lt;/a&gt; to do just that.&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/0jvhgQfnZQk&quot; title=&quot;YouTube video player&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/8000559805355673384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2020/12/an-app-to-show-bus-eta-to-nearest-stop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/8000559805355673384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/8000559805355673384'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2020/12/an-app-to-show-bus-eta-to-nearest-stop.html' title='An app to show bus ETA to the nearest stop quickly'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/zduncSbLOtY/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-7440823733692468367</id><published>2020-10-17T22:33:00.005+08:00</published><updated>2020-10-17T22:33:40.754+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JVM to .NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="software development"/><title type='text'>What is C# equivalent for: Dependency Injection / Inversion of Control for a developer with Java background</title><content type='html'>&lt;p&gt;I recently joined a company that is a C#/.NET shop. I have been working primarilyc in the JVM ecosystem for backend through most of my professional work, so this is quite a big of change.&lt;/p&gt;&lt;p&gt;The language different is minor, but re-learning the ecosystem is quite another story.&lt;/p&gt;&lt;p&gt;Let us start with Dependency Injection / Inversion of Control Container. There are quite a bit few to choose from:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/autofac/&quot;&gt;Autofac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://ninject.org/&quot;&gt;NInject&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://ninject.org/&quot;&gt;StructureMap&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://ninject.org/&quot;&gt;Native Dependency and IoC provided by .Net&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;From my few conversation with developers coming from the .NET ecosystem, the default answer is always to go with the &quot;official&quot; Microsoft provided solution. So that is what I did.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Perhaps the &lt;a href=&quot;http://ninject.org/&quot;&gt;documentation&lt;/a&gt;&amp;nbsp;is written for people completely new to programming. For those with a Java background and are familiar with the concept of DI and IoC, here is my take of a quick start guide.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Use &lt;span style=&quot;font-family: courier;&quot;&gt;Host&lt;/span&gt; from the &lt;span style=&quot;font-family: courier;&quot;&gt;Microsoft.Extensions.Hosting&lt;/span&gt; namespace and build your &lt;span style=&quot;font-family: courier;&quot;&gt;IHost&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;IHost host = Host.CreativeDefaultBuilder()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;.ConfigureServices(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;_, services ) =&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;services.AddSingleton&amp;lt;MyInterface, MyImplementationClass&amp;gt;()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; .AddSingleton&amp;lt;NextInterface, NextImplementationClass&amp;gt;()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; // ... ...&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For thosse coming from the Spring world, this is approximately equivalent to:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;@Configuration&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;public class MyConfig {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; @Bean&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; public MyInterface myClass() {&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; return new MyImplementationClass();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or Guice if you come from Guice:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Guice.createInjector(new AbstractModule() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; protected void configure() {&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; bind(MyInterface.class).toInstance(new MyImplementationClass());&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Spring Boot take this a step further with its &lt;span style=&quot;font-family: courier;&quot;&gt;@ComponentScan&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;@Component&lt;/span&gt; magic. Does .NET have something similar? I do not know, if you do, please drop me a comment!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/7440823733692468367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2020/10/what-is-c-equivalent-for-dependency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/7440823733692468367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/7440823733692468367'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2020/10/what-is-c-equivalent-for-dependency.html' title='What is C# equivalent for: Dependency Injection / Inversion of Control for a developer with Java background'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-8401579133676341556</id><published>2020-06-09T07:34:00.003+08:00</published><updated>2020-06-09T09:02:42.180+08:00</updated><title type='text'>Typing chinese puntuations</title><content type='html'>&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;倉頡&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;ZXAD--&amp;gt;。&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;ZXAC--&amp;gt;、&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;ZXAB--&amp;gt;，&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;ZXCD--&amp;gt;「&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;ZXCE--&amp;gt;」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;Windows 10&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: rgba(0, 0, 0, 0.95); font-family: roboto, &amp;quot;pingfang tc&amp;quot;, &amp;quot;helvetica neue&amp;quot;, &amp;quot;microsoft jhenghei&amp;quot;, &amp;quot;heiti tc&amp;quot;, simhei, &amp;quot;arial unicode ms&amp;quot;, arial, sans-serif, mingliu_hkscs; font-size: 17.6px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
組合鍵&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;產生符號&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;說明&lt;/div&gt;
&lt;div&gt;
Ctrl + , (逗號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;，&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;逗號&lt;/div&gt;
&lt;div&gt;
Ctrl + . (點)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;。&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;句號&lt;/div&gt;
&lt;div&gt;
Ctrl + ; (分號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;；&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;分號&lt;/div&gt;
&lt;div&gt;
Ctrl + &#39; (單引號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;、&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;頓號&lt;/div&gt;
&lt;div&gt;
Ctrl + / (斜線[右上左下)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;…&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;刪節號&lt;/div&gt;
&lt;div&gt;
Ctrl + - (減號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;—&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;破折號&lt;/div&gt;
&lt;div&gt;
Ctrl + [ (左中括號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;【&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;左粗中括號&lt;/div&gt;
&lt;div&gt;
Ctrl + ] (右中括號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;】&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;右粗中括號&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
組合鍵&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;產生符號&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;說明&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + , (逗號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;《&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;左書名號(書名)&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + . (點)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;》&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;右書名號(書名)&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + ; (分號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;：&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;冒號&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + ‘ (單引號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;＂&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;雙引號&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + [ (左中括號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;｛&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;左大括號&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + ] (右中括號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;｝&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;右大括號&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + 1 (上方數字鍵)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;！&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;驚嘆號&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + / (斜線[右上左下)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;？&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;問號&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + 9 (開引號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;「&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;開引號&lt;/div&gt;
&lt;div&gt;
Ctrl + Shift + 0 (閂引號)&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;」&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;閂引號 &lt;i&gt;「註一」&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;註一：&lt;span style=&quot;font-family: Arial; font-size: 11pt; white-space: pre-wrap;&quot;&gt;要先把 Advance Key Settings - Between input langauges - Change Key Sequence - Switch Keyboard Layout 的 Key sequence 改為 Not Assigned.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;font face=&quot;Arial&quot;&gt;&lt;span style=&quot;font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;(謝謝 mobile 1 的獨覺禪&lt;/span&gt;&lt;/font&gt;&lt;span style=&quot;font-family: Arial; font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;Source: &lt;/span&gt;&lt;a href=&quot;https://www.mobile01.com/topicdetail.php?f=300&amp;amp;t=4837494&quot;&gt;https://www.mobile01.com/topicdetail.php?f=300&amp;amp;t=4837494&lt;/a&gt;)&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/8401579133676341556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2020/06/typing-chinese-puntuations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/8401579133676341556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/8401579133676341556'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2020/06/typing-chinese-puntuations.html' title='Typing chinese puntuations'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-1572776960668781917</id><published>2019-04-27T21:41:00.001+08:00</published><updated>2019-04-27T21:41:16.917+08:00</updated><title type='text'>Face tracking web application</title><content type='html'>Continuing the theme of exploring various technology, it is time to see how far the browser has come.&lt;br /&gt;
&lt;br /&gt;
A web application which tracks user faces through the device video capture source. On mobile phone, user can choose which camera to capture the video from. Since mobile phone have limited computational power, the resolution of the video capture is lower to ensure a smooth experience.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2i_olAKmJwIgm0Df914cbzwV3q_guSN5QRDtYG-7xUFOvFeYS8jw4vF271TwtDQzNxkL27VNEQGhyvj749ppt1WzaP-UJDTvOf3WMyoiUg75HCHmWFgUxogKb1Tc3zhm2rlGkoiKy9ho/s1600/screenshot.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;351&quot; data-original-width=&quot;477&quot; height=&quot;235&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2i_olAKmJwIgm0Df914cbzwV3q_guSN5QRDtYG-7xUFOvFeYS8jw4vF271TwtDQzNxkL27VNEQGhyvj749ppt1WzaP-UJDTvOf3WMyoiUg75HCHmWFgUxogKb1Tc3zhm2rlGkoiKy9ho/s320/screenshot.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Try out the &lt;a href=&quot;https://face.lykcora.com/&quot; target=&quot;_blank&quot;&gt;face tracking web app&lt;/a&gt;. Please note the application is rather large ~ 9 MB, and may require a few minutes to download on a slow connection. You will also need a a modern browser such as Google Chrome. Available for desktop and mobile devices&lt;br /&gt;
&lt;br /&gt;
Don&#39;t worry, all processing are done on the client side, i.e. no video or imagery are send to anyone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/1572776960668781917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2019/04/face-tracking-web-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1572776960668781917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1572776960668781917'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2019/04/face-tracking-web-application.html' title='Face tracking web application'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2i_olAKmJwIgm0Df914cbzwV3q_guSN5QRDtYG-7xUFOvFeYS8jw4vF271TwtDQzNxkL27VNEQGhyvj749ppt1WzaP-UJDTvOf3WMyoiUg75HCHmWFgUxogKb1Tc3zhm2rlGkoiKy9ho/s72-c/screenshot.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-6098979659586515882</id><published>2019-04-26T00:25:00.001+08:00</published><updated>2019-04-26T00:25:57.465+08:00</updated><title type='text'>Trying out flutter 1.0 to build an Android App</title><content type='html'>With the recent 1.0 release of Flutter, it is time to try out yet another technology. This time, it was a pleasant surprise. It was surprisingly easy to build an app and publish it!&lt;br /&gt;
&lt;br /&gt;
And here it is: &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.lykcora.hk_bbq_sites&quot; target=&quot;_blank&quot;&gt;Hong Kong Barbeque Sites in Google Play Store&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
This is a simple app which list out the Barbeque sites from LCSD Hong Kong. In this app, I get to tryout:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Dart + Flutter&lt;/li&gt;
&lt;li&gt;Google Map integration&amp;nbsp;&lt;/li&gt;
&lt;li&gt;I18n with Chinese HK/CN and English.
&lt;/li&gt;
&lt;/ol&gt;
</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/6098979659586515882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2019/04/trying-out-flutter-10-to-build-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/6098979659586515882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/6098979659586515882'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2019/04/trying-out-flutter-10-to-build-android.html' title='Trying out flutter 1.0 to build an Android App'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-598734064823876964</id><published>2019-04-04T22:36:00.005+08:00</published><updated>2020-10-17T22:34:16.762+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Did you know? JDK comes with HttpServer since 1.6</title><content type='html'>Did you know? JDK comes with a &lt;a href=&quot;https://docs.oracle.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html&quot; target=&quot;_blank&quot;&gt;HttpServer &lt;/a&gt;since 1.6&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/lsiu/979645f54d4af85b446a4a01cd2c32eb.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
And it is not a secret, do not use API under sun.*. It is under com.sun.*. Just tried it out and still works on JDK 11.
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/598734064823876964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2019/04/did-you-know.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/598734064823876964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/598734064823876964'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2019/04/did-you-know.html' title='Did you know? JDK comes with HttpServer since 1.6'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-5918459291915863497</id><published>2017-08-10T22:53:00.006+08:00</published><updated>2020-10-17T22:34:37.620+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Intellij SLF4J live template - psfl</title><content type='html'>In &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Settings &amp;gt; Editor &amp;gt; Live Templates&lt;/span&gt;&lt;br /&gt;
Under &quot;others&quot; section&lt;br /&gt;
&lt;br /&gt;
Add the following with abbreviation: psfl and description: Insert slf4j logger&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: white; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9pt;&quot;&gt;&lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;private static final &lt;/span&gt;org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger($CLASS_NAME$.&lt;span style=&quot;color: navy; font-weight: bold;&quot;&gt;class&lt;/span&gt;);&lt;/pre&gt;
&lt;br /&gt;
And &quot;Edit Variable&quot; where &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;CLASS_NAME = className()&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/5918459291915863497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2017/08/intellij-slf4j-live-template-psfl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/5918459291915863497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/5918459291915863497'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2017/08/intellij-slf4j-live-template-psfl.html' title='Intellij SLF4J live template - psfl'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-7948106434989391873</id><published>2015-05-31T00:13:00.003+08:00</published><updated>2015-05-31T00:22:11.322+08:00</updated><title type='text'>Bitcoin Faucet - And I actually got paid by one of them</title><content type='html'>In the past weekend, there was a Bitcoin-themed hackathon in Hong Kong. Although I didn&#39;t participate, it did bring my attention to bitcoin again and I did a little bit of research about it.&lt;br /&gt;
&lt;br /&gt;
While I was doing my research, I learn about these little sites called &quot;Bitcoin faucet&quot;. For those of us old enough to know about those get-paid-to-surf-the-net-schemes back in the 90s (e.g. AllAdvantage, are the still around?), are they back?&lt;br /&gt;
&lt;br /&gt;
At first I was skeptical, but I figure I will give them a try. Of the 7-ish Bitcoin faucets I tried over the week, one of them actually did payout. The faucet that paid out is&amp;nbsp;&lt;a href=&quot;http://freebitco.in/?r=1376460&quot;&gt;http://freebitco.in/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://freebitco.in/?r=1376460&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;215&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwqNP_5w_vW_plvoL74lflGt7XuKB3G3h2JcuXhvG1jZK0CTrKfUt5WDuqDkeiUppnfT6nnjiGKp3OMbJUiLT04FWNisN2Tn5xJwWankzYjIchLLXQ6sBvT-1bbcJfHVADv_pxQ3fG0Os/s400/2015-05-30+23_57_29-46m_28s+-+FreeBitco.in+-+Win+free+bitcoins+every+hour%2521.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
And here is a screenshot of the transaction receiving the bitcoin!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikCg8eAxsKaPlWO0Z5jg5pboEuJJi8r9I1odHZ6_-UHuiYtSI774WiPjoEtFdxAiy-ocRZdfoIfEygO4QSnPkBGfptjAZ0TQbLwC96VC7bYncgxTvG-Uexh1T_UJStfOr9jI6jxNKz1t8/s1600/2015-05-31+00_02_11-Clipboard.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikCg8eAxsKaPlWO0Z5jg5pboEuJJi8r9I1odHZ6_-UHuiYtSI774WiPjoEtFdxAiy-ocRZdfoIfEygO4QSnPkBGfptjAZ0TQbLwC96VC7bYncgxTvG-Uexh1T_UJStfOr9jI6jxNKz1t8/s400/2015-05-31+00_02_11-Clipboard.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
That&#39;s right. A Grand Total of $0.14 USD. Is it worth the time? Probably not. But at the end of the day, what intrigues me is the ability to enable micro-transactions. After all, paying out $0.14 USD by any other means, the transaction cost is probably more than the actual amount transferred.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Like it or not, Bitcoin or some other crypto-currency technologies like this will open a whole new world for us.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
P.S. Wanna try out the bitcoin faucet? &lt;a href=&quot;http://freebitco.in/?r=1376460&quot; target=&quot;_blank&quot;&gt;Here is the link to it again&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/7948106434989391873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2015/05/bitcoin-faucet-and-i-actually-got-paid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/7948106434989391873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/7948106434989391873'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2015/05/bitcoin-faucet-and-i-actually-got-paid.html' title='Bitcoin Faucet - And I actually got paid by one of them'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwqNP_5w_vW_plvoL74lflGt7XuKB3G3h2JcuXhvG1jZK0CTrKfUt5WDuqDkeiUppnfT6nnjiGKp3OMbJUiLT04FWNisN2Tn5xJwWankzYjIchLLXQ6sBvT-1bbcJfHVADv_pxQ3fG0Os/s72-c/2015-05-30+23_57_29-46m_28s+-+FreeBitco.in+-+Win+free+bitcoins+every+hour%2521.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-6812979231193725268</id><published>2015-03-28T21:11:00.002+08:00</published><updated>2020-10-17T22:34:56.239+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Javascript oddities #1</title><content type='html'>&lt;pre&gt;var func = function() {}
console.log(func.prototype.constructor == func); // return true
&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/6812979231193725268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2015/03/javascript-oddities-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/6812979231193725268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/6812979231193725268'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2015/03/javascript-oddities-1.html' title='Javascript oddities #1'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-8260121628274417595</id><published>2015-03-12T23:43:00.004+08:00</published><updated>2020-10-17T22:35:03.235+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>JHipster: A code generator with a truck load of tech for AngularJS and Spring Boot based projects</title><content type='html'>I recently came across a &lt;a href=&quot;http://jhipster.github.io/&quot; target=&quot;_blank&quot;&gt;JHipster&lt;/a&gt; - a Yeoman-based generator, which generates a based project which includes a truck load of technologies (taken directly from &lt;a href=&quot;http://jhipster.github.io/tech_stack.html&quot; target=&quot;_blank&quot;&gt;JHipster&#39;s Technology Stack page&lt;/a&gt;):&lt;br /&gt;
&lt;h3&gt;
Technology stack on the client side&lt;/h3&gt;
Single Web page application:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Responsive Web Design&lt;/li&gt;
&lt;li&gt;HTML5 Boilerplate&lt;/li&gt;
&lt;li&gt;Twitter Bootstrap&lt;/li&gt;
&lt;li&gt;AngularJS&lt;/li&gt;
&lt;li&gt;Full internationalization support with Angular Translate&lt;/li&gt;
&lt;li&gt;Optional Compass / Sass support for CSS design&lt;/li&gt;
&lt;li&gt;Optional WebSocket support with Spring Websocket&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
With the great Yeoman development workflow:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Easy installation of new JavaScript libraries with Bower&lt;/li&gt;
&lt;li&gt;Build, optimization and live reload with Grunt or Gulp.js&lt;/li&gt;
&lt;li&gt;Testing with Karma and PhantomJS&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
And what if a single Web page application isn&#39;t enough for your needs?&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Support for the Thymeleaf template engine, to generate Web pages on the server side&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;
Technology stack on the server side&lt;/h3&gt;
A complete Spring application:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Spring Boot for easy application configuration&lt;/li&gt;
&lt;li&gt;Maven or Gradle configuration for building, testing and running the application&lt;/li&gt;
&lt;li&gt;&quot;development&quot; and &quot;production&quot; profiles (both for Maven and Gradle)&lt;/li&gt;
&lt;li&gt;Spring Security&lt;/li&gt;
&lt;li&gt;Spring MVC REST + Jackson&lt;/li&gt;
&lt;li&gt;Optional WebSocket support with Spring Websocket&lt;/li&gt;
&lt;li&gt;Spring Data JPA + Bean Validation&lt;/li&gt;
&lt;li&gt;Database updates with Liquibase&lt;/li&gt;
&lt;li&gt;MongoDB support if you&#39;d rather use a document-oriented NoSQL database instead of JPA&lt;/li&gt;
&lt;li&gt;Cassandra support if you&#39;d rather use a column-oriented NoSQL database instead of JPA&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Ready to go into production:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Monitoring with Metrics&lt;/li&gt;
&lt;li&gt;Caching with ehcache (local cache) or hazelcast (distributed cache)&lt;/li&gt;
&lt;li&gt;Optional HTTP session clustering with hazelcast&lt;/li&gt;
&lt;li&gt;Optimized static resources (gzip filter, HTTP cache headers)&lt;/li&gt;
&lt;li&gt;Log management with Logback, configurable at runtime&lt;/li&gt;
&lt;li&gt;Connection pooling with HikariCP for optimum performance&lt;/li&gt;
&lt;li&gt;Builds a standard WAR file or an executable JAR file&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Although I did not use it for any of my projects (yet), it is a great reference to see how to setup a project which truly separate the front and back development. What I meant by that is the project is setup where the front-end can be served via &#39;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;grunt serve&lt;/span&gt;&#39;, i.e. NodeJS, decoupled from the back-end Spring Boot server. Yet, we all these goodies, you can still easily call &#39;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;mvn package&lt;/span&gt;&#39; to build a complete Spring Boot powered executable JAR.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It is a great project to get a glimpse of all these technologies and how they can integrate together. More importantly, it set up a viable project which separates but integrated workflow for front-end and back-end. After working with it for a bit, I do have some reservations and comments, but that for another post.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Have you used JHipster in your projects? In a production setting? If so, I love to hear your comments.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/8260121628274417595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2015/03/jhipster-code-generator-with-truck-load.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/8260121628274417595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/8260121628274417595'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2015/03/jhipster-code-generator-with-truck-load.html' title='JHipster: A code generator with a truck load of tech for AngularJS and Spring Boot based projects'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-1580433758947578702</id><published>2014-12-17T20:30:00.001+08:00</published><updated>2020-10-17T22:35:09.518+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>SLF4J Template for Eclipse</title><content type='html'>In &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;Preference &amp;gt; Java &amp;gt; Editor &amp;gt; Templates&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Insert the following template:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;${l:import(org.slf4j.Logger)}
${f:import(org.slf4j.LoggerFactory)}
private static final Logger LOG = LoggerFactory.getLogger(${enclosing_type}.class);
&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/1580433758947578702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2014/12/slf4j-template-for-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1580433758947578702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1580433758947578702'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2014/12/slf4j-template-for-eclipse.html' title='SLF4J Template for Eclipse'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-1927818228572817578</id><published>2014-12-15T17:30:00.005+08:00</published><updated>2014-12-15T17:30:54.795+08:00</updated><title type='text'>SOAPUI 5.0.0 hangs after upgrading OS X to Yosemite</title><content type='html'>After upgrading to the company&#39;s Mac OS X to Yosemite, SOAPUI 5.0.0 refuse to load properly. It will start, and the UI will come up, but it just hang with the spinning wheel right away.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I was able to resolve this issue by &lt;b&gt;uncommenting&lt;/b&gt; the line #53 in &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$SOAP_HOME/bin/soapui.sh&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;







&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;# &amp;nbsp; JAVA_OPTS=&quot;$JAVA_OPTS -Dsoapui.browser.disabled=true&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;I hope this help someone else out there who has the same problem, and also for myself to reference again if face with the same problem in the future.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/1927818228572817578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2014/12/soapui-500-hangs-after-upgrading-os-x.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1927818228572817578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/1927818228572817578'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2014/12/soapui-500-hangs-after-upgrading-os-x.html' title='SOAPUI 5.0.0 hangs after upgrading OS X to Yosemite'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5603417613712574860.post-966756184505094022</id><published>2014-04-06T21:33:00.000+08:00</published><updated>2014-12-15T17:33:16.560+08:00</updated><title type='text'>Getting edx devstack to run on Windows</title><content type='html'>1) Fix issue&amp;nbsp;https://github.com/edx/edx-platform/issues/3230&lt;br /&gt;
&lt;br /&gt;
2) Change Vagrant ansible-play command to&lt;br /&gt;
&lt;br /&gt;
ansible-playbook -i localhost, -c local vagrant-devstack.yml --tags=deploy -e configuration_version=master -e edx_ansible_source_repo=https://github.com/lsiu/configuration.git -e edx_platform_repo=https://github.com/lsiu/edx-platform.git -e edx_platform_version=master -vvv&lt;br /&gt;
&lt;br /&gt;
3) Fix symbolic link issue&lt;br /&gt;
See:&amp;nbsp;https://github.com/edx/configuration/wiki/Vagrant-troubleshooting#dealing-with-line-endings-and-symlinks-under-windows&lt;br /&gt;
&lt;pre style=&quot;background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;&quot;&gt;&lt;code style=&quot;background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, &#39;Liberation Mono&#39;, Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;&quot;&gt; # You need to run this from cygwin, not the Windows command-line (see above)
 git rm --cached -r . &amp;amp;&amp;amp; git reset --hard
 git config --global alias.add-symlink &#39;!__git_add_symlink(){ dst=$(echo &quot;$2&quot;)/../$(echo &quot;$1&quot;); if [ -e &quot;$dst&quot; ]; then hash=$(echo &quot;$1&quot; | git hash-object -w --stdin); git update-index --add --cacheinfo 120000 &quot;$hash&quot; &quot;$2&quot;; git checkout -- &quot;$2&quot;; else echo &quot;ERROR: Target $dst does not exist!&quot;; echo &quot;       Not creating invalid symlink.&quot;; fi; }; __git_add_symlink &quot;$1&quot; &quot;$2&quot;&#39;
 git config --global alias.rm-symlink &#39;!__git_rm_symlink(){ git checkout -- &quot;$1&quot;; link=$(echo &quot;$1&quot;); POS=$&#39;\&#39;&#39;/&#39;\&#39;&#39;; DOS=$&#39;\&#39;&#39;\\\\&#39;\&#39;&#39;; doslink=${link//$POS/$DOS}; dest=$(dirname &quot;$link&quot;)/$(cat &quot;$link&quot;); dosdest=${dest//$POS/$DOS}; if [ -f &quot;$dest&quot; ]; then rm -f &quot;$link&quot;; cmd //C mklink //H &quot;$doslink&quot; &quot;$dosdest&quot;; elif [ -d &quot;$dest&quot; ]; then rm -f &quot;$link&quot;; cmd //C mklink //J &quot;$doslink&quot; &quot;$dosdest&quot;; else echo &quot;ERROR: Something went wrong when processing $1 . . .&quot;; echo &quot;       $dest may not actually exist as a valid target.&quot;; fi; }; __git_rm_symlink &quot;$1&quot;&#39;
 git config --global alias.rm-symlinks &#39;!__git_rm_symlinks(){ for symlink in `git ls-files -s | grep -E &quot;^120000&quot; | cut -f2`; do git rm-symlink &quot;$symlink&quot;; git update-index --assume-unchanged &quot;$symlink&quot;; done; }; __git_rm_symlinks&#39;
 git config --global alias.checkout-symlinks &#39;!__git_checkout_symlinks(){ POS=$&#39;\&#39;&#39;/&#39;\&#39;&#39;; DOS=$&#39;\&#39;&#39;\\\\&#39;\&#39;&#39;; for symlink in `git ls-files -s | grep -E &quot;^120000&quot; | cut -f2`; do git update-index --no-assume-unchanged &quot;$symlink&quot;; if [ -d &quot;$symlink&quot; ]; then dossymlink=${symlink//$POS/$DOS}; cmd //C rmdir //S //Q &quot;$dossymlink&quot;; fi; git  checkout -- &quot;$symlink&quot;; echo &quot;Restored git symlink $symlink &amp;lt;&amp;lt;===&amp;gt;&amp;gt; `cat $symlink`&quot;; done; }; __git_checkout_symlinks&#39;
 git rm-symlinks&lt;/code&gt;&lt;/pre&gt;
4) Before running `vagrant provision`, comment out the checkout and clean resets (if left in playbook, it will resets the above fix)&lt;br /&gt;
&lt;br /&gt;
/edx/app/edx_ansible/edx_ansiblplaybooks/roles/edx_ansible/tasks/deploy.yml&lt;br /&gt;
/edx/app/edx_ansible/edx_ansiblplaybooks/roles/edxapp/tasks/deploy.yml&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://selfprofessednerd.blogspot.com/feeds/966756184505094022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://selfprofessednerd.blogspot.com/2014/04/getting-edx-devstack-to-run-on-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/966756184505094022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5603417613712574860/posts/default/966756184505094022'/><link rel='alternate' type='text/html' href='http://selfprofessednerd.blogspot.com/2014/04/getting-edx-devstack-to-run-on-windows.html' title='Getting edx devstack to run on Windows'/><author><name>Me</name><uri>http://www.blogger.com/profile/18190250432819491114</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>