<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Lullaby</title>
  
  
  <link href="https://theme-next.js.org/atom.xml" rel="self"/>
  
  <link href="https://theme-next.js.org/"/>
  <updated>2022-05-22T09:02:24.557Z</updated>
  <id>https://theme-next.js.org/</id>
  
  <author>
    <name>John Doe</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Web3.0初探笔记（二）</title>
    <link href="https://theme-next.js.org/web3-notes-02/"/>
    <id>https://theme-next.js.org/web3-notes-02/</id>
    <published>2022-05-22T14:35:37.000Z</published>
    <updated>2022-05-22T09:02:24.557Z</updated>
    
    <content type="html"><![CDATA[<div class="note no-icon"><p>Web3.0的势头因为元宇宙似乎更猛了，掏出收藏已久的web3.0科普资料，记录一下笔记查漏补缺</p></div><span id="more"></span><h1 id="NFT"><a href="#NFT" class="headerlink" title="NFT"></a>NFT</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p><strong>NFT（Non Fungible Token）是唯一资产所有权的记录。</strong></p><p>由于 NFT 存在于区块链上（参见<span class="exturl" data-url="aHR0cHM6Ly96aC5vZHlzc2V5ZGFvLmNvbS9hcnRpY2xlcy93aGF0LWlzLWJsb2NrY2hhaW4=">什么是区块链<i class="fa fa-external-link-alt"></i></span>），它们是：</p><ol><li>Decentralized：存储在计算机网络上。</li><li>Immutable：一旦提交就无法更改。</li><li>Open：任何人都可以看到交易历史。</li></ol><h2 id="NFT的类型"><a href="#NFT的类型" class="headerlink" title="NFT的类型"></a>NFT的类型</h2><div class="tabs" id="nft-types"><ul class="nav-tabs"><li class="tab active"><a href="#nft-types-1">1:1s</a></li><li class="tab"><a href="#nft-types-2">Collectibles</a></li><li class="tab"><a href="#nft-types-3">In-game NFTs</a></li><li class="tab"><a href="#nft-types-4">Digital real estate</a></li><li class="tab"><a href="#nft-types-5">Music NFTs</a></li></ul><div class="tab-content"><div class="tab-pane active" id="nft-types-1"><p><strong>1&#x2F;1s（</strong>发音为&quot;一对一&quot;）是单一资产。1&#x2F;1的例子是数字艺术和域名。像博物馆作品一样，人们在评估1&#x2F;1艺术NFT时会考虑艺术的质量，艺术家的声誉以及其他收藏家的愿望。2021年3月，艺术家Beeple<span class="exturl" data-url="aHR0cHM6Ly93d3cudGhldmVyZ2UuY29tLzIwMjEvMy8xMS8yMjMyNTA1NC9iZWVwbGUtY2hyaXN0aWVzLW5mdC1zYWxlLWNvc3QtZXZlcnlkYXlzLTY5LW1pbGxpb24=">在佳士得以6900万美元的价格出售了1&#x2F;1的<i class="fa fa-external-link-alt"></i></span>NFT。其他1&#x2F;1 NFT艺术家包括Xcopy，Coldie，Hackatao和<span class="exturl" data-url="aHR0cHM6Ly9mb3VuZGF0aW9uLmFwcC9AbW90aW9uc2NhcGU=">动图（<i class="fa fa-external-link-alt"></i></span>他们<span class="exturl" data-url="aHR0cHM6Ly9mb3VuZGF0aW9uLmFwcC9AbW90aW9uc2NhcGUvfi8xMTQ5ODQ=">制作了NFT Odyssey）。<i class="fa fa-external-link-alt"></i></span></p></div><div class="tab-pane" id="nft-types-2"><p><strong>收藏品</strong>是一组 NFT，每个都有独特的特征。与传统收藏品（例如棒球卡）一样，人们在评估可收藏 NFT 时会考虑稀有性、文化意义和社区。热门类别包括：</p><ul><li><strong>体育</strong>：代表运动队、球员和时刻的收藏品。示例包括<span class="exturl" data-url="aHR0cHM6Ly9uYmF0b3BzaG90LmNvbS8/Yz1DT0xMRUNUT1JTJnV0bV9zb3VyY2U9Z29vZ2xlJnV0bV9tZWRpdW09cGFpZF9zZWFyY2gmdXRtX2NhbXBhaWduPXdpdGhpbl9zZWFyY2hfYnJhbmRfZXhjbHVzaW9ubGlzdCZ1dG1fdGVybT1uYmErdG9wK3Nob3QmZ2NsaWQ9Q2owS0NRandxS3VLQmhDeEFSSXNBQ2Y0WHVGVlNpenVOQm1oN2ZIN3FFWXMxaHZDbC1UQ005S0FMckJJZnJoWHlUVmN6SGVYOFNzQzdyQWFBa2FXRUFMd193Y0ImZ2Nsc3JjPWF3LmRz">NBA top shots<i class="fa fa-external-link-alt"></i></span> （NBA 时刻）和<span class="exturl" data-url="aHR0cHM6Ly9zb3JhcmUuY29tLw==">sorare<i class="fa fa-external-link-alt"></i></span> （足球运动员）。</li><li><strong>生成艺术</strong>：从代码生成的收藏品。例如， <span class="exturl" data-url="aHR0cHM6Ly9hcnRibG9ja3MuaW8vbGVhcm4=">Art Blocks<i class="fa fa-external-link-alt"></i></span>是由程序员编写的算法生成的。</li><li><strong>个人资料图片 (PFP)</strong> ：人们购买的收藏品来代表他们的在线头像并访问 PFP 社区。例子包括<span class="exturl" data-url="aHR0cHM6Ly93d3cubGFydmFsYWJzLmNvbS9jcnlwdG9wdW5rcw==">cryptopunks<i class="fa fa-external-link-alt"></i></span>和<span class="exturl" data-url="aHR0cHM6Ly9vcGVuc2VhLmlvL2NvbGxlY3Rpb24vYm9yZWRhcGV5YWNodGNsdWI=">boredapeyachtclub<i class="fa fa-external-link-alt"></i></span> 。</li><li><strong>徽章</strong>：代表在线社区中特殊访问权限或所有权的收藏品。例子包括<span class="exturl" data-url="aHR0cHM6Ly9hdXRvZ3JhcGguaW8vZGV0YWlscy82MGZiYTAwZWQ2MWNkMjAwMGY0NzIzZjUvbmZ0">汤姆·布雷迪（Tom Brady）的签名系列<i class="fa fa-external-link-alt"></i></span>（持有者可以特别获得未来的NFT掉落和私人Discord）。</li><li><strong>&quot;乐高积木&quot;：</strong>旨在成为其他东西的积木的收藏品。示例包括<span class="exturl" data-url="aHR0cHM6Ly9vcGVuc2VhLmlvL2NvbGxlY3Rpb24vbG9vdHByb2plY3Q=">Loot<i class="fa fa-external-link-alt"></i></span> ，它具有简单的冒险装备文本列表。人们从 Loot NFT 中创建角色选择屏幕或游戏。</li></ul></div><div class="tab-pane" id="nft-types-3"><p><strong>游戏内 NFT</strong>使游戏玩家能够以 NFT 的形式购买和拥有游戏内资产。这是一个具有巨大潜力的新兴领域，因为游戏是迄今为止全球最受欢迎的娱乐类别。 <span class="exturl" data-url="aHR0cHM6Ly9heGllaW5maW5pdHkuY29tLw==">Axie Infinity<i class="fa fa-external-link-alt"></i></span>是该领域的领先者。该游戏在菲律宾等发展中国家尤其受欢迎，玩家可以通过购买、繁殖和对抗数字宠物来谋生。</p></div><div class="tab-pane" id="nft-types-4"><p><strong>数字房地产</strong>包括代表数字环境中土地的 NFT。随着人们在虚拟世界中花费更多时间，为他们创造互动空间已成为一个有利可图的市场。像<span class="exturl" data-url="aHR0cHM6Ly9kZWNlbnRyYWxhbmQub3JnLw==">Decentraland<i class="fa fa-external-link-alt"></i></span>这样的设置在区块链上出售数字房地产地块，供创作者使用。</p></div><div class="tab-pane" id="nft-types-5"><p><strong>音乐NFT</strong>使艺术家更容易为他们的作品提供资金，并使粉丝更容易分享艺术家成功的好处。<span class="exturl" data-url="aHR0cHM6Ly9yb3lhbC5pby8=">Royal<i class="fa fa-external-link-alt"></i></span>是这个领域NFT平台的一个例子。</p></div></div></div><p>以<span class="exturl" data-url="aHR0cHM6Ly93d3cub2R5c3NleWRhby5jb20vYXJ0aWNsZXMvd2h5LWJ1eS1uZnRzI2FwcHJlY2lhdGVfYXJ0">CryptoPunks<i class="fa fa-external-link-alt"></i></span>为例，官网上说：</p><div class="note info no-icon"><p>CryptoPunks是一个制作个人资料图片的NFT项目。CryptoPunks 是 10,000 个角色头像，每个都不一样，每个可以由<span class="exturl" data-url="aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXRoZXJldW0=">以太坊区块<i class="fa fa-external-link-alt"></i></span>链上的一个人正式拥有。最初，任何拥有以太坊钱包的人都可以免费领取它们，但很快就全部领完了。现在它们必须通过同样嵌入区块链的市场从某人那里购买。通过这个市场，您可以购买、竞标和出售朋克。</p></div><h2 id="寻找有趣的NFT项目"><a href="#寻找有趣的NFT项目" class="headerlink" title="寻找有趣的NFT项目"></a>寻找有趣的NFT项目</h2><p>感觉拥有一个具有唯一标识的数字头像真的是一件很geek很酷的事情，CryptoPunks因为是艺术品所以价值被哄抬得很高，到2022&#x2F;5&#x2F;22日为止，官网显示最低价格的cryptopunk为50eth，过于昂贵了，不过Odyssey也有给出寻找其他有趣NFT项目的建议：</p><ol><li><strong>寻找热门项目。</strong>可以在<span class="exturl" data-url="aHR0cHM6Ly9vcGVuc2VhLmlvLw==">OpenSea<i class="fa fa-external-link-alt"></i></span>，<span class="exturl" data-url="aHR0cHM6Ly9jcnlwdG9zbGFtLmlvLw==">CryptoSlam<i class="fa fa-external-link-alt"></i></span>和<span class="exturl" data-url="aHR0cHM6Ly9ub25mdW5naWJsZS5jb20v">nonfungible<i class="fa fa-external-link-alt"></i></span>上找到热门项目。 还可以使用付费的NFT工具，如<span class="exturl" data-url="aHR0cHM6Ly9pY3kudG9vbHMv">icy tools<i class="fa fa-external-link-alt"></i></span>和<span class="exturl" data-url="aHR0cHM6Ly9tb2J5LmdnLw==">moby.gg<i class="fa fa-external-link-alt"></i></span>来查找一分钟内的实时数据。</li><li><strong>关注NFT收藏家。</strong>顶级NFT收藏家交易大量NFT，并且通常是第一个找到热门项目的人。像 Moby.gg 这样的工具可以用来查看 <span class="exturl" data-url="aHR0cHM6Ly9tb2J5LmdnLz90YWI9V2hhbGVz">recent transactions from collectors<i class="fa fa-external-link-alt"></i></span>。还可以在Twitter上关注有趣的收藏家（从关注<span class="exturl" data-url="aHR0cHM6Ly90d2l0dGVyLmNvbS9pL3RvcGljcy8xMzY5MzExOTg4MDQwMzU1ODQw">NFT主题<i class="fa fa-external-link-alt"></i></span>开始）。</li><li><strong>加入NFT社区。</strong>可以加入NFT爱好者的社区，以获取有关项目的最新情报。<span class="exturl" data-url="aHR0cHM6Ly9kaXNjb3JkLmNvbS9pbnZpdGUvODJZYnQ2QkNGZw==">Odyssey社区<i class="fa fa-external-link-alt"></i></span>是一个很好的（和免费的）起点。最理想的NFT社区通常有一个paywall（例如，<span class="exturl" data-url="aHR0cHM6Ly90d2l0dGVyLmNvbS9NZXRhdmVyc2VfSFE=">Metaverse<i class="fa fa-external-link-alt"></i></span>，<span class="exturl" data-url="aHR0cHM6Ly90d2l0dGVyLmNvbS9GV0J0d2VldHM=">FWB<i class="fa fa-external-link-alt"></i></span>和<span class="exturl" data-url="aHR0cHM6Ly90d2l0dGVyLmNvbS9DUEdjbHVi">CPG俱乐部<i class="fa fa-external-link-alt"></i></span>）。</li></ol><h2 id="铸造、Buy-x2F-Sell"><a href="#铸造、Buy-x2F-Sell" class="headerlink" title="铸造、Buy&#x2F;Sell"></a>铸造、Buy&#x2F;Sell</h2><p><span class="exturl" data-url="aHR0cHM6Ly96aC5vZHlzc2V5ZGFvLmNvbS9hcnRpY2xlcy9ob3ctdG8tbWludC1uZnRz">指南<i class="fa fa-external-link-alt"></i></span></p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><div class="link-grid"><div class="link-grid-container"><object class="link-grid-image" data="../images/odyssey.png"></object><p>Odyssey</p><p>Web3.0科普</p><a href="https://zh.odysseydao.com/articles/what-is-web3"></a></div></div>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;note no-icon&quot;&gt;&lt;p&gt;Web3.0的势头因为元宇宙似乎更猛了，掏出收藏已久的web3.0科普资料，记录一下笔记查漏补缺&lt;/p&gt;
&lt;/div&gt;</summary>
    
    
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    <category term="Blockchain" scheme="https://theme-next.js.org/categories/Tech/Blockchain/"/>
    
    <category term="Web3.0" scheme="https://theme-next.js.org/categories/Tech/Web3-0/"/>
    
    <category term="NFT" scheme="https://theme-next.js.org/categories/Tech/Web3-0/NFT/"/>
    
    
    <category term="Blockchain" scheme="https://theme-next.js.org/tags/Blockchain/"/>
    
    <category term="Web3.0" scheme="https://theme-next.js.org/tags/Web3-0/"/>
    
  </entry>
  
  <entry>
    <title>Web3.0初探笔记（一）</title>
    <link href="https://theme-next.js.org/web3-notes/"/>
    <id>https://theme-next.js.org/web3-notes/</id>
    <published>2022-05-22T10:22:48.000Z</published>
    <updated>2022-05-22T09:02:05.235Z</updated>
    
    <content type="html"><![CDATA[<div class="note no-icon"><p>Web3.0的势头因为元宇宙似乎更猛了，掏出收藏已久的web3.0科普资料，记录一下笔记查漏补缺</p></div><span id="more"></span><h1 id="Web3-0"><a href="#Web3-0" class="headerlink" title="Web3.0"></a>Web3.0</h1><h2 id="POI-区块链的-quot-OSI-quot-体系"><a href="#POI-区块链的-quot-OSI-quot-体系" class="headerlink" title="POI: 区块链的&quot;OSI&quot;体系"></a>POI: 区块链的&quot;OSI&quot;体系</h2><p>个人对web3.0比较感兴趣是因为在区块链的发展过程中，逐渐形成了可以类比计算机网络OSI的体系。<br>目前一共有三个Layer。</p><ul><li>Layer0：大概包括物理层、数据链路层、网络层和传输层；</li><li>Laye1包括数据层、共识层和激励层；</li><li>Layer2包括合约层和应用层。比特币网络、以太坊主网等主流公链都属于Layer 1的范畴。</li></ul><p>目前在众多的公链项目中，以太坊是运行智能合约、DAPP最多的公链，也是锁仓资产价值和日均交易量最大的公链，所以在有关以太坊网络Layer1和Layer2不同扩容方案的讨论也是最多的。科普中提到的Layer1和Layer2也主要以以太坊为主。</p><p>Layer1和Layer2的一个类比: 他们的关系像中央银行与商业银行</p><ul><li>Layer1承担着中央银行的角色</li><li>layer2是各大商业银行。</li></ul><p>在现行主流的金融系统中，所有的资产都必须在中央银行结算，而具体的流通过程可以同时发生在中央银行和商业银行。</p><p>因为如果所有人都去央行结算的话，势必会发生业务拥堵的情况，更好的解决办法当然是由商业银行来先处理大量交易业务，然后由各个商业银行和中央银行结算一次整体业务，这样才能使得整个金融系统更加高效有序的运转起来。</p><p>所以从中我们能够得到的启示就是，<strong>对于在以太坊网络中存在的交易拥堵、手续费居高不下的问题，一个可行的解决方案就出炉了——将以太坊的资产存入Layer2</strong>，之后的资产流动交易环节都在Layer2上进行，<strong>只把最终结算过程放到Layer1上就可以了</strong>。</p><h2 id="web1-web2-web3"><a href="#web1-web2-web3" class="headerlink" title="web1, web2, web3"></a>web1, web2, web3</h2><p>看一下Odyssey对他们的定义：</p><div class="note info no-icon"><ul><li>Web1（1990-2000年代初）是&quot;只读&quot;的网络。人们可以通过像雅虎等目录导航到这些门户导航，去浏览一些静态网页的内容。Web1建立在HTTP这样的开源协议之上。</li><li><strong>Web2</strong> （2000 年早期 - 至今）是&quot;可读&quot; 和 &quot;可写&quot; 的网络。人们在大家都熟悉的社交平台上创作和消费内容。在 web2 中，科技巨头坐在中间商，从用户那里提取价值。Web2 建立在客户端-服务器架构上，其中用户是客户端，公司控制服务器。</li><li>Web3（2020+）是&quot;可读&quot;、&quot;可写&quot;和&quot;可拥有&quot;的网络。人们<strong>通过代币创作和消费内容，以及通过代币，获得自己创作内容的所有权</strong>。Web3建立在点对点的计算机网络基础之上，而这一网络不需要中间商就可以相互沟通。</li></ul><p><img src="https://global-uploads.webflow.com/617702c73410810254ccd237/619e8894c81ca21ef156258b_Web%202%20vs.%20web%203.png" alt="img" loading="lazy"></p></div><h2 id="区块链-amp-BTC"><a href="#区块链-amp-BTC" class="headerlink" title="区块链&amp;BTC"></a>区块链&amp;BTC</h2><p>这一块之前书和资料看得比较多了</p><p><span class="exturl" data-url="aHR0cHM6Ly96aC5vZHlzc2V5ZGFvLmNvbS9hcnRpY2xlcy93aGF0LWlzLWJsb2NrY2hhaW4=">科普参考<i class="fa fa-external-link-alt"></i></span></p><h2 id="以太坊"><a href="#以太坊" class="headerlink" title="以太坊"></a>以太坊</h2><p>以太坊的目标是成为世界上的去中心化计算机（称为 EVM 或以太坊虚拟机）。相当于区块链的基础建设系统，使用智能合约可以在虚拟机上搭建各种各样的dapp，目前比较多的dapp类型的有NFT(如<span class="exturl" data-url="aHR0cHM6Ly9vcGVuc2VhLmlvLw==">opensea<i class="fa fa-external-link-alt"></i></span>)、交换代币(如<span class="exturl" data-url="aHR0cHM6Ly9hcHAudW5pc3dhcC5vcmcvIy9zd2FwP3V0bV9zb3VyY2U9U3RhdGVPZlRoZURBcHBz">Uniswap<i class="fa fa-external-link-alt"></i></span>)、借贷代币(如<span class="exturl" data-url="aHR0cHM6Ly9jb21wb3VuZC5maW5hbmNlLw==">Compound<i class="fa fa-external-link-alt"></i></span>)、通过玩游戏赚取收入 （如<span class="exturl" data-url="aHR0cHM6Ly9heGllaW5maW5pdHkuY29tLw==">Axie Infinity<i class="fa fa-external-link-alt"></i></span>）等等</p><p>一些定义：</p><div class="note info no-icon"><ol><li><strong>以太币</strong>是以太坊的数字代币。 以太币像比特币一样是一种价值存储，但其主要目的是奖励以太坊区块链上的节点处理交易。</li><li><strong>瓦斯费（gas）</strong>是支付给节点以处理交易的以太币数量。</li><li><strong>智能合约</strong>是在以太坊区块链上运行的代码。该代码是去中心化的（存储在网络中的所有节点上）、不可变的（一旦提交到区块链就不能更改）和开放的（任何人都可以查看和使用代码）。</li><li><strong>去中心化应用程序（dapp）</strong>将后端智能合约与前端 UI 相结合。</li></ol><p><img src="https://global-uploads.webflow.com/617702c73410810254ccd237/619e93d7cb686c3871b1a5ac_Ethereum.png" alt="img" loading="lazy"></p></div><p>注：可以用ens-domain将难记住的公钥转变成<strong>yourname.eth</strong>的形式，参考<span class="exturl" data-url="aHR0cHM6Ly96aC5vZHlzc2V5ZGFvLmNvbS9hcnRpY2xlcy9ob3ctdG8tZ2V0LWFuLWVucy1kb21haW4=">如何获得一个 ens 域名？<i class="fa fa-external-link-alt"></i></span> </p><h2 id="区块链交易费用"><a href="#区块链交易费用" class="headerlink" title="区块链交易费用"></a>区块链交易费用</h2><p>在区块链上进行交易，需要支付交易费用 (通常称为 gas)。</p><p><strong>瓦斯费（gas）</strong>是支付给区块链上的节点以处理交易的加密货币数量。</p><p>对于以太坊，gas以 <strong>针织</strong> （1 gwei &#x3D; 0.000000001 ether）为单位。</p><p>支付多少gas取决于：</p><ol><li><strong>网络拥塞：</strong>如果很多人都试图进行交易，那么 Gas 会更高。</li><li><strong>交易类型：</strong>如果您的交易很复杂（例如，铸造NFT与将加密货币发送到另一个钱包），则gas会更高。</li></ol><p>以太坊不是唯一有gas费的区块链，它只是最贵的。</p><h2 id="L1链、L2链、侧链"><a href="#L1链、L2链、侧链" class="headerlink" title="L1链、L2链、侧链"></a>L1链、L2链、侧链</h2><p><strong>以太坊 L2 链以及其他 L1 链提供比以太坊主网更快、更便宜的交易。提供比以太坊 L1 更快、更便宜的交易。</strong></p><ol><li><strong>L1链</strong> 是主要的以太坊区块链。其他非ETH L1链包括 <span class="exturl" data-url="aHR0cHM6Ly9zb2xhbmEuY29tLw==">Solana<i class="fa fa-external-link-alt"></i></span>， <span class="exturl" data-url="aHR0cHM6Ly93d3cuYXZheC5uZXR3b3JrLw==">Avax<i class="fa fa-external-link-alt"></i></span>和 <span class="exturl" data-url="aHR0cHM6Ly93d3cudGVycmEubW9uZXkv">Terra<i class="fa fa-external-link-alt"></i></span>。</li><li><strong>L2链</strong> 在捆绑并提交到以太坊L1之前处理链下交易。例子包括 <span class="exturl" data-url="aHR0cHM6Ly9hcmJpdHJ1bS5pby8=">Arbitrum<i class="fa fa-external-link-alt"></i></span>， <span class="exturl" data-url="aHR0cHM6Ly93d3cub3B0aW1pc20uaW8v">Optimism<i class="fa fa-external-link-alt"></i></span>和 <span class="exturl" data-url="aHR0cHM6Ly9sb29wcmluZy5vcmcvIy8=">Loopring<i class="fa fa-external-link-alt"></i></span>。</li><li><strong>侧链</strong> 是带有自己的gas token的独立区块链。 <span class="exturl" data-url="aHR0cHM6Ly9wb2x5Z29uLnRlY2hub2xvZ3kv">Polygon<i class="fa fa-external-link-alt"></i></span> 是最受欢迎的侧链。</li></ol><h1 id="DeFi"><a href="#DeFi" class="headerlink" title="DeFi"></a>DeFi</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p><strong>DeFi（去中心化金融）是指基于智能合约而不是依赖银行或交易所等中间商的金融服务。</strong></p><h2 id="Defi与传统金融的对比"><a href="#Defi与传统金融的对比" class="headerlink" title="Defi与传统金融的对比"></a>Defi与传统金融的对比</h2><p><img src="https://global-uploads.webflow.com/617702c73410810254ccd237/61a26a1cf0aa6f302a6a55b3_G2771K6V-AM_k13JHOJGf9aCK11nm9IQzcIKGT4uE_Zeu4J6kyD92bJcf84WYAeNWVxG0vth1QroEjUpUyLrpH_-_Btes-HLByU_YGNLnZ5TxkCYX6Is1AsQrJ0cSmXP-8Smsd-F.png" alt="img" loading="lazy"></p><table><thead><tr><th align="center">对比条目</th><th align="center">TradeFi&#x2F;传统金融</th><th align="center">DeFi&#x2F;去中心化金融</th></tr></thead><tbody><tr><td align="center">Trust</td><td align="center">银行这样的中间人持有你的钱，相信银行。</td><td align="center">你持有你的钱并信任智能合约来处理它。</td></tr><tr><td align="center">Transparency</td><td align="center">看不到银行或其他中间人的内部运作。</td><td align="center">许多 DeFi 协议是开源的。</td></tr><tr><td align="center">Returns</td><td align="center">中间商从你的回报中分得一大截（例如，银行只提供 0.5% 的储蓄）。</td><td align="center">由于更高的风险和更少的中间商减少，回报通常更高。</td></tr><tr><td align="center">Risk</td><td align="center">银行受联邦保险并受到严格监管。</td><td align="center">DeFi 协议通常没有保险或监管（目前）。风险包括波动的代币价格、智能合约漏洞和诈骗项目。</td></tr></tbody></table><p>DeFi 与传统金融相比既有优势也有劣势：</p><ul><li>优势包括更高的透明度、更多的访问和更高的潜在回报。</li><li>缺点包括与新兴的、不受监管的行业相关的更高风险。</li></ul><h2 id="DeFi的应用"><a href="#DeFi的应用" class="headerlink" title="DeFi的应用"></a>DeFi的应用</h2><p><strong>使用DeFi可以做几乎所有在TradFi（传统金融）中可以做的事情。</strong>如汇款、质押(staking)、持有稳定币、使用CeFi平台、交换代币、借贷加密货币、提供流动性(Liquidity)、Yield Farm</p><h2 id="Staking"><a href="#Staking" class="headerlink" title="Staking"></a>Staking</h2><p>锁定加密货币以帮助验证交易以证明权益区块链以换取奖励（通常是更多相同类型的加密货币）</p><h2 id="交换代币"><a href="#交换代币" class="headerlink" title="交换代币"></a>交换代币</h2><p>可以使用去中心化交易所（DEX）交换任意两个代币。<br>一个类比：</p><ul><li>A和B把10个苹果和橙子放在一个篮子里；</li><li>A要取出一个橙子，需要把一个苹果放入篮子作为交换；</li><li>过了一会，篮子里只有5个橙子和15个苹果，因为橙子比较少，A同意取一个橙子就放两个苹果。</li></ul><p>去中心化交易所（DEX）与篮子一样，用流动性池的<strong>自动化做市商（AMM</strong> ）。为了让用户在 像<span class="exturl" data-url="aHR0cHM6Ly9hcHAudW5pc3dhcC5vcmcvIy9zd2Fw">Uniswap<i class="fa fa-external-link-alt"></i></span>这样的分散式交易所（DEX）上交换两个代币，其他用户必须将这些代币贡献给流动性池。几个术语：</p><div class="note info no-icon"><ul><li><strong>流动性池(Liquidity Pool)</strong> 是锁定在智能合约中的一对代币，以促进交易；</li><li><strong>流动性提供者(Liquidity Provide&#x2F;LP）</strong> 是使用一对代币为流动性池提供资金的用户；</li><li><strong>流动性</strong>(Liquidity) 是在不影响其市场价格的情况下买卖代币的能力。</li></ul></div><p>DEX 需要一个大型流动资金池来减少价格波动。考虑这两个例子：</p><ol><li>一个ETH-DAI池各有10个代币。如果将1 ETH换成DAI，则池的供应量将下降10%，并且将ETH换成DAI将变得更加昂贵。</li><li>一个ETH-DAI池各有100，000个代币。如果将1 ETH换成DAI，则池的供应量不会真正受到影响，价格将保持稳定。</li></ol><p>这里的ETH就好像橙子，DAI就好像苹果，他们的数量越多，流动性越低，交换的所需的交易费用就越少。</p><details class="note info no-icon"><summary><p>总结</p></summary><h3 id="DEX的作用"><a href="#DEX的作用" class="headerlink" title="DEX的作用"></a>DEX的作用</h3><ol><li>通过池<strong>交换代币</strong>，支付一些交易费用。</li><li><strong>为池提供流动性</strong> ，获得交易费用的削减以及额外的代币。</li></ol></details><h2 id="借贷加密货币"><a href="#借贷加密货币" class="headerlink" title="借贷加密货币"></a>借贷加密货币</h2><p>类比：假设你正在度假，并且几个月内不会使用您的汽车。通常，你的车会坐在你的车库里收集灰尘。相反，您决定将其出租给朋友。你（贷款人）可以赚钱，你的朋友（借款人）可以用你的车把事情做好。</p><h2 id="Yield-Farm"><a href="#Yield-Farm" class="headerlink" title="Yield Farm"></a>Yield Farm</h2><p>Yield Farm不是指一个特定的过程，而是指通过抵押，贷款和借贷的某种组合来寻求回报的总体想法。这些策略给“农民”带来了额外的回报。获得高回报的机会伴随着风险。</p><p>一种常见的Yield Farm类型是当LP被激励<span class="exturl" data-url="aHR0cHM6Ly93d3cub2R5c3NleWRhby5jb20vYXJ0aWNsZXMvaG93LXRvLXlpZWxkLWZhcm0jd2hhdF9pc19pbmNlbnRpdml6ZWRfbGlxdWlkaXR5">为平台增加Liquidity时<i class="fa fa-external-link-alt"></i></span>。</p><h2 id="避免风险"><a href="#避免风险" class="headerlink" title="避免风险"></a>避免风险</h2><p>作为金融小白，DeFi了解，浅浅体验就好，花大资本去尝试风险太大。</p><h1 id="DAO"><a href="#DAO" class="headerlink" title="DAO"></a>DAO</h1><p><strong>DAO(Decentralized Autonomous Organization)是由其成员拥有和管理的社区。</strong></p><table><thead><tr><th align="center">对比项目</th><th align="center">公司</th><th align="center">DAO</th></tr></thead><tbody><tr><td align="center">组织结构</td><td align="center">由首席执行官和其他高管领导的等级结构。</td><td align="center">由一群核心贡献者领导的扁平结构。</td></tr><tr><td align="center">做决定</td><td align="center">管理层批准提案并闭门决策。</td><td align="center">成员提交提案，并在公共场合使用DAO代币进行投票。</td></tr><tr><td align="center">入职</td><td align="center">候选人需要申请并通过面试才能被录用。</td><td align="center">一些DAO允许任何人加入，而另一些则需要最少数量的代币。代币可以通过向DAO捐款（例如，记下会议笔记）来购买或赚取。</td></tr><tr><td align="center">职业发展</td><td align="center">员工需要爬上公司的阶梯才能得到晋升。</td><td align="center">会员可以立即开始贡献，以获得核心贡献者的信任。</td></tr><tr><td align="center">报酬</td><td align="center">大多数员工全职工作，并通过工资和股票获得报酬。</td><td align="center">大多数贡献者兼职工作，并通过DAO代币或其他加密货币（例如<a href="https://zh.odysseydao.com/articles/what-are-stablecoins"><strong>稳定币）获得</strong></a>补偿。</td></tr></tbody></table><p>与公司相比，DAO 既有优点也有缺点：</p><ul><li>优势包括让更多人做出贡献、参与决策并拥有优势。</li><li>缺点包括必须以分散的方式协调兼职劳动力。</li></ul><p>以下是一些值得探索的学习DAO：</p><ol><li><span class="exturl" data-url="aHR0cHM6Ly9kaXNjb3JkLmdnLzgyWWJ0NkJDRmc=">Odyssey<i class="fa fa-external-link-alt"></i></span>在这个网站上写了学习路径。我们的使命是帮助100万人访问web3，并欢迎所有初学者。</li><li><span class="exturl" data-url="aHR0cHM6Ly9kaXNjb3JkLmdnL2FleEFyam1Tblk=">Crypto， Culture， and Society<i class="fa fa-external-link-alt"></i></span>是一个专注于探索文科和加密交叉点的DAO。</li><li><span class="exturl" data-url="aHR0cHM6Ly90LmNvL2VUWGFKSUc2ZVc=">前沿<i class="fa fa-external-link-alt"></i></span>专注于社交代币社区的教育。</li><li><span class="exturl" data-url="aHR0cHM6Ly90LmNvL2s0MDdSdUc4ZVY=">开发人员DAO<i class="fa fa-external-link-alt"></i></span>可帮助开发人员加入 web3。</li></ol><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><div class="link-grid"><div class="link-grid-container"><object class="link-grid-image" data="../images/odyssey.png"></object><p>Odyssey</p><p>Web3.0科普</p><a href="https://zh.odysseydao.com/articles/what-is-web3"></a></div></div><div class="link-grid"><div class="link-grid-container"><object class="link-grid-image" data="../images/zhihu.jpg"></object><p>Odyssey</p><p>区块链Layer1 Layer2</p><a href="https://zhuanlan.zhihu.com/p/410557922?utm_source=wechat_session&utm_medium=social&utm_oi=545907922706681856"></a></div></div>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;note no-icon&quot;&gt;&lt;p&gt;Web3.0的势头因为元宇宙似乎更猛了，掏出收藏已久的web3.0科普资料，记录一下笔记查漏补缺&lt;/p&gt;
&lt;/div&gt;</summary>
    
    
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    <category term="Blockchain" scheme="https://theme-next.js.org/categories/Tech/Blockchain/"/>
    
    <category term="Web3.0" scheme="https://theme-next.js.org/categories/Tech/Web3-0/"/>
    
    
    <category term="Blockchain" scheme="https://theme-next.js.org/tags/Blockchain/"/>
    
    <category term="Web3.0" scheme="https://theme-next.js.org/tags/Web3-0/"/>
    
  </entry>
  
  <entry>
    <title>前端性能优化初探</title>
    <link href="https://theme-next.js.org/web-performance-intro/"/>
    <id>https://theme-next.js.org/web-performance-intro/</id>
    <published>2022-05-20T15:31:21.000Z</published>
    <updated>2022-05-22T09:01:32.467Z</updated>
    
    <content type="html"><![CDATA[<div class="note no-icon"><p>这篇文章将使用 Chrome开发者工具在“实验室”环境查看天刀直购系列活动页面的性能指标，结合入职以来做过的几个需求，总结一下学习到的页面性能优化的方式以及未来还可以采取的优化措施。</p></div><span id="more"></span><h1 id="性能指标测试环境和工具"><a href="#性能指标测试环境和工具" class="headerlink" title="性能指标测试环境和工具"></a>性能指标测试环境和工具</h1><p>性能指标一般通过在实验室中或在实际情况中两种情况来测量:</p><ol><li><p>实验室中：使用工具在稳定、受控的环境中模拟页面加载<br>实测工具(field tools)例子：</p><ul><li><span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2Nocm9tZS11c2VyLWV4cGVyaWVuY2UtcmVwb3J0">Chrome 用户体验报告<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9wYWdlc3BlZWQud2ViLmRldi8=">PageSpeed Insights 网页速度测量工具<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vd2VibWFzdGVycy9hbnN3ZXIvOTIwNTUyMA==">搜索控制台（核心 Web 指标报告）<i class="fa fa-external-link-alt"></i></span></li><li><a href="https://github.com/GoogleChrome/web-vitals"><code>web-vitals</code>  JavaScript 库</a></li></ul></li><li><p>在实际情况中：基于真实用户的实际页面加载与页面交互<br>实验室工具(lab tools)例子: </p><ul><li><span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kb2NzL2RldnRvb2xzLw==">Chrome 开发者工具<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2Uv">灯塔<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly93ZWJwYWdldGVzdC5vcmcv">WebPageTest 网页性能测试工具<i class="fa fa-external-link-alt"></i></span></li><li>在<span class="exturl" data-url="aHR0cHM6Ly93ZWIuZGV2L3ZpdGFscy1maWVsZC1tZWFzdXJlbWVudC1iZXN0LXByYWN0aWNlcy8=">实测 Web 指标的最佳实践<i class="fa fa-external-link-alt"></i></span>中，推荐使用<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS93ZWItdml0YWxzI2luc3RhbGwtYW5kLWxvYWQtdGhlLWxpYnJhcnk=">web-vitals js库<i class="fa fa-external-link-alt"></i></span>,为了不影响测量官方建议延迟加载分析代码</li></ul></li></ol><h1 id="使用-Chrome开发者工具分析如何进行页面性能优化"><a href="#使用-Chrome开发者工具分析如何进行页面性能优化" class="headerlink" title="使用 Chrome开发者工具分析如何进行页面性能优化"></a>使用 Chrome开发者工具分析如何进行页面性能优化</h1><p>用于分析和测试优化策略的页面：</p><p><span class="exturl" data-url="aHR0cHM6Ly90eS5xcS5jb20vYWN0L2EyMDIyMDQwOGxvdHRlcnkvaHVhd2VpL2luZGV4Lmh0bWw=">天刀华为直购活动页面一<i class="fa fa-external-link-alt"></i></span>、<span class="exturl" data-url="aHR0cHM6Ly90eS5xcS5jb20vYWN0L2EyMDIyMDUxNmxvdHRlcnkvdGVzdC9pbmRleC5odG1s">天刀华为直购活动页面二<i class="fa fa-external-link-alt"></i></span></p><p>这里分为两个阶段：加载阶段和交互阶段，这里主要关注网络进程和渲染进程。</p><h2 id="加载阶段"><a href="#加载阶段" class="headerlink" title="加载阶段"></a>加载阶段</h2><p>通过 <code>chrome</code> 的 <code>performance</code> 中的 <code>timing</code> 可以观察到比较重要的几个时间节点:</p><ul><li><code>First Paint</code>  ：Google定义的web指标(web vitals)之一，首次绘制像素的时间（白屏时间）。</li><li><code>First Contentful Paint</code>  ：Google定义的web指标(web vitals)之一，测量页面从开始加载到页面内容的任何部分在屏幕上完成渲染的时间，如文本、图像、非空 <code>svg/canvas</code> 等（首屏时间）。</li><li><code>Largest Contentful Paint</code>  : Google定义的核心web指标(core web vitals)之一，测量页面从开始加载到最大文本块或图像元素在屏幕上完成渲染的时间，测量加载性能。从  <code>Screenshots</code>  中看到这个节点是可以看到比较完整的页面的时候，因此从用户体验来说这个时间点会比较重要。</li><li><code>DomContentLoaded</code>  事件： <code>dom</code> 树构建完毕，但是还没有进入渲染树的构建。体验上页面可以正常交互了，但是图片、字体等资源可能还没完全加载好。(在 <code>main</code> 上，<code>DCL</code>之后就没有 <code>Parse HTML</code> 了)</li><li><code>Load</code>  事件：页面上所有资源都被加载完毕。(  <code>js</code> 、 <code>css</code> 、图片，以及  <code>js</code>  异步加载的  <code>js</code> 、 <code>css</code>  、图片)<br><img src="https://user-images.githubusercontent.com/17645053/168962380-9043016c-ce9e-4c16-a968-c7a3ca92caf1.png" alt="undefined" loading="lazy"></li></ul><p>如果不想使用<code>web-vitals</code>想自己做埋点，也可以使用performance Windows API来做简易的埋点。看一下<code>performance.timing</code>都有什么:<br><img width="494" alt="Screen Shot 2022-05-20 at 3 15 38 PM" src="https://user-images.githubusercontent.com/17645053/169474053-167baa8c-ab55-4957-809e-bddbfdfad419.png"><br>根据它们可以计算出FP&#x2F;DCL&#x2F;Load等关键事件的时间点</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 页面首次渲染时间(firstPaint)</span></span><br><span class="line"><span class="keyword">let</span> <span class="variable constant_">FP</span> = domLoading - navigationStart</span><br><span class="line"><span class="comment">// DOM加载完成(DOMContentEventLoad)</span></span><br><span class="line"><span class="keyword">let</span> <span class="variable constant_">DCL</span> = domContentLoadedEventEnd - navigationStart</span><br><span class="line"><span class="comment">// 图片、样式等外链资源加载完成 (Load)</span></span><br><span class="line"><span class="keyword">let</span> L = loadEventEnd - navigationStart</span><br></pre></td></tr></table></figure><p>不过这里因为Google Web Vitals更多考虑了用户体验，所以也使用了Web Vitals的时间点来作为阶段的分割线。</p><h3 id="beforeunload、发起请求准备阶段"><a href="#beforeunload、发起请求准备阶段" class="headerlink" title="beforeunload、发起请求准备阶段"></a>beforeunload、发起请求准备阶段</h3><p>在发起  <code>get index.html</code>  请求前，有一小段时间是在执行  <code>beforeunload</code>  ，其实应该还包括了发起 <code>get index.html</code> 请求前的准备工作，如果未来需求里需要引入跨域文件，也许可以使用  <code>dns-prefetch</code>  来进行预解析。即预解析之后可能会用到的域名，并将结果缓存到系统缓存中，缩短 <code>DNS</code> 的查询时间，以此来提高访问速度。这里有个误解，之前以为 <code>dns-prefetch</code> 会影响首屏加载，但其实如果使用的是 <code>chrome</code> ， <code>V8</code> 是会利用空闲的时间去做预解析，并且它的预解析是在异步线程上执行的，可以避免影响首屏加载。不过 <code>dns-prefetch</code> 也不是设置得越多越好，虽然是异步线程，也还是占用设备的带宽，可能会造成资源竞争。<br><img src="https://user-images.githubusercontent.com/17645053/168993038-8342cb8f-c81f-49d7-bf9d-8c32d9366d08.png" alt="undefined" loading="lazy"></p><h3 id="发起请求到FCP阶段"><a href="#发起请求到FCP阶段" class="headerlink" title="发起请求到FCP阶段"></a>发起请求到FCP阶段</h3><p>在 <code>First Contentful Paint</code> 之前，可以看到优先级高的关键资源会被首先请求，如  <code>index.html</code>  、  <code>index.css</code>  、  <code>index.js</code>  等。</p><p><img src="https://user-images.githubusercontent.com/17645053/168964607-d996963f-7b25-41cd-9e2f-aba74d82a95f.png" alt="undefined" loading="lazy"></p><p>而关键资源阻塞渲染的时长取决于最大的那个资源，因此猜测这个阶段可以采取利用  <code>webpack</code>  压缩文件、移除非必要的代码等优化方式。</p><p>于是实践了一下，使用<code>optimize-css-assets-webpack-plugin</code>压缩<code>css</code>、<code>HtmlWebpackPlugin</code>压缩<code>html</code>，以及<code>webpack</code>生产环境自动开启的js压缩工具测试了一下，结果发现虽然压缩后大小是有所减小（共计缩小了<code>14.9k</code>,为原体积的<code>30%</code>左右），线上<code>network</code>请求时长没什么改善，<code>FCP</code>和<code>LCP</code>也没有有效提前，查看<code>network</code>发现其实这里的速度主要还是取决于<code>TTFB</code>,以<code>get index.js</code>请求为例，大部分时间在<code>Waiting</code>,对于这个项目而言，因为本身文件大小不算大，<code>webpack</code>压缩后并没有起到有效的优化效果。</p><img width="1096" alt="Screen Shot 2022-05-20 at 1 30 46 PM" src="https://user-images.githubusercontent.com/17645053/169457346-fa6a9a2b-7f47-429a-8957-308d2cffb31a.png"><p>另外，浏览器为了更好的用户体验会先解析一部分  <code>html</code>  ，所以才有了  <code>firstpaint</code>  在  <code>DomContentLoaded</code>  之前，也因此需要把  <code>js</code>  放到  <code>html</code>  的最下面，因为  <code>js</code>  会阻塞  <code>dom</code>  的解析，  <code>css</code>  可以放到前面避免页面因为没有样式过于丑陋。于是觉得理论上也许可以尝试将一些不需要在解析  <code>html</code>  阶段使用的  <code>js</code>  标记上  <code>async</code>   或者   <code>defer</code>  。关于<code>aync</code>和<code>defer</code>的区别:</p><p><img src="https://harttle.land/assets/img/blog/acyn-vs-defer.jpg" alt="img" loading="lazy"></p><p>这里也自己实践了一下，给不依赖其他脚本的<code>js script</code>，如上报js加上了<code>aync</code>, 然后把不需要在解析阶段使用的<code>js script</code>加上了<code>defer</code>，但是结果发现并没有想象中地被优化。因为还是存在无法使用<code>defer</code>和<code>aync</code>的js文件，这些文件依然会阻塞渲染时间。而那些加了<code>defer</code>和<code>async</code>的文件其实本身也得益于<code>http/2</code>的<code>server push</code>，所以在这个需求里、在这个实验环境下加<code>defer/async</code>优化方式也不适用。</p><p>那么究竟要怎么提前<code>FCP</code>时间呢，这里介绍一下，<a href="https://web.dev/fcp/"><code>FCP</code> </a>是从开始加载到页面内容的任何部分在屏幕上完成渲染的时间，是 <code>Google</code> 的 <code>web vitals</code> 之一，目前<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9saWdodGhvdXNl">灯塔<i class="fa fa-external-link-alt"></i></span>、<span class="exturl" data-url="aHR0cHM6Ly9wYWdlc3BlZWQud2ViLmRldi8=">PageSpeed Insights<i class="fa fa-external-link-alt"></i></span>、<span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kb2NzL2RldnRvb2xzLw==">Chrome 开发者工具<i class="fa fa-external-link-alt"></i></span>、<span class="exturl" data-url="aHR0cHM6Ly9zZWFyY2guZ29vZ2xlLmNvbS9zZWFyY2gtY29uc29sZS9hYm91dA==">搜索控制台<i class="fa fa-external-link-alt"></i></span>、<span class="exturl" data-url="aHR0cHM6Ly93ZWIuZGV2L21lYXN1cmUv">web.dev 测量工具<i class="fa fa-external-link-alt"></i></span>和<span class="exturl" data-url="aHR0cHM6Ly9jaHJvbWUuZ29vZ2xlLmNvbS93ZWJzdG9yZS9kZXRhaWwvd2ViLXZpdGFscy9haGZoaWpkbGVnZGFiYWJscGlwcGVhZ2doaWdtaWJtYQ==">Web 指标 Chrome 扩展程序<i class="fa fa-external-link-alt"></i></span>等工具都提供对他的支持。可以使用这些工具获取<code>FCP</code>和优化建议。对于缩短<code>FCP</code>, Google也给出了<span class="exturl" data-url="aHR0cHM6Ly93ZWIuZGV2L2ZjcC8jZmNwLTQ=">一些建议<i class="fa fa-external-link-alt"></i></span>。还是要根据实际情况分析适用于自己项目的方式来进行优化。</p><p>查看一下 <code>web-vitals js</code> 库中<a href="https://github.com/GoogleChrome/web-vitals/blob/main/src/getFCP.ts"><code>getFCP</code>源码</a></p><h3 id="FCP到LCP阶段"><a href="#FCP到LCP阶段" class="headerlink" title="FCP到LCP阶段"></a>FCP到LCP阶段</h3><p>在这个阶段，占用时间比较多有请求图片、字体资源、优先级低的 <code>js</code> 文件。这里用的是  <code>http/2</code>  ，允许同时通过单一的   <code>http/2</code>   连接发起多重的请求-响应消息，减缓了 <code>tcp</code> 竞争以及队头阻塞。之前有个需求用到了雪碧图，经过指点才了解到因为  <code>http/2</code>  的普及现在其实拆成多个小图反而会更快一些，就是因为  <code>http/2</code>  有多路复用的特性，不再需要通过拼接来减少队头阻塞，多个小图可以同时被请求会比较快。除此之外，也了解到有些针对  <code>http1.1</code>  的性能优化也不再适用了，如域名分片(因为不需要新开连接来解决头阻塞问题)和拼接  <code>js/css</code>  (理由同雪碧图)<br>在实际开发过程中，蜘蛛会自动上传  <code>ossweb-img</code>  中的资源到  <code>CDN</code>  , 因此在这一步起到了减少  <code>RTT</code>  时间，优化图片等资源的传输速度的效果。在过去的几个静态页面开发过程中，主要是也是针对这一阶段进行了优化，如压缩图片、压缩字体等。这里想聊一下  <code>font-spider</code>  。他的原理是将页面引用到字体从字体包中拿出来，合成一个新的字体包，这样就不用引入全部字体包中的字体了，实现了按需引入。这里没了解原理之前踩坑了，把一个项目中压缩过的字体包拿到另一个项目用，结果页面中有的字体没有转化过来。因为页面上的字是不一样的，需要按需重新生成新的压缩字体包才可以。<br><img src="https://user-images.githubusercontent.com/17645053/168980701-0c2aa8f3-cd0e-4b82-9b3a-bace85d87577.png" alt="undefined" loading="lazy"><br> <code>LCP</code> 是测量页面从开始加载到最大文本块或图像元素在屏幕上完成渲染的时间。被 <code>Google</code> 列为了 <code>core web vitals</code> 之一，支持它的工具与 <code>FCP</code> 的一致，对于缩短 <code>LCP</code> ，Google官方也给出了<span class="exturl" data-url="aHR0cHM6Ly93ZWIuZGV2L29wdGltaXplLWxjcC8=">优化建议<i class="fa fa-external-link-alt"></i></span>，还是需要针对自己的情况采取相应的优化措施。</p><p>查看一下 <code>web-vitals js</code> 库中<a href="https://github.com/GoogleChrome/web-vitals/blob/main/src/getLCP.ts"><code>getLCP</code> 源码</a></p><h3 id="LCP到Load阶段"><a href="#LCP到Load阶段" class="headerlink" title="LCP到Load阶段"></a>LCP到Load阶段</h3><p>在这个阶段，通过查看  <code>main</code>  发现主要是执行了 <code>milo</code> 的 <code>alert(&quot;活动已经结束&quot;)</code> ，所以可以暂且忽略。但是也验证了异步加载的 <code>js</code> 会影响 <code>load</code> 事件的触发。<br><img src="https://user-images.githubusercontent.com/17645053/168980353-1303ecb6-f426-4938-bf16-d486768119cc.png" alt="undefined" loading="lazy"></p><h2 id="交互阶段"><a href="#交互阶段" class="headerlink" title="交互阶段"></a>交互阶段</h2><p>华为这个活动页面交互比较少，主要是点击按钮，触发购买等请求 ，由此可见组件化时尽量排除无用的依赖可以加快响应。例子：<br><img src="https://user-images.githubusercontent.com/17645053/168985752-709ef3a4-acf9-4e73-b3c0-8f53fdf350ed.png" alt="undefined" loading="lazy"><br>未来如果接触到较为复杂的交互功能，理论上应该尽量减少对<code>dom</code>的重排重绘，尽量利用好<code>css</code>合成动画。因为渲染流程包括构建<code>dom</code>树、计算样式、布局、分层、分层、绘制、栅格化、合成和显示等阶段。重排会触发整个渲染流程；重绘会触发绘制后面的一系列渲染流程；而合成就不会再重新触发整个流程或者绘制流程，效率会高很多。对<code>chrome</code>来说，合成是在合成线程上完成的，他不会影响到主线程。因此合理利用合成可以带来较好的用户体验并且提高效率（至少对<code>chrome</code>是这样）</p><h1 id="开发体验优化"><a href="#开发体验优化" class="headerlink" title="开发体验优化"></a>开发体验优化</h1><ul><li>未来可以就<code>css</code>开发做一些优化，比如使用<code>less/sass</code>等；取名方面可以更加规范一些，比如使用 <code>BEM</code> ；要注意去除多余样式、优化结构。</li><li>可以多关注组件库并且参与开发，以此减少对于<code>milo</code>等库的依赖。</li><li>也许可以试着引入<code>webpack</code>对代码进行压缩。</li><li>另外，在开发过程中需要多注意兼容的问题，避免使用覆盖率低的<code>css</code>或<code>html</code>特性。</li></ul><p>以上为至今自己在需求中遇到过的性能优化的一些心得体会，未来也希望可以继续学习挖掘更多前端页面性能和开发体验的优化方式。如果有写得不准确的也希望可以多多指正。</p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><span class="exturl" data-url="aHR0cHM6Ly9qdWVqaW4uY24vcG9zdC82ODg3MTA4OTA0NzY2MDQ2MjE2">前端性能监控-基础指标定义&amp;计算<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9qdWVqaW4uY24vcG9zdC82ODQ0OTAzNTAzOTgzMjgwMTQxI2hlYWRpbmctMTI=">HTTP&#x2F;2特性及其在实际应用中的表现<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly90aW1lLmdlZWtiYW5nLm9yZy9jb2x1bW4vYXJ0aWNsZS8xNDE4NDI=">分层和合成机制<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly90aW1lLmdlZWtiYW5nLm9yZy9jb2x1bW4vYXJ0aWNsZS8xNDM4ODk=">如何系统地优化页面<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9zZXJ2ZXJsZXNzLWFjdGlvbi5jb20vZm9udGVuZC9mZS1vcHRpbWl6YXRpb24vRE5TLVByZWZldGNoLmh0bWw=">DNS prefetch原理<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly93ZWIuZGV2L2xlYXJuLXdlYi12aXRhbHMv">web vitals<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9qdWVqaW4uY24vcG9zdC83MDg1Njc5NTExMjkwNzczNTM0I2hlYWRpbmctMw==">埋点sdk设计<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly9qdWVqaW4uY24vcG9zdC83MDMxMTEzOTM4NTMyMDQwNzQwI2hlYWRpbmctMQ==">defer vs async<i class="fa fa-external-link-alt"></i></span></li></ul>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;note no-icon&quot;&gt;&lt;p&gt;这篇文章将使用 Chrome开发者工具在“实验室”环境查看天刀直购系列活动页面的性能指标，结合入职以来做过的几个需求，总结一下学习到的页面性能优化的方式以及未来还可以采取的优化措施。&lt;/p&gt;
&lt;/div&gt;</summary>
    
    
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    <category term="Frontend" scheme="https://theme-next.js.org/categories/Tech/Frontend/"/>
    
    <category term="Optimization" scheme="https://theme-next.js.org/categories/Tech/Optimization/"/>
    
    
    <category term="Frontend" scheme="https://theme-next.js.org/tags/Frontend/"/>
    
  </entry>
  
  <entry>
    <title>安全的git回退方式记录</title>
    <link href="https://theme-next.js.org/safe-git-reverse/"/>
    <id>https://theme-next.js.org/safe-git-reverse/</id>
    <published>2022-05-06T17:05:56.000Z</published>
    <updated>2022-05-22T09:19:36.950Z</updated>
    
    <content type="html"><![CDATA[<div class="note no-icon"><p>远程Git Repo的安全回退方式</p></div><span id="more"></span><h1 id="常用回退指令-git-revert-git-reset"><a href="#常用回退指令-git-revert-git-reset" class="headerlink" title="常用回退指令: git revert, git reset"></a>常用回退指令: git revert, git reset</h1><h2 id="git工作区"><a href="#git工作区" class="headerlink" title="git工作区"></a>git工作区</h2><p><strong>Workspace</strong>： 工作区，就是你平时存放项目代码的地方。<br><strong>Index &#x2F; Stage</strong>： 暂存区，用于临时存放你的改动，事实上它只是一个文件，保存即将提交到文件列表信息。<code>git add &lt;file&gt;</code>以后，文件就会被存储于这个区域。<br><strong>Repository</strong>： 仓库区（或版本库），就是安全存放数据的位置，这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。<code>git commit &lt;file&gt;</code>以后，文件就会被存储于仓库区。<br><strong>Remote</strong>： 远程仓库，托管代码的服务器，可以简单的认为是你项目组中的一台电脑用于远程数据交换。<code>git push &lt;file&gt;</code>以后，文件就会被上传到远程仓库。</p><h2 id="git-reset"><a href="#git-reset" class="headerlink" title="git reset"></a>git reset</h2><p>用于回退版本，可以遗弃不再使用的提交，根据参数的区别，可以指定回退的额范围(scope)，即是否回退暂存区(Index &#x2F; Stage)和工作区(Workspace)的内容<br><code>--hard</code> 参数: 把head移动回指定commit(默认为最新的一个commit)，并且工作区和暂存区内容都将回退<br><code>--soft</code>参数：把head移动回指定commit(默认为最新的一个commit)，工作区和暂存区都不会发生变化。即运行<code>git log</code>发现head变化了，其余的都不变。<br><code>--mixed</code>参数: 默认的参数，把head移动回指定commit(默认为最新的一个commit)，只有暂存区变化。</p><h2 id="git-revert"><a href="#git-revert" class="headerlink" title="git revert"></a>git revert</h2><p>在当前提交后面，新增一次提交，抵消掉上一次提交导致的所有变化，不会改变过去的历史，主要是用于安全地取消过去发布的提交。<br>注意：<code>git revert  &lt;commid&gt;</code>是撤销commid，即撤销到该commid上一个commit,不是撤销到该commid</p><h2 id="git-reset和git-revert的区别"><a href="#git-reset和git-revert的区别" class="headerlink" title="git reset和git revert的区别"></a>git reset和git revert的区别</h2><ul><li><code>git revert</code>是用一次<strong>新的commit来回滚之前的commit</strong>，<code>git reset</code>是<strong>直接删除</strong>指定的commit；</li><li><code>git reset</code>是把<code>HEAD</code>向后移动了一下，而<code>git revert</code>是<code>HEAD</code>继续前进，只是新的commit的内容和要revert的内容正好相反，能够抵消要被revert的内容；</li><li>在操作上，<code>git reset</code>以后如果没有<code>pull</code>就要<code>push</code>的话必须要加<code>-f</code>,这也是<code>reset</code>不安全的理由；</li><li><code>git revert</code>被设计为撤销公开的提交(已经<code>push</code>了的commit)的安全方式，<code>git reset</code>被设计为重设本地更改。</li></ul><h1 id="如何安全地回滚远程分支"><a href="#如何安全地回滚远程分支" class="headerlink" title="如何安全地回滚远程分支"></a>如何安全地回滚远程分支</h1><ol><li>使用<code>git revert</code></li><li>使用<code>merge -s</code>产生一个<strong>代码状态与历史版本完全一致，但基于 <code>master</code>(要回退到的head) 的一个commit</strong>。<span class="exturl" data-url="aHR0cHM6Ly9oYXJ0dGxlLmxhbmQvMjAxOC8wMy8xMi9yZXNldC1vcmlnaW4td2l0aG91dC1mb3JjZS1wdXNoLmh0bWw=">具体方式<i class="fa fa-external-link-alt"></i></span></li></ol><ul><li>两者都是新提交一个commit来撤销操作（<strong>忌对远程分支使用<code>reset</code>或<code>rebase</code>， git官方也推荐使用<code>revert</code>）</strong></li></ul><h1 id="其他撤销操作小贴士"><a href="#其他撤销操作小贴士" class="headerlink" title="其他撤销操作小贴士"></a>其他撤销操作小贴士</h1><ol><li><p>替换上一次的提交信息</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 产生一个新的提交对象，替换掉上一次提交产生的提交对象。</span><br><span class="line"># 这时如果暂存区有发生变化的文件，会一起提交到仓库。所以，--amend不仅可以修改提交信息，还可以整个把上一次提交替换掉。</span><br><span class="line">git commit --amend -m &quot;Fixes bug #42&quot;</span><br></pre></td></tr></table></figure></li><li><p>撤销工作区的文件修改</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 如果工作区的某个文件被改乱了，但还没有提交，可以用git checkout命令找回本次修改之前的文件。</span><br><span class="line">git checkout -- [filename]</span><br></pre></td></tr></table></figure></li><li><p>从暂存区撤销文件</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git rm --cached [filename]</span><br></pre></td></tr></table></figure></li></ol><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vcWRoeGh6L3AvOTc1NzM5MC5odG1s">文章一<i class="fa fa-external-link-alt"></i></span></p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuamlhbnNodS5jb20vcC9jMmVjNWYwNmNmMWE=">文章二<i class="fa fa-external-link-alt"></i></span></p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly9qdWVqaW4uY24vcG9zdC82ODQ0OTAzNTQyOTMxNTg3MDg2">文章三<i class="fa fa-external-link-alt"></i></span></p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly9oYXJ0dGxlLmxhbmQvMjAxOC8wMy8xMi9yZXNldC1vcmlnaW4td2l0aG91dC1mb3JjZS1wdXNoLmh0bWw=">文章四<i class="fa fa-external-link-alt"></i></span></p></li><li><p><span class="exturl" data-url="aHR0cHM6Ly93d3cucnVhbnlpZmVuZy5jb20vYmxvZy8yMDE5LzEyL2dpdC11bmRvLmh0bWw=">文章五<i class="fa fa-external-link-alt"></i></span></p></li></ul>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;note no-icon&quot;&gt;&lt;p&gt;远程Git Repo的安全回退方式&lt;/p&gt;
&lt;/div&gt;</summary>
    
    
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    <category term="Git" scheme="https://theme-next.js.org/categories/Tech/Git/"/>
    
    
    <category term="git" scheme="https://theme-next.js.org/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>Serverless x Hexo</title>
    <link href="https://theme-next.js.org/serverless-hexo/"/>
    <id>https://theme-next.js.org/serverless-hexo/</id>
    <published>2020-08-21T23:26:35.000Z</published>
    <updated>2022-05-22T09:07:44.092Z</updated>
    
    <content type="html"><![CDATA[<div class="note no-icon"><p><span class="exturl" data-url="aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3RlbmNlbnR5dW4vcWNsb3VkLWRvY3VtZW50cy9tYXN0ZXIvcHJvZHVjdC8lRTglQUUlQTElRTclQUUlOTclRTQlQjglOEUlRTclQkQlOTElRTclQkIlOUMvU2VydmVybGVzcyUyMEZyYW1ld29yay8lRTYlOUMlODAlRTQlQkQlQjMlRTUlQUUlOUUlRTglQjclQjUvJUU1JUJGJUFCJUU5JTgwJTlGJUU5JTgzJUE4JUU3JUJEJUIyJTIwSGV4byVFNSU4RCU5QSVFNSVBRSVBMi5tZA==">Reference from 腾讯云<i class="fa fa-external-link-alt"></i></span><br>可用于迭代目前的个人主页</p></div><span id="more"></span><h2 id="操作场景"><a href="#操作场景" class="headerlink" title="操作场景"></a>操作场景</h2><p>该任务指导您通过 Serverless Website 组件，快速构建一个 Serverless Hexo 站点。 </p><h2 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h2><ul><li>已安装 <span class="exturl" data-url="aHR0cHM6Ly9ub2RlanMub3JnL2VuLw==">Node.js<i class="fa fa-external-link-alt"></i></span>（Node.js 版本需不低于8.6，建议使用 Node.js10.0 及以上版本）</li><li>已安装 <span class="exturl" data-url="aHR0cHM6Ly9naXQtc2NtLmNvbS8=">Git<i class="fa fa-external-link-alt"></i></span></li></ul><p>如您未安装上述应用程序，可以参考 <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL3poLWNuL2RvY3Mv">Hexo 安装说明<i class="fa fa-external-link-alt"></i></span>。</p><h2 id="操作步骤"><a href="#操作步骤" class="headerlink" title="操作步骤"></a>操作步骤</h2><h3 id="1-安装"><a href="#1-安装" class="headerlink" title="1. 安装"></a>1. 安装</h3><p>通过 npm 安装 Serverless Framework：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ npm install -g serverless</span><br></pre></td></tr></table></figure><p>通过 npm 安装 Hexo：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ npm install -g hexo-cli</span><br></pre></td></tr></table></figure><p>安装 Hexo 完成后，请执行下列命令，Hexo 将会在指定文件夹中新建所需要的文件。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ hexo init hexo   # 生成 Hexo 目录</span><br><span class="line">$ cd hexo</span><br><span class="line">$ npm install</span><br></pre></td></tr></table></figure><p>新建完成后，指定文件夹的目录如下：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">.</span><br><span class="line">├── _config.yml</span><br><span class="line">├── package.json</span><br><span class="line">├── scaffolds</span><br><span class="line">├── source</span><br><span class="line">|   ├── _drafts</span><br><span class="line">|   └── _posts</span><br><span class="line">└── themes</span><br></pre></td></tr></table></figure><p>安装完成后，可以通过<code>hexo g</code>命令生成静态页面：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ hexo g   # generate</span><br></pre></td></tr></table></figure><blockquote><p>?如果希望在本地查看效果，也可以运行下列命令，通过浏览器访问 <code>localhost:4000</code> 查看页面效果。</p></blockquote><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ hexo s   # server</span><br></pre></td></tr></table></figure><h3 id="2-配置"><a href="#2-配置" class="headerlink" title="2. 配置"></a>2. 配置</h3><p>在<code>hexo</code>目录下，创建<code>serverless.yml</code>文件：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ touch serverless.yml</span><br></pre></td></tr></table></figure><p>在<code>serverless.yml</code>文件中进行如下配置：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># serverless.yml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">component:</span> <span class="string">website</span> <span class="comment"># (必填) 引用 component 的名称，当前用到的是 tencent-website 组件</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">hexodemo</span> <span class="comment"># (必填) 该 website 组件创建的实例名称</span></span><br><span class="line"><span class="attr">org:</span> <span class="string">test</span> <span class="comment"># (可选) 用于记录组织信息，默认值为您的腾讯云账号 APPID</span></span><br><span class="line"><span class="attr">app:</span> <span class="string">websiteApp</span> <span class="comment"># (可选) 该 website 应用名称</span></span><br><span class="line"><span class="attr">stage:</span> <span class="string">dev</span> <span class="comment"># (可选) 用于区分环境信息，默认值是 dev</span></span><br><span class="line"></span><br><span class="line"><span class="attr">inputs:</span></span><br><span class="line">  <span class="attr">src:</span></span><br><span class="line">    <span class="attr">src:</span> <span class="string">./public</span> <span class="comment"># Upload static files generated by HEXO</span></span><br><span class="line">    <span class="attr">index:</span> <span class="string">index.html</span></span><br><span class="line">    <span class="comment"># dist: ./dist</span></span><br><span class="line">    <span class="comment"># hook: npm run build</span></span><br><span class="line">    <span class="comment"># websitePath: ./</span></span><br><span class="line">  <span class="attr">region:</span> <span class="string">ap-guangzhou</span></span><br><span class="line">  <span class="attr">bucketName:</span> <span class="string">my-bucket</span></span><br><span class="line">  <span class="attr">protocol:</span> <span class="string">https</span></span><br><span class="line">  </span><br></pre></td></tr></table></figure><p>配置完成后，文件目录如下：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">.</span><br><span class="line">├── .serverless</span><br><span class="line">└── hexo</span><br><span class="line">    ├── public</span><br><span class="line">    ├── ...</span><br><span class="line">    ├── serverless.yml </span><br><span class="line">    ├── ...</span><br><span class="line">    └── source</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="3-部署"><a href="#3-部署" class="headerlink" title="3. 部署"></a>3. 部署</h3><p>通过<code>sls deploy</code>命令进行部署，并可以添加<code>--debug</code>参数查看部署过程中的信息。<br>如您的账号未 <span class="exturl" data-url="aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9sb2dpbg==">登录<i class="fa fa-external-link-alt"></i></span> 或 <span class="exturl" data-url="aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9yZWdpc3Rlcg==">注册<i class="fa fa-external-link-alt"></i></span> 腾讯云，您可以直接通过<strong>微信</strong>扫描命令行中的二维码进行授权登录和注册。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ sls deploy</span><br><span class="line"></span><br><span class="line">serverless ⚡ framework</span><br><span class="line">Action: &quot;deploy&quot; - Stage: &quot;dev&quot; - App: &quot;websiteApp&quot; - Instance: &quot;hexodemo&quot;</span><br><span class="line"></span><br><span class="line">region:  ap-guangzhou</span><br><span class="line">website: https://my-bucket-1258834142.cos-website.ap-guangzhou.myqcloud.com</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">25s › hexodemo › Success</span><br></pre></td></tr></table></figure><p>访问命令行输出的 Website URL，即可查看您的 Serverless Hexo 站点。</p><blockquote><p>!如果希望更新 Hexo 站点中的文章，需要在本地重新运行<code>hexo g</code>进行生成静态页面，再运行<code>serverless</code>更新到页面。</p></blockquote><h3 id="4-移除"><a href="#4-移除" class="headerlink" title="4. 移除"></a>4. 移除</h3><p>通过以下命令移除 Hexo 网站：</p><figure class="highlight console"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sls remove --debug</span></span><br><span class="line"></span><br><span class="line">  DEBUG ─ Flushing template state and removing all components.</span><br><span class="line">  DEBUG ─ Starting Website Removal.</span><br><span class="line">  DEBUG ─ Removing Website bucket.</span><br><span class="line">  DEBUG ─ Removing files from the &quot;my-bucket-1250000000&quot; bucket.</span><br><span class="line">  DEBUG ─ Removing &quot;my-bucket-1250000000&quot; bucket from the &quot;ap-guangzhou&quot; region.</span><br><span class="line">  DEBUG ─ &quot;my-bucket-1250000000&quot; bucket was successfully removed from the &quot;ap-guangzhou&quot; region.</span><br><span class="line">  DEBUG ─ Finished Website Removal.</span><br><span class="line"></span><br><span class="line">  6s » myWebsite » done</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="账号配置（可选）"><a href="#账号配置（可选）" class="headerlink" title="账号配置（可选）"></a>账号配置（可选）</h3><p>当前默认支持 CLI 扫描二维码登录，如您希望配置持久的环境变量&#x2F;密钥信息，也可以本地创建 <code>.env</code> 文件：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ touch .env # 腾讯云的配置信息</span><br></pre></td></tr></table></figure><p>在 <code>.env</code> 文件中配置腾讯云的 SecretId 和 SecretKey 信息并保存：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># .env</span><br><span class="line">TENCENT_SECRET_ID=123</span><br><span class="line">TENCENT_SECRET_KEY=123</span><br></pre></td></tr></table></figure><blockquote><p>?</p><ul><li>如果没有腾讯云账号，请先 <span class="exturl" data-url="aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9yZWdpc3Rlcg==">注册新账号<i class="fa fa-external-link-alt"></i></span>。</li><li>如果已有腾讯云账号，可以在 <span class="exturl" data-url="aHR0cHM6Ly9jb25zb2xlLmNsb3VkLnRlbmNlbnQuY29tL2NhbS9jYXBp">API 密钥管理<i class="fa fa-external-link-alt"></i></span> 中获取 SecretId 和 SecretKey。</li></ul></blockquote>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;note no-icon&quot;&gt;&lt;p&gt;&lt;span class=&quot;exturl&quot; data-url=&quot;aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3RlbmNlbnR5dW4vcWNsb3VkLWRvY3VtZW50cy9tYXN0ZXIvcHJvZHVjdC8lRTglQUUlQTElRTclQUUlOTclRTQlQjglOEUlRTclQkQlOTElRTclQkIlOUMvU2VydmVybGVzcyUyMEZyYW1ld29yay8lRTYlOUMlODAlRTQlQkQlQjMlRTUlQUUlOUUlRTglQjclQjUvJUU1JUJGJUFCJUU5JTgwJTlGJUU5JTgzJUE4JUU3JUJEJUIyJTIwSGV4byVFNSU4RCU5QSVFNSVBRSVBMi5tZA==&quot;&gt;Reference from 腾讯云&lt;i class=&quot;fa fa-external-link-alt&quot;&gt;&lt;/i&gt;&lt;/span&gt;&lt;br&gt;可用于迭代目前的个人主页&lt;/p&gt;
&lt;/div&gt;</summary>
    
    
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    
    <category term="Serverless" scheme="https://theme-next.js.org/tags/Serverless/"/>
    
  </entry>
  
  <entry>
    <title>LC28</title>
    <link href="https://theme-next.js.org/LC28/"/>
    <id>https://theme-next.js.org/LC28/</id>
    <published>2020-02-24T09:43:15.000Z</published>
    <updated>2022-05-21T06:04:32.632Z</updated>
    
    <content type="html"><![CDATA[<div class="note no-icon"><h2 id="LC-28-Implement-strStr"><a href="#LC-28-Implement-strStr" class="headerlink" title="LC 28 Implement strStr()"></a>LC 28 Implement strStr()</h2><p>Implement <span class="exturl" data-url="aHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9jc3RyaW5nL3N0cnN0ci8=">strStr<i class="fa fa-external-link-alt"></i></span><br>Return the index of the first occurrence of needle in haystack, or <strong>-1</strong> if needle is not part of haystack.</p></div><span id="more"></span><p><strong>Example 1:</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Input: haystack = &quot;hello&quot;, needle = &quot;ll&quot;</span><br><span class="line">Output: 2</span><br></pre></td></tr></table></figure><p><strong>Example 2:</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Input: haystack = &quot;aaaaa&quot;, needle = &quot;bba&quot;</span><br><span class="line">Output: -1</span><br></pre></td></tr></table></figure><p><strong>Clarification:</strong></p><p>What should we return when <code>needle</code> is an empty string? This is a great question to ask during an interview.</p><p>For the purpose of this problem, we will return 0 when <code>needle</code> is an empty string. This is consistent to C&#39;s <span class="exturl" data-url="aHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9jc3RyaW5nL3N0cnN0ci8=">strstr()<i class="fa fa-external-link-alt"></i></span> and Java&#39;s <span class="exturl" data-url="aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sI2luZGV4T2YoamF2YS5sYW5nLlN0cmluZyk=">indexOf()<i class="fa fa-external-link-alt"></i></span>.</p><h3 id="A"><a href="#A" class="headerlink" title="A"></a>A</h3><p>使用哈希值</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">strStr</span>(<span class="params">self, haystack: <span class="built_in">str</span>, needle: <span class="built_in">str</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">    L, n = <span class="built_in">len</span>(needle), <span class="built_in">len</span>(haystack)</span><br><span class="line">    <span class="keyword">if</span> L &gt; n:</span><br><span class="line">        <span class="keyword">return</span> - <span class="number">1</span></span><br><span class="line"><span class="comment"># base value for the rolling hash function</span></span><br><span class="line">a = <span class="number">26</span></span><br><span class="line"><span class="comment"># modulus value for the rolling hash function to avoid overflow</span></span><br><span class="line">modulus = <span class="number">2</span>**<span class="number">31</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># lambda-function to convert character to integer</span></span><br><span class="line">h_to_int = <span class="keyword">lambda</span> i : <span class="built_in">ord</span>(haystack[i]) - <span class="built_in">ord</span>(<span class="string">&#x27;a&#x27;</span>)</span><br><span class="line">needle_to_int = <span class="keyword">lambda</span> i : <span class="built_in">ord</span>(needle[i]) - <span class="built_in">ord</span>(<span class="string">&#x27;a&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># compute the hash of strings haystack[:L], needle[:L]</span></span><br><span class="line">h = ref_h = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(L):</span><br><span class="line">    h = (h * a + h_to_int(i)) % modulus</span><br><span class="line">    ref_h = (ref_h * a + needle_to_int(i)) % modulus</span><br><span class="line"><span class="keyword">if</span> h == ref_h:</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">      </span><br><span class="line"><span class="comment"># const value to be used often : a**L % modulus</span></span><br><span class="line">aL = <span class="built_in">pow</span>(a, L, modulus) </span><br><span class="line"><span class="keyword">for</span> start <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, n - L + <span class="number">1</span>):</span><br><span class="line">    <span class="comment"># compute rolling hash in O(1) time</span></span><br><span class="line">    h = (h * a - h_to_int(start - <span class="number">1</span>) * aL + h_to_int(start + L - <span class="number">1</span>)) % modulus</span><br><span class="line">    <span class="keyword">if</span> h == ref_h:</span><br><span class="line">        <span class="keyword">return</span> start</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> -<span class="number">1</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;note no-icon&quot;&gt;&lt;h2 id=&quot;LC-28-Implement-strStr&quot;&gt;&lt;a href=&quot;#LC-28-Implement-strStr&quot; class=&quot;headerlink&quot; title=&quot;LC 28 Implement strStr()&quot;&gt;&lt;/a&gt;LC 28 Implement strStr()&lt;/h2&gt;&lt;p&gt;Implement &lt;span class=&quot;exturl&quot; data-url=&quot;aHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9jc3RyaW5nL3N0cnN0ci8=&quot;&gt;strStr&lt;i class=&quot;fa fa-external-link-alt&quot;&gt;&lt;/i&gt;&lt;/span&gt;&lt;br&gt;Return the index of the first occurrence of needle in haystack, or &lt;strong&gt;-1&lt;/strong&gt; if needle is not part of haystack.&lt;/p&gt;
&lt;/div&gt;</summary>
    
    
    
    <category term="Interview" scheme="https://theme-next.js.org/categories/Interview/"/>
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    <category term="Algorithm" scheme="https://theme-next.js.org/categories/Tech/Algorithm/"/>
    
    
    <category term="Algorithm" scheme="https://theme-next.js.org/tags/Algorithm/"/>
    
  </entry>
  
  <entry>
    <title>Kubernetes Review</title>
    <link href="https://theme-next.js.org/kubernetes-review/"/>
    <id>https://theme-next.js.org/kubernetes-review/</id>
    <published>2020-02-23T10:01:00.000Z</published>
    <updated>2022-05-24T02:00:07.658Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" href="css/welcomePage.css"><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script><div class="note no-icon"><p><span class="exturl" data-url="aHR0cHM6Ly93d3cueW91dHViZS5jb20vY2hhbm5lbC9VQ2RrR1Y1MU51MHVuRE5UNThiSHQ5Ymc=">Study Source<i class="fa fa-external-link-alt"></i></span></p></div><p><img src="https://user-images.githubusercontent.com/17645053/75114786-11c41d80-5627-11ea-9e03-009bda02ad1b.png" alt="Quick General Intro" loading="lazy"></p><span id="more"></span><p><img src="https://user-images.githubusercontent.com/17645053/75114532-b85aef00-5624-11ea-9a9a-3f2a70ed5728.png" alt="Kubernetes" loading="lazy"></p><p><strong>Master</strong></p><p><strong>1 etcd</strong> is a persistent, lightweight, distributed, key-value data store developed by <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0NvcmVPUw==">CoreOS<i class="fa fa-external-link-alt"></i></span> that reliably stores the configuration data of the cluster, representing the overall state of the cluster at any given point of time. Other components watch for changes to this store to bring themselves into the desired state</p><p>Hold all metadata?</p><p><strong>2 API server</strong> is a key component and serves the Kubernetes <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0FwcGxpY2F0aW9uX3Byb2dyYW1taW5nX2ludGVyZmFjZQ==">API<i class="fa fa-external-link-alt"></i></span> using <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0pTT04=">JSON<i class="fa fa-external-link-alt"></i></span> over <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0h5cGVydGV4dF9UcmFuc2Zlcl9Qcm90b2NvbA==">HTTP<i class="fa fa-external-link-alt"></i></span>, which provides both the internal and external interface to Kubernetes.[<span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0t1YmVybmV0ZXMjY2l0ZW5vdGVkb2ludHJvMjU=">25]<i class="fa fa-external-link-alt"></i></span>[<span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0t1YmVybmV0ZXMjY2l0ZW5vdGUxMzQ=">34]<i class="fa fa-external-link-alt"></i></span> The API server processes and validates <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL1JlcHJlc2VudGF0aW9uYWxfc3RhdGVfdHJhbnNmZXI=">REST<i class="fa fa-external-link-alt"></i></span> requests and updates state of the <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0FwcGxpY2F0aW9uX3Byb2dyYW1taW5nX2ludGVyZmFjZQ==">API<i class="fa fa-external-link-alt"></i></span> objects in <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2NvcmVvcy9ldGNk">etcd<i class="fa fa-external-link-alt"></i></span>, thereby allowing clients to configure workloads and containers across Worker nodes.</p><p>Commands?</p><p><strong>3 Scheduler</strong> is the pluggable component that selects which node an unscheduled pod (the basic entity managed by the scheduler) should run on based on resource availability. Scheduler tracks resource utilization on each node to ensure that workload is not scheduled in excess of the available resources. For this purpose, the scheduler must know the resource requirements, resource availability and a variety of other user-provided constraints and policy directives such as quality-of-service, affinity&#x2F;anti-affinity requirements, data locality and so on. In essence, the scheduler’s role is to match resource &quot;supply&quot; to workload &quot;demand&quot;. </p><p>Detection?</p><p><strong>4 Controller manager</strong> is the process in which the core Kubernetes controllers like DaemonSet Controller and Replication Controller run. The controllers communicate with the API server to create, update and delete the resources they manage (pods, service endpoints, etc.)</p><p>The one who gives the commands?</p><p><strong>Node&#x2F;Worker&#x2F;Minion</strong></p><p><strong>Kubelet</strong> is responsible for the running state of each node, ensuring that all containers on the node are healthy. It takes care of starting, stopping, and maintaining application containers organized into pods as directed by the control plane.[<span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0t1YmVybmV0ZXMjY2l0ZW5vdGVkb2ludHJvMjU=">25]<i class="fa fa-external-link-alt"></i></span>[<span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0t1YmVybmV0ZXMjY2l0ZW5vdGUzNg==">36]<i class="fa fa-external-link-alt"></i></span></p><p>Kubelet monitors the state of a pod and if not in the desired state, the pod will be redeployed to the same node. The node status is relayed every few seconds via heartbeat messages to the master. Once the master detects a node failure, the Replication Controller observes this state change and launches pods on other healthy nodes.</p><p><strong>Container</strong> resides inside a Pod. The container is the lowest level of a micro-service which holds the running application, the libraries and their dependencies. Containers can be exposed to the world through an external IP address.</p><p><strong>Kube-proxy</strong> is an implementation of a <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL1Byb3h5X3NlcnZlcg==">network proxy<i class="fa fa-external-link-alt"></i></span> and a <span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0xvYWRfYmFsYW5jaW5nXyhjb21wdXRpbmcp">load balancer<i class="fa fa-external-link-alt"></i></span>, and it supports the service abstraction along with other networking operation.[<span class="exturl" data-url="aHR0cHM6Ly93d3cud2lraXdhbmQuY29tL2VuL0t1YmVybmV0ZXMjY2l0ZW5vdGVkb2ludHJvMjU=">25]<i class="fa fa-external-link-alt"></i></span> It is responsible for routing traffic to the appropriate container based on IP and port number of the incoming request</p><ul><li>A <a href="https://www.nginx.com/resources/glossary/reverse-proxy-server"><strong>reverse proxy</strong></a> accepts a request from a client, forwards it to a server that     can fulfill it, and returns the server’s response to the client.</li><li>A <a href="https://www.nginx.com/resources/glossary/load-balancing"><strong>load balancer</strong></a> distributes incoming client requests among a group of servers,     in each case returning the response from the selected server to the     appropriate client.</li></ul><p><strong>cAdvisor</strong> is an agent that monitors and gathers resource usage and performance metrics such as CPU, memory, file and network usage of containers on each node.</p><p><img src="https://user-images.githubusercontent.com/17645053/75114543-cf014600-5624-11ea-970c-028f5543f3c2.png" alt="337641-20160121153024500-830400402" loading="lazy"></p><p><img src="https://user-images.githubusercontent.com/17645053/75114548-d6c0ea80-5624-11ea-9796-5343e0fcf4e4.png" alt="337641-20160121153025562-961251045" loading="lazy"></p><p><img src="https://user-images.githubusercontent.com/17645053/75114561-f5bf7c80-5624-11ea-8266-550e7c3209d4.png" alt="337641-20160121153022422-1270227504" loading="lazy"></p><p>在分布式系统中，部署，调度，伸缩一直是最为重要的也最为基础的功能。Kubernets 就是希望解决这一序列问题的。</p><p><span class="exturl" data-url="aHR0cHM6Ly95ZWFzeS5naXRib29rcy5pby9kb2NrZXJfcHJhY3RpY2UvY29udGVudC9rdWJlcm5ldGVzL3F1aWNrc3RhcnQuaHRtbA==">https://yeasy.gitbooks.io/docker_practice/content/kubernetes/quickstart.html<i class="fa fa-external-link-alt"></i></span></p><p><strong>快速上手</strong></p><p>目前，Kubenetes 支持在多种环境下的安装，包括本地主机（Fedora）、云服务（Google GAE、AWS 等）。然而最快速体验 Kubernetes 的方式显然是本地通过 Docker 的方式来启动相关进程。</p><p>下图展示了在单节点使用 Docker 快速部署一套 Kubernetes 的拓扑。</p><p><img src="https://user-images.githubusercontent.com/17645053/75114565-03750200-5625-11ea-84be-574cb0dc521c.png" alt="k8s-singlenode-docker" loading="lazy"></p><p>图 1.21.2.1 - 在 Docker 中启动 Kubernetes</p><p><strong>Kubernetes依赖Etcd服务来维护所有主节点的状态。</strong></p><p><strong>启动Etcd服务。</strong></p><p>docker run --net&#x3D;host -d gcr.io&#x2F;google_containers&#x2F;etcd:2.0.9 &#x2F;usr&#x2F;local&#x2F;bin&#x2F;etcd --addr&#x3D;127.0.0.1:4001 --bind-addr&#x3D;0.0.0.0:4001 --data-dir&#x3D;&#x2F;var&#x2F;etcd&#x2F;data</p><p><strong>启动主节点</strong></p><p>启动kubelet。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker run --net=host -d -v /var/run/docker.sock:/var/run/docker.sock gcr.io/google_containers/hyperkube:v0.17.0 /hyperkube kubelet --api_servers=http://localhost:8080 --v=2 --address=0.0.0.0 --enable_server --hostname_override=127.0.0.1 --config=/etc/kubernetes/manifests</span><br></pre></td></tr></table></figure><p><strong>启动服务代理</strong></p><p>docker run -d --net&#x3D;host --privileged gcr.io&#x2F;google_containers&#x2F;hyperkube:v0.17.0 &#x2F;hyperkube proxy --master&#x3D;<span class="exturl" data-url="aHR0cDovLzEyNy4wLjAuMTo4MDgwLw==">http://127.0.0.1:8080<i class="fa fa-external-link-alt"></i></span> --v&#x3D;2</p><p><strong>测试状态</strong></p><p>在本地访问 8080 端口，可以获取到如下的结果：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ curl 127.0.0.1:8080</span><br><span class="line"> &#123;</span><br><span class="line">  <span class="string">&quot;paths&quot;</span>: [</span><br><span class="line">   <span class="string">&quot;/api&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/api/v1beta1&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/api/v1beta2&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/api/v1beta3&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/healthz&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/healthz/ping&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/logs/&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/metrics&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/static/&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/swagger-ui/&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/swaggerapi/&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/validate&quot;</span>,</span><br><span class="line">   <span class="string">&quot;/version&quot;</span></span><br><span class="line">  ]</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure><p><strong>查看服务</strong></p><p>所有服务启动后，查看本地实际运行的 Docker 容器，有如下几个。</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">CONTAINER ID    IMAGE                    COMMAND        CREATED       STATUS       PORTS        NAMES</span><br><span class="line"> ee054db2516c    gcr.io/google_containers/hyperkube:v0.17.0  &quot;/hyperkube schedule  2 days ago     Up 1 days                k8s_scheduler.509f29c9_k8s-master-127.0.0.1_default_9941e5170b4365bd4aa91f122ba0c061_e97037f5</span><br><span class="line"> 3b0f28de07a2    gcr.io/google_containers/hyperkube:v0.17.0  &quot;/hyperkube apiserve  2 days ago     Up 1 days                k8s_apiserver.245e44fa_k8s-master-127.0.0.1_default_9941e5170b4365bd4aa91f122ba0c061_6ab5c23d</span><br><span class="line"> 2eaa44ecdd8e    gcr.io/google_containers/hyperkube:v0.17.0  &quot;/hyperkube controll  2 days ago     Up 1 days                k8s_controller-manager.33f83d43_k8s-master-127.0.0.1_default_9941e5170b4365bd4aa91f122ba0c061_1a60106f</span><br><span class="line"> 30aa7163cbef    gcr.io/google_containers/hyperkube:v0.17.0  &quot;/hyperkube proxy --  2 days ago     Up 1 days                jolly_davinci</span><br><span class="line"> a2f282976d91    gcr.io/google_containers/pause:0.8.0     &quot;/pause&quot;        2 days ago     Up 2 days                k8s_POD.e4cc795_k8s-master-127.0.0.1_default_9941e5170b4365bd4aa91f122ba0c061_e8085b1f</span><br><span class="line"> c060c52acc36    gcr.io/google_containers/hyperkube:v0.17.0  &quot;/hyperkube kubelet  2 days ago     Up 1 days                serene_nobel</span><br><span class="line"> cc3cd263c581    gcr.io/google_containers/etcd:2.0.9     &quot;/usr/local/bin/etcd  2 days ago     Up 1 days                happy_turing</span><br></pre></td></tr></table></figure><p>这些服务大概分为三类：主节点服务、工作节点服务和其它服务。</p><p><strong>主节点服务</strong></p><ul><li>apiserver 是整个系统的对外接口，提供     RESTful 方式供客户端和其它组件调用；</li><li>scheduler 负责对资源进行调度，分配某个     pod 到某个节点上；</li><li>controller-manager 负责管理控制器，包括 endpoint-controller（刷新服务和 pod 的关联信息）和 replication-controller（维护某个     pod 的复制为配置的数值）。</li></ul><p><strong>工作节点服务</strong></p><ul><li>kubelet 是工作节点执行操作的     agent，负责具体的容器生命周期管理，根据从数据库中获取的信息来管理容器，并上报 pod 运行状态等；</li><li>proxy 为 pod 上的服务提供访问的代理。</li></ul><p><strong>其它服务</strong></p><ul><li>Etcd 是所有状态的存储数据库；</li><li>gcr.io&#x2F;google_containers&#x2F;pause:0.8.0 是 Kubernetes 启动后自动 pull 下来的测试镜像。</li></ul>]]></content>
    
    
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; href=&quot;css/welcomePage.css&quot;&gt;&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js&quot;&gt;&lt;/script&gt;

&lt;div class=&quot;note no-icon&quot;&gt;&lt;p&gt;&lt;span class=&quot;exturl&quot; data-url=&quot;aHR0cHM6Ly93d3cueW91dHViZS5jb20vY2hhbm5lbC9VQ2RrR1Y1MU51MHVuRE5UNThiSHQ5Ymc=&quot;&gt;Study Source&lt;i class=&quot;fa fa-external-link-alt&quot;&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/17645053/75114786-11c41d80-5627-11ea-9e03-009bda02ad1b.png&quot; alt=&quot;Quick General Intro&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    <category term="Kubernetes" scheme="https://theme-next.js.org/categories/Tech/Kubernetes/"/>
    
    
    <category term="Kubernetes" scheme="https://theme-next.js.org/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>homebrew-basic</title>
    <link href="https://theme-next.js.org/homebrew-basic/"/>
    <id>https://theme-next.js.org/homebrew-basic/</id>
    <published>2019-08-11T09:58:28.000Z</published>
    <updated>2022-05-24T02:03:54.866Z</updated>
    
    <content type="html"><![CDATA[<div class="note no-icon"><p>Homebrew基础</p></div><span id="more"></span><h1 id="Homebrew总结"><a href="#Homebrew总结" class="headerlink" title="Homebrew总结"></a>Homebrew总结</h1><ol><li><p>就像ubuntu的ppa一样，很多时候有些软件包并不在官方提供列表里面而是由第三方提供的这个时候，我们就需要使用下面的命令：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">brew [un]tap &lt;github_userid/repo_name&gt; #添加或者删除仓库</span><br></pre></td></tr></table></figure><p>注意<code>repo_name</code>只是实际仓库名的一部分，而实际仓库名的前缀必须是<code>homebrew-</code>。比如</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">brew tap neovim/neovim</span><br><span class="line"># 这样实际仓库名就是homebrew-neovim</span><br></pre></td></tr></table></figure><p><span class="exturl" data-url="aHR0cHM6Ly9saW5rLmppYW5zaHUuY29tLz90PWh0dHBzOi8vZ2l0aHViLmNvbS9Ib21lYnJldy9icmV3L2Jsb2IvbWFzdGVyL2RvY3MvYnJldy10YXAubWQ=">官方文档<i class="fa fa-external-link-alt"></i></span>中提出<code>brew tap</code>作用用于添加更多仓库，默认情况下<code>tap</code>假设这些仓库来源于<span class="exturl" data-url="aHR0cHM6Ly9saW5rLmppYW5zaHUuY29tLz90PWh0dHBzOi8vZ2l0aHViLmNvbQ==">github<i class="fa fa-external-link-alt"></i></span>，但又不局限于它。</p><p>不带参数的话，将会列出当前已经<code>tapped</code>的仓库，比如：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">brew tap</span><br><span class="line">==&gt; Auto-updated Homebrew!</span><br><span class="line">Updated 1 tap (homebrew/core).</span><br><span class="line">No changes to formulae.</span><br><span class="line"></span><br><span class="line">caskroom/cask</span><br><span class="line">homebrew/core</span><br><span class="line">homebrew/dupes</span><br><span class="line">neovim/neovim</span><br></pre></td></tr></table></figure><p>总共列出了四个仓库，其中前面三个是默认自带的。</p><p>如果你要增加的仓库已经存在于<code>homebrew/core</code>中了(名字一样)，你必须显性的安装：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">brew install vim                     # installs from homebrew/core</span><br><span class="line">brew install username/repo/vim       # installs from your custom repo</span><br></pre></td></tr></table></figure></li><li><p>由于各种原因，用homebrew跟新下载软件有时非常慢，这个时候你可以尝试<strong>更换源</strong>，这个概念和其它包管理器的概念是一致的，也就是换个软件服务器。</p><p>有两个源:</p><ol><li><p>homebrew自身程序公式的服务器地址</p><p>homebrew托管于github，如果你访问这个网站没有问题，那就不需要换了，要换也非常简单，相当于给你的git仓库换一个远程地址，而homebrew的仓库位置默认位于<code>/usr/local/Homebrew</code>下（这个位置是homebrew 1.0之后才变的）。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd /usr/local/Homebrew</span><br><span class="line">git remote set-url origin http://mirrors.ustc.edu.cn/homebrew.git</span><br><span class="line"></span><br><span class="line">cd ~</span><br><span class="line">mkdir tmp</span><br><span class="line">cd tmp</span><br><span class="line">git clone http://mirrors.ustc.edu.cn/homebrew.git</span><br><span class="line"></span><br><span class="line">cp -R homebrew/.git /usr/local/Homebrew</span><br><span class="line">cp -R homebrew/Library /usr/local/Homebrew</span><br></pre></td></tr></table></figure></li><li><p>二进制的服务器地址，做法很简单，就是：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">echo &#x27;export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles&#x27; &gt;&gt; ~/.zshrc</span><br><span class="line">source ~/.zshrc</span><br></pre></td></tr></table></figure><p>shell 在启动时都会去找配置文件，然后运行它。你安装的一些脚本，如果想让它能够全局运行，就需要在配置文件中设置路径。有过设置路径后还是不管用的经历吗？多半是因为把配置写在了错误的配置文件里。**应该在配置shell（最常见的是配置默认命令）之前，使用 echo $SHELL，确认自己现在用的是什么shell后，再去编辑对应的配置文件 **</p></li></ol></li></ol><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><span class="exturl" data-url="aHR0cHM6Ly93d3cuamlhbnNodS5jb20vcC84YWQ3MDU2YjI0M2Y=">Homebrew总结<i class="fa fa-external-link-alt"></i></span></p>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;note no-icon&quot;&gt;&lt;p&gt;Homebrew基础&lt;/p&gt;
&lt;/div&gt;</summary>
    
    
    
    <category term="Tech" scheme="https://theme-next.js.org/categories/Tech/"/>
    
    <category term="Linux" scheme="https://theme-next.js.org/categories/Tech/Linux/"/>
    
    
    <category term="Homebrew" scheme="https://theme-next.js.org/tags/Homebrew/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://theme-next.js.org/hello-world/"/>
    <id>https://theme-next.js.org/hello-world/</id>
    <published>2017-09-22T00:00:00.000Z</published>
    <updated>2023-03-11T07:13:25.066Z</updated>
    
    <content type="html"><![CDATA[<p>This is my <mark class="label info">Debut~</mark></p><span id="more"></span><p>Welcome to <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvLw==">Hexo<i class="fa fa-external-link-alt"></i></span>! This is your very first post. Check <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mv">documentation<i class="fa fa-external-link-alt"></i></span> for more info. If you get any problems when using Hexo, you can find the answer in <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3MvdHJvdWJsZXNob290aW5nLmh0bWw=">troubleshooting<i class="fa fa-external-link-alt"></i></span> or you can ask me on <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2hleG9qcy9oZXhvL2lzc3Vlcw==">GitHub<i class="fa fa-external-link-alt"></i></span>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvd3JpdGluZy5odG1s">Writing<i class="fa fa-external-link-alt"></i></span></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvc2VydmVyLmh0bWw=">Server<i class="fa fa-external-link-alt"></i></span></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3MvZ2VuZXJhdGluZy5odG1s">Generating<i class="fa fa-external-link-alt"></i></span></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3MvZGVwbG95bWVudC5odG1s">Deployment<i class="fa fa-external-link-alt"></i></span></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;This is my &lt;mark class=&quot;label info&quot;&gt;Debut~&lt;/mark&gt;&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
</feed>
