<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Archives on Time Friend</title><link>https://time-friend.com/en/archive/</link><description>Recent content in Archives on Time Friend</description><generator>Hugo</generator><language>en-GB</language><lastBuildDate>Wed, 29 Jul 2026 15:15:07 +0800</lastBuildDate><atom:link href="https://time-friend.com/en/archive/index.xml" rel="self" type="application/rss+xml"/><item><title>Audit Your Coding Habits with /insights</title><link>https://time-friend.com/en/archive/claude-code-insights/</link><pubDate>Mon, 27 Jul 2026 16:30:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-insights/</guid><description>&lt;p&gt;When you&amp;rsquo;re busy writing, you rarely stop to look at how you actually use your tools.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d been using Claude Code for a while, feeling pretty good about it. Then a friend said: &amp;ldquo;Try &lt;code&gt;/insights&lt;/code&gt;.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Start &lt;code&gt;claude&lt;/code&gt;, hop into a session, and type:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/insights
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wait a few dozen seconds, and an HTML report pops up in your browser. It analyzes your last 30 days of Claude Code sessions and breaks them down: which projects you spent time on, which tools you used most, language distribution, and — the punchline — where your workflow is wasting tokens.&lt;/p&gt;</description></item><item><title>From Terminal to Team: When Agent Workflows Outgrow One Laptop</title><link>https://time-friend.com/en/archive/claude-code-scaling-workflows/</link><pubDate>Sat, 18 Apr 2026 17:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-scaling-workflows/</guid><description>&lt;p&gt;For the first few months, I used Claude Code alone in my terminal. Big productivity boost. But I hit a wall: when I closed my laptop, the agent stopped. Anything I needed had to happen while I was sitting in front of the keyboard.&lt;/p&gt;
&lt;p&gt;If your usage is &amp;ldquo;only when I&amp;rsquo;m around&amp;rdquo;, Claude Code is plenty. But once you start thinking — can this code review run automatically? can this dependency update run every Monday? — you need it to work when you&amp;rsquo;re not there.&lt;/p&gt;</description></item><item><title>Reviewing Agent Code Is Different from Reviewing Human Code</title><link>https://time-friend.com/en/archive/claude-code-review-agent-code/</link><pubDate>Fri, 03 Apr 2026 13:25:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-review-agent-code/</guid><description>&lt;p&gt;Reviewing code written by a colleague is different from reviewing code written by an agent.&lt;/p&gt;
&lt;p&gt;Work with someone long enough and you pick up their habits — one person loves reduce, another always misses edge cases. An agent has no habits. Every output depends on the session context.&lt;/p&gt;
&lt;p&gt;Here are the checkpoints I&amp;rsquo;ve built for reviewing agent code.&lt;/p&gt;
&lt;h2 id="first-did-it-touch-things-it-shouldnt-have"&gt;First: did it touch things it shouldn&amp;rsquo;t have?&lt;/h2&gt;
&lt;p&gt;The agent&amp;rsquo;s biggest problem isn&amp;rsquo;t writing wrong code — it&amp;rsquo;s not controlling itself. It might fix one bug and casually modify a config file next to it, or rename a function that had nothing to do with the task.&lt;/p&gt;</description></item><item><title>Five Tasks You Shouldn't Give Your Agent</title><link>https://time-friend.com/en/archive/claude-code-tasks-to-avoid/</link><pubDate>Sun, 22 Mar 2026 08:50:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-tasks-to-avoid/</guid><description>&lt;p&gt;After a few months with agents, it&amp;rsquo;s easy to fall into the trap of throwing everything at it.&lt;/p&gt;
&lt;p&gt;But some tasks really shouldn&amp;rsquo;t be delegated — not because the agent isn&amp;rsquo;t capable, but because the risk/reward ratio is wrong.&lt;/p&gt;
&lt;h2 id="one-anything-touching-production-data"&gt;One: anything touching production data&lt;/h2&gt;
&lt;p&gt;Running SQL against a production database — even &lt;code&gt;SELECT&lt;/code&gt; — I won&amp;rsquo;t trust an agent with. Claude won&amp;rsquo;t intentionally break things, but it might scan a full table because it misunderstood the query.&lt;/p&gt;</description></item><item><title>Agent and Assistant Are Not the Same Thing</title><link>https://time-friend.com/en/archive/claude-code-agent-vs-assistant/</link><pubDate>Sat, 14 Mar 2026 15:40:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-agent-vs-assistant/</guid><description>&lt;p&gt;When I first started using Claude Code, I spent a lot of time wondering: is this thing an agent or an assistant?&lt;/p&gt;
&lt;p&gt;Most articles try to draw a clean line — assistant does one step at a time, agent pursues a goal autonomously. But after using it daily, the line is blurry. Most tools can switch between both modes.&lt;/p&gt;
&lt;p&gt;The distinction that actually matters isn&amp;rsquo;t what you call it. It&amp;rsquo;s &lt;strong&gt;who initiates, who controls, and where it runs&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Claude Gets Dumber After 50 Rounds</title><link>https://time-friend.com/en/archive/claude-code-advanced-practices/</link><pubDate>Fri, 06 Mar 2026 11:10:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-advanced-practices/</guid><description>&lt;p&gt;After a few months with Claude Code, you&amp;rsquo;ll hit this: the same session, 50 rounds in, and Claude feels dumb.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not your imagination, and it&amp;rsquo;s not the model. The context is blown.&lt;/p&gt;
&lt;h2 id="how-context-explodes"&gt;How context explodes&lt;/h2&gt;
&lt;p&gt;Claude&amp;rsquo;s working memory is finite. Early in a session, it remembers the goal, the decisions made, and what&amp;rsquo;s left to do. By round 50, the context is packed with dead ends, discarded approaches, and arguments about implementation.&lt;/p&gt;</description></item><item><title>What I Put in My CLAUDE.md</title><link>https://time-friend.com/en/archive/claude-code-configuration/</link><pubDate>Thu, 19 Feb 2026 16:20:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-configuration/</guid><description>&lt;p&gt;The most ironic thing? Complaining &amp;ldquo;I have to re-explain the project to Claude every session&amp;rdquo; while your project root doesn&amp;rsquo;t have a &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t laugh. I was in that exact spot.&lt;/p&gt;
&lt;p&gt;Turns out there&amp;rsquo;s a shortcut — run &lt;code&gt;/init&lt;/code&gt;. Claude analyzes your project structure, detects build tools and test frameworks, and generates a starting CLAUDE.md. If you already have one, &lt;code&gt;/init&lt;/code&gt; suggests improvements instead of overwriting it.&lt;/p&gt;
&lt;h2 id="what-claudemd-is-for"&gt;What CLAUDE.md is for&lt;/h2&gt;
&lt;p&gt;Claude Code reads this file at startup and uses it as the starting point for understanding your project. How to run tests, how the directory is organized, what conventions to follow — put it there, and it just knows.&lt;/p&gt;</description></item><item><title>Would You Merge Code an Agent Wrote Alone</title><link>https://time-friend.com/en/archive/claude-code-self-verification/</link><pubDate>Thu, 05 Feb 2026 09:45:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-self-verification/</guid><description>&lt;p&gt;Claude finishes editing and says &amp;ldquo;Done.&amp;rdquo; You glance at it, looks fine, merge it. Then Monday comes and production is down.&lt;/p&gt;
&lt;p&gt;Without a runnable check, the agent&amp;rsquo;s &amp;ldquo;done&amp;rdquo; and your &amp;ldquo;done&amp;rdquo; are two different things. The most expensive bugs aren&amp;rsquo;t crashes — they&amp;rsquo;re silent wrong answers.&lt;/p&gt;
&lt;h2 id="the-simplest-check-one-line-in-your-prompt"&gt;The simplest check: one line in your prompt&lt;/h2&gt;
&lt;p&gt;Add this at the end of your prompt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Run the tests after you finish. Keep fixing until they all pass.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Claude will run &lt;code&gt;npm test&lt;/code&gt; on its own, check output, fix what&amp;rsquo;s broken, and rerun. No input needed from you.&lt;/p&gt;</description></item><item><title>Writing Prompts That Land on the First Try</title><link>https://time-friend.com/en/archive/claude-code-effective-prompts/</link><pubDate>Thu, 22 Jan 2026 14:15:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-effective-prompts/</guid><description>&lt;p&gt;After using Claude Code for a while, you&amp;rsquo;ll notice most failed sessions trace back to your prompt, not the model. Claude can infer intent, but you can&amp;rsquo;t expect it to read your mind.&lt;/p&gt;
&lt;h2 id="lock-down-the-scope"&gt;Lock down the scope&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Optimize this code&amp;rdquo; — what comes out is a lottery. Optimize for what? Performance? Readability? Removing dead code?&lt;/p&gt;
&lt;p&gt;A good prompt names the file, the scenario, and how to verify:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Write an edge-case test for logged-out users in src/auth.ts. No mocks.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The tighter the scope, the more predictable the output. Vague prompts only make sense when you actually want the agent&amp;rsquo;s opinion — &amp;ldquo;what would you improve in this file&amp;rdquo; is fine, but keep it scoped so it doesn&amp;rsquo;t wander into hundreds of files.&lt;/p&gt;</description></item><item><title>Keeping Your Agent on Track with Plan → Code</title><link>https://time-friend.com/en/archive/claude-code-plan-code-loop/</link><pubDate>Thu, 08 Jan 2026 10:30:00 +0000</pubDate><guid>https://time-friend.com/en/archive/claude-code-plan-code-loop/</guid><description>&lt;p&gt;When I first started using Claude Code, I had a bad habit: open the terminal, type one sentence telling it what to change, watch it go, and realize later it went in the wrong direction.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I learned — agentic coding is a different skill from writing code. When you write code yourself, your hands follow your brain. When you use an agent, your value shifts to defining the goal and reviewing the result. Not typing faster.&lt;/p&gt;</description></item><item><title>Adding an Animated Logo to My Blog</title><link>https://time-friend.com/en/archive/blog-architecture-animated-logo/</link><pubDate>Thu, 14 Aug 2025 17:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-animated-logo/</guid><description>&lt;p&gt;That small square in the top-left corner of the site? It&amp;rsquo;s a video.&lt;/p&gt;
&lt;p&gt;Grayscale by default. Lights up on hover — different color every time, and the playback speed surges then eases back down. Like it just woke up.&lt;/p&gt;
&lt;h1 id="why"&gt;Why&lt;/h1&gt;
&lt;p&gt;The old logo was a static PNG. It felt lifeless. I had a short video clip lying around, so I swapped the static image for a video.&lt;/p&gt;
&lt;h1 id="mp4-has-no-alpha-channel"&gt;mp4 Has No Alpha Channel&lt;/h1&gt;
&lt;p&gt;CapCut removed the background on export, but mp4 doesn&amp;rsquo;t support transparency — it gets baked to black.&lt;/p&gt;</description></item><item><title>How I Built the Homepage Typing Effect</title><link>https://time-friend.com/en/archive/blog-architecture-typing-effect/</link><pubDate>Tue, 12 Aug 2025 11:50:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-typing-effect/</guid><description>&lt;p&gt;When you open the homepage, you see text being typed out character by character. Not complicated, but many people ask how it&amp;rsquo;s done.&lt;/p&gt;
&lt;p&gt;This article explains the implementation.&lt;/p&gt;
&lt;h1 id="how-it-works"&gt;How It Works&lt;/h1&gt;
&lt;p&gt;When the homepage loads, it picks a random quote from a JSON file, and uses Typed.js to simulate typing.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Homepage loads
 ↓
main.js detects it&amp;#39;s the homepage
 ↓
Determine language (Chinese/English)
 ↓
Pick a random entry from /data/quotes.json
 ↓
Pass to Typed.js, start typing animation
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="data-source-quotesjson"&gt;Data Source: quotes.json&lt;/h1&gt;
&lt;p&gt;Quotes are stored in &lt;code&gt;static/data/quotes.json&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Making My Blog Work Offline with PWA</title><link>https://time-friend.com/en/archive/blog-architecture-service-worker/</link><pubDate>Tue, 08 Jul 2025 15:30:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-service-worker/</guid><description>&lt;p&gt;PWA is a buzzword. For this blog, PWA means two things: manifest.json and Service Worker. manifest.json tells the browser &amp;ldquo;this is an app&amp;rdquo;, Service Worker makes it work offline.&lt;/p&gt;
&lt;p&gt;This article focuses on Service Worker since it&amp;rsquo;s the complex part. manifest.json is straightforward, covered at the end.&lt;/p&gt;
&lt;h1 id="what-is-service-worker"&gt;What is Service Worker&lt;/h1&gt;
&lt;p&gt;A Service Worker is a script that runs in the background of your browser. It&amp;rsquo;s independent of the web page, working silently behind the scenes.&lt;/p&gt;</description></item><item><title>Setting Up Page Analytics for My Blog</title><link>https://time-friend.com/en/archive/blog-architecture-analytics/</link><pubDate>Sun, 15 Jun 2025 13:20:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-analytics/</guid><description>&lt;p&gt;Writing a blog without knowing if anyone&amp;rsquo;s reading feels empty. Analytics isn&amp;rsquo;t for KPIs, just for fun.&lt;/p&gt;
&lt;p&gt;This blog has two analytics systems, each with its own purpose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Busuanzi&lt;/strong&gt; shows on article pages, readers can see how many times each article has been viewed. Open source, no registration needed, just include a script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google Analytics&lt;/strong&gt; runs in the background, only I can see it. Used for traffic sources, user distribution, popular content, etc.&lt;/p&gt;</description></item><item><title>Adding a Comment System to My Blog</title><link>https://time-friend.com/en/archive/blog-architecture-giscus/</link><pubDate>Tue, 06 May 2025 10:30:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-giscus/</guid><description>&lt;p&gt;A blog needs comments. But I didn&amp;rsquo;t want to set up a database and moderation system just for that. Giscus is the compromise.&lt;/p&gt;
&lt;p&gt;This blog uses Giscus for comments. It&amp;rsquo;s based on GitHub Discussions. All comments live in the GitHub repo, no database needed, no third-party service.&lt;/p&gt;
&lt;h1 id="full-flow"&gt;Full Flow&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;User opens article page
 ↓
Loads giscus.app/client.js
 ↓
Giscus script reads data- attributes
 ↓
Uses mapping=&amp;#34;pathname&amp;#34; to get current URL path
 ↓
Queries GitHub Discussions API for matching Discussion
 ↓
Found → renders comment box and existing comments
Not found → shows &amp;#34;leave a comment&amp;#34; input
 ↓
User writes comment → clicks submit
 ↓
Redirects to GitHub OAuth (first time only)
 ↓
Comment written to repo&amp;#39;s Discussions via API
 ↓
Giscus WebSocket listens for changes → real-time updates
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;User never leaves the page. Entire flow is seamless.&lt;/p&gt;</description></item><item><title>Deploying This Blog: From Push to Live</title><link>https://time-friend.com/en/archive/blog-architecture-deployment/</link><pubDate>Thu, 10 Apr 2025 15:44:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-deployment/</guid><description>&lt;p&gt;Static files need a place to live, accessible from anywhere in the world.&lt;/p&gt;
&lt;h1 id="platform-cloudflare-pages"&gt;Platform: Cloudflare Pages&lt;/h1&gt;
&lt;p&gt;Cloudflare Pages over other platforms, three reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Global CDN&lt;/strong&gt;: edge nodes worldwide, visitors load from nearest location&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero-config HTTPS&lt;/strong&gt;: automatic SSL certificate issuance and renewal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Free tier&lt;/strong&gt;: enough bandwidth and build minutes for a personal blog&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Setup is simple: create a project in Cloudflare Pages dashboard, link your GitHub repo. Build commands and output directory are controlled in GitHub Actions, no need to configure in the dashboard.&lt;/p&gt;</description></item><item><title>What I Did for Google SEO on This Blog</title><link>https://time-friend.com/en/archive/blog-architecture-google-seo/</link><pubDate>Tue, 25 Mar 2025 11:08:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-google-seo/</guid><description>&lt;p&gt;This article only covers Google SEO. No other search engines. Reason: Google has the traffic share, doing Google well is enough.&lt;/p&gt;
&lt;h1 id="structured-data"&gt;Structured Data&lt;/h1&gt;
&lt;p&gt;The most important part. Structured data lets Google show rich results in search — publish date, author, summary.&lt;/p&gt;
&lt;p&gt;Every article gets JSON-LD injected at build time:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{ if .IsPage }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Article&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;headline&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;{{ .Title }}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;datePublished&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;{{ .Date.Format &amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2006&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;02&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;T15&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;04&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;05&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Z07&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;00&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; }}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;dateModified&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;{{ .Lastmod.Format &amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2006&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;02&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;T15&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;04&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;05&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Z07&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;00&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; }}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;{{ .Site.Params.author }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;{{ if .Description }}{{ .Description }}{{ else }}{{ .Summary | plainify }}{{ end }}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;Params&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ,&lt;span style="color:#e6db74"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;{{ delimit . &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34; }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ &lt;span style="color:#a6e22e"&gt;end&lt;/span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One thing to note: dates in JSON-LD must be ISO 8601 format (&lt;code&gt;2025-03-17T10:43:00+08:00&lt;/code&gt;). If you only provide date without timezone, Google might not parse it correctly. Hugo&amp;rsquo;s &lt;code&gt;.Date.Format&lt;/code&gt; outputs timezone by default, but if frontmatter doesn&amp;rsquo;t have timezone info, it assumes UTC — might not match your actual publish time.&lt;/p&gt;</description></item><item><title>How the Blog Build Pipeline Works</title><link>https://time-friend.com/en/archive/blog-architecture-build-pipeline-pwa/</link><pubDate>Wed, 05 Mar 2025 16:30:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-build-pipeline-pwa/</guid><description>&lt;p&gt;After writing articles, you don&amp;rsquo;t want to deploy them manually every time. The goal of automation is simple: push code and forget about it.&lt;/p&gt;
&lt;p&gt;Two things: turn Markdown into static files and put them on the internet. Plus, automate the whole build process.&lt;/p&gt;
&lt;h1 id="gulp-tasks"&gt;Gulp Tasks&lt;/h1&gt;
&lt;p&gt;Two Gulp tasks running in series:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;gulp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;task&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;gulp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;series&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;build&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;generate-service-worker&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="build"&gt;build&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;gulp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;task&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;build&amp;#39;&lt;/span&gt;, () =&amp;gt; &lt;span style="color:#a6e22e"&gt;gulp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;./&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;pipe&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;shell&lt;/span&gt;([&lt;span style="color:#e6db74"&gt;&amp;#39;hugo --buildFuture --minify&amp;#39;&lt;/span&gt;])));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One line. Runs Hugo build, &lt;code&gt;--buildFuture&lt;/code&gt; allows future-dated content, &lt;code&gt;--minify&lt;/code&gt; handles HTML/CSS/JS compression at build time.&lt;/p&gt;</description></item><item><title>Customizing My Blog Theme</title><link>https://time-friend.com/en/archive/blog-architecture-theme-customization/</link><pubDate>Sat, 15 Feb 2025 09:15:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-theme-customization/</guid><description>&lt;p&gt;The theme is &lt;code&gt;hugo-cactus-dark&lt;/code&gt;, a dark theme, clean and simple. Good enough for a blog.&lt;/p&gt;
&lt;p&gt;But the original theme only had basic features. I needed bilingual switching, Giscus comments, page analytics, structured data — none of these were included. So I forked it and overrode the templates I needed in &lt;code&gt;layouts/&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="what-was-overridden"&gt;What Was Overridden&lt;/h1&gt;
&lt;p&gt;Templates in &lt;code&gt;layouts/&lt;/code&gt; have higher priority than the same files in the theme. I only overrode what I needed to change.&lt;/p&gt;</description></item><item><title>Going Multilingual: i18n for My Blog</title><link>https://time-friend.com/en/archive/blog-architecture-i18n/</link><pubDate>Mon, 20 Jan 2025 14:21:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-i18n/</guid><description>&lt;p&gt;Writing a tech blog has an awkward problem: Chinese content serves domestic readers, but there&amp;rsquo;s also considerable overseas traffic. So I went with both languages.&lt;/p&gt;
&lt;p&gt;This blog is bilingual, Chinese and English. The same article has both versions, each with its own URL, independent of each other.&lt;/p&gt;
&lt;p&gt;i18n has two parts: &lt;strong&gt;content&lt;/strong&gt; internationalization (articles in both languages) and &lt;strong&gt;UI&lt;/strong&gt; internationalization (buttons, menus, text switches with language).&lt;/p&gt;
&lt;h1 id="content-internationalization"&gt;Content Internationalization&lt;/h1&gt;
&lt;h2 id="directory-structure"&gt;Directory Structure&lt;/h2&gt;
&lt;p&gt;Using Hugo&amp;rsquo;s &lt;code&gt;module.mounts&lt;/code&gt; for language mapping:&lt;/p&gt;</description></item><item><title>What My Blog Architecture Looks Like</title><link>https://time-friend.com/en/archive/blog-architecture-overview/</link><pubDate>Fri, 10 Jan 2025 10:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/blog-architecture-overview/</guid><description>&lt;p&gt;Many people are curious about how this blog is built.&lt;/p&gt;
&lt;p&gt;Looks simple, but there&amp;rsquo;s a lot behind it. Not a big project, but from an engineering perspective, I did quite a few things. Bilingual architecture, automated build pipeline, PWA, Google SEO, and so on.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;ll write a series to document the current setup. What I&amp;rsquo;m using, why I chose it, how the code is written, what performance considerations were made.&lt;/p&gt;</description></item><item><title>Long Time No See</title><link>https://time-friend.com/en/archive/long-time-no-see/</link><pubDate>Wed, 19 Jun 2024 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/long-time-no-see/</guid><description>&lt;p&gt;Hello everyone,&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been almost three years since I last updated my blog. So much has changed since then. I want to share some of my recent experiences with you.&lt;/p&gt;
&lt;p&gt;First, my whole family and I have moved to a new country. It was a big change for us. We are still getting used to everything.&lt;/p&gt;
&lt;p&gt;In my job, I&amp;rsquo;ve noticed that front-end technology is not as demanding as I thought it would be. Instead, good communication in English has become the most important skill for me. English is now the main barrier in my life. It affects my job, my promotion, and everything in my career.&lt;/p&gt;</description></item><item><title>Mac Shortcut to Minimize All Applications</title><link>https://time-friend.com/en/archive/mac-shortcut-to-minimize-all-applications/</link><pubDate>Wed, 31 Mar 2021 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/mac-shortcut-to-minimize-all-applications/</guid><description>&lt;p&gt;When using Mac, there are too many application windows on the desktop.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve never been able to show desktop with one key like Windows.&lt;/p&gt;
&lt;p&gt;After researching, there&amp;rsquo;s still a way to achieve the same effect on Mac.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Command+Option+H+M
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>2020 Year-End Reflections</title><link>https://time-friend.com/en/archive/2020-year-end-reflections/</link><pubDate>Thu, 04 Mar 2021 16:41:00 +0000</pubDate><guid>https://time-friend.com/en/archive/2020-year-end-reflections/</guid><description>&lt;p&gt;Finally can write this article at this critical time node, although now it&amp;rsquo;s already March 2021.
But never found a very good opportunity to write this article.&lt;/p&gt;
&lt;p&gt;Because of pandemic reasons, I know everyone&amp;rsquo;s 2020 has too many stories to tell.
I&amp;rsquo;m the same, this year is also a critical year of growth for me.&lt;/p&gt;
&lt;h2 id="about-work"&gt;About Work&lt;/h2&gt;
&lt;p&gt;Because last year had certain progress in cross-platform aspects, after company organizational structure adjustment, established Light Application Group.
Specifically doing cross-platform direction technical research to support company business development.&lt;/p&gt;</description></item><item><title>Recommended Order for Developing Taro Multi-Platform Applications</title><link>https://time-friend.com/en/archive/recommended-order-for-developing-taro-multi-platform-applications/</link><pubDate>Wed, 16 Dec 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/recommended-order-for-developing-taro-multi-platform-applications/</guid><description>&lt;h2 id="developing-taro-multi-platform-applications-with-minimal-cost"&gt;Developing Taro Multi-Platform Applications with Minimal Cost&lt;/h2&gt;
&lt;p&gt;All mini-programs, quick apps, React Native apps, etc. in our company are now being developed using Taro.&lt;/p&gt;
&lt;p&gt;If you only need to support one platform, developing with Taro is no problem at all.&lt;/p&gt;
&lt;p&gt;However, if you want to develop once and have it run normally on all platforms, you need to pay attention to many details.&lt;/p&gt;
&lt;p&gt;Each platform has its own challenges.&lt;/p&gt;
&lt;h2 id="development-difficulty-ranking"&gt;Development Difficulty Ranking&lt;/h2&gt;
&lt;p&gt;Huawei Quick App &amp;gt; Quick App &amp;gt; React Native &amp;gt; Swan Mini-Program &amp;gt; WeChat Mini-Program &amp;gt; H5&lt;/p&gt;</description></item><item><title>How to Optimize Bundle Size for Quick Apps Developed with Taro</title><link>https://time-friend.com/en/archive/how-to-optimize-bundle-size-for-quick-apps-developed-with-taro/</link><pubDate>Tue, 15 Dec 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/how-to-optimize-bundle-size-for-quick-apps-developed-with-taro/</guid><description>&lt;h2 id="quick-app-duplicate-bundling-issue"&gt;Quick App Duplicate Bundling Issue&lt;/h2&gt;
&lt;p&gt;When developing quick apps with Taro, there&amp;rsquo;s one issue that absolutely cannot be ignored: bundle size.&lt;/p&gt;
&lt;p&gt;Due to the bundling characteristics of quick apps (below version 1080), if a third-party library is repeatedly used across multiple pages, that library&amp;rsquo;s code will be bundled into each page, causing the same code to exist in multiple pages.&lt;/p&gt;
&lt;p&gt;Because quick app version 1080 is not yet widely deployed. If you rashly upgrade your quick app&amp;rsquo;s minimum platform version to 1080,
you will lose a large number of users on lower versions.&lt;/p&gt;</description></item><item><title>What is a Tensor in TensorFlow?</title><link>https://time-friend.com/en/archive/what-is-a-tensor-in-tensorflow/</link><pubDate>Fri, 18 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/what-is-a-tensor-in-tensorflow/</guid><description>&lt;h2 id="tensor"&gt;Tensor&lt;/h2&gt;
&lt;p&gt;The term &amp;ldquo;tensor&amp;rdquo; was first introduced by William Rowan Hamilton in 1846. Yes, that&amp;rsquo;s the Hamilton who invented quaternions:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/643fca018187d79da1be1bc50f3beb7544c7ff56ffd50d0b4d332952034daa1b.png" alt="Figure 3"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A Tensor is actually a multidimensional array&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The purpose of Tensor is to be able to create higher-dimensional matrices and vectors.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/61f12309aef252eb15cb7e168026f7bab180ea4a8cca2726d0ae4454c6003ba6.png" alt="Figure 1"&gt;&lt;/p&gt;
&lt;h3 id="color-example"&gt;Color Example&lt;/h3&gt;
&lt;p&gt;Color image files (RGB) are generally processed into 3-d tensors, where each element in the 2d array represents a pixel, R represents Red, G represents Green, B represents Blue&lt;/p&gt;</description></item><item><title>Enable Forced Dark Mode for Chrome and Edge on Mac</title><link>https://time-friend.com/en/archive/enable-forced-dark-mode-for-chrome-and-edge-on-mac/</link><pubDate>Thu, 17 Sep 2020 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/enable-forced-dark-mode-for-chrome-and-edge-on-mac/</guid><description>&lt;h2 id="enable-forced-dark-mode"&gt;Enable Forced Dark Mode&lt;/h2&gt;
&lt;h3 id="chrome"&gt;Chrome&lt;/h3&gt;
&lt;p&gt;Enter browser, enter in address bar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chrome://flags/#enable-force-dark
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="edge"&gt;Edge&lt;/h3&gt;
&lt;p&gt;Enter browser, enter in address bar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;edge://flags/#enable-force-dark
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="operation"&gt;Operation&lt;/h3&gt;
&lt;p&gt;Change first item Disabled to Enabled, then restart browser&lt;/p&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/5993f9393f0452e64281d912952d43d05ca1d0e7077ff83eaba4317c97047fa8.png" alt="Figure 2"&gt;&lt;/p&gt;
&lt;p&gt;Effective:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/cdb9fe5995ddf99bd6282102f9126e5ec34558bb599385cd95c5a598063e2395.png" alt="Figure 3"&gt;&lt;/p&gt;</description></item><item><title>How to Disable Chrome CORS Restrictions on Mac</title><link>https://time-friend.com/en/archive/how-to-disable-chrome-cors-restrictions-on-mac/</link><pubDate>Wed, 16 Sep 2020 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/how-to-disable-chrome-cors-restrictions-on-mac/</guid><description>&lt;h2 id="disable-chrome-cross-origin-restrictions"&gt;Disable Chrome Cross-Origin Restrictions&lt;/h2&gt;
&lt;p&gt;Because debugging often requires Chrome to disable cross-origin restrictions, most methods online are for Windows,&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a note today:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;open -n -a /Applications/Google&lt;span style="color:#ae81ff"&gt;\ &lt;/span&gt;Chrome.app/Contents/MacOS/Google&lt;span style="color:#ae81ff"&gt;\ &lt;/span&gt;Chrome &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--args --user-data-dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/tmp/chrome_dev_test&amp;#34;&lt;/span&gt; --disable-web-security
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Math - Relationship Between Data Structures, Programming Statements, Basic Algorithms and Mathematics (Notes)</title><link>https://time-friend.com/en/archive/math-relationship-between-data-structures-programming-statements-basic-algorithms-and-mathematics/</link><pubDate>Tue, 15 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-relationship-between-data-structures-programming-statements-basic-algorithms-and-mathematics/</guid><description>&lt;p&gt;Many people say data structures and algorithms cannot be counted as mathematics.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Different data structures are products of applying mathematical thinking in programming.
Each data structure has its own characteristics, helping us more conveniently implement certain specific mathematical models.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="data-structures"&gt;Data Structures&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t underestimate these data structures, they are actually &amp;ldquo;models&amp;rdquo; for solving problems&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="array"&gt;Array&lt;/h3&gt;
&lt;p&gt;Characteristics: Can directly locate required data through index, suitable for random access. Often combined with loop statements to implement iterative methods, such as binary search, Fibonacci sequence, etc.&lt;/p&gt;</description></item><item><title>Math - Naive Bayes Classification Algorithm (Notes)</title><link>https://time-friend.com/en/archive/math-naive-bayes-classification-algorithm/</link><pubDate>Mon, 14 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-naive-bayes-classification-algorithm/</guid><description>&lt;h2 id="naive-bayes"&gt;Naive Bayes&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;After updating our initial beliefs about something with objective new information, we get a new, improved belief.&amp;rdquo;
&amp;mdash;- Mathematician Thomas Bayes (Thomas Bayes, 1702～1761)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you cannot accurately know the essence of something, you can rely on how many events related to that specific essence appear to judge the probability of its essential attributes.&lt;/p&gt;
&lt;p&gt;The more events supporting a certain attribute occur, the greater the possibility that attribute holds.&lt;/p&gt;</description></item><item><title>Math - Probability, Joint Probability, Conditional Probability, Marginal Probability and Bayes' Theorem (Notes)</title><link>https://time-friend.com/en/archive/math-probability-joint-conditional-marginal-probability-and-bayes-theorem/</link><pubDate>Sun, 13 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-probability-joint-conditional-marginal-probability-and-bayes-theorem/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Formula symbol explanation: &lt;code&gt;P(A|B) is conditional probability of A given B&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="joint-probability"&gt;Joint Probability&lt;/h2&gt;
&lt;p&gt;Various explanations and descriptions for understanding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Joint probability refers to probability containing multiple conditions where all conditions hold simultaneously, denoted as P(X=a,Y=b) or P(a,b), some books also habitually denote as P(ab), but I&amp;rsquo;m not used to this notation, so below uses comma-separated notation. Must note that all conditions hold simultaneously!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Probability of intersection of two or more events&lt;/p&gt;</description></item><item><title>Math - Probability, Random Variables and Distributions (Notes)</title><link>https://time-friend.com/en/archive/math-probability-random-variables-and-distributions/</link><pubDate>Sat, 12 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-probability-random-variables-and-distributions/</guid><description>&lt;h2 id="random-variable"&gt;Random Variable&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Let the sample space of random experiment be S, X = X(e) is a real-valued single-valued function defined on sample space S. X = X(e) is called a random variable.&lt;/li&gt;
&lt;li&gt;Essentially a function about basic events, independent variable is basic event, dependent variable is function value.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="random-experiment"&gt;Random Experiment:&lt;/h3&gt;
&lt;p&gt;Satisfies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(1) Repeatability: Experiment can be repeated under same conditions;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(2) Knowability: Each experiment has more than one possible result, and all possible results of experiment can be clearly identified in advance;&lt;/p&gt;</description></item><item><title>Math - Tree Depth-First Search and Breadth-First Search (Notes)</title><link>https://time-friend.com/en/archive/math-tree-depth-first-search-and-breadth-first-search/</link><pubDate>Fri, 11 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-tree-depth-first-search-and-breadth-first-search/</guid><description>&lt;h2 id="how-to-use-recursion-and-stack-to-implement-depth-first-search"&gt;How to Use Recursion and Stack to Implement Depth-First Search?&lt;/h2&gt;
&lt;p&gt;The process of depth-first search is logically consistent with recursive calls.&lt;/p&gt;
&lt;h3 id="write-a-treenode-class-code-supporting-node-insertion"&gt;Write a TreeNode Class Code, Supporting Node Insertion&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TreeNode&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sons&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TreeNode&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sons&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="try-creating-a-tree"&gt;Try Creating a Tree&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;hello word&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;abcdefg&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Root node
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TreeNode&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;createTree&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;createTree&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str2&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createTree&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;parent&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;found&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;parent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sons&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;find&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;)=&amp;gt;&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;found&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newStrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;createTree&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;newStrs&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;parent&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;parent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newStrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;createTree&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;newStrs&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Creation complete&amp;#39;&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="start-depth-first-search"&gt;Start Depth-First Search&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Use stack to implement depth-first search
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// General idea is to push all nodes into array, then take last one to process, delete while processing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Until none left
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dfsByStack&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create stack object, js uses array instead of stack, each element is TreeNode type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// Initialize, push root node
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// As long as stack has nodes, continue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Take out just pushed node
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Pop top node of stack, get first node entered
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sons&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Already reached leaf node, output
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Already reached leaf node&amp;#39;&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Non-leaf node, traverse each of its child nodes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Note, here uses a temporary stack stackTemp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// This is to maintain traversal order, consistent with recursive traversal order
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// If order not required, can directly push to stack
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stackTemp&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sons&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;son&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sons&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;son&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stackTemp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;son&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Put each node into stack sorted
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Reverse order
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;stackTemp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;stackTemp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="breadth-first-search-bfs"&gt;Breadth-First Search (BFS)&lt;/h2&gt;
&lt;p&gt;Breadth-First Search BFS (Breadth First Search) is also called width-first search. It is a strategy of expanding nodes that are generated first.&lt;/p&gt;</description></item><item><title>Math - Tree Concepts (Notes)</title><link>https://time-friend.com/en/archive/math-tree-concepts/</link><pubDate>Thu, 10 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-tree-concepts/</guid><description>&lt;h2 id="basic-concepts-of-trees"&gt;Basic Concepts of Trees&lt;/h2&gt;
&lt;p&gt;A tree is a data structure composed of nodes or vertices and edges (possibly nonlinear) that does not contain any cycles. A tree without nodes is called an empty (null or empty) tree. A non-empty tree includes a root node and (likely) multiple additional nodes, all nodes forming a multi-level hierarchical structure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A tree is a special type of graph (graphs will be mentioned in subsequent articles).&lt;/p&gt;</description></item><item><title>Math - Dynamic Programming, Edit Distance Calculation (Notes)</title><link>https://time-friend.com/en/archive/math-dynamic-programming-edit-distance-calculation/</link><pubDate>Wed, 09 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-dynamic-programming-edit-distance-calculation/</guid><description>&lt;h2 id="dynamic-programming-dp"&gt;Dynamic Programming (DP)&lt;/h2&gt;
&lt;p&gt;Many people abbreviate it as DP. Dynamic programming needs to derive the optimal solution of the final problem through optimal solutions of subproblems. Therefore, this method particularly emphasizes the transfer relationships between subproblems. We usually call these transfer relationships between subproblems &lt;code&gt;state transfer&lt;/code&gt;, and call the expressions used to describe these state transfers &lt;code&gt;state transfer equations&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="edit-distance-levenshtein-distance"&gt;Edit Distance (Levenshtein Distance)&lt;/h2&gt;
&lt;p&gt;Proposed by Russian scientist Vladimir Levenshtein (graduated from Moscow State University&amp;rsquo;s Department of Mathematics and Mechanics) in 1965. He won the IEEE Richard W. Hamming Medal in 2006 for his contributions to error-correcting code theory and information theory.&lt;/p&gt;</description></item><item><title>Math - Combination, Solve Schedule Planning and Natural Language Processing (Notes)</title><link>https://time-friend.com/en/archive/math-combination-solve-schedule-planning-and-lottery/</link><pubDate>Tue, 08 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-combination-solve-schedule-planning-and-lottery/</guid><description>&lt;h2 id="combination"&gt;Combination&lt;/h2&gt;
&lt;p&gt;Combination is a mathematical term. Generally, selecting m (m≤n) elements from n different elements as a group is called a combination of m elements taken from n different elements. We call problems related to finding the number of combinations as combination problems.&lt;/p&gt;
&lt;p&gt;For the complete set of combinations for all m values, we can call it All Combination. For example, for the set {1, 2, 3}, the complete combination is {empty set, {1}, {2}, {3}, {1, 2}, {1,3} {2, 3}, {1, 2, 3}}.&lt;/p&gt;</description></item><item><title>Math - Permutation, Solve Tianji Horse Racing and Password Cracking Problems (Notes)</title><link>https://time-friend.com/en/archive/math-permutation-solve-tianji-horse-racing-and-password-cracking/</link><pubDate>Mon, 07 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-permutation-solve-tianji-horse-racing-and-password-cracking/</guid><description>&lt;h2 id="tianji-horse-racing-story"&gt;Tianji Horse Racing Story&lt;/h2&gt;
&lt;p&gt;Tianji was a famous general of Qi, often raced horses with King of Qi, but always lost, very unhappy. Sun Bin wanted to help Tianji. He divided these horses into upper, middle, lower three grades. He let Tianji use his lower grade horse to fight King&amp;rsquo;s upper grade horse, use upper grade horse to fight King&amp;rsquo;s middle grade horse, use middle grade horse to fight King&amp;rsquo;s lower grade horse. After three matches, Tianji only lost first match, won last two matches, finally won entire match with King.&lt;/p&gt;</description></item><item><title>Math - Recursion, Divide and Conquer, From Merge Sort to MapReduce (Notes)</title><link>https://time-friend.com/en/archive/math-recursion-divide-and-conquer-from-merge-sort-to-mapreduce/</link><pubDate>Sun, 06 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-recursion-divide-and-conquer-from-merge-sort-to-mapreduce/</guid><description>&lt;p&gt;Teacher Huang Shen&amp;rsquo;s title is really too good, can&amp;rsquo;t find better title to describe today&amp;rsquo;s learning content. Haha~&lt;/p&gt;
&lt;h2 id="divide-and-conquer-thinking-in-merge-sort"&gt;Divide and Conquer Thinking in Merge Sort&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Problem: Sort a pile of messy unordered numbers according to rules from small to large or large to small&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="ordered-case"&gt;Ordered Case&lt;/h4&gt;
&lt;p&gt;Try merging ordered arrays {1, 2, 5, 8} and {3, 4, 6} process.
&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/ba8272d5cbead0e8168ecf222e0ddc87bd2a089a7ffb236f5b6b9c38b435723d.png" alt="Figure 1"&gt;&lt;/p&gt;
&lt;h4 id="unordered-case"&gt;Unordered Case&lt;/h4&gt;
&lt;p&gt;Try to continuously simplify problem, i.e., continuously simplify sequence, until only 1 number remains. 1 number itself is ordered,&lt;/p&gt;</description></item><item><title>Math - Recursion, Decompose Complex Problems (Notes)</title><link>https://time-friend.com/en/archive/math-recursion-decompose-complex-problems/</link><pubDate>Sat, 05 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-recursion-decompose-complex-problems/</guid><description>&lt;h2 id="recursion-and-loops"&gt;Recursion and Loops&lt;/h2&gt;
&lt;p&gt;Theoretically all recursion can do, loops can achieve.&lt;/p&gt;
&lt;p&gt;Recursion and loops are actually implementations of iterative method, and in certain situations, their implementations can be converted to each other.&lt;/p&gt;
&lt;h2 id="why-use-recursion"&gt;Why Use Recursion&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Since recursive function value return process is consistent with loop-based iterative method, why not just use iterative method directly, why still use recursive mathematical thinking and programming methods?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="how-to-find-all-possible-summation-methods-under-limited-total"&gt;How to Find All Possible Summation Methods Under Limited Total?&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Assume there are four denominations of currency, 1 yuan, 2 yuan, 5 yuan and 10 yuan, want to reward someone 10 yuan, can reward 1 ten yuan note, or 10 one yuan notes, or 5 one yuan notes plus 1 five yuan note, etc. How many schemes total?&lt;/p&gt;</description></item><item><title>Math - Mathematical Induction, Inject Soul into Computer (Notes)</title><link>https://time-friend.com/en/archive/math-mathematical-induction-inject-soul-into-computer/</link><pubDate>Fri, 04 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-mathematical-induction-inject-soul-into-computer/</guid><description>&lt;h2 id="what-is-mathematical-induction"&gt;What is Mathematical Induction?&lt;/h2&gt;
&lt;p&gt;Wheat grain placement rule on chessboard is, first square one grain, second square two grains, and so on, each small square has double grains of previous small square, until 64 squares filled. You discover grids 1 to 8&amp;rsquo;s wheat quantities are: 1, 2, 4, 8, 16, 32, 64, 128.&lt;/p&gt;
&lt;h3 id="find-pattern"&gt;Find Pattern&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/873afd7eccb11857ce37c70086e24e186089ea2e8e93daf7ea8677ee5746460e.png" alt="Figure 9"&gt;&lt;/p&gt;
&lt;p&gt;For infinite sequence problems like this, we usually can use &lt;code&gt;Mathematical Induction&lt;/code&gt; to prove&lt;/p&gt;</description></item><item><title>Math - Iterative Method, Make Each Calculation Closer to Truth (Notes)</title><link>https://time-friend.com/en/archive/math-iterative-method-get-closer-to-truth/</link><pubDate>Thu, 03 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-iterative-method-get-closer-to-truth/</guid><description>&lt;h2 id="what-is-iterative-method"&gt;What is Iterative Method?&lt;/h2&gt;
&lt;p&gt;Continuously use old variable values to recursively calculate new variable values.&lt;/p&gt;
&lt;h3 id="short-story"&gt;Short Story:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Ancient Indian King Shah loved chess, planned to heavily reward chess inventor Prime Minister Sissa Ben Dahir. This clever minister pointed at chessboard and said to king: &amp;ldquo;Your Majesty, I don&amp;rsquo;t want other rewards, please put one grain in first small square of this chessboard, two grains in second small square, four grains in third small square, and so on, each small square has double grains of previous small square, until 64 squares filled, then give all grains on chessboard to your servant me!&amp;rdquo; King thought it trivial, happily agreed. But, when started putting grains, king discovered, before reaching twentieth square, one bag of wheat already empty. Then, bag after bag of wheat put into chessboard squares, king quickly realized, even bringing all India&amp;rsquo;s grain, couldn&amp;rsquo;t fulfill promise to Dahir.&lt;/p&gt;</description></item><item><title>Math - Remainder and Hash Function (Notes)</title><link>https://time-friend.com/en/archive/math-remainder-and-hash-function/</link><pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-remainder-and-hash-function/</guid><description>&lt;h2 id="remainder"&gt;Remainder&lt;/h2&gt;
&lt;h3 id="example-1"&gt;Example 1:&lt;/h3&gt;
&lt;p&gt;Today is Wednesday, you want to know what day it will be 50 days later, you can calculate like this, divide 50 by 7 (because a week has 7 days), remainder is 1, finally add one day to today, this way you can know 50 days later is Thursday&lt;/p&gt;
&lt;h3 id="example-2"&gt;Example 2:&lt;/h3&gt;
&lt;p&gt;If you want to display 1123 records, 10 per page, how to calculate total pages? I think you definitely divide 1123 by 10, finally get quotient 112, remainder 3, so your total pages is 112+1=113, and final remainder is extra data that can&amp;rsquo;t fill a page.&lt;/p&gt;</description></item><item><title>Math - Computer Origin Binary (Notes)</title><link>https://time-friend.com/en/archive/math-computer-origin-binary/</link><pubDate>Tue, 01 Sep 2020 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/math-computer-origin-binary/</guid><description>&lt;h2 id="computer-origin"&gt;Computer Origin&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Computer&amp;rsquo;s origin is binary counting method in mathematics&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-is-binary-counting-method"&gt;What is Binary Counting Method?&lt;/h2&gt;
&lt;h3 id="daily-decimal"&gt;Daily Decimal&lt;/h3&gt;
&lt;p&gt;Arabic numerals consist of 10 counting symbols from 0 to 9, and adopt carry system, every 10 carries one place, take 2871 as example&lt;/p&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/294a1909e34794530f44814c77647d1aa7c7c6b487067889af4a1a85b3b857da.png" alt="Figure 7"&gt;&lt;/p&gt;
&lt;p&gt;Where ^ represents power or exponentiation operation. Decimal digit places (thousands, hundreds, tens, etc.) are all in form of 10^n. Need special attention, any non-zero number&amp;rsquo;s 0th power is 1. In this new representation, 10 is called decimal counting method&amp;rsquo;s &lt;code&gt;base&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>How Puppeteer Disguises Itself in Work (Crawler and Anti-Crawler)</title><link>https://time-friend.com/en/archive/how-puppeteer-disguises-itself-in-work-crawler-and-anti-crawler/</link><pubDate>Sat, 29 Aug 2020 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/how-puppeteer-disguises-itself-in-work-crawler-and-anti-crawler/</guid><description>&lt;p&gt;To better protect our data and program security.&lt;/p&gt;
&lt;p&gt;Today I&amp;rsquo;ll introduce how to detect if the web program accessing us is a headless browser,
and some of their anti-detection methods.&lt;/p&gt;
&lt;h2 id="webdriver-detection"&gt;Webdriver Detection&lt;/h2&gt;
&lt;p&gt;Generally, if in headless browser mode, &lt;code&gt;navigator.webdriver&lt;/code&gt; will return &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="detection-method"&gt;Detection Method&lt;/h3&gt;
&lt;p&gt;Simplest detection method&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;navigator&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;webdriver&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Operations targeting headless browsers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="how-to-detect-after-using-defineproperty-to-delete-webdriver"&gt;How to Detect After Using defineProperty to Delete webdriver&lt;/h4&gt;
&lt;p&gt;If the other party uses the following method to delete the webdriver property, there&amp;rsquo;s still a way to detect it&lt;/p&gt;</description></item><item><title>Making Taro UI Support React Native</title><link>https://time-friend.com/en/archive/making-taro-ui-support-react-native/</link><pubDate>Thu, 27 Aug 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/making-taro-ui-support-react-native/</guid><description>&lt;h2 id="the-dilemma-of-taro-ui-not-supporting-rn"&gt;The Dilemma of Taro UI Not Supporting RN&lt;/h2&gt;
&lt;p&gt;Taro UI documentation mentioned early on that it might support RN, but it&amp;rsquo;s been over a year, and due to manpower issues in the Taro UI team, it hasn&amp;rsquo;t been compatible with RN yet.&lt;/p&gt;
&lt;p&gt;Business is urgent, we can&amp;rsquo;t wait for that day. Do it yourself and you&amp;rsquo;ll have everything you need.&lt;/p&gt;
&lt;h2 id="problems-with-traditional-taro-component-packaging-on-rn"&gt;Problems with Traditional Taro Component Packaging on RN&lt;/h2&gt;
&lt;p&gt;Generally, after a component library is packaged, the dist/index.js file will look like this.&lt;/p&gt;</description></item><item><title>Taro Cross-Platform Development - Multi-Business Module Management React Native (Final)</title><link>https://time-friend.com/en/archive/multi-business-module-management-react-native-final/</link><pubDate>Tue, 25 Aug 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/multi-business-module-management-react-native-final/</guid><description>&lt;h2 id="react-native-hot-update-solution"&gt;React Native Hot Update Solution&lt;/h2&gt;
&lt;p&gt;RN business is becoming increasingly large, and more teams are collaborating. RN&amp;rsquo;s dynamic capabilities must be put on the agenda.
For RN hot updates, the first problem is code splitting.&lt;/p&gt;
&lt;p&gt;RN&amp;rsquo;s base library is very large, plus we depend on many third-party libraries. This code must be separated during code splitting.
Business packages should be relatively pure, containing only business code. This ensures business packages are smaller, ensuring speed during hot updates.&lt;/p&gt;</description></item><item><title>Taro Cross-Platform Development - Multi-Business Module Management React Native (Part 2)</title><link>https://time-friend.com/en/archive/multi-business-module-management-react-native-part-2/</link><pubDate>Sun, 23 Aug 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/multi-business-module-management-react-native-part-2/</guid><description>&lt;h2 id="implement-a-simple-module-management-tool-to-solve-the-problem-of-slow-npm-pulling-of-business-modules"&gt;Implement a Simple Module Management Tool to Solve the Problem of Slow npm Pulling of Business Modules&lt;/h2&gt;
&lt;p&gt;Using npm to pull git repositories, the speed is actually acceptable.
The main slowness is during &lt;code&gt;postinstall&lt;/code&gt; when npm pulls git repositories, it needs to rebuild project code. Another point is that business modules also have dependencies, and npm install also needs to pull the same dependencies again.&lt;/p&gt;
&lt;p&gt;These two steps can actually be omitted. The solution is to implement a simple module management tool to replace npm&amp;rsquo;s handling of loading business modules.&lt;/p&gt;</description></item><item><title>Taro Cross-Platform Development - Multi-Business Module Management React Native (Part 1)</title><link>https://time-friend.com/en/archive/multi-business-module-management-react-native-part-1/</link><pubDate>Fri, 21 Aug 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/multi-business-module-management-react-native-part-1/</guid><description>&lt;h2 id="how-can-native-rn-projects-and-taro-coexist"&gt;How Can Native RN Projects and Taro Coexist?&lt;/h2&gt;
&lt;p&gt;Our team started practicing native React Native projects early on, for a long time,&lt;/p&gt;
&lt;p&gt;All business modules were developed and maintained in one project. Over time, this project became a behemoth.&lt;/p&gt;
&lt;p&gt;Plus later we introduced RN projects based on Taro development. To ensure native and Taro RN coexistence,&lt;/p&gt;
&lt;p&gt;Whether it&amp;rsquo;s native RN projects or Taro projects, the main export index file format in package.json files is consistent.&lt;/p&gt;</description></item><item><title>Taro Cross-Platform Development - Dependency Management Issues</title><link>https://time-friend.com/en/archive/dependency-management-issues/</link><pubDate>Thu, 20 Aug 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/dependency-management-issues/</guid><description>&lt;p&gt;Currently, the platforms we reach through Taro include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WeChat Mini Program&lt;/li&gt;
&lt;li&gt;QQ Mini Program&lt;/li&gt;
&lt;li&gt;Baidu Mini Program&lt;/li&gt;
&lt;li&gt;React Native&lt;/li&gt;
&lt;li&gt;H5&lt;/li&gt;
&lt;li&gt;Quick App&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To quickly allow business to reach all platforms, each of our business modules is independent.&lt;/p&gt;
&lt;p&gt;They are compatible with different platforms according to business needs, and then assembled into a complete project during build time.&lt;/p&gt;
&lt;p&gt;To meet the above needs and enable flexible development, each business module can be independently developed and run, without depending on the main project.&lt;/p&gt;</description></item><item><title>Taro Cross-Platform Development - Thoughts and Measures on the New Era of Cross-Platform Development</title><link>https://time-friend.com/en/archive/thoughts-and-measures-on-new-era-of-cross-platform-development/</link><pubDate>Tue, 16 Jun 2020 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/thoughts-and-measures-on-new-era-of-cross-platform-development/</guid><description>&lt;h2 id="new-era"&gt;New Era&lt;/h2&gt;
&lt;p&gt;The emergence of cross-platform frameworks has transitioned front-end browser compatibility to a new era of client platform compatibility.&lt;/p&gt;
&lt;p&gt;For startups, this type of framework can quickly test and reduce human and time costs.&lt;/p&gt;
&lt;h2 id="why-choose-taro"&gt;Why Choose Taro&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s not that Taro solution is particularly excellent. At the current time point, all current cross-platform frameworks are still in the improvement stage. The most complete platforms might be mini programs and H5.&lt;/p&gt;</description></item><item><title>Switch XCI to NSP Tool - 4NXCI Download</title><link>https://time-friend.com/en/archive/switch-xci-to-nsp-tool-download/</link><pubDate>Sun, 02 Feb 2020 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/switch-xci-to-nsp-tool-download/</guid><description>&lt;h2 id="4nxci-is-a-tool-to-convert-xci-files-to-nsp"&gt;4NXCI is a tool to convert XCI files to NSP&lt;/h2&gt;
&lt;p&gt;Currently only supports Windows, other systems not supported&lt;/p&gt;
&lt;h3 id="github-address"&gt;Github Address:&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/The-4n/4NXCI"&gt;https://github.com/The-4n/4NXCI&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="download-address"&gt;Download Address&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/The-4n/4NXCI/releases"&gt;https://github.com/The-4n/4NXCI/releases&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="usage-method"&gt;Usage Method&lt;/h2&gt;
&lt;h2 id="gui-tool"&gt;GUI Tool&lt;/h2&gt;
&lt;p&gt;If not used to commands can download GUI version, file naming roughly &lt;code&gt;4nxci-v4.03_GUI.zip &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/4a89dd91123467dc70d9633e66182469cf9c5e2d0a555bc62b0a379a3f41da8b.png" alt="Figure 1"&gt;&lt;/p&gt;
&lt;h3 id="command-line-tool"&gt;Command Line Tool&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#ae81ff"&gt;\4&lt;/span&gt;nxci.exe &lt;span style="color:#f92672"&gt;[&lt;/span&gt;options...&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &amp;lt;path_to_file.xci&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Options: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-k, --keyset Set keyset file path, default is ./keys.dat 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-h, --help Display help information
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-t, --tempdir Set temporary folder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-o, --outdir Set export folder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-r, --rename Set exported nsp file&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s filename
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--keepncaid Keep current ncas ID 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="about-keyset-file"&gt;About keyset File&lt;/h2&gt;
&lt;p&gt;Copy the following code into a txt file, then rename to &lt;code&gt;keys.dat&lt;/code&gt;
Use GUI or command line tool to import&lt;/p&gt;</description></item><item><title>2019 Year-End Reflections</title><link>https://time-friend.com/en/archive/2019-year-end-reflections/</link><pubDate>Sun, 29 Dec 2019 21:29:00 +0000</pubDate><guid>https://time-friend.com/en/archive/2019-year-end-reflections/</guid><description>&lt;p&gt;This year can be said to be a fulfilling year, entered a new company. Everything changed, career very smooth. Also very grateful to my colleagues for their help and inspiration this year.&lt;/p&gt;
&lt;p&gt;Compared to 2018, it&amp;rsquo;s a leap in growth. The more I think about it, the more I feel should have come to such a company earlier, fully showcase myself.&lt;/p&gt;
&lt;p&gt;In the new company, all previous ideas about front-end automation were fully implemented company-wide.
Micro-frontend architecture also got real application in company&amp;rsquo;s backend management system.
And achieved certain results in Taro multi-platform isomorphic applications.&lt;/p&gt;</description></item><item><title>Continuous Integration - Code Quality Scanning</title><link>https://time-friend.com/en/archive/continuous-integration-code-quality-scanning/</link><pubDate>Sun, 15 Dec 2019 23:15:00 +0000</pubDate><guid>https://time-friend.com/en/archive/continuous-integration-code-quality-scanning/</guid><description>&lt;p&gt;To facilitate managing company code quality, integrating code quality scanning with continuous integration is an important step.
Currently the company is relatively young, but in just one year, we&amp;rsquo;ve had close to 300 frontend projects.&lt;/p&gt;
&lt;p&gt;With so many frontend projects, how we ensure code quality becomes a very important matter.&lt;/p&gt;
&lt;p&gt;With too many code projects, code review is necessary. But manual code review cannot guarantee efficiency.
Due to differences in individual levels and familiarity with company standards, we cannot guarantee consistent standards across all projects.
Some potential bugs may also be missed.&lt;/p&gt;</description></item><item><title>FREE-TO-SHOT - Horse</title><link>https://time-friend.com/en/archive/horse-photo/</link><pubDate>Sat, 07 Dec 2019 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/horse-photo/</guid><description>&lt;p&gt;Shot on December 7, 2019 in Urumqi&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/484098812.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/136103021.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/589808781.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/556778411.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com//1928176/f/311215253.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/186630815.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/81773594.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/190497554.jpg" alt="Horse"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://tuchong.pstatp.com/1928176/f/494388088.jpg" alt="Horse"&gt;&lt;/p&gt;</description></item><item><title>Continuous Integration - Using GitLab CI for Frontend Project Continuous Integration</title><link>https://time-friend.com/en/archive/continuous-integration-using-gitlab-ci-for-frontend-projects/</link><pubDate>Fri, 20 Sep 2019 23:15:00 +0000</pubDate><guid>https://time-friend.com/en/archive/continuous-integration-using-gitlab-ci-for-frontend-projects/</guid><description>&lt;p&gt;There are many continuous integration platforms on the market. Today I&amp;rsquo;ll introduce GitLab&amp;rsquo;s CI.&lt;/p&gt;
&lt;p&gt;Starting from GitLab 8.0, GitLab CI has been integrated into GitLab.&lt;/p&gt;
&lt;p&gt;Usage is very simple. As long as we create a &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file in the project root directory and add a Runner, we directly integrate GitLab CI.&lt;/p&gt;
&lt;p&gt;Integration method is very simple and convenient. Currently we put a &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file in the front-end scaffold, and every subsequent front-end project can directly integrate GitLab CI according to standards.&lt;/p&gt;</description></item><item><title>Micro-Frontend Advanced 4 - Cross-Framework Shared Components (Widgetization)</title><link>https://time-friend.com/en/archive/micro-frontend-advanced-4-cross-framework-shared-components-widgetization/</link><pubDate>Sat, 22 Jun 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-advanced-4-cross-framework-shared-components-widgetization/</guid><description>&lt;p&gt;In micro-frontend, we can let sub-modules use different framework technology stacks according to our business needs. Although reaching this step is already very beautiful, is this the end of micro-frontend?&lt;/p&gt;
&lt;p&gt;The answer is no, micro-frontend boundaries can be further broadened.&lt;/p&gt;
&lt;p&gt;The previous micro-frontend article &lt;a href="https://time-friend.com/archive/qh7x5i5szfh/"&gt;https://time-friend.com/archive/qh7x5i5szfh/&lt;/a&gt; introduced how to call React components between sub-modules with the same technology stack.&lt;/p&gt;
&lt;p&gt;What we&amp;rsquo;re talking about today is how sub-modules between different technology stacks call components from different technology stacks.&lt;/p&gt;</description></item><item><title>Micro-Frontend Advanced 3 - Cross-Module Shared Components</title><link>https://time-friend.com/en/archive/micro-frontend-advanced-3-cross-module-shared-components/</link><pubDate>Sun, 12 May 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-advanced-3-cross-module-shared-components/</guid><description>&lt;p&gt;After front-end microservices, we face a problem: duplicate code between modules cannot be reused.&lt;/p&gt;
&lt;p&gt;If we use npm to manage our duplicate code, we&amp;rsquo;ll have additional costs maintaining npm packages.
Updating npm package versions in sub-modules is also very troublesome.
There&amp;rsquo;s no optimization in js file size either.&lt;/p&gt;
&lt;h1 id="component-sharing"&gt;Component Sharing&lt;/h1&gt;
&lt;p&gt;Today let&amp;rsquo;s talk about how to use one component simultaneously in multiple modules.&lt;/p&gt;
&lt;h2 id="approach"&gt;Approach&lt;/h2&gt;
&lt;p&gt;Manage public components in base module, encapsulate components as dynamic components, so when packaging we can split this component into a separate file.
When other sub-modules need this component, dynamically get it from Base module.&lt;/p&gt;</description></item><item><title>Micro-Frontend Advanced 2 - Local Development Guide</title><link>https://time-friend.com/en/archive/micro-frontend-advanced-2-local-development-guide/</link><pubDate>Mon, 22 Apr 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-advanced-2-local-development-guide/</guid><description>&lt;p&gt;After building our microservices front-end application using &lt;code&gt;single-spa&lt;/code&gt;, there&amp;rsquo;s actually a problem that will always trouble us,
That is how to develop effectively? How to be as simple and easy to use as our usual front-end application development.
Today using umi sub-module as an example, hoping to give everyone an idea&lt;/p&gt;
&lt;p&gt;Today I&amp;rsquo;ll introduce one method, hoping it helps everyone.&lt;/p&gt;
&lt;h2 id="module-loader"&gt;Module Loader&lt;/h2&gt;
&lt;p&gt;Do you remember my previous module loader, &lt;a href="https://time-friend.com/archive/1a60cede/"&gt;https://time-friend.com/archive/1a60cede/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We just need to encapsulate the original module loader into an npm package.&lt;/p&gt;</description></item><item><title>Micro-Frontend Advanced 1 - Umi-Based Submodule Solution</title><link>https://time-friend.com/en/archive/micro-frontend-advanced-1-umi-based-submodule-solution/</link><pubDate>Sat, 13 Apr 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-advanced-1-umi-based-submodule-solution/</guid><description>&lt;p&gt;It&amp;rsquo;s been more than half a year since the first article about front-end microservices. Many people are interested.&lt;/p&gt;
&lt;p&gt;Today let&amp;rsquo;s talk about how we build a more complete front-end microservices sub-module based on umi.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using front-end technology stacks other than React,
Many of my handling methods can also be applied to other technology stacks.&lt;/p&gt;
&lt;p&gt;Hope it helps you too.&lt;/p&gt;
&lt;h1 id="excellent-umi-framework"&gt;Excellent umi Framework&lt;/h1&gt;
&lt;p&gt;In front-end mid-backend projects, front-end microservices needs are relatively strong.&lt;/p&gt;</description></item><item><title>MongoDB Migration - Backup and Restore</title><link>https://time-friend.com/en/archive/mongodb-migration-backup-and-restore/</link><pubDate>Wed, 27 Mar 2019 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mongodb-migration-backup-and-restore/</guid><description>&lt;p&gt;Recently did a migration of my crawler database, so here record MongoDB backup and restore&lt;/p&gt;
&lt;h2 id="mongodb-data-backup"&gt;MongoDB Data Backup&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mongodump -h dbhost -d dbname -o dbdirectory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;-h: MongoDB server address, e.g.: 127.0.0.1, if not changed generally is: 127.0.0.1:27017&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-d: Database name to backup, e.g.: test&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-o: Backup data storage location, e.g.: /home/root/xxx,&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mongodb-data-restore"&gt;MongoDB Data Restore&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mongorestore -h &amp;lt;hostname&amp;gt;&amp;lt;:port&amp;gt; -d dbname &amp;lt;path&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&amp;ndash;host &amp;lt;:port&amp;gt;, -h &amp;lt;:port&amp;gt;: MongoDB server address, default: localhost:27017&lt;/p&gt;</description></item><item><title>A Bug Caused by .gitattributes File from Two Years Ago</title><link>https://time-friend.com/en/archive/gitattributes-bug-from-two-years-ago/</link><pubDate>Thu, 24 Jan 2019 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/gitattributes-bug-from-two-years-ago/</guid><description>&lt;h1 id="cause"&gt;Cause&lt;/h1&gt;
&lt;p&gt;On a whim, I opened a frontend project I wrote two years ago to start code review.
I wrote this project alone for two years, roughly over a hundred thousand lines of code.&lt;/p&gt;
&lt;p&gt;Found that Git in this project recognized all code files as binary files.
This problem had troubled me for a long time, but I couldn&amp;rsquo;t find the cause. This led to my code having no diff history.&lt;/p&gt;</description></item><item><title>LintCode Longest Common Prefix</title><link>https://time-friend.com/en/archive/lintcode-longest-common-prefix/</link><pubDate>Sat, 19 Jan 2019 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/lintcode-longest-common-prefix/</guid><description>&lt;p&gt;Write a function to find the longest common prefix string amongst an array of strings.&lt;/p&gt;
&lt;p&gt;If there is no common prefix, return an empty string &amp;ldquo;&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="example-1"&gt;Example 1:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [&amp;#34;flower&amp;#34;,&amp;#34;flow&amp;#34;,&amp;#34;flight&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &amp;#34;fl&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example-2"&gt;Example 2:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [&amp;#34;dog&amp;#34;,&amp;#34;racecar&amp;#34;,&amp;#34;car&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: There is no common prefix among the input strings.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note:&lt;/p&gt;
&lt;p&gt;All given inputs are in lowercase letters a-z.&lt;/p&gt;
&lt;h1 id="javascript"&gt;JavaScript&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param {string[]} strs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @return {string}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;longestCommonPrefix&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prefix&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isTrue&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]) { &lt;span style="color:#75715e"&gt;// Use first word as baseline
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;// Use first word as baseline
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;strs&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;] &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;isTrue&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;isTrue&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prefix&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prefix&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prefix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>LintCode Best Time to Buy and Sell Stock II</title><link>https://time-friend.com/en/archive/lintcode-best-time-to-buy-and-sell-stock-ii/</link><pubDate>Sat, 12 Jan 2019 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/lintcode-best-time-to-buy-and-sell-stock-ii/</guid><description>&lt;p&gt;Given an array, its i-th element is the price of a given stock on day i.&lt;/p&gt;
&lt;p&gt;Design an algorithm to calculate the maximum profit you can obtain. You can complete as many transactions as possible (buy and sell a stock multiple times).&lt;/p&gt;
&lt;p&gt;Note: You cannot participate in multiple transactions simultaneously (you must sell the stock before buying again).&lt;/p&gt;
&lt;h2 id="example-1"&gt;Example 1:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [7,1,5,3,6,4]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: Buy on day 2 (stock price = 1) and sell on day 3 (stock price = 5), profit = 5-1 = 4.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Then buy on day 4 (stock price = 3) and sell on day 5 (stock price = 6), profit = 6-3 = 3.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example-2"&gt;Example 2:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [1,2,3,4,5]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: Buy on day 1 (stock price = 1) and sell on day 5 (stock price = 5), profit = 5-1 = 4.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Note that you cannot buy on day 1 and day 2 and then sell them later.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Because this involves participating in multiple transactions simultaneously, you must sell the stock before buying again.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example-3"&gt;Example 3:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: [7,6,4,3,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: In this case, no transaction is completed, so maximum profit is 0.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="javascript"&gt;JavaScript&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param {number[]} prices
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @return {number}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxProfit&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prices&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prices&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prices&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prices&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Canvas Cross-Origin Image Ultimate Solution</title><link>https://time-friend.com/en/archive/canvas-cross-origin-image-ultimate-solution/</link><pubDate>Thu, 10 Jan 2019 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/canvas-cross-origin-image-ultimate-solution/</guid><description>&lt;p&gt;Browsers, for security reasons, do not allow Canvas to use &lt;code&gt;getImageData&lt;/code&gt; &lt;code&gt;toDataURL&lt;/code&gt; to process cross-origin fetched images.&lt;/p&gt;
&lt;h1 id="traditional-solutions"&gt;Traditional Solutions&lt;/h1&gt;
&lt;h2 id="1-server-needs-to-configure-access-control-allow-origin"&gt;1. Server Needs to Configure Access-Control-Allow-Origin&lt;/h2&gt;
&lt;p&gt;I believe everyone has seen this line of code too many times, I won&amp;rsquo;t elaborate&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;header(&amp;#34;Access-Control-Allow-Origin: your-domain&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2-set-crossorigin-attribute"&gt;2. Set crossOrigin Attribute&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;createElement&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;canvas&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getContext&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;2d&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;img&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Image&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;crossOrigin&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;anonymous&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// This line of code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onload&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;drawImage&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getImageData&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;src&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://avatars3.xxxx.com/u/496048&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Up to here, your cross-origin problem is basically solved. But because of some objective factors, backend engineers refuse to help you set cross-origin headers, what should you do?&lt;/p&gt;</description></item><item><title>The Ultimate Solution for Cross-origin Images in Canvas</title><link>https://time-friend.com/en/archive/canvas-cross-origin-image/</link><pubDate>Thu, 10 Jan 2019 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/canvas-cross-origin-image/</guid><description>&lt;p&gt;Browsers do not allow Canvas to use &lt;code&gt;getImageData&lt;/code&gt; or &lt;code&gt;toDataURL&lt;/code&gt; on cross-origin images due to security concerns.&lt;/p&gt;
&lt;h1 id="traditional-solutions"&gt;Traditional Solutions&lt;/h1&gt;
&lt;h2 id="1-server-needs-to-configure-access-control-allow-origin"&gt;1. Server needs to configure Access-Control-Allow-Origin&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m sure you&amp;rsquo;ve seen this line of code many times, so I&amp;rsquo;ll keep it brief.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;header(&amp;#34;Access-Control-Allow-Origin: your-domain.com&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2-set-the-crossorigin-attribute"&gt;2. Set the crossOrigin Attribute&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;createElement&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;canvas&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getContext&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;2d&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;img&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Image&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;crossOrigin&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;anonymous&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onload&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;drawImage&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getImageData&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;src&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://avatars3.xxxx.com/u/496048&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;At this point, your cross-origin issues are mostly resolved. But what if the backend engineer refuses to set the cross-origin header for objective reasons?&lt;/p&gt;</description></item><item><title>Git Case-Insensitive Causing Annoying Problem</title><link>https://time-friend.com/en/archive/git-case-insensitive-issue/</link><pubDate>Wed, 09 Jan 2019 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/git-case-insensitive-issue/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Because a colleague changed a folder name from lowercase to uppercase, I couldn&amp;rsquo;t directly push, rebase and other operations locally. Very annoying~&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;error: The following untracked working tree files would be overwritten by checkout:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xxx.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Please move or remove them before you can switch branches.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Aborting
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="solution"&gt;Solution&lt;/h1&gt;
&lt;p&gt;Set to case-sensitive (must restore configuration after problem is solved)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config core.ignorecase false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Although setting case-sensitive will always affect code in other branches, so it&amp;rsquo;s not recommended to use this configuration permanently. After the problem is solved, it should be changed back.&lt;/p&gt;</description></item><item><title>Visual Studio Code's jsconfig.json</title><link>https://time-friend.com/en/archive/vscode-jsconfig/</link><pubDate>Tue, 08 Jan 2019 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/vscode-jsconfig/</guid><description>&lt;p&gt;Today let&amp;rsquo;s talk about some tips for configuring Visual Studio Code&amp;rsquo;s jsconfig.json.&lt;/p&gt;
&lt;h1 id="what-is-jsconfigjson"&gt;What is jsconfig.json?&lt;/h1&gt;
&lt;p&gt;If your project has a &lt;code&gt;jsconfig.json&lt;/code&gt; file, its configuration can provide personalized support for all JS code in the file&amp;rsquo;s directory.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip: If you&amp;rsquo;ve just added this file to your project, remember to restart VSCode.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="examples"&gt;Examples&lt;/h1&gt;
&lt;h2 id="exclude-property"&gt;exclude Property&lt;/h2&gt;
&lt;p&gt;When VSCode scans project code, if it encounters &lt;code&gt;node_modules&lt;/code&gt;, it becomes very slow.&lt;/p&gt;
&lt;p&gt;If you want to improve editor performance, you should exclude this folder.&lt;/p&gt;</description></item><item><title>Frontend Interview Knowledge Collection - JavaScript</title><link>https://time-friend.com/en/archive/interview-javascript/</link><pubDate>Mon, 07 Jan 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/interview-javascript/</guid><description>&lt;h2 id="javascript-interview-knowledge-summary"&gt;JavaScript Interview Knowledge Summary&lt;/h2&gt;
&lt;h4 id="1-introduce-the-basic-data-types-of-js"&gt;1. Introduce the basic data types of JS.&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;JS has six basic data types: Undefined, Null, Boolean, Number, String, and the Symbol type added in ES6,
which represents a unique and immutable data type after creation. Its appearance is mainly to solve the problem of possible global variable conflicts.
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="2-how-many-types-of-values-does-javascript-have-can-you-draw-their-memory-diagram"&gt;2. How many types of values does JavaScript have? Can you draw their memory diagram?&lt;/h4&gt;
&lt;p&gt;Related knowledge points:&lt;/p&gt;</description></item><item><title>Frontend Interview Knowledge Collection - HTML</title><link>https://time-friend.com/en/archive/interview-html/</link><pubDate>Sun, 06 Jan 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/interview-html/</guid><description>&lt;h2 id="html-interview-knowledge-summary"&gt;HTML Interview Knowledge Summary&lt;/h2&gt;
&lt;h4 id="1-what-is-the-purpose-of-doctype"&gt;1. What is the purpose of DOCTYPE?&lt;/h4&gt;
&lt;p&gt;Related knowledge points:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;IE5.5 introduced the concept of document mode, which is implemented through document type (DOCTYPE) switching.

The &amp;lt;!DOCTYPE&amp;gt; declaration is located at the first line of an HTML document, before the &amp;lt;html&amp;gt; tag. It tells the browser&amp;#39;s parser which document standard to use for parsing.

The absence or incorrect format of DOCTYPE will cause the document to render in compatibility mode.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Answer (refer to 1-5):&lt;/p&gt;</description></item><item><title>Frontend Interview Knowledge Collection - CSS</title><link>https://time-friend.com/en/archive/interview-css/</link><pubDate>Sat, 05 Jan 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/interview-css/</guid><description>&lt;h2 id="css-interview-knowledge-summary"&gt;CSS Interview Knowledge Summary&lt;/h2&gt;
&lt;h4 id="1-introduce-the-standard-css-box-model-how-is-the-low-version-ie-box-model-different"&gt;1. Introduce the standard CSS box model? How is the low-version IE box model different?&lt;/h4&gt;
&lt;p&gt;Related knowledge points:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;(1) There are two box models: IE box model (border-box) and W3C standard box model (content-box)
(2) The box model consists of four parts: content, padding, margin, border

Difference between IE box model and W3C standard box model:

(1) W3C standard box model: width and height properties only include content, not border and padding
(2) IE box model: width and height properties include content, border, and padding, referring to content
+padding+border.

In IE8+ browsers, which box model to use can be controlled by box-sizing (a new CSS property). The default value is content-box, which is the standard box model.
If box-sizing is set to border-box, the IE box model is used. In IE6, 7, 8, if DOCTYPE is missing, the box model will be interpreted as IE box model.
If DOCTYPE is declared in the page, all browsers will interpret the box model as the W3C box model.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Answer:&lt;/p&gt;</description></item><item><title>Frontend Interview Knowledge Collection - Comprehensive</title><link>https://time-friend.com/en/archive/interview-comprehensive/</link><pubDate>Fri, 04 Jan 2019 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/interview-comprehensive/</guid><description>&lt;h2 id="html-http-web-comprehensive-questions"&gt;HTML, HTTP, Web Comprehensive Questions&lt;/h2&gt;
&lt;h3 id="common-sorting-algorithm-time-complexity-and-space-complexity"&gt;Common sorting algorithm time complexity and space complexity&lt;/h3&gt;
&lt;p&gt;&lt;img src="img/sort-compare.png" alt="Sorting algorithm comparison"&gt;&lt;/p&gt;
&lt;h3 id="what-seo-should-frontend-pay-attention-to"&gt;What SEO should frontend pay attention to&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Reasonable title, description, keywords: search engines weight these three in descending order. Title should emphasize key points, with important keywords appearing no more than twice and positioned early. Different pages should have different titles. Description should summarize page content concisely, with appropriate length and no keyword stuffing. Different pages should have different descriptions. Keywords should list important keywords only.&lt;/li&gt;
&lt;li&gt;Semantic HTML code compliant with W3C standards: semantic code helps search engines understand web pages easily.&lt;/li&gt;
&lt;li&gt;Important content HTML code placed first: search engines crawl HTML from top to bottom. Some search engines have length limits on crawling, so placing important content first ensures it gets crawled.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t output important content with JS: crawlers don&amp;rsquo;t execute JS to get content.&lt;/li&gt;
&lt;li&gt;Minimize iframe usage: search engines don&amp;rsquo;t crawl content inside iframes.&lt;/li&gt;
&lt;li&gt;Non-decorative images must include alt attributes.&lt;/li&gt;
&lt;li&gt;Improve website speed: website speed is an important factor in search engine ranking.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="session-tracking-methods-in-web-development"&gt;Session tracking methods in web development&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;cookie&lt;/li&gt;
&lt;li&gt;session&lt;/li&gt;
&lt;li&gt;URL rewriting&lt;/li&gt;
&lt;li&gt;Hidden input&lt;/li&gt;
&lt;li&gt;IP address&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="difference-between-imgs-title-and-alt"&gt;Difference between &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&amp;rsquo;s title and alt&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; is one of the &lt;a href="http://www.w3.org/TR/html-markup/global-attributes.html#common.attrs.core"&gt;global attributes&lt;/a&gt;, used to provide additional advisory information for elements. It&amp;rsquo;s usually displayed when the mouse hovers over the element.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alt&lt;/code&gt; is a unique attribute of &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, an equivalent description of the image content. It&amp;rsquo;s displayed when the image cannot load and is used by screen readers to interpret images. It improves image accessibility. Except for purely decorative images, it must have meaningful values, and search engines focus on analyzing it.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="what-is-doctype-examples-of-common-doctypes-and-their-characteristics"&gt;What is doctype? Examples of common doctypes and their characteristics&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;!doctype&amp;gt;&lt;/code&gt; declaration must be at the top of the HTML document, before the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; tag. In HTML5, it&amp;rsquo;s case-insensitive.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;!doctype&amp;gt;&lt;/code&gt; is not an HTML tag; it&amp;rsquo;s an instruction to tell the browser which HTML version the current page uses.&lt;/li&gt;
&lt;li&gt;Modern browser HTML layout engines determine whether to use quirks mode or standards mode for rendering by checking the doctype. Some browsers have a &amp;ldquo;almost standards&amp;rdquo; mode.&lt;/li&gt;
&lt;li&gt;In HTML4.01, &lt;code&gt;&amp;lt;!doctype&amp;gt;&lt;/code&gt; points to a DTD. Since HTML4.01 is based on SGML, the DTD specifies markup rules to ensure the browser renders content correctly.&lt;/li&gt;
&lt;li&gt;HTML5 is not based on SGML, so DTD is not needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Common doctypes:&lt;/p&gt;</description></item><item><title>Abstract Syntax Tree AST - Behind the Scenes Hero</title><link>https://time-friend.com/en/archive/abstract-syntax-tree-ast-behind-the-scenes-hero/</link><pubDate>Thu, 03 Jan 2019 17:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/abstract-syntax-tree-ast-behind-the-scenes-hero/</guid><description>&lt;h1 id="abstract-syntax-tree-ast"&gt;Abstract Syntax Tree AST&lt;/h1&gt;
&lt;p&gt;In computer science, an abstract syntax tree, or syntax tree for short, is an abstract representation of the syntactic structure of source code.&lt;/p&gt;
&lt;p&gt;Here I&amp;rsquo;ll introduce a website &lt;a href="https://astexplorer.net"&gt;https://astexplorer.net&lt;/a&gt;, which allows you to clearly see how a piece of js, css, and other languages are converted into syntax trees.&lt;/p&gt;
&lt;p&gt;In our browsers, our js code is also parsed into abstract syntax trees and then further analyzed and operated on.&lt;/p&gt;</description></item><item><title>2018 Year-End Reflections</title><link>https://time-friend.com/en/archive/2018-year-end-reflections/</link><pubDate>Sat, 29 Dec 2018 21:29:00 +0000</pubDate><guid>https://time-friend.com/en/archive/2018-year-end-reflections/</guid><description>&lt;p&gt;Today is the last working day of the year, now I&amp;rsquo;m on the high-speed rail. Already used to using computer to work on something on high-speed rail.
Looking back, don&amp;rsquo;t know how many versions I&amp;rsquo;ve released on high-speed rail, fixed how many bugs. Haha~&lt;/p&gt;
&lt;p&gt;Looking back at 2018, for me it&amp;rsquo;s legendary, it&amp;rsquo;s tortuous, even a bit depressing. Fortunately personal growth wasn&amp;rsquo;t delayed by objective reasons.&lt;/p&gt;
&lt;h2 id="my-team"&gt;My Team&lt;/h2&gt;
&lt;p&gt;Thinking back to July this year, the front-end team I personally built was disbanded due to macro environment reasons, really heartbreaking.
If developed normally, I think should be able to build into my Dream Team. At least everyone is so passionate about technology.&lt;/p&gt;</description></item><item><title>Talking About HTTP X-Forwarded-For and X-Real-IP</title><link>https://time-friend.com/en/archive/talking-about-http-x-forwarded-for-and-x-real-ip/</link><pubDate>Sat, 29 Dec 2018 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/talking-about-http-x-forwarded-for-and-x-real-ip/</guid><description>&lt;p&gt;Recently when looking at &lt;a href="https://binaryify.github.io/NeteaseCloudMusicApi/#/?id=%E8%B0%83%E7%94%A8%E5%89%8D%E9%A1%BB%E7%9F%A5"&gt;NetEase Cloud Music API nodejs&lt;/a&gt; project documentation.&lt;/p&gt;
&lt;p&gt;Found in the calling instructions, there&amp;rsquo;s a section that says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Due to NetEase restrictions, using this project on foreign servers will be restricted. To solve this, you can use mainland servers or use a proxy. Thanks to @hiyangguo for the solution: add X-Real-IP&amp;rsquo;:&amp;lsquo;211.161.244.70&amp;rsquo; // any domestic IP in the &amp;lsquo;headers&amp;rsquo; section of &amp;lsquo;util.js&amp;rsquo; to solve&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NetEase Cloud Music API calls have restrictions for foreign countries. To bypass such restrictions, you must modify &lt;code&gt;X-Real-IP&lt;/code&gt; in headers to solve.&lt;/p&gt;</description></item><item><title>Angular Path Alias Configuration</title><link>https://time-friend.com/en/archive/angular-path-alias-configuration/</link><pubDate>Thu, 27 Dec 2018 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/angular-path-alias-configuration/</guid><description>&lt;p&gt;Angular CLI has webpack built-in, so path aliases can be configured.
The configuration method is almost the same.&lt;/p&gt;
&lt;h1 id="configure-path-alias"&gt;Configure Path Alias&lt;/h1&gt;
&lt;p&gt;Find the &lt;code&gt;tsconfig.json&lt;/code&gt; file in your project root directory.&lt;/p&gt;
&lt;p&gt;Note: If your configuration doesn&amp;rsquo;t take effect, check if your &lt;code&gt;baseUrl&lt;/code&gt; is configured correctly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;compilerOptions&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;baseUrl&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;./src/&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;paths&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;@app/*&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;app/*&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;@services/*&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;app/services/*&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="before-configuration"&gt;Before Configuration&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Api&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;../../../../../services/api.service&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;xxx&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;../../../../../services/api.xxx&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="after-configuration"&gt;After Configuration&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Api&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@services/api.service&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;xxx&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@services/api.xxx&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Some development tips, hope this helps you.&lt;/p&gt;</description></item><item><title>TypeScript's Blessing: JSON To Interface</title><link>https://time-friend.com/en/archive/json-to-interface/</link><pubDate>Tue, 25 Dec 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/json-to-interface/</guid><description>&lt;p&gt;When using TypeScript, we need to write a lot of Interfaces.&lt;/p&gt;
&lt;p&gt;But a JSON data object often has too many fields. Writing them one by one takes a lot of time.&lt;/p&gt;
&lt;p&gt;When promoting TypeScript within a team, usage issues often create obstacles, and it&amp;rsquo;s not uncommon to eventually abandon it.&lt;/p&gt;
&lt;p&gt;Today I recommend this plugin, hope it helps you.&lt;/p&gt;
&lt;h1 id="json-to-ts-plugin"&gt;JSON to TS Plugin&lt;/h1&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ext install json-to-ts
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="copy-to-clipboard-then-run-shortcut-ctrl--alt--v"&gt;Copy to clipboard then run shortcut (Ctrl + Alt + V)&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://github.com/MariusAlch/vscode-json-to-ts/raw/master/./images/clipboard.gif" alt=""&gt;&lt;/p&gt;</description></item><item><title>Centos7 How to Use yum to Upgrade Git to Latest Version</title><link>https://time-friend.com/en/archive/centos7-upgrade-git-with-yum/</link><pubDate>Mon, 24 Dec 2018 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/centos7-upgrade-git-with-yum/</guid><description>&lt;h1 id="yum-upgrade-cannot-upgrade-git-to-latest-version"&gt;yum upgrade Cannot Upgrade Git to Latest Version&lt;/h1&gt;
&lt;p&gt;In CentOS7, the default git version is 1.8.x&lt;/p&gt;
&lt;h2 id="check-local-git-version"&gt;Check Local Git Version&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git version 1.8.3.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want to use yum to upgrade to 2.0+ version&lt;/p&gt;
&lt;h2 id="direct-yum-upgrade-wont-upgrade-to-latest-version"&gt;Direct yum Upgrade Won&amp;rsquo;t Upgrade to Latest Version&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum -y upgrade git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git version 1.8.3.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But I don&amp;rsquo;t want to download source package, compile on local machine and export environment variables that way.
Still too troublesome.&lt;/p&gt;</description></item><item><title>Recommended: An Angular Electron Project Template Ready to Use</title><link>https://time-friend.com/en/archive/angular-electron-template/</link><pubDate>Thu, 20 Dec 2018 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/angular-electron-template/</guid><description>&lt;p&gt;The official Angular website does provide an official Angular template for Electron.
But the version is 2.0, which is really too old. I doubt anyone will maintain it anymore.
Yet it&amp;rsquo;s still listed on the official site.
This misleads many beginners — at least it made me think there wasn&amp;rsquo;t a newer, usable Electron template for quickly creating projects.&lt;/p&gt;
&lt;h1 id="angular-electron"&gt;Angular-electron&lt;/h1&gt;
&lt;p&gt;Here I recommend a highly complete template that&amp;rsquo;s ready to use out of the box:&lt;/p&gt;</description></item><item><title>Angular 7 + Electron Main Process and Renderer Process Communication</title><link>https://time-friend.com/en/archive/angular-electron-ipc/</link><pubDate>Wed, 19 Dec 2018 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/angular-electron-ipc/</guid><description>&lt;h1 id="process-types-in-electron"&gt;Process Types in Electron&lt;/h1&gt;
&lt;p&gt;In Electron, there are two types of processes: the &lt;code&gt;main process&lt;/code&gt; and the &lt;code&gt;renderer process&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;renderer process&lt;/code&gt; can be understood as the view layer — the process that displays pages, which we&amp;rsquo;re very familiar with.
Here you can use Node.js API capabilities as well as perform browser operations we&amp;rsquo;re already used to.
But when you need to invoke operations that only the main process can handle, you need a communication mechanism to tell the main process what you want to do.&lt;/p&gt;</description></item><item><title>Building an Angular 7 + Electron Desktop App from Scratch</title><link>https://time-friend.com/en/archive/angular7-electron-setup/</link><pubDate>Tue, 18 Dec 2018 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/angular7-electron-setup/</guid><description>&lt;h1 id="what-is-electron"&gt;What is Electron?&lt;/h1&gt;
&lt;p&gt;Electron is a library for building desktop applications with JavaScript, HTML, and CSS. These applications can be packaged to run on Mac, Windows, and Linux, and can also be published to the Mac and Windows App Stores.
This means that as long as you have front-end development skills, you can easily build cross-platform desktop applications.&lt;/p&gt;
&lt;h2 id="electrons-main-process-and-renderer-process"&gt;Electron&amp;rsquo;s Main Process and Renderer Process&lt;/h2&gt;
&lt;p&gt;Electron has two types of processes: the main process and the renderer process. Some modules can only run on one or the other, while others have no restrictions. The main process acts more as a behind-the-scenes role, while renderer processes are the individual windows of the application.&lt;/p&gt;</description></item><item><title>2018 Last Frontend Sharing (Slides Provided)</title><link>https://time-friend.com/en/archive/2018-last-frontend-sharing-with-slides/</link><pubDate>Thu, 13 Dec 2018 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/2018-last-frontend-sharing-with-slides/</guid><description>&lt;script src='https://time-friend.com/js/lazyload.js'&gt;&lt;/script&gt;
&lt;script&gt;
 $(function(){
 let str = ""
 for(var i = 2;i&lt;=81;i++){
 var count ="";
 if(i&lt;10){
 count = "00"+ i;
 }else if(i&lt;100&amp;&amp;i&gt;=10){
 count = "0"+ i;
 }
 
 str = str + '&lt;img class="lazyload" data-src="https://static.alili.tech/images/slides/vueConfSlides/vueConfSlides.'+ count +'.jpeg" style="margin-bottom:10px" src="https://time-friend.com/images/squares.svg" /&gt;'
 }
 $('.imageBox').html(str)
 var images = document.querySelectorAll(".lazyload");
 lazyload(images);
 })
&lt;/script&gt;
&lt;div class='imageBox'&gt;&lt;/div&gt;</description></item><item><title>Improving Code Review Efficiency with Husky</title><link>https://time-friend.com/en/archive/husky-code-review/</link><pubDate>Tue, 04 Dec 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/husky-code-review/</guid><description>&lt;p&gt;During code review, code style is one of the review criteria. Reviewing code style involves a certain amount of work.&lt;/p&gt;
&lt;p&gt;To reduce the workload of code review, why not standardize code style before committing?&lt;/p&gt;
&lt;p&gt;This way we can save a lot of time during code review and spend it on more meaningful things.&lt;/p&gt;
&lt;h1 id="git-hooks"&gt;Git Hooks&lt;/h1&gt;
&lt;p&gt;Git provides hooks — mechanisms to trigger other programs when operations like &lt;code&gt;code commit&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;, etc. occur.&lt;/p&gt;</description></item><item><title>Three Keys to Maintaining Code Review Habits in Your Team</title><link>https://time-friend.com/en/archive/code-review-habits/</link><pubDate>Fri, 30 Nov 2018 14:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/code-review-habits/</guid><description>&lt;p&gt;We&amp;rsquo;ve talked about code review before. Maintaining a code review habit in a team is quite difficult.
We need proper processes, tools, and institutional support to ensure the efficiency and quality of our code reviews.&lt;/p&gt;
&lt;h1 id="process-support-gitflow"&gt;Process Support: Gitflow&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;ve introduced the Gitflow workflow before.&lt;/p&gt;
&lt;p&gt;It roughly goes like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers create a dedicated branch in the local repository to develop features.&lt;/li&gt;
&lt;li&gt;Developers push branch changes to the public Git repository.&lt;/li&gt;
&lt;li&gt;Developers initiate a Merge Request through Git.&lt;/li&gt;
&lt;li&gt;Other team members review the code, discuss, and make changes.&lt;/li&gt;
&lt;li&gt;The project maintainer merges the feature into the official repository and closes the Merge Request.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="tool-support"&gt;Tool Support&lt;/h1&gt;
&lt;h2 id="enforce-eslint"&gt;Enforce ESLint&lt;/h2&gt;
&lt;p&gt;Use ESLint strictly. Before code is committed, use tools like husky to enforce ESLint checks.
Ensure that all submitted code passes ESLint first.&lt;/p&gt;</description></item><item><title>cheeriojs Chinese Parsed to Unicode Issue When Loading HTML</title><link>https://time-friend.com/en/archive/cheeriojs-chinese-parsed-to-unicode-issue/</link><pubDate>Thu, 29 Nov 2018 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/cheeriojs-chinese-parsed-to-unicode-issue/</guid><description>&lt;h2 id="cheeriojs-parsing-chinese-to-unicode-issue"&gt;cheeriojs Parsing Chinese to Unicode Issue&lt;/h2&gt;
&lt;p&gt;When using &lt;code&gt;cheeriojs&lt;/code&gt;, I found that whenever using the &lt;code&gt;html&lt;/code&gt; method, Chinese will be parsed to unicode by default.&lt;/p&gt;
&lt;p&gt;Usage is as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cheerio&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;cheerio&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cheerio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;load&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;title&amp;gt;我是中文,我将会被解析成unicode&amp;lt;/title&amp;gt;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;$&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;html&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When using the &lt;code&gt;text&lt;/code&gt; method, the above problem doesn&amp;rsquo;t occur&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cheerio&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;cheerio&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cheerio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;load&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;title&amp;gt;我是中文,我将会被解析成unicode&amp;lt;/title&amp;gt;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;$&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;h3 id="default-configuration"&gt;Default Configuration&lt;/h3&gt;
&lt;p&gt;When we load html content, &lt;code&gt;cheerio&lt;/code&gt; actually has default configuration.
HTML parsing uses the &lt;code&gt;htmlparser2&lt;/code&gt; library, so &lt;code&gt;htmlparser2&lt;/code&gt; configuration is also applicable in cheerio.&lt;/p&gt;</description></item><item><title>Declarative vs Imperative Programming from a Front-End Perspective</title><link>https://time-friend.com/en/archive/declarative-vs-imperative-programming/</link><pubDate>Mon, 26 Nov 2018 11:46:35 +0000</pubDate><guid>https://time-friend.com/en/archive/declarative-vs-imperative-programming/</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Declarative Programming: Tell the &amp;ldquo;machine&amp;rdquo; what you want (what), and let the machine figure out how to do it (how).&lt;/li&gt;
&lt;li&gt;Imperative Programming: Command the &amp;ldquo;machine&amp;rdquo; how to do things (how), so no matter what you want (what), it will follow your commands.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How do we explain these two concepts?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s use these two ideas and explain both programming paradigms with the technologies we are most familiar with.&lt;/p&gt;
&lt;h1 id="declarative-programming"&gt;Declarative Programming&lt;/h1&gt;
&lt;p&gt;Tell the &amp;ldquo;machine&amp;rdquo; what you want (what), and let the machine figure out how to do it (how).&lt;/p&gt;</description></item><item><title>Angular Template Safe Navigation Operator ( ?. )</title><link>https://time-friend.com/en/archive/angular-safe-navigation-operator/</link><pubDate>Sun, 25 Nov 2018 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/angular-safe-navigation-operator/</guid><description>&lt;p&gt;This is very practical and frequently used operator in Angular development.
React and Vue don&amp;rsquo;t have this feature natively.&lt;/p&gt;
&lt;h1 id="safe-navigation-operator---"&gt;Safe Navigation Operator ( ?. )&lt;/h1&gt;
&lt;p&gt;In our daily development, when accessing property paths.&lt;/p&gt;
&lt;p&gt;If for some reason the path contains &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt;, and we continue to access properties, the entire program will crash, preventing the program from continuing to run.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;{ &lt;span style="color:#75715e"&gt;// Sometimes, this property might not exist
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;d&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Normal access
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#75715e"&gt;// If this property sometimes doesn&amp;#39;t exist, accessing it will only return undefined, won&amp;#39;t cause an error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt; &lt;span style="color:#75715e"&gt;// When property b doesn&amp;#39;t exist, accessing properties on undefined will definitely cause the program to crash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Safe navigation solves the above problem. We just need to change the &lt;code&gt;.&lt;/code&gt; before uncertain properties to &lt;code&gt;?.&lt;/code&gt; to avoid errors. When no value is found, it will default to empty.&lt;/p&gt;</description></item><item><title>Automated Deployment of Hugo, Hexo Blog with Travis CI</title><link>https://time-friend.com/en/archive/automated-deployment-hugo-hexo-blog-with-travis-ci/</link><pubDate>Tue, 20 Nov 2018 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/automated-deployment-hugo-hexo-blog-with-travis-ci/</guid><description>&lt;h1 id="what-is-travis-ci"&gt;What is Travis CI?&lt;/h1&gt;
&lt;p&gt;Travis CI is an online hosted CI service. Using Travis for continuous integration doesn&amp;rsquo;t require setting up your own server. Most importantly, it&amp;rsquo;s free for open source projects.
If company uses gitlab, it also provides corresponding continuous integration services. Won&amp;rsquo;t elaborate here.&lt;/p&gt;
&lt;h1 id="travis-ci-configuration-file"&gt;Travis CI Configuration File&lt;/h1&gt;
&lt;p&gt;Travis requires project root directory must have a &lt;code&gt;.travis.yml&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;When your repository has commits, travis will automatically execute the behaviors you configured below.&lt;/p&gt;</description></item><item><title>Make Your Hugo Blog Support ECharts Charts</title><link>https://time-friend.com/en/archive/make-your-hugo-blog-support-echarts-charts/</link><pubDate>Mon, 19 Nov 2018 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/make-your-hugo-blog-support-echarts-charts/</guid><description>&lt;p&gt;In previously hexo built blog, had used charts, but now after migrating to hugo, there&amp;rsquo;s no related plugin support.&lt;/p&gt;
&lt;p&gt;So do it yourself, be self-sufficient.&lt;/p&gt;
&lt;p&gt;In hugo there&amp;rsquo;s a feature called &lt;code&gt;Shortcodes&lt;/code&gt;. Simply put it&amp;rsquo;s a small template that can pass parameters.&lt;/p&gt;
&lt;h1 id="create-shortcodes"&gt;Create Shortcodes&lt;/h1&gt;
&lt;p&gt;Create &lt;code&gt;./layouts/Shortcodes/echarts.html&lt;/code&gt; file&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;echarts{{ .Get `height` }}&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width: 100%;height: {{.Get `height`}}px;margin: 0 auto&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://cdn.bootcss.com/echarts/3.8.0/echarts.common.min.js&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Based on prepared dom, initialize echarts instance
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;myChart&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;echarts&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;init&lt;/span&gt;(document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;echarts{{ .Get `height` }}&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Specify chart configuration items and data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;option&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parse&lt;/span&gt;({{ .&lt;span style="color:#a6e22e"&gt;Inner&lt;/span&gt; }})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Use just specified configuration items and data to display chart.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;myChart&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setOption&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;option&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="usage"&gt;Usage&lt;/h1&gt;
&lt;p&gt;Insert echarts configuration data in Shortcodes, this way you can see a complete chart in the page&lt;/p&gt;</description></item><item><title>Hugo Blog Articles Not Displaying After Specified Time?</title><link>https://time-friend.com/en/archive/hugo-articles-not-displaying/</link><pubDate>Sun, 18 Nov 2018 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/hugo-articles-not-displaying/</guid><description>&lt;p&gt;Since switching the blog to Hugo, encountered some pitfalls.&lt;/p&gt;
&lt;p&gt;Articles correctly added, page time adjusted to today, or after today, but cannot display in article list.&lt;/p&gt;
&lt;p&gt;The reason is that when Hugo templates loop through files, articles exceeding the current time won&amp;rsquo;t appear.&lt;/p&gt;
&lt;h2 id="timezone-issue"&gt;Timezone Issue&lt;/h2&gt;
&lt;p&gt;If your article time doesn&amp;rsquo;t specify a timezone.&lt;/p&gt;
&lt;p&gt;Like this &lt;code&gt;2018-11-19 16:14:25&lt;/code&gt;, the article likely won&amp;rsquo;t display.&lt;/p&gt;
&lt;p&gt;Hugo time is unified to Greenwich Mean Time, because China&amp;rsquo;s time is 8 hours earlier than Greenwich Mean Time.
When Greenwich Mean Time hasn&amp;rsquo;t reached your configured time, articles won&amp;rsquo;t appear in the article list.&lt;/p&gt;</description></item><item><title>Hugo Platform Articles Not Displaying After Specified Time?</title><link>https://time-friend.com/en/archive/hugo-articles-not-displaying-after-specified-time/</link><pubDate>Sun, 18 Nov 2018 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/hugo-articles-not-displaying-after-specified-time/</guid><description>&lt;p&gt;Since blog switched to Hugo, encountered some pitfalls.&lt;/p&gt;
&lt;p&gt;Clearly correctly added articles, page time adjusted to today, or after today but cannot display in article list.&lt;/p&gt;
&lt;p&gt;Reason is Hugo template when looping through files, articles exceeding current time won&amp;rsquo;t appear.&lt;/p&gt;
&lt;h2 id="timezone-issue"&gt;Timezone Issue&lt;/h2&gt;
&lt;p&gt;If your article time doesn&amp;rsquo;t specify timezone.&lt;/p&gt;
&lt;p&gt;Like this &lt;code&gt;2018-11-19 16:14:25&lt;/code&gt;, article likely won&amp;rsquo;t display.&lt;/p&gt;
&lt;p&gt;Hugo time is unified to Greenwich Mean Time, because China&amp;rsquo;s time is 8 hours earlier than Greenwich Mean Time.
When Greenwich Mean Time hasn&amp;rsquo;t reached your configured time, articles won&amp;rsquo;t appear in article list.&lt;/p&gt;</description></item><item><title>Hugo Blog Baidu SEO Ultimate Optimization, Baidu Xiongzhang Auto Push</title><link>https://time-friend.com/en/archive/hugo-template-seo-optimization/</link><pubDate>Sat, 17 Nov 2018 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/hugo-template-seo-optimization/</guid><description>&lt;p&gt;After switching to Hugo platform, the headache is that many SEO plugins from Hexo can&amp;rsquo;t be used.
Below I&amp;rsquo;ll share my SEO optimization solution.&lt;/p&gt;
&lt;h1 id="meta-tag-optimization"&gt;Meta Tag Optimization&lt;/h1&gt;
&lt;h2 id="description"&gt;Description&lt;/h2&gt;
&lt;p&gt;meta description, considered the most useful meta tag, is the website&amp;rsquo;s introduction information.
Content should be controlled within 100 characters.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;itemprop&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;{{ if .Description }}{{ .Description }}{{ else }}{{if .IsPage}}{{substr .Summary 0 100}}{{ end }}{{ end }}&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="keywords"&gt;Keywords&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{ if .Keywords }} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;{{ delimit .Keywords &amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;,&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;}}&amp;#34;&lt;/span&gt; &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{else}}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;{{ delimit .Site.Params.Keywords &amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;,&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;}}&amp;#34;&lt;/span&gt; &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="baidu-xiongzhang-push"&gt;Baidu Xiongzhang Push&lt;/h1&gt;
&lt;p&gt;Speaking of SEO, Xiongzhang is essential, it can achieve indexing within 24 hours. So this must not be missed.&lt;/p&gt;</description></item><item><title>Basic Usage of Hugo Blog Building Tool</title><link>https://time-friend.com/en/archive/basic-usage-of-hugo-blog-building-tool/</link><pubDate>Thu, 15 Nov 2018 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/basic-usage-of-hugo-blog-building-tool/</guid><description>&lt;p&gt;Finally migrated blog to &lt;code&gt;Hugo&lt;/code&gt;, initially most worried was this theme didn&amp;rsquo;t exist on &lt;code&gt;Hugo&lt;/code&gt; platform.
But got excited, spent two or three days. This theme. Completely migrated to &lt;code&gt;Hugo&lt;/code&gt; platform.
Next I&amp;rsquo;ll introduce &lt;code&gt;Hugo&lt;/code&gt; usage and pitfalls encountered, and solutions.&lt;/p&gt;
&lt;h1 id="hugo-performance"&gt;Hugo Performance&lt;/h1&gt;
&lt;p&gt;Precisely because hexo&amp;rsquo;s performance couldn&amp;rsquo;t satisfy, extremely unstable when generating static files. And time is relatively longer.
With same page count, processing speed hugo is 20 times or more than hexo. This is why I switched to Hugo.&lt;/p&gt;</description></item><item><title>Hexo Process Out of Memory Issue</title><link>https://time-friend.com/en/archive/hexo-process-out-of-memory/</link><pubDate>Tue, 13 Nov 2018 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/hexo-process-out-of-memory/</guid><description>&lt;h2 id="hexo-memory-overflow-issue"&gt;Hexo Memory Overflow Issue&lt;/h2&gt;
&lt;p&gt;When Hexo generates around 1000 articles, this issue may occur.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="solution"&gt;Solution:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Find hexo command location&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;which hexo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the first line of the hexo command&amp;rsquo;s bin file to the following content.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env node --max_old_space_size=8192
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This temporarily solves the memory overflow issue.&lt;/p&gt;
&lt;h2 id="hexo-performance"&gt;Hexo Performance&lt;/h2&gt;
&lt;p&gt;Hexo&amp;rsquo;s performance is indeed much worse than Hugo. For the same 1000+ pages, Hugo only took less than 2s.
This makes me hesitate whether to abandon using Hexo.&lt;/p&gt;</description></item><item><title>Code Review Tool Recommendations and Usage Report</title><link>https://time-friend.com/en/archive/code-review-tools/</link><pubDate>Mon, 12 Nov 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/code-review-tools/</guid><description>&lt;p&gt;As teams grow, unifying coding standards and improving code quality becomes increasingly important. Code review, as one of the effective ways to improve code quality, is worth implementing within the company.
Help the team develop a code review habit, improve code quality, and avoid unnecessary problems in advance.&lt;/p&gt;
&lt;p&gt;For more efficient code review, a code review tool is needed. Hence this usage report.&lt;/p&gt;
&lt;p&gt;Below are some tools I&amp;rsquo;ve tried, along with evaluations and summaries.&lt;/p&gt;</description></item><item><title>How Code Review Helps Teams Improve Code Quality</title><link>https://time-friend.com/en/archive/code-review-quality/</link><pubDate>Thu, 08 Nov 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/code-review-quality/</guid><description>&lt;h1 id="code-review-solutions"&gt;Code Review Solutions&lt;/h1&gt;
&lt;p&gt;Recently, I&amp;rsquo;ve been promoting code review in my company.
After several days of research, I&amp;rsquo;ve compiled some problems and solutions.&lt;/p&gt;
&lt;h2 id="current-problems"&gt;Current Problems&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No good tool for convenient code review&lt;/li&gt;
&lt;li&gt;No good code standards for code review&lt;/li&gt;
&lt;li&gt;No enforced process for code review&lt;/li&gt;
&lt;li&gt;No dedicated person responsible for code review&lt;/li&gt;
&lt;li&gt;Tracking changes after code review&lt;/li&gt;
&lt;li&gt;Incentive mechanism for reviewers and fixers&lt;/li&gt;
&lt;li&gt;Cross-team resource allocation can lead to excessive code&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="solutions"&gt;Solutions&lt;/h1&gt;
&lt;h2 id="integrate-merge-request-workflow"&gt;Integrate Merge Request Workflow&lt;/h2&gt;
&lt;p&gt;To do code review on GitLab, we need to add Merge Request to our existing Git workflow.&lt;/p&gt;</description></item><item><title>Mac 10.14 Mojave Upgrade Accessibility Blank Cannot Add Issue</title><link>https://time-friend.com/en/archive/mac-10-14-mojave-accessibility-blank-cannot-add-issue/</link><pubDate>Sun, 04 Nov 2018 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/mac-10-14-mojave-accessibility-blank-cannot-add-issue/</guid><description>&lt;p&gt;Recently after system upgrade to Mac mojave 10.14, found Accessibility in Security &amp;amp; Privacy is blank, and Apps cannot be added no matter what.
My macbook pro is normal, but my mac mini has this problem. Very headache.&lt;/p&gt;
&lt;h1 id="problem-cause"&gt;Problem Cause&lt;/h1&gt;
&lt;p&gt;Should be upgrade caused &lt;code&gt;/Library/Application\ Support/com.apple.TCC&lt;/code&gt; corruption or permission exception, causing problems.&lt;/p&gt;
&lt;h1 id="solution"&gt;Solution&lt;/h1&gt;
&lt;p&gt;Execute the following two commands then restart system, can return to normal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chmod &lt;span style="color:#ae81ff"&gt;777&lt;/span&gt; /Library/Application&lt;span style="color:#ae81ff"&gt;\ &lt;/span&gt;Support/com.apple.TCC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /Library/Application&lt;span style="color:#ae81ff"&gt;\ &lt;/span&gt;Support/com.apple.TCC/TCC.db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Restart system&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>November 2018 China Browser Statistics</title><link>https://time-friend.com/en/archive/2018-11-browser-statistics/</link><pubDate>Thu, 01 Nov 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/2018-11-browser-statistics/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Data from CNZZ&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Browser&lt;/th&gt;
					&lt;th&gt;Market Share&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Chrome&lt;/td&gt;
					&lt;td&gt;55.01%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;QQ Browser&lt;/td&gt;
					&lt;td&gt;21.23%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Safari&lt;/td&gt;
					&lt;td&gt;8.67%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;360 Browser&lt;/td&gt;
					&lt;td&gt;5.42%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sogou Browser&lt;/td&gt;
					&lt;td&gt;3.08%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UC Browser&lt;/td&gt;
					&lt;td&gt;1.95%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Firefox&lt;/td&gt;
					&lt;td&gt;1.82%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Others&lt;/td&gt;
					&lt;td&gt;2.82%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Building Your Single-SPA Micro Frontend App with Webpack &amp; SystemJS</title><link>https://time-friend.com/en/archive/single-spa-webpack-systemjs/</link><pubDate>Wed, 31 Oct 2018 01:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/single-spa-webpack-systemjs/</guid><description>&lt;p&gt;Here is an introduction to using micro frontend applications built with Single-SPA in various popular build tools.&lt;/p&gt;
&lt;h1 id="webpack-2"&gt;Webpack 2+&lt;/h1&gt;
&lt;p&gt;Webpack 2+ supports &lt;code&gt;import()&lt;/code&gt; for code splitting. Webpack 2+ is already widely used in other projects, so I won&amp;rsquo;t go into too much detail here.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;registerApplication&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;single-spa&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;registerApplication&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;app-name&amp;#39;&lt;/span&gt;, () =&amp;gt; &lt;span style="color:#66d9ef"&gt;import&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;./my-app.js&amp;#39;&lt;/span&gt;), &lt;span style="color:#a6e22e"&gt;activeWhen&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;activeWhen&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; window.&lt;span style="color:#a6e22e"&gt;location&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pathname&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;indexOf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/my-app&amp;#39;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="systemjs"&gt;SystemJS&lt;/h1&gt;
&lt;p&gt;In our previous projects, we used SystemJS because it facilitates secondary builds after application deployment. It&amp;rsquo;s also very convenient to use.&lt;/p&gt;</description></item><item><title>Single-SPA Micro Frontend Demo Collection</title><link>https://time-friend.com/en/archive/single-spa-demo-guide/</link><pubDate>Wed, 31 Oct 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/single-spa-demo-guide/</guid><description>&lt;p&gt;Here are the single-spa micro frontend demos that can be found on GitHub:&lt;/p&gt;
&lt;h2 id="single-spa-examples"&gt;&lt;a href="https://github.com/CanopyTax/single-spa-examples"&gt;single-spa-examples&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the official single-spa example. Here is the &lt;a href="http://single-spa.surge.sh"&gt;online demo&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="simple-single-spa-webpack-example"&gt;&lt;a href="https://github.com/joeldenning/simple-single-spa-webpack-example"&gt;simple-single-spa-webpack-example&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is a usage example built with webpack. The webpack version might be a bit old, but the concept is the same.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="single-spa-angular-cli-examples"&gt;&lt;a href="https://github.com/PlaceMe-SAS/single-spa-angular-cli-examples"&gt;single-spa-angular-cli-examples&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An Angular example based on angular-cli, suitable for Angular 2.0+ versions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="single-spa-es5-angularjs"&gt;&lt;a href="https://github.com/joeldenning/single-spa-es5-angularjs"&gt;single-spa-es5-angularjs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An AngularJS example, i.e., AngularJS 1.x version.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="single-spa-portal-example"&gt;&lt;a href="https://github.com/me-12/single-spa-portal-example"&gt;single-spa-portal-example&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is already a very complete multi-tech-stack use case, integrating multiple tech stacks with inter-module communication ideas. Very worth studying.&lt;/p&gt;</description></item><item><title>Git Delete All Commit History Solution</title><link>https://time-friend.com/en/archive/git-delete-all-commits-solution/</link><pubDate>Tue, 30 Oct 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/git-delete-all-commits-solution/</guid><description>&lt;p&gt;If your previous project committed some sensitive data, or you want to clear previous commit history, here&amp;rsquo;s the solution.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. Check out a new branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout --orphan latest_branch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. Stage all files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add -A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. Commit the staged files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -am &lt;span style="color:#e6db74"&gt;&amp;#34;commit message&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 4. Delete the original branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 5. Rename the current branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -m master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 6. Push your history to the remote repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -f origin master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Make Your Hexo Blog Support Baidu Xiongzhang URL Auto-Push, 24-Hour Baidu Indexing</title><link>https://time-friend.com/en/archive/hexo-baidu-seo/</link><pubDate>Wed, 24 Oct 2018 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/hexo-baidu-seo/</guid><description>&lt;p&gt;Baidu launched Xiongzhanghao (Bear&amp;rsquo;s Paw). To make hexo support Xiongzhang push, I added the Xiongzhang push feature on top of the &lt;code&gt;hexo-baidu-url-submit&lt;/code&gt; plugin.
Articles pushed on the same day will be indexed within 24 hours. With this, Baidu indexing speed is very fast.&lt;/p&gt;
&lt;p&gt;No more waiting forever for Baidu to index your content.&lt;/p&gt;
&lt;h1 id="xiongzhang-support"&gt;Xiongzhang Support&lt;/h1&gt;
&lt;p&gt;Change the content in &lt;code&gt;package.json&lt;/code&gt; to:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; &amp;#34;hexo-baidu-url-submit&amp;#34;: &amp;#34;https://github.com/Num142857/hexo-baidu-url-submit&amp;#34;,
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="baidu_url_submit-configuration"&gt;baidu_url_submit Configuration&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;baidu_url_submit:
 count: 1000 ## Submit the latest link
 host: time-friend.com ## Domain registered on Baidu Webmaster Platform
 token: xxxxx ## Note: this is your secret key, so please don&amp;#39;t publish blog source code in public repositories!
 path: baidu_urls.txt ## Text file address, new links will be saved in this text file
 xz_appid: &amp;#39;xxxxxx&amp;#39; ## Your Xiongzhang appid
 xz_token: &amp;#39;xxxxxx&amp;#39; ## Your Xiongzhang token
 xz_count: 10 ## Select the latest 10 items from all submitted data, this number depends on your Xiongzhang account
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="deploy-configuration"&gt;Deploy Configuration&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;deploy:
- type: baidu_url_submitter # Baidu
- type: baidu_xz_url_submitter # Baidu Xiongzhang
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Node.js Crawler Tips - Download Images or Files with Puppeteer</title><link>https://time-friend.com/en/archive/nodejs-crawler-tips-download-images-or-files-with-puppeteer/</link><pubDate>Tue, 23 Oct 2018 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/nodejs-crawler-tips-download-images-or-files-with-puppeteer/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Some websites&amp;rsquo; images don&amp;rsquo;t allow external links. If we want to download these websites&amp;rsquo; images, Puppeteer is a good solution.
Today I&amp;rsquo;ll introduce a crawler tip to download images or files you want through Puppeteer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="how-to-download-through-puppeteer"&gt;How to Download Through Puppeteer?&lt;/h1&gt;
&lt;p&gt;We need an additional dependency library &lt;code&gt;fs-extra&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Code is very simple, main code can be simplified to two or three lines&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fse&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fs-extra&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// Required dependency library, you can use native fs if you want
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Main code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewSource&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fse&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;outputFile&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`path`&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewSource&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;buffer&lt;/span&gt;()) &lt;span style="color:#75715e"&gt;// Download to path you want
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Nintendo Switch 6.0+ System Menu Localization</title><link>https://time-friend.com/en/archive/nintendo-switch-system-menu-localization/</link><pubDate>Mon, 15 Oct 2018 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/nintendo-switch-system-menu-localization/</guid><description>&lt;h1 id="nintendo-switch-localization-patch"&gt;Nintendo Switch Localization Patch&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Only supports 6.0 and 6.0.1 systems&lt;/li&gt;
&lt;li&gt;Simplified Chinese/Traditional Chinese&lt;/li&gt;
&lt;li&gt;Supports Atmosphere, ReiNX, RajNX, SXOS (TXOS)&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="download-address"&gt;Download Address&lt;/h1&gt;
&lt;h2 id="localization-installer"&gt;Localization Installer&lt;/h2&gt;
&lt;p&gt;Localization Installer: &lt;a href="https://share.weiyun.com/5HNlw1J"&gt;https://share.weiyun.com/5HNlw1J&lt;/a&gt; (Strongly Recommended)&lt;/p&gt;
&lt;h2 id="overwrite-version-use-when-installer-crashes-before-overwriting-must-delete-original-files-cleanly"&gt;Overwrite Version: (Use when installer crashes, before overwriting must delete original files cleanly.)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Simplified Chinese: &lt;a href="https://share.weiyun.com/59MqPxr"&gt;https://share.weiyun.com/59MqPxr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traditional Chinese: &lt;a href="https://share.weiyun.com/52w0vp8"&gt;https://share.weiyun.com/52w0vp8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="reinx-localization-special-version"&gt;ReiNX Localization Special Version:&lt;/h2&gt;
&lt;p&gt;Complete localization support, already fixed DOOM and 2K19 issues
&lt;a href="https://share.weiyun.com/58azYtc"&gt;https://share.weiyun.com/58azYtc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Source code from &lt;a href="https://github.com/Reisyukaku/ReiNX"&gt;https://github.com/Reisyukaku/ReiNX&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="address-overwrite"&gt;Address Overwrite&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Atmosphere overwrite to atmosphere/titles&lt;/li&gt;
&lt;li&gt;ReiNX overwrite to ReiNX/titles&lt;/li&gt;
&lt;li&gt;SXOS overwrite to sxos/titles&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="localization-installer-tutorial"&gt;Localization Installer Tutorial:&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;First, use card reader to insert SD card into computer.&lt;/li&gt;
&lt;li&gt;Open SD card drive.&lt;/li&gt;
&lt;li&gt;Put Nintendo Switch System Localization Patch.exe into card.&lt;/li&gt;
&lt;li&gt;Run Nintendo Switch System Localization Patch.exe&lt;/li&gt;
&lt;li&gt;Follow prompts to select.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="faq"&gt;FAQ&lt;/h1&gt;
&lt;h2 id="does-localization-affect-games"&gt;Does localization affect games?&lt;/h2&gt;
&lt;p&gt;Generally localization causing game crashes is due to text errors, new localization has already fixed most issues. Of course actual effects still need testing.&lt;/p&gt;</description></item><item><title>What's the Difference Between Switch NSP and XCI?</title><link>https://time-friend.com/en/archive/difference-between-switch-nsp-and-xci/</link><pubDate>Sun, 14 Oct 2018 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/difference-between-switch-nsp-and-xci/</guid><description>&lt;p&gt;Recently working on Switch, encountered two game formats during game installation, respectively&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;xci&lt;/li&gt;
&lt;li&gt;nsp&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-the-difference-between-them"&gt;What&amp;rsquo;s the Difference Between Them?&lt;/h2&gt;
&lt;p&gt;In actual use:
xci, throw into memory card can use,
nsp, need to install before can use
Simple understanding is, xci is portable software (correctly should be ISO), nsp is installer software.&lt;/p&gt;
&lt;p&gt;Because xci is equivalent to cartridge, doesn&amp;rsquo;t need installation, needs switching.
nsp is equivalent to digital version, needs installation, after installation can play directly&lt;/p&gt;</description></item><item><title>Nintendo Switch Hack Principle</title><link>https://time-friend.com/en/archive/nintendo-switch-hack-principle/</link><pubDate>Thu, 11 Oct 2018 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/nintendo-switch-hack-principle/</guid><description>&lt;h1 id="nintendo-switch"&gt;Nintendo Switch&lt;/h1&gt;
&lt;p&gt;Nintendo Switch is an electronic game console produced by Nintendo, released in Japan, North America, Europe and Hong Kong on March 3, 2017, and in South Korea and Taiwan on December 1 of the same year. Has detachable controllers and separable host, game media uses proprietary cartridges.
Host processor uses NVIDIA customized Tegra X1 system-on-chip, this is Nintendo&amp;rsquo;s first time using NVIDIA&amp;rsquo;s system-on-chip.
Nintendo Switch host&amp;rsquo;s built-in storage space is 32GB, can be expanded using microSD, maximum supports microSDXC standard, maximum supports 2TB capacity; Host at initial system 1.0.0 can only support up to microSD standard, system 2.0.0 update provided on release day enables support for microSDXC standard.&lt;/p&gt;</description></item><item><title>Develop Your Ethereum Dapp with Eggjs(koa) &amp; web3.js</title><link>https://time-friend.com/en/archive/develop-ethereum-dapp-with-eggjs-koa-web3js/</link><pubDate>Wed, 10 Oct 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/develop-ethereum-dapp-with-eggjs-koa-web3js/</guid><description>&lt;h1 id="eggjs"&gt;Eggjs&lt;/h1&gt;
&lt;p&gt;Eggjs is Alibaba&amp;rsquo;s open source enterprise-level Node.js framework based on Koa2.
eggjs is basically out-of-the-box, follows &amp;ldquo;Convention over Configuration&amp;rdquo;. In daily development, very smooth to use.
And ecosystem is also relatively complete, koa2 plugins can all be integrated into framework.&lt;/p&gt;
&lt;h2 id="eggjs-directory-structure"&gt;Egg.js Directory Structure&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;egg-project
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── package.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── app.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── agent.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── app
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;||&lt;/span&gt; ├── router.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── controller
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ | └── home.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── service &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ | └── user.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── middleware &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ | └── response_time.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── schedule &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ | └── my_task.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── public &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ | └── reset.css
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── view &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ | └── home.tpl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── extend &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── helper.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── request.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── response.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── context.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── application.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── agent.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;||&lt;/span&gt; ├── plugin.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;||&lt;/span&gt; ├── config.default.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── config.prod.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;||&lt;/span&gt; ├── config.test.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;||&lt;/span&gt; ├── config.local.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;||&lt;/span&gt; └── config.unittest.js &lt;span style="color:#f92672"&gt;(&lt;/span&gt;optional&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── middleware
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | └── response_time.test.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── controller
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── home.test.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As above, directories agreed by framework:&lt;/p&gt;</description></item><item><title>October 2018 China Browser Statistics</title><link>https://time-friend.com/en/archive/2018-10-browser-statistics/</link><pubDate>Mon, 01 Oct 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/2018-10-browser-statistics/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Data from CNZZ&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Browser&lt;/th&gt;
					&lt;th&gt;Market Share&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Chrome&lt;/td&gt;
					&lt;td&gt;54.12%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;QQ Browser&lt;/td&gt;
					&lt;td&gt;21.87%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Safari&lt;/td&gt;
					&lt;td&gt;8.43%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;360 Browser&lt;/td&gt;
					&lt;td&gt;5.61%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sogou Browser&lt;/td&gt;
					&lt;td&gt;3.15%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UC Browser&lt;/td&gt;
					&lt;td&gt;2.08%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Firefox&lt;/td&gt;
					&lt;td&gt;1.87%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Others&lt;/td&gt;
					&lt;td&gt;2.87%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Solution for Upsource Startup Failure on Centos7</title><link>https://time-friend.com/en/archive/centos-upsource-fix/</link><pubDate>Sat, 29 Sep 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/centos-upsource-fix/</guid><description>&lt;h2 id="error"&gt;Error&lt;/h2&gt;
&lt;p&gt;When starting Upsource on Centos7, the following error occurred. Starting Upsource on Mac worked fine.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Upsource Error] Failed to start JetBrains Upsource 2018.2 due to unexpected exception: Native random generator does not seem to have enough entropy for JetBrains Upsource 2018.2 to start. [Upsource Error] You can fix it by switching to PRNG (with -Djava.security.egd=/dev/zrandom) or by reconfiguring your operation system to provide more random bits.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Copy &lt;code&gt;upsource.jvmoptions.dist&lt;/code&gt; to &lt;code&gt;upsource.jvmoptions&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp $upsource_path/conf/upsource.jvmoptions.dist $upsource_path/conf/upsource.jvmoptions
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Edit &lt;code&gt;$upsource_path/conf/upsource.jvmoptions&lt;/code&gt; file, add the following line at the end:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-Djava.security.egd=/dev/zrandom
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Start&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$upsource_path/bin/upsource.sh start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Punch a Hole in Your Machine with ngrok - Internal Network Penetration</title><link>https://time-friend.com/en/archive/punch-hole-in-your-machine-with-ngrok-internal-network-penetration/</link><pubDate>Wed, 12 Sep 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/punch-hole-in-your-machine-with-ngrok-internal-network-penetration/</guid><description>&lt;p&gt;I have many personal codes running on home server. Generally all are automated processing of some life problems, data collection and related activities.
So generally no client access to home server needs.
But many times brain suddenly has ideas. Some small ideas, some small bugs or small optimizations, after code modification completes, there&amp;rsquo;s a deployment need.
Because home server doesn&amp;rsquo;t have a stable external network IP, external network cannot directly connect to server.
So we need &lt;code&gt;internal network penetration&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 8 - Secondary Build</title><link>https://time-friend.com/en/archive/micro-frontend-solution-8-secondary-build/</link><pubDate>Fri, 07 Sep 2018 01:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-8-secondary-build/</guid><description>&lt;h1 id="secondary-build"&gt;Secondary Build&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Further optimize our micro frontend performance&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a micro frontend architecture, each module outputs fixed files, such as the previously mentioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project config file&lt;/li&gt;
&lt;li&gt;Store.js file&lt;/li&gt;
&lt;li&gt;main.js render entry file&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;These three are the necessary files for each module in a micro frontend architecture.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the module loader starts the entire project, it must load all modules&amp;rsquo; config files and Store.js files.
In a previous article, we discussed &lt;code&gt;config automation&lt;/code&gt;, which is essentially a simple form of secondary build.
Although each module&amp;rsquo;s config file is not very large, each file is loaded and is necessary for project startup.
Each file takes one HTTP request, and each file&amp;rsquo;s blocking affects the project&amp;rsquo;s startup time.&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 7 - Static Data Sharing</title><link>https://time-friend.com/en/archive/micro-frontend-solution-7-static-data/</link><pubDate>Thu, 06 Sep 2018 01:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-7-static-data/</guid><description>&lt;p&gt;From the previous introductions, I believe you now have a relatively complete understanding of micro frontends.
Below are some tips and handling methods I&amp;rsquo;ve developed during my work.&lt;/p&gt;
&lt;h1 id="dynamic-entry"&gt;Dynamic Entry&lt;/h1&gt;
&lt;p&gt;When a new submodule is mounted to the project, a new entry point in the UI is needed to access the submodule&amp;rsquo;s UI.
Such an entry point needs to be generated dynamically.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.alili.tech/images/micro/base-demo.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;For example: the menu on the left side of the image should not be hardcoded. It should be automatically generated based on the data provided by each module.&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 6 - Build &amp; Deploy</title><link>https://time-friend.com/en/archive/micro-frontend-solution-6-build-deploy/</link><pubDate>Wed, 05 Sep 2018 01:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-6-build-deploy/</guid><description>&lt;h1 id="micro-frontend-build"&gt;Micro Frontend Build&lt;/h1&gt;
&lt;p&gt;There are some things to note when bundling micro frontend projects.
Take webpack as an example:&lt;/p&gt;
&lt;h2 id="amd-modules"&gt;AMD Modules&lt;/h2&gt;
&lt;p&gt;In previous articles, we mentioned that our loader is based on System.js.
So the final bundle of our micro frontend modules must conform to module specifications.
We use the &lt;code&gt;AMD module&lt;/code&gt; specification to build our modules.&lt;/p&gt;
&lt;h2 id="specify-base-path"&gt;Specify Base Path&lt;/h2&gt;
&lt;p&gt;Since the module loader calls the module entry file after bundling,
To clearly manage each module and correctly load all our module resources,
we specify a &lt;code&gt;publicPath&lt;/code&gt; for all module resources.&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 5 - Route Distribution</title><link>https://time-friend.com/en/archive/micro-frontend-solution-5-route-distribution/</link><pubDate>Tue, 04 Sep 2018 01:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-5-route-distribution/</guid><description>&lt;h1 id="route-distributed-micro-frontend"&gt;Route-Distributed Micro Frontend&lt;/h1&gt;
&lt;h2 id="from-application-distributing-routes-to-routes-distributing-applications"&gt;From Application Distributing Routes to Routes Distributing Applications&lt;/h2&gt;
&lt;p&gt;There is no better way to explain micro frontend routing than this sentence.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Route-distributed micro frontend distributes different business functions to different, independent front-end applications through routing. This can usually be achieved through reverse proxy on an HTTP server, or through the routing that comes with the application framework.
Currently, route-distributed micro frontend architecture is probably the most adopted and easiest &amp;ldquo;micro frontend&amp;rdquo; solution. However, this approach looks more like a聚合 of multiple front-end applications, i.e., we just piece together these different front-end applications to make them look like a complete whole. But they are not — every time a user goes from App A to App B, they often need to refresh the page. — Quoted from phodal &lt;a href="https://microfrontend.cn"&gt;The Matters of Micro Frontends&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 4 - Message Bus</title><link>https://time-friend.com/en/archive/micro-frontend-solution-4-message-bus/</link><pubDate>Mon, 03 Sep 2018 01:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-4-message-bus/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The main function of the micro frontend message bus is to bridge communication between modules.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="black-box"&gt;Black Box&lt;/h1&gt;
&lt;h2 id="problem-1"&gt;Problem 1:&lt;/h2&gt;
&lt;p&gt;After applying microservices architecture, each individual module becomes a black box.
What happens inside, what state changes, other modules have no way of knowing.
For example, when &lt;code&gt;Module A&lt;/code&gt; wants to perform an action based on a certain internal state of &lt;code&gt;Module B&lt;/code&gt;, there is no way for black boxes to communicate. This is a major problem.&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 3 - Module Loader</title><link>https://time-friend.com/en/archive/micro-frontend-solution-3-module-loader/</link><pubDate>Mon, 03 Sep 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-3-module-loader/</guid><description>&lt;p&gt;The micro frontend module loader handles three main responsibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loading project configuration files&lt;/li&gt;
&lt;li&gt;Loading module API files (used by the message bus, covered later)&lt;/li&gt;
&lt;li&gt;Loading module entry files&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;These are three essential parts for every module.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="configuration-file"&gt;Configuration File&lt;/h1&gt;
&lt;p&gt;In our micro frontend practice, each module has an external configuration file used when registering with Single-SPA.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/project&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;prefix&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/module-prefix/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/module-prefix/main.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;store&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/module-prefix/store.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;base&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When a module supports multiple URL prefixes, the path can be an array:&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 2 - Single-SPA</title><link>https://time-friend.com/en/archive/micro-frontend-solution-2-single-spa/</link><pubDate>Sun, 02 Sep 2018 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-2-single-spa/</guid><description>&lt;h1 id="technology-selection"&gt;Technology Selection&lt;/h1&gt;
&lt;p&gt;After extensive research, we chose &lt;a href="https://single-spa.js.org/"&gt;Single-SPA&lt;/a&gt; as the foundation for our frontend microservices solution.&lt;/p&gt;
&lt;video style="width:100%" src="https://static.alili.tech/data/video/Single-Spa%20Intro.mp4" controls="controls"&gt;
Your browser does not support video.
&lt;/video&gt;
&lt;h1 id="single-spa"&gt;Single-SPA&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;A JavaScript frontend solution for frontend microservices&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With Single-SPA, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use multiple frameworks (React, Vue, AngularJS, Angular, Ember, etc.) on the same page without refreshing.&lt;/li&gt;
&lt;li&gt;Write new code with modern frameworks without refactoring existing code.&lt;/li&gt;
&lt;li&gt;Load each module on demand for better performance.&lt;/li&gt;
&lt;li&gt;Run each independent module separately.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Demo: &lt;a href="https://single-spa.surge.sh/"&gt;https://single-spa.surge.sh/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Micro Frontend Solution 1 - Thinking</title><link>https://time-friend.com/en/archive/micro-frontend-solution-1-thinking/</link><pubDate>Sat, 01 Sep 2018 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/micro-frontend-solution-1-thinking/</guid><description>&lt;blockquote&gt;
&lt;p&gt;In recent years, microservices architecture has become hugely popular in the backend development community, considered the future direction of IT software architecture. How can we apply the principles of backend microservices to build modern frontend applications?
Here I provide a frontend microservices solution that can actually be implemented in production.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://user-gold-cdn.xitu.io/2017/12/27/16098869b848027e?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt=""&gt;&lt;/p&gt;
&lt;h1 id="comparison-of-backend-and-frontend-microservices"&gt;Comparison of Backend and Frontend Microservices&lt;/h1&gt;
&lt;h2 id="advantages-of-backend-microservices"&gt;Advantages of Backend Microservices:&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Controlled Complexity&lt;/strong&gt;: Small size, low complexity. Each microservice can be fully managed by a small development team, making it easy to maintain high maintainability and development efficiency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent Deployment&lt;/strong&gt;: Since microservices run in separate processes, each can be deployed independently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible Technology Choices&lt;/strong&gt;: In a microservices architecture, technology selection is decentralized. Each team can freely choose the most suitable tech stack based on their service needs and industry trends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fault Isolation&lt;/strong&gt;: When a component fails, in a single-process traditional architecture, the fault is likely to spread within the process, causing global unavailability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Monolithic applications can also scale horizontally, but it requires replicating the entire application to different nodes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="advantages-of-frontend-microservices"&gt;Advantages of Frontend Microservices:&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Controlled Complexity&lt;/strong&gt;: Each UI business module is developed by an independent frontend team, preventing code bloat, maintaining fast compilation during development, and keeping complexity low for easy maintenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent Deployment&lt;/strong&gt;: Each module can be deployed independently, down to a single component&amp;rsquo;s UI, without affecting other modules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible Technology Choices&lt;/strong&gt;: The most attractive advantage — you can use any frontend tech stack available today, including future ones, within the same project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fault Isolation&lt;/strong&gt;: A single module failure does not affect the entire application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Each service can be independently scaled horizontally to meet business needs without unnecessary resource consumption.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="when-do-we-need-frontend-microservices"&gt;When Do We Need Frontend Microservices?&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;The project&amp;rsquo;s tech stack is outdated, developers with relevant skills are scarce, feature expansion is difficult, and refactoring or maintenance costs are high.&lt;/li&gt;
&lt;li&gt;The project is too large, code compilation is slow, the development experience is poor, and a higher-level decoupling solution is needed.&lt;/li&gt;
&lt;li&gt;A single tech stack cannot meet your business requirements.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="problems-and-challenges"&gt;Problems and Challenges&lt;/h1&gt;
&lt;p&gt;We will face the following issues:&lt;/p&gt;</description></item><item><title>September 2018 China Browser Statistics</title><link>https://time-friend.com/en/archive/2018-09-browser-statistics/</link><pubDate>Sat, 01 Sep 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/2018-09-browser-statistics/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Data from CNZZ&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Browser&lt;/th&gt;
					&lt;th&gt;Market Share&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Chrome&lt;/td&gt;
					&lt;td&gt;53.42%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;QQ Browser&lt;/td&gt;
					&lt;td&gt;22.51%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Safari&lt;/td&gt;
					&lt;td&gt;8.15%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;360 Browser&lt;/td&gt;
					&lt;td&gt;5.83%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sogou Browser&lt;/td&gt;
					&lt;td&gt;3.27%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UC Browser&lt;/td&gt;
					&lt;td&gt;2.16%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Firefox&lt;/td&gt;
					&lt;td&gt;1.98%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Others&lt;/td&gt;
					&lt;td&gt;2.68%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Network Notes - Network Protocols and Network Layering</title><link>https://time-friend.com/en/archive/network-notes-network-protocols-and-network-layering/</link><pubDate>Thu, 30 Aug 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/network-notes-network-protocols-and-network-layering/</guid><description>&lt;p&gt;The Bible has a Tower of Babel story, God to prevent humans from uniting, made humans speak different languages. Humans couldn&amp;rsquo;t communicate, couldn&amp;rsquo;t reach &amp;ldquo;agreement&amp;rdquo;, Tower of Babel plan failed.&lt;/p&gt;
&lt;p&gt;A thousand years later, a group of engineers to solve this problem, formulated various protocols and standards, let various devices communicate through protocols, then through internet achieved world interconnection.&lt;/p&gt;
&lt;p&gt;Like the code we write now, using universal programming languages, world is thus connected. Our computer languages are also a kind of protocol.&lt;/p&gt;</description></item><item><title>Linux - CentOS Timezone Setting</title><link>https://time-friend.com/en/archive/linux-centos-timezone-setting/</link><pubDate>Mon, 30 Jul 2018 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/linux-centos-timezone-setting/</guid><description>&lt;h2 id="timedatectl-command"&gt;timedatectl Command&lt;/h2&gt;
&lt;h3 id="check-current-timezone-status"&gt;Check Current Timezone Status&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ timedatectl status
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Local time: Fri 2018-08-31 13:42:42 CST
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Universal time: Fri 2018-08-31 05:42:42 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RTC time: n/a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Time zone: Asia/Shanghai &lt;span style="color:#f92672"&gt;(&lt;/span&gt;CST, +0800&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NTP enabled: n/a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NTP synchronized: yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RTC in local TZ: no
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DST active: n/a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-timezone-to-shanghai"&gt;Set Timezone to Shanghai&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ timedatectl set-timezone Asia/Shanghai &lt;span style="color:#75715e"&gt;# Set system timezone to Shanghai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="other-operations"&gt;Other Operations&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ timedatectl list-timezones &lt;span style="color:#75715e"&gt;# List all timezones&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ timedatectl set-local-rtc &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Adjust hardware clock to match local clock, 0 means set to UTC time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>MongoDB - Using MongoDB in Egg</title><link>https://time-friend.com/en/archive/mongodb-in-eggjs/</link><pubDate>Fri, 18 May 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mongodb-in-eggjs/</guid><description>&lt;p&gt;MongoDB official provides node database operation driver and API: &lt;a href="https://github.com/mongodb/node-mongodb-native"&gt;node-mongodb-native&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In egg community there&amp;rsquo;s also an egg plugin based on this plugin secondary encapsulation &lt;a href="https://github.com/brickyang/egg-mongo-native"&gt;egg-mongo-native&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Made some secondary encapsulation of some methods, can also call original methods.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration&lt;/h2&gt;
&lt;p&gt;Official documentation also has related configuration instructions, but I encountered some problems in actual use.
Below I provide correct configuration method for everyone to use. Other related knowledge please refer to this plugin&amp;rsquo;s official documentation.&lt;/p&gt;</description></item><item><title>MongoDB - Document Basic Operations (Part 2)</title><link>https://time-friend.com/en/archive/mongodb-document-basic-operations-part-2/</link><pubDate>Sun, 13 May 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mongodb-document-basic-operations-part-2/</guid><description>&lt;h2 id="document-update"&gt;Document Update&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Syntax: update(&lt;filter&gt;, &lt;update&gt;, &lt;options&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Update rank field&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;Monster Hunter World Review&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$set: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: 10&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Update entire data to: {&amp;#34;rank&amp;#34;: 99}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;Monster Hunter World Review&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: 99&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Update multiple records multi: true, if false, then update first record found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;it&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$set: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: 60&lt;span style="color:#f92672"&gt;}}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;multi: true&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="document-field-operation-functions"&gt;Document Field Operation Functions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$inc: Increment&lt;/li&gt;
&lt;li&gt;$mul: Multiply&lt;/li&gt;
&lt;li&gt;$rename: Rename&lt;/li&gt;
&lt;li&gt;$set: Add or modify&lt;/li&gt;
&lt;li&gt;$unset: Field delete&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Field value increment, result: field value + 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Monster Hunter World Review&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$inc: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;rank: 1&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Field value multiply operation, result: field value * 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Monster Hunter World Review&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$mul: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;rank: 2&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Field rename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Monster Hunter World Review&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$rename: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;score&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Set or add field&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Monster Hunter World Review&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$set: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;istop&amp;#34;&lt;/span&gt;: true&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Delete istop field&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Monster Hunter World Review&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$unset: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;istop&amp;#34;&lt;/span&gt;: true&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="document-special-updates"&gt;Document Special Updates&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;upsert: Update if exists, append if not&lt;/li&gt;
&lt;li&gt;remove: Conditional delete data&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mongo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Update entire data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Actually Creation is More Fun than Taishi&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Actually Creation is More Fun than Taishi&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;:5,&lt;span style="color:#e6db74"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;game&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Update or add data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.update&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Actually Creation is More Fun than Taishi&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Actually Creation is More Fun than Taishi&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;:5,&lt;span style="color:#e6db74"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;&amp;#34;game&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;upsert:true&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Delete data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.remove&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:&lt;span style="color:#e6db74"&gt;&amp;#34;Actually Creation is More Fun than Taishi&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="index"&gt;Index&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;getIndexes() Get indexes&lt;/li&gt;
&lt;li&gt;createIndex({&amp;hellip;}, {&amp;hellip;}) Add index&lt;/li&gt;
&lt;li&gt;dropIndex({&amp;hellip;}) Delete index&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Get indexes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.getIndexes&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create rank descending index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.createIndex&lt;span style="color:#f92672"&gt;({&lt;/span&gt;rank:-1&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Delete index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.dropIndex&lt;span style="color:#f92672"&gt;({&lt;/span&gt;rank:-1&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create an ascending index, and cannot duplicate, subsequent title duplicates will fail to add&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.createIndex&lt;span style="color:#f92672"&gt;({&lt;/span&gt;title:1&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;unique:true&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>MongoDB - Document Basic Operations (Part 1)</title><link>https://time-friend.com/en/archive/mongodb-document-basic-operations-part-1/</link><pubDate>Sat, 12 May 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mongodb-document-basic-operations-part-1/</guid><description>&lt;h2 id="document-adddelete"&gt;Document Add/Delete&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create collection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.createCollection&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;posts&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Insert one data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.insert&lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... title: &lt;span style="color:#e6db74"&gt;&amp;#34;My First Blog&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... content: &lt;span style="color:#e6db74"&gt;&amp;#34;Started writing blog, so excited.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Insert another data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.insert&lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... title: &lt;span style="color:#e6db74"&gt;&amp;#34;My Second Blog&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... content: &lt;span style="color:#e6db74"&gt;&amp;#34;What should I write?&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... tag: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Uncategorized&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Use js for loop to insert data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;var i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 3; i &amp;lt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;10; i++ &lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... db.posts.insert&lt;span style="color:#f92672"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... title: &lt;span style="color:#e6db74"&gt;&amp;#34;My &amp;#34;&lt;/span&gt; + i + &lt;span style="color:#e6db74"&gt;&amp;#34;th Blog&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# View data count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.count&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Delete all collection data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.remove&lt;span style="color:#f92672"&gt;({})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="document-conditional-query"&gt;Document Conditional Query&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data with tag as game&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;game&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data with rank greater than or equal to 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$gte: 4&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data with rank greater than 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$gt: 4&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data with rank less than or equal to 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$lte: 4&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data with rank less than 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$lt: 4&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Regular expression query&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: /u/&lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Multi-condition query&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: /u/, &lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;:&lt;span style="color:#f92672"&gt;{&lt;/span&gt;$gte:5&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# $or OR condition query&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;$or: &lt;span style="color:#f92672"&gt;[{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: /u/&lt;span style="color:#f92672"&gt;}&lt;/span&gt;, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;:&lt;span style="color:#f92672"&gt;{&lt;/span&gt;$gte:4&lt;span style="color:#f92672"&gt;}}]&lt;/span&gt; &lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# $in contains, query data with rank containing 3,4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$in: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;3,4&lt;span style="color:#f92672"&gt;]}&lt;/span&gt; &lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Check if exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;istop&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$exists: true&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Query data with three tags in article&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.find&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;tag&amp;#39;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;$size: 3&lt;span style="color:#f92672"&gt;}})&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Get all tag types, distinct function is to get non-duplicate values of specified field in collection, return as array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.posts.distinct&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="mongodb-vs-rdbms-where-statement-comparison"&gt;MongoDB vs RDBMS Where Statement Comparison&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Operation&lt;/th&gt;
					&lt;th&gt;Format&lt;/th&gt;
					&lt;th&gt;Example&lt;/th&gt;
					&lt;th&gt;Similar Statement in RDBMS&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Equal&lt;/td&gt;
					&lt;td&gt;{&lt;key&gt;:&lt;value&gt;}&lt;/td&gt;
					&lt;td&gt;db.col.find({&amp;ldquo;by&amp;rdquo;:&amp;ldquo;test&amp;rdquo;}).pretty()&lt;/td&gt;
					&lt;td&gt;where by = &amp;rsquo;test'&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Less than&lt;/td&gt;
					&lt;td&gt;{&lt;key&gt;:{$lt:&amp;lt;value%}}&lt;/td&gt;
					&lt;td&gt;db.col.find({&amp;ldquo;likes&amp;rdquo;:{$lt:50}}).pretty()&lt;/td&gt;
					&lt;td&gt;where likes &amp;lt; 50&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Less than or equal&lt;/td&gt;
					&lt;td&gt;{&lt;key&gt;:{$lte:&amp;lt;value%}}&lt;/td&gt;
					&lt;td&gt;db.col.find({&amp;ldquo;likes&amp;rdquo;:{$lte:50}}).pretty()&lt;/td&gt;
					&lt;td&gt;where likes &amp;lt;= 50&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Greater than&lt;/td&gt;
					&lt;td&gt;{&lt;key&gt;:{$gt:&amp;lt;value%}}&lt;/td&gt;
					&lt;td&gt;db.col.find({&amp;ldquo;likes&amp;rdquo;:{$gt:50}}).pretty()&lt;/td&gt;
					&lt;td&gt;where likes &amp;gt; 50&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Greater than or equal&lt;/td&gt;
					&lt;td&gt;{&lt;key&gt;:{$gte:&amp;lt;value%}}&lt;/td&gt;
					&lt;td&gt;db.col.find({&amp;ldquo;likes&amp;rdquo;:{$gte:50}}).pretty()&lt;/td&gt;
					&lt;td&gt;where likes &amp;gt;= 50&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Not equal&lt;/td&gt;
					&lt;td&gt;{&lt;key&gt;:{$ne:&amp;lt;value%}}&lt;/td&gt;
					&lt;td&gt;db.col.find({&amp;ldquo;likes&amp;rdquo;:{$ne:50}}).pretty()&lt;/td&gt;
					&lt;td&gt;where likes != 50&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="specify-extract-fields"&gt;Specify Extract Fields&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Syntax: db.[collection_name].find({}, {field1: true, field2: 1})&lt;/p&gt;</description></item><item><title>MongoDB - Database and Collection Basic Operations</title><link>https://time-friend.com/en/archive/mongodb-database-and-collection-basic-operations/</link><pubDate>Fri, 11 May 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mongodb-database-and-collection-basic-operations/</guid><description>&lt;h1 id="database-basic-operations"&gt;Database Basic Operations&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Enter command line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mongo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Help&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; help
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; exit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Show all databases&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; show dbs;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Enter or create collection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; use aliliblog;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# View current database status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.stats&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Delete database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.dropDatabase&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="collection-operations"&gt;Collection Operations&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# View collections&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; show collections;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create collection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.createCollection&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Collection rename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.users.renameCollection&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;staff&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;; // users -&amp;gt; staff
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Collection delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; db.staff.drop&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>MongoDB - Basic Concepts and Comparison with Other Databases</title><link>https://time-friend.com/en/archive/mongodb-basic-concepts-and-comparison-with-other-databases/</link><pubDate>Thu, 10 May 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mongodb-basic-concepts-and-comparison-with-other-databases/</guid><description>&lt;h1 id="basic-concepts"&gt;Basic Concepts&lt;/h1&gt;
&lt;h2 id="nosql"&gt;NoSql&lt;/h2&gt;
&lt;p&gt;In NoSql databases, data operations are all completed through commands or programming languages.&lt;/p&gt;
&lt;p&gt;In MongoDB uses JavaScript and JSON data structures to operate and manage data.&lt;/p&gt;
&lt;h2 id="mongodb-database-vs-relational-database-comparison"&gt;MongoDB Database vs Relational Database Comparison&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;MongoDB&lt;/th&gt;
					&lt;th&gt;Relational Database&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Database (Database)&lt;/td&gt;
					&lt;td&gt;Database (Database)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Collection (Collection)&lt;/td&gt;
					&lt;td&gt;Table (Table)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Document (Document)&lt;/td&gt;
					&lt;td&gt;Record (Record)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="mongodb-vs-rdbms-corresponding-terms"&gt;MongoDB vs RDBMS Corresponding Terms&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;MongoDB&lt;/th&gt;
					&lt;th&gt;RDBMS&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Database&lt;/td&gt;
					&lt;td&gt;Database&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Collection&lt;/td&gt;
					&lt;td&gt;Table&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Document&lt;/td&gt;
					&lt;td&gt;Row&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Field&lt;/td&gt;
					&lt;td&gt;Column&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Embedded Document&lt;/td&gt;
					&lt;td&gt;Table Join&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Primary Key (MongoDB provides key as _id )&lt;/td&gt;
					&lt;td&gt;Primary Key&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="mongodb-data-types"&gt;MongoDB Data Types&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Data Type&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;String&lt;/td&gt;
					&lt;td&gt;String. Common data type for storing data. In MongoDB, UTF-8 encoded strings are legal.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Integer&lt;/td&gt;
					&lt;td&gt;Integer value. Used to store numeric values. Depending on server you adopt, can be 32-bit or 64-bit.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Boolean&lt;/td&gt;
					&lt;td&gt;Boolean value. Used to store boolean values (true/false).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Double&lt;/td&gt;
					&lt;td&gt;Double precision floating point value. Used to store floating point values.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Min/Max keys&lt;/td&gt;
					&lt;td&gt;Compare a value with BSON (binary JSON) element&amp;rsquo;s lowest and highest values.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Array&lt;/td&gt;
					&lt;td&gt;Used to store arrays or lists or multiple values as one key.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Timestamp&lt;/td&gt;
					&lt;td&gt;Timestamp. Records document modification or addition specific time.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Object&lt;/td&gt;
					&lt;td&gt;Used for embedded documents.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Null&lt;/td&gt;
					&lt;td&gt;Used to create empty values.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Symbol&lt;/td&gt;
					&lt;td&gt;Symbol. This data type basically equals string type, but difference is, it&amp;rsquo;s generally used for languages using special symbol types.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Date&lt;/td&gt;
					&lt;td&gt;Date time. Uses UNIX time format to store current date or time. You can specify your own date time: create Date object, pass year month day information.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Object ID&lt;/td&gt;
					&lt;td&gt;Object ID. Used to create document&amp;rsquo;s ID.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Binary Data&lt;/td&gt;
					&lt;td&gt;Binary data. Used to store binary data.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Code&lt;/td&gt;
					&lt;td&gt;Code type. Used to store JavaScript code in documents.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Regular expression&lt;/td&gt;
					&lt;td&gt;Regular expression type. Used to store regular expressions.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>MongoDB - Installation and Startup</title><link>https://time-friend.com/en/archive/mongodb-installation-and-startup/</link><pubDate>Wed, 09 May 2018 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mongodb-installation-and-startup/</guid><description>&lt;h1 id="what-is-mongodb"&gt;What is MongoDB?&lt;/h1&gt;
&lt;p&gt;MongoDB is a document-oriented free database, often used for data collection and distributed processing (Map/Reduce), especially good at big data processing.&lt;/p&gt;
&lt;p&gt;MongoDB is a database based on distributed file storage. Written in C++ language. Aims to provide scalable high-performance data storage solutions for WEB applications.&lt;/p&gt;
&lt;p&gt;MongoDB is a product between relational databases and non-relational databases, is the most feature-rich among non-relational databases, most like relational databases.&lt;/p&gt;
&lt;h2 id="macos-os-installation-and-startup"&gt;macOS OS Installation and Startup&lt;/h2&gt;
&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;
&lt;p&gt;Simplest is through brew installation&lt;/p&gt;</description></item><item><title>Ethereum Development - Build Pet Shop</title><link>https://time-friend.com/en/archive/ethereum-development-build-pet-shop/</link><pubDate>Sat, 21 Apr 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/ethereum-development-build-pet-shop/</guid><description>&lt;p&gt;Truffle&amp;rsquo;s pet shop is a very good example to understand Ethereum development.
Following official provided demo and tutorial, can completely experience entire development process.&lt;/p&gt;
&lt;h2 id="ganache"&gt;Ganache&lt;/h2&gt;
&lt;p&gt;For environment needs, and quickly set up a private chain environment locally.
truffle launched a visual private chain client:
&lt;a href="http://truffleframework.com/ganache/"&gt;Ganache Download Address&lt;/a&gt;
After downloading and running, you&amp;rsquo;ll see an interface like this:
&lt;img src="https://static.alili.tech/images/Jietu20180421-213717.jpg" alt=""&gt;&lt;/p&gt;
&lt;h2 id="initialize-your-project"&gt;Initialize Your Project&lt;/h2&gt;
&lt;p&gt;First we create a new directory, and initialize the project&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mkdir pet-shop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd pet-shop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ truffle unbox pet-shop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="project-directory-structure"&gt;Project Directory Structure&lt;/h2&gt;
&lt;p&gt;Here only lists important directories and files&lt;/p&gt;</description></item><item><title>Ethereum Development - Solidity Beginner Editor -- remix-ide</title><link>https://time-friend.com/en/archive/ethereum-development-solidity-beginner-editor-remix-ide/</link><pubDate>Fri, 20 Apr 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/ethereum-development-solidity-beginner-editor-remix-ide/</guid><description>&lt;p&gt;In Ethereum application development, smart contract development is unavoidable.
Currently, remix-ide I found is the most beginner-friendly development tool.
Doesn&amp;rsquo;t need any other environment, can directly deploy and debug.
If I find more friendly ones, I&amp;rsquo;ll recommend in future blogs.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;remix is just an ordinary npm package&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm i remix-ide -g
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="startup"&gt;Startup&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ remix-ide
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Default will start local port 8080, open browser &lt;code&gt;http://localhost:8080&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.alili.tech/images/localhost_8080_.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First we need to check auto compile
&lt;img src="https://static.alili.tech/images/Jietu20180421-180045.jpg" alt=""&gt;&lt;/p&gt;</description></item><item><title>Ethereum Development - Starting with the Truffle Scaffold</title><link>https://time-friend.com/en/archive/ethereum-truffle-setup/</link><pubDate>Thu, 19 Apr 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/ethereum-truffle-setup/</guid><description>&lt;p&gt;I started learning blockchain development this week to build up some knowledge before the company&amp;rsquo;s blockchain project begins.
This blog post is a review of what I&amp;rsquo;ve learned.&lt;/p&gt;
&lt;h2 id="what-is-truffle"&gt;What is Truffle&lt;/h2&gt;
&lt;p&gt;Truffle is a development framework for the Solidity language on Ethereum. It is implemented in JavaScript.
Although it&amp;rsquo;s built with JavaScript, which we&amp;rsquo;re familiar with,
Truffle is mainly a tool for compiling and deploying &lt;code&gt;smart contracts&lt;/code&gt; (though it does have other features).&lt;/p&gt;</description></item><item><title>Build Simpler Private npm Server with verdaccio</title><link>https://time-friend.com/en/archive/build-simple-private-npm-server-with-verdaccio/</link><pubDate>Tue, 10 Apr 2018 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/build-simple-private-npm-server-with-verdaccio/</guid><description>&lt;p&gt;Building private npm servers like cnpm.org is already quite simple,
but compared to verdaccio&amp;rsquo;s simplicity, there&amp;rsquo;s no comparison.
Because verdaccio is too simple.&lt;/p&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;verdaccio is a lightweight private NPM Registry (forked from Sinopia, Sinopia&amp;rsquo;s last update was years ago). Initially planned to use cnpmjs to build private npm repository but after building there were some problems, so used Sinopia;&lt;/p&gt;
&lt;p&gt;Next I&amp;rsquo;ll briefly introduce verdaccio usage.&lt;/p&gt;
&lt;h3 id="install-verdaccio-on-your-server"&gt;Install verdaccio on Your Server&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ npm i verdaccio -g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="start"&gt;Start&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Directly enter verdaccio command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ verdaccio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// If startup successful, will display the following information
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Verdaccio doesn&lt;span style="color:#e6db74"&gt;&amp;#39;t need superuser privileges. Don&amp;#39;&lt;/span&gt;t run it under
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; warn --- config file - /root/.config/verdaccio/config.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; warn --- http address - http://localhost:4873/ - verdaccio/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can also start with pm2 (also the method I chose to use)&lt;/p&gt;</description></item><item><title>Git Push Stuck Solution</title><link>https://time-friend.com/en/archive/git-push-stuck-solution/</link><pubDate>Mon, 09 Apr 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/git-push-stuck-solution/</guid><description>&lt;p&gt;The blog&amp;rsquo;s daily English is directly scraped from Shanbay English. To avoid directly requesting proxy interfaces (which would be relatively slow).
So my program generates corresponding data files every day, and the frontend directly gets them via ajax.
Blog content is also automatically published every day, achieving the effect of updating famous quotes and sentences daily.
Haven&amp;rsquo;t checked for a long time, found many git commits weren&amp;rsquo;t pushed. After manually pushing, found there were over 800 modifications not pushed.&lt;/p&gt;</description></item><item><title>Linux - SSH Connect to Remote Server Directly Execute Command PATH Incomplete Solution</title><link>https://time-friend.com/en/archive/linux-ssh-path-issue-non-interactive/</link><pubDate>Thu, 15 Mar 2018 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/linux-ssh-path-issue-non-interactive/</guid><description>&lt;h2 id="path-incomplete-in-non-interactive-mode"&gt;PATH Incomplete in non-interactive mode&lt;/h2&gt;
&lt;p&gt;ssh &lt;a href="mailto:username@desktop.domain"&gt;username@desktop.domain&lt;/a&gt; &amp;lsquo;command&amp;rsquo; is a typical non-interactive shell, PATH incomplete.&lt;/p&gt;
&lt;h2 id="reason"&gt;Reason&lt;/h2&gt;
&lt;p&gt;A common way to determine if it&amp;rsquo;s an interactive shell in Linux systems is through the PS1 variable. Although there are other ways, currently .bashrc determines if it&amp;rsquo;s interactive mode through PS1.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# .bashrc file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# If not running interactively, don&amp;#39;t do anything &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt; -z &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PS1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;p&gt;Move all necessary export PATH declarations before [ -z &amp;ldquo;$PS1&amp;rdquo; ] &amp;amp;&amp;amp; return. Ensure PATH settings also take effect in non-interactive mode.&lt;/p&gt;</description></item><item><title>CentOS7 Environment Puppeteer Startup Failure Solution</title><link>https://time-friend.com/en/archive/centos7-puppeteer-startup-failure-solution/</link><pubDate>Sun, 25 Feb 2018 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/centos7-puppeteer-startup-failure-solution/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Tip: In CentOS6 environment, Puppeteer cannot be started. In CentOS6, many Puppeteer dependency libraries don&amp;rsquo;t exist. So if you want to run Puppeteer on CentOS6, I suggest giving up, it&amp;rsquo;s more worthwhile to spend time elsewhere.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="missing-dependencies"&gt;Missing Dependencies&lt;/h1&gt;
&lt;p&gt;Running Puppeteer on a new CentOS7 often fails, many times reporting errors like:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;...node_modules/puppeteer/.local-chromium/linux-496140/chrome-linux/chrome: error while loading shared libraries: libpangocairo-1.0.so.0: cannot open shared object file: No such file or directory
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This error indicates missing dependencies.&lt;/p&gt;</description></item><item><title>Linux - vim vi Learning Notes</title><link>https://time-friend.com/en/archive/linux-vim-vi-learning-notes/</link><pubDate>Sat, 17 Feb 2018 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/linux-vim-vi-learning-notes/</guid><description>&lt;p&gt;Often on Mac or Linux, because we frequently need to use it, but its operations differ greatly from other editors, so I&amp;rsquo;ll specifically learn it. When using it, won&amp;rsquo;t be too confused. In learning, need to practice more and use more to become proficient.&lt;/p&gt;
&lt;h1 id="three-modes-of-vimvi"&gt;Three Modes of vim/vi&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Command mode&lt;/li&gt;
&lt;li&gt;Insert mode&lt;/li&gt;
&lt;li&gt;Last line mode&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="command-mode"&gt;Command Mode&lt;/h2&gt;
&lt;p&gt;When we use vim to open a file, we enter command mode. In command mode, we cannot input/edit text.
In command mode, we can input the following to switch to other modes&lt;/p&gt;</description></item><item><title>Linux - Install Nginx Steps</title><link>https://time-friend.com/en/archive/linux-install-nginx-steps/</link><pubDate>Tue, 16 Jan 2018 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/linux-install-nginx-steps/</guid><description>&lt;h3 id="install-nginx-related-dependencies"&gt;Install Nginx Related Dependencies&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install gcc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install pcre-devel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install zlib zlib-devel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install openssl openssl-devel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Of course you can also install together&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="download-nginx-tar-archive"&gt;Download Nginx tar Archive&lt;/h3&gt;
&lt;p&gt;Go to webpage &lt;a href="http://nginx.org/download/"&gt;http://nginx.org/download/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Choose the version you need:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enter local folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cd /usr/local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# I chose a relatively new version, download to current directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wget http://nginx.org/download/nginx-1.13.9.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Extract&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tar -xvf nginx-1.13.9.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Rename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mv nginx-1.13.9.tar.gz nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Enter nginx directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cd nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Execute following commands&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Compile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After completing the above steps, your nginx is already installed&lt;/p&gt;</description></item><item><title>A Headless Chrome Browser: Puppeteer</title><link>https://time-friend.com/en/archive/a-headless-chrome-browser-puppeteer/</link><pubDate>Thu, 21 Dec 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/a-headless-chrome-browser-puppeteer/</guid><description>&lt;h2 id="puppeteer-introduction"&gt;Puppeteer Introduction&lt;/h2&gt;
&lt;p&gt;Puppeteer is a Node.js library that provides a set of APIs to control Chrome.
Compared to PhantomJS, it can directly call Chrome&amp;rsquo;s API in your Node.js project.
Many automation tests and crawlers can be based on Puppeteer in the future.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install puppeteer
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;h3 id="screenshot"&gt;Screenshot&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;puppeteer&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;screenshot&lt;/span&gt;({&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;example.png&amp;#39;&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="save-page-as-pdf"&gt;Save Page as PDF&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;puppeteer&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://news.ycombinator.com&amp;#39;&lt;/span&gt;, {&lt;span style="color:#a6e22e"&gt;waitUntil&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;networkidle2&amp;#39;&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pdf&lt;/span&gt;({&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;hn.pdf&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;format&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;A4&amp;#39;&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puppeteer also provides many Chrome APIs
&lt;a href=""&gt;https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Algorithm Complexity Analysis</title><link>https://time-friend.com/en/archive/algorithm-complexity-analysis/</link><pubDate>Tue, 19 Dec 2017 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/algorithm-complexity-analysis/</guid><description>&lt;p&gt;Everything is to count the efficiency of code execution&lt;/p&gt;
&lt;h2 id="post-statistical-method"&gt;Post-Statistical Method&lt;/h2&gt;
&lt;p&gt;Through statistics and monitoring, we can get the execution time and memory usage of the algorithm&lt;/p&gt;
&lt;h2 id="big-o-complexity-notation"&gt;Big O Complexity Notation&lt;/h2&gt;
&lt;p&gt;As data scale grows, algorithm execution time and space usage grow proportionally according to polynomials&lt;/p&gt;
&lt;h3 id="time-complexity-ranking-from-best-to-worst"&gt;Time Complexity Ranking (from best to worst)&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://incomparable9527.coding.net/p/imageBed/d/imageBed/git/raw/master/35125f99fc7c79d019449ecdf8ef04434feaef35ccc580fd22326dffe1e58ca6.png" alt="Figure 1"&gt;&lt;/p&gt;
&lt;p&gt;O(1) (constant order) &amp;lt; O(logn) (logarithmic order) &amp;lt; O(n) (linear order) &amp;lt; O(nlogn) (linear logarithmic order) &amp;lt; O(n^2) (quadratic order) &amp;lt; O(n^3) (cubic order) &amp;lt; O(2^n) (exponential order) &amp;lt; O(n!) (factorial order)&lt;/p&gt;</description></item><item><title>Multi-Server Automated Deployment Solution Based on shipit-deploy</title><link>https://time-friend.com/en/archive/multi-server-automated-deployment-with-shipit-deploy/</link><pubDate>Sun, 17 Dec 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/multi-server-automated-deployment-with-shipit-deploy/</guid><description>&lt;p&gt;Why automate deployment, I won&amp;rsquo;t elaborate here.&lt;/p&gt;
&lt;p&gt;Automated deployment based on shipit-deploy can achieve the following effects&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One-click deployment to multiple servers.&lt;/li&gt;
&lt;li&gt;One-click rollback of multiple servers.&lt;/li&gt;
&lt;li&gt;Local operation, no need to log into servers.&lt;/li&gt;
&lt;li&gt;Easy to customize, easy to extend, achieve automation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;h3 id="1-download-and-install"&gt;1. Download and Install&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install --save-dev shipit-cli
npm install --save-dev shipit-deploy
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2-establish-trust-relationship-with-servers"&gt;2. Establish Trust Relationship with Servers&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ssh-copy-id USER@REMOTE_HOST
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="3-configuration"&gt;3. Configuration&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;shipit&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;shipit-deploy&amp;#39;&lt;/span&gt;)(&lt;span style="color:#a6e22e"&gt;shipit&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;shipit-pm2&amp;#39;&lt;/span&gt;)(&lt;span style="color:#a6e22e"&gt;shipit&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;shipit-cnpmjs&amp;#39;&lt;/span&gt;)(&lt;span style="color:#a6e22e"&gt;shipit&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;shipit&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;initConfig&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;workspace&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/tmp/github-monitor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;deployTo&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/tmp/deploy_to&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Server target path
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;repositoryUrl&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://github.com/user/repo.git&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Git repository address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ignores&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;.git&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;node_modules&amp;#39;&lt;/span&gt;], &lt;span style="color:#75715e"&gt;// Excluded files
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;keepReleases&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Number of release versions to keep
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;deleteOnRollback&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/path/to/key&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;shallowClone&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;cnpm&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;remote&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dev&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#75715e"&gt;// Development server deployment
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;servers&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;user@devServer1&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;user@devServer1&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#a6e22e"&gt;branch&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;dev&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Git branch to publish,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pm2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;pm2-dev-app.json&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Development environment pm2 startup configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prod&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#75715e"&gt;// Production server deployment
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;servers&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;user@prodServer1&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;user@prodServer2&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#a6e22e"&gt;branch&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;master&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Git branch to publish,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pm2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;pm2-prod-app.json&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Production environment pm2 startup configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;pm2-prod-app.json example:&lt;/p&gt;</description></item><item><title>Linux - Use ssh-copy-id Command to Achieve SSH Passwordless Login</title><link>https://time-friend.com/en/archive/linux-ssh-copy-id-passwordless-login/</link><pubDate>Sat, 16 Dec 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/linux-ssh-copy-id-passwordless-login/</guid><description>&lt;h3 id="1-generate-public-and-private-keys"&gt;1. Generate Public and Private Keys&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ssh-keygen -t rsa
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After entering according to prompts, will generate id_rsa and id_rsa.pub files in ~/.ssh directory&lt;/p&gt;
&lt;h3 id="2-establish-connection-with-server"&gt;2. Establish Connection with Server&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ssh-copy-id root@192.168.0.100 //Example IP
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next will require entering connection password, after successful verification&lt;/p&gt;
&lt;h3 id="3-passwordless-login-to-server"&gt;3. Passwordless Login to Server&lt;/h3&gt;
&lt;p&gt;Try the following command to see if login succeeds directly:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ssh root@192.168.0.100
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It&amp;rsquo;s that simple&lt;/p&gt;</description></item><item><title>Enable Gzip Mode for Express, Egg.js, Koa.js</title><link>https://time-friend.com/en/archive/enable-gzip-express-egg-koa/</link><pubDate>Wed, 13 Dec 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/enable-gzip-express-egg-koa/</guid><description>&lt;p&gt;To reduce download size of APIs and static files, we can enable Gzip when server resources are sufficient.&lt;/p&gt;
&lt;h3 id="express"&gt;Express&lt;/h3&gt;
&lt;p&gt;Express version below 4.0&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;express&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;use&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;express&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;compress&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;//Mainly this line
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Express version 4.0 and above (including 4.0)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;compression&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;compression&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;express&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;use&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;compression&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="eggjs"&gt;Egg.js&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app/middleware/compress.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// koa-compress exposed interface (`(options) =&amp;gt; middleware`) matches framework&amp;#39;s middleware requirements
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;koa-compress&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// config/config.default.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;middleware&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [ &lt;span style="color:#e6db74"&gt;&amp;#39;compress&amp;#39;&lt;/span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;compress&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;threshold&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="koajs"&gt;Koa.js&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;koa&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;koa&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;compress&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;koa-compress&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;koa&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;options&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;threshold&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;use&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;compress&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;options&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Apache, Nginx, Express, Egg.js Support Frontend HTML5 History Mode</title><link>https://time-friend.com/en/archive/apache-nginx-express-eggjs-support-frontend-html5-history-mode/</link><pubDate>Sat, 02 Dec 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/apache-nginx-express-eggjs-support-frontend-html5-history-mode/</guid><description>&lt;p&gt;When you use history mode, URLs look like normal URLs, e.g. &lt;a href="http://xxx.com/user/id"&gt;http://xxx.com/user/id&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To perfectly support this mode, backend configuration support is also needed. When the application is a single-page client application, if the backend is not correctly configured, when users directly access &lt;a href="http://xxx.com/user/id"&gt;http://xxx.com/user/id&lt;/a&gt; in the browser, it will return 404.&lt;/p&gt;
&lt;p&gt;Backend support examples:&lt;/p&gt;
&lt;h3 id="apache"&gt;Apache&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-XML" data-lang="XML"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;mod_rewrite.c&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteEngine On
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteBase /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteRule ^index\.html$ - [L]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteCond %{REQUEST_FILENAME} !-f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteCond %{REQUEST_FILENAME} !-d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteRule . /index.html [L]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nginx"&gt;nginx&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;location / {
 try_files $uri $uri/ /index.html;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="nodejs-express"&gt;Node.js (Express)&lt;/h3&gt;
&lt;p&gt;If using Express, you can use connect-history-api-fallback
&lt;a href=""&gt;https://github.com/bripkens/connect-history-api-fallback&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How Egg.js Supports Single Page Application</title><link>https://time-friend.com/en/archive/eggjs-how-to-support-single-page-application/</link><pubDate>Fri, 01 Dec 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/eggjs-how-to-support-single-page-application/</guid><description>&lt;ol&gt;
&lt;li&gt;Enable ejs in config/plugin.js // Other template engines also work&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ejs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;enable&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;package&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;egg-view-ejs&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Configure static directory&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//config/config.{env}.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prefix&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dir&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;join&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;appInfo&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;baseDir&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;app/view/&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Template configuration&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//config/config.{env}.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;view&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;defaultExt&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;.html&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mapping&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;.ejs&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ejs&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;.html&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ejs&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;Configure root directory route mapping&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app/router.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;router&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;home&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;
&lt;li&gt;Configure route corresponding controller&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app/controller/home.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Controller&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;egg&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HomeController&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Controller&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// render index.html
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HomeController&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;After completing the above configuration, you can combine with single page application&lt;/p&gt;</description></item><item><title>Publish Company Private Code to Self-Hosted cnpm</title><link>https://time-friend.com/en/archive/publish-private-code-to-self-hosted-cnpm/</link><pubDate>Sat, 25 Nov 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/publish-private-code-to-self-hosted-cnpm/</guid><description>&lt;h3 id="configuration"&gt;Configuration&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;First need to add some configuration properties to the original config/config.js:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;enablePrivate&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Anyone can publish packages
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;admins&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;admin&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;test@company.com&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Admin permissions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scopes&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;@company&amp;#39;&lt;/span&gt;], &lt;span style="color:#75715e"&gt;// Private packages must be under scope
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="restart-cnpm"&gt;Restart cnpm&lt;/h3&gt;
&lt;p&gt;Enter cnpm directory&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm stop // Stop service
npm start // Start service
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Add code to package.json file:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; &amp;#34;name&amp;#34;: &amp;#34;@company/testjs&amp;#34;, // Package name, must add scope name before
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="npm-login"&gt;npm Login&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; npm login --registry=http://192.168.0.100:7001 // Register previous user
 Username: admin // Admin name
 Password: 1234 // Password you want
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; npm publish --registry=http://192.168.80.130:7001
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Publish successful&lt;/p&gt;</description></item><item><title>Build Private cnpm Server in Company</title><link>https://time-friend.com/en/archive/build-private-cnpm-server-in-company/</link><pubDate>Fri, 24 Nov 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/build-private-cnpm-server-in-company/</guid><description>&lt;p&gt;There are more and more js projects now. If we open source our code, we&amp;rsquo;ll publish these codes to npm.
But npm is public, company code after all won&amp;rsquo;t be publicly available online.
So we need to build our own npm server. Publish company private code on the company&amp;rsquo;s npm server.
This way we can conveniently download the code we want, and also not put this code on open source platforms&lt;/p&gt;</description></item><item><title>Visual Studio Code Hide Extra js and map Files Generated from ts</title><link>https://time-friend.com/en/archive/vscode-hide-generated-js-and-map-files-from-ts/</link><pubDate>Wed, 22 Nov 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/vscode-hide-generated-js-and-map-files-from-ts/</guid><description>&lt;p&gt;Open 【File】&amp;gt;【Preferences】&amp;gt;【Workspace Settings】, put in the following code:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// Put settings in this file to override defaults and user settings.
{
 &amp;#34;files.exclude&amp;#34;: {
 // exclude .js and .js.map files, when in a TypeScript project
 &amp;#34;node_modules&amp;#34;: true,
 &amp;#34;**/*.js&amp;#34;: { &amp;#34;when&amp;#34;: &amp;#34;$(basename).ts&amp;#34;},
 &amp;#34;**/*.js.map&amp;#34;: true
 }
}
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Make Visual Studio Code Format Your Code with ESLint Rules</title><link>https://time-friend.com/en/archive/vscode-eslint-format/</link><pubDate>Sun, 05 Nov 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/vscode-eslint-format/</guid><description>&lt;p&gt;After adding ESLint to the project, everyone&amp;rsquo;s code became much cleaner.
But because we weren&amp;rsquo;t familiar with ESLint rules at first, we spent a lot of time counting spaces and toggling between double and single quotes.&lt;/p&gt;
&lt;p&gt;This severely impacted development efficiency and mood!!!!
This severely impacted development efficiency and mood!!!!
This severely impacted development efficiency and mood!!!!&lt;/p&gt;
&lt;p&gt;Important things must be said three times!!!&lt;/p&gt;
&lt;p&gt;Below is a method using the Visual Studio Code ESLint plugin. After configuration, your code will be automatically formatted according to ESLint rules.&lt;/p&gt;</description></item><item><title>Put Redux Aside, Try MobX</title><link>https://time-friend.com/en/archive/redux-to-mobx/</link><pubDate>Sat, 04 Nov 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/redux-to-mobx/</guid><description>&lt;h2 id="mobx"&gt;Mobx&lt;/h2&gt;
&lt;p&gt;Mobx is a simple, highly scalable state management tool. Like Redux, Mobx is a tool for managing state in React.
However, the development experience is better than Redux.&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install mobx --save

//For React: 
npm install mobx-react --save
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="a-simple-counter"&gt;A Simple Counter&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;Component&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ReactDOM&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react-dom&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;observer&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;mobx-react&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;observable&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;computed&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;action&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;MobX&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Store&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;observable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;action&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;minus&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;countStore&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Store&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;observer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CountComponent&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Component&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;h2&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{ &lt;span style="color:#a6e22e"&gt;countStore&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; }&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/h2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;add&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;countStore&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;gt;+&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/button&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;minus&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;countStore&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;minus&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;gt;-&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/button&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ReactDOM&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;CountComponent&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Using Decorators in Your React Project</title><link>https://time-friend.com/en/archive/react-decorator/</link><pubDate>Wed, 01 Nov 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/react-decorator/</guid><description>&lt;h2 id="using-decorators"&gt;Using Decorators&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Currently only supports Babel/TypeScript preprocessors&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="babel"&gt;Babel:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install babel-plugin-transform-decorators-legacy --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add it to your .babelrc configuration file. If you don&amp;rsquo;t have a .babelrc file, create one.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
 &amp;#34;presets&amp;#34;: [
 &amp;#34;es2015&amp;#34;,
 &amp;#34;stage-1&amp;#34;
 ],
 &amp;#34;plugins&amp;#34;: [&amp;#34;transform-decorators-legacy&amp;#34;]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The plugin order is very important: transform-decorators-legacy should be the first plugin.&lt;/p&gt;
&lt;p&gt;When using React Native, the following preset can replace transform-decorators-legacy:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
 &amp;#34;presets&amp;#34;: [&amp;#34;stage-2&amp;#34;, &amp;#34;react-native-stage-0/decorator-support&amp;#34;]
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="using-decorators-in-create-react-app"&gt;Using Decorators in create-react-app&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm run eject
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Install the related plugins:&lt;/p&gt;</description></item><item><title>Move Blog to CSDN</title><link>https://time-friend.com/en/archive/move-blog-to-csdn/</link><pubDate>Sun, 24 Sep 2017 00:04:05 +0000</pubDate><guid>https://time-friend.com/en/archive/move-blog-to-csdn/</guid><description>&lt;p&gt;Move blog to CSDN&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.csdn.net/m0_48741717"&gt;https://blog.csdn.net/m0_48741717&lt;/a&gt;&lt;/p&gt;</description></item><item><title>My Blog Will Sync to Tencent Cloud+ Community</title><link>https://time-friend.com/en/archive/my-blog-will-sync-to-tencent-cloud/</link><pubDate>Sun, 24 Sep 2017 00:04:05 +0000</pubDate><guid>https://time-friend.com/en/archive/my-blog-will-sync-to-tencent-cloud/</guid><description>&lt;p&gt;My blog will sync to Tencent Cloud+ Community, invite everyone to join: &lt;a href="https://cloud.tencent.com/developer/support-plan?invite_code=onqmnob0dh5k"&gt;https://cloud.tencent.com/developer/support-plan?invite_code=onqmnob0dh5k&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Git Series - About the Add Command</title><link>https://time-friend.com/en/archive/git-series-about-add-command/</link><pubDate>Sun, 10 Sep 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/git-series-about-add-command/</guid><description>&lt;h2 id="basic-usage"&gt;Basic Usage&lt;/h2&gt;
&lt;p&gt;Usually add &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; to the index library through the form &lt;code&gt;git add &amp;lt;path&amp;gt;&lt;/code&gt;,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; can be a file or a directory:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git add &amp;lt;path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If there are many changes, you can use the following command to add all changed files at once:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; git add -A .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add all modifications to the staging area, including new files and edited files, excluding deleted files:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ git add . 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Means add all content:&lt;/p&gt;</description></item><item><title>React Series: How Parent Components Pass Props to this.props.children</title><link>https://time-friend.com/en/archive/react-pass-props-to-children/</link><pubDate>Fri, 08 Sep 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/react-pass-props-to-children/</guid><description>&lt;h3 id="problem"&gt;Problem&lt;/h3&gt;
&lt;p&gt;When using React Router, the following pattern appears frequently:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;props&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But how does the parent component pass props to a component rendered this way?&lt;/p&gt;
&lt;h3 id="solution"&gt;Solution&lt;/h3&gt;
&lt;p&gt;We can pass props to child components like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cloneElement&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;props&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;,{&lt;span style="color:#a6e22e"&gt;A&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;xxx&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;B&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;xxx2&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;C&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;xxx3&lt;/span&gt;}) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>MySQL Safe Mode</title><link>https://time-friend.com/en/archive/mysql-safe-mode/</link><pubDate>Sat, 26 Aug 2017 23:36:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mysql-safe-mode/</guid><description>&lt;p&gt;Today when deleting a piece of data, the following error appeared.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -&amp;gt; SQL Queries and reconnect.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Because MySQL is running in safe-updates mode.&lt;/p&gt;
&lt;p&gt;To disable this mode, run the following command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SET SQL_SAFE_UPDATES = 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For safety, it&amp;rsquo;s recommended to restore to default state 1 after completing operations&lt;/p&gt;</description></item><item><title>MySQL Access Denied for User Issue</title><link>https://time-friend.com/en/archive/mysql-access-denied-for-user/</link><pubDate>Fri, 25 Aug 2017 23:36:00 +0000</pubDate><guid>https://time-friend.com/en/archive/mysql-access-denied-for-user/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;When connecting to MySQL from another server, an error appeared: Access denied for user &amp;lsquo;root&amp;rsquo;@&amp;lsquo;xxx.xxx.xxx.xxx&amp;rsquo; (using password: YES).&lt;/p&gt;
&lt;p&gt;This is a database permission issue.&lt;/p&gt;
&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;p&gt;On the MySQL server, log in as root and execute the following SQL statement:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mysql -u root -p
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then enter your password.&lt;/p&gt;
&lt;p&gt;Then execute the following command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON *.* TO &amp;#39;your-account&amp;#39;@&amp;#39;%&amp;#39; IDENTIFIED BY &amp;#39;your-password&amp;#39; WITH GRANT OPTION;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After successful execution:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then try connecting to your database again, it should work.&lt;/p&gt;</description></item><item><title>Debug Node.js with Chrome DevTools</title><link>https://time-friend.com/en/archive/debug-nodejs-with-chrome-devtools/</link><pubDate>Tue, 08 Aug 2017 00:04:05 +0000</pubDate><guid>https://time-friend.com/en/archive/debug-nodejs-with-chrome-devtools/</guid><description>&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 6.3+;&lt;/li&gt;
&lt;li&gt;Chrome 55+;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configure-chrome-latest-versions-no-longer-need-this-step"&gt;Configure Chrome (Latest versions no longer need this step);&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Enter URL: chrome://flags/#enable-devtools-experiments to enter Developer Lab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable highlighted option&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart Chrome&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open DevTools Setting -&amp;gt; Experiments;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press Shift 6 times consecutively to show hidden options&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find Node debugging and check it. (New versions no longer have this option, it&amp;rsquo;s enabled by default. So Chrome doesn&amp;rsquo;t need configuration)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="http://files.jb51.net/file_images/article/201702/2017216143309201.png?2017116143318" alt=""&gt;&lt;/p&gt;
&lt;h2 id="run-nodejs"&gt;Run Node.js&lt;/h2&gt;
&lt;p&gt;Just add &amp;ndash;inspect to the command, followed by the file you want to execute;&lt;/p&gt;</description></item><item><title>React Series: Create React Native Apps with create-react-native-app</title><link>https://time-friend.com/en/archive/create-react-native-app/</link><pubDate>Sun, 30 Jul 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/create-react-native-app/</guid><description>&lt;p&gt;Earlier when introducing create-react-app, I briefly mentioned create-react-native-app.&lt;/p&gt;
&lt;p&gt;This tool is actually quite fun to use. The biggest advantage is that you can debug React Native apps on your computer without installing Xcode or Android Studio.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By computer, I mean Mac, Windows, and Linux!!!!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/react-community/create-react-native-app/"&gt;create-react-native-app&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="create-react-native-app-installation"&gt;Create React Native App Installation&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm install -g create-react-native-app
$ create-react-native-app my-app
$ cd my-app/
$ npm start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Install the &lt;a href="https://expo.io"&gt;Expo&lt;/a&gt; app on your iPhone or Android phone. After running npm start, a QR code will appear in the console. Scan it with the Expo app, and you can start remote debugging on your phone right away. It&amp;rsquo;s very convenient, though a bit slower than desktop simulator debugging.&lt;/p&gt;</description></item><item><title>Talking About HTTP MIME</title><link>https://time-friend.com/en/archive/talking-about-http-mime/</link><pubDate>Wed, 26 Jul 2017 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/talking-about-http-mime/</guid><description>&lt;h2 id="what-is-mime"&gt;What is MIME?&lt;/h2&gt;
&lt;p&gt;MIME (Multipurpose Internet Mail Extensions) Multipurpose Internet Mail Extensions;&lt;/p&gt;
&lt;p&gt;In the earliest HTTP protocol, there was no additional data type information.&lt;/p&gt;
&lt;p&gt;All transmitted data was interpreted by client programs as HTML documents, and to support multimedia data types, the HTTP protocol used MIME data type information attached before documents to identify data types.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Each MIME type consists of two parts, the front part is the general category of data, such as audio, image, etc., and the back part defines the specific type.&lt;/p&gt;</description></item><item><title>HTTP URI Format Explanation</title><link>https://time-friend.com/en/archive/http-uri-format/</link><pubDate>Tue, 25 Jul 2017 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/http-uri-format/</guid><description>&lt;p&gt;Below are the various components of a URI&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; Authority Path
 ┌───────────────┴───────────────┐┌───┴────┐
 abc://username:password@example.com:123/path/data?key=value&amp;amp;key2=value2#fragid1
 └┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
 Protocol User Info Hostname Port Query Params Fragment
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Make Webpack Support sftp Upload Files</title><link>https://time-friend.com/en/archive/make-webpack-support-sftp-upload/</link><pubDate>Tue, 18 Jul 2017 11:43:05 +0000</pubDate><guid>https://time-friend.com/en/archive/make-webpack-support-sftp-upload/</guid><description>&lt;p&gt;Today introduce two plugins, can make your webpack support uploading files to your ftp server.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/iAmHades/sftp-webpack-plugin"&gt;sftp-webpack-plugin&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="install-sftp-webpack-plugin"&gt;Install sftp-webpack-plugin&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install sftp-webpack-plugin --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SftpWebpackPlugin&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;sftp-webpack-plugin&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;config&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SftpWebpackPlugin&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;port&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;your port&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Server port
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;your host&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Server address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;username&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;your username&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Username
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;password&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;your password&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Password
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;you neeed upload file path &amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Your local path
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;to&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;you want to destination&amp;#39;&lt;/span&gt;&lt;span style="color:#75715e"&gt;//Path on server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="webpack-sftp-client"&gt;webpack-sftp-client&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/sqhtiamo/webpack-sftp-client"&gt;webpack-sftp-client&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="install-webpack-sftp-client"&gt;Install webpack-sftp-client&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install webpack-sftp-client --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="usage-1"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WebpackSftpClient&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;webpack-sftp-client&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;config&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WebpackSftpClient&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;port&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;22&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Server port
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;exmaple.com&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Server address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;username&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Username
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;password&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;,&lt;span style="color:#75715e"&gt;//Login password
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./build/&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;//Local path
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;remotePath&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/data/website/demo/&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;//Server path
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;verbose&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#75715e"&gt;//Console show detailed information
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>React Series: An Auto-Height iframe Component</title><link>https://time-friend.com/en/archive/react-adaptive-iframe/</link><pubDate>Mon, 17 Jul 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/react-adaptive-iframe/</guid><description>&lt;p&gt;When embedding iframes in a webpage, you always need to deal with the iframe height problem.&lt;/p&gt;
&lt;p&gt;How do we do it in React?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FullheightIframe&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Component&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;super&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrameHeight&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0px&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;iframe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{ {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;100%&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;iFrameHeight&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;overflow&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;visible&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;onLoad&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ReactDOM&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findDOMNode&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setState&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrameHeight&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;contentWindow&lt;/span&gt;.document.&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;scrollHeight&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;px&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ref&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;iframe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;props&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;100%&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;iFrameHeight&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scrolling&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;no&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;frameBorder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Macbook Pro Bluetooth Unavailable Issue</title><link>https://time-friend.com/en/archive/macbook-pro-bluetooth-unavailable-issue/</link><pubDate>Sun, 16 Jul 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/macbook-pro-bluetooth-unavailable-issue/</guid><description>&lt;p&gt;Two days ago in the morning at company, computer started up. Found mouse couldn&amp;rsquo;t be used.&lt;/p&gt;
&lt;p&gt;After fiddling around, found computer Bluetooth became a wavy line. Shows Bluetooth unavailable.&lt;/p&gt;
&lt;p&gt;Fiddled for a long time, computer system also upgraded to latest version. Restarted several times, Bluetooth still in unavailable state.&lt;/p&gt;
&lt;p&gt;Searched Baidu, online also has similar problem solutions.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. Shutdown


2. Press shift+control+option+power simultaneously, hold for 5 seconds


3. Press power key first, then immediately press option+command+p+r simultaneously,
Wait for mac to make 4 Duang~ sounds, then release, system will automatically start


4. Bluetooth returns to normal
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But some netizens tried it and it was successful.&lt;/p&gt;</description></item><item><title>Publish Aliyun API Signature Generation Tool Based on Node.js -- AliToSing</title><link>https://time-friend.com/en/archive/publish-alitosign-aliyun-api-signature-tool/</link><pubDate>Sun, 16 Jul 2017 00:04:05 +0000</pubDate><guid>https://time-friend.com/en/archive/publish-alitosign-aliyun-api-signature-tool/</guid><description>&lt;p&gt;Aliyun API signature generation tool based on Node.js&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Num142857/AliToSign"&gt;Github AliToSign&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://help.aliyun.com/document_detail/29747.html?spm=5176.doc29743.2.4.SAqOxJ"&gt;Aliyun Signature Official Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Installation method:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install alitosign --save
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Usage method:&lt;/p&gt;
&lt;p&gt;Example: &lt;a href="https://help.aliyun.com/document_detail/29749.html?spm=5176.doc29744.6.592.RG61hE"&gt;Add Domain&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alitosign&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;alitosign&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;querystring&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;querystring&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;moment&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;moment&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;http&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Basically common parameters needed for calling interfaces
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;originParams&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;AccessKeyId&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;xxxxxxx&amp;#34;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// AccessKeyId acquisition method please refer to official documentation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Format&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;JSON&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Version&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;2015-01-09&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SignatureMethod&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;HMAC-SHA1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SignatureVersion&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AddDomain&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Copy common parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;assign&lt;/span&gt;({}, &lt;span style="color:#a6e22e"&gt;originParams&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Add necessary parameters for the interface you want to call on the new object,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Each interface is different, please check official documentation for details
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Action&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;AddDomain&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;DomainName&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;time-friend.com&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;GroupId&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;2223&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Add timestamp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Timestamp&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;moment&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;utc&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;format&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Use Greenwich Mean Time;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;SignatureNonce&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Date().&lt;span style="color:#a6e22e"&gt;getTime&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Generate signature
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;signParams&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alitosign&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Convert object containing signature property to query format string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;querystring&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;signParams&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Concatenate url
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`http://alidns.aliyuncs.com/?`&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Call interface
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;, (&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;data&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// After serialization, you can get the data you want
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;oData&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parse&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>React Series: Make create-react-app Support LESS Imports</title><link>https://time-friend.com/en/archive/create-react-app-less/</link><pubDate>Fri, 14 Jul 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/create-react-app-less/</guid><description>&lt;p&gt;Currently, create-react-app does not support importing LESS directly.
Here I&amp;rsquo;ll show you how to make it support LESS imports.&lt;/p&gt;
&lt;p&gt;create-react-app is based on webpack, but it doesn&amp;rsquo;t expose the webpack.config files. To support LESS, you need to modify the webpack configuration.
The following command exposes the configuration files:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm run eject
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After running it, you&amp;rsquo;ll see a new config folder.
Inside are files like webpack.config.dev.js and webpack.config.prod.js.&lt;/p&gt;
&lt;p&gt;Next, install less-loader&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install less-loader less --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then modify the webpack.config.dev.js file.&lt;/p&gt;</description></item><item><title>React Series - JSX</title><link>https://time-friend.com/en/archive/react-series-jsx/</link><pubDate>Thu, 13 Jul 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/react-series-jsx/</guid><description>&lt;p&gt;JSX is an interesting thing. It looks like a template language, but has all the capabilities of JavaScript.&lt;/p&gt;
&lt;p&gt;In React, JSX is used to generate React elements.&lt;/p&gt;
&lt;p&gt;After we create an APP using create-react-app:&lt;/p&gt;
&lt;h2 id="a-piece-of-jsx-code"&gt;A Piece of JSX Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;Component&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ReactDOM&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react-dom&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;App&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Component&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;App&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;I&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;am&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;an&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;APP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ReactDOM&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;(&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;App&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;, document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="we-can-embed-expressions-in-jsx"&gt;We Can Embed Expressions in JSX&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Insert data 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Xiaoming&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ele&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;My&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;is&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;} &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Calculate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ele1&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;} &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Ternary expression
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ele2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&lt;span style="color:#f92672"&gt;?&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;I am Xiaoming&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;I am not Xiaoming&amp;#34;&lt;/span&gt;} &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//In attributes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ele3&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;date&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xxx&lt;/span&gt;} &lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;Because JSX is compiled by Babel, it itself is an object.&lt;/p&gt;</description></item><item><title>React Series: Starting from a Scaffold - create-react-app</title><link>https://time-friend.com/en/archive/react-create-app/</link><pubDate>Wed, 12 Jul 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/react-create-app/</guid><description>&lt;p&gt;The React ecosystem is incredibly vast. If beginners want to directly experience the charm of React, here is an official scaffold. The usage is very simple.&lt;/p&gt;
&lt;h2 id="create-react-app"&gt;create-react-app&lt;/h2&gt;
&lt;h3 id="basic-usage"&gt;Basic Usage&lt;/h3&gt;
&lt;p&gt;Install&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install -g create-react-app
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Create an app&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;create-react-app my-app
cd my-app/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;File structure:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;my-app
├── README.md
├── node_modules
├── package.json
├── .gitignore
├── public
│ └── favicon.ico
│ └── index.html
│ └── manifest.json
└── src
 └── App.css
 └── App.js
 └── App.test.js
 └── index.css
 └── index.js
 └── logo.svg
 └── registerServiceWorker.js
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Start the app:&lt;/p&gt;</description></item><item><title>npm, yarn Package Manager Switch to Taobao Registry</title><link>https://time-friend.com/en/archive/npm-yarn-switch-taobao-registry/</link><pubDate>Sat, 01 Jul 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/npm-yarn-switch-taobao-registry/</guid><description>&lt;p&gt;Due to some special reasons, package management software like npm, Yarn always downloads a bit slow in China.
Can switch to Taobao registry, directly pull from domestic servers.
Here&amp;rsquo;s a note:&lt;/p&gt;
&lt;h2 id="npm"&gt;NPM&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If the above configuration doesn&amp;rsquo;t work happily, can try the following method:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm config set registry http://registry.cnpmjs.org
npm info underscore 
//(If above configuration is correct, this command will have string response)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="yarn"&gt;yarn&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yarn config set registry https://registry.npm.taobao.org --global
yarn config set disturl https://npm.taobao.org/dist --global
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If EACCES: permission denied permission error appears,
Fix /usr/local directory ownership:&lt;/p&gt;</description></item><item><title>Cross-domain with CSS3: CSST (CSS Text Transformation)</title><link>https://time-friend.com/en/archive/css-cross-domain/</link><pubDate>Tue, 20 Jun 2017 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/css-cross-domain/</guid><description>&lt;h2 id="csst-css-text-transformation"&gt;CSST (CSS Text Transformation)&lt;/h2&gt;
&lt;p&gt;Getting content through CSS3&amp;rsquo;s content property.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Dynamically create a link element with JS and insert it into the document to request a CSS file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;code&gt;computedStyle = window.getComputedStyle&lt;/code&gt; to get the style object of a specified element.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;code&gt;computedStyle.content&lt;/code&gt; to get the content.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The CSS file that the server can return:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @&lt;span style="color:#66d9ef"&gt;keyframes&lt;/span&gt; &lt;span style="color:#f92672"&gt;anima&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;from&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;to&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @&lt;span style="color:#66d9ef"&gt;-webkit-keyframes&lt;/span&gt; &lt;span style="color:#f92672"&gt;anima&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;from&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;to&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #CSST {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;content&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;${text}&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;animation&lt;/span&gt;: anima &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-webkit-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;animation&lt;/span&gt;: anima &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;${text} is the data we want to populate.&lt;/p&gt;</description></item><item><title>Common Ground Between Object.defineProperty and Proxy</title><link>https://time-friend.com/en/archive/object-defineproperty-and-proxy-common-ground/</link><pubDate>Thu, 01 Jun 2017 11:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/object-defineproperty-and-proxy-common-ground/</guid><description>&lt;p&gt;When reading Vue documentation, I found an interesting point.
It&amp;rsquo;s about how Object.defineProperty is used similarly to Proxy. Very interesting.&lt;/p&gt;
&lt;p&gt;The documentation says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you pass a plain JavaScript object to a Vue instance&amp;rsquo;s data option, Vue will walk through all of this object&amp;rsquo;s properties and convert them to getter/setter using Object.defineProperty.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="objectdefineproperty"&gt;Object.defineProperty&lt;/h2&gt;
&lt;p&gt;Syntax:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Object.&lt;span style="color:#a6e22e"&gt;defineProperty&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;descriptor&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;obj: Required. Target object&lt;/li&gt;
&lt;li&gt;prop: Required. Name of the property to define or modify&lt;/li&gt;
&lt;li&gt;descriptor: Required. Descriptor for the target property&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Return value:&lt;/p&gt;</description></item><item><title>What Object.defineProperty and Proxy Have in Common</title><link>https://time-friend.com/en/archive/defineproperty-vs-proxy/</link><pubDate>Thu, 01 Jun 2017 11:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/defineproperty-vs-proxy/</guid><description>&lt;p&gt;While reading the Vue documentation, I noticed something interesting.&lt;/p&gt;
&lt;p&gt;The use of Object.defineProperty and the new Proxy feature have some similarities. Quite interesting.&lt;/p&gt;
&lt;p&gt;The docs say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When a plain JavaScript object is passed to the Vue instance&amp;rsquo;s data option, Vue iterates over all of its properties and converts them to getter/setters using Object.defineProperty.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="objectdefineproperty"&gt;Object.defineProperty&lt;/h2&gt;
&lt;p&gt;Syntax:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Object.&lt;span style="color:#a6e22e"&gt;defineProperty&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;descriptor&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;obj: Required. The target object.&lt;/li&gt;
&lt;li&gt;prop: Required. The name of the property to define or modify.&lt;/li&gt;
&lt;li&gt;descriptor: Required. The descriptor for the target property.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Return value:&lt;/p&gt;</description></item><item><title>Talking About Vue Event Modifiers</title><link>https://time-friend.com/en/archive/vue-event-modifiers/</link><pubDate>Thu, 25 May 2017 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/vue-event-modifiers/</guid><description>&lt;h2 id="event-modifiers"&gt;Event Modifiers&lt;/h2&gt;
&lt;p&gt;Speaking of vue event modifiers, compared to angularJs, really too comfortable, greatly increases readability.&lt;/p&gt;
&lt;p&gt;In daily development, often need to call event.preventDefault or event.stopPropagation and other methods.&lt;/p&gt;
&lt;p&gt;Without event modifiers, we would write like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//AngularJS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//vue can also write like this
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;methods&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Now we can access native event object
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vue provides more convenient writing:&lt;/p&gt;</description></item><item><title>A WeChat SPA Page Webview Cache Issue</title><link>https://time-friend.com/en/archive/wechat-spa-webview-cache-issue/</link><pubDate>Wed, 22 Feb 2017 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/wechat-spa-webview-cache-issue/</guid><description>&lt;h2 id="a-low-level-problem"&gt;A Low-Level Problem&lt;/h2&gt;
&lt;p&gt;Because the company&amp;rsquo;s WeChat project uses Angular routing for single-page applications. So page switching is done based on hash values.&lt;/p&gt;
&lt;p&gt;We encountered a problem: every time we deploy new web code to the server.
On Android WeChat client, it always takes many days. Even requires uninstalling WeChat. After reopening the page, the page will update. (But there&amp;rsquo;s no such problem on iPhone)&lt;/p&gt;
&lt;p&gt;If a critical bug is encountered after the version is officially released. That would be a disaster.&lt;/p&gt;</description></item><item><title>Hexo DTraceProviderBindings MODULE_NOT_FOUND Issue</title><link>https://time-friend.com/en/archive/hexo-dtrace-provider-bindings-module-not-found/</link><pubDate>Sun, 19 Feb 2017 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/hexo-dtrace-provider-bindings-module-not-found/</guid><description>&lt;p&gt;Recently installing Hexo on Mac, always getting error DTraceProviderBindings MODULE_NOT_FOUND;&lt;/p&gt;
&lt;h2 id="first-type-of-error"&gt;First Type of Error&lt;/h2&gt;
&lt;p&gt;Error command as follows:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{ [Error: Cannot find module &amp;#39;./build/Release/DTraceProviderBindings&amp;#39;] code: &amp;#39;MODULE_NOT_FOUND&amp;#39; }
{ [Error: Cannot find module &amp;#39;./build/default/DTraceProviderBindings&amp;#39;] code: &amp;#39;MODULE_NOT_FOUND&amp;#39; }
{ [Error: Cannot find module &amp;#39;./build/Debug/DTraceProviderBindings&amp;#39;] code: &amp;#39;MODULE_NOT_FOUND&amp;#39; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Although Hexo&amp;rsquo;s generate and publish functions weren&amp;rsquo;t affected. But every time running commands, it would error. Very annoying;&lt;/p&gt;
&lt;p&gt;Common method online is:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install hexo --no-optional
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But, my computer still had no effect;&lt;/p&gt;</description></item><item><title>Express Set CORS, Let Browser Cross-Origin Access Your Server</title><link>https://time-friend.com/en/archive/express-set-cors-cross-origin/</link><pubDate>Sat, 18 Feb 2017 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/express-set-cors-cross-origin/</guid><description>&lt;p&gt;Speaking of frontend cross-origin, it really makes many frontend developers sweat.&lt;/p&gt;
&lt;p&gt;Cross-origin solutions are like eight immortals crossing the sea. Various black tech, various black magic. Makes people amazed. (If you don&amp;rsquo;t understand, you can search)&lt;/p&gt;
&lt;p&gt;But none are perfect solutions, all can do this but not that.&lt;/p&gt;
&lt;p&gt;Today I&amp;rsquo;ll talk about the ultimate cross-origin solution (IE8 and lower versions don&amp;rsquo;t support)&lt;/p&gt;
&lt;h2 id="cross-origin-resource-sharing-cors"&gt;Cross-Origin Resource Sharing (CORS);&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;express&amp;#39;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt;(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Set CORS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;all&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;req&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Access-Control-Allow-Origin&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Second parameter is an asterisk, means pages from any domain can request this server;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Set specified domain:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//res.header(&amp;#34;Access-Control-Allow-Origin&amp;#34;, &amp;#34;http://baidu.com&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//This way, web pages under baidu.com can ajax request your server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Access-Control-Allow-Headers&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;X-Requested-With&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Access-Control-Allow-Methods&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;PUT,POST,GET,DELETE,OPTIONS&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Second parameter is which HTTP request methods the other party can use to request your server, set according to your situation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;X-Powered-By&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39; 3.2.1&amp;#39;&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;application/json;charset=utf-8&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;req&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;You have successfully accessed this server&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;listen&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Make Node.js Fetch Like Browser</title><link>https://time-friend.com/en/archive/make-nodejs-fetch-like-browser/</link><pubDate>Fri, 17 Feb 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/make-nodejs-fetch-like-browser/</guid><description>&lt;p&gt;Previous article briefly introduced Node.js http module&amp;rsquo;s get and post methods,
but because post configuration is still quite cumbersome, today recommend a module:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/node-fetch"&gt;node-fetch&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install node-fetch --save
&lt;/code&gt;&lt;/pre&gt;&lt;!-- more --&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;node-fetch&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// HTML 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://github.com/&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// JSON 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://api.github.com/users/github&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// When network error occurs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;http://domain.invalid/&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// stream
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;fs&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://assets-cdn.github.com/images/modules/logos_page/Octocat.png&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dest&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;createWriteStream&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;./octocat.png&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pipe&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dest&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// buffer 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fileType&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;file-type&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://assets-cdn.github.com/images/modules/logos_page/Octocat.png&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;buffer&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;buffer&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fileType&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;buffer&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// meta 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://github.com/&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;statusText&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;raw&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;content-type&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// POST request 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;http://httpbin.org/post&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;a=1&amp;#39;&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// post with stream from resumer 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;resumer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;resumer&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;resumer&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;a=1&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;http://httpbin.org/post&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// post form data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FormData&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;form-data&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FormData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;append&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;http://httpbin.org/post&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// post form data and modify header 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FormData&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;form-data&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FormData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;append&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;http://httpbin.org/post&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getHeaders&lt;/span&gt;() })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// node 0.12+, yield with co 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;co&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;co&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;co&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://api.github.com/users/github&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;json&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="api"&gt;API&lt;/h2&gt;
&lt;h3 id="fetchurl-options"&gt;fetch(url, options)&lt;/h3&gt;
&lt;p&gt;Returns a Promise object&lt;/p&gt;</description></item><item><title>Node.js http Module GET and POST Requests</title><link>https://time-friend.com/en/archive/nodejs-http-module-get-and-post-requests/</link><pubDate>Thu, 16 Feb 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/nodejs-http-module-get-and-post-requests/</guid><description>&lt;p&gt;In front-end, we often need to use ajax to get and submit data to the server.
The server can also initiate the same request to another server.&lt;/p&gt;
&lt;p&gt;Today, let&amp;rsquo;s talk about how Node.js initiates requests to another server.&lt;/p&gt;
&lt;h2 id="get-request"&gt;GET Request&lt;/h2&gt;
&lt;p&gt;Writing is quite simple, a bit similar to angular&amp;rsquo;s $http.get.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;http&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;http://baidu.com&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;response&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;response&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;h2 id="post-request"&gt;POST Request&lt;/h2&gt;
&lt;p&gt;Compared to get, post writing is much more cumbersome.&lt;/p&gt;</description></item><item><title>Get Public IP with Node.js</title><link>https://time-friend.com/en/archive/get-public-ip-with-nodejs/</link><pubDate>Wed, 15 Feb 2017 21:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/get-public-ip-with-nodejs/</guid><description>&lt;p&gt;Because Raspberry Pi is placed at home, due to ISP reasons, public IP keeps changing.
How can we quickly get the current network&amp;rsquo;s public IP?&lt;/p&gt;
&lt;p&gt;Today introduce a small tool that can simply get public IP.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/public-ip"&gt;public-ip&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install --save public-ip
&lt;/code&gt;&lt;/pre&gt;&lt;!-- more --&gt;
&lt;h3 id="usage"&gt;Usage&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;const publicIp = require(&amp;#39;public-ip&amp;#39;);
 
publicIp.v4().then(ip =&amp;gt; { 
 console.log(ip);
 //=&amp;gt; &amp;#39;46.5.21.123&amp;#39; 
});
 
publicIp.v6().then(ip =&amp;gt; {
 console.log(ip);
 //=&amp;gt; &amp;#39;fe80::200:f8ff:fe21:67cf&amp;#39; 
});
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="set-https"&gt;Set HTTPS&lt;/h4&gt;
&lt;p&gt;If using https, it will query based on &lt;a href="https://github.com/major/icanhaz"&gt;icanhazip.com&lt;/a&gt; service.&lt;/p&gt;</description></item><item><title>Automated Deployment Based on Github and Coding Code Hosting Platforms</title><link>https://time-friend.com/en/archive/automated-deployment-based-on-github-and-coding-code-hosting-platforms/</link><pubDate>Tue, 14 Feb 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/automated-deployment-based-on-github-and-coding-code-hosting-platforms/</guid><description>&lt;p&gt;Since playing with Raspberry Pi, I need to frequently update code to Raspberry Pi every day.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s too frequent, repetitive things need to be done over and over. Very time-consuming.&lt;/p&gt;
&lt;p&gt;Found Github and Coding both have webhook functionality,&lt;/p&gt;
&lt;p&gt;So I had an idea:&lt;/p&gt;
&lt;p&gt;Want every time git push updates code,
Use hosting platform&amp;rsquo;s webhook to notify my Raspberry Pi,
After receiving notification, automatically update hosting platform&amp;rsquo;s latest code, and automatically restart.&lt;/p&gt;</description></item><item><title>Generate Aliyun API Signature with Node.js</title><link>https://time-friend.com/en/archive/generate-aliyun-api-signature-with-nodejs/</link><pubDate>Mon, 13 Feb 2017 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/generate-aliyun-api-signature-with-nodejs/</guid><description>&lt;p&gt;To call Aliyun&amp;rsquo;s DNS API, you must generate the signature required by Aliyun.
&lt;a href="https://help.aliyun.com/document_detail/29747.html?spm=5176.doc29743.2.4.SAqOxJ"&gt;Signature Mechanism&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I couldn&amp;rsquo;t find Node.js related code for getting signatures online.
According to Aliyun&amp;rsquo;s requirements, I wrote a program myself to easily generate signatures.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;querystring&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;querystring&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;crypto&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;crypto&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getSignatureParams&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;StringToSign&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;GET&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;percentEncode&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;percentEncode&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;uriSort&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Signture&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getSignture&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;StringToSign&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Signature&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Signture&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Return complete uri with signature
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;percentEncode&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Percent encode uri
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; encodeURI(&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/ /g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;%20&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/\//g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;%2F&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/\+/g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;%20&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/\*/g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;%2A&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/\%7E/g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;~&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/\=/g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;%3D&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/\&amp;amp;/g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;%26&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/\:/g&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;%253A&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getSignture&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Signature&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Calculate HMAC
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 47awTgVxfVEBL8hewkBgYD6kEvuJn0 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;crypto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;createHmac&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;sha1&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;testsecret&amp;amp;&amp;#34;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// Your secret
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;update&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Signature&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;digest&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;base64&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;uriSort&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;uri&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Sort uri parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;querystring&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;uri&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [].&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Disable Mac SIP and Uninstall Input Methods on Mac</title><link>https://time-friend.com/en/archive/disable-mac-sip-and-uninstall-input-methods/</link><pubDate>Sat, 21 Jan 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/disable-mac-sip-and-uninstall-input-methods/</guid><description>&lt;p&gt;On Mac computers, some extra input methods found can&amp;rsquo;t be deleted. Every time switching input methods always need to press several more times. Extremely annoying.&lt;/p&gt;
&lt;p&gt;First is the system default input method.&lt;/p&gt;
&lt;h2 id="disable-mac-system-sip"&gt;Disable Mac System SIP&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Restart system, hold Command + R to enter recovery mode.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click Terminal in top menu bar Utilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter the following command to disable SIP protection mechanism.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;csrutil disable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;After execution, output the following information indicating disable successful.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Successfully disabled System Integrity Protection. Please restart the machine &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; the changes to take effect.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Finally restart system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="re-enable-sip-method"&gt;Re-enable SIP Method&lt;/h2&gt;
&lt;p&gt;In recovery mode terminal enter the following command&lt;/p&gt;</description></item><item><title>Raspberry Auto Time Calibration</title><link>https://time-friend.com/en/archive/raspberry-auto-time-calibration/</link><pubDate>Fri, 20 Jan 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/raspberry-auto-time-calibration/</guid><description>&lt;p&gt;Should be Raspberry Pi system version issue, many methods online to enable Network Time Protocol (auto time calibration) have failed. For a beginner like me, tried many methods, none succeeded.&lt;/p&gt;
&lt;p&gt;Today let&amp;rsquo;s talk about the correct way to enable;&lt;/p&gt;
&lt;p&gt;Raspberry Pi doesn&amp;rsquo;t enable auto time calibration by default. Need to enable NTP (Network Time Protocol) to ensure time accuracy as much as possible.&lt;/p&gt;
&lt;h3 id="enable-ntp"&gt;Enable NTP:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo timedatectl set-ntp true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next let&amp;rsquo;s see if time is correct:&lt;/p&gt;</description></item><item><title>Is POST More Secure Than GET?</title><link>https://time-friend.com/en/archive/post-vs-get-security/</link><pubDate>Mon, 16 Jan 2017 11:46:35 +0000</pubDate><guid>https://time-friend.com/en/archive/post-vs-get-security/</guid><description>&lt;p&gt;From the very first day we learned about sending requests, teachers told us:
POST requests are more secure than GET requests.&lt;/p&gt;
&lt;h2 id="why"&gt;Why?&lt;/h2&gt;
&lt;p&gt;In the era of sending requests via forms, GET requests carried information in the URL bar, while POST did not — POST put the information in the request body.&lt;/p&gt;
&lt;p&gt;Because GET requests put parameters in the URL bar, others could see them, inevitably exposing some information.&lt;/p&gt;
&lt;p&gt;Hence the conclusion: POST is more secure than GET.&lt;/p&gt;</description></item><item><title>Raspberry Startup pm2</title><link>https://time-friend.com/en/archive/raspberry-startup-pm2/</link><pubDate>Thu, 12 Jan 2017 20:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/raspberry-startup-pm2/</guid><description>&lt;p&gt;My Raspberry Pi journey can be described as bumpy, researched for over ten hours before installing Node.js.&lt;/p&gt;
&lt;p&gt;Next wanted to do startup pm2, struggled for another ten hours. Methods online because couldn&amp;rsquo;t keep up with version iterations updated, causing various failures.&lt;/p&gt;
&lt;p&gt;Next, introduce method to make pm2 startup on Raspberry Pi&lt;/p&gt;
&lt;p&gt;First download pm2&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cnpm install pm2 -g
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run code that needs to run&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pm2 start app.js
&lt;/code&gt;&lt;/pre&gt;&lt;!-- more --&gt;
&lt;p&gt;Save pm2 running state at this time, so after startup, pm2 can rerun app.js&lt;/p&gt;</description></item><item><title>Raspberry Install Node.js</title><link>https://time-friend.com/en/archive/raspberry-install-nodejs/</link><pubDate>Wed, 11 Jan 2017 22:30:05 +0000</pubDate><guid>https://time-friend.com/en/archive/raspberry-install-nodejs/</guid><description>&lt;p&gt;My installed Raspberry Pi system comes with Node.js, but version is very low. And no npm.
To install new version nodejs, I struggled for over ten hours, various methods online failed.&lt;/p&gt;
&lt;p&gt;Finally installed successfully, next I&amp;rsquo;ll introduce my installation method.&lt;/p&gt;
&lt;h3 id="download-nodejs"&gt;Download Node.js&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://nodejs.org/en/download/"&gt;Node.js Download Page&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;We choose Linux Binaries (ARM) ARMv7 version, copy download link&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-armv7l.tar.xz
tar -xzf node-v6.9.5-linux-armv7l.tar.xz // Extract installation package
sudo mv node-v6.9.5-linux-armv7l /usr/local/bin/node/
sudo ln /usr/local/bin/node/bin/node /usr/local/bin/node
sudo ln -s /usr/local/bin/node/lib/node_modules/npm/bin/npm /usr/local/bin/npm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alright, at this time we enter in any directory:&lt;/p&gt;</description></item><item><title>Raspberry External Network Access</title><link>https://time-friend.com/en/archive/raspberry-external-network-access/</link><pubDate>Tue, 10 Jan 2017 20:53:05 +0000</pubDate><guid>https://time-friend.com/en/archive/raspberry-external-network-access/</guid><description>&lt;p&gt;I want to operate my home Raspberry Pi when at company.
But home ip address is dynamic, what should I do?&lt;/p&gt;
&lt;p&gt;After various online searches, using router port forwarding or DMZ, can achieve external network access to internal network.&lt;/p&gt;
&lt;p&gt;But after I set it up, didn&amp;rsquo;t succeed. Struggled for a long time, didn&amp;rsquo;t find the reason. Finally ended in failure. (I suspect I bought a fake router).&lt;/p&gt;
&lt;p&gt;After trying various solutions, using Peanut Shell can achieve external network access to internal network, Peanut Shell&amp;rsquo;s term is:&lt;/p&gt;</description></item><item><title>Raspberry Operate via SSH</title><link>https://time-friend.com/en/archive/raspberry-operate-via-ssh/</link><pubDate>Tue, 10 Jan 2017 17:53:05 +0000</pubDate><guid>https://time-friend.com/en/archive/raspberry-operate-via-ssh/</guid><description>&lt;p&gt;After various searches, various struggles, finally installed operating system for my little Raspberry Pi.
But, this PIXEL OS graphical interface, various inexplicable bugs that won&amp;rsquo;t respond.
After struggling for several hours, made me very frustrated.&lt;/p&gt;
&lt;p&gt;Because just started with Linux, many problems need online searches, switching back and forth between PC and Raspberry Pi is really uncomfortable.&lt;/p&gt;
&lt;p&gt;Below introduces method to control Raspberry Pi via SSH from another computer. To solve the above frustrating problems.&lt;/p&gt;</description></item><item><title>Raspberry System Installation</title><link>https://time-friend.com/en/archive/raspberry-system-installation/</link><pubDate>Tue, 10 Jan 2017 12:43:05 +0000</pubDate><guid>https://time-friend.com/en/archive/raspberry-system-installation/</guid><description>&lt;p&gt;New Year passed, Taobao merchants finally started working and shipping.
Before New Year, wanted to buy a Raspberry Pi to play with. But my luck was bad, merchants were already preparing to go home for New Year.&lt;/p&gt;
&lt;p&gt;Yesterday ordered on Taobao. Got it today. I bought Raspberry-Pi3 Modle B.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.alili.tech/images/pi-2.jpg" alt=""&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Raspberry Pi doesn&amp;rsquo;t come with hard drive, so if you want to install system, need to prepare TF card or USB drive yourself.&lt;/p&gt;</description></item><item><title>My Project Debugging Methods at Work</title><link>https://time-friend.com/en/archive/debugging-methods/</link><pubDate>Wed, 04 Jan 2017 11:46:35 +0000</pubDate><guid>https://time-friend.com/en/archive/debugging-methods/</guid><description>&lt;h2 id="mobile-debugging"&gt;Mobile Debugging&lt;/h2&gt;
&lt;p&gt;To debug mobile pages on a PC, follow these steps:&lt;/p&gt;
&lt;h3 id="pc"&gt;PC&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download &lt;a href="https://mp.weixin.qq.com/wiki/10/e5f772f4521da17fa0d7304f68b97d7e.html"&gt;WeChat Web Developer Tools&lt;/a&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the WeChat Developer Tools and select Mobile Debugging;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select a request and copy the cookie;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Chrome DevTools on your computer, switch to the console, and enter the following code (for authentication):&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; document.cookie=&amp;#34;the cookie you just copied&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;If it&amp;rsquo;s a WeChat page, you need to use Chrome to simulate the WeChat browser&amp;rsquo;s user-agent. Tutorial:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="http://wangbaiyuan.cn/analog-ua-implementation-access-to-open-only-on-the-app-page.html"&gt;Simulate UA to access pages that can only be opened on WeChat&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Creating a Canvas Particle Effect</title><link>https://time-friend.com/en/archive/canvas-particle-effect/</link><pubDate>Sun, 04 Sep 2016 11:46:35 +0000</pubDate><guid>https://time-friend.com/en/archive/canvas-particle-effect/</guid><description>&lt;p&gt;Preview:
&lt;a href="http://time-friend.com/examples/canvas/1.html"&gt;Canvas Simple Particle Effect Preview&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;Canvas Simple Particle Effect Preview&amp;lt;/&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;overflow&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;hidden&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;canvas&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dotCanvas&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;canvas&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;domConvas&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;dotCanvas&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;domConvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getContext&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;2d&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winWidth&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;documentElement&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clientWidth&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winHeight&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;documentElement&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clientHeight&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;domConvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winWidth&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;domConvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winHeight&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dots&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dots&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;() &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winWidth&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;() &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winHeight&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;xm&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;amen&lt;/span&gt;() &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.5&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;amen&lt;/span&gt;() &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ym&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;amen&lt;/span&gt;() &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.5&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;amen&lt;/span&gt;() &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;amen&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;!!&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;() &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dotMove&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dotMove&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clearRect&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;winWidth&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;winHeight&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dots&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xm&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ym&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winWidth&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xm&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xm&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;winHeight&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ym&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ym&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fillRect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dots&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dots&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;dot2&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gou&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gu&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xian&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gou&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gou&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gu&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gu&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;xian&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dot2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;beginPath&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;strokeStyle&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;rgba(0,0,0,1)&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;lineWidth&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;moveTo&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;dot&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;lineTo&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dot2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;dot2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;oCanvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stroke&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;requestAnimationFrame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dotMove&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Replaced and Non-Replaced Elements</title><link>https://time-friend.com/en/archive/replaced-and-non-replaced-elements/</link><pubDate>Mon, 29 Aug 2016 17:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/replaced-and-non-replaced-elements/</guid><description>&lt;p&gt;Suddenly heard about this concept. Never heard of it before. So I looked it up to learn more.&lt;/p&gt;
&lt;h2 id="replaced-and-non-replaced-elements"&gt;Replaced and Non-Replaced Elements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Replaced elements generally refer to elements that have default styles, such as: img, input, textarea, select, object&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Non-replaced elements are the opposite, that is, all elements other than replaced elements like: img, input, textarea, select, object.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JavaScript Operator Precedence</title><link>https://time-friend.com/en/archive/javascript-operator-precedence/</link><pubDate>Thu, 25 Aug 2016 11:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/javascript-operator-precedence/</guid><description>&lt;h2 id="javascript-operators"&gt;JavaScript Operators&lt;/h2&gt;
&lt;p&gt;The following table lists JavaScript operators, ordered from highest to lowest precedence. Operators with the same precedence are evaluated left to right.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Operator&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;. [ ] ( )&lt;/td&gt;
					&lt;td&gt;Field access, array indexing, function calls, and expression grouping&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;++ &amp;ndash; - ~ ! delete new typeof void&lt;/td&gt;
					&lt;td&gt;Unary operators, return data type, object creation, undefined value&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;/ %|Multiplication, division, remainder&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;+|Addition, subtraction, string concatenation
&amp;laquo; &amp;raquo; &amp;raquo;&amp;gt;|Shift
&amp;lt; &amp;lt;= &amp;gt; &amp;gt;= instanceof|Less than, less than or equal, greater than, greater than or equal, instanceof
== != === !==|Equality, inequality, strict equality, strict inequality
&amp;amp; |Bitwise AND
^|Bitwise XOR
| | Bitwise OR
&amp;amp;&amp;amp; |Logical AND
|| | Logical OR
?: |Conditional (ternary)
= OP=|Assignment, compound assignment (e.g. += and &amp;amp;=)
, |Multiple evaluation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>A Trap with Fetch</title><link>https://time-friend.com/en/archive/fetch-trap/</link><pubDate>Wed, 08 Jun 2016 22:52:35 +0000</pubDate><guid>https://time-friend.com/en/archive/fetch-trap/</guid><description>&lt;p&gt;Fetch does not include cookies in cross-origin requests.&lt;/p&gt;
&lt;p&gt;Solution:&lt;/p&gt;
&lt;p&gt;Add the parameter &lt;code&gt;{credentials: 'include'}&lt;/code&gt; to include cookies in the request.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;doAct.action&amp;#39;&lt;/span&gt;, {&lt;span style="color:#a6e22e"&gt;credentials&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;include&amp;#39;&lt;/span&gt;}).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>About HTML5 History API</title><link>https://time-friend.com/en/archive/html5-history-api/</link><pubDate>Mon, 06 Jun 2016 23:52:35 +0000</pubDate><guid>https://time-friend.com/en/archive/html5-history-api/</guid><description>&lt;p&gt;About HTML5 History API&lt;/p&gt;
&lt;p&gt;HTML5 enhanced the history API.
In SPAs, there are two ways to change the URL without refreshing the page:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Modify the page&amp;rsquo;s hash value&lt;/li&gt;
&lt;li&gt;Use the enhanced &lt;code&gt;pushState&lt;/code&gt; from HTML5&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&amp;rsquo;s start with hash, which works in all browsers.&lt;/p&gt;
&lt;p&gt;Hash is what we used to call an anchor.
We&amp;rsquo;re not unfamiliar with it.
We can set it via:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;location&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hash&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;212345&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;p&gt;This sets the URL&amp;rsquo;s hash value. The result looks like:&lt;/p&gt;</description></item><item><title>About FormData File Upload</title><link>https://time-friend.com/en/archive/formdata-file-upload/</link><pubDate>Fri, 03 Jun 2016 23:46:35 +0000</pubDate><guid>https://time-friend.com/en/archive/formdata-file-upload/</guid><description>&lt;p&gt;About file upload&lt;/p&gt;
&lt;p&gt;In the modern era, use input file to select a file,
then pass the DOM object into FormData.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filedata&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;file&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;formData&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FormData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;formData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;append&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;file&amp;#39;&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;filedata&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;XMLHttpRequest&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;open&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;formData&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onreadystatechange&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;readyState&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;staus&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;something&lt;/span&gt;....
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// assuming the HTML already has a form with an input type=&amp;#34;file&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;form&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// just pass it into FormData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;formData&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FormData&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;XMLHttpRequest&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;open&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;formData&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onreadystatechange&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;readyState&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;staus&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;something&lt;/span&gt;....
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the era before FormData, we used form to upload files.&lt;/p&gt;</description></item><item><title>AngularJS Lazy Loading (3)</title><link>https://time-friend.com/en/archive/angularjs-lazy-loading-3/</link><pubDate>Wed, 01 Jun 2016 23:55:35 +0000</pubDate><guid>https://time-friend.com/en/archive/angularjs-lazy-loading-3/</guid><description>&lt;p&gt;The previous article roughly described Angular&amp;rsquo;s startup process,&lt;/p&gt;
&lt;p&gt;If you want to asynchronously load third-party modules in your own project, you need to run through the main logic from the previous article again.&lt;/p&gt;
&lt;p&gt;This way, all methods of third-party modules can be loaded into Angular.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$controllerProvider&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$compileProvider&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$filterProvider&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$provide&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$injector&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;$controllerProvider&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$compileProvider&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$filterProvider&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$injector&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//As mentioned in the first article, expose internal methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$controllerProvider&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;register&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;directive&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$compileProvider&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;directive&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$filterProvider&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;register&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;factory&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;factory&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;service&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;service&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;constant&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;constant&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;decorator&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;decorator&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//And define a global function for easy future calls
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Code for loading third-party modules,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.&lt;span style="color:#a6e22e"&gt;addModule&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;moduleName&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;module&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;angular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;moduleName&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ngProviders&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$controllerProvider&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$controllerProvider&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$compileProvider&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$compileProvider&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$filterProvider&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$filterProvider&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$provide&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$provide&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;requires&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;requires&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;addModule&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;requires&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;angular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_invokeQueue&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ngProviders&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;$injector&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]].&lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;angular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_configBlocks&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ngProviders&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;$injector&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]].&lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;angular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_runBlocks&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;$injector&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;invoke&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>AngularJS Lazy Loading (2)</title><link>https://time-friend.com/en/archive/angularjs-lazy-loading-2/</link><pubDate>Tue, 31 May 2016 20:34:35 +0000</pubDate><guid>https://time-friend.com/en/archive/angularjs-lazy-loading-2/</guid><description>&lt;p&gt;In the previous article, we implemented the simplest AngularJS lazy loading,&lt;/p&gt;
&lt;p&gt;by replacing Angular&amp;rsquo;s internal methods and using require.js with $q to complete lazy loading.&lt;/p&gt;
&lt;p&gt;Today let&amp;rsquo;s talk about how Angular lazy loads third-party modules;&lt;/p&gt;
&lt;p&gt;Before that, we need to understand how Angular starts.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://sfault-image.b0.upaiyun.com/179/316/1793163034-56fde93e313cd_articlex" alt=""&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h5 id="setupmoduleloader-method"&gt;setupModuleLoader Method&lt;/h5&gt;
&lt;p&gt;In the above figure, we need to pay attention to a very important method;&lt;/p&gt;
&lt;p&gt;setupModuleLoader method, as the name suggests - module loader;&lt;/p&gt;</description></item><item><title>AngularJS Lazy Loading (1)</title><link>https://time-friend.com/en/archive/angularjs-lazy-loading-1/</link><pubDate>Mon, 30 May 2016 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/angularjs-lazy-loading-1/</guid><description>&lt;p&gt;Today let&amp;rsquo;s talk about a problem that has been bothering me for a long time. AngularJS lazy loading.&lt;/p&gt;
&lt;p&gt;The benefits of Angular don&amp;rsquo;t need to be mentioned here,
but after using it for a while, you&amp;rsquo;ll find that all Controllers, Services, Directives, etc. of a website are loaded completely,
before the page starts running.&lt;/p&gt;
&lt;p&gt;For small projects with little code, this doesn&amp;rsquo;t feel like a big problem.&lt;/p&gt;
&lt;p&gt;But when there are more pages, the main page becomes increasingly bloated. Useful and useless code are all loaded.
Although loading everything means the first page load will be much slower, subsequent pages will be extremely fast.
But this is not Smart at all.&lt;/p&gt;</description></item><item><title>Journey</title><link>https://time-friend.com/en/archive/journey/</link><pubDate>Sat, 28 May 2016 14:19:04 +0000</pubDate><guid>https://time-friend.com/en/archive/journey/</guid><description>&lt;p&gt;&lt;img src="https://static.alili.tech/images/journey.jpg" alt="journey"&gt;&lt;/p&gt;</description></item><item><title>WeChat Browser Dynamically Modify Title</title><link>https://time-friend.com/en/archive/wechat-browser-dynamically-modify-title/</link><pubDate>Thu, 26 May 2016 11:43:05 +0000</pubDate><guid>https://time-friend.com/en/archive/wechat-browser-dynamically-modify-title/</guid><description>&lt;h2 id="wechat-browser-dynamically-modify-title"&gt;WeChat Browser Dynamically Modify Title&lt;/h2&gt;
&lt;p&gt;Why this article? Previously when doing spa page development, discovered something very puzzling.&lt;/p&gt;
&lt;p&gt;The following code in WeChat browser is invalid.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;I am title&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After title is first generated, cannot be changed.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s okay,&lt;/p&gt;
&lt;p&gt;Below we use black magic code to complete title modification in WeChat browser.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;I am title&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;iframe&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;createElement&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;iframe&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;iframe&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;src&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/favicon.ico&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;appendChild&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;iframe&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;iframe&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onload&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;removeChild&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;iframe&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Like this, title changed.&lt;/p&gt;</description></item><item><title>JavaScript Tips and Tricks</title><link>https://time-friend.com/en/archive/javascript-tricks/</link><pubDate>Wed, 25 May 2016 11:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/javascript-tricks/</guid><description>&lt;h2 id="type-conversion"&gt;Type Conversion&lt;/h2&gt;
&lt;h3 id="array-to-string"&gt;Array to String&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//1,2,3,4,5,6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="string-to-number"&gt;String to Number&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;999&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//999
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;999&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//999
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="string-to-number-1"&gt;String to Number&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;999&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 999
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="floor"&gt;Floor&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~~&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.23232656&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;563.933333&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 563
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;h3 id="boolean-conversion"&gt;Boolean Conversion&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;!!&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;!!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;null&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;!!&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;undefined&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;!!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;undefined&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;!!&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;!!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt;&lt;span style="color:#f92672"&gt;=!!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt;&lt;span style="color:#f92672"&gt;=!!&lt;/span&gt;[]; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt;&lt;span style="color:#f92672"&gt;=!!&lt;/span&gt;{}; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt;&lt;span style="color:#f92672"&gt;=!!&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Boolean(&lt;span style="color:#e6db74"&gt;&amp;#39;false&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt;&lt;span style="color:#f92672"&gt;=!!&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Boolean(&lt;span style="color:#e6db74"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="check-if-an-object-has-a-property"&gt;Check if an Object Has a Property&lt;/h2&gt;
&lt;h3 id="direct-check"&gt;Direct Check&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;){ &lt;span style="color:#75715e"&gt;//obj.b ==&amp;gt;123
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runs&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//runs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;){ &lt;span style="color:#75715e"&gt;//obj.b ==&amp;gt;undefined
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runs&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//does not run
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;){ &lt;span style="color:#75715e"&gt;//obj.b ==&amp;gt;false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runs&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//does not run
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Not strict: if value is 0, undefined, false, null... it also evaluates to false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="in-operator"&gt;in Operator&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;){ &lt;span style="color:#75715e"&gt;// &amp;#39;a&amp;#39; in obj ==&amp;gt;true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runs&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//runs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;b&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;){&lt;span style="color:#75715e"&gt;// &amp;#39;a&amp;#39; in obj ==&amp;gt;false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runs&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//does not run
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="using-hasownproperty"&gt;Using hasOwnProperty&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hasOwnProperty&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;)){ &lt;span style="color:#75715e"&gt;//==&amp;gt;true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runs&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//runs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hasOwnProperty&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;)){ &lt;span style="color:#75715e"&gt;//==&amp;gt;false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runs&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//does not run
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;There are many more, I&amp;rsquo;ll add them slowly.&lt;/p&gt;</description></item><item><title>Common Browser Local Storage Methods</title><link>https://time-friend.com/en/archive/browser-local-storage/</link><pubDate>Fri, 29 Apr 2016 17:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/browser-local-storage/</guid><description>&lt;p&gt;In daily development, you will inevitably encounter requirements for storing some data in the browser. Currently, the commonly used storage methods are:&lt;/p&gt;
&lt;h2 id="cookie"&gt;cookie&lt;/h2&gt;
&lt;p&gt;Cookie was not originally designed for data storage, but rather to distinguish HTTP requests.
That&amp;rsquo;s why every HTTP request carries cookies. If the amount of data stored in cookies is too large, it will certainly cause HTTP performance issues.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// set cookie (store data)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setcookie&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;expired&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;domain&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Date();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Cookie Name Must not be Null&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Cookie Value Must not be Null&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;expired&lt;/span&gt;&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;expired&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;domain&lt;/span&gt;&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;domain&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;window.&lt;span style="color:#a6e22e"&gt;location&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setTime&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getTime&lt;/span&gt;()&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;expired&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;cookie&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;escape&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;)&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;;expires=&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toGMTString&lt;/span&gt;()&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;;path=&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;;domain=&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;domain&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// read cookie (read data)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getcookie&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;allcookie&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;document.&lt;span style="color:#a6e22e"&gt;cookie&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;thiscookie&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;allcookie&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;match&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;=[^\\s]*&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mycookie&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;thiscookie&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mycookie&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;substring&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;mycookie&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;unescape&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="localstorage"&gt;localStorage&lt;/h2&gt;
&lt;p&gt;Compared to cookie operations, localStorage is much simpler.
Additionally, every update to localStorage triggers an onstorage event.&lt;/p&gt;</description></item><item><title>What is Browser Repaint and Reflow</title><link>https://time-friend.com/en/archive/what-is-browser-repaint-and-reflow/</link><pubDate>Mon, 25 Apr 2016 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/what-is-browser-repaint-and-reflow/</guid><description>&lt;h1 id="repaint-and-reflow-definitions"&gt;Repaint and Reflow Definitions&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Repaint: When current element&amp;rsquo;s style (background color, font color, etc.) changes, we only need to re-render the changed element, repaint has smaller impact on browser performance, so generally not considered.
　　Repaint situations: Changing container&amp;rsquo;s appearance style, etc., like background: black, etc. Changing appearance, not changing layout, not affecting other dom.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reflow: Process where browser recalculates element positions and geometric structure in document to re-render part or all of document. Because reflow may cause entire dom tree reconstruction, it&amp;rsquo;s a major performance killer. An element&amp;rsquo;s reflow causes subsequent reflow of all its child elements and ancestors immediately following it in DOM.&lt;/p&gt;</description></item><item><title>Mobile Website Tap Highlight or Gray Background Issue</title><link>https://time-friend.com/en/archive/mobile-tap-highlight-issue/</link><pubDate>Wed, 20 Apr 2016 19:33:33 +0000</pubDate><guid>https://time-friend.com/en/archive/mobile-tap-highlight-issue/</guid><description>&lt;p&gt;Mobile website tap highlight or gray background issue&lt;/p&gt;
&lt;p&gt;Simply add a class style to the bound event element to make the background transparent when the event is triggered&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;{&lt;span style="color:#66d9ef"&gt;-webkit-&lt;/span&gt;tap-highlight-color:&lt;span style="color:#66d9ef"&gt;transparent&lt;/span&gt;;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Source Code Analysis - Small Differences Between Providers in AngularJS</title><link>https://time-friend.com/en/archive/angularjs-provider-differences-source-analysis/</link><pubDate>Mon, 22 Feb 2016 16:14:25 +0000</pubDate><guid>https://time-friend.com/en/archive/angularjs-provider-differences-source-analysis/</guid><description>&lt;h1 id="angularjs-providers"&gt;AngularJS Providers&lt;/h1&gt;
&lt;p&gt;Angular has the following methods to create providers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;provider()&lt;/li&gt;
&lt;li&gt;service()&lt;/li&gt;
&lt;li&gt;factory()&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="provider-usage"&gt;Provider Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;angular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;app&amp;#34;&lt;/span&gt;, [])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;HelloAngular&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;$get&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Xiaoming&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;MyCtrl&amp;#39;&lt;/span&gt;, [&lt;span style="color:#e6db74"&gt;&amp;#39;$scope&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;HelloAngular&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;helloAngular&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;gameName&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;helloAngular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="service-usage"&gt;Service Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;angular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;app&amp;#34;&lt;/span&gt;, [])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;service&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;HelloAngular&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Xiaoming&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;MyCtrl&amp;#39;&lt;/span&gt;, [&lt;span style="color:#e6db74"&gt;&amp;#39;$scope&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;HelloAngular&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;helloAngular&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;gameName&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;helloAngular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="factory-usage"&gt;Factory Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;angular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;module&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;app&amp;#34;&lt;/span&gt;, [])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;factory&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;HelloAngular&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Xiaoming&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 	&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;MyCtrl&amp;#39;&lt;/span&gt;, [&lt;span style="color:#e6db74"&gt;&amp;#39;$scope&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;HelloAngular&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;helloAngular&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;gameName&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;helloAngular&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The implementation methods differ, but the usage is exactly the same&lt;/p&gt;</description></item><item><title>Hexo SEO Optimization (Search Engine Optimization)</title><link>https://time-friend.com/en/archive/hexo-seo-optimization/</link><pubDate>Tue, 19 Jan 2016 21:32:05 +0000</pubDate><guid>https://time-friend.com/en/archive/hexo-seo-optimization/</guid><description>&lt;p&gt;Today let&amp;rsquo;s talk about hexo&amp;rsquo;s SEO, specifically some search engine optimization for Baidu and Google.&lt;/p&gt;
&lt;h2 id="sitemap"&gt;Sitemap&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install sitemap plugin&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install hexo-generator-sitemap --save
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install hexo-generator-baidu-sitemap --save
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Add the following configuration in &lt;code&gt;_config.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sitemap:
 path: sitemap.xml
baidusitemap:
 path: baidusitemap.xml
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Generate sitemap&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hexo clean
hexo g
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="baidu-active-push"&gt;Baidu Active Push&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install plugin&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install hexo-baidu-url-submit --save
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;Plugin configuration in &lt;code&gt;_config.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;baidu_url_submit:
 count: 10 # Number of latest links to submit
 host: time-friend.com # Domain registered on Baidu Webmaster Platform, although the official recommendation includes www, it can be without.
 token: your_token ## Note: this is your secret key, please don&amp;#39;t publish it in public repositories!
 path: baidu_urls.txt # Text file address, new links will be saved in this text file
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Deploy configuration in &lt;code&gt;_config.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;deploy:
- type: git # Deploy type
 repository: xxxxx # Repository
 branch: master 
- type: baidu_url_submitter # Add this line
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="4"&gt;
&lt;li&gt;Push and deploy&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hexo clean
hexo g
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>ES6 Proxy</title><link>https://time-friend.com/en/archive/es6-proxy/</link><pubDate>Fri, 31 Jul 2015 21:17:51 +0000</pubDate><guid>https://time-friend.com/en/archive/es6-proxy/</guid><description>&lt;h3 id="proxy"&gt;Proxy&lt;/h3&gt;
&lt;p&gt;ES6 introduces Proxy. So what is Proxy?&lt;/p&gt;
&lt;p&gt;Proxy, as the name suggests, acts as a proxy. In ES6, Proxy can intercept and customize operations performed on an object.&lt;/p&gt;
&lt;p&gt;This means you can listen to and modify access and changes made to an object from the outside, and do additional things.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;proxyObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Proxy(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;,{ &lt;span style="color:#75715e"&gt;//proxyObj will inherit obj
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;I&amp;#39;ve been modified&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Modify property
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;proxyObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// After the property is modified, the previously set handler is triggered
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s that simple.&lt;/p&gt;</description></item><item><title>ES6 Promise</title><link>https://time-friend.com/en/archive/es6-promise/</link><pubDate>Tue, 28 Jul 2015 23:13:56 +0000</pubDate><guid>https://time-friend.com/en/archive/es6-promise/</guid><description>&lt;h3 id="promise"&gt;Promise&lt;/h3&gt;
&lt;p&gt;Promise, like Generator from the previous chapter, is also a solution for asynchronous programming.&lt;/p&gt;
&lt;p&gt;You can find similar approaches for handling async operations in jQuery and Angular.&lt;/p&gt;
&lt;h3 id="basic-usage"&gt;Basic Usage&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// First, instantiate a Promise
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;promise&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Promise(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;reject&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Promise has two parameters: resolve and reject — one for success, one for failure
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#75715e"&gt;/* true or false */&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// Success: executes the first callback of promise.then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;reject&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// Failure: executes the second callback of promise.then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;promise&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// When resolve() runs in the Promise function, this executes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// It receives the parameter passed to resolve
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;},&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// When reject() runs in the Promise function, this executes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// It receives the parameter passed to reject
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}).&lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// If either callback in then throws an error, catch handles it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// This prevents the code from stopping execution due to errors
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s a complete Promise usage example. Simple, isn&amp;rsquo;t it?&lt;/p&gt;</description></item><item><title>ES6 Generator</title><link>https://time-friend.com/en/archive/es6-generator/</link><pubDate>Sat, 25 Jul 2015 22:15:47 +0000</pubDate><guid>https://time-friend.com/en/archive/es6-generator/</guid><description>&lt;h3 id="basic-usage-of-generator"&gt;Basic Usage of Generator&lt;/h3&gt;
&lt;p&gt;Generator is an asynchronous solution provided by ES6. What can it do?&lt;/p&gt;
&lt;p&gt;What specific problems can it solve for us?&lt;/p&gt;
&lt;p&gt;For example, let&amp;rsquo;s say I need to do something, but it requires two ajax calls to complete first.&lt;/p&gt;
&lt;p&gt;For instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;$http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;request 1&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;success&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;$http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;request 2&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;success&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// do something ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This approach requires nested callbacks. With more requests, the code becomes very messy.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Now with Generator, how would we do it?&lt;/p&gt;</description></item><item><title>ES6 Arrow Functions</title><link>https://time-friend.com/en/archive/es6-arrow-functions/</link><pubDate>Sun, 19 Jul 2015 20:45:33 +0000</pubDate><guid>https://time-friend.com/en/archive/es6-arrow-functions/</guid><description>&lt;p&gt;ES6 introduces Arrow Functions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;hello word&amp;#34;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//hello word
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Equivalent to:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;hello word&amp;#34;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//hello word
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;p&gt;With a single parameter, you can even omit the parentheses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;hello word&amp;#34;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//hello word
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the function has no parameters, you must include the parentheses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;hello word&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As an event handler:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Callback:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;$&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;hover&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ()=&amp;gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// mouse enter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;mouse enter&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ()=&amp;gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// mouse leave
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;mouse leave&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;With arrow functions, &lt;code&gt;this&lt;/code&gt; inherits from the enclosing scope. Here&amp;rsquo;s an example:&lt;/p&gt;</description></item><item><title>ES6 Destructuring Assignment</title><link>https://time-friend.com/en/archive/es6-destructuring/</link><pubDate>Fri, 17 Jul 2015 23:32:16 +0000</pubDate><guid>https://time-friend.com/en/archive/es6-destructuring/</guid><description>&lt;p&gt;Learning about destructuring reminded me of a classic problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Swap the values of two variables a and b without using a third variable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There&amp;rsquo;s also a tricky one-liner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;p&gt;Now with destructuring assignment, it&amp;rsquo;s much cleaner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;) &lt;span style="color:#75715e"&gt;//10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pretty neat, right?&lt;/p&gt;</description></item><item><title>ES6 Variables - let and const</title><link>https://time-friend.com/en/archive/es6-variables/</link><pubDate>Wed, 15 Jul 2015 20:18:24 +0000</pubDate><guid>https://time-friend.com/en/archive/es6-variables/</guid><description>&lt;p&gt;ES6 has been officially released for a month now. I&amp;rsquo;ll be sharing some study notes and my understanding of it.&lt;/p&gt;
&lt;h3 id="new-keywords-let-and-const"&gt;New Keywords: let and const&lt;/h3&gt;
&lt;p&gt;JavaScript has always used var to declare variables.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;//1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we have two new friends: let and const.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id="the-let-command"&gt;The let Command&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;//1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This looks the same as var. Let&amp;rsquo;s look at the next example.&lt;/p&gt;</description></item><item><title>ES6 Quick Start - How to Run ES6 in the Browser</title><link>https://time-friend.com/en/archive/es6-quick-start/</link><pubDate>Wed, 15 Jul 2015 19:02:36 +0000</pubDate><guid>https://time-friend.com/en/archive/es6-quick-start/</guid><description>&lt;p&gt;The word Babel can be translated as the Tower of Babel.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Bible, Old Testament, Genesis&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chapter 11 declares that at that time, humans united to build a tower that could reach heaven.
To stop this plan, God made humans speak different languages,
so they could no longer communicate with each other. The plan failed, and humans scattered across the earth.&lt;/p&gt;
&lt;p&gt;This is probably why babel.js is called Babel.&lt;/p&gt;
&lt;h3 id="how-to-run-es6"&gt;How to Run ES6&lt;/h3&gt;
&lt;h4 id="online-compilation"&gt;Online Compilation&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://babeljs.io/repl/"&gt;Babel has a REPL online compiler that can convert ES6 code to ES5 directly in the browser.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Automated Deployment Frontend Code - Using grunt-ftp-deploy</title><link>https://time-friend.com/en/archive/automated-deployment-frontend-code-grunt-ftp-deploy/</link><pubDate>Sun, 14 Jun 2015 23:36:00 +0000</pubDate><guid>https://time-friend.com/en/archive/automated-deployment-frontend-code-grunt-ftp-deploy/</guid><description>&lt;p&gt;Every time after modifying code, need to deploy to remote server, my operation steps are:&lt;/p&gt;
&lt;p&gt;Modify code &amp;ndash;&amp;gt; grunt build &amp;ndash;&amp;gt; Open FileZilla &amp;ndash;&amp;gt; Login ftp server &amp;ndash;&amp;gt; Find local folder &amp;ndash;&amp;gt; Find remote server target folder &amp;ndash;&amp;gt; Select all local files &amp;ndash;&amp;gt; Upload&lt;/p&gt;
&lt;p&gt;Because deploying code, at some times will be particularly frequent. Every time need to repeat the above eight operations. Want to do something, change this.&lt;/p&gt;
&lt;p&gt;Today our protagonist: grunt-ftp-deploy&lt;/p&gt;</description></item><item><title>Annoying AngularJS Annotations - Using grunt-ng-annotate</title><link>https://time-friend.com/en/archive/annoying-angularjs-annotations-grunt-ng-annotate/</link><pubDate>Fri, 12 Jun 2015 23:15:00 +0000</pubDate><guid>https://time-friend.com/en/archive/annoying-angularjs-annotations-grunt-ng-annotate/</guid><description>&lt;p&gt;Angular added dependency injection&lt;/p&gt;
&lt;p&gt;When writing code, roughly written as follows&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;tempController&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$http&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$state&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$timeout&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But such code, after compression will cause a problem.
Function parameters: $scope, $http, $state, $timeout will become: a,b,c,d&lt;/p&gt;
&lt;p&gt;Causing this function cannot find services to inject, because each parameter&amp;rsquo;s naming is strictly required.&lt;/p&gt;
&lt;p&gt;As follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;tempController&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;d&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;p&gt;To solve this problem, angular supports the following writing:&lt;/p&gt;</description></item><item><title>AngularJS Directive Template</title><link>https://time-friend.com/en/archive/angularjs-directive-template/</link><pubDate>Thu, 21 May 2015 22:17:36 +0000</pubDate><guid>https://time-friend.com/en/archive/angularjs-directive-template/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;myModule&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;directive&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;namespaceDirectiveName&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factory&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;injectables&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;directiveDefinitionObject&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;restrict&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Directive usage method, including tag, attribute, class, comment
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;priority&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Directive execution priority
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;template&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Template used by directive, expressed as HTML string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;templateUrl&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Load template from specified url address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Whether to replace current element with template, if false, append to current element
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;transclude&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Whether to transfer current element&amp;#39;s content to template
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scope&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;or&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;object&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Specify directive&amp;#39;s scope
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;controllerConstructor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;$scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$element&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$attrs&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;$transclude&lt;/span&gt;){...},&lt;span style="color:#75715e"&gt;// Define interface function for interacting with other directives
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;,&lt;span style="color:#75715e"&gt;// Specify other directives that need to be depended on
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;link&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;postLink&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;iElement&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;iAttrs&lt;/span&gt;) {...},&lt;span style="color:#75715e"&gt;// Programmatically manipulate DOM, including adding listeners, etc.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;compile&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;compile&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tElement&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;tAttrs&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;transclude&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pre&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;preLink&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;iElement&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;iAttrs&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;){...},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;post&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;postLink&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;scope&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;iElement&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;iAttrs&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;controller&lt;/span&gt;){...}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#75715e"&gt;// Programmatically modify DOM template copy, can return link function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;directiveDefinitionObject&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>New Beginning, Journey</title><link>https://time-friend.com/en/archive/new-beginning/</link><pubDate>Sun, 20 Jul 2014 00:00:00 +0000</pubDate><guid>https://time-friend.com/en/archive/new-beginning/</guid><description>&lt;h2 id="2014-07-20"&gt;2014-07-20&lt;/h2&gt;
&lt;p&gt;Graduated,
What you can&amp;rsquo;t learn, that&amp;rsquo;s called learning!!!!
:)&lt;/p&gt;
&lt;h2 id="2018-11-20"&gt;2018-11-20&lt;/h2&gt;
&lt;p&gt;We learn so many technologies, just to give business more possibilities, let our imagination have a solid foundation rather than random thoughts.&lt;/p&gt;
&lt;h2 id="2018-12-16"&gt;2018-12-16&lt;/h2&gt;
&lt;p&gt;Turns out the motivation for all my learning comes entirely from anxiety about the future.&lt;/p&gt;
&lt;h2 id="2018-12-28"&gt;2018-12-28&lt;/h2&gt;
&lt;p&gt;My growth seems to need to race against time.&lt;/p&gt;
&lt;h2 id="2019-01-01"&gt;2019-01-01&lt;/h2&gt;
&lt;p&gt;This year&amp;rsquo;s goals established, two points total. One is English, one is weight~&lt;/p&gt;</description></item></channel></rss>